30 #include <tdeapplication.h>
31 #include <kedittoolbar.h>
32 #include <tdelocale.h>
33 #include <tdestdaccel.h>
35 #include <tdeaction.h>
36 #include <kiconloader.h>
38 #include "kmcommands.h"
39 #include "tdemenubar.h"
40 #include "tdepopupmenu.h"
41 #include "kmreaderwin.h"
43 #include "kmmainwidget.h"
44 #include "kmfoldertree.h"
45 #include "kmmsgdict.h"
46 #include "csshelper.h"
47 #include "messageactions.h"
49 #include "globalsettings.h"
51 #include "kmreadermainwin.h"
53 KMReaderMainWin::KMReaderMainWin(
bool htmlOverride,
bool htmlLoadExtDefault,
55 :
KMail::SecondaryWindow( name ? name :
"readerwindow#" ),
58 mReaderWin =
new KMReaderWin(
this,
this, actionCollection() );
60 mReaderWin->setAutoDelete(
true );
61 mReaderWin->setHtmlOverride( htmlOverride );
62 mReaderWin->setHtmlLoadExtDefault( htmlLoadExtDefault );
63 mReaderWin->setDecryptMessageOverwrite(
true );
64 mReaderWin->setShowSignatureDetails(
false );
65 initKMReaderMainWin();
70 KMReaderMainWin::KMReaderMainWin(
char *name )
71 :
KMail::SecondaryWindow( name ? name :
"readerwindow#" ),
74 mReaderWin =
new KMReaderWin(
this,
this, actionCollection() );
75 mReaderWin->setAutoDelete(
true );
76 initKMReaderMainWin();
81 KMReaderMainWin::KMReaderMainWin(KMMessagePart* aMsgPart,
82 bool aHTML,
const TQString& aFileName,
const TQString& pname,
83 const TQString & encoding,
char *name )
84 :
KMail::SecondaryWindow( name ? name :
"readerwindow#" ),
87 mReaderWin =
new KMReaderWin(
this,
this, actionCollection() );
88 mReaderWin->setOverrideEncoding( encoding );
89 mReaderWin->setMsgPart( aMsgPart, aHTML, aFileName, pname );
90 initKMReaderMainWin();
95 void KMReaderMainWin::initKMReaderMainWin() {
96 setCentralWidget( mReaderWin );
98 setupGUI( Keys | StatusBar | Create,
"kmreadermainwin.rc" );
99 setupForwardingActionsList();
100 applyMainWindowSettings( KMKernel::config(),
"Separate Reader Window" );
101 if ( ! mReaderWin->message() ) {
103 toolBar(
"mainToolBar" )->hide();
106 connect( kmkernel, TQ_SIGNAL( configChanged() ),
107 this, TQ_SLOT( slotConfigChanged() ) );
110 void KMReaderMainWin::setupForwardingActionsList()
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 );
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 );
131 KMReaderMainWin::~KMReaderMainWin()
133 saveMainWindowSettings( KMKernel::config(),
"Separate Reader Window" );
137 void KMReaderMainWin::setUseFixedFont(
bool useFixedFont )
139 mReaderWin->setUseFixedFont( useFixedFont );
143 void KMReaderMainWin::showMsg(
const TQString & encoding,
KMMessage *msg,
144 unsigned long serNumOfOriginalMessage,
int nodeIdOffset )
146 mReaderWin->setOverrideEncoding( encoding );
147 mReaderWin->setMsg( msg,
true );
148 if ( serNumOfOriginalMessage != 0 ) {
149 Q_ASSERT( nodeIdOffset != -1 );
150 mReaderWin->setOriginalMsg( serNumOfOriginalMessage, nodeIdOffset );
152 mReaderWin->slotTouchMessage();
155 mMsgActions->setCurrentMessage( msg );
157 toolBar(
"mainToolBar" )->show();
159 connect ( msg->parent(), TQ_SIGNAL( destroyed( TQObject* ) ),
this, TQ_SLOT( slotFolderRemoved( TQObject* ) ) );
163 void KMReaderMainWin::slotFolderRemoved( TQObject* folderPtr )
166 assert(folderPtr == mMsg->parent());
167 if( mMsg && folderPtr == mMsg->parent() )
168 mMsg->setParent( 0 );
171 void KMReaderMainWin::slotReplyOrForwardFinished()
173 if ( GlobalSettings::self()->closeAfterReplyOrForward() ) {
179 void KMReaderMainWin::slotTrashMsg()
187 if ( parent && !parent->
isTrash() ) {
189 parent->
open(
"trashmsg");
192 KMDeleteMsgCommand *command =
new KMDeleteMsgCommand( parent, msg );
195 parent->
close(
"trashmsg");
201 void KMReaderMainWin::slotFind()
203 mReaderWin->slotFind();
206 void KMReaderMainWin::slotFindNext()
208 mReaderWin->slotFindNext();
212 void KMReaderMainWin::slotCopy()
214 mReaderWin->slotCopySelectedText();
218 void KMReaderMainWin::slotMarkAll()
220 mReaderWin->selectAll();
224 void KMReaderMainWin::slotPrintMsg()
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 ) );
235 void KMReaderMainWin::slotForwardInlineMsg()
237 KMCommand *command = 0;
238 if ( mReaderWin->message() && mReaderWin->message()->parent() ) {
239 command =
new KMForwardInlineCommand(
this, mReaderWin->message(),
240 mReaderWin->message()->parent()->identity() );
242 command =
new KMForwardInlineCommand(
this, mReaderWin->message() );
244 connect( command, TQ_SIGNAL( completed( KMCommand * ) ),
245 this, TQ_SLOT( slotReplyOrForwardFinished() ) );
250 void KMReaderMainWin::slotForwardAttachedMsg()
252 KMCommand *command = 0;
253 if ( mReaderWin->message() && mReaderWin->message()->parent() ) {
254 command =
new KMForwardAttachedCommand(
this, mReaderWin->message(),
255 mReaderWin->message()->parent()->identity() );
257 command =
new KMForwardAttachedCommand(
this, mReaderWin->message() );
259 connect( command, TQ_SIGNAL( completed( KMCommand * ) ),
260 this, TQ_SLOT( slotReplyOrForwardFinished() ) );
265 void KMReaderMainWin::slotForwardDigestMsg()
267 KMCommand *command = 0;
268 if ( mReaderWin->message() && mReaderWin->message()->parent() ) {
269 command =
new KMForwardDigestCommand(
this, mReaderWin->message(),
270 mReaderWin->message()->parent()->identity() );
272 command =
new KMForwardDigestCommand(
this, mReaderWin->message() );
274 connect( command, TQ_SIGNAL( completed( KMCommand * ) ),
275 this, TQ_SLOT( slotReplyOrForwardFinished() ) );
280 void KMReaderMainWin::slotRedirectMsg()
282 KMCommand *command =
new KMRedirectCommand(
this, mReaderWin->message() );
283 connect( command, TQ_SIGNAL( completed( KMCommand * ) ),
284 this, TQ_SLOT( slotReplyOrForwardFinished() ) );
289 void KMReaderMainWin::slotShowMsgSrc()
294 KMCommand *command =
new KMShowMsgSrcCommand(
this, msg,
295 mReaderWin->isFixedFont() );
300 void KMReaderMainWin::setupForwardActions()
302 disconnect( mForwardActionMenu, TQ_SIGNAL( activated() ), 0, 0 );
303 mForwardActionMenu->remove( mForwardInlineAction );
304 mForwardActionMenu->remove( mForwardAttachedAction );
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()) );
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()) );
325 void KMReaderMainWin::slotConfigChanged()
328 setupForwardActions();
329 setupForwardingActionsList();
332 void KMReaderMainWin::setupAccel()
334 if ( kmkernel->xmlGuiInstance() )
335 setInstance( kmkernel->xmlGuiInstance() );
338 mMsgActions->setMessageView( mReaderWin );
339 connect( mMsgActions, TQ_SIGNAL( replyActionFinished() ),
340 this, TQ_SLOT( slotReplyOrForwardFinished() ) );
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() );
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);
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" );
373 mViewSourceAction =
new TDEAction( i18n(
"&View Source"), Key_V,
this,
374 TQ_SLOT(slotShowMsgSrc()), actionCollection(),
378 mForwardActionMenu =
new TDEActionMenu( i18n(
"Message->",
"&Forward"),
379 "mail-forward", actionCollection(),
381 mForwardInlineAction =
new TDEAction( i18n(
"&Inline..."),
382 "mail-forward", SHIFT+Key_F,
this,
383 TQ_SLOT(slotForwardInlineMsg()),
385 "message_forward_inline" );
387 mForwardAttachedAction =
new TDEAction( i18n(
"Message->Forward->",
"As &Attachment..."),
388 "mail-forward", Key_F,
this,
389 TQ_SLOT(slotForwardAttachedMsg()),
391 "message_forward_as_attachment" );
393 mForwardDigestAction =
new TDEAction( i18n(
"Message->Forward->",
"As Di&gest..."),
394 "mail-forward", 0,
this,
395 TQ_SLOT(slotForwardDigestMsg()),
397 "message_forward_as_digest" );
399 mRedirectAction =
new TDEAction( i18n(
"Message->Forward->",
"&Redirect..."),
400 "mail-forward", Key_E,
this,
401 TQ_SLOT(slotRedirectMsg()),
403 "message_forward_redirect" );
405 setupForwardActions();
407 mForwardActionMenu->insert( mForwardDigestAction );
408 mForwardActionMenu->insert( mRedirectAction );
410 fontAction =
new TDEFontAction(
"Select Font", 0, actionCollection(),
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(),
417 fontSizeAction->setFontSize( mReaderWin->cssHelper()->bodyFont().pointSize() );
418 connect( fontSizeAction, TQ_SIGNAL( fontSizeChanged(
int ) ),
419 TQ_SLOT( slotSizeAction(
int ) ) );
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()));
437 setStandardToolBarMenuEnabled(
true);
438 KStdAction::configureToolbars(
this, TQ_SLOT(slotEditToolbars()), actionCollection());
442 void KMReaderMainWin::slotMsgPopup(
KMMessage &aMsg,
const KURL &aUrl,
const TQPoint& aPoint)
444 TDEPopupMenu * menu =
new TDEPopupMenu;
447 bool urlMenuAdded=
false;
448 bool copyAdded =
false;
451 if (aUrl.protocol() ==
"mailto") {
453 mReaderWin->mailToComposeAction()->plug( menu );
455 mReaderWin->mailToReplyAction()->plug( menu );
456 mReaderWin->mailToForwardAction()->plug( menu );
457 menu->insertSeparator();
459 mReaderWin->addAddrBookAction()->plug( menu );
460 mReaderWin->openAddrBookAction()->plug( menu );
461 mReaderWin->copyURLAction()->plug( menu );
465 mReaderWin->urlOpenAction()->plug( menu );
466 mReaderWin->addBookmarksAction()->plug( menu );
467 mReaderWin->urlSaveAsAction()->plug( menu );
468 mReaderWin->copyURLAction()->plug( menu );
472 if(mReaderWin && !mReaderWin->copyText().isEmpty()) {
474 menu->insertSeparator();
475 mMsgActions->replyMenu()->plug( menu );
476 menu->insertSeparator();
478 mReaderWin->copyAction()->plug( menu );
479 mReaderWin->selectAllAction()->plug( menu );
480 }
else if ( !urlMenuAdded )
490 if ( ! ( aMsg.parent() && ( aMsg.parent()->isSent() ||
491 aMsg.parent()->isDrafts() ||
492 aMsg.parent()->isTemplates() ) ) ) {
498 mMsgActions->replyMenu()->plug( menu );
499 mForwardActionMenu->plug( menu );
500 menu->insertSeparator();
503 TQPopupMenu* copyMenu =
new TQPopupMenu(menu);
504 KMMainWidget* mainwin = kmkernel->getKMMainWidget();
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 );
519 menu->exec(aPoint, 0);
523 void KMReaderMainWin::copySelectedToFolder(
int menuId )
525 if (!mMenuToFolder[menuId])
528 KMCommand *command =
new KMCopyCommand( mMenuToFolder[menuId], mMsg );
532 void KMReaderMainWin::slotFontAction(
const TQString& font)
534 TQFont f( mReaderWin->cssHelper()->bodyFont() );
536 mReaderWin->cssHelper()->setBodyFont( f );
537 mReaderWin->cssHelper()->setPrintFont( f );
538 mReaderWin->saveRelativePosition();
539 mReaderWin->update();
542 void KMReaderMainWin::slotSizeAction(
int size )
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();
552 void KMReaderMainWin::slotCreateTodo()
556 KMCommand *command =
new CreateTodoCommand(
this, mMsg );
560 void KMReaderMainWin::slotEditToolbars()
562 saveMainWindowSettings( KMKernel::config(),
"ReaderWindow" );
563 KEditToolbar dlg( guiFactory(),
this );
564 connect( &dlg, TQ_SIGNAL(newToolbarConfig()), TQ_SLOT(slotUpdateToolbars()) );
568 void KMReaderMainWin::slotUpdateToolbars()
570 createGUI(
"kmreadermainwin.rc");
571 applyMainWindowSettings(KMKernel::config(),
"ReaderWindow");
574 #include "kmreadermainwin.moc"
bool isTrash()
Returns true if this folder is configured as a trash folder, locally or for one of the accounts.
void close(const char *owner, bool force=false)
Close folder.
KMMessage * getMsg(int idx)
Read message at given index.
int open(const char *owner)
Open folder for access.
TQString subject() const
Get or set the 'Subject' header field.
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...
static const KMMsgDict * instance()
Access the globally unique MessageDict.
This class implements a "reader window", that is a window used for reading or viewing messages.
Manages common actions that can be performed on one or more messages.