File indexing completed on 2024-05-05 05:52:18

0001 /*  This file is part of the Kate project.
0002  *  Based on the snippet plugin from KDevelop 4.
0003  *
0004  *  SPDX-FileCopyrightText: 2007 Robert Gruber <rgruber@users.sourceforge.net>
0005  *  SPDX-FileCopyrightText: 2010 Milian Wolff <mail@milianw.de>
0006  *  SPDX-FileCopyrightText: 2012 Christoph Cullmann <cullmann@kde.org>
0007  *  SPDX-FileCopyrightText: 2014 Sven Brauch <svenbrauch@gmail.com>
0008  *
0009  *  SPDX-License-Identifier: LGPL-2.0-or-later
0010  */
0011 
0012 #include "editrepository.h"
0013 #include "snippetrepository.h"
0014 #include "snippetstore.h"
0015 
0016 #include <ktexteditor/document.h>
0017 #include <ktexteditor/editor.h>
0018 
0019 #include <KConfigGroup>
0020 #include <KLocalizedString>
0021 #include <KSharedConfig>
0022 #include <KStandardGuiItem>
0023 #include <KUser>
0024 
0025 #include <QDialogButtonBox>
0026 #include <QPushButton>
0027 
0028 static const char s_configFile[] = "kate-snippetsrc";
0029 
0030 EditRepository::EditRepository(SnippetRepository *repository, QWidget *parent)
0031     : QDialog(parent)
0032     , Ui::EditRepositoryBase()
0033     , m_repo(repository)
0034 {
0035     setupUi(this);
0036 
0037     connect(repoNameEdit, &KLineEdit::textEdited, this, &EditRepository::validate);
0038     connect(this, &QDialog::accepted, this, &EditRepository::save);
0039 
0040     auto ok = buttonBox->button(QDialogButtonBox::Ok);
0041     KGuiItem::assign(ok, KStandardGuiItem::ok());
0042     connect(ok, &QPushButton::clicked, this, &EditRepository::accept);
0043 
0044     auto cancel = buttonBox->button(QDialogButtonBox::Cancel);
0045     KGuiItem::assign(cancel, KStandardGuiItem::cancel());
0046     connect(cancel, &QPushButton::clicked, this, &EditRepository::reject);
0047 
0048     // fill list of available modes
0049     std::shared_ptr<KTextEditor::Document> document(KTextEditor::Editor::instance()->createDocument(nullptr));
0050     repoFileTypesList->addItems(document->highlightingModes());
0051     repoFileTypesList->sortItems();
0052     repoFileTypesList->setSelectionMode(QAbstractItemView::ExtendedSelection);
0053     connect(repoFileTypesList->selectionModel(), &QItemSelectionModel::selectionChanged, this, &EditRepository::updateFileTypes);
0054 
0055     // add default licenses
0056     repoLicenseEdit->addItems(QStringList() << QStringLiteral("BSD") << QStringLiteral("Artistic") << QStringLiteral("LGPL v2+") << QStringLiteral("LGPL v3+"));
0057     repoLicenseEdit->setEditable(true);
0058 
0059     // if we edit a repo, add all existing data
0060     if (m_repo) {
0061         repoNameEdit->setText(m_repo->text());
0062         repoAuthorsEdit->setText(m_repo->authors());
0063         repoNamespaceEdit->setText(m_repo->completionNamespace());
0064         if (!m_repo->license().isEmpty()) {
0065             int index = repoLicenseEdit->findText(m_repo->license());
0066             if (index == -1) {
0067                 repoLicenseEdit->addItem(m_repo->license());
0068                 repoLicenseEdit->model()->sort(0);
0069                 index = repoLicenseEdit->findText(m_repo->license());
0070             }
0071             repoLicenseEdit->setCurrentIndex(index);
0072         }
0073         const auto fileTypes = m_repo->fileTypes();
0074         for (const QString &type : fileTypes) {
0075             const auto items = repoFileTypesList->findItems(type, Qt::MatchExactly);
0076             for (QListWidgetItem *item : items) {
0077                 item->setSelected(true);
0078             }
0079         }
0080 
0081         setWindowTitle(i18n("Edit Snippet Repository %1", m_repo->text()));
0082     } else {
0083         setWindowTitle(i18n("Create New Snippet Repository"));
0084         KUser user;
0085         repoAuthorsEdit->setText(user.property(KUser::FullName).toString());
0086     }
0087 
0088     validate();
0089     updateFileTypes();
0090     repoNameEdit->setFocus();
0091 
0092     KSharedConfigPtr config = KSharedConfig::openConfig(QLatin1String(s_configFile));
0093     KConfigGroup group = config->group(QStringLiteral("General"));
0094     const QSize savedSize = group.readEntry("Size", QSize());
0095     if (savedSize.isValid()) {
0096         resize(savedSize);
0097     }
0098 }
0099 
0100 void EditRepository::validate()
0101 {
0102     bool valid = !repoNameEdit->text().isEmpty() && !repoNameEdit->text().contains(QLatin1Char('/'));
0103     buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid);
0104 }
0105 
0106 void EditRepository::save()
0107 {
0108     Q_ASSERT(!repoNameEdit->text().isEmpty());
0109     if (!m_repo) {
0110         // save as new repo
0111         m_repo = SnippetRepository::createRepoFromName(repoNameEdit->text());
0112     }
0113     m_repo->setText(repoNameEdit->text());
0114     m_repo->setAuthors(repoAuthorsEdit->text());
0115     m_repo->setLicense(repoLicenseEdit->currentText());
0116     m_repo->setCompletionNamespace(repoNamespaceEdit->text());
0117 
0118     QStringList types;
0119     const auto selectedItems = repoFileTypesList->selectedItems();
0120     for (QListWidgetItem *item : selectedItems) {
0121         types << item->text();
0122     }
0123     m_repo->setFileTypes(types);
0124     m_repo->save();
0125 
0126     setWindowTitle(i18n("Edit Snippet Repository %1", m_repo->text()));
0127 
0128     KSharedConfigPtr config = KSharedConfig::openConfig(QLatin1String(s_configFile));
0129     KConfigGroup group = config->group(QStringLiteral("General"));
0130     group.writeEntry("Size", size());
0131     group.sync();
0132 }
0133 
0134 void EditRepository::updateFileTypes()
0135 {
0136     QStringList types;
0137     const auto selectedItems = repoFileTypesList->selectedItems();
0138     for (QListWidgetItem *item : selectedItems) {
0139         types << item->text();
0140     }
0141     if (types.isEmpty()) {
0142         repoFileTypesListLabel->setText(i18n("<i>leave empty for general purpose snippets</i>"));
0143     } else {
0144         repoFileTypesListLabel->setText(types.join(QLatin1String(", ")));
0145     }
0146 }
0147 
0148 #include "moc_editrepository.cpp"