kmail

kmreadermainwin.cpp
1/*
2 This file is part of KMail, the KDE mail client.
3 Copyright (c) 2002 Don Sanders <sanders@kde.org>
4
5 KMail is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License, version 2, as
7 published by the Free Software Foundation.
8
9 KMail is distributed in the hope that it will be useful, but
10 WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17*/
18//
19// A toplevel TDEMainWindow derived class for displaying
20// single messages or single message parts.
21//
22// Could be extended to include support for normal main window
23// widgets like a toolbar.
24
25#ifdef HAVE_CONFIG_H
26#include <config.h>
27#endif
28
29#include <tqaccel.h>
30#include <tdeapplication.h>
31#include <kedittoolbar.h>
32#include <tdelocale.h>
33#include <tdestdaccel.h>
34#include <twin.h>
35#include <tdeaction.h>
36#include <kiconloader.h>
37#include <kdebug.h>
38#include "kmcommands.h"
39#include "tdemenubar.h"
40#include "tdepopupmenu.h"
41#include "kmreaderwin.h"
42#include "kmfolder.h"
43#include "kmmainwidget.h"
44#include "kmfoldertree.h"
45#include "kmmsgdict.h"
46#include "csshelper.h"
47#include "messageactions.h"
48
49#include "globalsettings.h"
50
51#include "kmreadermainwin.h"
52
53KMReaderMainWin::KMReaderMainWin( bool htmlOverride, bool htmlLoadExtDefault,
54 char *name )
55 : KMail::SecondaryWindow( name ? name : "readerwindow#" ),
56 mMsg( 0 )
57{
58 mReaderWin = new KMReaderWin( this, this, actionCollection() );
59 //mReaderWin->setShowCompleteMessage( true );
60 mReaderWin->setAutoDelete( true );
61 mReaderWin->setHtmlOverride( htmlOverride );
62 mReaderWin->setHtmlLoadExtDefault( htmlLoadExtDefault );
63 mReaderWin->setDecryptMessageOverwrite( true );
64 mReaderWin->setShowSignatureDetails( false );
65 initKMReaderMainWin();
66}
67
68
69//-----------------------------------------------------------------------------
70KMReaderMainWin::KMReaderMainWin( char *name )
71 : KMail::SecondaryWindow( name ? name : "readerwindow#" ),
72 mMsg( 0 )
73{
74 mReaderWin = new KMReaderWin( this, this, actionCollection() );
75 mReaderWin->setAutoDelete( true );
76 initKMReaderMainWin();
77}
78
79
80//-----------------------------------------------------------------------------
81KMReaderMainWin::KMReaderMainWin(KMMessagePart* aMsgPart,
82 bool aHTML, const TQString& aFileName, const TQString& pname,
83 const TQString & encoding, char *name )
84 : KMail::SecondaryWindow( name ? name : "readerwindow#" ),
85 mMsg( 0 )
86{
87 mReaderWin = new KMReaderWin( this, this, actionCollection() );
88 mReaderWin->setOverrideEncoding( encoding );
89 mReaderWin->setMsgPart( aMsgPart, aHTML, aFileName, pname );
90 initKMReaderMainWin();
91}
92
93
94//-----------------------------------------------------------------------------
95void KMReaderMainWin::initKMReaderMainWin() {
96 setCentralWidget( mReaderWin );
97 setupAccel();
98 setupGUI( Keys | StatusBar | Create, "kmreadermainwin.rc" );
99 setupForwardingActionsList();
100 applyMainWindowSettings( KMKernel::config(), "Separate Reader Window" );
101 if ( ! mReaderWin->message() ) {
102 menuBar()->hide();
103 toolBar( "mainToolBar" )->hide();
104 }
105
106 connect( kmkernel, TQ_SIGNAL( configChanged() ),
107 this, TQ_SLOT( slotConfigChanged() ) );
108}
109
110void KMReaderMainWin::setupForwardingActionsList()
111{
112 TQPtrList<TDEAction> mForwardActionList;
113 if ( GlobalSettings::self()->forwardingInlineByDefault() ) {
114 unplugActionList( "forward_action_list" );
115 mForwardActionList.append( mForwardInlineAction );
116 mForwardActionList.append( mForwardAttachedAction );
117 mForwardActionList.append( mForwardDigestAction );
118 mForwardActionList.append( mRedirectAction );
119 plugActionList( "forward_action_list", mForwardActionList );
120 } else {
121 unplugActionList( "forward_action_list" );
122 mForwardActionList.append( mForwardAttachedAction );
123 mForwardActionList.append( mForwardInlineAction );
124 mForwardActionList.append( mForwardDigestAction );
125 mForwardActionList.append( mRedirectAction );
126 plugActionList( "forward_action_list", mForwardActionList );
127 }
128}
129
130//-----------------------------------------------------------------------------
131KMReaderMainWin::~KMReaderMainWin()
132{
133 saveMainWindowSettings( KMKernel::config(), "Separate Reader Window" );
134}
135
136//-----------------------------------------------------------------------------
137void KMReaderMainWin::setUseFixedFont( bool useFixedFont )
138{
139 mReaderWin->setUseFixedFont( useFixedFont );
140}
141
142//-----------------------------------------------------------------------------
143void KMReaderMainWin::showMsg( const TQString & encoding, KMMessage *msg,
144 unsigned long serNumOfOriginalMessage, int nodeIdOffset )
145{
146 mReaderWin->setOverrideEncoding( encoding );
147 mReaderWin->setMsg( msg, true );
148 if ( serNumOfOriginalMessage != 0 ) {
149 Q_ASSERT( nodeIdOffset != -1 );
150 mReaderWin->setOriginalMsg( serNumOfOriginalMessage, nodeIdOffset );
151 }
152 mReaderWin->slotTouchMessage();
153 setCaption( msg->subject() );
154 mMsg = msg;
155 mMsgActions->setCurrentMessage( msg );
156 menuBar()->show();
157 toolBar( "mainToolBar" )->show();
158
159 connect ( msg->parent(), TQ_SIGNAL( destroyed( TQObject* ) ), this, TQ_SLOT( slotFolderRemoved( TQObject* ) ) );
160
161}
162
163void KMReaderMainWin::slotFolderRemoved( TQObject* folderPtr )
164{
165 assert(mMsg);
166 assert(folderPtr == mMsg->parent());
167 if( mMsg && folderPtr == mMsg->parent() )
168 mMsg->setParent( 0 );
169}
170
171void KMReaderMainWin::slotReplyOrForwardFinished()
172{
173 if ( GlobalSettings::self()->closeAfterReplyOrForward() ) {
174 close();
175 }
176}
177
178//-----------------------------------------------------------------------------
179void KMReaderMainWin::slotTrashMsg()
180{
181 if ( !mMsg )
182 return;
183 // find the real msg by its sernum
184 KMFolder* parent;
185 int index;
186 KMMsgDict::instance()->getLocation( mMsg->getMsgSerNum(), &parent, &index );
187 if ( parent && !parent->isTrash() ) {
188 // open the folder (ref counted)
189 parent->open("trashmsg");
190 KMMessage *msg = parent->getMsg( index );
191 if (msg) {
192 KMDeleteMsgCommand *command = new KMDeleteMsgCommand( parent, msg );
193 command->start();
194 }
195 parent->close("trashmsg");
196 }
197 close();
198}
199
200//-----------------------------------------------------------------------------
201void KMReaderMainWin::slotFind()
202{
203 mReaderWin->slotFind();
204}
205
206void KMReaderMainWin::slotFindNext()
207{
208 mReaderWin->slotFindNext();
209}
210
211//-----------------------------------------------------------------------------
212void KMReaderMainWin::slotCopy()
213{
214 mReaderWin->slotCopySelectedText();
215}
216
217//-----------------------------------------------------------------------------
218void KMReaderMainWin::slotMarkAll()
219{
220 mReaderWin->selectAll();
221}
222
223//-----------------------------------------------------------------------------
224void KMReaderMainWin::slotPrintMsg()
225{
226 KMPrintCommand *command = new KMPrintCommand( this, mReaderWin->message(),
227 mReaderWin->headerStyle(), mReaderWin->headerStrategy(),
228 mReaderWin->htmlOverride(), mReaderWin->htmlLoadExtOverride(),
229 mReaderWin->isFixedFont(), mReaderWin->overrideEncoding() );
230 command->setOverrideFont( mReaderWin->cssHelper()->bodyFont( mReaderWin->isFixedFont(), true /*printing*/ ) );
231 command->start();
232}
233
234//-----------------------------------------------------------------------------
235void KMReaderMainWin::slotForwardInlineMsg()
236{
237 KMCommand *command = 0;
238 if ( mReaderWin->message() && mReaderWin->message()->parent() ) {
239 command = new KMForwardInlineCommand( this, mReaderWin->message(),
240 mReaderWin->message()->parent()->identity() );
241 } else {
242 command = new KMForwardInlineCommand( this, mReaderWin->message() );
243 }
244 connect( command, TQ_SIGNAL( completed( KMCommand * ) ),
245 this, TQ_SLOT( slotReplyOrForwardFinished() ) );
246 command->start();
247}
248
249//-----------------------------------------------------------------------------
250void KMReaderMainWin::slotForwardAttachedMsg()
251{
252 KMCommand *command = 0;
253 if ( mReaderWin->message() && mReaderWin->message()->parent() ) {
254 command = new KMForwardAttachedCommand( this, mReaderWin->message(),
255 mReaderWin->message()->parent()->identity() );
256 } else {
257 command = new KMForwardAttachedCommand( this, mReaderWin->message() );
258 }
259 connect( command, TQ_SIGNAL( completed( KMCommand * ) ),
260 this, TQ_SLOT( slotReplyOrForwardFinished() ) );
261 command->start();
262}
263
264//-----------------------------------------------------------------------------
265void KMReaderMainWin::slotForwardDigestMsg()
266{
267 KMCommand *command = 0;
268 if ( mReaderWin->message() && mReaderWin->message()->parent() ) {
269 command = new KMForwardDigestCommand( this, mReaderWin->message(),
270 mReaderWin->message()->parent()->identity() );
271 } else {
272 command = new KMForwardDigestCommand( this, mReaderWin->message() );
273 }
274 connect( command, TQ_SIGNAL( completed( KMCommand * ) ),
275 this, TQ_SLOT( slotReplyOrForwardFinished() ) );
276 command->start();
277}
278
279//-----------------------------------------------------------------------------
280void KMReaderMainWin::slotRedirectMsg()
281{
282 KMCommand *command = new KMRedirectCommand( this, mReaderWin->message() );
283 connect( command, TQ_SIGNAL( completed( KMCommand * ) ),
284 this, TQ_SLOT( slotReplyOrForwardFinished() ) );
285 command->start();
286}
287
288//-----------------------------------------------------------------------------
289void KMReaderMainWin::slotShowMsgSrc()
290{
291 KMMessage *msg = mReaderWin->message();
292 if ( !msg )
293 return;
294 KMCommand *command = new KMShowMsgSrcCommand( this, msg,
295 mReaderWin->isFixedFont() );
296 command->start();
297}
298
299//-----------------------------------------------------------------------------
300void KMReaderMainWin::setupForwardActions()
301{
302 disconnect( mForwardActionMenu, TQ_SIGNAL( activated() ), 0, 0 );
303 mForwardActionMenu->remove( mForwardInlineAction );
304 mForwardActionMenu->remove( mForwardAttachedAction );
305
306 if ( GlobalSettings::self()->forwardingInlineByDefault() ) {
307 mForwardActionMenu->insert( mForwardInlineAction, 0 );
308 mForwardActionMenu->insert( mForwardAttachedAction, 1 );
309 mForwardInlineAction->setShortcut( Key_F );
310 mForwardAttachedAction->setShortcut( SHIFT+Key_F );
311 connect( mForwardActionMenu, TQ_SIGNAL(activated()), this,
312 TQ_SLOT(slotForwardInlineMsg()) );
313
314 } else {
315 mForwardActionMenu->insert( mForwardAttachedAction, 0 );
316 mForwardActionMenu->insert( mForwardInlineAction, 1 );
317 mForwardInlineAction->setShortcut( SHIFT+Key_F );
318 mForwardAttachedAction->setShortcut( Key_F );
319 connect( mForwardActionMenu, TQ_SIGNAL(activated()), this,
320 TQ_SLOT(slotForwardAttachedMsg()) );
321 }
322}
323
324//-----------------------------------------------------------------------------
325void KMReaderMainWin::slotConfigChanged()
326{
327 //readConfig();
328 setupForwardActions();
329 setupForwardingActionsList();
330}
331
332void KMReaderMainWin::setupAccel()
333{
334 if ( kmkernel->xmlGuiInstance() )
335 setInstance( kmkernel->xmlGuiInstance() );
336
337 mMsgActions = new KMail::MessageActions( actionCollection(), this );
338 mMsgActions->setMessageView( mReaderWin );
339 connect( mMsgActions, TQ_SIGNAL( replyActionFinished() ),
340 this, TQ_SLOT( slotReplyOrForwardFinished() ) );
341
342 //----- File Menu
343 //mOpenAction = KStdAction::open( this, TQ_SLOT( slotOpenMsg() ),
344 // actionCollection() );
345
346 //mSaveAsAction = new TDEAction( i18n("Save &As..."), "document-save",
347 // TDEStdAccel::shortcut( TDEStdAccel::Save ),
348 // this, TQ_SLOT( slotSaveMsg() ),
349 // actionCollection(), "file_save_as" );
350
351 mSaveAsAction = KStdAction::saveAs( mReaderWin, TQ_SLOT( slotSaveMsg() ),
352 actionCollection() );
353 mSaveAsAction->setShortcut( TDEStdAccel::shortcut( TDEStdAccel::Save ) );
354 mPrintAction = KStdAction::print( this, TQ_SLOT( slotPrintMsg() ),
355 actionCollection() );
356
357 TDEAction *closeAction = KStdAction::close( this, TQ_SLOT( close() ), actionCollection() );
358 TDEShortcut closeShortcut = closeAction->shortcut();
359 closeShortcut.append( KKey(Key_Escape));
360 closeAction->setShortcut(closeShortcut);
361
362 //----- Edit Menu
363 KStdAction::copy( this, TQ_SLOT( slotCopy() ), actionCollection() );
364 KStdAction::selectAll( this, TQ_SLOT( slotMarkAll() ), actionCollection() );
365 KStdAction::find( this, TQ_SLOT(slotFind()), actionCollection() );
366 KStdAction::findNext( this, TQ_SLOT( slotFindNext() ), actionCollection() );
367 mTrashAction = new TDEAction( KGuiItem( i18n( "&Move to Trash" ), "edittrash",
368 i18n( "Move message to trashcan" ) ),
369 Key_Delete, this, TQ_SLOT( slotTrashMsg() ),
370 actionCollection(), "move_to_trash" );
371
372 //----- View Menu
373 mViewSourceAction = new TDEAction( i18n("&View Source"), Key_V, this,
374 TQ_SLOT(slotShowMsgSrc()), actionCollection(),
375 "view_source" );
376
377
378 mForwardActionMenu = new TDEActionMenu( i18n("Message->","&Forward"),
379 "mail-forward", actionCollection(),
380 "message_forward" );
381 mForwardInlineAction = new TDEAction( i18n("&Inline..."),
382 "mail-forward", SHIFT+Key_F, this,
383 TQ_SLOT(slotForwardInlineMsg()),
384 actionCollection(),
385 "message_forward_inline" );
386
387 mForwardAttachedAction = new TDEAction( i18n("Message->Forward->","As &Attachment..."),
388 "mail-forward", Key_F, this,
389 TQ_SLOT(slotForwardAttachedMsg()),
390 actionCollection(),
391 "message_forward_as_attachment" );
392
393 mForwardDigestAction = new TDEAction( i18n("Message->Forward->","As Di&gest..."),
394 "mail-forward", 0, this,
395 TQ_SLOT(slotForwardDigestMsg()),
396 actionCollection(),
397 "message_forward_as_digest" );
398
399 mRedirectAction = new TDEAction( i18n("Message->Forward->","&Redirect..."),
400 "mail-forward", Key_E, this,
401 TQ_SLOT(slotRedirectMsg()),
402 actionCollection(),
403 "message_forward_redirect" );
404
405 setupForwardActions();
406
407 mForwardActionMenu->insert( mForwardDigestAction );
408 mForwardActionMenu->insert( mRedirectAction );
409
410 fontAction = new TDEFontAction( "Select Font", 0, actionCollection(),
411 "text_font" );
412 fontAction->setFont( mReaderWin->cssHelper()->bodyFont().family() );
413 connect( fontAction, TQ_SIGNAL( activated( const TQString& ) ),
414 TQ_SLOT( slotFontAction( const TQString& ) ) );
415 fontSizeAction = new TDEFontSizeAction( "Select Size", 0, actionCollection(),
416 "text_size" );
417 fontSizeAction->setFontSize( mReaderWin->cssHelper()->bodyFont().pointSize() );
418 connect( fontSizeAction, TQ_SIGNAL( fontSizeChanged( int ) ),
419 TQ_SLOT( slotSizeAction( int ) ) );
420
421 TQAccel *accel = new TQAccel(mReaderWin, "showMsg()");
422 accel->connectItem(accel->insertItem(Key_Up),
423 mReaderWin, TQ_SLOT(slotScrollUp()));
424 accel->connectItem(accel->insertItem(Key_Down),
425 mReaderWin, TQ_SLOT(slotScrollDown()));
426 accel->connectItem(accel->insertItem(Key_Prior),
427 mReaderWin, TQ_SLOT(slotScrollPrior()));
428 accel->connectItem(accel->insertItem(Key_Next),
429 mReaderWin, TQ_SLOT(slotScrollNext()));
430 accel->connectItem(accel->insertItem(TDEStdAccel::shortcut(TDEStdAccel::Copy)),
431 mReaderWin, TQ_SLOT(slotCopySelectedText()));
432 connect( mReaderWin, TQ_SIGNAL(popupMenu(KMMessage&,const KURL&,const TQPoint&)),
433 this, TQ_SLOT(slotMsgPopup(KMMessage&,const KURL&,const TQPoint&)));
434 connect(mReaderWin, TQ_SIGNAL(urlClicked(const KURL&,int)),
435 mReaderWin, TQ_SLOT(slotUrlClicked()));
436
437 setStandardToolBarMenuEnabled(true);
438 KStdAction::configureToolbars(this, TQ_SLOT(slotEditToolbars()), actionCollection());
439}
440
441
442void KMReaderMainWin::slotMsgPopup(KMMessage &aMsg, const KURL &aUrl, const TQPoint& aPoint)
443{
444 TDEPopupMenu * menu = new TDEPopupMenu;
445 mUrl = aUrl;
446 mMsg = &aMsg;
447 bool urlMenuAdded=false;
448 bool copyAdded = false;
449 if (!aUrl.isEmpty())
450 {
451 if (aUrl.protocol() == "mailto") {
452 // popup on a mailto URL
453 mReaderWin->mailToComposeAction()->plug( menu );
454 if ( mMsg ) {
455 mReaderWin->mailToReplyAction()->plug( menu );
456 mReaderWin->mailToForwardAction()->plug( menu );
457 menu->insertSeparator();
458 }
459 mReaderWin->addAddrBookAction()->plug( menu );
460 mReaderWin->openAddrBookAction()->plug( menu );
461 mReaderWin->copyURLAction()->plug( menu );
462 copyAdded = true;
463 } else {
464 // popup on a not-mailto URL
465 mReaderWin->urlOpenAction()->plug( menu );
466 mReaderWin->addBookmarksAction()->plug( menu );
467 mReaderWin->urlSaveAsAction()->plug( menu );
468 mReaderWin->copyURLAction()->plug( menu );
469 }
470 urlMenuAdded=true;
471 }
472 if(mReaderWin && !mReaderWin->copyText().isEmpty()) {
473 if ( urlMenuAdded )
474 menu->insertSeparator();
475 mMsgActions->replyMenu()->plug( menu );
476 menu->insertSeparator();
477 if( !copyAdded )
478 mReaderWin->copyAction()->plug( menu );
479 mReaderWin->selectAllAction()->plug( menu );
480 } else if ( !urlMenuAdded )
481 {
482 // popup somewhere else (i.e., not a URL) on the message
483
484 if (!mMsg) // no message
485 {
486 delete menu;
487 return;
488 }
489
490 if ( ! ( aMsg.parent() && ( aMsg.parent()->isSent() ||
491 aMsg.parent()->isDrafts() ||
492 aMsg.parent()->isTemplates() ) ) ) {
493 // add the reply and forward actions only if we are not in a sent-mail,
494 // templates or drafts folder
495 //
496 // FIXME: needs custom templates added to menu
497 // (see KMMainWidget::updateCustomTemplateMenus)
498 mMsgActions->replyMenu()->plug( menu );
499 mForwardActionMenu->plug( menu );
500 menu->insertSeparator();
501 }
502
503 TQPopupMenu* copyMenu = new TQPopupMenu(menu);
504 KMMainWidget* mainwin = kmkernel->getKMMainWidget();
505 if ( mainwin )
506 mainwin->folderTree()->folderToPopupMenu( KMFolderTree::CopyMessage, this,
507 &mMenuToFolder, copyMenu );
508 menu->insertItem( i18n("&Copy To" ), copyMenu );
509 menu->insertSeparator();
510 mViewSourceAction->plug( menu );
511 mReaderWin->toggleFixFontAction()->plug( menu );
512 mReaderWin->toggleMimePartTreeAction()->plug( menu );
513 menu->insertSeparator();
514 mPrintAction->plug( menu );
515 mSaveAsAction->plug( menu );
516 menu->insertItem( i18n("Save Attachments..."), mReaderWin, TQ_SLOT(slotSaveAttachments()) );
517 mMsgActions->createTodoAction()->plug( menu );
518 }
519 menu->exec(aPoint, 0);
520 delete menu;
521}
522
523void KMReaderMainWin::copySelectedToFolder( int menuId )
524{
525 if (!mMenuToFolder[menuId])
526 return;
527
528 KMCommand *command = new KMCopyCommand( mMenuToFolder[menuId], mMsg );
529 command->start();
530}
531
532void KMReaderMainWin::slotFontAction( const TQString& font)
533{
534 TQFont f( mReaderWin->cssHelper()->bodyFont() );
535 f.setFamily( font );
536 mReaderWin->cssHelper()->setBodyFont( f );
537 mReaderWin->cssHelper()->setPrintFont( f );
538 mReaderWin->saveRelativePosition();
539 mReaderWin->update();
540}
541
542void KMReaderMainWin::slotSizeAction( int size )
543{
544 TQFont f( mReaderWin->cssHelper()->bodyFont() );
545 f.setPointSize( size );
546 mReaderWin->cssHelper()->setBodyFont( f );
547 mReaderWin->cssHelper()->setPrintFont( f );
548 mReaderWin->saveRelativePosition();
549 mReaderWin->update();
550}
551
552void KMReaderMainWin::slotCreateTodo()
553{
554 if ( !mMsg )
555 return;
556 KMCommand *command = new CreateTodoCommand( this, mMsg );
557 command->start();
558}
559
560void KMReaderMainWin::slotEditToolbars()
561{
562 saveMainWindowSettings( KMKernel::config(), "ReaderWindow" );
563 KEditToolbar dlg( guiFactory(), this );
564 connect( &dlg, TQ_SIGNAL(newToolbarConfig()), TQ_SLOT(slotUpdateToolbars()) );
565 dlg.exec();
566}
567
568void KMReaderMainWin::slotUpdateToolbars()
569{
570 createGUI("kmreadermainwin.rc");
571 applyMainWindowSettings(KMKernel::config(), "ReaderWindow");
572}
573
574#include "kmreadermainwin.moc"
Mail folder.
Definition: kmfolder.h:69
bool isTrash()
Returns true if this folder is configured as a trash folder, locally or for one of the accounts.
Definition: kmfolder.h:110
void close(const char *owner, bool force=false)
Close folder.
Definition: kmfolder.cpp:489
KMMessage * getMsg(int idx)
Read message at given index.
Definition: kmfolder.cpp:321
int open(const char *owner)
Open folder for access.
Definition: kmfolder.cpp:479
This is a Mime Message.
Definition: kmmessage.h:68
TQString subject() const
Get or set the 'Subject' header field.
Definition: kmmessage.cpp:2049
void getLocation(unsigned long key, KMFolder **retFolder, int *retIndex) const
Returns the folder the message represented by the serial number key is in and the index in that folde...
Definition: kmmsgdict.cpp:319
static const KMMsgDict * instance()
Access the globally unique MessageDict.
Definition: kmmsgdict.cpp:167
This class implements a "reader window", that is a window used for reading or viewing messages.
Definition: kmreaderwin.h:75
Manages common actions that can be performed on one or more messages.
folderdiaquotatab.h
Definition: aboutdata.cpp:40