![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /****************************************************************************** 00002 ** Copyright (c) 2010 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 ******************************************************************************/ 00005 /****************************************************************************** 00006 ** $RCSfile: DtSubjectAnnouncer.h,v $ $Revision: 1.10 $ $State: Exp $ 00007 ******************************************************************************/ 00008 00012 00013 #pragma once 00014 00015 #include <vrvCore/DtDe.h> 00016 #include <vrvCore/DtDisplay.h> 00017 #include <vrvUtil/DtVirtualBaseClass.h> 00018 00019 #include <boost/signal.hpp> 00020 #include <boost/bind.hpp> 00021 #include <list> 00022 00023 namespace makVrv 00024 { 00025 00026 class DtDe; 00027 class DtDisplay; 00028 class DtDeCommunicator; 00029 00031 template<class T> 00032 class DtSubjectAnnouncer : public DtVirtualBaseClass 00033 { 00034 00035 public: 00036 00037 virtual ~DtSubjectAnnouncer(); 00038 00040 static DtSubjectAnnouncer* findInstance(DtDe& de); 00041 00043 virtual void activate(T* subject) const; 00044 00046 virtual void deactivate(T* subject) const; 00047 00049 boost::signal<void (T*)> signal_activate; 00050 00052 boost::signal<void (T*)> signal_deactivate; 00053 00054 typedef std::list<T*> ActivatedList; 00055 00057 virtual std::list<T*>& activatedList(); 00058 00059 protected: 00060 00062 DtSubjectAnnouncer(DtDe& de); 00063 00066 static DtSubjectAnnouncer* create(DtDe& de); 00067 00069 virtual void slot_onActivate(T* subject); 00070 00072 virtual void slot_onDeactivate(T* subject); 00073 00074 protected: 00075 00077 ActivatedList myActivatedList; 00078 00079 }; 00080 00081 template<class T> 00082 DtSubjectAnnouncer<T>::DtSubjectAnnouncer( DtDe& de ) 00083 { 00084 signal_activate.connect( 00085 boost::bind(&DtSubjectAnnouncer<T>::slot_onActivate, this, _1)); 00086 00087 signal_deactivate.connect( 00088 boost::bind(&DtSubjectAnnouncer<T>::slot_onDeactivate, this, _1)); 00089 } 00090 00091 template<class T> 00092 DtSubjectAnnouncer<T>::~DtSubjectAnnouncer() 00093 { 00094 signal_activate.disconnect( 00095 boost::bind(&DtSubjectAnnouncer<T>::slot_onActivate, this, _1)); 00096 00097 signal_deactivate.disconnect( 00098 boost::bind(&DtSubjectAnnouncer<T>::slot_onDeactivate, this, _1)); 00099 } 00100 00101 template<class T> 00102 DtSubjectAnnouncer<T>* DtSubjectAnnouncer<T>::findInstance( DtDe& de ) 00103 { 00104 DtSubjectAnnouncer* announcer = 0; 00105 announcer = dynamic_cast<DtSubjectAnnouncer<T>*>(de.findInstance(T::className())); 00106 if(!announcer) 00107 { 00108 announcer = create(de); 00109 de.registerInstance(T::className(),announcer); 00110 } 00111 00112 if(!announcer) 00113 { 00114 DtTHROW_NEW(DtCorruptedState,"Unable to get an DtSubjectAnnouncer instance."); 00115 } 00116 return announcer; 00117 } 00118 00119 template<class T> 00120 DtSubjectAnnouncer<T>* DtSubjectAnnouncer<T>::create( DtDe& de ) 00121 { 00122 return new DtSubjectAnnouncer<T>(de); 00123 } 00124 00125 template<class T> 00126 void DtSubjectAnnouncer<T>::activate( T* subject) const 00127 { 00128 signal_activate(subject); 00129 } 00130 00131 template<class T> 00132 void DtSubjectAnnouncer<T>::deactivate( T* subject) const 00133 { 00134 signal_deactivate(subject); 00135 } 00136 00137 template<class T> 00138 void DtSubjectAnnouncer<T>::slot_onActivate( T* subject) 00139 { 00140 myActivatedList.remove(subject); 00141 myActivatedList.push_back(subject); 00142 } 00143 00144 template<class T> 00145 void DtSubjectAnnouncer<T>::slot_onDeactivate( T* subject) 00146 { 00147 myActivatedList.remove(subject); 00148 } 00149 00150 template<class T> 00151 std::list<T*>& DtSubjectAnnouncer<T>::activatedList() 00152 { 00153 return myActivatedList; 00154 } 00155 00156 00157 typedef DtSubjectAnnouncer<DtDe> DtDeAnnouncer; 00158 typedef DtSubjectAnnouncer<DtDeCommunicator> DtDeCommunicatorAnnouncer; 00159 typedef DtSubjectAnnouncer<DtDisplay> DtDisplayAnnouncer; 00160 00161 } 00162