kmail

kmmainwidget.cpp
1// kmmainwidget.cpp
2//#define MALLOC_DEBUG 1
3
4#ifdef HAVE_CONFIG_H
5#include <config.h>
6#endif
7
8#include <twin.h>
9
10#ifdef MALLOC_DEBUG
11#include <malloc.h>
12#endif
13
14#undef Unsorted // X headers...
15#include <tqaccel.h>
16#include <tqlayout.h>
17#include <tqhbox.h>
18#include <tqvbox.h>
19#include <tqpopupmenu.h>
20#include <tqptrlist.h>
21#include <tqsignalmapper.h>
22#include <tqvaluevector.h>
23#include <tqstylesheet.h>
24
25#include <kopenwith.h>
26#include <tdemessagebox.h>
27#include <tdepopupmenu.h>
28#include <tdeaccelmanager.h>
29#include <tdeglobalsettings.h>
30#include <tdestdaccel.h>
31#include <kkeydialog.h>
32#include <kcharsets.h>
33#include <knotifyclient.h>
34#include <kdebug.h>
35#include <tdeapplication.h>
36#include <tdefiledialog.h>
37#include <ktip.h>
38#include <knotifydialog.h>
39#include <tdestandarddirs.h>
40#include <dcopclient.h>
41#include <kaddrbook.h>
42#include <tdeaccel.h>
43#include <kstringhandler.h>
44
45#include "globalsettings.h"
46#include "kcursorsaver.h"
47#include "broadcaststatus.h"
48using KPIM::BroadcastStatus;
49#include "kmfoldermgr.h"
50#include "kmfolderdia.h"
51#include "accountmanager.h"
53#include "kmfilter.h"
54#include "kmfoldertree.h"
55#include "kmreadermainwin.h"
56#include "kmfoldercachedimap.h"
57#include "kmfolderimap.h"
58#include "kmacctcachedimap.h"
59#include "composer.h"
60#include "kmfolderseldlg.h"
61#include "kmfiltermgr.h"
62#include "messagesender.h"
63#include "kmaddrbook.h"
64#include "kmversion.h"
65#include "searchwindow.h"
67#include "kmacctfolder.h"
68#include "undostack.h"
69#include "kmcommands.h"
70#include "kmmainwin.h"
71#include "kmsystemtray.h"
72#include "imapaccountbase.h"
73#include "transportmanager.h"
74using KMail::ImapAccountBase;
75#include "vacation.h"
76using KMail::Vacation;
77#include "favoritefolderview.h"
78#include "subscriptiondialog.h"
79using KMail::SubscriptionDialog;
80#include "localsubscriptiondialog.h"
81using KMail::LocalSubscriptionDialog;
82#include "attachmentstrategy.h"
83using KMail::AttachmentStrategy;
84#include "headerstrategy.h"
85using KMail::HeaderStrategy;
86#include "headerstyle.h"
88#include "folderjob.h"
89using KMail::FolderJob;
90#include "mailinglist-magic.h"
91#include "antispamwizard.h"
93#include "filterlogdlg.h"
95#include <headerlistquicksearch.h>
96#include "tdelistviewindexedsearchline.h"
97using KMail::HeaderListQuickSearch;
98#include "kmheaders.h"
99#include "mailinglistpropertiesdialog.h"
100#include "templateparser.h"
101#include "archivefolderdialog.h"
102#include "folderutil.h"
103#include "csshelper.h"
104
105#if !defined(NDEBUG)
106 #include "sievedebugdialog.h"
108#endif
109
110#include <libkpimidentities/identity.h>
111#include <libkpimidentities/identitymanager.h>
112
113#include <assert.h>
114#include <kstatusbar.h>
115#include <kstaticdeleter.h>
116#include <tdeaction.h>
117
118#include <kmime_mdn.h>
119#include <kmime_header_parsing.h>
120using namespace KMime;
121using KMime::Types::AddrSpecList;
122
123#include "progressmanager.h"
124using KPIM::ProgressManager;
125
126#include "managesievescriptsdialog.h"
127
128#include "customtemplates.h"
129#include "customtemplates_kfg.h"
130
131#include "kmmainwidget.moc"
132
133TQValueList<KMMainWidget*>* KMMainWidget::s_mainWidgetList = 0;
134static KStaticDeleter<TQValueList<KMMainWidget*> > mwlsd;
135
136//-----------------------------------------------------------------------------
137KMMainWidget::KMMainWidget(TQWidget *parent, const char *name,
138 KXMLGUIClient *aGUIClient,
139 TDEActionCollection *actionCollection, TDEConfig* config ) :
140 TQWidget(parent, name),
141 mFavoritesCheckMailAction( 0 ),
142 mFavoriteFolderView( 0 ),
143 mFolderView( 0 ),
144 mFolderViewParent( 0 ),
145 mFolderViewSplitter( 0 ),
146 mQuickSearchLine( 0 ),
147 mArchiveFolderAction( 0 ),
148 mShowBusySplashTimer( 0 ),
149 mShowingOfflineScreen( false ),
150 mMsgActions( 0 ),
151 mVacationIndicatorActive( false )
152{
153 // must be the first line of the constructor:
154 mStartupDone = false;
155 mSearchWin = 0;
156 mIntegrated = true;
157 mFolder = 0;
158 mTemplateFolder = 0;
159 mFolderThreadPref = false;
160 mFolderThreadSubjPref = true;
161 mReaderWindowActive = true;
162 mReaderWindowBelow = true;
163 mFolderHtmlPref = false;
164 mFolderHtmlLoadExtPref = false;
165 mSystemTray = 0;
166 mDestructed = false;
167 mActionCollection = actionCollection;
168 mTopLayout = new TQVBoxLayout(this);
169 mFilterMenuActions.setAutoDelete(true);
170 mFilterTBarActions.setAutoDelete(false);
171 mFilterCommands.setAutoDelete(true);
172 mFolderShortcutCommands.setAutoDelete(true);
173 mJob = 0;
174 mConfig = config;
175 mGUIClient = aGUIClient;
176
177 mCustomReplyActionMenu = 0;
178 mCustomReplyAllActionMenu = 0;
179 mCustomForwardActionMenu = 0;
180 mCustomReplyMapper = 0;
181 mCustomReplyAllMapper = 0;
182 mCustomForwardMapper = 0;
183
184 // FIXME This should become a line separator as soon as the API
185 // is extended in tdelibs.
186 mToolbarActionSeparator = new TDEActionSeparator( actionCollection );
187
188 if( !s_mainWidgetList )
189 mwlsd.setObject( s_mainWidgetList, new TQValueList<KMMainWidget*>() );
190 s_mainWidgetList->append( this );
191
192 mPanner1Sep << 1 << 1;
193 mPanner2Sep << 1 << 1;
194
195 setMinimumSize(400, 300);
196
197 readPreConfig();
198 createWidgets();
199
200 setupActions();
201
202 readConfig();
203
204 activatePanners();
205
206 TQTimer::singleShot( 0, this, TQ_SLOT( slotShowStartupFolder() ));
207
208 connect( kmkernel->acctMgr(), TQ_SIGNAL( checkedMail( bool, bool, const TQMap<TQString, int> & ) ),
209 this, TQ_SLOT( slotMailChecked( bool, bool, const TQMap<TQString, int> & ) ) );
210
211 connect( kmkernel->acctMgr(), TQ_SIGNAL( accountAdded( KMAccount* ) ),
212 this, TQ_SLOT( initializeIMAPActions() ) );
213 connect( kmkernel->acctMgr(), TQ_SIGNAL( accountRemoved( KMAccount* ) ),
214 this, TQ_SLOT( initializeIMAPActions() ) );
215
216 connect(kmkernel, TQ_SIGNAL( configChanged() ),
217 this, TQ_SLOT( slotConfigChanged() ));
218
219 // display the full path to the folder in the caption
220 connect(mFolderTree, TQ_SIGNAL(currentChanged(TQListViewItem*)),
221 this, TQ_SLOT(slotChangeCaption(TQListViewItem*)));
222 connect(mFolderTree, TQ_SIGNAL(selectionChanged()),
223 TQ_SLOT(updateFolderMenu()) );
224 connect( mFolderTree, TQ_SIGNAL(syncStateChanged()),
225 TQ_SLOT(updateFolderMenu()) );
226
227 connect(kmkernel->folderMgr(), TQ_SIGNAL(folderRemoved(KMFolder*)),
228 this, TQ_SLOT(slotFolderRemoved(KMFolder*)));
229
230 connect(kmkernel->imapFolderMgr(), TQ_SIGNAL(folderRemoved(KMFolder*)),
231 this, TQ_SLOT(slotFolderRemoved(KMFolder*)));
232
233 connect(kmkernel->dimapFolderMgr(), TQ_SIGNAL(folderRemoved(KMFolder*)),
234 this, TQ_SLOT(slotFolderRemoved(KMFolder*)));
235
236 connect(kmkernel->searchFolderMgr(), TQ_SIGNAL(folderRemoved(KMFolder*)),
237 this, TQ_SLOT(slotFolderRemoved(KMFolder*)));
238
239 connect( kmkernel, TQ_SIGNAL( onlineStatusChanged( GlobalSettings::EnumNetworkState::type ) ),
240 this, TQ_SLOT( slotUpdateOnlineStatus( GlobalSettings::EnumNetworkState::type ) ) );
241
242 toggleSystemTray();
243
244 // must be the last line of the constructor:
245 mStartupDone = true;
246
247
248 TDEMainWindow *mainWin = dynamic_cast<TDEMainWindow*>(topLevelWidget());
249 KStatusBar *sb = mainWin ? mainWin->statusBar() : 0;
250 mVacationScriptIndicator = new KStatusBarLabel( TQString(), 0, sb );
251 mVacationScriptIndicator->hide();
252 connect( mVacationScriptIndicator, TQ_SIGNAL(itemReleased(int)), TQ_SLOT(slotEditVacation()) );
253 if ( GlobalSettings::checkOutOfOfficeOnStartup() )
254 TQTimer::singleShot( 0, this, TQ_SLOT(slotCheckVacation()) );
255}
256
257
258//-----------------------------------------------------------------------------
259//The kernel may have already been deleted when this method is called,
260//perform all cleanup that requires the kernel in destruct()
261KMMainWidget::~KMMainWidget()
262{
263 s_mainWidgetList->remove( this );
264 destruct();
265}
266
267
268//-----------------------------------------------------------------------------
269//This method performs all cleanup that requires the kernel to exist.
270void KMMainWidget::destruct()
271{
272 if (mDestructed)
273 return;
274 if (mSearchWin)
275 mSearchWin->close();
276 writeConfig();
277 writeFolderConfig();
278 delete mHeaders;
279 delete mFolderTree;
280 delete mSystemTray;
281 delete mMsgView;
282 mDestructed = true;
283}
284
285
286//-----------------------------------------------------------------------------
287void KMMainWidget::readPreConfig(void)
288{
289 const TDEConfigGroup geometry( KMKernel::config(), "Geometry" );
290 const TDEConfigGroup reader( KMKernel::config(), "Reader" );
291
292 mLongFolderList = geometry.readEntry( "FolderList", "long" ) != "short";
293 mReaderWindowActive = geometry.readEntry( "readerWindowMode", "below" ) != "hide";
294 mReaderWindowBelow = geometry.readEntry( "readerWindowMode", "below" ) == "below";
295 mThreadPref = geometry.readBoolEntry( "nestedMessages", false );
296
297 mHtmlPref = reader.readBoolEntry( "htmlMail", false );
298 mHtmlLoadExtPref = reader.readBoolEntry( "htmlLoadExternal", false );
299 mEnableFavoriteFolderView = GlobalSettings::self()->enableFavoriteFolderView();
300}
301
302
303//-----------------------------------------------------------------------------
304void KMMainWidget::readFolderConfig(void)
305{
306 if (!mFolder)
307 return;
308
309 TDEConfig *config = KMKernel::config();
310 TDEConfigGroupSaver saver(config, "Folder-" + mFolder->idString());
311 mFolderThreadPref = config->readBoolEntry( "threadMessagesOverride", false );
312 mFolderThreadSubjPref = config->readBoolEntry( "threadMessagesBySubject", true );
313 mFolderHtmlPref = config->readBoolEntry( "htmlMailOverride", false );
314 mFolderHtmlLoadExtPref = config->readBoolEntry( "htmlLoadExternalOverride", false );
315}
316
317
318//-----------------------------------------------------------------------------
319void KMMainWidget::writeFolderConfig(void)
320{
321 if (!mFolder)
322 return;
323
324 TDEConfig *config = KMKernel::config();
325 TDEConfigGroupSaver saver(config, "Folder-" + mFolder->idString());
326 config->writeEntry( "threadMessagesOverride", mFolderThreadPref );
327 config->writeEntry( "threadMessagesBySubject", mFolderThreadSubjPref );
328 config->writeEntry( "htmlMailOverride", mFolderHtmlPref );
329 config->writeEntry( "htmlLoadExternalOverride", mFolderHtmlLoadExtPref );
330}
331
332
333//-----------------------------------------------------------------------------
334void KMMainWidget::readConfig(void)
335{
336 TDEConfig *config = KMKernel::config();
337
338 bool oldLongFolderList = mLongFolderList;
339 bool oldReaderWindowActive = mReaderWindowActive;
340 bool oldReaderWindowBelow = mReaderWindowBelow;
341 bool oldFavoriteFolderView = mEnableFavoriteFolderView;
342
343 TQString str;
344 TQSize siz;
345
346 if (mStartupDone)
347 {
348 writeConfig();
349
350 readPreConfig();
351 mHeaders->refreshNestedState();
352
353 bool layoutChanged = ( oldLongFolderList != mLongFolderList )
354 || ( oldReaderWindowActive != mReaderWindowActive )
355 || ( oldReaderWindowBelow != mReaderWindowBelow )
356 || ( oldFavoriteFolderView != mEnableFavoriteFolderView );
357
358
359 if( layoutChanged ) {
360 hide();
361 // delete all panners
362 delete mPanner1; // will always delete the others
363 createWidgets();
364 }
365
366 }
367
368 { // area for config group "Geometry"
369 TDEConfigGroupSaver saver(config, "Geometry");
370 // size of the mainwin
371 TQSize defaultSize(750,560);
372 siz = config->readSizeEntry("MainWin", &defaultSize);
373 if (!siz.isEmpty())
374 resize(siz);
375 // default width of the foldertree
376 static const int folderpanewidth = 250;
377
378 const int folderW = config->readNumEntry( "FolderPaneWidth", folderpanewidth );
379 const int headerW = config->readNumEntry( "HeaderPaneWidth", width()-folderpanewidth );
380 const int headerH = config->readNumEntry( "HeaderPaneHeight", 180 );
381 const int readerH = config->readNumEntry( "ReaderPaneHeight", 280 );
382
383 mPanner1Sep.clear();
384 mPanner2Sep.clear();
385 TQValueList<int> & widths = mLongFolderList ? mPanner1Sep : mPanner2Sep ;
386 TQValueList<int> & heights = mLongFolderList ? mPanner2Sep : mPanner1Sep ;
387
388 widths << folderW << headerW;
389 heights << headerH << readerH;
390
391 bool layoutChanged = ( oldLongFolderList != mLongFolderList )
392 || ( oldReaderWindowActive != mReaderWindowActive )
393 || ( oldReaderWindowBelow != mReaderWindowBelow );
394
395 if (!mStartupDone || layoutChanged )
396 {
400 // The columns are shown by default.
401
402 const int unreadColumn = config->readNumEntry("UnreadColumn", 1);
403 const int totalColumn = config->readNumEntry("TotalColumn", 2);
404 const int sizeColumn = config->readNumEntry("SizeColumn", 3);
405
406 /* we need to _activate_ them in the correct order
407 * this is ugly because we can't use header()->moveSection
408 * but otherwise the restoreLayout from KMFolderTree
409 * doesn't know that to do */
410 if (unreadColumn == 1)
411 mFolderTree->addUnreadColumn( i18n("Unread"), 70 );
412 else if (totalColumn == 1)
413 mFolderTree->addTotalColumn( i18n("Total"), 70 );
414 else if (sizeColumn == 1)
415 mFolderTree->addSizeColumn( i18n("Size"), 70 );
416
417 if (unreadColumn == 2)
418 mFolderTree->addUnreadColumn( i18n("Unread"), 70 );
419 else if (totalColumn == 2)
420 mFolderTree->addTotalColumn( i18n("Total"), 70 );
421 else if (sizeColumn == 2)
422 mFolderTree->addSizeColumn( i18n("Size"), 70 );
423
424 if (unreadColumn == 3)
425 mFolderTree->addUnreadColumn( i18n("Unread"), 70 );
426 else if (totalColumn == 3)
427 mFolderTree->addTotalColumn( i18n("Total"), 70 );
428 else if (sizeColumn == 3)
429 mFolderTree->addSizeColumn( i18n("Size"), 70 );
430
431 mUnreadColumnToggle->setChecked( mFolderTree->isUnreadActive() );
432 mUnreadTextToggle->setChecked( !mFolderTree->isUnreadActive() );
433 mTotalColumnToggle->setChecked( mFolderTree->isTotalActive() );
434 mSizeColumnToggle->setChecked( mFolderTree->isSizeActive() );
435
436 mFolderTree->updatePopup();
437 }
438 }
439
440 if (mMsgView)
441 mMsgView->readConfig();
442
443 mHeaders->readConfig();
444 mHeaders->restoreColumnLayout( KMKernel::config(), "Header-Geometry" );
445
446 if ( mFolderViewSplitter && !GlobalSettings::self()->folderViewSplitterPosition().isEmpty() ) {
447 mFolderViewSplitter->setSizes( GlobalSettings::self()->folderViewSplitterPosition() );
448 } else {
449 TQValueList<int> defaults;
450 defaults << (int)(height() * 0.2) << (int)(height() * 0.8);
451 mFolderViewSplitter->setSizes( defaults );
452 }
453
454 mFolderTree->readConfig();
455 if ( mFavoriteFolderView )
456 mFavoriteFolderView->readConfig();
457 mFavoritesCheckMailAction->setEnabled( GlobalSettings::self()->enableFavoriteFolderView() );
458
459 { // area for config group "General"
460 TDEConfigGroupSaver saver(config, "General");
461 mBeepOnNew = config->readBoolEntry("beep-on-mail", false);
462 mConfirmEmpty = config->readBoolEntry("confirm-before-empty", true);
463 // startup-Folder, defaults to system-inbox
464 mStartupFolder = config->readEntry("startupFolder", kmkernel->inboxFolder()->idString());
465 if (!mStartupDone)
466 {
467 // check mail on startup
468 bool check = config->readBoolEntry("checkmail-startup", false);
469 if (check)
470 // do it after building the kmmainwin, so that the progressdialog is available
471 TQTimer::singleShot( 0, this, TQ_SLOT( slotCheckMail() ) );
472 }
473 }
474
475 // reload foldertree
476 mFolderTree->reload();
477
478 // Re-activate panners
479 if (mStartupDone)
480 {
481 // Update systray
482 toggleSystemTray();
483
484 bool layoutChanged = ( oldLongFolderList != mLongFolderList )
485 || ( oldReaderWindowActive != mReaderWindowActive )
486 || ( oldReaderWindowBelow != mReaderWindowBelow )
487 || ( oldFavoriteFolderView != mEnableFavoriteFolderView );
488 if ( layoutChanged ) {
489 activatePanners();
490 }
491
492 mFolderTree->showFolder( mFolder );
493
494 // sanders - New code
495 mHeaders->setFolder(mFolder);
496 if (mMsgView) {
497 int aIdx = mHeaders->currentItemIndex();
498 if (aIdx != -1)
499 mMsgView->setMsg( mFolder->getMsg(aIdx), true );
500 else
501 mMsgView->clear( true );
502 }
503 updateMessageActions();
504 show();
505 // sanders - Maybe this fixes a bug?
506
507 }
508 updateMessageMenu();
509 updateFileMenu();
510}
511
512
513//-----------------------------------------------------------------------------
514void KMMainWidget::writeConfig(void)
515{
516 TQString s;
517 TDEConfig *config = KMKernel::config();
518 TDEConfigGroup geometry( config, "Geometry" );
519
520 if (mMsgView)
521 mMsgView->writeConfig();
522
523 if ( mFolderViewSplitter )
524 GlobalSettings::setFolderViewSplitterPosition( mFolderViewSplitter->sizes() );
525 mFolderTree->writeConfig();
526 if ( mFavoriteFolderView )
527 mFavoriteFolderView->writeConfig();
528
529 geometry.writeEntry( "MainWin", this->geometry().size() );
530
531 const TQValueList<int> widths = ( mLongFolderList ? mPanner1 : mPanner2 )->sizes();
532 const TQValueList<int> heights = ( mLongFolderList ? mPanner2 : mPanner1 )->sizes();
533
534 geometry.writeEntry( "FolderPaneWidth", widths[0] );
535 geometry.writeEntry( "HeaderPaneWidth", widths[1] );
536
537 // Only save when the widget is shown (to avoid saving a wrong value)
538 if ( mSearchAndHeaders && mSearchAndHeaders->isShown() ) {
539 geometry.writeEntry( "HeaderPaneHeight", heights[0] );
540 geometry.writeEntry( "ReaderPaneHeight", heights[1] );
541 }
542
543 // save the state of the unread/total-columns
544 geometry.writeEntry( "UnreadColumn", mFolderTree->unreadIndex() );
545 geometry.writeEntry( "TotalColumn", mFolderTree->totalIndex() );
546 geometry.writeEntry( "SizeColumn", mFolderTree->sizeIndex() );
547}
548
549
550//-----------------------------------------------------------------------------
551void KMMainWidget::createWidgets(void)
552{
553 // Create the splitters according to the layout settings
554 TQWidget *headerParent = 0,
555 *mimeParent = 0, *messageParent = 0;
556
557 const bool opaqueResize = TDEGlobalSettings::opaqueResize();
558 if ( mLongFolderList ) {
559 // superior splitter: folder tree vs. rest
560 // inferior splitter: headers vs. message vs. mime tree
561 mPanner1 = new TQSplitter( TQt::Horizontal, this, "panner 1" );
562 mPanner1->setOpaqueResize( opaqueResize );
563 TQt::Orientation orientation = mReaderWindowBelow ? TQt::Vertical : TQt::Horizontal;
564 mPanner2 = new TQSplitter( orientation, mPanner1, "panner 2" );
565 mPanner2->setOpaqueResize( opaqueResize );
566 mPanner2->setChildrenCollapsible( false );
567 mFolderViewParent = mPanner1;
568 headerParent = mimeParent = messageParent = mPanner2;
569 } else /* !mLongFolderList */ {
570 // superior splitter: ( folder tree + headers ) vs. message vs. mime
571 // inferior splitter: folder tree vs. headers
572 mPanner1 = new TQSplitter( TQt::Vertical, this, "panner 1" );
573 mPanner1->setOpaqueResize( opaqueResize );
574 mPanner1->setChildrenCollapsible( false );
575 mPanner2 = new TQSplitter( TQt::Horizontal, mPanner1, "panner 2" );
576 mPanner2->setOpaqueResize( opaqueResize );
577 headerParent = mFolderViewParent = mPanner2;
578 mimeParent = messageParent = mPanner1;
579 }
580
581#ifndef NDEBUG
582 if( mPanner1 ) mPanner1->dumpObjectTree();
583 if( mPanner2 ) mPanner2->dumpObjectTree();
584#endif
585
586 mTopLayout->add( mPanner1 );
587
588 // BUG -sanders these accelerators stop working after switching
589 // between long/short folder layout
590 // Probably need to disconnect them first.
591
592 // create list of messages
593#ifndef NDEBUG
594 headerParent->dumpObjectTree();
595#endif
596 mSearchAndHeaders = new TQVBox( headerParent );
597 mSearchToolBar = new TDEToolBar( mSearchAndHeaders, "search toolbar");
598 mSearchToolBar->setMovingEnabled(false);
599 mSearchToolBar->boxLayout()->setSpacing( KDialog::spacingHint() );
600 TQLabel *label = new TQLabel( i18n("S&earch:"), mSearchToolBar, "tde toolbar widget" );
601
602
603 mHeaders = new KMHeaders(this, mSearchAndHeaders, "headers");
604#ifdef HAVE_INDEXLIB
605 mQuickSearchLine = new TDEListViewIndexedSearchLine( mSearchToolBar, mHeaders,
606 actionCollection(), "headers quick search line" );
607#else
608 mQuickSearchLine = new HeaderListQuickSearch( mSearchToolBar, mHeaders,
609 actionCollection(), "headers quick search line" );
610#endif
611 label->setBuddy( mQuickSearchLine );
612 connect( mQuickSearchLine, TQ_SIGNAL( requestFullSearch() ),
613 this, TQ_SLOT( slotRequestFullSearchFromQuickSearch() ) );
614 mSearchToolBar->setStretchableWidget( mQuickSearchLine );
615 connect( mHeaders, TQ_SIGNAL( messageListUpdated() ),
616 mQuickSearchLine, TQ_SLOT( updateSearch() ) );
617 if ( !GlobalSettings::self()->quickSearchActive() ) mSearchToolBar->hide();
618
619 if (mReaderWindowActive) {
620 connect(mHeaders, TQ_SIGNAL(selected(KMMessage*)),
621 this, TQ_SLOT(slotMsgSelected(KMMessage*)));
622 }
623 connect(mHeaders, TQ_SIGNAL(activated(KMMessage*)),
624 this, TQ_SLOT(slotMsgActivated(KMMessage*)));
625 connect( mHeaders, TQ_SIGNAL( selectionChanged() ),
626 TQ_SLOT( startUpdateMessageActionsTimer() ) );
627 TQAccel *accel = actionCollection()->tdeaccel();
628 accel->connectItem(accel->insertItem(SHIFT+Key_Left),
629 mHeaders, TQ_SLOT(selectPrevMessage()));
630 accel->connectItem(accel->insertItem(SHIFT+Key_Right),
631 mHeaders, TQ_SLOT(selectNextMessage()));
632
633 if (mReaderWindowActive) {
634 mMsgView = new KMReaderWin(messageParent, this, actionCollection(), 0 );
635 if ( mMsgActions ) {
636 mMsgActions->setMessageView( mMsgView );
637 }
638
639 connect(mMsgView, TQ_SIGNAL(replaceMsgByUnencryptedVersion()),
640 this, TQ_SLOT(slotReplaceMsgByUnencryptedVersion()));
641 connect(mMsgView, TQ_SIGNAL(popupMenu(KMMessage&,const KURL&,const TQPoint&)),
642 this, TQ_SLOT(slotMsgPopup(KMMessage&,const KURL&,const TQPoint&)));
643 connect(mMsgView, TQ_SIGNAL(urlClicked(const KURL&,int)),
644 mMsgView, TQ_SLOT(slotUrlClicked()));
645 connect(mHeaders, TQ_SIGNAL(maybeDeleting()),
646 mMsgView, TQ_SLOT(clearCache()));
647 connect(mMsgView, TQ_SIGNAL(noDrag()),
648 mHeaders, TQ_SLOT(slotNoDrag()));
649 accel->connectItem(accel->insertItem(Key_Up),
650 mMsgView, TQ_SLOT(slotScrollUp()));
651 accel->connectItem(accel->insertItem(Key_Down),
652 mMsgView, TQ_SLOT(slotScrollDown()));
653 accel->connectItem(accel->insertItem(Key_Prior),
654 mMsgView, TQ_SLOT(slotScrollPrior()));
655 accel->connectItem(accel->insertItem(Key_Next),
656 mMsgView, TQ_SLOT(slotScrollNext()));
657 } else {
658 mMsgView = NULL;
659 }
660
661 TDEAction *action;
662
663 mMoveMsgToFolderAction = new TDEAction( i18n("Move Message to Folder"), Key_M, this,
664 TQ_SLOT(slotMoveMsg()), actionCollection(),
665 "move_message_to_folder" );
666 mMoveMsgToFolderAction->plugAccel( actionCollection()->tdeaccel() );
667
668 action = new TDEAction( i18n("Copy Message to Folder"), Key_C, this,
669 TQ_SLOT(slotCopyMsg()), actionCollection(),
670 "copy_message_to_folder" );
671 action->plugAccel( actionCollection()->tdeaccel() );
672
673 action = new TDEAction( i18n("Jump to Folder"), Key_J, this,
674 TQ_SLOT(slotJumpToFolder()), actionCollection(),
675 "jump_to_folder" );
676 action->plugAccel( actionCollection()->tdeaccel() );
677
678 // create list of folders
679 mFolderViewSplitter = new TQSplitter( TQt::Vertical, mFolderViewParent );
680 mFolderViewSplitter->setOpaqueResize( TDEGlobalSettings::opaqueResize() );
681 mFavoriteFolderView = new KMail::FavoriteFolderView( this, mFolderViewSplitter );
682 if ( mFavoritesCheckMailAction )
683 connect( mFavoritesCheckMailAction, TQ_SIGNAL(activated()), mFavoriteFolderView, TQ_SLOT(checkMail()) );
684 TQWidget *folderTreeParent = mFolderViewParent;
685 if ( GlobalSettings::enableFavoriteFolderView() ) {
686 folderTreeParent = mFolderViewSplitter;
687 mFolderView = mFolderViewSplitter;
688 }
689 mFolderTree = new KMFolderTree(this, folderTreeParent, "folderTree");
690 if ( !GlobalSettings::enableFavoriteFolderView() ) {
691 mFolderView = mFolderTree;
692 }
693 connect( mFolderTree, TQ_SIGNAL(folderSelected(KMFolder*)),
694 mFavoriteFolderView, TQ_SLOT(folderTreeSelectionChanged(KMFolder*)) );
695
696 connect(mFolderTree, TQ_SIGNAL(folderSelected(KMFolder*)),
697 this, TQ_SLOT(folderSelected(KMFolder*)));
698 connect( mFolderTree, TQ_SIGNAL( folderSelected( KMFolder* ) ),
699 mQuickSearchLine, TQ_SLOT( reset() ) );
700 connect(mFolderTree, TQ_SIGNAL(folderSelectedUnread(KMFolder*)),
701 this, TQ_SLOT(folderSelectedUnread(KMFolder*)));
702 connect(mFolderTree, TQ_SIGNAL(folderDrop(KMFolder*)),
703 this, TQ_SLOT(slotMoveMsgToFolder(KMFolder*)));
704 connect(mFolderTree, TQ_SIGNAL(folderDropCopy(KMFolder*)),
705 this, TQ_SLOT(slotCopyMsgToFolder(KMFolder*)));
706 connect(mFolderTree, TQ_SIGNAL(columnsChanged()),
707 this, TQ_SLOT(slotFolderTreeColumnsChanged()));
708
709 if ( mFavoriteFolderView ) {
710 connect( mFavoriteFolderView, TQ_SIGNAL(folderDrop(KMFolder*)), TQ_SLOT(slotMoveMsgToFolder(KMFolder*)) );
711 connect( mFavoriteFolderView, TQ_SIGNAL(folderDropCopy(KMFolder*)), TQ_SLOT(slotCopyMsgToFolder(KMFolder*)) );
712 }
713
714 //Commands not worthy of menu items, but that deserve configurable keybindings
715 mRemoveDuplicatesAction = new TDEAction(
716 i18n("Remove Duplicate Messages"), CTRL+Key_Asterisk, this,
717 TQ_SLOT(removeDuplicates()), actionCollection(), "remove_duplicate_messages");
718 action->plugAccel( actionCollection()->tdeaccel() );
719
720 action = new TDEAction(
721 i18n("Abort Current Operation"), Key_Escape, ProgressManager::instance(),
722 TQ_SLOT(slotAbortAll()), actionCollection(), "cancel" );
723 action->plugAccel( actionCollection()->tdeaccel() );
724
725 action = new TDEAction(
726 i18n("Focus on Next Folder"), CTRL+Key_Right, mFolderTree,
727 TQ_SLOT(incCurrentFolder()), actionCollection(), "inc_current_folder");
728 action->plugAccel( actionCollection()->tdeaccel() );
729
730 action = new TDEAction(
731 i18n("Focus on Previous Folder"), CTRL+Key_Left, mFolderTree,
732 TQ_SLOT(decCurrentFolder()), actionCollection(), "dec_current_folder");
733 action->plugAccel( actionCollection()->tdeaccel() );
734
735 action = new TDEAction(
736 i18n("Select Folder with Focus"), CTRL+Key_Space, mFolderTree,
737 TQ_SLOT(selectCurrentFolder()), actionCollection(), "select_current_folder");
738 action->plugAccel( actionCollection()->tdeaccel() );
739
740 action = new TDEAction(
741 i18n("Focus on Next Message"), ALT+Key_Right, mHeaders,
742 TQ_SLOT(incCurrentMessage()), actionCollection(), "inc_current_message");
743 action->plugAccel( actionCollection()->tdeaccel() );
744
745 action = new TDEAction(
746 i18n("Focus on Previous Message"), ALT+Key_Left, mHeaders,
747 TQ_SLOT(decCurrentMessage()), actionCollection(), "dec_current_message");
748 action->plugAccel( actionCollection()->tdeaccel() );
749
750 action = new TDEAction(
751 i18n("Select Message with Focus"), ALT+Key_Space, mHeaders,
752 TQ_SLOT( selectCurrentMessage() ), actionCollection(), "select_current_message");
753 action->plugAccel( actionCollection()->tdeaccel() );
754
755 connect( kmkernel->outboxFolder(), TQ_SIGNAL( msgRemoved(int, TQString) ),
756 TQ_SLOT( startUpdateMessageActionsTimer() ) );
757 connect( kmkernel->outboxFolder(), TQ_SIGNAL( msgAdded(int) ),
758 TQ_SLOT( startUpdateMessageActionsTimer() ) );
759}
760
761
762//-----------------------------------------------------------------------------
763void KMMainWidget::activatePanners(void)
764{
765 if (mMsgView) {
766 TQObject::disconnect( mMsgView->copyAction(),
767 TQ_SIGNAL( activated() ),
768 mMsgView, TQ_SLOT( slotCopySelectedText() ));
769 }
770
771 setupFolderView();
772 if ( mLongFolderList ) {
773 mSearchAndHeaders->reparent( mPanner2, 0, TQPoint( 0, 0 ) );
774 if (mMsgView) {
775 mMsgView->reparent( mPanner2, 0, TQPoint( 0, 0 ) );
776 mPanner2->moveToLast( mMsgView );
777 }
778 mFolderViewParent = mPanner1;
779 mFolderView->reparent( mFolderViewParent, 0, TQPoint( 0, 0 ) );
780 mPanner1->moveToLast( mPanner2 );
781 mPanner1->setSizes( mPanner1Sep );
782 mPanner1->setResizeMode( mFolderView, TQSplitter::KeepSize );
783 mPanner2->setSizes( mPanner2Sep );
784 mPanner2->setResizeMode( mSearchAndHeaders, TQSplitter::KeepSize );
785 } else /* !mLongFolderList */ {
786 mFolderViewParent = mPanner2;
787 mFolderView->reparent( mFolderViewParent, 0, TQPoint( 0, 0 ) );
788 mSearchAndHeaders->reparent( mPanner2, 0, TQPoint( 0, 0 ) );
789 mPanner2->moveToLast( mSearchAndHeaders );
790 mPanner1->moveToFirst( mPanner2 );
791 if (mMsgView) {
792 mMsgView->reparent( mPanner1, 0, TQPoint( 0, 0 ) );
793 mPanner1->moveToLast( mMsgView );
794 }
795 mPanner1->setSizes( mPanner1Sep );
796 mPanner2->setSizes( mPanner2Sep );
797 mPanner1->setResizeMode( mPanner2, TQSplitter::KeepSize );
798 mPanner2->setResizeMode( mFolderView, TQSplitter::KeepSize );
799 }
800
801 if (mMsgView) {
802 TQObject::connect( mMsgView->copyAction(),
803 TQ_SIGNAL( activated() ),
804 mMsgView, TQ_SLOT( slotCopySelectedText() ));
805 }
806}
807
808
809//-----------------------------------------------------------------------------
810void KMMainWidget::hide()
811{
812 TQWidget::hide();
813}
814
815
816//-----------------------------------------------------------------------------
817void KMMainWidget::show()
818{
819 TQWidget::show();
820}
821
822//-------------------------------------------------------------------------
823void KMMainWidget::slotSearch()
824{
825 if(!mSearchWin)
826 {
827 mSearchWin = new SearchWindow(this, "Search", mFolder, false);
828 connect(mSearchWin, TQ_SIGNAL(destroyed()),
829 this, TQ_SLOT(slotSearchClosed()));
830 }
831 else
832 {
833 mSearchWin->activateFolder(mFolder);
834 }
835
836 mSearchWin->show();
837 KWin::activateWindow( mSearchWin->winId() );
838}
839
840
841//-------------------------------------------------------------------------
842void KMMainWidget::slotSearchClosed()
843{
844 mSearchWin = 0;
845}
846
847
848//-------------------------------------------------------------------------
849void KMMainWidget::slotFind()
850{
851 if( mMsgView )
852 mMsgView->slotFind();
853}
854
855
856//-----------------------------------------------------------------------------
857void KMMainWidget::slotHelp()
858{
859 tdeApp->invokeHelp();
860}
861
862
863//-----------------------------------------------------------------------------
864void KMMainWidget::slotFilter()
865{
866 kmkernel->filterMgr()->openDialog( this );
867}
868
869
870//-----------------------------------------------------------------------------
871void KMMainWidget::slotPopFilter()
872{
873 kmkernel->popFilterMgr()->openDialog( this );
874}
875
876void KMMainWidget::slotManageSieveScripts()
877{
878 if ( !kmkernel->askToGoOnline() ) {
879 return;
880 }
881 KMail::ManageSieveScriptsDialog * dlg = new KMail::ManageSieveScriptsDialog( this );
882 dlg->show();
883}
884
885
886//-----------------------------------------------------------------------------
887void KMMainWidget::slotAddrBook()
888{
889 KAddrBookExternal::openAddressBook(this);
890}
891
892
893//-----------------------------------------------------------------------------
894void KMMainWidget::slotImport()
895{
896 KRun::runCommand("kmailcvt");
897}
898
899//-----------------------------------------------------------------------------
900void KMMainWidget::slotCheckMail()
901{
902 if ( !kmkernel->askToGoOnline() ) {
903 return;
904 }
905 kmkernel->acctMgr()->checkMail(true);
906}
907
908//-----------------------------------------------------------------------------
909void KMMainWidget::slotCheckOneAccount(int item)
910{
911 if ( !kmkernel->askToGoOnline() ) {
912 return;
913 }
914 kmkernel->acctMgr()->intCheckMail(item);
915}
916
917//-----------------------------------------------------------------------------
918void KMMainWidget::slotMailChecked( bool newMail, bool sendOnCheck,
919 const TQMap<TQString, int> & newInFolder )
920{
921 const bool sendOnAll =
922 GlobalSettings::self()->sendOnCheck() == GlobalSettings::EnumSendOnCheck::SendOnAllChecks;
923 const bool sendOnManual =
924 GlobalSettings::self()->sendOnCheck() == GlobalSettings::EnumSendOnCheck::SendOnManualChecks;
925 if( !kmkernel->isOffline() && ( sendOnAll || (sendOnManual && sendOnCheck ) ) )
926 slotSendQueued();
927
928 if ( !newMail || newInFolder.isEmpty() )
929 return;
930
931 tdeApp->dcopClient()->emitDCOPSignal( "unreadCountChanged()", TQByteArray() );
932
933 // build summary for new mail message
934 bool showNotification = false;
935 TQString summary;
936 TQStringList keys( newInFolder.keys() );
937 keys.sort();
938 for ( TQStringList::const_iterator it = keys.begin();
939 it != keys.end();
940 ++it ) {
941 kdDebug(5006) << newInFolder.find( *it ).data() << " new message(s) in "
942 << *it << endl;
943
944 KMFolder *folder = kmkernel->findFolderById( *it );
945
946 if ( folder && !folder->ignoreNewMail() ) {
947 showNotification = true;
948 if ( GlobalSettings::self()->verboseNewMailNotification() ) {
949 summary += "<br>" + i18n( "1 new message in %1",
950 "%n new messages in %1",
951 newInFolder.find( *it ).data() )
952 .arg( folder->prettyURL() );
953 }
954 }
955 }
956
957 // update folder menus in case some mail got filtered to trash/current folder
958 // and we can enable "empty trash/move all to trash" action etc.
959 updateFolderMenu();
960
961 if ( !showNotification )
962 return;
963
964 if ( GlobalSettings::self()->verboseNewMailNotification() ) {
965 summary = i18n( "%1 is a list of the number of new messages per folder",
966 "<b>New mail arrived</b><br>%1" )
967 .arg( summary );
968 }
969 else {
970 summary = i18n( "New mail arrived" );
971 }
972
973 if(kmkernel->xmlGuiInstance()) {
974 KNotifyClient::Instance instance(kmkernel->xmlGuiInstance());
975 KNotifyClient::event( topLevelWidget()->winId(), "new-mail-arrived",
976 summary );
977 }
978 else
979 KNotifyClient::event( topLevelWidget()->winId(), "new-mail-arrived",
980 summary );
981
982 if (mBeepOnNew) {
983 KNotifyClient::beep();
984 }
985}
986
987
988//-----------------------------------------------------------------------------
989void KMMainWidget::slotCompose()
990{
991 KMail::Composer * win;
992 KMMessage* msg = new KMMessage;
993
994 if ( mFolder ) {
995 msg->initHeader( mFolder->identity() );
996 TemplateParser parser( msg, TemplateParser::NewMessage );
997 parser.process( NULL, mFolder );
998 win = KMail::makeComposer( msg, mFolder->identity() );
999 } else {
1000 msg->initHeader();
1001 TemplateParser parser( msg, TemplateParser::NewMessage );
1002 parser.process( NULL, NULL );
1003 win = KMail::makeComposer( msg );
1004 }
1005
1006 win->show();
1007
1008}
1009
1010//-----------------------------------------------------------------------------
1011// TODO: do we want the list sorted alphabetically?
1012void KMMainWidget::slotShowNewFromTemplate()
1013{
1014 if ( mFolder ) {
1015 const KPIM::Identity & ident =
1016 kmkernel->identityManager()->identityForUoidOrDefault( mFolder->identity() );
1017 mTemplateFolder = kmkernel->folderMgr()->findIdString( ident.templates() );
1018 }
1019 else mTemplateFolder = kmkernel->templatesFolder();
1020 if ( !mTemplateFolder )
1021 return;
1022
1023 mTemplateMenu->popupMenu()->clear();
1024 for ( int idx = 0; idx<mTemplateFolder->count(); ++idx ) {
1025 KMMsgBase *mb = mTemplateFolder->getMsgBase( idx );
1026
1027 TQString subj = mb->subject();
1028 if ( subj.isEmpty() ) subj = i18n("No Subject");
1029 mTemplateMenu->popupMenu()->insertItem(
1030 KStringHandler::rsqueeze( subj.replace( "&", "&&" ) ), idx );
1031 }
1032}
1033
1034//-----------------------------------------------------------------------------
1035void KMMainWidget::slotNewFromTemplate( int id )
1036{
1037 if ( !mTemplateFolder )
1038 return;
1039 newFromTemplate(mTemplateFolder->getMsg( id ) );
1040}
1041
1042//-----------------------------------------------------------------------------
1043void KMMainWidget::newFromTemplate( KMMessage *msg )
1044{
1045 if ( !msg )
1046 return;
1047 KMCommand *command = new KMUseTemplateCommand( this, msg );
1048 command->start();
1049}
1050
1051//-----------------------------------------------------------------------------
1052void KMMainWidget::slotPostToML()
1053{
1054 if ( mFolder && mFolder->isMailingListEnabled() ) {
1055 KMCommand *command = new KMMailingListPostCommand( this, mFolder );
1056 command->start();
1057 }
1058 else
1059 slotCompose();
1060}
1061
1062//-----------------------------------------------------------------------------
1063void KMMainWidget::slotFolderMailingListProperties()
1064{
1065 if (!mFolderTree) return;
1066 KMFolderTreeItem *item = static_cast<KMFolderTreeItem*>( mFolderTree->currentItem() );
1067 if ( !item ) return;
1068 KMFolder* folder = item->folder();
1069 if ( folder ) {
1070 ( new KMail::MailingListFolderPropertiesDialog( this, folder ) )->show();
1071 }
1072}
1073
1074//-----------------------------------------------------------------------------
1075void KMMainWidget::slotFolderShortcutCommand()
1076{
1077 if (!mFolderTree) return;
1078 KMFolderTreeItem *item = static_cast<KMFolderTreeItem*>( mFolderTree->currentItem() );
1079 if ( item )
1080 item->assignShortcut();
1081}
1082
1083
1084//-----------------------------------------------------------------------------
1085void KMMainWidget::slotModifyFolder()
1086{
1087 if (!mFolderTree) return;
1088 KMFolderTreeItem *item = static_cast<KMFolderTreeItem*>( mFolderTree->currentItem() );
1089 if ( item )
1090 modifyFolder( item );
1091}
1092
1093//-----------------------------------------------------------------------------
1094void KMMainWidget::modifyFolder( KMFolderTreeItem* folderItem )
1095{
1096 KMFolder* folder = folderItem->folder();
1097 KMFolderTree* folderTree = static_cast<KMFolderTree *>( folderItem->listView() );
1098 KMFolderDialog props( folder, folder->parent(), folderTree,
1099 i18n("Properties of Folder %1").arg( folder->label() ) );
1100 props.exec();
1101 updateFolderMenu();
1102 //Kolab issue 2152
1103 if ( mSystemTray )
1104 mSystemTray->foldersChanged();
1105}
1106
1107//-----------------------------------------------------------------------------
1108void KMMainWidget::slotExpireFolder()
1109{
1110 TQString str;
1111 bool canBeExpired = true;
1112
1113 if (!mFolder) return;
1114
1115 if (!mFolder->isAutoExpire()) {
1116 canBeExpired = false;
1117 } else if (mFolder->getUnreadExpireUnits()==expireNever &&
1118 mFolder->getReadExpireUnits()==expireNever) {
1119 canBeExpired = false;
1120 }
1121
1122 if (!canBeExpired) {
1123 str = i18n("This folder does not have any expiry options set");
1124 KMessageBox::information(this, str);
1125 return;
1126 }
1127 TDEConfig *config = KMKernel::config();
1128 TDEConfigGroupSaver saver(config, "General");
1129
1130 if (config->readBoolEntry("warn-before-expire", true)) {
1131 str = i18n("<qt>Are you sure you want to expire the folder <b>%1</b>?</qt>").arg(TQStyleSheet::escape( mFolder->label() ));
1132 if (KMessageBox::warningContinueCancel(this, str, i18n("Expire Folder"),
1133 i18n("&Expire"))
1134 != KMessageBox::Continue) return;
1135 }
1136
1137 mFolder->expireOldMessages( true /*immediate*/);
1138}
1139
1140//-----------------------------------------------------------------------------
1141void KMMainWidget::slotEmptyFolder()
1142{
1143 TQString str;
1144
1145 if (!mFolder) return;
1146 bool isTrash = kmkernel->folderIsTrash(mFolder);
1147
1148 if (mConfirmEmpty)
1149 {
1150 TQString title = (isTrash) ? i18n("Empty Trash") : i18n("Move to Trash");
1151 TQString text = (isTrash) ?
1152 i18n("Are you sure you want to empty the trash folder?") :
1153 i18n("<qt>Are you sure you want to move all messages from "
1154 "folder <b>%1</b> to the trash?</qt>").arg( TQStyleSheet::escape( mFolder->label() ) );
1155
1156 if (KMessageBox::warningContinueCancel(this, text, title, KGuiItem( title, "edittrash"))
1157 != KMessageBox::Continue) return;
1158 }
1159 KCursorSaver busy(KBusyPtr::busy());
1160 slotMarkAll();
1161 if (isTrash) {
1162 /* Don't ask for confirmation again when deleting, the user has already
1163 confirmed. */
1164 slotDeleteMsg( false );
1165 }
1166 else
1167 slotTrashMsg();
1168
1169 if (mMsgView) mMsgView->clearCache();
1170
1171 if ( !isTrash )
1172 BroadcastStatus::instance()->setStatusMsg(i18n("Moved all messages to the trash"));
1173
1174 updateMessageActions();
1175
1176 // Disable empty trash/move all to trash action - we've just deleted/moved all folder
1177 // contents.
1178 mEmptyFolderAction->setEnabled( false );
1179}
1180
1181//-----------------------------------------------------------------------------
1182void KMMainWidget::slotArchiveFolder()
1183{
1184 KMail::ArchiveFolderDialog archiveDialog;
1185 archiveDialog.setFolder( mFolder );
1186 archiveDialog.exec();
1187}
1188
1189//-----------------------------------------------------------------------------
1190void KMMainWidget::slotRemoveFolder()
1191{
1192 TQString str;
1193 TQDir dir;
1194
1195 if ( !mFolder ) return;
1196 if ( mFolder->isSystemFolder() ) return;
1197 if ( mFolder->isReadOnly() ) return;
1198 if ( mFolder->mailCheckInProgress() ) {
1199 KMessageBox::sorry( this, i18n( "It is not possible to delete this folder right now because it "
1200 "is being syncronized. Please wait until the syncronization of "
1201 "this folder is complete and then try again." ),
1202 i18n( "Unable to delete folder" ) );
1203 return;
1204 }
1205
1206 TQString title;
1207 if ( mFolder->folderType() == KMFolderTypeSearch ) {
1208 title = i18n("Delete Search");
1209 str = i18n("<qt>Are you sure you want to delete the search <b>%1</b>?<br>"
1210 "Any messages it shows will still be available in their original folder.</qt>")
1211 .arg( TQStyleSheet::escape( mFolder->label() ) );
1212 } else {
1213 title = i18n("Delete Folder");
1214 if ( mFolder->count() == 0 ) {
1215 if ( !mFolder->child() || mFolder->child()->isEmpty() ) {
1216 str = i18n("<qt>Are you sure you want to delete the empty folder "
1217 "<b>%1</b>?</qt>")
1218 .arg( TQStyleSheet::escape( mFolder->label() ) );
1219 }
1220 else {
1221 str = i18n("<qt>Are you sure you want to delete the empty folder "
1222 "<b>%1</b> and all its subfolders? Those subfolders might "
1223 "not be empty and their contents will be discarded as well. "
1224 "<p><b>Beware</b> that discarded messages are not saved "
1225 "into your Trash folder and are permanently deleted.</qt>")
1226 .arg( TQStyleSheet::escape( mFolder->label() ) );
1227 }
1228 } else {
1229 if ( !mFolder->child() || mFolder->child()->isEmpty() ) {
1230 str = i18n("<qt>Are you sure you want to delete the folder "
1231 "<b>%1</b>, discarding its contents? "
1232 "<p><b>Beware</b> that discarded messages are not saved "
1233 "into your Trash folder and are permanently deleted.</qt>")
1234 .arg( TQStyleSheet::escape( mFolder->label() ) );
1235 }
1236 else {
1237 str = i18n("<qt>Are you sure you want to delete the folder <b>%1</b> "
1238 "and all its subfolders, discarding their contents? "
1239 "<p><b>Beware</b> that discarded messages are not saved "
1240 "into your Trash folder and are permanently deleted.</qt>")
1241 .arg( TQStyleSheet::escape( mFolder->label() ) );
1242 }
1243 }
1244 }
1245
1246 if (KMessageBox::warningContinueCancel(this, str, title,
1247 KGuiItem( i18n("&Delete"), "edit-delete"))
1248 == KMessageBox::Continue)
1249 {
1250 KMail::FolderUtil::deleteFolder( mFolder, this );
1251 }
1252}
1253
1254//-----------------------------------------------------------------------------
1255void KMMainWidget::slotMarkAllAsRead()
1256{
1257 if (!mFolder)
1258 return;
1259 mFolder->markUnreadAsRead();
1260}
1261
1262//-----------------------------------------------------------------------------
1263void KMMainWidget::slotCompactFolder()
1264{
1265 if (mFolder) {
1266 int idx = mHeaders->currentItemIndex();
1267 KCursorSaver busy(KBusyPtr::busy());
1268 mFolder->compact( KMFolder::CompactNow );
1269 // setCurrentItemByIndex will override the statusbar message, so save/restore it
1270 TQString statusMsg = BroadcastStatus::instance()->statusMsg();
1271 mHeaders->setCurrentItemByIndex(idx);
1272 BroadcastStatus::instance()->setStatusMsg( statusMsg );
1273 }
1274}
1275
1276
1277//-----------------------------------------------------------------------------
1278void KMMainWidget::slotRefreshFolder()
1279{
1280 if (mFolder)
1281 {
1282 if ( mFolder->folderType() == KMFolderTypeImap || mFolder->folderType() == KMFolderTypeCachedImap ) {
1283 if ( !kmkernel->askToGoOnline() ) {
1284 return;
1285 }
1286 }
1287
1288 if (mFolder->folderType() == KMFolderTypeImap)
1289 {
1290 KMFolderImap *imap = static_cast<KMFolderImap*>(mFolder->storage());
1291 imap->getAndCheckFolder();
1292 } else if ( mFolder->folderType() == KMFolderTypeCachedImap ) {
1293 KMFolderCachedImap* f = static_cast<KMFolderCachedImap*>( mFolder->storage() );
1294 f->account()->processNewMailInFolder( mFolder );
1295 }
1296 }
1297}
1298
1299void KMMainWidget::slotTroubleshootFolder()
1300{
1301 if (mFolder)
1302 {
1303 if ( mFolder->folderType() == KMFolderTypeCachedImap ) {
1304 KMFolderCachedImap* f = static_cast<KMFolderCachedImap*>( mFolder->storage() );
1305 f->slotTroubleshoot();
1306 }
1307 }
1308}
1309
1310void KMMainWidget::slotInvalidateIMAPFolders() {
1311 if ( KMessageBox::warningContinueCancel( this,
1312 i18n("Are you sure you want to refresh the IMAP cache?\n"
1313 "This will remove all changes that you have done "
1314 "locally to your IMAP folders."),
1315 i18n("Refresh IMAP Cache"), i18n("&Refresh") ) == KMessageBox::Continue )
1316 kmkernel->acctMgr()->invalidateIMAPFolders();
1317}
1318
1319//-----------------------------------------------------------------------------
1320void KMMainWidget::slotExpireAll() {
1321 TDEConfig *config = KMKernel::config();
1322 int ret = 0;
1323
1324 TDEConfigGroupSaver saver(config, "General");
1325
1326 if (config->readBoolEntry("warn-before-expire", true)) {
1327 ret = KMessageBox::warningContinueCancel(TDEMainWindow::memberList->first(),
1328 i18n("Are you sure you want to expire all old messages?"),
1329 i18n("Expire Old Messages?"), i18n("Expire"));
1330 if (ret != KMessageBox::Continue) {
1331 return;
1332 }
1333 }
1334
1335 kmkernel->expireAllFoldersNow();
1336}
1337
1338//-----------------------------------------------------------------------------
1339void KMMainWidget::slotCompactAll()
1340{
1341 KCursorSaver busy(KBusyPtr::busy());
1342 kmkernel->compactAllFolders();
1343}
1344
1345
1346//-----------------------------------------------------------------------------
1347void KMMainWidget::slotOverrideHtml()
1348{
1349 if( mHtmlPref == mFolderHtmlPref ) {
1350 int result = KMessageBox::warningContinueCancel( this,
1351 // the warning text is taken from configuredialog.cpp:
1352 i18n( "Use of HTML in mail will make you more vulnerable to "
1353 "\"spam\" and may increase the likelihood that your system will be "
1354 "compromised by other present and anticipated security exploits." ),
1355 i18n( "Security Warning" ),
1356 i18n( "Use HTML" ),
1357 "OverrideHtmlWarning", false);
1358 if( result == KMessageBox::Cancel ) {
1359 mPreferHtmlAction->setChecked( false );
1360 return;
1361 }
1362 }
1363 mFolderHtmlPref = !mFolderHtmlPref;
1364 if (mMsgView) {
1365 mMsgView->setHtmlOverride(mFolderHtmlPref);
1366 mMsgView->update( true );
1367 }
1368}
1369
1370//-----------------------------------------------------------------------------
1371void KMMainWidget::slotOverrideHtmlLoadExt()
1372{
1373 if( mHtmlLoadExtPref == mFolderHtmlLoadExtPref ) {
1374 int result = KMessageBox::warningContinueCancel( this,
1375 // the warning text is taken from configuredialog.cpp:
1376 i18n( "Loading external references in html mail will make you more vulnerable to "
1377 "\"spam\" and may increase the likelihood that your system will be "
1378 "compromised by other present and anticipated security exploits." ),
1379 i18n( "Security Warning" ),
1380 i18n( "Load External References" ),
1381 "OverrideHtmlLoadExtWarning", false);
1382 if( result == KMessageBox::Cancel ) {
1383 mPreferHtmlLoadExtAction->setChecked( false );
1384 return;
1385 }
1386 }
1387 mFolderHtmlLoadExtPref = !mFolderHtmlLoadExtPref;
1388 if (mMsgView) {
1389 mMsgView->setHtmlLoadExtDefault(mFolderHtmlLoadExtPref);
1390 mMsgView->update( true );
1391 }
1392}
1393
1394//-----------------------------------------------------------------------------
1395void KMMainWidget::slotOverrideThread()
1396{
1397 mFolderThreadPref = !mFolderThreadPref;
1398 mHeaders->setNestedOverride(mFolderThreadPref);
1399 mThreadBySubjectAction->setEnabled(mThreadMessagesAction->isChecked());
1400}
1401
1402//-----------------------------------------------------------------------------
1403void KMMainWidget::slotToggleSubjectThreading()
1404{
1405 mFolderThreadSubjPref = !mFolderThreadSubjPref;
1406 mHeaders->setSubjectThreading(mFolderThreadSubjPref);
1407}
1408
1409//-----------------------------------------------------------------------------
1410void KMMainWidget::slotToggleShowQuickSearch()
1411{
1412 GlobalSettings::self()->setQuickSearchActive( !GlobalSettings::self()->quickSearchActive() );
1413 if ( GlobalSettings::self()->quickSearchActive() )
1414 mSearchToolBar->show();
1415 else {
1416 mQuickSearchLine->reset();
1417 mSearchToolBar->hide();
1418 }
1419}
1420
1421//-----------------------------------------------------------------------------
1422void KMMainWidget::slotMessageQueuedOrDrafted()
1423{
1424 if (!kmkernel->folderIsDraftOrOutbox(mFolder))
1425 return;
1426 if (mMsgView)
1427 mMsgView->update(true);
1428}
1429
1430
1431//-----------------------------------------------------------------------------
1432void KMMainWidget::slotForwardInlineMsg()
1433{
1434 KMMessageList* selected = mHeaders->selectedMsgs();
1435 KMCommand *command = 0L;
1436 if(selected && !selected->isEmpty()) {
1437 command = new KMForwardInlineCommand( this, *selected,
1438 mFolder->identity() );
1439 } else {
1440 command = new KMForwardInlineCommand( this, mHeaders->currentMsg(),
1441 mFolder->identity() );
1442 }
1443
1444 command->start();
1445}
1446
1447
1448//-----------------------------------------------------------------------------
1449void KMMainWidget::slotForwardAttachedMsg()
1450{
1451 KMMessageList* selected = mHeaders->selectedMsgs();
1452 KMCommand *command = 0L;
1453 if(selected && !selected->isEmpty()) {
1454 command = new KMForwardAttachedCommand( this, *selected, mFolder->identity() );
1455 } else {
1456 command = new KMForwardAttachedCommand( this, mHeaders->currentMsg(), mFolder->identity() );
1457 }
1458
1459 command->start();
1460}
1461
1462//-----------------------------------------------------------------------------
1463void KMMainWidget::slotForwardDigestMsg()
1464{
1465 KMMessageList* selected = mHeaders->selectedMsgs();
1466 KMCommand *command = 0L;
1467 if(selected && !selected->isEmpty()) {
1468 command = new KMForwardDigestCommand( this, *selected, mFolder->identity() );
1469 } else {
1470 command = new KMForwardDigestCommand( this, mHeaders->currentMsg(), mFolder->identity() );
1471 }
1472
1473 command->start();
1474}
1475
1476//-----------------------------------------------------------------------------
1477void KMMainWidget::slotUseTemplate()
1478{
1479 newFromTemplate( mHeaders->currentMsg() );
1480}
1481
1482//-----------------------------------------------------------------------------
1483void KMMainWidget::slotResendMsg()
1484{
1485 KMCommand *command = new KMResendMessageCommand( this, mHeaders->currentMsg() );
1486 command->start();
1487}
1488
1489
1490//-----------------------------------------------------------------------------
1491void KMMainWidget::slotTrashMsg()
1492{
1493 mHeaders->deleteMsg();
1494}
1495
1496//-----------------------------------------------------------------------------
1497void KMMainWidget::slotDeleteMsg( bool confirmDelete )
1498{
1499 mHeaders->moveMsgToFolder( 0, confirmDelete );
1500}
1501
1502//-----------------------------------------------------------------------------
1503void KMMainWidget::slotTrashThread()
1504{
1505 mHeaders->highlightCurrentThread();
1506 mHeaders->deleteMsg();
1507}
1508
1509//-----------------------------------------------------------------------------
1510void KMMainWidget::slotDeleteThread( bool confirmDelete )
1511{
1512 mHeaders->highlightCurrentThread();
1513 mHeaders->moveMsgToFolder( 0, confirmDelete );
1514}
1515
1516//-----------------------------------------------------------------------------
1517void KMMainWidget::slotRedirectMsg()
1518{
1519 KMCommand *command = new KMRedirectCommand( this, mHeaders->currentMsg() );
1520 command->start();
1521}
1522
1523
1524//-----------------------------------------------------------------------------
1525void KMMainWidget::slotCustomReplyToMsg( int tid )
1526{
1527 TQString text = mMsgView? mMsgView->copyText() : "";
1528 TQString tmpl = mCustomTemplates[ tid ];
1529 kdDebug() << "Reply with template: " << tmpl << " (" << tid << ")" << endl;
1530 KMCommand *command = new KMCustomReplyToCommand( this,
1531 mHeaders->currentMsg(),
1532 text,
1533 tmpl );
1534 command->start();
1535}
1536
1537
1538//-----------------------------------------------------------------------------
1539void KMMainWidget::slotCustomReplyAllToMsg( int tid )
1540{
1541 TQString text = mMsgView? mMsgView->copyText() : "";
1542 TQString tmpl = mCustomTemplates[ tid ];
1543 kdDebug() << "Reply to All with template: " << tmpl << " (" << tid << ")" << endl;
1544 KMCommand *command = new KMCustomReplyAllToCommand( this,
1545 mHeaders->currentMsg(),
1546 text,
1547 tmpl );
1548 command->start();
1549}
1550
1551
1552//-----------------------------------------------------------------------------
1553void KMMainWidget::slotCustomForwardMsg( int tid )
1554{
1555 TQString tmpl = mCustomTemplates[ tid ];
1556 kdDebug() << "Forward with template: " << tmpl << " (" << tid << ")" << endl;
1557 KMMessageList* selected = mHeaders->selectedMsgs();
1558 KMCommand *command = 0L;
1559 if(selected && !selected->isEmpty()) {
1560 command = new KMCustomForwardCommand( this, *selected,
1561 mFolder->identity(), tmpl );
1562 } else {
1563 command = new KMCustomForwardCommand( this, mHeaders->currentMsg(),
1564 mFolder->identity(), tmpl );
1565 }
1566 command->start();
1567}
1568
1569
1570//-----------------------------------------------------------------------------
1571void KMMainWidget::slotNoQuoteReplyToMsg()
1572{
1573 KMCommand *command = new KMNoQuoteReplyToCommand( this, mHeaders->currentMsg() );
1574 command->start();
1575}
1576
1577//-----------------------------------------------------------------------------
1578void KMMainWidget::slotSubjectFilter()
1579{
1580 KMMessage *msg = mHeaders->currentMsg();
1581 if (!msg)
1582 return;
1583
1584 KMCommand *command = new KMFilterCommand( "Subject", msg->subject() );
1585 command->start();
1586}
1587
1588//-----------------------------------------------------------------------------
1589void KMMainWidget::slotMailingListFilter()
1590{
1591 KMMessage *msg = mHeaders->currentMsg();
1592 if (!msg)
1593 return;
1594
1595 KMCommand *command = new KMMailingListFilterCommand( this, msg );
1596 command->start();
1597}
1598
1599//-----------------------------------------------------------------------------
1600void KMMainWidget::slotFromFilter()
1601{
1602 KMMessage *msg = mHeaders->currentMsg();
1603 if (!msg)
1604 return;
1605
1606 AddrSpecList al = msg->extractAddrSpecs( "From" );
1607 KMCommand *command;
1608 if ( al.empty() )
1609 command = new KMFilterCommand( "From", msg->from() );
1610 else
1611 command = new KMFilterCommand( "From", al.front().asString() );
1612 command->start();
1613}
1614
1615//-----------------------------------------------------------------------------
1616void KMMainWidget::slotToFilter()
1617{
1618 KMMessage *msg = mHeaders->currentMsg();
1619 if (!msg)
1620 return;
1621
1622 KMCommand *command = new KMFilterCommand( "To", msg->to() );
1623 command->start();
1624}
1625
1626//-----------------------------------------------------------------------------
1627void KMMainWidget::updateListFilterAction()
1628{
1629 //Proxy the mListFilterAction to update the action text
1630 TQCString name;
1631 TQString value;
1632 TQString lname = MailingList::name( mHeaders->currentMsg(), name, value );
1633 mListFilterAction->setText( i18n("Filter on Mailing-List...") );
1634 if ( lname.isNull() )
1635 mListFilterAction->setEnabled( false );
1636 else {
1637 mListFilterAction->setEnabled( true );
1638 mListFilterAction->setText( i18n( "Filter on Mailing-List %1..." ).arg( lname ) );
1639 }
1640}
1641
1642
1643//-----------------------------------------------------------------------------
1644void KMMainWidget::slotUndo()
1645{
1646 mHeaders->undo();
1647 updateMessageActions();
1648 updateFolderMenu();
1649}
1650
1651//-----------------------------------------------------------------------------
1652void KMMainWidget::slotToggleUnread()
1653{
1654 mFolderTree->toggleColumn(KMFolderTree::unread);
1655}
1656
1657//-----------------------------------------------------------------------------
1658void KMMainWidget::slotToggleTotalColumn()
1659{
1660 mFolderTree->toggleColumn(KMFolderTree::total, true);
1661}
1662
1663//-----------------------------------------------------------------------------
1664void KMMainWidget::slotToggleSizeColumn()
1665{
1666 mFolderTree->toggleColumn(KMFolderTree::foldersize);
1667}
1668
1669
1670//-----------------------------------------------------------------------------
1671void KMMainWidget::slotJumpToFolder()
1672{
1673 KMail::KMFolderSelDlg dlg( this, i18n("Jump to Folder"), true );
1674 KMFolder* dest;
1675
1676 if (!dlg.exec()) return;
1677 if (!(dest = dlg.folder())) return;
1678
1679 slotSelectFolder( dest );
1680}
1681
1682//-----------------------------------------------------------------------------
1683void KMMainWidget::slotMoveMsg()
1684{
1685 KMail::KMFolderSelDlg dlg( this, i18n("Move Message to Folder"), true );
1686 KMFolder* dest;
1687
1688 if (!dlg.exec()) return;
1689 if (!(dest = dlg.folder())) return;
1690
1691 mHeaders->moveMsgToFolder(dest);
1692}
1693
1694//-----------------------------------------------------------------------------
1695void KMMainWidget::slotMoveMsgToFolder( KMFolder *dest)
1696{
1697 mHeaders->moveMsgToFolder(dest);
1698}
1699
1700//-----------------------------------------------------------------------------
1701void KMMainWidget::slotCopyMsgToFolder( KMFolder *dest)
1702{
1703 mHeaders->copyMsgToFolder(dest);
1704}
1705
1706//-----------------------------------------------------------------------------
1707void KMMainWidget::slotApplyFilters()
1708{
1709 mHeaders->applyFiltersOnMsg();
1710}
1711
1712//-----------------------------------------------------------------------------
1713void KMMainWidget::slotCheckVacation()
1714{
1715 updateVactionScripStatus( false );
1716 if ( !kmkernel->askToGoOnline() )
1717 return;
1718
1719 Vacation *vac = new Vacation( this, true /* check only */ );
1720 connect( vac, TQ_SIGNAL(scriptActive(bool)), TQ_SLOT(updateVactionScripStatus(bool)) );
1721}
1722
1723void KMMainWidget::slotEditVacation()
1724{
1725 if ( !kmkernel->askToGoOnline() ) {
1726 return;
1727 }
1728
1729 if ( mVacation )
1730 return;
1731
1732 mVacation = new Vacation( this );
1733 connect( mVacation, TQ_SIGNAL(scriptActive(bool)), TQ_SLOT(updateVactionScripStatus(bool)) );
1734 if ( mVacation->isUsable() ) {
1735 connect( mVacation, TQ_SIGNAL(result(bool)), mVacation, TQ_SLOT(deleteLater()) );
1736 } else {
1737 TQString msg = i18n("KMail's Out of Office Reply functionality relies on "
1738 "server-side filtering. You have not yet configured an "
1739 "IMAP server for this.\n"
1740 "You can do this on the \"Filtering\" tab of the IMAP "
1741 "account configuration.");
1742 KMessageBox::sorry( this, msg, i18n("No Server-Side Filtering Configured") );
1743
1744 delete mVacation; // TQGuardedPtr sets itself to 0!
1745 }
1746}
1747
1748//-----------------------------------------------------------------------------
1749void KMMainWidget::slotDebugSieve()
1750{
1751#if !defined(NDEBUG)
1752 if ( mSieveDebugDialog )
1753 return;
1754
1755 mSieveDebugDialog = new SieveDebugDialog( this );
1756 mSieveDebugDialog->exec();
1757 delete mSieveDebugDialog;
1758#endif
1759}
1760
1761//-----------------------------------------------------------------------------
1762void KMMainWidget::slotStartCertManager()
1763{
1764 TDEProcess certManagerProc; // save to create on the heap, since
1765 // there is no parent
1766 certManagerProc << "kleopatra";
1767
1768 if( !certManagerProc.start( TDEProcess::DontCare ) )
1769 KMessageBox::error( this, i18n( "Could not start certificate manager 'kleopatra'; "
1770 "please check your installation." ),
1771 i18n( "KMail Error" ) );
1772 else
1773 kdDebug(5006) << "\nslotStartCertManager(): certificate manager started.\n" << endl;
1774 // process continues to run even after the TDEProcess object goes
1775 // out of scope here, since it is started in DontCare run mode.
1776
1777}
1778
1779//-----------------------------------------------------------------------------
1780void KMMainWidget::slotStartWatchGnuPG()
1781{
1782 TDEProcess certManagerProc;
1783 certManagerProc << "kwatchgnupg";
1784
1785 if( !certManagerProc.start( TDEProcess::DontCare ) )
1786 KMessageBox::error( this, i18n( "Could not start GnuPG LogViewer (kwatchgnupg); "
1787 "please check your installation." ),
1788 i18n( "KMail Error" ) );
1789}
1790
1791//-----------------------------------------------------------------------------
1792void KMMainWidget::slotCopyMsg()
1793{
1794 KMail::KMFolderSelDlg dlg( this, i18n("Copy Message to Folder"), true );
1795 KMFolder* dest;
1796
1797 if (!dlg.exec()) return;
1798 if (!(dest = dlg.folder())) return;
1799
1800 mHeaders->copyMsgToFolder(dest);
1801}
1802
1803//-----------------------------------------------------------------------------
1804void KMMainWidget::slotPrintMsg()
1805{
1806 KMMessage *msg = mHeaders->currentMsg();
1807 if ( !msg ) {
1808 return;
1809 }
1810
1811 bool htmlOverride = mMsgView ? mMsgView->htmlOverride() : false;
1812 bool htmlLoadExtOverride = mMsgView ? mMsgView->htmlLoadExtOverride() : false;
1813 TDEConfigGroup reader( KMKernel::config(), "Reader" );
1814 bool useFixedFont = mMsgView ? mMsgView->isFixedFont()
1815 : reader.readBoolEntry( "useFixedFont", false );
1816
1817 const HeaderStyle *style;
1818 const HeaderStrategy *strategy;
1819 if ( mMsgView ) {
1820 style = mMsgView->headerStyle();
1821 strategy = mMsgView->headerStrategy();
1822 } else {
1823 style = HeaderStyle::create( reader.readEntry( "header-style", "fancy" ) );
1824 strategy = HeaderStrategy::create( reader.readEntry( "header-set-displayed", "rich" ) );
1825 }
1826
1827 KMPrintCommand *command =
1828 new KMPrintCommand( this, msg,
1829 style, strategy,
1830 htmlOverride, htmlLoadExtOverride,
1831 useFixedFont, overrideEncoding() );
1832 if ( mMsgView )
1833 command->setOverrideFont( mMsgView->cssHelper()->bodyFont( mMsgView->isFixedFont(), true /*printing*/ ) );
1834
1835 command->start();
1836}
1837
1838//-----------------------------------------------------------------------------
1839void KMMainWidget::setupForwardActions()
1840{
1841 disconnect( mForwardActionMenu, TQ_SIGNAL( activated() ), 0, 0 );
1842 mForwardActionMenu->remove( mForwardInlineAction );
1843 mForwardActionMenu->remove( mForwardAttachedAction );
1844
1845 if ( GlobalSettings::self()->forwardingInlineByDefault() ) {
1846 mForwardActionMenu->insert( mForwardInlineAction, 0 );
1847 mForwardActionMenu->insert( mForwardAttachedAction, 1 );
1848 mForwardInlineAction->setShortcut( Key_F );
1849 mForwardAttachedAction->setShortcut( SHIFT+Key_F );
1850 connect( mForwardActionMenu, TQ_SIGNAL(activated()), this,
1851 TQ_SLOT(slotForwardInlineMsg()) );
1852
1853 } else {
1854 mForwardActionMenu->insert( mForwardAttachedAction, 0 );
1855 mForwardActionMenu->insert( mForwardInlineAction, 1 );
1856 mForwardInlineAction->setShortcut( SHIFT+Key_F );
1857 mForwardAttachedAction->setShortcut( Key_F );
1858 connect( mForwardActionMenu, TQ_SIGNAL(activated()), this,
1859 TQ_SLOT(slotForwardAttachedMsg()) );
1860 }
1861}
1862
1863//-----------------------------------------------------------------------------
1864void KMMainWidget::slotConfigChanged()
1865{
1866 readConfig();
1867 setupForwardActions();
1868 setupForwardingActionsList();
1869}
1870
1871//-----------------------------------------------------------------------------
1872void KMMainWidget::slotSaveMsg()
1873{
1874 KMMessage *msg = mHeaders->currentMsg();
1875 if (!msg)
1876 return;
1877 KMSaveMsgCommand *saveCommand = new KMSaveMsgCommand( this,
1878 *mHeaders->selectedMsgs() );
1879
1880 if (saveCommand->url().isEmpty())
1881 delete saveCommand;
1882 else
1883 saveCommand->start();
1884}
1885
1886//-----------------------------------------------------------------------------
1887void KMMainWidget::slotOpenMsg()
1888{
1889 KMOpenMsgCommand *openCommand = new KMOpenMsgCommand( this, 0, overrideEncoding() );
1890
1891 openCommand->start();
1892}
1893
1894//-----------------------------------------------------------------------------
1895void KMMainWidget::slotSaveAttachments()
1896{
1897 KMMessage *msg = mHeaders->currentMsg();
1898 if (!msg)
1899 return;
1900 KMSaveAttachmentsCommand *saveCommand = new KMSaveAttachmentsCommand( this,
1901 *mHeaders->selectedMsgs() );
1902 saveCommand->start();
1903}
1904
1905void KMMainWidget::slotOnlineStatus()
1906{
1907 // KMKernel will emit a signal when we toggle the network state that is caught by
1908 // KMMainWidget::slotUpdateOnlineStatus to update our GUI
1909 if ( GlobalSettings::self()->networkState() == GlobalSettings::EnumNetworkState::Online ) {
1910 // if online; then toggle and set it offline.
1911 kmkernel->stopNetworkJobs();
1912 } else {
1913 kmkernel->resumeNetworkJobs();
1914 slotCheckVacation();
1915 }
1916}
1917
1918void KMMainWidget::slotUpdateOnlineStatus( GlobalSettings::EnumNetworkState::type )
1919{
1920 if ( GlobalSettings::self()->networkState() == GlobalSettings::EnumNetworkState::Online )
1921 actionCollection()->action( "online_status" )->setText( i18n("Work Offline") );
1922 else
1923 actionCollection()->action( "online_status" )->setText( i18n("Work Online") );
1924}
1925
1926
1927//-----------------------------------------------------------------------------
1928void KMMainWidget::slotSendQueued()
1929{
1930 if ( !kmkernel->askToGoOnline() ) {
1931 return;
1932 }
1933
1934 kmkernel->msgSender()->sendQueued();
1935}
1936
1937//-----------------------------------------------------------------------------
1938void KMMainWidget::slotSendQueuedVia( int item )
1939{
1940 if ( !kmkernel->askToGoOnline() ) {
1941 return;
1942 }
1943
1944 TQStringList availTransports= KMail::TransportManager::transportNames();
1945 TQString customTransport = availTransports[ item ];
1946
1947 kmkernel->msgSender()->sendQueued( customTransport );
1948}
1949
1950//-----------------------------------------------------------------------------
1951void KMMainWidget::slotViewChange()
1952{
1953 if(mBodyPartsMenu->isItemChecked(mBodyPartsMenu->idAt(0)))
1954 {
1955 mBodyPartsMenu->setItemChecked(mBodyPartsMenu->idAt(0),false);
1956 mBodyPartsMenu->setItemChecked(mBodyPartsMenu->idAt(1),true);
1957 }
1958 else if(mBodyPartsMenu->isItemChecked(mBodyPartsMenu->idAt(1)))
1959 {
1960 mBodyPartsMenu->setItemChecked(mBodyPartsMenu->idAt(1),false);
1961 mBodyPartsMenu->setItemChecked(mBodyPartsMenu->idAt(0),true);
1962 }
1963
1964 //mMsgView->setInline(!mMsgView->isInline());
1965}
1966
1967
1968//-----------------------------------------------------------------------------
1969void KMMainWidget::folderSelectedUnread( KMFolder* aFolder )
1970{
1971 folderSelected( aFolder, true );
1972 slotChangeCaption( mFolderTree->currentItem() );
1973}
1974
1975//-----------------------------------------------------------------------------
1976void KMMainWidget::folderSelected()
1977{
1978 folderSelected( mFolder );
1979 updateFolderMenu();
1980 // opened() before the getAndCheckFolder() in folderSelected
1981 if ( mFolder && mFolder->folderType() == KMFolderTypeImap )
1982 mFolder->close("mainwidget");
1983}
1984
1985//-----------------------------------------------------------------------------
1986void KMMainWidget::folderSelected( KMFolder* aFolder, bool forceJumpToUnread )
1987{
1988 KCursorSaver busy(KBusyPtr::busy());
1989
1990 if (mMsgView)
1991 mMsgView->clear(true);
1992
1993 if ( mFolder && mFolder->folderType() == KMFolderTypeImap && !mFolder->noContent() )
1994 {
1995 KMFolderImap *imap = static_cast<KMFolderImap*>(mFolder->storage());
1996 if ( mFolder->needsCompacting() && imap->autoExpunge() )
1997 imap->expungeFolder(imap, true);
1998 }
1999
2000 // Re-enable the msg list and quicksearch if we're showing a splash
2001 // screen. This is true either if there's no active folder, or if we
2002 // have a timer that is no longer active (i.e. it has already fired)
2003 // To make the if() a bit more complicated, we suppress the hiding
2004 // when the new folder is also an IMAP folder, because that's an
2005 // async operation and we don't want flicker if it results in just
2006 // a new splash.
2007 bool newFolder = ( (KMFolder*)mFolder != aFolder );
2008 bool isNewImapFolder = aFolder && aFolder->folderType() == KMFolderTypeImap && newFolder;
2009 if( !mFolder
2010 || ( !isNewImapFolder && mShowBusySplashTimer )
2011 || ( newFolder && mShowingOfflineScreen && !( isNewImapFolder && kmkernel->isOffline() ) ) ) {
2012 if ( mMsgView ) {
2013 mMsgView->enableMsgDisplay();
2014 mMsgView->clear( true );
2015 }
2016 if( mSearchAndHeaders && mHeaders )
2017 mSearchAndHeaders->show();
2018 mShowingOfflineScreen = false;
2019 }
2020
2021 // Delete any pending timer, if needed it will be recreated below
2022 delete mShowBusySplashTimer;
2023 mShowBusySplashTimer = 0;
2024
2025 if ( newFolder )
2026 writeFolderConfig();
2027 if ( mFolder ) {
2028 disconnect( mFolder, TQ_SIGNAL( changed() ),
2029 this, TQ_SLOT( updateMarkAsReadAction() ) );
2030 disconnect( mFolder, TQ_SIGNAL( msgHeaderChanged( KMFolder*, int ) ),
2031 this, TQ_SLOT( updateMarkAsReadAction() ) );
2032 disconnect( mFolder, TQ_SIGNAL( msgAdded( int ) ),
2033 this, TQ_SLOT( updateMarkAsReadAction() ) );
2034 disconnect( mFolder, TQ_SIGNAL( msgRemoved( KMFolder * ) ),
2035 this, TQ_SLOT( updateMarkAsReadAction() ) );
2036 }
2037
2038 mFolder = aFolder;
2039
2040 if ( aFolder && aFolder->folderType() == KMFolderTypeImap )
2041 {
2042 if ( kmkernel->isOffline() ) {
2043 showOfflinePage();
2044 return;
2045 }
2046 KMFolderImap *imap = static_cast<KMFolderImap*>(aFolder->storage());
2047 if ( newFolder && !mFolder->noContent() )
2048 {
2049 imap->open("mainwidget"); // will be closed in the folderSelected slot
2050 // first get new headers before we select the folder
2051 imap->setSelected( true );
2052 connect( imap, TQ_SIGNAL( folderComplete( KMFolderImap*, bool ) ),
2053 this, TQ_SLOT( folderSelected() ) );
2054 imap->getAndCheckFolder();
2055 mHeaders->setFolder( 0 );
2056 updateFolderMenu();
2057 mForceJumpToUnread = forceJumpToUnread;
2058
2059 // Set a timer to show a splash screen if fetching folder contents
2060 // takes more than the amount of seconds configured in the kmailrc (default 1000 msec)
2061 mShowBusySplashTimer = new TQTimer( this );
2062 connect( mShowBusySplashTimer, TQ_SIGNAL( timeout() ), this, TQ_SLOT( slotShowBusySplash() ) );
2063 mShowBusySplashTimer->start( GlobalSettings::self()->folderLoadingTimeout(), true );
2064 return;
2065 } else {
2066 // the folder is complete now - so go ahead
2067 disconnect( imap, TQ_SIGNAL( folderComplete( KMFolderImap*, bool ) ),
2068 this, TQ_SLOT( folderSelected() ) );
2069 forceJumpToUnread = mForceJumpToUnread;
2070 }
2071 }
2072
2073 if ( mFolder ) { // == 0 -> pointing to toplevel ("Welcome to KMail") folder
2074 connect( mFolder, TQ_SIGNAL( changed() ),
2075 this, TQ_SLOT( updateMarkAsReadAction() ) );
2076 connect( mFolder, TQ_SIGNAL( msgHeaderChanged( KMFolder*, int ) ),
2077 this, TQ_SLOT( updateMarkAsReadAction() ) );
2078 connect( mFolder, TQ_SIGNAL( msgAdded( int ) ),
2079 this, TQ_SLOT( updateMarkAsReadAction() ) );
2080 connect( mFolder, TQ_SIGNAL( msgRemoved(KMFolder *) ),
2081 this, TQ_SLOT( updateMarkAsReadAction() ) );
2082 }
2083 readFolderConfig();
2084 if (mMsgView)
2085 {
2086 mMsgView->setHtmlOverride(mFolderHtmlPref);
2087 mMsgView->setHtmlLoadExtDefault(mFolderHtmlLoadExtPref);
2088 }
2089 mHeaders->setFolder( mFolder, forceJumpToUnread );
2090 updateMessageActions();
2091 updateFolderMenu();
2092 if (!aFolder)
2093 slotIntro();
2094}
2095
2096//-----------------------------------------------------------------------------
2097void KMMainWidget::slotShowBusySplash()
2098{
2099 if ( mReaderWindowActive )
2100 {
2101 mMsgView->displayBusyPage();
2102 // hide widgets that are in the way:
2103 if ( mSearchAndHeaders && mHeaders && mLongFolderList )
2104 mSearchAndHeaders->hide();
2105 }
2106}
2107
2108void KMMainWidget::showOfflinePage()
2109{
2110 if ( !mReaderWindowActive ) return;
2111 mShowingOfflineScreen = true;
2112
2113 mMsgView->displayOfflinePage();
2114 // hide widgets that are in the way:
2115 if ( mSearchAndHeaders && mHeaders && mLongFolderList )
2116 mSearchAndHeaders->hide();
2117}
2118
2119//-----------------------------------------------------------------------------
2120void KMMainWidget::slotMsgSelected(KMMessage *msg)
2121{
2122 if ( msg && msg->parent() && !msg->isComplete() )
2123 {
2124 if ( msg->transferInProgress() )
2125 return;
2126 mMsgView->clear();
2127 mMsgView->setWaitingForSerNum( msg->getMsgSerNum() );
2128
2129 if ( mJob ) {
2130 disconnect( mJob, 0, mMsgView, 0 );
2131 delete mJob;
2132 }
2133 mJob = msg->parent()->createJob( msg, FolderJob::tGetMessage, 0,
2134 "STRUCTURE", mMsgView->attachmentStrategy() );
2135 connect(mJob, TQ_SIGNAL(messageRetrieved(KMMessage*)),
2136 mMsgView, TQ_SLOT(slotMessageArrived(KMMessage*)));
2137 mJob->start();
2138 } else {
2139 mMsgView->setMsg(msg);
2140 }
2141 // reset HTML override to the folder setting
2142 mMsgView->setHtmlOverride(mFolderHtmlPref);
2143 mMsgView->setHtmlLoadExtDefault(mFolderHtmlLoadExtPref);
2144 mMsgView->setHtmlLoadExtOverride(false);
2145 mMsgView->setDecryptMessageOverwrite( false );
2146 mMsgView->setShowSignatureDetails( false );
2147}
2148
2149//-----------------------------------------------------------------------------
2150void KMMainWidget::slotMsgChanged()
2151{
2152 mHeaders->msgChanged();
2153}
2154
2155//-----------------------------------------------------------------------------
2156void KMMainWidget::slotSelectFolder(KMFolder* folder)
2157{
2158 TQListViewItem* item = mFolderTree->indexOfFolder(folder);
2159 if ( item ) {
2160 mFolderTree->ensureItemVisible( item );
2161 mFolderTree->doFolderSelected( item );
2162 }
2163}
2164
2165//-----------------------------------------------------------------------------
2166void KMMainWidget::slotSelectMessage(KMMessage* msg)
2167{
2168 int idx = mFolder->find(msg);
2169 if (idx != -1) {
2170 mHeaders->setCurrentMsg(idx);
2171 if (mMsgView)
2172 mMsgView->setMsg(msg);
2173 else
2174 slotMsgActivated(msg);
2175 }
2176}
2177
2178//-----------------------------------------------------------------------------
2179void KMMainWidget::slotReplaceMsgByUnencryptedVersion()
2180{
2181 kdDebug(5006) << "KMMainWidget::slotReplaceMsgByUnencryptedVersion()" << endl;
2182 KMMessage* oldMsg = mHeaders->currentMsg();
2183 if( oldMsg ) {
2184 kdDebug(5006) << "KMMainWidget - old message found" << endl;
2185 if( oldMsg->hasUnencryptedMsg() ) {
2186 kdDebug(5006) << "KMMainWidget - extra unencrypted message found" << endl;
2187 KMMessage* newMsg = oldMsg->unencryptedMsg();
2188 // adjust the message id
2189 {
2190 TQString msgId( oldMsg->msgId() );
2191 TQString prefix("DecryptedMsg.");
2192 int oldIdx = msgId.find(prefix, 0, false);
2193 if( -1 == oldIdx ) {
2194 int leftAngle = msgId.findRev( '<' );
2195 msgId = msgId.insert( (-1 == leftAngle) ? 0 : ++leftAngle, prefix );
2196 }
2197 else {
2198 // toggle between "DecryptedMsg." and "DeCryptedMsg."
2199 // to avoid same message id
2200 TQCharRef c = msgId[ oldIdx+2 ];
2201 if( 'C' == c )
2202 c = 'c';
2203 else
2204 c = 'C';
2205 }
2206 newMsg->setMsgId( msgId );
2207 mMsgView->setIdOfLastViewedMessage( msgId );
2208 }
2209 // insert the unencrypted message
2210 kdDebug(5006) << "KMMainWidget - adding unencrypted message to folder" << endl;
2211 mFolder->addMsg( newMsg );
2212 /* Figure out its index in the folder for selecting. This must be count()-1,
2213 * since we append. Be safe and do find, though, just in case. */
2214 int newMsgIdx = mFolder->find( newMsg );
2215 Q_ASSERT( newMsgIdx != -1 );
2216 /* we need this unget, to have the message displayed correctly initially */
2217 mFolder->unGetMsg( newMsgIdx );
2218 int idx = mFolder->find( oldMsg );
2219 Q_ASSERT( idx != -1 );
2220 /* only select here, so the old one is not un-Gotten before, which would
2221 * render the pointer we hold invalid so that find would fail */
2222 mHeaders->setCurrentItemByIndex( newMsgIdx );
2223 // remove the old one
2224 if ( idx != -1 ) {
2225 kdDebug(5006) << "KMMainWidget - deleting encrypted message" << endl;
2226 mFolder->take( idx );
2227 }
2228
2229 kdDebug(5006) << "KMMainWidget - updating message actions" << endl;
2230 updateMessageActions();
2231
2232 kdDebug(5006) << "KMMainWidget - done." << endl;
2233 } else
2234 kdDebug(5006) << "KMMainWidget - NO EXTRA UNENCRYPTED MESSAGE FOUND" << endl;
2235 } else
2236 kdDebug(5006) << "KMMainWidget - PANIC: NO OLD MESSAGE FOUND" << endl;
2237}
2238
2239//-----------------------------------------------------------------------------
2240void KMMainWidget::slotSetThreadStatusNew()
2241{
2242 mHeaders->setThreadStatus(KMMsgStatusNew);
2243}
2244
2245//-----------------------------------------------------------------------------
2246void KMMainWidget::slotSetThreadStatusUnread()
2247{
2248 mHeaders->setThreadStatus(KMMsgStatusUnread);
2249}
2250
2251//-----------------------------------------------------------------------------
2252void KMMainWidget::slotSetThreadStatusFlag()
2253{
2254 mHeaders->setThreadStatus(KMMsgStatusFlag, true);
2255}
2256
2257//-----------------------------------------------------------------------------
2258void KMMainWidget::slotSetThreadStatusRead()
2259{
2260 mHeaders->setThreadStatus(KMMsgStatusRead);
2261}
2262
2263//-----------------------------------------------------------------------------
2264void KMMainWidget::slotSetThreadStatusTodo()
2265{
2266 mHeaders->setThreadStatus(KMMsgStatusTodo, true);
2267}
2268
2269//-----------------------------------------------------------------------------
2270void KMMainWidget::slotSetThreadStatusWatched()
2271{
2272 mHeaders->setThreadStatus(KMMsgStatusWatched, true);
2273 if (mWatchThreadAction->isChecked()) {
2274 mIgnoreThreadAction->setChecked(false);
2275 }
2276}
2277
2278//-----------------------------------------------------------------------------
2279void KMMainWidget::slotSetThreadStatusIgnored()
2280{
2281 mHeaders->setThreadStatus(KMMsgStatusIgnored, true);
2282 if (mIgnoreThreadAction->isChecked()) {
2283 mWatchThreadAction->setChecked(false);
2284 }
2285}
2286
2287//-----------------------------------------------------------------------------
2288void KMMainWidget::slotNextMessage() { mHeaders->nextMessage(); }
2289void KMMainWidget::slotNextUnreadMessage()
2290{
2291 if ( !mHeaders->nextUnreadMessage() )
2292 if ( GlobalSettings::self()->loopOnGotoUnread() == GlobalSettings::EnumLoopOnGotoUnread::LoopInAllFolders )
2293 mFolderTree->nextUnreadFolder(true);
2294}
2295void KMMainWidget::slotNextImportantMessage() {
2296 //mHeaders->nextImportantMessage();
2297}
2298void KMMainWidget::slotPrevMessage() { mHeaders->prevMessage(); }
2299void KMMainWidget::slotPrevUnreadMessage()
2300{
2301 if ( !mHeaders->prevUnreadMessage() )
2302 if ( GlobalSettings::self()->loopOnGotoUnread() == GlobalSettings::EnumLoopOnGotoUnread::LoopInAllFolders )
2303 mFolderTree->prevUnreadFolder();
2304}
2305void KMMainWidget::slotPrevImportantMessage() {
2306 //mHeaders->prevImportantMessage();
2307}
2308
2309void KMMainWidget::slotDisplayCurrentMessage()
2310{
2311 if ( mHeaders->currentMsg() )
2312 slotMsgActivated( mHeaders->currentMsg() );
2313}
2314
2315//-----------------------------------------------------------------------------
2316void KMMainWidget::slotMsgActivated(KMMessage *msg)
2317{
2318 if ( !msg ) return;
2319 if ( msg->parent() && !msg->isComplete() ) {
2320 FolderJob *job = msg->parent()->createJob( msg );
2321 connect( job, TQ_SIGNAL( messageRetrieved( KMMessage* ) ),
2322 TQ_SLOT( slotMsgActivated( KMMessage* ) ) );
2323 job->start();
2324 return;
2325 }
2326
2327 if (kmkernel->folderIsDraftOrOutbox( mFolder ) ) {
2328 mMsgActions->editCurrentMessage();
2329 return;
2330 }
2331 if ( kmkernel->folderIsTemplates( mFolder ) ) {
2332 slotUseTemplate();
2333 return;
2334 }
2335
2336 assert( msg != 0 );
2337 KMReaderMainWin *win = new KMReaderMainWin( mFolderHtmlPref, mFolderHtmlLoadExtPref );
2338 TDEConfigGroup reader( KMKernel::config(), "Reader" );
2339 bool useFixedFont = mMsgView ? mMsgView->isFixedFont()
2340 : reader.readBoolEntry( "useFixedFont", false );
2341 win->setUseFixedFont( useFixedFont );
2342 KMMessage *newMessage = new KMMessage(*msg);
2343 newMessage->setParent( msg->parent() );
2344 newMessage->setMsgSerNum( msg->getMsgSerNum() );
2345 newMessage->setReadyToShow( true );
2346 win->showMsg( overrideEncoding(), newMessage );
2347 win->show();
2348}
2349
2350//-----------------------------------------------------------------------------
2351void KMMainWidget::slotMarkAll()
2352{
2353 mHeaders->selectAll( true );
2354}
2355
2356//-----------------------------------------------------------------------------
2357void KMMainWidget::slotMsgPopup(KMMessage&, const KURL &aUrl, const TQPoint& aPoint)
2358{
2359 TDEPopupMenu * menu = new TDEPopupMenu;
2360 updateMessageMenu();
2361 mUrlCurrent = aUrl;
2362
2363 bool urlMenuAdded = false;
2364
2365 if (!aUrl.isEmpty())
2366 {
2367 if (aUrl.protocol() == "mailto")
2368 {
2369 // popup on a mailto URL
2370 mMsgView->mailToComposeAction()->plug( menu );
2371 mMsgView->mailToReplyAction()->plug( menu );
2372 mMsgView->mailToForwardAction()->plug( menu );
2373
2374 menu->insertSeparator();
2375 mMsgView->addAddrBookAction()->plug( menu );
2376 mMsgView->openAddrBookAction()->plug( menu );
2377 mMsgView->copyURLAction()->plug( menu );
2378 mMsgView->startImChatAction()->plug( menu );
2379 // only enable if our KIMProxy is functional
2380 mMsgView->startImChatAction()->setEnabled( kmkernel->imProxy()->initialize() );
2381
2382 } else {
2383 // popup on a not-mailto URL
2384 mMsgView->urlOpenAction()->plug( menu );
2385 mMsgView->addBookmarksAction()->plug( menu );
2386 mMsgView->urlSaveAsAction()->plug( menu );
2387 mMsgView->copyURLAction()->plug( menu );
2388 }
2389 if ( aUrl.protocol() == "im" )
2390 {
2391 // popup on an IM address
2392 // no need to check the KIMProxy is initialized, as these protocols will
2393 // only be present if it is.
2394 mMsgView->startImChatAction()->plug( menu );
2395 }
2396
2397 urlMenuAdded=true;
2398 kdDebug( 0 ) << k_funcinfo << " URL is: " << aUrl << endl;
2399 }
2400
2401
2402 if(mMsgView && !mMsgView->copyText().isEmpty()) {
2403 if ( urlMenuAdded )
2404 menu->insertSeparator();
2405 mMsgActions->replyMenu()->plug(menu);
2406 menu->insertSeparator();
2407
2408 mMsgView->copyAction()->plug( menu );
2409 mMsgView->selectAllAction()->plug( menu );
2410 } else if ( !urlMenuAdded )
2411 {
2412 // popup somewhere else (i.e., not a URL) on the message
2413
2414 if (!mHeaders->currentMsg()) // no messages
2415 {
2416 delete menu;
2417 return;
2418 }
2419
2420
2421 if ( mFolder->isTemplates() ) {
2422 mUseAction->plug( menu );
2423 } else {
2424 mMsgActions->replyMenu()->plug( menu );
2425 mForwardActionMenu->plug( menu );
2426 }
2427 editAction()->plug(menu);
2428 menu->insertSeparator();
2429
2430 mCopyActionMenu->plug( menu );
2431 mMoveActionMenu->plug( menu );
2432
2433 menu->insertSeparator();
2434
2435 mMsgActions->messageStatusMenu()->plug( menu );
2436 menu->insertSeparator();
2437
2438 viewSourceAction()->plug(menu);
2439 if(mMsgView) {
2440 mMsgView->toggleFixFontAction()->plug(menu);
2441 mMsgView->toggleMimePartTreeAction()->plug(menu);
2442 }
2443 menu->insertSeparator();
2444 mPrintAction->plug( menu );
2445 mSaveAsAction->plug( menu );
2446 mSaveAttachmentsAction->plug( menu );
2447
2448 menu->insertSeparator();
2449 if( mFolder->isTrash() )
2450 mDeleteAction->plug( menu );
2451 else
2452 mTrashAction->plug( menu );
2453
2454 menu->insertSeparator();
2455 mMsgActions->createTodoAction()->plug( menu );
2456 }
2457 TDEAcceleratorManager::manage(menu);
2458 menu->exec(aPoint, 0);
2459 delete menu;
2460}
2461
2462//-----------------------------------------------------------------------------
2463void KMMainWidget::getAccountMenu()
2464{
2465 TQStringList actList;
2466
2467 mActMenu->clear();
2468 actList = kmkernel->acctMgr()->getAccounts();
2469 TQStringList::Iterator it;
2470 int id = 0;
2471 for(it = actList.begin(); it != actList.end() ; ++it, id++)
2472 mActMenu->insertItem((*it).replace("&", "&&"), id);
2473}
2474
2475//-----------------------------------------------------------------------------
2476void KMMainWidget::getTransportMenu()
2477{
2478 TQStringList availTransports;
2479
2480 mSendMenu->clear();
2481 availTransports = KMail::TransportManager::transportNames();
2482 TQStringList::Iterator it;
2483 int id = 0;
2484 for(it = availTransports.begin(); it != availTransports.end() ; ++it, id++)
2485 mSendMenu->insertItem((*it).replace("&", "&&"), id);
2486}
2487
2488//-----------------------------------------------------------------------------
2489void KMMainWidget::updateCustomTemplateMenus()
2490{
2491 if ( !mCustomTemplateActions.isEmpty() ) {
2492 TQPtrList<TDEAction>::iterator ait = mCustomTemplateActions.begin();
2493 for ( ; ait != mCustomTemplateActions.end() ; ++ait ) {
2494 (*ait)->unplugAll();
2495 delete (*ait);
2496 }
2497 mCustomTemplateActions.clear();
2498 }
2499
2500 delete mCustomReplyActionMenu;
2501 delete mCustomReplyAllActionMenu;
2502 delete mCustomForwardActionMenu;
2503
2504 delete mCustomReplyMapper;
2505 delete mCustomReplyAllMapper;
2506 delete mCustomForwardMapper;
2507
2508 mCustomForwardActionMenu =
2509 new TDEActionMenu( i18n("Forward With Custom Template"),
2510 "mail_custom_forward",
2511 actionCollection(), "custom_forward" );
2512 TQSignalMapper *mCustomForwardMapper = new TQSignalMapper( this );
2513 connect( mCustomForwardMapper, TQ_SIGNAL( mapped( int ) ),
2514 this, TQ_SLOT( slotCustomForwardMsg( int ) ) );
2515 mForwardActionMenu->insert( mCustomForwardActionMenu );
2516
2517 mCustomReplyActionMenu =
2518 new TDEActionMenu( i18n("Reply With Custom Template"), "mail_custom_reply",
2519 actionCollection(), "custom_reply" );
2520 TQSignalMapper *mCustomReplyMapper = new TQSignalMapper( this );
2521 connect( mCustomReplyMapper, TQ_SIGNAL( mapped( int ) ),
2522 this, TQ_SLOT( slotCustomReplyToMsg( int ) ) );
2523 mMsgActions->replyMenu()->insert( mCustomReplyActionMenu );
2524
2525 mCustomReplyAllActionMenu =
2526 new TDEActionMenu( i18n("Reply to All With Custom Template"),
2527 "mail_custom_reply_all",
2528 actionCollection(), "custom_reply_all" );
2529 TQSignalMapper *mCustomReplyAllMapper = new TQSignalMapper( this );
2530 connect( mCustomReplyAllMapper, TQ_SIGNAL( mapped( int ) ),
2531 this, TQ_SLOT( slotCustomReplyAllToMsg( int ) ) );
2532 mMsgActions->replyMenu()->insert( mCustomReplyAllActionMenu );
2533
2534 mCustomTemplates.clear();
2535
2536 TQStringList list = GlobalSettingsBase::self()->customTemplates();
2537 TQStringList::iterator it = list.begin();
2538 int idx = 0;
2539 int replyc = 0;
2540 int replyallc = 0;
2541 int forwardc = 0;
2542 for ( ; it != list.end(); ++it ) {
2543 CTemplates t( *it );
2544 mCustomTemplates.append( *it );
2545
2546 TDEAction *action;
2547 switch ( t.type() ) {
2548 case CustomTemplates::TReply:
2549 action = new TDEAction( (*it).replace( "&", "&&" ),
2550 TDEShortcut( t.shortcut() ),
2551 mCustomReplyMapper,
2552 TQ_SLOT( map() ),
2553 actionCollection(),
2554 (*it).utf8() );
2555 mCustomReplyMapper->setMapping( action, idx );
2556 mCustomReplyActionMenu->insert( action, idx );
2557 mCustomTemplateActions.append( action );
2558 ++replyc;
2559 break;
2560 case CustomTemplates::TReplyAll:
2561 action = new TDEAction( (*it).replace( "&", "&&" ),
2562 TDEShortcut( t.shortcut() ),
2563 mCustomReplyAllMapper,
2564 TQ_SLOT( map() ),
2565 actionCollection(),
2566 (*it).utf8() );
2567 mCustomReplyAllMapper->setMapping( action, idx );
2568 mCustomReplyAllActionMenu->insert( action, idx );
2569 mCustomTemplateActions.append( action );
2570 ++replyallc;
2571 break;
2572 case CustomTemplates::TForward:
2573 action = new TDEAction( (*it).replace( "&", "&&" ),
2574 TDEShortcut( t.shortcut() ),
2575 mCustomForwardMapper,
2576 TQ_SLOT( map() ),
2577 actionCollection(),
2578 (*it).utf8() );
2579 mCustomForwardMapper->setMapping( action, idx );
2580 mCustomForwardActionMenu->insert( action, idx );
2581 mCustomTemplateActions.append( action );
2582 ++forwardc;
2583 break;
2584 case CustomTemplates::TUniversal:
2585 action = new TDEAction( (*it).replace( "&", "&&" ),
2586 TDEShortcut::null(),
2587 mCustomReplyMapper,
2588 TQ_SLOT( map() ),
2589 actionCollection(),
2590 (*it).utf8() );
2591 mCustomReplyMapper->setMapping( action, idx );
2592 mCustomReplyActionMenu->insert( action, idx );
2593 mCustomTemplateActions.append( action );
2594 ++replyc;
2595 action = new TDEAction( (*it).replace( "&", "&&" ),
2596 TDEShortcut::null(),
2597 mCustomReplyAllMapper,
2598 TQ_SLOT( map() ),
2599 actionCollection(),
2600 (*it).utf8() );
2601 mCustomReplyAllMapper->setMapping( action, idx );
2602 mCustomReplyAllActionMenu->insert( action, idx );
2603 mCustomTemplateActions.append( action );
2604 ++replyallc;
2605 action = new TDEAction( (*it).replace( "&", "&&" ),
2606 TDEShortcut::null(),
2607 mCustomForwardMapper,
2608 TQ_SLOT( map() ),
2609 actionCollection(),
2610 (*it).utf8() );
2611 mCustomForwardMapper->setMapping( action, idx );
2612 mCustomForwardActionMenu->insert( action, idx );
2613 mCustomTemplateActions.append( action );
2614 ++forwardc;
2615 break;
2616 }
2617
2618 ++idx;
2619 }
2620 if ( !replyc ) {
2621 mCustomReplyActionMenu->popupMenu()->insertItem( i18n( "(no custom templates)" ), 0 );
2622 mCustomReplyActionMenu->popupMenu()->setItemEnabled( 0, false );
2623 mCustomReplyActionMenu->setEnabled(false);
2624 }
2625 if ( !replyallc ) {
2626 mCustomReplyAllActionMenu->popupMenu()->insertItem( i18n( "(no custom templates)" ), 0 );
2627 mCustomReplyAllActionMenu->popupMenu()->setItemEnabled( 0, false );
2628 mCustomReplyAllActionMenu->setEnabled(false);
2629 }
2630 if ( !forwardc ) {
2631 mCustomForwardActionMenu->popupMenu()->insertItem( i18n( "(no custom templates)" ), 0 );
2632 mCustomForwardActionMenu->popupMenu()->setItemEnabled( 0, false );
2633 mCustomForwardActionMenu->setEnabled(false);
2634 }
2635
2636}
2637
2638
2639//-----------------------------------------------------------------------------
2640void KMMainWidget::setupActions()
2641{
2642 mMsgActions = new KMail::MessageActions( actionCollection(), this );
2643 mMsgActions->setMessageView( mMsgView );
2644
2645 //----- File Menu
2646 mSaveAsAction = new TDEAction( i18n("Save &As..."), "document-save",
2647 TDEStdAccel::shortcut(TDEStdAccel::Save),
2648 this, TQ_SLOT(slotSaveMsg()), actionCollection(), "file_save_as" );
2649
2650 mOpenAction = KStdAction::open( this, TQ_SLOT( slotOpenMsg() ),
2651 actionCollection() );
2652
2653 (void) new TDEAction( i18n("&Compact All Folders"), 0,
2654 this, TQ_SLOT(slotCompactAll()),
2655 actionCollection(), "compact_all_folders" );
2656
2657 (void) new TDEAction( i18n("&Expire All Folders"), 0,
2658 this, TQ_SLOT(slotExpireAll()),
2659 actionCollection(), "expire_all_folders" );
2660
2661 (void) new TDEAction( i18n("&Refresh Local IMAP Cache"), "refresh",
2662 this, TQ_SLOT(slotInvalidateIMAPFolders()),
2663 actionCollection(), "file_invalidate_imap_cache" );
2664
2665 (void) new TDEAction( i18n("Empty All &Trash Folders"), 0,
2666 KMKernel::self(), TQ_SLOT(slotEmptyTrash()),
2667 actionCollection(), "empty_trash" );
2668
2669 (void) new TDEAction( i18n("Check &Mail"), "mail_get", CTRL+Key_L,
2670 this, TQ_SLOT(slotCheckMail()),
2671 actionCollection(), "check_mail" );
2672
2673 mFavoritesCheckMailAction = new TDEAction( i18n("Check Mail in Favorite Folders"),
2674 "mail_get", CTRL+SHIFT+Key_L, 0, 0,
2675 actionCollection(), "favorite_check_mail" );
2676 if ( mFavoriteFolderView )
2677 connect( mFavoritesCheckMailAction, TQ_SIGNAL(activated()), mFavoriteFolderView, TQ_SLOT(checkMail()) );
2678
2679 TDEActionMenu *actActionMenu = new
2680 TDEActionMenu( i18n("Check Mail &In"), "mail_get", actionCollection(),
2681 "check_mail_in" );
2682 actActionMenu->setDelayed(true); //needed for checking "all accounts"
2683
2684 connect(actActionMenu,TQ_SIGNAL(activated()),this,TQ_SLOT(slotCheckMail()));
2685
2686 mActMenu = actActionMenu->popupMenu();
2687 connect(mActMenu,TQ_SIGNAL(activated(int)),this,TQ_SLOT(slotCheckOneAccount(int)));
2688 connect(mActMenu,TQ_SIGNAL(aboutToShow()),this,TQ_SLOT(getAccountMenu()));
2689
2690 (void) new TDEAction( i18n("&Send Queued Messages"), "mail-send", 0, this,
2691 TQ_SLOT(slotSendQueued()), actionCollection(), "send_queued");
2692
2693 (void) new TDEAction( i18n("Online Status (unknown)"), "online_status", 0, this,
2694 TQ_SLOT(slotOnlineStatus()), actionCollection(), "online_status");
2695
2696 TDEActionMenu *sendActionMenu = new
2697 TDEActionMenu( i18n("Send Queued Messages Via"), "mail_send_via", actionCollection(),
2698 "send_queued_via" );
2699 sendActionMenu->setDelayed(true);
2700
2701 mSendMenu = sendActionMenu->popupMenu();
2702 connect(mSendMenu,TQ_SIGNAL(activated(int)), this, TQ_SLOT(slotSendQueuedVia(int)));
2703 connect(mSendMenu,TQ_SIGNAL(aboutToShow()),this,TQ_SLOT(getTransportMenu()));
2704
2705 TDEAction *act;
2706 //----- Tools menu
2707 if (parent()->inherits("KMMainWin")) {
2708 act = new TDEAction( i18n("&Address Book..."), "contents", 0, this,
2709 TQ_SLOT(slotAddrBook()), actionCollection(), "addressbook" );
2710 if (TDEStandardDirs::findExe("kaddressbook").isEmpty()) act->setEnabled(false);
2711 }
2712
2713 act = new TDEAction( i18n("Certificate Manager..."), "pgp-keys", 0, this,
2714 TQ_SLOT(slotStartCertManager()), actionCollection(), "tools_start_certman");
2715 // disable action if no certman binary is around
2716 if (TDEStandardDirs::findExe("kleopatra").isEmpty()) act->setEnabled(false);
2717
2718 act = new TDEAction( i18n("GnuPG Log Viewer..."), "pgp-keys", 0, this,
2719 TQ_SLOT(slotStartWatchGnuPG()), actionCollection(), "tools_start_kwatchgnupg");
2720 // disable action if no kwatchgnupg binary is around
2721 if (TDEStandardDirs::findExe("kwatchgnupg").isEmpty()) act->setEnabled(false);
2722
2723 act = new TDEAction( i18n("&Import Messages..."), "document-open", 0, this,
2724 TQ_SLOT(slotImport()), actionCollection(), "import" );
2725 if (TDEStandardDirs::findExe("kmailcvt").isEmpty()) act->setEnabled(false);
2726
2727#if !defined(NDEBUG)
2728 (void) new TDEAction( i18n("&Debug Sieve..."),
2729 "idea", 0, this, TQ_SLOT(slotDebugSieve()),
2730 actionCollection(), "tools_debug_sieve" );
2731#endif
2732
2733 if ( GlobalSettings::allowOutOfOfficeSettings() ) {
2734 (void) new TDEAction( i18n("Edit \"Out of Office\" Replies..."),
2735 "configure", 0, this, TQ_SLOT(slotEditVacation()),
2736 actionCollection(), "tools_edit_vacation" );
2737
2738 }
2739
2740 (void) new TDEAction( i18n("Filter &Log Viewer..."), 0, this,
2741 TQ_SLOT(slotFilterLogViewer()), actionCollection(), "filter_log_viewer" );
2742
2743 (void) new TDEAction( i18n("&Anti-Spam Wizard..."), 0, this,
2744 TQ_SLOT(slotAntiSpamWizard()), actionCollection(), "antiSpamWizard" );
2745 (void) new TDEAction( i18n("&Anti-Virus Wizard..."), 0, this,
2746 TQ_SLOT(slotAntiVirusWizard()), actionCollection(), "antiVirusWizard" );
2747
2748 //----- Edit Menu
2749 mTrashAction = new TDEAction( KGuiItem( i18n("&Move to Trash"), "edittrash",
2750 i18n("Move message to trashcan") ),
2751 Key_Delete, this, TQ_SLOT(slotTrashMsg()),
2752 actionCollection(), "move_to_trash" );
2753
2754 /* The delete action is nowhere in the gui, by default, so we need to make
2755 * sure it is plugged into the TDEAccel now, since that won't happen on
2756 * XMLGui construction or manual ->plug(). This is only a problem when run
2757 * as a part, though. */
2758 mDeleteAction = new TDEAction( i18n("&Delete"), "edit-delete", SHIFT+Key_Delete, this,
2759 TQ_SLOT(slotDeleteMsg()), actionCollection(), "delete" );
2760 mDeleteAction->plugAccel( actionCollection()->tdeaccel() );
2761
2762 mTrashThreadAction = new TDEAction( KGuiItem( i18n("M&ove Thread to Trash"), "edittrash",
2763 i18n("Move thread to trashcan") ),
2764 CTRL+Key_Delete, this, TQ_SLOT(slotTrashThread()),
2765 actionCollection(), "move_thread_to_trash" );
2766
2767 mDeleteThreadAction = new TDEAction( i18n("Delete T&hread"), "edit-delete", CTRL+SHIFT+Key_Delete, this,
2768 TQ_SLOT(slotDeleteThread()), actionCollection(), "delete_thread" );
2769
2770
2771 (void) new TDEAction( i18n("&Find Messages..."), "mail_find", Key_S, this,
2772 TQ_SLOT(slotRequestFullSearchFromQuickSearch()), actionCollection(), "search_messages" );
2773
2774 mFindInMessageAction = new TDEAction( i18n("&Find in Message..."), "edit-find", TDEStdAccel::shortcut(TDEStdAccel::Find), this,
2775 TQ_SLOT(slotFind()), actionCollection(), "find_in_messages" );
2776
2777 (void) new TDEAction( i18n("Select &All Messages"), TDEStdAccel::selectAll(), this,
2778 TQ_SLOT(slotMarkAll()), actionCollection(), "mark_all_messages" );
2779
2780 //----- Folder Menu
2781 mNewFolderAction = new TDEAction( i18n("&New Folder..."), "folder-new", 0, mFolderTree,
2782 TQ_SLOT(addChildFolder()), actionCollection(), "new_folder" );
2783
2784 mModifyFolderAction = new TDEAction( i18n("&Properties"), "configure", 0, this,
2785 TQ_SLOT(slotModifyFolder()), actionCollection(), "modify" );
2786
2787 mFolderMailingListPropertiesAction = new TDEAction( i18n("&Mailing List Management..."),
2788 /*"folder_mailinglist_properties",*/ 0, this, TQ_SLOT( slotFolderMailingListProperties() ),
2789 actionCollection(), "folder_mailinglist_properties" );
2790
2791 mFolderShortCutCommandAction = new TDEAction( i18n("&Assign Shortcut..."), "configure_shortcuts",
2792 0, this, TQ_SLOT( slotFolderShortcutCommand() ), actionCollection(),
2793 "folder_shortcut_command" );
2794
2795
2796 mMarkAllAsReadAction = new TDEAction( i18n("Mark All Messages as &Read"), "goto", 0, this,
2797 TQ_SLOT(slotMarkAllAsRead()), actionCollection(), "mark_all_as_read" );
2798
2799 mExpireFolderAction = new TDEAction(i18n("&Expiration Settings"), 0, this, TQ_SLOT(slotExpireFolder()),
2800 actionCollection(), "expire");
2801
2802 mCompactFolderAction = new TDEAction( i18n("&Compact Folder"), 0, this,
2803 TQ_SLOT(slotCompactFolder()), actionCollection(), "compact" );
2804
2805 mRefreshFolderAction = new TDEAction( i18n("Check Mail &in This Folder"), "reload",
2806 TDEStdAccel::shortcut( TDEStdAccel::Reload ), this,
2807 TQ_SLOT(slotRefreshFolder()),
2808 actionCollection(), "refresh_folder" );
2809 mTroubleshootFolderAction = 0; // set in initializeIMAPActions
2810
2811 mEmptyFolderAction = new TDEAction( "foo" /*set in updateFolderMenu*/, "edittrash", 0, this,
2812 TQ_SLOT(slotEmptyFolder()), actionCollection(), "empty" );
2813
2814 mRemoveFolderAction = new TDEAction( "foo" /*set in updateFolderMenu*/, "edit-delete", 0, this,
2815 TQ_SLOT(slotRemoveFolder()), actionCollection(), "delete_folder" );
2816
2817 mArchiveFolderAction = new TDEAction( i18n( "&Archive Folder..." ), "document-save", 0, this,
2818 TQ_SLOT( slotArchiveFolder() ), actionCollection(),
2819 "archive_folder" );
2820
2821 mPreferHtmlAction = new TDEToggleAction( i18n("Prefer &HTML to Plain Text"), 0, this,
2822 TQ_SLOT(slotOverrideHtml()), actionCollection(), "prefer_html" );
2823
2824 mPreferHtmlLoadExtAction = new TDEToggleAction( i18n("Load E&xternal References"), 0, this,
2825 TQ_SLOT(slotOverrideHtmlLoadExt()), actionCollection(), "prefer_html_external_refs" );
2826
2827 mThreadMessagesAction = new TDEToggleAction( i18n("&Thread Messages"), 0, this,
2828 TQ_SLOT(slotOverrideThread()), actionCollection(), "thread_messages" );
2829
2830 mThreadBySubjectAction = new TDEToggleAction( i18n("Thread Messages also by &Subject"), 0, this,
2831 TQ_SLOT(slotToggleSubjectThreading()), actionCollection(), "thread_messages_by_subject" );
2832
2833 new TDEAction( i18n("Copy Folder"), "edit-copy", SHIFT+CTRL+Key_C, folderTree(),
2834 TQ_SLOT(copyFolder()), actionCollection(), "copy_folder" );
2835 new TDEAction( i18n("Cut Folder"), "edit-cut", SHIFT+CTRL+Key_X, folderTree(),
2836 TQ_SLOT(cutFolder()), actionCollection(), "cut_folder" );
2837 new TDEAction( i18n("Paste Folder"), "edit-paste", SHIFT+CTRL+Key_V, folderTree(),
2838 TQ_SLOT(pasteFolder()), actionCollection(), "paste_folder" );
2839
2840 new TDEAction( i18n("Copy Messages"), "edit-copy", ALT+CTRL+Key_C, headers(),
2841 TQ_SLOT(copyMessages()), actionCollection(), "copy_messages" );
2842 new TDEAction( i18n("Cut Messages"), "edit-cut", ALT+CTRL+Key_X, headers(),
2843 TQ_SLOT(cutMessages()), actionCollection(), "cut_messages" );
2844 new TDEAction( i18n("Paste Messages"), "edit-paste", ALT+CTRL+Key_V, headers(),
2845 TQ_SLOT(pasteMessages()), actionCollection(), "paste_messages" );
2846
2847 //----- Message Menu
2848 (void) new TDEAction( i18n("&New Message..."), "mail-message-new", TDEStdAccel::shortcut(TDEStdAccel::New), this,
2849 TQ_SLOT(slotCompose()), actionCollection(), "new_message" );
2850 mTemplateMenu =
2851 new TDEActionMenu( i18n("New Message From &Template"), "document-new",
2852 actionCollection(), "new_from_template" );
2853 mTemplateMenu->setDelayed( true );
2854 connect( mTemplateMenu->popupMenu(), TQ_SIGNAL( aboutToShow() ), this,
2855 TQ_SLOT( slotShowNewFromTemplate() ) );
2856 connect( mTemplateMenu->popupMenu(), TQ_SIGNAL( activated(int) ), this,
2857 TQ_SLOT( slotNewFromTemplate(int) ) );
2858
2859 TDEAction* newToML = new TDEAction( i18n("New Message t&o Mailing-List..."), "mail_post_to",
2860 CTRL+SHIFT+Key_N, this,
2861 TQ_SLOT(slotPostToML()), actionCollection(), "post_message" );
2862 newToML->plugAccel( actionCollection()->tdeaccel() );
2863
2864 mForwardActionMenu = new TDEActionMenu( i18n("Message->","&Forward"),
2865 "mail-forward", actionCollection(),
2866 "message_forward" );
2867
2868 mForwardInlineAction = new TDEAction( i18n("&Inline..."),
2869 "mail-forward", 0, this,
2870 TQ_SLOT(slotForwardInlineMsg()),
2871 actionCollection(),
2872 "message_forward_inline" );
2873
2874 mForwardAttachedAction = new TDEAction( i18n("Message->Forward->","As &Attachment..."),
2875 "mail-forward", 0, this,
2876 TQ_SLOT(slotForwardAttachedMsg()),
2877 actionCollection(),
2878 "message_forward_as_attachment" );
2879
2880 mForwardDigestAction = new TDEAction( i18n("Message->Forward->","As Di&gest..."),
2881 "mail-forward", 0, this,
2882 TQ_SLOT(slotForwardDigestMsg()),
2883 actionCollection(),
2884 "message_forward_as_digest" );
2885
2886 mRedirectAction = new TDEAction( i18n("Message->Forward->","&Redirect..."),
2887 "mail-forward", Key_E, this,
2888 TQ_SLOT(slotRedirectMsg()),
2889 actionCollection(),
2890 "message_forward_redirect" );
2891
2892
2893 setupForwardActions();
2894
2895 mForwardActionMenu->insert( mForwardDigestAction );
2896 mForwardActionMenu->insert( mRedirectAction );
2897
2898 mSendAgainAction = new TDEAction( i18n("Send A&gain..."), 0, this,
2899 TQ_SLOT(slotResendMsg()), actionCollection(), "send_again" );
2900
2901
2902 //----- Create filter actions
2903 mFilterMenu = new TDEActionMenu( i18n("&Create Filter"), "filter", actionCollection(), "create_filter" );
2904 connect( mFilterMenu, TQ_SIGNAL(activated()), this,
2905 TQ_SLOT(slotFilter()) );
2906 mSubjectFilterAction = new TDEAction( i18n("Filter on &Subject..."), 0, this,
2907 TQ_SLOT(slotSubjectFilter()),
2908 actionCollection(), "subject_filter");
2909 mFilterMenu->insert( mSubjectFilterAction );
2910
2911 mFromFilterAction = new TDEAction( i18n("Filter on &From..."), 0, this,
2912 TQ_SLOT(slotFromFilter()),
2913 actionCollection(), "from_filter");
2914 mFilterMenu->insert( mFromFilterAction );
2915
2916 mToFilterAction = new TDEAction( i18n("Filter on &To..."), 0, this,
2917 TQ_SLOT(slotToFilter()),
2918 actionCollection(), "to_filter");
2919 mFilterMenu->insert( mToFilterAction );
2920
2921 mListFilterAction = new TDEAction( i18n("Filter on Mailing-&List..."), 0, this,
2922 TQ_SLOT(slotMailingListFilter()), actionCollection(),
2923 "mlist_filter");
2924 mFilterMenu->insert( mListFilterAction );
2925
2926 mPrintAction = KStdAction::print (this, TQ_SLOT(slotPrintMsg()), actionCollection());
2927
2928 mUseAction = new TDEAction( i18n("New Message From &Template"), "document-new",
2929 Key_N, this, TQ_SLOT( slotUseTemplate() ),
2930 actionCollection(), "use_template" );
2931 mUseAction->plugAccel( actionCollection()->tdeaccel() );
2932
2933 //----- "Mark Thread" submenu
2934 mThreadStatusMenu = new TDEActionMenu ( i18n( "Mark &Thread" ),
2935 actionCollection(), "thread_status" );
2936
2937 mMarkThreadAsReadAction = new TDEAction(KGuiItem(i18n("Mark Thread as &Read"), "kmmsgread",
2938 i18n("Mark all messages in the selected thread as read")),
2939 0, this, TQ_SLOT(slotSetThreadStatusRead()),
2940 actionCollection(), "thread_read");
2941 mThreadStatusMenu->insert( mMarkThreadAsReadAction );
2942
2943 mMarkThreadAsNewAction = new TDEAction(KGuiItem(i18n("Mark Thread as &New"), "kmmsgnew",
2944 i18n("Mark all messages in the selected thread as new")),
2945 0, this, TQ_SLOT(slotSetThreadStatusNew()),
2946 actionCollection(), "thread_new");
2947 mThreadStatusMenu->insert( mMarkThreadAsNewAction );
2948
2949 mMarkThreadAsUnreadAction = new TDEAction(KGuiItem(i18n("Mark Thread as &Unread"), "kmmsgunseen",
2950 i18n("Mark all messages in the selected thread as unread")),
2951 0, this, TQ_SLOT(slotSetThreadStatusUnread()),
2952 actionCollection(), "thread_unread");
2953 mThreadStatusMenu->insert( mMarkThreadAsUnreadAction );
2954
2955 mThreadStatusMenu->insert( new TDEActionSeparator( this ) );
2956
2957 //----- "Mark Thread" toggle actions
2958 mToggleThreadFlagAction = new TDEToggleAction(i18n("Mark Thread as &Important"), "mail_flag",
2959 0, this, TQ_SLOT(slotSetThreadStatusFlag()),
2960 actionCollection(), "thread_flag");
2961 mToggleThreadFlagAction->setCheckedState( i18n("Remove &Important Thread Mark") );
2962 mThreadStatusMenu->insert( mToggleThreadFlagAction );
2963
2964 mToggleThreadTodoAction = new TDEToggleAction(i18n("Mark Thread as &Action Item"), "mail_todo",
2965 0, this, TQ_SLOT(slotSetThreadStatusTodo()),
2966 actionCollection(), "thread_todo");
2967 mToggleThreadTodoAction->setCheckedState( i18n("Remove &Action Item Thread Mark") );
2968 mThreadStatusMenu->insert( mToggleThreadTodoAction );
2969
2970 //------- "Watch and ignore thread" actions
2971 mWatchThreadAction = new TDEToggleAction(i18n("&Watch Thread"), "kmmsgwatched",
2972 0, this, TQ_SLOT(slotSetThreadStatusWatched()),
2973 actionCollection(), "thread_watched");
2974
2975 mIgnoreThreadAction = new TDEToggleAction(i18n("&Ignore Thread"), "mail_ignore",
2976 0, this, TQ_SLOT(slotSetThreadStatusIgnored()),
2977 actionCollection(), "thread_ignored");
2978
2979 mThreadStatusMenu->insert( new TDEActionSeparator( this ) );
2980 mThreadStatusMenu->insert( mWatchThreadAction );
2981 mThreadStatusMenu->insert( mIgnoreThreadAction );
2982
2983 mSaveAttachmentsAction = new TDEAction( i18n("Save A&ttachments..."), "attach",
2984 0, this, TQ_SLOT(slotSaveAttachments()),
2985 actionCollection(), "file_save_attachments" );
2986
2987 mMoveActionMenu = new TDEActionMenu( i18n("&Move To" ),
2988 actionCollection(), "move_to" );
2989
2990 mCopyActionMenu = new TDEActionMenu( i18n("&Copy To" ),
2991 actionCollection(), "copy_to" );
2992
2993 mApplyAllFiltersAction = new TDEAction( i18n("Appl&y All Filters"), "filter",
2994 CTRL+Key_J, this,
2995 TQ_SLOT(slotApplyFilters()),
2996 actionCollection(), "apply_filters" );
2997
2998 mApplyFilterActionsMenu = new TDEActionMenu( i18n("A&pply Filter" ),
2999 actionCollection(),
3000 "apply_filter_actions" );
3001
3002 //----- View Menu
3003 // Unread Submenu
3004 TDEActionMenu * unreadMenu =
3005 new TDEActionMenu( i18n("View->", "&Unread Count"),
3006 actionCollection(), "view_unread" );
3007 unreadMenu->setToolTip( i18n("Choose how to display the count of unread messages") );
3008
3009 mUnreadColumnToggle = new TDERadioAction( i18n("View->Unread Count", "View in &Separate Column"), 0, this,
3010 TQ_SLOT(slotToggleUnread()),
3011 actionCollection(), "view_unread_column" );
3012 mUnreadColumnToggle->setExclusiveGroup( "view_unread_group" );
3013 unreadMenu->insert( mUnreadColumnToggle );
3014
3015 mUnreadTextToggle = new TDERadioAction( i18n("View->Unread Count", "View After &Folder Name"), 0, this,
3016 TQ_SLOT(slotToggleUnread()),
3017 actionCollection(), "view_unread_text" );
3018 mUnreadTextToggle->setExclusiveGroup( "view_unread_group" );
3019 unreadMenu->insert( mUnreadTextToggle );
3020
3021 // toggle for total column
3022 mTotalColumnToggle = new TDEToggleAction( i18n("View->", "&Total Column"), 0, this,
3023 TQ_SLOT(slotToggleTotalColumn()),
3024 actionCollection(), "view_columns_total" );
3025 mTotalColumnToggle->setToolTip( i18n("Toggle display of column showing the "
3026 "total number of messages in folders.") );
3027 mSizeColumnToggle = new TDEToggleAction( i18n("View->", "&Size Column"), 0, this,
3028 TQ_SLOT(slotToggleSizeColumn()),
3029 actionCollection(), "view_columns_size" );
3030 mSizeColumnToggle->setToolTip( i18n("Toggle display of column showing the "
3031 "total size of messages in folders.") );
3032
3033 (void)new TDEAction( KGuiItem( i18n("View->","&Expand Thread"), TQString(),
3034 i18n("Expand the current thread") ),
3035 Key_Period, this,
3036 TQ_SLOT(slotExpandThread()),
3037 actionCollection(), "expand_thread" );
3038
3039 (void)new TDEAction( KGuiItem( i18n("View->","&Collapse Thread"), TQString(),
3040 i18n("Collapse the current thread") ),
3041 Key_Comma, this,
3042 TQ_SLOT(slotCollapseThread()),
3043 actionCollection(), "collapse_thread" );
3044
3045 (void)new TDEAction( KGuiItem( i18n("View->","Ex&pand All Threads"), TQString(),
3046 i18n("Expand all threads in the current folder") ),
3047 CTRL+Key_Period, this,
3048 TQ_SLOT(slotExpandAllThreads()),
3049 actionCollection(), "expand_all_threads" );
3050
3051 (void)new TDEAction( KGuiItem( i18n("View->","C&ollapse All Threads"), TQString(),
3052 i18n("Collapse all threads in the current folder") ),
3053 CTRL+Key_Comma, this,
3054 TQ_SLOT(slotCollapseAllThreads()),
3055 actionCollection(), "collapse_all_threads" );
3056
3057 mViewSourceAction = new TDEAction( i18n("&View Source"), Key_V, this,
3058 TQ_SLOT(slotShowMsgSrc()), actionCollection(),
3059 "view_source" );
3060
3061 TDEAction* dukeOfMonmoth = new TDEAction( i18n("&Display Message"), Key_Return, this,
3062 TQ_SLOT( slotDisplayCurrentMessage() ), actionCollection(),
3063 "display_message" );
3064 dukeOfMonmoth->plugAccel( actionCollection()->tdeaccel() );
3065
3066 //----- Go Menu
3067 new TDEAction( KGuiItem( i18n("&Next Message"), TQString(),
3068 i18n("Go to the next message") ),
3069 "N;Right", this, TQ_SLOT(slotNextMessage()),
3070 actionCollection(), "go_next_message" );
3071
3072 new TDEAction( KGuiItem( i18n("Next &Unread Message"),
3073 TQApplication::reverseLayout() ? "go-previous" : "go-next",
3074 i18n("Go to the next unread message") ),
3075 Key_Plus, this, TQ_SLOT(slotNextUnreadMessage()),
3076 actionCollection(), "go_next_unread_message" );
3077
3078 /* ### needs better support from folders:
3079 new TDEAction( KGuiItem( i18n("Next &Important Message"), TQString(),
3080 i18n("Go to the next important message") ),
3081 0, this, TQ_SLOT(slotNextImportantMessage()),
3082 actionCollection(), "go_next_important_message" );
3083 */
3084
3085 new TDEAction( KGuiItem( i18n("&Previous Message"), TQString(),
3086 i18n("Go to the previous message") ),
3087 "P;Left", this, TQ_SLOT(slotPrevMessage()),
3088 actionCollection(), "go_prev_message" );
3089
3090 new TDEAction( KGuiItem( i18n("Previous Unread &Message"),
3091 TQApplication::reverseLayout() ? "go-next" : "go-previous",
3092 i18n("Go to the previous unread message") ),
3093 Key_Minus, this, TQ_SLOT(slotPrevUnreadMessage()),
3094 actionCollection(), "go_prev_unread_message" );
3095
3096 /* needs better support from folders:
3097 new TDEAction( KGuiItem( i18n("Previous I&mportant Message"), TQString(),
3098 i18n("Go to the previous important message") ),
3099 0, this, TQ_SLOT(slotPrevImportantMessage()),
3100 actionCollection(), "go_prev_important_message" );
3101 */
3102
3103 TDEAction *action =
3104 new TDEAction( KGuiItem( i18n("Next Unread &Folder"), TQString(),
3105 i18n("Go to the next folder with unread messages") ),
3106 ALT+Key_Plus, this, TQ_SLOT(slotNextUnreadFolder()),
3107 actionCollection(), "go_next_unread_folder" );
3108 TDEShortcut shortcut = action->shortcut();
3109 shortcut.append( KKey( CTRL+Key_Plus ) );
3110 action->setShortcut( shortcut );
3111
3112 action =
3113 new TDEAction( KGuiItem( i18n("Previous Unread F&older"), TQString(),
3114 i18n("Go to the previous folder with unread messages") ),
3115 ALT+Key_Minus, this, TQ_SLOT(slotPrevUnreadFolder()),
3116 actionCollection(), "go_prev_unread_folder" );
3117 shortcut = action->shortcut();
3118 shortcut.append( KKey( CTRL+Key_Minus ) );
3119 action->setShortcut( shortcut );
3120
3121 new TDEAction( KGuiItem( i18n("Go->","Next Unread &Text"), TQString(),
3122 i18n("Go to the next unread text"),
3123 i18n("Scroll down current message. "
3124 "If at end of current message, "
3125 "go to next unread message.") ),
3126 Key_Space, this, TQ_SLOT(slotReadOn()),
3127 actionCollection(), "go_next_unread_text" );
3128
3129 //----- Settings Menu
3130 mToggleShowQuickSearchAction = new TDEToggleAction(i18n("Show Quick Search"), TQString(),
3131 0, this, TQ_SLOT(slotToggleShowQuickSearch()),
3132 actionCollection(), "show_quick_search");
3133 mToggleShowQuickSearchAction->setChecked( GlobalSettings::self()->quickSearchActive() );
3134 mToggleShowQuickSearchAction->setWhatsThis(
3135 i18n( GlobalSettings::self()->quickSearchActiveItem()->whatsThis().utf8() ) );
3136
3137 (void) new TDEAction( i18n("Configure &Filters..."), 0, this,
3138 TQ_SLOT(slotFilter()), actionCollection(), "filter" );
3139 (void) new TDEAction( i18n("Configure &POP Filters..."), 0, this,
3140 TQ_SLOT(slotPopFilter()), actionCollection(), "popFilter" );
3141 (void) new TDEAction( i18n("Manage &Sieve Scripts..."), 0, this,
3142 TQ_SLOT(slotManageSieveScripts()), actionCollection(), "sieveFilters" );
3143
3144 (void) new TDEAction( KGuiItem( i18n("KMail &Introduction"), 0,
3145 i18n("Display KMail's Welcome Page") ),
3146 0, this, TQ_SLOT(slotIntro()),
3147 actionCollection(), "help_kmail_welcomepage" );
3148
3149 // ----- Standard Actions
3150// KStdAction::configureNotifications(this, TQ_SLOT(slotEditNotifications()), actionCollection());
3151 (void) new TDEAction( i18n("Configure &Notifications..."),
3152 "knotify", 0, this,
3153 TQ_SLOT(slotEditNotifications()), actionCollection(),
3154 "kmail_configure_notifications" );
3155// KStdAction::preferences(this, TQ_SLOT(slotSettings()), actionCollection());
3156 (void) new TDEAction( i18n("&Configure KMail..."),
3157 "configure", 0, kmkernel,
3158 TQ_SLOT(slotShowConfigurationDialog()), actionCollection(),
3159 "kmail_configure_kmail" );
3160
3161 KStdAction::undo(this, TQ_SLOT(slotUndo()), actionCollection(), "kmail_undo");
3162
3163 KStdAction::tipOfDay( this, TQ_SLOT( slotShowTip() ), actionCollection() );
3164
3165 menutimer = new TQTimer( this, "menutimer" );
3166 connect( menutimer, TQ_SIGNAL( timeout() ), TQ_SLOT( updateMessageActions() ) );
3167 connect( kmkernel->undoStack(),
3168 TQ_SIGNAL( undoStackChanged() ), this, TQ_SLOT( slotUpdateUndo() ));
3169
3170 initializeIMAPActions( false ); // don't set state, config not read yet
3171 updateMessageActions();
3172 updateCustomTemplateMenus();
3173 updateFolderMenu();
3174}
3175
3176void KMMainWidget::setupForwardingActionsList()
3177{
3178 TQPtrList<TDEAction> mForwardActionList;
3179 if ( GlobalSettings::self()->forwardingInlineByDefault() ) {
3180 mGUIClient->unplugActionList( "forward_action_list" );
3181 mForwardActionList.append( mForwardInlineAction );
3182 mForwardActionList.append( mForwardAttachedAction );
3183 mForwardActionList.append( mForwardDigestAction );
3184 mForwardActionList.append( mRedirectAction );
3185 mGUIClient->plugActionList( "forward_action_list", mForwardActionList );
3186 } else {
3187 mGUIClient->unplugActionList( "forward_action_list" );
3188 mForwardActionList.append( mForwardAttachedAction );
3189 mForwardActionList.append( mForwardInlineAction );
3190 mForwardActionList.append( mForwardDigestAction );
3191 mForwardActionList.append( mRedirectAction );
3192 mGUIClient->plugActionList( "forward_action_list", mForwardActionList );
3193 }
3194}
3195
3196//-----------------------------------------------------------------------------
3197void KMMainWidget::slotEditNotifications()
3198{
3199 if(kmkernel->xmlGuiInstance())
3200 KNotifyDialog::configure(this, 0, kmkernel->xmlGuiInstance()->aboutData());
3201 else
3202 KNotifyDialog::configure(this);
3203}
3204
3205void KMMainWidget::slotEditKeys()
3206{
3207 KKeyDialog::configure( actionCollection(),
3208 true /*allow one-letter shortcuts*/
3209 );
3210}
3211
3212//-----------------------------------------------------------------------------
3213void KMMainWidget::slotReadOn()
3214{
3215 if ( !mMsgView )
3216 return;
3217
3218 if ( !mMsgView->atBottom() ) {
3219 mMsgView->slotJumpDown();
3220 return;
3221 }
3222 slotNextUnreadMessage();
3223}
3224
3225void KMMainWidget::slotNextUnreadFolder() {
3226 if ( !mFolderTree ) return;
3227 mFolderTree->nextUnreadFolder();
3228}
3229
3230void KMMainWidget::slotPrevUnreadFolder() {
3231 if ( !mFolderTree ) return;
3232 mFolderTree->prevUnreadFolder();
3233}
3234
3235void KMMainWidget::slotExpandThread()
3236{
3237 mHeaders->slotExpandOrCollapseThread( true ); // expand
3238}
3239
3240void KMMainWidget::slotCollapseThread()
3241{
3242 mHeaders->slotExpandOrCollapseThread( false ); // collapse
3243}
3244
3245void KMMainWidget::slotExpandAllThreads()
3246{
3247 mHeaders->slotExpandOrCollapseAllThreads( true ); // expand
3248}
3249
3250void KMMainWidget::slotCollapseAllThreads()
3251{
3252 mHeaders->slotExpandOrCollapseAllThreads( false ); // collapse
3253}
3254
3255//-----------------------------------------------------------------------------
3256void KMMainWidget::slotShowMsgSrc()
3257{
3258 if ( mMsgView )
3259 mMsgView->setUpdateAttachment( false );
3260 KMMessage *msg = mHeaders->currentMsg();
3261 if ( !msg )
3262 return;
3263 KMCommand *command = new KMShowMsgSrcCommand( this, msg,
3264 mMsgView
3265 ? mMsgView->isFixedFont()
3266 : false );
3267 command->start();
3268}
3269
3270
3271//-----------------------------------------------------------------------------
3272void KMMainWidget::moveSelectedToFolder( int menuId )
3273{
3274 if (mMenuToFolder[menuId])
3275 mHeaders->moveMsgToFolder( mMenuToFolder[menuId] );
3276}
3277
3278
3279//-----------------------------------------------------------------------------
3280void KMMainWidget::copySelectedToFolder(int menuId )
3281{
3282 if (mMenuToFolder[menuId])
3283 mHeaders->copyMsgToFolder( mMenuToFolder[menuId] );
3284}
3285
3286
3287//-----------------------------------------------------------------------------
3288void KMMainWidget::updateMessageMenu()
3289{
3290 mMenuToFolder.clear();
3291 folderTree()->folderToPopupMenu( KMFolderTree::MoveMessage, this,
3292 &mMenuToFolder, mMoveActionMenu->popupMenu() );
3293 folderTree()->folderToPopupMenu( KMFolderTree::CopyMessage, this,
3294 &mMenuToFolder, mCopyActionMenu->popupMenu() );
3295 updateMessageActions();
3296}
3297
3298void KMMainWidget::startUpdateMessageActionsTimer()
3299{
3300 menutimer->stop();
3301 menutimer->start( 20, true );
3302}
3303
3304void KMMainWidget::updateMessageActions()
3305{
3306 int count = 0;
3307 TQPtrList<TQListViewItem> selectedItems;
3308
3309 if ( mFolder ) {
3310 for (TQListViewItem *item = mHeaders->firstChild(); item; item = item->itemBelow())
3311 if (item->isSelected() )
3312 selectedItems.append(item);
3313 if ( selectedItems.isEmpty() && mFolder->count() ) // there will always be one in mMsgView
3314 count = 1;
3315 else
3316 count = selectedItems.count();
3317 mMsgActions->setCurrentMessage( mHeaders->currentMsg() );
3318 mMsgActions->setSelectedSernums( mHeaders->selectedSernums() );
3319 mMsgActions->setSelectedVisibleSernums( mHeaders->selectedVisibleSernums() );
3320 } else {
3321 mMsgActions->setCurrentMessage( 0 );
3322 }
3323
3324 updateListFilterAction();
3325
3326 bool allSelectedInCommonThread = false;
3327 if ( mHeaders->isThreaded() && count > 1 ) {
3328 allSelectedInCommonThread = true;
3329 for ( TQPtrListIterator<TQListViewItem> it( selectedItems ) ;
3330 it.current() ; ++ it ) {
3331 TQListViewItem * item = *it;
3332 if ( item->parent()==0 && item->childCount()==0 ) {
3333 allSelectedInCommonThread = false;
3334 break;
3335 }
3336 }
3337 }
3338 else if ( mHeaders->isThreaded() && count == 1 ) {
3339 allSelectedInCommonThread = true;
3340 }
3341
3342 TQListViewItem *curItemParent = mHeaders->currentItem();
3343 bool parent_thread = 0;
3344 if ( curItemParent && curItemParent->firstChild() != 0 ) parent_thread = 1;
3345
3346 bool mass_actions = count >= 1;
3347 bool thread_actions = mass_actions && allSelectedInCommonThread &&
3348 mHeaders->isThreaded();
3349 bool flags_available = GlobalSettings::self()->allowLocalFlags() || !(mFolder ? mFolder->isReadOnly() : true);
3350 mThreadStatusMenu->setEnabled( thread_actions );
3351 // these need to be handled individually, the user might have them
3352 // in the toolbar
3353 mWatchThreadAction->setEnabled( thread_actions && flags_available );
3354 mIgnoreThreadAction->setEnabled( thread_actions && flags_available );
3355 mMarkThreadAsNewAction->setEnabled( thread_actions );
3356 mMarkThreadAsReadAction->setEnabled( thread_actions );
3357 mMarkThreadAsUnreadAction->setEnabled( thread_actions );
3358 mToggleThreadTodoAction->setEnabled( thread_actions && flags_available );
3359 mToggleThreadFlagAction->setEnabled( thread_actions && flags_available );
3360 mTrashThreadAction->setEnabled( thread_actions && mFolder->canDeleteMessages() );
3361 mDeleteThreadAction->setEnabled( thread_actions && mFolder->canDeleteMessages() );
3362
3363 if (mFolder && mHeaders && mHeaders->currentMsg()) {
3364 if (thread_actions) {
3365 mToggleThreadTodoAction->setChecked(mHeaders->currentMsg()->isTodo());
3366 mToggleThreadFlagAction->setChecked(mHeaders->currentMsg()->isImportant());
3367 mWatchThreadAction->setChecked( mHeaders->currentMsg()->isWatched());
3368 mIgnoreThreadAction->setChecked( mHeaders->currentMsg()->isIgnored());
3369 }
3370 }
3371
3372 mMoveActionMenu->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3373 mMoveMsgToFolderAction->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3374 mCopyActionMenu->setEnabled( mass_actions );
3375 mTrashAction->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3376 mDeleteAction->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3377 mFindInMessageAction->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ) );
3378 mForwardInlineAction->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ));
3379 mForwardAttachedAction->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ) );
3380 mForwardDigestAction->setEnabled( ( count > 1 || parent_thread ) && !kmkernel->folderIsTemplates( mFolder ) );
3381
3382 forwardMenu()->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ));
3383
3384 bool single_actions = count == 1;
3385 mUseAction->setEnabled( single_actions &&
3386 kmkernel->folderIsTemplates( mFolder ) );
3387 filterMenu()->setEnabled( single_actions );
3388 redirectAction()->setEnabled( single_actions && !kmkernel->folderIsTemplates( mFolder ) );
3389 printAction()->setEnabled( single_actions );
3390 viewSourceAction()->setEnabled( single_actions );
3391
3392 mSendAgainAction->setEnabled( single_actions
3393 && ( ( mHeaders->currentMsg() && mHeaders->currentMsg()->isSent() )
3394 || ( mFolder && mHeaders->currentMsg() &&
3395 kmkernel->folderIsSentMailFolder( mFolder ) ) ) );
3396 mSaveAsAction->setEnabled( mass_actions );
3397 bool mails = mFolder && mFolder->count();
3398 bool enable_goto_unread = mails
3399 || (GlobalSettings::self()->loopOnGotoUnread() == GlobalSettings::EnumLoopOnGotoUnread::LoopInAllFolders);
3400 actionCollection()->action( "go_next_message" )->setEnabled( mails );
3401 actionCollection()->action( "go_next_unread_message" )->setEnabled( enable_goto_unread );
3402 actionCollection()->action( "go_prev_message" )->setEnabled( mails );
3403 actionCollection()->action( "go_prev_unread_message" )->setEnabled( enable_goto_unread );
3404 actionCollection()->action( "send_queued" )->setEnabled( kmkernel->outboxFolder()->count() > 0 );
3405 actionCollection()->action( "send_queued_via" )->setEnabled( kmkernel->outboxFolder()->count() > 0 );
3406 slotUpdateOnlineStatus( static_cast<GlobalSettingsBase::EnumNetworkState::type>( GlobalSettings::self()->networkState() ) );
3407 if (action( "edit_undo" ))
3408 action( "edit_undo" )->setEnabled( mHeaders->canUndo() );
3409
3410 if ( count == 1 ) {
3411 KMMessage *msg;
3412 int aIdx;
3413 if((aIdx = mHeaders->currentItemIndex()) <= -1)
3414 return;
3415 if(!(msg = mFolder->getMsg(aIdx)))
3416 return;
3417
3418 if ((KMFolder*)mFolder == kmkernel->outboxFolder())
3419 editAction()->setEnabled( !msg->transferInProgress() );
3420 }
3421
3422 mApplyAllFiltersAction->setEnabled(count);
3423 mApplyFilterActionsMenu->setEnabled(count);
3424}
3425
3426// This needs to be updated more often, so it is in its method.
3427void KMMainWidget::updateMarkAsReadAction()
3428{
3429 mMarkAllAsReadAction->setEnabled( mFolder && (mFolder->countUnread() > 0) );
3430}
3431
3432//-----------------------------------------------------------------------------
3433void KMMainWidget::updateFolderMenu()
3434{
3435 bool folderWithContent = mFolder && !mFolder->noContent();
3436 bool multiFolder = folderTree()->selectedFolders().count() > 1;
3437 mModifyFolderAction->setEnabled( folderWithContent && !multiFolder );
3438 mFolderMailingListPropertiesAction->setEnabled( folderWithContent && !multiFolder );
3439 mCompactFolderAction->setEnabled( folderWithContent && !multiFolder );
3440
3441 // This is the refresh-folder action in the menu. See kmfoldertree for the one in the RMB...
3442 bool imap = mFolder && mFolder->folderType() == KMFolderTypeImap;
3443 bool cachedImap = mFolder && mFolder->folderType() == KMFolderTypeCachedImap;
3444 // For dimap, check that the imap path is known before allowing "check mail in this folder".
3445 bool knownImapPath = cachedImap && !static_cast<KMFolderCachedImap*>( mFolder->storage() )->imapPath().isEmpty();
3446 mRefreshFolderAction->setEnabled( folderWithContent && ( imap
3447 || ( cachedImap && knownImapPath ) ) && !multiFolder );
3448 if ( mTroubleshootFolderAction )
3449 mTroubleshootFolderAction->setEnabled( folderWithContent && ( cachedImap && knownImapPath ) && !multiFolder );
3450
3451 mEmptyFolderAction->setEnabled( folderWithContent &&
3452 ( mFolder->count() > 0 ) && mFolder->canDeleteMessages() &&
3453 !multiFolder );
3454 mEmptyFolderAction->setText( ( mFolder && kmkernel->folderIsTrash( mFolder ) ) ?
3455 i18n( "E&mpty Trash" ) :
3456 i18n( "&Move All Messages to Trash" ) );
3457
3458 mRemoveFolderAction->setEnabled( mFolder &&
3459 !mFolder->isSystemFolder() &&
3460 mFolder->canDeleteMessages() &&
3461 !multiFolder && !mFolder->noContent() &&
3462 !mFolder->mailCheckInProgress() );
3463 mRemoveFolderAction->setText( mFolder &&
3464 mFolder->folderType() == KMFolderTypeSearch ?
3465 i18n( "&Delete Search" ) :
3466 i18n( "&Delete Folder" ) );
3467
3468 if ( mArchiveFolderAction )
3469 mArchiveFolderAction->setEnabled( mFolder && !multiFolder );
3470 mExpireFolderAction->setEnabled( mFolder && mFolder->isAutoExpire() && !multiFolder && mFolder->canDeleteMessages() );
3471 updateMarkAsReadAction();
3472 // the visual ones only make sense if we are showing a message list
3473 mPreferHtmlAction->setEnabled( mHeaders->folder() ? true : false );
3474 mPreferHtmlLoadExtAction->setEnabled( mHeaders->folder() && (mHtmlPref ? !mFolderHtmlPref : mFolderHtmlPref) ? true : false );
3475 mThreadMessagesAction->setEnabled( mHeaders->folder() ? true : false );
3476
3477 mPreferHtmlAction->setChecked( mHtmlPref ? !mFolderHtmlPref : mFolderHtmlPref );
3478 mPreferHtmlLoadExtAction->setChecked( mHtmlLoadExtPref ? !mFolderHtmlLoadExtPref : mFolderHtmlLoadExtPref );
3479 mThreadMessagesAction->setChecked(
3480 mThreadPref ? !mFolderThreadPref : mFolderThreadPref );
3481 mThreadBySubjectAction->setEnabled(
3482 mHeaders->folder() ? ( mThreadMessagesAction->isChecked()) : false );
3483 mThreadBySubjectAction->setChecked( mFolderThreadSubjPref );
3484
3485 mNewFolderAction->setEnabled( !multiFolder && ( mFolder && mFolder->folderType() != KMFolderTypeSearch ));
3486 mRemoveDuplicatesAction->setEnabled( !multiFolder && mFolder && mFolder->canDeleteMessages() );
3487 mFolderShortCutCommandAction->setEnabled( !multiFolder );
3488}
3489
3490
3491#ifdef MALLOC_DEBUG
3492static TQString fmt(long n) {
3493 char buf[32];
3494
3495 if(n > 1024*1024*1024)
3496 sprintf(buf, "%0.2f GB", ((double)n)/1024.0/1024.0/1024.0);
3497 else if(n > 1024*1024)
3498 sprintf(buf, "%0.2f MB", ((double)n)/1024.0/1024.0);
3499 else if(n > 1024)
3500 sprintf(buf, "%0.2f KB", ((double)n)/1024.0);
3501 else
3502 sprintf(buf, "%ld Byte", n);
3503 return TQString(buf);
3504}
3505#endif
3506
3507void KMMainWidget::slotMemInfo() {
3508#ifdef MALLOC_DEBUG
3509 struct mallinfo mi;
3510
3511 mi = mallinfo();
3512 TQString s = TQString("\nMALLOC - Info\n\n"
3513 "Number of mmapped regions : %1\n"
3514 "Memory allocated in use : %2\n"
3515 "Memory allocated, not used: %3\n"
3516 "Memory total allocated : %4\n"
3517 "Max. freeable memory : %5\n")
3518 .arg(mi.hblks).arg(fmt(mi.uordblks)).arg(fmt(mi.fordblks))
3519 .arg(fmt(mi.arena)).arg(fmt(mi.keepcost));
3520 KMessageBox::information(0, s, "Malloc information", s);
3521#endif
3522}
3523
3524
3525//-----------------------------------------------------------------------------
3526void KMMainWidget::slotIntro()
3527{
3528 if ( !mMsgView ) return;
3529
3530 mMsgView->clear( true );
3531 // hide widgets that are in the way:
3532 if ( mSearchAndHeaders && mHeaders && mLongFolderList )
3533 mSearchAndHeaders->hide();
3534
3535
3536 mMsgView->displayAboutPage();
3537
3538 mFolder = 0;
3539}
3540
3541void KMMainWidget::slotShowStartupFolder()
3542{
3543 if ( mFolderTree ) {
3544 mFolderTree->reload();
3545 mFolderTree->readConfig();
3546 // get rid of old-folders
3547 mFolderTree->cleanupConfigFile();
3548 }
3549
3550 connect( kmkernel->filterMgr(), TQ_SIGNAL( filterListUpdated() ),
3551 this, TQ_SLOT( initializeFilterActions() ));
3552
3553 // plug shortcut filter actions now
3554 initializeFilterActions();
3555
3556 // plug folder shortcut actions
3557 initializeFolderShortcutActions();
3558
3559 TQString newFeaturesMD5 = KMReaderWin::newFeaturesMD5();
3560 if ( kmkernel->firstStart() ||
3561 GlobalSettings::self()->previousNewFeaturesMD5() != newFeaturesMD5 ) {
3562 GlobalSettings::self()->setPreviousNewFeaturesMD5( newFeaturesMD5 );
3563 slotIntro();
3564 return;
3565 }
3566
3567 KMFolder* startup = 0;
3568 if ( !mStartupFolder.isEmpty() ) {
3569 // find the startup-folder
3570 startup = kmkernel->findFolderById( mStartupFolder );
3571 }
3572 if ( !startup )
3573 startup = kmkernel->inboxFolder();
3574
3575 if ( mFolderTree ) {
3576 mFolderTree->showFolder( startup );
3577 }
3578}
3579
3580void KMMainWidget::slotShowTip()
3581{
3582 KTipDialog::showTip( this, TQString(), true );
3583}
3584
3585//-----------------------------------------------------------------------------
3586void KMMainWidget::slotChangeCaption(TQListViewItem * i)
3587{
3588 if ( !i ) return;
3589 // set the caption to the current full path
3590 TQStringList names;
3591 for ( TQListViewItem * item = i ; item ; item = item->parent() )
3592 names.prepend( item->text(0) );
3593 emit captionChangeRequest( names.join( "/" ) );
3594}
3595
3596//-----------------------------------------------------------------------------
3597void KMMainWidget::removeDuplicates()
3598{
3599 if (!mFolder)
3600 return;
3601 KMFolder *oFolder = mFolder;
3602 mHeaders->setFolder(0);
3603 TQMap< TQString, TQValueList<int> > idMD5s;
3604 TQValueList<int> redundantIds;
3605 TQValueList<int>::Iterator kt;
3606 mFolder->open("removedups");
3607 for (int i = mFolder->count() - 1; i >= 0; --i) {
3608 TQString id = (*mFolder)[i]->msgIdMD5();
3609 if ( !id.isEmpty() ) {
3610 TQString subjMD5 = (*mFolder)[i]->strippedSubjectMD5();
3611 int other = -1;
3612 if ( idMD5s.contains(id) )
3613 other = idMD5s[id].first();
3614 else
3615 idMD5s[id].append( i );
3616 if ( other != -1 ) {
3617 TQString otherSubjMD5 = (*mFolder)[other]->strippedSubjectMD5();
3618 if (otherSubjMD5 == subjMD5)
3619 idMD5s[id].append( i );
3620 }
3621 }
3622 }
3623 TQMap< TQString, TQValueList<int> >::Iterator it;
3624 for ( it = idMD5s.begin(); it != idMD5s.end() ; ++it ) {
3625 TQValueList<int>::Iterator jt;
3626 bool finished = false;
3627 for ( jt = (*it).begin(); jt != (*it).end() && !finished; ++jt )
3628 if (!((*mFolder)[*jt]->isUnread())) {
3629 (*it).remove( jt );
3630 (*it).prepend( *jt );
3631 finished = true;
3632 }
3633 for ( jt = (*it).begin(), ++jt; jt != (*it).end(); ++jt )
3634 redundantIds.append( *jt );
3635 }
3636 qHeapSort( redundantIds );
3637 kt = redundantIds.end();
3638 int numDuplicates = 0;
3639 if (kt != redundantIds.begin()) do {
3640 mFolder->removeMsg( *(--kt) );
3641 ++numDuplicates;
3642 }
3643 while (kt != redundantIds.begin());
3644
3645 mFolder->close("removedups");
3646 mHeaders->setFolder(oFolder);
3647 TQString msg;
3648 if ( numDuplicates )
3649 msg = i18n("Removed %n duplicate message.",
3650 "Removed %n duplicate messages.", numDuplicates );
3651 else
3652 msg = i18n("No duplicate messages found.");
3653 BroadcastStatus::instance()->setStatusMsg( msg );
3654}
3655
3656
3657//-----------------------------------------------------------------------------
3658void KMMainWidget::slotUpdateUndo()
3659{
3660 if (actionCollection()->action( "edit_undo" ))
3661 actionCollection()->action( "edit_undo" )->setEnabled( mHeaders->canUndo() );
3662}
3663
3664
3665//-----------------------------------------------------------------------------
3666void KMMainWidget::clearFilterActions()
3667{
3668 if ( !mFilterTBarActions.isEmpty() ) {
3669 if ( mGUIClient->factory() )
3670 mGUIClient->unplugActionList( "toolbar_filter_actions" );
3671 mFilterTBarActions.clear();
3672 }
3673 mApplyFilterActionsMenu->popupMenu()->clear();
3674 if ( !mFilterMenuActions.isEmpty() ) {
3675 if ( mGUIClient->factory() )
3676 mGUIClient->unplugActionList( "menu_filter_actions" );
3677 mFilterMenuActions.clear();
3678 }
3679 mFilterCommands.clear();
3680}
3681
3682//-----------------------------------------------------------------------------
3683void KMMainWidget::initializeFolderShortcutActions()
3684{
3685
3686 // If we are loaded as a part, this will be set to fals, since the part
3687 // does xml loading. Temporarily set to true, in that case, so the
3688 // accels are added to the collection as expected.
3689 bool old = actionCollection()->isAutoConnectShortcuts();
3690
3691 actionCollection()->setAutoConnectShortcuts( true );
3692 TQValueList< TQGuardedPtr< KMFolder > > folders = kmkernel->allFolders();
3693 TQValueList< TQGuardedPtr< KMFolder > >::Iterator it = folders.begin();
3694 while ( it != folders.end() ) {
3695 KMFolder *folder = (*it);
3696 ++it;
3697 slotShortcutChanged( folder ); // load the initial accel
3698 }
3699 actionCollection()->setAutoConnectShortcuts( old );
3700}
3701
3702
3703//-----------------------------------------------------------------------------
3704void KMMainWidget::initializeFilterActions()
3705{
3706 TQString filterName, normalizedName;
3707 KMMetaFilterActionCommand *filterCommand;
3708 TDEAction *filterAction = 0;
3709
3710 clearFilterActions();
3711 mApplyAllFiltersAction->plug(mApplyFilterActionsMenu->popupMenu());
3712 bool addedSeparator = false;
3713 TQValueListConstIterator<KMFilter*> it = kmkernel->filterMgr()->filters().constBegin();
3714 for ( ;it != kmkernel->filterMgr()->filters().constEnd(); ++it ) {
3715 if (!(*it)->isEmpty() && (*it)->configureShortcut()) {
3716 filterName = TQString("Filter %1").arg((*it)->name());
3717 normalizedName = filterName.replace(" ", "_");
3718 if (action(normalizedName.utf8()))
3719 continue;
3720 filterCommand = new KMMetaFilterActionCommand(*it, mHeaders, this);
3721 mFilterCommands.append(filterCommand);
3722 TQString as = i18n("Filter %1").arg((*it)->name());
3723 TQString icon = (*it)->icon();
3724 if ( icon.isEmpty() )
3725 icon = "gear";
3726 filterAction = new TDEAction(as, icon, (*it)->shortcut(), filterCommand,
3727 TQ_SLOT(start()), actionCollection(),
3728 normalizedName.local8Bit());
3729 if(!addedSeparator) {
3730 mApplyFilterActionsMenu->popupMenu()->insertSeparator();
3731 addedSeparator = !addedSeparator;
3732 mFilterMenuActions.append( new TDEActionSeparator());
3733 }
3734 filterAction->plug( mApplyFilterActionsMenu->popupMenu() );
3735 mFilterMenuActions.append(filterAction);
3736 if ( (*it)->configureToolbar() )
3737 mFilterTBarActions.append(filterAction);
3738 }
3739 }
3740 if ( !mFilterMenuActions.isEmpty() && mGUIClient->factory() )
3741 mGUIClient->plugActionList( "menu_filter_actions", mFilterMenuActions );
3742 if ( !mFilterTBarActions.isEmpty() && mGUIClient->factory() ) {
3743 mFilterTBarActions.prepend( mToolbarActionSeparator );
3744 mGUIClient->plugActionList( "toolbar_filter_actions", mFilterTBarActions );
3745 }
3746}
3747
3748void KMMainWidget::slotFolderRemoved( KMFolder *folder )
3749{
3750 mFolderShortcutCommands.remove( folder->idString() );
3751}
3752
3753//-----------------------------------------------------------------------------
3754void KMMainWidget::initializeIMAPActions( bool setState /* false the first time, true later on */ )
3755{
3756 bool hasImapAccount = false;
3757 for( KMAccount *a = kmkernel->acctMgr()->first(); a;
3758 a = kmkernel->acctMgr()->next() ) {
3759 if ( a->type() == "cachedimap" ) {
3760 hasImapAccount = true;
3761 break;
3762 }
3763 }
3764 if ( hasImapAccount == ( mTroubleshootFolderAction != 0 ) )
3765 return; // nothing to do
3766
3767 KXMLGUIFactory* factory = mGUIClient->factory();
3768 if ( factory )
3769 factory->removeClient( mGUIClient );
3770
3771 if ( !mTroubleshootFolderAction ) {
3772 mTroubleshootFolderAction = new TDEAction( i18n("&Troubleshoot IMAP Cache..."), "wizard", 0,
3773 this, TQ_SLOT(slotTroubleshootFolder()), actionCollection(), "troubleshoot_folder" );
3774 if ( setState )
3775 updateFolderMenu(); // set initial state of the action
3776 } else {
3777 delete mTroubleshootFolderAction ;
3778 mTroubleshootFolderAction = 0;
3779 }
3780
3781 if ( factory )
3782 factory->addClient( mGUIClient );
3783}
3784
3785bool KMMainWidget::shortcutIsValid( const TDEShortcut &sc ) const
3786{
3787 TDEActionPtrList actions = actionCollection()->actions();
3788 TDEActionPtrList::Iterator it( actions.begin() );
3789 for ( ; it != actions.end(); it++ ) {
3790 if ( (*it)->shortcut() == sc ) return false;
3791 }
3792 return true;
3793}
3794
3795void KMMainWidget::slotShortcutChanged( KMFolder *folder )
3796{
3797 // remove the old one, autodelete
3798 mFolderShortcutCommands.remove( folder->idString() );
3799 if ( folder->shortcut().isNull() )
3800 return;
3801
3802 FolderShortcutCommand *c = new FolderShortcutCommand( this, folder );
3803 mFolderShortcutCommands.insert( folder->idString(), c );
3804
3805 TQString actionlabel = TQString( "FolderShortcut %1").arg( folder->prettyURL() );
3806 TQString actionname = TQString( "FolderShortcut %1").arg( folder->idString() );
3807 TQString normalizedName = actionname.replace(" ", "_");
3808 TDEAction* action =
3809 new TDEAction(actionlabel, folder->shortcut(), c, TQ_SLOT(start()),
3810 actionCollection(), normalizedName.local8Bit());
3811 action->setIcon( folder->unreadIconPath() );
3812 c->setAction( action ); // will be deleted along with the command
3813}
3814
3815//-----------------------------------------------------------------------------
3816TQString KMMainWidget::findCurrentImapPath()
3817{
3818 TQString startPath;
3819 if (!mFolder) return startPath;
3820 if (mFolder->folderType() == KMFolderTypeImap)
3821 {
3822 startPath = static_cast<KMFolderImap*>(mFolder->storage())->imapPath();
3823 } else if (mFolder->folderType() == KMFolderTypeCachedImap)
3824 {
3825 startPath = static_cast<KMFolderCachedImap*>(mFolder->storage())->imapPath();
3826 }
3827 return startPath;
3828}
3829
3830//-----------------------------------------------------------------------------
3831ImapAccountBase* KMMainWidget::findCurrentImapAccountBase()
3832{
3833 ImapAccountBase* account = 0;
3834 if (!mFolder) return account;
3835 if (mFolder->folderType() == KMFolderTypeImap)
3836 {
3837 account = static_cast<KMFolderImap*>(mFolder->storage())->account();
3838 } else if (mFolder->folderType() == KMFolderTypeCachedImap)
3839 {
3840 account = static_cast<KMFolderCachedImap*>(mFolder->storage())->account();
3841 }
3842 return account;
3843}
3844
3845//-----------------------------------------------------------------------------
3846void KMMainWidget::slotSubscriptionDialog()
3847{
3848 if ( !kmkernel->askToGoOnline() )
3849 return;
3850 ImapAccountBase* account = findCurrentImapAccountBase();
3851 if ( !account ) return;
3852 const TQString startPath = findCurrentImapPath();
3853
3854 // KSubscription sets "DestruciveClose"
3855 SubscriptionDialog * dialog =
3856 new SubscriptionDialog(this, i18n("Subscription"), account, startPath);
3857 if ( dialog->exec() ) {
3858 // start a new listing
3859 if (mFolder->folderType() == KMFolderTypeImap)
3860 static_cast<KMFolderImap*>(mFolder->storage())->account()->listDirectory();
3861 }
3862}
3863
3864//-----------------------------------------------------------------------------
3865void KMMainWidget::slotLocalSubscriptionDialog()
3866{
3867 ImapAccountBase* account = findCurrentImapAccountBase();
3868 if ( !account ) return;
3869
3870 const TQString startPath = findCurrentImapPath();
3871 // KSubscription sets "DestruciveClose"
3872 LocalSubscriptionDialog *dialog =
3873 new LocalSubscriptionDialog(this, i18n("Local Subscription"), account, startPath);
3874 if ( dialog->exec() ) {
3875 // start a new listing
3876 if (mFolder->folderType() == KMFolderTypeImap)
3877 static_cast<KMFolderImap*>(mFolder->storage())->account()->listDirectory();
3878 }
3879}
3880
3881//-----------------------------------------------------------------------------
3882void KMMainWidget::slotFolderTreeColumnsChanged()
3883{
3884 mTotalColumnToggle->setChecked( mFolderTree->isTotalActive() );
3885 mUnreadColumnToggle->setChecked( mFolderTree->isUnreadActive() );
3886 mSizeColumnToggle->setChecked( mFolderTree->isSizeActive() );
3887 mUnreadTextToggle->setChecked( !mFolderTree->isUnreadActive() );
3888}
3889
3890void KMMainWidget::toggleSystemTray()
3891{
3892 if ( !mSystemTray && GlobalSettings::self()->systemTrayEnabled() ) {
3893 mSystemTray = new KMSystemTray();
3894 }
3895 else if ( mSystemTray && !GlobalSettings::self()->systemTrayEnabled() ) {
3896 // Get rid of system tray on user's request
3897 kdDebug(5006) << "deleting systray" << endl;
3898 delete mSystemTray;
3899 mSystemTray = 0;
3900 }
3901
3902 // Set mode of systemtray. If mode has changed, tray will handle this.
3903 if ( mSystemTray )
3904 mSystemTray->setMode( GlobalSettings::self()->systemTrayPolicy() );
3905}
3906
3907//-----------------------------------------------------------------------------
3908void KMMainWidget::slotAntiSpamWizard()
3909{
3910 AntiSpamWizard wiz( AntiSpamWizard::AntiSpam, this, folderTree() );
3911 wiz.exec();
3912}
3913
3914//-----------------------------------------------------------------------------
3915void KMMainWidget::slotAntiVirusWizard()
3916{
3917 AntiSpamWizard wiz( AntiSpamWizard::AntiVirus, this, folderTree() );
3918 wiz.exec();
3919}
3920
3921//-----------------------------------------------------------------------------
3922void KMMainWidget::slotFilterLogViewer()
3923{
3924 FilterLogDialog * dlg = new FilterLogDialog( 0 );
3925 dlg->show();
3926}
3927
3928//-----------------------------------------------------------------------------
3929void KMMainWidget::updateFileMenu()
3930{
3931 TQStringList actList = kmkernel->acctMgr()->getAccounts();
3932
3933 actionCollection()->action("check_mail")->setEnabled( actList.size() > 0 );
3934 actionCollection()->action("check_mail_in")->setEnabled( actList.size() > 0 );
3935 actionCollection()->action("favorite_check_mail")->setEnabled( actList.size() > 0 );
3936}
3937
3938
3939//-----------------------------------------------------------------------------
3940void KMMainWidget::setAccelsEnabled( bool enabled )
3941{
3942 actionCollection()->tdeaccel()->setEnabled( enabled );
3943}
3944
3945
3946//-----------------------------------------------------------------------------
3947KMSystemTray *KMMainWidget::systray() const
3948{
3949 return mSystemTray;
3950}
3951
3952//-----------------------------------------------------------------------------
3953TQString KMMainWidget::overrideEncoding() const
3954{
3955 if ( mMsgView )
3956 return mMsgView->overrideEncoding();
3957 else
3958 return GlobalSettings::self()->overrideCharacterEncoding();
3959}
3960
3961void KMMainWidget::slotCreateTodo()
3962{
3963 KMMessage *msg = mHeaders->currentMsg();
3964 if ( !msg )
3965 return;
3966 KMCommand *command = new CreateTodoCommand( this, msg );
3967 command->start();
3968}
3969
3970void KMMainWidget::setupFolderView()
3971{
3972 if ( GlobalSettings::self()->enableFavoriteFolderView() ) {
3973 mFolderView = mFolderViewSplitter;
3974 mFolderTree->reparent( mFolderViewSplitter, 0, TQPoint( 0, 0 ) );
3975 mFolderViewSplitter->show();
3976 mFavoriteFolderView->show();
3977 } else {
3978 mFolderView = mFolderTree;
3979 mFolderViewSplitter->hide();
3980 mFavoriteFolderView->hide();
3981 }
3982 mFolderView->reparent( mFolderViewParent, 0, TQPoint( 0, 0 ) );
3983 mFolderViewParent->moveToFirst( mFolderView );
3984 mFolderTree->show();
3985}
3986
3987
3988void KMMainWidget::slotRequestFullSearchFromQuickSearch()
3989{
3990 slotSearch();
3991#ifdef HAVE_INDEXLIB
3992 return;
3993#endif
3994 assert( mSearchWin );
3995 KMSearchPattern pattern;
3996 pattern.append( KMSearchRule::createInstance( "<message>", KMSearchRule::FuncContains, mQuickSearchLine->currentSearchTerm() ) );
3997 int status = mQuickSearchLine->currenStatus();
3998 if ( status != 0 ) {
3999 pattern.append( new KMSearchRuleStatus( status ) );
4000 }
4001 mSearchWin->setSearchPattern( pattern );
4002}
4003
4004void KMMainWidget::updateVactionScripStatus(bool active)
4005{
4006 mVacationIndicatorActive = active;
4007 if ( active ) {
4008 mVacationScriptIndicator->setText( i18n("Out of office reply active") );
4009 mVacationScriptIndicator->setPaletteBackgroundColor( TQt::yellow );
4010 mVacationScriptIndicator->setCursor( TQCursor( TQt::PointingHandCursor ) );
4011 mVacationScriptIndicator->show();
4012 } else {
4013 mVacationScriptIndicator->hide();
4014 }
4015}
4016
sets a cursor and makes sure it's restored on destruction Create a KCursorSaver object when you want ...
Dialog for handling the properties of a mail folder.
Mail folder.
Definition kmfolder.h:69
TQString idString() const
Returns a string that can be used to identify this folder.
Definition kmfolder.cpp:705
virtual TQString prettyURL() const
URL of the node for visualization purposes.
Definition kmfolder.cpp:593
virtual TQString label() const
Returns the label of the folder for visualization.
Definition kmfolder.cpp:581
bool ignoreNewMail() const
Returns true if the user doesn't want to get notified about new mail in this folder.
Definition kmfolder.h:526
KMFolderType folderType() const
Returns the type of this folder.
Definition kmfolder.cpp:233
int open(const char *owner)
Open folder for access.
Definition kmfolder.cpp:479
The widget that shows the contents of folders.
Definition kmheaders.h:47
static KMKernel * self()
normal control stuff
Definition kmkernel.h:259
This is a Mime Message.
Definition kmmessage.h:68
void setReadyToShow(bool v)
Set if the message is ready to be shown.
Definition kmmessage.h:874
TQString msgId() const
Get or set the 'Message-Id' header field.
TQString from() const
Get or set the 'From' header field.
TQString to() const
Get or set the 'To' header field.
TQString subject() const
Get or set the 'Subject' header field.
bool transferInProgress() const
Return, if the message should not be deleted.
void setMsgSerNum(unsigned long newMsgSerNum=0)
Sets the message serial number.
KMMessage * unencryptedMsg() const
Returns an unencrypted copy of this message or 0 if none exists.
Definition kmmessage.h:137
bool hasUnencryptedMsg() const
Returns TRUE if the message contains an unencrypted copy of itself.
Definition kmmessage.h:134
bool isComplete() const
Return true if the complete message is available without referring to the backing store.
Definition kmmessage.h:867
void initHeader(uint identity=0)
Initialize header fields.
This class implements a "reader window", that is a window used for reading or viewing messages.
Definition kmreaderwin.h:75
static TQString newFeaturesMD5()
Returns the MD5 hash for the list of new features.
This class is an abstraction of a search over messages.
This class represents a search to be performed against the status of a messsage.
static KMSearchRule * createInstance(const TQCString &field=0, Function function=FuncContains, const TQString &contents=TQString())
Create a search rule of a certain type by instantiating the appro- priate subclass depending on the f...
KMSystemTray extends KSystemTray and handles system tray notification for KMail.
The account manager is responsible for creating accounts of various types via the factory method crea...
KMail anti-spam wizard.
KMail Filter Log Collector.
This class encapsulates the visual appearance of message headers.
Definition headerstyle.h:51
Manages common actions that can be performed on one or more messages.
The SearchWindow class provides a dialog for triggering a search on folders and storing that search a...
Diagnostic info for Sieve.
static TQStringList transportNames()
Returns the list for transport names.
Extends HeaderListQuickSearch to also search inside message bodies using KMMsgIndex.
The TemplateParser transforms a message with a given template.