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"