diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 034dd07469e73c6c7110ed3222f2f666590ce019..9d0021aeb69f4f37eed16d715cb83f9ce1a5aa41 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -98,6 +98,7 @@ #include <QtGui/QFileDialog> #include <QtGui/QMenu> #include <QtGui/QMessageBox> +#include <QtGui/QVBoxLayout> Q_DECLARE_METATYPE(QSharedPointer<ProjectExplorer::RunConfiguration>); Q_DECLARE_METATYPE(Core::IEditorFactory*); @@ -1541,6 +1542,10 @@ void ProjectExplorerPlugin::runProjectImpl(Project *pro) return; if (d->m_projectExplorerSettings.buildBeforeRun && pro->hasBuildSettings()) { + if (!pro->activeRunConfiguration()->isEnabled()) { + if (!showBuildConfigDialog()) + return; + } if (saveModifiedFiles()) { d->m_runMode = ProjectExplorer::Constants::RUNMODE; d->m_delayedRunConfiguration = pro->activeRunConfiguration(); @@ -1560,6 +1565,10 @@ void ProjectExplorerPlugin::debugProject() return; if (d->m_projectExplorerSettings.buildBeforeRun && pro->hasBuildSettings()) { + if (!pro->activeRunConfiguration()->isEnabled()) { + if (!showBuildConfigDialog()) + return; + } if (saveModifiedFiles()) { d->m_runMode = ProjectExplorer::Constants::DEBUGMODE; d->m_delayedRunConfiguration = pro->activeRunConfiguration(); @@ -1574,6 +1583,31 @@ void ProjectExplorerPlugin::debugProject() } } +bool ProjectExplorerPlugin::showBuildConfigDialog() +{ + Project *pro = startupProject(); + BuildConfigDialog *dialog = new BuildConfigDialog(pro, + Core::ICore::instance()->mainWindow()); + dialog->exec(); + BuildConfiguration *otherConfig = dialog->selectedBuildConfiguration(); + int result = dialog->result(); + dialog->deleteLater(); + switch (result) { + case BuildConfigDialog::ChangeBuild: + if (otherConfig) { + pro->setActiveBuildConfiguration(otherConfig); + return true; + } + return false; + case BuildConfigDialog::Cancel: + return false; + case BuildConfigDialog::Continue: + return true; + default: + return false; + } +} + void ProjectExplorerPlugin::addToApplicationOutputWindow(RunControl *rc, const QString &line) { d->m_outputPane->appendOutput(rc, line); @@ -2095,4 +2129,79 @@ Internal::ProjectExplorerSettings ProjectExplorerPlugin::projectExplorerSettings return d->m_projectExplorerSettings; } +// ---------- BuildConfigDialog ----------- +Q_DECLARE_METATYPE(BuildConfiguration*); + +BuildConfigDialog::BuildConfigDialog(Project *project, QWidget *parent) + : QDialog(parent), + m_project(project) +{ + QVBoxLayout *vlayout = new QVBoxLayout; + setLayout(vlayout); + QDialogButtonBox *buttonBox = new QDialogButtonBox; + m_changeBuildConfiguration = buttonBox->addButton(tr("Change build configuration && continue"), + QDialogButtonBox::ActionRole); + m_cancel = buttonBox->addButton(tr("Cancel"), + QDialogButtonBox::RejectRole); + m_justContinue = buttonBox->addButton(tr("Continue anyway"), + QDialogButtonBox::AcceptRole); + connect(m_changeBuildConfiguration, SIGNAL(clicked()), this, SLOT(buttonClicked())); + connect(m_cancel, SIGNAL(clicked()), this, SLOT(buttonClicked())); + connect(m_justContinue, SIGNAL(clicked()), this, SLOT(buttonClicked())); + setWindowTitle(tr("Run configuration doesn't match build configuration")); + QLabel *shortText = new QLabel(tr( + "The active build configuration builds a target " + "that cannot be used by the active run configuration." + )); + vlayout->addWidget(shortText); + QLabel *descriptiveText = new QLabel(tr( + "This can happen if the active build configuration " + "uses the wrong Qt version and/or tool chain for the active run configuration " + "(e.g. running in Symbian emulator requires building with WINSCW tool chain)." + )); + descriptiveText->setWordWrap(true); + vlayout->addWidget(descriptiveText); + QHBoxLayout *hlayout = new QHBoxLayout; + hlayout->addWidget(new QLabel(tr("Choose build configuration:"))); + m_configCombo = new QComboBox; + QSharedPointer<RunConfiguration> activeRun = m_project->activeRunConfiguration(); + foreach (BuildConfiguration *config, m_project->buildConfigurations()) { + if (activeRun->isEnabled(config)) { + m_configCombo->addItem(config->name(), qVariantFromValue(config)); + } + } + if (m_configCombo->count() == 0) { + m_configCombo->addItem(tr("No valid build configuration found.")); + m_configCombo->setEnabled(false); + m_changeBuildConfiguration->setEnabled(false); + } + + + hlayout->addWidget(m_configCombo); + hlayout->addStretch(10); + vlayout->addLayout(hlayout); + vlayout->addWidget(buttonBox); + m_cancel->setDefault(true); +} + +BuildConfiguration *BuildConfigDialog::selectedBuildConfiguration() const +{ + int index = m_configCombo->currentIndex(); + if (index < 0) + return 0; + return m_configCombo->itemData(index, Qt::UserRole).value<BuildConfiguration*>(); +} + +void BuildConfigDialog::buttonClicked() +{ + QPushButton *button = qobject_cast<QPushButton *>(sender()); + if (button == m_changeBuildConfiguration) { + done(ChangeBuild); + } else if (button == m_cancel) { + done(Cancel); + } else if (button == m_justContinue) { + done(Continue); + } +} + Q_EXPORT_PLUGIN(ProjectExplorerPlugin) diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 6066b9e69d80582f8348d0902a84a5cb4600bdb0..1d0d49afb810c3f10ae38e38502615102003f619 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -35,10 +35,12 @@ #include <extensionsystem/iplugin.h> #include <QtCore/QSharedPointer> +#include <QtGui/QDialog> QT_BEGIN_NAMESPACE class QPoint; class QAction; +class QComboBox; QT_END_NAMESPACE namespace Core { @@ -59,10 +61,36 @@ class RunConfiguration; class IRunControlFactory; class Project; class Node; +class BuildConfiguration; namespace Internal { class ProjectFileFactory; struct ProjectExplorerSettings; + +class BuildConfigDialog : public QDialog +{ + Q_OBJECT +public: + enum DialogResult { + ChangeBuild = 10, + Cancel = 11, + Continue = 12 + }; + BuildConfigDialog(Project *project, QWidget *parent = 0); + + BuildConfiguration *selectedBuildConfiguration() const; + +private slots: + void buttonClicked(); + +private: + Project *m_project; + QPushButton *m_changeBuildConfiguration; + QPushButton *m_cancel; + QPushButton *m_justContinue; + QComboBox *m_configCombo; +}; + } // namespace Internal struct ProjectExplorerPluginPrivate; @@ -187,6 +215,7 @@ private slots: private: void runProjectImpl(Project *pro); void executeRunConfiguration(const QSharedPointer<RunConfiguration> &, const QString &mode); + bool showBuildConfigDialog(); void setCurrent(Project *project, QString filePath, Node *node); QStringList allFilesWithDependencies(Project *pro); diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index c9765ad5cd53058cefc81c471f184104eee066fc..6aa8ea34de89d6927eebe82f4e51ab648aa00a0c 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -30,6 +30,7 @@ #include "runconfiguration.h" #include "project.h" #include "persistentsettings.h" +#include "buildconfiguration.h" #include <QtCore/QTimer> @@ -56,6 +57,15 @@ Project *RunConfiguration::project() const return m_project.data(); } +bool RunConfiguration::isEnabled() const +{ + if (!m_project) + return false; + if (!m_project->activeBuildConfiguration()) + return false; + return isEnabled(m_project->activeBuildConfiguration()); +} + QString RunConfiguration::name() const { return m_name; diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 07f1ad795614f7da69763d1edc0f20c21da8ee33..d775856cd77a2555c5cd0450d90a110dcecd7bf5 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -49,6 +49,7 @@ class PersistentSettingsReader; class PersistentSettingsWriter; class RunControl; +class BuildConfiguration; /* Base class for a run configuration. A run configuration specifies how a * project should be run, while the runner (see below) does the actual running. @@ -75,7 +76,8 @@ public: QString name() const; void setName(const QString &name); - virtual bool isEnabled() const { return true; } + virtual bool isEnabled(BuildConfiguration *) const { return true; } + bool isEnabled() const; // Returns the widget used to configure this run configuration. Ownership is transferred to the caller // rename to createConfigurationWidget diff --git a/src/plugins/projectexplorer/runsettingspropertiespage.cpp b/src/plugins/projectexplorer/runsettingspropertiespage.cpp index 98b86a3ff89ec7a06072fbf42536ec1fb4ae2d03..03b380826144d82db4d879622f71b8ed0a3101e0 100644 --- a/src/plugins/projectexplorer/runsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/runsettingspropertiespage.cpp @@ -288,11 +288,6 @@ void RunSettingsWidget::initRunConfigurationComboBox() m_ui->runConfigurationCombo->setCurrentIndex(runConfigurations.indexOf(currentSelection)); else m_ui->runConfigurationCombo->setCurrentIndex(runConfigurations.indexOf(activeRunConfiguration)); - QList<QSharedPointer<RunConfiguration> > enabledRunConfigurations; - for (int i = 0; i < runConfigurations.size(); ++i) { - if (runConfigurations.at(i)->isEnabled()) - enabledRunConfigurations.append(runConfigurations.at(i)); - } m_ui->removeToolButton->setEnabled(runConfigurations.size() > 1); updateMakeActiveLabel(); } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp index 2cb8caf38f43d330783bda2e773b9f8d25fa868e..94dfb99aec6c85530336162c0a7df0bd8924e4ef 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.cpp @@ -101,6 +101,14 @@ QString S60DeviceRunConfiguration::type() const return QLatin1String("Qt4ProjectManager.DeviceRunConfiguration"); } +ProjectExplorer::ToolChain::ToolChainType S60DeviceRunConfiguration::toolChainType( + ProjectExplorer::BuildConfiguration *configuration) const +{ + if (const Qt4Project *pro = qobject_cast<const Qt4Project*>(project())) + return pro->toolChainType(configuration); + return ProjectExplorer::ToolChain::INVALID; +} + ProjectExplorer::ToolChain::ToolChainType S60DeviceRunConfiguration::toolChainType() const { if (const Qt4Project *pro = qobject_cast<const Qt4Project*>(project())) @@ -108,9 +116,9 @@ ProjectExplorer::ToolChain::ToolChainType S60DeviceRunConfiguration::toolChainTy return ProjectExplorer::ToolChain::INVALID; } -bool S60DeviceRunConfiguration::isEnabled() const +bool S60DeviceRunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration *configuration) const { - const ToolChain::ToolChainType type = toolChainType(); + const ToolChain::ToolChainType type = toolChainType(configuration); return type == ToolChain::GCCE || type == ToolChain::RVCT_ARMV5 || type == ToolChain::RVCT_ARMV6; } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h index fa7651a2fb749ff64e3a90a507fb7849b61a7340..04616bf109a8a499a5ab5be574266a5bbba4048e 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60devicerunconfiguration.h @@ -62,7 +62,7 @@ public: ~S60DeviceRunConfiguration(); QString type() const; - bool isEnabled() const; + bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const; QWidget *configurationWidget(); void save(ProjectExplorer::PersistentSettingsWriter &writer) const; void restore(const ProjectExplorer::PersistentSettingsReader &reader); @@ -97,6 +97,7 @@ private slots: void invalidateCachedTargetInformation(); private: + ProjectExplorer::ToolChain::ToolChainType toolChainType(ProjectExplorer::BuildConfiguration *configuration) const; void updateTarget(); QString m_proFilePath; diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp index b1c65fa0e926273cce012300e9c7f20dce4580ea..6b734e631498ce32f59ee6935c6f470177d4a989 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.cpp @@ -76,11 +76,11 @@ QString S60EmulatorRunConfiguration::type() const return "Qt4ProjectManager.EmulatorRunConfiguration"; } -bool S60EmulatorRunConfiguration::isEnabled() const +bool S60EmulatorRunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration *configuration) const { Qt4Project *pro = qobject_cast<Qt4Project*>(project()); QTC_ASSERT(pro, return false); - ToolChain::ToolChainType type = pro->toolChainType(pro->activeBuildConfiguration()); + ToolChain::ToolChainType type = pro->toolChainType(configuration); return type == ToolChain::WINSCW; } diff --git a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h index 8ba0aeded4d6a9a5ee533cfa9f74a0ff514c17a2..ec84e7900d3b9440fe99db924b04bb95980e0e59 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h +++ b/src/plugins/qt4projectmanager/qt-s60/s60emulatorrunconfiguration.h @@ -55,7 +55,7 @@ public: ~S60EmulatorRunConfiguration(); QString type() const; - bool isEnabled() const; + bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const; QWidget *configurationWidget(); void save(ProjectExplorer::PersistentSettingsWriter &writer) const; void restore(const ProjectExplorer::PersistentSettingsReader &reader); diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index a9fd57afe740189f153aac87ea652a6e13b237bc..2acc04c7b96318e74b7e63492c83f703a2312b14 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -994,15 +994,6 @@ void Qt4Project::setToolChainType(BuildConfiguration *configuration, ProjectExpl void Qt4Project::updateActiveRunConfiguration() { - const QSharedPointer<RunConfiguration> activeRunConfig = activeRunConfiguration(); - if (!activeRunConfig.isNull() && !activeRunConfig->isEnabled()) { - foreach (const QSharedPointer<RunConfiguration> &runConfiguration, runConfigurations()) { - if (runConfiguration->isEnabled()) { - setActiveRunConfiguration(runConfiguration); - break; - } - } - } emit runConfigurationsEnabledStateChanged(); emit targetInformationChanged(); } diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp index 4c7a31e13bcbd807795ce877216809bc75c07c7a..413122224b198d9571b64fbe3285c02afcf1612a 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp @@ -93,12 +93,12 @@ QString Qt4RunConfiguration::type() const return "Qt4ProjectManager.Qt4RunConfiguration"; } -bool Qt4RunConfiguration::isEnabled() const +bool Qt4RunConfiguration::isEnabled(ProjectExplorer::BuildConfiguration *configuration) const { #ifdef QTCREATOR_WITH_S60 Qt4Project *pro = qobject_cast<Qt4Project*>(project()); QTC_ASSERT(pro, return false); - ProjectExplorer::ToolChain::ToolChainType type = pro->toolChainType(pro->activeBuildConfiguration()); + ProjectExplorer::ToolChain::ToolChainType type = pro->toolChainType(configuration); return type != ProjectExplorer::ToolChain::WINSCW && type != ProjectExplorer::ToolChain::GCCE && type != ProjectExplorer::ToolChain::RVCT_ARMV5 diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.h b/src/plugins/qt4projectmanager/qt4runconfiguration.h index 69fa0d6575fd35ff61041215e8995bcb698b1328..f4d953cad871cf7092275c5fe205a5b1c9838fc8 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.h @@ -66,7 +66,7 @@ public: virtual ~Qt4RunConfiguration(); virtual QString type() const; - virtual bool isEnabled() const; + virtual bool isEnabled(ProjectExplorer::BuildConfiguration *configuration) const; virtual QWidget *configurationWidget(); virtual void save(ProjectExplorer::PersistentSettingsWriter &writer) const; virtual void restore(const ProjectExplorer::PersistentSettingsReader &reader);