OpenLexocad  27.1
PropertyBackLink.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <Core/Property.h>
4 #include <Core/Variant.h>
5 
6 #define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING
7 
8 #include <list>
9 
10 namespace Core
11 {
12 template <typename T>
14 {
15  static const char* Get() { return typeid(T).name(); }
16 };
17 
18 //----------------------------------------------------------------------------
19 // PropertyBackLinkBase
20 //----------------------------------------------------------------------------
21 
22 class LX_CORE_EXPORT PropertyBackLinkBase : public Core::PropertyLinkBaseBase
23 {
25 
26 public:
28  virtual ~PropertyBackLinkBase(void);
29 
30  void setValue(Core::DocObject* o);
31  bool setValueFromVariant(const Core::Variant& value) override;
32  void copyValue(Core::Property* p) override;
33 
34  Core::DocObject* getValue() const;
35  Core::Variant getVariant(void) const;
36 
37  void save(Base::AbstractWriter& writer, Base::PersistenceVersion& save_version) override;
38  inline void restore(Base::AbstractXMLReader& reader, Base::PersistenceVersion& version) override;
39  bool isEqual(const Property*) const override;
40  std::shared_ptr<Core::DbgInfo> getDbgInfo() const override;
41  virtual const Core::PropertyKind getPropertyKind(void) const override;
42  virtual Core::Property* copy(void) const override;
43  virtual void paste(const Core::Property& from) override;
44  virtual bool removeLink(DocObject* o) override;
45 
46 protected:
48 };
49 
50 //----------------------------------------------------------------------------
51 // PropertyBackLink<T>
52 //----------------------------------------------------------------------------
53 
54 template <typename T>
56 {
57  TYPESYSTEM_PROPERTY_HEADER(PropertyBackLink, Core::PropertyBackLinkBase);
59 
60 public:
61  void setValue(T o) { inherited::setValue(o); }
62  T getValue() const { return static_cast<T>(inherited::getValue()); }
63 };
64 
65 #ifndef SWIG
66 template <typename T>
67 Base::Type PropertyBackLink<T>::classTypeId = Base::Type().createType(Base::Type::badType(), TypeNameBack<PropertyBackLink<T>>::Get());
68 #endif
69 
70 //----------------------------------------------------------------------------
71 // PropertyBackLinkSetBase
72 //----------------------------------------------------------------------------
73 
75 {
77 
78 public:
81 
82  void setValue(const std::unordered_set<Core::DocObject*>& linkset);
83  bool setValueFromVariant(const Core::Variant& value);
84  void copyValue(Core::Property* p);
85  const std::unordered_set<Core::DocObject*>& getValue() const;
86 
87  bool addLink(Core::DocObject* o);
88  void addLinks(const std::unordered_set<Core::DocObject*>& linkset);
89  bool removeLink(Core::DocObject* o) override;
90  void setEmpty();
91  bool hasLink(Core::DocObject* o) const;
92  bool isEmpty() const;
93  size_t getSize() const;
94 
95  Core::Variant getVariant(void) const;
96 
97  void save(Base::AbstractWriter& writer, Base::PersistenceVersion& save_version) override;
98  inline void restore(Base::AbstractXMLReader& reader, Base::PersistenceVersion& version) override;
99  bool isEqual(const Property*) const override;
100  std::shared_ptr<Core::DbgInfo> getDbgInfo() const override;
101  virtual const Core::PropertyKind getPropertyKind(void) const override;
102  virtual Core::Property* copy(void) const override;
103  virtual void paste(const Core::Property& from) override;
104 
105 protected:
106  std::unordered_set<Core::DocObject*> _linkSet;
107 };
108 
109 //----------------------------------------------------------------------------
110 // PropertyBackLinkSet<T>
111 //----------------------------------------------------------------------------
112 
113 template <typename T>
115 {
116  TYPESYSTEM_PROPERTY_HEADER(PropertyBackLinkSet, Core::PropertyBackLinkSetBase);
118 
119 public:
120  void setValue(const std::unordered_set<T>& linkset) { inherited::setValue(*(const std::unordered_set<Core::DocObject*>*)(&linkset)); };
121  const std::unordered_set<T>& getValue() const { return *(const std::unordered_set<T>*)(&_linkSet); }
122 
123  bool addLink(T link) { return inherited::addLink(link); }
124  bool removeLink(T link) { return inherited::removeLink(link); };
125 
126  void addLinks(const std::unordered_set<T>& linkset) { inherited::addLinks(*(const std::unordered_set<Core::DocObject*>*)(&linkset)); }
127 };
128 
129 //----------------------------------------------------------------------------
130 // PropertyBackLinkSet_SaveV27AsBackLink<T>
131 //----------------------------------------------------------------------------
132 
133 template <typename T>
135 {
138 
139 public:
140  void setValue(const std::unordered_set<T>& linkset) { inherited::setValue(*(const std::unordered_set<Core::DocObject*>*)(&linkset)); };
141  const std::unordered_set<T>& getValue() const { return *(const std::unordered_set<T>*)(&_linkSet); }
142 
143  void save(Base::AbstractWriter& writer, Base::PersistenceVersion& save_version) override
144  {
145  if (save_version.documentVersionMajor == 27 && save_version.documentVersionMinor == 0)
146  {
147  // HPK: Check for OpeningElement -> Only these should be inserted here...
148  if (!_linkSet.empty())
149  writer << "<Link value=\"" << (*_linkSet.begin())->getId() << "\"/>";
150  else
151  writer << "<Link value=\""
152  << ""
153  << "\"/>";
154  }
155  else
156  {
157  PropertyBackLinkSetBase::save(writer, save_version);
158  }
159  }
160 
161  bool addLink(T link) { return inherited::addLink(link); }
162  bool removeLink(T link) { return inherited::removeLink(link); };
163 
164  void addLinks(const std::unordered_set<T>& linkset) { inherited::addLinks(*(const std::unordered_set<Core::DocObject*>*)(&linkset)); }
165 };
166 
167 #ifndef SWIG
168 template <typename T>
169 Base::Type PropertyBackLinkSet<T>::classTypeId = Base::Type().createType(Base::Type::badType(), TypeNameBack<PropertyBackLinkSet<T>>::Get());
170 template <typename U>
171 Base::Type PropertyBackLinkSet_SaveV27AsBackLink<U>::classTypeId = Base::Type().createType(Base::Type::badType(), TypeNameBack<PropertyBackLinkSet_SaveV27AsBackLink<U>>::Get());
172 #endif
173 
174 DECLARE_PROPERTY_FACTORY(PropertyBackLinkBase_Factory, Core::PropertyBackLinkBase);
175 DECLARE_PROPERTY_FACTORY(PropertyBackLinkSetBase_Factory, Core::PropertyBackLinkSetBase);
176 DECLARE_PROPERTY_FACTORY(PropertyBackLinkSet_SaveV27AsBackLink_Factory, Core::PropertyBackLinkSetBase);
177 
178 } // namespace Core
Definition: Persistence.h:14
Core::PropertyText name
Definition: CoreDocument.h:167
LX_CORE_EXPORT Version & version
Definition: Type.h:52
Definition: Variant.h:87
Definition: AbstractXMLReader.h:7
PropertyKind
Definition: Property.h:50
static const Type createType(const Type parent, const char *name, instantiationMethod method=0)
Definition: Base.h:12
Definition: PropertyBackLink.h:13
static const char * Get()
Definition: PropertyBackLink.h:15
int documentVersionMinor
Definition: Persistence.h:19
Definition: Writer.h:16
static const Type badType(void)
Definition: Type.h:99
Definition: Property.h:77
int documentVersionMajor
Definition: Persistence.h:18
TYPESYSTEM_HEADER()
DECLARE_PROPERTY_FACTORY(PropertyAxis1_Factory, Core::PropertyAxis1)
Definition: DocObject.h:51