File indexing completed on 2024-04-21 05:52:51

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