summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRadovan Zivkovic <pivonroll@gmail.com>2014-03-29 00:33:37 +0100
committerRadovan Zivkovic <pivonroll@gmail.com>2014-07-18 15:38:53 +0200
commit7f034a768d52e714fcd615f60fb0aa316cd51283 (patch)
tree433ac5b6f97d2621315ba937581ae9d88fcb9f36
parent9596a9d79c996fad3402438a6b357b54cbd350c7 (diff)
downloadqt-creator-7f034a768d52e714fcd615f60fb0aa316cd51283.tar.gz
Fixed saving for file build configuration.
Change-Id: I5605936a0cc9d4e2f88a6cd962c1c7cfa44ef639 Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
-rw-r--r--src/plugins/vcprojectmanager/interfaces/iattributecontainer.h1
-rw-r--r--src/plugins/vcprojectmanager/interfaces/itools.h1
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/file.cpp68
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/file.h2
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/filebuildconfiguration.cpp87
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/filebuildconfiguration.h5
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/generalattributecontainer.cpp6
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/generalattributecontainer.h1
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/tools.cpp6
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmodel/tools.h1
-rw-r--r--src/plugins/vcprojectmanager/widgets/fileconfigurationseditwidget.cpp2
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*)));
}