00001
00002
00003
00004
00005
00006
00007 #include <config.h>
00008 #include "kmcommands.h"
00009 #include "kmfldsearch.h"
00010 #include "kmmainwidget.h"
00011 #include "kmmsgdict.h"
00012 #include "kmmsgpart.h"
00013 #include "kmfoldercombobox.h"
00014 #include "kmfolderdia.h"
00015 #include "kmfolderimap.h"
00016 #include "kmfoldermgr.h"
00017 #include "kmfoldersearch.h"
00018 #include "kmfoldertree.h"
00019 #include "kmsearchpatternedit.h"
00020 #include "kmsearchpattern.h"
00021
00022 #include <kapplication.h>
00023 #include <kdebug.h>
00024 #include <kstatusbar.h>
00025 #include <kwin.h>
00026 #include <kconfig.h>
00027 #include <kstdaction.h>
00028
00029 #include <qcheckbox.h>
00030 #include <qlayout.h>
00031 #include <klineedit.h>
00032 #include <qpushbutton.h>
00033 #include <qradiobutton.h>
00034 #include <qbuttongroup.h>
00035 #include <qobjectlist.h>
00036 #include <qcursor.h>
00037
00038 #include <mimelib/enum.h>
00039 #include <mimelib/boyermor.h>
00040
00041 #include <assert.h>
00042 #include <stdlib.h>
00043
00044 #include <X11/Xlib.h>
00045 #include <X11/Xatom.h>
00046
00047 const int KMFldSearch::MSGID_COLUMN = 4;
00048
00049
00050 KMFldSearch::KMFldSearch(KMMainWidget* w, const char* name,
00051 KMFolder *curFolder, bool modal):
00052 KDialogBase(0, name, modal, i18n("Search in Folders"),
00053 User1 | User2 | Close, User1, false,
00054 KGuiItem( i18n("&Search"), "find" ),
00055 KGuiItem( i18n("S&top"), "cancel" )),
00056 mStopped(false),
00057 mCloseRequested(false),
00058 mSortColumn(0),
00059 #if QT_VERSION >= 0x030200
00060 mSortOrder(Ascending),
00061 #endif
00062 mFolder(0),
00063 mTimer(new QTimer(this)),
00064 mLastFocus(0),
00065 mKMMainWidget(w)
00066 {
00067 XDeleteProperty( qt_xdisplay(), winId(), XA_WM_TRANSIENT_FOR );
00068 KWin::setIcons(winId(), kapp->icon(), kapp->miniIcon());
00069
00070 KConfig* config = KMKernel::config();
00071 config->setGroup("SearchDialog");
00072
00073 QWidget* searchWidget = new QWidget(this);
00074 QVBoxLayout *vbl = new QVBoxLayout( searchWidget, 0, spacingHint(), "kmfs_vbl" );
00075
00076 QButtonGroup * radioGroup = new QButtonGroup( searchWidget );
00077 radioGroup->hide();
00078
00079 mChkbxAllFolders = new QRadioButton(i18n("Search in &all local folders"), searchWidget);
00080 vbl->addWidget( mChkbxAllFolders );
00081 radioGroup->insert( mChkbxAllFolders );
00082
00083 QHBoxLayout *hbl = new QHBoxLayout( vbl, spacingHint(), "kmfs_hbl" );
00084 mChkbxSpecificFolders = new QRadioButton(i18n("Search &only in:"), searchWidget);
00085 hbl->addWidget(mChkbxSpecificFolders);
00086 mChkbxSpecificFolders->setChecked(true);
00087 radioGroup->insert( mChkbxSpecificFolders );
00088
00089 mCbxFolders = new KMFolderComboBox(false, searchWidget);
00090 mCbxFolders->setFolder(curFolder);
00091 hbl->addWidget(mCbxFolders);
00092
00093 connect(mCbxFolders, SIGNAL(activated(int)),
00094 this, SLOT(slotFolderActivated(int)));
00095
00096 mChkSubFolders = new QCheckBox(i18n("I&nclude sub-folders"), searchWidget);
00097 mChkSubFolders->setChecked(true);
00098 hbl->addWidget(mChkSubFolders);
00099
00100 QWidget *spacer = new QWidget( searchWidget, "spacer" );
00101 spacer->setMinimumHeight( 2 );
00102 vbl->addWidget( spacer );
00103
00104 mPatternEdit = new KMSearchPatternEdit( "", searchWidget , "spe", false, true );
00105 mPatternEdit->setFrameStyle( QFrame::NoFrame | QFrame::Plain );
00106 mPatternEdit->setInsideMargin( 0 );
00107 mSearchPattern = new KMSearchPattern();
00108 KMFolderSearch *searchFolder = dynamic_cast<KMFolderSearch*>(curFolder);
00109 if (searchFolder) {
00110 KConfig config(curFolder->location());
00111 KMFolder *root = searchFolder->search()->root();
00112 config.setGroup("Search Folder");
00113 mSearchPattern->readConfig(&config);
00114 if (root) {
00115 mChkbxSpecificFolders->setChecked(true);
00116 mCbxFolders->setFolder(root);
00117 mChkSubFolders->setChecked(searchFolder->search()->recursive());
00118 } else {
00119 mChkbxAllFolders->setChecked(true);
00120 }
00121 mFolder = searchFolder;
00122 }
00123 mPatternEdit->setSearchPattern( mSearchPattern );
00124 QObjectList *list = mPatternEdit->queryList( 0, "mRuleField" );
00125 QObject *object = 0;
00126 if ( list )
00127 object = list->first();
00128 delete list;
00129 if (!searchFolder && object && object->inherits( "QComboBox" )) {
00130 QComboBox *combo = (QComboBox*)object;
00131 combo->setCurrentText("Subject");
00132 }
00133 list = mPatternEdit->queryList( 0, "mRuleValue" );
00134 object = 0;
00135 if ( list )
00136 object = list->first();
00137 delete list;
00138 if (object && object->inherits( "QWidget" )) {
00139 QWidget *widget = (QComboBox*)object;
00140 widget->setFocus();
00141 }
00142
00143 vbl->addWidget( mPatternEdit );
00144
00145
00146 connect( mChkbxSpecificFolders, SIGNAL(toggled(bool)),
00147 mCbxFolders, SLOT(setEnabled(bool)) );
00148 connect( mChkbxSpecificFolders, SIGNAL(toggled(bool)),
00149 mChkSubFolders, SLOT(setEnabled(bool)) );
00150
00151 mLbxMatches = new KListView(searchWidget, "Search in Folders");
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 mLbxMatches->setSorting(2, false);
00167 mLbxMatches->setShowSortIndicator(true);
00168 mLbxMatches->setAllColumnsShowFocus(true);
00169 mLbxMatches->setSelectionModeExt(KListView::Extended);
00170 mLbxMatches->addColumn(i18n("Subject"),
00171 config->readNumEntry("SubjectWidth", 150));
00172 mLbxMatches->addColumn(i18n("Sender/Receiver"),
00173 config->readNumEntry("SenderWidth", 120));
00174 mLbxMatches->addColumn(i18n("Date"),
00175 config->readNumEntry("DateWidth", 120));
00176 mLbxMatches->addColumn(i18n("Folder"),
00177 config->readNumEntry("FolderWidth", 100));
00178
00179 mLbxMatches->addColumn("");
00180 mLbxMatches->setColumnWidthMode( MSGID_COLUMN, QListView::Manual );
00181 mLbxMatches->setColumnWidth(MSGID_COLUMN, 0);
00182 mLbxMatches->header()->setResizeEnabled(false, MSGID_COLUMN);
00183
00184 connect(mLbxMatches, SIGNAL(doubleClicked(QListViewItem *)),
00185 this, SLOT(slotShowMsg(QListViewItem *)));
00186 connect( mLbxMatches, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint &, int )),
00187 this, SLOT( slotContextMenuRequested( QListViewItem*, const QPoint &, int )));
00188 vbl->addWidget(mLbxMatches);
00189
00190 QHBoxLayout *hbl2 = new QHBoxLayout( vbl, spacingHint(), "kmfs_hbl2" );
00191 mSearchFolderLbl = new QLabel(i18n("Search folder &name:"), searchWidget);
00192 hbl2->addWidget(mSearchFolderLbl);
00193 mSearchFolderEdt = new KLineEdit(searchWidget);
00194 if (searchFolder)
00195 mSearchFolderEdt->setText(searchFolder->name());
00196 else
00197 mSearchFolderEdt->setText(i18n("Last Search"));
00198
00199 mSearchFolderLbl->setBuddy(mSearchFolderEdt);
00200 hbl2->addWidget(mSearchFolderEdt);
00201 mSearchFolderBtn = new QPushButton(i18n("&Rename"), searchWidget);
00202 mSearchFolderBtn->setEnabled(false);
00203 hbl2->addWidget(mSearchFolderBtn);
00204 mSearchFolderOpenBtn = new QPushButton(i18n("Op&en"), searchWidget);
00205 mSearchFolderOpenBtn->setEnabled(false);
00206 hbl2->addWidget(mSearchFolderOpenBtn);
00207 connect( mSearchFolderEdt, SIGNAL( textChanged( const QString &)),
00208 this, SLOT( updateCreateButton( const QString & )));
00209 connect( mSearchFolderBtn, SIGNAL( clicked() ),
00210 this, SLOT( renameSearchFolder() ));
00211 connect( mSearchFolderOpenBtn, SIGNAL( clicked() ),
00212 this, SLOT( openSearchFolder() ));
00213 mStatusBar = new KStatusBar(searchWidget);
00214 mStatusBar->insertFixedItem(i18n("AMiddleLengthText..."), 0, true);
00215 mStatusBar->changeItem(i18n("Ready."), 0);
00216 mStatusBar->setItemAlignment(0, AlignLeft | AlignVCenter);
00217 mStatusBar->insertItem(QString::null, 1, 1, true);
00218 mStatusBar->setItemAlignment(1, AlignLeft | AlignVCenter);
00219 vbl->addWidget(mStatusBar);
00220
00221 int mainWidth = config->readNumEntry("SearchWidgetWidth", 0);
00222 int mainHeight = config->readNumEntry("SearchWidgetHeight", 0);
00223
00224 if (mainWidth || mainHeight)
00225 resize(mainWidth, mainHeight);
00226
00227 setMainWidget(searchWidget);
00228 setButtonBoxOrientation(QWidget::Vertical);
00229
00230 mBtnSearch = actionButton(KDialogBase::User1);
00231 mBtnStop = actionButton(KDialogBase::User2);
00232 mBtnStop->setEnabled(false);
00233
00234 connect(this, SIGNAL(user1Clicked()), SLOT(slotSearch()));
00235 connect(this, SIGNAL(user2Clicked()), SLOT(slotStop()));
00236 connect(this, SIGNAL(finished()), this, SLOT(deleteLater()));
00237
00238
00239 KActionCollection *ac = actionCollection();
00240 mReplyAction = new KAction( i18n("&Reply..."), "mail_reply", 0, this,
00241 SLOT(slotReplyToMsg()), ac, "search_reply" );
00242 mReplyAllAction = new KAction( i18n("Reply to &All..."), "mail_replyall",
00243 0, this, SLOT(slotReplyAllToMsg()),
00244 ac, "search_reply_all" );
00245 mReplyListAction = new KAction( i18n("Reply to Mailing-&List..."),
00246 "mail_replylist", 0, this,
00247 SLOT(slotReplyListToMsg()), ac,
00248 "search_reply_list" );
00249 mForwardActionMenu = new KActionMenu( i18n("Message->","&Forward"),
00250 "mail_forward", ac,
00251 "search_message_forward" );
00252 connect( mForwardActionMenu, SIGNAL(activated()), this,
00253 SLOT(slotForwardMsg()) );
00254 mForwardAction = new KAction( i18n("&Inline..."), "mail_forward",
00255 0, this, SLOT(slotForwardMsg()),
00256 ac, "search_message_forward_inline" );
00257 mForwardActionMenu->insert( mForwardAction );
00258 mForwardAttachedAction = new KAction( i18n("Message->Forward->","As &Attachment..."),
00259 "mail_forward", 0, this,
00260 SLOT(slotForwardAttachedMsg()), ac,
00261 "search_message_forward_as_attachment" );
00262 mForwardActionMenu->insert( mForwardAttachedAction );
00263 mSaveAsAction = KStdAction::saveAs( this, SLOT(slotSaveMsg()), ac, "search_file_save_as" );
00264 mSaveAtchAction = new KAction( i18n("Save Attachments..."), "attach", 0,
00265 this, SLOT(slotSaveAttachments()), ac, "search_save_attachments" );
00266
00267 mPrintAction = KStdAction::print( this, SLOT(slotPrintMsg()), ac, "search_print" );
00268 mClearAction = new KAction( i18n("Clear Selection"), 0, 0, this,
00269 SLOT(slotClearSelection()), ac, "search_clear_selection" );
00270 connect(mTimer, SIGNAL(timeout()), this, SLOT(updStatus()));
00271 connect(kmkernel->searchFolderMgr(), SIGNAL(folderInvalidated(KMFolder*)),
00272 this, SLOT(folderInvalidated(KMFolder*)));
00273 }
00274
00275
00276 KMFldSearch::~KMFldSearch()
00277 {
00278 QValueListIterator<QGuardedPtr<KMFolder> > fit;
00279 for ( fit = mFolders.begin(); fit != mFolders.end(); ++fit ) {
00280 if (!(*fit))
00281 continue;
00282 (*fit)->close();
00283 }
00284
00285 KConfig* config = KMKernel::config();
00286 config->setGroup("SearchDialog");
00287 config->writeEntry("SubjectWidth", mLbxMatches->columnWidth(0));
00288 config->writeEntry("SenderWidth", mLbxMatches->columnWidth(1));
00289 config->writeEntry("DateWidth", mLbxMatches->columnWidth(2));
00290 config->writeEntry("FolderWidth", mLbxMatches->columnWidth(3));
00291 config->writeEntry("SearchWidgetWidth", width());
00292 config->writeEntry("SearchWidgetHeight", height());
00293 config->sync();
00294 }
00295
00296
00297 void KMFldSearch::updStatus(void)
00298 {
00299 QString genMsg, detailMsg;
00300 int numMatches = 0, count = 0;
00301 KMSearch const *search = (mFolder) ? (mFolder->search()) : 0;
00302 QString folderName;
00303 if (search) {
00304 numMatches = search->foundCount();
00305 count = search->searchedCount();
00306 folderName = search->currentFolder();
00307 }
00308
00309 if (mFolder && mFolder->search() && !mFolder->search()->running()) {
00310 if(!mStopped) {
00311 genMsg = i18n("Done");
00312 detailMsg = i18n("%n match (%1)", "%n matches (%1)", numMatches)
00313 .arg(i18n("%n message processed",
00314 "%n messages processed", count));
00315 } else {
00316 genMsg = i18n("Search canceled");
00317 detailMsg = i18n("%n match so far (%1)",
00318 "%n matches so far (%1)", numMatches)
00319 .arg(i18n("%n message processed",
00320 "%n messages processed", count));
00321 }
00322 } else {
00323 genMsg = i18n("%n match", "%n matches", numMatches);
00324 detailMsg = i18n("Searching in %1 (message %2)")
00325 .arg(folderName)
00326 .arg(count);
00327 }
00328
00329 mStatusBar->changeItem(genMsg, 0);
00330 mStatusBar->changeItem(detailMsg, 1);
00331 }
00332
00333
00334
00335 void KMFldSearch::keyPressEvent(QKeyEvent *evt)
00336 {
00337 KMSearch const *search = (mFolder) ? mFolder->search() : 0;
00338 bool searching = (search) ? search->running() : false;
00339 if (evt->key() == Key_Escape && searching) {
00340 mFolder->stopSearch();
00341 return;
00342 }
00343
00344 KDialogBase::keyPressEvent(evt);
00345 }
00346
00347
00348
00349 void KMFldSearch::slotFolderActivated(int )
00350 {
00351 KMFolder* folder = mCbxFolders->getFolder();
00352
00353 mChkbxSpecificFolders->setChecked(true);
00354 mBtnSearch->setEnabled(folder);
00355 }
00356
00357
00358
00359 void KMFldSearch::activateFolder(KMFolder *curFolder)
00360 {
00361 mChkbxSpecificFolders->setChecked(true);
00362 mCbxFolders->setFolder(curFolder);
00363 }
00364
00365
00366 void KMFldSearch::slotSearch()
00367 {
00368 mLastFocus = focusWidget();
00369 mBtnSearch->setFocus();
00370
00371 mStopped = false;
00372 mFetchingInProgress = 0;
00373
00374 mSearchFolderOpenBtn->setEnabled(true);
00375 mBtnSearch->setEnabled(false);
00376 mBtnStop->setEnabled(true);
00377
00378 mLbxMatches->clear();
00379
00380 mSortColumn = mLbxMatches->sortColumn();
00381 #if QT_VERSION >= 0x030200
00382 mSortOrder = mLbxMatches->sortOrder();
00383 #endif
00384 mLbxMatches->setSorting(-1);
00385 mLbxMatches->setShowSortIndicator(false);
00386
00387
00388
00389 if (!mFolder) {
00390 KMFolderMgr *mgr = kmkernel->searchFolderMgr();
00391 if (mSearchFolderEdt->text().isEmpty())
00392 mSearchFolderEdt->setText(i18n("Last Search"));
00393 QString baseName = mSearchFolderEdt->text();
00394 QString fullName = baseName;
00395 int count = 0;
00396 KMFolder *folder;
00397 while ((folder = mgr->find(fullName))) {
00398 if (folder->inherits("KMFolderSearch"))
00399 break;
00400 fullName = QString("%1 %2").arg(baseName).arg(++count);
00401 }
00402
00403 if (!folder)
00404 folder = mgr->createFolder(fullName, FALSE, KMFolderTypeSearch,
00405 &mgr->dir());
00406
00407 mFolder = (KMFolderSearch*)folder;
00408 }
00409 mFolder->stopSearch();
00410 disconnect(mFolder, SIGNAL(msgAdded(int)),
00411 this, SLOT(slotAddMsg(int)));
00412 disconnect(mFolder, SIGNAL(msgRemoved(KMFolder*, Q_UINT32)),
00413 this, SLOT(slotRemoveMsg(KMFolder*, Q_UINT32)));
00414 connect(mFolder, SIGNAL(msgAdded(int)),
00415 this, SLOT(slotAddMsg(int)));
00416 connect(mFolder, SIGNAL(msgRemoved(KMFolder*, Q_UINT32)),
00417 this, SLOT(slotRemoveMsg(KMFolder*, Q_UINT32)));
00418 KMSearch *search = new KMSearch();
00419 connect(search, SIGNAL(finished(bool)),
00420 this, SLOT(searchDone()));
00421 if (mChkbxAllFolders->isChecked()) {
00422 search->setRecursive(true);
00423 } else {
00424 search->setRoot(mCbxFolders->getFolder());
00425 search->setRecursive(mChkSubFolders->isChecked());
00426 }
00427
00428 mPatternEdit->updateSearchPattern();
00429 KMSearchPattern *searchPattern = new KMSearchPattern();
00430 *searchPattern = *mSearchPattern;
00431 searchPattern->purify();
00432 search->setSearchPattern(searchPattern);
00433 mFolder->setSearch(search);
00434 enableGUI();
00435
00436 if (mFolder && !mFolders.contains(mFolder.operator->())) {
00437 mFolder->open();
00438 mFolders.append(mFolder.operator->());
00439 }
00440 mTimer->start(200);
00441 }
00442
00443
00444 void KMFldSearch::searchDone()
00445 {
00446 mTimer->stop();
00447 updStatus();
00448
00449 QTimer::singleShot(0, this, SLOT(enableGUI()));
00450 if(mLastFocus)
00451 mLastFocus->setFocus();
00452 if (mCloseRequested)
00453 close();
00454
00455 #if QT_VERSION >= 0x030200
00456 mLbxMatches->setSorting(mSortColumn, mSortOrder == Ascending);
00457 #endif
00458 mLbxMatches->setShowSortIndicator(true);
00459 }
00460
00461 void KMFldSearch::slotAddMsg(int idx)
00462 {
00463 if (!mFolder)
00464 return;
00465 bool unget = !mFolder->isMessage(idx);
00466 KMMessage *msg = mFolder->getMsg(idx);
00467 QString from, fName;
00468 KMFolder *pFolder = msg->parent();
00469 if (!mFolders.contains(pFolder)) {
00470 mFolders.append(pFolder);
00471 pFolder->open();
00472 }
00473 if(pFolder->type() == KFolderTreeItem::SentMail)
00474 from = msg->to();
00475 else
00476 from = msg->from();
00477 if (pFolder->isSystemFolder())
00478 fName = i18n(pFolder->name().utf8());
00479 else
00480 fName = pFolder->name();
00481
00482 (void)new KListViewItem(mLbxMatches, mLbxMatches->lastItem(),
00483 msg->subject(), from, msg->dateIsoStr(),
00484 fName,
00485 QString::number(mFolder->serNum(idx)));
00486 if (unget)
00487 mFolder->unGetMsg(idx);
00488 }
00489
00490 void KMFldSearch::slotRemoveMsg(KMFolder *, Q_UINT32 serNum)
00491 {
00492 if (!mFolder)
00493 return;
00494 QListViewItemIterator it(mLbxMatches);
00495 while (it.current()) {
00496 QListViewItem *item = *it;
00497 if (serNum == (*it)->text(MSGID_COLUMN).toUInt()) {
00498 delete item;
00499 return;
00500 }
00501 ++it;
00502 }
00503 }
00504
00505
00506 void KMFldSearch::slotStop()
00507 {
00508 if (mFolder)
00509 mFolder->stopSearch();
00510 mStopped = true;
00511 mBtnStop->setEnabled(false);
00512 }
00513
00514
00515 void KMFldSearch::slotClose()
00516 {
00517 accept();
00518 }
00519
00520
00521
00522 void KMFldSearch::closeEvent(QCloseEvent *e)
00523 {
00524 if (mFolder && mFolder->search() && mFolder->search()->running()) {
00525 mCloseRequested = true;
00526
00527
00528 mFolder->setSearch(new KMSearch());
00529 } else {
00530 KDialogBase::closeEvent(e);
00531 }
00532 }
00533
00534
00535 void KMFldSearch::updateCreateButton( const QString &s)
00536 {
00537 mSearchFolderBtn->setEnabled(s != i18n("Last Search") && mSearchFolderOpenBtn->isEnabled());
00538 }
00539
00540
00541 void KMFldSearch::renameSearchFolder()
00542 {
00543 if (mFolder && (mFolder->name() !=mSearchFolderEdt->text())) {
00544 int i = 1;
00545 QString name = mSearchFolderEdt->text();
00546 while (i < 100) {
00547 if (!kmkernel->searchFolderMgr()->find( name )) {
00548 mFolder->rename( name );
00549 kmkernel->searchFolderMgr()->contentsChanged();
00550 break;
00551 }
00552 name.setNum( i );
00553 name = mSearchFolderEdt->text() + " " + name;
00554 ++i;
00555 }
00556 }
00557 }
00558
00559 void KMFldSearch::openSearchFolder()
00560 {
00561 renameSearchFolder();
00562 KMFolderTree *folderTree = mKMMainWidget->folderTree();
00563 QListViewItem *index = folderTree->indexOfFolder((KMFolder*)mFolder);
00564 if (index) {
00565 folderTree->ensureItemVisible(index);
00566 folderTree->doFolderSelected(index);
00567 slotClose();
00568 }
00569 }
00570
00571
00572 void KMFldSearch::folderInvalidated(KMFolder *folder)
00573 {
00574 if (folder == mFolder) {
00575 mLbxMatches->clear();
00576 if (mFolder->search())
00577 connect(mFolder->search(), SIGNAL(finished(bool)),
00578 this, SLOT(searchDone()));
00579 mTimer->start(200);
00580 enableGUI();
00581 }
00582 }
00583
00584
00585 bool KMFldSearch::slotShowMsg(QListViewItem *item)
00586 {
00587 if(!item)
00588 return false;
00589
00590 KMFolder* folder;
00591 int msgIndex;
00592 kmkernel->msgDict()->getLocation(item->text(MSGID_COLUMN).toUInt(),
00593 &folder, &msgIndex);
00594
00595 if (!folder || msgIndex < 0)
00596 return false;
00597
00598 mKMMainWidget->slotSelectFolder(folder);
00599 KMMessage* message = folder->getMsg(msgIndex);
00600 if (!message)
00601 return false;
00602
00603 mKMMainWidget->slotSelectMessage(message);
00604 return true;
00605 }
00606
00607
00608 void KMFldSearch::enableGUI()
00609 {
00610 KMSearch const *search = (mFolder) ? (mFolder->search()) : 0;
00611 bool searching = (search) ? (search->running()) : false;
00612 actionButton(KDialogBase::Close)->setEnabled(!searching);
00613 if (mChkbxSpecificFolders->isChecked()) {
00614 mCbxFolders->setEnabled(!searching);
00615 mChkSubFolders->setEnabled(!searching);
00616 }
00617 mChkbxAllFolders->setEnabled(!searching);
00618 mChkbxSpecificFolders->setEnabled(!searching);
00619 mPatternEdit->setEnabled(!searching);
00620 mBtnSearch->setEnabled(!searching);
00621 mBtnStop->setEnabled(searching);
00622 }
00623
00624
00625
00626 KMMessageList KMFldSearch::selectedMessages()
00627 {
00628 KMMessageList msgList;
00629 KMFolder* folder = 0;
00630 int msgIndex = -1;
00631 for (QListViewItemIterator it(mLbxMatches); it.current(); it++)
00632 if (it.current()->isSelected()) {
00633 kmkernel->msgDict()->getLocation((*it)->text(MSGID_COLUMN).toUInt(),
00634 &folder, &msgIndex);
00635 if (folder && msgIndex >= 0)
00636 msgList.append(folder->getMsgBase(msgIndex));
00637 }
00638 return msgList;
00639 }
00640
00641
00642 KMMessage* KMFldSearch::message()
00643 {
00644 QListViewItem *item = mLbxMatches->currentItem();
00645 KMFolder* folder = 0;
00646 int msgIndex = -1;
00647 if (!item)
00648 return 0;
00649 kmkernel->msgDict()->getLocation(item->text(MSGID_COLUMN).toUInt(),
00650 &folder, &msgIndex);
00651 if (!folder || msgIndex < 0)
00652 return 0;
00653
00654 return folder->getMsg(msgIndex);
00655 }
00656
00657
00658 void KMFldSearch::moveSelectedToFolder( int menuId )
00659 {
00660 KMFolder *dest = mMenuToFolder[menuId];
00661 if (!dest)
00662 return;
00663
00664 KMMessageList msgList = selectedMessages();
00665 KMCommand *command = new KMMoveCommand( dest, msgList );
00666 command->start();
00667 }
00668
00669
00670 void KMFldSearch::copySelectedToFolder( int menuId )
00671 {
00672 KMFolder *dest = mMenuToFolder[menuId];
00673 if (!dest)
00674 return;
00675
00676 KMMessageList msgList = selectedMessages();
00677 KMCommand *command = new KMCopyCommand( dest, msgList );
00678 command->start();
00679 }
00680
00681
00682 void KMFldSearch::updateContextMenuActions()
00683 {
00684 int count = selectedMessages().count();
00685 bool single_actions = count == 1;
00686 mReplyAction->setEnabled( single_actions );
00687 mReplyAllAction->setEnabled( single_actions );
00688 mReplyListAction->setEnabled( single_actions );
00689 mPrintAction->setEnabled( single_actions );
00690 }
00691
00692
00693 void KMFldSearch::slotContextMenuRequested( QListViewItem *lvi, const QPoint &, int )
00694 {
00695 if (!lvi)
00696 return;
00697 mLbxMatches->setSelected( lvi, TRUE );
00698 mLbxMatches->setCurrentItem( lvi );
00699 if (!message())
00700 return;
00701 QPopupMenu *menu = new QPopupMenu(this);
00702 updateContextMenuActions();
00703
00704 mMenuToFolder.clear();
00705 QPopupMenu *msgMoveMenu = new QPopupMenu(menu);
00706 KMMoveCommand::folderToPopupMenu( TRUE, this, &mMenuToFolder, msgMoveMenu );
00707 QPopupMenu *msgCopyMenu = new QPopupMenu(menu);
00708 KMCopyCommand::folderToPopupMenu( FALSE, this, &mMenuToFolder, msgCopyMenu );
00709
00710
00711 mReplyAction->plug(menu);
00712 mReplyAllAction->plug(menu);
00713 mReplyListAction->plug(menu);
00714 mForwardActionMenu->plug(menu);
00715 menu->insertSeparator();
00716 menu->insertItem(i18n("&Copy To"), msgCopyMenu);
00717 menu->insertItem(i18n("&Move To"), msgMoveMenu);
00718 mSaveAsAction->plug(menu);
00719 mSaveAtchAction->plug(menu);
00720 mPrintAction->plug(menu);
00721 menu->insertSeparator();
00722 mClearAction->plug(menu);
00723 menu->exec (QCursor::pos(), 0);
00724 delete menu;
00725 }
00726
00727
00728 void KMFldSearch::slotClearSelection()
00729 {
00730 mLbxMatches->clearSelection();
00731 }
00732
00733
00734 void KMFldSearch::slotReplyToMsg()
00735 {
00736 KMCommand *command = new KMReplyToCommand(this, message());
00737 command->start();
00738 }
00739
00740
00741 void KMFldSearch::slotReplyAllToMsg()
00742 {
00743 KMCommand *command = new KMReplyToAllCommand(this, message());
00744 command->start();
00745 }
00746
00747
00748 void KMFldSearch::slotReplyListToMsg()
00749 {
00750 KMCommand *command = new KMReplyListCommand(this, message());
00751 command->start();
00752 }
00753
00754
00755 void KMFldSearch::slotForwardMsg()
00756 {
00757 KMCommand *command = new KMForwardCommand(this, selectedMessages());
00758 command->start();
00759 }
00760
00761
00762 void KMFldSearch::slotForwardAttachedMsg()
00763 {
00764 KMCommand *command = new KMForwardAttachedCommand(this, selectedMessages());
00765 command->start();
00766 }
00767
00768
00769 void KMFldSearch::slotSaveMsg()
00770 {
00771 KMSaveMsgCommand *saveCommand = new KMSaveMsgCommand(this,
00772 selectedMessages());
00773 if (saveCommand->url().isEmpty())
00774 delete saveCommand;
00775 else
00776 saveCommand->start();
00777 }
00778
00779 void KMFldSearch::slotSaveAttachments()
00780 {
00781 KMSaveAttachmentsCommand *saveCommand = new KMSaveAttachmentsCommand(this,
00782 selectedMessages());
00783 saveCommand->start();
00784 }
00785
00786
00787
00788 void KMFldSearch::slotPrintMsg()
00789 {
00790 KMCommand *command = new KMPrintCommand(this, message());
00791 command->start();
00792 }
00793
00794 #include "kmfldsearch.moc"