File indexing completed on 2025-03-09 04:54:42
0001 /* 0002 This file is part of KMail, the KDE mail client. 0003 SPDX-FileCopyrightText: 1997 Markus Wuebben <markus.wuebben@kde.org> 0004 SPDX-FileCopyrightText: 2009 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net 0005 SPDX-FileCopyrightText: 2009 Andras Mantia <andras@kdab.net> 0006 SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org> 0007 0008 SPDX-License-Identifier: GPL-2.0-or-later 0009 */ 0010 0011 // define this to copy all html that is written to the readerwindow to 0012 // filehtmlwriter.out in the current working directory 0013 // #define KMAIL_READER_HTML_DEBUG 1 0014 0015 #include "viewer.h" 0016 #include "csshelper.h" 0017 #include "dkim-verify/dkimwidgetinfo.h" 0018 #include "viewer/mimeparttree/mimeparttreeview.h" 0019 #include "viewer/mimeparttree/mimetreemodel.h" 0020 #include "viewer/webengine/mailwebengineview.h" 0021 #include "viewer_p.h" 0022 #include "widgets/zoomactionmenu.h" 0023 #include <Akonadi/ItemFetchJob> 0024 #include <Akonadi/ItemFetchScope> 0025 #include <Akonadi/MessageParts> 0026 #include <QUrl> 0027 #include <WebEngineViewer/WebEngineManageScript> 0028 #include <WebEngineViewer/WebHitTestResult> 0029 0030 #include <Akonadi/ErrorAttribute> 0031 0032 #include <KLocalizedString> 0033 0034 #include <QAction> 0035 0036 #include <Akonadi/MDNStateAttribute> 0037 0038 namespace MessageViewer 0039 { 0040 class AbstractMessageLoadedHandler::AbstractMessageLoadedHandlerPrivate 0041 { 0042 public: 0043 Akonadi::Session *mSession = nullptr; 0044 }; 0045 0046 AbstractMessageLoadedHandler::AbstractMessageLoadedHandler() 0047 : d(new AbstractMessageLoadedHandlerPrivate) 0048 { 0049 } 0050 0051 AbstractMessageLoadedHandler::~AbstractMessageLoadedHandler() = default; 0052 0053 void AbstractMessageLoadedHandler::setSession(Akonadi::Session *session) 0054 { 0055 d->mSession = session; 0056 } 0057 0058 Akonadi::Session *AbstractMessageLoadedHandler::session() const 0059 { 0060 return d->mSession; 0061 } 0062 0063 Viewer::Viewer(QWidget *aParent, QWidget *mainWindow, KActionCollection *actionCollection) 0064 : QWidget(aParent) 0065 , d_ptr(new ViewerPrivate(this, mainWindow, actionCollection)) 0066 { 0067 initialize(); 0068 } 0069 0070 // the d_ptr is automatically deleted 0071 Viewer::~Viewer() = default; 0072 0073 void Viewer::initialize() 0074 { 0075 connect(d_ptr, &ViewerPrivate::displayPopupMenu, this, &Viewer::displayPopupMenu); 0076 connect(d_ptr, &ViewerPrivate::popupMenu, this, &Viewer::popupMenu); 0077 connect(d_ptr, SIGNAL(urlClicked(Akonadi::Item, QUrl)), SIGNAL(urlClicked(Akonadi::Item, QUrl))); 0078 connect(d_ptr, &ViewerPrivate::requestConfigSync, this, &Viewer::requestConfigSync); 0079 connect(d_ptr, &ViewerPrivate::makeResourceOnline, this, &Viewer::makeResourceOnline); 0080 connect(d_ptr, &ViewerPrivate::showReader, this, &Viewer::showReader); 0081 connect(d_ptr, &ViewerPrivate::showMessage, this, &Viewer::showMessage); 0082 connect(d_ptr, &ViewerPrivate::replyMessageTo, this, &Viewer::replyMessageTo); 0083 connect(d_ptr, &ViewerPrivate::showStatusBarMessage, this, &Viewer::showStatusBarMessage); 0084 connect(d_ptr, &ViewerPrivate::itemRemoved, this, &Viewer::itemRemoved); 0085 connect(d_ptr, &ViewerPrivate::changeDisplayMail, this, &Viewer::slotChangeDisplayMail); 0086 connect(d_ptr, &ViewerPrivate::moveMessageToTrash, this, &Viewer::moveMessageToTrash); 0087 connect(d_ptr, &ViewerPrivate::pageIsScrolledToBottom, this, &Viewer::pageIsScrolledToBottom); 0088 connect(d_ptr, &ViewerPrivate::printingFinished, this, &Viewer::printingFinished); 0089 connect(d_ptr, &ViewerPrivate::zoomChanged, this, &Viewer::zoomChanged); 0090 0091 connect(d_ptr, &ViewerPrivate::showNextMessage, this, &Viewer::showNextMessage); 0092 connect(d_ptr, &ViewerPrivate::showPreviousMessage, this, &Viewer::showPreviousMessage); 0093 connect(d_ptr, &ViewerPrivate::sendResponse, this, &Viewer::sendResponse); 0094 0095 setMessage(KMime::Message::Ptr(), MimeTreeParser::Delayed); 0096 } 0097 0098 void Viewer::slotGeneralPaletteChanged() 0099 { 0100 Q_D(Viewer); 0101 d->updatePalette(); 0102 } 0103 0104 void Viewer::changeEvent(QEvent *event) 0105 { 0106 Q_D(Viewer); 0107 if (event->type() == QEvent::FontChange) { 0108 d->slotGeneralFontChanged(); 0109 } 0110 QWidget::changeEvent(event); 0111 } 0112 0113 void Viewer::setMessage(const KMime::Message::Ptr &message, MimeTreeParser::UpdateMode updateMode) 0114 { 0115 Q_D(Viewer); 0116 if (message == d->message()) { 0117 return; 0118 } 0119 d->setMessage(message, updateMode); 0120 } 0121 0122 void Viewer::setMessageItem(const Akonadi::Item &item, MimeTreeParser::UpdateMode updateMode) 0123 { 0124 Q_D(Viewer); 0125 if (d->messageItem() == item) { 0126 return; 0127 } 0128 if (!item.isValid() || item.loadedPayloadParts().contains(Akonadi::MessagePart::Body)) { 0129 d->setMessageItem(item, updateMode); 0130 } else { 0131 Akonadi::ItemFetchJob *job = createFetchJob(item); 0132 connect(job, &Akonadi::ItemFetchJob::result, [d](KJob *job) { 0133 d->itemFetchResult(job); 0134 }); 0135 d->displaySplashPage(i18n("Loading message...")); 0136 } 0137 } 0138 0139 QString Viewer::messagePath() const 0140 { 0141 Q_D(const Viewer); 0142 return d->mMessagePath; 0143 } 0144 0145 void Viewer::setMessagePath(const QString &path) 0146 { 0147 Q_D(Viewer); 0148 d->mMessagePath = path; 0149 } 0150 0151 void Viewer::displaySplashPage(const QString &templateName, const QVariantHash &data, const QByteArray &domain) 0152 { 0153 Q_D(Viewer); 0154 d->displaySplashPage(templateName, data, domain); 0155 } 0156 0157 void Viewer::enableMessageDisplay() 0158 { 0159 Q_D(Viewer); 0160 d->enableMessageDisplay(); 0161 } 0162 0163 void Viewer::printMessage(const Akonadi::Item &msg) 0164 { 0165 Q_D(Viewer); 0166 d->printMessage(msg); 0167 } 0168 0169 void Viewer::printPreviewMessage(const Akonadi::Item &message) 0170 { 0171 Q_D(Viewer); 0172 d->printPreviewMessage(message); 0173 } 0174 0175 void Viewer::printPreview() 0176 { 0177 Q_D(Viewer); 0178 d->slotPrintPreview(); 0179 } 0180 0181 void Viewer::print() 0182 { 0183 Q_D(Viewer); 0184 d->slotPrintMessage(); 0185 } 0186 0187 void Viewer::resizeEvent(QResizeEvent *) 0188 { 0189 Q_D(Viewer); 0190 if (!d->mResizeTimer.isActive()) { 0191 // 0192 // Combine all resize operations that are requested as long a 0193 // the timer runs. 0194 // 0195 d->mResizeTimer.start(100); 0196 } 0197 } 0198 0199 void Viewer::closeEvent(QCloseEvent *e) 0200 { 0201 Q_D(Viewer); 0202 QWidget::closeEvent(e); 0203 d->writeConfig(); 0204 } 0205 0206 void Viewer::slotAttachmentSaveAs() 0207 { 0208 Q_D(Viewer); 0209 d->slotAttachmentSaveAs(); 0210 } 0211 0212 void Viewer::slotAttachmentSaveAll() 0213 { 0214 Q_D(Viewer); 0215 d->slotAttachmentSaveAll(); 0216 } 0217 0218 void Viewer::slotSaveMessage() 0219 { 0220 Q_D(Viewer); 0221 d->slotSaveMessage(); 0222 } 0223 0224 void Viewer::slotScrollUp() 0225 { 0226 Q_D(Viewer); 0227 d->mViewer->scrollUp(10); 0228 } 0229 0230 void Viewer::slotScrollDown() 0231 { 0232 Q_D(Viewer); 0233 d->mViewer->scrollDown(10); 0234 } 0235 0236 void Viewer::atBottom() 0237 { 0238 Q_D(const Viewer); 0239 d->mViewer->isScrolledToBottom(); 0240 } 0241 0242 void Viewer::slotJumpDown() 0243 { 0244 Q_D(Viewer); 0245 d->mViewer->scrollPageDown(100); 0246 } 0247 0248 void Viewer::slotScrollPrior() 0249 { 0250 Q_D(Viewer); 0251 d->mViewer->scrollPageUp(80); 0252 } 0253 0254 void Viewer::slotScrollNext() 0255 { 0256 Q_D(Viewer); 0257 d->mViewer->scrollPageDown(80); 0258 } 0259 0260 QString Viewer::selectedText() const 0261 { 0262 Q_D(const Viewer); 0263 return d->mViewer->selectedText(); 0264 } 0265 0266 Viewer::DisplayFormatMessage Viewer::displayFormatMessageOverwrite() const 0267 { 0268 Q_D(const Viewer); 0269 return d->displayFormatMessageOverwrite(); 0270 } 0271 0272 void Viewer::setDisplayFormatMessageOverwrite(Viewer::DisplayFormatMessage format) 0273 { 0274 Q_D(Viewer); 0275 d->setDisplayFormatMessageOverwrite(format); 0276 } 0277 0278 void Viewer::setHtmlLoadExtDefault(bool loadExtDefault) 0279 { 0280 Q_D(Viewer); 0281 d->setHtmlLoadExtDefault(loadExtDefault); 0282 } 0283 0284 void Viewer::setHtmlLoadExtOverride(bool loadExtOverride) 0285 { 0286 Q_D(Viewer); 0287 d->setHtmlLoadExtOverride(loadExtOverride); 0288 } 0289 0290 bool Viewer::htmlLoadExtOverride() const 0291 { 0292 Q_D(const Viewer); 0293 return d->htmlLoadExtOverride(); 0294 } 0295 0296 bool Viewer::htmlMail() const 0297 { 0298 Q_D(const Viewer); 0299 return d->htmlMail(); 0300 } 0301 0302 bool Viewer::htmlLoadExternal() const 0303 { 0304 Q_D(const Viewer); 0305 return d->htmlLoadExternal(); 0306 } 0307 0308 bool Viewer::isFixedFont() const 0309 { 0310 Q_D(const Viewer); 0311 return d->mHtmlHeadSettings.fixedFont; 0312 } 0313 0314 void Viewer::setUseFixedFont(bool useFixedFont) 0315 { 0316 Q_D(Viewer); 0317 d->setUseFixedFont(useFixedFont); 0318 } 0319 0320 QWidget *Viewer::mainWindow() 0321 { 0322 Q_D(Viewer); 0323 return d->mMainWindow; 0324 } 0325 0326 void Viewer::setDecryptMessageOverwrite(bool overwrite) 0327 { 0328 Q_D(Viewer); 0329 d->setDecryptMessageOverwrite(overwrite); 0330 } 0331 0332 KMime::Message::Ptr Viewer::message() const 0333 { 0334 Q_D(const Viewer); 0335 return d->mMessage; 0336 } 0337 0338 Akonadi::Item Viewer::messageItem() const 0339 { 0340 Q_D(const Viewer); 0341 return d->mMessageItem; 0342 } 0343 0344 bool Viewer::event(QEvent *e) 0345 { 0346 Q_D(Viewer); 0347 if (e->type() == QEvent::PaletteChange) { 0348 d->recreateCssHelper(); 0349 d->update(MimeTreeParser::Force); 0350 e->accept(); 0351 return true; 0352 } else if (e->type() == QEvent::ApplicationPaletteChange) { 0353 slotGeneralPaletteChanged(); 0354 } 0355 0356 return QWidget::event(e); 0357 } 0358 0359 void Viewer::slotFind() 0360 { 0361 Q_D(Viewer); 0362 d->slotFind(); 0363 } 0364 0365 const AttachmentStrategy *Viewer::attachmentStrategy() const 0366 { 0367 Q_D(const Viewer); 0368 return d->attachmentStrategy(); 0369 } 0370 0371 void Viewer::setAttachmentStrategy(const AttachmentStrategy *strategy) 0372 { 0373 Q_D(Viewer); 0374 d->setAttachmentStrategy(strategy); 0375 } 0376 0377 QString Viewer::overrideEncoding() const 0378 { 0379 Q_D(const Viewer); 0380 return d->overrideEncoding(); 0381 } 0382 0383 void Viewer::setOverrideEncoding(const QString &encoding) 0384 { 0385 Q_D(Viewer); 0386 d->setOverrideEncoding(encoding); 0387 } 0388 0389 CSSHelper *Viewer::cssHelper() const 0390 { 0391 Q_D(const Viewer); 0392 return d->cssHelper(); 0393 } 0394 0395 KToggleAction *Viewer::toggleFixFontAction() const 0396 { 0397 Q_D(const Viewer); 0398 return d->mToggleFixFontAction; 0399 } 0400 0401 bool Viewer::mimePartTreeIsEmpty() const 0402 { 0403 Q_D(const Viewer); 0404 return d->mimePartTreeIsEmpty(); 0405 } 0406 0407 KToggleAction *Viewer::toggleMimePartTreeAction() const 0408 { 0409 Q_D(const Viewer); 0410 return d->mToggleMimePartTreeAction; 0411 } 0412 0413 QAction *Viewer::selectAllAction() const 0414 { 0415 Q_D(const Viewer); 0416 return d->mSelectAllAction; 0417 } 0418 0419 QAction *Viewer::viewSourceAction() const 0420 { 0421 Q_D(const Viewer); 0422 return d->mViewSourceAction; 0423 } 0424 0425 QAction *Viewer::copyURLAction() const 0426 { 0427 Q_D(const Viewer); 0428 return d->mCopyURLAction; 0429 } 0430 0431 QAction *Viewer::copyAction() const 0432 { 0433 Q_D(const Viewer); 0434 return d->mCopyAction; 0435 } 0436 0437 QAction *Viewer::speakTextAction() const 0438 { 0439 Q_D(const Viewer); 0440 return d->mSpeakTextAction; 0441 } 0442 0443 QAction *Viewer::copyImageLocation() const 0444 { 0445 Q_D(const Viewer); 0446 return d->mCopyImageLocation; 0447 } 0448 0449 QAction *Viewer::saveAsAction() const 0450 { 0451 Q_D(const Viewer); 0452 return d->mSaveMessageAction; 0453 } 0454 0455 QAction *Viewer::urlOpenAction() const 0456 { 0457 Q_D(const Viewer); 0458 return d->mUrlOpenAction; 0459 } 0460 0461 bool Viewer::printingMode() const 0462 { 0463 Q_D(const Viewer); 0464 return d->printingMode(); 0465 } 0466 0467 void Viewer::setPrinting(bool enable) 0468 { 0469 Q_D(Viewer); 0470 d->setPrinting(enable); 0471 } 0472 0473 void Viewer::writeConfig(bool force) 0474 { 0475 Q_D(Viewer); 0476 d->writeConfig(force); 0477 } 0478 0479 QUrl Viewer::urlClicked() const 0480 { 0481 Q_D(const Viewer); 0482 return d->mClickedUrl; 0483 } 0484 0485 QUrl Viewer::imageUrlClicked() const 0486 { 0487 Q_D(const Viewer); 0488 return d->imageUrl(); 0489 } 0490 0491 void Viewer::update(MimeTreeParser::UpdateMode updateMode) 0492 { 0493 Q_D(Viewer); 0494 d->update(updateMode); 0495 } 0496 0497 void Viewer::setMessagePart(KMime::Content *aMsgPart) 0498 { 0499 Q_D(Viewer); 0500 d->setMessagePart(aMsgPart); 0501 } 0502 0503 void Viewer::clear(MimeTreeParser::UpdateMode updateMode) 0504 { 0505 setMessage(KMime::Message::Ptr(), updateMode); 0506 } 0507 0508 void Viewer::slotShowMessageSource() 0509 { 0510 Q_D(Viewer); 0511 d->slotShowMessageSource(); 0512 } 0513 0514 void Viewer::readConfig() 0515 { 0516 Q_D(Viewer); 0517 d->readConfig(); 0518 } 0519 0520 QAbstractItemModel *Viewer::messageTreeModel() const 0521 { 0522 return d_func()->mMimePartTree->mimePartModel(); 0523 } 0524 0525 Akonadi::ItemFetchJob *Viewer::createFetchJob(const Akonadi::Item &item) 0526 { 0527 Q_D(Viewer); 0528 auto job = new Akonadi::ItemFetchJob(item, d->mSession); 0529 job->fetchScope().fetchAllAttributes(); 0530 job->fetchScope().setAncestorRetrieval(Akonadi::ItemFetchScope::Parent); 0531 job->fetchScope().fetchFullPayload(true); 0532 job->fetchScope().setFetchRelations(true); // needed to know if we have notes or not 0533 job->fetchScope().fetchAttribute<Akonadi::ErrorAttribute>(); 0534 job->fetchScope().fetchAttribute<Akonadi::MDNStateAttribute>(); 0535 return job; 0536 } 0537 0538 void Viewer::addMessageLoadedHandler(AbstractMessageLoadedHandler *handler) 0539 { 0540 Q_D(Viewer); 0541 0542 if (!handler) { 0543 return; 0544 } 0545 0546 handler->setSession(d->mSession); 0547 d->mMessageLoadedHandlers.insert(handler); 0548 } 0549 0550 void Viewer::removeMessageLoadedHandler(AbstractMessageLoadedHandler *handler) 0551 { 0552 Q_D(Viewer); 0553 0554 d->mMessageLoadedHandlers.remove(handler); 0555 } 0556 0557 void Viewer::deleteMessage() 0558 { 0559 Q_D(Viewer); 0560 Q_EMIT deleteMessage(d->messageItem()); 0561 } 0562 0563 void Viewer::selectAll() 0564 { 0565 Q_D(Viewer); 0566 d->selectAll(); 0567 } 0568 0569 void Viewer::copySelectionToClipboard() 0570 { 0571 Q_D(Viewer); 0572 d->slotCopySelectedText(); 0573 } 0574 0575 void Viewer::setZoomFactor(qreal zoomFactor) 0576 { 0577 Q_D(Viewer); 0578 d->mZoomActionMenu->setZoomFactor(zoomFactor); 0579 } 0580 0581 void Viewer::slotZoomReset() 0582 { 0583 Q_D(Viewer); 0584 d->mZoomActionMenu->slotZoomReset(); 0585 } 0586 0587 void Viewer::slotZoomIn() 0588 { 0589 Q_D(Viewer); 0590 d->mZoomActionMenu->slotZoomIn(); 0591 } 0592 0593 void Viewer::slotZoomOut() 0594 { 0595 Q_D(Viewer); 0596 d->mZoomActionMenu->slotZoomOut(); 0597 } 0598 0599 QAction *Viewer::findInMessageAction() const 0600 { 0601 Q_D(const Viewer); 0602 return d->mFindInMessageAction; 0603 } 0604 0605 QAction *Viewer::shareTextAction() const 0606 { 0607 Q_D(const Viewer); 0608 return d->mShareTextAction; 0609 } 0610 0611 void Viewer::slotChangeDisplayMail(Viewer::DisplayFormatMessage mode, bool loadExternal) 0612 { 0613 if ((htmlLoadExtOverride() != loadExternal) || (displayFormatMessageOverwrite() != mode)) { 0614 setHtmlLoadExtOverride(loadExternal); 0615 setDisplayFormatMessageOverwrite(mode); 0616 update(MimeTreeParser::Force); 0617 } 0618 } 0619 0620 QAction *Viewer::saveMessageDisplayFormatAction() const 0621 { 0622 Q_D(const Viewer); 0623 return d->mSaveMessageDisplayFormat; 0624 } 0625 0626 QAction *Viewer::resetMessageDisplayFormatAction() const 0627 { 0628 Q_D(const Viewer); 0629 return d->mResetMessageDisplayFormat; 0630 } 0631 0632 QAction *Viewer::developmentToolsAction() const 0633 { 0634 Q_D(const Viewer); 0635 return d->mDevelopmentToolsAction; 0636 } 0637 0638 KToggleAction *Viewer::disableEmoticonAction() const 0639 { 0640 Q_D(const Viewer); 0641 return d->mDisableEmoticonAction; 0642 } 0643 0644 void Viewer::saveMainFrameScreenshotInFile(const QString &filename) 0645 { 0646 Q_D(Viewer); 0647 d->saveMainFrameScreenshotInFile(filename); 0648 } 0649 0650 KActionMenu *Viewer::shareServiceUrlMenu() const 0651 { 0652 Q_D(const Viewer); 0653 return d->mShareServiceUrlMenu; 0654 } 0655 0656 HeaderStylePlugin *Viewer::headerStylePlugin() const 0657 { 0658 Q_D(const Viewer); 0659 return d->mHeaderStylePlugin; 0660 } 0661 0662 DKIMViewerMenu *Viewer::dkimViewerMenu() 0663 { 0664 Q_D(Viewer); 0665 return d->dkimViewerMenu(); 0666 } 0667 0668 RemoteContentMenu *Viewer::remoteContentMenu() const 0669 { 0670 Q_D(const Viewer); 0671 return d->remoteContentMenu(); 0672 } 0673 0674 void Viewer::showMdnInformations(const QPair<QString, bool> &mdnInfo) 0675 { 0676 Q_D(Viewer); 0677 d->showMdnInformations(mdnInfo); 0678 } 0679 0680 void Viewer::mdnWarningAnimatedHide() 0681 { 0682 Q_D(Viewer); 0683 d->mdnWarningAnimatedHide(); 0684 } 0685 0686 void Viewer::setPluginName(const QString &pluginName) 0687 { 0688 Q_D(Viewer); 0689 d->setPluginName(pluginName); 0690 } 0691 0692 void Viewer::showOpenAttachmentFolderWidget(const QList<QUrl> &urls) 0693 { 0694 Q_D(Viewer); 0695 d->showSavedFileFolderWidget(urls, MessageViewer::OpenSavedFileFolderWidget::FileType::Attachment); 0696 } 0697 0698 QList<QAction *> Viewer::viewerPluginActionList(ViewerPluginInterface::SpecificFeatureTypes features) 0699 { 0700 Q_D(Viewer); 0701 return d->viewerPluginActionList(features); 0702 } 0703 0704 QList<QAction *> Viewer::interceptorUrlActions(const WebEngineViewer::WebHitTestResult &result) const 0705 { 0706 Q_D(const Viewer); 0707 return d->interceptorUrlActions(result); 0708 } 0709 0710 void Viewer::runJavaScript(const QString &code) 0711 { 0712 Q_D(Viewer); 0713 d->mViewer->page()->runJavaScript(code, WebEngineViewer::WebEngineManageScript::scriptWordId()); 0714 } 0715 0716 void Viewer::setPrintElementBackground(bool printElementBackground) 0717 { 0718 Q_D(Viewer); 0719 d->mViewer->setPrintElementBackground(printElementBackground); 0720 } 0721 0722 bool Viewer::showSignatureDetails() const 0723 { 0724 Q_D(const Viewer); 0725 return d->showSignatureDetails(); 0726 } 0727 0728 void Viewer::setShowSignatureDetails(bool showDetails) 0729 { 0730 Q_D(Viewer); 0731 d->setShowSignatureDetails(showDetails); 0732 } 0733 0734 bool Viewer::showEncryptionDetails() const 0735 { 0736 Q_D(const Viewer); 0737 return d->showEncryptionDetails(); 0738 } 0739 0740 void Viewer::hasMultiMessages(bool messages) 0741 { 0742 Q_D(Viewer); 0743 d->hasMultiMessages(messages); 0744 } 0745 0746 void Viewer::updateShowMultiMessagesButton(bool enablePreviousButton, bool enableNextButton) 0747 { 0748 Q_D(Viewer); 0749 d->updateShowMultiMessagesButton(enablePreviousButton, enableNextButton); 0750 } 0751 0752 void Viewer::setShowEncryptionDetails(bool showDetails) 0753 { 0754 Q_D(Viewer); 0755 d->setShowEncryptionDetails(showDetails); 0756 } 0757 0758 qreal Viewer::webViewZoomFactor() const 0759 { 0760 Q_D(const Viewer); 0761 return d->webViewZoomFactor(); 0762 } 0763 0764 void Viewer::setWebViewZoomFactor(qreal factor) 0765 { 0766 Q_D(Viewer); 0767 d->setWebViewZoomFactor(factor); 0768 } 0769 0770 MessageViewer::DKIMWidgetInfo *Viewer::dkimWidgetInfo() 0771 { 0772 Q_D(Viewer); 0773 return d->mDkimWidgetInfo; 0774 } 0775 0776 void Viewer::exportToPdf(const QString &fileName) 0777 { 0778 Q_D(Viewer); 0779 d->exportToPdf(fileName); 0780 } 0781 0782 void Viewer::showDevelopmentTools() 0783 { 0784 Q_D(Viewer); 0785 d->slotShowDevelopmentTools(); 0786 } 0787 0788 void Viewer::setIdentityManager(KIdentityManagementCore::IdentityManager *ident) 0789 { 0790 Q_D(Viewer); 0791 d->setIdentityManager(ident); 0792 } 0793 0794 void Viewer::setFolderIdentity(uint folderIdentity) 0795 { 0796 Q_D(Viewer); 0797 d->setFolderIdentity(folderIdentity); 0798 } 0799 0800 } 0801 0802 #include "moc_viewer.cpp"