summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppfilesettingspage.cpp
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2021-08-30 10:58:08 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2021-09-01 14:53:58 +0000
commit284817fae6514701902ccdb834c2faa46462f2e8 (patch)
tree44a8c7d9813dc110b61c4639036366c7696bd7e9 /src/plugins/cpptools/cppfilesettingspage.cpp
parent3e1fa0f170d523971d2c3c12da15a6e291f56511 (diff)
downloadqt-creator-284817fae6514701902ccdb834c2faa46462f2e8.tar.gz
Merge CppTools into CppEditor
There was no proper separation of responsibilities between these plugins. In particular, CppTools had lots of editor-related functionality, so it's not clear why it was separated out in the first place. In fact, for a lot of code, it seemed quite arbitrary where it was put (just one example: switchHeaderSource() was in CppTools, wheras switchDeclarationDefinition() was in CppEditor). Merging the plugins will enable us to get rid of various convoluted pseudo-abstractions that were only introduced to keep up the artificial separation. Change-Id: Iafc3bce625b4794f6d4aa03df6cddc7f2d26716a Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/cpptools/cppfilesettingspage.cpp')
-rw-r--r--src/plugins/cpptools/cppfilesettingspage.cpp395
1 files changed, 0 insertions, 395 deletions
diff --git a/src/plugins/cpptools/cppfilesettingspage.cpp b/src/plugins/cpptools/cppfilesettingspage.cpp
deleted file mode 100644
index d289e6334e..0000000000
--- a/src/plugins/cpptools/cppfilesettingspage.cpp
+++ /dev/null
@@ -1,395 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of Qt Creator.
-**
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-****************************************************************************/
-
-#include "cppfilesettingspage.h"
-
-#include "cpptoolsconstants.h"
-#include "cpptoolsplugin.h"
-#include <ui_cppfilesettingspage.h>
-
-#include <app/app_version.h>
-
-#include <coreplugin/icore.h>
-#include <coreplugin/editormanager/editormanager.h>
-#include <cppeditor/cppeditorconstants.h>
-
-#include <utils/environment.h>
-#include <utils/fileutils.h>
-#include <utils/hostosinfo.h>
-#include <utils/mimetypes/mimedatabase.h>
-#include <utils/stringutils.h>
-
-#include <QCoreApplication>
-#include <QDate>
-#include <QDebug>
-#include <QFile>
-#include <QFileDialog>
-#include <QLocale>
-#include <QSettings>
-#include <QTextCodec>
-#include <QTextStream>
-
-using namespace Utils;
-
-namespace CppTools {
-namespace Internal {
-
-const char headerPrefixesKeyC[] = "HeaderPrefixes";
-const char sourcePrefixesKeyC[] = "SourcePrefixes";
-const char headerSuffixKeyC[] = "HeaderSuffix";
-const char sourceSuffixKeyC[] = "SourceSuffix";
-const char headerSearchPathsKeyC[] = "HeaderSearchPaths";
-const char sourceSearchPathsKeyC[] = "SourceSearchPaths";
-const char headerPragmaOnceC[] = "HeaderPragmaOnce";
-const char licenseTemplatePathKeyC[] = "LicenseTemplate";
-
-const char *licenseTemplateTemplate = QT_TRANSLATE_NOOP("CppTools::Internal::CppFileSettingsWidget",
-"/**************************************************************************\n"
-"** %1 license header template\n"
-"** Special keywords: %USER% %DATE% %YEAR%\n"
-"** Environment variables: %$VARIABLE%\n"
-"** To protect a percent sign, use '%%'.\n"
-"**************************************************************************/\n");
-
-void CppFileSettings::toSettings(QSettings *s) const
-{
- using Utils::QtcSettings;
- const CppFileSettings def;
- s->beginGroup(Constants::CPPTOOLS_SETTINGSGROUP);
- QtcSettings::setValueWithDefault(s, headerPrefixesKeyC, headerPrefixes, def.headerPrefixes);
- QtcSettings::setValueWithDefault(s, sourcePrefixesKeyC, sourcePrefixes, def.sourcePrefixes);
- QtcSettings::setValueWithDefault(s, headerSuffixKeyC, headerSuffix, def.headerSuffix);
- QtcSettings::setValueWithDefault(s, sourceSuffixKeyC, sourceSuffix, def.sourceSuffix);
- QtcSettings::setValueWithDefault(s,
- headerSearchPathsKeyC,
- headerSearchPaths,
- def.headerSearchPaths);
- QtcSettings::setValueWithDefault(s,
- sourceSearchPathsKeyC,
- sourceSearchPaths,
- def.sourceSearchPaths);
- QtcSettings::setValueWithDefault(s,
- Constants::LOWERCASE_CPPFILES_KEY,
- lowerCaseFiles,
- def.lowerCaseFiles);
- QtcSettings::setValueWithDefault(s, headerPragmaOnceC, headerPragmaOnce, def.headerPragmaOnce);
- QtcSettings::setValueWithDefault(s,
- licenseTemplatePathKeyC,
- licenseTemplatePath,
- def.licenseTemplatePath);
- s->endGroup();
-}
-
-void CppFileSettings::fromSettings(QSettings *s)
-{
- const CppFileSettings def;
- s->beginGroup(Constants::CPPTOOLS_SETTINGSGROUP);
- headerPrefixes = s->value(headerPrefixesKeyC, def.headerPrefixes).toStringList();
- sourcePrefixes = s->value(sourcePrefixesKeyC, def.sourcePrefixes).toStringList();
- headerSuffix = s->value(headerSuffixKeyC, def.headerSuffix).toString();
- sourceSuffix = s->value(sourceSuffixKeyC, def.sourceSuffix).toString();
- headerSearchPaths = s->value(headerSearchPathsKeyC, def.headerSearchPaths).toStringList();
- sourceSearchPaths = s->value(sourceSearchPathsKeyC, def.sourceSearchPaths).toStringList();
- lowerCaseFiles = s->value(Constants::LOWERCASE_CPPFILES_KEY, def.lowerCaseFiles).toBool();
- headerPragmaOnce = s->value(headerPragmaOnceC, def.headerPragmaOnce).toBool();
- licenseTemplatePath = s->value(licenseTemplatePathKeyC, def.licenseTemplatePath).toString();
- s->endGroup();
-}
-
-bool CppFileSettings::applySuffixesToMimeDB()
-{
- Utils::MimeType mt;
- mt = Utils::mimeTypeForName(QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE));
- if (!mt.isValid())
- return false;
- mt.setPreferredSuffix(sourceSuffix);
- mt = Utils::mimeTypeForName(QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE));
- if (!mt.isValid())
- return false;
- mt.setPreferredSuffix(headerSuffix);
- return true;
-}
-
-bool CppFileSettings::equals(const CppFileSettings &rhs) const
-{
- return lowerCaseFiles == rhs.lowerCaseFiles
- && headerPragmaOnce == rhs.headerPragmaOnce
- && headerPrefixes == rhs.headerPrefixes
- && sourcePrefixes == rhs.sourcePrefixes
- && headerSuffix == rhs.headerSuffix
- && sourceSuffix == rhs.sourceSuffix
- && headerSearchPaths == rhs.headerSearchPaths
- && sourceSearchPaths == rhs.sourceSearchPaths
- && licenseTemplatePath == rhs.licenseTemplatePath;
-}
-
-// Replacements of special license template keywords.
-static bool keyWordReplacement(const QString &keyWord,
- QString *value)
-{
- if (keyWord == QLatin1String("%YEAR%")) {
- *value = QLatin1String("%{CurrentDate:yyyy}");
- return true;
- }
- if (keyWord == QLatin1String("%MONTH%")) {
- *value = QLatin1String("%{CurrentDate:M}");
- return true;
- }
- if (keyWord == QLatin1String("%DAY%")) {
- *value = QLatin1String("%{CurrentDate:d}");
- return true;
- }
- if (keyWord == QLatin1String("%CLASS%")) {
- *value = QLatin1String("%{Cpp:License:ClassName}");
- return true;
- }
- if (keyWord == QLatin1String("%FILENAME%")) {
- *value = QLatin1String("%{Cpp:License:FileName}");
- return true;
- }
- if (keyWord == QLatin1String("%DATE%")) {
- static QString format;
- // ensure a format with 4 year digits. Some have locales have 2.
- if (format.isEmpty()) {
- QLocale loc;
- format = loc.dateFormat(QLocale::ShortFormat);
- const QChar ypsilon = QLatin1Char('y');
- if (format.count(ypsilon) == 2)
- format.insert(format.indexOf(ypsilon), QString(2, ypsilon));
- format.replace('/', "\\/");
- }
- *value = QString::fromLatin1("%{CurrentDate:") + format + QLatin1Char('}');
- return true;
- }
- if (keyWord == QLatin1String("%USER%")) {
- *value = Utils::HostOsInfo::isWindowsHost() ? QLatin1String("%{Env:USERNAME}")
- : QLatin1String("%{Env:USER}");
- return true;
- }
- // Environment variables (for example '%$EMAIL%').
- if (keyWord.startsWith(QLatin1String("%$"))) {
- const QString varName = keyWord.mid(2, keyWord.size() - 3);
- *value = QString::fromLatin1("%{Env:") + varName + QLatin1Char('}');
- return true;
- }
- return false;
-}
-
-// Parse a license template, scan for %KEYWORD% and replace if known.
-// Replace '%%' by '%'.
-static void parseLicenseTemplatePlaceholders(QString *t)
-{
- int pos = 0;
- const QChar placeHolder = QLatin1Char('%');
- do {
- const int placeHolderPos = t->indexOf(placeHolder, pos);
- if (placeHolderPos == -1)
- break;
- const int endPlaceHolderPos = t->indexOf(placeHolder, placeHolderPos + 1);
- if (endPlaceHolderPos == -1)
- break;
- if (endPlaceHolderPos == placeHolderPos + 1) { // '%%' -> '%'
- t->remove(placeHolderPos, 1);
- pos = placeHolderPos + 1;
- } else {
- const QString keyWord = t->mid(placeHolderPos, endPlaceHolderPos + 1 - placeHolderPos);
- QString replacement;
- if (keyWordReplacement(keyWord, &replacement)) {
- t->replace(placeHolderPos, keyWord.size(), replacement);
- pos = placeHolderPos + replacement.size();
- } else {
- // Leave invalid keywords as is.
- pos = endPlaceHolderPos + 1;
- }
- }
- } while (pos < t->size());
-
-}
-
-// Convenience that returns the formatted license template.
-QString CppFileSettings::licenseTemplate()
-{
- const QSettings *s = Core::ICore::settings();
- QString key = QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP);
- key += QLatin1Char('/');
- key += QLatin1String(licenseTemplatePathKeyC);
- const QString path = s->value(key, QString()).toString();
- if (path.isEmpty())
- return QString();
- QFile file(path);
- if (!file.open(QIODevice::ReadOnly|QIODevice::Text)) {
- qWarning("Unable to open the license template %s: %s", qPrintable(path), qPrintable(file.errorString()));
- return QString();
- }
-
- QTextStream licenseStream(&file);
- licenseStream.setAutoDetectUnicode(true);
- QString license = licenseStream.readAll();
-
- parseLicenseTemplatePlaceholders(&license);
-
- // Ensure at least one newline at the end of the license template to separate it from the code
- const QChar newLine = QLatin1Char('\n');
- if (!license.endsWith(newLine))
- license += newLine;
-
- return license;
-}
-
-// ------------------ CppFileSettingsWidget
-
-class CppFileSettingsWidget final : public Core::IOptionsPageWidget
-{
- Q_DECLARE_TR_FUNCTIONS(CppTools::Internal::CppFileSettingsWidget)
-
-public:
- explicit CppFileSettingsWidget(CppFileSettings *settings);
-
- void apply() final;
-
- void setSettings(const CppFileSettings &s);
-
-private:
- void slotEdit();
- FilePath licenseTemplatePath() const;
- void setLicenseTemplatePath(const FilePath &);
-
- Ui::CppFileSettingsPage m_ui;
- CppFileSettings *m_settings = nullptr;
-};
-
-CppFileSettingsWidget::CppFileSettingsWidget(CppFileSettings *settings)
- : m_settings(settings)
-{
- m_ui.setupUi(this);
- // populate suffix combos
- const Utils::MimeType sourceMt = Utils::mimeTypeForName(QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE));
- if (sourceMt.isValid()) {
- foreach (const QString &suffix, sourceMt.suffixes())
- m_ui.sourceSuffixComboBox->addItem(suffix);
- }
-
- const Utils::MimeType headerMt = Utils::mimeTypeForName(QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE));
- if (headerMt.isValid()) {
- foreach (const QString &suffix, headerMt.suffixes())
- m_ui.headerSuffixComboBox->addItem(suffix);
- }
- m_ui.licenseTemplatePathChooser->setExpectedKind(Utils::PathChooser::File);
- m_ui.licenseTemplatePathChooser->setHistoryCompleter(QLatin1String("Cpp.LicenseTemplate.History"));
- m_ui.licenseTemplatePathChooser->addButton(tr("Edit..."), this, [this] { slotEdit(); });
-
- setSettings(*m_settings);
-}
-
-FilePath CppFileSettingsWidget::licenseTemplatePath() const
-{
- return m_ui.licenseTemplatePathChooser->filePath();
-}
-
-void CppFileSettingsWidget::setLicenseTemplatePath(const FilePath &lp)
-{
- m_ui.licenseTemplatePathChooser->setFilePath(lp);
-}
-
-static QStringList trimmedPaths(const QString &paths)
-{
- QStringList res;
- foreach (const QString &path, paths.split(QLatin1Char(','), Qt::SkipEmptyParts))
- res << path.trimmed();
- return res;
-}
-
-void CppFileSettingsWidget::apply()
-{
- CppFileSettings rc;
- rc.lowerCaseFiles = m_ui.lowerCaseFileNamesCheckBox->isChecked();
- rc.headerPragmaOnce = m_ui.headerPragmaOnceCheckBox->isChecked();
- rc.headerPrefixes = trimmedPaths(m_ui.headerPrefixesEdit->text());
- rc.sourcePrefixes = trimmedPaths(m_ui.sourcePrefixesEdit->text());
- rc.headerSuffix = m_ui.headerSuffixComboBox->currentText();
- rc.sourceSuffix = m_ui.sourceSuffixComboBox->currentText();
- rc.headerSearchPaths = trimmedPaths(m_ui.headerSearchPathsEdit->text());
- rc.sourceSearchPaths = trimmedPaths(m_ui.sourceSearchPathsEdit->text());
- rc.licenseTemplatePath = licenseTemplatePath().toString();
-
- if (rc == *m_settings)
- return;
-
- *m_settings = rc;
- m_settings->toSettings(Core::ICore::settings());
- m_settings->applySuffixesToMimeDB();
- CppToolsPlugin::clearHeaderSourceCache();
-}
-
-static inline void setComboText(QComboBox *cb, const QString &text, int defaultIndex = 0)
-{
- const int index = cb->findText(text);
- cb->setCurrentIndex(index == -1 ? defaultIndex: index);
-}
-
-void CppFileSettingsWidget::setSettings(const CppFileSettings &s)
-{
- const QChar comma = QLatin1Char(',');
- m_ui.lowerCaseFileNamesCheckBox->setChecked(s.lowerCaseFiles);
- m_ui.headerPragmaOnceCheckBox->setChecked(s.headerPragmaOnce);
- m_ui.headerPrefixesEdit->setText(s.headerPrefixes.join(comma));
- m_ui.sourcePrefixesEdit->setText(s.sourcePrefixes.join(comma));
- setComboText(m_ui.headerSuffixComboBox, s.headerSuffix);
- setComboText(m_ui.sourceSuffixComboBox, s.sourceSuffix);
- m_ui.headerSearchPathsEdit->setText(s.headerSearchPaths.join(comma));
- m_ui.sourceSearchPathsEdit->setText(s.sourceSearchPaths.join(comma));
- setLicenseTemplatePath(FilePath::fromString(s.licenseTemplatePath));
-}
-
-void CppFileSettingsWidget::slotEdit()
-{
- FilePath path = licenseTemplatePath();
- if (path.isEmpty()) {
- // Pick a file name and write new template, edit with C++
- path = FileUtils::getSaveFilePath(this, tr("Choose Location for New License Template File"));
- if (path.isEmpty())
- return;
- FileSaver saver(path, QIODevice::Text);
- saver.write(tr(licenseTemplateTemplate).arg(Core::Constants::IDE_DISPLAY_NAME).toUtf8());
- if (!saver.finalize(this))
- return;
- setLicenseTemplatePath(path);
- }
- // Edit (now) existing file with C++
- Core::EditorManager::openEditor(path, CppEditor::Constants::CPPEDITOR_ID);
-}
-
-// --------------- CppFileSettingsPage
-
-CppFileSettingsPage::CppFileSettingsPage(CppFileSettings *settings)
-{
- setId(Constants::CPP_FILE_SETTINGS_ID);
- setDisplayName(QCoreApplication::translate("CppTools", Constants::CPP_FILE_SETTINGS_NAME));
- setCategory(Constants::CPP_SETTINGS_CATEGORY);
- setWidgetCreator([settings] { return new CppFileSettingsWidget(settings); });
-}
-
-} // namespace Internal
-} // namespace CppTools