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, TQT_TQOBJECT(
this), TQT_SLOT( slotShowStartupFolder() ));
208 connect( kmkernel->acctMgr(), TQT_SIGNAL( checkedMail(
bool,
bool,
const TQMap<TQString, int> & ) ),
209 this, TQT_SLOT( slotMailChecked(
bool,
bool,
const TQMap<TQString, int> & ) ) );
211 connect( kmkernel->acctMgr(), TQT_SIGNAL( accountAdded( KMAccount* ) ),
212 this, TQT_SLOT( initializeIMAPActions() ) );
213 connect( kmkernel->acctMgr(), TQT_SIGNAL( accountRemoved( KMAccount* ) ),
214 this, TQT_SLOT( initializeIMAPActions() ) );
216 connect(kmkernel, TQT_SIGNAL( configChanged() ),
217 this, TQT_SLOT( slotConfigChanged() ));
220 connect(mFolderTree, TQT_SIGNAL(currentChanged(TQListViewItem*)),
221 this, TQT_SLOT(slotChangeCaption(TQListViewItem*)));
222 connect(mFolderTree, TQT_SIGNAL(selectionChanged()),
223 TQT_SLOT(updateFolderMenu()) );
224 connect( mFolderTree, TQT_SIGNAL(syncStateChanged()),
225 TQT_SLOT(updateFolderMenu()) );
227 connect(kmkernel->folderMgr(), TQT_SIGNAL(folderRemoved(
KMFolder*)),
228 this, TQT_SLOT(slotFolderRemoved(
KMFolder*)));
230 connect(kmkernel->imapFolderMgr(), TQT_SIGNAL(folderRemoved(
KMFolder*)),
231 this, TQT_SLOT(slotFolderRemoved(
KMFolder*)));
233 connect(kmkernel->dimapFolderMgr(), TQT_SIGNAL(folderRemoved(
KMFolder*)),
234 this, TQT_SLOT(slotFolderRemoved(
KMFolder*)));
236 connect(kmkernel->searchFolderMgr(), TQT_SIGNAL(folderRemoved(
KMFolder*)),
237 this, TQT_SLOT(slotFolderRemoved(
KMFolder*)));
239 connect( kmkernel, TQT_SIGNAL( onlineStatusChanged( GlobalSettings::EnumNetworkState::type ) ),
240 this, TQT_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, TQT_SIGNAL(itemReleased(
int)), TQT_SLOT(slotEditVacation()) );
253 if ( GlobalSettings::checkOutOfOfficeOnStartup() )
254 TQTimer::singleShot( 0, TQT_TQOBJECT(
this), TQT_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, TQT_TQOBJECT(
this), TQT_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( Qt::Horizontal,
this,
"panner 1" );
562 mPanner1->setOpaqueResize( opaqueResize );
563 Qt::Orientation orientation = mReaderWindowBelow ? Qt::Vertical : Qt::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( Qt::Vertical,
this,
"panner 1" );
573 mPanner1->setOpaqueResize( opaqueResize );
574 mPanner1->setChildrenCollapsible(
false );
575 mPanner2 =
new TQSplitter( Qt::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, TQT_SIGNAL( requestFullSearch() ),
613 this, TQT_SLOT( slotRequestFullSearchFromQuickSearch() ) );
614 mSearchToolBar->setStretchableWidget( mQuickSearchLine );
615 connect( mHeaders, TQT_SIGNAL( messageListUpdated() ),
616 mQuickSearchLine, TQT_SLOT( updateSearch() ) );
617 if ( !GlobalSettings::self()->quickSearchActive() ) mSearchToolBar->hide();
619 if (mReaderWindowActive) {
620 connect(mHeaders, TQT_SIGNAL(selected(
KMMessage*)),
621 this, TQT_SLOT(slotMsgSelected(
KMMessage*)));
623 connect(mHeaders, TQT_SIGNAL(activated(
KMMessage*)),
624 this, TQT_SLOT(slotMsgActivated(
KMMessage*)));
625 connect( mHeaders, TQT_SIGNAL( selectionChanged() ),
626 TQT_SLOT( startUpdateMessageActionsTimer() ) );
627 TQAccel *accel = actionCollection()->tdeaccel();
628 accel->connectItem(accel->insertItem(SHIFT+Key_Left),
629 mHeaders, TQT_SLOT(selectPrevMessage()));
630 accel->connectItem(accel->insertItem(SHIFT+Key_Right),
631 mHeaders, TQT_SLOT(selectNextMessage()));
633 if (mReaderWindowActive) {
634 mMsgView =
new KMReaderWin(messageParent, TQT_TQWIDGET(
this), actionCollection(), 0 );
636 mMsgActions->setMessageView( mMsgView );
639 connect(mMsgView, TQT_SIGNAL(replaceMsgByUnencryptedVersion()),
640 this, TQT_SLOT(slotReplaceMsgByUnencryptedVersion()));
641 connect(mMsgView, TQT_SIGNAL(popupMenu(
KMMessage&,
const KURL&,
const TQPoint&)),
642 this, TQT_SLOT(slotMsgPopup(
KMMessage&,
const KURL&,
const TQPoint&)));
643 connect(mMsgView, TQT_SIGNAL(urlClicked(
const KURL&,
int)),
644 mMsgView, TQT_SLOT(slotUrlClicked()));
645 connect(mHeaders, TQT_SIGNAL(maybeDeleting()),
646 mMsgView, TQT_SLOT(clearCache()));
647 connect(mMsgView, TQT_SIGNAL(noDrag()),
648 mHeaders, TQT_SLOT(slotNoDrag()));
649 accel->connectItem(accel->insertItem(Key_Up),
650 mMsgView, TQT_SLOT(slotScrollUp()));
651 accel->connectItem(accel->insertItem(Key_Down),
652 mMsgView, TQT_SLOT(slotScrollDown()));
653 accel->connectItem(accel->insertItem(Key_Prior),
654 mMsgView, TQT_SLOT(slotScrollPrior()));
655 accel->connectItem(accel->insertItem(Key_Next),
656 mMsgView, TQT_SLOT(slotScrollNext()));
663 mMoveMsgToFolderAction =
new TDEAction( i18n(
"Move Message to Folder"), Key_M, TQT_TQOBJECT(
this),
664 TQT_SLOT(slotMoveMsg()), actionCollection(),
665 "move_message_to_folder" );
666 mMoveMsgToFolderAction->plugAccel( actionCollection()->tdeaccel() );
668 action =
new TDEAction( i18n(
"Copy Message to Folder"), Key_C, TQT_TQOBJECT(
this),
669 TQT_SLOT(slotCopyMsg()), actionCollection(),
670 "copy_message_to_folder" );
671 action->plugAccel( actionCollection()->tdeaccel() );
673 action =
new TDEAction( i18n(
"Jump to Folder"), Key_J, TQT_TQOBJECT(
this),
674 TQT_SLOT(slotJumpToFolder()), actionCollection(),
676 action->plugAccel( actionCollection()->tdeaccel() );
679 mFolderViewSplitter =
new TQSplitter( Qt::Vertical, mFolderViewParent );
680 mFolderViewSplitter->setOpaqueResize( TDEGlobalSettings::opaqueResize() );
681 mFavoriteFolderView =
new KMail::FavoriteFolderView(
this, mFolderViewSplitter );
682 if ( mFavoritesCheckMailAction )
683 connect( mFavoritesCheckMailAction, TQT_SIGNAL(activated()), mFavoriteFolderView, TQT_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, TQT_SIGNAL(folderSelected(
KMFolder*)),
694 mFavoriteFolderView, TQT_SLOT(folderTreeSelectionChanged(
KMFolder*)) );
696 connect(mFolderTree, TQT_SIGNAL(folderSelected(
KMFolder*)),
697 this, TQT_SLOT(folderSelected(
KMFolder*)));
698 connect( mFolderTree, TQT_SIGNAL( folderSelected(
KMFolder* ) ),
699 mQuickSearchLine, TQT_SLOT( reset() ) );
700 connect(mFolderTree, TQT_SIGNAL(folderSelectedUnread(
KMFolder*)),
701 this, TQT_SLOT(folderSelectedUnread(
KMFolder*)));
702 connect(mFolderTree, TQT_SIGNAL(folderDrop(
KMFolder*)),
703 this, TQT_SLOT(slotMoveMsgToFolder(
KMFolder*)));
704 connect(mFolderTree, TQT_SIGNAL(folderDropCopy(
KMFolder*)),
705 this, TQT_SLOT(slotCopyMsgToFolder(
KMFolder*)));
706 connect(mFolderTree, TQT_SIGNAL(columnsChanged()),
707 this, TQT_SLOT(slotFolderTreeColumnsChanged()));
709 if ( mFavoriteFolderView ) {
710 connect( mFavoriteFolderView, TQT_SIGNAL(folderDrop(
KMFolder*)), TQT_SLOT(slotMoveMsgToFolder(
KMFolder*)) );
711 connect( mFavoriteFolderView, TQT_SIGNAL(folderDropCopy(
KMFolder*)), TQT_SLOT(slotCopyMsgToFolder(
KMFolder*)) );
715 mRemoveDuplicatesAction =
new TDEAction(
716 i18n(
"Remove Duplicate Messages"), CTRL+Key_Asterisk, TQT_TQOBJECT(
this),
717 TQT_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 TQT_SLOT(slotAbortAll()), actionCollection(),
"cancel" );
723 action->plugAccel( actionCollection()->tdeaccel() );
725 action =
new TDEAction(
726 i18n(
"Focus on Next Folder"), CTRL+Key_Right, TQT_TQOBJECT(mFolderTree),
727 TQT_SLOT(incCurrentFolder()), actionCollection(),
"inc_current_folder");
728 action->plugAccel( actionCollection()->tdeaccel() );
730 action =
new TDEAction(
731 i18n(
"Focus on Previous Folder"), CTRL+Key_Left, TQT_TQOBJECT(mFolderTree),
732 TQT_SLOT(decCurrentFolder()), actionCollection(),
"dec_current_folder");
733 action->plugAccel( actionCollection()->tdeaccel() );
735 action =
new TDEAction(
736 i18n(
"Select Folder with Focus"), CTRL+Key_Space, TQT_TQOBJECT(mFolderTree),
737 TQT_SLOT(selectCurrentFolder()), actionCollection(),
"select_current_folder");
738 action->plugAccel( actionCollection()->tdeaccel() );
740 action =
new TDEAction(
741 i18n(
"Focus on Next Message"), ALT+Key_Right, TQT_TQOBJECT(mHeaders),
742 TQT_SLOT(incCurrentMessage()), actionCollection(),
"inc_current_message");
743 action->plugAccel( actionCollection()->tdeaccel() );
745 action =
new TDEAction(
746 i18n(
"Focus on Previous Message"), ALT+Key_Left, TQT_TQOBJECT(mHeaders),
747 TQT_SLOT(decCurrentMessage()), actionCollection(),
"dec_current_message");
748 action->plugAccel( actionCollection()->tdeaccel() );
750 action =
new TDEAction(
751 i18n(
"Select Message with Focus"), ALT+Key_Space, TQT_TQOBJECT(mHeaders),
752 TQT_SLOT( selectCurrentMessage() ), actionCollection(),
"select_current_message");
753 action->plugAccel( actionCollection()->tdeaccel() );
755 connect( kmkernel->outboxFolder(), TQT_SIGNAL( msgRemoved(
int, TQString) ),
756 TQT_SLOT( startUpdateMessageActionsTimer() ) );
757 connect( kmkernel->outboxFolder(), TQT_SIGNAL( msgAdded(
int) ),
758 TQT_SLOT( startUpdateMessageActionsTimer() ) );
763 void KMMainWidget::activatePanners(
void)
766 TQObject::disconnect( mMsgView->copyAction(),
767 TQT_SIGNAL( activated() ),
768 mMsgView, TQT_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 TQT_SIGNAL( activated() ),
804 mMsgView, TQT_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, TQT_SIGNAL(destroyed()),
829 this, TQT_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->setHtmlLoadExtOverride(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( TQT_TQOBJECT(
this),
true );
1720 connect( vac, TQT_SIGNAL(scriptActive(
bool)), TQT_SLOT(updateVactionScripStatus(
bool)) );
1723 void KMMainWidget::slotEditVacation()
1725 if ( !kmkernel->askToGoOnline() ) {
1732 mVacation =
new Vacation( TQT_TQOBJECT(
this) );
1733 connect( mVacation, TQT_SIGNAL(scriptActive(
bool)), TQT_SLOT(updateVactionScripStatus(
bool)) );
1734 if ( mVacation->isUsable() ) {
1735 connect( mVacation, TQT_SIGNAL(result(
bool)), mVacation, TQT_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, TQT_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, TQT_SIGNAL(activated()), TQT_TQOBJECT(
this),
1851 TQT_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, TQT_SIGNAL(activated()), TQT_TQOBJECT(
this),
1859 TQT_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, TQT_SIGNAL( changed() ),
2029 this, TQT_SLOT( updateMarkAsReadAction() ) );
2030 disconnect( mFolder, TQT_SIGNAL( msgHeaderChanged(
KMFolder*,
int ) ),
2031 this, TQT_SLOT( updateMarkAsReadAction() ) );
2032 disconnect( mFolder, TQT_SIGNAL( msgAdded(
int ) ),
2033 this, TQT_SLOT( updateMarkAsReadAction() ) );
2034 disconnect( mFolder, TQT_SIGNAL( msgRemoved(
KMFolder * ) ),
2035 this, TQT_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, TQT_SIGNAL( folderComplete( KMFolderImap*,
bool ) ),
2053 this, TQT_SLOT( folderSelected() ) );
2054 imap->getAndCheckFolder();
2055 mHeaders->setFolder( 0 );
2057 mForceJumpToUnread = forceJumpToUnread;
2061 mShowBusySplashTimer =
new TQTimer(
this );
2062 connect( mShowBusySplashTimer, TQT_SIGNAL( timeout() ), TQT_TQOBJECT(
this), TQT_SLOT( slotShowBusySplash() ) );
2063 mShowBusySplashTimer->start( GlobalSettings::self()->folderLoadingTimeout(),
true );
2067 disconnect( imap, TQT_SIGNAL( folderComplete( KMFolderImap*,
bool ) ),
2068 this, TQT_SLOT( folderSelected() ) );
2069 forceJumpToUnread = mForceJumpToUnread;
2074 connect( mFolder, TQT_SIGNAL( changed() ),
2075 this, TQT_SLOT( updateMarkAsReadAction() ) );
2076 connect( mFolder, TQT_SIGNAL( msgHeaderChanged(
KMFolder*,
int ) ),
2077 this, TQT_SLOT( updateMarkAsReadAction() ) );
2078 connect( mFolder, TQT_SIGNAL( msgAdded(
int ) ),
2079 this, TQT_SLOT( updateMarkAsReadAction() ) );
2080 connect( mFolder, TQT_SIGNAL( msgRemoved(
KMFolder *) ),
2081 this, TQT_SLOT( updateMarkAsReadAction() ) );
2086 mMsgView->setHtmlOverride(mFolderHtmlPref);
2087 mMsgView->setHtmlLoadExtOverride(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, TQT_SIGNAL(messageRetrieved(
KMMessage*)),
2136 mMsgView, TQT_SLOT(slotMessageArrived(
KMMessage*)));
2139 mMsgView->setMsg(msg);
2142 mMsgView->setHtmlOverride(mFolderHtmlPref);
2143 mMsgView->setHtmlLoadExtOverride(mFolderHtmlLoadExtPref);
2144 mMsgView->setDecryptMessageOverwrite(
false );
2145 mMsgView->setShowSignatureDetails(
false );
2149 void KMMainWidget::slotMsgChanged()
2151 mHeaders->msgChanged();
2155 void KMMainWidget::slotSelectFolder(
KMFolder* folder)
2157 TQListViewItem* item = mFolderTree->indexOfFolder(folder);
2159 mFolderTree->ensureItemVisible( item );
2160 mFolderTree->doFolderSelected( item );
2165 void KMMainWidget::slotSelectMessage(
KMMessage* msg)
2167 int idx = mFolder->find(msg);
2169 mHeaders->setCurrentMsg(idx);
2171 mMsgView->setMsg(msg);
2173 slotMsgActivated(msg);
2178 void KMMainWidget::slotReplaceMsgByUnencryptedVersion()
2180 kdDebug(5006) <<
"KMMainWidget::slotReplaceMsgByUnencryptedVersion()" << endl;
2181 KMMessage* oldMsg = mHeaders->currentMsg();
2183 kdDebug(5006) <<
"KMMainWidget - old message found" << endl;
2185 kdDebug(5006) <<
"KMMainWidget - extra unencrypted message found" << endl;
2189 TQString msgId( oldMsg->
msgId() );
2190 TQString prefix(
"DecryptedMsg.");
2191 int oldIdx = msgId.find(prefix, 0,
false);
2192 if( -1 == oldIdx ) {
2193 int leftAngle = msgId.findRev(
'<' );
2194 msgId = msgId.insert( (-1 == leftAngle) ? 0 : ++leftAngle, prefix );
2199 TQCharRef c = msgId[ oldIdx+2 ];
2205 newMsg->setMsgId( msgId );
2206 mMsgView->setIdOfLastViewedMessage( msgId );
2209 kdDebug(5006) <<
"KMMainWidget - adding unencrypted message to folder" << endl;
2210 mFolder->addMsg( newMsg );
2213 int newMsgIdx = mFolder->find( newMsg );
2214 Q_ASSERT( newMsgIdx != -1 );
2216 mFolder->unGetMsg( newMsgIdx );
2217 int idx = mFolder->find( oldMsg );
2218 Q_ASSERT( idx != -1 );
2221 mHeaders->setCurrentItemByIndex( newMsgIdx );
2224 kdDebug(5006) <<
"KMMainWidget - deleting encrypted message" << endl;
2225 mFolder->take( idx );
2228 kdDebug(5006) <<
"KMMainWidget - updating message actions" << endl;
2229 updateMessageActions();
2231 kdDebug(5006) <<
"KMMainWidget - done." << endl;
2233 kdDebug(5006) <<
"KMMainWidget - NO EXTRA UNENCRYPTED MESSAGE FOUND" << endl;
2235 kdDebug(5006) <<
"KMMainWidget - PANIC: NO OLD MESSAGE FOUND" << endl;
2239 void KMMainWidget::slotSetThreadStatusNew()
2241 mHeaders->setThreadStatus(KMMsgStatusNew);
2245 void KMMainWidget::slotSetThreadStatusUnread()
2247 mHeaders->setThreadStatus(KMMsgStatusUnread);
2251 void KMMainWidget::slotSetThreadStatusFlag()
2253 mHeaders->setThreadStatus(KMMsgStatusFlag,
true);
2257 void KMMainWidget::slotSetThreadStatusRead()
2259 mHeaders->setThreadStatus(KMMsgStatusRead);
2263 void KMMainWidget::slotSetThreadStatusTodo()
2265 mHeaders->setThreadStatus(KMMsgStatusTodo,
true);
2269 void KMMainWidget::slotSetThreadStatusWatched()
2271 mHeaders->setThreadStatus(KMMsgStatusWatched,
true);
2272 if (mWatchThreadAction->isChecked()) {
2273 mIgnoreThreadAction->setChecked(
false);
2278 void KMMainWidget::slotSetThreadStatusIgnored()
2280 mHeaders->setThreadStatus(KMMsgStatusIgnored,
true);
2281 if (mIgnoreThreadAction->isChecked()) {
2282 mWatchThreadAction->setChecked(
false);
2287 void KMMainWidget::slotNextMessage() { mHeaders->nextMessage(); }
2288 void KMMainWidget::slotNextUnreadMessage()
2290 if ( !mHeaders->nextUnreadMessage() )
2291 if ( GlobalSettings::self()->loopOnGotoUnread() == GlobalSettings::EnumLoopOnGotoUnread::LoopInAllFolders )
2292 mFolderTree->nextUnreadFolder(
true);
2294 void KMMainWidget::slotNextImportantMessage() {
2297 void KMMainWidget::slotPrevMessage() { mHeaders->prevMessage(); }
2298 void KMMainWidget::slotPrevUnreadMessage()
2300 if ( !mHeaders->prevUnreadMessage() )
2301 if ( GlobalSettings::self()->loopOnGotoUnread() == GlobalSettings::EnumLoopOnGotoUnread::LoopInAllFolders )
2302 mFolderTree->prevUnreadFolder();
2304 void KMMainWidget::slotPrevImportantMessage() {
2308 void KMMainWidget::slotDisplayCurrentMessage()
2310 if ( mHeaders->currentMsg() )
2311 slotMsgActivated( mHeaders->currentMsg() );
2315 void KMMainWidget::slotMsgActivated(
KMMessage *msg)
2319 FolderJob *job = msg->parent()->createJob( msg );
2320 connect( job, TQT_SIGNAL( messageRetrieved(
KMMessage* ) ),
2321 TQT_SLOT( slotMsgActivated(
KMMessage* ) ) );
2326 if (kmkernel->folderIsDraftOrOutbox( mFolder ) ) {
2327 mMsgActions->editCurrentMessage();
2330 if ( kmkernel->folderIsTemplates( mFolder ) ) {
2336 KMReaderMainWin *win =
new KMReaderMainWin( mFolderHtmlPref, mFolderHtmlLoadExtPref );
2337 TDEConfigGroup reader( KMKernel::config(),
"Reader" );
2338 bool useFixedFont = mMsgView ? mMsgView->isFixedFont()
2339 : reader.readBoolEntry(
"useFixedFont",
false );
2340 win->setUseFixedFont( useFixedFont );
2342 newMessage->setParent( msg->parent() );
2345 win->showMsg( overrideEncoding(), newMessage );
2350 void KMMainWidget::slotMarkAll()
2352 mHeaders->selectAll(
true );
2356 void KMMainWidget::slotMsgPopup(
KMMessage&,
const KURL &aUrl,
const TQPoint& aPoint)
2358 TDEPopupMenu * menu =
new TDEPopupMenu;
2359 updateMessageMenu();
2362 bool urlMenuAdded =
false;
2364 if (!aUrl.isEmpty())
2366 if (aUrl.protocol() ==
"mailto")
2369 mMsgView->mailToComposeAction()->plug( menu );
2370 mMsgView->mailToReplyAction()->plug( menu );
2371 mMsgView->mailToForwardAction()->plug( menu );
2373 menu->insertSeparator();
2374 mMsgView->addAddrBookAction()->plug( menu );
2375 mMsgView->openAddrBookAction()->plug( menu );
2376 mMsgView->copyURLAction()->plug( menu );
2377 mMsgView->startImChatAction()->plug( menu );
2379 mMsgView->startImChatAction()->setEnabled( kmkernel->imProxy()->initialize() );
2383 mMsgView->urlOpenAction()->plug( menu );
2384 mMsgView->addBookmarksAction()->plug( menu );
2385 mMsgView->urlSaveAsAction()->plug( menu );
2386 mMsgView->copyURLAction()->plug( menu );
2388 if ( aUrl.protocol() ==
"im" )
2393 mMsgView->startImChatAction()->plug( menu );
2397 kdDebug( 0 ) << k_funcinfo <<
" URL is: " << aUrl << endl;
2401 if(mMsgView && !mMsgView->copyText().isEmpty()) {
2403 menu->insertSeparator();
2404 mMsgActions->replyMenu()->plug(menu);
2405 menu->insertSeparator();
2407 mMsgView->copyAction()->plug( menu );
2408 mMsgView->selectAllAction()->plug( menu );
2409 }
else if ( !urlMenuAdded )
2413 if (!mHeaders->currentMsg())
2420 if ( mFolder->isTemplates() ) {
2421 mUseAction->plug( menu );
2423 mMsgActions->replyMenu()->plug( menu );
2424 mForwardActionMenu->plug( menu );
2426 editAction()->plug(menu);
2427 menu->insertSeparator();
2429 mCopyActionMenu->plug( menu );
2430 mMoveActionMenu->plug( menu );
2432 menu->insertSeparator();
2434 mMsgActions->messageStatusMenu()->plug( menu );
2435 menu->insertSeparator();
2437 viewSourceAction()->plug(menu);
2439 mMsgView->toggleFixFontAction()->plug(menu);
2441 menu->insertSeparator();
2442 mPrintAction->plug( menu );
2443 mSaveAsAction->plug( menu );
2444 mSaveAttachmentsAction->plug( menu );
2446 menu->insertSeparator();
2447 if( mFolder->isTrash() )
2448 mDeleteAction->plug( menu );
2450 mTrashAction->plug( menu );
2452 menu->insertSeparator();
2453 mMsgActions->createTodoAction()->plug( menu );
2455 TDEAcceleratorManager::manage(menu);
2456 menu->exec(aPoint, 0);
2461 void KMMainWidget::getAccountMenu()
2463 TQStringList actList;
2466 actList = kmkernel->acctMgr()->getAccounts();
2467 TQStringList::Iterator it;
2469 for(it = actList.begin(); it != actList.end() ; ++it,
id++)
2470 mActMenu->insertItem((*it).replace(
"&",
"&&"),
id);
2474 void KMMainWidget::getTransportMenu()
2476 TQStringList availTransports;
2480 TQStringList::Iterator it;
2482 for(it = availTransports.begin(); it != availTransports.end() ; ++it,
id++)
2483 mSendMenu->insertItem((*it).replace(
"&",
"&&"),
id);
2487 void KMMainWidget::updateCustomTemplateMenus()
2489 if ( !mCustomTemplateActions.isEmpty() ) {
2490 TQPtrList<TDEAction>::iterator ait = mCustomTemplateActions.begin();
2491 for ( ; ait != mCustomTemplateActions.end() ; ++ait ) {
2492 (*ait)->unplugAll();
2495 mCustomTemplateActions.clear();
2498 delete mCustomReplyActionMenu;
2499 delete mCustomReplyAllActionMenu;
2500 delete mCustomForwardActionMenu;
2502 delete mCustomReplyMapper;
2503 delete mCustomReplyAllMapper;
2504 delete mCustomForwardMapper;
2506 mCustomForwardActionMenu =
2507 new TDEActionMenu( i18n(
"Forward With Custom Template"),
2508 "mail_custom_forward",
2509 actionCollection(),
"custom_forward" );
2510 TQSignalMapper *mCustomForwardMapper =
new TQSignalMapper( TQT_TQOBJECT(
this) );
2511 connect( mCustomForwardMapper, TQT_SIGNAL( mapped(
int ) ),
2512 TQT_TQOBJECT(
this), TQT_SLOT( slotCustomForwardMsg(
int ) ) );
2513 mForwardActionMenu->insert( mCustomForwardActionMenu );
2515 mCustomReplyActionMenu =
2516 new TDEActionMenu( i18n(
"Reply With Custom Template"),
"mail_custom_reply",
2517 actionCollection(),
"custom_reply" );
2518 TQSignalMapper *mCustomReplyMapper =
new TQSignalMapper( TQT_TQOBJECT(
this) );
2519 connect( mCustomReplyMapper, TQT_SIGNAL( mapped(
int ) ),
2520 TQT_TQOBJECT(
this), TQT_SLOT( slotCustomReplyToMsg(
int ) ) );
2521 mMsgActions->replyMenu()->insert( mCustomReplyActionMenu );
2523 mCustomReplyAllActionMenu =
2524 new TDEActionMenu( i18n(
"Reply to All With Custom Template"),
2525 "mail_custom_reply_all",
2526 actionCollection(),
"custom_reply_all" );
2527 TQSignalMapper *mCustomReplyAllMapper =
new TQSignalMapper( TQT_TQOBJECT(
this) );
2528 connect( mCustomReplyAllMapper, TQT_SIGNAL( mapped(
int ) ),
2529 TQT_TQOBJECT(
this), TQT_SLOT( slotCustomReplyAllToMsg(
int ) ) );
2530 mMsgActions->replyMenu()->insert( mCustomReplyAllActionMenu );
2532 mCustomTemplates.clear();
2534 TQStringList list = GlobalSettingsBase::self()->customTemplates();
2535 TQStringList::iterator it = list.begin();
2540 for ( ; it != list.end(); ++it ) {
2541 CTemplates t( *it );
2542 mCustomTemplates.append( *it );
2545 switch ( t.type() ) {
2546 case CustomTemplates::TReply:
2547 action =
new TDEAction( (*it).replace(
"&",
"&&" ),
2548 TDEShortcut( t.shortcut() ),
2553 mCustomReplyMapper->setMapping( action, idx );
2554 mCustomReplyActionMenu->insert( action, idx );
2555 mCustomTemplateActions.append( action );
2558 case CustomTemplates::TReplyAll:
2559 action =
new TDEAction( (*it).replace(
"&",
"&&" ),
2560 TDEShortcut( t.shortcut() ),
2561 mCustomReplyAllMapper,
2565 mCustomReplyAllMapper->setMapping( action, idx );
2566 mCustomReplyAllActionMenu->insert( action, idx );
2567 mCustomTemplateActions.append( action );
2570 case CustomTemplates::TForward:
2571 action =
new TDEAction( (*it).replace(
"&",
"&&" ),
2572 TDEShortcut( t.shortcut() ),
2573 mCustomForwardMapper,
2577 mCustomForwardMapper->setMapping( action, idx );
2578 mCustomForwardActionMenu->insert( action, idx );
2579 mCustomTemplateActions.append( action );
2582 case CustomTemplates::TUniversal:
2583 action =
new TDEAction( (*it).replace(
"&",
"&&" ),
2584 TDEShortcut::null(),
2589 mCustomReplyMapper->setMapping( action, idx );
2590 mCustomReplyActionMenu->insert( action, idx );
2591 mCustomTemplateActions.append( action );
2593 action =
new TDEAction( (*it).replace(
"&",
"&&" ),
2594 TDEShortcut::null(),
2595 mCustomReplyAllMapper,
2599 mCustomReplyAllMapper->setMapping( action, idx );
2600 mCustomReplyAllActionMenu->insert( action, idx );
2601 mCustomTemplateActions.append( action );
2603 action =
new TDEAction( (*it).replace(
"&",
"&&" ),
2604 TDEShortcut::null(),
2605 mCustomForwardMapper,
2609 mCustomForwardMapper->setMapping( action, idx );
2610 mCustomForwardActionMenu->insert( action, idx );
2611 mCustomTemplateActions.append( action );
2619 mCustomReplyActionMenu->popupMenu()->insertItem( i18n(
"(no custom templates)" ), 0 );
2620 mCustomReplyActionMenu->popupMenu()->setItemEnabled( 0,
false );
2621 mCustomReplyActionMenu->setEnabled(
false);
2624 mCustomReplyAllActionMenu->popupMenu()->insertItem( i18n(
"(no custom templates)" ), 0 );
2625 mCustomReplyAllActionMenu->popupMenu()->setItemEnabled( 0,
false );
2626 mCustomReplyAllActionMenu->setEnabled(
false);
2629 mCustomForwardActionMenu->popupMenu()->insertItem( i18n(
"(no custom templates)" ), 0 );
2630 mCustomForwardActionMenu->popupMenu()->setItemEnabled( 0,
false );
2631 mCustomForwardActionMenu->setEnabled(
false);
2638 void KMMainWidget::setupActions()
2641 mMsgActions->setMessageView( mMsgView );
2644 mSaveAsAction =
new TDEAction( i18n(
"Save &As..."),
"document-save",
2645 TDEStdAccel::shortcut(TDEStdAccel::Save),
2646 TQT_TQOBJECT(
this), TQT_SLOT(slotSaveMsg()), actionCollection(),
"file_save_as" );
2648 mOpenAction = KStdAction::open( TQT_TQOBJECT(
this), TQT_SLOT( slotOpenMsg() ),
2649 actionCollection() );
2651 (void)
new TDEAction( i18n(
"&Compact All Folders"), 0,
2652 TQT_TQOBJECT(
this), TQT_SLOT(slotCompactAll()),
2653 actionCollection(),
"compact_all_folders" );
2655 (void)
new TDEAction( i18n(
"&Expire All Folders"), 0,
2656 TQT_TQOBJECT(
this), TQT_SLOT(slotExpireAll()),
2657 actionCollection(),
"expire_all_folders" );
2659 (void)
new TDEAction( i18n(
"&Refresh Local IMAP Cache"),
"refresh",
2660 TQT_TQOBJECT(
this), TQT_SLOT(slotInvalidateIMAPFolders()),
2661 actionCollection(),
"file_invalidate_imap_cache" );
2663 (void)
new TDEAction( i18n(
"Empty All &Trash Folders"), 0,
2665 actionCollection(),
"empty_trash" );
2667 (void)
new TDEAction( i18n(
"Check &Mail"),
"mail_get", CTRL+Key_L,
2668 TQT_TQOBJECT(
this), TQT_SLOT(slotCheckMail()),
2669 actionCollection(),
"check_mail" );
2671 mFavoritesCheckMailAction =
new TDEAction( i18n(
"Check Mail in Favorite Folders"),
2672 "mail_get", CTRL+SHIFT+Key_L, 0, 0,
2673 actionCollection(),
"favorite_check_mail" );
2674 if ( mFavoriteFolderView )
2675 connect( mFavoritesCheckMailAction, TQT_SIGNAL(activated()), mFavoriteFolderView, TQT_SLOT(checkMail()) );
2677 TDEActionMenu *actActionMenu =
new
2678 TDEActionMenu( i18n(
"Check Mail &In"),
"mail_get", actionCollection(),
2680 actActionMenu->setDelayed(
true);
2682 connect(actActionMenu,TQT_SIGNAL(activated()),
this,TQT_SLOT(slotCheckMail()));
2684 mActMenu = actActionMenu->popupMenu();
2685 connect(mActMenu,TQT_SIGNAL(activated(
int)),
this,TQT_SLOT(slotCheckOneAccount(
int)));
2686 connect(mActMenu,TQT_SIGNAL(aboutToShow()),
this,TQT_SLOT(getAccountMenu()));
2688 (void)
new TDEAction( i18n(
"&Send Queued Messages"),
"mail-send", 0, TQT_TQOBJECT(
this),
2689 TQT_SLOT(slotSendQueued()), actionCollection(),
"send_queued");
2691 (void)
new TDEAction( i18n(
"Online Status (unknown)"),
"online_status", 0, TQT_TQOBJECT(
this),
2692 TQT_SLOT(slotOnlineStatus()), actionCollection(),
"online_status");
2694 TDEActionMenu *sendActionMenu =
new
2695 TDEActionMenu( i18n(
"Send Queued Messages Via"),
"mail_send_via", actionCollection(),
2696 "send_queued_via" );
2697 sendActionMenu->setDelayed(
true);
2699 mSendMenu = sendActionMenu->popupMenu();
2700 connect(mSendMenu,TQT_SIGNAL(activated(
int)), TQT_TQOBJECT(
this), TQT_SLOT(slotSendQueuedVia(
int)));
2701 connect(mSendMenu,TQT_SIGNAL(aboutToShow()),
this,TQT_SLOT(getTransportMenu()));
2705 if (parent()->inherits(
"KMMainWin")) {
2706 act =
new TDEAction( i18n(
"&Address Book..."),
"contents", 0, TQT_TQOBJECT(
this),
2707 TQT_SLOT(slotAddrBook()), actionCollection(),
"addressbook" );
2708 if (TDEStandardDirs::findExe(
"kaddressbook").isEmpty()) act->setEnabled(
false);
2711 act =
new TDEAction( i18n(
"Certificate Manager..."),
"pgp-keys", 0, TQT_TQOBJECT(
this),
2712 TQT_SLOT(slotStartCertManager()), actionCollection(),
"tools_start_certman");
2714 if (TDEStandardDirs::findExe(
"kleopatra").isEmpty()) act->setEnabled(
false);
2716 act =
new TDEAction( i18n(
"GnuPG Log Viewer..."),
"pgp-keys", 0, TQT_TQOBJECT(
this),
2717 TQT_SLOT(slotStartWatchGnuPG()), actionCollection(),
"tools_start_kwatchgnupg");
2719 if (TDEStandardDirs::findExe(
"kwatchgnupg").isEmpty()) act->setEnabled(
false);
2721 act =
new TDEAction( i18n(
"&Import Messages..."),
"document-open", 0, TQT_TQOBJECT(
this),
2722 TQT_SLOT(slotImport()), actionCollection(),
"import" );
2723 if (TDEStandardDirs::findExe(
"kmailcvt").isEmpty()) act->setEnabled(
false);
2725 #if !defined(NDEBUG)
2726 (void)
new TDEAction( i18n(
"&Debug Sieve..."),
2727 "idea", 0, TQT_TQOBJECT(
this), TQT_SLOT(slotDebugSieve()),
2728 actionCollection(),
"tools_debug_sieve" );
2731 if ( GlobalSettings::allowOutOfOfficeSettings() ) {
2732 (void)
new TDEAction( i18n(
"Edit \"Out of Office\" Replies..."),
2733 "configure", 0, TQT_TQOBJECT(
this), TQT_SLOT(slotEditVacation()),
2734 actionCollection(),
"tools_edit_vacation" );
2738 (void)
new TDEAction( i18n(
"Filter &Log Viewer..."), 0, TQT_TQOBJECT(
this),
2739 TQT_SLOT(slotFilterLogViewer()), actionCollection(),
"filter_log_viewer" );
2741 (void)
new TDEAction( i18n(
"&Anti-Spam Wizard..."), 0, TQT_TQOBJECT(
this),
2742 TQT_SLOT(slotAntiSpamWizard()), actionCollection(),
"antiSpamWizard" );
2743 (void)
new TDEAction( i18n(
"&Anti-Virus Wizard..."), 0, TQT_TQOBJECT(
this),
2744 TQT_SLOT(slotAntiVirusWizard()), actionCollection(),
"antiVirusWizard" );
2747 mTrashAction =
new TDEAction( KGuiItem( i18n(
"&Move to Trash"),
"edittrash",
2748 i18n(
"Move message to trashcan") ),
2749 Key_Delete, TQT_TQOBJECT(
this), TQT_SLOT(slotTrashMsg()),
2750 actionCollection(),
"move_to_trash" );
2756 mDeleteAction =
new TDEAction( i18n(
"&Delete"),
"edit-delete", SHIFT+Key_Delete, TQT_TQOBJECT(
this),
2757 TQT_SLOT(slotDeleteMsg()), actionCollection(),
"delete" );
2758 mDeleteAction->plugAccel( actionCollection()->tdeaccel() );
2760 mTrashThreadAction =
new TDEAction( KGuiItem( i18n(
"M&ove Thread to Trash"),
"edittrash",
2761 i18n(
"Move thread to trashcan") ),
2762 CTRL+Key_Delete, TQT_TQOBJECT(
this), TQT_SLOT(slotTrashThread()),
2763 actionCollection(),
"move_thread_to_trash" );
2765 mDeleteThreadAction =
new TDEAction( i18n(
"Delete T&hread"),
"edit-delete", CTRL+SHIFT+Key_Delete, TQT_TQOBJECT(
this),
2766 TQT_SLOT(slotDeleteThread()), actionCollection(),
"delete_thread" );
2769 (void)
new TDEAction( i18n(
"&Find Messages..."),
"mail_find", Key_S, TQT_TQOBJECT(
this),
2770 TQT_SLOT(slotRequestFullSearchFromQuickSearch()), actionCollection(),
"search_messages" );
2772 mFindInMessageAction =
new TDEAction( i18n(
"&Find in Message..."),
"edit-find", TDEStdAccel::shortcut(TDEStdAccel::Find), TQT_TQOBJECT(
this),
2773 TQT_SLOT(slotFind()), actionCollection(),
"find_in_messages" );
2775 (void)
new TDEAction( i18n(
"Select &All Messages"), TDEStdAccel::selectAll(), TQT_TQOBJECT(
this),
2776 TQT_SLOT(slotMarkAll()), actionCollection(),
"mark_all_messages" );
2779 mNewFolderAction =
new TDEAction( i18n(
"&New Folder..."),
"folder-new", 0, TQT_TQOBJECT(mFolderTree),
2780 TQT_SLOT(addChildFolder()), actionCollection(),
"new_folder" );
2782 mModifyFolderAction =
new TDEAction( i18n(
"&Properties"),
"configure", 0, TQT_TQOBJECT(
this),
2783 TQT_SLOT(slotModifyFolder()), actionCollection(),
"modify" );
2785 mFolderMailingListPropertiesAction =
new TDEAction( i18n(
"&Mailing List Management..."),
2786 0, TQT_TQOBJECT(
this), TQT_SLOT( slotFolderMailingListProperties() ),
2787 actionCollection(),
"folder_mailinglist_properties" );
2789 mFolderShortCutCommandAction =
new TDEAction( i18n(
"&Assign Shortcut..."),
"configure_shortcuts",
2790 0, TQT_TQOBJECT(
this), TQT_SLOT( slotFolderShortcutCommand() ), actionCollection(),
2791 "folder_shortcut_command" );
2794 mMarkAllAsReadAction =
new TDEAction( i18n(
"Mark All Messages as &Read"),
"goto", 0, TQT_TQOBJECT(
this),
2795 TQT_SLOT(slotMarkAllAsRead()), actionCollection(),
"mark_all_as_read" );
2797 mExpireFolderAction =
new TDEAction(i18n(
"&Expiration Settings"), 0, TQT_TQOBJECT(
this), TQT_SLOT(slotExpireFolder()),
2798 actionCollection(),
"expire");
2800 mCompactFolderAction =
new TDEAction( i18n(
"&Compact Folder"), 0, TQT_TQOBJECT(
this),
2801 TQT_SLOT(slotCompactFolder()), actionCollection(),
"compact" );
2803 mRefreshFolderAction =
new TDEAction( i18n(
"Check Mail &in This Folder"),
"reload",
2804 TDEStdAccel::shortcut( TDEStdAccel::Reload ), TQT_TQOBJECT(
this),
2805 TQT_SLOT(slotRefreshFolder()),
2806 actionCollection(),
"refresh_folder" );
2807 mTroubleshootFolderAction = 0;
2809 mEmptyFolderAction =
new TDEAction(
"foo" ,
"edittrash", 0, TQT_TQOBJECT(
this),
2810 TQT_SLOT(slotEmptyFolder()), actionCollection(),
"empty" );
2812 mRemoveFolderAction =
new TDEAction(
"foo" ,
"edit-delete", 0, TQT_TQOBJECT(
this),
2813 TQT_SLOT(slotRemoveFolder()), actionCollection(),
"delete_folder" );
2815 mArchiveFolderAction =
new TDEAction( i18n(
"&Archive Folder..." ),
"document-save", 0, TQT_TQOBJECT(
this),
2816 TQT_SLOT( slotArchiveFolder() ), actionCollection(),
2819 mPreferHtmlAction =
new TDEToggleAction( i18n(
"Prefer &HTML to Plain Text"), 0, TQT_TQOBJECT(
this),
2820 TQT_SLOT(slotOverrideHtml()), actionCollection(),
"prefer_html" );
2822 mPreferHtmlLoadExtAction =
new TDEToggleAction( i18n(
"Load E&xternal References"), 0, TQT_TQOBJECT(
this),
2823 TQT_SLOT(slotOverrideHtmlLoadExt()), actionCollection(),
"prefer_html_external_refs" );
2825 mThreadMessagesAction =
new TDEToggleAction( i18n(
"&Thread Messages"), 0, TQT_TQOBJECT(
this),
2826 TQT_SLOT(slotOverrideThread()), actionCollection(),
"thread_messages" );
2828 mThreadBySubjectAction =
new TDEToggleAction( i18n(
"Thread Messages also by &Subject"), 0, TQT_TQOBJECT(
this),
2829 TQT_SLOT(slotToggleSubjectThreading()), actionCollection(),
"thread_messages_by_subject" );
2831 new TDEAction( i18n(
"Copy Folder"),
"edit-copy", SHIFT+CTRL+Key_C, TQT_TQOBJECT(folderTree()),
2832 TQT_SLOT(copyFolder()), actionCollection(),
"copy_folder" );
2833 new TDEAction( i18n(
"Cut Folder"),
"edit-cut", SHIFT+CTRL+Key_X, TQT_TQOBJECT(folderTree()),
2834 TQT_SLOT(cutFolder()), actionCollection(),
"cut_folder" );
2835 new TDEAction( i18n(
"Paste Folder"),
"edit-paste", SHIFT+CTRL+Key_V, TQT_TQOBJECT(folderTree()),
2836 TQT_SLOT(pasteFolder()), actionCollection(),
"paste_folder" );
2838 new TDEAction( i18n(
"Copy Messages"),
"edit-copy", ALT+CTRL+Key_C, TQT_TQOBJECT(headers()),
2839 TQT_SLOT(copyMessages()), actionCollection(),
"copy_messages" );
2840 new TDEAction( i18n(
"Cut Messages"),
"edit-cut", ALT+CTRL+Key_X, TQT_TQOBJECT(headers()),
2841 TQT_SLOT(cutMessages()), actionCollection(),
"cut_messages" );
2842 new TDEAction( i18n(
"Paste Messages"),
"edit-paste", ALT+CTRL+Key_V, TQT_TQOBJECT(headers()),
2843 TQT_SLOT(pasteMessages()), actionCollection(),
"paste_messages" );
2846 (void)
new TDEAction( i18n(
"&New Message..."),
"mail-message-new", TDEStdAccel::shortcut(TDEStdAccel::New), TQT_TQOBJECT(
this),
2847 TQT_SLOT(slotCompose()), actionCollection(),
"new_message" );
2849 new TDEActionMenu( i18n(
"New Message From &Template"),
"document-new",
2850 actionCollection(),
"new_from_template" );
2851 mTemplateMenu->setDelayed(
true );
2852 connect( mTemplateMenu->popupMenu(), TQT_SIGNAL( aboutToShow() ), TQT_TQOBJECT(
this),
2853 TQT_SLOT( slotShowNewFromTemplate() ) );
2854 connect( mTemplateMenu->popupMenu(), TQT_SIGNAL( activated(
int) ), TQT_TQOBJECT(
this),
2855 TQT_SLOT( slotNewFromTemplate(
int) ) );
2857 TDEAction* newToML =
new TDEAction( i18n(
"New Message t&o Mailing-List..."),
"mail_post_to",
2858 CTRL+SHIFT+Key_N, TQT_TQOBJECT(
this),
2859 TQT_SLOT(slotPostToML()), actionCollection(),
"post_message" );
2860 newToML->plugAccel( actionCollection()->tdeaccel() );
2862 mForwardActionMenu =
new TDEActionMenu( i18n(
"Message->",
"&Forward"),
2863 "mail-forward", actionCollection(),
2864 "message_forward" );
2866 mForwardInlineAction =
new TDEAction( i18n(
"&Inline..."),
2867 "mail-forward", 0, TQT_TQOBJECT(
this),
2868 TQT_SLOT(slotForwardInlineMsg()),
2870 "message_forward_inline" );
2872 mForwardAttachedAction =
new TDEAction( i18n(
"Message->Forward->",
"As &Attachment..."),
2873 "mail-forward", 0, TQT_TQOBJECT(
this),
2874 TQT_SLOT(slotForwardAttachedMsg()),
2876 "message_forward_as_attachment" );
2878 mForwardDigestAction =
new TDEAction( i18n(
"Message->Forward->",
"As Di&gest..."),
2879 "mail-forward", 0, TQT_TQOBJECT(
this),
2880 TQT_SLOT(slotForwardDigestMsg()),
2882 "message_forward_as_digest" );
2884 mRedirectAction =
new TDEAction( i18n(
"Message->Forward->",
"&Redirect..."),
2885 "mail-forward", Key_E, TQT_TQOBJECT(
this),
2886 TQT_SLOT(slotRedirectMsg()),
2888 "message_forward_redirect" );
2891 setupForwardActions();
2893 mForwardActionMenu->insert( mForwardDigestAction );
2894 mForwardActionMenu->insert( mRedirectAction );
2896 mSendAgainAction =
new TDEAction( i18n(
"Send A&gain..."), 0, TQT_TQOBJECT(
this),
2897 TQT_SLOT(slotResendMsg()), actionCollection(),
"send_again" );
2901 mFilterMenu =
new TDEActionMenu( i18n(
"&Create Filter"),
"filter", actionCollection(),
"create_filter" );
2902 connect( mFilterMenu, TQT_SIGNAL(activated()), TQT_TQOBJECT(
this),
2903 TQT_SLOT(slotFilter()) );
2904 mSubjectFilterAction =
new TDEAction( i18n(
"Filter on &Subject..."), 0, TQT_TQOBJECT(
this),
2905 TQT_SLOT(slotSubjectFilter()),
2906 actionCollection(),
"subject_filter");
2907 mFilterMenu->insert( mSubjectFilterAction );
2909 mFromFilterAction =
new TDEAction( i18n(
"Filter on &From..."), 0, TQT_TQOBJECT(
this),
2910 TQT_SLOT(slotFromFilter()),
2911 actionCollection(),
"from_filter");
2912 mFilterMenu->insert( mFromFilterAction );
2914 mToFilterAction =
new TDEAction( i18n(
"Filter on &To..."), 0, TQT_TQOBJECT(
this),
2915 TQT_SLOT(slotToFilter()),
2916 actionCollection(),
"to_filter");
2917 mFilterMenu->insert( mToFilterAction );
2919 mListFilterAction =
new TDEAction( i18n(
"Filter on Mailing-&List..."), 0, TQT_TQOBJECT(
this),
2920 TQT_SLOT(slotMailingListFilter()), actionCollection(),
2922 mFilterMenu->insert( mListFilterAction );
2924 mPrintAction = KStdAction::print (TQT_TQOBJECT(
this), TQT_SLOT(slotPrintMsg()), actionCollection());
2926 mUseAction =
new TDEAction( i18n(
"New Message From &Template"),
"document-new",
2927 Key_N, TQT_TQOBJECT(
this), TQT_SLOT( slotUseTemplate() ),
2928 actionCollection(),
"use_template" );
2929 mUseAction->plugAccel( actionCollection()->tdeaccel() );
2932 mThreadStatusMenu =
new TDEActionMenu ( i18n(
"Mark &Thread" ),
2933 actionCollection(),
"thread_status" );
2935 mMarkThreadAsReadAction =
new TDEAction(KGuiItem(i18n(
"Mark Thread as &Read"),
"kmmsgread",
2936 i18n(
"Mark all messages in the selected thread as read")),
2937 0, TQT_TQOBJECT(
this), TQT_SLOT(slotSetThreadStatusRead()),
2938 actionCollection(),
"thread_read");
2939 mThreadStatusMenu->insert( mMarkThreadAsReadAction );
2941 mMarkThreadAsNewAction =
new TDEAction(KGuiItem(i18n(
"Mark Thread as &New"),
"kmmsgnew",
2942 i18n(
"Mark all messages in the selected thread as new")),
2943 0, TQT_TQOBJECT(
this), TQT_SLOT(slotSetThreadStatusNew()),
2944 actionCollection(),
"thread_new");
2945 mThreadStatusMenu->insert( mMarkThreadAsNewAction );
2947 mMarkThreadAsUnreadAction =
new TDEAction(KGuiItem(i18n(
"Mark Thread as &Unread"),
"kmmsgunseen",
2948 i18n(
"Mark all messages in the selected thread as unread")),
2949 0, TQT_TQOBJECT(
this), TQT_SLOT(slotSetThreadStatusUnread()),
2950 actionCollection(),
"thread_unread");
2951 mThreadStatusMenu->insert( mMarkThreadAsUnreadAction );
2953 mThreadStatusMenu->insert(
new TDEActionSeparator( TQT_TQOBJECT(
this) ) );
2956 mToggleThreadFlagAction =
new TDEToggleAction(i18n(
"Mark Thread as &Important"),
"mail_flag",
2957 0, TQT_TQOBJECT(
this), TQT_SLOT(slotSetThreadStatusFlag()),
2958 actionCollection(),
"thread_flag");
2959 mToggleThreadFlagAction->setCheckedState( i18n(
"Remove &Important Thread Mark") );
2960 mThreadStatusMenu->insert( mToggleThreadFlagAction );
2962 mToggleThreadTodoAction =
new TDEToggleAction(i18n(
"Mark Thread as &Action Item"),
"mail_todo",
2963 0, TQT_TQOBJECT(
this), TQT_SLOT(slotSetThreadStatusTodo()),
2964 actionCollection(),
"thread_todo");
2965 mToggleThreadTodoAction->setCheckedState( i18n(
"Remove &Action Item Thread Mark") );
2966 mThreadStatusMenu->insert( mToggleThreadTodoAction );
2969 mWatchThreadAction =
new TDEToggleAction(i18n(
"&Watch Thread"),
"kmmsgwatched",
2970 0, TQT_TQOBJECT(
this), TQT_SLOT(slotSetThreadStatusWatched()),
2971 actionCollection(),
"thread_watched");
2973 mIgnoreThreadAction =
new TDEToggleAction(i18n(
"&Ignore Thread"),
"mail_ignore",
2974 0, TQT_TQOBJECT(
this), TQT_SLOT(slotSetThreadStatusIgnored()),
2975 actionCollection(),
"thread_ignored");
2977 mThreadStatusMenu->insert(
new TDEActionSeparator( TQT_TQOBJECT(
this) ) );
2978 mThreadStatusMenu->insert( mWatchThreadAction );
2979 mThreadStatusMenu->insert( mIgnoreThreadAction );
2981 mSaveAttachmentsAction =
new TDEAction( i18n(
"Save A&ttachments..."),
"attach",
2982 0, TQT_TQOBJECT(
this), TQT_SLOT(slotSaveAttachments()),
2983 actionCollection(),
"file_save_attachments" );
2985 mMoveActionMenu =
new TDEActionMenu( i18n(
"&Move To" ),
2986 actionCollection(),
"move_to" );
2988 mCopyActionMenu =
new TDEActionMenu( i18n(
"&Copy To" ),
2989 actionCollection(),
"copy_to" );
2991 mApplyAllFiltersAction =
new TDEAction( i18n(
"Appl&y All Filters"),
"filter",
2992 CTRL+Key_J, TQT_TQOBJECT(
this),
2993 TQT_SLOT(slotApplyFilters()),
2994 actionCollection(),
"apply_filters" );
2996 mApplyFilterActionsMenu =
new TDEActionMenu( i18n(
"A&pply Filter" ),
2998 "apply_filter_actions" );
3002 TDEActionMenu * unreadMenu =
3003 new TDEActionMenu( i18n(
"View->",
"&Unread Count"),
3004 actionCollection(),
"view_unread" );
3005 unreadMenu->setToolTip( i18n(
"Choose how to display the count of unread messages") );
3007 mUnreadColumnToggle =
new TDERadioAction( i18n(
"View->Unread Count",
"View in &Separate Column"), 0, TQT_TQOBJECT(
this),
3008 TQT_SLOT(slotToggleUnread()),
3009 actionCollection(),
"view_unread_column" );
3010 mUnreadColumnToggle->setExclusiveGroup(
"view_unread_group" );
3011 unreadMenu->insert( mUnreadColumnToggle );
3013 mUnreadTextToggle =
new TDERadioAction( i18n(
"View->Unread Count",
"View After &Folder Name"), 0, TQT_TQOBJECT(
this),
3014 TQT_SLOT(slotToggleUnread()),
3015 actionCollection(),
"view_unread_text" );
3016 mUnreadTextToggle->setExclusiveGroup(
"view_unread_group" );
3017 unreadMenu->insert( mUnreadTextToggle );
3020 mTotalColumnToggle =
new TDEToggleAction( i18n(
"View->",
"&Total Column"), 0, TQT_TQOBJECT(
this),
3021 TQT_SLOT(slotToggleTotalColumn()),
3022 actionCollection(),
"view_columns_total" );
3023 mTotalColumnToggle->setToolTip( i18n(
"Toggle display of column showing the "
3024 "total number of messages in folders.") );
3025 mSizeColumnToggle =
new TDEToggleAction( i18n(
"View->",
"&Size Column"), 0, TQT_TQOBJECT(
this),
3026 TQT_SLOT(slotToggleSizeColumn()),
3027 actionCollection(),
"view_columns_size" );
3028 mSizeColumnToggle->setToolTip( i18n(
"Toggle display of column showing the "
3029 "total size of messages in folders.") );
3031 (void)
new TDEAction( KGuiItem( i18n(
"View->",
"&Expand Thread"), TQString(),
3032 i18n(
"Expand the current thread") ),
3033 Key_Period, TQT_TQOBJECT(
this),
3034 TQT_SLOT(slotExpandThread()),
3035 actionCollection(),
"expand_thread" );
3037 (void)
new TDEAction( KGuiItem( i18n(
"View->",
"&Collapse Thread"), TQString(),
3038 i18n(
"Collapse the current thread") ),
3039 Key_Comma, TQT_TQOBJECT(
this),
3040 TQT_SLOT(slotCollapseThread()),
3041 actionCollection(),
"collapse_thread" );
3043 (void)
new TDEAction( KGuiItem( i18n(
"View->",
"Ex&pand All Threads"), TQString(),
3044 i18n(
"Expand all threads in the current folder") ),
3045 CTRL+Key_Period, TQT_TQOBJECT(
this),
3046 TQT_SLOT(slotExpandAllThreads()),
3047 actionCollection(),
"expand_all_threads" );
3049 (void)
new TDEAction( KGuiItem( i18n(
"View->",
"C&ollapse All Threads"), TQString(),
3050 i18n(
"Collapse all threads in the current folder") ),
3051 CTRL+Key_Comma, TQT_TQOBJECT(
this),
3052 TQT_SLOT(slotCollapseAllThreads()),
3053 actionCollection(),
"collapse_all_threads" );
3055 mViewSourceAction =
new TDEAction( i18n(
"&View Source"), Key_V, TQT_TQOBJECT(
this),
3056 TQT_SLOT(slotShowMsgSrc()), actionCollection(),
3059 TDEAction* dukeOfMonmoth =
new TDEAction( i18n(
"&Display Message"), Key_Return, TQT_TQOBJECT(
this),
3060 TQT_SLOT( slotDisplayCurrentMessage() ), actionCollection(),
3061 "display_message" );
3062 dukeOfMonmoth->plugAccel( actionCollection()->tdeaccel() );
3065 new TDEAction( KGuiItem( i18n(
"&Next Message"), TQString(),
3066 i18n(
"Go to the next message") ),
3067 "N;Right", TQT_TQOBJECT(
this), TQT_SLOT(slotNextMessage()),
3068 actionCollection(),
"go_next_message" );
3070 new TDEAction( KGuiItem( i18n(
"Next &Unread Message"),
3071 TQApplication::reverseLayout() ?
"go-previous" :
"go-next",
3072 i18n(
"Go to the next unread message") ),
3073 Key_Plus, TQT_TQOBJECT(
this), TQT_SLOT(slotNextUnreadMessage()),
3074 actionCollection(),
"go_next_unread_message" );
3083 new TDEAction( KGuiItem( i18n(
"&Previous Message"), TQString(),
3084 i18n(
"Go to the previous message") ),
3085 "P;Left", TQT_TQOBJECT(
this), TQT_SLOT(slotPrevMessage()),
3086 actionCollection(),
"go_prev_message" );
3088 new TDEAction( KGuiItem( i18n(
"Previous Unread &Message"),
3089 TQApplication::reverseLayout() ?
"go-next" :
"go-previous",
3090 i18n(
"Go to the previous unread message") ),
3091 Key_Minus, TQT_TQOBJECT(
this), TQT_SLOT(slotPrevUnreadMessage()),
3092 actionCollection(),
"go_prev_unread_message" );
3102 new TDEAction( KGuiItem( i18n(
"Next Unread &Folder"), TQString(),
3103 i18n(
"Go to the next folder with unread messages") ),
3104 ALT+Key_Plus, TQT_TQOBJECT(
this), TQT_SLOT(slotNextUnreadFolder()),
3105 actionCollection(),
"go_next_unread_folder" );
3106 TDEShortcut shortcut = action->shortcut();
3107 shortcut.append( KKey( CTRL+Key_Plus ) );
3108 action->setShortcut( shortcut );
3111 new TDEAction( KGuiItem( i18n(
"Previous Unread F&older"), TQString(),
3112 i18n(
"Go to the previous folder with unread messages") ),
3113 ALT+Key_Minus, TQT_TQOBJECT(
this), TQT_SLOT(slotPrevUnreadFolder()),
3114 actionCollection(),
"go_prev_unread_folder" );
3115 shortcut = action->shortcut();
3116 shortcut.append( KKey( CTRL+Key_Minus ) );
3117 action->setShortcut( shortcut );
3119 new TDEAction( KGuiItem( i18n(
"Go->",
"Next Unread &Text"), TQString(),
3120 i18n(
"Go to the next unread text"),
3121 i18n(
"Scroll down current message. "
3122 "If at end of current message, "
3123 "go to next unread message.") ),
3124 Key_Space, TQT_TQOBJECT(
this), TQT_SLOT(slotReadOn()),
3125 actionCollection(),
"go_next_unread_text" );
3128 mToggleShowQuickSearchAction =
new TDEToggleAction(i18n(
"Show Quick Search"), TQString(),
3129 0, TQT_TQOBJECT(
this), TQT_SLOT(slotToggleShowQuickSearch()),
3130 actionCollection(),
"show_quick_search");
3131 mToggleShowQuickSearchAction->setChecked( GlobalSettings::self()->quickSearchActive() );
3132 mToggleShowQuickSearchAction->setWhatsThis(
3133 i18n( GlobalSettings::self()->quickSearchActiveItem()->whatsThis().utf8() ) );
3135 (void)
new TDEAction( i18n(
"Configure &Filters..."), 0, TQT_TQOBJECT(
this),
3136 TQT_SLOT(slotFilter()), actionCollection(),
"filter" );
3137 (void)
new TDEAction( i18n(
"Configure &POP Filters..."), 0, TQT_TQOBJECT(
this),
3138 TQT_SLOT(slotPopFilter()), actionCollection(),
"popFilter" );
3139 (void)
new TDEAction( i18n(
"Manage &Sieve Scripts..."), 0, TQT_TQOBJECT(
this),
3140 TQT_SLOT(slotManageSieveScripts()), actionCollection(),
"sieveFilters" );
3142 (void)
new TDEAction( KGuiItem( i18n(
"KMail &Introduction"), 0,
3143 i18n(
"Display KMail's Welcome Page") ),
3144 0, TQT_TQOBJECT(
this), TQT_SLOT(slotIntro()),
3145 actionCollection(),
"help_kmail_welcomepage" );
3149 (void)
new TDEAction( i18n(
"Configure &Notifications..."),
3150 "knotify", 0, TQT_TQOBJECT(
this),
3151 TQT_SLOT(slotEditNotifications()), actionCollection(),
3152 "kmail_configure_notifications" );
3154 (void)
new TDEAction( i18n(
"&Configure KMail..."),
3155 "configure", 0, kmkernel,
3156 TQT_SLOT(slotShowConfigurationDialog()), actionCollection(),
3157 "kmail_configure_kmail" );
3159 KStdAction::undo(TQT_TQOBJECT(
this), TQT_SLOT(slotUndo()), actionCollection(),
"kmail_undo");
3161 KStdAction::tipOfDay( TQT_TQOBJECT(
this), TQT_SLOT( slotShowTip() ), actionCollection() );
3163 menutimer =
new TQTimer(
this,
"menutimer" );
3164 connect( menutimer, TQT_SIGNAL( timeout() ), TQT_SLOT( updateMessageActions() ) );
3165 connect( kmkernel->undoStack(),
3166 TQT_SIGNAL( undoStackChanged() ), TQT_TQOBJECT(
this), TQT_SLOT( slotUpdateUndo() ));
3168 initializeIMAPActions(
false );
3169 updateMessageActions();
3170 updateCustomTemplateMenus();
3174 void KMMainWidget::setupForwardingActionsList()
3176 TQPtrList<TDEAction> mForwardActionList;
3177 if ( GlobalSettings::self()->forwardingInlineByDefault() ) {
3178 mGUIClient->unplugActionList(
"forward_action_list" );
3179 mForwardActionList.append( mForwardInlineAction );
3180 mForwardActionList.append( mForwardAttachedAction );
3181 mForwardActionList.append( mForwardDigestAction );
3182 mForwardActionList.append( mRedirectAction );
3183 mGUIClient->plugActionList(
"forward_action_list", mForwardActionList );
3185 mGUIClient->unplugActionList(
"forward_action_list" );
3186 mForwardActionList.append( mForwardAttachedAction );
3187 mForwardActionList.append( mForwardInlineAction );
3188 mForwardActionList.append( mForwardDigestAction );
3189 mForwardActionList.append( mRedirectAction );
3190 mGUIClient->plugActionList(
"forward_action_list", mForwardActionList );
3195 void KMMainWidget::slotEditNotifications()
3197 if(kmkernel->xmlGuiInstance())
3198 KNotifyDialog::configure(
this, 0, kmkernel->xmlGuiInstance()->aboutData());
3200 KNotifyDialog::configure(
this);
3203 void KMMainWidget::slotEditKeys()
3205 KKeyDialog::configure( actionCollection(),
3211 void KMMainWidget::slotReadOn()
3216 if ( !mMsgView->atBottom() ) {
3217 mMsgView->slotJumpDown();
3220 slotNextUnreadMessage();
3223 void KMMainWidget::slotNextUnreadFolder() {
3224 if ( !mFolderTree )
return;
3225 mFolderTree->nextUnreadFolder();
3228 void KMMainWidget::slotPrevUnreadFolder() {
3229 if ( !mFolderTree )
return;
3230 mFolderTree->prevUnreadFolder();
3233 void KMMainWidget::slotExpandThread()
3235 mHeaders->slotExpandOrCollapseThread(
true );
3238 void KMMainWidget::slotCollapseThread()
3240 mHeaders->slotExpandOrCollapseThread(
false );
3243 void KMMainWidget::slotExpandAllThreads()
3245 mHeaders->slotExpandOrCollapseAllThreads(
true );
3248 void KMMainWidget::slotCollapseAllThreads()
3250 mHeaders->slotExpandOrCollapseAllThreads(
false );
3254 void KMMainWidget::slotShowMsgSrc()
3257 mMsgView->setUpdateAttachment(
false );
3258 KMMessage *msg = mHeaders->currentMsg();
3261 KMCommand *command =
new KMShowMsgSrcCommand(
this, msg,
3263 ? mMsgView->isFixedFont()
3270 void KMMainWidget::moveSelectedToFolder(
int menuId )
3272 if (mMenuToFolder[menuId])
3273 mHeaders->moveMsgToFolder( mMenuToFolder[menuId] );
3278 void KMMainWidget::copySelectedToFolder(
int menuId )
3280 if (mMenuToFolder[menuId])
3281 mHeaders->copyMsgToFolder( mMenuToFolder[menuId] );
3286 void KMMainWidget::updateMessageMenu()
3288 mMenuToFolder.clear();
3289 folderTree()->folderToPopupMenu( KMFolderTree::MoveMessage, TQT_TQOBJECT(
this),
3290 &mMenuToFolder, mMoveActionMenu->popupMenu() );
3291 folderTree()->folderToPopupMenu( KMFolderTree::CopyMessage, TQT_TQOBJECT(
this),
3292 &mMenuToFolder, mCopyActionMenu->popupMenu() );
3293 updateMessageActions();
3296 void KMMainWidget::startUpdateMessageActionsTimer()
3299 menutimer->start( 20,
true );
3302 void KMMainWidget::updateMessageActions()
3305 TQPtrList<TQListViewItem> selectedItems;
3308 for (TQListViewItem *item = mHeaders->firstChild(); item; item = item->itemBelow())
3309 if (item->isSelected() )
3310 selectedItems.append(item);
3311 if ( selectedItems.isEmpty() && mFolder->count() )
3314 count = selectedItems.count();
3315 mMsgActions->setCurrentMessage( mHeaders->currentMsg() );
3316 mMsgActions->setSelectedSernums( mHeaders->selectedSernums() );
3317 mMsgActions->setSelectedVisibleSernums( mHeaders->selectedVisibleSernums() );
3319 mMsgActions->setCurrentMessage( 0 );
3322 updateListFilterAction();
3324 bool allSelectedInCommonThread =
false;
3325 if ( mHeaders->isThreaded() && count > 1 ) {
3326 allSelectedInCommonThread =
true;
3327 for ( TQPtrListIterator<TQListViewItem> it( selectedItems ) ;
3328 it.current() ; ++ it ) {
3329 TQListViewItem * item = *it;
3330 if ( item->parent()==0 && item->childCount()==0 ) {
3331 allSelectedInCommonThread =
false;
3336 else if ( mHeaders->isThreaded() && count == 1 ) {
3337 allSelectedInCommonThread =
true;
3340 TQListViewItem *curItemParent = mHeaders->currentItem();
3341 bool parent_thread = 0;
3342 if ( curItemParent && curItemParent->firstChild() != 0 ) parent_thread = 1;
3344 bool mass_actions = count >= 1;
3345 bool thread_actions = mass_actions && allSelectedInCommonThread &&
3346 mHeaders->isThreaded();
3347 bool flags_available = GlobalSettings::self()->allowLocalFlags() || !(mFolder ? mFolder->isReadOnly() :
true);
3348 mThreadStatusMenu->setEnabled( thread_actions );
3351 mWatchThreadAction->setEnabled( thread_actions && flags_available );
3352 mIgnoreThreadAction->setEnabled( thread_actions && flags_available );
3353 mMarkThreadAsNewAction->setEnabled( thread_actions );
3354 mMarkThreadAsReadAction->setEnabled( thread_actions );
3355 mMarkThreadAsUnreadAction->setEnabled( thread_actions );
3356 mToggleThreadTodoAction->setEnabled( thread_actions && flags_available );
3357 mToggleThreadFlagAction->setEnabled( thread_actions && flags_available );
3358 mTrashThreadAction->setEnabled( thread_actions && mFolder->canDeleteMessages() );
3359 mDeleteThreadAction->setEnabled( thread_actions && mFolder->canDeleteMessages() );
3361 if (mFolder && mHeaders && mHeaders->currentMsg()) {
3362 if (thread_actions) {
3363 mToggleThreadTodoAction->setChecked(mHeaders->currentMsg()->isTodo());
3364 mToggleThreadFlagAction->setChecked(mHeaders->currentMsg()->isImportant());
3365 mWatchThreadAction->setChecked( mHeaders->currentMsg()->isWatched());
3366 mIgnoreThreadAction->setChecked( mHeaders->currentMsg()->isIgnored());
3370 mMoveActionMenu->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3371 mMoveMsgToFolderAction->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3372 mCopyActionMenu->setEnabled( mass_actions );
3373 mTrashAction->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3374 mDeleteAction->setEnabled( mass_actions && mFolder->canDeleteMessages() );
3375 mFindInMessageAction->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ) );
3376 mForwardInlineAction->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ));
3377 mForwardAttachedAction->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ) );
3378 mForwardDigestAction->setEnabled( ( count > 1 || parent_thread ) && !kmkernel->folderIsTemplates( mFolder ) );
3380 forwardMenu()->setEnabled( mass_actions && !kmkernel->folderIsTemplates( mFolder ));
3382 bool single_actions = count == 1;
3383 mUseAction->setEnabled( single_actions &&
3384 kmkernel->folderIsTemplates( mFolder ) );
3385 filterMenu()->setEnabled( single_actions );
3386 redirectAction()->setEnabled( single_actions && !kmkernel->folderIsTemplates( mFolder ) );
3387 printAction()->setEnabled( single_actions );
3388 viewSourceAction()->setEnabled( single_actions );
3390 mSendAgainAction->setEnabled( single_actions
3391 && ( ( mHeaders->currentMsg() && mHeaders->currentMsg()->isSent() )
3392 || ( mFolder && mHeaders->currentMsg() &&
3393 kmkernel->folderIsSentMailFolder( mFolder ) ) ) );
3394 mSaveAsAction->setEnabled( mass_actions );
3395 bool mails = mFolder && mFolder->count();
3396 bool enable_goto_unread = mails
3397 || (GlobalSettings::self()->loopOnGotoUnread() == GlobalSettings::EnumLoopOnGotoUnread::LoopInAllFolders);
3398 actionCollection()->action(
"go_next_message" )->setEnabled( mails );
3399 actionCollection()->action(
"go_next_unread_message" )->setEnabled( enable_goto_unread );
3400 actionCollection()->action(
"go_prev_message" )->setEnabled( mails );
3401 actionCollection()->action(
"go_prev_unread_message" )->setEnabled( enable_goto_unread );
3402 actionCollection()->action(
"send_queued" )->setEnabled( kmkernel->outboxFolder()->count() > 0 );
3403 actionCollection()->action(
"send_queued_via" )->setEnabled( kmkernel->outboxFolder()->count() > 0 );
3404 slotUpdateOnlineStatus(
static_cast<GlobalSettingsBase::EnumNetworkState::type
>( GlobalSettings::self()->networkState() ) );
3405 if (action(
"edit_undo" ))
3406 action(
"edit_undo" )->setEnabled( mHeaders->canUndo() );
3411 if((aIdx = mHeaders->currentItemIndex()) <= -1)
3413 if(!(msg = mFolder->getMsg(aIdx)))
3416 if ((
KMFolder*)mFolder == kmkernel->outboxFolder())
3420 mApplyAllFiltersAction->setEnabled(count);
3421 mApplyFilterActionsMenu->setEnabled(count);
3425 void KMMainWidget::updateMarkAsReadAction()
3427 mMarkAllAsReadAction->setEnabled( mFolder && (mFolder->countUnread() > 0) );
3431 void KMMainWidget::updateFolderMenu()
3433 bool folderWithContent = mFolder && !mFolder->noContent();
3434 bool multiFolder = folderTree()->selectedFolders().count() > 1;
3435 mModifyFolderAction->setEnabled( folderWithContent && !multiFolder );
3436 mFolderMailingListPropertiesAction->setEnabled( folderWithContent && !multiFolder );
3437 mCompactFolderAction->setEnabled( folderWithContent && !multiFolder );
3440 bool imap = mFolder && mFolder->folderType() == KMFolderTypeImap;
3441 bool cachedImap = mFolder && mFolder->folderType() == KMFolderTypeCachedImap;
3443 bool knownImapPath = cachedImap && !
static_cast<KMFolderCachedImap*
>( mFolder->storage() )->imapPath().isEmpty();
3444 mRefreshFolderAction->setEnabled( folderWithContent && ( imap
3445 || ( cachedImap && knownImapPath ) ) && !multiFolder );
3446 if ( mTroubleshootFolderAction )
3447 mTroubleshootFolderAction->setEnabled( folderWithContent && ( cachedImap && knownImapPath ) && !multiFolder );
3449 mEmptyFolderAction->setEnabled( folderWithContent &&
3450 ( mFolder->count() > 0 ) && mFolder->canDeleteMessages() &&
3452 mEmptyFolderAction->setText( ( mFolder && kmkernel->folderIsTrash( mFolder ) ) ?
3453 i18n(
"E&mpty Trash" ) :
3454 i18n(
"&Move All Messages to Trash" ) );
3456 mRemoveFolderAction->setEnabled( mFolder &&
3457 !mFolder->isSystemFolder() &&
3458 mFolder->canDeleteMessages() &&
3459 !multiFolder && !mFolder->noContent() &&
3460 !mFolder->mailCheckInProgress() );
3461 mRemoveFolderAction->setText( mFolder &&
3462 mFolder->folderType() == KMFolderTypeSearch ?
3463 i18n(
"&Delete Search" ) :
3464 i18n(
"&Delete Folder" ) );
3466 if ( mArchiveFolderAction )
3467 mArchiveFolderAction->setEnabled( mFolder && !multiFolder );
3468 mExpireFolderAction->setEnabled( mFolder && mFolder->isAutoExpire() && !multiFolder && mFolder->canDeleteMessages() );
3469 updateMarkAsReadAction();
3471 mPreferHtmlAction->setEnabled( mHeaders->folder() ?
true :
false );
3472 mPreferHtmlLoadExtAction->setEnabled( mHeaders->folder() && (mHtmlPref ? !mFolderHtmlPref : mFolderHtmlPref) ?
true :
false );
3473 mThreadMessagesAction->setEnabled( mHeaders->folder() ?
true :
false );
3475 mPreferHtmlAction->setChecked( mHtmlPref ? !mFolderHtmlPref : mFolderHtmlPref );
3476 mPreferHtmlLoadExtAction->setChecked( mHtmlLoadExtPref ? !mFolderHtmlLoadExtPref : mFolderHtmlLoadExtPref );
3477 mThreadMessagesAction->setChecked(
3478 mThreadPref ? !mFolderThreadPref : mFolderThreadPref );
3479 mThreadBySubjectAction->setEnabled(
3480 mHeaders->folder() ? ( mThreadMessagesAction->isChecked()) :
false );
3481 mThreadBySubjectAction->setChecked( mFolderThreadSubjPref );
3483 mNewFolderAction->setEnabled( !multiFolder && ( mFolder && mFolder->folderType() != KMFolderTypeSearch ));
3484 mRemoveDuplicatesAction->setEnabled( !multiFolder && mFolder && mFolder->canDeleteMessages() );
3485 mFolderShortCutCommandAction->setEnabled( !multiFolder );
3490 static TQString fmt(
long n) {
3493 if(n > 1024*1024*1024)
3494 sprintf(buf,
"%0.2f GB", ((
double)n)/1024.0/1024.0/1024.0);
3495 else if(n > 1024*1024)
3496 sprintf(buf,
"%0.2f MB", ((
double)n)/1024.0/1024.0);
3498 sprintf(buf,
"%0.2f KB", ((
double)n)/1024.0);
3500 sprintf(buf,
"%ld Byte", n);
3501 return TQString(buf);
3505 void KMMainWidget::slotMemInfo() {
3510 TQString s = TQString(
"\nMALLOC - Info\n\n"
3511 "Number of mmapped regions : %1\n"
3512 "Memory allocated in use : %2\n"
3513 "Memory allocated, not used: %3\n"
3514 "Memory total allocated : %4\n"
3515 "Max. freeable memory : %5\n")
3516 .arg(mi.hblks).arg(fmt(mi.uordblks)).arg(fmt(mi.fordblks))
3517 .arg(fmt(mi.arena)).arg(fmt(mi.keepcost));
3518 KMessageBox::information(0, s,
"Malloc information", s);
3524 void KMMainWidget::slotIntro()
3526 if ( !mMsgView )
return;
3528 mMsgView->clear(
true );
3530 if ( mSearchAndHeaders && mHeaders && mLongFolderList )
3531 mSearchAndHeaders->hide();
3534 mMsgView->displayAboutPage();
3539 void KMMainWidget::slotShowStartupFolder()
3541 if ( mFolderTree ) {
3542 mFolderTree->reload();
3543 mFolderTree->readConfig();
3545 mFolderTree->cleanupConfigFile();
3548 connect( kmkernel->filterMgr(), TQT_SIGNAL( filterListUpdated() ),
3549 this, TQT_SLOT( initializeFilterActions() ));
3552 initializeFilterActions();
3555 initializeFolderShortcutActions();
3558 if ( kmkernel->firstStart() ||
3559 GlobalSettings::self()->previousNewFeaturesMD5() != newFeaturesMD5 ) {
3560 GlobalSettings::self()->setPreviousNewFeaturesMD5( newFeaturesMD5 );
3566 if ( !mStartupFolder.isEmpty() ) {
3568 startup = kmkernel->findFolderById( mStartupFolder );
3571 startup = kmkernel->inboxFolder();
3573 if ( mFolderTree ) {
3574 mFolderTree->showFolder( startup );
3578 void KMMainWidget::slotShowTip()
3580 KTipDialog::showTip(
this, TQString(),
true );
3584 void KMMainWidget::slotChangeCaption(TQListViewItem * i)
3589 for ( TQListViewItem * item = i ; item ; item = item->parent() )
3590 names.prepend( item->text(0) );
3591 emit captionChangeRequest( names.join(
"/" ) );
3595 void KMMainWidget::removeDuplicates()
3600 mHeaders->setFolder(0);
3601 TQMap< TQString, TQValueList<int> > idMD5s;
3602 TQValueList<int> redundantIds;
3603 TQValueList<int>::Iterator kt;
3604 mFolder->
open(
"removedups");
3605 for (
int i = mFolder->count() - 1; i >= 0; --i) {
3606 TQString
id = (*mFolder)[i]->msgIdMD5();
3607 if ( !
id.isEmpty() ) {
3608 TQString subjMD5 = (*mFolder)[i]->strippedSubjectMD5();
3610 if ( idMD5s.contains(
id) )
3611 other = idMD5s[id].first();
3613 idMD5s[id].append( i );
3614 if ( other != -1 ) {
3615 TQString otherSubjMD5 = (*mFolder)[other]->strippedSubjectMD5();
3616 if (otherSubjMD5 == subjMD5)
3617 idMD5s[id].append( i );
3621 TQMap< TQString, TQValueList<int> >::Iterator it;
3622 for ( it = idMD5s.begin(); it != idMD5s.end() ; ++it ) {
3623 TQValueList<int>::Iterator jt;
3624 bool finished =
false;
3625 for ( jt = (*it).begin(); jt != (*it).end() && !finished; ++jt )
3626 if (!((*mFolder)[*jt]->isUnread())) {
3628 (*it).prepend( *jt );
3631 for ( jt = (*it).begin(), ++jt; jt != (*it).end(); ++jt )
3632 redundantIds.append( *jt );
3634 qHeapSort( redundantIds );
3635 kt = redundantIds.end();
3636 int numDuplicates = 0;
3637 if (kt != redundantIds.begin())
do {
3638 mFolder->removeMsg( *(--kt) );
3641 while (kt != redundantIds.begin());
3643 mFolder->close(
"removedups");
3644 mHeaders->setFolder(oFolder);
3646 if ( numDuplicates )
3647 msg = i18n(
"Removed %n duplicate message.",
3648 "Removed %n duplicate messages.", numDuplicates );
3650 msg = i18n(
"No duplicate messages found.");
3651 BroadcastStatus::instance()->setStatusMsg( msg );
3656 void KMMainWidget::slotUpdateUndo()
3658 if (actionCollection()->action(
"edit_undo" ))
3659 actionCollection()->action(
"edit_undo" )->setEnabled( mHeaders->canUndo() );
3664 void KMMainWidget::clearFilterActions()
3666 if ( !mFilterTBarActions.isEmpty() ) {
3667 if ( mGUIClient->factory() )
3668 mGUIClient->unplugActionList(
"toolbar_filter_actions" );
3669 mFilterTBarActions.clear();
3671 mApplyFilterActionsMenu->popupMenu()->clear();
3672 if ( !mFilterMenuActions.isEmpty() ) {
3673 if ( mGUIClient->factory() )
3674 mGUIClient->unplugActionList(
"menu_filter_actions" );
3675 mFilterMenuActions.clear();
3677 mFilterCommands.clear();
3681 void KMMainWidget::initializeFolderShortcutActions()
3687 bool old = actionCollection()->isAutoConnectShortcuts();
3689 actionCollection()->setAutoConnectShortcuts(
true );
3690 TQValueList< TQGuardedPtr< KMFolder > > folders = kmkernel->allFolders();
3691 TQValueList< TQGuardedPtr< KMFolder > >::Iterator it = folders.begin();
3692 while ( it != folders.end() ) {
3695 slotShortcutChanged( folder );
3697 actionCollection()->setAutoConnectShortcuts( old );
3702 void KMMainWidget::initializeFilterActions()
3704 TQString filterName, normalizedName;
3705 KMMetaFilterActionCommand *filterCommand;
3706 TDEAction *filterAction = 0;
3708 clearFilterActions();
3709 mApplyAllFiltersAction->plug(mApplyFilterActionsMenu->popupMenu());
3710 bool addedSeparator =
false;
3711 TQValueListConstIterator<KMFilter*> it = kmkernel->filterMgr()->filters().constBegin();
3712 for ( ;it != kmkernel->filterMgr()->filters().constEnd(); ++it ) {
3713 if (!(*it)->isEmpty() && (*it)->configureShortcut()) {
3714 filterName = TQString(
"Filter %1").arg((*it)->name());
3715 normalizedName = filterName.replace(
" ",
"_");
3716 if (action(normalizedName.utf8()))
3718 filterCommand =
new KMMetaFilterActionCommand(*it, mHeaders,
this);
3719 mFilterCommands.append(filterCommand);
3720 TQString as = i18n(
"Filter %1").arg((*it)->name());
3721 TQString icon = (*it)->icon();
3722 if ( icon.isEmpty() )
3724 filterAction =
new TDEAction(as, icon, (*it)->shortcut(), filterCommand,
3725 TQT_SLOT(start()), actionCollection(),
3726 normalizedName.local8Bit());
3727 if(!addedSeparator) {
3728 mApplyFilterActionsMenu->popupMenu()->insertSeparator();
3729 addedSeparator = !addedSeparator;
3730 mFilterMenuActions.append(
new TDEActionSeparator());
3732 filterAction->plug( mApplyFilterActionsMenu->popupMenu() );
3733 mFilterMenuActions.append(filterAction);
3734 if ( (*it)->configureToolbar() )
3735 mFilterTBarActions.append(filterAction);
3738 if ( !mFilterMenuActions.isEmpty() && mGUIClient->factory() )
3739 mGUIClient->plugActionList(
"menu_filter_actions", mFilterMenuActions );
3740 if ( !mFilterTBarActions.isEmpty() && mGUIClient->factory() ) {
3741 mFilterTBarActions.prepend( mToolbarActionSeparator );
3742 mGUIClient->plugActionList(
"toolbar_filter_actions", mFilterTBarActions );
3746 void KMMainWidget::slotFolderRemoved(
KMFolder *folder )
3748 mFolderShortcutCommands.remove( folder->
idString() );
3752 void KMMainWidget::initializeIMAPActions(
bool setState )
3754 bool hasImapAccount =
false;
3755 for( KMAccount *a = kmkernel->acctMgr()->first(); a;
3756 a = kmkernel->acctMgr()->next() ) {
3757 if ( a->type() ==
"cachedimap" ) {
3758 hasImapAccount =
true;
3762 if ( hasImapAccount == ( mTroubleshootFolderAction != 0 ) )
3765 KXMLGUIFactory* factory = mGUIClient->factory();
3767 factory->removeClient( mGUIClient );
3769 if ( !mTroubleshootFolderAction ) {
3770 mTroubleshootFolderAction =
new TDEAction( i18n(
"&Troubleshoot IMAP Cache..."),
"wizard", 0,
3771 TQT_TQOBJECT(
this), TQT_SLOT(slotTroubleshootFolder()), actionCollection(),
"troubleshoot_folder" );
3775 delete mTroubleshootFolderAction ;
3776 mTroubleshootFolderAction = 0;
3780 factory->addClient( mGUIClient );
3783 bool KMMainWidget::shortcutIsValid(
const TDEShortcut &sc )
const
3785 TDEActionPtrList actions = actionCollection()->actions();
3786 TDEActionPtrList::Iterator it( actions.begin() );
3787 for ( ; it != actions.end(); it++ ) {
3788 if ( (*it)->shortcut() == sc )
return false;
3793 void KMMainWidget::slotShortcutChanged(
KMFolder *folder )
3796 mFolderShortcutCommands.remove( folder->
idString() );
3797 if ( folder->shortcut().isNull() )
3800 FolderShortcutCommand *c =
new FolderShortcutCommand(
this, folder );
3801 mFolderShortcutCommands.insert( folder->
idString(), c );
3803 TQString actionlabel = TQString(
"FolderShortcut %1").arg( folder->
prettyURL() );
3804 TQString actionname = TQString(
"FolderShortcut %1").arg( folder->
idString() );
3805 TQString normalizedName = actionname.replace(
" ",
"_");
3807 new TDEAction(actionlabel, folder->shortcut(), c, TQT_SLOT(start()),
3808 actionCollection(), normalizedName.local8Bit());
3809 action->setIcon( folder->unreadIconPath() );
3810 c->setAction( action );
3814 TQString KMMainWidget::findCurrentImapPath()
3817 if (!mFolder)
return startPath;
3818 if (mFolder->folderType() == KMFolderTypeImap)
3820 startPath =
static_cast<KMFolderImap*
>(mFolder->storage())->imapPath();
3821 }
else if (mFolder->folderType() == KMFolderTypeCachedImap)
3823 startPath =
static_cast<KMFolderCachedImap*
>(mFolder->storage())->imapPath();
3829 ImapAccountBase* KMMainWidget::findCurrentImapAccountBase()
3831 ImapAccountBase* account = 0;
3832 if (!mFolder)
return account;
3833 if (mFolder->folderType() == KMFolderTypeImap)
3835 account =
static_cast<KMFolderImap*
>(mFolder->storage())->account();
3836 }
else if (mFolder->folderType() == KMFolderTypeCachedImap)
3838 account =
static_cast<KMFolderCachedImap*
>(mFolder->storage())->account();
3844 void KMMainWidget::slotSubscriptionDialog()
3846 if ( !kmkernel->askToGoOnline() )
3848 ImapAccountBase* account = findCurrentImapAccountBase();
3849 if ( !account )
return;
3850 const TQString startPath = findCurrentImapPath();
3853 SubscriptionDialog * dialog =
3854 new SubscriptionDialog(
this, i18n(
"Subscription"), account, startPath);
3855 if ( dialog->exec() ) {
3857 if (mFolder->folderType() == KMFolderTypeImap)
3858 static_cast<KMFolderImap*
>(mFolder->storage())->account()->listDirectory();
3863 void KMMainWidget::slotLocalSubscriptionDialog()
3865 ImapAccountBase* account = findCurrentImapAccountBase();
3866 if ( !account )
return;
3868 const TQString startPath = findCurrentImapPath();
3870 LocalSubscriptionDialog *dialog =
3871 new LocalSubscriptionDialog(
this, i18n(
"Local Subscription"), account, startPath);
3872 if ( dialog->exec() ) {
3874 if (mFolder->folderType() == KMFolderTypeImap)
3875 static_cast<KMFolderImap*
>(mFolder->storage())->account()->listDirectory();
3880 void KMMainWidget::slotFolderTreeColumnsChanged()
3882 mTotalColumnToggle->setChecked( mFolderTree->isTotalActive() );
3883 mUnreadColumnToggle->setChecked( mFolderTree->isUnreadActive() );
3884 mSizeColumnToggle->setChecked( mFolderTree->isSizeActive() );
3885 mUnreadTextToggle->setChecked( !mFolderTree->isUnreadActive() );
3888 void KMMainWidget::toggleSystemTray()
3890 if ( !mSystemTray && GlobalSettings::self()->systemTrayEnabled() ) {
3893 else if ( mSystemTray && !GlobalSettings::self()->systemTrayEnabled() ) {
3895 kdDebug(5006) <<
"deleting systray" << endl;
3902 mSystemTray->setMode( GlobalSettings::self()->systemTrayPolicy() );
3906 void KMMainWidget::slotAntiSpamWizard()
3908 AntiSpamWizard wiz( AntiSpamWizard::AntiSpam,
this, folderTree() );
3913 void KMMainWidget::slotAntiVirusWizard()
3915 AntiSpamWizard wiz( AntiSpamWizard::AntiVirus,
this, folderTree() );
3920 void KMMainWidget::slotFilterLogViewer()
3927 void KMMainWidget::updateFileMenu()
3929 TQStringList actList = kmkernel->acctMgr()->getAccounts();
3931 actionCollection()->action(
"check_mail")->setEnabled( actList.size() > 0 );
3932 actionCollection()->action(
"check_mail_in")->setEnabled( actList.size() > 0 );
3933 actionCollection()->action(
"favorite_check_mail")->setEnabled( actList.size() > 0 );
3938 void KMMainWidget::setAccelsEnabled(
bool enabled )
3940 actionCollection()->tdeaccel()->setEnabled( enabled );
3951 TQString KMMainWidget::overrideEncoding()
const
3954 return mMsgView->overrideEncoding();
3956 return GlobalSettings::self()->overrideCharacterEncoding();
3959 void KMMainWidget::slotCreateTodo()
3961 KMMessage *msg = mHeaders->currentMsg();
3964 KMCommand *command =
new CreateTodoCommand(
this, msg );
3968 void KMMainWidget::setupFolderView()
3970 if ( GlobalSettings::self()->enableFavoriteFolderView() ) {
3971 mFolderView = mFolderViewSplitter;
3972 mFolderTree->reparent( mFolderViewSplitter, 0, TQPoint( 0, 0 ) );
3973 mFolderViewSplitter->show();
3974 mFavoriteFolderView->show();
3976 mFolderView = mFolderTree;
3977 mFolderViewSplitter->hide();
3978 mFavoriteFolderView->hide();
3980 mFolderView->reparent( mFolderViewParent, 0, TQPoint( 0, 0 ) );
3981 mFolderViewParent->moveToFirst( mFolderView );
3982 mFolderTree->show();
3986 void KMMainWidget::slotRequestFullSearchFromQuickSearch()
3989 #ifdef HAVE_INDEXLIB
3992 assert( mSearchWin );
3995 int status = mQuickSearchLine->currenStatus();
3996 if ( status != 0 ) {
3999 mSearchWin->setSearchPattern( pattern );
4002 void KMMainWidget::updateVactionScripStatus(
bool active)
4004 mVacationIndicatorActive = active;
4006 mVacationScriptIndicator->setText( i18n(
"Out of office reply active") );
4007 mVacationScriptIndicator->setPaletteBackgroundColor( TQt::yellow );
4008 mVacationScriptIndicator->setCursor( TQCursor( TQt::PointingHandCursor ) );
4009 mVacationScriptIndicator->show();
4011 mVacationScriptIndicator->hide();