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 ...
Definition: kcursorsaver.h:14
Dialog for handling the properties of a mail folder.
Definition: kmfolderdia.h:199
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.
Definition: kmmessage.cpp:2182
TQString from() const
Get or set the 'From' header field.
Definition: kmmessage.cpp:2015
TQString to() const
Get or set the 'To' header field.
Definition: kmmessage.cpp:1894
TQString subject() const
Get or set the 'Subject' header field.
Definition: kmmessage.cpp:2049
bool transferInProgress() const
Return, if the message should not be deleted.
Definition: kmmessage.cpp:236
void setMsgSerNum(unsigned long newMsgSerNum=0)
Sets the message serial number.
Definition: kmmessage.cpp:223
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.
Definition: kmmessage.cpp:1715
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.
Definition: kmsystemtray.h:42
The account manager is responsible for creating accounts of various types via the factory method crea...
KMail anti-spam wizard.
KMail Filter Log Collector.
Definition: filterlogdlg.h:49
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...
Definition: searchwindow.h:69
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.