![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /****************************************************************************** 00002 ** Copyright (c) 2010 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 ******************************************************************************/ 00005 /****************************************************************************** 00006 ** $RCSfile: DtElementIDHierarchy.h,v $ $Revision: 1.2 $ $State: Exp $ 00007 ******************************************************************************/ 00008 00016 00017 #pragma once 00018 00019 #include <vrvCore/vrvCore.h> 00020 00021 #include <vrvCore/DtUniqueID.h> 00022 00023 #include <boost/signal.hpp> 00024 #include <boost/unordered_map.hpp> 00025 #include <boost/function.hpp> 00026 00027 #include <set> 00028 00029 namespace makVrv 00030 { 00031 class DtElementIDHierarchyState; 00032 00036 class DT_DLL_VRVCORE DtElementIDHierarchyNode 00037 { 00038 public: 00039 typedef std::vector<DtElementIDHierarchyNode*> ChildHierarchyNodes; 00040 00042 enum DisplayState 00043 { 00044 Unknown = -1, 00045 Collapsed = 0, 00046 Shown = 1, 00047 Ghosted = 2, 00048 Expanded = 3, 00049 InitiallyShown = 4, 00050 00051 00052 InitiallyExpanded = 5, 00053 Hidden = 6, 00054 }; 00055 00056 enum Flags 00057 { 00058 ShouldHaveChildren = 0x00000001, 00059 CollapseIfNoChildren = 0x00000002, 00060 }; 00061 00062 DtElementIDHierarchyNode(); 00063 00065 DtElementIDHierarchyNode(DtElementID id, const DtElementIDHierarchyState&); 00066 00067 DtElementIDHierarchyNode(DtElementID); 00068 DtElementIDHierarchyNode(const DtElementIDHierarchyNode& orig); 00069 00070 virtual ~DtElementIDHierarchyNode(); 00071 00072 DtElementIDHierarchyNode& operator=(const DtElementIDHierarchyNode&); 00073 bool operator==(const DtElementIDHierarchyNode&) const; 00074 bool operator!=(const DtElementIDHierarchyNode& rhs) const 00075 { 00076 return !(*this == rhs); 00077 } 00078 00079 bool hasChild(DtElementID child) const; 00080 bool addChild(DtElementIDHierarchyNode*); 00081 void removeChild(DtElementID child); 00082 void copyOriginal(const DtElementIDHierarchyNode& orig); 00083 00084 const makVrv::DtElementID& uniqueId() const; 00085 const ChildHierarchyNodes& children() const; 00086 00087 void removeAllChildren(); 00088 void setParent(DtElementIDHierarchyNode* p); 00089 00090 DtElementIDHierarchyNode* parent(); 00091 const DtElementIDHierarchyNode* parent() const; 00092 00094 virtual bool childInHierarchy(DtElementID id) const; 00095 00096 void setFlags(int flags); 00097 int flags() const; 00098 00099 void setDisplayState(DisplayState); 00100 DisplayState displayState() const; 00101 00102 protected: 00103 DtElementIDHierarchyNode* myParent; 00104 ChildHierarchyNodes myChildren; 00105 DtElementID myId; 00106 bool myCleanupChildren; 00107 int myFlags; 00108 DisplayState myDisplayState; 00109 }; 00110 00114 class DT_DLL_VRVCORE DtElementIDHierarchy 00115 { 00116 public: 00117 typedef std::vector<DtElementID> ElementIDs; 00118 typedef std::set<const DtElementIDHierarchyNode*> VisibilityProcessingList; 00119 typedef boost::function<DtElementIDHierarchyNode::DisplayState (const DtElementIDHierarchyNode*)> ExpectedDisplayState; 00120 00121 public: 00122 DtElementIDHierarchy(); 00123 virtual ~DtElementIDHierarchy(); 00124 00125 public: 00129 virtual void addToHierarchy(DtElementID elementID, DtElementID child, int flags = 0, bool setAsNewChildren = true, 00130 bool processList = true); 00131 virtual void addToHierarchy(DtElementID elementID, const ElementIDs& children = ElementIDs(), 00132 int flags = 0, bool setAsNewChildren = true, bool processList = true); 00133 00135 void setFlags(DtElementID id, int flags); 00136 00138 int flags(DtElementID id) const; 00139 00141 virtual void removeFromHierarchy(DtElementID id); 00142 00143 public: 00146 virtual bool isChild(DtElementID parentId, DtElementID childId, bool recurse = false) const; 00147 00149 bool isInHierarchy(DtElementID id) const; 00150 00151 DtElementIDHierarchyNode* parentOf(DtElementID id); 00152 const DtElementIDHierarchyNode* parentOf(DtElementID id) const; 00153 00154 DtElementIDHierarchyNode* hierarchyNode(DtElementID id); 00155 const DtElementIDHierarchyNode* hierarchyNode(DtElementID elementID) const; 00156 00157 bool hasChildren(DtElementID id) const; 00158 00160 int level(const DtElementIDHierarchyNode* node) const; 00161 00163 virtual DtElementIDHierarchyNode::DisplayState displayState(DtElementID elementID) const; 00164 00166 virtual void detachChildFromParent(DtElementID child); 00167 00169 virtual void attachChildToParent(DtElementID child, DtElementID parent, bool processList = true); 00170 00171 public: 00172 00177 virtual void expand(DtElementID elementID, bool processList = true); 00178 00180 virtual void expandAll(DtElementID elementID, bool processList = true); 00181 00183 virtual void collapseAll(DtElementID elementID, bool processList = true); 00184 00187 virtual void collapse(DtElementID elementID, bool processList = true); 00188 00190 virtual void processVisibilityList(); 00191 00193 void setInitiallyExpanded(bool); 00194 virtual bool initiallyExpanded() const; 00195 00197 virtual void processNode(DtElementIDHierarchyNode* node, bool forceUpdate = false); 00198 00200 void setExpectedDisplayStateFunction(ExpectedDisplayState); 00201 00203 virtual DtElementIDHierarchyNode::DisplayState expectedDisplayStateFor(const DtElementIDHierarchyNode* node); 00204 00206 virtual void reprocessAllNodes(); 00207 00208 protected: 00210 virtual void processVisibilityState(const DtElementIDHierarchyNode*); 00211 00212 virtual void processSingleNode(DtElementIDHierarchyNode* node, bool forceUpdate = false); 00213 virtual void processParentedNode(DtElementIDHierarchyNode* node, bool forceUpdate = false, bool processChildren = true); 00214 virtual void processNodeWithChildren(DtElementIDHierarchyNode* node, bool forceUpdate = false); 00215 00216 protected: 00218 virtual void hierarchyUpdated(); 00219 00221 virtual void aboutToBeRemovedFromHierarchy(DtElementIDHierarchyNode*); 00222 00225 virtual void updateHierarchy(DtElementID id, const ElementIDs& children, bool setAsNewChildren = true); 00226 00231 virtual void attachParentToChildren(DtElementID parentId, const ElementIDs& children, bool setAsNewChildren = true); 00232 00233 virtual void removeAllChildrenFromParent(DtElementID); 00234 00235 public: 00236 boost::signal<void (DtElementIDHierarchyNode*) > signal_hierarchyItemModified; 00237 00239 boost::signal<void (DtElementIDHierarchyNode*) > signal_hierarchyItemToBeRemoved; 00240 boost::signal<void (DtElementIDHierarchyNode*) > signal_hierarchyItemAboutToBeRemoved; 00241 boost::signal<void (DtElementIDHierarchy*) > signal_hierarchyUpdated; 00242 boost::signal<void (DtElementID, const ElementIDs&)> signal_updateHierarchy; 00243 boost::signal<void (DtElementID, DtElementIDHierarchyNode::DisplayState)> signal_echelonVisibilityChange; 00244 boost::signal<void (VisibilityProcessingList)> signal_visibilityChanged; 00245 00246 protected: 00248 virtual void hierarchyItemModified(DtElementIDHierarchyNode*); 00249 00250 protected: 00251 typedef boost::unordered_map<DtElementID, DtElementIDHierarchyNode*> HierarchyNodeMap; 00252 00253 HierarchyNodeMap myFlatHierarchy; 00254 VisibilityProcessingList myVisibilityProcessingList; 00255 ExpectedDisplayState myExpectedDisplayState; 00256 00257 bool myInitiallyExpanded; 00258 }; 00259 }