aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRadovan Zivkovic <pivonroll@gmail.com>2013-05-25 14:28:32 +0200
committerOswald Buddenhagen <oswald.buddenhagen@digia.com>2014-03-11 19:54:53 +0100
commit410dba83d90324af6329e13d0831605c0c4b613d (patch)
tree0e45dda3a9d938061aa53fe40830acd6a6fa1a25
parent0a08b505b8f3ee96f2a00ebdd7b3121737fe40b4 (diff)
Added VcProjectKitInformation, managers for Ms Builds and schemas.
Change-Id: Ic02eebc907f04a7277957c460ee7d77d748f7c83 Reviewed-by: Bojan Petrovic <bojan85@gmail.com>
-rw-r--r--src/plugins/vcprojectmanager/msbuildversionmanager.cpp172
-rw-r--r--src/plugins/vcprojectmanager/msbuildversionmanager.h127
-rw-r--r--src/plugins/vcprojectmanager/vcmakestep.cpp182
-rw-r--r--src/plugins/vcprojectmanager/vcmakestep.h12
-rw-r--r--src/plugins/vcprojectmanager/vcproject.cpp34
-rw-r--r--src/plugins/vcprojectmanager/vcproject.h4
-rw-r--r--src/plugins/vcprojectmanager/vcprojectbuildconfiguration.cpp5
-rw-r--r--src/plugins/vcprojectmanager/vcprojectbuildconfiguration.h6
-rw-r--r--src/plugins/vcprojectmanager/vcprojectbuildoptionspage.cpp397
-rw-r--r--src/plugins/vcprojectmanager/vcprojectbuildoptionspage.h65
-rw-r--r--src/plugins/vcprojectmanager/vcprojectkitinformation.cpp169
-rw-r--r--src/plugins/vcprojectmanager/vcprojectkitinformation.h78
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmanager.cpp27
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmanager.h4
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmanager.pro10
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmanagerconstants.h1
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmanagerplugin.cpp8
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp30
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.h11
-rw-r--r--src/plugins/vcprojectmanager/vcschemamanager.cpp111
-rw-r--r--src/plugins/vcprojectmanager/vcschemamanager.h69
-rw-r--r--src/plugins/vcprojectmanager/widgets/schemaoptionswidget.cpp39
-rw-r--r--src/plugins/vcprojectmanager/widgets/schemaoptionswidget.h3
-rw-r--r--src/plugins/vcprojectmanager/widgets/vcprojectkitconfigwidget.cpp153
-rw-r--r--src/plugins/vcprojectmanager/widgets/vcprojectkitconfigwidget.h79
-rw-r--r--src/plugins/vcprojectmanager/widgets/widgets.pri6
26 files changed, 1335 insertions, 467 deletions
diff --git a/src/plugins/vcprojectmanager/msbuildversionmanager.cpp b/src/plugins/vcprojectmanager/msbuildversionmanager.cpp
new file mode 100644
index 0000000000..e2431b8855
--- /dev/null
+++ b/src/plugins/vcprojectmanager/msbuildversionmanager.cpp
@@ -0,0 +1,172 @@
+/**************************************************************************
+**
+** Copyright (c) 2013 Bojan Petrovic
+** Copyright (c) 2013 Radovan Zivkvoic
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** 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.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#include "msbuildversionmanager.h"
+
+#include "vcprojectmanagerconstants.h"
+
+#include <coreplugin/icore.h>
+#include <QStringList>
+
+namespace VcProjectManager {
+namespace Internal {
+
+MsBuildVersionManager *MsBuildVersionManager::m_instance = 0;
+
+MsBuildVersionManager *MsBuildVersionManager::instance()
+{
+ return m_instance;
+}
+
+MsBuildVersionManager::~MsBuildVersionManager()
+{
+ qDeleteAll(m_msBuildInfos);
+ m_msBuildInfos.clear();
+}
+
+bool MsBuildVersionManager::addMsBuildInformation(MsBuildInformation *msBuildInfo)
+{
+ if (!msBuildInfo)
+ return false;
+
+ foreach (MsBuildInformation *info, m_msBuildInfos)
+ if (info->m_executable == msBuildInfo->m_executable)
+ return false;
+
+ m_msBuildInfos.append(msBuildInfo);
+ emit msBuildAdded(msBuildInfo->getId());
+ return true;
+}
+
+QList<MsBuildInformation*> MsBuildVersionManager::msBuildInformations() const
+{
+ return m_msBuildInfos;
+}
+
+MsBuildInformation *MsBuildVersionManager::msBuildInformation(Core::Id msBuildID)
+{
+ foreach (MsBuildInformation *info, m_msBuildInfos)
+ if (info->getId() == msBuildID)
+ return info;
+ return 0;
+}
+
+MsBuildInformation *MsBuildVersionManager::msBuildInformation(MsBuildInformation::MsBuildVersion minVersion, MsBuildInformation::MsBuildVersion maxVersion)
+{
+ foreach (MsBuildInformation *info, m_msBuildInfos)
+ if (info->m_msBuildVersion >= minVersion && info->m_msBuildVersion <= maxVersion)
+ return info;
+
+ return 0;
+}
+
+void MsBuildVersionManager::removeMsBuildInformation(Core::Id msBuildId)
+{
+ for (int i = 0; i < m_msBuildInfos.size(); ++i) {
+ MsBuildInformation *info = m_msBuildInfos[i];
+ if (info->getId() == msBuildId) {
+ m_msBuildInfos.removeOne(info);
+ emit msBuildRemoved(msBuildId);
+ delete info;
+ return;
+ }
+ }
+}
+
+void MsBuildVersionManager::replace(Core::Id targetMsBuild, MsBuildInformation *newMsBuild)
+{
+ MsBuildInformation *oldMsBuild = msBuildInformation(targetMsBuild);
+
+ if (oldMsBuild) {
+ int index = m_msBuildInfos.indexOf(oldMsBuild);
+ m_msBuildInfos.replace(index, newMsBuild);
+ delete oldMsBuild;
+ emit msBuildReplaced(targetMsBuild, newMsBuild->getId());
+ }
+}
+
+void MsBuildVersionManager::saveSettings()
+{
+ QSettings *settings = Core::ICore::settings();
+ settings->beginWriteArray(QLatin1String(VcProjectManager::Constants::VC_PROJECT_MS_BUILD_INFORMATIONS));
+ for (int i = 0; i < m_msBuildInfos.size(); ++i) {
+ settings->setArrayIndex(i);
+ settings->setValue(QLatin1String(VcProjectManager::Constants::VC_PROJECT_MS_BUILD_EXECUTABLE), m_msBuildInfos[i]->m_executable);
+ settings->setValue(QLatin1String(VcProjectManager::Constants::VC_PROJECT_MS_BUILD_EXECUTABLE_VERSION), m_msBuildInfos[i]->m_versionString);
+ }
+ settings->endArray();
+}
+
+MsBuildInformation *MsBuildVersionManager::createMsBuildInfo(const QString &executablePath, const QString &version)
+{
+ MsBuildInformation *newMsBuild = new MsBuildInformation(executablePath, version);
+
+ // check if there is already a ms build with the same id, collision detection
+ MsBuildInformation *info = m_instance->msBuildInformation(newMsBuild->getId());
+ int i = 0;
+
+ // if there is a id collision continue to generate id until unique id is created
+ while (info)
+ {
+ QString argument = QString::number(i);
+ QString temp = newMsBuild->m_executable + newMsBuild->m_versionString + argument;
+ Core::Id newId(temp.toStdString().c_str());
+ newMsBuild->setId(newId);
+ info = m_instance->msBuildInformation(newMsBuild->getId());
+ ++i;
+ }
+
+ return newMsBuild;
+}
+
+MsBuildVersionManager::MsBuildVersionManager()
+{
+ m_instance = this;
+ loadSettings();
+}
+
+void MsBuildVersionManager::loadSettings()
+{
+ qDeleteAll(m_msBuildInfos);
+ m_msBuildInfos.clear();
+
+ QSettings *settings = Core::ICore::settings();
+ int size = settings->beginReadArray(QLatin1String(VcProjectManager::Constants::VC_PROJECT_MS_BUILD_INFORMATIONS));
+ for (int i = 0; i < size; ++i) {
+ settings->setArrayIndex(i);
+ MsBuildInformation *buildInfo = createMsBuildInfo(settings->value(QLatin1String(VcProjectManager::Constants::VC_PROJECT_MS_BUILD_EXECUTABLE)).toString(),
+ settings->value(QLatin1String(VcProjectManager::Constants::VC_PROJECT_MS_BUILD_EXECUTABLE_VERSION)).toString());
+ m_msBuildInfos.append(buildInfo);
+ }
+
+ settings->endArray();
+}
+
+} // namespace Internal
+} // namespace VcProjectManager
diff --git a/src/plugins/vcprojectmanager/msbuildversionmanager.h b/src/plugins/vcprojectmanager/msbuildversionmanager.h
new file mode 100644
index 0000000000..ad92393c1f
--- /dev/null
+++ b/src/plugins/vcprojectmanager/msbuildversionmanager.h
@@ -0,0 +1,127 @@
+/**************************************************************************
+**
+** Copyright (c) 2013 Bojan Petrovic
+** Copyright (c) 2013 Radovan Zivkvoic
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** 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.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#ifndef VCPROJECTMANAGER_INTERNAL_MSBUILDVERSIONMANAGER_H
+#define VCPROJECTMANAGER_INTERNAL_MSBUILDVERSIONMANAGER_H
+
+#include <QObject>
+#include <QString>
+#include <QList>
+
+#include <coreplugin/id.h>
+
+namespace VcProjectManager {
+namespace Internal {
+
+class MsBuildInformation {
+public:
+ enum MsBuildVersion {
+ MSBUILD_V_2_0 = 0,
+ MSBUILD_V_3_0 = 1,
+ MSBUILD_V_3_5 = 2,
+ MSBUILD_V_4_0 = 3,
+ MSBUILD_V_UNKNOWN = 4
+ };
+
+ MsBuildInformation(const QString &executablePath, const QString &version)
+ : m_executable(executablePath),
+ m_versionString(version)
+ {
+ if (version.startsWith(QLatin1String("2.")))
+ m_msBuildVersion = MSBUILD_V_2_0;
+ else if (version.startsWith(QLatin1String("3.0")))
+ m_msBuildVersion = MSBUILD_V_3_0;
+ else if (version.startsWith(QLatin1String("3.5")))
+ m_msBuildVersion = MSBUILD_V_3_5;
+ else if (version.startsWith(QLatin1String("4.0")))
+ m_msBuildVersion = MSBUILD_V_4_0;
+ else
+ m_msBuildVersion = MSBUILD_V_UNKNOWN;
+
+ QString temp = executablePath;
+ temp += version;
+ m_id = Core::Id(temp.toStdString().c_str());
+ }
+
+ Core::Id getId() const
+ {
+ return m_id;
+ }
+
+ void setId(Core::Id id)
+ {
+ m_id = id;
+ }
+
+ QString m_executable;
+ MsBuildVersion m_msBuildVersion;
+ QString m_versionString;
+
+private:
+ Core::Id m_id;
+};
+
+class MsBuildVersionManager : public QObject
+{
+ friend class VcProjectManagerPlugin;
+
+ Q_OBJECT
+
+public:
+ static MsBuildVersionManager *instance();
+ ~MsBuildVersionManager();
+
+ bool addMsBuildInformation(MsBuildInformation *msBuildInfo);
+ QList<MsBuildInformation *> msBuildInformations() const;
+ MsBuildInformation* msBuildInformation(Core::Id msBuildID);
+ MsBuildInformation* msBuildInformation(MsBuildInformation::MsBuildVersion minVersion, MsBuildInformation::MsBuildVersion maxVersion);
+ void removeMsBuildInformation(Core::Id msBuildId);
+ void replace(Core::Id targetMsBuild, MsBuildInformation *newMsBuild);
+
+ void saveSettings();
+
+ static MsBuildInformation* createMsBuildInfo(const QString &executablePath, const QString &version);
+
+signals:
+ void msBuildAdded(Core::Id id);
+ void msBuildReplaced(Core::Id oldMsBuild, Core::Id newMsBuild);
+ void msBuildRemoved(Core::Id msBuildId);
+
+private:
+ MsBuildVersionManager();
+ void loadSettings();
+
+ static MsBuildVersionManager *m_instance;
+ QList<MsBuildInformation *> m_msBuildInfos;
+};
+
+} // namespace Internal
+} // namespace VcProjectManager
+
+#endif // VCPROJECTMANAGER_INTERNAL_MSBUILDVERSIONMANAGER_H
diff --git a/src/plugins/vcprojectmanager/vcmakestep.cpp b/src/plugins/vcprojectmanager/vcmakestep.cpp
index 5e6d20b1e8..56ea909929 100644
--- a/src/plugins/vcprojectmanager/vcmakestep.cpp
+++ b/src/plugins/vcprojectmanager/vcmakestep.cpp
@@ -33,11 +33,14 @@
#include "vcprojectbuildconfiguration.h"
#include "vcprojectbuildoptionspage.h"
#include "vcprojectfile.h"
+#include "vcprojectkitinformation.h"
#include "vcprojectmanager.h"
#include "vcprojectmanagerconstants.h"
+#include "msbuildversionmanager.h"
#include <coreplugin/icore.h>
#include <projectexplorer/buildsteplist.h>
+#include <projectexplorer/kit.h>
#include <projectexplorer/project.h>
#include <projectexplorer/projectconfiguration.h>
#include <projectexplorer/projectexplorerconstants.h>
@@ -71,17 +74,20 @@ VcMakeStep::~VcMakeStep()
bool VcMakeStep::init()
{
VcProjectBuildConfiguration *bc = vcProjectBuildConfiguration();
+ MsBuildInformation *msBuild = VcProjectKitInformation::msBuildInfo(target()->kit());
- if (!bc || m_msBuildCommand.isEmpty()) {
+ if (!bc || !msBuild || msBuild->m_executable.isEmpty()) {
m_tasks.append(ProjectExplorer::Task(ProjectExplorer::Task::Error,
- tr("Qt Creator didn't detected any proper build tool for .vcproj files."),
+ tr("Kit doesn't contain any proper MS Build tool for .vcproj files."),
Utils::FileName(), -1,
Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)));
- return true;
}
m_processParams = processParameters();
- m_processParams->setCommand(m_msBuildCommand);
+
+ if (msBuild)
+ m_processParams->setCommand(msBuild->m_executable);
+
m_processParams->setMacroExpander(bc->macroExpander());
m_processParams->setEnvironment(bc->environment());
m_processParams->setWorkingDirectory(bc->buildDirectory());
@@ -90,21 +96,10 @@ bool VcMakeStep::init()
VcProjectFile* document = static_cast<VcProjectFile *>(project->document());
m_processParams->setArguments(document->filePath());
- if (!m_buildArguments.isEmpty()) {
- QStringListIterator it(m_buildArguments);
- QString arguments(document->filePath());
- arguments += QLatin1Char(' ');
-
- while (it.hasNext()) {
- arguments += it.next();
- arguments += QLatin1Char(' ');
- }
-
- m_processParams->setArguments(arguments);
- }
+ if (!m_buildArguments.isEmpty())
+ m_processParams->setArguments(m_buildArguments.join(QLatin1String(" ")));
setOutputParser(new MsBuildOutputParser);
-
return AbstractProcessStep::init();
}
@@ -120,15 +115,11 @@ void VcMakeStep::run(QFutureInterface<bool> &fi)
if (!canContinue) {
emit addOutput(tr("Configuration is faulty. Check the Issues view for details."), BuildStep::MessageOutput);
fi.reportResult(false);
+ emit finished();
return;
}
- m_futureInterface = &fi;
- m_futureInterface->setProgressRange(0, 100);
AbstractProcessStep::run(fi);
- m_futureInterface->setProgressValue(100);
- m_futureInterface->reportFinished();
- m_futureInterface = 0;
}
ProjectExplorer::BuildStepConfigWidget *VcMakeStep::createConfigWidget()
@@ -146,22 +137,6 @@ VcProjectBuildConfiguration *VcMakeStep::vcProjectBuildConfiguration() const
return static_cast<VcProjectBuildConfiguration *>(buildConfiguration());
}
-QString VcMakeStep::msBuildCommand() const
-{
- return m_msBuildCommand;
-}
-
-QString VcMakeStep::msBuildVersion() const
-{
- return m_msBuildVersion;
-}
-
-void VcMakeStep::setMsBuildCommand(const QString &msBuild, const QString &version)
-{
- m_msBuildCommand = msBuild;
- m_msBuildVersion = version;
-}
-
QStringList VcMakeStep::buildArguments() const
{
return m_buildArguments;
@@ -169,20 +144,13 @@ QStringList VcMakeStep::buildArguments() const
QString VcMakeStep::buildArgumentsToString() const
{
- QStringListIterator it(m_buildArguments);
- QString buildArguments;
-
- if (it.hasNext())
- buildArguments += it.next();
-
- while (it.hasNext())
- buildArguments += QLatin1Char(' ') + it.next();
-
- return buildArguments;
+ return m_buildArguments.join(QLatin1String(" "));
}
void VcMakeStep::addBuildArgument(const QString &argument)
{
+ if (m_buildArguments.contains(argument))
+ return;
m_buildArguments.append(argument);
}
@@ -194,16 +162,12 @@ void VcMakeStep::removeBuildArgument(const QString &buildArgument)
QVariantMap VcMakeStep::toMap() const
{
QVariantMap map = BuildStep::toMap();
- map.insert(QLatin1String(Constants::VC_PROJECT_MS_BUILD_EXECUTABLE), m_msBuildCommand);
- map.insert(QLatin1String(Constants::VC_PROJECT_MS_BUILD_EXECUTABLE_VERSION), m_msBuildVersion);
map.insert(QLatin1String(Constants::VC_PROJECT_MS_BUILD_ARGUMENT_LIST), m_buildArguments);
return map;
}
bool VcMakeStep::fromMap(const QVariantMap &map)
{
- m_msBuildCommand = map.value(QLatin1String(Constants::VC_PROJECT_MS_BUILD_EXECUTABLE)).toString();
- m_msBuildVersion = map.value(QLatin1String(Constants::VC_PROJECT_MS_BUILD_EXECUTABLE_VERSION)).toString();
m_buildArguments = map.value(QLatin1String(Constants::VC_PROJECT_MS_BUILD_ARGUMENT_LIST)).toStringList();
return BuildStep::fromMap(map);
}
@@ -228,51 +192,16 @@ VcMakeStepConfigWidget::VcMakeStepConfigWidget(VcMakeStep *makeStep) :
mainLayout->setMargin(0);
mainLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
- m_msBuildComboBox = new QComboBox();
m_msBuildPath = new QLabel();
mainLayout->addRow(tr("Command:"), m_msBuildPath);
- mainLayout->addRow(tr("MS Build:"), m_msBuildComboBox);
setLayout(mainLayout);
- if (m_makeStep) {
- VcProjectBuildConfiguration *bc = m_makeStep->vcProjectBuildConfiguration();
- ProjectExplorer::Project *project = bc->target()->project();
- VcManager *vcManager = static_cast<VcManager *>(project->projectManager());
- QVector<MsBuildInformation *> msBuildInfos = vcManager->buildOptionsPage()->msBuilds();
-
- if (msBuildInfos.size()) {
- foreach (const MsBuildInformation *msBuild, msBuildInfos) {
- if (!msBuild->m_executable.isEmpty()) {
- QFileInfo fileInfo(msBuild->m_executable);
- QString buildName = fileInfo.fileName() + QLatin1Char(' ') + msBuild->m_version;
- QVariant msBuildFullPath(msBuild->m_executable + QLatin1Char(';') + msBuild->m_version);
- m_msBuildComboBox->addItem(buildName, msBuildFullPath);
-
- if (msBuild->m_executable == m_makeStep->msBuildCommand() && m_msBuildComboBox->count() - 1 >= 0)
- m_msBuildComboBox->setCurrentIndex(m_msBuildComboBox->count() - 1);
- }
- }
- }
- else {
- m_msBuildPath->setText(tr("No Ms Build tools found."));
- m_msBuildComboBox->setEnabled(false);
- }
-
- // NOTE(Radovan): place Ms Build settings read from our .user file for selected MS Build for this project
- // and setting that ms build as ms build command in this make step
- if (m_makeStep->msBuildCommand().isEmpty() && m_msBuildComboBox->count()) {
- m_msBuildComboBox->setCurrentIndex(0);
- onMsBuildSelectionChanged(0);
- }
-
- m_msBuildPath->setText(m_makeStep->msBuildCommand());
-
- connect(m_msBuildComboBox, SIGNAL(currentIndexChanged(int)),
- this, SLOT(onMsBuildSelectionChanged(int)));
-
- connect(vcManager->buildOptionsPage(), SIGNAL(vcOptionsUpdated()),
- this, SLOT(onMsBuildInformationsUpdated()));
- }
+ MsBuildInformation *msBuild = VcProjectKitInformation::msBuildInfo(m_makeStep->target()->kit());
+
+ if (m_makeStep)
+ m_msBuildPath->setText(msBuild->m_executable);
+
+ connect(m_makeStep->target(), SIGNAL(kitChanged()), this, SLOT(msBuildUpdated()));
}
QString VcMakeStepConfigWidget::displayName() const
@@ -285,65 +214,28 @@ QString VcMakeStepConfigWidget::summaryText() const
VcProjectBuildConfiguration *bc = m_makeStep->vcProjectBuildConfiguration();
ProjectExplorer::Project *project = bc->target()->project();
VcProjectFile* document = static_cast<VcProjectFile *>(project->document());
- QFileInfo fileInfo(m_makeStep->msBuildCommand());
+ MsBuildInformation *msBuild = VcProjectKitInformation::msBuildInfo(m_makeStep->target()->kit());
+
+ QFileInfo fileInfo(msBuild->m_executable);
return QString(QLatin1String("<b>MsBuild:</b> %1 %2 %3")).arg(fileInfo.fileName())
.arg(document->filePath())
.arg(m_makeStep->buildArgumentsToString());
}
-void VcMakeStepConfigWidget::onMsBuildSelectionChanged(int index)
+void VcMakeStepConfigWidget::msBuildUpdated()
{
- if (m_makeStep && m_msBuildComboBox && 0 <= index && index < m_msBuildComboBox->count()) {
- QStringList data = m_msBuildComboBox->itemData(index).toString().split(QLatin1Char(';'));
- m_makeStep->setMsBuildCommand(data.at(0), // ms build full path
- data.at(1)); // ms build version
- m_msBuildPath->setText(m_makeStep->msBuildCommand());
- }
-}
+ VcProjectBuildConfiguration *bc = static_cast<VcProjectBuildConfiguration *>(m_makeStep->buildConfiguration());
-void VcMakeStepConfigWidget::onMsBuildInformationsUpdated()
-{
- disconnect(m_msBuildComboBox, SIGNAL(currentIndexChanged(int)),
- this, SLOT(onMsBuildSelectionChanged(int)));
+ if (bc && bc->target() && bc->target()->kit()) {
+ MsBuildVersionManager *msBVM = MsBuildVersionManager::instance();
+ MsBuildInformation *info = msBVM->msBuildInformation(Core::Id::fromSetting(bc->target()->kit()->value(Core::Id(Constants::VC_PROJECT_KIT_INFO_ID))));
- m_msBuildComboBox->clear();
- VcProjectBuildConfiguration *bc = m_makeStep->vcProjectBuildConfiguration();
- ProjectExplorer::Project *project = bc->target()->project();
- VcManager *vcManager = static_cast<VcManager *>(project->projectManager());
- QVector<MsBuildInformation *> msBuildInfos = vcManager->buildOptionsPage()->msBuilds();
- bool msBuildExists = false;
-
- foreach (const MsBuildInformation *msBuild, msBuildInfos) {
- if (!msBuild->m_executable.isEmpty()) {
- QFileInfo fileInfo(msBuild->m_executable);
- QString buildName = fileInfo.fileName() + QLatin1Char(' ') + msBuild->m_version;
- QVariant msBuildFullPath(msBuild->m_executable + QLatin1Char(';') + msBuild->m_version);
- m_msBuildComboBox->addItem(buildName, msBuildFullPath);
-
- if (!m_makeStep->msBuildCommand().isEmpty() && msBuild->m_executable == m_makeStep->msBuildCommand()) {
- m_msBuildComboBox->setCurrentIndex(m_msBuildComboBox->count() - 1);
- msBuildExists = true;
- }
- }
- }
-
- if (!msBuildExists) {
- if (m_msBuildComboBox->count()) {
- onMsBuildSelectionChanged(m_msBuildComboBox->currentIndex());
+ if (info)
+ m_msBuildPath->setText(info->m_executable);
- if (!m_msBuildComboBox->isEnabled())
- m_msBuildComboBox->setEnabled(true);
- }
-
- else {
- m_makeStep->setMsBuildCommand(QString(), QString());
- m_msBuildPath->setText(tr("No Ms Build tools found."));
- m_msBuildComboBox->setEnabled(false);
- }
+ else
+ m_msBuildPath->setText(tr("<MS Build not available>"));
}
-
- connect(m_msBuildComboBox, SIGNAL(currentIndexChanged(int)),
- this, SLOT(onMsBuildSelectionChanged(int)));
}
////////////////////
@@ -403,11 +295,9 @@ ProjectExplorer::BuildStep *VcMakeStepFactory::restore(ProjectExplorer::BuildSte
QList<Core::Id> VcMakeStepFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const
{
- if (parent->target() && parent->target()->project()) {
- if (parent->target()->project()->id() == Constants::VC_PROJECT_ID) {
+ if (parent->target() && parent->target()->project() && parent->target()->project()->id() == Constants::VC_PROJECT_ID)
return QList<Core::Id>() << Core::Id(MS_ID);
- }
- }
+
return QList<Core::Id>();
}
diff --git a/src/plugins/vcprojectmanager/vcmakestep.h b/src/plugins/vcprojectmanager/vcmakestep.h
index 09b58c1ecc..0b775827a3 100644
--- a/src/plugins/vcprojectmanager/vcmakestep.h
+++ b/src/plugins/vcprojectmanager/vcmakestep.h
@@ -39,7 +39,6 @@ namespace VcProjectManager {
namespace Internal {
class VcProjectBuildConfiguration;
-struct MsBuildInformation;
class VcMakeStep : public ProjectExplorer::AbstractProcessStep
{
@@ -56,18 +55,15 @@ public:
bool immutable() const;
VcProjectBuildConfiguration *vcProjectBuildConfiguration() const;
- QString msBuildCommand() const;
- QString msBuildVersion() const;
- void setMsBuildCommand(const QString &msBuild, const QString &version);
QStringList buildArguments() const;
QString buildArgumentsToString() const;
void addBuildArgument(const QString &argument);
void removeBuildArgument(const QString &buildArgument);
QVariantMap toMap() const;
- bool fromMap(const QVariantMap &map);
protected:
+ bool fromMap(const QVariantMap &map);
void stdOutput(const QString &line);
private:
@@ -76,8 +72,6 @@ private:
QList<ProjectExplorer::Task> m_tasks;
QFutureInterface<bool> *m_futureInterface;
ProjectExplorer::ProcessParameters *m_processParams;
- QString m_msBuildCommand;
- QString m_msBuildVersion;
QStringList m_buildArguments;
};
@@ -90,12 +84,10 @@ public:
QString summaryText() const;
private slots:
- void onMsBuildSelectionChanged(int index);
- void onMsBuildInformationsUpdated();
+ void msBuildUpdated(); // called when current ms build is chenged in kit information
private:
VcMakeStep *m_makeStep;
- QComboBox *m_msBuildComboBox;
QLabel *m_msBuildPath;
};
diff --git a/src/plugins/vcprojectmanager/vcproject.cpp b/src/plugins/vcprojectmanager/vcproject.cpp
index 50cc216c40..bca28e8230 100644
--- a/src/plugins/vcprojectmanager/vcproject.cpp
+++ b/src/plugins/vcprojectmanager/vcproject.cpp
@@ -32,6 +32,7 @@
#include "vcprojectfile.h"
#include "vcmakestep.h"
#include "vcprojectmanager.h"
+#include "vcprojectkitinformation.h"
#include "vcprojectmanagerconstants.h"
#include "vcprojectbuildconfiguration.h"
#include "vcprojectmodel/vcdocumentmodel.h"
@@ -51,7 +52,6 @@
#include <projectexplorer/buildsteplist.h>
#include <projectexplorer/headerpath.h>
#include <projectexplorer/kit.h>
-#include <projectexplorer/kitinformation.h>
#include <projectexplorer/kitmanager.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h>
@@ -74,17 +74,9 @@ class VCProjKitMatcher : public KitMatcher
public:
bool matches(const Kit *k) const
{
- ToolChain *tc = ToolChainKitInformation::toolChain(k);
- QTC_ASSERT(tc, return false);
- Abi abi = tc->targetAbi();
- switch (abi.osFlavor()) {
- case Abi::WindowsMsvc2005Flavor:
- case Abi::WindowsMsvc2008Flavor:
- case Abi::WindowsCEFlavor:
- return true;
- default:
- return false;
- }
+ MsBuildInformation *msBuild = VcProjectKitInformation::msBuildInfo(k);
+ QTC_ASSERT(msBuild, return false);
+ return true;
}
};
@@ -148,7 +140,21 @@ QStringList VcProject::files(Project::FilesMode fileMode) const
QString VcProject::defaultBuildDirectory() const
{
VcProjectFile* vcFile = static_cast<VcProjectFile *>(document());
- return vcFile->path() + QLatin1String("-build");
+ return vcFile->path()/* + QLatin1String("-build")*/;
+}
+
+MsBuildInformation::MsBuildVersion VcProject::minSupportedMsBuild() const
+{
+ if (m_projectFile && m_projectFile->documentModel() && m_projectFile->documentModel()->vcProjectDocument())
+ return m_projectFile->documentModel()->vcProjectDocument()->minSupportedMsBuildVersion();
+ return MsBuildInformation::MSBUILD_V_UNKNOWN;
+}
+
+MsBuildInformation::MsBuildVersion VcProject::maxSupportedMsBuild() const
+{
+ if (m_projectFile && m_projectFile->documentModel() && m_projectFile->documentModel()->vcProjectDocument())
+ return m_projectFile->documentModel()->vcProjectDocument()->maxSupportedMsBuildVersion();
+ return MsBuildInformation::MSBUILD_V_UNKNOWN;
}
bool VcProject::needsConfiguration() const
@@ -161,7 +167,7 @@ bool VcProject::supportsKit(Kit *k, QString *errorMessage) const
VCProjKitMatcher matcher;
if (!matcher.matches(k)) {
if (errorMessage)
- *errorMessage = tr("Kit toolchain does not support MSVC 2005 or 2008 ABI");
+ *errorMessage = tr("Kit toolchain does not support MSVC 2003, 2005 or 2008 ABI");
return false;
}
return true;
diff --git a/src/plugins/vcprojectmanager/vcproject.h b/src/plugins/vcprojectmanager/vcproject.h
index 216213e183..838057173e 100644
--- a/src/plugins/vcprojectmanager/vcproject.h
+++ b/src/plugins/vcprojectmanager/vcproject.h
@@ -31,6 +31,7 @@
#define VCPROJECTMANAGER_INTERNAL_VCPROJECT_H
#include "vcprojectmodel/vcprojectdocument_constants.h"
+#include "msbuildversionmanager.h"
#include <projectexplorer/buildstep.h>
#include <projectexplorer/namedwidget.h>
@@ -66,7 +67,8 @@ public:
ProjectExplorer::ProjectNode *rootProjectNode() const;
QStringList files(FilesMode fileMode) const;
QString defaultBuildDirectory() const;
-
+ MsBuildInformation::MsBuildVersion minSupportedMsBuild() const;
+ MsBuildInformation::MsBuildVersion maxSupportedMsBuild() const;
bool needsConfiguration() const;
bool supportsKit(ProjectExplorer::Kit *k, QString *errorMessage) const;
diff --git a/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.cpp b/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.cpp
index 0cc5c5194a..a9cef1867a 100644
--- a/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.cpp
+++ b/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.cpp
@@ -166,11 +166,6 @@ VcProjectBuildConfiguration *VcProjectBuildConfigurationFactory::create(ProjectE
bc->setDisplayName(buildConfigName);
bc->setDefaultDisplayName(buildConfigName);
- ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
-
- VcMakeStep *makeStep = new VcMakeStep(buildSteps);
- buildSteps->insertStep(0, makeStep);
-
return bc;
}
diff --git a/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.h b/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.h
index b36bf893b8..f93d57c26e 100644
--- a/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.h
+++ b/src/plugins/vcprojectmanager/vcprojectbuildconfiguration.h
@@ -27,8 +27,8 @@
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
-#ifndef VCPROJECTMANAGER_BUILDCONFIGURATION_H
-#define VCPROJECTMANAGER_BUILDCONFIGURATION_H
+#ifndef VCPROJECTMANAGER_INTERNAL_BUILDCONFIGURATION_H
+#define VCPROJECTMANAGER_INTERNAL_BUILDCONFIGURATION_H
#include "vcproject.h"
@@ -87,4 +87,4 @@ private:
} // namespace Internal
} // namespace VcProjectManager
-#endif // VCPROJECTBUILDCONFIGURATION_H
+#endif // VCPROJECTMANAGER_INTERNAL_BUILDCONFIGURATION_H
diff --git a/src/plugins/vcprojectmanager/vcprojectbuildoptionspage.cpp b/src/plugins/vcprojectmanager/vcprojectbuildoptionspage.cpp
index 1cd81890fe..b75a60abb5 100644
--- a/src/plugins/vcprojectmanager/vcprojectbuildoptionspage.cpp
+++ b/src/plugins/vcprojectmanager/vcprojectbuildoptionspage.cpp
@@ -30,8 +30,9 @@
#include "vcprojectbuildoptionspage.h"
#include "widgets/schemaoptionswidget.h"
+#include "msbuildversionmanager.h"
+#include "vcschemamanager.h"
-#include <coreplugin/icore.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <QDialogButtonBox>
@@ -92,6 +93,24 @@ void VcProjectEditMsBuildDialog::showBrowseFileDialog()
m_pathChooser->setText(QFileDialog::getOpenFileName(0, tr("Select Ms Build"), QString(), QLatin1String("*.exe")));
}
+MsBuildTableItem::MsBuildTableItem()
+{
+}
+
+MsBuildTableItem::~MsBuildTableItem()
+{
+}
+
+Core::Id MsBuildTableItem::msBuildID() const
+{
+ return m_id;
+}
+
+void MsBuildTableItem::setMsBuildID(Core::Id id)
+{
+ m_id = id;
+}
+
VcProjectBuildOptionsWidget::VcProjectBuildOptionsWidget(QWidget *parent) :
QWidget(parent)
{
@@ -137,119 +156,184 @@ VcProjectBuildOptionsWidget::VcProjectBuildOptionsWidget(QWidget *parent) :
connect(m_editBuildButton, SIGNAL(clicked()), this, SIGNAL(editButtonClicked()));
connect(m_deleteBuildButton, SIGNAL(clicked()), this, SIGNAL(deleteButtonClicked()));
connect(m_buildTableWidget, SIGNAL(cellClicked(int, int)), this, SLOT(onTableRowIndexChange(int)));
+
+ MsBuildVersionManager *msBVM = MsBuildVersionManager::instance();
+ QList<MsBuildInformation *> msBuildInfos = msBVM->msBuildInformations();
+ foreach (MsBuildInformation *msBuildInfo, msBuildInfos)
+ insertMsBuildIntoTable(msBuildInfo);
+
+ connect(msBVM, SIGNAL(msBuildAdded(Core::Id)), this, SLOT(onMsBuildAdded(Core::Id)));
+ connect(msBVM, SIGNAL(msBuildRemoved(Core::Id)), this, SLOT(onMsBuildRemoved(Core::Id)));
+ connect(msBVM, SIGNAL(msBuildReplaced(Core::Id,Core::Id)), this, SLOT(onMsBuildReplaced(Core::Id,Core::Id)));
}
VcProjectBuildOptionsWidget::~VcProjectBuildOptionsWidget()
{
}
-MsBuildInformation VcProjectBuildOptionsWidget::build(int index)
+Core::Id VcProjectBuildOptionsWidget::currentSelectedBuildId() const
{
- MsBuildInformation msBuild;
- QString exePath;
- QString version;
+ QModelIndex currentIndex = m_buildTableWidget->selectionModel()->currentIndex();
- if (0 <= index && index < m_buildTableWidget->rowCount()) {
- exePath = m_buildTableWidget->item(index, 0)->text();
- version = m_buildTableWidget->item(index, 1)->text();
+ if (currentIndex.isValid()) {
+ MsBuildTableItem *item = static_cast<MsBuildTableItem *>(m_buildTableWidget->item(currentIndex.row(), 0));
+ return item->msBuildID(); // select ms build id
}
- msBuild.m_version = version;
- msBuild.m_executable = exePath;
- return msBuild;
+ return Core::Id();
}
-int VcProjectBuildOptionsWidget::buildCount()
+bool VcProjectBuildOptionsWidget::exists(const QString &exePath)
{
- return m_buildTableWidget->rowCount();
-}
+ for (int i = 0; i < m_buildTableWidget->rowCount(); ++i) {
+ QTableWidgetItem *item = m_buildTableWidget->item(i, 0);
-MsBuildInformation VcProjectBuildOptionsWidget::currentSelectedBuild() const
-{
- QModelIndex currentIndex = m_buildTableWidget->selectionModel()->currentIndex();
- if (currentIndex.isValid()) {
- MsBuildInformation msBuild;
- msBuild.m_executable = m_buildTableWidget->item(currentIndex.row(), 0)->text();
- msBuild.m_version = m_buildTableWidget->item(currentIndex.row(), 1)->text();
- return msBuild;
+ if (item->text() == exePath)
+ return true;
}
- return MsBuildInformation();
+ return false;
}
-int VcProjectBuildOptionsWidget::currentSelectedRow() const
+bool VcProjectBuildOptionsWidget::hasAnyBuilds() const
{
- if (m_buildTableWidget->selectionModel()->currentIndex().isValid())
- return m_buildTableWidget->selectionModel()->currentIndex().row();
- return -1;
+ return m_buildTableWidget->rowCount() >= 0 ? true : false;
}
-bool VcProjectBuildOptionsWidget::exists(const QString &exePath)
+void VcProjectBuildOptionsWidget::insertMSBuild(MsBuildInformation *msBuild)
+{
+ if (msBuild) {
+ insertMsBuildIntoTable(msBuild);
+ m_newMsBuilds.append(msBuild);
+ }
+}
+
+void VcProjectBuildOptionsWidget::removeMsBuild(Core::Id msBuildId)
{
for (int i = 0; i < m_buildTableWidget->rowCount(); ++i) {
- QTableWidgetItem *item = m_buildTableWidget->item(i, 0);
+ MsBuildTableItem *item = static_cast<MsBuildTableItem *>(m_buildTableWidget->item(i, 0));
- if (item->text() == exePath)
- return true;
+ if (item->msBuildID() == msBuildId) {
+ m_buildTableWidget->removeRow(i);
+ break;
+ }
}
- return false;
+ foreach (MsBuildInformation *info, m_newMsBuilds) {
+ if (info->getId() == msBuildId) {
+ m_newMsBuilds.removeAll(info);
+ return;
+ }
+ }
+
+ m_removedMsBuilds.append(msBuildId);
}
-void VcProjectBuildOptionsWidget::insertMSBuild(const MsBuildInformation &info)
+void VcProjectBuildOptionsWidget::replaceMsBuild(Core::Id msBuildId, MsBuildInformation *newMsBuild)
{
- QTableWidgetItem *exeTableItem = new QTableWidgetItem();
- exeTableItem->setFlags(exeTableItem->flags() ^ Qt::ItemIsEditable);
- exeTableItem->setText(info.m_executable);
+ // update data in table
+ for (int i = 0; i < m_buildTableWidget->rowCount(); ++i) {
+ MsBuildTableItem *item = static_cast<MsBuildTableItem *>(m_buildTableWidget->item(i, 0));
- QTableWidgetItem *versionTableItem = new QTableWidgetItem();
- versionTableItem->setFlags(versionTableItem->flags() ^ Qt::ItemIsEditable);
- versionTableItem->setText(info.m_version);
+ if (item->msBuildID() == msBuildId) {
+ item->setText(newMsBuild->m_executable);
+ item->setMsBuildID(newMsBuild->getId());
- m_buildTableWidget->insertRow(m_buildTableWidget->rowCount());
- m_buildTableWidget->setItem(m_buildTableWidget->rowCount() - 1, 0, exeTableItem);
- m_buildTableWidget->setItem(m_buildTableWidget->rowCount() - 1, 1, versionTableItem);
+ // update version column item
+ QTableWidgetItem *item2 = m_buildTableWidget->item(i, 1);
+ item2->setText(newMsBuild->m_versionString);
+ break;
+ }
+ }
- if (!m_buildTableWidget->selectionModel()->currentIndex().isValid())
- m_buildTableWidget->selectRow(0);
+ MsBuildVersionManager *msBVM = MsBuildVersionManager::instance();
- if (!m_editBuildButton->isEnabled())
- m_editBuildButton->setEnabled(true);
+ if (msBVM->msBuildInformation(msBuildId)) {
+ m_removedMsBuilds.append(msBuildId);
+ m_newMsBuilds.append(newMsBuild);
+ }
- if (!m_deleteBuildButton->isEnabled())
- m_deleteBuildButton->setEnabled(true);
+ else {
+ m_newMsBuilds.append(newMsBuild);
+ foreach (MsBuildInformation *info, m_newMsBuilds) {
+ if (info->getId() == msBuildId) {
+ m_newMsBuilds.removeAll(info);
+ break;
+ }
+ }
+ }
}
-void VcProjectBuildOptionsWidget::removeBuild(int index)
+void VcProjectBuildOptionsWidget::saveSettings() const
{
- if (0 <= index && index < m_buildTableWidget->rowCount())
- m_buildTableWidget->removeRow(index);
+ MsBuildVersionManager *msBVM = MsBuildVersionManager::instance();
- if (m_buildTableWidget->rowCount() <= 0) {
- m_editBuildButton->setEnabled(false);
- m_deleteBuildButton->setEnabled(false);
+ disconnect(msBVM, SIGNAL(msBuildAdded(Core::Id)), this, SLOT(onMsBuildAdded(Core::Id)));
+ disconnect(msBVM, SIGNAL(msBuildRemoved(Core::Id)), this, SLOT(onMsBuildRemoved(Core::Id)));
+ disconnect(msBVM, SIGNAL(msBuildReplaced(Core::Id,Core::Id)), this, SLOT(onMsBuildReplaced(Core::Id,Core::Id)));
+
+ if (msBVM) {
+ foreach (Core::Id id, m_removedMsBuilds)
+ msBVM->removeMsBuildInformation(id);
+
+ foreach (MsBuildInformation *info, m_newMsBuilds)
+ msBVM->addMsBuildInformation(info);
+
+ msBVM->saveSettings();
}
+
+ connect(msBVM, SIGNAL(msBuildAdded(Core::Id)), this, SLOT(onMsBuildAdded(Core::Id)));
+ connect(msBVM, SIGNAL(msBuildRemoved(Core::Id)), this, SLOT(onMsBuildRemoved(Core::Id)));
+ connect(msBVM, SIGNAL(msBuildReplaced(Core::Id,Core::Id)), this, SLOT(onMsBuildReplaced(Core::Id,Core::Id)));
+
+ m_schemaOptionsWidget->saveSettings();
+}
+
+SchemaOptionsWidget *VcProjectBuildOptionsWidget::schemaOptionsWidget() const
+{
+ return m_schemaOptionsWidget;
+}
+
+void VcProjectBuildOptionsWidget::onMsBuildAdded(Core::Id msBuildId)
+{
+ MsBuildVersionManager *msBVM = MsBuildVersionManager::instance();
+ MsBuildInformation *msBuild = msBVM->msBuildInformation(msBuildId);
+
+ if (msBuild)
+ insertMsBuildIntoTable(msBuild);
}
-void VcProjectBuildOptionsWidget::updateMsBuild(const QString &exePath, const MsBuildInformation &newMsBuildInfo)
+void VcProjectBuildOptionsWidget::onMsBuildReplaced(Core::Id oldMsBuildId, Core::Id newMsBuildId)
{
+ MsBuildVersionManager *msBVM = MsBuildVersionManager::instance();
+ MsBuildInformation *newMsBuild = msBVM->msBuildInformation(newMsBuildId);
+
+ // update data in table
for (int i = 0; i < m_buildTableWidget->rowCount(); ++i) {
- QTableWidgetItem *item = m_buildTableWidget->item(i, 0);
+ MsBuildTableItem *item = static_cast<MsBuildTableItem *>(m_buildTableWidget->item(i, 0));
- if (item->text() == exePath) {
- item->setText(newMsBuildInfo.m_executable);
+ if (item->msBuildID() == oldMsBuildId) {
+ item->setText(newMsBuild->m_executable);
+ item->setMsBuildID(newMsBuild->getId());
// update version column item
- item = m_buildTableWidget->item(i, 1);
- item->setText(newMsBuildInfo.m_version);
+ QTableWidgetItem *item2 = m_buildTableWidget->item(i, 1);
+ item2->setText(newMsBuild->m_versionString);
break;
}
}
}
-SchemaOptionsWidget *VcProjectBuildOptionsWidget::schemaOptionsWidget() const
+void VcProjectBuildOptionsWidget::onMsBuildRemoved(Core::Id msBuildId)
{
- return m_schemaOptionsWidget;
+ for (int i = 0; i < m_buildTableWidget->rowCount(); ++i) {
+ MsBuildTableItem *item = static_cast<MsBuildTableItem *>(m_buildTableWidget->item(i, 0));
+
+ if (item->msBuildID() == msBuildId) {
+ m_buildTableWidget->removeRow(i);
+ return;
+ }
+ }
}
void VcProjectBuildOptionsWidget::onTableRowIndexChange(int index)
@@ -267,6 +351,33 @@ void VcProjectBuildOptionsWidget::onTableRowIndexChange(int index)
emit currentBuildSelectionChanged(index);
}
+void VcProjectBuildOptionsWidget::insertMsBuildIntoTable(MsBuildInformation *msBuild)
+{
+ if (msBuild) {
+ MsBuildTableItem *exeTableItem = new MsBuildTableItem();
+ exeTableItem->setFlags(exeTableItem->flags() ^ Qt::ItemIsEditable);
+ exeTableItem->setText(msBuild->m_executable);
+ exeTableItem->setMsBuildID(msBuild->getId());
+
+ QTableWidgetItem *versionTableItem = new QTableWidgetItem();
+ versionTableItem->setFlags(versionTableItem->flags() ^ Qt::ItemIsEditable);
+ versionTableItem->setText(msBuild->m_versionString);
+
+ m_buildTableWidget->insertRow(m_buildTableWidget->rowCount());
+ m_buildTableWidget->setItem(m_buildTableWidget->rowCount() - 1, 0, exeTableItem);
+ m_buildTableWidget->setItem(m_buildTableWidget->rowCount() - 1, 1, versionTableItem);
+
+ if (!m_buildTableWidget->selectionModel()->currentIndex().isValid())
+ m_buildTableWidget->selectRow(0);
+
+ if (!m_editBuildButton->isEnabled())
+ m_editBuildButton->setEnabled(true);
+
+ if (!m_deleteBuildButton->isEnabled())
+ m_deleteBuildButton->setEnabled(true);
+ }
+}
+
VcProjectBuildOptionsPage::VcProjectBuildOptionsPage() :
m_optionsWidget(0)
{
@@ -278,7 +389,6 @@ VcProjectBuildOptionsPage::VcProjectBuildOptionsPage() :
// TODO(Radovan): create and set proper icon
setCategoryIcon(QLatin1String(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY_ICON));
- loadSettings();
}
VcProjectBuildOptionsPage::~VcProjectBuildOptionsPage()
@@ -289,12 +399,6 @@ QWidget *VcProjectBuildOptionsPage::createPage(QWidget *parent)
{
m_optionsWidget = new VcProjectBuildOptionsWidget(parent);
- foreach (const MsBuildInformation *msBuildInfo, m_msBuildInformations)
- m_optionsWidget->insertMSBuild(*msBuildInfo);
-
- foreach (const SchemaInformation schemaInfo, m_schemaInformations)
- m_optionsWidget->schemaOptionsWidget()->setSchemaPath(schemaInfo.m_schemaFilePath, schemaInfo.m_schemaVersion);
-
connect(m_optionsWidget, SIGNAL(addNewButtonClicked()), this, SLOT(addNewMsBuild()));
connect(m_optionsWidget, SIGNAL(editButtonClicked()), this, SLOT(editMsBuild()));
connect(m_optionsWidget, SIGNAL(deleteButtonClicked()), this, SLOT(deleteMsBuild()));
@@ -303,7 +407,7 @@ QWidget *VcProjectBuildOptionsPage::createPage(QWidget *parent)
void VcProjectBuildOptionsPage::apply()
{
- if (!m_optionsWidget || (m_optionsWidget && m_optionsWidget->buildCount() < 0))
+ if (!m_optionsWidget || (m_optionsWidget && !m_optionsWidget->hasAnyBuilds()))
return;
saveSettings();
@@ -313,104 +417,10 @@ void VcProjectBuildOptionsPage::finish()
{
}
-QVector<MsBuildInformation *> VcProjectBuildOptionsPage::msBuilds() const
-{
- return m_msBuildInformations;
-}
-
-QList<SchemaInformation> VcProjectBuildOptionsPage::schemaInfos() const
-{
- return m_schemaInformations;
-}
-
-void VcProjectBuildOptionsPage::loadSettings()
-{
- QSettings *settings = Core::ICore::settings();
- settings->beginGroup(QLatin1String(VcProjectManager::Constants::VC_PROJECT_SETTINGS_GROUP));
- QString msSchemaPathsData = settings->value(QLatin1String(VcProjectManager::Constants::VC_PROJECT_SCHEMA_PATH)).toString();
- QString msBuildInformationData = settings->value(QLatin1String(VcProjectManager::Constants::VC_PROJECT_MS_BUILD_INFORMATIONS)).toString();
- settings->endGroup();
-
- foreach (MsBuildInformation *msBuild, m_msBuildInformations)
- delete msBuild;
-
- m_msBuildInformations.clear();
-
- if (!msBuildInformationData.isEmpty()) {
- QStringList msBuildInformations = msBuildInformationData.split(QLatin1Char(';'));
-
- foreach (QString msBuildInfo, msBuildInformations) {
- QStringList msBuildData = msBuildInfo.split(QLatin1Char(','));
- MsBuildInformation *msBuild = new MsBuildInformation();
- msBuild->m_executable = msBuildData.first();
- msBuild->m_version = msBuildData.last();
- m_msBuildInformations.append(msBuild);
- }
- }
-
- QStringList schemaPaths = msSchemaPathsData.split(QLatin1Char(';'));
-
- foreach (QString schema, schemaPaths) {
- QStringList schemaData = schema.split(QLatin1String("::"));
- if (schemaData.size() == 2) {
- if (schemaData[0] == QLatin1String(Constants::VC_PROJECT_SCHEMA_2003_QUIALIFIER)) {
- SchemaInformation schemaInfo;
- schemaInfo.m_schemaVersion = Constants::SV_2003;
- schemaInfo.m_schemaFilePath = schemaData[1];
- m_schemaInformations.append(schemaInfo);
- }
- else if (schemaData[0] == QLatin1String(Constants::VC_PROJECT_SCHEMA_2005_QUIALIFIER)) {
- SchemaInformation schemaInfo;
- schemaInfo.m_schemaVersion = Constants::SV_2005;
- schemaInfo.m_schemaFilePath = schemaData[1];
- m_schemaInformations.append(schemaInfo);
- }
- else if (schemaData[0] == QLatin1String(Constants::VC_PROJECT_SCHEMA_2008_QUIALIFIER)) {
- SchemaInformation schemaInfo;
- schemaInfo.m_schemaVersion = Constants::SV_2008;
- schemaInfo.m_schemaFilePath = schemaData[1];
- m_schemaInformations.append(schemaInfo);
- }
- }
- }
-}
-
void VcProjectBuildOptionsPage::saveSettings()
{
- if (m_optionsWidget) {
- QString msBuildInformations;
-
- for (int i = 0; i < m_optionsWidget->buildCount(); ++i) {
- MsBuildInformation msBuildInfo = m_optionsWidget->build(i);
- msBuildInformations += msBuildInfo.m_executable + QLatin1Char(',') + msBuildInfo.m_version;
-
- if (i != m_optionsWidget->buildCount() - 1)
- msBuildInformations += QLatin1Char(';');
- }
-
- QString schemas = QLatin1String(Constants::VC_PROJECT_SCHEMA_2003_QUIALIFIER);
- schemas.append(QLatin1String("::"));
- schemas.append(m_optionsWidget->schemaOptionsWidget()->schemaPath(Constants::SV_2003));
- schemas.append(QLatin1Char(';'));
-
- schemas.append(QLatin1String(Constants::VC_PROJECT_SCHEMA_2005_QUIALIFIER));
- schemas.append(QLatin1String("::"));
- schemas.append(m_optionsWidget->schemaOptionsWidget()->schemaPath(Constants::SV_2005));
- schemas.append(QLatin1Char(';'));
-
- schemas.append(QLatin1String(Constants::VC_PROJECT_SCHEMA_2008_QUIALIFIER));
- schemas.append(QLatin1String("::"));
- schemas.append(m_optionsWidget->schemaOptionsWidget()->schemaPath(Constants::SV_2008));
-
- QSettings *settings = Core::ICore::settings();
- settings->beginGroup(QLatin1String(VcProjectManager::Constants::VC_PROJECT_SETTINGS_GROUP));
- settings->setValue(QLatin1String(VcProjectManager::Constants::VC_PROJECT_MS_BUILD_INFORMATIONS), msBuildInformations);
- settings->setValue(QLatin1String(VcProjectManager::Constants::VC_PROJECT_SCHEMA_PATH), schemas);
- settings->endGroup();
-
- loadSettings();
- emit vcOptionsUpdated();
- }
+ if (m_optionsWidget)
+ m_optionsWidget->saveSettings();
}
void VcProjectBuildOptionsPage::startVersionCheck()
@@ -445,28 +455,31 @@ void VcProjectBuildOptionsPage::addNewMsBuild()
void VcProjectBuildOptionsPage::editMsBuild()
{
- if (m_optionsWidget && m_optionsWidget->currentSelectedRow() != -1) {
- MsBuildInformation currentSelectedMsBuild = m_optionsWidget->currentSelectedBuild();
- m_validator.m_originalExecutable = currentSelectedMsBuild.m_executable;
+ if (m_optionsWidget) {
+ MsBuildVersionManager *msBVM = MsBuildVersionManager::instance();
+ MsBuildInformation *currentSelectedMsBuild = msBVM->msBuildInformation(m_optionsWidget->currentSelectedBuildId());
+
+ if (currentSelectedMsBuild) {
+ m_validator.m_originalMsInfoID = currentSelectedMsBuild->getId();
- VcProjectEditMsBuildDialog editDialog;
- editDialog.setPath(m_validator.m_originalExecutable);
+ VcProjectEditMsBuildDialog editDialog;
+ editDialog.setPath(currentSelectedMsBuild->m_executable);
- if (editDialog.exec() == QDialog::Accepted) {
- if (editDialog.path() == m_validator.m_originalExecutable)
- return;
+ if (editDialog.exec() == QDialog::Accepted) {
+ if (editDialog.path() == currentSelectedMsBuild->m_executable)
+ return;
- m_validator.m_requestType = VcProjectValidator::ValidationRequest_Edit;
- m_validator.m_executable = editDialog.path();
- startVersionCheck();
+ m_validator.m_requestType = VcProjectValidator::ValidationRequest_Edit;
+ m_validator.m_executable = editDialog.path();
+ startVersionCheck();
+ }
}
}
}
void VcProjectBuildOptionsPage::deleteMsBuild()
{
- if (m_optionsWidget && m_optionsWidget->buildCount() > 0)
- m_optionsWidget->removeBuild(m_optionsWidget->currentSelectedRow());
+ m_optionsWidget->removeMsBuild(m_optionsWidget->currentSelectedBuildId());
}
void VcProjectBuildOptionsPage::versionCheckFinished()
@@ -476,28 +489,16 @@ void VcProjectBuildOptionsPage::versionCheckFinished()
QStringList splitData = response.split(QLatin1Char('\n'));
if (m_validator.m_requestType == VcProjectValidator::ValidationRequest_Add) {
- MsBuildInformation newMsBuild;
- newMsBuild.m_executable = m_validator.m_executable;
- newMsBuild.m_version = splitData.last();
-
- if (m_optionsWidget)
- m_optionsWidget->insertMSBuild(newMsBuild);
+ MsBuildInformation *newMsBuild = MsBuildVersionManager::createMsBuildInfo(m_validator.m_executable, splitData.last());
+ m_optionsWidget->insertMSBuild(newMsBuild);
}
else if (m_validator.m_requestType == VcProjectValidator::ValidationRequest_Edit) {
- foreach (const MsBuildInformation *msBuildInfo, m_msBuildInformations) {
- if (msBuildInfo && msBuildInfo->m_executable == m_validator.m_originalExecutable) {
- MsBuildInformation newInfo;
- newInfo.m_version = splitData.last();
- newInfo.m_executable = m_validator.m_executable;
-
- // update table data
- if (m_optionsWidget)
- m_optionsWidget->updateMsBuild(m_validator.m_originalExecutable, newInfo);
-
- break;
- }
- }
+ MsBuildInformation *newMsBuildInfo = MsBuildVersionManager::createMsBuildInfo(m_validator.m_executable, splitData.last());
+
+ // update table data
+ if (m_optionsWidget)
+ m_optionsWidget->replaceMsBuild(m_validator.m_originalMsInfoID, newMsBuildInfo);
}
m_validator.m_process->deleteLater();
diff --git a/src/plugins/vcprojectmanager/vcprojectbuildoptionspage.h b/src/plugins/vcprojectmanager/vcprojectbuildoptionspage.h
index 38edfaec12..d6217e7150 100644
--- a/src/plugins/vcprojectmanager/vcprojectbuildoptionspage.h
+++ b/src/plugins/vcprojectmanager/vcprojectbuildoptionspage.h
@@ -27,12 +27,13 @@
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
-#ifndef VCPROJECTBUILDOPTIONSPAGE_H
-#define VCPROJECTBUILDOPTIONSPAGE_H
+#ifndef VCPROJECTMANAGER_INTERNAL_VCPROJECTBUILDOPTIONSPAGE_H
+#define VCPROJECTMANAGER_INTERNAL_VCPROJECTBUILDOPTIONSPAGE_H
#include <coreplugin/dialogs/ioptionspage.h>
#include <QDialog>
+#include <QTableWidgetItem>
#include "vcprojectmanagerconstants.h"
@@ -46,6 +47,7 @@ namespace VcProjectManager {
namespace Internal {
class SchemaOptionsWidget;
+class MsBuildInformation;
struct VcProjectValidator {
enum ValidationRequest {
@@ -53,22 +55,13 @@ struct VcProjectValidator {
ValidationRequest_Edit
};
- QString m_originalExecutable; // used only for ValidationRequest_Edit
+ Core::Id m_originalMsInfoID; // used only for ValidationRequest_Edit
+
QString m_executable;
QProcess *m_process;
ValidationRequest m_requestType;
};
-struct MsBuildInformation {
- QString m_executable;
- QString m_version;
-};
-
-struct SchemaInformation {
- Constants::SchemaVersion m_schemaVersion;
- QString m_schemaFilePath;
-};
-
class VcProjectEditMsBuildDialog : public QDialog
{
Q_OBJECT
@@ -88,6 +81,19 @@ private:
QPushButton *m_browseButton;
};
+class MsBuildTableItem : public QTableWidgetItem
+{
+public:
+ MsBuildTableItem();
+ ~MsBuildTableItem();
+
+ Core::Id msBuildID() const;
+ void setMsBuildID(Core::Id id);
+
+private:
+ Core::Id m_id;
+};
+
class VcProjectBuildOptionsWidget : public QWidget
{
Q_OBJECT
@@ -96,19 +102,24 @@ public:
VcProjectBuildOptionsWidget(QWidget *parent = 0);
~VcProjectBuildOptionsWidget();
- MsBuildInformation build(int index);
- int buildCount();
- MsBuildInformation currentSelectedBuild() const;
- int currentSelectedRow() const;
+ Core::Id currentSelectedBuildId() const;
bool exists(const QString &exePath);
- void insertMSBuild(const MsBuildInformation &info);
- void removeBuild(int index);
- void updateMsBuild(const QString &exePath, const MsBuildInformation &newMsBuildInfo);
+ bool hasAnyBuilds() const;
+ void insertMSBuild(MsBuildInformation *msBuild);
+ void removeMsBuild(Core::Id msBuildId);
+ void replaceMsBuild(Core::Id msBuildId, MsBuildInformation *newMsBuild);
+ void saveSettings() const;
SchemaOptionsWidget *schemaOptionsWidget() const;
private slots:
+ void onMsBuildAdded(Core::Id msBuildId);
+ void onMsBuildReplaced(Core::Id oldMsBuildId, Core::Id newMsBuildId);
+ void onMsBuildRemoved(Core::Id msBuildId);
void onTableRowIndexChange(int index);
+private:
+ void insertMsBuildIntoTable(MsBuildInformation *msBuild);
+
signals:
void addNewButtonClicked();
void editButtonClicked();
@@ -121,6 +132,9 @@ private:
QPushButton *m_deleteBuildButton;
QTableWidget *m_buildTableWidget;
SchemaOptionsWidget *m_schemaOptionsWidget;
+
+ QList<MsBuildInformation *> m_newMsBuilds;
+ QList<Core::Id> m_removedMsBuilds;
};
class VcProjectBuildOptionsPage : public Core::IOptionsPage
@@ -135,9 +149,6 @@ public:
void apply();
void finish();
- QVector<MsBuildInformation *> msBuilds() const;
- QList<SchemaInformation> schemaInfos() const;
- void loadSettings();
void saveSettings();
void startVersionCheck();
@@ -147,13 +158,7 @@ private slots:
void deleteMsBuild();
void versionCheckFinished();
-signals:
- void vcOptionsUpdated();
-
private:
- QVector<MsBuildInformation *> m_msBuildInformations;
- QList<SchemaInformation> m_schemaInformations;
- QStringList m_schemaPaths;
VcProjectBuildOptionsWidget *m_optionsWidget;
VcProjectValidator m_validator;
};
@@ -161,4 +166,4 @@ private:
} // namespace Internal
} // namespace VcProjectManager
-#endif // VCPROJECTBUILDOPTIONSPAGE_H
+#endif // VCPROJECTMANAGER_INTERNAL_VCPROJECTBUILDOPTIONSPAGE_H
diff --git a/src/plugins/vcprojectmanager/vcprojectkitinformation.cpp b/src/plugins/vcprojectmanager/vcprojectkitinformation.cpp
new file mode 100644
index 0000000000..82fc667760
--- /dev/null
+++ b/src/plugins/vcprojectmanager/vcprojectkitinformation.cpp
@@ -0,0 +1,169 @@
+/**************************************************************************
+**
+** Copyright (c) 2013 Bojan Petrovic
+** Copyright (c) 2013 Radovan Zivkvoic
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** 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.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#include "vcprojectkitinformation.h"
+#include "vcprojectmanagerconstants.h"
+#include "msbuildversionmanager.h"
+#include "widgets/vcprojectkitconfigwidget.h"
+
+#include <utils/qtcassert.h>
+#include <projectexplorer/projectexplorerconstants.h>
+
+namespace VcProjectManager {
+namespace Internal {
+
+VcProjectKitInformation::VcProjectKitInformation()
+{
+ MsBuildVersionManager *msBVM = MsBuildVersionManager::instance();
+
+ connect(msBVM, SIGNAL(msBuildRemoved(Core::Id)), this, SLOT(onMSBuildRemoved(Core::Id)));
+ connect(msBVM, SIGNAL(msBuildReplaced(Core::Id, Core::Id)), this, SLOT(onMSBuildReplaced(Core::Id, Core::Id)));
+}
+
+VcProjectKitInformation::~VcProjectKitInformation()
+{
+}
+
+Core::Id VcProjectKitInformation::dataId() const
+{
+ static Core::Id id = Core::Id(Constants::VC_PROJECT_KIT_INFO_ID);
+ return id;
+}
+
+unsigned int VcProjectKitInformation::priority() const
+{
+ return 100;
+}
+
+QVariant VcProjectKitInformation::defaultValue(Kit *) const
+{
+ QList<MsBuildInformation *> msBuilds = MsBuildVersionManager::instance()->msBuildInformations();
+
+ if (msBuilds.size() == 0)
+ return QVariant();
+
+ return msBuilds.at(0)->getId().toSetting();
+}
+
+QList<Task> VcProjectKitInformation::validate(const Kit *k) const
+{
+ QList<Task> result;
+
+ const MsBuildInformation* msBuild = msBuildInfo(k);
+ if (!msBuild) {
+ result << Task(Task::Error, tr("No MS Build in kit."),
+ Utils::FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
+ } else {
+ result << QList<Task>();
+ }
+ return result;
+}
+
+void VcProjectKitInformation::fix(Kit *k)
+{
+ QTC_ASSERT(MsBuildVersionManager::instance(), return);
+ if (msBuildInfo(k))
+ return;
+
+ qWarning("Ms Build is no longer known, removing from kit \"%s\".",
+ qPrintable(k->displayName()));
+ setMsBuild(k, 0); // make sure to clear out no longer known Ms Builds
+}
+
+void VcProjectKitInformation::setup(Kit *k)
+{
+ Core::Id id = Core::Id::fromSetting(k->value(Core::Id(Constants::VC_PROJECT_KIT_INFO_ID)));
+
+ if (!id.isValid())
+ return;
+
+ MsBuildVersionManager *msBVM = MsBuildVersionManager::instance();
+ MsBuildInformation *msBuild = msBVM->msBuildInformation(id);
+
+ if (msBuild)
+ return;
+
+ QList<MsBuildInformation *> msBuilds = msBVM->msBuildInformations();
+
+ if (msBuilds.size() > 0)
+ setMsBuild(k, msBuilds.at(0));
+}
+
+ProjectExplorer::KitInformation::ItemList VcProjectKitInformation::toUserOutput(const Kit *) const
+{
+ return ItemList() << qMakePair(tr("MsBuild Version"), tr("None"));
+}
+
+ProjectExplorer::KitConfigWidget *VcProjectKitInformation::createConfigWidget(Kit *k) const
+{
+ return new VcProjectKitConfigWidget(k);
+}
+
+MsBuildInformation *VcProjectKitInformation::msBuildInfo(const Kit *k)
+{
+ if (!k)
+ return 0;
+
+ MsBuildVersionManager *msBVM = MsBuildVersionManager::instance();
+ return msBVM->msBuildInformation(Core::Id::fromSetting(k->value(Core::Id(Constants::VC_PROJECT_KIT_INFO_ID))));
+}
+
+void VcProjectKitInformation::setMsBuild(Kit *k, MsBuildInformation *msBuild)
+{
+ k->setValue(Core::Id(Constants::VC_PROJECT_KIT_INFO_ID), msBuild ? msBuild->getId().toSetting() : QVariant());
+}
+
+void VcProjectKitInformation::onMSBuildAdded(Core::Id msBuildId)
+{
+ Q_UNUSED(msBuildId);
+ foreach (Kit *k, KitManager::instance()->kits()) {
+ fix(k);
+ notifyAboutUpdate(k);
+ }
+}
+
+void VcProjectKitInformation::onMSBuildRemoved(Core::Id msBuildId)
+{
+ Q_UNUSED(msBuildId);
+ foreach (Kit *k, KitManager::instance()->kits())
+ fix(k);
+}
+
+void VcProjectKitInformation::onMSBuildReplaced(Core::Id oldMsBuildId, Core::Id newMsBuildId)
+{
+ Q_UNUSED(oldMsBuildId);
+ foreach (Kit *k, KitManager::instance()->kits()) {
+ fix(k);
+ setMsBuild(k, MsBuildVersionManager::instance()->msBuildInformation(newMsBuildId));
+ notifyAboutUpdate(k);
+ }
+}
+
+} // namespace Internal
+} // namespace VcProjectManager
diff --git a/src/plugins/vcprojectmanager/vcprojectkitinformation.h b/src/plugins/vcprojectmanager/vcprojectkitinformation.h
new file mode 100644
index 0000000000..bc8908a755
--- /dev/null
+++ b/src/plugins/vcprojectmanager/vcprojectkitinformation.h
@@ -0,0 +1,78 @@
+/**************************************************************************
+**
+** Copyright (c) 2013 Bojan Petrovic
+** Copyright (c) 2013 Radovan Zivkvoic
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** 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.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#ifndef VCPROJECTMANAGER_INTERNAL_VCPROJECTKITINFORMATION_H
+#define VCPROJECTMANAGER_INTERNAL_VCPROJECTKITINFORMATION_H
+
+#include <projectexplorer/kitinformation.h>
+
+using namespace ProjectExplorer;
+using namespace ProjectExplorer::Internal;
+
+namespace VcProjectManager {
+namespace Internal {
+
+class MsBuildInformation;
+
+class VcProjectKitInformation : public ProjectExplorer::KitInformation
+{
+ Q_OBJECT
+
+public:
+ VcProjectKitInformation();
+ ~VcProjectKitInformation();
+
+ Core::Id dataId() const;
+ unsigned int priority() const; // the higher the closer to the top.
+ QVariant defaultValue(Kit *) const;
+
+ // called to find issues with the kit
+ QList<Task> validate(const Kit *k) const;
+ // called to fix issues with this kitinformation. Does not modify the rest of the kit.
+ void fix(Kit *k);
+ // called on initial setup of a kit.
+ void setup(Kit *k);
+
+ ItemList toUserOutput(const Kit *) const;
+ ProjectExplorer::KitConfigWidget *createConfigWidget(Kit *k) const;
+
+ static MsBuildInformation* msBuildInfo(const Kit *k);
+
+ static void setMsBuild(Kit *k, MsBuildInformation *msBuildId);
+
+private slots:
+ void onMSBuildAdded(Core::Id msBuildId);
+ void onMSBuildRemoved(Core::Id msBuildId);
+ void onMSBuildReplaced(Core::Id oldMsBuildId, Core::Id newMsBuildId);
+};
+
+} // namespace Internal
+} // namespace VcProjectManager
+
+#endif // VCPROJECTMANAGER_INTERNAL_VCPROJECTKITINFORMATION_H
diff --git a/src/plugins/vcprojectmanager/vcprojectmanager.cpp b/src/plugins/vcprojectmanager/vcprojectmanager.cpp
index 9f1dc91cc7..d4a3ec44c5 100644
--- a/src/plugins/vcprojectmanager/vcprojectmanager.cpp
+++ b/src/plugins/vcprojectmanager/vcprojectmanager.cpp
@@ -54,7 +54,6 @@ namespace Internal {
VcManager::VcManager(VcProjectBuildOptionsPage *configPage) :
m_configPage(configPage)
{
- connect(m_configPage, SIGNAL(vcOptionsUpdated()), SLOT(onOptionsPageUpdate()));
readSchemaPath();
}
@@ -103,38 +102,12 @@ ProjectExplorer::Project *VcManager::openProject(const QString &fileName, QStrin
return 0;
}
-QVector<MsBuildInformation *> VcManager::msBuilds() const
-{
- if (!m_configPage)
- return QVector<MsBuildInformation *>();
- return m_configPage->msBuilds();
-}
-
-VcProjectBuildOptionsPage *VcManager::buildOptionsPage()
-{
- return m_configPage;
-}
-
void VcManager::updateContextMenu(Project *project, ProjectExplorer::Node *node)
{
Q_UNUSED(node);
m_contextProject = project;
}
-void VcManager::onOptionsPageUpdate()
-{
- QList<SchemaInformation> schemaInfos = m_configPage->schemaInfos();
-
- foreach (SchemaInformation schema, schemaInfos) {
- if (schema.m_schemaVersion == Constants::SV_2003)
- m_vc2003Schema = schema.m_schemaFilePath;
- if (schema.m_schemaVersion == Constants::SV_2005)
- m_vc2005Schema = schema.m_schemaFilePath;
- if (schema.m_schemaVersion == Constants::SV_2008)
- m_vc2008Schema = schema.m_schemaFilePath;
- }
-}
-
bool VcManager::checkIfVersion2003(const QString &filePath) const
{
if (m_vc2003Schema.isEmpty()) {
diff --git a/src/plugins/vcprojectmanager/vcprojectmanager.h b/src/plugins/vcprojectmanager/vcprojectmanager.h
index eda07b8484..3792e6806a 100644
--- a/src/plugins/vcprojectmanager/vcprojectmanager.h
+++ b/src/plugins/vcprojectmanager/vcprojectmanager.h
@@ -39,7 +39,6 @@ namespace VcProjectManager {
namespace Internal {
class VcProjectBuildOptionsPage;
-struct MsBuildInformation;
class VcManager : public ProjectExplorer::IProjectManager
{
@@ -50,12 +49,9 @@ public:
QString mimeType() const;
ProjectExplorer::Project *openProject(const QString &fileName, QString *errorString);
- QVector<MsBuildInformation *> msBuilds() const;
- VcProjectBuildOptionsPage *buildOptionsPage();
private slots:
void updateContextMenu(ProjectExplorer::Project *project, ProjectExplorer::Node *node);
- void onOptionsPageUpdate();
private:
bool checkIfVersion2003(const QString &filePath) const;
diff --git a/src/plugins/vcprojectmanager/vcprojectmanager.pro b/src/plugins/vcprojectmanager/vcprojectmanager.pro
index 792d43722c..7a0c532aa6 100644
--- a/src/plugins/vcprojectmanager/vcprojectmanager.pro
+++ b/src/plugins/vcprojectmanager/vcprojectmanager.pro
@@ -10,16 +10,22 @@ HEADERS = vcprojectmanagerplugin.h \
vcproject.h \
vcprojectbuildconfiguration.h \
vcmakestep.h \
+ msbuildoutputparser.h \
+ vcprojectkitinformation.h \
+ msbuildversionmanager.h \
vcprojectbuildoptionspage.h \
- msbuildoutputparser.h
+ vcschemamanager.h
SOURCES = vcprojectmanagerplugin.cpp \
vcprojectmanager.cpp \
vcprojectfile.cpp \
vcproject.cpp \
vcprojectbuildconfiguration.cpp \
vcmakestep.cpp \
+ msbuildoutputparser.cpp \
+ vcprojectkitinformation.cpp \
+ msbuildversionmanager.cpp \
vcprojectbuildoptionspage.cpp \
- msbuildoutputparser.cpp
+ vcschemamanager.cpp
OTHER_FILES += \
VcProject.mimetypes.xml
diff --git a/src/plugins/vcprojectmanager/vcprojectmanagerconstants.h b/src/plugins/vcprojectmanager/vcprojectmanagerconstants.h
index c8f541abc4..5e11a34774 100644
--- a/src/plugins/vcprojectmanager/vcprojectmanagerconstants.h
+++ b/src/plugins/vcprojectmanager/vcprojectmanagerconstants.h
@@ -56,6 +56,7 @@ const char VC_PROJECT_SCHEMA_PATH[] = "VcProject.SchemaPath";
const char VC_PROJECT_SCHEMA_2003_QUIALIFIER[] = "Schema2003";
const char VC_PROJECT_SCHEMA_2005_QUIALIFIER[] = "Schema2005";
const char VC_PROJECT_SCHEMA_2008_QUIALIFIER[] = "Schema2008";
+const char VC_PROJECT_KIT_INFO_ID[] = "VcProject.KitInformation";
enum SchemaVersion
{
diff --git a/src/plugins/vcprojectmanager/vcprojectmanagerplugin.cpp b/src/plugins/vcprojectmanager/vcprojectmanagerplugin.cpp
index 101d058112..f4caba507a 100644
--- a/src/plugins/vcprojectmanager/vcprojectmanagerplugin.cpp
+++ b/src/plugins/vcprojectmanager/vcprojectmanagerplugin.cpp
@@ -29,11 +29,14 @@
****************************************************************************/
#include "vcprojectmanagerplugin.h"
+#include "msbuildversionmanager.h"
#include "vcprojectmanager.h"
#include "vcprojectmanagerconstants.h"
#include "vcprojectbuildconfiguration.h"
#include "vcprojectbuildoptionspage.h"
#include "vcmakestep.h"
+#include "vcprojectkitinformation.h"
+#include "vcschemamanager.h"
// TODO: clean up
#include <coreplugin/actionmanager/actionmanager.h>
@@ -43,6 +46,7 @@
#include <coreplugin/icontext.h>
#include <coreplugin/icore.h>
#include <coreplugin/mimedatabase.h>
+#include <projectexplorer/kitmanager.h>
#include <QAction>
#include <QMessageBox>
@@ -84,6 +88,10 @@ bool VcProjectManagerPlugin::initialize(const QStringList &arguments, QString *e
addAutoReleasedObject(new VcManager(confPage));
addAutoReleasedObject(new VcProjectBuildConfigurationFactory);
addAutoReleasedObject(new VcMakeStepFactory);
+ addAutoReleasedObject(new MsBuildVersionManager);
+ addAutoReleasedObject(new VcSchemaManager);
+
+ ProjectExplorer::KitManager::instance()->registerKitInformation(new VcProjectKitInformation);
return true;
}
diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp
index 5ab3a61d3b..66a0f63284 100644
--- a/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp
+++ b/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp
@@ -340,6 +340,16 @@ VcNodeWidget *VcProjectDocument2003::createSettingsWidget()
return new VcProjectDocument2003Widget(this);
}
+MsBuildInformation::MsBuildVersion VcProjectDocument2003::minSupportedMsBuildVersion() const
+{
+ return MsBuildInformation::MSBUILD_V_2_0;
+}
+
+MsBuildInformation::MsBuildVersion VcProjectDocument2003::maxSupportedMsBuildVersion() const
+{
+ return MsBuildInformation::MSBUILD_V_3_5;
+}
+
VcProjectDocument2003::VcProjectDocument2003(const QString &filePath)
: VcProjectDocument(filePath)
{
@@ -419,6 +429,16 @@ VcNodeWidget *VcProjectDocument2005::createSettingsWidget()
return new VcProjectDocument2005Widget(this);
}
+MsBuildInformation::MsBuildVersion VcProjectDocument2005::minSupportedMsBuildVersion() const
+{
+ return MsBuildInformation::MSBUILD_V_3_0;
+}
+
+MsBuildInformation::MsBuildVersion VcProjectDocument2005::maxSupportedMsBuildVersion() const
+{
+ return MsBuildInformation::MSBUILD_V_3_5;
+}
+
ToolFiles::Ptr VcProjectDocument2005::toolFiles() const
{
return m_toolFiles;
@@ -566,6 +586,16 @@ VcNodeWidget *VcProjectDocument2008::createSettingsWidget()
return new VcProjectDocument2008Widget(this);
}
+MsBuildInformation::MsBuildVersion VcProjectDocument2008::minSupportedMsBuildVersion() const
+{
+ return MsBuildInformation::MSBUILD_V_3_5;
+}
+
+MsBuildInformation::MsBuildVersion VcProjectDocument2008::maxSupportedMsBuildVersion() const
+{
+ return MsBuildInformation::MSBUILD_V_3_5;
+}
+
PublishingData::Ptr VcProjectDocument2008::publishingData() const
{
return m_publishingData;
diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.h b/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.h
index 3ab8c58d4f..1781481673 100644
--- a/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.h
+++ b/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.h
@@ -36,6 +36,7 @@
#include "configurations.h"
#include "files.h"
#include "globals.h"
+#include "../msbuildversionmanager.h"
#include "platforms.h"
#include "publishingdata.h"
#include "references.h"
@@ -57,6 +58,8 @@ public:
VcDocConstants::DocumentVersion documentVersion() const;
QString filePath() const;
void allProjectFiles(QStringList &sl) const;
+ virtual MsBuildInformation::MsBuildVersion minSupportedMsBuildVersion() const = 0;
+ virtual MsBuildInformation::MsBuildVersion maxSupportedMsBuildVersion() const = 0;
Configurations::Ptr configurations() const;
Platforms::Ptr platforms() const;
@@ -110,6 +113,8 @@ public:
~VcProjectDocument2003();
VcNodeWidget* createSettingsWidget();
+ MsBuildInformation::MsBuildVersion minSupportedMsBuildVersion() const;
+ MsBuildInformation::MsBuildVersion maxSupportedMsBuildVersion() const;
protected:
VcProjectDocument2003(const QString &filePath);
@@ -146,6 +151,9 @@ public:
~VcProjectDocument2005();
VcNodeWidget* createSettingsWidget();
+ MsBuildInformation::MsBuildVersion minSupportedMsBuildVersion() const;
+ MsBuildInformation::MsBuildVersion maxSupportedMsBuildVersion() const;
+
ToolFiles::Ptr toolFiles() const;
protected:
@@ -185,6 +193,9 @@ public:
~VcProjectDocument2008();
VcNodeWidget* createSettingsWidget();
+ MsBuildInformation::MsBuildVersion minSupportedMsBuildVersion() const;
+ MsBuildInformation::MsBuildVersion maxSupportedMsBuildVersion() const;
+
PublishingData::Ptr publishingData() const;
protected:
diff --git a/src/plugins/vcprojectmanager/vcschemamanager.cpp b/src/plugins/vcprojectmanager/vcschemamanager.cpp
new file mode 100644
index 0000000000..e08591be0b
--- /dev/null
+++ b/src/plugins/vcprojectmanager/vcschemamanager.cpp
@@ -0,0 +1,111 @@
+/**************************************************************************
+**
+** Copyright (c) 2013 Bojan Petrovic
+** Copyright (c) 2013 Radovan Zivkvoic
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** 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.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#include "vcschemamanager.h"
+
+#include <coreplugin/icore.h>
+
+#include <QSettings>
+#include <QStringList>
+
+namespace VcProjectManager {
+namespace Internal {
+
+VcSchemaManager* VcSchemaManager::m_instance = 0;
+
+VcSchemaManager *VcSchemaManager::instance()
+{
+ return m_instance;
+}
+
+VcSchemaManager::~VcSchemaManager()
+{
+}
+
+void VcSchemaManager::addSchema(const QString &schemaPath, Constants::SchemaVersion version)
+{
+ m_schemas.insert(version, schemaPath);
+}
+
+QString VcSchemaManager::schema(Constants::SchemaVersion version)
+{
+ return m_schemas.value(version);
+}
+
+void VcSchemaManager::setSchema(Constants::SchemaVersion version, const QString &schemaPath)
+{
+ m_schemas.insert(version, schemaPath);
+}
+
+void VcSchemaManager::removeSchema(Constants::SchemaVersion version)
+{
+ m_schemas.remove(version);
+}
+
+void VcSchemaManager::removeAllSchemas()
+{
+ m_schemas.clear();
+}
+
+void VcSchemaManager::saveSettings()
+{
+ QSettings *settings = Core::ICore::settings();
+ settings->beginWriteArray(QLatin1String(VcProjectManager::Constants::VC_PROJECT_SCHEMA_PATH));
+ settings->setArrayIndex(0);
+
+ settings->setValue(QLatin1String(Constants::VC_PROJECT_SCHEMA_2003_QUIALIFIER),
+ m_schemas.value(Constants::SV_2003));
+ settings->setValue(QLatin1String(Constants::VC_PROJECT_SCHEMA_2005_QUIALIFIER),
+ m_schemas.value(Constants::SV_2005));
+ settings->setValue(QLatin1String(Constants::VC_PROJECT_SCHEMA_2008_QUIALIFIER),
+ m_schemas.value(Constants::SV_2008));
+ settings->endArray();
+}
+
+VcSchemaManager::VcSchemaManager()
+{
+ m_instance = this;
+ loadSettings();
+}
+
+void VcSchemaManager::loadSettings()
+{
+ m_schemas.clear();
+
+ QSettings *settings = Core::ICore::settings();
+ settings->beginReadArray(QLatin1String(VcProjectManager::Constants::VC_PROJECT_SCHEMA_PATH));
+ settings->setArrayIndex(0);
+ m_schemas.insert(Constants::SV_2003, settings->value(QLatin1String(Constants::VC_PROJECT_SCHEMA_2003_QUIALIFIER)).toString());
+ m_schemas.insert(Constants::SV_2005, settings->value(QLatin1String(Constants::VC_PROJECT_SCHEMA_2005_QUIALIFIER)).toString());
+ m_schemas.insert(Constants::SV_2008, settings->value(QLatin1String(Constants::VC_PROJECT_SCHEMA_2008_QUIALIFIER)).toString());
+ settings->endArray();
+}
+
+} // namespace Internal
+} // namespace VcProjectManager
diff --git a/src/plugins/vcprojectmanager/vcschemamanager.h b/src/plugins/vcprojectmanager/vcschemamanager.h
new file mode 100644
index 0000000000..0a08430b5d
--- /dev/null
+++ b/src/plugins/vcprojectmanager/vcschemamanager.h
@@ -0,0 +1,69 @@
+/**************************************************************************
+**
+** Copyright (c) 2013 Bojan Petrovic
+** Copyright (c) 2013 Radovan Zivkvoic
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** 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.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#ifndef VCPROJECTMANAGER_INTERNAL_VCSCHEMAMANAGER_H
+#define VCPROJECTMANAGER_INTERNAL_VCSCHEMAMANAGER_H
+
+#include "vcprojectmanagerconstants.h"
+#include <QMap>
+#include <QObject>
+
+namespace VcProjectManager {
+namespace Internal {
+
+class VcSchemaManager : public QObject
+{
+ friend class VcProjectManagerPlugin;
+ Q_OBJECT
+
+public:
+ static VcSchemaManager* instance();
+ ~VcSchemaManager();
+
+ void addSchema(const QString &schemaPath, Constants::SchemaVersion version);
+ QString schema(Constants::SchemaVersion version);
+ void setSchema(Constants::SchemaVersion version, const QString &schemaPath);
+ void removeSchema(Constants::SchemaVersion version);
+
+ void removeAllSchemas();
+
+ void saveSettings();
+
+private:
+ VcSchemaManager();
+ void loadSettings();
+
+ static VcSchemaManager *m_instance;
+ QMap<Constants::SchemaVersion, QString> m_schemas;
+};
+
+} // namespace Internal
+} // namespace VcProjectManager
+
+#endif // VCPROJECTMANAGER_INTERNAL_VCSCHEMAMANAGER_H
diff --git a/src/plugins/vcprojectmanager/widgets/schemaoptionswidget.cpp b/src/plugins/vcprojectmanager/widgets/schemaoptionswidget.cpp
index 78099a489e..cfbdc0e89a 100644
--- a/src/plugins/vcprojectmanager/widgets/schemaoptionswidget.cpp
+++ b/src/plugins/vcprojectmanager/widgets/schemaoptionswidget.cpp
@@ -29,6 +29,7 @@
****************************************************************************/
#include "schemaoptionswidget.h"
#include "ui_schemaoptionswidget.h"
+#include "../vcschemamanager.h"
#include <QFileDialog>
@@ -41,6 +42,14 @@ SchemaOptionsWidget::SchemaOptionsWidget(QWidget *parent) :
{
ui->setupUi(this);
+ VcSchemaManager *schemaManager = VcSchemaManager::instance();
+
+ if (schemaManager) {
+ ui->m_schema2003LineEdit->setText(schemaManager->schema(Constants::SV_2003));
+ ui->m_schema2005LineEdit->setText(schemaManager->schema(Constants::SV_2005));
+ ui->m_schema2008LineEdit->setText(schemaManager->schema(Constants::SV_2008));
+ }
+
connect(ui->m_schema2003BrowseButton, SIGNAL(clicked()), this, SLOT(onBrowseSchema2003ButtonClick()));
connect(ui->m_schema2005BrowseButton, SIGNAL(clicked()), this, SLOT(onBrowseSchema2005ButtonClick()));
connect(ui->m_schema2008BrowseButton, SIGNAL(clicked()), this, SLOT(onBrowseSchema2008ButtonClick()));
@@ -51,32 +60,16 @@ SchemaOptionsWidget::~SchemaOptionsWidget()
delete ui;
}
-QString SchemaOptionsWidget::schemaPath(Constants::SchemaVersion schemaVersion)
+void SchemaOptionsWidget::saveSettings()
{
- switch (schemaVersion) {
- case Constants::SV_2003:
- return ui->m_schema2003LineEdit->text();
- case Constants::SV_2005:
- return ui->m_schema2005LineEdit->text();
- case Constants::SV_2008:
- return ui->m_schema2008LineEdit->text();
- }
+ VcSchemaManager *schemaManager = VcSchemaManager::instance();
- return QString();
-}
+ if (schemaManager) {
+ schemaManager->setSchema(Constants::SV_2003, ui->m_schema2003LineEdit->text());
+ schemaManager->setSchema(Constants::SV_2005, ui->m_schema2005LineEdit->text());
+ schemaManager->setSchema(Constants::SV_2008, ui->m_schema2008LineEdit->text());
-void SchemaOptionsWidget::setSchemaPath(const QString &schemaPath, Constants::SchemaVersion schemaVersion)
-{
- switch (schemaVersion) {
- case Constants::SV_2003:
- ui->m_schema2003LineEdit->setText(schemaPath);
- break;
- case Constants::SV_2005:
- ui->m_schema2005LineEdit->setText(schemaPath);
- break;
- case Constants::SV_2008:
- ui->m_schema2008LineEdit->setText(schemaPath);
- break;
+ schemaManager->saveSettings();
}
}
diff --git a/src/plugins/vcprojectmanager/widgets/schemaoptionswidget.h b/src/plugins/vcprojectmanager/widgets/schemaoptionswidget.h
index b1e7e192cc..2d31f18b54 100644
--- a/src/plugins/vcprojectmanager/widgets/schemaoptionswidget.h
+++ b/src/plugins/vcprojectmanager/widgets/schemaoptionswidget.h
@@ -48,8 +48,7 @@ public:
explicit SchemaOptionsWidget(QWidget *parent = 0);
~SchemaOptionsWidget();
- QString schemaPath(Constants::SchemaVersion schemaVersion);
- void setSchemaPath(const QString &schemaPath, Constants::SchemaVersion schemaVersion);
+ void saveSettings();
private slots:
void onBrowseSchema2003ButtonClick();
diff --git a/src/plugins/vcprojectmanager/widgets/vcprojectkitconfigwidget.cpp b/src/plugins/vcprojectmanager/widgets/vcprojectkitconfigwidget.cpp
new file mode 100644
index 0000000000..5f7ebd164e
--- /dev/null
+++ b/src/plugins/vcprojectmanager/widgets/vcprojectkitconfigwidget.cpp
@@ -0,0 +1,153 @@
+/**************************************************************************
+**
+** Copyright (c) 2013 Bojan Petrovic
+** Copyright (c) 2013 Radovan Zivkvoic
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** 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.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#include "vcprojectkitconfigwidget.h"
+
+#include <QComboBox>
+#include <projectexplorer/kit.h>
+
+#include "../msbuildversionmanager.h"
+#include "../vcprojectkitinformation.h"
+#include "../vcprojectmanagerconstants.h"
+
+namespace VcProjectManager {
+namespace Internal {
+
+VcProjectKitConfigWidget::VcProjectKitConfigWidget(ProjectExplorer::Kit *k)
+ : ProjectExplorer::KitConfigWidget(k)
+{
+ m_comboBox = new QComboBox;
+ MsBuildVersionManager *msBVM = MsBuildVersionManager::instance();
+
+ foreach (MsBuildInformation *msBuildInfo, msBVM->msBuildInformations())
+ insertMsBuild(msBuildInfo);
+
+ refresh();
+
+ connect(m_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(currentMsBuildChanged(int)));
+ connect(msBVM, SIGNAL(msBuildAdded(Core::Id)), this, SLOT(onMsBuildAdded(Core::Id)));
+ connect(msBVM, SIGNAL(msBuildReplaced(Core::Id,Core::Id)), this, SLOT(onMsBuildReplaced(Core::Id,Core::Id)));
+ connect(msBVM, SIGNAL(msBuildRemoved(Core::Id)), this, SLOT(onMsBuildRemoved(Core::Id)));
+}
+
+VcProjectKitConfigWidget::~VcProjectKitConfigWidget()
+{
+}
+
+QString VcProjectKitConfigWidget::displayName() const
+{
+ return tr("Ms Build version:");
+}
+
+void VcProjectKitConfigWidget::makeReadOnly()
+{
+ m_comboBox->setEnabled(false);
+}
+
+void VcProjectKitConfigWidget::refresh()
+{
+ m_comboBox->setCurrentIndex(indexOf(VcProjectKitInformation::msBuildInfo(m_kit)));
+}
+
+bool VcProjectKitConfigWidget::visibleInKit()
+{
+ return true;
+}
+
+QWidget *VcProjectKitConfigWidget::mainWidget() const
+{
+ return m_comboBox;
+}
+
+void VcProjectKitConfigWidget::currentMsBuildChanged(int index)
+{
+ if (0 <= index && index < m_comboBox->count()) {
+ Core::Id id = Core::Id::fromSetting(m_comboBox->itemData(index));
+ MsBuildInformation *msBuild = MsBuildVersionManager::instance()->msBuildInformation(id);
+ VcProjectKitInformation::setMsBuild(m_kit, msBuild);
+ }
+}
+
+void VcProjectKitConfigWidget::onMsBuildAdded(Core::Id msBuildId)
+{
+ insertMsBuild(MsBuildVersionManager::instance()->msBuildInformation(msBuildId));
+}
+
+void VcProjectKitConfigWidget::onMsBuildReplaced(Core::Id oldMsBuildId, Core::Id newMsBuildId)
+{
+ int index = indexOf(MsBuildVersionManager::instance()->msBuildInformation(oldMsBuildId));
+
+ if (index < 0 || index >= m_comboBox->count())
+ return;
+
+ MsBuildInformation *msBuild = MsBuildVersionManager::instance()->msBuildInformation(newMsBuildId);
+ m_comboBox->setItemText(index, msBuild->m_versionString);
+ m_comboBox->setItemData(index, msBuild->getId().toSetting());
+}
+
+void VcProjectKitConfigWidget::onMsBuildRemoved(Core::Id msBuildId)
+{
+ removeMsBuild(MsBuildVersionManager::instance()->msBuildInformation(msBuildId));
+}
+
+int VcProjectKitConfigWidget::indexOf(MsBuildInformation *msBuild) const
+{
+ if (!msBuild)
+ return -1;
+
+ for (int i = 0; i < m_comboBox->count(); ++i)
+ if (msBuild->getId() == Core::Id::fromSetting(m_comboBox->itemData(i)))
+ return i;
+
+ return -1;
+}
+
+void VcProjectKitConfigWidget::insertMsBuild(MsBuildInformation *msBuild)
+{
+ if (msBuild)
+ m_comboBox->addItem(msBuild->m_versionString, msBuild->getId().toSetting());
+
+ if (!m_comboBox->isEnabled())
+ m_comboBox->setEnabled(true);
+}
+
+void VcProjectKitConfigWidget::removeMsBuild(MsBuildInformation *msBuild)
+{
+ if (msBuild) {
+ m_comboBox->removeItem(indexOf(msBuild));
+
+ if (m_comboBox->count() == 0) {
+ m_comboBox->addItem(tr("<No Ms Build tools available>"));
+ m_comboBox->setEnabled(false);
+ }
+ }
+}
+
+} // namespace Internal
+} // namespace VcProjectManager
diff --git a/src/plugins/vcprojectmanager/widgets/vcprojectkitconfigwidget.h b/src/plugins/vcprojectmanager/widgets/vcprojectkitconfigwidget.h
new file mode 100644
index 0000000000..48187526d2
--- /dev/null
+++ b/src/plugins/vcprojectmanager/widgets/vcprojectkitconfigwidget.h
@@ -0,0 +1,79 @@
+/**************************************************************************
+**
+** Copyright (c) 2013 Bojan Petrovic
+** Copyright (c) 2013 Radovan Zivkvoic
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** 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.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+#ifndef VCPROJECTMANAGER_INTERNAL_VCPROJECTKITCONFIGWIDGET_H
+#define VCPROJECTMANAGER_INTERNAL_VCPROJECTKITCONFIGWIDGET_H
+
+#include <projectexplorer/kitconfigwidget.h>
+#include <coreplugin/id.h>
+
+QT_BEGIN_NAMESPACE
+class QComboBox;
+QT_END_NAMESPACE
+
+namespace VcProjectManager {
+namespace Internal {
+
+class MsBuildInformation;
+
+class VcProjectKitConfigWidget : public ProjectExplorer::KitConfigWidget
+{
+ Q_OBJECT
+
+public:
+ VcProjectKitConfigWidget(ProjectExplorer::Kit *k);
+ ~VcProjectKitConfigWidget();
+
+ QString displayName() const;
+ QString toolTip() const { return QString(); }
+ void makeReadOnly();
+ void refresh();
+ bool visibleInKit();
+
+ QWidget *mainWidget() const;
+ QWidget *buttonWidget() const { return 0; }
+
+private slots:
+ void currentMsBuildChanged(int index);
+ void onMsBuildAdded(Core::Id msBuildId);
+ void onMsBuildReplaced(Core::Id oldMsBuildId, Core::Id newMsBuildId);
+ void onMsBuildRemoved(Core::Id msBuildId);
+
+private:
+ int indexOf(MsBuildInformation *msBuild) const;
+ void insertMsBuild(MsBuildInformation *msBuild);
+ void removeMsBuild(MsBuildInformation *msBuild);
+
+ QComboBox *m_comboBox;
+};
+
+} // namespace Internal
+} // namespace VcProjectManager
+
+#endif // VCPROJECTMANAGER_INTERNAL_VCPROJECTKITCONFIGWIDGET_H
diff --git a/src/plugins/vcprojectmanager/widgets/widgets.pri b/src/plugins/vcprojectmanager/widgets/widgets.pri
index 490d7fea3a..508ca692ad 100644
--- a/src/plugins/vcprojectmanager/widgets/widgets.pri
+++ b/src/plugins/vcprojectmanager/widgets/widgets.pri
@@ -6,7 +6,8 @@ HEADERS += \
widgets/configurationswidgets.h \
widgets/configurationswidget.h \
widgets/basicconfigurationwidget.h \
- widgets/schemaoptionswidget.h
+ widgets/schemaoptionswidget.h \
+ widgets/vcprojectkitconfigwidget.h
SOURCES += \
widgets/vcnodewidget.cpp \
@@ -16,7 +17,8 @@ SOURCES += \
widgets/configurationswidgets.cpp \
widgets/configurationswidget.cpp \
widgets/basicconfigurationwidget.cpp \
- widgets/schemaoptionswidget.cpp
+ widgets/schemaoptionswidget.cpp \
+ widgets/vcprojectkitconfigwidget.cpp
FORMS += \
widgets/projectsettingswidget.ui \