From d41745c78a2c1347b90142163cc1f4ec509d20b4 Mon Sep 17 00:00:00 2001
From: dt <qtc-committer@nokia.com>
Date: Fri, 26 Mar 2010 16:10:35 +0100
Subject: [PATCH] Use startup project not current project for building

Except in the context menu
---
 .../projectexplorer/projectexplorer.cpp       | 142 ++++++++++++++----
 src/plugins/projectexplorer/projectexplorer.h |   3 +
 .../projectexplorerconstants.h                |   3 +
 3 files changed, 122 insertions(+), 26 deletions(-)

diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index 201c84ac394..53bd7355f5f 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -136,12 +136,15 @@ struct ProjectExplorerPluginPrivate {
     QAction *m_clearSession;
     QAction *m_buildProjectOnlyAction;
     Utils::ParameterAction *m_buildAction;
+    Utils::ParameterAction *m_buildActionContextMenu;
     QAction *m_buildSessionAction;
     QAction *m_rebuildProjectOnlyAction;
     Utils::ParameterAction *m_rebuildAction;
+    Utils::ParameterAction *m_rebuildActionContextMenu;
     QAction *m_rebuildSessionAction;
     QAction *m_cleanProjectOnlyAction;
     Utils::ParameterAction *m_cleanAction;
+    Utils::ParameterAction *m_cleanActionContextMenu;
     QAction *m_cleanSessionAction;
     QAction *m_runAction;
     QAction *m_runActionContextMenu;
@@ -553,10 +556,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
         am->createMenu(Constants::BUILDCONFIGURATIONMENU);
     d->m_buildConfigurationMenu = mbc->menu();
     d->m_buildConfigurationMenu->setTitle(tr("Set Build Configuration"));
-    //TODO this means it is build twice, rrr
-    connect(mproject->menu(), SIGNAL(aboutToShow()), this, SLOT(populateBuildConfigurationMenu()));
     connect(mbuild->menu(), SIGNAL(aboutToShow()), this, SLOT(populateBuildConfigurationMenu()));
-    connect(d->m_buildConfigurationMenu, SIGNAL(aboutToShow()), this, SLOT(populateBuildConfigurationMenu()));
     connect(d->m_buildConfigurationMenu, SIGNAL(triggered(QAction *)), this, SLOT(buildConfigurationMenuTriggered(QAction *)));
 
     // build session action
@@ -588,30 +588,51 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
 
     // build action
     d->m_buildAction = new Utils::ParameterAction(tr("Build Project"), tr("Build Project \"%1\""),
-                                                     Utils::ParameterAction::EnabledWithParameter, this);
+                                                     Utils::ParameterAction::AlwaysEnabled, this);
     cmd = am->registerAction(d->m_buildAction, Constants::BUILD, globalcontext);
     cmd->setAttribute(Core::Command::CA_UpdateText);
     cmd->setDefaultText(d->m_buildAction->text());
     cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+B")));
     mbuild->addAction(cmd, Constants::G_BUILD_PROJECT);
-    mproject->addAction(cmd, Constants::G_PROJECT_BUILD);
 
     // rebuild action
     d->m_rebuildAction = new Utils::ParameterAction(tr("Rebuild Project"), tr("Rebuild Project \"%1\""),
-                                                       Utils::ParameterAction::EnabledWithParameter, this);
+                                                       Utils::ParameterAction::AlwaysEnabled, this);
     cmd = am->registerAction(d->m_rebuildAction, Constants::REBUILD, globalcontext);
     cmd->setAttribute(Core::Command::CA_UpdateText);
     cmd->setDefaultText(d->m_rebuildAction->text());
     mbuild->addAction(cmd, Constants::G_BUILD_PROJECT);
-    mproject->addAction(cmd, Constants::G_PROJECT_BUILD);
 
     // clean action
     d->m_cleanAction = new Utils::ParameterAction(tr("Clean Project"), tr("Clean Project \"%1\""),
-                                                     Utils::ParameterAction::EnabledWithParameter, this);
+                                                     Utils::ParameterAction::AlwaysEnabled, this);
     cmd = am->registerAction(d->m_cleanAction, Constants::CLEAN, globalcontext);
     cmd->setAttribute(Core::Command::CA_UpdateText);
     cmd->setDefaultText(d->m_cleanAction->text());
     mbuild->addAction(cmd, Constants::G_BUILD_PROJECT);
