File indexing completed on 2024-04-21 03:57:51
0001 /* 0002 SPDX-FileCopyrightText: 2011-2018 Dominik Haumann <dhaumann@kde.org> 0003 SPDX-FileCopyrightText: 2013 Gerald Senarclens de Grancy <oss@senarclens.eu> 0004 0005 SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #include "variablelineedit.h" 0009 0010 #include "kateautoindent.h" 0011 #include "katedocument.h" 0012 #include "kateglobal.h" 0013 #include "katesyntaxmanager.h" 0014 #include "kateview.h" 0015 #include "variableitem.h" 0016 #include "variablelistview.h" 0017 0018 #include <QApplication> 0019 #include <QComboBox> 0020 #include <QFrame> 0021 #include <QHBoxLayout> 0022 #include <QLineEdit> 0023 #include <QSizeGrip> 0024 #include <QStyle> 0025 #include <QToolButton> 0026 #include <QVBoxLayout> 0027 0028 #include <KLocalizedString> 0029 0030 #include <sonnet/speller.h> 0031 0032 VariableLineEdit::VariableLineEdit(QWidget *parent) 0033 : QWidget(parent) 0034 { 0035 QHBoxLayout *hl = new QHBoxLayout(this); 0036 hl->setContentsMargins(0, 0, 0, 0); 0037 0038 m_lineedit = new QLineEdit(this); 0039 m_button = new QToolButton(this); 0040 m_button->setIcon(QIcon::fromTheme(QStringLiteral("tools-wizard"))); 0041 m_button->setToolTip(i18n("Show list of valid variables.")); 0042 0043 hl->addWidget(m_lineedit); 0044 hl->addWidget(m_button); 0045 0046 m_popup.reset(new QFrame(nullptr, Qt::Popup)); 0047 m_popup->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); 0048 QVBoxLayout *l = new QVBoxLayout(m_popup.get()); 0049 l->setSpacing(0); 0050 l->setContentsMargins(0, 0, 0, 0); 0051 0052 // forward text changed signal 0053 connect(m_lineedit, &QLineEdit::textChanged, this, &VariableLineEdit::textChanged); 0054 0055 // open popup on button click 0056 connect(m_button, &QToolButton::clicked, this, &VariableLineEdit::editVariables); 0057 } 0058 0059 void VariableLineEdit::editVariables() 0060 { 0061 m_listview = new VariableListView(m_lineedit->text(), m_popup.get()); 0062 addKateItems(m_listview); 0063 connect(m_listview, &VariableListView::aboutToHide, this, &VariableLineEdit::updateVariableLine); 0064 0065 m_popup->layout()->addWidget(m_listview); 0066 0067 if (layoutDirection() == Qt::LeftToRight) { 0068 QPoint topLeft = mapToGlobal(m_lineedit->geometry().bottomLeft()); 0069 const int w = m_button->geometry().right() - m_lineedit->geometry().left(); 0070 const int h = 300; //(w * 2) / 4; 0071 m_popup->setGeometry(QRect(topLeft, QSize(w, h))); 0072 } else { 0073 QPoint topLeft = mapToGlobal(m_button->geometry().bottomLeft()); 0074 const int w = m_lineedit->geometry().right() - m_button->geometry().left(); 0075 const int h = 300; //(w * 2) / 4; 0076 m_popup->setGeometry(QRect(topLeft, QSize(w, h))); 0077 } 0078 m_popup->show(); 0079 } 0080 0081 void VariableLineEdit::updateVariableLine() 0082 { 0083 Q_ASSERT(m_listview); 0084 0085 QString variables = m_listview->variableLine(); 0086 m_lineedit->setText(variables); 0087 0088 m_popup->layout()->removeWidget(m_listview); 0089 m_listview->deleteLater(); 0090 m_listview = nullptr; 0091 } 0092 0093 void VariableLineEdit::addKateItems(VariableListView *listview) 0094 { 0095 VariableItem *item = nullptr; 0096 0097 // If a current active doc is available 0098 KTextEditor::ViewPrivate *activeView = nullptr; 0099 KTextEditor::DocumentPrivate *activeDoc = nullptr; 0100 0101 KateDocumentConfig *docConfig = KateDocumentConfig::global(); 0102 KateViewConfig *viewConfig = KateViewConfig::global(); 0103 KateRendererConfig *rendererConfig = KateRendererConfig::global(); 0104 0105 if ((activeView = qobject_cast<KTextEditor::ViewPrivate *>(KTextEditor::EditorPrivate::self()->application()->activeMainWindow()->activeView()))) { 0106 activeDoc = activeView->doc(); 0107 viewConfig = activeView->config(); 0108 docConfig = activeDoc->config(); 0109 rendererConfig = activeView->rendererConfig(); 0110 } 0111 0112 // Add 'auto-brackets' to list 0113 item = new VariableBoolItem(QStringLiteral("auto-brackets"), false); 0114 item->setHelpText(i18nc("short translation please", "Enable automatic insertion of brackets.")); 0115 listview->addItem(item); 0116 0117 // Add 'auto-center-lines' to list 0118 item = new VariableIntItem(QStringLiteral("auto-center-lines"), viewConfig->autoCenterLines()); 0119 static_cast<VariableIntItem *>(item)->setRange(1, 100); 0120 item->setHelpText(i18nc("short translation please", "Set the number of autocenter lines.")); 0121 listview->addItem(item); 0122 0123 // Add 'background-color' to list 0124 item = new VariableColorItem(QStringLiteral("background-color"), rendererConfig->backgroundColor()); 0125 item->setHelpText(i18nc("short translation please", "Set the document background color.")); 0126 listview->addItem(item); 0127 0128 // Add 'backspace-indents' to list 0129 item = new VariableBoolItem(QStringLiteral("backspace-indents"), docConfig->backspaceIndents()); 0130 item->setHelpText(i18nc("short translation please", "Pressing backspace in leading whitespace unindents.")); 0131 listview->addItem(item); 0132 0133 // Add 'block-selection' to list 0134 item = new VariableBoolItem(QStringLiteral("block-selection"), false); 0135 if (activeView) { 0136 static_cast<VariableBoolItem *>(item)->setValue(activeView->blockSelection()); 0137 } 0138 item->setHelpText(i18nc("short translation please", "Enable block selection mode.")); 0139 listview->addItem(item); 0140 0141 // Add 'byte-order-mark' (bom) to list 0142 item = new VariableBoolItem(QStringLiteral("byte-order-mark"), docConfig->bom()); 0143 item->setHelpText(i18nc("short translation please", "Enable the byte order mark (BOM) when saving Unicode files.")); 0144 listview->addItem(item); 0145 0146 // Add 'bracket-highlight-color' to list 0147 item = new VariableColorItem(QStringLiteral("bracket-highlight-color"), rendererConfig->highlightedBracketColor()); 0148 item->setHelpText(i18nc("short translation please", "Set the color for the bracket highlight.")); 0149 listview->addItem(item); 0150 0151 // Add 'current-line-color' to list 0152 item = new VariableColorItem(QStringLiteral("current-line-color"), rendererConfig->highlightedLineColor()); 0153 item->setHelpText(i18nc("short translation please", "Set the background color for the current line.")); 0154 listview->addItem(item); 0155 0156 // Add 'default-dictionary' to list 0157 Sonnet::Speller speller; 0158 item = new VariableSpellCheckItem(QStringLiteral("default-dictionary"), speller.defaultLanguage()); 0159 item->setHelpText(i18nc("short translation please", "Set the default dictionary used for spell checking.")); 0160 listview->addItem(item); 0161 0162 // Add 'dynamic-word-wrap' to list 0163 item = new VariableBoolItem(QStringLiteral("dynamic-word-wrap"), viewConfig->dynWordWrap()); 0164 item->setHelpText(i18nc("short translation please", "Enable dynamic word wrap of long lines.")); 0165 listview->addItem(item); 0166 0167 // Add 'end-of-line' (eol) to list 0168 item = new VariableStringListItem(QStringLiteral("end-of-line"), 0169 {QStringLiteral("unix"), QStringLiteral("mac"), QStringLiteral("dos")}, 0170 docConfig->eolString()); 0171 item->setHelpText(i18nc("short translation please", "Sets the end of line mode.")); 0172 listview->addItem(item); 0173 0174 // Add 'enter-to-insert-completion' to list 0175 item = new VariableBoolItem(QStringLiteral("enter-to-insert-completion"), viewConfig->value(KateViewConfig::EnterToInsertCompletion).toBool()); 0176 item->setHelpText(i18nc("short translation please", "Enable whether pressing enter will insert selected auto completion item.")); 0177 listview->addItem(item); 0178 0179 // Add 'folding-markers' to list 0180 item = new VariableBoolItem(QStringLiteral("folding-markers"), viewConfig->foldingBar()); 0181 item->setHelpText(i18nc("short translation please", "Enable folding markers in the editor border.")); 0182 listview->addItem(item); 0183 0184 // Add 'folding-preview' to list 0185 item = new VariableBoolItem(QStringLiteral("folding-preview"), viewConfig->foldingPreview()); 0186 item->setHelpText(i18nc("short translation please", "Enable folding preview in the editor border.")); 0187 listview->addItem(item); 0188 0189 // Add 'font-size' to list 0190 item = new VariableIntItem(QStringLiteral("font-size"), rendererConfig->baseFont().pointSize()); 0191 static_cast<VariableIntItem *>(item)->setRange(4, 128); 0192 item->setHelpText(i18nc("short translation please", "Set the point size of the document font.")); 0193 listview->addItem(item); 0194 0195 // Add 'font' to list 0196 item = new VariableFontItem(QStringLiteral("font"), rendererConfig->baseFont()); 0197 item->setHelpText(i18nc("short translation please", "Set the font of the document.")); 0198 listview->addItem(item); 0199 0200 // Add 'syntax' (hl) to list 0201 /* Prepare list of highlighting modes */ 0202 QStringList hls; 0203 hls.reserve(KateHlManager::self()->modeList().size()); 0204 const auto modeList = KateHlManager::self()->modeList(); 0205 for (const auto &hl : modeList) { 0206 hls << hl.name(); 0207 } 0208 0209 item = new VariableStringListItem(QStringLiteral("syntax"), hls, hls.at(0)); 0210 if (activeDoc) { 0211 static_cast<VariableStringListItem *>(item)->setValue(activeDoc->highlightingMode()); 0212 } 0213 item->setHelpText(i18nc("short translation please", "Set the syntax highlighting.")); 0214 listview->addItem(item); 0215 0216 // Add 'icon-bar-color' to list 0217 item = new VariableColorItem(QStringLiteral("icon-bar-color"), rendererConfig->iconBarColor()); 0218 item->setHelpText(i18nc("short translation please", "Set the icon bar color.")); 0219 listview->addItem(item); 0220 0221 // Add 'icon-border' to list 0222 item = new VariableBoolItem(QStringLiteral("icon-border"), viewConfig->iconBar()); 0223 item->setHelpText(i18nc("short translation please", "Enable the icon border in the editor view.")); 0224 listview->addItem(item); 0225 0226 // Add 'indent-mode' to list 0227 item = new VariableStringListItem(QStringLiteral("indent-mode"), KateAutoIndent::listIdentifiers(), docConfig->indentationMode()); 0228 item->setHelpText(i18nc("short translation please", "Set the auto indentation style.")); 0229 listview->addItem(item); 0230 0231 // Add 'indent-pasted-text' to list 0232 item = new VariableBoolItem(QStringLiteral("indent-pasted-text"), docConfig->indentPastedText()); 0233 item->setHelpText(i18nc("short translation please", "Adjust indentation of text pasted from the clipboard.")); 0234 listview->addItem(item); 0235 0236 // Add 'indent-width' to list 0237 item = new VariableIntItem(QStringLiteral("indent-width"), docConfig->indentationWidth()); 0238 static_cast<VariableIntItem *>(item)->setRange(1, 200); 0239 item->setHelpText(i18nc("short translation please", "Set the indentation depth for each indent level.")); 0240 listview->addItem(item); 0241 0242 // Add 'keep-extra-spaces' to list 0243 item = new VariableBoolItem(QStringLiteral("keep-extra-spaces"), docConfig->keepExtraSpaces()); 0244 item->setHelpText(i18nc("short translation please", "Allow odd indentation level (no multiple of indent width).")); 0245 listview->addItem(item); 0246 0247 // Add 'line-numbers' to list 0248 item = new VariableBoolItem(QStringLiteral("line-numbers"), viewConfig->lineNumbers()); 0249 item->setHelpText(i18nc("short translation please", "Show line numbers.")); 0250 listview->addItem(item); 0251 0252 // Add 'newline-at-eof' to list 0253 item = new VariableBoolItem(QStringLiteral("newline-at-eof"), docConfig->ovr()); 0254 item->setHelpText(i18nc("short translation please", "Insert newline at end of file on save.")); 0255 listview->addItem(item); 0256 0257 // Add 'overwrite-mode' to list 0258 item = new VariableBoolItem(QStringLiteral("overwrite-mode"), docConfig->ovr()); 0259 item->setHelpText(i18nc("short translation please", "Enable overwrite mode in the document.")); 0260 listview->addItem(item); 0261 0262 // Add 'persistent-selection' to list 0263 item = new VariableBoolItem(QStringLiteral("persistent-selection"), viewConfig->persistentSelection()); 0264 item->setHelpText(i18nc("short translation please", "Enable persistent text selection.")); 0265 listview->addItem(item); 0266 0267 // Add 'replace-tabs-save' to list 0268 item = new VariableBoolItem(QStringLiteral("replace-tabs-save"), false); 0269 item->setHelpText(i18nc("short translation please", "Replace tabs with spaces when saving the document.")); 0270 listview->addItem(item); 0271 0272 // Add 'replace-tabs' to list 0273 item = new VariableBoolItem(QStringLiteral("replace-tabs"), docConfig->replaceTabsDyn()); 0274 item->setHelpText(i18nc("short translation please", "Replace tabs with spaces.")); 0275 listview->addItem(item); 0276 0277 // Add 'remove-trailing-spaces' to list 0278 item = new VariableRemoveSpacesItem(QStringLiteral("remove-trailing-spaces"), docConfig->removeSpaces()); 0279 item->setHelpText(i18nc("short translation please", "Remove trailing spaces when saving the document.")); 0280 listview->addItem(item); 0281 0282 // Add 'scrollbar-minimap' to list 0283 item = new VariableBoolItem(QStringLiteral("scrollbar-minimap"), viewConfig->scrollBarMiniMap()); 0284 item->setHelpText(i18nc("short translation please", "Show scrollbar minimap.")); 0285 listview->addItem(item); 0286 0287 // Add 'scrollbar-preview' to list 0288 item = new VariableBoolItem(QStringLiteral("scrollbar-preview"), viewConfig->scrollBarPreview()); 0289 item->setHelpText(i18nc("short translation please", "Show scrollbar preview.")); 0290 listview->addItem(item); 0291 0292 // Add 'scheme' to list 0293 QStringList themeNames; 0294 const auto sortedThemes = KateHlManager::self()->sortedThemes(); 0295 themeNames.reserve(sortedThemes.size()); 0296 for (const auto &theme : sortedThemes) { 0297 themeNames.append(theme.name()); 0298 } 0299 item = new VariableStringListItem(QStringLiteral("scheme"), themeNames, rendererConfig->schema()); 0300 item->setHelpText(i18nc("short translation please", "Set the color scheme.")); 0301 listview->addItem(item); 0302 0303 // Add 'selection-color' to list 0304 item = new VariableColorItem(QStringLiteral("selection-color"), rendererConfig->selectionColor()); 0305 item->setHelpText(i18nc("short translation please", "Set the text selection color.")); 0306 listview->addItem(item); 0307 0308 // Add 'show-tabs' to list 0309 item = new VariableBoolItem(QStringLiteral("show-tabs"), docConfig->showTabs()); 0310 item->setHelpText(i18nc("short translation please", "Visualize tabs and trailing spaces.")); 0311 listview->addItem(item); 0312 0313 // Add 'smart-home' to list 0314 item = new VariableBoolItem(QStringLiteral("smart-home"), docConfig->smartHome()); 0315 item->setHelpText(i18nc("short translation please", "Enable smart home navigation.")); 0316 listview->addItem(item); 0317 0318 // Add 'tab-indents' to list 0319 item = new VariableBoolItem(QStringLiteral("tab-indents"), docConfig->tabIndentsEnabled()); 0320 item->setHelpText(i18nc("short translation please", "Pressing TAB key indents.")); 0321 listview->addItem(item); 0322 0323 // Add 'tab-width' to list 0324 item = new VariableIntItem(QStringLiteral("tab-width"), docConfig->tabWidth()); 0325 static_cast<VariableIntItem *>(item)->setRange(1, 200); 0326 item->setHelpText(i18nc("short translation please", "Set the tab display width.")); 0327 listview->addItem(item); 0328 0329 // Add 'undo-steps' to list 0330 item = new VariableIntItem(QStringLiteral("undo-steps"), 0); 0331 static_cast<VariableIntItem *>(item)->setRange(0, 100); 0332 item->setHelpText(i18nc("short translation please", "Set the number of undo steps to remember (0 equals infinity).")); 0333 listview->addItem(item); 0334 0335 // Add 'word-wrap-column' to list 0336 item = new VariableIntItem(QStringLiteral("word-wrap-column"), docConfig->wordWrapAt()); 0337 static_cast<VariableIntItem *>(item)->setRange(20, 200); 0338 item->setHelpText(i18nc("short translation please", "Set the word wrap column.")); 0339 listview->addItem(item); 0340 0341 // Add 'word-wrap-marker-color' to list 0342 item = new VariableColorItem(QStringLiteral("word-wrap-marker-color"), rendererConfig->wordWrapMarkerColor()); 0343 item->setHelpText(i18nc("short translation please", "Set the word wrap marker color.")); 0344 listview->addItem(item); 0345 0346 // Add 'word-wrap' to list 0347 item = new VariableBoolItem(QStringLiteral("word-wrap"), docConfig->wordWrap()); 0348 item->setHelpText(i18nc("short translation please", "Enable word wrap while typing text.")); 0349 listview->addItem(item); 0350 } 0351 0352 void VariableLineEdit::setText(const QString &text) 0353 { 0354 m_lineedit->setText(text); 0355 } 0356 0357 void VariableLineEdit::clear() 0358 { 0359 m_lineedit->clear(); 0360 } 0361 0362 QString VariableLineEdit::text() 0363 { 0364 return m_lineedit->text(); 0365 } 0366 0367 #include "moc_variablelineedit.cpp"