Pour information, cette hiérarchie de classe permet d'accéder et de manipuler de manière abstraite des collections, catégories et éléments, que ceux-ci soient stockés sur un système de fichiers (classes d'implémentation File*) ou dans un projet (classes d'implémentation Xml*)
| Contrôle | ElementsCollection | ElementsCategory | ElementDefinition | |||
|---|---|---|---|---|---|---|
| copy | move | copy | move | copy | move | |
| Handler provided ? | | | | | | |
| Dst != src ? | | | | | | |
| Src is writable ? | | | | | | |
| Dst is readable ? | | | | | | |
| Dst is writeable ? | | | | | | |
| Dst already exists ? | | | | | | |
| Already existing dst is writable ? | | | | | | |
| Creation/deletion error ? | | | | | | |
Légende
Vérification effectuée
Vérification non effectuée car non pertinente
Exemple : on n'a pas besoin de pouvoir modifier l'item source lors d'une copie.
À noter que certains de ces contrôles sont redondés dans l'interface utilisateur, plus exactement dans le panel d'éléments. Celui-ci n'autorise que les drag'n drop à priori possibles au regard des permissions sur les items et de leur type. Ces contrôles peuvent être désactivés via les variables ENABLE_PANEL_WIDGET_DND_CHECKS (elementspanelwidget.cpp:37) et ENABLE_PANEL_DND_CHECKS (elementspanel.cpp:35).
Lorsqu'un élément (ou une catégorie) est ajouté à la collection embarquée d'un projet, il ne peut être référencé que par rapport à un projet donné, en tant qu'élément embarqué ; on a alors le couple de données suivant :
Ces données sont ce que retient un objet ElementsLocation pour désigner un élément sans ambiguïté. Les projets ouverts dans l'application étant numérotés et accessibles par leur numéro (on parle de “project id”), un élément peut également être désigné par une simple chaîne de caractères de la forme project<id>+embed://category1/category2/category3/element.elmt
Passage de projectx+embed:// à embed:// :
Passages de embed:// à projectx+embed:// :
QString type_id = e.attribute("type"); ElementsLocation element_location = ElementsLocation(type_id); if (type_id.startsWith("embed://")) element_location.setProject(project_);
Lorsque le schéma est lu, si un élément se déclare de type embed://, alors l'ElementsLocation construit pour localiser l'élément en question se voit lié au projet auquel appartient ce schéma.
/** @return Une chaine de caracteres representant l'emplacement */ QString ElementsLocation::toString() const { QString result; if (project_) { int project_id = QETApp::projectId(project_); if (project_id != -1) { result += "project" + QString().setNum(project_id) + "+"; } } result += path_; return(result); }
Le chargement de l'élément … a échoué avec le code d'erreur….