470
void ViewerPrivate::createOpenWithMenu( KMenu *topMenu, KMime::Content* node )
472
const QString contentTypeStr = node->contentType()->mimeType();
473
const KService::List offers = KFileItemActions::associatedApplications(QStringList()<<contentTypeStr, QString() );
474
if (!offers.isEmpty()) {
475
QMenu* menu = topMenu;
476
QActionGroup *actionGroup = new QActionGroup( menu );
477
connect( actionGroup, SIGNAL(triggered(QAction*)), this, SLOT(slotOpenWithAction(QAction*)) );
479
if (offers.count() > 1) { // submenu 'open with'
480
menu = new QMenu(i18nc("@title:menu", "&Open With"), topMenu);
481
menu->menuAction()->setObjectName("openWith_submenu"); // for the unittest
482
topMenu->addMenu(menu);
484
//kDebug() << offers.count() << "offers" << topMenu << menu;
486
KService::List::ConstIterator it = offers.constBegin();
487
for(; it != offers.constEnd(); it++) {
488
KAction* act = createAppAction(*it,
489
// no submenu -> prefix single offer
490
menu == topMenu, actionGroup);
491
menu->addAction(act);
494
QString openWithActionName;
495
if (menu != topMenu) { // submenu
496
menu->addSeparator();
497
openWithActionName = i18nc("@action:inmenu Open With", "&Other...");
499
openWithActionName = i18nc("@title:menu", "&Open With...");
501
KAction *openWithAct = new KAction(this);
502
openWithAct->setText(openWithActionName);
503
QObject::connect(openWithAct, SIGNAL(triggered()), this, SLOT(slotOpenWithDialog()));
504
menu->addAction(openWithAct);
506
else { // no app offers -> Open With...
507
KAction *act = new KAction(this);
508
act->setText(i18nc("@title:menu", "&Open With..."));
509
QObject::connect(act, SIGNAL(triggered()), this, SLOT(slotOpenWithDialog()));
510
topMenu->addAction(act);
514
void ViewerPrivate::slotOpenWithDialog()
516
if ( !mCurrentContent )
518
attachmentOpenWith( mCurrentContent );
521
KAction* ViewerPrivate::createAppAction(const KService::Ptr& service, bool singleOffer, QActionGroup *actionGroup )
523
QString actionName(service->name().replace('&', "&&"));
525
actionName = i18n("Open &with %1", actionName);
527
actionName = i18nc("@item:inmenu Open With, %1 is application name", "%1", actionName);
530
KAction *act = new KAction(this);
531
act->setIcon(KIcon(service->icon()));
532
act->setText(actionName);
533
actionGroup->addAction( act );
534
act->setData(QVariant::fromValue(service));
538
void ViewerPrivate::slotOpenWithAction(QAction *act)
543
KService::Ptr app = act->data().value<KService::Ptr>();
544
attachmentOpen( mCurrentContent, app );
463
548
void ViewerPrivate::showAttachmentPopup( KMime::Content* node, const QString & name, const QPoint & globalPos )
465
550
prepareHandleAttachment( node, name );
474
559
connect( action, SIGNAL(triggered(bool)), attachmentMapper, SLOT(map()) );
475
560
attachmentMapper->setMapping( action, Viewer::Open );
477
action = menu->addAction(i18n("Open With..."));
478
connect( action, SIGNAL(triggered(bool)), attachmentMapper, SLOT(map()) );
479
attachmentMapper->setMapping( action, Viewer::OpenWith );
562
createOpenWithMenu( menu, node );
481
564
action = menu->addAction(i18nc("to view something", "View") );
482
565
connect( action, SIGNAL(triggered(bool)), attachmentMapper, SLOT(map()) );
970
1058
this, SLOT(slotUrlOn(QString,QString,QString)) );
971
1059
connect( mViewer, SIGNAL(linkClicked(QUrl)),
972
1060
this, SLOT(slotUrlOpen(QUrl)), Qt::QueuedConnection );
973
connect( mViewer, SIGNAL(popupMenu(QUrl,QPoint)),
974
SLOT(slotUrlPopup(QUrl,QPoint)) );
1061
connect( mViewer, SIGNAL(popupMenu(QUrl,QUrl,QPoint)),
1062
SLOT(slotUrlPopup(QUrl,QUrl,QPoint)) );
977
1065
bool ViewerPrivate::eventFilter( QObject *, QEvent *e )
1259
void ViewerPrivate::printPreviousMessage( const Akonadi::Item &message )
1261
// wince does not support printing
1263
disconnect( mPartHtmlWriter, SIGNAL(finished()), this, SLOT(slotPrintPreview()) );
1264
connect( mPartHtmlWriter, SIGNAL(finished()), this, SLOT(slotPrintPreview()) );
1265
setMessageItem( message, Viewer::Force );
1179
1270
void ViewerPrivate::resetStateForNewMessage()
1181
1272
mClickedUrl.clear();
1182
1274
enableMessageDisplay(); // just to make sure it's on
1183
1275
mMessage.reset();
1184
1276
mNodeHelper->clear();
1299
1393
void ViewerPrivate::adjustLayout()
1301
1395
#ifndef QT_NO_TREEVIEW
1396
const int mimeH = GlobalSettings::self()->mimePaneHeight();
1397
const int messageH = GlobalSettings::self()->messagePaneHeight();
1398
QList<int> splitterSizes;
1399
if ( GlobalSettings::self()->mimeTreeLocation() == GlobalSettings::EnumMimeTreeLocation::bottom )
1400
splitterSizes << messageH << mimeH;
1402
splitterSizes << mimeH << messageH;
1302
1404
if ( GlobalSettings::self()->mimeTreeLocation() == GlobalSettings::EnumMimeTreeLocation::bottom )
1303
1405
mSplitter->addWidget( mMimePartTree );
1305
1407
mSplitter->insertWidget( 0, mMimePartTree );
1306
mSplitter->setSizes( mSplitterSizes );
1408
mSplitter->setSizes( splitterSizes );
1308
1410
if ( GlobalSettings::self()->mimeTreeMode() == GlobalSettings::EnumMimeTreeMode::Always &&
1339
1441
QVBoxLayout * vlay = new QVBoxLayout( q );
1340
1442
vlay->setMargin( 0 );
1341
1443
mSplitter = new QSplitter( Qt::Vertical, q );
1444
connect(mSplitter, SIGNAL(splitterMoved(int,int)), this, SLOT(saveSplitterSizes()));
1342
1445
mSplitter->setObjectName( "mSplitter" );
1343
1446
mSplitter->setChildrenCollapsible( false );
1344
1447
vlay->addWidget( mSplitter );
1614
1718
connect( mToggleDisplayModeAction, SIGNAL(triggered(bool)),
1615
1719
SLOT(slotToggleHtmlMode()) );
1616
1720
mToggleDisplayModeAction->setHelpText( i18n( "Toggle display mode between HTML and plain text" ) );
1723
mSpeakTextAction = new KAction(i18n("Speak Text"),this);
1724
mSpeakTextAction->setIcon(KIcon("preferences-desktop-text-to-speech"));
1725
ac->addAction( "speak_text", mSpeakTextAction );
1726
connect( mSpeakTextAction, SIGNAL(triggered(bool)),
1727
this, SLOT(slotSpeakText()) );
1729
mCopyImageLocation = new KAction(i18n("Copy Image Location"),this);
1730
mCopyImageLocation->setIcon(KIcon("view-media-visualization"));
1731
ac->addAction("copy_image_location", mCopyImageLocation);
1732
mCopyImageLocation->setShortcutConfigurable( false );
1733
connect( mCopyImageLocation, SIGNAL(triggered(bool)),
1734
SLOT(slotCopyImageLocation()) );
1736
mTranslateAction = new KAction(i18n("Translate..."),this);
1737
mTranslateAction->setIcon(KIcon("preferences-desktop-locale"));
1738
ac->addAction("translate_text", mTranslateAction);
1739
connect( mTranslateAction, SIGNAL(triggered(bool)),
1740
SLOT(slotTranslate()) );
1931
2058
void ViewerPrivate::slotFind()
2060
#if QT_VERSION >= 0x040800
1933
2061
if ( mViewer->hasSelection() )
1934
2062
mFindBar->setText( mViewer->selectedText() );
1935
2064
mFindBar->show();
1936
2065
mFindBar->focusAndSetCursor();
2068
void ViewerPrivate::slotTranslate()
2070
const QString text = mViewer->selectedText();
2071
mTranslatorWidget->show();
2073
mTranslatorWidget->setTextToTranslate(text);
1940
2076
void ViewerPrivate::slotToggleFixedFont()
2185
2321
mSplitter->setGeometry( 0, 0, q->width(), q->height() );
2324
void ViewerPrivate::slotPrintPreview()
2326
disconnect( mPartHtmlWriter, SIGNAL(finished()), this, SLOT(slotPrintPreview()) );
2327
// wince does not support printing
2332
KPrintPreview previewdlg( &printer, mViewer );
2333
mViewer->print( &printer );
2189
2338
void ViewerPrivate::slotPrintMsg()
2191
2340
disconnect( mPartHtmlWriter, SIGNAL(finished()), this, SLOT(slotPrintMsg()) );
2192
if ( !mMessage ) return;
2194
2342
// wince does not support printing
2195
2343
#ifndef Q_OS_WINCE
2196
2346
QPrinter printer;
2198
2348
AutoQPointer<QPrintDialog> dlg( new QPrintDialog( &printer, mViewer ) );
2516
2678
void ViewerPrivate::slotSaveMessage()
2518
if( !mMessageItem.hasPayload<KMime::Message::Ptr>() )
2520
Util::saveMessageInMbox( QList<Akonadi::Item>()<<mMessageItem, mMainWindow );
2680
if ( !mMessageItem.isValid() ) {
2684
if ( !mMessageItem.hasPayload<KMime::Message::Ptr>() ) {
2685
if ( mMessageItem.isValid() ) {
2686
kWarning() << "Payload is not a MessagePtr!";
2691
Util::saveMessageInMbox( QList<Akonadi::Item>() << mMessageItem, mMainWindow );
2523
2694
void ViewerPrivate::saveRelativePosition()