diff options
author | Radovan Zivkovic <pivonroll@gmail.com> | 2013-05-25 14:28:32 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2014-03-11 19:54:53 +0100 |
commit | 410dba83d90324af6329e13d0831605c0c4b613d (patch) | |
tree | 0e45dda3a9d938061aa53fe40830acd6a6fa1a25 | |
parent | 0a08b505b8f3ee96f2a00ebdd7b3121737fe40b4 (diff) |
Added VcProjectKitInformation, managers for Ms Builds and schemas.
Change-Id: Ic02eebc907f04a7277957c460ee7d77d748f7c83
Reviewed-by: Bojan Petrovic <bojan85@gmail.com>
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 \ |