OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimListenerManager.cpp
Go to the documentation of this file.
1 //*******************************************************************
2 // Copyright (C) 2000 ImageLinks Inc.
3 //
4 // License: See LICENSE.txt file in the top level directory.
5 //
6 // Author: Garrett Potts
7 //
8 // Description: A brief description of the contents of the file.
9 //
10 //*************************************************************************
11 // $Id: ossimListenerManager.cpp 17193 2010-04-23 14:59:44Z dburken $
12 
13 #include <algorithm>
15 #include <ossim/base/ossimEvent.h>
17 
18 RTTI_DEF(ossimListenerManager, "ossimListenerManager");
19 
21 {
22  theFireEventFlag = false;
23 }
24 
26 {
27 // replaceListeners(rhs.getListeners());
28 }
29 
31 {
32  theListenerList.clear();
33 }
34 
36 {
37  // only process the event if it has not been consumed.
38  event.setCurrentObject( dynamic_cast<ossimObject*>(this) );
39  if(event.isConsumed())
40  {
41  return;
42  }
43  theFireEventFlag = true;
44 
45  std::list<ossimListener*>::iterator currentIterator = theListenerList.begin();
46 
47  while(currentIterator != theListenerList.end())
48  {
49  // only fire if the event is not consumed
50  if(!event.isConsumed())
51  {
52  if(*currentIterator)
53  {
54  if(theDelayedRemove.end()==std::find(theDelayedRemove.begin(),
55  theDelayedRemove.end(),
56  (*currentIterator)))
57  {
58  if((*currentIterator)->isListenerEnabled())
59  {
60  (*currentIterator)->processEvent(event);
61  }
62  }
63  }
64  }
65  else
66  {
67  // the event is now consumed so stop propagating.
68  //
69  theFireEventFlag = false;
70  break;
71  }
72  ++currentIterator;
73  }
74 
75  theFireEventFlag = false;
76 
77  if(theDelayedAdd.size())
78  {
79  for(std::list<ossimListener*>::iterator current = theDelayedAdd.begin();
80  current != theDelayedAdd.end();++current)
81  {
82  addListener(*current);
83  }
84  theDelayedAdd.clear();
85  }
86 
87  if(theDelayedRemove.size())
88  {
89  for(std::list<ossimListener*>::iterator current = theDelayedRemove.begin();
90  current != theDelayedRemove.end();++current)
91  {
92  removeListener(*current);
93  }
94  theDelayedRemove.clear();
95  }
96 }
97 
99 {
100  if(theFireEventFlag)
101  {
102  theDelayedAdd.push_back(listener);
103  }
104  else
105  {
106 
107  if(!findListener(listener))
108  {
109  theListenerList.push_back(listener);
110  }
111  }
112 
113  return true;
114 }
115 
117 {
118 
119  if(theFireEventFlag)
120  {
121  theDelayedRemove.push_back(listener);
122  return true;
123  }
124 
125  std::list<ossimListener*>::iterator current=theListenerList.begin();
126  while(current!=theListenerList.end())
127  {
128  if( (*current) == listener)
129  {
130  current = theListenerList.erase(current);
131  break; // Should only be in list once... (drb)
132  }
133  else
134  {
135  ++current;
136  }
137  }
138 
139  return true;
140 }
141 
143 {
144  bool result = false;
145 
146  if(listener)
147  {
148  std::list<ossimListener*>::iterator currentIter =
149  std::find(theListenerList.begin(),
150  theListenerList.end(),
151  listener);
152  result = (currentIter != theListenerList.end());
153  }
154 
155  return result;
156 }
virtual bool addListener(ossimListener *listener)
std::list< ossimListener * > theListenerList
virtual void fireEvent(ossimEvent &event)
bool isConsumed() const
Definition: ossimEvent.cpp:49
virtual bool findListener(ossimListener *listener)
std::list< ossimListener * > theDelayedAdd
RTTI_DEF(ossimListenerManager, "ossimListenerManager")
std::list< ossimListener * > theDelayedRemove
virtual bool removeListener(ossimListener *listener)