diff options
Diffstat (limited to 'kmail/kmreadermainwin.cpp')
-rw-r--r-- | kmail/kmreadermainwin.cpp | 535 |
1 files changed, 535 insertions, 0 deletions
diff --git a/kmail/kmreadermainwin.cpp b/kmail/kmreadermainwin.cpp new file mode 100644 index 000000000..655e09181 --- /dev/null +++ b/kmail/kmreadermainwin.cpp @@ -0,0 +1,535 @@ +/* + This file is part of KMail, the KDE mail client. + Copyright (c) 2002 Don Sanders <sanders@kde.org> + + KMail is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License, version 2, as + published by the Free Software Foundation. + + KMail is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ +// +// A toplevel KMainWindow derived class for displaying +// single messages or single message parts. +// +// Could be extended to include support for normal main window +// widgets like a toolbar. + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <qaccel.h> +#include <kapplication.h> +#include <kedittoolbar.h> +#include <klocale.h> +#include <kstdaccel.h> +#include <kwin.h> +#include <kaction.h> +#include <kiconloader.h> +#include <kdebug.h> +#include "kmcommands.h" +#include "kmenubar.h" +#include "kpopupmenu.h" +#include "kmreaderwin.h" +#include "kmfolder.h" +#include "kmmainwidget.h" +#include "kmfoldertree.h" +#include "kmmsgdict.h" +#include "csshelper.h" +#include "messageactions.h" + +#include "globalsettings.h" + +#include "kmreadermainwin.h" + +KMReaderMainWin::KMReaderMainWin( bool htmlOverride, bool htmlLoadExtOverride, + char *name ) + : KMail::SecondaryWindow( name ? name : "readerwindow#" ), + mMsg( 0 ) +{ + mReaderWin = new KMReaderWin( this, this, actionCollection() ); + //mReaderWin->setShowCompleteMessage( true ); + mReaderWin->setAutoDelete( true ); + mReaderWin->setHtmlOverride( htmlOverride ); + mReaderWin->setHtmlLoadExtOverride( htmlLoadExtOverride ); + mReaderWin->setDecryptMessageOverwrite( true ); + mReaderWin->setShowSignatureDetails( false ); + initKMReaderMainWin(); +} + + +//----------------------------------------------------------------------------- +KMReaderMainWin::KMReaderMainWin( char *name ) + : KMail::SecondaryWindow( name ? name : "readerwindow#" ), + mMsg( 0 ) +{ + mReaderWin = new KMReaderWin( this, this, actionCollection() ); + mReaderWin->setAutoDelete( true ); + initKMReaderMainWin(); +} + + +//----------------------------------------------------------------------------- +KMReaderMainWin::KMReaderMainWin(KMMessagePart* aMsgPart, + bool aHTML, const QString& aFileName, const QString& pname, + const QString & encoding, char *name ) + : KMail::SecondaryWindow( name ? name : "readerwindow#" ), + mMsg( 0 ) +{ + mReaderWin = new KMReaderWin( this, this, actionCollection() ); + mReaderWin->setOverrideEncoding( encoding ); + mReaderWin->setMsgPart( aMsgPart, aHTML, aFileName, pname ); + initKMReaderMainWin(); +} + + +//----------------------------------------------------------------------------- +void KMReaderMainWin::initKMReaderMainWin() { + setCentralWidget( mReaderWin ); + setupAccel(); + setupGUI( Keys | StatusBar | Create, "kmreadermainwin.rc" ); + setupForwardingActionsList(); + applyMainWindowSettings( KMKernel::config(), "Separate Reader Window" ); + if ( ! mReaderWin->message() ) { + menuBar()->hide(); + toolBar( "mainToolBar" )->hide(); + } + + connect( kmkernel, SIGNAL( configChanged() ), + this, SLOT( slotConfigChanged() ) ); +} + +void KMReaderMainWin::setupForwardingActionsList() +{ + QPtrList<KAction> mForwardActionList; + if ( GlobalSettings::self()->forwardingInlineByDefault() ) { + unplugActionList( "forward_action_list" ); + mForwardActionList.append( mForwardInlineAction ); + mForwardActionList.append( mForwardAttachedAction ); + mForwardActionList.append( mForwardDigestAction ); + mForwardActionList.append( mRedirectAction ); + plugActionList( "forward_action_list", mForwardActionList ); + } else { + unplugActionList( "forward_action_list" ); + mForwardActionList.append( mForwardAttachedAction ); + mForwardActionList.append( mForwardInlineAction ); + mForwardActionList.append( mForwardDigestAction ); + mForwardActionList.append( mRedirectAction ); + plugActionList( "forward_action_list", mForwardActionList ); + } +} + +//----------------------------------------------------------------------------- +KMReaderMainWin::~KMReaderMainWin() +{ + saveMainWindowSettings( KMKernel::config(), "Separate Reader Window" ); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::setUseFixedFont( bool useFixedFont ) +{ + mReaderWin->setUseFixedFont( useFixedFont ); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::showMsg( const QString & encoding, KMMessage *msg ) +{ + mReaderWin->setOverrideEncoding( encoding ); + mReaderWin->setMsg( msg, true ); + mReaderWin->slotTouchMessage(); + setCaption( msg->subject() ); + mMsg = msg; + mMsgActions->setCurrentMessage( msg ); + menuBar()->show(); + toolBar( "mainToolBar" )->show(); + + connect ( msg->parent(), SIGNAL( destroyed( QObject* ) ), this, SLOT( slotFolderRemoved( QObject* ) ) ); + +} + +void KMReaderMainWin::slotFolderRemoved( QObject* folderPtr ) +{ + assert(mMsg); + assert(folderPtr == mMsg->parent()); + if( mMsg && folderPtr == mMsg->parent() ) + mMsg->setParent( 0 ); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::slotTrashMsg() +{ + if ( !mMsg ) + return; + // find the real msg by its sernum + KMFolder* parent; + int index; + KMMsgDict::instance()->getLocation( mMsg->getMsgSerNum(), &parent, &index ); + if ( parent && !parent->isTrash() ) { + // open the folder (ref counted) + parent->open("trashmsg"); + KMMessage *msg = parent->getMsg( index ); + if (msg) { + KMDeleteMsgCommand *command = new KMDeleteMsgCommand( parent, msg ); + command->start(); + } + parent->close("trashmsg"); + } + close(); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::slotFind() +{ + mReaderWin->slotFind(); +} + +void KMReaderMainWin::slotFindNext() +{ + mReaderWin->slotFindNext(); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::slotCopy() +{ + mReaderWin->slotCopySelectedText(); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::slotMarkAll() +{ + mReaderWin->selectAll(); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::slotPrintMsg() +{ + KMPrintCommand *command = new KMPrintCommand( this, mReaderWin->message(), + mReaderWin->htmlOverride(), mReaderWin->htmlLoadExtOverride(), + mReaderWin->isFixedFont(), mReaderWin->overrideEncoding() ); + command->setOverrideFont( mReaderWin->cssHelper()->bodyFont( mReaderWin->isFixedFont(), true /*printing*/ ) ); + command->start(); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::slotForwardInlineMsg() +{ + KMCommand *command = 0; + if ( mReaderWin->message() && mReaderWin->message()->parent() ) { + command = new KMForwardInlineCommand( this, mReaderWin->message(), + mReaderWin->message()->parent()->identity() ); + } else { + command = new KMForwardInlineCommand( this, mReaderWin->message() ); + } + command->start(); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::slotForwardAttachedMsg() +{ + KMCommand *command = 0; + if ( mReaderWin->message() && mReaderWin->message()->parent() ) { + command = new KMForwardAttachedCommand( this, mReaderWin->message(), + mReaderWin->message()->parent()->identity() ); + } else { + command = new KMForwardAttachedCommand( this, mReaderWin->message() ); + } + command->start(); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::slotForwardDigestMsg() +{ + KMCommand *command = 0; + if ( mReaderWin->message() && mReaderWin->message()->parent() ) { + command = new KMForwardDigestCommand( this, mReaderWin->message(), + mReaderWin->message()->parent()->identity() ); + } else { + command = new KMForwardDigestCommand( this, mReaderWin->message() ); + } + command->start(); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::slotRedirectMsg() +{ + KMCommand *command = new KMRedirectCommand( this, mReaderWin->message() ); + command->start(); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::slotShowMsgSrc() +{ + KMMessage *msg = mReaderWin->message(); + if ( !msg ) + return; + KMCommand *command = new KMShowMsgSrcCommand( this, msg, + mReaderWin->isFixedFont() ); + command->start(); +} + +//----------------------------------------------------------------------------- +void KMReaderMainWin::slotConfigChanged() +{ + //readConfig(); +} + +void KMReaderMainWin::setupAccel() +{ + if ( kmkernel->xmlGuiInstance() ) + setInstance( kmkernel->xmlGuiInstance() ); + + mMsgActions = new KMail::MessageActions( actionCollection(), this ); + mMsgActions->setMessageView( mReaderWin ); + //----- File Menu + //mOpenAction = KStdAction::open( this, SLOT( slotOpenMsg() ), + // actionCollection() ); + + //mSaveAsAction = new KAction( i18n("Save &As..."), "filesave", + // KStdAccel::shortcut( KStdAccel::Save ), + // this, SLOT( slotSaveMsg() ), + // actionCollection(), "file_save_as" ); + + mSaveAsAction = KStdAction::saveAs( mReaderWin, SLOT( slotSaveMsg() ), + actionCollection() ); + mSaveAsAction->setShortcut( KStdAccel::shortcut( KStdAccel::Save ) ); + mPrintAction = KStdAction::print( this, SLOT( slotPrintMsg() ), + actionCollection() ); + + KAction *closeAction = KStdAction::close( this, SLOT( close() ), actionCollection() ); + KShortcut closeShortcut = closeAction->shortcut(); + closeShortcut.append( KKey(Key_Escape)); + closeAction->setShortcut(closeShortcut); + + //----- Edit Menu + KStdAction::copy( this, SLOT( slotCopy() ), actionCollection() ); + KStdAction::selectAll( this, SLOT( slotMarkAll() ), actionCollection() ); + KStdAction::find( this, SLOT(slotFind()), actionCollection() ); + KStdAction::findNext( this, SLOT( slotFindNext() ), actionCollection() ); + mTrashAction = new KAction( KGuiItem( i18n( "&Move to Trash" ), "edittrash", + i18n( "Move message to trashcan" ) ), + Key_Delete, this, SLOT( slotTrashMsg() ), + actionCollection(), "move_to_trash" ); + + //----- View Menu + mViewSourceAction = new KAction( i18n("&View Source"), Key_V, this, + SLOT(slotShowMsgSrc()), actionCollection(), + "view_source" ); + + + mForwardActionMenu = new KActionMenu( i18n("Message->","&Forward"), + "mail_forward", actionCollection(), + "message_forward" ); + mForwardInlineAction = new KAction( i18n("&Inline..."), + "mail_forward", SHIFT+Key_F, this, + SLOT(slotForwardInlineMsg()), + actionCollection(), + "message_forward_inline" ); + + mForwardAttachedAction = new KAction( i18n("Message->Forward->","As &Attachment..."), + "mail_forward", Key_F, this, + SLOT(slotForwardAttachedMsg()), + actionCollection(), + "message_forward_as_attachment" ); + + mForwardDigestAction = new KAction( i18n("Message->Forward->","As Di&gest..."), + "mail_forward", 0, this, + SLOT(slotForwardDigestMsg()), + actionCollection(), + "message_forward_as_digest" ); + + mRedirectAction = new KAction( i18n("Message->Forward->","&Redirect..."), + "mail_forward", Key_E, this, + SLOT(slotRedirectMsg()), + actionCollection(), + "message_forward_redirect" ); + + if ( GlobalSettings::self()->forwardingInlineByDefault() ) { + mForwardActionMenu->insert( mForwardInlineAction ); + mForwardActionMenu->insert( mForwardAttachedAction ); + mForwardInlineAction->setShortcut( Key_F ); + mForwardAttachedAction->setShortcut( SHIFT+Key_F ); + connect( mForwardActionMenu, SIGNAL(activated()), this, + SLOT(slotForwardInlineMsg()) ); + } else { + mForwardActionMenu->insert( mForwardAttachedAction ); + mForwardActionMenu->insert( mForwardInlineAction ); + mForwardInlineAction->setShortcut( SHIFT+Key_F ); + mForwardAttachedAction->setShortcut( Key_F ); + connect( mForwardActionMenu, SIGNAL(activated()), this, + SLOT(slotForwardAttachedMsg()) ); + } + + mForwardActionMenu->insert( mForwardDigestAction ); + mForwardActionMenu->insert( mRedirectAction ); + + fontAction = new KFontAction( "Select Font", 0, actionCollection(), + "text_font" ); + fontAction->setFont( mReaderWin->cssHelper()->bodyFont().family() ); + connect( fontAction, SIGNAL( activated( const QString& ) ), + SLOT( slotFontAction( const QString& ) ) ); + fontSizeAction = new KFontSizeAction( "Select Size", 0, actionCollection(), + "text_size" ); + fontSizeAction->setFontSize( mReaderWin->cssHelper()->bodyFont().pointSize() ); + connect( fontSizeAction, SIGNAL( fontSizeChanged( int ) ), + SLOT( slotSizeAction( int ) ) ); + + QAccel *accel = new QAccel(mReaderWin, "showMsg()"); + accel->connectItem(accel->insertItem(Key_Up), + mReaderWin, SLOT(slotScrollUp())); + accel->connectItem(accel->insertItem(Key_Down), + mReaderWin, SLOT(slotScrollDown())); + accel->connectItem(accel->insertItem(Key_Prior), + mReaderWin, SLOT(slotScrollPrior())); + accel->connectItem(accel->insertItem(Key_Next), + mReaderWin, SLOT(slotScrollNext())); + accel->connectItem(accel->insertItem(KStdAccel::shortcut(KStdAccel::Copy)), + mReaderWin, SLOT(slotCopySelectedText())); + connect( mReaderWin, SIGNAL(popupMenu(KMMessage&,const KURL&,const QPoint&)), + this, SLOT(slotMsgPopup(KMMessage&,const KURL&,const QPoint&))); + connect(mReaderWin, SIGNAL(urlClicked(const KURL&,int)), + mReaderWin, SLOT(slotUrlClicked())); + + setStandardToolBarMenuEnabled(true); + KStdAction::configureToolbars(this, SLOT(slotEditToolbars()), actionCollection()); +} + + +void KMReaderMainWin::slotMsgPopup(KMMessage &aMsg, const KURL &aUrl, const QPoint& aPoint) +{ + KPopupMenu * menu = new KPopupMenu; + mUrl = aUrl; + mMsg = &aMsg; + bool urlMenuAdded=false; + + if (!aUrl.isEmpty()) + { + if (aUrl.protocol() == "mailto") { + // popup on a mailto URL + mReaderWin->mailToComposeAction()->plug( menu ); + if ( mMsg ) { + mReaderWin->mailToReplyAction()->plug( menu ); + mReaderWin->mailToForwardAction()->plug( menu ); + menu->insertSeparator(); + } + mReaderWin->addAddrBookAction()->plug( menu ); + mReaderWin->openAddrBookAction()->plug( menu ); + mReaderWin->copyAction()->plug( menu ); + } else { + // popup on a not-mailto URL + mReaderWin->urlOpenAction()->plug( menu ); + mReaderWin->addBookmarksAction()->plug( menu ); + mReaderWin->urlSaveAsAction()->plug( menu ); + mReaderWin->copyURLAction()->plug( menu ); + } + urlMenuAdded=true; + } + if(mReaderWin && !mReaderWin->copyText().isEmpty()) { + if ( urlMenuAdded ) + menu->insertSeparator(); + mMsgActions->replyMenu()->plug( menu ); + menu->insertSeparator(); + + mReaderWin->copyAction()->plug( menu ); + mReaderWin->selectAllAction()->plug( menu ); + } else if ( !urlMenuAdded ) + { + // popup somewhere else (i.e., not a URL) on the message + + if (!mMsg) // no message + { + delete menu; + return; + } + + if ( ! ( aMsg.parent() && ( aMsg.parent()->isSent() || + aMsg.parent()->isDrafts() || + aMsg.parent()->isTemplates() ) ) ) { + // add the reply and forward actions only if we are not in a sent-mail, + // templates or drafts folder + // + // FIXME: needs custom templates added to menu + // (see KMMainWidget::updateCustomTemplateMenus) + mMsgActions->replyMenu()->plug( menu ); + mForwardActionMenu->plug( menu ); + menu->insertSeparator(); + } + + QPopupMenu* copyMenu = new QPopupMenu(menu); + KMMainWidget* mainwin = kmkernel->getKMMainWidget(); + if ( mainwin ) + mainwin->folderTree()->folderToPopupMenu( KMFolderTree::CopyMessage, this, + &mMenuToFolder, copyMenu ); + menu->insertItem( i18n("&Copy To" ), copyMenu ); + menu->insertSeparator(); + mViewSourceAction->plug( menu ); + mReaderWin->toggleFixFontAction()->plug( menu ); + menu->insertSeparator(); + mPrintAction->plug( menu ); + mSaveAsAction->plug( menu ); + menu->insertItem( i18n("Save Attachments..."), mReaderWin, SLOT(slotSaveAttachments()) ); + mMsgActions->createTodoAction()->plug( menu ); + } + menu->exec(aPoint, 0); + delete menu; +} + +void KMReaderMainWin::copySelectedToFolder( int menuId ) +{ + if (!mMenuToFolder[menuId]) + return; + + KMCommand *command = new KMCopyCommand( mMenuToFolder[menuId], mMsg ); + command->start(); +} + +void KMReaderMainWin::slotFontAction( const QString& font) +{ + QFont f( mReaderWin->cssHelper()->bodyFont() ); + f.setFamily( font ); + mReaderWin->cssHelper()->setBodyFont( f ); + mReaderWin->cssHelper()->setPrintFont( f ); + mReaderWin->saveRelativePosition(); + mReaderWin->update(); +} + +void KMReaderMainWin::slotSizeAction( int size ) +{ + QFont f( mReaderWin->cssHelper()->bodyFont() ); + f.setPointSize( size ); + mReaderWin->cssHelper()->setBodyFont( f ); + mReaderWin->cssHelper()->setPrintFont( f ); + mReaderWin->saveRelativePosition(); + mReaderWin->update(); +} + +void KMReaderMainWin::slotCreateTodo() +{ + if ( !mMsg ) + return; + KMCommand *command = new CreateTodoCommand( this, mMsg ); + command->start(); +} + +void KMReaderMainWin::slotEditToolbars() +{ + saveMainWindowSettings( KMKernel::config(), "ReaderWindow" ); + KEditToolbar dlg( guiFactory(), this ); + connect( &dlg, SIGNAL(newToolbarConfig()), SLOT(slotUpdateToolbars()) ); + dlg.exec(); +} + +void KMReaderMainWin::slotUpdateToolbars() +{ + createGUI("kmreadermainwin.rc"); + applyMainWindowSettings(KMKernel::config(), "ReaderWindow"); +} + +#include "kmreadermainwin.moc" |