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