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 int getAttributeCount() const = 0;
virtual void appendToXMLNode(QDomElement &elementNode) const = 0;
virtual void copyFrom(const IAttributeContainer &container) = 0;
};
} // namespace Internal

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;
};

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 VcProjectManager

View File

@@ -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;

View File

@@ -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

View File

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

View File

@@ -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*)));
}