File indexing completed on 2023-09-24 09:54:56

0001 /*
0002     SPDX-FileCopyrightText: 2017, 2020 Friedrich W. H. Kossebau <kossebau@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "markdownbrowserextension.hpp"
0008 
0009 // part
0010 #include "markdownpart.hpp"
0011 #include "markdownview.hpp"
0012 // KF
0013 #include <KActionCollection>
0014 #include <KLocalizedString>
0015 // Qt
0016 #include <QMimeDatabase>
0017 
0018 MarkdownBrowserExtension::MarkdownBrowserExtension(MarkdownPart* part)
0019 #if KPARTS_VERSION >= QT_VERSION_CHECK(5, 240, 0)
0020     : KParts::NavigationExtension(part)
0021 #else
0022     : KParts::BrowserExtension(part)
0023 #endif
0024     , m_part(part)
0025     , m_contextMenuActionCollection(new KActionCollection(this))
0026 {
0027      Q_EMIT enableAction("copy", m_part->view()->hasSelection());
0028 }
0029 
0030 void MarkdownBrowserExtension::copy()
0031 {
0032     m_part->copySelection();
0033 }
0034 
0035 void MarkdownBrowserExtension::updateCopyAction(bool enabled)
0036 {
0037     Q_EMIT enableAction("copy", enabled);
0038 }
0039 
0040 void MarkdownBrowserExtension::requestOpenUrl(const QUrl& url)
0041 {
0042     Q_EMIT openUrlRequest(m_part->resolvedUrl(url));
0043 }
0044 
0045 void MarkdownBrowserExtension::requestOpenUrlNewWindow(const QUrl& url)
0046 {
0047     Q_EMIT createNewWindow(m_part->resolvedUrl(url));
0048 }
0049 
0050 void MarkdownBrowserExtension::requestContextMenu(QPoint globalPos,
0051                                                   const QUrl& linkUrl,
0052                                                   bool hasSelection)
0053 {
0054     // Compare KWebKitPart's WebView::contextMenuEvent & WebEnginePart's WebEngineView::contextMenuEvent
0055     // for the patterns used to fill the menu.
0056     // QTextBrowser at of Qt 5.15 provides less data though, so for now this is reduced variant.
0057 
0058     // Clear the previous collection entries first...
0059     m_contextMenuActionCollection->clear();
0060 
0061     // default menu arguments
0062     PopupFlags flags = DefaultPopupItems | ShowBookmark;
0063     ActionGroupMap mapAction;
0064     QString mimeType;
0065     QUrl emitUrl;
0066 
0067     if (!linkUrl.isValid()) {
0068         emitUrl = m_part->url();
0069         mimeType = QStringLiteral("text/markdown");
0070 
0071         if (hasSelection) {
0072             flags |= ShowTextSelectionItems;
0073 
0074             QList<QAction*> selectActions;
0075 
0076             QAction* action = m_part->copySelectionAction();
0077             selectActions.append(action);
0078 
0079             mapAction.insert(QStringLiteral("editactions"), selectActions);
0080         }
0081     } else {
0082         flags |= IsLink;
0083         emitUrl = m_part->resolvedUrl(linkUrl);
0084 
0085         QMimeDatabase mimeDb;
0086         if (emitUrl.isLocalFile())
0087             mimeType = mimeDb.mimeTypeForUrl(emitUrl).name();
0088         else {
0089             const QString fileName = emitUrl.fileName();
0090 
0091             if (!fileName.isEmpty() && !emitUrl.hasFragment() && !emitUrl.hasQuery()) {
0092                 QMimeType mime = mimeDb.mimeTypeForFile(fileName);
0093                 if (!mime.isDefault()) {
0094                     mimeType = mime.name();
0095                 }
0096             }
0097         }
0098 
0099         QList<QAction*> linkActions;
0100 
0101         if (hasSelection) {
0102             QAction* action = m_part->copySelectionAction();
0103             linkActions.append(action);
0104         }
0105 
0106         if (emitUrl.scheme() == QLatin1String("mailto")) {
0107             QAction* action = m_part->createCopyEmailAddressAction(m_contextMenuActionCollection, emitUrl);
0108             m_contextMenuActionCollection->addAction(QStringLiteral("copylinklocation"), action);
0109             linkActions.append(action);
0110         } else {
0111             QAction* action = m_part->createCopyLinkUrlAction(m_contextMenuActionCollection, emitUrl);
0112             m_contextMenuActionCollection->addAction(QStringLiteral("copylinkurl"), action);
0113             linkActions.append(action);
0114         }
0115 
0116         mapAction.insert(QStringLiteral("linkactions"), linkActions);
0117     }
0118 
0119     // Always emit the popupMenu() signal even if there are no part-specific
0120     // actions, so that the remainder of the calling application's popup menu
0121     // (in Konqueror "Bookmark this Location", etc...) still appears.
0122     KParts::OpenUrlArguments args;
0123     args.setMimeType(mimeType);
0124 
0125     KParts::BrowserArguments bargs;
0126     bargs.setForcesNewWindow(false);
0127 
0128     Q_EMIT popupMenu(globalPos, emitUrl, static_cast<mode_t>(-1), args, bargs, flags, mapAction);
0129 }
0130 
0131 int MarkdownBrowserExtension::xOffset()
0132 {
0133     return m_part->view()->scrollPositionX();
0134 }
0135 
0136 int MarkdownBrowserExtension::yOffset()
0137 {
0138     return m_part->view()->scrollPositionY();
0139 }
0140 
0141 #include "moc_markdownbrowserextension.cpp"