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"