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"