• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

kmail

  • sources
  • kde-4.14
  • kdepim
  • kmail
kmreadermainwin.cpp
Go to the documentation of this file.
1 /*
2  This file is part of KMail, the KDE mail client.
3  Copyright (c) 2002 Don Sanders <sanders@kde.org>
4  Copyright (c) 2011-2015 Montel Laurent <montel@kde.org>
5 
6  KMail is free software; you can redistribute it and/or modify it
7  under the terms of the GNU General Public License, version 2, as
8  published by the Free Software Foundation.
9 
10  KMail is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program; if not, write to the Free Software
17  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19 //
20 // A toplevel KMainWindow derived class for displaying
21 // single messages or single message parts.
22 //
23 // Could be extended to include support for normal main window
24 // widgets like a toolbar.
25 
26 #include "kmreadermainwin.h"
27 #include "kmreaderwin.h"
28 
29 #include <kicon.h>
30 #include <kactionmenu.h>
31 #include <kedittoolbar.h>
32 #include <klocale.h>
33 #include <kstandardshortcut.h>
34 #include <kwindowsystem.h>
35 #include <kaction.h>
36 #include <kfontaction.h>
37 #include <kstandardaction.h>
38 #include <ktoggleaction.h>
39 #include <ktoolbar.h>
40 #include <kdebug.h>
41 #include <KFontAction>
42 #include <KFontSizeAction>
43 #include <kstatusbar.h>
44 #include <KMessageBox>
45 #include <KAcceleratorManager>
46 #include "kmcommands.h"
47 #include "kmenubar.h"
48 #include "kmenu.h"
49 #include "kmmainwidget.h"
50 #include "messageviewer/viewer/csshelper.h"
51 #include "customtemplatesmenu.h"
52 #include "messageactions.h"
53 #include "util.h"
54 #include "kernel/mailkernel.h"
55 #include "foldercollection.h"
56 
57 #include <KActionCollection>
58 #include <akonadi/contact/contactsearchjob.h>
59 #include <kpimutils/email.h>
60 #include <kmime/kmime_message.h>
61 
62 #include <akonadi/item.h>
63 #include <akonadi/itemcopyjob.h>
64 #include <akonadi/itemcreatejob.h>
65 #include <akonadi/itemmovejob.h>
66 #include <akonadi/kmime/messageflags.h>
67 
68 #include "messagecore/helpers/messagehelpers.h"
69 #include <util/mailutil.h>
70 
71 using namespace MailCommon;
72 
73 KMReaderMainWin::KMReaderMainWin(MessageViewer::Viewer::DisplayFormatMessage format, bool htmlLoadExtOverride,
74  char *name )
75  : KMail::SecondaryWindow( name ? name : "readerwindow#" )
76 {
77  mReaderWin = new KMReaderWin( this, this, actionCollection());
78  //mReaderWin->setShowCompleteMessage( true );
79  mReaderWin->setDisplayFormatMessageOverwrite( format );
80  mReaderWin->setHtmlLoadExtOverride( htmlLoadExtOverride );
81  mReaderWin->setDecryptMessageOverwrite( true );
82  initKMReaderMainWin();
83 }
84 
85 
86 
87 KMReaderMainWin::KMReaderMainWin( char *name )
88  : KMail::SecondaryWindow( name ? name : "readerwindow#" )
89 {
90  mReaderWin = new KMReaderWin( this, this, actionCollection());
91  initKMReaderMainWin();
92 }
93 
94 
95 
96 KMReaderMainWin::KMReaderMainWin(KMime::Content* aMsgPart, MessageViewer::Viewer::DisplayFormatMessage format, const QString & encoding, char *name )
97  : KMail::SecondaryWindow( name ? name : "readerwindow#" )
98 {
99  mReaderWin = new KMReaderWin( this, this, actionCollection() );
100  mReaderWin->setOverrideEncoding( encoding );
101  mReaderWin->setDisplayFormatMessageOverwrite( format );
102  mReaderWin->setMsgPart( aMsgPart );
103  initKMReaderMainWin();
104 }
105 
106 
107 void KMReaderMainWin::initKMReaderMainWin()
108 {
109  setCentralWidget( mReaderWin );
110  setupAccel();
111  setupGUI( Keys | StatusBar | Create, QLatin1String("kmreadermainwin.rc") );
112  mMsgActions->setupForwardingActionsList( this );
113  applyMainWindowSettings( KMKernel::self()->config()->group( "Separate Reader Window" ) );
114  if( ! mReaderWin->message().isValid() ) {
115  menuBar()->hide();
116  toolBar( QLatin1String("mainToolBar") )->hide();
117  }
118  connect( kmkernel, SIGNAL(configChanged()),
119  this, SLOT(slotConfigChanged()) );
120  connect( mReaderWin, SIGNAL(showStatusBarMessage(QString)),
121  statusBar(), SLOT(showMessage(QString)) );
122 }
123 
124 
125 KMReaderMainWin::~KMReaderMainWin()
126 {
127  saveMainWindowSettings( KMKernel::self()->config()->group( "Separate Reader Window" ) );
128 }
129 
130 
131 void KMReaderMainWin::setUseFixedFont( bool useFixedFont )
132 {
133  mReaderWin->setUseFixedFont( useFixedFont );
134 }
135 
136 void KMReaderMainWin::showMessage( const QString & encoding, const Akonadi::Item &msg, const Akonadi::Collection& parentCollection )
137 {
138 
139  mParentCollection = parentCollection;
140  mReaderWin->setOverrideEncoding( encoding );
141  mReaderWin->setMessage( msg, MessageViewer::Viewer::Force );
142  KMime::Message::Ptr message = MessageCore::Util::message( msg );
143  QString caption;
144  if ( message ) {
145  caption = message->subject()->asUnicodeString();
146  }
147  if(mParentCollection.isValid()) {
148  caption += QLatin1String(" - ");
149  caption += MailCommon::Util::fullCollectionPath( mParentCollection );
150  }
151  if(!caption.isEmpty()) {
152  setCaption(caption);
153  }
154  mMsg = msg;
155  mMsgActions->setCurrentMessage( msg );
156 
157  const bool canChange = mParentCollection.isValid() ? (bool)( mParentCollection.rights() & Akonadi::Collection::CanDeleteItem ) : false;
158  mTrashAction->setEnabled( canChange );
159 
160  menuBar()->show();
161  toolBar( QLatin1String("mainToolBar") )->show();
162 }
163 
164 void KMReaderMainWin::showMessage( const QString& encoding, KMime::Message::Ptr message )
165 {
166  if ( !message )
167  return;
168 
169  Akonadi::Item item;
170 
171  item.setPayload<KMime::Message::Ptr>( message );
172  Akonadi::MessageFlags::copyMessageFlags(*message, item);
173  item.setMimeType( KMime::Message::mimeType() );
174 
175  mMsg = item;
176  mMsgActions->setCurrentMessage( item );
177 
178  mReaderWin->setOverrideEncoding( encoding );
179  mReaderWin->setMessage( message );
180  setCaption( message->subject()->asUnicodeString() );
181 
182  mTrashAction->setEnabled( false );
183 
184  menuBar()->show();
185  toolBar( QLatin1String("mainToolBar") )->show();
186 }
187 
188 
189 void KMReaderMainWin::slotReplyOrForwardFinished()
190 {
191  if ( GlobalSettings::self()->closeAfterReplyOrForward() ) {
192  close();
193  }
194 }
195 
196 Akonadi::Collection KMReaderMainWin::parentCollection() const
197 {
198  if ( mParentCollection.isValid() )
199  return mParentCollection;
200  else
201  return mMsg.parentCollection();
202 }
203 
204 
205 void KMReaderMainWin::slotTrashMsg()
206 {
207  if ( !mMsg.isValid() )
208  return;
209  KMTrashMsgCommand *command = new KMTrashMsgCommand( parentCollection(), mMsg, -1 );
210  command->start();
211  close();
212 }
213 
214 
215 void KMReaderMainWin::slotForwardInlineMsg()
216 {
217  if ( !mReaderWin->message().hasPayload<KMime::Message::Ptr>() ) return;
218  KMCommand *command = 0;
219  const Akonadi::Collection parentCol = mReaderWin->message().parentCollection();
220  if ( parentCol.isValid() ) {
221  QSharedPointer<FolderCollection> fd = FolderCollection::forCollection( parentCol, false );
222  if ( fd )
223  command = new KMForwardCommand( this, mReaderWin->message(),
224  fd->identity() );
225  else
226  command = new KMForwardCommand( this, mReaderWin->message() );
227  } else {
228  command = new KMForwardCommand( this, mReaderWin->message() );
229  }
230  connect( command, SIGNAL(completed(KMCommand*)),
231  this, SLOT(slotReplyOrForwardFinished()) );
232  command->start();
233 }
234 
235 
236 void KMReaderMainWin::slotForwardAttachedMsg()
237 {
238  if ( !mReaderWin->message().hasPayload<KMime::Message::Ptr>() ) return;
239  KMCommand *command = 0;
240  const Akonadi::Collection parentCol = mReaderWin->message().parentCollection();
241  if ( parentCol.isValid() ) {
242  QSharedPointer<FolderCollection> fd = FolderCollection::forCollection( parentCol, false );
243  if ( fd )
244  command = new KMForwardAttachedCommand( this, mReaderWin->message(),
245  fd->identity() );
246  else
247  command = new KMForwardAttachedCommand( this, mReaderWin->message() );
248  }
249  else
250  command = new KMForwardAttachedCommand( this, mReaderWin->message() );
251 
252  connect( command, SIGNAL(completed(KMCommand*)),
253  this, SLOT(slotReplyOrForwardFinished()) );
254  command->start();
255 }
256 
257 
258 void KMReaderMainWin::slotRedirectMsg()
259 {
260  if ( !mReaderWin->message().hasPayload<KMime::Message::Ptr>() ) return;
261  KMCommand *command = new KMRedirectCommand( this, mReaderWin->message() );
262  connect( command, SIGNAL(completed(KMCommand*)),
263  this, SLOT(slotReplyOrForwardFinished()) );
264  command->start();
265 }
266 
267 
268 void KMReaderMainWin::slotCustomReplyToMsg( const QString &tmpl )
269 {
270  if ( !mReaderWin->message().hasPayload<KMime::Message::Ptr>() ) return;
271  KMCommand *command = new KMReplyCommand( this,
272  mReaderWin->message(),
273  MessageComposer::ReplySmart,
274  mReaderWin->copyText(),
275  false, tmpl );
276  connect( command, SIGNAL(completed(KMCommand*)),
277  this, SLOT(slotReplyOrForwardFinished()) );
278  command->start();
279 }
280 
281 
282 void KMReaderMainWin::slotCustomReplyAllToMsg( const QString &tmpl )
283 {
284  if ( !mReaderWin->message().hasPayload<KMime::Message::Ptr>() ) return;
285  KMCommand *command = new KMReplyCommand( this,
286  mReaderWin->message(),
287  MessageComposer::ReplyAll,
288  mReaderWin->copyText(),
289  false, tmpl );
290  connect( command, SIGNAL(completed(KMCommand*)),
291  this, SLOT(slotReplyOrForwardFinished()) );
292 
293  command->start();
294 }
295 
296 
297 void KMReaderMainWin::slotCustomForwardMsg( const QString &tmpl)
298 {
299  if ( !mReaderWin->message().hasPayload<KMime::Message::Ptr>() ) return;
300  KMCommand *command = new KMForwardCommand( this,
301  mReaderWin->message(),
302  0, tmpl );
303  connect( command, SIGNAL(completed(KMCommand*)),
304  this, SLOT(slotReplyOrForwardFinished()) );
305 
306  command->start();
307 }
308 
309 
310 void KMReaderMainWin::slotConfigChanged()
311 {
312  //readConfig();
313  mMsgActions->setupForwardActions();
314  mMsgActions->setupForwardingActionsList( this );
315 }
316 
317 void KMReaderMainWin::setupAccel()
318 {
319  if ( kmkernel->xmlGuiInstance().isValid() )
320  setComponentData( kmkernel->xmlGuiInstance() );
321 
322  mMsgActions = new KMail::MessageActions( actionCollection(), this );
323  mMsgActions->setMessageView( mReaderWin );
324  connect( mMsgActions, SIGNAL(replyActionFinished()),
325  this, SLOT(slotReplyOrForwardFinished()) );
326 
327  //----- File Menu
328 
329  mSaveAtmAction = new KAction(KIcon(QLatin1String("mail-attachment")), i18n("Save A&ttachments..."), actionCollection() );
330  connect( mSaveAtmAction, SIGNAL(triggered(bool)), mReaderWin->viewer(), SLOT(slotAttachmentSaveAll()) );
331 
332  mTrashAction = new KAction( KIcon( QLatin1String("user-trash") ), i18n("&Move to Trash"), this );
333  mTrashAction->setIconText( i18nc( "@action:intoolbar Move to Trash", "Trash" ) );
334  mTrashAction->setHelpText( i18n( "Move message to trashcan" ) );
335  mTrashAction->setShortcut( QKeySequence( Qt::Key_Delete ) );
336  actionCollection()->addAction( QLatin1String("move_to_trash"), mTrashAction );
337  connect( mTrashAction, SIGNAL(triggered()), this, SLOT(slotTrashMsg()) );
338 
339  KAction *closeAction = KStandardAction::close( this, SLOT(close()), actionCollection() );
340  KShortcut closeShortcut = KShortcut(closeAction->shortcuts());
341  closeShortcut.setAlternate( QKeySequence(Qt::Key_Escape));
342  closeAction->setShortcuts(closeShortcut);
343 
344  //----- Message Menu
345 
346  mFontAction = new KFontAction( i18n("Select Font"), this );
347  actionCollection()->addAction( QLatin1String("text_font"), mFontAction );
348  mFontAction->setFont( mReaderWin->cssHelper()->bodyFont().family() );
349  connect( mFontAction, SIGNAL(triggered(QString)),
350  SLOT(slotFontAction(QString)) );
351  mFontSizeAction = new KFontSizeAction( i18n( "Select Size" ), this );
352  mFontSizeAction->setFontSize( mReaderWin->cssHelper()->bodyFont().pointSize() );
353  actionCollection()->addAction( QLatin1String("text_size"), mFontSizeAction );
354  connect( mFontSizeAction, SIGNAL(fontSizeChanged(int)),
355  SLOT(slotSizeAction(int)) );
356 
357 
358  connect( mReaderWin->viewer(), SIGNAL(popupMenu(Akonadi::Item,KUrl,KUrl,QPoint)),
359  this, SLOT(slotMessagePopup(Akonadi::Item,KUrl,KUrl,QPoint)) );
360 
361  connect( mReaderWin->viewer(), SIGNAL(itemRemoved()),
362  this, SLOT(close()) );
363 
364  setStandardToolBarMenuEnabled(true);
365  KStandardAction::configureToolbars(this, SLOT(slotEditToolbars()), actionCollection());
366  connect( mReaderWin->viewer(), SIGNAL(moveMessageToTrash()), this, SLOT(slotTrashMsg()) );
367 }
368 
369 
370 KAction *KMReaderMainWin::copyActionMenu(QMenu *menu)
371 {
372  KMMainWidget* mainwin = kmkernel->getKMMainWidget();
373  if ( mainwin )
374  {
375  KActionMenu *action = new KActionMenu( menu );
376  action->setIcon( KIcon( QLatin1String("edit-copy")) );
377  action->setText(i18n("Copy Message To...") );
378  mainwin->standardMailActionManager()->standardActionManager()->createActionFolderMenu( action->menu(), Akonadi::StandardActionManager::CopyItemToMenu );
379  connect( action->menu(), SIGNAL(triggered(QAction*)), SLOT(slotCopyItem(QAction*)) );
380 
381  return action;
382  }
383  return 0;
384 }
385 
386 KAction *KMReaderMainWin::moveActionMenu(QMenu *menu)
387 {
388  KMMainWidget* mainwin = kmkernel->getKMMainWidget();
389  if ( mainwin )
390  {
391  KActionMenu *action = new KActionMenu( menu );
392  action->setText(i18n("Move Message To...") );
393  mainwin->standardMailActionManager()->standardActionManager()->createActionFolderMenu( action->menu(), Akonadi::StandardActionManager::MoveItemToMenu );
394  connect( action->menu(), SIGNAL(triggered(QAction*)), SLOT(slotMoveItem(QAction*)) );
395 
396  return action;
397  }
398  return 0;
399 
400 }
401 
402 void KMReaderMainWin::slotMoveItem(QAction *action)
403 {
404  if ( action )
405  {
406  const QModelIndex index = action->data().value<QModelIndex>();
407  const Akonadi::Collection collection = index.data( Akonadi::EntityTreeModel::CollectionRole ).value<Akonadi::Collection>();
408  copyOrMoveItem(collection, true);
409  }
410 }
411 
412 void KMReaderMainWin::copyOrMoveItem(const Akonadi::Collection &collection, bool move)
413 {
414  if ( mMsg.isValid() ) {
415  if (move) {
416  Akonadi::ItemMoveJob *job = new Akonadi::ItemMoveJob( mMsg, collection,this );
417  connect( job, SIGNAL(result(KJob*)), this, SLOT(slotCopyMoveResult(KJob*)) );
418  } else {
419  Akonadi::ItemCopyJob *job = new Akonadi::ItemCopyJob( mMsg, collection,this );
420  connect( job, SIGNAL(result(KJob*)), this, SLOT(slotCopyMoveResult(KJob*)) );
421  }
422  }
423  else
424  {
425  Akonadi::ItemCreateJob *job = new Akonadi::ItemCreateJob( mMsg, collection, this );
426  connect( job, SIGNAL(result(KJob*)), this, SLOT(slotCopyMoveResult(KJob*)) );
427  }
428 }
429 
430 void KMReaderMainWin::slotCopyItem(QAction*action)
431 {
432  if ( action )
433  {
434  const QModelIndex index = action->data().value<QModelIndex>();
435  const Akonadi::Collection collection = index.data( Akonadi::EntityTreeModel::CollectionRole ).value<Akonadi::Collection>();
436  copyOrMoveItem(collection, false);
437  }
438 }
439 
440 void KMReaderMainWin::slotCopyMoveResult( KJob * job )
441 {
442  if ( job->error() ) {
443  KMessageBox::sorry( this, i18n("Cannot copy item. %1", job->errorString() ) );
444  }
445 }
446 
447 void KMReaderMainWin::slotMessagePopup(const Akonadi::Item&aMsg , const KUrl&aUrl, const KUrl&imageUrl, const QPoint& aPoint)
448 {
449  mMsg = aMsg;
450 
451  const QString email = KPIMUtils::firstEmailAddress( aUrl.path() ).toLower();
452  if ( aUrl.protocol() == QLatin1String("mailto") && !email.isEmpty()) {
453  Akonadi::ContactSearchJob *job = new Akonadi::ContactSearchJob( this );
454  job->setLimit( 1 );
455  job->setQuery( Akonadi::ContactSearchJob::Email, email, Akonadi::ContactSearchJob::ExactMatch );
456  job->setProperty( "msg", QVariant::fromValue( mMsg ) );
457  job->setProperty( "point", aPoint );
458  job->setProperty( "imageUrl", imageUrl );
459  job->setProperty( "url", aUrl );
460  connect( job, SIGNAL(result(KJob*)), SLOT(slotContactSearchJobForMessagePopupDone(KJob*)) );
461  } else {
462  showMessagePopup(mMsg, aUrl, imageUrl, aPoint, false, false);
463  }
464 }
465 
466 void KMReaderMainWin::slotContactSearchJobForMessagePopupDone( KJob *job )
467 {
468  const Akonadi::ContactSearchJob *searchJob = qobject_cast<Akonadi::ContactSearchJob*>( job );
469  const bool contactAlreadyExists = !searchJob->contacts().isEmpty();
470 
471  const QList<Akonadi::Item> listContact = searchJob->items();
472  const bool uniqueContactFound = (listContact.count() == 1);
473  if(uniqueContactFound) {
474  mReaderWin->setContactItem(listContact.first(), searchJob->contacts().at(0));
475  } else {
476  mReaderWin->clearContactItem();
477  }
478 
479  const Akonadi::Item msg = job->property( "msg" ).value<Akonadi::Item>();
480  const QPoint aPoint = job->property( "point" ).toPoint();
481  const KUrl imageUrl = job->property("imageUrl").value<KUrl>();
482  const KUrl url = job->property("url").value<KUrl>();
483 
484  showMessagePopup(msg, url, imageUrl, aPoint, contactAlreadyExists, uniqueContactFound);
485 }
486 
487 void KMReaderMainWin::showMessagePopup(const Akonadi::Item&msg ,const KUrl&url,const KUrl &imageUrl,const QPoint& aPoint, bool contactAlreadyExists, bool uniqueContactFound)
488 {
489  KMenu *menu = 0;
490 
491  bool urlMenuAdded = false;
492  bool copyAdded = false;
493  const bool messageHasPayload = msg.hasPayload<KMime::Message::Ptr>();
494  if ( !url.isEmpty() ) {
495  if ( url.protocol() == QLatin1String( "mailto" ) ) {
496  // popup on a mailto URL
497  menu = new KMenu;
498  menu->addAction( mReaderWin->mailToComposeAction() );
499  if ( messageHasPayload ) {
500  menu->addAction( mReaderWin->mailToReplyAction() );
501  menu->addAction( mReaderWin->mailToForwardAction() );
502  menu->addSeparator();
503  }
504 
505  if ( contactAlreadyExists ) {
506  if(uniqueContactFound) {
507  menu->addAction( mReaderWin->editContactAction() );
508  } else {
509  menu->addAction( mReaderWin->openAddrBookAction() );
510  }
511  } else {
512  menu->addAction( mReaderWin->addAddrBookAction() );
513  menu->addAction( mReaderWin->addToExistingContactAction() );
514  }
515  menu->addSeparator();
516  menu->addMenu(mReaderWin->viewHtmlOption());
517  menu->addSeparator();
518  menu->addAction( mReaderWin->copyURLAction() );
519  copyAdded = true;
520  urlMenuAdded = true;
521  } else if( url.protocol() != QLatin1String( "attachment" ) ){
522  // popup on a not-mailto URL
523  menu = new KMenu;
524  menu->addAction( mReaderWin->urlOpenAction() );
525  menu->addAction( mReaderWin->addBookmarksAction() );
526  menu->addAction( mReaderWin->urlSaveAsAction() );
527  menu->addAction( mReaderWin->copyURLAction() );
528  if (mReaderWin->isAShortUrl(url)) {
529  menu->addSeparator();
530  menu->addAction( mReaderWin->expandShortUrlAction() );
531  }
532  if(!imageUrl.isEmpty()) {
533  menu->addSeparator();
534  menu->addAction( mReaderWin->copyImageLocation());
535  menu->addAction(mReaderWin->downloadImageToDiskAction());
536  menu->addAction(mReaderWin->shareImage());
537  if (mReaderWin->adblockEnabled()) {
538  menu->addSeparator();
539  menu->addAction( mReaderWin->blockImage());
540  }
541  }
542  urlMenuAdded = true;
543  }
544  }
545  const QString selectedText(mReaderWin->copyText());
546  if ( !selectedText.isEmpty() ) {
547  if(!menu)
548  menu = new KMenu;
549  if ( urlMenuAdded ) {
550  menu->addSeparator();
551  }
552  if(messageHasPayload) {
553  menu->addAction( mMsgActions->replyMenu() );
554  menu->addSeparator();
555  menu->addAction( mMsgActions->mailingListActionMenu() );
556  menu->addSeparator();
557  }
558  if( !copyAdded )
559  menu->addAction( mReaderWin->copyAction() );
560  menu->addAction( mReaderWin->selectAllAction() );
561  menu->addSeparator();
562  mMsgActions->addWebShortcutsMenu(menu,selectedText);
563  menu->addSeparator();
564  menu->addAction(mReaderWin->translateAction());
565  menu->addSeparator();
566  menu->addAction( mReaderWin->speakTextAction());
567  } else if ( !urlMenuAdded ) {
568  if(!menu)
569  menu = new KMenu;
570 
571  // popup somewhere else (i.e., not a URL) on the message
572  if (messageHasPayload) {
573  bool replyForwardMenu = false;
574  Akonadi::Collection col = parentCollection();
575  if ( col.isValid() ) {
576  if ( ! ( CommonKernel->folderIsSentMailFolder( col ) ||
577  CommonKernel->folderIsDrafts( col ) ||
578  CommonKernel->folderIsTemplates( col ) ) ) {
579  replyForwardMenu = true;
580  }
581  } else if ( messageHasPayload ) {
582  replyForwardMenu = true;
583  }
584  if ( replyForwardMenu ) {
585  // add the reply and forward actions only if we are not in a sent-mail,
586  // templates or drafts folder
587  menu->addAction( mMsgActions->replyMenu() );
588  menu->addAction( mMsgActions->forwardMenu() );
589  menu->addSeparator();
590  }
591  menu->addAction( copyActionMenu(menu) );
592  menu->addAction( moveActionMenu(menu));
593  menu->addSeparator();
594  menu->addAction( mMsgActions->mailingListActionMenu() );
595 
596  menu->addSeparator();
597  if(!imageUrl.isEmpty()) {
598  menu->addSeparator();
599  menu->addAction( mReaderWin->copyImageLocation());
600  menu->addAction( mReaderWin->downloadImageToDiskAction());
601  menu->addAction( mReaderWin->shareImage());
602  menu->addSeparator();
603  if (mReaderWin->adblockEnabled()) {
604  menu->addAction( mReaderWin->blockImage());
605  menu->addSeparator();
606  }
607  }
608 
609  menu->addAction( mReaderWin->viewSourceAction() );
610  menu->addAction( mReaderWin->toggleFixFontAction() );
611  if (!mReaderWin->mimePartTreeIsEmpty())
612  menu->addAction( mReaderWin->toggleMimePartTreeAction() );
613  menu->addSeparator();
614  if (mMsgActions->printPreviewAction())
615  menu->addAction( mMsgActions->printPreviewAction() );
616  menu->addAction( mMsgActions->printAction() );
617  menu->addAction( mReaderWin->saveAsAction() );
618  menu->addAction( mSaveAtmAction );
619  if ( msg.isValid() ) {
620  menu->addSeparator();
621  menu->addAction( mReaderWin->createTodoAction() );
622  menu->addAction( mReaderWin->createEventAction() );
623  menu->addSeparator();
624  menu->addAction( mReaderWin->saveMessageDisplayFormatAction() );
625  menu->addAction( mReaderWin->resetMessageDisplayFormatAction() );
626  }
627  } else {
628  menu->addAction( mReaderWin->toggleFixFontAction() );
629  if (!mReaderWin->mimePartTreeIsEmpty())
630  menu->addAction( mReaderWin->toggleMimePartTreeAction() );
631  }
632  if (mReaderWin->adblockEnabled()) {
633  menu->addSeparator();
634  menu->addAction( mReaderWin->openBlockableItems());
635  }
636  if (msg.isValid()) {
637  menu->addSeparator();
638  menu->addAction( mMsgActions->addFollowupReminderAction() );
639  }
640  if (kmkernel->allowToDebugBalooSupport()) {
641  menu->addSeparator();
642  menu->addAction( mMsgActions->debugBalooAction() );
643  }
644  }
645  if (menu) {
646  KAcceleratorManager::manage(menu);
647  menu->exec( aPoint, 0 );
648  delete menu;
649  }
650 }
651 
652 void KMReaderMainWin::slotFontAction( const QString& font)
653 {
654  QFont f( mReaderWin->cssHelper()->bodyFont() );
655  f.setFamily( font );
656  changeFont(f);
657 }
658 
659 void KMReaderMainWin::slotSizeAction( int size )
660 {
661  QFont f( mReaderWin->cssHelper()->bodyFont() );
662  f.setPointSize( size );
663  changeFont(f);
664 }
665 
666 void KMReaderMainWin::changeFont(const QFont &f)
667 {
668  mReaderWin->cssHelper()->setBodyFont( f );
669  mReaderWin->cssHelper()->setPrintFont( f );
670  mReaderWin->update();
671 }
672 
673 void KMReaderMainWin::slotEditToolbars()
674 {
675  saveMainWindowSettings( KConfigGroup(KMKernel::self()->config(), "ReaderWindow") );
676  KEditToolBar dlg( guiFactory(), this );
677  connect( &dlg, SIGNAL(newToolBarConfig()), SLOT(slotUpdateToolbars()) );
678  dlg.exec();
679 }
680 
681 void KMReaderMainWin::slotUpdateToolbars()
682 {
683  createGUI(QLatin1String("kmreadermainwin.rc"));
684  applyMainWindowSettings( KConfigGroup(KMKernel::self()->config(), "ReaderWindow") );
685 }
686 
687 
KMReplyCommand
Definition: kmcommands.h:319
QModelIndex
KMail::MessageActions::addWebShortcutsMenu
void addWebShortcutsMenu(KMenu *menu, const QString &text)
Definition: messageactions.cpp:609
QFont::setPointSize
void setPointSize(int pointSize)
KMReaderMainWin::showMessage
void showMessage(const QString &encoding, const Akonadi::Item &msg, const Akonadi::Collection &parentCollection=Akonadi::Collection())
take ownership of and show
Definition: kmreadermainwin.cpp:136
kmmainwidget.h
KMReaderWin::urlOpenAction
KAction * urlOpenAction() const
Definition: kmreaderwin.cpp:672
KMReaderWin
This class implements a "reader window", that is a window used for reading or viewing messages...
Definition: kmreaderwin.h:49
KMTrashMsgCommand
Definition: kmcommands.h:552
KMReaderWin::blockImage
KAction * blockImage() const
Definition: kmreaderwin.cpp:895
KMReaderWin::copyURLAction
KAction * copyURLAction() const
Definition: kmreaderwin.cpp:642
KMReaderWin::viewer
MessageViewer::Viewer * viewer()
Definition: kmreaderwin.h:133
email
const QString email
Definition: identitydialog.cpp:640
KMail::SecondaryWindow::setCaption
virtual void setCaption(const QString &caption)
Reimplement because we have this bug #Bug 163978.
Definition: secondarywindow.cpp:80
QAction::data
QVariant data() const
QFont
KMReaderWin::viewHtmlOption
KMenu * viewHtmlOption() const
Definition: kmreaderwin.h:164
KMail::MessageActions
Manages common actions that can be performed on one or more messages.
Definition: messageactions.h:50
QMenu::addAction
void addAction(QAction *action)
QVariant::value
T value() const
KMReaderWin::isAShortUrl
bool isAShortUrl(const KUrl &url) const
Definition: kmreaderwin.cpp:917
KMReaderWin::mailToComposeAction
KAction * mailToComposeAction() const
Definition: kmreaderwin.h:135
KMReaderWin::saveAsAction
KAction * saveAsAction() const
Definition: kmreaderwin.cpp:662
KMReaderWin::createEventAction
KAction * createEventAction() const
Definition: kmreaderwin.cpp:932
QPoint
KMReaderWin::mailToReplyAction
KAction * mailToReplyAction() const
Definition: kmreaderwin.h:136
KMReaderWin::message
Akonadi::Item message() const
Definition: kmreaderwin.cpp:491
KMKernel::self
static KMKernel * self()
normal control stuff
Definition: kmkernel.cpp:1471
kmreaderwin.h
KMail::MessageActions::addFollowupReminderAction
KAction * addFollowupReminderAction() const
Definition: messageactions.h:87
KMail::MessageActions::setupForwardingActionsList
void setupForwardingActionsList(KXMLGUIClient *guiClient)
Sets up action list for forward menu.
Definition: messageactions.cpp:445
KMReaderWin::setOverrideEncoding
void setOverrideEncoding(const QString &encoding)
Set the override character encoding.
Definition: kmreaderwin.cpp:288
messageactions.h
KMReaderWin::setContactItem
void setContactItem(const Akonadi::Item &contact, const KABC::Addressee &address)
Definition: kmreaderwin.cpp:819
KMReaderWin::cssHelper
MessageViewer::CSSHelper * cssHelper() const
Definition: kmreaderwin.cpp:589
KMReaderWin::expandShortUrlAction
KAction * expandShortUrlAction() const
Definition: kmreaderwin.cpp:922
KMReaderWin::copyImageLocation
KAction * copyImageLocation() const
Definition: kmreaderwin.cpp:647
KMReaderWin::createTodoAction
KAction * createTodoAction() const
Definition: kmreaderwin.cpp:927
QList::count
int count(const T &value) const
KMReaderWin::openAddrBookAction
KAction * openAddrBookAction() const
Definition: kmreaderwin.h:139
KMReaderWin::update
void update(bool force=false)
Definition: kmreaderwin.cpp:723
KMail::MessageActions::printPreviewAction
KAction * printPreviewAction() const
Definition: messageactions.h:85
KMCommand
Small helper structure which encapsulates the KMMessage created when creating a reply, and.
Definition: kmcommands.h:48
KMReaderWin::setDecryptMessageOverwrite
void setDecryptMessageOverwrite(bool overwrite=true)
Enforce message decryption.
Definition: kmreaderwin.cpp:598
QSharedPointer
Definition: collectionmailinglistpage.h:34
KMReaderWin::setDisplayFormatMessageOverwrite
void setDisplayFormatMessageOverwrite(MessageViewer::Viewer::DisplayFormatMessage format)
Definition: kmreaderwin.cpp:466
KMReaderWin::viewSourceAction
KAction * viewSourceAction() const
Definition: kmreaderwin.cpp:657
KMReaderMainWin::showMessagePopup
void showMessagePopup(const Akonadi::Item &msg, const KUrl &aUrl, const KUrl &imageUrl, const QPoint &aPoint, bool contactAlreadyExists, bool uniqueContactFound)
Definition: kmreadermainwin.cpp:487
KMReaderWin::setMsgPart
void setMsgPart(KMime::Content *aMsgPart)
Instead of settings a message to be shown sets a message part to be shown.
Definition: kmreaderwin.cpp:449
KMReaderWin::translateAction
KAction * translateAction() const
Definition: kmreaderwin.cpp:691
QString::isEmpty
bool isEmpty() const
KMCommand::start
void start()
Definition: kmcommands.cpp:233
KMReaderWin::setHtmlLoadExtOverride
void setHtmlLoadExtOverride(bool override)
Definition: kmreaderwin.cpp:473
KMReaderWin::setMessage
void setMessage(const Akonadi::Item &item, MessageViewer::Viewer::UpdateMode updateMode=MessageViewer::Viewer::Delayed)
KMMainWidget
Definition: kmmainwidget.h:91
QList::first
T & first()
KMail::MessageActions::forwardMenu
KActionMenu * forwardMenu() const
Definition: messageactions.h:80
QString
QList< Akonadi::Item >
util.h
KMReaderWin::clearContactItem
void clearContactItem()
Definition: kmreaderwin.cpp:811
KMail::MessageActions::debugBalooAction
QAction * debugBalooAction() const
Definition: messageactions.h:94
kmkernel
#define kmkernel
Definition: kmkernel.h:24
KMReaderWin::resetMessageDisplayFormatAction
KAction * resetMessageDisplayFormatAction() const
Definition: kmreaderwin.cpp:890
KMail::MessageActions::setCurrentMessage
void setCurrentMessage(const Akonadi::Item &item, const Akonadi::Item::List &items=Akonadi::Item::List())
Definition: messageactions.cpp:234
KMail::MessageActions::mailingListActionMenu
KActionMenu * mailingListActionMenu() const
Definition: messageactions.h:89
KMReaderWin::downloadImageToDiskAction
KAction * downloadImageToDiskAction() const
Definition: kmreaderwin.cpp:686
QMenu
KMForwardAttachedCommand
Definition: kmcommands.h:355
KMReaderWin::adblockEnabled
bool adblockEnabled() const
Definition: kmreaderwin.cpp:900
KMReaderWin::shareImage
KAction * shareImage() const
Definition: kmreaderwin.h:165
QVariant::fromValue
QVariant fromValue(const T &value)
KMReaderWin::urlSaveAsAction
KAction * urlSaveAsAction() const
Definition: kmreaderwin.h:145
KMReaderWin::saveMessageDisplayFormatAction
KAction * saveMessageDisplayFormatAction() const
Definition: kmreaderwin.cpp:885
KMReaderWin::copyAction
KAction * copyAction() const
Definition: kmreaderwin.cpp:652
KMForwardCommand
Definition: kmcommands.h:336
GlobalSettings::self
static GlobalSettings * self()
Definition: globalsettings.cpp:30
KMReaderWin::toggleFixFontAction
KToggleAction * toggleFixFontAction() const
Definition: kmreaderwin.cpp:612
KMReaderWin::addAddrBookAction
KAction * addAddrBookAction() const
Definition: kmreaderwin.h:138
KActionMenu
KMReaderWin::addToExistingContactAction
KAction * addToExistingContactAction() const
Definition: kmreaderwin.h:167
KMail::MessageActions::replyMenu
KActionMenu * replyMenu() const
Definition: messageactions.h:72
KMReaderWin::editContactAction
KAction * editContactAction() const
Definition: kmreaderwin.h:162
QModelIndex::data
QVariant data(int role) const
KMail::MessageActions::setMessageView
void setMessageView(KMReaderWin *msgView)
Definition: messageactions.cpp:417
KMReaderWin::copyText
QString copyText() const
Return selected text.
Definition: kmreaderwin.cpp:455
QLatin1String
QKeySequence
KMReaderWin::addBookmarksAction
KAction * addBookmarksAction() const
Definition: kmreaderwin.h:146
KMReaderWin::openBlockableItems
KAction * openBlockableItems() const
Definition: kmreaderwin.cpp:905
KMReaderWin::toggleMimePartTreeAction
KAction * toggleMimePartTreeAction() const
Definition: kmreaderwin.cpp:622
QAction
QFont::setFamily
void setFamily(const QString &family)
KMReaderWin::mailToForwardAction
KAction * mailToForwardAction() const
Definition: kmreaderwin.h:137
KMReaderMainWin::KMReaderMainWin
KMReaderMainWin(MessageViewer::Viewer::DisplayFormatMessage format, bool htmlLoadExtOverride, char *name=0)
Definition: kmreadermainwin.cpp:73
kmreadermainwin.h
KMReaderMainWin::setUseFixedFont
void setUseFixedFont(bool useFixedFont)
Definition: kmreadermainwin.cpp:131
kmcommands.h
KMail::MessageActions::printAction
KAction * printAction() const
Definition: messageactions.h:84
KMRedirectCommand
Definition: kmcommands.h:372
KMReaderWin::setUseFixedFont
void setUseFixedFont(bool useFixedFont)
Definition: kmreaderwin.cpp:257
KMReaderMainWin::~KMReaderMainWin
virtual ~KMReaderMainWin()
Definition: kmreadermainwin.cpp:125
KMReaderWin::selectAllAction
KAction * selectAllAction() const
Definition: kmreaderwin.cpp:627
KJob
KMReaderWin::mimePartTreeIsEmpty
bool mimePartTreeIsEmpty() const
Definition: kmreaderwin.cpp:617
KMMainWidget::standardMailActionManager
Akonadi::StandardMailActionManager * standardMailActionManager() const
Definition: kmmainwidget.h:254
KMail::MessageActions::setupForwardActions
void setupForwardActions()
This function adds or updates the actions of the forward action menu, taking the preference whether t...
Definition: messageactions.cpp:422
KMReaderWin::speakTextAction
KAction * speakTextAction() const
Definition: kmreaderwin.cpp:681
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:34:33 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kmail

Skip menu "kmail"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer
  • pimprint

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal