1 | // |
2 | // Copyright (c) 1990-2011, Scientific Toolworks, Inc. |
3 | // |
4 | // The License.txt file describes the conditions under which this software may be distributed. |
5 | // |
6 | // Author: Jason Haslam |
7 | // |
8 | // Additions Copyright (c) 2011 Archaeopteryx Software, Inc. d/b/a Wingware |
9 | // @file ScintillaQt.h - Qt specific subclass of ScintillaBase |
10 | |
11 | #ifndef SCINTILLAQT_H |
12 | #define SCINTILLAQT_H |
13 | |
14 | #include <cstddef> |
15 | #include <cstdlib> |
16 | #include <cstdint> |
17 | #include <cassert> |
18 | #include <cstring> |
19 | #include <cctype> |
20 | #include <cstdio> |
21 | #include <ctime> |
22 | #include <cmath> |
23 | #include <stdexcept> |
24 | #include <string> |
25 | #include <string_view> |
26 | #include <vector> |
27 | #include <map> |
28 | #include <set> |
29 | #include <optional> |
30 | #include <algorithm> |
31 | #include <memory> |
32 | |
33 | #include "ScintillaTypes.h" |
34 | #include "ScintillaMessages.h" |
35 | #include "ScintillaStructures.h" |
36 | #include "Scintilla.h" |
37 | #include "Debugging.h" |
38 | #include "Geometry.h" |
39 | #include "Platform.h" |
40 | #include "ILoader.h" |
41 | #include "ILexer.h" |
42 | #include "CharacterCategoryMap.h" |
43 | #include "Position.h" |
44 | #include "UniqueString.h" |
45 | #include "SplitVector.h" |
46 | #include "Partitioning.h" |
47 | #include "RunStyles.h" |
48 | #include "ContractionState.h" |
49 | #include "CellBuffer.h" |
50 | #include "CallTip.h" |
51 | #include "KeyMap.h" |
52 | #include "Indicator.h" |
53 | #include "LineMarker.h" |
54 | #include "Style.h" |
55 | #include "AutoComplete.h" |
56 | #include "ViewStyle.h" |
57 | #include "CharClassify.h" |
58 | #include "Decoration.h" |
59 | #include "CaseFolder.h" |
60 | #include "Document.h" |
61 | #include "Selection.h" |
62 | #include "PositionCache.h" |
63 | #include "EditModel.h" |
64 | #include "MarginView.h" |
65 | #include "EditView.h" |
66 | #include "Editor.h" |
67 | #include "ScintillaBase.h" |
68 | #include "CaseConvert.h" |
69 | |
70 | #include <QObject> |
71 | #include <QAbstractScrollArea> |
72 | #include <QAction> |
73 | #include <QClipboard> |
74 | #include <QPaintEvent> |
75 | |
76 | class ScintillaEditBase; |
77 | |
78 | namespace Scintilla::Internal { |
79 | |
80 | class ScintillaQt : public QObject, public ScintillaBase { |
81 | Q_OBJECT |
82 | |
83 | public: |
84 | explicit ScintillaQt(QAbstractScrollArea *parent); |
85 | virtual ~ScintillaQt(); |
86 | |
87 | signals: |
88 | void horizontalScrolled(int value); |
89 | void verticalScrolled(int value); |
90 | void horizontalRangeChanged(int max, int page); |
91 | void verticalRangeChanged(int max, int page); |
92 | |
93 | void notifyParent(Scintilla::NotificationData scn); |
94 | void notifyChange(); |
95 | |
96 | // Clients can use this hook to add additional |
97 | // formats (e.g. rich text) to the MIME data. |
98 | void aboutToCopy(QMimeData *data); |
99 | |
100 | void command(Scintilla::uptr_t wParam, Scintilla::sptr_t lParam); |
101 | |
102 | private slots: |
103 | void onIdle(); |
104 | void execCommand(QAction *action); |
105 | void SelectionChanged(); |
106 | |
107 | private: |
108 | void Init(); |
109 | void Finalise() override; |
110 | bool DragThreshold(Point ptStart, Point ptNow) override; |
111 | bool ValidCodePage(int codePage) const override; |
112 | std::string UTF8FromEncoded(std::string_view encoded) const override; |
113 | std::string EncodedFromUTF8(std::string_view utf8) const override; |
114 | |
115 | private: |
116 | void ScrollText(Sci::Line linesToMove) override; |
117 | void SetVerticalScrollPos() override; |
118 | void SetHorizontalScrollPos() override; |
119 | bool ModifyScrollBars(Sci::Line nMax, Sci::Line nPage) override; |
120 | void ReconfigureScrollBars() override; |
121 | void CopyToModeClipboard(const SelectionText &selectedText, QClipboard::Mode clipboardMode_); |
122 | void Copy() override; |
123 | void CopyToClipboard(const SelectionText &selectedText) override; |
124 | void PasteFromMode(QClipboard::Mode clipboardMode_); |
125 | void Paste() override; |
126 | void ClaimSelection() override; |
127 | void NotifyChange() override; |
128 | void NotifyFocus(bool focus) override; |
129 | void NotifyParent(Scintilla::NotificationData scn) override; |
130 | void NotifyURIDropped(const char *uri); |
131 | int timers[static_cast<size_t>(TickReason::dwell)+1]{}; |
132 | bool FineTickerRunning(TickReason reason) override; |
133 | void FineTickerStart(TickReason reason, int millis, int tolerance) override; |
134 | void CancelTimers(); |
135 | void FineTickerCancel(TickReason reason) override; |
136 | bool ChangeIdle(bool on); |
137 | bool SetIdle(bool on) override; |
138 | void SetMouseCapture(bool on) override; |
139 | bool HaveMouseCapture() override; |
140 | void StartDrag() override; |
141 | Scintilla::CharacterSet CharacterSetOfDocument() const; |
142 | const char *CharacterSetIDOfDocument() const; |
143 | QString StringFromDocument(const char *s) const; |
144 | QByteArray BytesForDocument(const QString &text) const; |
145 | std::unique_ptr<CaseFolder> CaseFolderForEncoding() override; |
146 | std::string CaseMapString(const std::string &s, CaseMapping caseMapping) override; |
147 | |
148 | void CreateCallTipWindow(PRectangle rc) override; |
149 | void (const char *label, int cmd, bool enabled) override; |
150 | sptr_t WndProc(Scintilla::Message iMessage, uptr_t wParam, sptr_t lParam) override; |
151 | sptr_t DefWndProc(Scintilla::Message iMessage, uptr_t wParam, sptr_t lParam) override; |
152 | |
153 | static sptr_t DirectFunction(sptr_t ptr, |
154 | unsigned int iMessage, uptr_t wParam, sptr_t lParam); |
155 | static sptr_t DirectStatusFunction(sptr_t ptr, |
156 | unsigned int iMessage, uptr_t wParam, sptr_t lParam, int *pStatus); |
157 | |
158 | protected: |
159 | |
160 | void PartialPaint(const PRectangle &rect); |
161 | |
162 | void DragEnter(const Point &point); |
163 | void DragMove(const Point &point); |
164 | void DragLeave(); |
165 | void Drop(const Point &point, const QMimeData *data, bool move); |
166 | void DropUrls(const QMimeData *data); |
167 | |
168 | void timerEvent(QTimerEvent *event) override; |
169 | |
170 | private: |
171 | QAbstractScrollArea *scrollArea; |
172 | |
173 | int vMax, hMax; // Scroll bar maximums. |
174 | int vPage, hPage; // Scroll bar page sizes. |
175 | |
176 | bool haveMouseCapture; |
177 | bool dragWasDropped; |
178 | int rectangularSelectionModifier; |
179 | |
180 | friend class ::ScintillaEditBase; |
181 | }; |
182 | |
183 | } |
184 | |
185 | #endif /* SCINTILLAQT_H */ |
186 | |