1 | /* |
2 | SPDX-FileCopyrightText: 2011-2018 Dominik Haumann <dhaumann@kde.org> |
3 | SPDX-FileCopyrightText: 2013 Gerald Senarclens de Grancy <oss@senarclens.eu> |
4 | |
5 | SPDX-License-Identifier: LGPL-2.0-or-later |
6 | */ |
7 | |
8 | #include "variablelineedit.h" |
9 | |
10 | #include "kateautoindent.h" |
11 | #include "katedocument.h" |
12 | #include "kateglobal.h" |
13 | #include "katesyntaxmanager.h" |
14 | #include "kateview.h" |
15 | #include "variableitem.h" |
16 | #include "variablelistview.h" |
17 | |
18 | #include <QApplication> |
19 | #include <QComboBox> |
20 | #include <QFrame> |
21 | #include <QHBoxLayout> |
22 | #include <QLineEdit> |
23 | #include <QSizeGrip> |
24 | #include <QStyle> |
25 | #include <QToolButton> |
26 | #include <QVBoxLayout> |
27 | |
28 | #include <KLocalizedString> |
29 | |
30 | #include <sonnet/speller.h> |
31 | |
32 | VariableLineEdit::VariableLineEdit(QWidget *parent) |
33 | : QWidget(parent) |
34 | { |
35 | QHBoxLayout *hl = new QHBoxLayout(this); |
36 | hl->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
37 | |
38 | m_lineedit = new QLineEdit(this); |
39 | m_button = new QToolButton(this); |
40 | m_button->setIcon(QIcon::fromTheme(QStringLiteral("tools-wizard" ))); |
41 | m_button->setToolTip(i18n("Show list of valid variables." )); |
42 | |
43 | hl->addWidget(m_lineedit); |
44 | hl->addWidget(m_button); |
45 | |
46 | m_popup.reset(p: new QFrame(nullptr, Qt::Popup)); |
47 | m_popup->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); |
48 | QVBoxLayout *l = new QVBoxLayout(m_popup.get()); |
49 | l->setSpacing(0); |
50 | l->setContentsMargins(left: 0, top: 0, right: 0, bottom: 0); |
51 | |
52 | // forward text changed signal |
53 | connect(sender: m_lineedit, signal: &QLineEdit::textChanged, context: this, slot: &VariableLineEdit::textChanged); |
54 | |
55 | // open popup on button click |
56 | connect(sender: m_button, signal: &QToolButton::clicked, context: this, slot: &VariableLineEdit::editVariables); |
57 | } |
58 | |
59 | void VariableLineEdit::editVariables() |
60 | { |
61 | m_listview = new VariableListView(m_lineedit->text(), m_popup.get()); |
62 | addKateItems(listview: m_listview); |
63 | connect(sender: m_listview, signal: &VariableListView::aboutToHide, context: this, slot: &VariableLineEdit::updateVariableLine); |
64 | |
65 | m_popup->layout()->addWidget(w: m_listview); |
66 | |
67 | if (layoutDirection() == Qt::LeftToRight) { |
68 | QPoint topLeft = mapToGlobal(m_lineedit->geometry().bottomLeft()); |
69 | const int w = m_button->geometry().right() - m_lineedit->geometry().left(); |
70 | const int h = 300; //(w * 2) / 4; |
71 | m_popup->setGeometry(QRect(topLeft, QSize(w, h))); |
72 | } else { |
73 | QPoint topLeft = mapToGlobal(m_button->geometry().bottomLeft()); |
74 | const int w = m_lineedit->geometry().right() - m_button->geometry().left(); |
75 | const int h = 300; //(w * 2) / 4; |
76 | m_popup->setGeometry(QRect(topLeft, QSize(w, h))); |
77 | } |
78 | m_popup->show(); |
79 | } |
80 | |
81 | void VariableLineEdit::updateVariableLine() |
82 | { |
83 | Q_ASSERT(m_listview); |
84 | |
85 | QString variables = m_listview->variableLine(); |
86 | m_lineedit->setText(variables); |
87 | |
88 | m_popup->layout()->removeWidget(w: m_listview); |
89 | m_listview->deleteLater(); |
90 | m_listview = nullptr; |
91 | } |
92 | |
93 | void VariableLineEdit::addKateItems(VariableListView *listview) |
94 | { |
95 | VariableItem *item = nullptr; |
96 | |
97 | // If a current active doc is available |
98 | KTextEditor::ViewPrivate *activeView = nullptr; |
99 | KTextEditor::DocumentPrivate *activeDoc = nullptr; |
100 | |
101 | KateDocumentConfig *docConfig = KateDocumentConfig::global(); |
102 | KateViewConfig *viewConfig = KateViewConfig::global(); |
103 | KateRendererConfig *rendererConfig = KateRendererConfig::global(); |
104 | |
105 | if ((activeView = qobject_cast<KTextEditor::ViewPrivate *>(object: KTextEditor::EditorPrivate::self()->application()->activeMainWindow()->activeView()))) { |
106 | activeDoc = activeView->doc(); |
107 | viewConfig = activeView->config(); |
108 | docConfig = activeDoc->config(); |
109 | rendererConfig = activeView->rendererConfig(); |
110 | } |
111 | |
112 | // Add 'auto-brackets' to list |
113 | item = new VariableBoolItem(QStringLiteral("auto-brackets" ), false); |
114 | item->setHelpText(i18nc("short translation please" , "Enable automatic insertion of brackets." )); |
115 | listview->addItem(item); |
116 | |
117 | // Add 'auto-center-lines' to list |
118 | item = new VariableIntItem(QStringLiteral("auto-center-lines" ), viewConfig->autoCenterLines()); |
119 | static_cast<VariableIntItem *>(item)->setRange(minValue: 1, maxValue: 100); |
120 | item->setHelpText(i18nc("short translation please" , "Set the number of autocenter lines." )); |
121 | listview->addItem(item); |
122 | |
123 | // Add 'background-color' to list |
124 | item = new VariableColorItem(QStringLiteral("background-color" ), rendererConfig->backgroundColor()); |
125 | item->setHelpText(i18nc("short translation please" , "Set the document background color." )); |
126 | listview->addItem(item); |
127 | |
128 | // Add 'backspace-indents' to list |
129 | item = new VariableBoolItem(QStringLiteral("backspace-indents" ), docConfig->backspaceIndents()); |
130 | item->setHelpText(i18nc("short translation please" , "Pressing backspace in leading whitespace unindents." )); |
131 | listview->addItem(item); |
132 | |
133 | // Add 'block-selection' to list |
134 | item = new VariableBoolItem(QStringLiteral("block-selection" ), false); |
135 | if (activeView) { |
136 | static_cast<VariableBoolItem *>(item)->setValue(activeView->blockSelection()); |
137 | } |
138 | item->setHelpText(i18nc("short translation please" , "Enable block selection mode." )); |
139 | listview->addItem(item); |
140 | |
141 | // Add 'byte-order-mark' (bom) to list |
142 | item = new VariableBoolItem(QStringLiteral("byte-order-mark" ), docConfig->bom()); |
143 | item->setHelpText(i18nc("short translation please" , "Enable the byte order mark (BOM) when saving Unicode files." )); |
144 | listview->addItem(item); |
145 | |
146 | // Add 'bracket-highlight-color' to list |
147 | item = new VariableColorItem(QStringLiteral("bracket-highlight-color" ), rendererConfig->highlightedBracketColor()); |
148 | item->setHelpText(i18nc("short translation please" , "Set the color for the bracket highlight." )); |
149 | listview->addItem(item); |
150 | |
151 | // Add 'current-line-color' to list |
152 | item = new VariableColorItem(QStringLiteral("current-line-color" ), rendererConfig->highlightedLineColor()); |
153 | item->setHelpText(i18nc("short translation please" , "Set the background color for the current line." )); |
154 | listview->addItem(item); |
155 | |
156 | // Add 'default-dictionary' to list |
157 | Sonnet::Speller speller; |
158 | item = new VariableSpellCheckItem(QStringLiteral("default-dictionary" ), speller.defaultLanguage()); |
159 | item->setHelpText(i18nc("short translation please" , "Set the default dictionary used for spell checking." )); |
160 | listview->addItem(item); |
161 | |
162 | // Add 'dynamic-word-wrap' to list |
163 | item = new VariableBoolItem(QStringLiteral("dynamic-word-wrap" ), viewConfig->dynWordWrap()); |
164 | item->setHelpText(i18nc("short translation please" , "Enable dynamic word wrap of long lines." )); |
165 | listview->addItem(item); |
166 | |
167 | // Add 'end-of-line' (eol) to list |
168 | item = new VariableStringListItem(QStringLiteral("end-of-line" ), |
169 | {QStringLiteral("unix" ), QStringLiteral("mac" ), QStringLiteral("dos" )}, |
170 | docConfig->eolString()); |
171 | item->setHelpText(i18nc("short translation please" , "Sets the end of line mode." )); |
172 | listview->addItem(item); |
173 | |
174 | // Add 'enter-to-insert-completion' to list |
175 | item = new VariableBoolItem(QStringLiteral("enter-to-insert-completion" ), viewConfig->value(key: KateViewConfig::EnterToInsertCompletion).toBool()); |
176 | item->setHelpText(i18nc("short translation please" , "Enable whether pressing enter will insert selected auto completion item." )); |
177 | listview->addItem(item); |
178 | |
179 | // Add 'folding-markers' to list |
180 | item = new VariableBoolItem(QStringLiteral("folding-markers" ), viewConfig->foldingBar()); |
181 | item->setHelpText(i18nc("short translation please" , "Enable folding markers in the editor border." )); |
182 | listview->addItem(item); |
183 | |
184 | // Add 'folding-preview' to list |
185 | item = new VariableBoolItem(QStringLiteral("folding-preview" ), viewConfig->foldingPreview()); |
186 | item->setHelpText(i18nc("short translation please" , "Enable folding preview in the editor border." )); |
187 | listview->addItem(item); |
188 | |
189 | // Add 'font-size' to list |
190 | item = new VariableIntItem(QStringLiteral("font-size" ), rendererConfig->baseFont().pointSize()); |
191 | static_cast<VariableIntItem *>(item)->setRange(minValue: 4, maxValue: 128); |
192 | item->setHelpText(i18nc("short translation please" , "Set the point size of the document font." )); |
193 | listview->addItem(item); |
194 | |
195 | // Add 'font' to list |
196 | item = new VariableFontItem(QStringLiteral("font" ), rendererConfig->baseFont()); |
197 | item->setHelpText(i18nc("short translation please" , "Set the font of the document." )); |
198 | listview->addItem(item); |
199 | |
200 | // Add 'syntax' (hl) to list |
201 | /* Prepare list of highlighting modes */ |
202 | QStringList hls; |
203 | hls.reserve(asize: KateHlManager::self()->modeList().size()); |
204 | const auto modeList = KateHlManager::self()->modeList(); |
205 | for (const auto &hl : modeList) { |
206 | hls << hl.name(); |
207 | } |
208 | |
209 | item = new VariableStringListItem(QStringLiteral("syntax" ), hls, hls.at(i: 0)); |
210 | if (activeDoc) { |
211 | static_cast<VariableStringListItem *>(item)->setValue(activeDoc->highlightingMode()); |
212 | } |
213 | item->setHelpText(i18nc("short translation please" , "Set the syntax highlighting." )); |
214 | listview->addItem(item); |
215 | |
216 | // Add 'icon-bar-color' to list |
217 | item = new VariableColorItem(QStringLiteral("icon-bar-color" ), rendererConfig->iconBarColor()); |
218 | item->setHelpText(i18nc("short translation please" , "Set the icon bar color." )); |
219 | listview->addItem(item); |
220 | |
221 | // Add 'icon-border' to list |
222 | item = new VariableBoolItem(QStringLiteral("icon-border" ), viewConfig->iconBar()); |
223 | item->setHelpText(i18nc("short translation please" , "Enable the icon border in the editor view." )); |
224 | listview->addItem(item); |
225 | |
226 | // Add 'indent-mode' to list |
227 | item = new VariableStringListItem(QStringLiteral("indent-mode" ), KateAutoIndent::listIdentifiers(), docConfig->indentationMode()); |
228 | item->setHelpText(i18nc("short translation please" , "Set the auto indentation style." )); |
229 | listview->addItem(item); |
230 | |
231 | // Add 'indent-pasted-text' to list |
232 | item = new VariableBoolItem(QStringLiteral("indent-pasted-text" ), docConfig->indentPastedText()); |
233 | item->setHelpText(i18nc("short translation please" , "Adjust indentation of text pasted from the clipboard." )); |
234 | listview->addItem(item); |
235 | |
236 | // Add 'indent-width' to list |
237 | item = new VariableIntItem(QStringLiteral("indent-width" ), docConfig->indentationWidth()); |
238 | static_cast<VariableIntItem *>(item)->setRange(minValue: 1, maxValue: 200); |
239 | item->setHelpText(i18nc("short translation please" , "Set the indentation depth for each indent level." )); |
240 | listview->addItem(item); |
241 | |
242 | // Add 'keep-extra-spaces' to list |
243 | item = new VariableBoolItem(QStringLiteral("keep-extra-spaces" ), docConfig->keepExtraSpaces()); |
244 | item->setHelpText(i18nc("short translation please" , "Allow odd indentation level (no multiple of indent width)." )); |
245 | listview->addItem(item); |
246 | |
247 | // Add 'line-numbers' to list |
248 | item = new VariableBoolItem(QStringLiteral("line-numbers" ), viewConfig->lineNumbers()); |
249 | item->setHelpText(i18nc("short translation please" , "Show line numbers." )); |
250 | listview->addItem(item); |
251 | |
252 | // Add 'newline-at-eof' to list |
253 | item = new VariableBoolItem(QStringLiteral("newline-at-eof" ), docConfig->ovr()); |
254 | item->setHelpText(i18nc("short translation please" , "Insert newline at end of file on save." )); |
255 | listview->addItem(item); |
256 | |
257 | // Add 'overwrite-mode' to list |
258 | item = new VariableBoolItem(QStringLiteral("overwrite-mode" ), docConfig->ovr()); |
259 | item->setHelpText(i18nc("short translation please" , "Enable overwrite mode in the document." )); |
260 | listview->addItem(item); |
261 | |
262 | // Add 'persistent-selection' to list |
263 | item = new VariableBoolItem(QStringLiteral("persistent-selection" ), viewConfig->persistentSelection()); |
264 | item->setHelpText(i18nc("short translation please" , "Enable persistent text selection." )); |
265 | listview->addItem(item); |
266 | |
267 | // Add 'replace-tabs-save' to list |
268 | item = new VariableBoolItem(QStringLiteral("replace-tabs-save" ), false); |
269 | item->setHelpText(i18nc("short translation please" , "Replace tabs with spaces when saving the document." )); |
270 | listview->addItem(item); |
271 | |
272 | // Add 'replace-tabs' to list |
273 | item = new VariableBoolItem(QStringLiteral("replace-tabs" ), docConfig->replaceTabsDyn()); |
274 | item->setHelpText(i18nc("short translation please" , "Replace tabs with spaces." )); |
275 | listview->addItem(item); |
276 | |
277 | // Add 'remove-trailing-spaces' to list |
278 | item = new VariableRemoveSpacesItem(QStringLiteral("remove-trailing-spaces" ), docConfig->removeSpaces()); |
279 | item->setHelpText(i18nc("short translation please" , "Remove trailing spaces when saving the document." )); |
280 | listview->addItem(item); |
281 | |
282 | // Add 'scrollbar-minimap' to list |
283 | item = new VariableBoolItem(QStringLiteral("scrollbar-minimap" ), viewConfig->scrollBarMiniMap()); |
284 | item->setHelpText(i18nc("short translation please" , "Show scrollbar minimap." )); |
285 | listview->addItem(item); |
286 | |
287 | // Add 'scrollbar-preview' to list |
288 | item = new VariableBoolItem(QStringLiteral("scrollbar-preview" ), viewConfig->scrollBarPreview()); |
289 | item->setHelpText(i18nc("short translation please" , "Show scrollbar preview." )); |
290 | listview->addItem(item); |
291 | |
292 | // Add 'scheme' to list |
293 | QStringList themeNames; |
294 | const auto sortedThemes = KateHlManager::self()->sortedThemes(); |
295 | themeNames.reserve(asize: sortedThemes.size()); |
296 | for (const auto &theme : sortedThemes) { |
297 | themeNames.append(t: theme.name()); |
298 | } |
299 | item = new VariableStringListItem(QStringLiteral("scheme" ), themeNames, rendererConfig->schema()); |
300 | item->setHelpText(i18nc("short translation please" , "Set the color scheme." )); |
301 | listview->addItem(item); |
302 | |
303 | // Add 'selection-color' to list |
304 | item = new VariableColorItem(QStringLiteral("selection-color" ), rendererConfig->selectionColor()); |
305 | item->setHelpText(i18nc("short translation please" , "Set the text selection color." )); |
306 | listview->addItem(item); |
307 | |
308 | // Add 'show-tabs' to list |
309 | item = new VariableBoolItem(QStringLiteral("show-tabs" ), docConfig->showTabs()); |
310 | item->setHelpText(i18nc("short translation please" , "Visualize tabs and trailing spaces." )); |
311 | listview->addItem(item); |
312 | |
313 | // Add 'smart-home' to list |
314 | item = new VariableBoolItem(QStringLiteral("smart-home" ), docConfig->smartHome()); |
315 | item->setHelpText(i18nc("short translation please" , "Enable smart home navigation." )); |
316 | listview->addItem(item); |
317 | |
318 | // Add 'tab-indents' to list |
319 | item = new VariableBoolItem(QStringLiteral("tab-indents" ), docConfig->tabIndentsEnabled()); |
320 | item->setHelpText(i18nc("short translation please" , "Pressing TAB key indents." )); |
321 | listview->addItem(item); |
322 | |
323 | // Add 'tab-width' to list |
324 | item = new VariableIntItem(QStringLiteral("tab-width" ), docConfig->tabWidth()); |
325 | static_cast<VariableIntItem *>(item)->setRange(minValue: 1, maxValue: 200); |
326 | item->setHelpText(i18nc("short translation please" , "Set the tab display width." )); |
327 | listview->addItem(item); |
328 | |
329 | // Add 'undo-steps' to list |
330 | item = new VariableIntItem(QStringLiteral("undo-steps" ), 0); |
331 | static_cast<VariableIntItem *>(item)->setRange(minValue: 0, maxValue: 100); |
332 | item->setHelpText(i18nc("short translation please" , "Set the number of undo steps to remember (0 equals infinity)." )); |
333 | listview->addItem(item); |
334 | |
335 | // Add 'word-wrap-column' to list |
336 | item = new VariableIntItem(QStringLiteral("word-wrap-column" ), docConfig->wordWrapAt()); |
337 | static_cast<VariableIntItem *>(item)->setRange(minValue: 20, maxValue: 200); |
338 | item->setHelpText(i18nc("short translation please" , "Set the word wrap column." )); |
339 | listview->addItem(item); |
340 | |
341 | // Add 'word-wrap-marker-color' to list |
342 | item = new VariableColorItem(QStringLiteral("word-wrap-marker-color" ), rendererConfig->wordWrapMarkerColor()); |
343 | item->setHelpText(i18nc("short translation please" , "Set the word wrap marker color." )); |
344 | listview->addItem(item); |
345 | |
346 | // Add 'word-wrap' to list |
347 | item = new VariableBoolItem(QStringLiteral("word-wrap" ), docConfig->wordWrap()); |
348 | item->setHelpText(i18nc("short translation please" , "Enable word wrap while typing text." )); |
349 | listview->addItem(item); |
350 | } |
351 | |
352 | void VariableLineEdit::setText(const QString &text) |
353 | { |
354 | m_lineedit->setText(text); |
355 | } |
356 | |
357 | void VariableLineEdit::clear() |
358 | { |
359 | m_lineedit->clear(); |
360 | } |
361 | |
362 | QString VariableLineEdit::text() |
363 | { |
364 | return m_lineedit->text(); |
365 | } |
366 | |
367 | #include "moc_variablelineedit.cpp" |
368 | |