VR-Forces 4.1.1 Class Documentation
DtSubjectAnnouncer.h
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright (c) 2010 MAK Technologies, Inc.
3 ** All rights reserved.
4 ******************************************************************************/
5 /******************************************************************************
6 ** $RCSfile: DtSubjectAnnouncer.h,v $ $Revision: 1.10 $ $State: Exp $
7 ******************************************************************************/
8 
12 
13 #pragma once
14 
15 #include <vrvCore/DtDe.h>
16 #include <vrvCore/DtDisplay.h>
18 
19 #include <boost/signal.hpp>
20 #include <boost/bind.hpp>
21 #include <list>
22 
23 namespace makVrv
24 {
25 
26  class DtDe;
27  class DtDisplay;
28  class DtDeCommunicator;
29 
31  template<class T>
33  {
34 
35  public:
36 
37  virtual ~DtSubjectAnnouncer();
38 
41 
43  virtual void activate(T* subject) const;
44 
46  virtual void deactivate(T* subject) const;
47 
49  boost::signal<void (T*)> signal_activate;
50 
52  boost::signal<void (T*)> signal_deactivate;
53 
54  typedef std::list<T*> ActivatedList;
55 
57  virtual std::list<T*>& activatedList();
58 
59  protected:
60 
63 
66  static DtSubjectAnnouncer* create(DtDe& de);
67 
69  virtual void slot_onActivate(T* subject);
70 
72  virtual void slot_onDeactivate(T* subject);
73 
74  protected:
75 
78 
79  };
80 
81  template<class T>
83  {
84  signal_activate.connect(
85  boost::bind(&DtSubjectAnnouncer<T>::slot_onActivate, this, _1));
86 
87  signal_deactivate.connect(
88  boost::bind(&DtSubjectAnnouncer<T>::slot_onDeactivate, this, _1));
89  }
90 
91  template<class T>
93  {
94  signal_activate.disconnect(
95  boost::bind(&DtSubjectAnnouncer<T>::slot_onActivate, this, _1));
96 
97  signal_deactivate.disconnect(
98  boost::bind(&DtSubjectAnnouncer<T>::slot_onDeactivate, this, _1));
99  }
100 
101  template<class T>
103  {
104  DtSubjectAnnouncer* announcer = 0;
105  announcer = dynamic_cast<DtSubjectAnnouncer<T>*>(de.findInstance(T::className()));
106  if(!announcer)
107  {
108  announcer = create(de);
109  de.registerInstance(T::className(),announcer);
110  }
111 
112  if(!announcer)
113  {
114  DtTHROW_NEW(DtCorruptedState,"Unable to get an DtSubjectAnnouncer instance.");
115  }
116  return announcer;
117  }
118 
119  template<class T>
121  {
122  return new DtSubjectAnnouncer<T>(de);
123  }
124 
125  template<class T>
126  void DtSubjectAnnouncer<T>::activate( T* subject) const
127  {
128  signal_activate(subject);
129  }
130 
131  template<class T>
132  void DtSubjectAnnouncer<T>::deactivate( T* subject) const
133  {
134  signal_deactivate(subject);
135  }
136 
137  template<class T>
139  {
140  myActivatedList.remove(subject);
141  myActivatedList.push_back(subject);
142  }
143 
144  template<class T>
146  {
147  myActivatedList.remove(subject);
148  }
149 
150  template<class T>
152  {
153  return myActivatedList;
154  }
155 
156 
160 
161 }
162 

Document ID: Generated on Mon Apr 8 19:24:01 EDT 2013 from SVN revision 125877
Copyright © 2005-2013 VT MÄK. All Rights Reserved (www.mak.com)