+
+    // build action (context menu)
+    d->m_buildActionContextMenu = new Utils::ParameterAction(tr("Build Project"), tr("Build Project \"%1\""),
+                                                             Utils::ParameterAction::AlwaysEnabled, this);
+    cmd = am->registerAction(d->m_buildActionContextMenu, Constants::BUILDCM, globalcontext);
+    cmd->setAttribute(Core::Command::CA_UpdateText);
+    cmd->setDefaultText(d->m_buildActionContextMenu->text());
+    mproject->addAction(cmd, Constants::G_PROJECT_BUILD);
+
+    // rebuild action (context menu)
+    d->m_rebuildActionContextMenu = new Utils::ParameterAction(tr("Rebuild Project"), tr("Rebuild Project \"%1\""),
+                                                               Utils::ParameterAction::AlwaysEnabled, this);
+    cmd = am->registerAction(d->m_rebuildActionContextMenu, Constants::REBUILDCM, globalcontext);
+    cmd->setAttribute(Core::Command::CA_UpdateText);
+    cmd->setDefaultText(d->m_rebuildActionContextMenu->text());
+    mproject->addAction(cmd, Constants::G_PROJECT_BUILD);
+
+    // clean action (context menu)
+    d->m_cleanActionContextMenu = new Utils::ParameterAction(tr("Clean Project"), tr("Clean Project \"%1\""),
+                                                             Utils::ParameterAction::AlwaysEnabled, this);
+    cmd = am->registerAction(d->m_cleanActionContextMenu, Constants::CLEANCM, globalcontext);
+    cmd->setAttribute(Core::Command::CA_UpdateText);
+    cmd->setDefaultText(d->m_cleanActionContextMenu->text());
     mproject->addAction(cmd, Constants::G_PROJECT_BUILD);
 
     // build without dependencies action
@@ -628,7 +649,6 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
 
     // Add Set Build Configuration to menu
     mbuild->addMenu(mbc, Constants::G_BUILD_OTHER);
-    mproject->addMenu(mbc, Constants::G_PROJECT_CONFIG);
 
     // run action
     QIcon runIcon(Constants::ICON_RUN);
@@ -644,10 +664,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
     d->m_runConfigurationMenu = mrc->menu();
     d->m_runConfigurationMenu->setTitle(tr("Set Run Configuration"));
     mbuild->addMenu(mrc, Constants::G_BUILD_RUN);
-    mproject->addMenu(mrc, Constants::G_PROJECT_CONFIG);
-    // TODO this recreates the menu twice if shown in the Build or context menu
-    connect(d->m_runConfigurationMenu, SIGNAL(aboutToShow()), this, SLOT(populateRunConfigurationMenu()));
-    connect(mproject->menu(), SIGNAL(aboutToShow()), this, SLOT(populateRunConfigurationMenu()));
+
     connect(mbuild->menu(), SIGNAL(aboutToShow()), this, SLOT(populateRunConfigurationMenu()));
     connect(d->m_runConfigurationMenu, SIGNAL(triggered(QAction *)), this, SLOT(runConfigurationMenuTriggered(QAction *)));
 
@@ -757,12 +774,15 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
 #endif
     connect(d->m_buildProjectOnlyAction, SIGNAL(triggered()), this, SLOT(buildProjectOnly()));
     connect(d->m_buildAction, SIGNAL(triggered()), this, SLOT(buildProject()));
+    connect(d->m_buildActionContextMenu, SIGNAL(triggered()), this, SLOT(buildProjectContextMenu()));
     connect(d->m_buildSessionAction, SIGNAL(triggered()), this, SLOT(buildSession()));
     connect(d->m_rebuildProjectOnlyAction, SIGNAL(triggered()), this, SLOT(rebuildProjectOnly()));
     connect(d->m_rebuildAction, SIGNAL(triggered()), this, SLOT(rebuildProject()));
+    connect(d->m_rebuildActionContextMenu, SIGNAL(triggered()), this, SLOT(rebuildProjectContextMenu()));
     connect(d->m_rebuildSessionAction, SIGNAL(triggered()), this, SLOT(rebuildSession()));
     connect(d->m_cleanProjectOnlyAction, SIGNAL(triggered()), this, SLOT(cleanProjectOnly()));
     connect(d->m_cleanAction, SIGNAL(triggered()), this, SLOT(cleanProject()));
