VR-Forces 4.0.4 Class Documentation
include/vrvCore/DtSubjectAnnouncer.h
Go to the documentation of this file.
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  

Document ID: Generated on Fri Jun 29 16:33:32 EDT 2012 from SVN revision 116588
Copyright © 2005-2012 VT MÄK Inc. All Rights Reserved (www.mak.com)