KTextEditor

kateautoindent.h
1 /*
2  SPDX-FileCopyrightText: 2003 Jesse Yurkovich <[email protected]>
3 
4  KateVarIndent class:
5  SPDX-FileCopyrightText: 2004 Anders Lund <[email protected]>
6 
7  Basic support for config page:
8  SPDX-FileCopyrightText: 2005 Dominik Haumann <[email protected]>
9 
10  SPDX-License-Identifier: LGPL-2.0-or-later
11 */
12 
13 #ifndef KATE_AUTO_INDENT_H
14 #define KATE_AUTO_INDENT_H
15 
16 #include "kateconfig.h"
17 
18 #include <QObject>
19 
20 #include <KActionMenu>
21 
22 namespace KTextEditor
23 {
24 class DocumentPrivate;
25 class Cursor;
26 }
27 class KateIndentScript;
28 class KateHighlighting;
29 
30 /**
31  * Provides Auto-Indent functionality for katepart.
32  * This baseclass is a real dummy, does nothing beside remembering the document it belongs too,
33  * only to have the object around
34  */
35 class KateAutoIndent : public QObject
36 {
37  Q_OBJECT
38  /*
39  * Static methods to list indention modes
40  */
41 public:
42  /**
43  * List all possible modes by name, i.e. "C Style", "XML Style", ...
44  * @return list of modes
45  */
46  static QStringList listModes();
47 
48  /**
49  * List all possible names, i.e. "cstyle", "xml", ...
50  * @return list of indenter identifiers
51  */
52  static QStringList listIdentifiers();
53 
54  /**
55  * Return the mode name given the mode
56  * @param mode mode index
57  * @return name for this mode index
58  */
59  static QString modeName(int mode);
60 
61  /**
62  * Return the mode description
63  * @param mode mode index
64  * @return mode index
65  */
66  static QString modeDescription(int mode);
67 
68  /**
69  * Return the syntax highlighting style required to use this mode
70  * @param mode mode index
71  * @return required style, or empty if the mode doesn't require any style
72  */
73  static QString modeRequiredStyle(int mode);
74 
75  /**
76  * Maps name -> index
77  * @param name mode name
78  * @return mode index
79  */
80  static uint modeNumber(const QString &name);
81 
82  /**
83  * count of modes
84  * @return number of existing modes
85  */
86  static int modeCount();
87 
88  /*
89  * Construction + Destruction
90  */
91 public:
92  /**
93  * Constructor, creates dummy indenter "None"
94  * \param doc parent document
95  */
96  explicit KateAutoIndent(KTextEditor::DocumentPrivate *doc);
97 
98  /**
99  * Destructor
100  */
101  ~KateAutoIndent();
102 
103  /*
104  * Internal helper for the subclasses and itself
105  */
106 private:
107  /**
108  * Produces a string with the proper indentation characters for its length.
109  *
110  * @param length The length of the indention in characters.
111  * @param align Length of alignment, ignored if less of equal to length
112  * @return A QString representing @p length characters (factoring in tabs and spaces)
113  */
114  QString tabString(int length, int align) const;
115 
116  /**
117  * Set the indent level of the line.
118  * \param line line to change indent for
119  * \param indentDepth set indentation to given number of spaces
120  * \param align if align is higher than indentDepth, the difference
121  * represents a number of spaces to be added after the indent
122  */
123  bool doIndent(int line, int indentDepth, int align = 0);
124 
125  /**
126  * Change the indent of the specified line by the number of levels
127  * specified by change. Positive values will indent more, negative values
128  * will indent less.
129  * \param line line to change indent for
130  * \param change change the indentation by given number of spaces
131  */
132  bool doIndentRelative(int line, int change);
133 
134  /**
135  * Reuse the indent of the previous line
136  * \param line line to change indent for
137  */
138  void keepIndent(int line);
139 
140  /**
141  * Call the indentation script, this is a helper to be used in userTypedChar and indent
142  * \param view the view the user work at
143  * \param position current cursor position, after the inserted char...
144  * \param typedChar the inserted char, indent will just give the script '\n'
145  */
146  void scriptIndent(KTextEditor::ViewPrivate *view, const KTextEditor::Cursor &position, QChar typedChar);
147 
148  /**
149  * Return true if the required style for the script is provided by the highlighter.
150  */
151  static bool isStyleProvided(const KateIndentScript *script, const KateHighlighting *highlight);
152 
153 public:
154  /**
155  * Switch indenter
156  * Nop if already set to given mode
157  * Otherwise switch to given indenter or to "None" if no suitable found...
158  * @param name indention mode wanted
159  */
160  void setMode(const QString &name);
161 
162  /**
163  * Check if the current highlighting mode provides the style required by the
164  * current indenter. If not, deactivate the indenter by changing to "normal"
165  * mode.
166  */
167  void checkRequiredStyle();
168 
169  /**
170  * mode name
171  */
172  const QString &modeName() const
173  {
174  return m_mode;
175  }
176 
177  /**
178  * Update indenter's configuration (indention width, etc.)
179  * Is called in the updateConfig() of the document and after creation of the indenter...
180  */
181  void updateConfig();
182 
183  /**
184  * Function to provide the common indent/unindent/clean indent functionality to the document
185  * This should be generic for all indenters, internally it uses the doIndent function.
186  * This works equal for all indenters, even for "none" or the scripts
187  * \param range range of text to change indent for
188  * \param change level of indents to add or remove, zero will still trigger cleaning of indentation
189  * and removal of extra spaces, if option set
190  * \return \e true on success, otherwise \e false
191  */
192  bool changeIndent(const KTextEditor::Range &range, int change);
193 
194  /**
195  * The document requests the indenter to indent the given range of existing text.
196  * This may happen to indent text pasted or to reindent existing text.
197  * For "none" and "normal" this is a nop, for the scripts, the expression
198  * will be asked for indent level for each line
199  * \param view the view the user work at
200  * \param range the range of text to indent...
201  */
202  void indent(KTextEditor::ViewPrivate *view, const KTextEditor::Range &range);
203 
204  /**
205  * The user typed some char, the indenter can react on this
206  * '\n' will be send as char if the user wraps a line
207  * \param view the view the user work at
208  * \param position current cursor position, after the inserted char...
209  * \param typedChar the inserted char
210  */
211  void userTypedChar(KTextEditor::ViewPrivate *view, const KTextEditor::Cursor &position, QChar typedChar);
212 
213 public Q_SLOTS:
214  void reloadScript();
215 
216  /*
217  * needed data
218  */
219 private:
220  KTextEditor::DocumentPrivate *doc; //!< the document the indenter works on
221  int tabWidth; //!< The number of characters simulated for a tab
222  int indentWidth; //!< The number of characters used when tabs are replaced by spaces
223  bool useSpaces; //!< Should we use spaces or tabs to indent
224  bool keepExtra; //!< Keep indentation that is not on indentation boundaries
225  QString m_mode;
226  KateIndentScript *m_script;
227 };
228 
229 /**
230  * This action provides a list of available indenters and gets plugged
231  * into the KTextEditor::ViewPrivate's KActionCollection.
232  */
234 {
235  Q_OBJECT
236 
237 public:
238  KateViewIndentationAction(KTextEditor::DocumentPrivate *_doc, const QString &text, QObject *parent);
239 
240 private:
241  KTextEditor::DocumentPrivate *doc;
242  QActionGroup *actionGroup;
243 
244 public Q_SLOTS:
245  void slotAboutToShow();
246 
247 private Q_SLOTS:
248  void setMode(QAction *);
249 };
250 
251 #endif
bool setMode(const QString &name) override
Set the current mode of the document by giving its name.
QString mode() const override
Return the name of the currently used mode.
The Cursor represents a position in a Document.
Definition: cursor.h:71
Provides Auto-Indent functionality for katepart.
The KTextEditor namespace contains all the public API that is required to use the KTextEditor compone...
Definition: katetextblock.h:20
A specialized class for scripts that are of type ScriptType::Indentation.
An object representing a section of text, from one Cursor to another.
This action provides a list of available indenters and gets plugged into the KTextEditor::ViewPrivate...
const QString & modeName() const
mode name
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Fri Jun 18 2021 22:57:15 by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.