+    connect(d->m_cleanActionContextMenu, SIGNAL(triggered()), this, SLOT(cleanProjectContextMenu()));
     connect(d->m_cleanSessionAction, SIGNAL(triggered()), this, SLOT(cleanSession()));
     connect(d->m_runAction, SIGNAL(triggered()), this, SLOT(runProject()));
     connect(d->m_runActionContextMenu, SIGNAL(triggered()), this, SLOT(runProjectContextMenu()));
@@ -1355,12 +1375,20 @@ void ProjectExplorerPlugin::updateActions()
     if (debug)
         qDebug() << "ProjectExplorerPlugin::updateActions";
 
-    bool enableBuildActions = d->m_currentProject
+    Project *startupProject = session()->startupProject();
+    bool enableBuildActions = startupProject
+                              && ! (d->m_buildManager->isBuilding(startupProject))
+                              && startupProject->hasActiveBuildSettings();
+
+    bool enableBuildActionsContextMenu = d->m_currentProject
                               && ! (d->m_buildManager->isBuilding(d->m_currentProject))
                               && d->m_currentProject->hasActiveBuildSettings();
+
+
     bool hasProjects = !d->m_session->projects().isEmpty();
     bool building = d->m_buildManager->isBuilding();
-    QString projectName = d->m_currentProject ? d->m_currentProject->displayName() : QString();
+    QString projectName = startupProject ? startupProject->displayName() : QString();
+    QString projectNameContextMenu = d->m_currentProject ? d->m_currentProject->displayName() : QString();
 
     if (debug)
         qDebug() << "BuildManager::isBuilding()" << building;
@@ -1371,6 +1399,18 @@ void ProjectExplorerPlugin::updateActions()
     d->m_rebuildAction->setParameter(projectName);
     d->m_cleanAction->setParameter(projectName);
 
+    d->m_buildAction->setEnabled(enableBuildActions);
+    d->m_rebuildAction->setEnabled(enableBuildActions);
+    d->m_cleanAction->setEnabled(enableBuildActions);
+
+    d->m_buildAction->setParameter(projectNameContextMenu);
+    d->m_rebuildAction->setParameter(projectNameContextMenu);
+    d->m_cleanAction->setParameter(projectNameContextMenu);
+
+    d->m_buildActionContextMenu->setEnabled(enableBuildActionsContextMenu);
+    d->m_rebuildActionContextMenu->setEnabled(enableBuildActionsContextMenu);
+    d->m_cleanActionContextMenu->setEnabled(enableBuildActionsContextMenu);
+
     d->m_buildProjectOnlyAction->setEnabled(enableBuildActions);
     d->m_rebuildProjectOnlyAction->setEnabled(enableBuildActions);
     d->m_cleanProjectOnlyAction->setEnabled(enableBuildActions);
@@ -1438,7 +1478,7 @@ void ProjectExplorerPlugin::buildProjectOnly()
         qDebug() << "ProjectExplorerPlugin::buildProjectOnly";
 
     if (saveModifiedFiles())
-        buildManager()->buildProject(d->m_currentProject->activeTarget()->activeBuildConfiguration());
+        buildManager()->buildProject(session()->startupProject()->activeTarget()->activeBuildConfiguration());
 }
 
 void ProjectExplorerPlugin::buildProject()
@@ -1446,6 +1486,21 @@ void ProjectExplorerPlugin::buildProject()
     if (debug)
         qDebug() << "ProjectExplorerPlugin::buildProject";
 
