Verovio
Source code documentation
object.h
1 // Name: object.h
3 // Author: Laurent Pugin
4 // Created: 2005
5 // Copyright (c) Authors and others. All rights reserved.
7 
8 #ifndef __VRV_OBJECT_H__
9 #define __VRV_OBJECT_H__
10 
11 #include <cstdlib>
12 #include <functional>
13 #include <iterator>
14 #include <map>
15 #include <memory>
16 #include <mutex>
17 #include <shared_mutex>
18 #include <string>
19 #include <unordered_set>
20 
21 //----------------------------------------------------------------------------
22 
23 #include "attclasses.h"
24 #include "attmodule.h"
25 #include "boundingbox.h"
26 #include "vrvdef.h"
27 
28 namespace vrv {
29 
30 class AltSymInterface;
31 class AreaPosInterface;
32 class Doc;
33 class DurationInterface;
34 class EditorialElement;
35 class Output;
36 class Filters;
37 class Functor;
38 class Functor;
39 class ConstFunctor;
40 class LinkingInterface;
41 class FacsimileInterface;
42 class OffsetInterface;
43 class OffsetSpanningInterface;
44 class PitchInterface;
45 class PositionInterface;
46 class Resources;
47 class ScoreDefInterface;
48 class StemmedDrawingInterface;
49 class TextDirInterface;
50 class TimePointInterface;
51 class TimeSpanningInterface;
52 class VisibilityDrawingInterface;
53 class Zone;
54 
55 #define UNLIMITED_DEPTH -10000
56 #define FORWARD true
57 #define BACKWARD false
58 
59 //----------------------------------------------------------------------------
60 // Object
61 //----------------------------------------------------------------------------
62 
66 class Object : public BoundingBox {
67 public:
73  Object();
74  Object(ClassId classId);
75  virtual ~Object();
76  ClassId GetClassId() const final { return m_classId; }
77  virtual std::string GetClassName() const { return "[MISSING]"; }
79 
86  bool IsReferenceObject() const { return m_isReferenceObject; }
88 
92  bool IsFloatingObject() const { return (this->IsSystemElement() || this->IsControlElement()); }
93 
98  bool IsMilestoneElement() const;
99  Object *GetMilestoneEnd();
101 
107  bool IsControlElement() const { return Object::IsControlElement(m_classId); }
108  bool IsEditorialElement() const { return Object::IsEditorialElement(m_classId); }
109  bool IsLayerElement() const { return Object::IsLayerElement(m_classId); }
110  bool IsLyricElement() const { return Object::IsLyricElement(m_classId); }
111  bool IsPageElement() const { return Object::IsPageElement(m_classId); }
112  bool IsRunningElement() const { return Object::IsRunningElement(m_classId); }
113  bool IsScoreDefElement() const { return Object::IsScoreDefElement(m_classId); }
114  bool IsSystemElement() const { return Object::IsSystemElement(m_classId); }
115  bool IsTextElement() const { return Object::IsTextElement(m_classId); }
117 
124  static bool IsControlElement(ClassId classId)
125  {
126  return ((classId > CONTROL_ELEMENT) && (classId < CONTROL_ELEMENT_max));
127  }
128  static bool IsEditorialElement(ClassId classId)
129  {
130  return ((classId > EDITORIAL_ELEMENT) && (classId < EDITORIAL_ELEMENT_max));
131  }
132  static bool IsLayerElement(ClassId classId) { return ((classId > LAYER_ELEMENT) && (classId < LAYER_ELEMENT_max)); }
133  static bool IsLyricElement(ClassId classId) { return ((classId > LYRIC_ELEMENT) && (classId < LYRIC_ELEMENT_max)); }
134  static bool IsPageElement(ClassId classId) { return ((classId > PAGE_ELEMENT) && (classId < PAGE_ELEMENT_max)); }
135  static bool IsRunningElement(ClassId classId)
136  {
137  return ((classId > RUNNING_ELEMENT) && (classId < RUNNING_ELEMENT_max));
138  }
139  static bool IsScoreDefElement(ClassId classId)
140  {
141  return ((classId > SCOREDEF_ELEMENT) && (classId < SCOREDEF_ELEMENT_max));
142  }
143  static bool IsSystemElement(ClassId classId)
144  {
145  return ((classId > SYSTEM_ELEMENT) && (classId < SYSTEM_ELEMENT_max));
146  }
147  static bool IsTextElement(ClassId classId) { return ((classId > TEXT_ELEMENT) && (classId < TEXT_ELEMENT_max)); }
149 
154  void RegisterAttClass(AttClassId attClassId) { m_attClasses.push_back(attClassId); }
155  bool HasAttClass(AttClassId attClassId) const
156  {
157  return std::find(m_attClasses.begin(), m_attClasses.end(), attClassId) != m_attClasses.end();
158  }
159  void RegisterInterface(std::vector<AttClassId> *attClasses, InterfaceId interfaceId);
160  bool HasInterface(InterfaceId interfaceId) const
161  {
162  return std::find(m_interfaces.begin(), m_interfaces.end(), interfaceId) != m_interfaces.end();
163  }
165 
170  virtual AltSymInterface *GetAltSymInterface() { return NULL; }
171  virtual const AltSymInterface *GetAltSymInterface() const { return NULL; }
172  virtual AreaPosInterface *GetAreaPosInterface() { return NULL; }
173  virtual const AreaPosInterface *GetAreaPosInterface() const { return NULL; }
174  virtual BeamDrawingInterface *GetBeamDrawingInterface() { return NULL; }
175  virtual const BeamDrawingInterface *GetBeamDrawingInterface() const { return NULL; }
176  virtual DurationInterface *GetDurationInterface() { return NULL; }
177  virtual const DurationInterface *GetDurationInterface() const { return NULL; }
178  virtual LinkingInterface *GetLinkingInterface() { return NULL; }
179  virtual const LinkingInterface *GetLinkingInterface() const { return NULL; }
180  virtual FacsimileInterface *GetFacsimileInterface() { return NULL; }
181  virtual const FacsimileInterface *GetFacsimileInterface() const { return NULL; }
182  virtual OffsetInterface *GetOffsetInterface() { return NULL; }
183  virtual const OffsetInterface *GetOffsetInterface() const { return NULL; }
184  virtual OffsetSpanningInterface *GetOffsetSpanningInterface() { return NULL; }
185  virtual const OffsetSpanningInterface *GetOffsetSpanningInterface() const { return NULL; }
186  virtual PitchInterface *GetPitchInterface() { return NULL; }
187  virtual const PitchInterface *GetPitchInterface() const { return NULL; }
188  virtual PlistInterface *GetPlistInterface() { return NULL; }
189  virtual const PlistInterface *GetPlistInterface() const { return NULL; }
190  virtual PositionInterface *GetPositionInterface() { return NULL; }
191  virtual const PositionInterface *GetPositionInterface() const { return NULL; }
192  virtual ScoreDefInterface *GetScoreDefInterface() { return NULL; }
193  virtual const ScoreDefInterface *GetScoreDefInterface() const { return NULL; }
194  virtual StemmedDrawingInterface *GetStemmedDrawingInterface() { return NULL; }
195  virtual const StemmedDrawingInterface *GetStemmedDrawingInterface() const { return NULL; }
196  virtual TextDirInterface *GetTextDirInterface() { return NULL; }
197  virtual const TextDirInterface *GetTextDirInterface() const { return NULL; }
198  virtual TimePointInterface *GetTimePointInterface() { return NULL; }
199  virtual const TimePointInterface *GetTimePointInterface() const { return NULL; }
200  virtual TimeSpanningInterface *GetTimeSpanningInterface() { return NULL; }
201  virtual const TimeSpanningInterface *GetTimeSpanningInterface() const { return NULL; }
202  virtual VisibilityDrawingInterface *GetVisibilityDrawingInterface() { return NULL; }
203  virtual const VisibilityDrawingInterface *GetVisibilityDrawingInterface() const { return NULL; }
205 
209  const Resources *GetDocResources() const;
210 
215  virtual void Reset();
216 
225  Object(const Object &object);
226 
230  Object &operator=(const Object &object);
231 
239  void MoveChildrenFrom(Object *sourceParent, int idx = -1, bool allowTypeChange = false);
240 
245  void ReplaceChild(Object *currentChild, Object *replacingChild);
246 
251  void InsertBefore(Object *child, Object *newChild);
252  void InsertAfter(Object *child, Object *newChild);
254 
260  typedef bool (*binaryComp)(Object *, Object *);
261  void SortChildren(binaryComp comp);
262 
267  void MoveItselfTo(Object *targetParent);
268 
273  virtual Object *Clone() const;
274 
279  virtual bool CopyChildren() const { return true; }
280 
286  virtual void CloneReset();
287 
288  const std::string &GetID() const { return m_id; }
289  void SetID(const std::string &id) { m_id = id; }
290  void SwapID(Object *other);
291  void ResetID();
292 
297  virtual void AttributesToExternal() {};
298  virtual void AttributesToInternal() {};
300 
304  std::string GetComment() const { return m_comment; }
305  void SetComment(std::string comment) { m_comment = comment; }
306  bool HasComment() const { return !m_comment.empty(); }
307  std::string GetClosingComment() const { return m_closingComment; }
308  void SetClosingComment(std::string endComment) { m_closingComment = endComment; }
309  bool HasClosingComment() const { return !m_closingComment.empty(); }
310 
317  int GetChildCount() const { return (int)m_children.size(); }
318  int GetChildCount(const ClassId classId) const;
319  int GetChildCount(const ClassId classId, int depth) const;
320  int GetDescendantCount(const ClassId classId) const;
322 
327  Object *GetChild(int idx);
328  const Object *GetChild(int idx) const;
329  Object *GetChild(int idx, const ClassId classId);
330  const Object *GetChild(int idx, const ClassId classId) const;
332 
339  Object *GetDirectChild(Object *parent, Object *descendant);
340 
345  ArrayOfConstObjects GetChildren() const;
346  const ArrayOfObjects &GetChildren() { return m_children; }
348 
353  ArrayOfObjects &GetChildrenForModification() { return m_children; }
354 
360  void CopyAttributesTo(Object *target) const;
361 
366  int GetAttributes(ArrayOfStrAttr *attributes, bool convertToExternal = true) const;
367 
371  bool HasAttribute(std::string attribute, std::string value) const;
372 
381  Object *GetFirst(const ClassId classId = UNSPECIFIED);
382  const Object *GetFirst(const ClassId classId = UNSPECIFIED) const;
383  Object *GetNext();
384  const Object *GetNext() const;
386 
392  Object *GetNext(const Object *child, const ClassId classId = UNSPECIFIED);
393  const Object *GetNext(const Object *child, const ClassId classId = UNSPECIFIED) const;
394  Object *GetPrevious(const Object *child, const ClassId classId = UNSPECIFIED);
395  const Object *GetPrevious(const Object *child, const ClassId classId = UNSPECIFIED) const;
397 
402  Object *GetLast(const ClassId classId = UNSPECIFIED);
403  const Object *GetLast(const ClassId classId = UNSPECIFIED) const;
405 
410  Object *GetParent() { return m_parent; }
411  const Object *GetParent() const { return m_parent; }
413 
418  void SetParent(Object *parent);
419 
424  void ResetParent() { m_parent = NULL; }
425 
430  virtual bool IsSupportedChild(ClassId classId);
431 
436  virtual bool AddChild(Object *object);
437 
441  virtual bool AddChildAdditionalCheck(Object *) { return true; };
442 
448  virtual int GetInsertOrderFor(ClassId) const { return VRV_UNSET; }
449 
453  int GetInsertOrderForIn(ClassId classId, const std::vector<ClassId> &order) const;
454 
458  int GetIdx() const;
459 
464  int GetDrawingX() const override;
465  int GetDrawingY() const override;
467 
473  void ResetCachedDrawingX() const override;
474  void ResetCachedDrawingY() const override;
476 
480  int GetChildIndex(const Object *child) const;
481 
485  int GetDescendantIndex(const Object *child, const ClassId classId, int depth);
486 
490  void InsertChild(Object *element, int idx);
491 
497  void RotateChildren(int first, int middle, int last);
498 
503  Object *DetachChild(int idx);
504 
509  void ReplaceWithCopyOf(Object *object);
510 
515  bool HasDescendant(const Object *child, int deepness = UNLIMITED_DEPTH) const;
516 
522  Object *FindDescendantByID(const std::string &id, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD);
523  const Object *FindDescendantByID(
524  const std::string &id, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD) const;
526 
532  Object *FindDescendantByType(ClassId classId, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD);
533  const Object *FindDescendantByType(ClassId classId, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD) const;
535 
542  Comparison *comparison, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD);
544  Comparison *comparison, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD) const;
546 
553  Comparison *comparison, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD);
555  Comparison *comparison, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD) const;
557 
563  ClassId classId, bool continueDepthSearchForMatches = true, int deepness = UNLIMITED_DEPTH);
564  ListOfConstObjects FindAllDescendantsByType(
565  ClassId classId, bool continueDepthSearchForMatches = true, int deepness = UNLIMITED_DEPTH) const;
567 
573  void FindAllDescendantsByComparison(ListOfObjects *objects, Comparison *comparison, int deepness = UNLIMITED_DEPTH,
574  bool direction = FORWARD, bool clear = true);
575  void FindAllDescendantsByComparison(ListOfConstObjects *objects, Comparison *comparison,
576  int deepness = UNLIMITED_DEPTH, bool direction = FORWARD, bool clear = true) const;
578 
584  void FindAllDescendantsBetween(ListOfObjects *objects, Comparison *comparison, const Object *start,
585  const Object *end, bool clear = true, int depth = UNLIMITED_DEPTH);
586  void FindAllDescendantsBetween(ListOfConstObjects *objects, Comparison *comparison, const Object *start,
587  const Object *end, bool clear = true, int depth = UNLIMITED_DEPTH) const;
589 
599  Object *Relinquish(int idx);
600 
606 
611 
616  bool DeleteChild(Object *child);
617 
623 
628  ListOfObjects GetAncestors();
629  ListOfConstObjects GetAncestors() const;
631 
635  bool IsAncestorOf(const Object *object) const;
636 
642  Object *GetFirstAncestor(const ClassId classId, int maxSteps = -1);
643  const Object *GetFirstAncestor(const ClassId classId, int maxSteps = -1) const;
645 
647  Object *GetFirstAncestorInRange(const ClassId classIdMin, const ClassId classIdMax, int maxDepth = -1);
648  const Object *GetFirstAncestorInRange(const ClassId classIdMin, const ClassId classIdMax, int maxDepth = -1) const;
650 
656  Object *GetLastAncestorNot(const ClassId classId, int maxSteps = -1);
657  const Object *GetLastAncestorNot(const ClassId classId, int maxSteps = -1) const;
659 
664  Object *GetFirstChildNot(const ClassId classId);
665  const Object *GetFirstChildNot(const ClassId classId) const;
667 
672  void FillFlatList(ListOfConstObjects &list) const;
673 
677  bool IsModified() const { return m_isModified; }
678 
682  void Modify(bool modified = true) const;
683 
688  bool IsAttribute() const { return m_isAttribute; }
689  void IsAttribute(bool isAttribute) { m_isAttribute = isAttribute; }
691 
696  bool IsExpansion() const { return m_isExpansion; }
697  void IsExpansion(bool isExpansion) { m_isExpansion = isExpansion; }
699 
704 
709 
713  void SaveObject(Output *output);
714 
718  template <class Compare> void StableSort(Compare comp)
719  {
720  std::stable_sort(m_children.begin(), m_children.end(), comp);
721  }
722 
723  void ReorderByXPos();
724 
725  Object *FindNextChild(Comparison *comp, Object *start);
726 
727  Object *FindPreviousChild(Comparison *comp, Object *start);
728 
733  bool HasPlistReferences() const { return static_cast<bool>(m_plistReferences); }
734  void ResetPlistReferences() { m_plistReferences.reset(); }
735  const ListOfConstObjects *GetPlistReferences() const { return m_plistReferences.get(); }
736  void AddPlistReference(const Object *object);
738 
748  void Process(Functor &functor, int deepness = UNLIMITED_DEPTH, bool skipFirst = false);
749  void Process(ConstFunctor &functor, int deepness = UNLIMITED_DEPTH, bool skipFirst = false) const;
751 
756  virtual FunctorCode Accept(Functor &functor);
757  virtual FunctorCode Accept(ConstFunctor &functor) const;
758  virtual FunctorCode AcceptEnd(Functor &functor);
759  virtual FunctorCode AcceptEnd(ConstFunctor &functor) const;
761 
766  void LogDebugTree(int maxDepth = UNLIMITED_DEPTH, int level = 0);
767  virtual std::string LogDebugTreeMsg() { return this->GetClassName(); }
769 
770  //----------------//
771  // Static methods //
772  //----------------//
773 
774  static void SeedID(uint32_t seed = 0);
775 
776  static std::string GenerateHashID();
777 
778  static uint32_t Hash(uint32_t number, bool reverse = false);
779 
780  static bool sortByUlx(Object *a, Object *b);
781 
785  static bool IsPreOrdered(const Object *left, const Object *right);
786 
787 private:
791  void GenerateID();
792 
796  void Init(ClassId classId);
797 
802  bool SkipChildren(bool visibleOnly) const;
803  bool FiltersApply(const Filters *filters, Object *object) const;
805 
806 public:
811  ArrayOfStrAttr m_unsupported;
812 
813 protected:
814  //
815 private:
820  ArrayOfObjects m_children;
821 
825  Object *m_parent;
826 
830  ClassId m_classId;
831 
836  std::string m_id;
838 
843  bool m_isReferenceObject;
844 
851  mutable bool m_isModified;
852 
859  mutable ArrayOfObjects::const_iterator m_iteratorEnd, m_iteratorCurrent;
860  mutable ClassId m_iteratorElementType;
862 
866  std::vector<AttClassId> m_attClasses;
867 
871  std::vector<InterfaceId> m_interfaces;
872 
878  std::string m_comment;
879  std::string m_closingComment;
881 
886  bool m_isAttribute;
887 
891  bool m_isExpansion;
892 
897  std::unique_ptr<ListOfConstObjects> m_plistReferences;
898 
899  //----------------//
900  // Static members //
901  //----------------//
902 
906  static thread_local unsigned long s_objectCounter;
907 
911  static thread_local uint32_t s_xmlIDCounter;
912 };
913 
914 //----------------------------------------------------------------------------
915 // ObjectListInterface
916 //----------------------------------------------------------------------------
917 
926 public:
927  // constructors and destructors
928  ObjectListInterface() = default;
929  virtual ~ObjectListInterface() = default;
930  ObjectListInterface(const ObjectListInterface &listInterface); // copy constructor;
931  ObjectListInterface &operator=(const ObjectListInterface &listInterface); // copy assignment;
932 
936  int GetListIndex(const Object *listElement) const;
937 
942  const Object *GetListFirst(const Object *startFrom, const ClassId classId = UNSPECIFIED) const;
943  Object *GetListFirst(const Object *startFrom, const ClassId classId = UNSPECIFIED);
944  const Object *GetListFirstBackward(const Object *startFrom, const ClassId classId = UNSPECIFIED) const;
945  Object *GetListFirstBackward(const Object *startFrom, const ClassId classId = UNSPECIFIED);
947 
952  const Object *GetListPrevious(const Object *listElement) const;
953  Object *GetListPrevious(const Object *listElement);
955 
960  const Object *GetListNext(const Object *listElement) const;
961  Object *GetListNext(const Object *listElement);
963 
970  const ListOfConstObjects &GetList() const;
971  ListOfObjects GetList();
973 
977  void ResetList() const;
978 
984  bool HasEmptyList() const;
985  int GetListSize() const;
986  const Object *GetListFront() const;
987  Object *GetListFront();
988  const Object *GetListBack() const;
989  Object *GetListBack();
991 
992 protected:
997  virtual void FilterList(ListOfConstObjects &) const {};
998 
999 private:
1003  const Object *GetInterfaceOwner() const;
1004 
1005 public:
1006  //
1007 private:
1008  // The flat list of children
1009  mutable ListOfConstObjects m_list;
1010  // The owner object
1011  mutable const Object *m_owner = NULL;
1012 };
1013 
1014 //----------------------------------------------------------------------------
1015 // TextListInterface
1016 //----------------------------------------------------------------------------
1017 
1025 public:
1026  // constructors and destructors
1027  TextListInterface() = default;
1028  virtual ~TextListInterface() = default;
1029 
1033  std::u32string GetText() const;
1034 
1038  void GetTextLines(std::vector<std::u32string> &lines) const;
1039 
1040 protected:
1045  void FilterList(ListOfConstObjects &childList) const override;
1046 
1047 private:
1048  //
1049 public:
1050  //
1051 private:
1052  //
1053 };
1054 
1055 //----------------------------------------------------------------------------
1056 // ObjectComparison
1057 //----------------------------------------------------------------------------
1058 
1065 
1066 public:
1067  ObjectComparison(const ClassId classId) { m_classId = classId; }
1068 
1069  bool operator()(const Object *object)
1070  {
1071  if (m_classId == UNSPECIFIED) {
1072  return true;
1073  }
1074  return (object->GetClassId() == m_classId);
1075  }
1076 
1077 private:
1078  //
1079 public:
1080  //
1081 private:
1082  ClassId m_classId;
1083 };
1084 
1085 //----------------------------------------------------------------------------
1086 // ObjectFactory
1087 //----------------------------------------------------------------------------
1088 
1090 
1091 public:
1096 
1100  Object *Create(const std::string &name);
1101 
1105  Object *Create(ClassId classId);
1106 
1110  void Register(const std::string &name, ClassId classId, std::function<Object *(void)> function);
1111 
1115  ClassId GetClassId(const std::string &name);
1116 
1120  std::string GetClassName(ClassId classId);
1121 
1125  void GetClassIds(const std::vector<std::string> &classStrings, std::vector<ClassId> &classIds);
1126 
1127 public:
1128  mutable std::shared_mutex m_mutex;
1129  MapOfClassIdConstructors m_ctorsRegistry;
1130  MapOfStrClassIds m_classIdsRegistry;
1131 };
1132 
1133 //----------------------------------------------------------------------------
1134 // ClassRegistrar
1135 //----------------------------------------------------------------------------
1136 
1137 template <class T> class ClassRegistrar {
1138 public:
1142  ClassRegistrar(const std::string &name, ClassId classId)
1143  {
1144  ObjectFactory::GetInstance().Register(name, classId, []() -> Object * { return new T(); });
1145  }
1146 
1151  ClassRegistrar(const std::string &name, ClassId pseudoClassId, std::function<Object *()> factory)
1152  {
1153  ObjectFactory::GetInstance().Register(name, pseudoClassId, factory);
1154  }
1155 };
1156 
1157 } // namespace vrv
1158 
1159 #endif
This class represents a basic object in the layout domain.
Definition: boundingbox.h:32
Definition: object.h:1137
ClassRegistrar(const std::string &name, ClassId pseudoClassId, std::function< Object *()> factory)
The contructor registering the name / constructor map taking a custom factory function.
Definition: object.h:1151
ClassRegistrar(const std::string &name, ClassId classId)
The contructor registering the name / constructor map.
Definition: object.h:1142
Definition: comparison.h:32
This abstract class is the base class for all const functors.
Definition: functor.h:126
This class is used to store comparison filters and apply them when necessary.
Definition: comparison.h:613
This abstract class is the base class for all mutable functors.
Definition: functor.h:101
Unary predicate for comparing object types.
Definition: object.h:1064
Definition: object.h:1089
static ObjectFactory & GetInstance()
A static method returning a static object in order to guarantee initialisation.
void GetClassIds(const std::vector< std::string > &classStrings, std::vector< ClassId > &classIds)
Get the correspondings ClassIds from the vector of MEI element string names.
Object * Create(ClassId classId)
Create the object from the ClassId by making a lookup in the register.
ClassId GetClassId(const std::string &name)
Get the ClassId from the MEI element string name by making a lookup in the register.
void Register(const std::string &name, ClassId classId, std::function< Object *(void)> function)
Add the name / constructor map entry to the static register.
Object * Create(const std::string &name)
Create the object from the MEI element string name by making a lookup in the register.
std::string GetClassName(ClassId classId)
Get the MEI element name from the ClassId by making a lookup in the register.
This class represents a basic object.
Definition: object.h:66
Object * FindDescendantByID(const std::string &id, int deepness=UNLIMITED_DEPTH, bool direction=FORWARD)
Look for a descendant with the specified id (returns NULL if not found) This method is a wrapper for ...
void FindAllDescendantsByComparison(ListOfObjects *objects, Comparison *comparison, int deepness=UNLIMITED_DEPTH, bool direction=FORWARD, bool clear=true)
Return all the objects matching the Comparison functor Deepness allow to limit the depth search (Edit...
void ReplaceWithCopyOf(Object *object)
Replace an object with a copy of the other.
bool HasAttribute(std::string attribute, std::string value) const
Check if an Object has an attribute with the specified value.
void ClearChildren()
Clear the children vector and delete all the objects.
Object * GetFirstChildNot(const ClassId classId)
Return the first child that is NOT of the specified type.
void RotateChildren(int first, int middle, int last)
Rotates the child elements of the object leftwards, using std::rotate() with the given indices.
bool HasDescendant(const Object *child, int deepness=UNLIMITED_DEPTH) const
Return true if the object has the child Object as descendant (reference of direct).
virtual bool IsSupportedChild(ClassId classId)
Base method for checking if a child can be added.
void FillFlatList(ListOfConstObjects &list) const
Fill the list of all the children LayerElement.
virtual int GetInsertOrderFor(ClassId) const
Return the child order for a the given ClassId.
Definition: object.h:448
virtual void CloneReset()
Reset pointers after a copy and assignment constructor call.
int GetIdx() const
Return the index position of the object in its parent (-1 if not found)
Object * FindDescendantByType(ClassId classId, int deepness=UNLIMITED_DEPTH, bool direction=FORWARD)
Look for a descendant with the specified type (returns NULL if not found) This method is a wrapper fo...
void Modify(bool modified=true) const
Mark the object and its parent (if any) as modified.
bool IsFloatingObject() const
Wrapper for checking if an element is a floating object (system elements and control elements)
Definition: object.h:92
Object * GetFirstAncestor(const ClassId classId, int maxSteps=-1)
Return the first ancestor of the specified type.
Object * GetChild(int idx)
Child access (generic)
const Resources * GetDocResources() const
Resource access from the document.
Object * Relinquish(int idx)
Give up ownership of the child at the idx position (NULL if not found) This is a method to be used on...
virtual bool AddChildAdditionalCheck(Object *)
Additional check when adding a child.
Definition: object.h:441
virtual bool CopyChildren() const
Indicate whereas children have to be copied in copy / assignment constructors.
Definition: object.h:279
bool IsModified() const
Check if the content was modified or not.
Definition: object.h:677
virtual FunctorCode Accept(Functor &functor)
Interface for class functor visitation.
ListOfObjects FindAllDescendantsByType(ClassId classId, bool continueDepthSearchForMatches=true, int deepness=UNLIMITED_DEPTH)
Return all the objects with specified type.
void ResetParent()
Reset the parent of the Object.
Definition: object.h:424
void CopyAttributesTo(Object *target) const
Copy all the attributes of an obejct to target.
ArrayOfConstObjects GetChildren() const
Return the children as const reference or copy.
ArrayOfObjects & GetChildrenForModification()
Return a reference to the children that allows modification.
Definition: object.h:353
void ClearRelinquishedChildren()
Removes all the children that were previously relinquished.
Object & operator=(const Object &object)
Copy assignement - see copy constructor.
int GetDescendantIndex(const Object *child, const ClassId classId, int depth)
Look for all Objects of a class and return its position (-1 if not found)
bool IsAncestorOf(const Object *object) const
Check if the object is the ancestor of the other one.
int GetChildIndex(const Object *child) const
Look for the Object in the children and return its position (-1 if not found)
ArrayOfStrAttr m_unsupported
Keep an array of unsupported attributes as pairs.
Definition: object.h:811
Object * FindDescendantByComparison(Comparison *comparison, int deepness=UNLIMITED_DEPTH, bool direction=FORWARD)
Return the first element matching the Comparison functor Deepness allow to limit the depth search (Ed...
void SaveObject(Output *output)
Saves the object (and its children) using the specified output stream.
Object(const Object &object)
Copy constructor that also copy the children.
bool IsMilestoneElement() const
Wrapper for checking if an element has a milestone start interface and also if is set as a milestone ...
Object * GetLastAncestorNot(const ClassId classId, int maxSteps=-1)
Return the last ancestor that is NOT of the specified type.
ListOfObjects GetAncestors()
Returns all ancestors.
Object * FindDescendantExtremeByComparison(Comparison *comparison, int deepness=UNLIMITED_DEPTH, bool direction=FORWARD)
Return the element matching the extreme value with an Comparison functor Deepness allow to limit the ...
void SetAsReferenceObject()
Make an object a reference object that do not own children.
void SetParent(Object *parent)
Set the parent of the Object.
bool DeleteChild(Object *child)
Remove and delete the child.
bool(* binaryComp)(Object *, Object *)
Sort children by a function that takes two arguments and returns true if the first argument is less t...
Definition: object.h:260
Object * GetLast(const ClassId classId=UNSPECIFIED)
Return the last child of the object (if any, NULL otherwise)
void MoveChildrenFrom(Object *sourceParent, int idx=-1, bool allowTypeChange=false)
Move all the children of the object passed as parameter to this one.
std::string GetComment() const
Methods for setting / getting comments.
Definition: object.h:304
void LogDebugTree(int maxDepth=UNLIMITED_DEPTH, int level=0)
Output the class name of the object (or a custom msg) and of its children recursively.
void Process(Functor &functor, int deepness=UNLIMITED_DEPTH, bool skipFirst=false)
Main method that processes functors.
virtual Object * Clone() const
Method call for copying child classes.
virtual bool AddChild(Object *object)
Base method for adding children.
void ReplaceChild(Object *currentChild, Object *replacingChild)
Replace the currentChild with the replacingChild.
void InsertChild(Object *element, int idx)
Insert an element at the idx position.
void MoveItselfTo(Object *targetParent)
Move an object to another parent.
Object * DetachChild(int idx)
Detach the child at the idx position (NULL if not found) The parent pointer is set to NULL.
void StableSort(Compare comp)
Sort the child elements using std::stable_sort.
Definition: object.h:718
bool HasEditorialContent()
Return true if the object contains any editorial content.
int DeleteChildrenByComparison(Comparison *comparison)
Delete the children that match the comparison.
void FindAllDescendantsBetween(ListOfObjects *objects, Comparison *comparison, const Object *start, const Object *end, bool clear=true, int depth=UNLIMITED_DEPTH)
Return all the objects matching the Comparison functor and being between start and end in the tree.
virtual void Reset()
Reset the object, that is 1) removing all children and 2) resetting all attributes.
Object * GetParent()
Get the parent of the Object.
Definition: object.h:410
bool HasNonEditorialContent()
Return true if the object contains anything that is not editorial content.
static bool IsPreOrdered(const Object *left, const Object *right)
Return true if left appears before right in preorder traversal.
int GetAttributes(ArrayOfStrAttr *attributes, bool convertToExternal=true) const
Fill an array of pairs with all attributes and their values.
int GetInsertOrderForIn(ClassId classId, const std::vector< ClassId > &order) const
Find the order from an overriden GetInsertOrderFor method.
Object * GetDirectChild(Object *parent, Object *descendant)
Return reference to the object that is the ancestor of the indicated descendant object and that is a ...
This class is an pseudo interface for elements maintaining a flat list of children LayerElement for p...
Definition: object.h:925
int GetListIndex(const Object *listElement) const
Look for the Object in the list and return its position (-1 if not found)
const Object * GetListPrevious(const Object *listElement) const
Returns the previous object in the list (NULL if not found)
const Object * GetListNext(const Object *listElement) const
Returns the next object in the list (NULL if not found)
virtual void FilterList(ListOfConstObjects &) const
Filter the list for a specific class.
Definition: object.h:997
const ListOfConstObjects & GetList() const
Return the list.
const Object * GetListFirst(const Object *startFrom, const ClassId classId=UNSPECIFIED) const
Gets the first item of type elementType starting at startFrom.
void ResetList() const
Reset the list of children and call FilterList().
bool HasEmptyList() const
Convenience functions that check if the list is up-to-date If not, the list is updated before returni...
This class is a base class for output classes.
Definition: iobase.h:31
This class provides resource values.
Definition: resources.h:30
This class is an pseudo interface for elements maintaining a flat list of children LayerElement for p...
Definition: object.h:1024
std::u32string GetText() const
Returns a contatenated version of all the text children.
void FilterList(ListOfConstObjects &childList) const override
Filter the list for a specific class.
void GetTextLines(std::vector< std::u32string > &lines) const
Fill an array of lines with concatenated content of each line.