diff options
author | Radovan Zivkovic <pivonroll@gmail.com> | 2014-03-29 00:33:37 +0100 |
---|---|---|
committer | Radovan Zivkovic <pivonroll@gmail.com> | 2014-07-18 15:38:53 +0200 |
commit | 7f034a768d52e714fcd615f60fb0aa316cd51283 (patch) | |
tree | 433ac5b6f97d2621315ba937581ae9d88fcb9f36 | |
parent | 9596a9d79c996fad3402438a6b357b54cbd350c7 (diff) | |
download | qt-creator-7f034a768d52e714fcd615f60fb0aa316cd51283.tar.gz |
Fixed saving for file build configuration.
Change-Id: I5605936a0cc9d4e2f88a6cd962c1c7cfa44ef639
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
11 files changed, 137 insertions, 43 deletions
diff --git a/src/plugins/vcprojectmanager/interfaces/iattributecontainer.h b/src/plugins/vcprojectmanager/interfaces/iattributecontainer.h index 03a415477b..f6228140a0 100644 --- a/src/plugins/vcprojectmanager/interfaces/iattributecontainer.h +++ b/src/plugins/vcprojectmanager/interfaces/iattributecontainer.h @@ -50,6 +50,7 @@ public: virtual void setAttribute(const QString &attributeName, const QString &attributeValue) = 0; virtual int getAttributeCount() const = 0; virtual void appendToXMLNode(QDomElement &elementNode) const = 0; + virtual void copyFrom(const IAttributeContainer &container) = 0; }; } // namespace Internal diff --git a/src/plugins/vcprojectmanager/interfaces/itools.h b/src/plugins/vcprojectmanager/interfaces/itools.h index 55afe79d92..256e2c54f6 100644 --- a/src/plugins/vcprojectmanager/interfaces/itools.h +++ b/src/plugins/vcprojectmanager/interfaces/itools.h @@ -47,6 +47,7 @@ public: virtual IConfigurationBuildTools *configurationBuildTools() const = 0; virtual IDeploymentTools *deploymentTools() const = 0; virtual IDebuggerTools *debuggerTools() const = 0; + virtual void copyFrom(const ITools &tools) = 0; }; } // namespace Internal diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/file.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/file.cpp index 9dbd83985c..3b9101e0cb 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/file.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/file.cpp @@ -107,6 +107,8 @@ void File::processNode(const QDomNode &node) if (node.nodeType() == QDomNode::ElementNode) processNodeAttributes(node.toElement()); + copyProjectConfigs(); + if (node.hasChildNodes()) { QDomNode firstChild = node.firstChild(); if (!firstChild.isNull()) { @@ -198,20 +200,24 @@ void File::processFileConfiguration(const QDomNode &fileConfigNode) IConfiguration *fileConfig = new FileBuildConfiguration(m_parentProjectDoc); fileConfig->processNode(fileConfigNode); - if (m_parentProjectDoc->configurations() && m_parentProjectDoc->configurations()->configurationContainer()) { - IConfiguration *projConf = m_parentProjectDoc->configurations()->configurationContainer()->configuration(fileConfig->fullName()); - copyAllNonDefaultToolAtributes(fileConfig, projConf); - } + IConfiguration *projConfig = m_configurationContainer->configuration(fileConfig->fullName()); - m_configurationContainer->addConfiguration(fileConfig); + if (projConfig) { + copyAllNonDefaultToolAtributes(fileConfig, projConfig); - // process next sibling - QDomNode nextSibling = fileConfigNode.nextSibling(); - if (!nextSibling.isNull()) { - if (nextSibling.nodeName() == QLatin1String("FileConfiguration")) - processFileConfiguration(nextSibling); - else - processFile(nextSibling); + m_configurationContainer->removeConfiguration(projConfig->fullName()); + m_configurationContainer->addConfiguration(fileConfig); + + // process next sibling + QDomNode nextSibling = fileConfigNode.nextSibling(); + if (!nextSibling.isNull()) { + if (nextSibling.nodeName() == QLatin1String("FileConfiguration")) + processFileConfiguration(nextSibling); + else + processFile(nextSibling); + } + } else { + delete fileConfig; } } @@ -303,5 +309,43 @@ void File::copyAllNonDefaultToolAtributes(IToolSection *fileSec, IToolSection *p } } +void File::leaveOnlyCppTool(IConfiguration *config) +{ + if (!config || !config->tools() || !config->tools()->configurationBuildTools()) + return; + + int i = 0; + while (config->tools()->configurationBuildTools()->toolCount() > 1) + { + IConfigurationBuildTool *tool = config->tools()->configurationBuildTools()->tool(i); + + if (tool->toolDescription()->toolKey() != QLatin1String(ToolConstants::strVCCLCompilerTool)) { + config->tools()->configurationBuildTools()->removeTool(tool); + delete tool; + } + + else + ++i; + } +} + +void File::copyProjectConfigs() +{ + if (!m_parentProjectDoc || !m_parentProjectDoc->configurations() || + !m_parentProjectDoc->configurations()->configurationContainer()) + return; + + ConfigurationContainer *configContainer = m_parentProjectDoc->configurations()->configurationContainer(); + for (int i = 0; i < configContainer->configurationCount(); ++i) { + IConfiguration *config = configContainer->configuration(i); + + if (config) { + FileBuildConfiguration *newConfig = FileBuildConfiguration::createFromProjectConfig(static_cast<Configuration*>(config), m_parentProjectDoc); + leaveOnlyCppTool(newConfig); + m_configurationContainer->addConfiguration(newConfig); + } + } +} + } // namespace Internal } // namespace VcProjectManager diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/file.h b/src/plugins/vcprojectmanager/vcprojectmodel/file.h index e9a4758974..6f7f432b82 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/file.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/file.h @@ -72,6 +72,8 @@ private: void processNodeAttributes(const QDomElement &element); void copyAllNonDefaultToolAtributes(IConfiguration *fileConfig, IConfiguration *projConfig); void copyAllNonDefaultToolAtributes(IToolSection *fileSec, IToolSection *projSec); + void leaveOnlyCppTool(IConfiguration *config); + void copyProjectConfigs(); QString m_relativePath; // required QList<File *> m_files; diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/filebuildconfiguration.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/filebuildconfiguration.cpp index d81e9d2627..b2aadef0f9 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/filebuildconfiguration.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/filebuildconfiguration.cpp @@ -79,6 +79,17 @@ FileBuildConfiguration &FileBuildConfiguration::operator =(const FileBuildConfig return *this; } +FileBuildConfiguration *FileBuildConfiguration::createFromProjectConfig(Configuration *config, IVisualStudioProject *parentProject) +{ + FileBuildConfiguration *newFileConfig = new FileBuildConfiguration(parentProject); + newFileConfig->attributeContainer()->copyFrom(*config->attributeContainer()); +// *(static_cast<GeneralAttributeContainer *>(newFileConfig->attributeContainer())) = *(static_cast<GeneralAttributeContainer *>(config->attributeContainer())); + newFileConfig->setFullName(config->fullName()); +// *(static_cast<Tools *>(newFileConfig->tools())) = *(static_cast<Tools *>(config->tools())); + newFileConfig->tools()->copyFrom(*config->tools()); + return newFileConfig; +} + VcNodeWidget *FileBuildConfiguration::createSettingsWidget() { return new FileConfigurationSettingsWidget(this, m_parentProjectDoc); @@ -90,7 +101,6 @@ QDomNode FileBuildConfiguration::toXMLDomNode(QDomDocument &domXMLDocument) cons IConfigurations *configs = m_parentProjectDoc->configurations(); QDomElement configurationNode = domXMLDocument.createElement(m_nodeName); - m_attributeContainer->appendToXMLNode(configurationNode); if (configs) { ConfigurationContainer *configContainer = m_parentProjectDoc->configurations()->configurationContainer(); @@ -160,6 +170,9 @@ void FileBuildConfiguration::toXMLNode(IConfiguration *projectConfig, QDomElemen { QTC_ASSERT(projectConfig, return); + writeAttributes(projectConfig, configurationNode); + + // write tools ITools *projectTools = projectConfig->tools(); if (projectTools && projectTools->configurationBuildTools()) { @@ -169,14 +182,14 @@ void FileBuildConfiguration::toXMLNode(IConfiguration *projectConfig, QDomElemen IConfigurationBuildTool *projectTool = projectTools->configurationBuildTools()->tool(tool->toolDescription()->toolKey()); if (projectTool && projectTool->toolDescription()) { - toXMLNode(projectTool, tool, configurationNode, domXMLDocument); + writeTools(projectTool, tool, configurationNode, domXMLDocument); } } } } -void FileBuildConfiguration::toXMLNode(IConfigurationBuildTool *projectConfigTool, IConfigurationBuildTool *tool, - QDomElement &configurationNode, QDomDocument &domXMLDocument) const +void FileBuildConfiguration::writeTools(IConfigurationBuildTool *projectConfigTool, IConfigurationBuildTool *tool, + QDomElement &configurationNode, QDomDocument &domXMLDocument) const { QTC_ASSERT(projectConfigTool && tool, return); @@ -186,42 +199,58 @@ void FileBuildConfiguration::toXMLNode(IConfigurationBuildTool *projectConfigToo bool isNodeCreated = false; QDomElement toolNode; - if (projSecContainer && toolSecContainer) { - for (int i = 0; i < projSecContainer->sectionCount(); ++i) { - IToolSection *projToolSec = projSecContainer->section(i); + if (!toolSecContainer || !projSecContainer) + return; - if (projToolSec) { - IToolSection *toolSec = toolSecContainer->section(projToolSec->sectionDescription()->displayName()); + for (int i = 0; i < toolSecContainer->sectionCount(); ++i) { + IToolSection *toolSec = toolSecContainer->section(i); - if (toolSec) { - IToolAttributeContainer *projToolAttrContainer = projToolSec->attributeContainer(); - IToolAttributeContainer *toolAttrContainer = toolSec->attributeContainer(); + if (!toolSec) + continue; + IToolSection *projSec = projSecContainer->section(toolSec->sectionDescription()->displayName()); - for (int j = 0; j < projToolAttrContainer->toolAttributeCount(); ++j) { - IToolAttribute *projToolAttr = projToolAttrContainer->toolAttribute(j); + if (!projSec) + continue; + IToolAttributeContainer *toolAttrContainer = toolSec->attributeContainer(); + IToolAttributeContainer *projAttrContainer = projSec->attributeContainer(); - if (projToolAttr && projToolAttr->descriptionDataItem()) { - IToolAttribute *toolAttr = toolAttrContainer->toolAttribute(projToolAttr->descriptionDataItem()->key()); + for (int j = 0; j < toolAttrContainer->toolAttributeCount(); ++j) { + IToolAttribute *toolAttr = toolAttrContainer->toolAttribute(j); - if (toolAttr && toolAttr->value() != projToolAttr->value()) { - if (!isNodeCreated) { - toolNode = domXMLDocument.createElement(QLatin1String("Tool")); - toolNode.setAttribute(QLatin1String("Name"), projectConfigTool->toolDescription()->toolKey()); - configurationNode.appendChild(toolNode); - isNodeCreated = true; - } + if (!toolAttr || !toolAttr->descriptionDataItem()) + continue; + IToolAttribute *projToolAttr = projAttrContainer->toolAttribute(toolAttr->descriptionDataItem()->key()); - toolNode.setAttribute(toolAttr->descriptionDataItem()->key(), - toolAttr->value()); - } - } - } - } + if (!projToolAttr || projToolAttr->value() == toolAttr->value()) + continue; + + if (!isNodeCreated) { + toolNode = domXMLDocument.createElement(QLatin1String("Tool")); + toolNode.setAttribute(QLatin1String("Name"), tool->toolDescription()->toolKey()); + configurationNode.appendChild(toolNode); + isNodeCreated = true; } + + toolNode.setAttribute(toolAttr->descriptionDataItem()->key(), + toolAttr->value()); } } } +void FileBuildConfiguration::writeAttributes(IConfiguration *projectConfig, QDomElement &configurationNode) const +{ + IAttributeContainer *projConfigAttrContainer = projectConfig->attributeContainer(); + + for (int i = 0; i < m_attributeContainer->getAttributeCount(); ++i) { + QString attrName = m_attributeContainer->getAttributeName(i); + if (projConfigAttrContainer) { + if (projConfigAttrContainer->attributeValue(attrName) != m_attributeContainer->attributeValue(attrName)) + configurationNode.setAttribute(attrName, m_attributeContainer->attributeValue(attrName)); + } else + configurationNode.setAttribute(attrName, m_attributeContainer->attributeValue(attrName)); + } +} + IConfiguration *FileBuildConfiguration::clone() const { return new FileBuildConfiguration(*this); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/filebuildconfiguration.h b/src/plugins/vcprojectmanager/vcprojectmodel/filebuildconfiguration.h index 888653f6e8..acd5d99834 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/filebuildconfiguration.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/filebuildconfiguration.h @@ -46,6 +46,8 @@ public: FileBuildConfiguration(const FileBuildConfiguration &fileBuildConfig); FileBuildConfiguration &operator =(const FileBuildConfiguration &fileBuildConfig); + static FileBuildConfiguration *createFromProjectConfig(Configuration *config, IVisualStudioProject *parentProject); + VcNodeWidget *createSettingsWidget(); QDomNode toXMLDomNode(QDomDocument &domXMLDocument) const; IConfiguration *clone() const; @@ -55,8 +57,9 @@ protected: private: void toXMLNode(IConfiguration *projectConfig, QDomElement &configurationNode, QDomDocument &domXMLDocument) const; - void toXMLNode(IConfigurationBuildTool *projectConfigTool, IConfigurationBuildTool *tool, + void writeTools(IConfigurationBuildTool *projectConfigTool, IConfigurationBuildTool *tool, QDomElement &configurationNode, QDomDocument &domXMLDocument) const; + void writeAttributes(IConfiguration *projectConfig, QDomElement &configurationNode) const; IVisualStudioProject *m_parentProjectDoc; }; diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/generalattributecontainer.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/generalattributecontainer.cpp index 15362fb1a8..fc8146cf38 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/generalattributecontainer.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/generalattributecontainer.cpp @@ -106,5 +106,11 @@ void GeneralAttributeContainer::appendToXMLNode(QDomElement &elementNode) const } } +void GeneralAttributeContainer::copyFrom(const IAttributeContainer &container) +{ + const GeneralAttributeContainer &cont = static_cast<const GeneralAttributeContainer &>(container); + *this = cont; +} + } // namespace Internal } // namespace VcProjectManager diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/generalattributecontainer.h b/src/plugins/vcprojectmanager/vcprojectmodel/generalattributecontainer.h index 04d1560d35..3ba18d7547 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/generalattributecontainer.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/generalattributecontainer.h @@ -51,6 +51,7 @@ public: QString getAttributeName(int index) const; int getAttributeCount() const; void appendToXMLNode(QDomElement &elementNode) const; + void copyFrom(const IAttributeContainer &container); private: QHash<QString, QString> m_anyAttribute; diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/tools.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/tools.cpp index 4b0fd09ae8..a3e542b457 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/tools.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/tools.cpp @@ -85,5 +85,11 @@ IDebuggerTools *Tools::debuggerTools() const return m_debuggerTools; } +void Tools::copyFrom(const ITools &tools) +{ + const Tools &tls = static_cast<const Tools &>(tools); + *this = tls; +} + } // namespace Internal } // namespace VcProjectManager diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/tools.h b/src/plugins/vcprojectmanager/vcprojectmodel/tools.h index 3ace526700..baa6ff7d28 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/tools.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/tools.h @@ -51,6 +51,7 @@ public: IConfigurationBuildTools *configurationBuildTools() const; IDeploymentTools *deploymentTools() const; IDebuggerTools *debuggerTools() const; + void copyFrom(const ITools &tools); private: ConfigurationBuildTools *m_configurationBuildTools; diff --git a/src/plugins/vcprojectmanager/widgets/fileconfigurationseditwidget.cpp b/src/plugins/vcprojectmanager/widgets/fileconfigurationseditwidget.cpp index 9e0a06444c..65bd96b018 100644 --- a/src/plugins/vcprojectmanager/widgets/fileconfigurationseditwidget.cpp +++ b/src/plugins/vcprojectmanager/widgets/fileconfigurationseditwidget.cpp @@ -291,7 +291,7 @@ void FileConfigurationsEditWidget::readFileBuildConfigurations(IFile *file) if (file != m_file) configCont = new ConfigurationContainer(*(file->configurationContainer())); else { - configCont = cloneFileConfigContainer(file); + configCont = new ConfigurationContainer(*(file->configurationContainer())); connect(configCont, SIGNAL(configurationAdded(IConfiguration*)), this, SLOT(addConfigWidget(IConfiguration*))); } |