/* Copyright 2006-2012 Xavier Guerrin This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. QElectroTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with QElectroTech. If not, see . */ #ifndef QET_PROJECT_H #define QET_PROJECT_H #include #include #include "nameslist.h" #include "elementslocation.h" #include "borderproperties.h" #include "conductorproperties.h" #include "titleblockproperties.h" #include "templatescollection.h" class Diagram; class ElementsCollection; class ElementsCategory; class ElementDefinition; class ElementsLocation; class TitleBlockTemplate; class XmlElementsCollection; class MoveElementsHandler; class MoveTitleBlockTemplatesHandler; /** Cette classe represente un projet QET. Typiquement enregistre dans un fichier, il s'agit d'un document XML integrant des schemas ainsi qu'une collection d'elements embarques. Ce dernier attribut permet d'exporter des schema sur d'autres machines sans se soucier de la presence des elements sur celle-ci. La classe QETProject gere l'enregistrement partiel. Ainsi, enregistrer les modifications apportees a un element reenregistrera le fichier mais en mettant a jour seulement les parties du document XML concerne. */ class QETProject : public QObject { Q_OBJECT // constructeurs, destructeur public: QETProject(int = 1, QObject * = 0); QETProject(const QString &, QObject * = 0); QETProject(const QDomElement &, QObject * = 0); virtual ~QETProject(); private: QETProject(const QETProject &); // enums public: /** Represente l'etat du projet */ enum ProjectState { Ok = 0, /// Le projet n'est pas en erreur FileOpenFailed = 1, /// l'ouverture d'un fichier a echoue XmlParsingFailed = 2, /// l'analyse XML a echoue ProjectParsingRunning = 3, /// la lecture du projet est en cours ProjectParsingFailed = 4, /// la lecture en tant que projet a echoue FileOpenDiscard = 5 /// the user cancelled the file opening }; // methodes public: ProjectState state() const; QList diagrams() const; int folioIndex(const Diagram *) const; ElementsCollection *embeddedCollection() const; TitleBlockTemplatesProjectCollection *embeddedTitleBlockTemplatesCollection(); QString filePath(); void setFilePath(const QString &); QString currentDir() const; QString pathNameTitle() const; QString title() const; qreal declaredQElectroTechVersion(); void setTitle(const QString &); QList embeddedTitleBlockTemplates(); const TitleBlockTemplate *getTemplateByName(const QString &template_name); QDomElement getTemplateXmlDescriptionByName(const QString &); bool setTemplateXmlDescription(const QString &, const QDomElement &); void removeTemplateByName(const QString &); BorderProperties defaultBorderProperties() const; void setDefaultBorderProperties(const BorderProperties &); TitleBlockProperties defaultTitleBlockProperties() const; void setDefaultTitleBlockProperties(const TitleBlockProperties &); ConductorProperties defaultConductorProperties() const; void setDefaultConductorProperties(const ConductorProperties &); QDomDocument toXml(); bool close(); bool write(); bool isReadOnly() const; void setReadOnly(bool); bool isEmpty() const; bool ensureIntegrationCategoryExists(); ElementsCategory *integrationCategory() const; QString integrateElement(const QString &, QString &); QString integrateElement(const QString &, MoveElementsHandler *, QString &); QString integrateTitleBlockTemplate(const TitleBlockTemplateLocation &, MoveTitleBlockTemplatesHandler *handler); bool usesElement(const ElementsLocation &); bool usesTitleBlockTemplate(const TitleBlockTemplateLocation &); void cleanUnusedTitleBlocKTemplates(); void cleanUnusedElements(MoveElementsHandler *); void cleanEmptyCategories(MoveElementsHandler *); bool projectWasModified(); bool embeddedCollectionWasModified(); bool diagramsWereModified(); DiagramContext projectProperties(); void setProjectProperties(const DiagramContext &); public slots: void componentWritten(); Diagram *addNewDiagram(); void removeDiagram(Diagram *); void diagramOrderChanged(int, int); signals: void projectFilePathChanged(QETProject *, const QString &); void projectTitleChanged(QETProject *, const QString &); void projectInformationsChanged(QETProject *); void diagramAdded(QETProject *, Diagram *); void diagramRemoved(QETProject *, Diagram *); void projectDiagramsOrderChanged(QETProject *, int, int); void elementIntegrated(QETProject *, const ElementsLocation &); void diagramUsedTemplate(TitleBlockTemplatesCollection *, const QString &); void readOnlyChanged(QETProject *, bool); private slots: void updateDiagramsFolioData(); void updateDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *, const QString &); void removeDiagramsTitleBlockTemplate(TitleBlockTemplatesCollection *, const QString &); void usedTitleBlockTemplateChanged(const QString &); private: void setupTitleBlockTemplatesCollection(); ElementsCategory *rootCategory() const; void readProjectXml(); void readDiagramsXml(); void readElementsCollectionXml(); void readEmbeddedTemplatesXml(); void readProjectPropertiesXml(); void writeProjectPropertiesXml(QDomElement &); void readDefaultPropertiesXml(); void writeDefaultPropertiesXml(QDomElement &); void addDiagram(Diagram *); NamesList namesListForIntegrationCategory(); ElementsLocation copyElementWithHandler(ElementDefinition *, ElementsCategory *, MoveElementsHandler *, QString &); // attributs private: /// Chemin du fichier dans lequel ce projet est enregistre QString file_path_; /// Etat du projet ProjectState state_; /// Element XML representant le projet QDomDocument document_root_; /// Schemas contenus dans le projet QList diagrams_; /// Collection d'elements embarquee XmlElementsCollection *collection_; /// Titre du projet QString project_title_; /// Version de QElectroTech declaree dans le document XML lors de son ouverture qreal project_qet_version_; /// booleen indiquant si le projet est en ReadOnly ou non bool read_only_; /// Chemin du fichier pour lequel ce projet est considere comme etant en lecture seule QString read_only_file_path_; /// Nom de la categorie a utiliser pour l'integration automatique des elements static QString integration_category_name; /// Dimensions par defaut pour les nouveaux schemas dans ce projet BorderProperties default_border_properties_; /// Proprietes par defaut des conducteurs pour les nouveaux schemas dans ce projet ConductorProperties default_conductor_properties_; /// Proprietes par defaut du cartouche pour les nouveaux schemas dans ce projet TitleBlockProperties default_titleblock_properties_; /// Embedded title block templates collection TitleBlockTemplatesProjectCollection titleblocks_; /// project-wide variables that will be made available to child diagrams DiagramContext project_properties_; }; Q_DECLARE_METATYPE(QETProject *) #endif