File indexing completed on 2024-04-28 09:48:19

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 #ifndef MARKDOWNPART_HPP
0008 #define MARKDOWNPART_HPP
0009 
0010 // KF
0011 #include <KParts/ReadOnlyPart>
0012 // Qt
0013 #include <QByteArray>
0014 #include <QPoint>
0015 
0016 class MarkdownBrowserExtension;
0017 class MarkdownView;
0018 class SearchToolBar;
0019 class KPluginMetaData;
0020 class QTextDocument;
0021 
0022 
0023 class MarkdownPart : public KParts::ReadOnlyPart
0024 {
0025     Q_OBJECT
0026 
0027 public:
0028     enum Modus {
0029         ReadOnlyModus = 0,
0030         BrowserViewModus = 1
0031     };
0032 
0033     /**
0034      * Default constructor, with arguments as expected by MarkdownPartFactory
0035      */
0036     MarkdownPart(QWidget* parentWidget, QObject* parent, const KPluginMetaData& metaData, Modus modus);
0037     ~MarkdownPart() override;
0038 
0039 public:
0040     MarkdownView* view() const;
0041 
0042     QAction* copySelectionAction() const;
0043     QAction* createCopyEmailAddressAction(QObject* parent, const QUrl& mailtoUrl);
0044     QAction* createCopyLinkUrlAction(QObject* parent, const QUrl& linkUrl);
0045 
0046     void copySelection();
0047 
0048     QUrl resolvedUrl(const QUrl &url) const;
0049 
0050 protected: // KParts::ReadOnlyPart API
0051     bool openFile() override;
0052 
0053     bool doOpenStream(const QString& mimeType) override;
0054     bool doWriteStream(const QByteArray& data) override;
0055     bool doCloseStream() override;
0056 
0057     bool closeUrl() override;
0058 
0059 private:
0060     void setupActions(Modus modus);
0061     void prepareViewStateRestoringOnReload();
0062     void restoreScrollPosition();
0063 
0064     void handleOpenUrlRequest(const QUrl& url);
0065     void handleContextMenuRequest(QPoint globalPos,
0066                                   const QUrl& linkUrl,
0067                                   bool hasSelection);
0068     void showHoveredLink(const QUrl& linkUrl);
0069 
0070     void selectAll();
0071 
0072 private:
0073     QTextDocument* m_sourceDocument;
0074     MarkdownView* m_widget;
0075     SearchToolBar* m_searchToolBar;
0076     QAction* m_copySelectionAction;
0077     QAction* m_selectAllAction;
0078     QAction* m_searchAction;
0079     QAction* m_searchNextAction;
0080     QAction* m_searchPreviousAction;
0081 
0082     MarkdownBrowserExtension* const m_browserExtension;
0083 
0084     QByteArray m_streamedData;
0085 
0086     QUrl m_previousUrl;
0087     QPoint m_previousScrollPosition;
0088 };
0089 
0090 inline MarkdownView* MarkdownPart::view() const { return m_widget; }
0091 
0092 #endif