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"