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 <string>
17 #include <unordered_set>
18 
19 //----------------------------------------------------------------------------
20 
21 #include "attclasses.h"
22 #include "attmodule.h"
23 #include "boundingbox.h"
24 #include "vrvdef.h"
25 
26 namespace vrv {
27 
28 class AltSymInterface;
29 class AreaPosInterface;
30 class Doc;
31 class DurationInterface;
32 class EditorialElement;
33 class Output;
34 class Filters;
35 class Functor;
36 class Functor;
37 class ConstFunctor;
38 class LinkingInterface;
39 class FacsimileInterface;
40 class OffsetInterface;
41 class OffsetSpanningInterface;
42 class PitchInterface;
43 class PositionInterface;
44 class Resources;
45 class ScoreDefInterface;
46 class StemmedDrawingInterface;
47 class TextDirInterface;
48 class TimePointInterface;
49 class TimeSpanningInterface;
50 class VisibilityDrawingInterface;
51 class Zone;
52 
53 #define UNLIMITED_DEPTH -10000
54 #define FORWARD true
55 #define BACKWARD false
56 
57 //----------------------------------------------------------------------------
58 // Object
59 //----------------------------------------------------------------------------
60 
64 class Object : public BoundingBox {
65 public:
71  Object();
72  Object(ClassId classId);
73  virtual ~Object();
74  ClassId GetClassId() const final { return m_classId; }
75  virtual std::string GetClassName() const { return "[MISSING]"; }
77 
84  bool IsReferenceObject() const { return m_isReferenceObject; }
86 
90  bool IsFloatingObject() const { return (this->IsSystemElement() || this->IsControlElement()); }
91 
96  bool IsMilestoneElement() const;
97  Object *GetMilestoneEnd();
99 
105  bool IsControlElement() const { return Object::IsControlElement(m_classId); }
106  bool IsEditorialElement() const { return Object::IsEditorialElement(m_classId); }
107  bool IsLayerElement() const { return Object::IsLayerElement(m_classId); }
108  bool IsPageElement() const { return Object::IsPageElement(m_classId); }
109  bool IsRunningElement() const { return Object::IsRunningElement(m_classId); }
110  bool IsScoreDefElement() const { return Object::IsScoreDefElement(m_classId); }
111  bool IsSystemElement() const { return Object::IsSystemElement(m_classId); }
112  bool IsTextElement() const { return Object::IsTextElement(m_classId); }
114 
121  static bool IsControlElement(ClassId classId)
122  {
123  return ((classId > CONTROL_ELEMENT) && (classId < CONTROL_ELEMENT_max));
124  }
125  static bool IsEditorialElement(ClassId classId)
126  {
127  return ((classId > EDITORIAL_ELEMENT) && (classId < EDITORIAL_ELEMENT_max));
128  }
129  static bool IsLayerElement(ClassId classId) { return ((classId > LAYER_ELEMENT) && (classId < LAYER_ELEMENT_max)); }
130  static bool IsPageElement(ClassId classId) { return ((classId > PAGE_ELEMENT) && (classId < PAGE_ELEMENT_max)); }
131  static bool IsRunningElement(ClassId classId)
132  {
133  return ((classId > RUNNING_ELEMENT) && (classId < RUNNING_ELEMENT_max));
134  }
135  static bool IsScoreDefElement(ClassId classId)
136  {
137  return ((classId > SCOREDEF_ELEMENT) && (classId < SCOREDEF_ELEMENT_max));
138  }
139  static bool IsSystemElement(ClassId classId)
140  {
141  return ((classId > SYSTEM_ELEMENT) && (classId < SYSTEM_ELEMENT_max));
142  }
143  static bool IsTextElement(ClassId classId) { return ((classId > TEXT_ELEMENT) && (classId < TEXT_ELEMENT_max)); }
145 
150  void RegisterAttClass(AttClassId attClassId) { m_attClasses.push_back(attClassId); }
151  bool HasAttClass(AttClassId attClassId) const
152  {
153  return std::find(m_attClasses.begin(), m_attClasses.end(), attClassId) != m_attClasses.end();
154  }
155  void RegisterInterface(std::vector<AttClassId> *attClasses, InterfaceId interfaceId);
156  bool HasInterface(InterfaceId interfaceId) const
157  {
158  return std::find(m_interfaces.begin(), m_interfaces.end(), interfaceId) != m_interfaces.end();
159  }
161 
166  virtual AltSymInterface *GetAltSymInterface() { return NULL; }
167  virtual const AltSymInterface *GetAltSymInterface() const { return NULL; }
168  virtual AreaPosInterface *GetAreaPosInterface() { return NULL; }
169  virtual const AreaPosInterface *GetAreaPosInterface() const { return NULL; }
170  virtual BeamDrawingInterface *GetBeamDrawingInterface() { return NULL; }
171  virtual const BeamDrawingInterface *GetBeamDrawingInterface() const { return NULL; }
172  virtual DurationInterface *GetDurationInterface() { return NULL; }
173  virtual const DurationInterface *GetDurationInterface() const { return NULL; }
174  virtual LinkingInterface *GetLinkingInterface() { return NULL; }
175  virtual const LinkingInterface *GetLinkingInterface() const { return NULL; }
176  virtual FacsimileInterface *GetFacsimileInterface() { return NULL; }
177  virtual const FacsimileInterface *GetFacsimileInterface() const { return NULL; }
178  virtual OffsetInterface *GetOffsetInterface() { return NULL; }
179  virtual const OffsetInterface *GetOffsetInterface() const { return NULL; }
180  virtual OffsetSpanningInterface *GetOffsetSpanningInterface() { return NULL; }
181  virtual const OffsetSpanningInterface *GetOffsetSpanningInterface() const { return NULL; }
182  virtual PitchInterface *GetPitchInterface() { return NULL; }
183  virtual const PitchInterface *GetPitchInterface() const { return NULL; }
184  virtual PlistInterface *GetPlistInterface() { return NULL; }
185  virtual const PlistInterface *GetPlistInterface() const { return NULL; }
186  virtual PositionInterface *GetPositionInterface() { return NULL; }
187  virtual const PositionInterface *GetPositionInterface() const { return NULL; }
188  virtual ScoreDefInterface *GetScoreDefInterface() { return NULL; }
189  virtual const ScoreDefInterface *GetScoreDefInterface() const { return NULL; }
190  virtual StemmedDrawingInterface *GetStemmedDrawingInterface() { return NULL; }
191  virtual const StemmedDrawingInterface *GetStemmedDrawingInterface() const { return NULL; }
192  virtual TextDirInterface *GetTextDirInterface() { return NULL; }
193  virtual const TextDirInterface *GetTextDirInterface() const { return NULL; }
194  virtual TimePointInterface *GetTimePointInterface() { return NULL; }
195  virtual const TimePointInterface *GetTimePointInterface() const { return NULL; }
196  virtual TimeSpanningInterface *GetTimeSpanningInterface() { return NULL; }
197  virtual const TimeSpanningInterface *GetTimeSpanningInterface() const { return NULL; }
198  virtual VisibilityDrawingInterface *GetVisibilityDrawingInterface() { return NULL; }
199  virtual const VisibilityDrawingInterface *GetVisibilityDrawingInterface() const { return NULL; }
201 
205  const Resources *GetDocResources() const;
206 
211  virtual void Reset();
212 
221  Object(const Object &object);
222 
226  Object &operator=(const Object &object);
227 
235  void MoveChildrenFrom(Object *sourceParent, int idx = -1, bool allowTypeChange = false);
236 
241  void ReplaceChild(Object *currentChild, Object *replacingChild);
242 
247  void InsertBefore(Object *child, Object *newChild);
248  void InsertAfter(Object *child, Object *newChild);
250 
256  typedef bool (*binaryComp)(Object *, Object *);
257  void SortChildren(binaryComp comp);
258 
263  void MoveItselfTo(Object *targetParent);
264 
269  virtual Object *Clone() const;
270 
275  virtual bool CopyChildren() const { return true; }
276 
282  virtual void CloneReset();
283 
284  const std::string &GetID() const { return m_id; }
285  void SetID(const std::string &id) { m_id = id; }
286  void SwapID(Object *other);
287  void ResetID();
288 
293  virtual void AttributesToExternal() {};
294  virtual void AttributesToInternal() {};
296 
300  std::string GetComment() const { return m_comment; }
301  void SetComment(std::string comment) { m_comment = comment; }
302  bool HasComment() const { return !m_comment.empty(); }
303  std::string GetClosingComment() const { return m_closingComment; }
304  void SetClosingComment(std::string endComment) { m_closingComment = endComment; }
305  bool HasClosingComment() const { return !m_closingComment.empty(); }
306 
313  int GetChildCount() const { return (int)m_children.size(); }
314  int GetChildCount(const ClassId classId) const;
315  int GetChildCount(const ClassId classId, int depth) const;
316  int GetDescendantCount(const ClassId classId) const;
318 
323  Object *GetChild(int idx);
324  const Object *GetChild(int idx) const;
325  Object *GetChild(int idx, const ClassId classId);
326  const Object *GetChild(int idx, const ClassId classId) const;
328 
335  Object *GetDirectChild(Object *parent, Object *descendant);
336 
341  ArrayOfConstObjects GetChildren() const;
342  const ArrayOfObjects &GetChildren() { return m_children; }
344 
349  ArrayOfObjects &GetChildrenForModification() { return m_children; }
350 
356  void CopyAttributesTo(Object *target) const;
357 
362  int GetAttributes(ArrayOfStrAttr *attributes, bool convertToExternal = true) const;
363 
367  bool HasAttribute(std::string attribute, std::string value) const;
368 
377  Object *GetFirst(const ClassId classId = UNSPECIFIED);
378  const Object *GetFirst(const ClassId classId = UNSPECIFIED) const;
379  Object *GetNext();
380  const Object *GetNext() const;
382 
388  Object *GetNext(const Object *child, const ClassId classId = UNSPECIFIED);
389  const Object *GetNext(const Object *child, const ClassId classId = UNSPECIFIED) const;
390  Object *GetPrevious(const Object *child, const ClassId classId = UNSPECIFIED);
391  const Object *GetPrevious(const Object *child, const ClassId classId = UNSPECIFIED) const;
393 
398  Object *GetLast(const ClassId classId = UNSPECIFIED);
399  const Object *GetLast(const ClassId classId = UNSPECIFIED) const;
401 
406  Object *GetParent() { return m_parent; }
407  const Object *GetParent() const { return m_parent; }
409 
414  void SetParent(Object *parent);
415 
420  void ResetParent() { m_parent = NULL; }
421 
426  virtual bool IsSupportedChild(ClassId classId);
427 
432  virtual bool AddChild(Object *object);
433 
437  virtual bool AddChildAdditionalCheck(Object *) { return true; };
438 
444  virtual int GetInsertOrderFor(ClassId) const { return VRV_UNSET; }
445 
449  int GetInsertOrderForIn(ClassId classId, const std::vector<ClassId> &order) const;
450 
454  int GetIdx() const;
455 
460  int GetDrawingX() const override;
461  int GetDrawingY() const override;
463 
469  void ResetCachedDrawingX() const override;
470  void ResetCachedDrawingY() const override;
472 
476  int GetChildIndex(const Object *child) const;
477 
481  int GetDescendantIndex(const Object *child, const ClassId classId, int depth);
482 
486  void InsertChild(Object *element, int idx);
487 
493  void RotateChildren(int first, int middle, int last);
494 
499  Object *DetachChild(int idx);
500 
505  void ReplaceWithCopyOf(Object *object);
506 
511  bool HasDescendant(const Object *child, int deepness = UNLIMITED_DEPTH) const;
512 
518  Object *FindDescendantByID(const std::string &id, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD);
519  const Object *FindDescendantByID(
520  const std::string &id, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD) const;
522 
528  Object *FindDescendantByType(ClassId classId, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD);
529  const Object *FindDescendantByType(ClassId classId, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD) const;
531 
538  Comparison *comparison, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD);
540  Comparison *comparison, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD) const;
542 
549  Comparison *comparison, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD);
551  Comparison *comparison, int deepness = UNLIMITED_DEPTH, bool direction = FORWARD) const;
553 
559  ClassId classId, bool continueDepthSearchForMatches = true, int deepness = UNLIMITED_DEPTH);
560  ListOfConstObjects FindAllDescendantsByType(
561  ClassId classId, bool continueDepthSearchForMatches = true, int deepness = UNLIMITED_DEPTH) const;
563 
569  void FindAllDescendantsByComparison(ListOfObjects *objects, Comparison *comparison, int deepness = UNLIMITED_DEPTH,
570  bool direction = FORWARD, bool clear = true);
571  void FindAllDescendantsByComparison(ListOfConstObjects *objects, Comparison *comparison,
572  int deepness = UNLIMITED_DEPTH, bool direction = FORWARD, bool clear = true) const;
574 
580  void FindAllDescendantsBetween(ListOfObjects *objects, Comparison *comparison, const Object *start,
581  const Object *end, bool clear = true, int depth = UNLIMITED_DEPTH);
582  void FindAllDescendantsBetween(ListOfConstObjects *objects, Comparison *comparison, const Object *start,
583  const Object *end, bool clear = true, int depth = UNLIMITED_DEPTH) const;
585 
595  Object *Relinquish(int idx);
596 
602 
607 
612  bool DeleteChild(Object *child);
613 
619 
624  ListOfObjects GetAncestors();
625  ListOfConstObjects GetAncestors() const;
627 
633  Object *GetFirstAncestor(const ClassId classId, int maxSteps = -1);
634  const Object *GetFirstAncestor(const ClassId classId, int maxSteps = -1) const;
636 
638  Object *GetFirstAncestorInRange(const ClassId classIdMin, const ClassId classIdMax, int maxDepth = -1);
639  const Object *GetFirstAncestorInRange(const ClassId classIdMin, const ClassId classIdMax, int maxDepth = -1) const;
641 
647  Object *GetLastAncestorNot(const ClassId classId, int maxSteps = -1);
648  const Object *GetLastAncestorNot(const ClassId classId, int maxSteps = -1) const;
650 
655  Object *GetFirstChildNot(const ClassId classId);
656  const Object *GetFirstChildNot(const ClassId classId) const;
658 
663  void FillFlatList(ListOfConstObjects &list) const;
664 
668  bool IsModified() const { return m_isModified; }
669 
673  void Modify(bool modified = true) const;
674 
679  bool IsAttribute() const { return m_isAttribute; }
680  void IsAttribute(bool isAttribute) { m_isAttribute = isAttribute; }
682 
687  bool IsExpansion() const { return m_isExpansion; }
688  void IsExpansion(bool isExpansion) { m_isExpansion = isExpansion; }
690 
695 
700 
704  void SaveObject(Output *output);
705 
709  template <class Compare> void StableSort(Compare comp)
710  {
711  std::stable_sort(m_children.begin(), m_children.end(), comp);
712  }
713 
714  void ReorderByXPos();
715 
716  Object *FindNextChild(Comparison *comp, Object *start);
717 
718  Object *FindPreviousChild(Comparison *comp, Object *start);
719 
724  bool HasPlistReferences() const { return static_cast<bool>(m_plistReferences); }
725  void ResetPlistReferences() { m_plistReferences.reset(); }
726  const ListOfConstObjects *GetPlistReferences() const { return m_plistReferences.get(); }
727  void AddPlistReference(const Object *object);
729 
739  void Process(Functor &functor, int deepness = UNLIMITED_DEPTH, bool skipFirst = false);
740  void Process(ConstFunctor &functor, int deepness = UNLIMITED_DEPTH, bool skipFirst = false) const;
742 
747  virtual FunctorCode Accept(Functor &functor);
748  virtual FunctorCode Accept(ConstFunctor &functor) const;
749  virtual FunctorCode AcceptEnd(Functor &functor);
750  virtual FunctorCode AcceptEnd(ConstFunctor &functor) const;
752 
757  void LogDebugTree(int maxDepth = UNLIMITED_DEPTH, int level = 0);
758  virtual std::string LogDebugTreeMsg() { return this->GetClassName(); }
760 
761  //----------------//
762  // Static methods //
763  //----------------//
764 
765  static void SeedID(uint32_t seed = 0);
766 
767  static std::string GenerateHashID();
768 
769  static uint32_t Hash(uint32_t number, bool reverse = false);
770 
771  static bool sortByUlx(Object *a, Object *b);
772 
776  static bool IsPreOrdered(const Object *left, const Object *right);
777 
778 private:
782  void GenerateID();
783 
787  void Init(ClassId classId);
788 
793  bool SkipChildren(bool visibleOnly) const;
794  bool FiltersApply(const Filters *filters, Object *object) const;
796 
797 public:
802  ArrayOfStrAttr m_unsupported;
803 
804 protected:
805  //
806 private:
811  ArrayOfObjects m_children;
812 
816  Object *m_parent;
817 
821  ClassId m_classId;
822 
827  std::string m_id;
829 
834  bool m_isReferenceObject;
835 
842  mutable bool m_isModified;
843 
850  mutable ArrayOfObjects::const_iterator m_iteratorEnd, m_iteratorCurrent;
851  mutable ClassId m_iteratorElementType;
853 
857  std::vector<AttClassId> m_attClasses;
858 
862  std::vector<InterfaceId> m_interfaces;
863 
869  std::string m_comment;
870  std::string m_closingComment;
872 
877  bool m_isAttribute;
878 
882  bool m_isExpansion;
883 
888  std::unique_ptr<ListOfConstObjects> m_plistReferences;
889 
890  //----------------//
891  // Static members //
892  //----------------//
893 
897  static thread_local unsigned long s_objectCounter;
898 
902  static thread_local uint32_t s_xmlIDCounter;
903 };
904 
905 //----------------------------------------------------------------------------
906 // ObjectListInterface
907 //----------------------------------------------------------------------------
908 
917 public:
918  // constructors and destructors
919  ObjectListInterface() = default;
920  virtual ~ObjectListInterface() = default;
921  ObjectListInterface(const ObjectListInterface &listInterface); // copy constructor;
922  ObjectListInterface &operator=(const ObjectListInterface &listInterface); // copy assignment;
923 
927  int GetListIndex(const Object *listElement) const;
928 
933  const Object *GetListFirst(const Object *startFrom, const ClassId classId = UNSPECIFIED) const;
934  Object *GetListFirst(const Object *startFrom, const ClassId classId = UNSPECIFIED);
935  const Object *GetListFirstBackward(const Object *startFrom, const ClassId classId = UNSPECIFIED) const;
936  Object *GetListFirstBackward(const Object *startFrom, const ClassId classId = UNSPECIFIED);
938 
943  const Object *GetListPrevious(const Object *listElement) const;
944  Object *GetListPrevious(const Object *listElement);
946 
951  const Object *GetListNext(const Object *listElement) const;
952  Object *GetListNext(const Object *listElement);
954 
961  const ListOfConstObjects &GetList() const;
962  ListOfObjects GetList();
964 
968  void ResetList() const;
969 
975  bool HasEmptyList() const;
976  int GetListSize() const;
977  const Object *GetListFront() const;
978  Object *GetListFront();
979  const Object *GetListBack() const;
980  Object *GetListBack();
982 
983 protected:
988  virtual void FilterList(ListOfConstObjects &) const {};
989 
990 private:
994  const Object *GetInterfaceOwner() const;
995 
996 public:
997  //
998 private:
999  // The flat list of children
1000  mutable ListOfConstObjects m_list;
1001  // The owner object
1002  mutable const Object *m_owner = NULL;
1003 };
1004 
1005 //----------------------------------------------------------------------------
1006 // TextListInterface
1007 //----------------------------------------------------------------------------
1008 
1016 public:
1017  // constructors and destructors
1018  TextListInterface() = default;
1019  virtual ~TextListInterface() = default;
1020 
1024  std::u32string GetText() const;
1025 
1029  void GetTextLines(std::vector<std::u32string> &lines) const;
1030 
1031 protected:
1036  void FilterList(ListOfConstObjects &childList) const override;
1037 
1038 private:
1039  //
1040 public:
1041  //
1042 private:
1043  //
1044 };
1045 
1046 //----------------------------------------------------------------------------
1047 // ObjectComparison
1048 //----------------------------------------------------------------------------
1049 
1056 
1057 public:
1058  ObjectComparison(const ClassId classId) { m_classId = classId; }
1059 
1060  bool operator()(const Object *object)
1061  {
1062  if (m_classId == UNSPECIFIED) {
1063  return true;
1064  }
1065  return (object->GetClassId() == m_classId);
1066  }
1067 
1068 private:
1069  //
1070 public:
1071  //
1072 private:
1073  ClassId m_classId;
1074 };
1075 
1076 //----------------------------------------------------------------------------
1077 // ObjectFactory
1078 //----------------------------------------------------------------------------
1079 
1081 
1082 public:
1087 
1091  Object *Create(std::string name);
1092 
1096  Object *Create(ClassId classId);
1097 
1101  void Register(std::string name, ClassId classId, std::function<Object *(void)> function);
1102 
1106  ClassId GetClassId(std::string name);
1107 
1111  void GetClassIds(const std::vector<std::string> &classStrings, std::vector<ClassId> &classIds);
1112 
1113 public:
1114  static thread_local MapOfClassIdConstructors s_ctorsRegistry;
1115  static thread_local MapOfStrClassIds s_classIdsRegistry;
1116 };
1117 
1118 //----------------------------------------------------------------------------
1119 // ClassRegistrar
1120 //----------------------------------------------------------------------------
1121 
1122 template <class T> class ClassRegistrar {
1123 public:
1127  ClassRegistrar(std::string name, ClassId classId)
1128  {
1129  ObjectFactory::GetInstance()->Register(name, classId, []() -> Object * { return new T(); });
1130  }
1131 
1136  ClassRegistrar(const std::string &name, ClassId pseudoClassId, std::function<Object *()> factory)
1137  {
1138  ObjectFactory::GetInstance()->Register(name, pseudoClassId, factory);
1139  }
1140 };
1141 
1142 } // namespace vrv
1143 
1144 #endif
This class represents a basic object in the layout domain.
Definition: boundingbox.h:32
Definition: object.h:1122
ClassRegistrar(std::string name, ClassId classId)
The contructor registering the name / constructor map.
Definition: object.h:1127
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:1136
Definition: comparison.h:31
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:588
This abstract class is the base class for all mutable functors.
Definition: functor.h:101
Unary predicate for comparing object types.
Definition: object.h:1055
Definition: object.h:1080
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(std::string name)
Get the ClassId from the MEI element string name by making a lookup in the register.
Object * Create(std::string name)
Create the object from the MEI element string name by making a lookup in the register.
void Register(std::string name, ClassId classId, std::function< Object *(void)> function)
Add the name / constructor map entry to the static register.
static ObjectFactory * GetInstance()
A static method returning a static object in order to guarantee initialisation.
This class represents a basic object.
Definition: object.h:64
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:444
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:90
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:437
virtual bool CopyChildren() const
Indicate whereas children have to be copied in copy / assignment constructors.
Definition: object.h:275
bool IsModified() const
Check if the content was modified or not.
Definition: object.h:668
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:420
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:349
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)
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:802
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:256
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:300
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:709
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:406
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:916
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:988
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:1015
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.