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 = nullptr;
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( nullptr ),
142 mFavoriteFolderView( nullptr ),
143 mFolderView( nullptr ),
144 mFolderViewParent( nullptr ),
145 mFolderViewSplitter( nullptr ),
146 mQuickSearchLine( nullptr ),
147 mArchiveFolderAction( nullptr ),
148 mShowBusySplashTimer( nullptr ),
149 mShowingOfflineScreen( false ),
150 mMsgActions( nullptr ),
151 mVacationIndicatorActive( false )
152{
153 // must be the first line of the constructor:
154 mStartupDone = false;
155 mSearchWin = nullptr;
156 mIntegrated = true;
157 mFolder = nullptr;
158 mTemplateFolder = nullptr;
159 mFolderThreadPref = false;
160 mFolderThreadSubjPref = true;
161 mReaderWindowActive = true;
162 mReaderWindowBelow = true;
163 mFolderHtmlPref = false;
164 mFolderHtmlLoadExtPref = false;
165 mSystemTray = nullptr;
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 = nullptr;
174 mConfig = config;
175 mGUIClient = aGUIClient;
176
177 mCustomReplyActionMenu = nullptr;
178 mCustomReplyAllActionMenu = nullptr;
179 mCustomForwardActionMenu = nullptr;
180 mCustomReplyMapper = nullptr;
181 mCustomReplyAllMapper = nullptr;
182 mCustomForwardMapper = nullptr;
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() : nullptr;
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 = nullptr,
555 *mimeParent = nullptr, *messageParent = nullptr;
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(), nullptr );
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 = nullptr;
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 = nullptr;
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( nullptr, mFolder );
998 win = KMail::makeComposer( msg, mFolder->identity() );
999 } else {
1000 msg->initHeader();
1001 TemplateParser parser( msg, TemplateParser::NewMessage );
1002 parser.process( nullptr, nullptr );
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 = nullptr;
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 = nullptr;
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 = nullptr;
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( nullptr, 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( nullptr, 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 = nullptr;
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) << endl
1774 << "slotStartCertManager(): certificate manager started." << endl;
1775 // process continues to run even after the TDEProcess object goes
1776 // out of scope here, since it is started in DontCare run mode.
1777
1778}
1779
1780//-----------------------------------------------------------------------------
1781void KMMainWidget::slotStartWatchGnuPG()
1782{
1783 TDEProcess certManagerProc;
1784 certManagerProc << "kwatchgnupg";
1785
1786 if( !certManagerProc.start( TDEProcess::DontCare ) )
1787 KMessageBox::error( this, i18n( "Could not start GnuPG LogViewer (kwatchgnupg); "
1788 "please check your installation." ),
1789 i18n( "KMail Error" ) );
1790}
1791
1792//-----------------------------------------------------------------------------
1793void KMMainWidget::slotCopyMsg()
1794{
1795 KMail::KMFolderSelDlg dlg( this, i18n("Copy Message to Folder"), true );
1796 KMFolder* dest;
1797
1798 if (!dlg.exec()) return;
1799 if (!(dest = dlg.folder())) return;
1800
1801 mHeaders->copyMsgToFolder(dest);
1802}
1803
1804//-----------------------------------------------------------------------------
1805void KMMainWidget::slotPrintMsg()
1806{
1807 KMMessage *msg = mHeaders->currentMsg();
1808 if ( !msg ) {
1809 return;
1810 }
1811
1812 bool htmlOverride = mMsgView ? mMsgView->htmlOverride() : false;
1813 bool htmlLoadExtOverride = mMsgView ? mMsgView->htmlLoadExtOverride() : false;
1814 TDEConfigGroup reader( KMKernel::config(), "Reader" );
1815 bool useFixedFont = mMsgView ? mMsgView->isFixedFont()
1816 : reader.readBoolEntry( "useFixedFont", false );
1817
1818 const HeaderStyle *style;
1819 const HeaderStrategy *strategy;
1820 if ( mMsgView ) {
1821 style = mMsgView->headerStyle();
1822 strategy = mMsgView->headerStrategy();
1823 } else {
1824 style = HeaderStyle::create( reader.readEntry( "header-style", "fancy" ) );
1825 strategy = HeaderStrategy::create( reader.readEntry( "header-set-displayed", "rich" ) );
1826 }
1827
1828 KMPrintCommand *command =
1829 new KMPrintCommand( this, msg,
1830 style, strategy,
1831 htmlOverride, htmlLoadExtOverride,
1832 useFixedFont, overrideEncoding() );
1833 if ( mMsgView )
1834 command->setOverrideFont( mMsgView->cssHelper()->bodyFont( mMsgView->isFixedFont(), true /*printing*/ ) );
1835
1836 command->start();
1837}
1838
1839//-----------------------------------------------------------------------------
1840void KMMainWidget::setupForwardActions()
1841{
1842 disconnect( mForwardActionMenu, TQ_SIGNAL( activated() ), nullptr, nullptr );
1843 mForwardActionMenu->remove( mForwardInlineAction );
1844 mForwardActionMenu->remove( mForwardAttachedAction );
1845
1846 if ( GlobalSettings::self()->forwardingInlineByDefault() ) {
1847 mForwardActionMenu->insert( mForwardInlineAction, 0 );
1848 mForwardActionMenu->insert( mForwardAttachedAction, 1 );
1849 mForwardInlineAction->setShortcut( Key_F );
1850 mForwardAttachedAction->setShortcut( SHIFT+Key_F );
1851 connect( mForwardActionMenu, TQ_SIGNAL(activated()), this,
1852 TQ_SLOT(slotForwardInlineMsg()) );
1853
1854 } else {
1855 mForwardActionMenu->insert( mForwardAttachedAction, 0 );
1856 mForwardActionMenu->insert( mForwardInlineAction, 1 );
1857 mForwardInlineAction->setShortcut( SHIFT+Key_F );
1858 mForwardAttachedAction->setShortcut( Key_F );
1859 connect( mForwardActionMenu, TQ_SIGNAL(activated()), this,
1860 TQ_SLOT(slotForwardAttachedMsg()) );
1861 }
1862}
1863
1864//-----------------------------------------------------------------------------
1865void KMMainWidget::slotConfigChanged()
1866{
1867 readConfig();
1868 setupForwardActions();
1869 setupForwardingActionsList();
1870}
1871
1872//-----------------------------------------------------------------------------
1873void KMMainWidget::slotSaveMsg()
1874{
1875 KMMessage *msg = mHeaders->currentMsg();
1876 if (!msg)
1877 return;
1878 KMSaveMsgCommand *saveCommand = new KMSaveMsgCommand( this,
1879 *mHeaders->selectedMsgs() );
1880
1881 if (saveCommand->url().isEmpty())
1882 delete saveCommand;
1883 else
1884 saveCommand->start();
1885}
1886
1887//-----------------------------------------------------------------------------
1888void KMMainWidget::slotOpenMsg()
1889{
1890 KMOpenMsgCommand *openCommand = new KMOpenMsgCommand( this, nullptr, overrideEncoding() );
1891
1892 openCommand->start();
1893}
1894
1895//-----------------------------------------------------------------------------
1896void KMMainWidget::slotSaveAttachments()
1897{
1898 KMMessage *msg = mHeaders->currentMsg();
1899 if (!msg)
1900 return;
1901 KMSaveAttachmentsCommand *saveCommand = new KMSaveAttachmentsCommand( this,
1902 *mHeaders->selectedMsgs() );
1903 saveCommand->start();
1904}
1905
1906void KMMainWidget::slotOnlineStatus()
1907{
1908 // KMKernel will emit a signal when we toggle the network state that is caught by
1909 // KMMainWidget::slotUpdateOnlineStatus to update our GUI
1910 if ( GlobalSettings::self()->networkState() == GlobalSettings::EnumNetworkState::Online ) {
1911 // if online; then toggle and set it offline.
1912 kmkernel->stopNetworkJobs();
1913 } else {
1914 kmkernel->resumeNetworkJobs();
1915 slotCheckVacation();
1916 }
1917}
1918
1919void KMMainWidget::slotUpdateOnlineStatus( GlobalSettings::EnumNetworkState::type )
1920{
1921 if ( GlobalSettings::self()->networkState() == GlobalSettings::EnumNetworkState::Online )
1922 actionCollection()->action( "online_status" )->setText( i18n("Work Offline") );
1923 else
1924 actionCollection()->action( "online_status" )->setText( i18n("Work Online") );
1925}
1926
1927
1928//-----------------------------------------------------------------------------
1929void KMMainWidget::slotSendQueued()
1930{
1931 if ( !kmkernel->askToGoOnline() ) {
1932 return;
1933 }
1934
1935 kmkernel->msgSender()->sendQueued();
1936}
1937
1938//-----------------------------------------------------------------------------
1939void KMMainWidget::slotSendQueuedVia( int item )
1940{
1941 if ( !kmkernel->askToGoOnline() ) {
1942 return;
1943 }
1944
1945 TQStringList availTransports= KMail::TransportManager::transportNames();
1946 TQString customTransport = availTransports[ item ];
1947
1948 kmkernel->msgSender()->sendQueued( customTransport );
1949}
1950
1951//-----------------------------------------------------------------------------
1952void KMMainWidget::slotViewChange()
1953{
1954 if(mBodyPartsMenu->isItemChecked(mBodyPartsMenu->idAt(0)))
1955 {
1956 mBodyPartsMenu->setItemChecked(mBodyPartsMenu->idAt(0),false);
1957 mBodyPartsMenu->setItemChecked(mBodyPartsMenu->idAt(1),true);
1958 }
1959 else if(mBodyPartsMenu->isItemChecked(mBodyPartsMenu->idAt(1)))
1960 {
1961 mBodyPartsMenu->setItemChecked(mBodyPartsMenu->idAt(1),false);
1962 mBodyPartsMenu->setItemChecked(mBodyPartsMenu->idAt(0),true);
1963 }
1964
1965 //mMsgView->setInline(!mMsgView->isInline());
1966}
1967
1968
1969//-----------------------------------------------------------------------------
1970void KMMainWidget::folderSelectedUnread( KMFolder* aFolder )
1971{
1972 folderSelected( aFolder, true );
1973 slotChangeCaption( mFolderTree->currentItem() );
1974}
1975
1976//-----------------------------------------------------------------------------
1977void KMMainWidget::folderSelected()
1978{
1979 folderSelected( mFolder );
1980 updateFolderMenu();
1981 // opened() before the getAndCheckFolder() in folderSelected
1982 if ( mFolder && mFolder->folderType() == KMFolderTypeImap )
1983 mFolder->close("mainwidget");
1984}
1985
1986//-----------------------------------------------------------------------------
1987void KMMainWidget::folderSelected( KMFolder* aFolder, bool forceJumpToUnread )
1988{
1989 KCursorSaver busy(KBusyPtr::busy());
1990
1991 if (mMsgView)
1992 mMsgView->clear(true);
1993
1994 if ( mFolder && mFolder->folderType() == KMFolderTypeImap && !mFolder->noContent() )
1995 {
1996 KMFolderImap *imap = static_cast<KMFolderImap*>(mFolder->storage());
1997 if ( mFolder->needsCompacting() && imap->autoExpunge() )
1998 imap->expungeFolder(imap, true);
1999 }
2000
2001 // Re-enable the msg list and quicksearch if we're showing a splash
2002 // screen. This is true either if there's no active folder, or if we
2003 // have a timer that is no longer active (i.e. it has already fired)
2004 // To make the if() a bit more complicated, we suppress the hiding
2005 // when the new folder is also an IMAP folder, because that's an
2006 // async operation and we don't want flicker if it results in just
2007 // a new splash.
2008 bool newFolder = ( (KMFolder*)mFolder != aFolder );
2009 bool isNewImapFolder = aFolder && aFolder->folderType() == KMFolderTypeImap && newFolder;
2010 if( !mFolder
2011 || ( !isNewImapFolder && mShowBusySplashTimer )
2012 || ( newFolder && mShowingOfflineScreen && !( isNewImapFolder && kmkernel->isOffline() ) ) ) {
2013 if ( mMsgView ) {
2014 mMsgView->enableMsgDisplay();
2015 mMsgView->clear( true );
2016 }
2017 if( mSearchAndHeaders && mHeaders )
2018 mSearchAndHeaders->show();
2019 mShowingOfflineScreen = false;
2020 }
2021
2022 // Delete any pending timer, if needed it will be recreated below
2023 delete mShowBusySplashTimer;
2024 mShowBusySplashTimer = nullptr;
2025
2026 if ( newFolder )
2027 writeFolderConfig();
2028 if ( mFolder ) {
2029 disconnect( mFolder, TQ_SIGNAL( changed() ),
2030 this, TQ_SLOT( updateMarkAsReadAction() ) );
2031 disconnect( mFolder, TQ_SIGNAL( msgHeaderChanged( KMFolder*, int ) ),
2032 this, TQ_SLOT( updateMarkAsReadAction() ) );
2033 disconnect( mFolder, TQ_SIGNAL( msgAdded( int ) ),
2034 this, TQ_SLOT( updateMarkAsReadAction() ) );
2035 disconnect( mFolder, TQ_SIGNAL( msgRemoved( KMFolder * ) ),
2036 this, TQ_SLOT( updateMarkAsReadAction() ) );
2037 }
2038
2039 mFolder = aFolder;
2040
2041 if ( aFolder && aFolder->folderType() == KMFolderTypeImap )
2042 {
2043 if ( kmkernel->isOffline() ) {
2044 showOfflinePage();
2045 return;
2046 }
2047 KMFolderImap *imap = static_cast<KMFolderImap*>(aFolder->storage());
2048 if ( newFolder && !mFolder->noContent() )
2049 {
2050 imap->open("mainwidget"); // will be closed in the folderSelected slot
2051 // first get new headers before we select the folder
2052 imap->setSelected( true );
2053 connect( imap, TQ_SIGNAL( folderComplete( KMFolderImap*, bool ) ),
2054 this, TQ_SLOT( folderSelected() ) );
2055 imap->getAndCheckFolder();
2056 mHeaders->setFolder( nullptr );
2057 updateFolderMenu();
2058 mForceJumpToUnread = forceJumpToUnread;
2059
2060 // Set a timer to show a splash screen if fetching folder contents
2061 // takes more than the amount of seconds configured in the kmailrc (default 1000 msec)
2062 mShowBusySplashTimer = new TQTimer( this );
2063 connect( mShowBusySplashTimer, TQ_SIGNAL( timeout() ), this, TQ_SLOT( slotShowBusySplash() ) );
2064 mShowBusySplashTimer->start( GlobalSettings::self()->folderLoadingTimeout(), true );
2065 return;
2066 } else {
2067 // the folder is complete now - so go ahead
2068 disconnect( imap, TQ_SIGNAL( folderComplete( KMFolderImap*, bool ) ),
2069 this, TQ_SLOT( folderSelected() ) );
2070 forceJumpToUnread = mForceJumpToUnread;
2071 }
2072 }
2073
2074 if ( mFolder ) { // == 0 -> pointing to toplevel ("Welcome to KMail") folder
2075 connect( mFolder, TQ_SIGNAL( changed() ),
2076 this, TQ_SLOT( updateMarkAsReadAction() ) );
2077 connect( mFolder, TQ_SIGNAL( msgHeaderChanged( KMFolder*, int ) ),
2078 this, TQ_SLOT( updateMarkAsReadAction() ) );
2079 connect( mFolder, TQ_SIGNAL( msgAdded( int ) ),
2080 this, TQ_SLOT( updateMarkAsReadAction() ) );
2081 connect( mFolder, TQ_SIGNAL( msgRemoved(KMFolder *) ),
2082 this, TQ_SLOT( updateMarkAsReadAction() ) );
2083 }
2084 readFolderConfig();
2085 if (mMsgView)
2086 {
2087 mMsgView->setHtmlOverride(mFolderHtmlPref);
2088 mMsgView->setHtmlLoadExtDefault(mFolderHtmlLoadExtPref);
2089 }
2090 mHeaders->setFolder( mFolder, forceJumpToUnread );
2091 updateMessageActions();
2092 updateFolderMenu();
2093 if (!aFolder)
2094 slotIntro();
2095}
2096
2097//-----------------------------------------------------------------------------
2098void KMMainWidget::slotShowBusySplash()
2099{
2100 if ( mReaderWindowActive )
2101 {
2102 mMsgView->displayBusyPage();
2103 // hide widgets that are in the way:
2104 if ( mSearchAndHeaders && mHeaders && mLongFolderList )
2105 mSearchAndHeaders->hide();
2106 }
2107}
2108
2109void KMMainWidget::showOfflinePage()
2110{
2111 if ( !mReaderWindowActive ) return;
2112 mShowingOfflineScreen = true;
2113
2114 mMsgView->displayOfflinePage();
2115 // hide widgets that are in the way:
2116 if ( mSearchAndHeaders && mHeaders && mLongFolderList )
2117 mSearchAndHeaders->hide();
2118}
2119
2120//-----------------------------------------------------------------------------
2121void KMMainWidget::slotMsgSelected(KMMessage *msg)
2122{
2123 if ( msg && msg->parent() && !msg->isComplete() )
2124 {
2125 if ( msg->transferInProgress() )
2126 return;
2127 mMsgView->clear();
2128 mMsgView->setWaitingForSerNum( msg->getMsgSerNum() );
2129
2130 if ( mJob ) {
2131 disconnect( mJob, nullptr, mMsgView, nullptr );
2132 delete mJob;
2133 }
2134 mJob = msg->parent()->createJob( msg, FolderJob::tGetMessage, nullptr,
2135 "STRUCTURE", mMsgView->attachmentStrategy() );
2136 connect(mJob, TQ_SIGNAL(messageRetrieved(KMMessage*)),
2137 mMsgView, TQ_SLOT(slotMessageArrived(KMMessage*)));
2138 mJob->start();
2139 } else {
2140 mMsgView->setMsg(msg);
2141 }
2142 // reset HTML override to the folder setting
2143 mMsgView->setHtmlOverride(mFolderHtmlPref);
2144 mMsgView->setHtmlLoadExtDefault(mFolderHtmlLoadExtPref);
2145 mMsgView->setHtmlLoadExtOverride(false);
2146 mMsgView->setDecryptMessageOverwrite( false );
2147 mMsgView->setShowSignatureDetails( false );
2148}
2149
2150//-----------------------------------------------------------------------------
2151void KMMainWidget::slotMsgChanged()
2152{
2153 mHeaders->msgChanged();
2154}
2155
2156//-----------------------------------------------------------------------------
2157void KMMainWidget::slotSelectFolder(KMFolder* folder)
2158{
2159 TQListViewItem* item = mFolderTree->indexOfFolder(folder);
2160 if ( item ) {
2161 mFolderTree->ensureItemVisible( item );
2162 mFolderTree->doFolderSelected( item );
2163 }
2164}
2165
2166//-----------------------------------------------------------------------------
2167void KMMainWidget::slotSelectMessage(KMMessage* msg)
2168{
2169 int idx = mFolder->find(msg);
2170 if (idx != -1) {
2171 mHeaders->setCurrentMsg(idx);
2172 if (mMsgView)
2173 mMsgView->setMsg(msg);
2174 else
2175 slotMsgActivated(msg);
2176 }
2177}
2178
2179//-----------------------------------------------------------------------------
2180void KMMainWidget::slotReplaceMsgByUnencryptedVersion()
2181{
2182 kdDebug(5006) << "KMMainWidget::slotReplaceMsgByUnencryptedVersion()" << endl;
2183 KMMessage* oldMsg = mHeaders->currentMsg();
2184 if( oldMsg ) {
2185 kdDebug(5006) << "KMMainWidget - old message found" << endl;
2186 if( oldMsg->hasUnencryptedMsg() ) {
2187 kdDebug(5006) << "KMMainWidget - extra unencrypted message found" << endl;
2188 KMMessage* newMsg = oldMsg->unencryptedMsg();
2189 // adjust the message id
2190 {
2191 TQString msgId( oldMsg->msgId() );
2192 TQString prefix("DecryptedMsg.");
2193 int oldIdx = msgId.find(prefix, 0, false);
2194 if( -1 == oldIdx ) {
2195 int leftAngle = msgId.findRev( '<' );
2196 msgId = msgId.insert( (-1 == leftAngle) ? 0 : ++leftAngle, prefix );
2197 }
2198 else {
2199 // toggle between "DecryptedMsg." and "DeCryptedMsg."
2200 // to avoid same message id
2201 TQCharRef c = msgId[ oldIdx+2 ];
2202 if( 'C' == c )
2203 c = 'c';
2204 else
2205 c = 'C';
2206 }
2207 newMsg->setMsgId( msgId );
2208 mMsgView->setIdOfLastViewedMessage( msgId );
2209 }
2210 // insert the unencrypted message
2211 kdDebug(5006) << "KMMainWidget - adding unencrypted message to folder" << endl;
2212 mFolder->addMsg( newMsg );
2213 /* Figure out its index in the folder for selecting. This must be count()-1,
2214 * since we append. Be safe and do find, though, just in case. */
2215 int newMsgIdx = mFolder->find( newMsg );
2216 Q_ASSERT( newMsgIdx != -1 );
2217 /* we need this unget, to have the message displayed correctly initially */
2218 mFolder->unGetMsg( newMsgIdx );
2219 int idx = mFolder->find( oldMsg );
2220 Q_ASSERT( idx != -1 );
2221 /* only select here, so the old one is not un-Gotten before, which would
2222 * render the pointer we hold invalid so that find would fail */
2223 mHeaders->setCurrentItemByIndex( newMsgIdx );
2224 // remove the old one
2225 if ( idx != -1 ) {
2226 kdDebug(5006) << "KMMainWidget - deleting encrypted message" << endl;
2227 mFolder->take( idx );
2228 }
2229
2230 kdDebug(5006) << "KMMainWidget - updating message actions" << endl;
2231 updateMessageActions();
2232
2233 kdDebug(5006) << "KMMainWidget - done." << endl;
2234 } else
2235 kdDebug(5006) << "KMMainWidget - NO EXTRA UNENCRYPTED MESSAGE FOUND" << endl;
2236 } else
2237 kdDebug(5006) << "KMMainWidget - PANIC: NO OLD MESSAGE FOUND" << endl;
2238}
2239
2240//-----------------------------------------------------------------------------
2241void KMMainWidget::slotSetThreadStatusNew()
2242{
2243 mHeaders->setThreadStatus(KMMsgStatusNew);
2244}
2245
2246//-----------------------------------------------------------------------------
2247void KMMainWidget::slotSetThreadStatusUnread()
2248{
2249 mHeaders->setThreadStatus(KMMsgStatusUnread);
2250}
2251
2252//-----------------------------------------------------------------------------
2253void KMMainWidget::slotSetThreadStatusFlag()
2254{
2255 mHeaders->setThreadStatus(KMMsgStatusFlag, true);
2256}
2257
2258//-----------------------------------------------------------------------------
2259void KMMainWidget::slotSetThreadStatusRead()
2260{
2261 mHeaders->setThreadStatus(KMMsgStatusRead);
2262}
2263
2264//-----------------------------------------------------------------------------
2265void KMMainWidget::slotSetThreadStatusTodo()
2266{
2267 mHeaders->setThreadStatus(KMMsgStatusTodo, true);
2268}
2269
2270//-----------------------------------------------------------------------------
2271void KMMainWidget::slotSetThreadStatusWatched()
2272{
2273 mHeaders->setThreadStatus(KMMsgStatusWatched, true);
2274 if (mWatchThreadAction->isChecked()) {
2275 mIgnoreThreadAction->setChecked(false);
2276 }
2277}
2278
2279//-----------------------------------------------------------------------------
2280void KMMainWidget::slotSetThreadStatusIgnored()
2281{
2282 mHeaders->setThreadStatus(KMMsgStatusIgnored, true);
2283 if (mIgnoreThreadAction->isChecked()) {
2284 mWatchThreadAction->setChecked(false);
2285 }
2286}
2287
2288//-----------------------------------------------------------------------------
2289void KMMainWidget::slotNextMessage() { mHeaders->nextMessage(); }
2290void KMMainWidget::slotNextUnreadMessage()
2291{
2292 if ( !mHeaders->nextUnreadMessage() )
2293 if ( GlobalSettings::self()->loopOnGotoUnread() == GlobalSettings::EnumLoopOnGotoUnread::LoopInAllFolders )
2294 mFolderTree->nextUnreadFolder(true);
2295}
2296void KMMainWidget::slotNextImportantMessage() {
2297 //mHeaders->nextImportantMessage();
2298}
2299void KMMainWidget::slotPrevMessage() { mHeaders->prevMessage(); }
2300void KMMainWidget::slotPrevUnreadMessage()
2301{
2302 if ( !mHeaders->prevUnreadMessage() )
2303 if ( GlobalSettings::self()->loopOnGotoUnread() == GlobalSettings::EnumLoopOnGotoUnread::LoopInAllFolders )
2304 mFolderTree->prevUnreadFolder();
2305}
2306void KMMainWidget::slotPrevImportantMessage() {
2307 //mHeaders->prevImportantMessage();
2308}
2309
2310void KMMainWidget::slotDisplayCurrentMessage()
2311{
2312 if ( mHeaders->currentMsg() )
2313 slotMsgActivated( mHeaders->currentMsg() );
2314}
2315
2316//-----------------------------------------------------------------------------
2317void KMMainWidget::slotMsgActivated(KMMessage *msg)
2318{
2319 if ( !msg ) return;
2320 if ( msg->parent() && !msg->isComplete() ) {
2321 FolderJob *job = msg->parent()->createJob( msg );
2322 connect( job, TQ_SIGNAL( messageRetrieved( KMMessage* ) ),
2323 TQ_SLOT( slotMsgActivated( KMMessage* ) ) );
2324 job->start();
2325 return;
2326 }
2327
2328 if (kmkernel->folderIsDraftOrOutbox( mFolder ) ) {
2329 mMsgActions->editCurrentMessage();
2330 return;
2331 }
2332 if ( kmkernel->folderIsTemplates( mFolder ) ) {
2333 slotUseTemplate();
2334 return;
2335 }
2336
2337 assert(msg);
2338 KMReaderMainWin *win = new KMReaderMainWin( mFolderHtmlPref, mFolderHtmlLoadExtPref );
2339 TDEConfigGroup reader( KMKernel::config(), "Reader" );
2340 bool useFixedFont = mMsgView ? mMsgView->isFixedFont()
2341 : reader.readBoolEntry( "useFixedFont", false );
2342 win->setUseFixedFont( useFixedFont );
2343 KMMessage *newMessage = new KMMessage(*msg);
2344 newMessage->setParent( msg->parent() );
2345 newMessage->setMsgSerNum( msg->getMsgSerNum() );
2346 newMessage->setReadyToShow( true );
2347 win->showMsg( overrideEncoding(), newMessage );
2348 win->show();
2349}
2350
2351//-----------------------------------------------------------------------------
2352void KMMainWidget::slotMarkAll()
2353{
2354 mHeaders->selectAll( true );
2355}
2356
2357//-----------------------------------------------------------------------------
2358void KMMainWidget::slotMsgPopup(KMMessage&, const KURL &aUrl, const TQPoint& aPoint)
2359{
2360 TDEPopupMenu * menu = new TDEPopupMenu;
2361 updateMessageMenu();
2362 mUrlCurrent = aUrl;
2363
2364 bool urlMenuAdded = false;
2365
2366 if (!aUrl.isEmpty())
2367 {
2368 if (aUrl.protocol() == "mailto")
2369 {
2370 // popup on a mailto URL
2371 mMsgView->mailToComposeAction()->plug( menu );
2372 mMsgView->mailToReplyAction()->plug( menu );
2373 mMsgView->mailToForwardAction()->plug( menu );
2374
2375 menu->insertSeparator();
2376 mMsgView->addAddrBookAction()->plug( menu );
2377 mMsgView->openAddrBookAction()->plug( menu );
2378 mMsgView->copyURLAction()->plug( menu );
2379 mMsgView->startImChatAction()->plug( menu );
2380 // only enable if our KIMProxy is functional
2381 mMsgView->startImChatAction()->setEnabled( kmkernel->imProxy()->initialize() );
2382
2383 } else {
2384 // popup on a not-mailto URL
2385 mMsgView->urlOpenAction()->plug( menu );
2386 mMsgView->addBookmarksAction()->plug( menu );
2387 mMsgView->urlSaveAsAction()->plug( menu );
2388 mMsgView->copyURLAction()->plug( menu );
2389 }
2390 if ( aUrl.protocol() == "im" )
2391 {
2392 // popup on an IM address
2393 // no need to check the KIMProxy is initialized, as these protocols will
2394 // only be present if it is.
2395 mMsgView->startImChatAction()->plug( menu );
2396 }
2397
2398 urlMenuAdded=true;
2399 kdDebug( 0 ) << k_funcinfo << " URL is: " << aUrl << endl;
2400 }
2401
2402
2403 if(mMsgView && !mMsgView->copyText().isEmpty()) {
2404 if ( urlMenuAdded )
2405 menu->insertSeparator();
2406 mMsgActions->replyMenu()->plug(menu);
2407 menu->insertSeparator();
2408
2409 mMsgView->copyAction()->plug( menu );
2410 mMsgView->selectAllAction()->plug( menu );
2411 } else if ( !urlMenuAdded )
2412 {
2413 // popup somewhere else (i.e., not a URL) on the message
2414
2415 if (!mHeaders->currentMsg()) // no messages
2416 {
2417 delete menu;
2418 return;
2419 }
2420
2421
2422 if ( mFolder->isTemplates() ) {
2423 mUseAction->plug( menu );
2424 } else {
2425 mMsgActions->replyMenu()->plug( menu );
2426 mForwardActionMenu->plug( menu );
2427 }
2428 editAction()->plug(menu);
2429 menu->insertSeparator();
2430
2431 mCopyActionMenu->plug( menu );
2432 mMoveActionMenu->plug( menu );
2433
2434 menu->insertSeparator();
2435
2436 mMsgActions->messageStatusMenu()->plug( menu );
2437 menu->insertSeparator();
2438
2439 viewSourceAction()->plug(menu);
2440 if(mMsgView) {
2441 mMsgView->toggleFixFontAction()->plug(menu);
2442 mMsgView->toggleMimePartTreeAction()->plug(menu);
2443 }
2444 menu->insertSeparator();
2445 mPrintAction->plug( menu );
2446 mSaveAsAction->plug( menu );
2447 mSaveAttachmentsAction->plug( menu );
2448
2449 menu->insertSeparator();
2450 if( mFolder->isTrash() )
2451 mDeleteAction->plug( menu );
2452 else
2453 mTrashAction->plug( menu );
2454
2455 menu->insertSeparator();
2456 mMsgActions->createTodoAction()->plug( menu );
2457 }
2458 TDEAcceleratorManager::manage(menu);
2459 menu->exec(aPoint, 0);
2460 delete menu;
2461}
2462
2463//-----------------------------------------------------------------------------
2464void KMMainWidget::getAccountMenu()
2465{
2466 TQStringList actList;
2467
2468 mActMenu->clear();
2469 actList = kmkernel->acctMgr()->getAccounts();
2470 TQStringList::Iterator it;
2471 int id = 0;
2472 for(it = actList.begin(); it != actList.end() ; ++it, id++)
2473 mActMenu->insertItem((*it).replace("&", "&&"), id);
2474}
2475
2476//-----------------------------------------------------------------------------
2477void KMMainWidget::getTransportMenu()
2478{
2479 TQStringList availTransports;
2480
2481 mSendMenu->clear();
2482 availTransports = KMail::TransportManager::transportNames();
2483 TQStringList::Iterator it;
2484 int id = 0;
2485 for(it = availTransports.begin(); it != availTransports.end() ; ++it, id++)
2486 mSendMenu->insertItem((*it).replace("&", "&&"), id);
2487}
2488
2489//-----------------------------------------------------------------------------
2490void KMMainWidget::updateCustomTemplateMenus()
2491{
2492 if ( !mCustomTemplateActions.isEmpty() ) {
2493 TQPtrList<TDEAction>::iterator ait = mCustomTemplateActions.begin();
2494 for ( ; ait != mCustomTemplateActions.end() ; ++ait ) {
2495 (*ait)->unplugAll();
2496 delete (*ait);
2497 }
2498 mCustomTemplateActions.clear();
2499 }
2500
2501 delete mCustomReplyActionMenu;
2502 delete mCustomReplyAllActionMenu;
2503 delete mCustomForwardActionMenu;
2504
2505 delete mCustomReplyMapper;
2506 delete mCustomReplyAllMapper;
2507 delete mCustomForwardMapper;
2508
2509 mCustomForwardActionMenu =
2510 new TDEActionMenu( i18n("Forward With Custom Template"),
2511 "mail_custom_forward",
2512 actionCollection(), "custom_forward" );
2513 TQSignalMapper *mCustomForwardMapper = new TQSignalMapper( this );
2514 connect( mCustomForwardMapper, TQ_SIGNAL( mapped( int ) ),
2515 this, TQ_SLOT( slotCustomForwardMsg( int ) ) );
2516 mForwardActionMenu->insert( mCustomForwardActionMenu );
2517
2518 mCustomReplyActionMenu =
2519 new TDEActionMenu( i18n("Reply With Custom Template"), "mail_custom_reply",
2520 actionCollection(), "custom_reply" );
2521 TQSignalMapper *mCustomReplyMapper = new TQSignalMapper( this );
2522 connect( mCustomReplyMapper, TQ_SIGNAL( mapped( int ) ),
2523 this, TQ_SLOT( slotCustomReplyToMsg( int ) ) );
2524 mMsgActions->replyMenu()->insert( mCustomReplyActionMenu );
2525
2526 mCustomReplyAllActionMenu =
2527 new TDEActionMenu( i18n("Reply to All With Custom Template"),
2528 "mail_custom_reply_all",
2529 actionCollection(), "custom_reply_all" );
2530 TQSignalMapper *mCustomReplyAllMapper = new TQSignalMapper( this );
2531 connect( mCustomReplyAllMapper, TQ_SIGNAL( mapped( int ) ),
2532 this, TQ_SLOT( slotCustomReplyAllToMsg( int ) ) );
2533 mMsgActions->replyMenu()->insert( mCustomReplyAllActionMenu );
2534
2535 mCustomTemplates.clear();
2536
2537 TQStringList list = GlobalSettingsBase::self()->customTemplates();
2538 TQStringList::iterator it = list.begin();
2539 int idx = 0;
2540 int replyc = 0;
2541 int replyallc = 0;
2542 int forwardc = 0;
2543 for ( ; it != list.end(); ++it ) {
2544 CTemplates t( *it );
2545 mCustomTemplates.append( *it );
2546
2547 TDEAction *action;
2548 switch ( t.type() ) {
2549 case CustomTemplates::TReply:
2550 action = new TDEAction( (*it).replace( "&", "&&" ),
2551 TDEShortcut( t.shortcut() ),
2552 mCustomReplyMapper,
2553 TQ_SLOT( map() ),
2554 actionCollection(),
2555 (*it).utf8() );
2556 mCustomReplyMapper->setMapping( action, idx );
2557 mCustomReplyActionMenu->insert( action, idx );
2558 mCustomTemplateActions.append( action );
2559 ++replyc;
2560 break;
2561 case CustomTemplates::TReplyAll:
2562 action = new TDEAction( (*it).replace( "&", "&&" ),
2563 TDEShortcut( t.shortcut() ),
2564 mCustomReplyAllMapper,
2565 TQ_SLOT( map() ),
2566 actionCollection(),
2567 (*it).utf8() );
2568 mCustomReplyAllMapper->setMapping( action, idx );
2569 mCustomReplyAllActionMenu->insert( action, idx );
2570 mCustomTemplateActions.append( action );
2571 ++replyallc;
2572 break;
2573 case CustomTemplates::TForward:
2574 action = new TDEAction( (*it).replace( "&", "&&" ),
2575 TDEShortcut( t.shortcut() ),
2576 mCustomForwardMapper,
2577 TQ_SLOT( map() ),
2578 actionCollection(),
2579 (*it).utf8() );
2580 mCustomForwardMapper->setMapping( action, idx );
2581 mCustomForwardActionMenu->insert( action, idx );
2582 mCustomTemplateActions.append( action );
2583 ++forwardc;
2584 break;
2585 case CustomTemplates::TUniversal:
2586 action = new TDEAction( (*it).replace( "&", "&&" ),
2587 TDEShortcut::null(),
2588 mCustomReplyMapper,
2589 TQ_SLOT( map() ),
2590 actionCollection(),
2591 (*it).utf8() );
2592 mCustomReplyMapper->setMapping( action, idx );
2593 mCustomReplyActionMenu->insert( action, idx );
2594 mCustomTemplateActions.append( action );
2595 ++replyc;
2596 action = new TDEAction( (*it).replace( "&", "&&" ),
2597 TDEShortcut::null(),
2598 mCustomReplyAllMapper,
2599 TQ_SLOT( map() ),
2600 actionCollection(),
2601 (*it).utf8() );
2602 mCustomReplyAllMapper->setMapping( action, idx );
2603 mCustomReplyAllActionMenu->insert( action, idx );
2604 mCustomTemplateActions.append( action );
2605 ++replyallc;
2606 action = new TDEAction( (*it).replace( "&", "&&" ),
2607 TDEShortcut::null(),
2608 mCustomForwardMapper,
2609 TQ_SLOT( map() ),
2610 actionCollection(),
2611 (*it).utf8() );
2612 mCustomForwardMapper->setMapping( action, idx );
2613 mCustomForwardActionMenu->insert( action, idx );
2614 mCustomTemplateActions.append( action );
2615 ++forwardc;
2616 break;
2617 }
2618
2619 ++idx;
2620 }
2621 if ( !replyc ) {
2622 mCustomReplyActionMenu->popupMenu()->insertItem( i18n( "(no custom templates)" ), 0 );
2623 mCustomReplyActionMenu->popupMenu()->setItemEnabled( 0, false );
2624 mCustomReplyActionMenu->setEnabled(false);
2625 }
2626 if ( !replyallc ) {
2627 mCustomReplyAllActionMenu->popupMenu()->insertItem( i18n( "(no custom templates)" ), 0 );
2628 mCustomReplyAllActionMenu->popupMenu()->setItemEnabled( 0, false );
2629 mCustomReplyAllActionMenu->setEnabled(false);
2630 }
2631 if ( !forwardc ) {
2632 mCustomForwardActionMenu->popupMenu()->insertItem( i18n( "(no custom templates)" ), 0 );
2633 mCustomForwardActionMenu->popupMenu()->setItemEnabled( 0, false );
2634 mCustomForwardActionMenu->setEnabled(false);
2635 }
2636
2637}
2638
2639
2640//-----------------------------------------------------------------------------
2641void KMMainWidget::setupActions()
2642{
2643 mMsgActions = new KMail::MessageActions( actionCollection(), this );
2644 mMsgActions->setMessageView( mMsgView );
2645
2646 //----- File Menu
2647 mSaveAsAction = new TDEAction( i18n("Save &As..."), "document-save",
2648 TDEStdAccel::shortcut(TDEStdAccel::Save),
2649 this, TQ_SLOT(slotSaveMsg()), actionCollection(), "file_save_as" );
2650
2651 mOpenAction = KStdAction::open( this, TQ_SLOT( slotOpenMsg() ),
2652 actionCollection() );
2653
2654 (void) new TDEAction( i18n("&Compact All Folders"), 0,
2655 this, TQ_SLOT(slotCompactAll()),
2656 actionCollection(), "compact_all_folders" );
2657
2658 (void) new TDEAction( i18n("&Expire All Folders"), 0,
2659 this, TQ_SLOT(slotExpireAll()),
2660 actionCollection(), "expire_all_folders" );
2661
2662 (void) new TDEAction( i18n("&Refresh Local IMAP Cache"), "refresh",
2663 this, TQ_SLOT(slotInvalidateIMAPFolders()),
2664 actionCollection(), "file_invalidate_imap_cache" );
2665
2666 (void) new TDEAction( i18n("Empty All &Trash Folders"), 0,
2667 KMKernel::self(), TQ_SLOT(slotEmptyTrash()),
2668 actionCollection(), "empty_trash" );
2669
2670 (void) new TDEAction( i18n("Check &Mail"), "mail_get", CTRL+Key_L,
2671 this, TQ_SLOT(slotCheckMail()),
2672 actionCollection(), "check_mail" );
2673
2674 mFavoritesCheckMailAction = new TDEAction( i18n("Check Mail in Favorite Folders"),
2675 "mail_get", CTRL+SHIFT+Key_L, nullptr, nullptr,
2676 actionCollection(), "favorite_check_mail" );
2677 if ( mFavoriteFolderView )
2678 connect( mFavoritesCheckMailAction, TQ_SIGNAL(activated()), mFavoriteFolderView, TQ_SLOT(checkMail()) );
2679
2680 TDEActionMenu *actActionMenu = new
2681 TDEActionMenu( i18n("Check Mail &In"), "mail_get", actionCollection(),
2682 "check_mail_in" );
2683 actActionMenu->setDelayed(true); //needed for checking "all accounts"
2684
2685 connect(actActionMenu,TQ_SIGNAL(activated()),this,TQ_SLOT(slotCheckMail()));
2686
2687 mActMenu = actActionMenu->popupMenu();
2688 connect(mActMenu,TQ_SIGNAL(activated(int)),this,TQ_SLOT(slotCheckOneAccount(int)));
2689 connect(mActMenu,TQ_SIGNAL(aboutToShow()),this,TQ_SLOT(getAccountMenu()));
2690
2691 (void) new TDEAction( i18n("&Send Queued Messages"), "mail-send", 0, this,
2692 TQ_SLOT(slotSendQueued()), actionCollection(), "send_queued");
2693
2694 (void) new TDEAction( i18n("Online Status (unknown)"), "online_status", 0, this,
2695 TQ_SLOT(slotOnlineStatus()), actionCollection(), "online_status");
2696
2697 TDEActionMenu *sendActionMenu = new
2698 TDEActionMenu( i18n("Send Queued Messages Via"), "mail_send_via", actionCollection(),
2699 "send_queued_via" );
2700 sendActionMenu->setDelayed(true);
2701
2702 mSendMenu = sendActionMenu->popupMenu();
2703 connect(mSendMenu,TQ_SIGNAL(activated(int)), this, TQ_SLOT(slotSendQueuedVia(int)));
2704 connect(mSendMenu,TQ_SIGNAL(aboutToShow()),this,TQ_SLOT(getTransportMenu()));
2705
2706 TDEAction *act;
2707 //----- Tools menu
2708 if (parent()->inherits("KMMainWin")) {
2709 act = new TDEAction( i18n("&Address Book..."), "contents", 0, this,
2710 TQ_SLOT(slotAddrBook()), actionCollection(), "addressbook" );
2711 if (TDEStandardDirs::findExe("kaddressbook").isEmpty()) act->setEnabled(false);
2712 }
2713
2714 act = new TDEAction( i18n("Certificate Manager..."), "pgp-keys", 0, this,
2715 TQ_SLOT(slotStartCertManager()), actionCollection(), "tools_start_certman");
2716 // disable action if no certman binary is around
2717 if (TDEStandardDirs::findExe("kleopatra").isEmpty()) act->setEnabled(false);
2718
2719 act = new TDEAction( i18n("GnuPG Log Viewer..."), "pgp-keys", 0, this,
2720 TQ_SLOT(slotStartWatchGnuPG()), actionCollection(), "tools_start_kwatchgnupg");
2721 // disable action if no kwatchgnupg binary is around
2722 if (TDEStandardDirs::findExe("kwatchgnupg").isEmpty()) act->setEnabled(false);
2723
2724 act = new TDEAction( i18n("&Import Messages..."), "document-open", 0, this,
2725 TQ_SLOT(slotImport()), actionCollection(), "import" );
2726 if (TDEStandardDirs::findExe("kmailcvt").isEmpty()) act->setEnabled(false);
2727
2728#if !defined(NDEBUG)
2729 (void) new TDEAction( i18n("&Debug Sieve..."),
2730 "idea", 0, this, TQ_SLOT(slotDebugSieve()),
2731 actionCollection(), "tools_debug_sieve" );
2732#endif
2733
2734 if ( GlobalSettings::allowOutOfOfficeSettings() ) {
2735 (void) new TDEAction( i18n("Edit \"Out of Office\" Replies..."),
2736 "configure", 0, this, TQ_SLOT(slotEditVacation()),
2737 actionCollection(), "tools_edit_vacation" );
2738
2739 }
2740
2741 (void) new TDEAction( i18n("Filter &Log Viewer..."), 0, this,
2742 TQ_SLOT(slotFilterLogViewer()), actionCollection(), "filter_log_viewer" );
2743
2744 (void) new TDEAction( i18n("&Anti-Spam Wizard..."), 0, this,
2745 TQ_SLOT(slotAntiSpamWizard()), actionCollection(), "antiSpamWizard" );
2746 (void) new TDEAction( i18n("&Anti-Virus Wizard..."), 0, this,
2747 TQ_SLOT(slotAntiVirusWizard()), actionCollection(), "antiVirusWizard" );
2748
2749 //----- Edit Menu
2750 mTrashAction = new TDEAction( KGuiItem( i18n("&Move to Trash"), "edittrash",
2751 i18n("Move message to trashcan") ),
2752 Key_Delete, this, TQ_SLOT(slotTrashMsg()),
2753 actionCollection(), "move_to_trash" );
2754
2755 /* The delete action is nowhere in the gui, by default, so we need to make
2756 * sure it is plugged into the TDEAccel now, since that won't happen on
2757 * XMLGui construction or manual ->plug(). This is only a problem when run
2758 * as a part, though. */
2759 mDeleteAction = new TDEAction( i18n("&Delete"), "edit-delete", SHIFT+Key_Delete, this,
2760 TQ_SLOT(slotDeleteMsg()), actionCollection(), "delete" );
2761 mDeleteAction->plugAccel( actionCollection()->tdeaccel() );
2762
2763 mTrashThreadAction = new TDEAction( KGuiItem( i18n("M&ove Thread to Trash"), "edittrash",
2764 i18n("Move thread to trashcan") ),
2765 CTRL+Key_Delete, this, TQ_SLOT(slotTrashThread()),
2766 actionCollection(), "move_thread_to_trash" );
2767
2768 mDeleteThreadAction = new TDEAction( i18n("Delete T&hread"), "edit-delete", CTRL+SHIFT+Key_Delete, this,
2769 TQ_SLOT(slotDeleteThread()), actionCollection(), "delete_thread" );
2770
2771
2772 (void) new TDEAction( i18n("&Find Messages..."), "mail_find", Key_S, this,
2773 TQ_SLOT(slotRequestFullSearchFromQuickSearch()), actionCollection(), "search_messages" );
2774
2775 mFindInMessageAction = new TDEAction( i18n("&Find in Message..."), "edit-find", TDEStdAccel::shortcut(TDEStdAccel::Find), this,
2776 TQ_SLOT(slotFind()), actionCollection(), "find_in_messages" );
2777
2778 (void) new TDEAction( i18n("Select &All Messages"), TDEStdAccel::selectAll(), this,
2779 TQ_SLOT(slotMarkAll()), actionCollection(), "mark_all_messages" );
2780
2781 //----- Folder Menu
2782 mNewFolderAction = new TDEAction( i18n("&New Folder..."), "folder-new", 0, mFolderTree,
2783 TQ_SLOT(addChildFolder()), actionCollection(), "new_folder" );
2784
2785 mModifyFolderAction = new TDEAction( i18n("&Properties"), "configure", 0, this,
2786 TQ_SLOT(slotModifyFolder()), actionCollection(), "modify" );
2787
2788 mFolderMailingListPropertiesAction = new TDEAction( i18n("&Mailing List Management..."),
2789 /*"folder_mailinglist_properties",*/ 0, this, TQ_SLOT( slotFolderMailingListProperties() ),
2790 actionCollection(), "folder_mailinglist_properties" );
2791
2792 mFolderShortCutCommandAction = new TDEAction( i18n("&Assign Shortcut..."), "configure_shortcuts",
2793 0, this, TQ_SLOT( slotFolderShortcutCommand() ), actionCollection(),
2794 "folder_shortcut_command" );
2795
2796
2797 mMarkAllAsReadAction = new TDEAction( i18n("Mark All Messages as &Read"), "goto", 0, this,
2798 TQ_SLOT(slotMarkAllAsRead()), actionCollection(), "mark_all_as_read" );
2799
2800 mExpireFolderAction = new TDEAction(i18n("&Expiration Settings"), 0, this, TQ_SLOT(slotExpireFolder()),
2801 actionCollection(), "expire");
2802
2803 mCompactFolderAction = new TDEAction( i18n("&Compact Folder"), 0, this,
2804 TQ_SLOT(slotCompactFolder()), actionCollection(), "compact" );
2805
2806 mRefreshFolderAction = new TDEAction( i18n("Check Mail &in This Folder"), "reload",
2807 TDEStdAccel::shortcut( TDEStdAccel::Reload ), this,
2808 TQ_SLOT(slotRefreshFolder()),
2809 actionCollection(), "refresh_folder" );
2810 mTroubleshootFolderAction = nullptr; // set in initializeIMAPActions
2811
2812 mEmptyFolderAction = new TDEAction( "foo" /*set in updateFolderMenu*/, "edittrash", 0, this,
2813 TQ_SLOT(slotEmptyFolder()), actionCollection(), "empty" );
2814
2815 mRemoveFolderAction = new TDEAction( "foo" /*set in updateFolderMenu*/, "edit-delete", 0, this,
2816 TQ_SLOT(slotRemoveFolder()), actionCollection(), "delete_folder" );
2817
2818 mArchiveFolderAction = new TDEAction( i18n( "&Archive Folder..." ), "document-save", 0, this,
2819 TQ_SLOT( slotArchiveFolder() ), actionCollection(),
2820 "archive_folder" );
2821
2822 mPreferHtmlAction = new TDEToggleAction( i18n("Prefer &HTML to Plain Text"), 0, this,
2823 TQ_SLOT(slotOverrideHtml()), actionCollection(), "prefer_html" );
2824
2825 mPreferHtmlLoadExtAction = new TDEToggleAction( i18n("Load E&xternal References"), 0, this,
2826 TQ_SLOT(slotOverrideHtmlLoadExt()), actionCollection(), "prefer_html_external_refs" );
2827
2828 mThreadMessagesAction = new TDEToggleAction( i18n("&Thread Messages"), 0, this,
2829 TQ_SLOT(slotOverrideThread()), actionCollection(), "thread_messages" );
2830
2831 mThreadBySubjectAction = new TDEToggleAction( i18n("Thread Messages also by &Subject"), 0, this,
2832 TQ_SLOT(slotToggleSubjectThreading()), actionCollection(), "thread_messages_by_subject" );
2833
2834 new TDEAction( i18n("Copy Folder"), "edit-copy", SHIFT+CTRL+Key_C, folderTree(),
2835 TQ_SLOT(copyFolder()), actionCollection(), "copy_folder" );
2836 new TDEAction( i18n("Cut Folder"), "edit-cut", SHIFT+CTRL+Key_X, folderTree(),
2837 TQ_SLOT(cutFolder()), actionCollection(), "cut_folder" );
2838 new TDEAction( i18n("Paste Folder"), "edit-paste", SHIFT+CTRL+Key_V, folderTree(),
2839 TQ_SLOT(pasteFolder()), actionCollection(), "paste_folder" );
2840
2841 new TDEAction( i18n("Copy Messages"), "edit-copy", ALT+CTRL+Key_C, headers(),
2842 TQ_SLOT(copyMessages()), actionCollection(), "copy_messages" );
2843 new TDEAction( i18n("Cut Messages"), "edit-cut", ALT+CTRL+Key_X, headers(),
2844 TQ_SLOT(cutMessages()), actionCollection(), "cut_messages" );
2845 new TDEAction( i18n("Paste Messages"), "edit-paste", ALT+CTRL+Key_V, headers(),
2846 TQ_SLOT(pasteMessages()), actionCollection(), "paste_messages" );
2847
2848 //----- Message Menu
2849 (void) new TDEAction( i18n("&New Message..."), "mail-message-new", TDEStdAccel::shortcut(TDEStdAccel::New), this,
2850 TQ_SLOT(slotCompose()), actionCollection(), "new_message" );
2851 mTemplateMenu =
2852 new TDEActionMenu( i18n("New Message From &Template"), "document-new",
2853 actionCollection(), "new_from_template" );
2854 mTemplateMenu->setDelayed( true );
2855 connect( mTemplateMenu->popupMenu(), TQ_SIGNAL( aboutToShow() ), this,
2856 TQ_SLOT( slotShowNewFromTemplate() ) );
2857 connect( mTemplateMenu->popupMenu(), TQ_SIGNAL( activated(int) ), this,
2858 TQ_SLOT( slotNewFromTemplate(int) ) );
2859
2860 TDEAction* newToML = new TDEAction( i18n("New Message t&o Mailing-List..."), "mail_post_to",
2861 CTRL+SHIFT+Key_N, this,
2862 TQ_SLOT(slotPostToML()), actionCollection(), "post_message" );
2863 newToML->plugAccel( actionCollection()->tdeaccel() );
2864
2865 mForwardActionMenu = new TDEActionMenu( i18n("Message->","&Forward"),
2866 "mail-forward", actionCollection(),
2867 "message_forward" );
2868
2869 mForwardInlineAction = new TDEAction( i18n("&Inline..."),
2870 "mail-forward", 0, this,
2871 TQ_SLOT(slotForwardInlineMsg()),
2872 actionCollection(),
2873 "message_forward_inline" );
2874
2875 mForwardAttachedAction = new TDEAction( i18n("Message->Forward->","As &Attachment..."),
2876 "mail-forward", 0, this,
2877 TQ_SLOT(slotForwardAttachedMsg()),
2878 actionCollection(),
2879 "message_forward_as_attachment" );
2880
2881 mForwardDigestAction = new TDEAction( i18n("Message->Forward->","As Di&gest..."),
2882 "mail-forward", 0, this,
2883 TQ_SLOT(slotForwardDigestMsg()),
2884 actionCollection(),
2885 "message_forward_as_digest" );
2886
2887 mRedirectAction = new TDEAction( i18n("Message->Forward->","&Redirect..."),
2888 "mail-forward", Key_E, this,
2889 TQ_SLOT(slotRedirectMsg()),
2890 actionCollection(),
2891 "message_forward_redirect" );
2892
2893
2894 setupForwardActions();
2895
2896 mForwardActionMenu->insert( mForwardDigestAction );
2897 mForwardActionMenu->insert( mRedirectAction );
2898
2899 mSendAgainAction = new TDEAction( i18n("Send A&gain..."), 0, this,
2900 TQ_SLOT(slotResendMsg()), actionCollection(), "send_again" );
2901
2902
2903 //----- Create filter actions
2904 mFilterMenu = new TDEActionMenu( i18n("&Create Filter"), "filter", actionCollection(), "create_filter" );
2905 connect( mFilterMenu, TQ_SIGNAL(activated()), this,
2906 TQ_SLOT(slotFilter()) );
2907 mSubjectFilterAction = new TDEAction( i18n("Filter on &Subject..."), 0, this,
2908 TQ_SLOT(slotSubjectFilter()),
2909 actionCollection(), "subject_filter");
2910 mFilterMenu->insert( mSubjectFilterAction );
2911
2912 mFromFilterAction = new TDEAction( i18n("Filter on &From..."), 0, this,
2913 TQ_SLOT(slotFromFilter()),
2914 actionCollection(), "from_filter");
2915 mFilterMenu->insert( mFromFilterAction );
2916
2917 mToFilterAction = new TDEAction( i18n("Filter on &To..."), 0, this,
2918 TQ_SLOT(slotToFilter()),
2919 actionCollection(), "to_filter");
2920 mFilterMenu->insert( mToFilterAction );
2921
2922 mListFilterAction = new TDEAction( i18n("Filter on Mailing-&List..."), 0, this,
2923 TQ_SLOT(slotMailingListFilter()), actionCollection(),
2924 "mlist_filter");
2925 mFilterMenu->insert( mListFilterAction );
2926
2927 mPrintAction = KStdAction::print (this, TQ_SLOT(slotPrintMsg()), actionCollection());
2928
2929 mUseAction = new TDEAction( i18n("New Message From &Template"), "document-new",
2930 Key_N, this, TQ_SLOT( slotUseTemplate() ),
2931 actionCollection(), "use_template" );
2932 mUseAction->plugAccel( actionCollection()->tdeaccel() );
2933
2934 //----- "Mark Thread" submenu
2935 mThreadStatusMenu = new TDEActionMenu ( i18n( "Mark &Thread" ),
2936 actionCollection(), "thread_status" );
2937
2938 mMarkThreadAsReadAction = new TDEAction(KGuiItem(i18n("Mark Thread as &Read"), "kmmsgread",
2939 i18n("Mark all messages in the selected thread as read")),
2940 0, this, TQ_SLOT(slotSetThreadStatusRead()),
2941 actionCollection(), "thread_read");
2942 mThreadStatusMenu->insert( mMarkThreadAsReadAction );
2943
2944 mMarkThreadAsNewAction = new TDEAction(KGuiItem(i18n("Mark Thread as &New"), "kmmsgnew",
2945 i18n("Mark all messages in the selected thread as new")),
2946 0, this, TQ_SLOT(slotSetThreadStatusNew()),
2947 actionCollection(), "thread_new");
2948 mThreadStatusMenu->insert( mMarkThreadAsNewAction );
2949
2950 mMarkThreadAsUnreadAction = new TDEAction(KGuiItem(i18n("Mark Thread as &Unread"), "kmmsgunseen",
2951 i18n("Mark all messages in the selected thread as unread")),
2952 0, this, TQ_SLOT(slotSetThreadStatusUnread()),
2953 actionCollection(), "thread_unread");
2954 mThreadStatusMenu->insert( mMarkThreadAsUnreadAction );
2955
2956 mThreadStatusMenu->insert( new TDEActionSeparator( this ) );
2957
2958 //----- "Mark Thread" toggle actions
2959 mToggleThreadFlagAction = new TDEToggleAction(i18n("Mark Thread as &Important"), "mail_flag",
2960 0, this, TQ_SLOT(slotSetThreadStatusFlag()),
2961 actionCollection(), "thread_flag");
2962 mToggleThreadFlagAction->setCheckedState( i18n("Remove &Important Thread Mark") );
2963 mThreadStatusMenu->insert( mToggleThreadFlagAction );
2964
2965 mToggleThreadTodoAction = new TDEToggleAction(i18n("Mark Thread as &Action Item"), "mail_todo",
2966 0, this, TQ_SLOT(slotSetThreadStatusTodo()),
2967 actionCollection(), "thread_todo");
2968 mToggleThreadTodoAction->setCheckedState( i18n("Remove &Action Item Thread Mark") );
2969 mThreadStatusMenu->insert( mToggleThreadTodoAction );
2970
2971 //------- "Watch and ignore thread" actions
2972 mWatchThreadAction = new TDEToggleAction(i18n("&Watch Thread"), "kmmsgwatched",
2973 0, this, TQ_SLOT(slotSetThreadStatusWatched()),
2974 actionCollection(), "thread_watched");
2975
2976 mIgnoreThreadAction = new TDEToggleAction(i18n("&Ignore Thread"), "mail_ignore",
2977 0, this, TQ_SLOT(slotSetThreadStatusIgnored()),
2978 actionCollection(), "thread_ignored");
2979
2980 mThreadStatusMenu->insert( new TDEActionSeparator( this ) );
2981 mThreadStatusMenu->insert( mWatchThreadAction );
2982 mThreadStatusMenu->insert( mIgnoreThreadAction );
2983
2984 mSaveAttachmentsAction = new TDEAction( i18n("Save A&ttachments..."), "attach",
2985 0, this, TQ_SLOT(slotSaveAttachments()),
2986 actionCollection(), "file_save_attachments" );
2987
2988 mMoveActionMenu = new TDEActionMenu( i18n("&Move To" ),
2989 actionCollection(), "move_to" );
2990
2991 mCopyActionMenu = new TDEActionMenu( i18n("&Copy To" ),
2992 actionCollection(), "copy_to" );
2993
2994 mApplyAllFiltersAction = new TDEAction( i18n("Appl&y All Filters"), "filter",
2995 CTRL+Key_J, this,
2996 TQ_SLOT(slotApplyFilters()),
2997 actionCollection(), "apply_filters" );
2998
2999 mApplyFilterActionsMenu = new TDEActionMenu( i18n("A&pply Filter" ),
3000 actionCollection(),
3001 "apply_filter_actions" );
3002
3003 //----- View Menu
3004 // Unread Submenu
3005 TDEActionMenu * unreadMenu =
3006 new TDEActionMenu( i18n("View->", "&Unread Count"),
3007 actionCollection(), "view_unread" );
3008 unreadMenu->setToolTip( i18n("Choose how to display the count of unread messages") );
3009
3010 mUnreadColumnToggle = new TDERadioAction( i18n("View->Unread Count", "View in &Separate Column"), 0, this,
3011 TQ_SLOT(slotToggleUnread()),
3012 actionCollection(), "view_unread_column" );
3013 mUnreadColumnToggle->setExclusiveGroup( "view_unread_group" );
3014 unreadMenu->insert( mUnreadColumnToggle );
3015
3016 mUnreadTextToggle = new TDERadioAction( i18n("View->Unread Count", "View After &Folder Name"), 0, this,
3017 TQ_SLOT(slotToggleUnread()),
3018 actionCollection(), "view_unread_text" );
3019 mUnreadTextToggle->setExclusiveGroup( "view_unread_group" );
3020 unreadMenu->insert( mUnreadTextToggle );
3021
3022 // toggle for total column
3023 mTotalColumnToggle = new TDEToggleAction( i18n("View->", "&Total Column"), 0, this,
3024 TQ_SLOT(slotToggleTotalColumn()),
3025 actionCollection(), "view_columns_total" );
3026 mTotalColumnToggle->setToolTip( i18n("Toggle display of column showing the "
3027 "total number of messages in folders.") );
3028 mSizeColumnToggle = new TDEToggleAction( i18n("View->", "&Size Column"), 0, this,
3029 TQ_SLOT(slotToggleSizeColumn()),
3030 actionCollection(), "view_columns_size" );
3031 mSizeColumnToggle->setToolTip( i18n("Toggle display of column showing the "
3032 "total size of messages in folders.") );
3033
3034 (void)new TDEAction( KGuiItem( i18n("View->","&Expand Thread"), TQString(),
3035 i18n("Expand the current thread") ),
3036 Key_Period, this,
3037 TQ_SLOT(slotExpandThread()),
3038 actionCollection(), "expand_thread" );
3039
3040 (void)new TDEAction( KGuiItem( i18n("View->","&Collapse Thread"), TQString(),
3041 i18n("Collapse the current thread") ),
3042 Key_Comma, this,
3043 TQ_SLOT(slotCollapseThread()),
3044 actionCollection(), "collapse_thread" );
3045
3046 (void)new TDEAction( KGuiItem( i18n("View->","Ex&pand All Threads"), TQString(),
3047 i18n("Expand all threads in the current folder") ),
3048 CTRL+Key_Period, this,
3049 TQ_SLOT(slotExpandAllThreads()),
3050 actionCollection(), "expand_all_threads" );
3051
3052 (void)new TDEAction( KGuiItem( i18n("View->","C&ollapse All Threads"), TQString(),
3053 i18n("Collapse all threads in the current folder") ),
3054 CTRL+Key_Comma, this,
3055 TQ_SLOT(slotCollapseAllThreads()),
3056 actionCollection(), "collapse_all_threads" );
3057
3058 mViewSourceAction = new TDEAction( i18n("&View Source"), Key_V, this,
3059 TQ_SLOT(slotShowMsgSrc()), actionCollection(),
3060 "view_source" );
3061
3062 TDEAction* dukeOfMonmoth = new TDEAction( i18n("&Display Message"), Key_Return, this,
3063 TQ_SLOT( slotDisplayCurrentMessage() ), actionCollection(),
3064 "display_message" );
3065 dukeOfMonmoth->plugAccel( actionCollection()->tdeaccel() );
3066
3067 //----- Go Menu
3068 new TDEAction( KGuiItem( i18n("&Next Message"), TQString(),
3069 i18n("Go to the next message") ),
3070 "N;Right", this, TQ_SLOT(slotNextMessage()),
3071 actionCollection(), "go_next_message" );
3072
3073 new TDEAction( KGuiItem( i18n("Next &Unread Message"),
3074 TQApplication::reverseLayout() ? "go-previous" : "go-next",
3075 i18n("Go to the next unread message") ),
3076 Key_Plus, this, TQ_SLOT(slotNextUnreadMessage()),
3077 actionCollection(), "go_next_unread_message" );
3078
3079 /* ### needs better support from folders:
3080 new TDEAction( KGuiItem( i18n("Next &Important Message"), TQString(),
3081 i18n("Go to the next important message") ),
3082 0, this, TQ_SLOT(slotNextImportantMessage()),
3083 actionCollection(), "go_next_important_message" );
3084 */
3085
3086 new TDEAction( KGuiItem( i18n("&Previous Message"), TQString(),
3087 i18n("Go to the previous message") ),
3088 "P;Left", this, TQ_SLOT(slotPrevMessage()),
3089 actionCollection(), "go_prev_message" );
3090
3091 new TDEAction( KGuiItem( i18n("Previous Unread &Message"),
3092 TQApplication::reverseLayout() ? "go-next" : "go-previous",
3093 i18n("Go to the previous unread message") ),
3094 Key_Minus, this, TQ_SLOT(slotPrevUnreadMessage()),
3095 actionCollection(), "go_prev_unread_message" );
3096
3097 /* needs better support from folders:
3098 new TDEAction( KGuiItem( i18n("Previous I&mportant Message"), TQString(),
3099 i18n("Go to the previous important message") ),
3100 0, this, TQ_SLOT(slotPrevImportantMessage()),
3101 actionCollection(), "go_prev_important_message" );
3102 */
3103
3104 TDEAction *action =
3105 new TDEAction( KGuiItem( i18n("Next Unread &Folder"), TQString(),
3106 i18n("Go to the next folder with unread messages") ),
3107 ALT+Key_Plus, this, TQ_SLOT(slotNextUnreadFolder()),
3108 actionCollection(), "go_next_unread_folder" );
3109 TDEShortcut shortcut = action->shortcut();
3110 shortcut.append( KKey( CTRL+Key_Plus ) );
3111 action->setShortcut( shortcut );
3112
3113 action =
3114 new TDEAction( KGuiItem( i18n("Previous Unread F&older"), TQString(),
3115 i18n("Go to the previous folder with unread messages") ),
3116 ALT+Key_Minus, this, TQ_SLOT(slotPrevUnreadFolder()),
3117 actionCollection(), "go_prev_unread_folder" );
3118 shortcut = action->shortcut();
3119 shortcut.append( KKey( CTRL+Key_Minus ) );
3120 action->setShortcut( shortcut );
3121
3122 new TDEAction( KGuiItem( i18n("Go->","Next Unread &Text"), TQString(),
3123 i18n("Go to the next unread text"),
3124 i18n("Scroll down current message. "
3125 "If at end of current message, "
3126 "go to next unread message.") ),
3127 Key_Space, this, TQ_SLOT(slotReadOn()),
3128 actionCollection(), "go_next_unread_text" );
3129
3130 //----- Settings Menu
3131 mToggleShowQuickSearchAction = new TDEToggleAction(i18n("Show Quick Search"), TQString(),
3132 0, this, TQ_SLOT(slotToggleShowQuickSearch()),
3133 actionCollection(), "show_quick_search");
3134 mToggleShowQuickSearchAction->setChecked( GlobalSettings::self()->quickSearchActive() );
3135 mToggleShowQuickSearchAction->setWhatsThis(
3136 i18n( GlobalSettings::self()->quickSearchActiveItem()->whatsThis().utf8() ) );
3137
3138 (void) new TDEAction( i18n("Configure &Filters..."), 0, this,
3139 TQ_SLOT(slotFilter()), actionCollection(), "filter" );
3140 (void) new TDEAction( i18n("Configure &POP Filters..."), 0, this,
3141 TQ_SLOT(slotPopFilter()), actionCollection(), "popFilter" );
3142 (void) new TDEAction( i18n("Manage &Sieve Scripts..."), 0, this,
3143 TQ_SLOT(slotManageSieveScripts()), actionCollection(), "sieveFilters" );
3144
3145 (void) new TDEAction( KGuiItem( i18n("KMail &Introduction"), nullptr,
3146 i18n("Display KMail's Welcome Page") ),
3147 0, this, TQ_SLOT(slotIntro()),
3148 actionCollection(), "help_kmail_welcomepage" );
3149
3150 // ----- Standard Actions
3151// KStdAction::configureNotifications(this, TQ_SLOT(slotEditNotifications()), actionCollection());
3152 (void) new TDEAction( i18n("Configure &Notifications..."),
3153 "knotify", 0, this,
3154 TQ_SLOT(slotEditNotifications()), actionCollection(),
3155 "kmail_configure_notifications" );
3156// KStdAction::preferences(this, TQ_SLOT(slotSettings()), actionCollection());
3157 (void) new TDEAction( i18n("&Configure KMail..."),
3158 "configure", 0, kmkernel,
3159 TQ_SLOT(slotShowConfigurationDialog()), actionCollection(),
3160 "kmail_configure_kmail" );
3161
3162 KStdAction::undo(this, TQ_SLOT(slotUndo()), actionCollection(), "kmail_undo");
3163
3164 KStdAction::tipOfDay( this, TQ_SLOT( slotShowTip() ), actionCollection() );
3165
3166 menutimer = new TQTimer( this, "menutimer" );
3167 connect( menutimer, TQ_SIGNAL( timeout() ), TQ_SLOT( updateMessageActions() ) );
3168 connect( kmkernel->undoStack(),
3169 TQ_SIGNAL( undoStackChanged() ), this, TQ_SLOT( slotUpdateUndo() ));
3170
3171 initializeIMAPActions( false ); // don't set state, config not read yet
3172 updateMessageActions();
3173 updateCustomTemplateMenus();
3174 updateFolderMenu();
3175}
3176
3177void KMMainWidget::setupForwardingActionsList()
3178{
3179 TQPtrList<TDEAction> mForwardActionList;
3180 if ( GlobalSettings::self()->forwardingInlineByDefault() ) {
3181 mGUIClient->unplugActionList( "forward_action_list" );
3182 mForwardActionList.append( mForwardInlineAction );
3183 mForwardActionList.append( mForwardAttachedAction );
3184 mForwardActionList.append( mForwardDigestAction );
3185 mForwardActionList.append( mRedirectAction );
3186 mGUIClient->plugActionList( "forward_action_list", mForwardActionList );
3187 } else {
3188 mGUIClient->unplugActionList( "forward_action_list" );
3189 mForwardActionList.append( mForwardAttachedAction );
3190 mForwardActionList.append( mForwardInlineAction );
3191 mForwardActionList.append( mForwardDigestAction );
3192 mForwardActionList.append( mRedirectAction );
3193 mGUIClient->plugActionList( "forward_action_list", mForwardActionList );
3194 }
3195}
3196
3197//-----------------------------------------------------------------------------
3198void KMMainWidget::slotEditNotifications()
3199{
3200 if(kmkernel->xmlGuiInstance())
3201 KNotifyDialog::configure(this, nullptr, kmkernel->xmlGuiInstance()->aboutData());
3202 else
3203 KNotifyDialog::configure(this);
3204}
3205
3206void KMMainWidget::slotEditKeys()
3207{
3208 KKeyDialog::configure( actionCollection(),
3209 true /*allow one-letter shortcuts*/
3210 );
3211}
3212
3213//-----------------------------------------------------------------------------
3214void KMMainWidget::slotReadOn()
3215{
3216 if ( !mMsgView )
3217 return;
3218
3219 if ( !mMsgView->atBottom() ) {
3220 mMsgView->slotJumpDown();
3221 return;
3222 }
3223 slotNextUnreadMessage();
3224}
3225
3226void KMMainWidget::slotNextUnreadFolder() {
3227 if ( !mFolderTree ) return;
3228 mFolderTree->nextUnreadFolder();
3229}
3230
3231void KMMainWidget::slotPrevUnreadFolder() {
3232 if ( !mFolderTree ) return;
3233 mFolderTree->prevUnreadFolder();
3234}
3235
3236void KMMainWidget::slotExpandThread()
3237{
3238 mHeaders->slotExpandOrCollapseThread( true ); // expand
3239}
3240
3241void KMMainWidget::slotCollapseThread()
3242{
3243 mHeaders->slotExpandOrCollapseThread( false ); // collapse
3244}
3245
3246void KMMainWidget::slotExpandAllThreads()
3247{
3248 mHeaders->slotExpandOrCollapseAllThreads( true ); // expand
3249}
3250
3251void KMMainWidget::slotCollapseAllThreads()
3252{
3253 mHeaders->slotExpandOrCollapseAllThreads( false ); // collapse
3254}
3255
3256//-----------------------------------------------------------------------------
3257void KMMainWidget::slotShowMsgSrc()
3258{
3259 if ( mMsgView )
3260 mMsgView->setUpdateAttachment( false );
3261 KMMessage *msg = mHeaders->currentMsg();
3262 if ( !msg )
3263 return;
3264 KMCommand *command = new KMShowMsgSrcCommand( this, msg,
3265 mMsgView
3266 ? mMsgView->isFixedFont()
3267 : false );
3268 command->start();
3269}
3270
3271
3272//-----------------------------------------------------------------------------
3273void KMMainWidget::moveSelectedToFolder( int menuId )
3274{
3275 if (mMenuToFolder[menuId])
3276 mHeaders->moveMsgToFolder( mMenuToFolder[menuId] );
3277}
3278
3279
3280//-----------------------------------------------------------------------------
3281void KMMainWidget::copySelectedToFolder(int menuId )
3282{
3283 if (mMenuToFolder[menuId])
3284 mHeaders->copyMsgToFolder( mMenuToFolder[menuId] );
3285}
3286
3287
3288//-----------------------------------------------------------------------------
3289void KMMainWidget::updateMessageMenu()
3290{
3291 mMenuToFolder.clear();
3292 folderTree()->folderToPopupMenu( KMFolderTree::MoveMessage, this,
3293 &mMenuToFolder, mMoveActionMenu->popupMenu() );
3294 folderTree()->folderToPopupMenu( KMFolderTree::CopyMessage, this,
3295 &mMenuToFolder, mCopyActionMenu->popupMenu() );
3296 updateMessageActions();
3297}
3298
3299void KMMainWidget::startUpdateMessageActionsTimer()
3300{
3301 menutimer->stop();
3302 menutimer->start( 20, true );
3303}
3304
3305void KMMainWidget::updateMessageActions()
3306{
3307 int count = 0;
3308 TQPtrList<TQListViewItem> selectedItems;
3309
3310 if ( mFolder ) {
3311 for (TQListViewItem *item = mHeaders->firstChild(); item; item = item->itemBelow())
3312 if (item->isSelected() )
3313 selectedItems.append(item);
3314 if ( selectedItems.isEmpty() && mFolder->count() ) // there will always be one in mMsgView
3315 count = 1;
3316 else
3317 count = selectedItems.count();
3318 mMsgActions->setCurrentMessage( mHeaders->currentMsg() );
3319 mMsgActions->setSelectedSernums( mHeaders->selectedSernums() );
3320 mMsgActions->setSelectedVisibleSernums( mHeaders->selectedVisibleSernums() );
3321 } else {
3322 mMsgActions->setCurrentMessage( nullptr );
3323 }
3324
3325 updateListFilterAction();
3326
3327 bool allSelectedInCommonThread = false;
3328 if ( mHeaders->isThreaded() && count > 1 ) {
3329 allSelectedInCommonThread = true;
3330 for ( TQPtrListIterator<TQListViewItem> it( selectedItems ) ;
3331 it.current() ; ++ it ) {
3332 TQListViewItem * item = *it;
3333 if ( !item->parent() && item->childCount()==0 ) {
3334 allSelectedInCommonThread = false;
3335 break;
3336 }
3337 }
3338 }
3339 else if ( mHeaders->isThreaded() && count == 1 ) {
3340 allSelectedInCommonThread = true;
3341 }
3342
3343 TQListViewItem *curItemParent = mHeaders->currentItem();
3344 bool parent_thread = 0;
3345 if ( curItemParent && curItemParent->firstChild() ) parent_thread = 1;
3346
3347 bool mass_actions = count >= 1;
3348 bool thread_actions = mass_actions && allSelectedInCommonThread &&
3349 mHeaders->isThreaded();
3350 bool flags_available = GlobalSettings::self()->allowLocalFlags() || !(mFolder ? mFolder->isReadOnly() : true);
3351 mThreadStatusMenu->setEnabled( thread_actions );
3352 // these need to be handled individually, the user might have them
3353 // in the toolbar
3354 mWatchThreadAction->setEnabled( thread_actions && flags_available );
3355 mIgnoreThreadAction->setEnabled( thread_actions && flags_available );
3356 mMarkThreadAsNewAction->setEnabled( thread_actions );
3357 mMarkThreadAsReadAction->setEnabled( thread_actions );
3358 mMarkThreadAsUnreadAction->setEnabled( thread_actions );
3359 mToggleThreadTodoAction->setEnabled( thread_actions && flags_available );
3360 mToggleThreadFlagAction->setEnabled( thread_actions && flags_available );
3361 mTrashThreadAction->setEnabled( thread_actions && mFolder->canDeleteMessages() );
3362 mDeleteThreadAction->setEnabled( thread_actions && mFolder->canDeleteMessages() );
3363
3364 if (mFolder && mHeaders && mHeaders->currentMsg()) {
3365 if (thread_actions) {
3366 mToggleThreadTodoAction->setChecked(mHeaders->currentMsg()->isTodo());
3367 mToggleThreadFlagAction->setChecked(mHeaders->currentMsg()->isImportant());
3368 mWatchThreadAction->setChecked( mHeaders->currentMsg()->isWatched());
3369 mIgnoreThreadAction->setChecked( mHeaders->currentMsg()->isIgnored());
3370 }
3371 }
3372
3373 mMoveActionMenu->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3374 mMoveMsgToFolderAction->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3375 mCopyActionMenu->setEnabled( mass_actions );
3376 mTrashAction->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3377 mDeleteAction->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3378 mFindInMessageAction->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ) );
3379 mForwardInlineAction->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ));
3380 mForwardAttachedAction->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ) );
3381 mForwardDigestAction->setEnabled( ( count > 1 || parent_thread ) && !kmkernel->folderIsTemplates( mFolder ) );
3382
3383 forwardMenu()->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ));
3384
3385 bool single_actions = count == 1;
3386 mUseAction->setEnabled( single_actions &&
3387 kmkernel->folderIsTemplates( mFolder ) );
3388 filterMenu()->setEnabled( single_actions );
3389 redirectAction()->setEnabled( single_actions && !kmkernel->folderIsTemplates( mFolder ) );
3390 printAction()->setEnabled( single_actions );
3391 viewSourceAction()->setEnabled( single_actions );
3392
3393 mSendAgainAction->setEnabled( single_actions
3394 && ( ( mHeaders->currentMsg() && mHeaders->currentMsg()->isSent() )
3395 || ( mFolder && mHeaders->currentMsg() &&
3396 kmkernel->folderIsSentMailFolder( mFolder ) ) ) );
3397 mSaveAsAction->setEnabled( mass_actions );
3398 bool mails = mFolder && mFolder->count();
3399 bool enable_goto_unread = mails
3400 || (GlobalSettings::self()->loopOnGotoUnread() == GlobalSettings::EnumLoopOnGotoUnread::LoopInAllFolders);
3401 actionCollection()->action( "go_next_message" )->setEnabled( mails );
3402 actionCollection()->action( "go_next_unread_message" )->setEnabled( enable_goto_unread );
3403 actionCollection()->action( "go_prev_message" )->setEnabled( mails );
3404 actionCollection()->action( "go_prev_unread_message" )->setEnabled( enable_goto_unread );
3405 actionCollection()->action( "send_queued" )->setEnabled( kmkernel->outboxFolder()->count() > 0 );
3406 actionCollection()->action( "send_queued_via" )->setEnabled( kmkernel->outboxFolder()->count() > 0 );
3407 slotUpdateOnlineStatus( static_cast<GlobalSettingsBase::EnumNetworkState::type>( GlobalSettings::self()->networkState() ) );
3408 if (action( "edit_undo" ))
3409 action( "edit_undo" )->setEnabled( mHeaders->canUndo() );
3410
3411 if ( count == 1 ) {
3412 KMMessage *msg;
3413 int aIdx;
3414 if((aIdx = mHeaders->currentItemIndex()) <= -1)
3415 return;
3416 if(!(msg = mFolder->getMsg(aIdx)))
3417 return;
3418
3419 if ((KMFolder*)mFolder == kmkernel->outboxFolder())
3420 editAction()->setEnabled( !msg->transferInProgress() );
3421 }
3422
3423 mApplyAllFiltersAction->setEnabled(count);
3424 mApplyFilterActionsMenu->setEnabled(count);
3425}
3426
3427// This needs to be updated more often, so it is in its method.
3428void KMMainWidget::updateMarkAsReadAction()
3429{
3430 mMarkAllAsReadAction->setEnabled( mFolder && (mFolder->countUnread() > 0) );
3431}
3432
3433//-----------------------------------------------------------------------------
3434void KMMainWidget::updateFolderMenu()
3435{
3436 bool folderWithContent = mFolder && !mFolder->noContent();
3437 bool multiFolder = folderTree()->selectedFolders().count() > 1;
3438 mModifyFolderAction->setEnabled( folderWithContent && !multiFolder );
3439 mFolderMailingListPropertiesAction->setEnabled( folderWithContent && !multiFolder );
3440 mCompactFolderAction->setEnabled( folderWithContent && !multiFolder );
3441
3442 // This is the refresh-folder action in the menu. See kmfoldertree for the one in the RMB...
3443 bool imap = mFolder && mFolder->folderType() == KMFolderTypeImap;
3444 bool cachedImap = mFolder && mFolder->folderType() == KMFolderTypeCachedImap;
3445 // For dimap, check that the imap path is known before allowing "check mail in this folder".
3446 bool knownImapPath = cachedImap && !static_cast<KMFolderCachedImap*>( mFolder->storage() )->imapPath().isEmpty();
3447 mRefreshFolderAction->setEnabled( folderWithContent && ( imap
3448 || ( cachedImap && knownImapPath ) ) && !multiFolder );
3449 if ( mTroubleshootFolderAction )
3450 mTroubleshootFolderAction->setEnabled( folderWithContent && ( cachedImap && knownImapPath ) && !multiFolder );
3451
3452 mEmptyFolderAction->setEnabled( folderWithContent &&
3453 ( mFolder->count() > 0 ) && mFolder->canDeleteMessages() &&
3454 !multiFolder );
3455 mEmptyFolderAction->setText( ( mFolder && kmkernel->folderIsTrash( mFolder ) ) ?
3456 i18n( "E&mpty Trash" ) :
3457 i18n( "&Move All Messages to Trash" ) );
3458
3459 mRemoveFolderAction->setEnabled( mFolder &&
3460 !mFolder->isSystemFolder() &&
3461 mFolder->canDeleteMessages() &&
3462 !multiFolder && !mFolder->noContent() &&
3463 !mFolder->mailCheckInProgress() );
3464 mRemoveFolderAction->setText( mFolder &&
3465 mFolder->folderType() == KMFolderTypeSearch ?
3466 i18n( "&Delete Search" ) :
3467 i18n( "&Delete Folder" ) );
3468
3469 if ( mArchiveFolderAction )
3470 mArchiveFolderAction->setEnabled( mFolder && !multiFolder );
3471 mExpireFolderAction->setEnabled( mFolder && mFolder->isAutoExpire() && !multiFolder && mFolder->canDeleteMessages() );
3472 updateMarkAsReadAction();
3473 // the visual ones only make sense if we are showing a message list
3474 mPreferHtmlAction->setEnabled( mHeaders->folder() ? true : false );
3475 mPreferHtmlLoadExtAction->setEnabled( mHeaders->folder() && (mHtmlPref ? !mFolderHtmlPref : mFolderHtmlPref) ? true : false );
3476 mThreadMessagesAction->setEnabled( mHeaders->folder() ? true : false );
3477
3478 mPreferHtmlAction->setChecked( mHtmlPref ? !mFolderHtmlPref : mFolderHtmlPref );
3479 mPreferHtmlLoadExtAction->setChecked( mHtmlLoadExtPref ? !mFolderHtmlLoadExtPref : mFolderHtmlLoadExtPref );
3480 mThreadMessagesAction->setChecked(
3481 mThreadPref ? !mFolderThreadPref : mFolderThreadPref );
3482 mThreadBySubjectAction->setEnabled(
3483 mHeaders->folder() ? ( mThreadMessagesAction->isChecked()) : false );
3484 mThreadBySubjectAction->setChecked( mFolderThreadSubjPref );
3485
3486 mNewFolderAction->setEnabled( !multiFolder && ( mFolder && mFolder->folderType() != KMFolderTypeSearch ));
3487 mRemoveDuplicatesAction->setEnabled( !multiFolder && mFolder && mFolder->canDeleteMessages() );
3488 mFolderShortCutCommandAction->setEnabled( !multiFolder );
3489}
3490
3491
3492#ifdef MALLOC_DEBUG
3493static TQString fmt(long n) {
3494 char buf[32];
3495
3496 if(n > 1024*1024*1024)
3497 sprintf(buf, "%0.2f GB", ((double)n)/1024.0/1024.0/1024.0);
3498 else if(n > 1024*1024)
3499 sprintf(buf, "%0.2f MB", ((double)n)/1024.0/1024.0);
3500 else if(n > 1024)
3501 sprintf(buf, "%0.2f KB", ((double)n)/1024.0);
3502 else
3503 sprintf(buf, "%ld Byte", n);
3504 return TQString(buf);
3505}
3506#endif
3507
3508void KMMainWidget::slotMemInfo() {
3509#ifdef MALLOC_DEBUG
3510 struct mallinfo mi;
3511
3512 mi = mallinfo();
3513 TQString s = TQString("\nMALLOC - Info\n\n"
3514 "Number of mmapped regions : %1\n"
3515 "Memory allocated in use : %2\n"
3516 "Memory allocated, not used: %3\n"
3517 "Memory total allocated : %4\n"
3518 "Max. freeable memory : %5\n")
3519 .arg(mi.hblks).arg(fmt(mi.uordblks)).arg(fmt(mi.fordblks))
3520 .arg(fmt(mi.arena)).arg(fmt(mi.keepcost));
3521 KMessageBox::information(0, s, "Malloc information", s);
3522#endif
3523}
3524
3525
3526//-----------------------------------------------------------------------------
3527void KMMainWidget::slotIntro()
3528{
3529 if ( !mMsgView ) return;
3530
3531 mMsgView->clear( true );
3532 // hide widgets that are in the way:
3533 if ( mSearchAndHeaders && mHeaders && mLongFolderList )
3534 mSearchAndHeaders->hide();
3535
3536
3537 mMsgView->displayAboutPage();
3538
3539 mFolder = nullptr;
3540}
3541
3542void KMMainWidget::slotShowStartupFolder()
3543{
3544 if ( mFolderTree ) {
3545 mFolderTree->reload();
3546 mFolderTree->readConfig();
3547 // get rid of old-folders
3548 mFolderTree->cleanupConfigFile();
3549 }
3550
3551 connect( kmkernel->filterMgr(), TQ_SIGNAL( filterListUpdated() ),
3552 this, TQ_SLOT( initializeFilterActions() ));
3553
3554 // plug shortcut filter actions now
3555 initializeFilterActions();
3556
3557 // plug folder shortcut actions
3558 initializeFolderShortcutActions();
3559
3560 TQString newFeaturesMD5 = KMReaderWin::newFeaturesMD5();
3561 if ( kmkernel->firstStart() ||
3562 GlobalSettings::self()->previousNewFeaturesMD5() != newFeaturesMD5 ) {
3563 GlobalSettings::self()->setPreviousNewFeaturesMD5( newFeaturesMD5 );
3564 slotIntro();
3565 return;
3566 }
3567
3568 KMFolder* startup = nullptr;
3569 if ( !mStartupFolder.isEmpty() ) {
3570 // find the startup-folder
3571 startup = kmkernel->findFolderById( mStartupFolder );
3572 }
3573 if ( !startup )
3574 startup = kmkernel->inboxFolder();
3575
3576 if ( mFolderTree ) {
3577 mFolderTree->showFolder( startup );
3578 }
3579}
3580
3581void KMMainWidget::slotShowTip()
3582{
3583 KTipDialog::showTip( this, TQString(), true );
3584}
3585
3586//-----------------------------------------------------------------------------
3587void KMMainWidget::slotChangeCaption(TQListViewItem * i)
3588{
3589 if ( !i ) return;
3590 // set the caption to the current full path
3591 TQStringList names;
3592 for ( TQListViewItem * item = i ; item ; item = item->parent() )
3593 names.prepend( item->text(0) );
3594 emit captionChangeRequest( names.join( "/" ) );
3595}
3596
3597//-----------------------------------------------------------------------------
3598void KMMainWidget::removeDuplicates()
3599{
3600 if (!mFolder)
3601 return;
3602 KMFolder *oFolder = mFolder;
3603 mHeaders->setFolder(nullptr);
3604 TQMap< TQString, TQValueList<int> > idMD5s;
3605 TQValueList<int> redundantIds;
3606 TQValueList<int>::Iterator kt;
3607 mFolder->open("removedups");
3608 for (int i = mFolder->count() - 1; i >= 0; --i) {
3609 TQString id = (*mFolder)[i]->msgIdMD5();
3610 if ( !id.isEmpty() ) {
3611 TQString subjMD5 = (*mFolder)[i]->strippedSubjectMD5();
3612 int other = -1;
3613 if ( idMD5s.contains(id) )
3614 other = idMD5s[id].first();
3615 else
3616 idMD5s[id].append( i );
3617 if ( other != -1 ) {
3618 TQString otherSubjMD5 = (*mFolder)[other]->strippedSubjectMD5();
3619 if (otherSubjMD5 == subjMD5)
3620 idMD5s[id].append( i );
3621 }
3622 }
3623 }
3624 TQMap< TQString, TQValueList<int> >::Iterator it;
3625 for ( it = idMD5s.begin(); it != idMD5s.end() ; ++it ) {
3626 TQValueList<int>::Iterator jt;
3627 bool finished = false;
3628 for ( jt = (*it).begin(); jt != (*it).end() && !finished; ++jt )
3629 if (!((*mFolder)[*jt]->isUnread())) {
3630 (*it).remove( jt );
3631 (*it).prepend( *jt );
3632 finished = true;
3633 }
3634 for ( jt = (*it).begin(), ++jt; jt != (*it).end(); ++jt )
3635 redundantIds.append( *jt );
3636 }
3637 qHeapSort( redundantIds );
3638 kt = redundantIds.end();
3639 int numDuplicates = 0;
3640 if (kt != redundantIds.begin()) do {
3641 mFolder->removeMsg( *(--kt) );
3642 ++numDuplicates;
3643 }
3644 while (kt != redundantIds.begin());
3645
3646 mFolder->close("removedups");
3647 mHeaders->setFolder(oFolder);
3648 TQString msg;
3649 if ( numDuplicates )
3650 msg = i18n("Removed %n duplicate message.",
3651 "Removed %n duplicate messages.", numDuplicates );
3652 else
3653 msg = i18n("No duplicate messages found.");
3654 BroadcastStatus::instance()->setStatusMsg( msg );
3655}
3656
3657
3658//-----------------------------------------------------------------------------
3659void KMMainWidget::slotUpdateUndo()
3660{
3661 if (actionCollection()->action( "edit_undo" ))
3662 actionCollection()->action( "edit_undo" )->setEnabled( mHeaders->canUndo() );
3663}
3664
3665
3666//-----------------------------------------------------------------------------
3667void KMMainWidget::clearFilterActions()
3668{
3669 if ( !mFilterTBarActions.isEmpty() ) {
3670 if ( mGUIClient->factory() )
3671 mGUIClient->unplugActionList( "toolbar_filter_actions" );
3672 mFilterTBarActions.clear();
3673 }
3674 mApplyFilterActionsMenu->popupMenu()->clear();
3675 if ( !mFilterMenuActions.isEmpty() ) {
3676 if ( mGUIClient->factory() )
3677 mGUIClient->unplugActionList( "menu_filter_actions" );
3678 mFilterMenuActions.clear();
3679 }
3680 mFilterCommands.clear();
3681}
3682
3683//-----------------------------------------------------------------------------
3684void KMMainWidget::initializeFolderShortcutActions()
3685{
3686
3687 // If we are loaded as a part, this will be set to fals, since the part
3688 // does xml loading. Temporarily set to true, in that case, so the
3689 // accels are added to the collection as expected.
3690 bool old = actionCollection()->isAutoConnectShortcuts();
3691
3692 actionCollection()->setAutoConnectShortcuts( true );
3693 TQValueList< TQGuardedPtr< KMFolder > > folders = kmkernel->allFolders();
3694 TQValueList< TQGuardedPtr< KMFolder > >::Iterator it = folders.begin();
3695 while ( it != folders.end() ) {
3696 KMFolder *folder = (*it);
3697 ++it;
3698 slotShortcutChanged( folder ); // load the initial accel
3699 }
3700 actionCollection()->setAutoConnectShortcuts( old );
3701}
3702
3703
3704//-----------------------------------------------------------------------------
3705void KMMainWidget::initializeFilterActions()
3706{
3707 TQString filterName, normalizedName;
3708 KMMetaFilterActionCommand *filterCommand;
3709 TDEAction *filterAction = nullptr;
3710
3711 clearFilterActions();
3712 mApplyAllFiltersAction->plug(mApplyFilterActionsMenu->popupMenu());
3713 bool addedSeparator = false;
3714 TQValueListConstIterator<KMFilter*> it = kmkernel->filterMgr()->filters().constBegin();
3715 for ( ;it != kmkernel->filterMgr()->filters().constEnd(); ++it ) {
3716 if (!(*it)->isEmpty() && (*it)->configureShortcut()) {
3717 filterName = TQString("Filter %1").arg((*it)->name());
3718 normalizedName = filterName.replace(" ", "_");
3719 if (action(normalizedName.utf8()))
3720 continue;
3721 filterCommand = new KMMetaFilterActionCommand(*it, mHeaders, this);
3722 mFilterCommands.append(filterCommand);
3723 TQString as = i18n("Filter %1").arg((*it)->name());
3724 TQString icon = (*it)->icon();
3725 if ( icon.isEmpty() )
3726 icon = "gear";
3727 filterAction = new TDEAction(as, icon, (*it)->shortcut(), filterCommand,
3728 TQ_SLOT(start()), actionCollection(),
3729 normalizedName.local8Bit());
3730 if(!addedSeparator) {
3731 mApplyFilterActionsMenu->popupMenu()->insertSeparator();
3732 addedSeparator = !addedSeparator;
3733 mFilterMenuActions.append( new TDEActionSeparator());
3734 }
3735 filterAction->plug( mApplyFilterActionsMenu->popupMenu() );
3736 mFilterMenuActions.append(filterAction);
3737 if ( (*it)->configureToolbar() )
3738 mFilterTBarActions.append(filterAction);
3739 }
3740 }
3741 if ( !mFilterMenuActions.isEmpty() && mGUIClient->factory() )
3742 mGUIClient->plugActionList( "menu_filter_actions", mFilterMenuActions );
3743 if ( !mFilterTBarActions.isEmpty() && mGUIClient->factory() ) {
3744 mFilterTBarActions.prepend( mToolbarActionSeparator );
3745 mGUIClient->plugActionList( "toolbar_filter_actions", mFilterTBarActions );
3746 }
3747}
3748
3749void KMMainWidget::slotFolderRemoved( KMFolder *folder )
3750{
3751 mFolderShortcutCommands.remove( folder->idString() );
3752}
3753
3754//-----------------------------------------------------------------------------
3755void KMMainWidget::initializeIMAPActions( bool setState /* false the first time, true later on */ )
3756{
3757 bool hasImapAccount = false;
3758 for( KMAccount *a = kmkernel->acctMgr()->first(); a;
3759 a = kmkernel->acctMgr()->next() ) {
3760 if ( a->type() == "cachedimap" ) {
3761 hasImapAccount = true;
3762 break;
3763 }
3764 }
3765 if (hasImapAccount == static_cast<bool>(mTroubleshootFolderAction))
3766 return; // nothing to do
3767
3768 KXMLGUIFactory* factory = mGUIClient->factory();
3769 if ( factory )
3770 factory->removeClient( mGUIClient );
3771
3772 if ( !mTroubleshootFolderAction ) {
3773 mTroubleshootFolderAction = new TDEAction( i18n("&Troubleshoot IMAP Cache..."), "wizard", 0,
3774 this, TQ_SLOT(slotTroubleshootFolder()), actionCollection(), "troubleshoot_folder" );
3775 if ( setState )
3776 updateFolderMenu(); // set initial state of the action
3777 } else {
3778 delete mTroubleshootFolderAction ;
3779 mTroubleshootFolderAction = nullptr;
3780 }
3781
3782 if ( factory )
3783 factory->addClient( mGUIClient );
3784}
3785
3786bool KMMainWidget::shortcutIsValid( const TDEShortcut &sc ) const
3787{
3788 TDEActionPtrList actions = actionCollection()->actions();
3789 TDEActionPtrList::Iterator it( actions.begin() );
3790 for ( ; it != actions.end(); it++ ) {
3791 if ( (*it)->shortcut() == sc ) return false;
3792 }
3793 return true;
3794}
3795
3796void KMMainWidget::slotShortcutChanged( KMFolder *folder )
3797{
3798 // remove the old one, autodelete
3799 mFolderShortcutCommands.remove( folder->idString() );
3800 if ( folder->shortcut().isNull() )
3801 return;
3802
3803 FolderShortcutCommand *c = new FolderShortcutCommand( this, folder );
3804 mFolderShortcutCommands.insert( folder->idString(), c );
3805
3806 TQString actionlabel = TQString( "FolderShortcut %1").arg( folder->prettyURL() );
3807 TQString actionname = TQString( "FolderShortcut %1").arg( folder->idString() );
3808 TQString normalizedName = actionname.replace(" ", "_");
3809 TDEAction* action =
3810 new TDEAction(actionlabel, folder->shortcut(), c, TQ_SLOT(start()),
3811 actionCollection(), normalizedName.local8Bit());
3812 action->setIcon( folder->unreadIconPath() );
3813 c->setAction( action ); // will be deleted along with the command
3814}
3815
3816//-----------------------------------------------------------------------------
3817TQString KMMainWidget::findCurrentImapPath()
3818{
3819 TQString startPath;
3820 if (!mFolder) return startPath;
3821 if (mFolder->folderType() == KMFolderTypeImap)
3822 {
3823 startPath = static_cast<KMFolderImap*>(mFolder->storage())->imapPath();
3824 } else if (mFolder->folderType() == KMFolderTypeCachedImap)
3825 {
3826 startPath = static_cast<KMFolderCachedImap*>(mFolder->storage())->imapPath();
3827 }
3828 return startPath;
3829}
3830
3831//-----------------------------------------------------------------------------
3832ImapAccountBase* KMMainWidget::findCurrentImapAccountBase()
3833{
3834 ImapAccountBase* account = nullptr;
3835 if (!mFolder) return account;
3836 if (mFolder->folderType() == KMFolderTypeImap)
3837 {
3838 account = static_cast<KMFolderImap*>(mFolder->storage())->account();
3839 } else if (mFolder->folderType() == KMFolderTypeCachedImap)
3840 {
3841 account = static_cast<KMFolderCachedImap*>(mFolder->storage())->account();
3842 }
3843 return account;
3844}
3845
3846//-----------------------------------------------------------------------------
3847void KMMainWidget::slotSubscriptionDialog()
3848{
3849 if ( !kmkernel->askToGoOnline() )
3850 return;
3851 ImapAccountBase* account = findCurrentImapAccountBase();
3852 if ( !account ) return;
3853 const TQString startPath = findCurrentImapPath();
3854
3855 // KSubscription sets "DestruciveClose"
3856 SubscriptionDialog * dialog =
3857 new SubscriptionDialog(this, i18n("Subscription"), account, startPath);
3858 if ( dialog->exec() ) {
3859 // start a new listing
3860 if (mFolder->folderType() == KMFolderTypeImap)
3861 static_cast<KMFolderImap*>(mFolder->storage())->account()->listDirectory();
3862 }
3863}
3864
3865//-----------------------------------------------------------------------------
3866void KMMainWidget::slotLocalSubscriptionDialog()
3867{
3868 ImapAccountBase* account = findCurrentImapAccountBase();
3869 if ( !account ) return;
3870
3871 const TQString startPath = findCurrentImapPath();
3872 // KSubscription sets "DestruciveClose"
3873 LocalSubscriptionDialog *dialog =
3874 new LocalSubscriptionDialog(this, i18n("Local Subscription"), account, startPath);
3875 if ( dialog->exec() ) {
3876 // start a new listing
3877 if (mFolder->folderType() == KMFolderTypeImap)
3878 static_cast<KMFolderImap*>(mFolder->storage())->account()->listDirectory();
3879 }
3880}
3881
3882//-----------------------------------------------------------------------------
3883void KMMainWidget::slotFolderTreeColumnsChanged()
3884{
3885 mTotalColumnToggle->setChecked( mFolderTree->isTotalActive() );
3886 mUnreadColumnToggle->setChecked( mFolderTree->isUnreadActive() );
3887 mSizeColumnToggle->setChecked( mFolderTree->isSizeActive() );
3888 mUnreadTextToggle->setChecked( !mFolderTree->isUnreadActive() );
3889}
3890
3891void KMMainWidget::toggleSystemTray()
3892{
3893 if ( !mSystemTray && GlobalSettings::self()->systemTrayEnabled() ) {
3894 mSystemTray = new KMSystemTray();
3895 }
3896 else if ( mSystemTray && !GlobalSettings::self()->systemTrayEnabled() ) {
3897 // Get rid of system tray on user's request
3898 kdDebug(5006) << "deleting systray" << endl;
3899 delete mSystemTray;
3900 mSystemTray = nullptr;
3901 }
3902
3903 // Set mode of systemtray. If mode has changed, tray will handle this.
3904 if ( mSystemTray )
3905 mSystemTray->setMode( GlobalSettings::self()->systemTrayPolicy() );
3906}
3907
3908//-----------------------------------------------------------------------------
3909void KMMainWidget::slotAntiSpamWizard()
3910{
3911 AntiSpamWizard wiz( AntiSpamWizard::AntiSpam, this, folderTree() );
3912 wiz.exec();
3913}
3914
3915//-----------------------------------------------------------------------------
3916void KMMainWidget::slotAntiVirusWizard()
3917{
3918 AntiSpamWizard wiz( AntiSpamWizard::AntiVirus, this, folderTree() );
3919 wiz.exec();
3920}
3921
3922//-----------------------------------------------------------------------------
3923void KMMainWidget::slotFilterLogViewer()
3924{
3925 FilterLogDialog * dlg = new FilterLogDialog( nullptr );
3926 dlg->show();
3927}
3928
3929//-----------------------------------------------------------------------------
3930void KMMainWidget::updateFileMenu()
3931{
3932 TQStringList actList = kmkernel->acctMgr()->getAccounts();
3933
3934 actionCollection()->action("check_mail")->setEnabled( actList.size() > 0 );
3935 actionCollection()->action("check_mail_in")->setEnabled( actList.size() > 0 );
3936 actionCollection()->action("favorite_check_mail")->setEnabled( actList.size() > 0 );
3937}
3938
3939
3940//-----------------------------------------------------------------------------
3941void KMMainWidget::setAccelsEnabled( bool enabled )
3942{
3943 actionCollection()->tdeaccel()->setEnabled( enabled );
3944}
3945
3946
3947//-----------------------------------------------------------------------------
3948KMSystemTray *KMMainWidget::systray() const
3949{
3950 return mSystemTray;
3951}
3952
3953//-----------------------------------------------------------------------------
3954TQString KMMainWidget::overrideEncoding() const
3955{
3956 if ( mMsgView )
3957 return mMsgView->overrideEncoding();
3958 else
3959 return GlobalSettings::self()->overrideCharacterEncoding();
3960}
3961
3962void KMMainWidget::slotCreateTodo()
3963{
3964 KMMessage *msg = mHeaders->currentMsg();
3965 if ( !msg )
3966 return;
3967 KMCommand *command = new CreateTodoCommand( this, msg );
3968 command->start();
3969}
3970
3971void KMMainWidget::setupFolderView()
3972{
3973 if ( GlobalSettings::self()->enableFavoriteFolderView() ) {
3974 mFolderView = mFolderViewSplitter;
3975 mFolderTree->reparent( mFolderViewSplitter, 0, TQPoint( 0, 0 ) );
3976 mFolderViewSplitter->show();
3977 mFavoriteFolderView->show();
3978 } else {
3979 mFolderView = mFolderTree;
3980 mFolderViewSplitter->hide();
3981 mFavoriteFolderView->hide();
3982 }
3983 mFolderView->reparent( mFolderViewParent, 0, TQPoint( 0, 0 ) );
3984 mFolderViewParent->moveToFirst( mFolderView );
3985 mFolderTree->show();
3986}
3987
3988
3989void KMMainWidget::slotRequestFullSearchFromQuickSearch()
3990{
3991 slotSearch();
3992#ifdef HAVE_INDEXLIB
3993 return;
3994#endif
3995 assert( mSearchWin );
3996 KMSearchPattern pattern;
3997 pattern.append( KMSearchRule::createInstance( "<message>", KMSearchRule::FuncContains, mQuickSearchLine->currentSearchTerm() ) );
3998 int status = mQuickSearchLine->currenStatus();
3999 if ( status != 0 ) {
4000 pattern.append( new KMSearchRuleStatus( status ) );
4001 }
4002 mSearchWin->setSearchPattern( pattern );
4003}
4004
4005void KMMainWidget::updateVactionScripStatus(bool active)
4006{
4007 mVacationIndicatorActive = active;
4008 if ( active ) {
4009 mVacationScriptIndicator->setText( i18n("Out of office reply active") );
4010 mVacationScriptIndicator->setPaletteBackgroundColor( TQt::yellow );
4011 mVacationScriptIndicator->setCursor( TQCursor( TQt::PointingHandCursor ) );
4012 mVacationScriptIndicator->show();
4013 } else {
4014 mVacationScriptIndicator->hide();
4015 }
4016}
4017
sets a cursor and makes sure it's restored on destruction Create a KCursorSaver object when you want ...
Dialog for handling the properties of a mail folder.
Mail folder.
Definition kmfolder.h:69
TQString idString() const
Returns a string that can be used to identify this folder.
Definition kmfolder.cpp:705
virtual TQString prettyURL() const
URL of the node for visualization purposes.
Definition kmfolder.cpp:593
virtual TQString label() const
Returns the label of the folder for visualization.
Definition kmfolder.cpp:581
bool ignoreNewMail() const
Returns true if the user doesn't want to get notified about new mail in this folder.
Definition kmfolder.h:526
KMFolderType folderType() const
Returns the type of this folder.
Definition kmfolder.cpp:233
int open(const char *owner)
Open folder for access.
Definition kmfolder.cpp:479
The widget that shows the contents of folders.
Definition kmheaders.h:47
static KMKernel * self()
normal control stuff
Definition kmkernel.h:258
This is a Mime Message.
Definition kmmessage.h:68
void setReadyToShow(bool v)
Set if the message is ready to be shown.
Definition kmmessage.h:874
TQString msgId() const
Get or set the 'Message-Id' header field.
TQString from() const
Get or set the 'From' header field.
TQString to() const
Get or set the 'To' header field.
TQString subject() const
Get or set the 'Subject' header field.
bool transferInProgress() const
Return, if the message should not be deleted.
void setMsgSerNum(unsigned long newMsgSerNum=0)
Sets the message serial number.
KMMessage * unencryptedMsg() const
Returns an unencrypted copy of this message or 0 if none exists.
Definition kmmessage.h:137
bool hasUnencryptedMsg() const
Returns true if the message contains an unencrypted copy of itself.
Definition kmmessage.h:134
bool isComplete() const
Return true if the complete message is available without referring to the backing store.
Definition kmmessage.h:867
void initHeader(uint identity=0)
Initialize header fields.
This class implements a "reader window", that is a window used for reading or viewing messages.
Definition kmreaderwin.h:75
static TQString newFeaturesMD5()
Returns the MD5 hash for the list of new features.
This class is an abstraction of a search over messages.
This class represents a search to be performed against the status of a messsage.
static KMSearchRule * createInstance(const TQCString &field=0, Function function=FuncContains, const TQString &contents=TQString())
Create a search rule of a certain type by instantiating the appro- priate subclass depending on the f...
KMSystemTray extends KSystemTray and handles system tray notification for KMail.
The account manager is responsible for creating accounts of various types via the factory method crea...
KMail anti-spam wizard.
KMail Filter Log Collector.
This class encapsulates the visual appearance of message headers.
Definition headerstyle.h:51
Manages common actions that can be performed on one or more messages.
The SearchWindow class provides a dialog for triggering a search on folders and storing that search a...
Diagnostic info for Sieve.
static TQStringList transportNames()
Returns the list for transport names.
Extends HeaderListQuickSearch to also search inside message bodies using KMMsgIndex.
The TemplateParser transforms a message with a given template.