diff options
author | Radovan Zivkovic <pivonroll@gmail.com> | 2013-10-10 21:05:20 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2014-03-11 19:54:59 +0100 |
commit | b776d61752633d6423d9797ad92a18b65eeaad53 (patch) | |
tree | bf9a733ba453f9f1cc277f88851055ebb81c1664 | |
parent | 77722fe95569aa3a2089d86ab9cedf18e1cf340e (diff) |
References implement IReferences interface.
Change-Id: I6aaff1a9d0c6c86b4fdb4335e8a0454bb548a7f4
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
13 files changed, 121 insertions, 111 deletions
diff --git a/src/plugins/vcprojectmanager/interfaces/interfaces.pri b/src/plugins/vcprojectmanager/interfaces/interfaces.pri index 5f78ab1b87..f9e5d052cb 100644 --- a/src/plugins/vcprojectmanager/interfaces/interfaces.pri +++ b/src/plugins/vcprojectmanager/interfaces/interfaces.pri @@ -21,4 +21,5 @@ HEADERS += \ interfaces/idebuggertool.h \ interfaces/idebuggertools.h \ interfaces/iglobal.h \ - interfaces/iglobals.h + interfaces/iglobals.h \ + interfaces/ireferences.h diff --git a/src/plugins/vcprojectmanager/interfaces/ireference.h b/src/plugins/vcprojectmanager/interfaces/ireference.h index a06d8014a8..40d61b7d43 100644 --- a/src/plugins/vcprojectmanager/interfaces/ireference.h +++ b/src/plugins/vcprojectmanager/interfaces/ireference.h @@ -43,11 +43,12 @@ class ConfigurationContainer; class IReference : public IVcProjectXMLNode { public: - virtual ~IReference() {} + ~IReference() {} virtual IAttributeContainer* attributeContainer() const = 0; virtual ConfigurationContainer* configurationContainer() const = 0; virtual QString type() const = 0; + virtual IReference* clone() const = 0; }; } // namespace Internal diff --git a/src/plugins/vcprojectmanager/interfaces/ireferences.h b/src/plugins/vcprojectmanager/interfaces/ireferences.h new file mode 100644 index 0000000000..9ceffb5ba9 --- /dev/null +++ b/src/plugins/vcprojectmanager/interfaces/ireferences.h @@ -0,0 +1,54 @@ +/************************************************************************** +** +** Copyright (c) 2013 Bojan Petrovic +** Copyright (c) 2013 Radovan Zivkovic +** 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_IREFERENCEHANDLER_H +#define VCPROJECTMANAGER_INTERNAL_IREFERENCEHANDLER_H + +#include "../vcprojectmodel/ivcprojectnodemodel.h" + +namespace VcProjectManager { +namespace Internal { + +class IReference; + +class IReferences : public IVcProjectXMLNode +{ +public: + virtual ~IReferences() {} + + virtual void addReference(IReference* reference) = 0; + virtual void removeReference(IReference* reference) = 0; + virtual int referenceCount() const = 0; + virtual IReference* reference(int index) const = 0; +}; + +} // namespace Internal +} // namespace VcProjectManager + +#endif // VCPROJECTMANAGER_INTERNAL_IREFERENCEHANDLER_H diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/activexreference.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/activexreference.cpp index 426782f87c..a86aecea11 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/activexreference.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/activexreference.cpp @@ -133,6 +133,11 @@ QString ActiveXReference::type() const return QLatin1String(VcDocConstants::ACTIVEX_REFERENCE); } +IReference *ActiveXReference::clone() const +{ + return new ActiveXReference(*this); +} + void ActiveXReference::processReferenceConfig(const QDomNode &referenceConfig) { IConfiguration *referenceConfiguration = createReferenceConfiguration(); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/activexreference.h b/src/plugins/vcprojectmanager/vcprojectmodel/activexreference.h index 19ee56dd8d..1fe205779e 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/activexreference.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/activexreference.h @@ -42,11 +42,7 @@ class GeneralAttributeContainer; class ActiveXReference : public IReference { - friend class ActiveXReferenceFactory; - public: - typedef QSharedPointer<ActiveXReference> Ptr; - ActiveXReference(); ActiveXReference(const ActiveXReference &ref); ActiveXReference &operator=(const ActiveXReference &ref); @@ -60,6 +56,7 @@ public: IAttributeContainer *attributeContainer() const; ConfigurationContainer *configurationContainer() const; QString type() const; + IReference* clone() const; private: void processNodeAttributes(const QDomElement &element); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/assemblyreference.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/assemblyreference.cpp index 5fbcfe34df..522f8155ab 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/assemblyreference.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/assemblyreference.cpp @@ -124,6 +124,11 @@ QString AssemblyReference::type() const return QLatin1String(VcDocConstants::ASSEMBLY_REFERENCE); } +IReference *AssemblyReference::clone() const +{ + return new AssemblyReference(*this); +} + void AssemblyReference::processNodeAttributes(const QDomElement &element) { QDomNamedNodeMap namedNodeMap = element.attributes(); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/assemblyreference.h b/src/plugins/vcprojectmanager/vcprojectmodel/assemblyreference.h index 0fc4c4fb04..e653f054f7 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/assemblyreference.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/assemblyreference.h @@ -43,8 +43,6 @@ class GeneralAttributeContainer; class AssemblyReference : public IReference { public: - typedef QSharedPointer<AssemblyReference> Ptr; - AssemblyReference(); AssemblyReference(const AssemblyReference &asmRef); AssemblyReference& operator=(const AssemblyReference &asmRef); @@ -57,6 +55,7 @@ public: IAttributeContainer *attributeContainer() const; ConfigurationContainer *configurationContainer() const; QString type() const; + IReference* clone() const; protected: virtual void processNodeAttributes(const QDomElement &element); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/configuration.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/configuration.cpp index 99d254ff61..47e3f49037 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/configuration.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/configuration.cpp @@ -192,7 +192,7 @@ void Configuration::processToolNode(const QDomNode &toolNode) QDomAttr domAttribute = domNode.toAttr(); if (domAttribute.name() == QLatin1String("Name")) { ToolDescriptionDataManager *tDDM = ToolDescriptionDataManager::instance(); - ToolDescription *toolDesc = tDDM->toolDescription(domAttribute.value()); + IToolDescription *toolDesc = tDDM->toolDescription(domAttribute.value()); toolConf = toolDesc->createTool(); break; } diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/projectreference.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/projectreference.cpp index 2255f2d5ef..6e42771243 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/projectreference.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/projectreference.cpp @@ -111,6 +111,11 @@ QString ProjectReference::type() const return QLatin1String(VcDocConstants::PROJECT_REFERENCE); } +IReference *ProjectReference::clone() const +{ + return new ProjectReference(*this); +} + void ProjectReference::processReferenceConfig(const QDomNode &referenceConfig) { IConfiguration *referenceConfiguration = new Configuration(QLatin1String("ReferenceConfiguration")); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/projectreference.h b/src/plugins/vcprojectmanager/vcprojectmodel/projectreference.h index 63b69e4494..8e985007c6 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/projectreference.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/projectreference.h @@ -56,6 +56,7 @@ public: IAttributeContainer *attributeContainer() const; ConfigurationContainer *configurationContainer() const; QString type() const; + IReference* clone() const; protected: void processReferenceConfig(const QDomNode &referenceConfig); diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/references.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/references.cpp index 4e8c869776..9e6cabcf1e 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/references.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/references.cpp @@ -30,50 +30,36 @@ #include "references.h" #include "generalattributecontainer.h" +#include <utils/qtcassert.h> + namespace VcProjectManager { namespace Internal { -References::References(VcDocConstants::DocumentVersion version) - : m_docVersion(version) +References::References() { } References::References(const References &references) { - m_docVersion = references.m_docVersion; - - foreach (const ActiveXReference::Ptr &ref, references.m_activeXReferences) - m_activeXReferences.append(ActiveXReference::Ptr(new ActiveXReference(*ref))); - - foreach (const AssemblyReference::Ptr &ref, references.m_assemblyReferences) - m_assemblyReferences.append(AssemblyReference::Ptr(new AssemblyReference(*ref))); - - foreach (const ProjectReference::Ptr &ref, references.m_projectReferences) - m_projectReferences.append(ProjectReference::Ptr(new ProjectReference(*ref))); + foreach (const IReference *ref, references.m_references) + m_references.append(ref->clone()); } References &References::operator =(const References &references) { if (this != &references) { - m_docVersion = references.m_docVersion; - m_activeXReferences.clear(); - m_assemblyReferences.clear(); - m_projectReferences.clear(); + qDeleteAll(m_references); + m_references.clear(); - foreach (const ActiveXReference::Ptr &ref, references.m_activeXReferences) - m_activeXReferences.append(ActiveXReference::Ptr(new ActiveXReference(*ref))); - - foreach (const AssemblyReference::Ptr &ref, references.m_assemblyReferences) - m_assemblyReferences.append(AssemblyReference::Ptr(new AssemblyReference(*ref))); - - foreach (const ProjectReference::Ptr &ref, references.m_projectReferences) - m_projectReferences.append(ProjectReference::Ptr(new ProjectReference(*ref))); + foreach (const IReference *ref, references.m_references) + m_references.append(ref->clone()); } return *this; } References::~References() { + qDeleteAll(m_references); } void References::processNode(const QDomNode &node) @@ -97,87 +83,51 @@ QDomNode References::toXMLDomNode(QDomDocument &domXMLDocument) const { QDomElement fileNode = domXMLDocument.createElement(QLatin1String("References")); - foreach (const AssemblyReference::Ptr &asmRef, m_assemblyReferences) + foreach (const IReference *asmRef, m_references) fileNode.appendChild(asmRef->toXMLDomNode(domXMLDocument)); - foreach (const ActiveXReference::Ptr &activeXRef, m_activeXReferences) - fileNode.appendChild(activeXRef->toXMLDomNode(domXMLDocument)); - - foreach (const ProjectReference::Ptr &projRef, m_projectReferences) - fileNode.appendChild(projRef->toXMLDomNode(domXMLDocument)); - return fileNode; } -bool References::isEmpty() const -{ - return m_activeXReferences.isEmpty() && m_assemblyReferences.isEmpty() && m_projectReferences.isEmpty(); -} - -void References::addAssemblyReference(AssemblyReference::Ptr asmRef) -{ - if (m_assemblyReferences.contains(asmRef)) - return; - m_assemblyReferences.append(asmRef); -} - -void References::removeAssemblyReference(AssemblyReference::Ptr asmRef) -{ - m_assemblyReferences.removeAll(asmRef); -} - -void References::addActiveXReference(ActiveXReference::Ptr actXRef) +void References::addReference(IReference *reference) { - if (m_activeXReferences.contains(actXRef)) + if (!reference || m_references.contains(reference)) return; - m_activeXReferences.append(actXRef); -} - -void References::removeActiveXReference(ActiveXReference::Ptr actXRef) -{ - m_activeXReferences.removeAll(actXRef); + m_references.append(reference); } -void References::addProjectReference(ProjectReference::Ptr projRefer) +void References::removeReference(IReference *reference) { - if (m_projectReferences.contains(projRefer)) - return; - m_projectReferences.append(projRefer); + m_references.removeOne(reference); + delete reference; } -void References::removeProjectReference(ProjectReference::Ptr projRef) +int References::referenceCount() const { - m_projectReferences.removeAll(projRef); + return m_references.size(); } -void References::removeProjectReference(const QString &projRefName) +IReference *References::reference(int index) const { - foreach (const ProjectReference::Ptr &projRef, m_projectReferences) { - if (projRef->attributeContainer()->attributeValue(QLatin1String(VcDocConstants::PROJECT_REFERENCE_NAME)) == projRefName) { - removeProjectReference(projRef); - return; - } - } + QTC_ASSERT(0 <= index && index < m_references.size(), return 0); + return m_references[index]; } void References::processReference(const QDomNode &referenceNode) { - if (referenceNode.nodeName() == QLatin1String("AssemblyReference")) { - AssemblyReference::Ptr reference(new AssemblyReference); - m_assemblyReferences.append(reference); - reference->processNode(referenceNode); - } + IReference *reference = 0; + if (referenceNode.nodeName() == QLatin1String("AssemblyReference")) + reference = new AssemblyReference; - else if (referenceNode.nodeName() == QLatin1String("ActiveXReference")) { - ActiveXReference::Ptr reference(new ActiveXReference); - m_activeXReferences.append(reference); - reference->processNode(referenceNode); - } + else if (referenceNode.nodeName() == QLatin1String("ActiveXReference")) + reference = new ActiveXReference; + + else if (referenceNode.nodeName() == QLatin1String("ProjectReference")) + reference = new ProjectReference; - else if (referenceNode.nodeName() == QLatin1String("ProjectReference")) { - ProjectReference::Ptr reference(new ProjectReference); - m_projectReferences.append(reference); + if (reference) { reference->processNode(referenceNode); + m_references.append(reference); } // process next sibling diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/references.h b/src/plugins/vcprojectmanager/vcprojectmodel/references.h index bdd508fead..dd2ab96295 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/references.h +++ b/src/plugins/vcprojectmanager/vcprojectmodel/references.h @@ -30,7 +30,7 @@ #ifndef VCPROJECTMANAGER_INTERNAL_REFERENCES_H #define VCPROJECTMANAGER_INTERNAL_REFERENCES_H -#include "ivcprojectnodemodel.h" +#include "../interfaces/ireferences.h" #include "activexreference.h" #include "assemblyreference.h" @@ -39,12 +39,12 @@ namespace VcProjectManager { namespace Internal { -class References : public IVcProjectXMLNode +class References : public IReferences { public: typedef QSharedPointer<References> Ptr; - References(VcDocConstants::DocumentVersion version); + References(); References(const References &references); References& operator=(const References &references); ~References(); @@ -53,23 +53,15 @@ public: VcNodeWidget* createSettingsWidget(); QDomNode toXMLDomNode(QDomDocument &domXMLDocument) const; - bool isEmpty() const; - - void addAssemblyReference(AssemblyReference::Ptr asmRef); - void removeAssemblyReference(AssemblyReference::Ptr asmRef); - void addActiveXReference(ActiveXReference::Ptr actXRef); - void removeActiveXReference(ActiveXReference::Ptr actXRef); - void addProjectReference(ProjectReference::Ptr projRefer); - void removeProjectReference(ProjectReference::Ptr projRef); - void removeProjectReference(const QString &projRefName); + void addReference(IReference *reference); + void removeReference(IReference *reference); + int referenceCount() const; + IReference *reference(int index) const; private: void processReference(const QDomNode &referenceNode); - QList<AssemblyReference::Ptr> m_assemblyReferences; - QList<ActiveXReference::Ptr> m_activeXReferences; - QList<ProjectReference::Ptr> m_projectReferences; - VcDocConstants::DocumentVersion m_docVersion; + QList<IReference *> m_references; }; } // namespace Internal diff --git a/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp b/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp index 0bb838d9d2..a42dc86d68 100644 --- a/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp +++ b/src/plugins/vcprojectmanager/vcprojectmodel/vcprojectdocument.cpp @@ -331,7 +331,7 @@ QDomElement VcProjectDocument::toVcDocumentElement(QDomDocument &domXMLDocument) if (m_files->fileCount() || m_files->fileContainerCount()) vcDocNode.appendChild(m_files->toXMLDomNode(domXMLDocument)); - if (!m_references->isEmpty()) + if (m_references->referenceCount()) vcDocNode.appendChild(m_references->toXMLDomNode(domXMLDocument)); if (m_globals->globalCount()) @@ -381,7 +381,7 @@ void VcProjectDocument2003::init() m_documentVersion = VcDocConstants::DV_MSVC_2003; m_files = Files::Ptr(new Files(this)); m_configurations = Configurations::Ptr(new Configurations(this)); - m_references = References::Ptr(new References(m_documentVersion)); + m_references = References::Ptr(new References); } @@ -487,7 +487,7 @@ void VcProjectDocument2005::init() m_documentVersion = VcDocConstants::DV_MSVC_2005; m_files = Files::Ptr(new Files(this)); m_configurations = Configurations::Ptr(new Configurations(this)); - m_references = References::Ptr(new References(m_documentVersion)); + m_references = References::Ptr(new References); } void VcProjectDocument2005::processNode(const QDomNode &node) @@ -614,7 +614,7 @@ void VcProjectDocument2008::init() m_documentVersion = VcDocConstants::DV_MSVC_2008; m_files = Files::Ptr(new Files(this)); m_configurations = Configurations::Ptr(new Configurations(this)); - m_references = References::Ptr(new References(m_documentVersion)); + m_references = References::Ptr(new References); } void VcProjectDocument2008::processNode(const QDomNode &node) |