+    if (saveModifiedFiles()) {
+        QList<BuildConfiguration *> configurations;
+        foreach (Project *pro, d->m_session->projectOrder(session()->startupProject()))
+            if (pro->activeTarget()->activeBuildConfiguration())
+                configurations << pro->activeTarget()->activeBuildConfiguration();
+
+        d->m_buildManager->buildProjects(configurations);
+    }
+}
+
+void ProjectExplorerPlugin::buildProjectContextMenu()
+{
+    if (debug)
+        qDebug() << "ProjectExplorerPlugin::buildProjectContextMenu";
+
     if (saveModifiedFiles()) {
         QList<BuildConfiguration *> configurations;
         foreach (Project *pro, d->m_session->projectOrder(d->m_currentProject))
@@ -1476,8 +1531,8 @@ void ProjectExplorerPlugin::rebuildProjectOnly()
         qDebug() << "ProjectExplorerPlugin::rebuildProjectOnly";
 
     if (saveModifiedFiles()) {
-        d->m_buildManager->cleanProject(d->m_currentProject->activeTarget()->activeBuildConfiguration());
-        d->m_buildManager->buildProject(d->m_currentProject->activeTarget()->activeBuildConfiguration());
+        d->m_buildManager->cleanProject(session()->startupProject()->activeTarget()->activeBuildConfiguration());
+        d->m_buildManager->buildProject(session()->startupProject()->activeTarget()->activeBuildConfiguration());
     }
 }
 
@@ -1486,6 +1541,23 @@ void ProjectExplorerPlugin::rebuildProject()
     if (debug)
         qDebug() << "ProjectExplorerPlugin::rebuildProject";
 
+    if (saveModifiedFiles()) {
+        const QList<Project *> &projects = d->m_session->projectOrder(session()->startupProject());
+        QList<BuildConfiguration *> configurations;
+        foreach (Project *pro, projects)
+            if (pro->activeTarget()->activeBuildConfiguration())
+                configurations << pro->activeTarget()->activeBuildConfiguration();
+
+        d->m_buildManager->cleanProjects(configurations);
+        d->m_buildManager->buildProjects(configurations);
+    }
+}
+
+void ProjectExplorerPlugin::rebuildProjectContextMenu()
+{
+    if (debug)
+        qDebug() << "ProjectExplorerPlugin::rebuildProjectContextMenu";
+
     if (saveModifiedFiles()) {
         const QList<Project *> &projects = d->m_session->projectOrder(d->m_currentProject);
         QList<BuildConfiguration *> configurations;
@@ -1521,7 +1593,7 @@ void ProjectExplorerPlugin::cleanProjectOnly()
         qDebug() << "ProjectExplorerPlugin::cleanProjectOnly";
 
     if (saveModifiedFiles())
-        d->m_buildManager->cleanProject(d->m_currentProject->activeTarget()->activeBuildConfiguration());
+        d->m_buildManager->cleanProject(session()->startupProject()->activeTarget()->activeBuildConfiguration());
 }
 
 void ProjectExplorerPlugin::cleanProject()
@@ -1529,6 +1601,21 @@ void ProjectExplorerPlugin::cleanProject()
     if (debug)
         qDebug() << "ProjectExplorerPlugin::cleanProject";
 
+    if (saveModifiedFiles()) {
+        const QList<Project *> & projects = d->m_session->projectOrder(session()->startupProject());
+        QList<BuildConfiguration *> configurations;
+        foreach (Project *pro, projects)
+            if (pro->activeTarget()->activeBuildConfiguration())
+                configurations << pro->activeTarget()->activeBuildConfiguration();
+        d->m_buildManager->cleanProjects(configurations);
+    }
+}
+
+void ProjectExplorerPlugin::cleanProjectContextMenu()
+{
+    if (debug)
+        qDebug() << "ProjectExplorerPlugin::cleanProjectContextMenu";
+
     if (saveModifiedFiles()) {
         const QList<Project *> & projects = d->m_session->projectOrder(d->m_currentProject);
         QList<BuildConfiguration *> configurations;
@@ -1725,15 +1812,17 @@ void ProjectExplorerPlugin::updateRunActions()
     d->m_runAction->setToolTip(QString());
     d->m_debugAction->setToolTip(QString());
 
-    bool canRun = findRunControlFactory(project->activeTarget()->activeRunConfiguration(), ProjectExplorer::Constants::RUNMODE)
-                  && project->activeTarget()->activeRunConfiguration()->isEnabled();
-    const bool canDebug = !d->m_debuggingRunControl && findRunControlFactory(project->activeTarget()->activeRunConfiguration(), ProjectExplorer::Constants::DEBUGMODE)
-                          && project->activeTarget()->activeRunConfiguration()->isEnabled();
+    RunConfiguration *activeRC = project->activeTarget()->activeRunConfiguration();
+
+    bool canRun = findRunControlFactory(activeRC, ProjectExplorer::Constants::RUNMODE)
+                  && activeRC->isEnabled();
+    const bool canDebug = !d->m_debuggingRunControl && findRunControlFactory(activeRC, ProjectExplorer::Constants::DEBUGMODE)
+                          && activeRC->isEnabled();
     const bool building = d->m_buildManager->isBuilding();
 
     d->m_runAction->setEnabled(canRun && !building);
 
-    canRun = d->m_currentProject && findRunControlFactory(d->m_currentProject->activeTarget()->activeRunConfiguration(), ProjectExplorer::Constants::RUNMODE);
+    canRun = session()->startupProject() && findRunControlFactory(activeRC, ProjectExplorer::Constants::RUNMODE);
 
     d->m_runActionContextMenu->setEnabled(canRun && !building);
 
@@ -1836,6 +1925,7 @@ void ProjectExplorerPlugin::invalidateProject(Project *project)
     }
 
     disconnect(project, SIGNAL(fileListChanged()), this, SIGNAL(fileListChanged()));
+    updateActions();
 }
 
 void ProjectExplorerPlugin::goToTaskWindow()
