diff --git a/src/plugins/designer/cpp/cpp.pri b/src/plugins/designer/cpp/cpp.pri index 3827bc836f818792f6a28b3b810ea6fcf5fe0d7e..a30a79402287dc3ed2584fe1b080e0d9811d073c 100644 --- a/src/plugins/designer/cpp/cpp.pri +++ b/src/plugins/designer/cpp/cpp.pri @@ -5,11 +5,14 @@ DEFINES+=CPP_ENABLED HEADERS+=$$PWD/formclasswizardpage.h \ $$PWD/formclasswizarddialog.h \ $$PWD/formclasswizard.h \ - $$PWD/formclasswizardparameters.h + $$PWD/formclasswizardparameters.h \ + $$PWD/cppsettingspage.h SOURCES+=$$PWD/formclasswizardpage.cpp \ $$PWD/formclasswizarddialog.cpp \ $$PWD/formclasswizard.cpp \ - $$PWD/formclasswizardparameters.cpp + $$PWD/formclasswizardparameters.cpp \ + $$PWD/cppsettingspage.cpp -FORMS+=$$PWD/formclasswizardpage.ui +FORMS+=$$PWD/formclasswizardpage.ui \ +$$PWD/cppsettingspagewidget.ui diff --git a/src/plugins/designer/cpp/cppsettingspage.cpp b/src/plugins/designer/cpp/cppsettingspage.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1486bd0ad207680e3c6e2732bef09a28dafdf54c --- /dev/null +++ b/src/plugins/designer/cpp/cppsettingspage.cpp @@ -0,0 +1,136 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "cppsettingspage.h" +#include "designerconstants.h" + +#include <QtCore/QCoreApplication> +#include <coreplugin/icore.h> + +namespace Designer { +namespace Internal { + +// ---------- CppSettingsPageWidget + +CppSettingsPageWidget::CppSettingsPageWidget(QWidget *parent) : + QWidget(parent) +{ + m_ui.setupUi(this); +} + +FormClassWizardGenerationParameters CppSettingsPageWidget::parameters() const +{ + FormClassWizardGenerationParameters rc; + rc.setEmbedding(static_cast<FormClassWizardGenerationParameters::UiClassEmbedding>(uiEmbedding())); + rc.setRetranslationSupport(m_ui.retranslateCheckBox->isChecked()); + rc.setIncludeQtModule(m_ui.includeQtModuleCheckBox->isChecked()); + return rc; +} + +void CppSettingsPageWidget::setParameters(const FormClassWizardGenerationParameters &p) +{ + m_ui.retranslateCheckBox->setChecked(p.retranslationSupport()); + m_ui.includeQtModuleCheckBox->setChecked(p.includeQtModule()); + setUiEmbedding(p.embedding()); +} + +int CppSettingsPageWidget::uiEmbedding() const +{ + if (m_ui.ptrAggregationRadioButton->isChecked()) + return FormClassWizardGenerationParameters::PointerAggregatedUiClass; + if (m_ui.aggregationButton->isChecked()) + return FormClassWizardGenerationParameters::AggregatedUiClass; + return FormClassWizardGenerationParameters::InheritedUiClass; +} + +void CppSettingsPageWidget::setUiEmbedding(int v) +{ + switch (v) { + case FormClassWizardGenerationParameters::PointerAggregatedUiClass: + m_ui.ptrAggregationRadioButton->setChecked(true); + break; + case FormClassWizardGenerationParameters::AggregatedUiClass: + m_ui.aggregationButton->setChecked(true); + break; + case FormClassWizardGenerationParameters::InheritedUiClass: + m_ui.multipleInheritanceButton->setChecked(true); + break; + } +} + +// ---------- CppSettingsPage +CppSettingsPage::CppSettingsPage(QObject *parent) : Core::IOptionsPage(parent) +{ + m_parameters.fromSettings(Core::ICore::instance()->settings()); +} + +QString CppSettingsPage::id() const +{ + return QLatin1String(Designer::Constants::SETTINGS_CPP_SETTINGS); +} + +QString CppSettingsPage::trName() const +{ + return QCoreApplication::translate("Designer", Designer::Constants::SETTINGS_CPP_SETTINGS); +} + +QString CppSettingsPage::category() const +{ + return QLatin1String(Designer::Constants::SETTINGS_CATEGORY); +} + +QString CppSettingsPage::trCategory() const +{ + return QCoreApplication::translate("Designer", Designer::Constants::SETTINGS_CATEGORY); +} + +QWidget *CppSettingsPage::createPage(QWidget *parent) +{ + m_widget = new CppSettingsPageWidget(parent); + m_widget->setParameters(m_parameters); + return m_widget; +} + +void CppSettingsPage::apply() +{ + if (m_widget) { + const FormClassWizardGenerationParameters newParameters = m_widget->parameters(); + if (newParameters != m_parameters) { + m_parameters = newParameters; + m_parameters.toSettings(Core::ICore::instance()->settings()); + } + } +} + +void CppSettingsPage::finish() +{ +} + +} // namespace Internal +} // namespace Designer diff --git a/src/plugins/designer/cpp/cppsettingspage.h b/src/plugins/designer/cpp/cppsettingspage.h new file mode 100644 index 0000000000000000000000000000000000000000..bb52a8336340ef5e0211d22c500e24936a0a3a95 --- /dev/null +++ b/src/plugins/designer/cpp/cppsettingspage.h @@ -0,0 +1,81 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef CPPSETTINGSPAGE_H +#define CPPSETTINGSPAGE_H + +#include "formclasswizardparameters.h" +#include "ui_cppsettingspagewidget.h" + +#include <coreplugin/dialogs/ioptionspage.h> + +#include <QtCore/QPointer> + +namespace Designer { +namespace Internal { + +class CppSettingsPageWidget : public QWidget +{ + Q_OBJECT +public: + explicit CppSettingsPageWidget(QWidget *parent = 0); + + FormClassWizardGenerationParameters parameters() const; + void setParameters(const FormClassWizardGenerationParameters &p); + +private: + int uiEmbedding() const; + void setUiEmbedding(int); + + Ui::CppSettingsPageWidget m_ui; +}; + +class CppSettingsPage : public Core::IOptionsPage +{ +public: + explicit CppSettingsPage(QObject *parent = 0); + + virtual QString id() const; + virtual QString trName() const; + virtual QString category() const; + virtual QString trCategory() const; + + virtual QWidget *createPage(QWidget *parent); + virtual void apply(); + virtual void finish(); + +private: + QPointer<CppSettingsPageWidget> m_widget; + FormClassWizardGenerationParameters m_parameters; +}; + +} // namespace Internal +} // namespace Designer + +#endif // CPPSETTINGSPAGE_H diff --git a/src/plugins/designer/cpp/cppsettingspagewidget.ui b/src/plugins/designer/cpp/cppsettingspagewidget.ui new file mode 100644 index 0000000000000000000000000000000000000000..8a34601df91bb7b3097e3f98c59bfce4cf8a6d05 --- /dev/null +++ b/src/plugins/designer/cpp/cppsettingspagewidget.ui @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Designer::Internal::CppSettingsPageWidget</class> + <widget class="QWidget" name="Designer::Internal::CppSettingsPageWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>526</width> + <height>369</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="QGroupBox" name="uiclassGroupBox"> + <property name="title"> + <string>Embedding of the UI Class</string> + </property> + <property name="checkable"> + <bool>false</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QRadioButton" name="ptrAggregationRadioButton"> + <property name="text"> + <string>Aggregation as a pointer member</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="aggregationButton"> + <property name="text"> + <string>Aggregation</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="multipleInheritanceButton"> + <property name="text"> + <string>Multiple Inheritance</string> + </property> + </widget> + </item> + </layout> + <zorder>aggregationButton</zorder> + <zorder>multipleInheritanceButton</zorder> + <zorder>ptrAggregationRadioButton</zorder> + </widget> + </item> + <item> + <widget class="QGroupBox" name="codeGenerationGroupBox"> + <property name="title"> + <string>Code Generation</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QCheckBox" name="retranslateCheckBox"> + <property name="text"> + <string>Support for changing languages at runtime</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="includeQtModuleCheckBox"> + <property name="text"> + <string>Include Qt module name</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>169</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/plugins/designer/cpp/formclasswizard.cpp b/src/plugins/designer/cpp/formclasswizard.cpp index 28e767ee9bde3136281bc5ef1489e96237816ff3..3cbb42f5ae1063d3829eb1239315187d8d0b5d50 100644 --- a/src/plugins/designer/cpp/formclasswizard.cpp +++ b/src/plugins/designer/cpp/formclasswizard.cpp @@ -87,17 +87,17 @@ QWizard *FormClassWizard::createWizardDialog(QWidget *parent, Core::GeneratedFiles FormClassWizard::generateFiles(const QWizard *w, QString *errorMessage) const { const FormClassWizardDialog *wizardDialog = qobject_cast<const FormClassWizardDialog *>(w); - const FormClassWizardParameters params = wizardDialog->parameters(); + const Designer::FormClassWizardParameters params = wizardDialog->parameters(); - if (params.uiTemplate.isEmpty()) { + if (params.uiTemplate().isEmpty()) { *errorMessage = QLatin1String("Internal error: FormClassWizard::generateFiles: empty template contents"); return Core::GeneratedFiles(); } // header - const QString formFileName = buildFileName(params.path, params.uiFile, formSuffix()); - const QString headerFileName = buildFileName(params.path, params.headerFile, headerSuffix()); - const QString sourceFileName = buildFileName(params.path, params.sourceFile, sourceSuffix()); + const QString formFileName = buildFileName(params.path(), params.uiFile(), formSuffix()); + const QString headerFileName = buildFileName(params.path(), params.headerFile(), headerSuffix()); + const QString sourceFileName = buildFileName(params.path(), params.sourceFile(), sourceSuffix()); Core::GeneratedFile headerFile(headerFileName); headerFile.setEditorKind(QLatin1String(CppEditor::Constants::CPPEDITOR_KIND)); @@ -108,11 +108,13 @@ Core::GeneratedFiles FormClassWizard::generateFiles(const QWizard *w, QString *e // UI Core::GeneratedFile uiFile(formFileName); - uiFile.setContents(params.uiTemplate); + uiFile.setContents(params.uiTemplate()); uiFile.setEditorKind(QLatin1String(Constants::C_FORMEDITOR)); QString source, header; - params.generateCpp(&header, &source); + Designer::FormClassWizardGenerationParameters generationParameters; + generationParameters.fromSettings(Core::ICore::instance()->settings()); + params.generateCpp(generationParameters, &header, &source); sourceFile.setContents(source); headerFile.setContents(header); diff --git a/src/plugins/designer/cpp/formclasswizarddialog.cpp b/src/plugins/designer/cpp/formclasswizarddialog.cpp index f1b95e172975c2eed988cb13d1819663179a2f19..191200b9e3f654c4380fc2f419c3c085e2c3fe2c 100644 --- a/src/plugins/designer/cpp/formclasswizarddialog.cpp +++ b/src/plugins/designer/cpp/formclasswizarddialog.cpp @@ -98,7 +98,7 @@ FormClassWizardParameters FormClassWizardDialog::parameters() const FormClassWizardParameters rc; m_classPage->getParameters(&rc); // Name the ui class in the Ui namespace after the class specified - rc.uiTemplate = FormTemplateWizardPage::changeUiClassName(m_rawFormTemplate, rc.className); + rc.setUiTemplate(FormTemplateWizardPage::changeUiClassName(m_rawFormTemplate, rc.className())); return rc; } diff --git a/src/plugins/designer/cpp/formclasswizarddialog.h b/src/plugins/designer/cpp/formclasswizarddialog.h index bcbe8e9885fe49bbea22f91d26b2e1ec56f1f911..c6522de3abb1d56556253779b43ba5efe2490bfb 100644 --- a/src/plugins/designer/cpp/formclasswizarddialog.h +++ b/src/plugins/designer/cpp/formclasswizarddialog.h @@ -37,9 +37,12 @@ namespace Core { } namespace Designer { -namespace Internal { struct FormClassWizardParameters; + +namespace Internal { + + class FormClassWizardPage; class FormTemplateWizardPage; @@ -56,7 +59,7 @@ public: QString path() const; - FormClassWizardParameters parameters() const; + Designer::FormClassWizardParameters parameters() const; bool validateCurrentPage(); diff --git a/src/plugins/designer/cpp/formclasswizardpage.cpp b/src/plugins/designer/cpp/formclasswizardpage.cpp index 9697ed33a0e7fd1d90cec6ae1e901677c1f902d6..86284a6ee8669be996f1fdc500f40b25ac0f8d67 100644 --- a/src/plugins/designer/cpp/formclasswizardpage.cpp +++ b/src/plugins/designer/cpp/formclasswizardpage.cpp @@ -43,10 +43,6 @@ #include <QtGui/QAbstractButton> #include <QtGui/QMessageBox> -static const char *formClassWizardPageGroupC = "FormClassWizardPage"; -static const char *translationKeyC = "RetranslationSupport"; -static const char *embeddingModeKeyC = "Embedding"; - namespace Designer { namespace Internal { @@ -64,13 +60,7 @@ FormClassWizardPage::FormClassWizardPage(QWidget * parent) : m_ui->newClassWidget->setAllowDirectories(true); connect(m_ui->newClassWidget, SIGNAL(validChanged()), this, SLOT(slotValidChanged())); - - m_ui->extensionWidget->setVisible(false); - connect(m_ui->moreButton, SIGNAL(clicked(bool)), m_ui->extensionWidget, SLOT(setVisible(bool))); - connect(m_ui->settingsToolButton, SIGNAL(clicked()), this, SLOT(slotSettings())); - - restoreSettings(); } FormClassWizardPage::~FormClassWizardPage() @@ -79,13 +69,13 @@ FormClassWizardPage::~FormClassWizardPage() } // Retrieve settings of CppTools plugin. -static inline bool lowerCaseFiles(const Core::ICore *core) +static bool inline lowerCaseFiles(const Core::ICore *core) { - QString camelCaseSettingsKey = QLatin1String(CppTools::Constants::CPPTOOLS_SETTINGSGROUP); - camelCaseSettingsKey += QLatin1Char('/'); - camelCaseSettingsKey += QLatin1String(CppTools::Constants::LOWERCASE_CPPFILES_KEY); + QString lowerCaseSettingsKey = QLatin1String(CppTools::Constants::CPPTOOLS_SETTINGSGROUP); + lowerCaseSettingsKey += QLatin1Char('/'); + lowerCaseSettingsKey += QLatin1String(CppTools::Constants::LOWERCASE_CPPFILES_KEY); - return core->settings()->value(camelCaseSettingsKey, QVariant(false)).toBool(); + return core->settings()->value(lowerCaseSettingsKey, QVariant(false)).toBool(); } // Set up new class widget from settings @@ -115,40 +105,6 @@ void FormClassWizardPage::setClassName(const QString &suggestedClassName) slotValidChanged(); } -int FormClassWizardPage::uiClassEmbedding() const -{ - if (m_ui->ptrAggregationRadioButton->isChecked()) - return PointerAggregatedUiClass; - if (m_ui->aggregationButton->isChecked()) - return AggregatedUiClass; - return InheritedUiClass; -} - -void FormClassWizardPage::setUiClassEmbedding(int v) -{ - switch (v) { - case PointerAggregatedUiClass: - m_ui->ptrAggregationRadioButton->setChecked(true); - break; - case AggregatedUiClass: - m_ui->aggregationButton->setChecked(true); - break; - case InheritedUiClass: - m_ui->multipleInheritanceButton->setChecked(true); - break; - } -} - -bool FormClassWizardPage::hasRetranslationSupport() const -{ - return m_ui->retranslateCheckBox->isChecked(); -} - -void FormClassWizardPage::setRetranslationSupport(bool v) -{ - m_ui->retranslateCheckBox->setChecked(v); -} - QString FormClassWizardPage::path() const { return m_ui->newClassWidget->path(); @@ -161,13 +117,11 @@ void FormClassWizardPage::setPath(const QString &p) void FormClassWizardPage::getParameters(FormClassWizardParameters *p) const { - p->embedding = static_cast<UiClassEmbedding>(uiClassEmbedding()); - p->languageChange = m_ui->retranslateCheckBox->isChecked(); - p->className = m_ui->newClassWidget->className(); - p->path = path(); - p->sourceFile = m_ui->newClassWidget->sourceFileName(); - p->headerFile = m_ui->newClassWidget->headerFileName(); - p->uiFile = m_ui->newClassWidget-> formFileName(); + p->setClassName(m_ui->newClassWidget->className()); + p->setPath(path()); + p->setSourceFile(m_ui->newClassWidget->sourceFileName()); + p->setHeaderFile(m_ui->newClassWidget->headerFileName()); + p->setUiFile(m_ui->newClassWidget-> formFileName()); } void FormClassWizardPage::slotValidChanged() @@ -188,47 +142,11 @@ bool FormClassWizardPage::validatePage() { QString errorMessage; const bool rc = m_ui->newClassWidget->isValid(&errorMessage); - if (rc) { - saveSettings(); - } else { + if (!rc) { QMessageBox::critical(this, tr("%1 - Error").arg(title()), errorMessage); } return rc; } -void FormClassWizardPage::saveSettings() -{ - Core::ICore *core = Core::ICore::instance(); - if (QSettings *settings = core->settings()) { - settings->beginGroup(QLatin1String(formClassWizardPageGroupC)); - settings->setValue(QLatin1String(translationKeyC), hasRetranslationSupport()); - settings->setValue(QLatin1String(embeddingModeKeyC), uiClassEmbedding()); - settings->endGroup(); - } -} - -void FormClassWizardPage::restoreSettings() -{ - bool retranslationSupport = true; - int embedding = PointerAggregatedUiClass; - - Core::ICore *core = Core::ICore::instance(); - if (QSettings *settings = core->settings()) { - - QString key = QLatin1String(formClassWizardPageGroupC); - key += QLatin1Char('/'); - const int groupLength = key.size(); - - key += QLatin1String(translationKeyC); - retranslationSupport = settings->value(key, retranslationSupport).toBool(); - - key.truncate(groupLength); - key += QLatin1String(embeddingModeKeyC); - embedding = settings->value(key, embedding).toInt(); - } - setUiClassEmbedding(embedding); - setRetranslationSupport(retranslationSupport); -} - } // namespace Internal } // namespace Designer diff --git a/src/plugins/designer/cpp/formclasswizardpage.h b/src/plugins/designer/cpp/formclasswizardpage.h index 72214604275bec893a2643f6af67b8723b0625f1..d335d953665ce3eeccd0fdb0751b6ffae0a3e927 100644 --- a/src/plugins/designer/cpp/formclasswizardpage.h +++ b/src/plugins/designer/cpp/formclasswizardpage.h @@ -33,13 +33,16 @@ #include <QtGui/QWizardPage> namespace Designer { + +struct FormClassWizardParameters; +struct FormClassWizardGenerationParameters; + namespace Internal { namespace Ui { class FormClassWizardPage; } -struct FormClassWizardParameters; class FormClassWizardPage : public QWizardPage { @@ -52,18 +55,17 @@ public: virtual bool isComplete () const; virtual bool validatePage(); - int uiClassEmbedding() const; - bool hasRetranslationSupport() const; QString path() const; // Fill out applicable parameters - void getParameters(FormClassWizardParameters *) const; + void getParameters(FormClassWizardParameters *) const; + + FormClassWizardGenerationParameters generationParameters() const; + void setGenerationParameters(const FormClassWizardGenerationParameters &gp); public slots: void setClassName(const QString &suggestedClassName); void setPath(const QString &); - void setRetranslationSupport(bool); - void setUiClassEmbedding(int v); void slotSettings(); private slots: @@ -71,8 +73,6 @@ private slots: private: void initParameters(); - void saveSettings(); - void restoreSettings(); Ui::FormClassWizardPage *m_ui; bool m_isValid; diff --git a/src/plugins/designer/cpp/formclasswizardpage.ui b/src/plugins/designer/cpp/formclasswizardpage.ui index 9a2849ad0a0097f870a0d24ae9d7199e0dcf3242..6381b45fd0b62cc4703b592ccce43eee7925bd96 100644 --- a/src/plugins/designer/cpp/formclasswizardpage.ui +++ b/src/plugins/designer/cpp/formclasswizardpage.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>552</width> - <height>498</height> + <width>542</width> + <height>267</height> </rect> </property> <property name="title"> @@ -21,7 +21,7 @@ </property> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> - <widget class="Core::Utils::NewClassWidget" name="newClassWidget" native="true"/> + <widget class="Core::Utils::NewClassWidget" name="newClassWidget"/> </item> </layout> </widget> @@ -48,114 +48,8 @@ </property> </widget> </item> - <item> - <widget class="QToolButton" name="moreButton"> - <property name="text"> - <string>More</string> - </property> - <property name="checkable"> - <bool>true</bool> - </property> - </widget> - </item> </layout> </item> - <item row="1" column="0"> - <widget class="QWidget" name="extensionWidget" native="true"> - <layout class="QVBoxLayout" name="verticalLayout_5"> - <property name="margin"> - <number>0</number> - </property> - <item> - <widget class="QGroupBox" name="uiclassGroupBox"> - <property name="title"> - <string>Embedding of the UI class</string> - </property> - <property name="checkable"> - <bool>false</bool> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <widget class="QRadioButton" name="ptrAggregationRadioButton"> - <property name="text"> - <string>Aggregation as a pointer member</string> - </property> - <attribute name="buttonGroup"> - <string notr="true">buttonGroup</string> - </attribute> - </widget> - </item> - <item> - <widget class="QRadioButton" name="aggregationButton"> - <property name="text"> - <string>Aggregation</string> - </property> - <attribute name="buttonGroup"> - <string notr="true">buttonGroup</string> - </attribute> - </widget> - </item> - <item> - <widget class="QRadioButton" name="multipleInheritanceButton"> - <property name="text"> - <string>Multiple Inheritance</string> - </property> - <attribute name="buttonGroup"> - <string notr="true">buttonGroup</string> - </attribute> - </widget> - </item> - </layout> - <zorder>aggregationButton</zorder> - <zorder>multipleInheritanceButton</zorder> - <zorder>ptrAggregationRadioButton</zorder> - </widget> - </item> - <item> - <widget class="QGroupBox" name="variousGroupBox"> - <property name="title"> - <string/> - </property> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <item> - <widget class="QCheckBox" name="retranslateCheckBox"> - <property name="text"> - <string>Support for changing languages at runtime</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item> - <spacer name="verticalSpacer_3"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>57</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item row="1" column="1"> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> </layout> </widget> <customwidgets> diff --git a/src/plugins/designer/cpp/formclasswizardparameters.cpp b/src/plugins/designer/cpp/formclasswizardparameters.cpp index b9a88e4a2c90a27a532b82e5ef032a2ae32de188..4f0881d9481f51bf7374f16de55356a55dcb0bab 100644 --- a/src/plugins/designer/cpp/formclasswizardparameters.cpp +++ b/src/plugins/designer/cpp/formclasswizardparameters.cpp @@ -34,32 +34,298 @@ #include <cpptools/cppmodelmanagerinterface.h> #include <QtCore/QTextStream> +#include <QtCore/QSettings> #include <QtCore/QFileInfo> #include <QtCore/QDebug> +#include <QtCore/QSharedData> static const char *uiMemberC = "m_ui"; static const char *uiNamespaceC = "Ui"; +static const char *formClassWizardPageGroupC = "FormClassWizardPage"; +static const char *translationKeyC = "RetranslationSupport"; +static const char *embeddingModeKeyC = "Embedding"; + +// TODO: These 2 are general coding convention settings and +// should go to CppTools... +static const char *includeQtModuleKeyC = "IncludeQtModule"; +static const char *indentNamespaceKeyC = "IndentNamespace"; + namespace Designer { -namespace Internal { + +class FormClassWizardGenerationParametersPrivate : public QSharedData +{ +public: + FormClassWizardGenerationParametersPrivate(); + void fromSettings(const QSettings *); + void toSettings(QSettings *) const; + bool equals(const FormClassWizardGenerationParametersPrivate &rhs) const; + + FormClassWizardGenerationParameters::UiClassEmbedding embedding; + bool retranslationSupport; // Add handling for language change events + bool includeQtModule; // Include "<QtGui/[Class]>" or just "<[Class]>" + bool indentNamespace; +}; + +FormClassWizardGenerationParametersPrivate::FormClassWizardGenerationParametersPrivate() : + embedding(FormClassWizardGenerationParameters::PointerAggregatedUiClass), + retranslationSupport(true), + includeQtModule(false), + indentNamespace(false) +{ +} + +void FormClassWizardGenerationParametersPrivate::fromSettings(const QSettings *settings) +{ + QString key = QLatin1String(formClassWizardPageGroupC); + key += QLatin1Char('/'); + const int groupLength = key.size(); + + key += QLatin1String(translationKeyC); + retranslationSupport = settings->value(key, true).toBool(); + + key.truncate(groupLength); + key += QLatin1String(embeddingModeKeyC); + embedding = static_cast<FormClassWizardGenerationParameters::UiClassEmbedding>(settings->value(key, int(FormClassWizardGenerationParameters::PointerAggregatedUiClass)).toInt()); + + key.truncate(groupLength); + key += QLatin1String(includeQtModuleKeyC); + includeQtModule = settings->value(key, false).toBool(); + + key.truncate(groupLength); + key += QLatin1String(indentNamespaceKeyC); + indentNamespace = settings->value(key, false).toBool(); +} + +void FormClassWizardGenerationParametersPrivate::toSettings(QSettings *settings) const +{ + settings->beginGroup(QLatin1String(formClassWizardPageGroupC)); + settings->setValue(QLatin1String(translationKeyC), retranslationSupport); + settings->setValue(QLatin1String(embeddingModeKeyC), embedding); + settings->setValue(QLatin1String(includeQtModuleKeyC), includeQtModule); + settings->setValue(QLatin1String(indentNamespaceKeyC), indentNamespace); + settings->endGroup(); +} + +bool FormClassWizardGenerationParametersPrivate::equals(const FormClassWizardGenerationParametersPrivate &rhs) const +{ + return embedding == rhs.embedding && retranslationSupport == rhs.retranslationSupport + && includeQtModule == rhs.includeQtModule && indentNamespace == rhs.indentNamespace; +} + +FormClassWizardGenerationParameters::FormClassWizardGenerationParameters() : + m_d(new FormClassWizardGenerationParametersPrivate) +{ +} + +FormClassWizardGenerationParameters::~FormClassWizardGenerationParameters() +{ +} + +FormClassWizardGenerationParameters::FormClassWizardGenerationParameters(const FormClassWizardGenerationParameters &rhs) : + m_d(rhs.m_d) +{ +} + +FormClassWizardGenerationParameters &FormClassWizardGenerationParameters::operator=(const FormClassWizardGenerationParameters &rhs) +{ + if (this != &rhs) + m_d.operator=(rhs.m_d); + return *this; +} + +bool FormClassWizardGenerationParameters::equals(const FormClassWizardGenerationParameters &rhs) const +{ + return m_d->equals(*rhs.m_d.constData()); +} + +FormClassWizardGenerationParameters::UiClassEmbedding FormClassWizardGenerationParameters::embedding() const +{ + return m_d->embedding; +} + +void FormClassWizardGenerationParameters::setEmbedding(UiClassEmbedding e) +{ + m_d->embedding = e; +} + +bool FormClassWizardGenerationParameters::retranslationSupport() const +{ + return m_d->retranslationSupport; +} + +void FormClassWizardGenerationParameters::setRetranslationSupport(bool v) +{ + m_d->retranslationSupport = v; +} + +bool FormClassWizardGenerationParameters::includeQtModule() const +{ + return m_d->includeQtModule; +} + +void FormClassWizardGenerationParameters::setIncludeQtModule(bool v) +{ + m_d->includeQtModule = v; +} + +bool FormClassWizardGenerationParameters::indentNamespace() const +{ + return m_d->indentNamespace; +} + +void FormClassWizardGenerationParameters::setIndentNamespace(bool v) +{ + m_d->indentNamespace = v; +} + +void FormClassWizardGenerationParameters::fromSettings(const QSettings *settings) +{ + m_d->fromSettings(settings); +} + +void FormClassWizardGenerationParameters::toSettings(QSettings *settings) const +{ + m_d->toSettings(settings); +} + +// ----------- + +class FormClassWizardParametersPrivate : public QSharedData { +public: + bool generateCpp(const FormClassWizardGenerationParameters &fgp, + QString *header, QString *source, int indentation) const; + + QString uiTemplate; + QString className; + + QString path; + QString sourceFile; + QString headerFile; + QString uiFile; +}; FormClassWizardParameters::FormClassWizardParameters() : - embedding(PointerAggregatedUiClass), - languageChange(true) + m_d(new FormClassWizardParametersPrivate) { } -bool FormClassWizardParameters::generateCpp(QString *header, QString *source, int indentation) const +FormClassWizardParameters::~FormClassWizardParameters() { - const QString indent = QString(indentation, QLatin1Char(' ')); +} + +FormClassWizardParameters::FormClassWizardParameters(const FormClassWizardParameters &rhs) : + m_d(rhs.m_d) +{ +} + +FormClassWizardParameters &FormClassWizardParameters::operator=(const FormClassWizardParameters &rhs) +{ + if (this != &rhs) + m_d.operator =(rhs.m_d); + return *this; +} + +QString FormClassWizardParameters::uiTemplate() const +{ + return m_d->uiTemplate; +} + +void FormClassWizardParameters::setUiTemplate(const QString &s) +{ + m_d->uiTemplate = s; +} + +QString FormClassWizardParameters::className() const +{ + return m_d->className; +} + +void FormClassWizardParameters::setClassName(const QString &s) +{ + m_d->className = s; +} + +QString FormClassWizardParameters::path() const +{ + return m_d->path; +} + +void FormClassWizardParameters::setPath(const QString &s) +{ + m_d->path = s; +} + + +QString FormClassWizardParameters::sourceFile() const +{ + return m_d->sourceFile; +} + +void FormClassWizardParameters::setSourceFile(const QString &s) +{ + m_d->sourceFile = s; +} + +QString FormClassWizardParameters::headerFile() const +{ + return m_d->headerFile; +} + +void FormClassWizardParameters::setHeaderFile(const QString &s) +{ + m_d->headerFile = s; +} + + +QString FormClassWizardParameters::uiFile() const +{ + return m_d->uiFile; +} + +void FormClassWizardParameters::setUiFile(const QString &s) +{ + m_d->uiFile = s; +} + +bool FormClassWizardParameters::getUIXmlData(const QString &uiXml, QString *formBaseClass, QString *uiClassName) +{ + return Designer::Internal::FormTemplateWizardPage::getUIXmlData(uiXml, formBaseClass, uiClassName); +} + +QString FormClassWizardParameters::changeUiClassName(const QString &uiXml, const QString &newUiClassName) +{ + return Designer::Internal::FormTemplateWizardPage::changeUiClassName(uiXml, newUiClassName); +} + +// Write out how to access the Ui class in the source code. +static inline void writeUiMemberAccess(const FormClassWizardGenerationParameters &fp, QTextStream &str) +{ + switch(fp.embedding()) { + case FormClassWizardGenerationParameters::PointerAggregatedUiClass: + str << uiMemberC << "->"; + break; + case FormClassWizardGenerationParameters::AggregatedUiClass: + str << uiMemberC << '.'; + break; + case FormClassWizardGenerationParameters::InheritedUiClass: + break; + } +} + +bool FormClassWizardParametersPrivate::generateCpp(const FormClassWizardGenerationParameters &generationParameters, + QString *header, QString *source, int indentation) const +{ + const QString indent = QString(indentation, QLatin1Char(' ')); QString formBaseClass; QString uiClassName; - if (!FormTemplateWizardPage::getUIXmlData(uiTemplate, &formBaseClass, &uiClassName)) { + if (!FormClassWizardParameters::getUIXmlData(uiTemplate, &formBaseClass, &uiClassName)) { qWarning("Unable to determine the form base class from %s.", uiTemplate.toUtf8().constData()); return false; } // Build the ui class (Ui::Foo) name relative to the namespace (which is the same): + const FormClassWizardGenerationParameters::UiClassEmbedding embedding = generationParameters.embedding(); const QString colonColon = QLatin1String("::"); const int lastSeparator = uiClassName.lastIndexOf(colonColon); if (lastSeparator != -1) @@ -87,88 +353,89 @@ bool FormClassWizardParameters::generateCpp(QString *header, QString *source, in << "\n#define " << guard << '\n' << '\n'; // Include 'ui_' - if (embedding != PointerAggregatedUiClass) { + if (embedding != FormClassWizardGenerationParameters::PointerAggregatedUiClass) { Core::Utils::writeIncludeFileDirective(uiInclude, false, headerStr); } else { // Todo: Can we obtain the header from the code model for custom widgets? // Alternatively, from Designer. if (formBaseClass.startsWith(QLatin1Char('Q'))) { - QString baseInclude = QLatin1String("QtGui/"); - baseInclude += formBaseClass; + QString baseInclude = formBaseClass; + if (generationParameters.includeQtModule()) + baseInclude.insert(0, QLatin1String("QtGui/")); Core::Utils::writeIncludeFileDirective(baseInclude, true, headerStr); } } - const QString namespaceIndent = Core::Utils::writeOpeningNameSpaces(namespaceList, indent, headerStr); + const QString namespaceIndent = Core::Utils::writeOpeningNameSpaces(namespaceList, + generationParameters.indentNamespace() ? indent : QString(), + headerStr); // Forward-declare the UI class - if (embedding == PointerAggregatedUiClass) { + if (embedding == FormClassWizardGenerationParameters::PointerAggregatedUiClass) { headerStr << '\n' << namespaceIndent << "namespace " << uiNamespaceC << " {\n" - << namespaceIndent << indent << "class " << FormTemplateWizardPage::stripNamespaces(uiClassName) << ";\n" + << namespaceIndent << indent << "class " << Internal::FormTemplateWizardPage::stripNamespaces(uiClassName) << ";\n" << namespaceIndent << "}\n"; } // Class declaration headerStr << '\n' << namespaceIndent << "class " << unqualifiedClassName << " : public " << formBaseClass; - if (embedding == InheritedUiClass) { + if (embedding == FormClassWizardGenerationParameters::InheritedUiClass) { headerStr << ", private " << uiClassName; } headerStr << " {\n" << namespaceIndent << indent << "Q_OBJECT\n" << namespaceIndent << "public:\n" << namespaceIndent << indent << unqualifiedClassName << "(QWidget *parent = 0);\n"; - if (embedding == PointerAggregatedUiClass) + if (embedding == FormClassWizardGenerationParameters::PointerAggregatedUiClass) headerStr << namespaceIndent << indent << "~" << unqualifiedClassName << "();\n"; // retranslation - if (languageChange) + if (generationParameters.retranslationSupport()) headerStr << '\n' << namespaceIndent << "protected:\n" << namespaceIndent << indent << "void changeEvent(QEvent *e);\n"; // Member variable - if (embedding != InheritedUiClass) { + if (embedding != FormClassWizardGenerationParameters::InheritedUiClass) { headerStr << '\n' << namespaceIndent << "private:\n" << namespaceIndent << indent << uiClassName << ' '; - if (embedding == PointerAggregatedUiClass) + if (embedding == FormClassWizardGenerationParameters::PointerAggregatedUiClass) headerStr << '*'; headerStr << uiMemberC << ";\n"; } headerStr << namespaceIndent << "};\n\n"; - Core::Utils::writeClosingNameSpaces(namespaceList, indent, headerStr); + Core::Utils::writeClosingNameSpaces(namespaceList, generationParameters.indentNamespace() ? indent : QString(), headerStr); headerStr << "#endif // "<< guard << '\n'; // 2) Source file QTextStream sourceStr(source); sourceStr << license; Core::Utils::writeIncludeFileDirective(headerFile, false, sourceStr); - if (embedding == PointerAggregatedUiClass) + if (embedding == FormClassWizardGenerationParameters::PointerAggregatedUiClass) Core::Utils::writeIncludeFileDirective(uiInclude, false, sourceStr); // NameSpaces( - Core::Utils::writeOpeningNameSpaces(namespaceList, indent, sourceStr); + Core::Utils::writeOpeningNameSpaces(namespaceList, generationParameters.indentNamespace() ? indent : QString(), sourceStr); // Constructor with setupUi sourceStr << '\n' << namespaceIndent << unqualifiedClassName << "::" << unqualifiedClassName << "(QWidget *parent) :\n" << namespaceIndent << indent << formBaseClass << "(parent)"; - if (embedding == PointerAggregatedUiClass) + if (embedding == FormClassWizardGenerationParameters::PointerAggregatedUiClass) sourceStr << ",\n" << namespaceIndent << indent << uiMemberC << "(new " << uiClassName << ")\n"; sourceStr << namespaceIndent << "{\n" << namespaceIndent << indent; - if (embedding != InheritedUiClass) - sourceStr << uiMemberC << (embedding == PointerAggregatedUiClass ? "->" : "."); - sourceStr << "setupUi(this);\n" << namespaceIndent << "}\n"; + writeUiMemberAccess(generationParameters, sourceStr); + sourceStr << "setupUi(this);\n" << namespaceIndent << "}\n"; // Deleting destructor for ptr - if (embedding == PointerAggregatedUiClass) { + if (embedding == FormClassWizardGenerationParameters::PointerAggregatedUiClass) { sourceStr << '\n' << namespaceIndent << unqualifiedClassName << "::~" << unqualifiedClassName << "()\n" << namespaceIndent << "{\n" << namespaceIndent << indent << "delete " << uiMemberC << ";\n" << namespaceIndent << "}\n"; } // retranslation - if (languageChange) { + if (generationParameters.retranslationSupport()) { sourceStr << '\n' << namespaceIndent << "void " << unqualifiedClassName << "::" << "changeEvent(QEvent *e)\n" << namespaceIndent << "{\n" << namespaceIndent << indent << formBaseClass << "::changeEvent(e);\n" << namespaceIndent << indent << "switch (e->type()) {\n" << namespaceIndent << indent << "case QEvent::LanguageChange:\n" << namespaceIndent << indent << indent; - if (embedding != InheritedUiClass) - sourceStr << uiMemberC << (embedding == PointerAggregatedUiClass ? "->" : "."); + writeUiMemberAccess(generationParameters, sourceStr); sourceStr << "retranslateUi(this);\n" << namespaceIndent << indent << indent << "break;\n" << namespaceIndent << indent << "default:\n" @@ -176,9 +443,15 @@ bool FormClassWizardParameters::generateCpp(QString *header, QString *source, in << namespaceIndent << indent << "}\n" << namespaceIndent << "}\n"; } - Core::Utils::writeClosingNameSpaces(namespaceList, indent, sourceStr); + Core::Utils::writeClosingNameSpaces(namespaceList, generationParameters.indentNamespace() ? indent : QString(), sourceStr); return true; } -} // namespace Internal +bool FormClassWizardParameters::generateCpp(const FormClassWizardGenerationParameters &fgp, + QString *header, QString *source, int indentation) const +{ + return m_d->generateCpp(fgp, header, source, indentation); +} + + } // namespace Designer diff --git a/src/plugins/designer/cpp/formclasswizardparameters.h b/src/plugins/designer/cpp/formclasswizardparameters.h index 15c95253272174781ece9ee10f9bb3a696c738a8..6a5c65ac06038f141c3504d9dbb5a3e43b3fb254 100644 --- a/src/plugins/designer/cpp/formclasswizardparameters.h +++ b/src/plugins/designer/cpp/formclasswizardparameters.h @@ -30,35 +30,99 @@ #ifndef FORMCLASSWIZARDPARAMETERS_H #define FORMCLASSWIZARDPARAMETERS_H +#include "../designer_export.h" #include <QtCore/QString> +#include <QtCore/QSharedDataPointer> + +QT_BEGIN_NAMESPACE +class QSettings; +QT_END_NAMESPACE namespace Designer { -namespace Internal { +class FormClassWizardGenerationParametersPrivate; +class FormClassWizardParametersPrivate; + +// Parameters influencing the code generation. +class DESIGNER_EXPORT FormClassWizardGenerationParameters { +public: + // How to embed the Ui::Form class. + enum UiClassEmbedding { + PointerAggregatedUiClass, // "Ui::Form *m_ui"; + AggregatedUiClass, // "Ui::Form m_ui"; + InheritedUiClass // "...private Ui::Form..." + }; + + FormClassWizardGenerationParameters(); + ~FormClassWizardGenerationParameters(); + FormClassWizardGenerationParameters(const FormClassWizardGenerationParameters&); + FormClassWizardGenerationParameters &operator=(const FormClassWizardGenerationParameters &); + + void fromSettings(const QSettings *); + void toSettings(QSettings *) const; + + UiClassEmbedding embedding() const; + void setEmbedding(UiClassEmbedding e); + + bool retranslationSupport() const; // Add handling for language change events + void setRetranslationSupport(bool v); + + bool includeQtModule() const; // Include "<QtGui/[Class]>" or just "<[Class]>" + void setIncludeQtModule(bool v); + + bool indentNamespace() const; + void setIndentNamespace(bool v); -enum UiClassEmbedding { - PointerAggregatedUiClass, - AggregatedUiClass, - InheritedUiClass + bool equals(const FormClassWizardGenerationParameters &rhs) const; + +private: + QSharedDataPointer<FormClassWizardGenerationParametersPrivate> m_d; }; -struct FormClassWizardParameters { - explicit FormClassWizardParameters(); +inline bool operator==(const FormClassWizardGenerationParameters &p1, const FormClassWizardGenerationParameters &p2) { return p1.equals(p2); } +inline bool operator!=(const FormClassWizardGenerationParameters &p1, const FormClassWizardGenerationParameters &p2) { return !p1.equals(p2); } + +// Parameters required to generate the code part of a form class with +// helpers for XML-processing ui templates. +class DESIGNER_EXPORT FormClassWizardParameters { +public: + FormClassWizardParameters(); + ~FormClassWizardParameters(); + FormClassWizardParameters(const FormClassWizardParameters &); + FormClassWizardParameters &operator=(const FormClassWizardParameters &); + + bool generateCpp(const FormClassWizardGenerationParameters &fgp, + QString *header, QString *source, int indentation = 4) const; + + // Helper to parse UI XML forms to determine: + // 1) The ui class name from "<class>Designer::Internal::FormClassWizardPage</class>" + // 2) the base class from: widget class="QWizardPage"... + static bool getUIXmlData(const QString &uiXml, QString *formBaseClass, QString *uiClassName); + // Helper to change the class name in a UI XML form + static QString changeUiClassName(const QString &uiXml, const QString &newUiClassName); + + QString uiTemplate() const; + void setUiTemplate(const QString &); + + QString className() const; + void setClassName(const QString &); + + QString path() const; + void setPath(const QString &); + + QString sourceFile() const; + void setSourceFile(const QString &); - bool generateCpp(QString *header, QString *source, int indentation = 4) const; + QString headerFile() const; + void setHeaderFile(const QString &); - UiClassEmbedding embedding; - bool languageChange; // Add handling for language change events - QString uiTemplate; - QString className; + QString uiFile() const; + void setUiFile(const QString &); - QString path; - QString sourceFile; - QString headerFile; - QString uiFile; +private: + QSharedDataPointer<FormClassWizardParametersPrivate> m_d; }; -} // namespace Internal } // namespace Designer #endif // FORMCLASSWIZARDPARAMETERS_H diff --git a/src/plugins/designer/designerconstants.h b/src/plugins/designer/designerconstants.h index a6c53e0a3638ef1ffea2905d77f0a8f6719ca9d2..6896c67a4e84f6c3ac743142a900425986b2242c 100644 --- a/src/plugins/designer/designerconstants.h +++ b/src/plugins/designer/designerconstants.h @@ -30,9 +30,14 @@ #ifndef DESIGNERPLUGIN_CONSTANTS_H #define DESIGNERPLUGIN_CONSTANTS_H +#include <QtCore/QtGlobal> + namespace Designer { namespace Constants { +const char * const SETTINGS_CATEGORY = QT_TRANSLATE_NOOP("Designer", "Designer"); +const char * const SETTINGS_CPP_SETTINGS = QT_TRANSLATE_NOOP("Designer", "Class Generation"); + // context const char * const C_FORMEDITOR = "FormEditor"; const char * const T_FORMEDITOR = "FormEditor.Toolbar"; diff --git a/src/plugins/designer/formeditorplugin.cpp b/src/plugins/designer/formeditorplugin.cpp index 40a6276133eed9534582e6d85438951295ef02df..3508626fb801e69e1c5e31e14b510233a2769108 100644 --- a/src/plugins/designer/formeditorplugin.cpp +++ b/src/plugins/designer/formeditorplugin.cpp @@ -35,6 +35,7 @@ #ifdef CPP_ENABLED # include "formclasswizard.h" # include <cppeditor/cppeditorconstants.h> +# include "cppsettingspage.h" #endif #include "designerconstants.h" @@ -60,24 +61,12 @@ using namespace Designer::Internal; using namespace Designer::Constants; -FormEditorPlugin::FormEditorPlugin() : - m_factory(0), - m_formWizard(0), - m_formClassWizard(0) +FormEditorPlugin::FormEditorPlugin() { } FormEditorPlugin::~FormEditorPlugin() { - if (m_factory) - removeObject(m_factory); - if (m_formWizard) - removeObject(m_formWizard); - if (m_formClassWizard) - removeObject(m_formClassWizard); - delete m_factory; - delete m_formWizard; - delete m_formClassWizard; FormEditorW::deleteInstance(); } @@ -95,30 +84,28 @@ bool FormEditorPlugin::initialize(const QStringList &arguments, QString *error) if (!core->mimeDatabase()->addMimeTypes(QLatin1String(":/formeditor/Designer.mimetypes.xml"), error)) return false; - if (!initializeTemplates(error)) - return false; + initializeTemplates(); const int uid = core->uniqueIDManager()->uniqueIdentifier(QLatin1String(C_FORMEDITOR)); const QList<int> context = QList<int>() << uid; - m_factory = new FormEditorFactory; - addObject(m_factory); + addAutoReleasedObject(new FormEditorFactory); if (qgetenv("KDE_SESSION_VERSION") == QByteArray("4")) { // KDE 4, possibly dangerous... // KDE 4.2.0 had a nasty bug, which resulted in the File/Open Dialog crashing // so check for that an fully load the plugins QProcess proc; - proc.start("kde4-config", QStringList() << "--version"); + proc.start(QLatin1String("kde4-config"), QStringList(QLatin1String("--version"))); proc.waitForFinished(); - QString output = proc.readAll(); + const QByteArray output = proc.readAll(); if (output.contains("KDE: 4.2.0")) FormEditorW::ensureInitStage(FormEditorW::FullyInitialized); } else { FormEditorW::ensureInitStage(FormEditorW::RegisterPlugins); } - QString locale = qApp->property("qtc_locale").toString(); + const QString locale = qApp->property("qtc_locale").toString(); if (!locale.isEmpty()) { QTranslator *qtr = new QTranslator(this); const QString &creatorTrPath = @@ -143,26 +130,23 @@ void FormEditorPlugin::extensionsInitialized() // //////////////////////////////////////////////////// -bool FormEditorPlugin::initializeTemplates(QString *error) +void FormEditorPlugin::initializeTemplates() { - Q_UNUSED(error); FormWizard::BaseFileWizardParameters wizardParameters(Core::IWizard::FileWizard); wizardParameters.setCategory(QLatin1String("Qt")); wizardParameters.setTrCategory(tr("Qt")); const QString formFileType = QLatin1String(Constants::FORM_FILE_TYPE); wizardParameters.setName(tr("Qt Designer Form")); wizardParameters.setDescription(tr("Creates a Qt Designer form file (.ui).")); - m_formWizard = new FormWizard(wizardParameters, this); - addObject(m_formWizard); + addAutoReleasedObject(new FormWizard(wizardParameters, this)); #ifdef CPP_ENABLED wizardParameters.setKind(Core::IWizard::ClassWizard); wizardParameters.setName(tr("Qt Designer Form Class")); wizardParameters.setDescription(tr("Creates a Qt Designer form file (.ui) with a matching class.")); - m_formClassWizard = new FormClassWizard(wizardParameters, this); - addObject(m_formClassWizard); + addAutoReleasedObject(new FormClassWizard(wizardParameters, this)); + addAutoReleasedObject(new CppSettingsPage); #endif - return true; } Q_EXPORT_PLUGIN(FormEditorPlugin) diff --git a/src/plugins/designer/formeditorplugin.h b/src/plugins/designer/formeditorplugin.h index 60fdbee7d42a15b12b1469003e565ef20cbafd8a..d9d1fe50962f5c0b68e9cc7d66128762817f65f9 100644 --- a/src/plugins/designer/formeditorplugin.h +++ b/src/plugins/designer/formeditorplugin.h @@ -32,18 +32,9 @@ #include <extensionsystem/iplugin.h> -namespace Core { - class IWizard; - class ICore; -} - namespace Designer { namespace Internal { -class FormEditorFactory; -class FormWizard; -class FormEditorW; - class FormEditorPlugin : public ExtensionSystem::IPlugin { Q_OBJECT @@ -57,12 +48,7 @@ public: void extensionsInitialized(); private: - bool initializeTemplates(QString *error_message); - - FormEditorFactory *m_factory; - - Core::IWizard *m_formWizard; - Core::IWizard *m_formClassWizard; + void initializeTemplates(); }; } // namespace Internal diff --git a/src/plugins/designer/formtemplatewizardpage.h b/src/plugins/designer/formtemplatewizardpage.h index 2c52abd0a615d1f3edfa57af2c5ca20487b678f5..7ab9c036126860825895609bfb1c2759f34afeb3 100644 --- a/src/plugins/designer/formtemplatewizardpage.h +++ b/src/plugins/designer/formtemplatewizardpage.h @@ -54,7 +54,11 @@ public: QString templateContents() const { return m_templateContents; } + // Parse UI XML forms to determine: + // 1) The ui class name from "<class>Designer::Internal::FormClassWizardPage</class>" + // 2) the base class from: widget class="QWizardPage"... static bool getUIXmlData(const QString &uiXml, QString *formBaseClass, QString *uiClassName); + // Change the class name in a UI XML form static QString changeUiClassName(const QString &uiXml, const QString &newUiClassName); static QString stripNamespaces(const QString &className); diff --git a/src/plugins/designer/settingspage.cpp b/src/plugins/designer/settingspage.cpp index 2fdee80d8f2c9a8156183f0b22440dae04952687..618c3e20788e2c2399efa679466938b0e7560dee 100644 --- a/src/plugins/designer/settingspage.cpp +++ b/src/plugins/designer/settingspage.cpp @@ -28,9 +28,11 @@ **************************************************************************/ #include "settingspage.h" +#include "designerconstants.h" #include <extensionsystem/pluginmanager.h> #include <qt_private/abstractoptionspage_p.h> +#include <QtCore/QCoreApplication> using namespace Designer::Internal; @@ -55,12 +57,12 @@ QString SettingsPage::trName() const QString SettingsPage::category() const { - return QLatin1String("Designer"); + return QLatin1String(Designer::Constants::SETTINGS_CATEGORY); } QString SettingsPage::trCategory() const { - return tr("Designer"); + return QCoreApplication::translate("Designer", Designer::Constants::SETTINGS_CATEGORY); } QWidget *SettingsPage::createPage(QWidget *parent) diff --git a/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp b/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp index 8dcaeca88399312357fc281e885c881654d22111..108fd4cb4c3b14e56f3282670d900d9008ac10c9 100644 --- a/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/guiappwizard.cpp @@ -37,9 +37,12 @@ #include <utils/pathchooser.h> #include <projectexplorer/projectnodes.h> #include <cpptools/cppmodelmanagerinterface.h> +#include <designer/cpp/formclasswizardparameters.h> +#include <coreplugin/icore.h> #include <QtCore/QDir> #include <QtCore/QFile> +#include <QtCore/QSettings> #include <QtCore/QByteArray> #include <QtCore/QDebug> #include <QtCore/QTextStream> @@ -89,6 +92,33 @@ QWizard *GuiAppWizard::createWizardDialog(QWidget *parent, return dialog; } +// Use the class generation utils provided by the designer plugin +static inline bool generateFormClass(const GuiAppParameters ¶ms, + const Core::GeneratedFile &uiFile, + Core::GeneratedFile *formSource, + Core::GeneratedFile *formHeader, + QString *errorMessage) +{ + // Retrieve parameters from settings + Designer::FormClassWizardGenerationParameters fgp; + fgp.fromSettings(Core::ICore::instance()->settings()); + Designer::FormClassWizardParameters fp; + fp.setUiTemplate(uiFile.contents()); + fp.setUiFile(uiFile.path()); + fp.setClassName(params.className); + fp.setSourceFile(params.sourceFileName); + fp.setHeaderFile(params.headerFileName); + QString headerContents; + QString sourceContents; + if (!fp.generateCpp(fgp, &headerContents, &sourceContents, 4)) { + *errorMessage = QLatin1String("Internal error: Unable to generate the form classes."); + return false; + } + formHeader->setContents(headerContents); + formSource->setContents(sourceContents); + return true; +} + Core::GeneratedFiles GuiAppWizard::generateFiles(const QWizard *w, QString *errorMessage) const { @@ -108,28 +138,32 @@ Core::GeneratedFiles GuiAppWizard::generateFiles(const QWizard *w, if (!parametrizeTemplate(templatePath, QLatin1String("main.cpp"), params, &contents, errorMessage)) return Core::GeneratedFiles(); mainSource.setContents(license + contents); - // Create files: form source - const QString formSourceTemplate = params.designerForm ? QLatin1String("mywidget_form.cpp") : QLatin1String("mywidget.cpp"); + // Create files: form source with or without form const QString formSourceFileName = buildFileName(projectPath, params.sourceFileName, sourceSuffix()); - Core::GeneratedFile formSource(formSourceFileName); - if (!parametrizeTemplate(templatePath, formSourceTemplate, params, &contents, errorMessage)) - return Core::GeneratedFiles(); - formSource.setContents(license + contents); - // Create files: form header const QString formHeaderName = buildFileName(projectPath, params.headerFileName, headerSuffix()); - const QString formHeaderTemplate = params.designerForm ? QLatin1String("mywidget_form.h") : QLatin1String("mywidget.h"); + Core::GeneratedFile formSource(formSourceFileName); Core::GeneratedFile formHeader(formHeaderName); - if (!parametrizeTemplate(templatePath, formHeaderTemplate, params, &contents, errorMessage)) - return Core::GeneratedFiles(); - formHeader.setContents(license + contents); - // Create files: form + QSharedPointer<Core::GeneratedFile> form; if (params.designerForm) { + // Create files: form const QString formName = buildFileName(projectPath, params.formFileName, formSuffix()); form = QSharedPointer<Core::GeneratedFile>(new Core::GeneratedFile(formName)); if (!parametrizeTemplate(templatePath, QLatin1String("widget.ui"), params, &contents, errorMessage)) return Core::GeneratedFiles(); - form->setContents(contents); + form->setContents(contents); + if (!generateFormClass(params, *form, &formSource, &formHeader, errorMessage)) + return Core::GeneratedFiles(); + } else { + const QString formSourceTemplate = QLatin1String("mywidget.cpp"); + if (!parametrizeTemplate(templatePath, formSourceTemplate, params, &contents, errorMessage)) + return Core::GeneratedFiles(); + formSource.setContents(license + contents); + // Create files: form header + const QString formHeaderTemplate = QLatin1String("mywidget.h"); + if (!parametrizeTemplate(templatePath, formHeaderTemplate, params, &contents, errorMessage)) + return Core::GeneratedFiles(); + formHeader.setContents(license + contents); } // Create files: profile const QString profileName = buildFileName(projectPath, projectParams.name, profileSuffix());