Fixed saving for file build configuration.

Change-Id: I5605936a0cc9d4e2f88a6cd962c1c7cfa44ef639
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
Radovan Zivkovic
2014-03-29 00:33:37 +01:00
parent 9596a9d79c
commit 7f034a768d
11 changed files with 137 additions and 43 deletions

View File

@@ -50,6 +50,7 @@ public:
virtual void setAttribute(const QString &attributeName, const QString &attributeValue) = 0; virtual void setAttribute(const QString &attributeName, const QString &attributeValue) = 0;
virtual int getAttributeCount() const = 0; virtual int getAttributeCount() const = 0;
virtual void appendToXMLNode(QDomElement &elementNode) const = 0; virtual void appendToXMLNode(QDomElement &elementNode) const = 0;
virtual void copyFrom(const IAttributeContainer &container) = 0;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -47,6 +47,7 @@ public:
virtual IConfigurationBuildTools *configurationBuildTools() const = 0; virtual IConfigurationBuildTools *configurationBuildTools() const = 0;
virtual IDeploymentTools *deploymentTools() const = 0; virtual IDeploymentTools *deploymentTools() const = 0;
virtual IDebuggerTools *debuggerTools() const = 0; virtual IDebuggerTools *debuggerTools() const = 0;
virtual void copyFrom(const ITools &tools) = 0;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -107,6 +107,8 @@ void File::processNode(const QDomNode &node)
if (node.nodeType() == QDomNode::ElementNode) if (node.nodeType() == QDomNode::ElementNode)
processNodeAttributes(node.toElement()); processNodeAttributes(node.toElement());
copyProjectConfigs();
if (node.hasChildNodes()) { if (node.hasChildNodes()) {
QDomNode firstChild = node.firstChild(); QDomNode firstChild = node.firstChild();
if (!firstChild.isNull()) { if (!firstChild.isNull()) {
@@ -198,20 +200,24 @@ void File::processFileConfiguration(const QDomNode &fileConfigNode)
IConfiguration *fileConfig = new FileBuildConfiguration(m_parentProjectDoc); IConfiguration *fileConfig = new FileBuildConfiguration(m_parentProjectDoc);
fileConfig->processNode(fileConfigNode); fileConfig->processNode(fileConfigNode);
if (m_parentProjectDoc->configurations() && m_parentProjectDoc->configurations()->configurationContainer()) { IConfiguration *projConfig = m_configurationContainer->configuration(fileConfig->fullName());
IConfiguration *projConf = m_parentProjectDoc->configurations()->configurationContainer()->configuration(fileConfig->fullName());
copyAllNonDefaultToolAtributes(fileConfig, projConf);
}
m_configurationContainer->addConfiguration(fileConfig); if (projConfig) {
copyAllNonDefaultToolAtributes(fileConfig, projConfig);
// process next sibling m_configurationContainer->removeConfiguration(projConfig->fullName());
QDomNode nextSibling = fileConfigNode.nextSibling(); m_configurationContainer->addConfiguration(fileConfig);
if (!nextSibling.isNull()) {
if (nextSibling.nodeName() == QLatin1String("FileConfiguration")) // process next sibling
processFileConfiguration(nextSibling); QDomNode nextSibling = fileConfigNode.nextSibling();
else if (!nextSibling.isNull()) {
processFile(nextSibling); 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 Internal
} // namespace VcProjectManager } // namespace VcProjectManager

View File

@@ -72,6 +72,8 @@ private:
void processNodeAttributes(const QDomElement &element); void processNodeAttributes(const QDomElement &element);
void copyAllNonDefaultToolAtributes(IConfiguration *fileConfig, IConfiguration *projConfig); void copyAllNonDefaultToolAtributes(IConfiguration *fileConfig, IConfiguration *projConfig);
void copyAllNonDefaultToolAtributes(IToolSection *fileSec, IToolSection *projSec); void copyAllNonDefaultToolAtributes(IToolSection *fileSec, IToolSection *projSec);
void leaveOnlyCppTool(IConfiguration *config);
void copyProjectConfigs();
QString m_relativePath; // required QString m_relativePath; // required
QList<File *> m_files; QList<File *> m_files;

View File

@@ -79,6 +79,17 @@ FileBuildConfiguration &FileBuildConfiguration::operator =(const FileBuildConfig
return *this; 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() VcNodeWidget *FileBuildConfiguration::createSettingsWidget()
{ {
return new FileConfigurationSettingsWidget(this, m_parentProjectDoc); return new FileConfigurationSettingsWidget(this, m_parentProjectDoc);
@@ -90,7 +101,6 @@ QDomNode FileBuildConfiguration::toXMLDomNode(QDomDocument &domXMLDocument) cons
IConfigurations *configs = m_parentProjectDoc->configurations(); IConfigurations *configs = m_parentProjectDoc->configurations();
QDomElement configurationNode = domXMLDocument.createElement(m_nodeName); QDomElement configurationNode = domXMLDocument.createElement(m_nodeName);
m_attributeContainer->appendToXMLNode(configurationNode);
if (configs) { if (configs) {
ConfigurationContainer *configContainer = m_parentProjectDoc->configurations()->configurationContainer(); ConfigurationContainer *configContainer = m_parentProjectDoc->configurations()->configurationContainer();
@@ -160,6 +170,9 @@ void FileBuildConfiguration::toXMLNode(IConfiguration *projectConfig, QDomElemen
{ {
QTC_ASSERT(projectConfig, return); QTC_ASSERT(projectConfig, return);
writeAttributes(projectConfig, configurationNode);
// write tools
ITools *projectTools = projectConfig->tools(); ITools *projectTools = projectConfig->tools();
if (projectTools && projectTools->configurationBuildTools()) { if (projectTools && projectTools->configurationBuildTools()) {
@@ -169,14 +182,14 @@ void FileBuildConfiguration::toXMLNode(IConfiguration *projectConfig, QDomElemen
IConfigurationBuildTool *projectTool = projectTools->configurationBuildTools()->tool(tool->toolDescription()->toolKey()); IConfigurationBuildTool *projectTool = projectTools->configurationBuildTools()->tool(tool->toolDescription()->toolKey());
if (projectTool && projectTool->toolDescription()) { if (projectTool && projectTool->toolDescription()) {
toXMLNode(projectTool, tool, configurationNode, domXMLDocument); writeTools(projectTool, tool, configurationNode, domXMLDocument);
} }
} }
} }
} }
void FileBuildConfiguration::toXMLNode(IConfigurationBuildTool *projectConfigTool, IConfigurationBuildTool *tool, void FileBuildConfiguration::writeTools(IConfigurationBuildTool *projectConfigTool, IConfigurationBuildTool *tool,
QDomElement &configurationNode, QDomDocument &domXMLDocument) const QDomElement &configurationNode, QDomDocument &domXMLDocument) const
{ {
QTC_ASSERT(projectConfigTool && tool, return); QTC_ASSERT(projectConfigTool && tool, return);
@@ -186,42 +199,58 @@ void FileBuildConfiguration::toXMLNode(IConfigurationBuildTool *projectConfigToo
bool isNodeCreated = false; bool isNodeCreated = false;
QDomElement toolNode; QDomElement toolNode;
if (projSecContainer && toolSecContainer) { if (!toolSecContainer || !projSecContainer)
for (int i = 0; i < projSecContainer->sectionCount(); ++i) { return;
IToolSection *projToolSec = projSecContainer->section(i);
if (projToolSec) { for (int i = 0; i < toolSecContainer->sectionCount(); ++i) {
IToolSection *toolSec = toolSecContainer->section(projToolSec->sectionDescription()->displayName()); IToolSection *toolSec = toolSecContainer->section(i);
if (toolSec) { if (!toolSec)
IToolAttributeContainer *projToolAttrContainer = projToolSec->attributeContainer(); continue;
IToolAttributeContainer *toolAttrContainer = toolSec->attributeContainer(); IToolSection *projSec = projSecContainer->section(toolSec->sectionDescription()->displayName());
for (int j = 0; j < projToolAttrContainer->toolAttributeCount(); ++j) { if (!projSec)
IToolAttribute *projToolAttr = projToolAttrContainer->toolAttribute(j); continue;
IToolAttributeContainer *toolAttrContainer = toolSec->attributeContainer();
IToolAttributeContainer *projAttrContainer = projSec->attributeContainer();
if (projToolAttr && projToolAttr->descriptionDataItem()) { for (int j = 0; j < toolAttrContainer->toolAttributeCount(); ++j) {
IToolAttribute *toolAttr = toolAttrContainer->toolAttribute(projToolAttr->descriptionDataItem()->key()); IToolAttribute *toolAttr = toolAttrContainer->toolAttribute(j);
if (toolAttr && toolAttr->value() != projToolAttr->value()) { if (!toolAttr || !toolAttr->descriptionDataItem())
if (!isNodeCreated) { continue;
toolNode = domXMLDocument.createElement(QLatin1String("Tool")); IToolAttribute *projToolAttr = projAttrContainer->toolAttribute(toolAttr->descriptionDataItem()->key());
toolNode.setAttribute(QLatin1String("Name"), projectConfigTool->toolDescription()->toolKey());
configurationNode.appendChild(toolNode);
isNodeCreated = true;
}
toolNode.setAttribute(toolAttr->descriptionDataItem()->key(), if (!projToolAttr || projToolAttr->value() == toolAttr->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 IConfiguration *FileBuildConfiguration::clone() const
{ {
return new FileBuildConfiguration(*this); return new FileBuildConfiguration(*this);

View File

@@ -46,6 +46,8 @@ public:
FileBuildConfiguration(const FileBuildConfiguration &fileBuildConfig); FileBuildConfiguration(const FileBuildConfiguration &fileBuildConfig);
FileBuildConfiguration &operator =(const FileBuildConfiguration &fileBuildConfig); FileBuildConfiguration &operator =(const FileBuildConfiguration &fileBuildConfig);
static FileBuildConfiguration *createFromProjectConfig(Configuration *config, IVisualStudioProject *parentProject);
VcNodeWidget *createSettingsWidget(); VcNodeWidget *createSettingsWidget();
QDomNode toXMLDomNode(QDomDocument &domXMLDocument) const; QDomNode toXMLDomNode(QDomDocument &domXMLDocument) const;
IConfiguration *clone() const; IConfiguration *clone() const;
@@ -55,8 +57,9 @@ protected:
private: private:
void toXMLNode(IConfiguration *projectConfig, QDomElement &configurationNode, QDomDocument &domXMLDocument) const; 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; QDomElement &configurationNode, QDomDocument &domXMLDocument) const;
void writeAttributes(IConfiguration *projectConfig, QDomElement &configurationNode) const;
IVisualStudioProject *m_parentProjectDoc; IVisualStudioProject *m_parentProjectDoc;
}; };

View File

@@ -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 Internal
} // namespace VcProjectManager } // namespace VcProjectManager

View File

@@ -51,6 +51,7 @@ public:
QString getAttributeName(int index) const; QString getAttributeName(int index) const;
int getAttributeCount() const; int getAttributeCount() const;
void appendToXMLNode(QDomElement &elementNode) const; void appendToXMLNode(QDomElement &elementNode) const;
void copyFrom(const IAttributeContainer &container);
private: private:
QHash<QString, QString> m_anyAttribute; QHash<QString, QString> m_anyAttribute;

View File

@@ -85,5 +85,11 @@ IDebuggerTools *Tools::debuggerTools() const
return m_debuggerTools; return m_debuggerTools;
} }
void Tools::copyFrom(const ITools &tools)
{
const Tools &tls = static_cast<const Tools &>(tools);
*this = tls;
}
} // namespace Internal } // namespace Internal
} // namespace VcProjectManager } // namespace VcProjectManager

View File

@@ -51,6 +51,7 @@ public:
IConfigurationBuildTools *configurationBuildTools() const; IConfigurationBuildTools *configurationBuildTools() const;
IDeploymentTools *deploymentTools() const; IDeploymentTools *deploymentTools() const;
IDebuggerTools *debuggerTools() const; IDebuggerTools *debuggerTools() const;
void copyFrom(const ITools &tools);
private: private:
ConfigurationBuildTools *m_configurationBuildTools; ConfigurationBuildTools *m_configurationBuildTools;

View File

@@ -291,7 +291,7 @@ void FileConfigurationsEditWidget::readFileBuildConfigurations(IFile *file)
if (file != m_file) if (file != m_file)
configCont = new ConfigurationContainer(*(file->configurationContainer())); configCont = new ConfigurationContainer(*(file->configurationContainer()));
else { else {
configCont = cloneFileConfigContainer(file); configCont = new ConfigurationContainer(*(file->configurationContainer()));
connect(configCont, SIGNAL(configurationAdded(IConfiguration*)), this, SLOT(addConfigWidget(IConfiguration*))); connect(configCont, SIGNAL(configurationAdded(IConfiguration*)), this, SLOT(addConfigWidget(IConfiguration*)));
} }