@@ -2009,7 +2099,7 @@ void ProjectExplorerPlugin::populateBuildConfigurationMenu()
     delete d->m_buildConfigurationActionGroup;
     d->m_buildConfigurationActionGroup = new QActionGroup(d->m_buildConfigurationMenu);
     d->m_buildConfigurationMenu->clear();
-    if (Project *pro = d->m_currentProject) {
+    if (Project *pro = session()->startupProject()) {
         const BuildConfiguration *activeBC = pro->activeTarget()->activeBuildConfiguration();
         foreach (BuildConfiguration *bc, pro->activeTarget()->buildConfigurations()) {
             QString displayName = bc->displayName();
@@ -2032,7 +2122,7 @@ void ProjectExplorerPlugin::buildConfigurationMenuTriggered(QAction *action)
     if (debug)
         qDebug() << "ProjectExplorerPlugin::buildConfigurationMenuTriggered";
 
-    d->m_currentProject->activeTarget()->setActiveBuildConfiguration(action->data().value<BuildConfiguration *>());
+    session()->startupProject()->activeTarget()->setActiveBuildConfiguration(action->data().value<BuildConfiguration *>());
 }
 
 void ProjectExplorerPlugin::populateRunConfigurationMenu()
diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h
index 347fbde0dbf..493705a1e6d 100644
--- a/src/plugins/projectexplorer/projectexplorer.h
+++ b/src/plugins/projectexplorer/projectexplorer.h
@@ -129,12 +129,15 @@ private slots:
     void buildQueueFinished(bool success);
     void buildProjectOnly();
     void buildProject();
+    void buildProjectContextMenu();
     void buildSession();
     void rebuildProjectOnly();
     void rebuildProject();
+    void rebuildProjectContextMenu();
     void rebuildSession();
     void cleanProjectOnly();
     void cleanProject();
+    void cleanProjectContextMenu();
     void cleanSession();
     void cancelBuild();
     void debugProject();
diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h
index 015d94507c3..1dd417d7145 100644
--- a/src/plugins/projectexplorer/projectexplorerconstants.h
+++ b/src/plugins/projectexplorer/projectexplorerconstants.h
@@ -47,12 +47,15 @@ const char * const UNLOAD               = "ProjectExplorer.Unload";
 const char * const CLEARSESSION         = "ProjectExplorer.ClearSession";
 const char * const BUILDPROJECTONLY     = "ProjectExplorer.BuildProjectOnly";
 const char * const BUILD                = "ProjectExplorer.Build";
+const char * const BUILDCM              = "ProjectExplorer.BuildCM";
 const char * const BUILDSESSION         = "ProjectExplorer.BuildSession";
 const char * const REBUILDPROJECTONLY   = "ProjectExplorer.RebuildProjectOnly";
 const char * const REBUILD              = "ProjectExplorer.Rebuild";
+const char * const REBUILDCM            = "ProjectExplorer.RebuildCM";
 const char * const REBUILDSESSION       = "ProjectExplorer.RebuildSession";
 const char * const CLEANPROJECTONLY     = "ProjectExplorer.CleanProjectOnly";
 const char * const CLEAN                = "ProjectExplorer.Clean";
+const char * const CLEANCM              = "ProjectExplorer.CleanCM";
 const char * const CLEANSESSION         = "ProjectExplorer.CleanSession";
 const char * const BUILDPROJECTONLYMENU = "ProjectExplorer.BuildProjectOnlyMenu";
 const char * const BUILDCONFIGURATIONMENU = "ProjectExplorer.BuildConfigurationMenu";
-- 
GitLab