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"