1 // This defines the interface to the QsciCommand class.
2 //
3 // Copyright (c) 2021 Riverbank Computing Limited <info@riverbankcomputing.com>
4 //
5 // This file is part of QScintilla.
6 //
7 // This file may be used under the terms of the GNU General Public License
8 // version 3.0 as published by the Free Software Foundation and appearing in
9 // the file LICENSE included in the packaging of this file.  Please review the
10 // following information to ensure the GNU General Public License version 3.0
11 // requirements will be met: http://www.gnu.org/copyleft/gpl.html.
12 //
13 // If you do not wish to use this file under the terms of the GPL version 3.0
14 // then you may purchase a commercial license.  For more information contact
15 // info@riverbankcomputing.com.
16 //
17 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
18 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19 
20 
21 #ifndef QSCICOMMAND_H
22 #define QSCICOMMAND_H
23 
24 #include <qstring.h>
25 
26 #include <Qsci/qsciglobal.h>
27 #include <Qsci/qsciscintillabase.h>
28 
29 
30 class QsciScintilla;
31 
32 
33 //! \brief The QsciCommand class represents an internal editor command that may
34 //! have one or two keys bound to it.
35 //!
36 //! Methods are provided to change the keys bound to the command and to remove
37 //! a key binding.  Each command has a user friendly description of the command
38 //! for use in key mapping dialogs.
39 class QSCINTILLA_EXPORT QsciCommand
40 {
41 public:
42     //! This enum defines the different commands that can be assigned to a key.
43     enum Command {
44         //! Move down one line.
45         LineDown = QsciScintillaBase::SCI_LINEDOWN,
46 
47         //! Extend the selection down one line.
48         LineDownExtend = QsciScintillaBase::SCI_LINEDOWNEXTEND,
49 
50         //! Extend the rectangular selection down one line.
51         LineDownRectExtend = QsciScintillaBase::SCI_LINEDOWNRECTEXTEND,
52 
53         //! Scroll the view down one line.
54         LineScrollDown = QsciScintillaBase::SCI_LINESCROLLDOWN,
55 
56         //! Move up one line.
57         LineUp = QsciScintillaBase::SCI_LINEUP,
58 
59         //! Extend the selection up one line.
60         LineUpExtend = QsciScintillaBase::SCI_LINEUPEXTEND,
61 
62         //! Extend the rectangular selection up one line.
63         LineUpRectExtend = QsciScintillaBase::SCI_LINEUPRECTEXTEND,
64 
65         //! Scroll the view up one line.
66         LineScrollUp = QsciScintillaBase::SCI_LINESCROLLUP,
67 
68         //! Scroll to the start of the document.
69         ScrollToStart = QsciScintillaBase::SCI_SCROLLTOSTART,
70 
71         //! Scroll to the end of the document.
72         ScrollToEnd = QsciScintillaBase::SCI_SCROLLTOEND,
73 
74         //! Scroll vertically to centre the current line.
75         VerticalCentreCaret = QsciScintillaBase::SCI_VERTICALCENTRECARET,
76 
77         //! Move down one paragraph.
78         ParaDown = QsciScintillaBase::SCI_PARADOWN,
79 
80         //! Extend the selection down one paragraph.
81         ParaDownExtend = QsciScintillaBase::SCI_PARADOWNEXTEND,
82 
83         //! Move up one paragraph.
84         ParaUp = QsciScintillaBase::SCI_PARAUP,
85 
86         //! Extend the selection up one paragraph.
87         ParaUpExtend = QsciScintillaBase::SCI_PARAUPEXTEND,
88 
89         //! Move left one character.
90         CharLeft = QsciScintillaBase::SCI_CHARLEFT,
91 
92         //! Extend the selection left one character.
93         CharLeftExtend = QsciScintillaBase::SCI_CHARLEFTEXTEND,
94 
95         //! Extend the rectangular selection left one character.
96         CharLeftRectExtend = QsciScintillaBase::SCI_CHARLEFTRECTEXTEND,
97 
98         //! Move right one character.
99         CharRight = QsciScintillaBase::SCI_CHARRIGHT,
100 
101         //! Extend the selection right one character.
102         CharRightExtend = QsciScintillaBase::SCI_CHARRIGHTEXTEND,
103 
104         //! Extend the rectangular selection right one character.
105         CharRightRectExtend = QsciScintillaBase::SCI_CHARRIGHTRECTEXTEND,
106 
107         //! Move left one word.
108         WordLeft = QsciScintillaBase::SCI_WORDLEFT,
109 
110         //! Extend the selection left one word.
111         WordLeftExtend = QsciScintillaBase::SCI_WORDLEFTEXTEND,
112 
113         //! Move right one word.
114         WordRight = QsciScintillaBase::SCI_WORDRIGHT,
115 
116         //! Extend the selection right one word.
117         WordRightExtend = QsciScintillaBase::SCI_WORDRIGHTEXTEND,
118 
119         //! Move to the end of the previous word.
120         WordLeftEnd = QsciScintillaBase::SCI_WORDLEFTEND,
121 
122         //! Extend the selection to the end of the previous word.
123         WordLeftEndExtend = QsciScintillaBase::SCI_WORDLEFTENDEXTEND,
124 
125         //! Move to the end of the next word.
126         WordRightEnd = QsciScintillaBase::SCI_WORDRIGHTEND,
127 
128         //! Extend the selection to the end of the next word.
129         WordRightEndExtend = QsciScintillaBase::SCI_WORDRIGHTENDEXTEND,
130 
131         //! Move left one word part.
132         WordPartLeft = QsciScintillaBase::SCI_WORDPARTLEFT,
133 
134         //! Extend the selection left one word part.
135         WordPartLeftExtend = QsciScintillaBase::SCI_WORDPARTLEFTEXTEND,
136 
137         //! Move right one word part.
138         WordPartRight = QsciScintillaBase::SCI_WORDPARTRIGHT,
139 
140         //! Extend the selection right one word part.
141         WordPartRightExtend = QsciScintillaBase::SCI_WORDPARTRIGHTEXTEND,
142 
143         //! Move to the start of the document line.
144         Home = QsciScintillaBase::SCI_HOME,
145 
146         //! Extend the selection to the start of the document line.
147         HomeExtend = QsciScintillaBase::SCI_HOMEEXTEND,
148 
149         //! Extend the rectangular selection to the start of the document line.
150         HomeRectExtend = QsciScintillaBase::SCI_HOMERECTEXTEND,
151 
152         //! Move to the start of the displayed line.
153         HomeDisplay = QsciScintillaBase::SCI_HOMEDISPLAY,
154 
155         //! Extend the selection to the start of the displayed line.
156         HomeDisplayExtend = QsciScintillaBase::SCI_HOMEDISPLAYEXTEND,
157 
158         //! Move to the start of the displayed or document line.
159         HomeWrap = QsciScintillaBase::SCI_HOMEWRAP,
160 
161         //! Extend the selection to the start of the displayed or document
162         //! line.
163         HomeWrapExtend = QsciScintillaBase::SCI_HOMEWRAPEXTEND,
164 
165         //! Move to the first visible character in the document line.
166         VCHome = QsciScintillaBase::SCI_VCHOME,
167 
168         //! Extend the selection to the first visible character in the document
169         //! line.
170         VCHomeExtend = QsciScintillaBase::SCI_VCHOMEEXTEND,
171 
172         //! Extend the rectangular selection to the first visible character in
173         //! the document line.
174         VCHomeRectExtend = QsciScintillaBase::SCI_VCHOMERECTEXTEND,
175 
176         //! Move to the first visible character of the displayed or document
177         //! line.
178         VCHomeWrap = QsciScintillaBase::SCI_VCHOMEWRAP,
179 
180         //! Extend the selection to the first visible character of the
181         //! displayed or document line.
182         VCHomeWrapExtend = QsciScintillaBase::SCI_VCHOMEWRAPEXTEND,
183 
184         //! Move to the end of the document line.
185         LineEnd = QsciScintillaBase::SCI_LINEEND,
186 
187         //! Extend the selection to the end of the document line.
188         LineEndExtend = QsciScintillaBase::SCI_LINEENDEXTEND,
189 
190         //! Extend the rectangular selection to the end of the document line.
191         LineEndRectExtend = QsciScintillaBase::SCI_LINEENDRECTEXTEND,
192 
193         //! Move to the end of the displayed line.
194         LineEndDisplay = QsciScintillaBase::SCI_LINEENDDISPLAY,
195 
196         //! Extend the selection to the end of the displayed line.
197         LineEndDisplayExtend = QsciScintillaBase::SCI_LINEENDDISPLAYEXTEND,
198 
199         //! Move to the end of the displayed or document line.
200         LineEndWrap = QsciScintillaBase::SCI_LINEENDWRAP,
201 
202         //! Extend the selection to the end of the displayed or document line.
203         LineEndWrapExtend = QsciScintillaBase::SCI_LINEENDWRAPEXTEND,
204 
205         //! Move to the start of the document.
206         DocumentStart = QsciScintillaBase::SCI_DOCUMENTSTART,
207 
208         //! Extend the selection to the start of the document.
209         DocumentStartExtend = QsciScintillaBase::SCI_DOCUMENTSTARTEXTEND,
210 
211         //! Move to the end of the document.
212         DocumentEnd = QsciScintillaBase::SCI_DOCUMENTEND,
213 
214         //! Extend the selection to the end of the document.
215         DocumentEndExtend = QsciScintillaBase::SCI_DOCUMENTENDEXTEND,
216 
217         //! Move up one page.
218         PageUp = QsciScintillaBase::SCI_PAGEUP,
219 
220         //! Extend the selection up one page.
221         PageUpExtend = QsciScintillaBase::SCI_PAGEUPEXTEND,
222 
223         //! Extend the rectangular selection up one page.
224         PageUpRectExtend = QsciScintillaBase::SCI_PAGEUPRECTEXTEND,
225 
226         //! Move down one page.
227         PageDown = QsciScintillaBase::SCI_PAGEDOWN,
228 
229         //! Extend the selection down one page.
230         PageDownExtend = QsciScintillaBase::SCI_PAGEDOWNEXTEND,
231 
232         //! Extend the rectangular selection down one page.
233         PageDownRectExtend = QsciScintillaBase::SCI_PAGEDOWNRECTEXTEND,
234 
235         //! Stuttered move up one page.
236         StutteredPageUp = QsciScintillaBase::SCI_STUTTEREDPAGEUP,
237 
238         //! Stuttered extend the selection up one page.
239         StutteredPageUpExtend = QsciScintillaBase::SCI_STUTTEREDPAGEUPEXTEND,
240 
241         //! Stuttered move down one page.
242         StutteredPageDown = QsciScintillaBase::SCI_STUTTEREDPAGEDOWN,
243 
244         //! Stuttered extend the selection down one page.
245         StutteredPageDownExtend = QsciScintillaBase::SCI_STUTTEREDPAGEDOWNEXTEND,
246 
247         //! Delete the current character.
248         Delete = QsciScintillaBase::SCI_CLEAR,
249 
250         //! Delete the previous character.
251         DeleteBack = QsciScintillaBase::SCI_DELETEBACK,
252 
253         //! Delete the previous character if not at start of line.
254         DeleteBackNotLine = QsciScintillaBase::SCI_DELETEBACKNOTLINE,
255 
256         //! Delete the word to the left.
257         DeleteWordLeft = QsciScintillaBase::SCI_DELWORDLEFT,
258 
259         //! Delete the word to the right.
260         DeleteWordRight = QsciScintillaBase::SCI_DELWORDRIGHT,
261 
262         //! Delete right to the end of the next word.
263         DeleteWordRightEnd = QsciScintillaBase::SCI_DELWORDRIGHTEND,
264 
265         //! Delete the line to the left.
266         DeleteLineLeft = QsciScintillaBase::SCI_DELLINELEFT,
267 
268         //! Delete the line to the right.
269         DeleteLineRight = QsciScintillaBase::SCI_DELLINERIGHT,
270 
271         //! Delete the current line.
272         LineDelete = QsciScintillaBase::SCI_LINEDELETE,
273 
274         //! Cut the current line to the clipboard.
275         LineCut = QsciScintillaBase::SCI_LINECUT,
276 
277         //! Copy the current line to the clipboard.
278         LineCopy = QsciScintillaBase::SCI_LINECOPY,
279 
280         //! Transpose the current and previous lines.
281         LineTranspose = QsciScintillaBase::SCI_LINETRANSPOSE,
282 
283         //! Duplicate the current line.
284         LineDuplicate = QsciScintillaBase::SCI_LINEDUPLICATE,
285 
286         //! Select the whole document.
287         SelectAll = QsciScintillaBase::SCI_SELECTALL,
288 
289         //! Move the selected lines up one line.
290         MoveSelectedLinesUp = QsciScintillaBase::SCI_MOVESELECTEDLINESUP,
291 
292         //! Move the selected lines down one line.
293         MoveSelectedLinesDown = QsciScintillaBase::SCI_MOVESELECTEDLINESDOWN,
294 
295         //! Duplicate the selection.
296         SelectionDuplicate = QsciScintillaBase::SCI_SELECTIONDUPLICATE,
297 
298         //! Convert the selection to lower case.
299         SelectionLowerCase = QsciScintillaBase::SCI_LOWERCASE,
300 
301         //! Convert the selection to upper case.
302         SelectionUpperCase = QsciScintillaBase::SCI_UPPERCASE,
303 
304         //! Cut the selection to the clipboard.
305         SelectionCut = QsciScintillaBase::SCI_CUT,
306 
307         //! Copy the selection to the clipboard.
308         SelectionCopy = QsciScintillaBase::SCI_COPY,
309 
310         //! Paste from the clipboard.
311         Paste = QsciScintillaBase::SCI_PASTE,
312 
313         //! Toggle insert/overtype.
314         EditToggleOvertype = QsciScintillaBase::SCI_EDITTOGGLEOVERTYPE,
315 
316         //! Insert a platform dependent newline.
317         Newline = QsciScintillaBase::SCI_NEWLINE,
318 
319         //! Insert a formfeed.
320         Formfeed = QsciScintillaBase::SCI_FORMFEED,
321 
322         //! Indent one level.
323         Tab = QsciScintillaBase::SCI_TAB,
324 
325         //! De-indent one level.
326         Backtab = QsciScintillaBase::SCI_BACKTAB,
327 
328         //! Cancel any current operation.
329         Cancel = QsciScintillaBase::SCI_CANCEL,
330 
331         //! Undo the last command.
332         Undo = QsciScintillaBase::SCI_UNDO,
333 
334         //! Redo the last command.
335         Redo = QsciScintillaBase::SCI_REDO,
336 
337         //! Zoom in.
338         ZoomIn = QsciScintillaBase::SCI_ZOOMIN,
339 
340         //! Zoom out.
341         ZoomOut = QsciScintillaBase::SCI_ZOOMOUT,
342 
343         //! Reverse the selected lines.
344         ReverseLines = QsciScintillaBase::SCI_LINEREVERSE,
345     };
346 
347     //! Return the command that will be executed by this instance.
command()348     Command command() const {return scicmd;}
349 
350     //! Execute the command.
351     void execute();
352 
353     //! Binds the key \a key to the command.  If \a key is 0 then the key
354     //! binding is removed.  If \a key is invalid then the key binding is
355     //! unchanged.  Valid keys are any visible or control character or any
356     //! of \c Qt::Key_Down, \c Qt::Key_Up, \c Qt::Key_Left, \c Qt::Key_Right,
357     //! \c Qt::Key_Home, \c Qt::Key_End, \c Qt::Key_PageUp,
358     //! \c Qt::Key_PageDown, \c Qt::Key_Delete, \c Qt::Key_Insert,
359     //! \c Qt::Key_Escape, \c Qt::Key_Backspace, \c Qt::Key_Tab,
360     //! \c Qt::Key_Backtab, \c Qt::Key_Return, \c Qt::Key_Enter,
361     //! \c Qt::Key_Super_L, \c Qt::Key_Super_R or \c Qt::Key_Menu.  Keys may be
362     //! modified with any combination of \c Qt::ShiftModifier,
363     //! \c Qt::ControlModifier, \c Qt::AltModifier and \c Qt::MetaModifier.
364     //!
365     //! \sa key(), setAlternateKey(), validKey()
366     void setKey(int key);
367 
368     //! Binds the alternate key \a altkey to the command.  If \a key is 0
369     //! then the alternate key binding is removed.
370     //!
371     //! \sa alternateKey(), setKey(), validKey()
372     void setAlternateKey(int altkey);
373 
374     //! The key that is currently bound to the command is returned.
375     //!
376     //! \sa setKey(), alternateKey()
key()377     int key() const {return qkey;}
378 
379     //! The alternate key that is currently bound to the command is
380     //! returned.
381     //!
382     //! \sa setAlternateKey(), key()
alternateKey()383     int alternateKey() const {return qaltkey;}
384 
385     //! If the key \a key is valid then true is returned.
386     static bool validKey(int key);
387 
388     //! The user friendly description of the command is returned.
389     QString description() const;
390 
391 private:
392     friend class QsciCommandSet;
393 
394     QsciCommand(QsciScintilla *qs, Command cmd, int key, int altkey,
395             const char *desc);
396 
397     void bindKey(int key,int &qk,int &scik);
398 
399     QsciScintilla *qsCmd;
400     Command scicmd;
401     int qkey, scikey, qaltkey, scialtkey;
402     const char *descCmd;
403 
404     QsciCommand(const QsciCommand &);
405     QsciCommand &operator=(const QsciCommand &);
406 };
407 
408 #endif
409