From be40d9ca93e4c0cba43ea884a96b264c94b2fc8b Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 5 Aug 2011 09:59:28 +0200 Subject: [PATCH] Apply code style settings to templates Task-number: QTCREATORBUG-169 Change-Id: I380c956d3256c186ff9497463ab845228017ff87 Reviewed-on: http://codereview.qt.nokia.com/2671 Reviewed-by: Qt Sanity Bot Reviewed-by: Jarek Kobus Reviewed-by: Friedemann Kleint --- src/plugins/coreplugin/basefilewizard.cpp | 9 ++- src/plugins/coreplugin/ifilewizardextension.h | 7 +- .../cpptools/cppcodestylesettingsfactory.cpp | 6 ++ src/plugins/cpptools/cppcodestylesettingsfactory.h | 1 + src/plugins/cpptools/cpptoolsplugin.cpp | 6 ++ .../projectexplorer/projectfilewizardextension.cpp | 77 +++++++++++++++++++++- .../projectexplorer/projectfilewizardextension.h | 3 +- .../qmljstools/qmljscodestylesettingsfactory.cpp | 6 ++ .../qmljstools/qmljscodestylesettingsfactory.h | 1 + src/plugins/qmljstools/qmljstoolsplugin.cpp | 4 ++ .../texteditor/icodestylepreferencesfactory.h | 2 + src/plugins/texteditor/texteditorsettings.cpp | 12 ++++ src/plugins/texteditor/texteditorsettings.h | 3 + 13 files changed, 133 insertions(+), 4 deletions(-) diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp index 6259cea969..0e5338598a 100644 --- a/src/plugins/coreplugin/basefilewizard.cpp +++ b/src/plugins/coreplugin/basefilewizard.cpp @@ -599,6 +599,13 @@ void BaseFileWizard::runWizard(const QString &path, QWidget *parent) case OverwriteOk: break; } + + foreach (IFileWizardExtension *ex, extensions) { + for (int i = 0; i < files.count(); i++) { + ex->applyCodeStyle(&files[i]); + } + } + // Write if (!writeFiles(files, &errorMessage)) { QMessageBox::critical(parent, tr("File Generation Failure"), errorMessage); @@ -609,7 +616,7 @@ void BaseFileWizard::runWizard(const QString &path, QWidget *parent) // Run the extensions foreach (IFileWizardExtension *ex, extensions) { bool remove; - if (!ex->process(files, &remove, &errorMessage)) { + if (!ex->processFiles(files, &remove, &errorMessage)) { QMessageBox::critical(parent, tr("File Generation Failure"), errorMessage); return; } diff --git a/src/plugins/coreplugin/ifilewizardextension.h b/src/plugins/coreplugin/ifilewizardextension.h index cc2f58ac4c..51af18a131 100644 --- a/src/plugins/coreplugin/ifilewizardextension.h +++ b/src/plugins/coreplugin/ifilewizardextension.h @@ -60,9 +60,14 @@ public: virtual QList extensionPages(const IWizard *wizard) = 0; /* Process the files using the extension parameters */ - virtual bool process(const QList &files, + virtual bool processFiles(const QList &files, bool *removeOpenProjectAttribute, QString *errorMessage) = 0; + /* Applies code style settings which may depend on the project to which + * the files will be added. + * This function is called before the files are actually written out, + * before processFiles() is called*/ + virtual void applyCodeStyle(GeneratedFile *file) const = 0; public slots: /* Notification about the first extension page being shown. */ diff --git a/src/plugins/cpptools/cppcodestylesettingsfactory.cpp b/src/plugins/cpptools/cppcodestylesettingsfactory.cpp index dc2e3ab0b3..2374677ac4 100644 --- a/src/plugins/cpptools/cppcodestylesettingsfactory.cpp +++ b/src/plugins/cpptools/cppcodestylesettingsfactory.cpp @@ -35,6 +35,7 @@ #include "cppcodestylesettingspage.h" #include "cppcodestylepreferences.h" #include "cpptoolsconstants.h" +#include "cppqtstyleindenter.h" #include #include #include @@ -74,3 +75,8 @@ QWidget *CppCodeStylePreferencesFactory::createEditor(TextEditor::IFallbackPrefe return widget; } +TextEditor::Indenter *CppCodeStylePreferencesFactory::createIndenter() const +{ + return new CppQtStyleIndenter(); +} + diff --git a/src/plugins/cpptools/cppcodestylesettingsfactory.h b/src/plugins/cpptools/cppcodestylesettingsfactory.h index 85c59d55ea..cf99ecac81 100644 --- a/src/plugins/cpptools/cppcodestylesettingsfactory.h +++ b/src/plugins/cpptools/cppcodestylesettingsfactory.h @@ -48,6 +48,7 @@ public: virtual QWidget *createEditor(TextEditor::IFallbackPreferences *settings, TextEditor::TabPreferences *tabSettings, QWidget *parent) const; + virtual TextEditor::Indenter *createIndenter() const; }; diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp index b811ddb88c..1cc5cab5ce 100644 --- a/src/plugins/cpptools/cpptoolsplugin.cpp +++ b/src/plugins/cpptools/cpptoolsplugin.cpp @@ -154,6 +154,12 @@ bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error) mcpptools->addAction(command); connect(switchAction, SIGNAL(triggered()), this, SLOT(switchHeaderSource())); + TextEditor::TextEditorSettings *ts = TextEditor::TextEditorSettings::instance(); + ts->registerMimeTypeForLanguageId(QLatin1String(Constants::C_SOURCE_MIMETYPE), Constants::CPP_SETTINGS_ID); + ts->registerMimeTypeForLanguageId(QLatin1String(Constants::C_HEADER_MIMETYPE), Constants::CPP_SETTINGS_ID); + ts->registerMimeTypeForLanguageId(QLatin1String(Constants::CPP_SOURCE_MIMETYPE), Constants::CPP_SETTINGS_ID); + ts->registerMimeTypeForLanguageId(QLatin1String(Constants::CPP_HEADER_MIMETYPE), Constants::CPP_SETTINGS_ID); + return true; } diff --git a/src/plugins/projectexplorer/projectfilewizardextension.cpp b/src/plugins/projectexplorer/projectfilewizardextension.cpp index 8982b803c4..adf6c0c191 100644 --- a/src/plugins/projectexplorer/projectfilewizardextension.cpp +++ b/src/plugins/projectexplorer/projectfilewizardextension.cpp @@ -45,7 +45,16 @@ #include #include #include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -53,6 +62,8 @@ #include #include #include +#include +#include /*! \class ProjectExplorer::Internal::ProjectFileWizardExtension @@ -408,7 +419,7 @@ void ProjectFileWizardExtension::initProjectChoices(const QString &generatedProj m_context->page->setProjectToolTips(projectToolTips); } -bool ProjectFileWizardExtension::process( +bool ProjectFileWizardExtension::processFiles( const QList &files, bool *removeOpenProjectAttribute, QString *errorMessage) { @@ -487,5 +498,69 @@ bool ProjectFileWizardExtension::processVersionControl(const QListeditorConfiguration()->tabPreferences(languageId); + return TextEditor::TextEditorSettings::instance()->tabPreferences(languageId); + } else if (project) { + return project->editorConfiguration()->tabPreferences(); + } + return TextEditor::TextEditorSettings::instance()->tabPreferences(); +} + +static TextEditor::IFallbackPreferences *codeStylePreferences(ProjectExplorer::Project *project, const QString &languageId) +{ + if (languageId.isEmpty()) + return 0; + + if (project) + return project->editorConfiguration()->codeStylePreferences(languageId); + + return TextEditor::TextEditorSettings::instance()->codeStylePreferences(languageId); +} + +void ProjectFileWizardExtension::applyCodeStyle(Core::GeneratedFile *file) const +{ + if (file->isBinary() || file->contents().isEmpty()) + return; // nothing to do + + const Core::MimeDatabase *mdb = Core::ICore::instance()->mimeDatabase(); + Core::MimeType mt = mdb->findByFile(QFileInfo(file->path())); + const QString languageId = TextEditor::TextEditorSettings::instance()->languageId(mt.type()); + + if (languageId.isEmpty()) + return; // don't modify files like *.ui *.pro + + ProjectNode *project = 0; + const int projectIndex = m_context->page->currentProjectIndex() - 1; + if (projectIndex >= 0 && projectIndex < m_context->projects.size()) + project = m_context->projects.at(projectIndex).node; + + ProjectExplorer::Project *baseProject + = ProjectExplorer::ProjectExplorerPlugin::instance()->session()->projectForNode(project); + + TextEditor::ICodeStylePreferencesFactory *factory + = TextEditor::CodeStylePreferencesManager::instance()->factory(languageId); + + TextEditor::Indenter *indenter = 0; + if (factory) + indenter = factory->createIndenter(); + if (!indenter) + indenter = new TextEditor::NormalIndenter(); + + TextEditor::TabPreferences *tabPrefs = tabPreferences(baseProject, languageId); + TextEditor::IFallbackPreferences *codeStylePrefs = codeStylePreferences(baseProject, languageId); + indenter->setCodeStylePreferences(codeStylePrefs); + + QTextDocument doc(file->contents()); + QTextCursor cursor(&doc); + cursor.select(QTextCursor::Document); + indenter->indent(&doc, cursor, QChar::Null, tabPrefs->currentSettings()); + file->setContents(doc.toPlainText()); + delete indenter; +} + } // namespace Internal } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectfilewizardextension.h b/src/plugins/projectexplorer/projectfilewizardextension.h index de67b9c54b..3118ae8dc0 100644 --- a/src/plugins/projectexplorer/projectfilewizardextension.h +++ b/src/plugins/projectexplorer/projectfilewizardextension.h @@ -49,8 +49,9 @@ public: ~ProjectFileWizardExtension(); QList extensionPages(const Core::IWizard *wizard); - bool process(const QList &files, + bool processFiles(const QList &files, bool *removeOpenProjectAttribute, QString *errorMessage); + void applyCodeStyle(Core::GeneratedFile *file) const; public slots: void firstExtensionPageShown(const QList &files); diff --git a/src/plugins/qmljstools/qmljscodestylesettingsfactory.cpp b/src/plugins/qmljstools/qmljscodestylesettingsfactory.cpp index 60a2a29f2d..5c2922e8fe 100644 --- a/src/plugins/qmljstools/qmljscodestylesettingsfactory.cpp +++ b/src/plugins/qmljstools/qmljscodestylesettingsfactory.cpp @@ -33,6 +33,7 @@ #include "qmljscodestylesettingsfactory.h" #include "qmljscodestylesettingspage.h" #include "qmljstoolsconstants.h" +#include "qmljsindenter.h" #include #include #include @@ -72,3 +73,8 @@ QWidget *QmlJSCodeStylePreferencesFactory::createEditor(TextEditor::IFallbackPre return widget; } +TextEditor::Indenter *QmlJSCodeStylePreferencesFactory::createIndenter() const +{ + return new QmlJSEditor::Internal::Indenter(); +} + diff --git a/src/plugins/qmljstools/qmljscodestylesettingsfactory.h b/src/plugins/qmljstools/qmljscodestylesettingsfactory.h index 7efba77933..ffbff1f8fb 100644 --- a/src/plugins/qmljstools/qmljscodestylesettingsfactory.h +++ b/src/plugins/qmljstools/qmljscodestylesettingsfactory.h @@ -48,6 +48,7 @@ public: virtual QWidget *createEditor(TextEditor::IFallbackPreferences *settings, TextEditor::TabPreferences *tabSettings, QWidget *parent) const; + virtual TextEditor::Indenter *createIndenter() const; }; diff --git a/src/plugins/qmljstools/qmljstoolsplugin.cpp b/src/plugins/qmljstools/qmljstoolsplugin.cpp index 2506bb859a..6b1beb87f5 100644 --- a/src/plugins/qmljstools/qmljstoolsplugin.cpp +++ b/src/plugins/qmljstools/qmljstoolsplugin.cpp @@ -126,6 +126,10 @@ bool QmlJSToolsPlugin::initialize(const QStringList &arguments, QString *error) connect(core->progressManager(), SIGNAL(allTasksFinished(QString)), this, SLOT(onAllTasksFinished(QString))); + TextEditor::TextEditorSettings *ts = TextEditor::TextEditorSettings::instance(); + ts->registerMimeTypeForLanguageId(QLatin1String(Constants::QML_MIMETYPE), Constants::QML_JS_SETTINGS_ID); + ts->registerMimeTypeForLanguageId(QLatin1String(Constants::JS_MIMETYPE), Constants::QML_JS_SETTINGS_ID); + return true; } diff --git a/src/plugins/texteditor/icodestylepreferencesfactory.h b/src/plugins/texteditor/icodestylepreferencesfactory.h index da5c35f134..6a06e9b160 100644 --- a/src/plugins/texteditor/icodestylepreferencesfactory.h +++ b/src/plugins/texteditor/icodestylepreferencesfactory.h @@ -41,6 +41,7 @@ namespace TextEditor { class IFallbackPreferences; class TabPreferences; +class Indenter; class TEXTEDITOR_EXPORT ICodeStylePreferencesFactory : public QObject { @@ -52,6 +53,7 @@ public: virtual QString displayName() = 0; virtual IFallbackPreferences *createPreferences(const QList &fallbacks) const = 0; virtual QWidget *createEditor(IFallbackPreferences *preferences, TabPreferences *tabSettings, QWidget *parent) const = 0; + virtual TextEditor::Indenter *createIndenter() const = 0; }; } // namespace TextEditor diff --git a/src/plugins/texteditor/texteditorsettings.cpp b/src/plugins/texteditor/texteditorsettings.cpp index 378dd5e95c..dad9708640 100644 --- a/src/plugins/texteditor/texteditorsettings.cpp +++ b/src/plugins/texteditor/texteditorsettings.cpp @@ -73,6 +73,8 @@ public: QMap m_languageTabPreferences; QMap m_languageCodeStylePreferences; + QMap m_mimeTypeToLanguage; + CompletionSettings m_completionSettings; void fontZoomRequested(int pointSize); @@ -343,4 +345,14 @@ void TextEditorSettings::registerLanguageCodeStylePreferences(const QString &lan m_d->m_languageCodeStylePreferences.insert(languageId, prefs); } +void TextEditorSettings::registerMimeTypeForLanguageId(const QString &mimeType, const QString &languageId) +{ + m_d->m_mimeTypeToLanguage.insert(mimeType, languageId); +} + +QString TextEditorSettings::languageId(const QString &mimeType) const +{ + return m_d->m_mimeTypeToLanguage.value(mimeType); +} + #include "moc_texteditorsettings.cpp" diff --git a/src/plugins/texteditor/texteditorsettings.h b/src/plugins/texteditor/texteditorsettings.h index 7385a0a820..cebea16818 100644 --- a/src/plugins/texteditor/texteditorsettings.h +++ b/src/plugins/texteditor/texteditorsettings.h @@ -96,6 +96,9 @@ public: QMap languageCodeStylePreferences() const; void registerLanguageCodeStylePreferences(const QString &languageId, IFallbackPreferences *prefs); + void registerMimeTypeForLanguageId(const QString &mimeType, const QString &languageId); + QString languageId(const QString &mimeType) const; + signals: void fontSettingsChanged(const TextEditor::FontSettings &); void storageSettingsChanged(const TextEditor::StorageSettings &); -- 2.11.0