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