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"