/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Teigha(R) software pursuant to a license // agreement with Open Design Alliance. // Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// #ifndef __ODGSHIGHLIGHTDATA_H__ #define __ODGSHIGHLIGHTDATA_H__ #include "GsMarkerArray.h" #include "Gi/GiDrawable.h" #include "Gs/GsExport.h" #include "TPtr.h" #include "TD_PackPush.h" class OdGsHlBranch; typedef TPtr OdGsHlBranchPtr; typedef OdArray OdGsHlBranchPtrArray; class OdGsHlBranchReactor; /** \details This template class is a specialization of the OdSmartPtr class for OdGsHlBranchReactor object pointers. */ typedef OdSmartPtr OdGsHlBranchReactorPtr; /** \details This class is a service class to keep information about highlighted subentities and nested entities on OsGsEntityNode. Library: TD_Gs */ class GS_TOOLKIT_EXPORT OdGsHlBranch { protected: ODRX_HEAP_OPERATORS(); OdRefCounter m_nRefCounter; // shared ownership const void* m_pDrawableId; // persistent id or transient drawable pointer (depends from flag) bool m_bPersistentId; // true if m_pDrawableId stores OdDbStub pointer OdGsHlBranchReactorPtr m_pReactor; // OdGsHlBranch reactor OdGsMarkerArray m_aMarkers; // sorted array of markers OdGsHlBranchPtrArray m_aChild; // sorted array of nested entities // the sorting rule: first are transient entities with id 0, sorted by drw() value, // next are persistent entities with id != 0, sorted by id() public: OdGsHlBranch(const OdDbStub* pDrawableId) : m_nRefCounter(1) , m_pDrawableId(pDrawableId) , m_bPersistentId(true) , m_aMarkers(0, 1) , m_aChild(0, 1) { } OdGsHlBranch(const OdGiDrawable* pTransDrawable) : m_nRefCounter(1) , m_pDrawableId(pTransDrawable) , m_bPersistentId(false) , m_aMarkers(0, 1) , m_aChild(0, 1) { } static OdGsHlBranchPtr create(OdDbStub* pDrawableId, OdGsMarker marker); static OdGsHlBranchPtr create(OdGiDrawable* pTransDrawable, OdGsMarker marker); void addRef() { ++m_nRefCounter; } void release() { ODA_ASSERT((m_nRefCounter > 0)); if (!(--m_nRefCounter)) delete this; } // access to nested entities const OdGsHlBranchPtrArray& aChild() const { return m_aChild; } // access to subentities const OdGsMarkerArray& markers() const { return m_aMarkers; } // add/remove/find nested entities info OdGsHlBranch* addChild(OdDbStub* pDrawableId); OdGsHlBranch* addChild(const OdGiDrawable* pTransDrawable); void removeChild(const OdGsHlBranch* pChild); OdGsHlBranch* findChild(const OdDbStub* pDrawableId); // search in a sorted array, fast OdGsHlBranch* findChild(const OdGiDrawable* pTransDrawable); // search in a sorted array, fast // add/remove/find subentities info bool addMarker(OdGsMarker marker); bool removeMarker(OdGsMarker marker); bool hasMarker(OdGsMarker marker) const; // search in a sorted array, fast // access to the OdGsEntityNode data const OdDbStub* id() const { return (m_bPersistentId) ? reinterpret_cast(m_pDrawableId) : NULL; } const OdGiDrawable* drw() const { return (!m_bPersistentId) ? reinterpret_cast(m_pDrawableId) : NULL; } bool isEmpty() const { return markers().isEmpty() && aChild().isEmpty(); } // access flags bool isPersistentId() const { return m_bPersistentId; } // reactor void setReactor(OdGsHlBranchReactor *pReactor); OdGsHlBranchReactor *reactor(); static inline bool isValidMarker(OdGsMarker marker) { return (marker != kNullSubentIndex); } }; /** \details This class is a reactor for OdGsHlBranch class. Library: TD_Gs */ class GS_TOOLKIT_EXPORT OdGsHlBranchReactor : public OdRxObject { public: virtual void onChildAdded(OdGsHlBranch *pHlBranch, OdGsHlBranch *pHlBranchAdded) = 0; virtual void onChildRemoved(OdGsHlBranch *pHlBranch, OdGsHlBranch *pHlBranchRemoved) = 0; virtual void onMarkerAdded(OdGsHlBranch *pHlBranch, OdGsMarker gsMarker) = 0; virtual void onMarkerRemoved(OdGsHlBranch *pHlBranch, OdGsMarker gsMarker) = 0; }; // gcc3x template instantiation must be done after class declaration inline void OdGsHlBranch::setReactor(OdGsHlBranchReactor *pReactor) { m_pReactor = pReactor; } inline OdGsHlBranchReactor *OdGsHlBranch::reactor() { return m_pReactor.get(); } /** \details This class is a multimodule reactor reactor implementation for OdGsHlBranch class. Library: TD_Gs */ class GS_TOOLKIT_EXPORT OdGsHlBranchMultimoduleReactor { public: static void attach(OdGsHlBranch *pHlBranch, const void *pModule, OdGsHlBranchReactor *pReactor); static void detach(OdGsHlBranch *pHlBranch, const void *pModule); static OdGsHlBranchReactor *getReactor(OdGsHlBranch *pHlBranch, const void *pModule); static void setReactor(OdGsHlBranch *pHlBranch, const void *pModule, OdGsHlBranchReactor *pReactor); }; #include "TD_PackPop.h" #endif // __ODGSHIGHLIGHTDATA_H__