Files
qelectrotech-source-mirror/sources/elementscollection.cpp
scorpio810 81c684ca49 Merge Qt5 branch sources folder to trunk
-Cette ligne, et les suivantes ci-dessous, seront ignorées--

M    sources/aboutqet.cpp
M    sources/bordertitleblock.cpp
M    sources/conductorproperties.h
M    sources/configdialog.cpp
M    sources/configpages.cpp
M    sources/configpages.h
M    sources/createdxf.h
M    sources/diagram.cpp
M    sources/diagram.h
M    sources/diagramcommands.cpp
M    sources/diagramcommands.h
M    sources/diagramprintdialog.cpp
M    sources/diagramprintdialog.h
M    sources/diagramschooser.cpp
M    sources/diagramschooser.h
M    sources/diagramview.cpp
M    sources/diagramview.h
M    sources/dvevent/dveventaddimage.cpp
M    sources/dvevent/dveventaddshape.cpp
M    sources/editor/arceditor.cpp
M    sources/editor/arceditor.h
M    sources/editor/editorcommands.cpp
M    sources/editor/editorcommands.h
M    sources/editor/elementitemeditor.h
M    sources/editor/elementprimitivedecorator.cpp
M    sources/editor/elementscene.cpp
M    sources/editor/elementscene.h
M    sources/editor/elementview.cpp
M    sources/editor/ellipseeditor.cpp
M    sources/editor/ellipseeditor.h
M    sources/editor/esevent/eseventaddtext.cpp
M    sources/editor/esevent/eseventaddtextfield.cpp
M    sources/editor/esevent/eseventinterface.cpp
M    sources/editor/graphicspart/customelementpart.h
M    sources/editor/graphicspart/parttext.cpp
M    sources/editor/graphicspart/parttext.h
M    sources/editor/graphicspart/parttextfield.cpp
M    sources/editor/graphicspart/parttextfield.h
M    sources/editor/lineeditor.cpp
M    sources/editor/lineeditor.h
M    sources/editor/polygoneditor.cpp
M    sources/editor/qetelementeditor.cpp
M    sources/editor/qetelementeditor.h
M    sources/editor/rectangleeditor.cpp
M    sources/editor/rectangleeditor.h
M    sources/editor/styleeditor.cpp
M    sources/editor/styleeditor.h
M    sources/editor/terminaleditor.cpp
M    sources/editor/terminaleditor.h
M    sources/editor/texteditor.cpp
M    sources/editor/texteditor.h
M    sources/editor/textfieldeditor.cpp
M    sources/editor/textfieldeditor.h
M    sources/editor/ui/elementpropertieseditorwidget.cpp
M    sources/elementdefinition.cpp
M    sources/elementdeleter.cpp
M    sources/elementdeleter.h
M    sources/elementdialog.cpp
M    sources/elementscategorieslist.h
M    sources/elementscategorieswidget.cpp
M    sources/elementscategorieswidget.h
M    sources/elementscategory.cpp
M    sources/elementscategorydeleter.cpp
M    sources/elementscategorydeleter.h
M    sources/elementscategoryeditor.cpp
M    sources/elementscategoryeditor.h
M    sources/elementscollection.cpp
M    sources/elementscollectioncache.cpp
M    sources/elementspanel.cpp
M    sources/elementspanel.h
M    sources/elementspanelwidget.cpp
M    sources/elementspanelwidget.h
M    sources/elementtextsmover.h
M    sources/exportdialog.cpp
M    sources/exportdialog.h
M    sources/exportproperties.cpp
M    sources/exportpropertieswidget.cpp
M    sources/exportpropertieswidget.h
M    sources/genericpanel.cpp
M    sources/integrationmoveelementshandler.cpp
M    sources/integrationmoveelementshandler.h
M    sources/interactivemoveelementshandler.cpp
M    sources/nameslistwidget.cpp
M    sources/nameslistwidget.h
M    sources/newelementwizard.cpp
M    sources/newelementwizard.h
M    sources/nomenclature.cpp
M    sources/nomenclature.h
M    sources/projectconfigpages.cpp
M    sources/projectview.cpp
M    sources/projectview.h
M    sources/qet.cpp
M    sources/qetapp.cpp
M    sources/qetapp.h
M    sources/qetdiagrameditor.cpp
M    sources/qetdiagrameditor.h
M    sources/qetgraphicsitem/conductor.cpp
M    sources/qetgraphicsitem/conductortextitem.cpp
M    sources/qetgraphicsitem/customelement.cpp
M    sources/qetgraphicsitem/diagramimageitem.cpp
M    sources/qetgraphicsitem/diagramtextitem.cpp
M    sources/qetgraphicsitem/diagramtextitem.h
M    sources/qetgraphicsitem/element.cpp
M    sources/qetgraphicsitem/ghostelement.cpp
M    sources/qetgraphicsitem/qetshapeitem.cpp
M    sources/qetgraphicsitem/terminal.cpp
M    sources/qetgraphicsitem/terminal.h
M    sources/qeticons.cpp
M    sources/qeticons.h
M    sources/qetmainwindow.cpp
M    sources/qetmessagebox.cpp
M    sources/qetmessagebox.h
M    sources/qetprintpreviewdialog.cpp
M    sources/qetprintpreviewdialog.h
M    sources/qetproject.cpp
M    sources/qetsingleapplication.cpp
M    sources/qettabbar.h
M    sources/qfilenameedit.cpp
M    sources/qtextorientationspinboxwidget.cpp
M    sources/qtextorientationspinboxwidget.h
M    sources/qtextorientationwidget.cpp
M    sources/qtextorientationwidget.h
M    sources/richtext/richtexteditor.cpp
M    sources/richtext/richtexteditor_p.h
M    sources/richtext/ui_addlinkdialog.h
M    sources/titleblock/dimensionwidget.h
M    sources/titleblock/gridlayoutanimation.h
M    sources/titleblock/helpercell.h
M    sources/titleblock/integrationmovetemplateshandler.cpp
M    sources/titleblock/integrationmovetemplateshandler.h
M    sources/titleblock/qettemplateeditor.cpp
M    sources/titleblock/qettemplateeditor.h
M    sources/titleblock/templatecellsset.h
M    sources/titleblock/templatecellwidget.cpp
M    sources/titleblock/templatecellwidget.h
M    sources/titleblock/templatecommands.cpp
M    sources/titleblock/templatedeleter.cpp
M    sources/titleblock/templatedeleter.h
M    sources/titleblock/templatelocationchooser.cpp
M    sources/titleblock/templatelocationchooser.h
M    sources/titleblock/templatelocationsaver.cpp
M    sources/titleblock/templatelocationsaver.h
M    sources/titleblock/templatelogomanager.cpp
M    sources/titleblock/templatelogomanager.h
M    sources/titleblock/templateview.cpp
M    sources/titleblock/templatevisualcell.h
M    sources/titleblockcell.cpp
M    sources/titleblocktemplate.cpp
M    sources/treecoloranimation.h
M    sources/ui/conductorpropertieswidget.cpp
M    sources/ui/diagrampropertiesdialog.cpp
M    sources/ui/diagramselection.cpp
M    sources/ui/dialogautonum.cpp
M    sources/ui/dialogwaiting.cpp
M    sources/ui/elementpropertieswidget.cpp
M    sources/ui/elementselectorwidget.cpp
M    sources/ui/linksingleelementwidget.cpp
M    sources/ui/masterpropertieswidget.cpp
M    sources/ui/potentialtextsdialog.cpp
M    sources/ui/projectpropertiesdialog.cpp
M    sources/ui/selectautonumw.cpp
M    sources/ui/titleblockpropertieswidget.cpp
M    sources/ui/xrefpropertieswidget.cpp
M    sources/undocommand/changeelementinformationcommand.cpp


