14 #undef Unsorted // X headers...
19 #include <tqpopupmenu.h>
20 #include <tqptrlist.h>
21 #include <tqsignalmapper.h>
22 #include <tqvaluevector.h>
23 #include <tqstylesheet.h>
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>
35 #include <tdeapplication.h>
36 #include <tdefiledialog.h>
38 #include <knotifydialog.h>
39 #include <kstandarddirs.h>
40 #include <dcopclient.h>
41 #include <kaddrbook.h>
43 #include <kstringhandler.h>
45 #include "globalsettings.h"
46 #include "kcursorsaver.h"
47 #include "broadcaststatus.h"
48 using KPIM::BroadcastStatus;
49 #include "kmfoldermgr.h"
50 #include "kmfolderdia.h"
51 #include "accountmanager.h"
54 #include "kmfoldertree.h"
55 #include "kmreadermainwin.h"
56 #include "kmfoldercachedimap.h"
57 #include "kmfolderimap.h"
58 #include "kmacctcachedimap.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"
74 using KMail::ImapAccountBase;
76 using KMail::Vacation;
77 #include "favoritefolderview.h"
78 #include "subscriptiondialog.h"
79 using KMail::SubscriptionDialog;
80 #include "localsubscriptiondialog.h"
81 using KMail::LocalSubscriptionDialog;
82 #include "attachmentstrategy.h"
83 using KMail::AttachmentStrategy;
84 #include "headerstrategy.h"
85 using KMail::HeaderStrategy;
86 #include "headerstyle.h"
88 #include "folderjob.h"
89 using KMail::FolderJob;
90 #include "mailinglist-magic.h"
91 #include "antispamwizard.h"
93 #include "filterlogdlg.h"
95 #include <headerlistquicksearch.h>
96 #include "tdelistviewindexedsearchline.h"
97 using 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"
106 #include "sievedebugdialog.h"
110 #include <libkpimidentities/identity.h>
111 #include <libkpimidentities/identitymanager.h>
114 #include <kstatusbar.h>
115 #include <kstaticdeleter.h>
116 #include <tdeaction.h>
118 #include <kmime_mdn.h>
119 #include <kmime_header_parsing.h>
120 using namespace KMime;
121 using KMime::Types::AddrSpecList;
123 #include "progressmanager.h"
124 using KPIM::ProgressManager;
126 #include "managesievescriptsdialog.h"
128 #include "customtemplates.h"
129 #include "customtemplates_kfg.h"
131 #include "kmmainwidget.moc"
133 TQValueList<KMMainWidget*>* KMMainWidget::s_mainWidgetList = 0;
134 static KStaticDeleter<TQValueList<KMMainWidget*> > mwlsd;
137 KMMainWidget::KMMainWidget(TQWidget *parent,
const char *name,
138 KXMLGUIClient *aGUIClient,
139 TDEActionCollection *actionCollection, TDEConfig* config ) :
140 TQWidget(parent, name),
141 mFavoritesCheckMailAction( 0 ),
142 mFavoriteFolderView( 0 ),
144 mFolderViewParent( 0 ),
145 mFolderViewSplitter( 0 ),
146 mQuickSearchLine( 0 ),
147 mArchiveFolderAction( 0 ),
148 mShowBusySplashTimer( 0 ),
149 mShowingOfflineScreen( false ),
151 mVacationIndicatorActive( false )
154 mStartupDone =
false;
159 mFolderThreadPref =
false;
160 mFolderThreadSubjPref =
true;
161 mReaderWindowActive =
true;
162 mReaderWindowBelow =
true;
163 mFolderHtmlPref =
false;
164 mFolderHtmlLoadExtPref =
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);
175 mGUIClient = aGUIClient;
177 mCustomReplyActionMenu = 0;
178 mCustomReplyAllActionMenu = 0;
179 mCustomForwardActionMenu = 0;
180 mCustomReplyMapper = 0;
181 mCustomReplyAllMapper = 0;
182 mCustomForwardMapper = 0;
186 mToolbarActionSeparator =
new TDEActionSeparator( actionCollection );
188 if( !s_mainWidgetList )
189 mwlsd.setObject( s_mainWidgetList,
new TQValueList<KMMainWidget*>() );
190 s_mainWidgetList->append(
this );
192 mPanner1Sep << 1 << 1;
193 mPanner2Sep << 1 << 1;
195 setMinimumSize(400, 300);
206 TQTimer::singleShot( 0,
this, TQ_SLOT( slotShowStartupFolder() ));
208 connect( kmkernel->acctMgr(), TQ_SIGNAL( checkedMail(
bool,
bool,
const TQMap<TQString, int> & ) ),
209 this, TQ_SLOT( slotMailChecked(
bool,
bool,
const TQMap<TQString, int> & ) ) );
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() ) );
216 connect(kmkernel, TQ_SIGNAL( configChanged() ),
217 this, TQ_SLOT( slotConfigChanged() ));
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()) );
227 connect(kmkernel->folderMgr(), TQ_SIGNAL(folderRemoved(
KMFolder*)),
228 this, TQ_SLOT(slotFolderRemoved(
KMFolder*)));
230 connect(kmkernel->imapFolderMgr(), TQ_SIGNAL(folderRemoved(
KMFolder*)),
231 this, TQ_SLOT(slotFolderRemoved(
KMFolder*)));
233 connect(kmkernel->dimapFolderMgr(), TQ_SIGNAL(folderRemoved(
KMFolder*)),
234 this, TQ_SLOT(slotFolderRemoved(
KMFolder*)));
236 connect(kmkernel->searchFolderMgr(), TQ_SIGNAL(folderRemoved(
KMFolder*)),
237 this, TQ_SLOT(slotFolderRemoved(
KMFolder*)));
239 connect( kmkernel, TQ_SIGNAL( onlineStatusChanged( GlobalSettings::EnumNetworkState::type ) ),
240 this, TQ_SLOT( slotUpdateOnlineStatus( GlobalSettings::EnumNetworkState::type ) ) );
248 TDEMainWindow *
mainWin =
dynamic_cast<TDEMainWindow*
>(topLevelWidget());
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()) );
261 KMMainWidget::~KMMainWidget()
263 s_mainWidgetList->remove(
this );
270 void KMMainWidget::destruct()
287 void KMMainWidget::readPreConfig(
void)
289 const TDEConfigGroup geometry( KMKernel::config(),
"Geometry" );
290 const TDEConfigGroup reader( KMKernel::config(),
"Reader" );
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 );
297 mHtmlPref = reader.readBoolEntry(
"htmlMail",
false );
298 mHtmlLoadExtPref = reader.readBoolEntry(
"htmlLoadExternal",
false );
299 mEnableFavoriteFolderView = GlobalSettings::self()->enableFavoriteFolderView();
304 void KMMainWidget::readFolderConfig(
void)
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 );
319 void KMMainWidget::writeFolderConfig(
void)
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 );
334 void KMMainWidget::readConfig(
void)
336 TDEConfig *config = KMKernel::config();
338 bool oldLongFolderList = mLongFolderList;
339 bool oldReaderWindowActive = mReaderWindowActive;
340 bool oldReaderWindowBelow = mReaderWindowBelow;
341 bool oldFavoriteFolderView = mEnableFavoriteFolderView;
351 mHeaders->refreshNestedState();
353 bool layoutChanged = ( oldLongFolderList != mLongFolderList )
354 || ( oldReaderWindowActive != mReaderWindowActive )
355 || ( oldReaderWindowBelow != mReaderWindowBelow )
356 || ( oldFavoriteFolderView != mEnableFavoriteFolderView );
359 if( layoutChanged ) {
369 TDEConfigGroupSaver saver(config,
"Geometry");
371 TQSize defaultSize(750,560);
372 siz = config->readSizeEntry(
"MainWin", &defaultSize);
376 static const int folderpanewidth = 250;
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 );
385 TQValueList<int> & widths = mLongFolderList ? mPanner1Sep : mPanner2Sep ;
386 TQValueList<int> & heights = mLongFolderList ? mPanner2Sep : mPanner1Sep ;
388 widths << folderW << headerW;
389 heights << headerH << readerH;
391 bool layoutChanged = ( oldLongFolderList != mLongFolderList )
392 || ( oldReaderWindowActive != mReaderWindowActive )
393 || ( oldReaderWindowBelow != mReaderWindowBelow );
395 if (!mStartupDone || layoutChanged )
402 const int unreadColumn = config->readNumEntry(
"UnreadColumn", 1);
403 const int totalColumn = config->readNumEntry(
"TotalColumn", 2);
404 const int sizeColumn = config->readNumEntry(
"SizeColumn", 3);
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 );
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 );
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 );
431 mUnreadColumnToggle->setChecked( mFolderTree->isUnreadActive() );
432 mUnreadTextToggle->setChecked( !mFolderTree->isUnreadActive() );
433 mTotalColumnToggle->setChecked( mFolderTree->isTotalActive() );
434 mSizeColumnToggle->setChecked( mFolderTree->isSizeActive() );
436 mFolderTree->updatePopup();
441 mMsgView->readConfig();
443 mHeaders->readConfig();
444 mHeaders->restoreColumnLayout( KMKernel::config(),
"Header-Geometry" );
446 if ( mFolderViewSplitter && !GlobalSettings::self()->folderViewSplitterPosition().isEmpty() ) {
447 mFolderViewSplitter->setSizes( GlobalSettings::self()->folderViewSplitterPosition() );
449 TQValueList<int> defaults;
450 defaults << (int)(height() * 0.2) << (int)(height() * 0.8);
451 mFolderViewSplitter->setSizes( defaults );
454 mFolderTree->readConfig();
455 if ( mFavoriteFolderView )
456 mFavoriteFolderView->readConfig();
457 mFavoritesCheckMailAction->setEnabled( GlobalSettings::self()->enableFavoriteFolderView() );
460 TDEConfigGroupSaver saver(config,
"General");
461 mBeepOnNew = config->readBoolEntry(
"beep-on-mail",
false);
462 mConfirmEmpty = config->readBoolEntry(
"confirm-before-empty",
true);
464 mStartupFolder = config->readEntry(
"startupFolder", kmkernel->inboxFolder()->idString());
468 bool check = config->readBoolEntry(
"checkmail-startup",
false);
471 TQTimer::singleShot( 0,
this, TQ_SLOT( slotCheckMail() ) );
476 mFolderTree->reload();
484 bool layoutChanged = ( oldLongFolderList != mLongFolderList )
485 || ( oldReaderWindowActive != mReaderWindowActive )
486 || ( oldReaderWindowBelow != mReaderWindowBelow )
487 || ( oldFavoriteFolderView != mEnableFavoriteFolderView );
488 if ( layoutChanged ) {
492 mFolderTree->showFolder( mFolder );
495 mHeaders->setFolder(mFolder);
497 int aIdx = mHeaders->currentItemIndex();
499 mMsgView->setMsg( mFolder->getMsg(aIdx),
true );
501 mMsgView->clear(
true );
503 updateMessageActions();
514 void KMMainWidget::writeConfig(
void)
517 TDEConfig *config = KMKernel::config();
518 TDEConfigGroup geometry( config,
"Geometry" );
521 mMsgView->writeConfig();
523 if ( mFolderViewSplitter )
524 GlobalSettings::setFolderViewSplitterPosition( mFolderViewSplitter->sizes() );
525 mFolderTree->writeConfig();
526 if ( mFavoriteFolderView )
527 mFavoriteFolderView->writeConfig();
529 geometry.writeEntry(
"MainWin", this->geometry().size() );
531 const TQValueList<int> widths = ( mLongFolderList ? mPanner1 : mPanner2 )->sizes();
532 const TQValueList<int> heights = ( mLongFolderList ? mPanner2 : mPanner1 )->sizes();
534 geometry.writeEntry(
"FolderPaneWidth", widths[0] );
535 geometry.writeEntry(
"HeaderPaneWidth", widths[1] );
538 if ( mSearchAndHeaders && mSearchAndHeaders->isShown() ) {
539 geometry.writeEntry(
"HeaderPaneHeight", heights[0] );
540 geometry.writeEntry(
"ReaderPaneHeight", heights[1] );
544 geometry.writeEntry(
"UnreadColumn", mFolderTree->unreadIndex() );
545 geometry.writeEntry(
"TotalColumn", mFolderTree->totalIndex() );
546 geometry.writeEntry(
"SizeColumn", mFolderTree->sizeIndex() );
551 void KMMainWidget::createWidgets(
void)
554 TQWidget *headerParent = 0,
555 *mimeParent = 0, *messageParent = 0;
557 const bool opaqueResize = TDEGlobalSettings::opaqueResize();
558 if ( mLongFolderList ) {
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;
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;
582 if( mPanner1 ) mPanner1->dumpObjectTree();
583 if( mPanner2 ) mPanner2->dumpObjectTree();
586 mTopLayout->add( mPanner1 );
594 headerParent->dumpObjectTree();
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" );
603 mHeaders =
new KMHeaders(
this, mSearchAndHeaders,
"headers");
606 actionCollection(),
"headers quick search line" );
608 mQuickSearchLine =
new HeaderListQuickSearch( mSearchToolBar, mHeaders,
609 actionCollection(),
"headers quick search line" );
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();
619 if (mReaderWindowActive) {
620 connect(mHeaders, TQ_SIGNAL(selected(
KMMessage*)),
621 this, TQ_SLOT(slotMsgSelected(
KMMessage*)));
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()));
633 if (mReaderWindowActive) {
634 mMsgView =
new KMReaderWin(messageParent,
this, actionCollection(), 0 );
636 mMsgActions->setMessageView( mMsgView );
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()));
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() );
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() );
673 action =
new TDEAction( i18n(
"Jump to Folder"), Key_J,
this,
674 TQ_SLOT(slotJumpToFolder()), actionCollection(),
676 action->plugAccel( actionCollection()->tdeaccel() );
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;
689 mFolderTree =
new KMFolderTree(
this, folderTreeParent,
"folderTree");
690 if ( !GlobalSettings::enableFavoriteFolderView() ) {
691 mFolderView = mFolderTree;
693 connect( mFolderTree, TQ_SIGNAL(folderSelected(
KMFolder*)),
694 mFavoriteFolderView, TQ_SLOT(folderTreeSelectionChanged(
KMFolder*)) );
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()));
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*)) );
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() );
720 action =
new TDEAction(
721 i18n(
"Abort Current Operation"), Key_Escape, ProgressManager::instance(),
722 TQ_SLOT(slotAbortAll()), actionCollection(),
"cancel" );
723 action->plugAccel( actionCollection()->tdeaccel() );
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() );
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() );
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() );
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() );
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() );
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() );
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() ) );
763 void KMMainWidget::activatePanners(
void)
766 TQObject::disconnect( mMsgView->copyAction(),
767 TQ_SIGNAL( activated() ),
768 mMsgView, TQ_SLOT( slotCopySelectedText() ));
772 if ( mLongFolderList ) {
773 mSearchAndHeaders->reparent( mPanner2, 0, TQPoint( 0, 0 ) );
775 mMsgView->reparent( mPanner2, 0, TQPoint( 0, 0 ) );
776 mPanner2->moveToLast( mMsgView );
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 );
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 );
792 mMsgView->reparent( mPanner1, 0, TQPoint( 0, 0 ) );
793 mPanner1->moveToLast( mMsgView );
795 mPanner1->setSizes( mPanner1Sep );
796 mPanner2->setSizes( mPanner2Sep );
797 mPanner1->setResizeMode( mPanner2, TQSplitter::KeepSize );
798 mPanner2->setResizeMode( mFolderView, TQSplitter::KeepSize );
802 TQObject::connect( mMsgView->copyAction(),
803 TQ_SIGNAL( activated() ),
804 mMsgView, TQ_SLOT( slotCopySelectedText() ));
810 void KMMainWidget::hide()
817 void KMMainWidget::show()
823 void KMMainWidget::slotSearch()
827 mSearchWin =
new SearchWindow(
this,
"Search", mFolder,
false);
828 connect(mSearchWin, TQ_SIGNAL(destroyed()),
829 this, TQ_SLOT(slotSearchClosed()));
833 mSearchWin->activateFolder(mFolder);
837 KWin::activateWindow( mSearchWin->winId() );
842 void KMMainWidget::slotSearchClosed()
849 void KMMainWidget::slotFind()
852 mMsgView->slotFind();
857 void KMMainWidget::slotHelp()
864 void KMMainWidget::slotFilter()
866 kmkernel->filterMgr()->openDialog(
this );
871 void KMMainWidget::slotPopFilter()
873 kmkernel->popFilterMgr()->openDialog(
this );
876 void KMMainWidget::slotManageSieveScripts()
878 if ( !kmkernel->askToGoOnline() ) {
881 KMail::ManageSieveScriptsDialog * dlg =
new KMail::ManageSieveScriptsDialog(
this );
887 void KMMainWidget::slotAddrBook()
889 KAddrBookExternal::openAddressBook(
this);
894 void KMMainWidget::slotImport()
896 KRun::runCommand(
"kmailcvt");
900 void KMMainWidget::slotCheckMail()
902 if ( !kmkernel->askToGoOnline() ) {
905 kmkernel->acctMgr()->checkMail(
true);
909 void KMMainWidget::slotCheckOneAccount(
int item)
911 if ( !kmkernel->askToGoOnline() ) {
914 kmkernel->acctMgr()->intCheckMail(item);
918 void KMMainWidget::slotMailChecked(
bool newMail,
bool sendOnCheck,
919 const TQMap<TQString, int> & newInFolder )
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 ) ) )
928 if ( !newMail || newInFolder.isEmpty() )
931 kapp->dcopClient()->emitDCOPSignal(
"unreadCountChanged()", TQByteArray() );
934 bool showNotification =
false;
936 TQStringList keys( newInFolder.keys() );
938 for ( TQStringList::const_iterator it = keys.begin();
941 kdDebug(5006) << newInFolder.find( *it ).data() <<
" new message(s) in "
944 KMFolder *folder = kmkernel->findFolderById( *it );
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() )
961 if ( !showNotification )
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" )
970 summary = i18n(
"New mail arrived" );
973 if(kmkernel->xmlGuiInstance()) {
974 KNotifyClient::Instance instance(kmkernel->xmlGuiInstance());
975 KNotifyClient::event( topLevelWidget()->winId(),
"new-mail-arrived",
979 KNotifyClient::event( topLevelWidget()->winId(),
"new-mail-arrived",
983 KNotifyClient::beep();
989 void KMMainWidget::slotCompose()
991 KMail::Composer * win;
997 parser.process( NULL, mFolder );
998 win = KMail::makeComposer( msg, mFolder->identity() );
1002 parser.process( NULL, NULL );
1003 win = KMail::makeComposer( msg );
1012 void KMMainWidget::slotShowNewFromTemplate()
1015 const KPIM::Identity & ident =
1016 kmkernel->identityManager()->identityForUoidOrDefault( mFolder->identity() );
1017 mTemplateFolder = kmkernel->folderMgr()->findIdString( ident.templates() );
1019 else mTemplateFolder = kmkernel->templatesFolder();
1020 if ( !mTemplateFolder )
1023 mTemplateMenu->popupMenu()->clear();
1024 for (
int idx = 0; idx<mTemplateFolder->count(); ++idx ) {
1025 KMMsgBase *mb = mTemplateFolder->getMsgBase( idx );
1027 TQString subj = mb->subject();
1028 if ( subj.isEmpty() ) subj = i18n(
"No Subject");
1029 mTemplateMenu->popupMenu()->insertItem(
1030 KStringHandler::rsqueeze( subj.replace(
"&",
"&&" ) ), idx );
1035 void KMMainWidget::slotNewFromTemplate(
int id )
1037 if ( !mTemplateFolder )
1039 newFromTemplate(mTemplateFolder->getMsg(
id ) );
1043 void KMMainWidget::newFromTemplate(
KMMessage *msg )
1047 KMCommand *command =
new KMUseTemplateCommand(
this, msg );
1052 void KMMainWidget::slotPostToML()
1054 if ( mFolder && mFolder->isMailingListEnabled() ) {
1055 KMCommand *command =
new KMMailingListPostCommand(
this, mFolder );
1063 void KMMainWidget::slotFolderMailingListProperties()
1065 if (!mFolderTree)
return;
1066 KMFolderTreeItem *item =
static_cast<KMFolderTreeItem*
>( mFolderTree->currentItem() );
1067 if ( !item )
return;
1070 (
new KMail::MailingListFolderPropertiesDialog(
this, folder ) )->show();
1075 void KMMainWidget::slotFolderShortcutCommand()
1077 if (!mFolderTree)
return;
1078 KMFolderTreeItem *item =
static_cast<KMFolderTreeItem*
>( mFolderTree->currentItem() );
1080 item->assignShortcut();
1085 void KMMainWidget::slotModifyFolder()
1087 if (!mFolderTree)
return;
1088 KMFolderTreeItem *item =
static_cast<KMFolderTreeItem*
>( mFolderTree->currentItem() );
1090 modifyFolder( item );
1094 void KMMainWidget::modifyFolder( KMFolderTreeItem* folderItem )
1096 KMFolder* folder = folderItem->folder();
1097 KMFolderTree* folderTree =
static_cast<KMFolderTree *
>( folderItem->listView() );
1099 i18n(
"Properties of Folder %1").arg( folder->
label() ) );
1104 mSystemTray->foldersChanged();
1108 void KMMainWidget::slotExpireFolder()
1111 bool canBeExpired =
true;
1113 if (!mFolder)
return;
1115 if (!mFolder->isAutoExpire()) {
1116 canBeExpired =
false;
1117 }
else if (mFolder->getUnreadExpireUnits()==expireNever &&
1118 mFolder->getReadExpireUnits()==expireNever) {
1119 canBeExpired =
false;
1122 if (!canBeExpired) {
1123 str = i18n(
"This folder does not have any expiry options set");
1124 KMessageBox::information(
this, str);
1127 TDEConfig *config = KMKernel::config();
1128 TDEConfigGroupSaver saver(config,
"General");
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"),
1134 != KMessageBox::Continue)
return;
1137 mFolder->expireOldMessages(
true );
1141 void KMMainWidget::slotEmptyFolder()
1145 if (!mFolder)
return;
1146 bool isTrash = kmkernel->folderIsTrash(mFolder);
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() ) );
1156 if (KMessageBox::warningContinueCancel(
this, text, title, KGuiItem( title,
"edittrash"))
1157 != KMessageBox::Continue)
return;
1164 slotDeleteMsg(
false );
1169 if (mMsgView) mMsgView->clearCache();
1172 BroadcastStatus::instance()->setStatusMsg(i18n(
"Moved all messages to the trash"));
1174 updateMessageActions();
1178 mEmptyFolderAction->setEnabled(
false );
1182 void KMMainWidget::slotArchiveFolder()
1184 KMail::ArchiveFolderDialog archiveDialog;
1185 archiveDialog.setFolder( mFolder );
1186 archiveDialog.exec();
1190 void KMMainWidget::slotRemoveFolder()
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" ) );
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() ) );
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 "
1218 .arg( TQStyleSheet::escape( mFolder->label() ) );
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() ) );
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() ) );
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() ) );
1246 if (KMessageBox::warningContinueCancel(
this, str, title,
1247 KGuiItem( i18n(
"&Delete"),
"edit-delete"))
1248 == KMessageBox::Continue)
1250 KMail::FolderUtil::deleteFolder( mFolder,
this );
1255 void KMMainWidget::slotMarkAllAsRead()
1259 mFolder->markUnreadAsRead();
1263 void KMMainWidget::slotCompactFolder()
1266 int idx = mHeaders->currentItemIndex();
1268 mFolder->compact( KMFolder::CompactNow );
1270 TQString statusMsg = BroadcastStatus::instance()->statusMsg();
1271 mHeaders->setCurrentItemByIndex(idx);
1272 BroadcastStatus::instance()->setStatusMsg( statusMsg );
1278 void KMMainWidget::slotRefreshFolder()
1282 if ( mFolder->folderType() == KMFolderTypeImap || mFolder->folderType() == KMFolderTypeCachedImap ) {
1283 if ( !kmkernel->askToGoOnline() ) {
1288 if (mFolder->folderType() == KMFolderTypeImap)
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 );
1299 void KMMainWidget::slotTroubleshootFolder()
1303 if ( mFolder->folderType() == KMFolderTypeCachedImap ) {
1304 KMFolderCachedImap* f =
static_cast<KMFolderCachedImap*
>( mFolder->storage() );
1305 f->slotTroubleshoot();
1310 void 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();
1320 void KMMainWidget::slotExpireAll() {
1321 TDEConfig *config = KMKernel::config();
1324 TDEConfigGroupSaver saver(config,
"General");
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) {
1335 kmkernel->expireAllFoldersNow();
1339 void KMMainWidget::slotCompactAll()
1342 kmkernel->compactAllFolders();
1347 void KMMainWidget::slotOverrideHtml()
1349 if( mHtmlPref == mFolderHtmlPref ) {
1350 int result = KMessageBox::warningContinueCancel(
this,
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" ),
1357 "OverrideHtmlWarning",
false);
1358 if( result == KMessageBox::Cancel ) {
1359 mPreferHtmlAction->setChecked(
false );
1363 mFolderHtmlPref = !mFolderHtmlPref;
1365 mMsgView->setHtmlOverride(mFolderHtmlPref);
1366 mMsgView->update(
true );
1371 void KMMainWidget::slotOverrideHtmlLoadExt()
1373 if( mHtmlLoadExtPref == mFolderHtmlLoadExtPref ) {
1374 int result = KMessageBox::warningContinueCancel(
this,
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 );
1387 mFolderHtmlLoadExtPref = !mFolderHtmlLoadExtPref;
1389 mMsgView->setHtmlLoadExtDefault(mFolderHtmlLoadExtPref);
1390 mMsgView->update(
true );
1395 void KMMainWidget::slotOverrideThread()
1397 mFolderThreadPref = !mFolderThreadPref;
1398 mHeaders->setNestedOverride(mFolderThreadPref);
1399 mThreadBySubjectAction->setEnabled(mThreadMessagesAction->isChecked());
1403 void KMMainWidget::slotToggleSubjectThreading()
1405 mFolderThreadSubjPref = !mFolderThreadSubjPref;
1406 mHeaders->setSubjectThreading(mFolderThreadSubjPref);
1410 void KMMainWidget::slotToggleShowQuickSearch()
1412 GlobalSettings::self()->setQuickSearchActive( !GlobalSettings::self()->quickSearchActive() );
1413 if ( GlobalSettings::self()->quickSearchActive() )
1414 mSearchToolBar->show();
1416 mQuickSearchLine->reset();
1417 mSearchToolBar->hide();
1422 void KMMainWidget::slotMessageQueuedOrDrafted()
1424 if (!kmkernel->folderIsDraftOrOutbox(mFolder))
1427 mMsgView->update(
true);
1432 void KMMainWidget::slotForwardInlineMsg()
1434 KMMessageList* selected = mHeaders->selectedMsgs();
1435 KMCommand *command = 0L;
1436 if(selected && !selected->isEmpty()) {
1437 command =
new KMForwardInlineCommand(
this, *selected,
1438 mFolder->identity() );
1440 command =
new KMForwardInlineCommand(
this, mHeaders->currentMsg(),
1441 mFolder->identity() );
1449 void KMMainWidget::slotForwardAttachedMsg()
1451 KMMessageList* selected = mHeaders->selectedMsgs();
1452 KMCommand *command = 0L;
1453 if(selected && !selected->isEmpty()) {
1454 command =
new KMForwardAttachedCommand(
this, *selected, mFolder->identity() );
1456 command =
new KMForwardAttachedCommand(
this, mHeaders->currentMsg(), mFolder->identity() );
1463 void KMMainWidget::slotForwardDigestMsg()
1465 KMMessageList* selected = mHeaders->selectedMsgs();
1466 KMCommand *command = 0L;
1467 if(selected && !selected->isEmpty()) {
1468 command =
new KMForwardDigestCommand(
this, *selected, mFolder->identity() );
1470 command =
new KMForwardDigestCommand(
this, mHeaders->currentMsg(), mFolder->identity() );
1477 void KMMainWidget::slotUseTemplate()
1479 newFromTemplate( mHeaders->currentMsg() );
1483 void KMMainWidget::slotResendMsg()
1485 KMCommand *command =
new KMResendMessageCommand(
this, mHeaders->currentMsg() );
1491 void KMMainWidget::slotTrashMsg()
1493 mHeaders->deleteMsg();
1497 void KMMainWidget::slotDeleteMsg(
bool confirmDelete )
1499 mHeaders->moveMsgToFolder( 0, confirmDelete );
1503 void KMMainWidget::slotTrashThread()
1505 mHeaders->highlightCurrentThread();
1506 mHeaders->deleteMsg();
1510 void KMMainWidget::slotDeleteThread(
bool confirmDelete )
1512 mHeaders->highlightCurrentThread();
1513 mHeaders->moveMsgToFolder( 0, confirmDelete );
1517 void KMMainWidget::slotRedirectMsg()
1519 KMCommand *command =
new KMRedirectCommand(
this, mHeaders->currentMsg() );
1525 void KMMainWidget::slotCustomReplyToMsg(
int tid )
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(),
1539 void KMMainWidget::slotCustomReplyAllToMsg(
int tid )
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(),
1553 void KMMainWidget::slotCustomForwardMsg(
int tid )
1555 TQString tmpl = mCustomTemplates[ tid ];
1556 kdDebug() <<
"Forward with template: " << tmpl <<
" (" << tid <<
")" << endl;
1557 KMMessageList* selected = mHeaders->selectedMsgs();
1558 KMCommand *command = 0L;
1559 if(selected && !selected->isEmpty()) {
1560 command =
new KMCustomForwardCommand(
this, *selected,
1561 mFolder->identity(), tmpl );
1563 command =
new KMCustomForwardCommand(
this, mHeaders->currentMsg(),
1564 mFolder->identity(), tmpl );
1571 void KMMainWidget::slotNoQuoteReplyToMsg()
1573 KMCommand *command =
new KMNoQuoteReplyToCommand(
this, mHeaders->currentMsg() );
1578 void KMMainWidget::slotSubjectFilter()
1580 KMMessage *msg = mHeaders->currentMsg();
1584 KMCommand *command =
new KMFilterCommand(
"Subject", msg->
subject() );
1589 void KMMainWidget::slotMailingListFilter()
1591 KMMessage *msg = mHeaders->currentMsg();
1595 KMCommand *command =
new KMMailingListFilterCommand(
this, msg );
1600 void KMMainWidget::slotFromFilter()
1602 KMMessage *msg = mHeaders->currentMsg();
1606 AddrSpecList al = msg->extractAddrSpecs(
"From" );
1609 command =
new KMFilterCommand(
"From", msg->
from() );
1611 command =
new KMFilterCommand(
"From", al.front().asString() );
1616 void KMMainWidget::slotToFilter()
1618 KMMessage *msg = mHeaders->currentMsg();
1622 KMCommand *command =
new KMFilterCommand(
"To", msg->
to() );
1627 void KMMainWidget::updateListFilterAction()
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 );
1637 mListFilterAction->setEnabled(
true );
1638 mListFilterAction->setText( i18n(
"Filter on Mailing-List %1..." ).arg( lname ) );
1644 void KMMainWidget::slotUndo()
1647 updateMessageActions();
1652 void KMMainWidget::slotToggleUnread()
1654 mFolderTree->toggleColumn(KMFolderTree::unread);
1658 void KMMainWidget::slotToggleTotalColumn()
1660 mFolderTree->toggleColumn(KMFolderTree::total,
true);
1664 void KMMainWidget::slotToggleSizeColumn()
1666 mFolderTree->toggleColumn(KMFolderTree::foldersize);
1671 void KMMainWidget::slotJumpToFolder()
1673 KMail::KMFolderSelDlg dlg(
this, i18n(
"Jump to Folder"),
true );
1676 if (!dlg.exec())
return;
1677 if (!(dest = dlg.folder()))
return;
1679 slotSelectFolder( dest );
1683 void KMMainWidget::slotMoveMsg()
1685 KMail::KMFolderSelDlg dlg(
this, i18n(
"Move Message to Folder"),
true );
1688 if (!dlg.exec())
return;
1689 if (!(dest = dlg.folder()))
return;
1691 mHeaders->moveMsgToFolder(dest);
1695 void KMMainWidget::slotMoveMsgToFolder(
KMFolder *dest)
1697 mHeaders->moveMsgToFolder(dest);
1701 void KMMainWidget::slotCopyMsgToFolder(
KMFolder *dest)
1703 mHeaders->copyMsgToFolder(dest);
1707 void KMMainWidget::slotApplyFilters()
1709 mHeaders->applyFiltersOnMsg();
1713 void KMMainWidget::slotCheckVacation()
1715 updateVactionScripStatus(
false );
1716 if ( !kmkernel->askToGoOnline() )
1719 Vacation *vac =
new Vacation(
this,
true );
1720 connect( vac, TQ_SIGNAL(scriptActive(
bool)), TQ_SLOT(updateVactionScripStatus(
bool)) );
1723 void KMMainWidget::slotEditVacation()
1725 if ( !kmkernel->askToGoOnline() ) {
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()) );
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") );
1749 void KMMainWidget::slotDebugSieve()
1751 #if !defined(NDEBUG)
1752 if ( mSieveDebugDialog )
1756 mSieveDebugDialog->exec();
1757 delete mSieveDebugDialog;
1762 void KMMainWidget::slotStartCertManager()
1764 TDEProcess certManagerProc;
1766 certManagerProc <<
"kleopatra";
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" ) );
1773 kdDebug(5006) <<
"\nslotStartCertManager(): certificate manager started.\n" << endl;
1780 void KMMainWidget::slotStartWatchGnuPG()
1782 TDEProcess certManagerProc;
1783 certManagerProc <<
"kwatchgnupg";
1785 if( !certManagerProc.start( TDEProcess::DontCare ) )
1786 KMessageBox::error(
this, i18n(
"Could not start GnuPG LogViewer (kwatchgnupg); "
1787 "please check your installation." ),
1788 i18n(
"KMail Error" ) );
1792 void KMMainWidget::slotCopyMsg()
1794 KMail::KMFolderSelDlg dlg(
this, i18n(
"Copy Message to Folder"),
true );
1797 if (!dlg.exec())
return;
1798 if (!(dest = dlg.folder()))
return;
1800 mHeaders->copyMsgToFolder(dest);
1804 void KMMainWidget::slotPrintMsg()
1806 KMMessage *msg = mHeaders->currentMsg();
1811 bool htmlOverride = mMsgView ? mMsgView->htmlOverride() :
false;
1812 bool htmlLoadExtOverride = mMsgView ? mMsgView->htmlLoadExtOverride() :
false;
1813 TDEConfigGroup reader( KMKernel::config(),
"Reader" );
1814 bool useFixedFont = mMsgView ? mMsgView->isFixedFont()
1815 : reader.readBoolEntry(
"useFixedFont",
false );
1818 const HeaderStrategy *strategy;
1820 style = mMsgView->headerStyle();
1821 strategy = mMsgView->headerStrategy();
1823 style = HeaderStyle::create( reader.readEntry(
"header-style",
"fancy" ) );
1824 strategy = HeaderStrategy::create( reader.readEntry(
"header-set-displayed",
"rich" ) );
1827 KMPrintCommand *command =
1828 new KMPrintCommand(
this, msg,
1830 htmlOverride, htmlLoadExtOverride,
1831 useFixedFont, overrideEncoding() );
1833 command->setOverrideFont( mMsgView->cssHelper()->bodyFont( mMsgView->isFixedFont(),
true ) );
1839 void KMMainWidget::setupForwardActions()
1841 disconnect( mForwardActionMenu, TQ_SIGNAL( activated() ), 0, 0 );
1842 mForwardActionMenu->remove( mForwardInlineAction );
1843 mForwardActionMenu->remove( mForwardAttachedAction );
1845 if ( GlobalSettings::self()->forwardingInlineByDefault() ) {
1846 mForwardActionMenu->insert( mForwardInlineAction, 0 );
1847 mForwardActionMenu->insert( mForwardAttachedAction, 1 );
1848 mForwardInlineAction->setShortcut( Key_F );
1849 mForwardAttachedAction->setShortcut( SHIFT+Key_F );
1850 connect( mForwardActionMenu, TQ_SIGNAL(activated()),
this,
1851 TQ_SLOT(slotForwardInlineMsg()) );
1854 mForwardActionMenu->insert( mForwardAttachedAction, 0 );
1855 mForwardActionMenu->insert( mForwardInlineAction, 1 );
1856 mForwardInlineAction->setShortcut( SHIFT+Key_F );
1857 mForwardAttachedAction->setShortcut( Key_F );
1858 connect( mForwardActionMenu, TQ_SIGNAL(activated()),
this,
1859 TQ_SLOT(slotForwardAttachedMsg()) );
1864 void KMMainWidget::slotConfigChanged()
1867 setupForwardActions();
1868 setupForwardingActionsList();
1872 void KMMainWidget::slotSaveMsg()
1874 KMMessage *msg = mHeaders->currentMsg();
1877 KMSaveMsgCommand *saveCommand =
new KMSaveMsgCommand(
this,
1878 *mHeaders->selectedMsgs() );
1880 if (saveCommand->url().isEmpty())
1883 saveCommand->start();
1887 void KMMainWidget::slotOpenMsg()
1889 KMOpenMsgCommand *openCommand =
new KMOpenMsgCommand(
this, 0, overrideEncoding() );
1891 openCommand->start();
1895 void KMMainWidget::slotSaveAttachments()
1897 KMMessage *msg = mHeaders->currentMsg();
1900 KMSaveAttachmentsCommand *saveCommand =
new KMSaveAttachmentsCommand(
this,
1901 *mHeaders->selectedMsgs() );
1902 saveCommand->start();
1905 void KMMainWidget::slotOnlineStatus()
1909 if ( GlobalSettings::self()->networkState() == GlobalSettings::EnumNetworkState::Online ) {
1911 kmkernel->stopNetworkJobs();
1913 kmkernel->resumeNetworkJobs();
1914 slotCheckVacation();
1918 void KMMainWidget::slotUpdateOnlineStatus( GlobalSettings::EnumNetworkState::type )
1920 if ( GlobalSettings::self()->networkState() == GlobalSettings::EnumNetworkState::Online )
1921 actionCollection()->action(
"online_status" )->setText( i18n(
"Work Offline") );
1923 actionCollection()->action(
"online_status" )->setText( i18n(
"Work Online") );
1928 void KMMainWidget::slotSendQueued()
1930 if ( !kmkernel->askToGoOnline() ) {
1934 kmkernel->msgSender()->sendQueued();
1938 void KMMainWidget::slotSendQueuedVia(
int item )
1940 if ( !kmkernel->askToGoOnline() ) {
1945 TQString customTransport = availTransports[ item ];
1947 kmkernel->msgSender()->sendQueued( customTransport );
1951 void KMMainWidget::slotViewChange()
1953 if(mBodyPartsMenu->isItemChecked(mBodyPartsMenu->idAt(0)))
1955 mBodyPartsMenu->setItemChecked(mBodyPartsMenu->idAt(0),
false);
1956 mBodyPartsMenu->setItemChecked(mBodyPartsMenu->idAt(1),
true);
1958 else if(mBodyPartsMenu->isItemChecked(mBodyPartsMenu->idAt(1)))
1960 mBodyPartsMenu->setItemChecked(mBodyPartsMenu->idAt(1),
false);
1961 mBodyPartsMenu->setItemChecked(mBodyPartsMenu->idAt(0),
true);
1969 void KMMainWidget::folderSelectedUnread(
KMFolder* aFolder )
1971 folderSelected( aFolder,
true );
1972 slotChangeCaption( mFolderTree->currentItem() );
1976 void KMMainWidget::folderSelected()
1978 folderSelected( mFolder );
1981 if ( mFolder && mFolder->folderType() == KMFolderTypeImap )
1982 mFolder->close(
"mainwidget");
1986 void KMMainWidget::folderSelected(
KMFolder* aFolder,
bool forceJumpToUnread )
1991 mMsgView->clear(
true);
1993 if ( mFolder && mFolder->folderType() == KMFolderTypeImap && !mFolder->noContent() )
1995 KMFolderImap *imap =
static_cast<KMFolderImap*
>(mFolder->storage());
1996 if ( mFolder->needsCompacting() && imap->autoExpunge() )
1997 imap->expungeFolder(imap,
true);
2007 bool newFolder = ( (
KMFolder*)mFolder != aFolder );
2008 bool isNewImapFolder = aFolder && aFolder->
folderType() == KMFolderTypeImap && newFolder;
2010 || ( !isNewImapFolder && mShowBusySplashTimer )
2011 || ( newFolder && mShowingOfflineScreen && !( isNewImapFolder && kmkernel->isOffline() ) ) ) {
2013 mMsgView->enableMsgDisplay();
2014 mMsgView->clear(
true );
2016 if( mSearchAndHeaders && mHeaders )
2017 mSearchAndHeaders->show();
2018 mShowingOfflineScreen =
false;
2022 delete mShowBusySplashTimer;
2023 mShowBusySplashTimer = 0;
2026 writeFolderConfig();
2028 disconnect( mFolder, TQ_SIGNAL( changed() ),
2029 this, TQ_SLOT( updateMarkAsReadAction() ) );
2030 disconnect( mFolder, TQ_SIGNAL( msgHeaderChanged(
KMFolder*,
int ) ),
2031 this, TQ_SLOT( updateMarkAsReadAction() ) );
2032 disconnect( mFolder, TQ_SIGNAL( msgAdded(
int ) ),
2033 this, TQ_SLOT( updateMarkAsReadAction() ) );
2034 disconnect( mFolder, TQ_SIGNAL( msgRemoved(
KMFolder * ) ),
2035 this, TQ_SLOT( updateMarkAsReadAction() ) );
2040 if ( aFolder && aFolder->
folderType() == KMFolderTypeImap )
2042 if ( kmkernel->isOffline() ) {
2046 KMFolderImap *imap =
static_cast<KMFolderImap*
>(aFolder->storage());
2047 if ( newFolder && !mFolder->noContent() )
2049 imap->open(
"mainwidget");
2051 imap->setSelected(
true );
2052 connect( imap, TQ_SIGNAL( folderComplete( KMFolderImap*,
bool ) ),
2053 this, TQ_SLOT( folderSelected() ) );
2054 imap->getAndCheckFolder();
2055 mHeaders->setFolder( 0 );
2057 mForceJumpToUnread = forceJumpToUnread;
2061 mShowBusySplashTimer =
new TQTimer(
this );
2062 connect( mShowBusySplashTimer, TQ_SIGNAL( timeout() ),
this, TQ_SLOT( slotShowBusySplash() ) );
2063 mShowBusySplashTimer->start( GlobalSettings::self()->folderLoadingTimeout(),
true );
2067 disconnect( imap, TQ_SIGNAL( folderComplete( KMFolderImap*,
bool ) ),
2068 this, TQ_SLOT( folderSelected() ) );
2069 forceJumpToUnread = mForceJumpToUnread;
2074 connect( mFolder, TQ_SIGNAL( changed() ),
2075 this, TQ_SLOT( updateMarkAsReadAction() ) );
2076 connect( mFolder, TQ_SIGNAL( msgHeaderChanged(
KMFolder*,
int ) ),
2077 this, TQ_SLOT( updateMarkAsReadAction() ) );
2078 connect( mFolder, TQ_SIGNAL( msgAdded(
int ) ),
2079 this, TQ_SLOT( updateMarkAsReadAction() ) );
2080 connect( mFolder, TQ_SIGNAL( msgRemoved(
KMFolder *) ),
2081 this, TQ_SLOT( updateMarkAsReadAction() ) );
2086 mMsgView->setHtmlOverride(mFolderHtmlPref);
2087 mMsgView->setHtmlLoadExtDefault(mFolderHtmlLoadExtPref);
2089 mHeaders->setFolder( mFolder, forceJumpToUnread );
2090 updateMessageActions();
2097 void KMMainWidget::slotShowBusySplash()
2099 if ( mReaderWindowActive )
2101 mMsgView->displayBusyPage();
2103 if ( mSearchAndHeaders && mHeaders && mLongFolderList )
2104 mSearchAndHeaders->hide();
2108 void KMMainWidget::showOfflinePage()
2110 if ( !mReaderWindowActive )
return;
2111 mShowingOfflineScreen =
true;
2113 mMsgView->displayOfflinePage();
2115 if ( mSearchAndHeaders && mHeaders && mLongFolderList )
2116 mSearchAndHeaders->hide();
2120 void KMMainWidget::slotMsgSelected(
KMMessage *msg)
2122 if ( msg && msg->parent() && !msg->
isComplete() )
2127 mMsgView->setWaitingForSerNum( msg->getMsgSerNum() );
2130 disconnect( mJob, 0, mMsgView, 0 );
2133 mJob = msg->parent()->createJob( msg, FolderJob::tGetMessage, 0,
2134 "STRUCTURE", mMsgView->attachmentStrategy() );
2135 connect(mJob, TQ_SIGNAL(messageRetrieved(
KMMessage*)),
2136 mMsgView, TQ_SLOT(slotMessageArrived(
KMMessage*)));
2139 mMsgView->setMsg(msg);
2142 mMsgView->setHtmlOverride(mFolderHtmlPref);
2143 mMsgView->setHtmlLoadExtDefault(mFolderHtmlLoadExtPref);
2144 mMsgView->setHtmlLoadExtOverride(
false);
2145 mMsgView->setDecryptMessageOverwrite(
false );
2146 mMsgView->setShowSignatureDetails(
false );
2150 void KMMainWidget::slotMsgChanged()
2152 mHeaders->msgChanged();
2156 void KMMainWidget::slotSelectFolder(
KMFolder* folder)
2158 TQListViewItem* item = mFolderTree->indexOfFolder(folder);
2160 mFolderTree->ensureItemVisible( item );
2161 mFolderTree->doFolderSelected( item );
2166 void KMMainWidget::slotSelectMessage(
KMMessage* msg)
2168 int idx = mFolder->find(msg);
2170 mHeaders->setCurrentMsg(idx);
2172 mMsgView->setMsg(msg);
2174 slotMsgActivated(msg);
2179 void KMMainWidget::slotReplaceMsgByUnencryptedVersion()
2181 kdDebug(5006) <<
"KMMainWidget::slotReplaceMsgByUnencryptedVersion()" << endl;
2182 KMMessage* oldMsg = mHeaders->currentMsg();
2184 kdDebug(5006) <<
"KMMainWidget - old message found" << endl;
2186 kdDebug(5006) <<
"KMMainWidget - extra unencrypted message found" << endl;
2190 TQString msgId( oldMsg->
msgId() );
2191 TQString prefix(
"DecryptedMsg.");
2192 int oldIdx = msgId.find(prefix, 0,
false);
2193 if( -1 == oldIdx ) {
2194 int leftAngle = msgId.findRev(
'<' );
2195 msgId = msgId.insert( (-1 == leftAngle) ? 0 : ++leftAngle, prefix );
2200 TQCharRef c = msgId[ oldIdx+2 ];
2206 newMsg->setMsgId( msgId );
2207 mMsgView->setIdOfLastViewedMessage( msgId );
2210 kdDebug(5006) <<
"KMMainWidget - adding unencrypted message to folder" << endl;
2211 mFolder->addMsg( newMsg );
2214 int newMsgIdx = mFolder->find( newMsg );
2215 Q_ASSERT( newMsgIdx != -1 );
2217 mFolder->unGetMsg( newMsgIdx );
2218 int idx = mFolder->find( oldMsg );
2219 Q_ASSERT( idx != -1 );
2222 mHeaders->setCurrentItemByIndex( newMsgIdx );
2225 kdDebug(5006) <<
"KMMainWidget - deleting encrypted message" << endl;
2226 mFolder->take( idx );
2229 kdDebug(5006) <<
"KMMainWidget - updating message actions" << endl;
2230 updateMessageActions();
2232 kdDebug(5006) <<
"KMMainWidget - done." << endl;
2234 kdDebug(5006) <<
"KMMainWidget - NO EXTRA UNENCRYPTED MESSAGE FOUND" << endl;
2236 kdDebug(5006) <<
"KMMainWidget - PANIC: NO OLD MESSAGE FOUND" << endl;
2240 void KMMainWidget::slotSetThreadStatusNew()
2242 mHeaders->setThreadStatus(KMMsgStatusNew);
2246 void KMMainWidget::slotSetThreadStatusUnread()
2248 mHeaders->setThreadStatus(KMMsgStatusUnread);
2252 void KMMainWidget::slotSetThreadStatusFlag()
2254 mHeaders->setThreadStatus(KMMsgStatusFlag,
true);
2258 void KMMainWidget::slotSetThreadStatusRead()
2260 mHeaders->setThreadStatus(KMMsgStatusRead);
2264 void KMMainWidget::slotSetThreadStatusTodo()
2266 mHeaders->setThreadStatus(KMMsgStatusTodo,
true);
2270 void KMMainWidget::slotSetThreadStatusWatched()
2272 mHeaders->setThreadStatus(KMMsgStatusWatched,
true);
2273 if (mWatchThreadAction->isChecked()) {
2274 mIgnoreThreadAction->setChecked(
false);
2279 void KMMainWidget::slotSetThreadStatusIgnored()
2281 mHeaders->setThreadStatus(KMMsgStatusIgnored,
true);
2282 if (mIgnoreThreadAction->isChecked()) {
2283 mWatchThreadAction->setChecked(
false);
2288 void KMMainWidget::slotNextMessage() { mHeaders->nextMessage(); }
2289 void KMMainWidget::slotNextUnreadMessage()
2291 if ( !mHeaders->nextUnreadMessage() )
2292 if ( GlobalSettings::self()->loopOnGotoUnread() == GlobalSettings::EnumLoopOnGotoUnread::LoopInAllFolders )
2293 mFolderTree->nextUnreadFolder(
true);
2295 void KMMainWidget::slotNextImportantMessage() {
2298 void KMMainWidget::slotPrevMessage() { mHeaders->prevMessage(); }
2299 void KMMainWidget::slotPrevUnreadMessage()
2301 if ( !mHeaders->prevUnreadMessage() )
2302 if ( GlobalSettings::self()->loopOnGotoUnread() == GlobalSettings::EnumLoopOnGotoUnread::LoopInAllFolders )
2303 mFolderTree->prevUnreadFolder();
2305 void KMMainWidget::slotPrevImportantMessage() {
2309 void KMMainWidget::slotDisplayCurrentMessage()
2311 if ( mHeaders->currentMsg() )
2312 slotMsgActivated( mHeaders->currentMsg() );
2316 void KMMainWidget::slotMsgActivated(
KMMessage *msg)
2320 FolderJob *job = msg->parent()->createJob( msg );
2321 connect( job, TQ_SIGNAL( messageRetrieved(
KMMessage* ) ),
2322 TQ_SLOT( slotMsgActivated(
KMMessage* ) ) );
2327 if (kmkernel->folderIsDraftOrOutbox( mFolder ) ) {
2328 mMsgActions->editCurrentMessage();
2331 if ( kmkernel->folderIsTemplates( mFolder ) ) {
2337 KMReaderMainWin *win =
new KMReaderMainWin( mFolderHtmlPref, mFolderHtmlLoadExtPref );
2338 TDEConfigGroup reader( KMKernel::config(),
"Reader" );
2339 bool useFixedFont = mMsgView ? mMsgView->isFixedFont()
2340 : reader.readBoolEntry(
"useFixedFont",
false );
2341 win->setUseFixedFont( useFixedFont );
2343 newMessage->setParent( msg->parent() );
2346 win->showMsg( overrideEncoding(), newMessage );
2351 void KMMainWidget::slotMarkAll()
2353 mHeaders->selectAll(
true );
2357 void KMMainWidget::slotMsgPopup(
KMMessage&,
const KURL &aUrl,
const TQPoint& aPoint)
2359 TDEPopupMenu * menu =
new TDEPopupMenu;
2360 updateMessageMenu();
2363 bool urlMenuAdded =
false;
2365 if (!aUrl.isEmpty())
2367 if (aUrl.protocol() ==
"mailto")
2370 mMsgView->mailToComposeAction()->plug( menu );
2371 mMsgView->mailToReplyAction()->plug( menu );
2372 mMsgView->mailToForwardAction()->plug( menu );
2374 menu->insertSeparator();
2375 mMsgView->addAddrBookAction()->plug( menu );
2376 mMsgView->openAddrBookAction()->plug( menu );
2377 mMsgView->copyURLAction()->plug( menu );
2378 mMsgView->startImChatAction()->plug( menu );
2380 mMsgView->startImChatAction()->setEnabled( kmkernel->imProxy()->initialize() );
2384 mMsgView->urlOpenAction()->plug( menu );
2385 mMsgView->addBookmarksAction()->plug( menu );
2386 mMsgView->urlSaveAsAction()->plug( menu );
2387 mMsgView->copyURLAction()->plug( menu );
2389 if ( aUrl.protocol() ==
"im" )
2394 mMsgView->startImChatAction()->plug( menu );
2398 kdDebug( 0 ) << k_funcinfo <<
" URL is: " << aUrl << endl;
2402 if(mMsgView && !mMsgView->copyText().isEmpty()) {
2404 menu->insertSeparator();
2405 mMsgActions->replyMenu()->plug(menu);
2406 menu->insertSeparator();
2408 mMsgView->copyAction()->plug( menu );
2409 mMsgView->selectAllAction()->plug( menu );
2410 }
else if ( !urlMenuAdded )
2414 if (!mHeaders->currentMsg())
2421 if ( mFolder->isTemplates() ) {
2422 mUseAction->plug( menu );
2424 mMsgActions->replyMenu()->plug( menu );
2425 mForwardActionMenu->plug( menu );
2427 editAction()->plug(menu);
2428 menu->insertSeparator();
2430 mCopyActionMenu->plug( menu );
2431 mMoveActionMenu->plug( menu );
2433 menu->insertSeparator();
2435 mMsgActions->messageStatusMenu()->plug( menu );
2436 menu->insertSeparator();
2438 viewSourceAction()->plug(menu);
2440 mMsgView->toggleFixFontAction()->plug(menu);
2441 mMsgView->toggleMimePartTreeAction()->plug(menu);
2443 menu->insertSeparator();
2444 mPrintAction->plug( menu );
2445 mSaveAsAction->plug( menu );
2446 mSaveAttachmentsAction->plug( menu );
2448 menu->insertSeparator();
2449 if( mFolder->isTrash() )
2450 mDeleteAction->plug( menu );
2452 mTrashAction->plug( menu );
2454 menu->insertSeparator();
2455 mMsgActions->createTodoAction()->plug( menu );
2457 TDEAcceleratorManager::manage(menu);
2458 menu->exec(aPoint, 0);
2463 void KMMainWidget::getAccountMenu()
2465 TQStringList actList;
2468 actList = kmkernel->acctMgr()->getAccounts();
2469 TQStringList::Iterator it;
2471 for(it = actList.begin(); it != actList.end() ; ++it,
id++)
2472 mActMenu->insertItem((*it).replace(
"&",
"&&"),
id);
2476 void KMMainWidget::getTransportMenu()
2478 TQStringList availTransports;
2482 TQStringList::Iterator it;
2484 for(it = availTransports.begin(); it != availTransports.end() ; ++it,
id++)
2485 mSendMenu->insertItem((*it).replace(
"&",
"&&"),
id);
2489 void KMMainWidget::updateCustomTemplateMenus()
2491 if ( !mCustomTemplateActions.isEmpty() ) {
2492 TQPtrList<TDEAction>::iterator ait = mCustomTemplateActions.begin();
2493 for ( ; ait != mCustomTemplateActions.end() ; ++ait ) {
2494 (*ait)->unplugAll();
2497 mCustomTemplateActions.clear();
2500 delete mCustomReplyActionMenu;
2501 delete mCustomReplyAllActionMenu;
2502 delete mCustomForwardActionMenu;
2504 delete mCustomReplyMapper;
2505 delete mCustomReplyAllMapper;
2506 delete mCustomForwardMapper;
2508 mCustomForwardActionMenu =
2509 new TDEActionMenu( i18n(
"Forward With Custom Template"),
2510 "mail_custom_forward",
2511 actionCollection(),
"custom_forward" );
2512 TQSignalMapper *mCustomForwardMapper =
new TQSignalMapper(
this );
2513 connect( mCustomForwardMapper, TQ_SIGNAL( mapped(
int ) ),
2514 this, TQ_SLOT( slotCustomForwardMsg(
int ) ) );
2515 mForwardActionMenu->insert( mCustomForwardActionMenu );
2517 mCustomReplyActionMenu =
2518 new TDEActionMenu( i18n(
"Reply With Custom Template"),
"mail_custom_reply",
2519 actionCollection(),
"custom_reply" );
2520 TQSignalMapper *mCustomReplyMapper =
new TQSignalMapper(
this );
2521 connect( mCustomReplyMapper, TQ_SIGNAL( mapped(
int ) ),
2522 this, TQ_SLOT( slotCustomReplyToMsg(
int ) ) );
2523 mMsgActions->replyMenu()->insert( mCustomReplyActionMenu );
2525 mCustomReplyAllActionMenu =
2526 new TDEActionMenu( i18n(
"Reply to All With Custom Template"),
2527 "mail_custom_reply_all",
2528 actionCollection(),
"custom_reply_all" );
2529 TQSignalMapper *mCustomReplyAllMapper =
new TQSignalMapper(
this );
2530 connect( mCustomReplyAllMapper, TQ_SIGNAL( mapped(
int ) ),
2531 this, TQ_SLOT( slotCustomReplyAllToMsg(
int ) ) );
2532 mMsgActions->replyMenu()->insert( mCustomReplyAllActionMenu );
2534 mCustomTemplates.clear();
2536 TQStringList list = GlobalSettingsBase::self()->customTemplates();
2537 TQStringList::iterator it = list.begin();
2542 for ( ; it != list.end(); ++it ) {
2543 CTemplates t( *it );
2544 mCustomTemplates.append( *it );
2547 switch ( t.type() ) {
2548 case CustomTemplates::TReply:
2549 action =
new TDEAction( (*it).replace(
"&",
"&&" ),
2550 TDEShortcut( t.shortcut() ),
2555 mCustomReplyMapper->setMapping( action, idx );
2556 mCustomReplyActionMenu->insert( action, idx );
2557 mCustomTemplateActions.append( action );
2560 case CustomTemplates::TReplyAll:
2561 action =
new TDEAction( (*it).replace(
"&",
"&&" ),
2562 TDEShortcut( t.shortcut() ),
2563 mCustomReplyAllMapper,
2567 mCustomReplyAllMapper->setMapping( action, idx );
2568 mCustomReplyAllActionMenu->insert( action, idx );
2569 mCustomTemplateActions.append( action );
2572 case CustomTemplates::TForward:
2573 action =
new TDEAction( (*it).replace(
"&",
"&&" ),
2574 TDEShortcut( t.shortcut() ),
2575 mCustomForwardMapper,
2579 mCustomForwardMapper->setMapping( action, idx );
2580 mCustomForwardActionMenu->insert( action, idx );
2581 mCustomTemplateActions.append( action );
2584 case CustomTemplates::TUniversal:
2585 action =
new TDEAction( (*it).replace(
"&",
"&&" ),
2586 TDEShortcut::null(),
2591 mCustomReplyMapper->setMapping( action, idx );
2592 mCustomReplyActionMenu->insert( action, idx );
2593 mCustomTemplateActions.append( action );
2595 action =
new TDEAction( (*it).replace(
"&",
"&&" ),
2596 TDEShortcut::null(),
2597 mCustomReplyAllMapper,
2601 mCustomReplyAllMapper->setMapping( action, idx );
2602 mCustomReplyAllActionMenu->insert( action, idx );
2603 mCustomTemplateActions.append( action );
2605 action =
new TDEAction( (*it).replace(
"&",
"&&" ),
2606 TDEShortcut::null(),
2607 mCustomForwardMapper,
2611 mCustomForwardMapper->setMapping( action, idx );
2612 mCustomForwardActionMenu->insert( action, idx );
2613 mCustomTemplateActions.append( action );
2621 mCustomReplyActionMenu->popupMenu()->insertItem( i18n(
"(no custom templates)" ), 0 );
2622 mCustomReplyActionMenu->popupMenu()->setItemEnabled( 0,
false );
2623 mCustomReplyActionMenu->setEnabled(
false);
2626 mCustomReplyAllActionMenu->popupMenu()->insertItem( i18n(
"(no custom templates)" ), 0 );
2627 mCustomReplyAllActionMenu->popupMenu()->setItemEnabled( 0,
false );
2628 mCustomReplyAllActionMenu->setEnabled(
false);
2631 mCustomForwardActionMenu->popupMenu()->insertItem( i18n(
"(no custom templates)" ), 0 );
2632 mCustomForwardActionMenu->popupMenu()->setItemEnabled( 0,
false );
2633 mCustomForwardActionMenu->setEnabled(
false);
2640 void KMMainWidget::setupActions()
2643 mMsgActions->setMessageView( mMsgView );
2646 mSaveAsAction =
new TDEAction( i18n(
"Save &As..."),
"document-save",
2647 TDEStdAccel::shortcut(TDEStdAccel::Save),
2648 this, TQ_SLOT(slotSaveMsg()), actionCollection(),
"file_save_as" );
2650 mOpenAction = KStdAction::open(
this, TQ_SLOT( slotOpenMsg() ),
2651 actionCollection() );
2653 (void)
new TDEAction( i18n(
"&Compact All Folders"), 0,
2654 this, TQ_SLOT(slotCompactAll()),
2655 actionCollection(),
"compact_all_folders" );
2657 (void)
new TDEAction( i18n(
"&Expire All Folders"), 0,
2658 this, TQ_SLOT(slotExpireAll()),
2659 actionCollection(),
"expire_all_folders" );
2661 (void)
new TDEAction( i18n(
"&Refresh Local IMAP Cache"),
"refresh",
2662 this, TQ_SLOT(slotInvalidateIMAPFolders()),
2663 actionCollection(),
"file_invalidate_imap_cache" );
2665 (void)
new TDEAction( i18n(
"Empty All &Trash Folders"), 0,
2667 actionCollection(),
"empty_trash" );
2669 (void)
new TDEAction( i18n(
"Check &Mail"),
"mail_get", CTRL+Key_L,
2670 this, TQ_SLOT(slotCheckMail()),
2671 actionCollection(),
"check_mail" );
2673 mFavoritesCheckMailAction =
new TDEAction( i18n(
"Check Mail in Favorite Folders"),
2674 "mail_get", CTRL+SHIFT+Key_L, 0, 0,
2675 actionCollection(),
"favorite_check_mail" );
2676 if ( mFavoriteFolderView )
2677 connect( mFavoritesCheckMailAction, TQ_SIGNAL(activated()), mFavoriteFolderView, TQ_SLOT(checkMail()) );
2679 TDEActionMenu *actActionMenu =
new
2680 TDEActionMenu( i18n(
"Check Mail &In"),
"mail_get", actionCollection(),
2682 actActionMenu->setDelayed(
true);
2684 connect(actActionMenu,TQ_SIGNAL(activated()),
this,TQ_SLOT(slotCheckMail()));
2686 mActMenu = actActionMenu->popupMenu();
2687 connect(mActMenu,TQ_SIGNAL(activated(
int)),
this,TQ_SLOT(slotCheckOneAccount(
int)));
2688 connect(mActMenu,TQ_SIGNAL(aboutToShow()),
this,TQ_SLOT(getAccountMenu()));
2690 (void)
new TDEAction( i18n(
"&Send Queued Messages"),
"mail-send", 0,
this,
2691 TQ_SLOT(slotSendQueued()), actionCollection(),
"send_queued");
2693 (void)
new TDEAction( i18n(
"Online Status (unknown)"),
"online_status", 0,
this,
2694 TQ_SLOT(slotOnlineStatus()), actionCollection(),
"online_status");
2696 TDEActionMenu *sendActionMenu =
new
2697 TDEActionMenu( i18n(
"Send Queued Messages Via"),
"mail_send_via", actionCollection(),
2698 "send_queued_via" );
2699 sendActionMenu->setDelayed(
true);
2701 mSendMenu = sendActionMenu->popupMenu();
2702 connect(mSendMenu,TQ_SIGNAL(activated(
int)),
this, TQ_SLOT(slotSendQueuedVia(
int)));
2703 connect(mSendMenu,TQ_SIGNAL(aboutToShow()),
this,TQ_SLOT(getTransportMenu()));
2707 if (parent()->inherits(
"KMMainWin")) {
2708 act =
new TDEAction( i18n(
"&Address Book..."),
"contents", 0,
this,
2709 TQ_SLOT(slotAddrBook()), actionCollection(),
"addressbook" );
2710 if (TDEStandardDirs::findExe(
"kaddressbook").isEmpty()) act->setEnabled(
false);
2713 act =
new TDEAction( i18n(
"Certificate Manager..."),
"pgp-keys", 0,
this,
2714 TQ_SLOT(slotStartCertManager()), actionCollection(),
"tools_start_certman");
2716 if (TDEStandardDirs::findExe(
"kleopatra").isEmpty()) act->setEnabled(
false);
2718 act =
new TDEAction( i18n(
"GnuPG Log Viewer..."),
"pgp-keys", 0,
this,
2719 TQ_SLOT(slotStartWatchGnuPG()), actionCollection(),
"tools_start_kwatchgnupg");
2721 if (TDEStandardDirs::findExe(
"kwatchgnupg").isEmpty()) act->setEnabled(
false);
2723 act =
new TDEAction( i18n(
"&Import Messages..."),
"document-open", 0,
this,
2724 TQ_SLOT(slotImport()), actionCollection(),
"import" );
2725 if (TDEStandardDirs::findExe(
"kmailcvt").isEmpty()) act->setEnabled(
false);
2727 #if !defined(NDEBUG)
2728 (void)
new TDEAction( i18n(
"&Debug Sieve..."),
2729 "idea", 0,
this, TQ_SLOT(slotDebugSieve()),
2730 actionCollection(),
"tools_debug_sieve" );
2733 if ( GlobalSettings::allowOutOfOfficeSettings() ) {
2734 (void)
new TDEAction( i18n(
"Edit \"Out of Office\" Replies..."),
2735 "configure", 0,
this, TQ_SLOT(slotEditVacation()),
2736 actionCollection(),
"tools_edit_vacation" );
2740 (void)
new TDEAction( i18n(
"Filter &Log Viewer..."), 0,
this,
2741 TQ_SLOT(slotFilterLogViewer()), actionCollection(),
"filter_log_viewer" );
2743 (void)
new TDEAction( i18n(
"&Anti-Spam Wizard..."), 0,
this,
2744 TQ_SLOT(slotAntiSpamWizard()), actionCollection(),
"antiSpamWizard" );
2745 (void)
new TDEAction( i18n(
"&Anti-Virus Wizard..."), 0,
this,
2746 TQ_SLOT(slotAntiVirusWizard()), actionCollection(),
"antiVirusWizard" );
2749 mTrashAction =
new TDEAction( KGuiItem( i18n(
"&Move to Trash"),
"edittrash",
2750 i18n(
"Move message to trashcan") ),
2751 Key_Delete,
this, TQ_SLOT(slotTrashMsg()),
2752 actionCollection(),
"move_to_trash" );
2758 mDeleteAction =
new TDEAction( i18n(
"&Delete"),
"edit-delete", SHIFT+Key_Delete,
this,
2759 TQ_SLOT(slotDeleteMsg()), actionCollection(),
"delete" );
2760 mDeleteAction->plugAccel( actionCollection()->tdeaccel() );
2762 mTrashThreadAction =
new TDEAction( KGuiItem( i18n(
"M&ove Thread to Trash"),
"edittrash",
2763 i18n(
"Move thread to trashcan") ),
2764 CTRL+Key_Delete,
this, TQ_SLOT(slotTrashThread()),
2765 actionCollection(),
"move_thread_to_trash" );
2767 mDeleteThreadAction =
new TDEAction( i18n(
"Delete T&hread"),
"edit-delete", CTRL+SHIFT+Key_Delete,
this,
2768 TQ_SLOT(slotDeleteThread()), actionCollection(),
"delete_thread" );
2771 (void)
new TDEAction( i18n(
"&Find Messages..."),
"mail_find", Key_S,
this,
2772 TQ_SLOT(slotRequestFullSearchFromQuickSearch()), actionCollection(),
"search_messages" );
2774 mFindInMessageAction =
new TDEAction( i18n(
"&Find in Message..."),
"edit-find", TDEStdAccel::shortcut(TDEStdAccel::Find),
this,
2775 TQ_SLOT(slotFind()), actionCollection(),
"find_in_messages" );
2777 (void)
new TDEAction( i18n(
"Select &All Messages"), TDEStdAccel::selectAll(),
this,
2778 TQ_SLOT(slotMarkAll()), actionCollection(),
"mark_all_messages" );
2781 mNewFolderAction =
new TDEAction( i18n(
"&New Folder..."),
"folder-new", 0, mFolderTree,
2782 TQ_SLOT(addChildFolder()), actionCollection(),
"new_folder" );
2784 mModifyFolderAction =
new TDEAction( i18n(
"&Properties"),
"configure", 0,
this,
2785 TQ_SLOT(slotModifyFolder()), actionCollection(),
"modify" );
2787 mFolderMailingListPropertiesAction =
new TDEAction( i18n(
"&Mailing List Management..."),
2788 0,
this, TQ_SLOT( slotFolderMailingListProperties() ),
2789 actionCollection(),
"folder_mailinglist_properties" );
2791 mFolderShortCutCommandAction =
new TDEAction( i18n(
"&Assign Shortcut..."),
"configure_shortcuts",
2792 0,
this, TQ_SLOT( slotFolderShortcutCommand() ), actionCollection(),
2793 "folder_shortcut_command" );
2796 mMarkAllAsReadAction =
new TDEAction( i18n(
"Mark All Messages as &Read"),
"goto", 0,
this,
2797 TQ_SLOT(slotMarkAllAsRead()), actionCollection(),
"mark_all_as_read" );
2799 mExpireFolderAction =
new TDEAction(i18n(
"&Expiration Settings"), 0,
this, TQ_SLOT(slotExpireFolder()),
2800 actionCollection(),
"expire");
2802 mCompactFolderAction =
new TDEAction( i18n(
"&Compact Folder"), 0,
this,
2803 TQ_SLOT(slotCompactFolder()), actionCollection(),
"compact" );
2805 mRefreshFolderAction =
new TDEAction( i18n(
"Check Mail &in This Folder"),
"reload",
2806 TDEStdAccel::shortcut( TDEStdAccel::Reload ),
this,
2807 TQ_SLOT(slotRefreshFolder()),
2808 actionCollection(),
"refresh_folder" );
2809 mTroubleshootFolderAction = 0;
2811 mEmptyFolderAction =
new TDEAction(
"foo" ,
"edittrash", 0,
this,
2812 TQ_SLOT(slotEmptyFolder()), actionCollection(),
"empty" );
2814 mRemoveFolderAction =
new TDEAction(
"foo" ,
"edit-delete", 0,
this,
2815 TQ_SLOT(slotRemoveFolder()), actionCollection(),
"delete_folder" );
2817 mArchiveFolderAction =
new TDEAction( i18n(
"&Archive Folder..." ),
"document-save", 0,
this,
2818 TQ_SLOT( slotArchiveFolder() ), actionCollection(),
2821 mPreferHtmlAction =
new TDEToggleAction( i18n(
"Prefer &HTML to Plain Text"), 0,
this,
2822 TQ_SLOT(slotOverrideHtml()), actionCollection(),
"prefer_html" );
2824 mPreferHtmlLoadExtAction =
new TDEToggleAction( i18n(
"Load E&xternal References"), 0,
this,
2825 TQ_SLOT(slotOverrideHtmlLoadExt()), actionCollection(),
"prefer_html_external_refs" );
2827 mThreadMessagesAction =
new TDEToggleAction( i18n(
"&Thread Messages"), 0,
this,
2828 TQ_SLOT(slotOverrideThread()), actionCollection(),
"thread_messages" );
2830 mThreadBySubjectAction =
new TDEToggleAction( i18n(
"Thread Messages also by &Subject"), 0,
this,
2831 TQ_SLOT(slotToggleSubjectThreading()), actionCollection(),
"thread_messages_by_subject" );
2833 new TDEAction( i18n(
"Copy Folder"),
"edit-copy", SHIFT+CTRL+Key_C, folderTree(),
2834 TQ_SLOT(copyFolder()), actionCollection(),
"copy_folder" );
2835 new TDEAction( i18n(
"Cut Folder"),
"edit-cut", SHIFT+CTRL+Key_X, folderTree(),
2836 TQ_SLOT(cutFolder()), actionCollection(),
"cut_folder" );
2837 new TDEAction( i18n(
"Paste Folder"),
"edit-paste", SHIFT+CTRL+Key_V, folderTree(),
2838 TQ_SLOT(pasteFolder()), actionCollection(),
"paste_folder" );
2840 new TDEAction( i18n(
"Copy Messages"),
"edit-copy", ALT+CTRL+Key_C, headers(),
2841 TQ_SLOT(copyMessages()), actionCollection(),
"copy_messages" );
2842 new TDEAction( i18n(
"Cut Messages"),
"edit-cut", ALT+CTRL+Key_X, headers(),
2843 TQ_SLOT(cutMessages()), actionCollection(),
"cut_messages" );
2844 new TDEAction( i18n(
"Paste Messages"),
"edit-paste", ALT+CTRL+Key_V, headers(),
2845 TQ_SLOT(pasteMessages()), actionCollection(),
"paste_messages" );
2848 (void)
new TDEAction( i18n(
"&New Message..."),
"mail-message-new", TDEStdAccel::shortcut(TDEStdAccel::New),
this,
2849 TQ_SLOT(slotCompose()), actionCollection(),
"new_message" );
2851 new TDEActionMenu( i18n(
"New Message From &Template"),
"document-new",
2852 actionCollection(),
"new_from_template" );
2853 mTemplateMenu->setDelayed(
true );
2854 connect( mTemplateMenu->popupMenu(), TQ_SIGNAL( aboutToShow() ),
this,
2855 TQ_SLOT( slotShowNewFromTemplate() ) );
2856 connect( mTemplateMenu->popupMenu(), TQ_SIGNAL( activated(
int) ),
this,
2857 TQ_SLOT( slotNewFromTemplate(
int) ) );
2859 TDEAction* newToML =
new TDEAction( i18n(
"New Message t&o Mailing-List..."),
"mail_post_to",
2860 CTRL+SHIFT+Key_N,
this,
2861 TQ_SLOT(slotPostToML()), actionCollection(),
"post_message" );
2862 newToML->plugAccel( actionCollection()->tdeaccel() );
2864 mForwardActionMenu =
new TDEActionMenu( i18n(
"Message->",
"&Forward"),
2865 "mail-forward", actionCollection(),
2866 "message_forward" );
2868 mForwardInlineAction =
new TDEAction( i18n(
"&Inline..."),
2869 "mail-forward", 0,
this,
2870 TQ_SLOT(slotForwardInlineMsg()),
2872 "message_forward_inline" );
2874 mForwardAttachedAction =
new TDEAction( i18n(
"Message->Forward->",
"As &Attachment..."),
2875 "mail-forward", 0,
this,
2876 TQ_SLOT(slotForwardAttachedMsg()),
2878 "message_forward_as_attachment" );
2880 mForwardDigestAction =
new TDEAction( i18n(
"Message->Forward->",
"As Di&gest..."),
2881 "mail-forward", 0,
this,
2882 TQ_SLOT(slotForwardDigestMsg()),
2884 "message_forward_as_digest" );
2886 mRedirectAction =
new TDEAction( i18n(
"Message->Forward->",
"&Redirect..."),
2887 "mail-forward", Key_E,
this,
2888 TQ_SLOT(slotRedirectMsg()),
2890 "message_forward_redirect" );
2893 setupForwardActions();
2895 mForwardActionMenu->insert( mForwardDigestAction );
2896 mForwardActionMenu->insert( mRedirectAction );
2898 mSendAgainAction =
new TDEAction( i18n(
"Send A&gain..."), 0,
this,
2899 TQ_SLOT(slotResendMsg()), actionCollection(),
"send_again" );
2903 mFilterMenu =
new TDEActionMenu( i18n(
"&Create Filter"),
"filter", actionCollection(),
"create_filter" );
2904 connect( mFilterMenu, TQ_SIGNAL(activated()),
this,
2905 TQ_SLOT(slotFilter()) );
2906 mSubjectFilterAction =
new TDEAction( i18n(
"Filter on &Subject..."), 0,
this,
2907 TQ_SLOT(slotSubjectFilter()),
2908 actionCollection(),
"subject_filter");
2909 mFilterMenu->insert( mSubjectFilterAction );
2911 mFromFilterAction =
new TDEAction( i18n(
"Filter on &From..."), 0,
this,
2912 TQ_SLOT(slotFromFilter()),
2913 actionCollection(),
"from_filter");
2914 mFilterMenu->insert( mFromFilterAction );
2916 mToFilterAction =
new TDEAction( i18n(
"Filter on &To..."), 0,
this,
2917 TQ_SLOT(slotToFilter()),
2918 actionCollection(),
"to_filter");
2919 mFilterMenu->insert( mToFilterAction );
2921 mListFilterAction =
new TDEAction( i18n(
"Filter on Mailing-&List..."), 0,
this,
2922 TQ_SLOT(slotMailingListFilter()), actionCollection(),
2924 mFilterMenu->insert( mListFilterAction );
2926 mPrintAction = KStdAction::print (
this, TQ_SLOT(slotPrintMsg()), actionCollection());
2928 mUseAction =
new TDEAction( i18n(
"New Message From &Template"),
"document-new",
2929 Key_N,
this, TQ_SLOT( slotUseTemplate() ),
2930 actionCollection(),
"use_template" );
2931 mUseAction->plugAccel( actionCollection()->tdeaccel() );
2934 mThreadStatusMenu =
new TDEActionMenu ( i18n(
"Mark &Thread" ),
2935 actionCollection(),
"thread_status" );
2937 mMarkThreadAsReadAction =
new TDEAction(KGuiItem(i18n(
"Mark Thread as &Read"),
"kmmsgread",
2938 i18n(
"Mark all messages in the selected thread as read")),
2939 0,
this, TQ_SLOT(slotSetThreadStatusRead()),
2940 actionCollection(),
"thread_read");
2941 mThreadStatusMenu->insert( mMarkThreadAsReadAction );
2943 mMarkThreadAsNewAction =
new TDEAction(KGuiItem(i18n(
"Mark Thread as &New"),
"kmmsgnew",
2944 i18n(
"Mark all messages in the selected thread as new")),
2945 0,
this, TQ_SLOT(slotSetThreadStatusNew()),
2946 actionCollection(),
"thread_new");
2947 mThreadStatusMenu->insert( mMarkThreadAsNewAction );
2949 mMarkThreadAsUnreadAction =
new TDEAction(KGuiItem(i18n(
"Mark Thread as &Unread"),
"kmmsgunseen",
2950 i18n(
"Mark all messages in the selected thread as unread")),
2951 0,
this, TQ_SLOT(slotSetThreadStatusUnread()),
2952 actionCollection(),
"thread_unread");
2953 mThreadStatusMenu->insert( mMarkThreadAsUnreadAction );
2955 mThreadStatusMenu->insert(
new TDEActionSeparator(
this ) );
2958 mToggleThreadFlagAction =
new TDEToggleAction(i18n(
"Mark Thread as &Important"),
"mail_flag",
2959 0,
this, TQ_SLOT(slotSetThreadStatusFlag()),
2960 actionCollection(),
"thread_flag");
2961 mToggleThreadFlagAction->setCheckedState( i18n(
"Remove &Important Thread Mark") );
2962 mThreadStatusMenu->insert( mToggleThreadFlagAction );
2964 mToggleThreadTodoAction =
new TDEToggleAction(i18n(
"Mark Thread as &Action Item"),
"mail_todo",
2965 0,
this, TQ_SLOT(slotSetThreadStatusTodo()),
2966 actionCollection(),
"thread_todo");
2967 mToggleThreadTodoAction->setCheckedState( i18n(
"Remove &Action Item Thread Mark") );
2968 mThreadStatusMenu->insert( mToggleThreadTodoAction );
2971 mWatchThreadAction =
new TDEToggleAction(i18n(
"&Watch Thread"),
"kmmsgwatched",
2972 0,
this, TQ_SLOT(slotSetThreadStatusWatched()),
2973 actionCollection(),
"thread_watched");
2975 mIgnoreThreadAction =
new TDEToggleAction(i18n(
"&Ignore Thread"),
"mail_ignore",
2976 0,
this, TQ_SLOT(slotSetThreadStatusIgnored()),
2977 actionCollection(),
"thread_ignored");
2979 mThreadStatusMenu->insert(
new TDEActionSeparator(
this ) );
2980 mThreadStatusMenu->insert( mWatchThreadAction );
2981 mThreadStatusMenu->insert( mIgnoreThreadAction );
2983 mSaveAttachmentsAction =
new TDEAction( i18n(
"Save A&ttachments..."),
"attach",
2984 0,
this, TQ_SLOT(slotSaveAttachments()),
2985 actionCollection(),
"file_save_attachments" );
2987 mMoveActionMenu =
new TDEActionMenu( i18n(
"&Move To" ),
2988 actionCollection(),
"move_to" );
2990 mCopyActionMenu =
new TDEActionMenu( i18n(
"&Copy To" ),
2991 actionCollection(),
"copy_to" );
2993 mApplyAllFiltersAction =
new TDEAction( i18n(
"Appl&y All Filters"),
"filter",
2995 TQ_SLOT(slotApplyFilters()),
2996 actionCollection(),
"apply_filters" );
2998 mApplyFilterActionsMenu =
new TDEActionMenu( i18n(
"A&pply Filter" ),
3000 "apply_filter_actions" );
3004 TDEActionMenu * unreadMenu =
3005 new TDEActionMenu( i18n(
"View->",
"&Unread Count"),
3006 actionCollection(),
"view_unread" );
3007 unreadMenu->setToolTip( i18n(
"Choose how to display the count of unread messages") );
3009 mUnreadColumnToggle =
new TDERadioAction( i18n(
"View->Unread Count",
"View in &Separate Column"), 0,
this,
3010 TQ_SLOT(slotToggleUnread()),
3011 actionCollection(),
"view_unread_column" );
3012 mUnreadColumnToggle->setExclusiveGroup(
"view_unread_group" );
3013 unreadMenu->insert( mUnreadColumnToggle );
3015 mUnreadTextToggle =
new TDERadioAction( i18n(
"View->Unread Count",
"View After &Folder Name"), 0,
this,
3016 TQ_SLOT(slotToggleUnread()),
3017 actionCollection(),
"view_unread_text" );
3018 mUnreadTextToggle->setExclusiveGroup(
"view_unread_group" );
3019 unreadMenu->insert( mUnreadTextToggle );
3022 mTotalColumnToggle =
new TDEToggleAction( i18n(
"View->",
"&Total Column"), 0,
this,
3023 TQ_SLOT(slotToggleTotalColumn()),
3024 actionCollection(),
"view_columns_total" );
3025 mTotalColumnToggle->setToolTip( i18n(
"Toggle display of column showing the "
3026 "total number of messages in folders.") );
3027 mSizeColumnToggle =
new TDEToggleAction( i18n(
"View->",
"&Size Column"), 0,
this,
3028 TQ_SLOT(slotToggleSizeColumn()),
3029 actionCollection(),
"view_columns_size" );
3030 mSizeColumnToggle->setToolTip( i18n(
"Toggle display of column showing the "
3031 "total size of messages in folders.") );
3033 (void)
new TDEAction( KGuiItem( i18n(
"View->",
"&Expand Thread"), TQString(),
3034 i18n(
"Expand the current thread") ),
3036 TQ_SLOT(slotExpandThread()),
3037 actionCollection(),
"expand_thread" );
3039 (void)
new TDEAction( KGuiItem( i18n(
"View->",
"&Collapse Thread"), TQString(),
3040 i18n(
"Collapse the current thread") ),
3042 TQ_SLOT(slotCollapseThread()),
3043 actionCollection(),
"collapse_thread" );
3045 (void)
new TDEAction( KGuiItem( i18n(
"View->",
"Ex&pand All Threads"), TQString(),
3046 i18n(
"Expand all threads in the current folder") ),
3047 CTRL+Key_Period,
this,
3048 TQ_SLOT(slotExpandAllThreads()),
3049 actionCollection(),
"expand_all_threads" );
3051 (void)
new TDEAction( KGuiItem( i18n(
"View->",
"C&ollapse All Threads"), TQString(),
3052 i18n(
"Collapse all threads in the current folder") ),
3053 CTRL+Key_Comma,
this,
3054 TQ_SLOT(slotCollapseAllThreads()),
3055 actionCollection(),
"collapse_all_threads" );
3057 mViewSourceAction =
new TDEAction( i18n(
"&View Source"), Key_V,
this,
3058 TQ_SLOT(slotShowMsgSrc()), actionCollection(),
3061 TDEAction* dukeOfMonmoth =
new TDEAction( i18n(
"&Display Message"), Key_Return,
this,
3062 TQ_SLOT( slotDisplayCurrentMessage() ), actionCollection(),
3063 "display_message" );
3064 dukeOfMonmoth->plugAccel( actionCollection()->tdeaccel() );
3067 new TDEAction( KGuiItem( i18n(
"&Next Message"), TQString(),
3068 i18n(
"Go to the next message") ),
3069 "N;Right",
this, TQ_SLOT(slotNextMessage()),
3070 actionCollection(),
"go_next_message" );
3072 new TDEAction( KGuiItem( i18n(
"Next &Unread Message"),
3073 TQApplication::reverseLayout() ?
"go-previous" :
"go-next",
3074 i18n(
"Go to the next unread message") ),
3075 Key_Plus,
this, TQ_SLOT(slotNextUnreadMessage()),
3076 actionCollection(),
"go_next_unread_message" );
3085 new TDEAction( KGuiItem( i18n(
"&Previous Message"), TQString(),
3086 i18n(
"Go to the previous message") ),
3087 "P;Left",
this, TQ_SLOT(slotPrevMessage()),
3088 actionCollection(),
"go_prev_message" );
3090 new TDEAction( KGuiItem( i18n(
"Previous Unread &Message"),
3091 TQApplication::reverseLayout() ?
"go-next" :
"go-previous",
3092 i18n(
"Go to the previous unread message") ),
3093 Key_Minus,
this, TQ_SLOT(slotPrevUnreadMessage()),
3094 actionCollection(),
"go_prev_unread_message" );
3104 new TDEAction( KGuiItem( i18n(
"Next Unread &Folder"), TQString(),
3105 i18n(
"Go to the next folder with unread messages") ),
3106 ALT+Key_Plus,
this, TQ_SLOT(slotNextUnreadFolder()),
3107 actionCollection(),
"go_next_unread_folder" );
3108 TDEShortcut shortcut = action->shortcut();
3109 shortcut.append( KKey( CTRL+Key_Plus ) );
3110 action->setShortcut( shortcut );
3113 new TDEAction( KGuiItem( i18n(
"Previous Unread F&older"), TQString(),
3114 i18n(
"Go to the previous folder with unread messages") ),
3115 ALT+Key_Minus,
this, TQ_SLOT(slotPrevUnreadFolder()),
3116 actionCollection(),
"go_prev_unread_folder" );
3117 shortcut = action->shortcut();
3118 shortcut.append( KKey( CTRL+Key_Minus ) );
3119 action->setShortcut( shortcut );
3121 new TDEAction( KGuiItem( i18n(
"Go->",
"Next Unread &Text"), TQString(),
3122 i18n(
"Go to the next unread text"),
3123 i18n(
"Scroll down current message. "
3124 "If at end of current message, "
3125 "go to next unread message.") ),
3126 Key_Space,
this, TQ_SLOT(slotReadOn()),
3127 actionCollection(),
"go_next_unread_text" );
3130 mToggleShowQuickSearchAction =
new TDEToggleAction(i18n(
"Show Quick Search"), TQString(),
3131 0,
this, TQ_SLOT(slotToggleShowQuickSearch()),
3132 actionCollection(),
"show_quick_search");
3133 mToggleShowQuickSearchAction->setChecked( GlobalSettings::self()->quickSearchActive() );
3134 mToggleShowQuickSearchAction->setWhatsThis(
3135 i18n( GlobalSettings::self()->quickSearchActiveItem()->whatsThis().utf8() ) );
3137 (void)
new TDEAction( i18n(
"Configure &Filters..."), 0,
this,
3138 TQ_SLOT(slotFilter()), actionCollection(),
"filter" );
3139 (void)
new TDEAction( i18n(
"Configure &POP Filters..."), 0,
this,
3140 TQ_SLOT(slotPopFilter()), actionCollection(),
"popFilter" );
3141 (void)
new TDEAction( i18n(
"Manage &Sieve Scripts..."), 0,
this,
3142 TQ_SLOT(slotManageSieveScripts()), actionCollection(),
"sieveFilters" );
3144 (void)
new TDEAction( KGuiItem( i18n(
"KMail &Introduction"), 0,
3145 i18n(
"Display KMail's Welcome Page") ),
3146 0,
this, TQ_SLOT(slotIntro()),
3147 actionCollection(),
"help_kmail_welcomepage" );
3151 (void)
new TDEAction( i18n(
"Configure &Notifications..."),
3153 TQ_SLOT(slotEditNotifications()), actionCollection(),
3154 "kmail_configure_notifications" );
3156 (void)
new TDEAction( i18n(
"&Configure KMail..."),
3157 "configure", 0, kmkernel,
3158 TQ_SLOT(slotShowConfigurationDialog()), actionCollection(),
3159 "kmail_configure_kmail" );
3161 KStdAction::undo(
this, TQ_SLOT(slotUndo()), actionCollection(),
"kmail_undo");
3163 KStdAction::tipOfDay(
this, TQ_SLOT( slotShowTip() ), actionCollection() );
3165 menutimer =
new TQTimer(
this,
"menutimer" );
3166 connect( menutimer, TQ_SIGNAL( timeout() ), TQ_SLOT( updateMessageActions() ) );
3167 connect( kmkernel->undoStack(),
3168 TQ_SIGNAL( undoStackChanged() ),
this, TQ_SLOT( slotUpdateUndo() ));
3170 initializeIMAPActions(
false );
3171 updateMessageActions();
3172 updateCustomTemplateMenus();
3176 void KMMainWidget::setupForwardingActionsList()
3178 TQPtrList<TDEAction> mForwardActionList;
3179 if ( GlobalSettings::self()->forwardingInlineByDefault() ) {
3180 mGUIClient->unplugActionList(
"forward_action_list" );
3181 mForwardActionList.append( mForwardInlineAction );
3182 mForwardActionList.append( mForwardAttachedAction );
3183 mForwardActionList.append( mForwardDigestAction );
3184 mForwardActionList.append( mRedirectAction );
3185 mGUIClient->plugActionList(
"forward_action_list", mForwardActionList );
3187 mGUIClient->unplugActionList(
"forward_action_list" );
3188 mForwardActionList.append( mForwardAttachedAction );
3189 mForwardActionList.append( mForwardInlineAction );
3190 mForwardActionList.append( mForwardDigestAction );
3191 mForwardActionList.append( mRedirectAction );
3192 mGUIClient->plugActionList(
"forward_action_list", mForwardActionList );
3197 void KMMainWidget::slotEditNotifications()
3199 if(kmkernel->xmlGuiInstance())
3200 KNotifyDialog::configure(
this, 0, kmkernel->xmlGuiInstance()->aboutData());
3202 KNotifyDialog::configure(
this);
3205 void KMMainWidget::slotEditKeys()
3207 KKeyDialog::configure( actionCollection(),
3213 void KMMainWidget::slotReadOn()
3218 if ( !mMsgView->atBottom() ) {
3219 mMsgView->slotJumpDown();
3222 slotNextUnreadMessage();
3225 void KMMainWidget::slotNextUnreadFolder() {
3226 if ( !mFolderTree )
return;
3227 mFolderTree->nextUnreadFolder();
3230 void KMMainWidget::slotPrevUnreadFolder() {
3231 if ( !mFolderTree )
return;
3232 mFolderTree->prevUnreadFolder();
3235 void KMMainWidget::slotExpandThread()
3237 mHeaders->slotExpandOrCollapseThread(
true );
3240 void KMMainWidget::slotCollapseThread()
3242 mHeaders->slotExpandOrCollapseThread(
false );
3245 void KMMainWidget::slotExpandAllThreads()
3247 mHeaders->slotExpandOrCollapseAllThreads(
true );
3250 void KMMainWidget::slotCollapseAllThreads()
3252 mHeaders->slotExpandOrCollapseAllThreads(
false );
3256 void KMMainWidget::slotShowMsgSrc()
3259 mMsgView->setUpdateAttachment(
false );
3260 KMMessage *msg = mHeaders->currentMsg();
3263 KMCommand *command =
new KMShowMsgSrcCommand(
this, msg,
3265 ? mMsgView->isFixedFont()
3272 void KMMainWidget::moveSelectedToFolder(
int menuId )
3274 if (mMenuToFolder[menuId])
3275 mHeaders->moveMsgToFolder( mMenuToFolder[menuId] );
3280 void KMMainWidget::copySelectedToFolder(
int menuId )
3282 if (mMenuToFolder[menuId])
3283 mHeaders->copyMsgToFolder( mMenuToFolder[menuId] );
3288 void KMMainWidget::updateMessageMenu()
3290 mMenuToFolder.clear();
3291 folderTree()->folderToPopupMenu( KMFolderTree::MoveMessage,
this,
3292 &mMenuToFolder, mMoveActionMenu->popupMenu() );
3293 folderTree()->folderToPopupMenu( KMFolderTree::CopyMessage,
this,
3294 &mMenuToFolder, mCopyActionMenu->popupMenu() );
3295 updateMessageActions();
3298 void KMMainWidget::startUpdateMessageActionsTimer()
3301 menutimer->start( 20,
true );
3304 void KMMainWidget::updateMessageActions()
3307 TQPtrList<TQListViewItem> selectedItems;
3310 for (TQListViewItem *item = mHeaders->firstChild(); item; item = item->itemBelow())
3311 if (item->isSelected() )
3312 selectedItems.append(item);
3313 if ( selectedItems.isEmpty() && mFolder->count() )
3316 count = selectedItems.count();
3317 mMsgActions->setCurrentMessage( mHeaders->currentMsg() );
3318 mMsgActions->setSelectedSernums( mHeaders->selectedSernums() );
3319 mMsgActions->setSelectedVisibleSernums( mHeaders->selectedVisibleSernums() );
3321 mMsgActions->setCurrentMessage( 0 );
3324 updateListFilterAction();
3326 bool allSelectedInCommonThread =
false;
3327 if ( mHeaders->isThreaded() && count > 1 ) {
3328 allSelectedInCommonThread =
true;
3329 for ( TQPtrListIterator<TQListViewItem> it( selectedItems ) ;
3330 it.current() ; ++ it ) {
3331 TQListViewItem * item = *it;
3332 if ( item->parent()==0 && item->childCount()==0 ) {
3333 allSelectedInCommonThread =
false;
3338 else if ( mHeaders->isThreaded() && count == 1 ) {
3339 allSelectedInCommonThread =
true;
3342 TQListViewItem *curItemParent = mHeaders->currentItem();
3343 bool parent_thread = 0;
3344 if ( curItemParent && curItemParent->firstChild() != 0 ) parent_thread = 1;
3346 bool mass_actions = count >= 1;
3347 bool thread_actions = mass_actions && allSelectedInCommonThread &&
3348 mHeaders->isThreaded();
3349 bool flags_available = GlobalSettings::self()->allowLocalFlags() || !(mFolder ? mFolder->isReadOnly() :
true);
3350 mThreadStatusMenu->setEnabled( thread_actions );
3353 mWatchThreadAction->setEnabled( thread_actions && flags_available );
3354 mIgnoreThreadAction->setEnabled( thread_actions && flags_available );
3355 mMarkThreadAsNewAction->setEnabled( thread_actions );
3356 mMarkThreadAsReadAction->setEnabled( thread_actions );
3357 mMarkThreadAsUnreadAction->setEnabled( thread_actions );
3358 mToggleThreadTodoAction->setEnabled( thread_actions && flags_available );
3359 mToggleThreadFlagAction->setEnabled( thread_actions && flags_available );
3360 mTrashThreadAction->setEnabled( thread_actions && mFolder->canDeleteMessages() );
3361 mDeleteThreadAction->setEnabled( thread_actions && mFolder->canDeleteMessages() );
3363 if (mFolder && mHeaders && mHeaders->currentMsg()) {
3364 if (thread_actions) {
3365 mToggleThreadTodoAction->setChecked(mHeaders->currentMsg()->isTodo());
3366 mToggleThreadFlagAction->setChecked(mHeaders->currentMsg()->isImportant());
3367 mWatchThreadAction->setChecked( mHeaders->currentMsg()->isWatched());
3368 mIgnoreThreadAction->setChecked( mHeaders->currentMsg()->isIgnored());
3372 mMoveActionMenu->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3373 mMoveMsgToFolderAction->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3374 mCopyActionMenu->setEnabled( mass_actions );
3375 mTrashAction->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3376 mDeleteAction->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3377 mFindInMessageAction->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ) );
3378 mForwardInlineAction->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ));
3379 mForwardAttachedAction->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ) );
3380 mForwardDigestAction->setEnabled( ( count > 1 || parent_thread ) && !kmkernel->folderIsTemplates( mFolder ) );
3382 forwardMenu()->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ));
3384 bool single_actions = count == 1;
3385 mUseAction->setEnabled( single_actions &&
3386 kmkernel->folderIsTemplates( mFolder ) );
3387 filterMenu()->setEnabled( single_actions );
3388 redirectAction()->setEnabled( single_actions && !kmkernel->folderIsTemplates( mFolder ) );
3389 printAction()->setEnabled( single_actions );
3390 viewSourceAction()->setEnabled( single_actions );
3392 mSendAgainAction->setEnabled( single_actions
3393 && ( ( mHeaders->currentMsg() && mHeaders->currentMsg()->isSent() )
3394 || ( mFolder && mHeaders->currentMsg() &&
3395 kmkernel->folderIsSentMailFolder( mFolder ) ) ) );
3396 mSaveAsAction->setEnabled( mass_actions );
3397 bool mails = mFolder && mFolder->count();
3398 bool enable_goto_unread = mails
3399 || (GlobalSettings::self()->loopOnGotoUnread() == GlobalSettings::EnumLoopOnGotoUnread::LoopInAllFolders);
3400 actionCollection()->action(
"go_next_message" )->setEnabled( mails );
3401 actionCollection()->action(
"go_next_unread_message" )->setEnabled( enable_goto_unread );
3402 actionCollection()->action(
"go_prev_message" )->setEnabled( mails );
3403 actionCollection()->action(
"go_prev_unread_message" )->setEnabled( enable_goto_unread );
3404 actionCollection()->action(
"send_queued" )->setEnabled( kmkernel->outboxFolder()->count() > 0 );
3405 actionCollection()->action(
"send_queued_via" )->setEnabled( kmkernel->outboxFolder()->count() > 0 );
3406 slotUpdateOnlineStatus(
static_cast<GlobalSettingsBase::EnumNetworkState::type
>( GlobalSettings::self()->networkState() ) );
3407 if (action(
"edit_undo" ))
3408 action(
"edit_undo" )->setEnabled( mHeaders->canUndo() );
3413 if((aIdx = mHeaders->currentItemIndex()) <= -1)
3415 if(!(msg = mFolder->getMsg(aIdx)))
3418 if ((
KMFolder*)mFolder == kmkernel->outboxFolder())
3422 mApplyAllFiltersAction->setEnabled(count);
3423 mApplyFilterActionsMenu->setEnabled(count);
3427 void KMMainWidget::updateMarkAsReadAction()
3429 mMarkAllAsReadAction->setEnabled( mFolder && (mFolder->countUnread() > 0) );
3433 void KMMainWidget::updateFolderMenu()
3435 bool folderWithContent = mFolder && !mFolder->noContent();
3436 bool multiFolder = folderTree()->selectedFolders().count() > 1;
3437 mModifyFolderAction->setEnabled( folderWithContent && !multiFolder );
3438 mFolderMailingListPropertiesAction->setEnabled( folderWithContent && !multiFolder );
3439 mCompactFolderAction->setEnabled( folderWithContent && !multiFolder );
3442 bool imap = mFolder && mFolder->folderType() == KMFolderTypeImap;
3443 bool cachedImap = mFolder && mFolder->folderType() == KMFolderTypeCachedImap;
3445 bool knownImapPath = cachedImap && !
static_cast<KMFolderCachedImap*
>( mFolder->storage() )->imapPath().isEmpty();
3446 mRefreshFolderAction->setEnabled( folderWithContent && ( imap
3447 || ( cachedImap && knownImapPath ) ) && !multiFolder );
3448 if ( mTroubleshootFolderAction )
3449 mTroubleshootFolderAction->setEnabled( folderWithContent && ( cachedImap && knownImapPath ) && !multiFolder );
3451 mEmptyFolderAction->setEnabled( folderWithContent &&
3452 ( mFolder->count() > 0 ) && mFolder->canDeleteMessages() &&
3454 mEmptyFolderAction->setText( ( mFolder && kmkernel->folderIsTrash( mFolder ) ) ?
3455 i18n(
"E&mpty Trash" ) :
3456 i18n(
"&Move All Messages to Trash" ) );
3458 mRemoveFolderAction->setEnabled( mFolder &&
3459 !mFolder->isSystemFolder() &&
3460 mFolder->canDeleteMessages() &&
3461 !multiFolder && !mFolder->noContent() &&
3462 !mFolder->mailCheckInProgress() );
3463 mRemoveFolderAction->setText( mFolder &&
3464 mFolder->folderType() == KMFolderTypeSearch ?
3465 i18n(
"&Delete Search" ) :
3466 i18n(
"&Delete Folder" ) );
3468 if ( mArchiveFolderAction )
3469 mArchiveFolderAction->setEnabled( mFolder && !multiFolder );
3470 mExpireFolderAction->setEnabled( mFolder && mFolder->isAutoExpire() && !multiFolder && mFolder->canDeleteMessages() );
3471 updateMarkAsReadAction();
3473 mPreferHtmlAction->setEnabled( mHeaders->folder() ?
true :
false );
3474 mPreferHtmlLoadExtAction->setEnabled( mHeaders->folder() && (mHtmlPref ? !mFolderHtmlPref : mFolderHtmlPref) ?
true :
false );
3475 mThreadMessagesAction->setEnabled( mHeaders->folder() ?
true :
false );
3477 mPreferHtmlAction->setChecked( mHtmlPref ? !mFolderHtmlPref : mFolderHtmlPref );
3478 mPreferHtmlLoadExtAction->setChecked( mHtmlLoadExtPref ? !mFolderHtmlLoadExtPref : mFolderHtmlLoadExtPref );
3479 mThreadMessagesAction->setChecked(
3480 mThreadPref ? !mFolderThreadPref : mFolderThreadPref );
3481 mThreadBySubjectAction->setEnabled(
3482 mHeaders->folder() ? ( mThreadMessagesAction->isChecked()) :
false );
3483 mThreadBySubjectAction->setChecked( mFolderThreadSubjPref );
3485 mNewFolderAction->setEnabled( !multiFolder && ( mFolder && mFolder->folderType() != KMFolderTypeSearch ));
3486 mRemoveDuplicatesAction->setEnabled( !multiFolder && mFolder && mFolder->canDeleteMessages() );
3487 mFolderShortCutCommandAction->setEnabled( !multiFolder );
3492 static TQString fmt(
long n) {
3495 if(n > 1024*1024*1024)
3496 sprintf(buf,
"%0.2f GB", ((
double)n)/1024.0/1024.0/1024.0);
3497 else if(n > 1024*1024)
3498 sprintf(buf,
"%0.2f MB", ((
double)n)/1024.0/1024.0);
3500 sprintf(buf,
"%0.2f KB", ((
double)n)/1024.0);
3502 sprintf(buf,
"%ld Byte", n);
3503 return TQString(buf);
3507 void KMMainWidget::slotMemInfo() {
3512 TQString s = TQString(
"\nMALLOC - Info\n\n"
3513 "Number of mmapped regions : %1\n"
3514 "Memory allocated in use : %2\n"
3515 "Memory allocated, not used: %3\n"
3516 "Memory total allocated : %4\n"
3517 "Max. freeable memory : %5\n")
3518 .arg(mi.hblks).arg(fmt(mi.uordblks)).arg(fmt(mi.fordblks))
3519 .arg(fmt(mi.arena)).arg(fmt(mi.keepcost));
3520 KMessageBox::information(0, s,
"Malloc information", s);
3526 void KMMainWidget::slotIntro()
3528 if ( !mMsgView )
return;
3530 mMsgView->clear(
true );
3532 if ( mSearchAndHeaders && mHeaders && mLongFolderList )
3533 mSearchAndHeaders->hide();
3536 mMsgView->displayAboutPage();
3541 void KMMainWidget::slotShowStartupFolder()
3543 if ( mFolderTree ) {
3544 mFolderTree->reload();
3545 mFolderTree->readConfig();
3547 mFolderTree->cleanupConfigFile();
3550 connect( kmkernel->filterMgr(), TQ_SIGNAL( filterListUpdated() ),
3551 this, TQ_SLOT( initializeFilterActions() ));
3554 initializeFilterActions();
3557 initializeFolderShortcutActions();
3560 if ( kmkernel->firstStart() ||
3561 GlobalSettings::self()->previousNewFeaturesMD5() != newFeaturesMD5 ) {
3562 GlobalSettings::self()->setPreviousNewFeaturesMD5( newFeaturesMD5 );
3568 if ( !mStartupFolder.isEmpty() ) {
3570 startup = kmkernel->findFolderById( mStartupFolder );
3573 startup = kmkernel->inboxFolder();
3575 if ( mFolderTree ) {
3576 mFolderTree->showFolder( startup );
3580 void KMMainWidget::slotShowTip()
3582 KTipDialog::showTip(
this, TQString(),
true );
3586 void KMMainWidget::slotChangeCaption(TQListViewItem * i)
3591 for ( TQListViewItem * item = i ; item ; item = item->parent() )
3592 names.prepend( item->text(0) );
3593 emit captionChangeRequest( names.join(
"/" ) );
3597 void KMMainWidget::removeDuplicates()
3602 mHeaders->setFolder(0);
3603 TQMap< TQString, TQValueList<int> > idMD5s;
3604 TQValueList<int> redundantIds;
3605 TQValueList<int>::Iterator kt;
3606 mFolder->
open(
"removedups");
3607 for (
int i = mFolder->count() - 1; i >= 0; --i) {
3608 TQString
id = (*mFolder)[i]->msgIdMD5();
3609 if ( !
id.isEmpty() ) {
3610 TQString subjMD5 = (*mFolder)[i]->strippedSubjectMD5();
3612 if ( idMD5s.contains(
id) )
3613 other = idMD5s[id].first();
3615 idMD5s[id].append( i );
3616 if ( other != -1 ) {
3617 TQString otherSubjMD5 = (*mFolder)[other]->strippedSubjectMD5();
3618 if (otherSubjMD5 == subjMD5)
3619 idMD5s[id].append( i );
3623 TQMap< TQString, TQValueList<int> >::Iterator it;
3624 for ( it = idMD5s.begin(); it != idMD5s.end() ; ++it ) {
3625 TQValueList<int>::Iterator jt;
3626 bool finished =
false;
3627 for ( jt = (*it).begin(); jt != (*it).end() && !finished; ++jt )
3628 if (!((*mFolder)[*jt]->isUnread())) {
3630 (*it).prepend( *jt );
3633 for ( jt = (*it).begin(), ++jt; jt != (*it).end(); ++jt )
3634 redundantIds.append( *jt );
3636 qHeapSort( redundantIds );
3637 kt = redundantIds.end();
3638 int numDuplicates = 0;
3639 if (kt != redundantIds.begin())
do {
3640 mFolder->removeMsg( *(--kt) );
3643 while (kt != redundantIds.begin());
3645 mFolder->close(
"removedups");
3646 mHeaders->setFolder(oFolder);
3648 if ( numDuplicates )
3649 msg = i18n(
"Removed %n duplicate message.",
3650 "Removed %n duplicate messages.", numDuplicates );
3652 msg = i18n(
"No duplicate messages found.");
3653 BroadcastStatus::instance()->setStatusMsg( msg );
3658 void KMMainWidget::slotUpdateUndo()
3660 if (actionCollection()->action(
"edit_undo" ))
3661 actionCollection()->action(
"edit_undo" )->setEnabled( mHeaders->canUndo() );
3666 void KMMainWidget::clearFilterActions()
3668 if ( !mFilterTBarActions.isEmpty() ) {
3669 if ( mGUIClient->factory() )
3670 mGUIClient->unplugActionList(
"toolbar_filter_actions" );
3671 mFilterTBarActions.clear();
3673 mApplyFilterActionsMenu->popupMenu()->clear();
3674 if ( !mFilterMenuActions.isEmpty() ) {
3675 if ( mGUIClient->factory() )
3676 mGUIClient->unplugActionList(
"menu_filter_actions" );
3677 mFilterMenuActions.clear();
3679 mFilterCommands.clear();
3683 void KMMainWidget::initializeFolderShortcutActions()
3689 bool old = actionCollection()->isAutoConnectShortcuts();
3691 actionCollection()->setAutoConnectShortcuts(
true );
3692 TQValueList< TQGuardedPtr< KMFolder > > folders = kmkernel->allFolders();
3693 TQValueList< TQGuardedPtr< KMFolder > >::Iterator it = folders.begin();
3694 while ( it != folders.end() ) {
3697 slotShortcutChanged( folder );
3699 actionCollection()->setAutoConnectShortcuts( old );
3704 void KMMainWidget::initializeFilterActions()
3706 TQString filterName, normalizedName;
3707 KMMetaFilterActionCommand *filterCommand;
3708 TDEAction *filterAction = 0;
3710 clearFilterActions();
3711 mApplyAllFiltersAction->plug(mApplyFilterActionsMenu->popupMenu());
3712 bool addedSeparator =
false;
3713 TQValueListConstIterator<KMFilter*> it = kmkernel->filterMgr()->filters().constBegin();
3714 for ( ;it != kmkernel->filterMgr()->filters().constEnd(); ++it ) {
3715 if (!(*it)->isEmpty() && (*it)->configureShortcut()) {
3716 filterName = TQString(
"Filter %1").arg((*it)->name());
3717 normalizedName = filterName.replace(
" ",
"_");
3718 if (action(normalizedName.utf8()))
3720 filterCommand =
new KMMetaFilterActionCommand(*it, mHeaders,
this);
3721 mFilterCommands.append(filterCommand);
3722 TQString as = i18n(
"Filter %1").arg((*it)->name());
3723 TQString icon = (*it)->icon();
3724 if ( icon.isEmpty() )
3726 filterAction =
new TDEAction(as, icon, (*it)->shortcut(), filterCommand,
3727 TQ_SLOT(start()), actionCollection(),
3728 normalizedName.local8Bit());
3729 if(!addedSeparator) {
3730 mApplyFilterActionsMenu->popupMenu()->insertSeparator();
3731 addedSeparator = !addedSeparator;
3732 mFilterMenuActions.append(
new TDEActionSeparator());
3734 filterAction->plug( mApplyFilterActionsMenu->popupMenu() );
3735 mFilterMenuActions.append(filterAction);
3736 if ( (*it)->configureToolbar() )
3737 mFilterTBarActions.append(filterAction);
3740 if ( !mFilterMenuActions.isEmpty() && mGUIClient->factory() )
3741 mGUIClient->plugActionList(
"menu_filter_actions", mFilterMenuActions );
3742 if ( !mFilterTBarActions.isEmpty() && mGUIClient->factory() ) {
3743 mFilterTBarActions.prepend( mToolbarActionSeparator );
3744 mGUIClient->plugActionList(
"toolbar_filter_actions", mFilterTBarActions );
3748 void KMMainWidget::slotFolderRemoved(
KMFolder *folder )
3750 mFolderShortcutCommands.remove( folder->
idString() );
3754 void KMMainWidget::initializeIMAPActions(
bool setState )
3756 bool hasImapAccount =
false;
3757 for( KMAccount *a = kmkernel->acctMgr()->first(); a;
3758 a = kmkernel->acctMgr()->next() ) {
3759 if ( a->type() ==
"cachedimap" ) {
3760 hasImapAccount =
true;
3764 if ( hasImapAccount == ( mTroubleshootFolderAction != 0 ) )
3767 KXMLGUIFactory* factory = mGUIClient->factory();
3769 factory->removeClient( mGUIClient );
3771 if ( !mTroubleshootFolderAction ) {
3772 mTroubleshootFolderAction =
new TDEAction( i18n(
"&Troubleshoot IMAP Cache..."),
"wizard", 0,
3773 this, TQ_SLOT(slotTroubleshootFolder()), actionCollection(),
"troubleshoot_folder" );
3777 delete mTroubleshootFolderAction ;
3778 mTroubleshootFolderAction = 0;
3782 factory->addClient( mGUIClient );
3785 bool KMMainWidget::shortcutIsValid(
const TDEShortcut &sc )
const
3787 TDEActionPtrList actions = actionCollection()->actions();
3788 TDEActionPtrList::Iterator it( actions.begin() );
3789 for ( ; it != actions.end(); it++ ) {
3790 if ( (*it)->shortcut() == sc )
return false;
3795 void KMMainWidget::slotShortcutChanged(
KMFolder *folder )
3798 mFolderShortcutCommands.remove( folder->
idString() );
3799 if ( folder->shortcut().isNull() )
3802 FolderShortcutCommand *c =
new FolderShortcutCommand(
this, folder );
3803 mFolderShortcutCommands.insert( folder->
idString(), c );
3805 TQString actionlabel = TQString(
"FolderShortcut %1").arg( folder->
prettyURL() );
3806 TQString actionname = TQString(
"FolderShortcut %1").arg( folder->
idString() );
3807 TQString normalizedName = actionname.replace(
" ",
"_");
3809 new TDEAction(actionlabel, folder->shortcut(), c, TQ_SLOT(start()),
3810 actionCollection(), normalizedName.local8Bit());
3811 action->setIcon( folder->unreadIconPath() );
3812 c->setAction( action );
3816 TQString KMMainWidget::findCurrentImapPath()
3819 if (!mFolder)
return startPath;
3820 if (mFolder->folderType() == KMFolderTypeImap)
3822 startPath =
static_cast<KMFolderImap*
>(mFolder->storage())->imapPath();
3823 }
else if (mFolder->folderType() == KMFolderTypeCachedImap)
3825 startPath =
static_cast<KMFolderCachedImap*
>(mFolder->storage())->imapPath();
3831 ImapAccountBase* KMMainWidget::findCurrentImapAccountBase()
3833 ImapAccountBase* account = 0;
3834 if (!mFolder)
return account;
3835 if (mFolder->folderType() == KMFolderTypeImap)
3837 account =
static_cast<KMFolderImap*
>(mFolder->storage())->account();
3838 }
else if (mFolder->folderType() == KMFolderTypeCachedImap)
3840 account =
static_cast<KMFolderCachedImap*
>(mFolder->storage())->account();
3846 void KMMainWidget::slotSubscriptionDialog()
3848 if ( !kmkernel->askToGoOnline() )
3850 ImapAccountBase* account = findCurrentImapAccountBase();
3851 if ( !account )
return;
3852 const TQString startPath = findCurrentImapPath();
3855 SubscriptionDialog * dialog =
3856 new SubscriptionDialog(
this, i18n(
"Subscription"), account, startPath);
3857 if ( dialog->exec() ) {
3859 if (mFolder->folderType() == KMFolderTypeImap)
3860 static_cast<KMFolderImap*
>(mFolder->storage())->account()->listDirectory();
3865 void KMMainWidget::slotLocalSubscriptionDialog()
3867 ImapAccountBase* account = findCurrentImapAccountBase();
3868 if ( !account )
return;
3870 const TQString startPath = findCurrentImapPath();
3872 LocalSubscriptionDialog *dialog =
3873 new LocalSubscriptionDialog(
this, i18n(
"Local Subscription"), account, startPath);
3874 if ( dialog->exec() ) {
3876 if (mFolder->folderType() == KMFolderTypeImap)
3877 static_cast<KMFolderImap*
>(mFolder->storage())->account()->listDirectory();
3882 void KMMainWidget::slotFolderTreeColumnsChanged()
3884 mTotalColumnToggle->setChecked( mFolderTree->isTotalActive() );
3885 mUnreadColumnToggle->setChecked( mFolderTree->isUnreadActive() );
3886 mSizeColumnToggle->setChecked( mFolderTree->isSizeActive() );
3887 mUnreadTextToggle->setChecked( !mFolderTree->isUnreadActive() );
3890 void KMMainWidget::toggleSystemTray()
3892 if ( !mSystemTray && GlobalSettings::self()->systemTrayEnabled() ) {
3895 else if ( mSystemTray && !GlobalSettings::self()->systemTrayEnabled() ) {
3897 kdDebug(5006) <<
"deleting systray" << endl;
3904 mSystemTray->setMode( GlobalSettings::self()->systemTrayPolicy() );
3908 void KMMainWidget::slotAntiSpamWizard()
3910 AntiSpamWizard wiz( AntiSpamWizard::AntiSpam,
this, folderTree() );
3915 void KMMainWidget::slotAntiVirusWizard()
3917 AntiSpamWizard wiz( AntiSpamWizard::AntiVirus,
this, folderTree() );
3922 void KMMainWidget::slotFilterLogViewer()
3929 void KMMainWidget::updateFileMenu()
3931 TQStringList actList = kmkernel->acctMgr()->getAccounts();
3933 actionCollection()->action(
"check_mail")->setEnabled( actList.size() > 0 );
3934 actionCollection()->action(
"check_mail_in")->setEnabled( actList.size() > 0 );
3935 actionCollection()->action(
"favorite_check_mail")->setEnabled( actList.size() > 0 );
3940 void KMMainWidget::setAccelsEnabled(
bool enabled )
3942 actionCollection()->tdeaccel()->setEnabled( enabled );
3953 TQString KMMainWidget::overrideEncoding()
const
3956 return mMsgView->overrideEncoding();
3958 return GlobalSettings::self()->overrideCharacterEncoding();
3961 void KMMainWidget::slotCreateTodo()
3963 KMMessage *msg = mHeaders->currentMsg();
3966 KMCommand *command =
new CreateTodoCommand(
this, msg );
3970 void KMMainWidget::setupFolderView()
3972 if ( GlobalSettings::self()->enableFavoriteFolderView() ) {
3973 mFolderView = mFolderViewSplitter;
3974 mFolderTree->reparent( mFolderViewSplitter, 0, TQPoint( 0, 0 ) );
3975 mFolderViewSplitter->show();
3976 mFavoriteFolderView->show();
3978 mFolderView = mFolderTree;
3979 mFolderViewSplitter->hide();
3980 mFavoriteFolderView->hide();
3982 mFolderView->reparent( mFolderViewParent, 0, TQPoint( 0, 0 ) );
3983 mFolderViewParent->moveToFirst( mFolderView );
3984 mFolderTree->show();
3988 void KMMainWidget::slotRequestFullSearchFromQuickSearch()
3991 #ifdef HAVE_INDEXLIB
3994 assert( mSearchWin );
3997 int status = mQuickSearchLine->currenStatus();
3998 if ( status != 0 ) {
4001 mSearchWin->setSearchPattern( pattern );
4004 void KMMainWidget::updateVactionScripStatus(
bool active)
4006 mVacationIndicatorActive = active;
4008 mVacationScriptIndicator->setText( i18n(
"Out of office reply active") );
4009 mVacationScriptIndicator->setPaletteBackgroundColor( TQt::yellow );
4010 mVacationScriptIndicator->setCursor( TQCursor( TQt::PointingHandCursor ) );
4011 mVacationScriptIndicator->show();
4013 mVacationScriptIndicator->hide();