git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@3783 bfdf4180-ca20-0410-9c96-a3a8aa849046
2015-03-02 20:14:56 +00:00

463 lines
12 KiB
C++

/*
Copyright 2006-2015 The QElectroTech Team
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 <http://www.gnu.org/licenses/>.
*/
#include "elementscollection.h"
#include "elementscategory.h"
#include "elementdefinition.h"
#include "moveelementshandler.h"
/**
Constructeur
@param parent Item parent
*/
ElementsCollection::ElementsCollection(ElementsCollectionItem *parent) :
ElementsCollectionItem(parent),
cache_(0)
{
}
/**
Destructeur
*/
ElementsCollection::~ElementsCollection() {
}
/**
@return the title for this collection
*/
QString ElementsCollection::title() const {
return(title_);
}
/**
@param title New title for this collection
*/
void ElementsCollection::setTitle(const QString &title) {
if (title_ == title) return;
title_ = title;
emit(elementsCollectionChanged(this));
}
/**
@return the icon for this collection
*/
QIcon ElementsCollection::icon() const {
return(icon_);
}
/**
@param icon the icon for this collection
*/
void ElementsCollection::setIcon(const QIcon &icon) {
if (icon_.cacheKey() == icon.cacheKey()) return;
icon_ = icon;
emit(elementsCollectionChanged(this));
}
/**
@return toujours true
*/
bool ElementsCollection::isCollection() const {
return(true );
}
/**
@return toujours false
*/
bool ElementsCollection::isRootCategory() const {
return(false);
}
/**
@return toujours false
*/
bool ElementsCollection::isCategory() const {
return(false);
}
/**
@return toujours false
*/
bool ElementsCollection::isElement() const {
return(false);
}
/**
@return un pointeur ElementsCollection * sur cette collection
*/
ElementsCollection *ElementsCollection::toCollection() {
return(this);
}
/**
@return un pointeur vers la categorie racine de cette collection
*/
ElementsCategory *ElementsCollection::toCategory() {
return(rootCategory());
}
/**
@return toujours 0 - une collection n'est pas a proprement parler une
categorie
*/
ElementsCategory *ElementsCollection::toPureCategory() {
return(0);
}
/**
@return toujours 0 - une collection n'est pas un element
*/
ElementDefinition *ElementsCollection::toElement() {
return(0);
}
/**
@param target_category Categorie cible pour la copie ; la categorie racine
de cette collection sera copiee en tant que sous-categorie de la categorie
cible
@param handler Gestionnaire d'erreurs a utiliser pour effectuer la copie
@param deep_copy true pour copier recursivement le contenu (elements et
sous-categories) de la categorie racine, false sinon
@return La copie de la categorie, ou 0 si le processus a echoue.
*/
ElementsCollectionItem *ElementsCollection::copy(ElementsCategory *target_category, MoveElementsHandler *handler, bool deep_copy) {
if (ElementsCategory *root = rootCategory()) {
return(root -> copy(target_category, handler, deep_copy));
}
return(0);
}
/**
Il n'est pas possible de deplacer une collection. Cette methode demande
simplement au gestionnaire d'erreur handler d'afficher un message.
*/
ElementsCollectionItem *ElementsCollection::move(ElementsCategory *, MoveElementsHandler *handler) {
if (ElementsCategory *root = rootCategory()) {
if (handler) {
handler -> errorWithACategory(root, tr("Il n'est pas possible de déplacer une collection."));
}
}
return(0);
}
/**
Vide la collection de son contenu sans la supprimer
@return true si l'operation a reussi, false sinon
*/
bool ElementsCollection::removeContent() {
if (!rootCategory()) return(true);
// demande a la categorie racine de supprimer son contenu
return(rootCategory() -> removeContent());
}
/**
Vide la collection de son contenu sans la supprimer
@return true si l'operation a reussi, false sinon
*/
bool ElementsCollection::remove() {
return(removeContent());
}
/**
@return le projet auquel est rattachee cette collection ou 0 si
celle-ci n'est pas liee a un projet.
*/
QETProject *ElementsCollection::project() {
return(project_);
}
/**
@param project le nouveau projet auquel est rattachee cette collection
Indiquer 0 pour que cette collection ne soit plus liee a un projet.
*/
void ElementsCollection::setProject(QETProject *project) {
project_ = project;
}
/**
@return le protocole utilise par cette collection ; exemples :
"common" pour la collection commune qui utilise des URLs en common://
"custom" pour la collection perso qui utilise des URLs en custom://
"embed" pour une collection embarquee qui utilise des URLs en embed://
*/
QString ElementsCollection::protocol() {
return(protocol_);
}
/**
Definit le protocole de cette collection
@param p Nouveau protocole de cette collection
*/
void ElementsCollection::setProtocol(const QString &p) {
if (!p.isEmpty()) protocol_ = p;
}
/**
@return toujours 0 - une collection n'a pas de categorie parente. En
revanche, elle peut posseder un projet parent.
@see project()
*/
ElementsCategory *ElementsCollection::parentCategory() {
return(0);
}
/**
@return toujours une liste vide - une collection n'a pas de categorie
parente. En revanche, elle peut posseder un projet parent.
@see project()
*/
QList<ElementsCategory *> ElementsCollection::parentCategories() {
return(QList<ElementsCategory *>());
}
/**
@return toujours false0 - une collection n'a pas de categorie parente. En
revanche, elle peut posseder un projet parent.
@see project()
*/
bool ElementsCollection::hasParentCategory() {
return(false);
}
/**
@return toujours 0 - une collection n'a pas de collection parente. En
revanche, elle peut posseder un projet parent.
@see project()
*/
ElementsCollection *ElementsCollection::parentCollection() {
return(0);
}
/**
@return toujours false - une collection n'a pas de collection parente. En
revanche, elle peut posseder un projet parent.
@see project()
*/
bool ElementsCollection::hasParentCollection() {
return(false);
}
/**
@return toujours false - une collection ne peut etre l'enfant de quoi que ce
soit.
*/
bool ElementsCollection::isChildOf(ElementsCollectionItem *) {
return(false);
}
/**
@return toujours une chaine vide
*/
QString ElementsCollection::pathName() const {
return(QString());
}
/**
@return toujours une chaine vide
*/
QString ElementsCollection::virtualPath() {
return(QString());
}
/**
@return le protocole suivi de :// ou une chaine vide si cette collection
n'a pas de protocole defini.
*/
QString ElementsCollection::fullVirtualPath() {
if (protocol().isEmpty()) return(QString());
return(protocol() + "://");
}
/**
@return l'emplacement de cette collection
*/
ElementsLocation ElementsCollection::location() {
return(ElementsLocation(fullVirtualPath(), project()));
}
/**
@return une liste ne contenant que la categorie racine de la collection
*/
QList<ElementsCategory *> ElementsCollection::categories() {
QList<ElementsCategory *> result;
if (ElementsCategory *root = rootCategory()) {
result << root;
}
return(result);
}
/**
@param cat_path chemin d'une categorie sous la forme d'une adresse
virtuelle comme common://cat1/cat2/cat3
@return la categorie demandee, ou 0 si celle-ci n'a pas ete trouvee
*/
ElementsCategory *ElementsCollection::category(const QString &cat_path) {
ElementsCategory *root = rootCategory();
// on doit avoir une categorie racine
if (!root) return(0);
// le protocole de l'adresse virtuelle doit correspondre
if (!cat_path.startsWith(protocol_ + "://", Qt::CaseInsensitive)) return(0);
// on enleve le protocole
QString cat_path_(cat_path);
cat_path_.remove(QRegExp("^" + protocol_ + ":\\/\\/", Qt::CaseInsensitive));
// on fait appel a la categorie racine pour le reste du traitement
return(root -> category(cat_path_));
}
/**
Cree une categorie. La categorie parente doit exister.
@param path chemin d'une categorie a creer sous la forme d'une adresse
virtuelle comme common://cat1/cat2/cat3
@return la nouvelle categorie demandee, ou 0 en cas d'echec
*/
ElementsCategory *ElementsCollection::createCategory(const QString &path) {
ElementsCategory *root = rootCategory();
// on doit avoir une categorie racine
if (!root) return(0);
// on ne doit pas etre en lecture seule
if (!isWritable()) return(0);
// le protocole de l'adresse virtuelle doit correspondre
if (!path.startsWith(protocol_ + "://", Qt::CaseInsensitive)) return(0);
// on enleve le protocole
QString path_(path);
path_.remove(QRegExp("^" + protocol_ + ":\\/\\/", Qt::CaseInsensitive));
// on fait appel a la categorie racine pour le reste du traitement
return(root -> createCategory(path_));
}
/**
@return une liste vide
*/
QList<ElementDefinition *> ElementsCollection::elements() {
return(QList<ElementDefinition *>());
}
/**
@param elmt_path chemin d'un element sous la forme d'une adresse
virtuelle comme common://cat1/cat2/cat3/dog.elmt
@return l'element demande, ou 0 si celui-ci n'a pas ete trouve
*/
ElementDefinition *ElementsCollection::element(const QString &elmt_path) {
ElementsCategory *root = rootCategory();
// on doit avoir une categorie racine
if (!root) return(0);
// le protocole de l'adresse virtuelle doit correspondre
if (!elmt_path.startsWith(protocol_ + "://", Qt::CaseInsensitive)) return(0);
// on enleve le protocole
QString elmt_path_(elmt_path);
elmt_path_.remove(QRegExp("^" + protocol_ + ":\\/\\/", Qt::CaseInsensitive));
// on fait appel a la categorie racine pour le reste du traitement
return(root -> element(elmt_path_));
}
/**
Cree un element. La categorie parente doit exister.
@param path chemin d'un element a creer sous la forme d'une adresse
virtuelle comme common://cat1/cat2/cat3/dog.elmt
@return le nouvel element demande, ou 0 en cas d'echec
*/
ElementDefinition *ElementsCollection::createElement(const QString &path) {
ElementsCategory *root = rootCategory();
// on doit avoir une categorie racine
if (!rootCategory()) return(0);
// on ne doit pas etre en lecture seule
if (!isWritable()) return(0);
// le protocole de l'adresse virtuelle doit correspondre
if (!path.startsWith(protocol_ + "://", Qt::CaseInsensitive)) return(0);
// on enleve le protocole
QString path_(path);
path_.remove(QRegExp("^" + protocol_ + ":\\/\\/", Qt::CaseInsensitive));
// on fait appel a la categorie racine pour le reste du traitement
return(root -> createElement(path_));
}
/**
@return true si cette collection est vide (pas de sous-categorie, pas
d'element), false sinon.
*/
bool ElementsCollection::isEmpty() {
ElementsCategory *root_category = rootCategory();
if (!root_category) return(true);
return(root_category -> isEmpty());
}
/**
@return the count of categories and elements within this collection
*/
int ElementsCollection::count() {
ElementsCategory *root_category = rootCategory();
if (!root_category) return(0);
return(root_category -> count());
}
/**
@param item_path chemin d'un item sous la forme d'une adresse
virtuelle comme common://cat1/cat2/cat3
@param prefer_collections true pour renvoyer la collection lorsque le
chemin correspond aussi bien a une collection qu'a sa categorie racine
@return l'item demande, ou 0 si celui-ci n'a pas ete trouve
*/
ElementsCollectionItem *ElementsCollection::item(const QString &item_path, bool prefer_collections) {
ElementsCollectionItem *result = 0;
// essaye de trouver l'item en tant que categorie
result = category(item_path);
// si la categorie est trouvee, ...
if (result) {
// ... qu'il s'agit d'une categorie racine et que l'utilisateur prefere les collections
if (prefer_collections && result -> isRootCategory()) {
// ... alors on renvoie la collection et non la categorie
result = this;
}
}
// sinon essaye de trouver l'item en tant qu'element
if (!result) result = element(item_path);
return(result);
}
/**
@return The cache used by this collection, or 0 if this collection does not have any
*/
ElementsCollectionCache *ElementsCollection::cache() const {
return(cache_);
}
/**
@param cache The cache to be used by this collection
*/
void ElementsCollection::setCache(ElementsCollectionCache *cache) {
cache_ = cache;
}