Vegastrike 0.5.1 rc1  1.0
Original sources for Vegastrike Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
EventManager Class Reference

#include <eventmanager.h>

Public Member Functions

void pushResponder (EventResponder *responder)
 
void removeResponder (EventResponder *responder, bool top=false)
 
void sendCommand (const EventCommandId &id, Control *control)
 
Point mouseLoc (void)
 

Static Public Member Functions

static void addToDeleteQueue (EventResponder *controlToDelete)
 
static void initializeEventManager (void)
 
static void ProcessMouseClick (int button, int state, int x, int y)
 
static void ProcessMouseActive (int x, int y)
 
static void ProcessMousePassive (int x, int y)
 

Protected Member Functions

 EventManager (void)
 
virtual ~EventManager (void)
 
void sendInputEvent (const InputEvent &event)
 
void checkForShutDownEventManager (void)
 
void takeOverEventManagement (void)
 

Protected Attributes

std::vector< EventResponder * > m_responders
 
Point m_mouseLoc
 

Detailed Description

Definition at line 37 of file eventmanager.h.

Constructor & Destructor Documentation

EventManager::EventManager ( void  )
protected

Definition at line 189 of file eventmanager.cpp.

Referenced by initializeEventManager().

189  :
190  m_mouseLoc( 0.0, 0.0 )
191 {
192 }
EventManager::~EventManager ( void  )
protectedvirtual

Definition at line 195 of file eventmanager.cpp.

195 {}

Member Function Documentation

void EventManager::addToDeleteQueue ( EventResponder controlToDelete)
static

Definition at line 64 of file eventmanager.cpp.

References deleteQueue.

Referenced by WindowManager::closeWindow(), GroupControl::deleteControl(), GroupControl::~GroupControl(), and Window::~Window().

65 {
66  if ( controlToDelete == NULL || find( deleteQueue.begin(), deleteQueue.end(), controlToDelete ) != deleteQueue.end() ) {
67  bool DUPLICATE_DELETE_OF_OBJECT = true;
68  char tempstr[254];
69  sprintf( tempstr, "\nERROR: duplicate delete of object %lX.\n\n", (long unsigned int) controlToDelete );
70  fputs( tempstr, stderr );
71 #if defined (_MSC_VER) && defined (_DEBUG) && 0
72  if (DEBUG_ERROR_IN_MY_CODE)
73  _RPT0( _CRT_ERROR, tempstr );
74 #endif
75  printf( "Attach a debugger now!" );
76  while (DUPLICATE_DELETE_OF_OBJECT) {}
77  } else {
78  deleteQueue.push_back( controlToDelete );
79  }
80 }
void EventManager::checkForShutDownEventManager ( void  )
protected

Definition at line 204 of file eventmanager.cpp.

References globalEventManagerPtr, InitCallbacks(), and m_responders.

Referenced by sendInputEvent().

205 {
206  if (m_responders.empty() && globalEventManagerPtr != NULL) {
207  //There are no more responders. We assume no more of our windows, and reset mouse callbacks.
208  //If we don't have a global event manager, we already did this.
209  InitCallbacks();
210 
211  //Get rid of global event manager object until we need it again.
212  delete globalEventManagerPtr;
213  globalEventManagerPtr = NULL;
214  }
215 }
void EventManager::initializeEventManager ( void  )
static

Definition at line 56 of file eventmanager.cpp.

References EventManager(), and takeOverEventManagement().

Referenced by globalEventManager().

57 {
59  globalEventManagerPtr->takeOverEventManagement(); //FIXME -- EVENT HACK
60 }
Point EventManager::mouseLoc ( void  )
inline

Definition at line 61 of file eventmanager.h.

References m_mouseLoc.

Referenced by WindowManager::draw().

62  {
63  return m_mouseLoc;
64  }
void EventManager::ProcessMouseActive ( int  x,
int  y 
)
static

Definition at line 257 of file eventmanager.cpp.

References clearDeleteQueue(), globalEventManager(), ModifyMouseSensitivity(), MOUSE_DRAG_EVENT, MouseXTo2dX(), MouseYTo2dY(), and sendInputEvent().

Referenced by UniverseUtil::startMenuInterface(), takeOverEventManagement(), and NavComputer::toggleVisibility().

258 {
260  //FIXME mbyron -- Should provide info about which buttons are down.
261  InputEvent event( MOUSE_DRAG_EVENT, 0, 0, Point( MouseXTo2dX( x ), MouseYTo2dY( y ) ) );
262  globalEventManager().sendInputEvent( (event) );
264 }
void EventManager::ProcessMouseClick ( int  button,
int  state,
int  x,
int  y 
)
static
void EventManager::ProcessMousePassive ( int  x,
int  y 
)
static
void EventManager::pushResponder ( EventResponder responder)

Definition at line 94 of file eventmanager.cpp.

References m_responders.

Referenced by WindowManager::openWindow(), Slider::processMouseDown(), NewButton::processMouseDown(), and Picker::processMouseDown().

95 {
96  m_responders.push_back( responder );
97 }
void EventManager::removeResponder ( EventResponder responder,
bool  top = false 
)

Definition at line 100 of file eventmanager.cpp.

References i, and m_responders.

Referenced by WindowManager::closeWindow(), ModalDialog::modalFinished(), Slider::processMouseUp(), NewButton::processMouseUp(), Picker::processMouseUp(), and EventResponder::~EventResponder().

103 {
104  bool found; //Whether we found one
105  do {
106  found = false;
107  //Start at the top, so that we only get the top if we only want the top.
108  //Can't use reverse_iterator easily -- erase() needs iterator.
109  for (int i = m_responders.size()-1; i >= 0; i--)
110  if (m_responders[i] == responder) {
111  m_responders.erase( m_responders.begin()+i );
112  found = true;
113  break;
114  }
115  //Do the loop again if we found one and we want all of them.
116  } while (found && !top);
117 //FIXME -- Calling this here causes the loop in processEvent to be b0rked by a deletion. We now must checkForShutdown at a later time...which is below checkForShutDownEventManager(); // FIXME mbyron -- EVENT HACK.
118 }
void EventManager::sendCommand ( const EventCommandId id,
Control control 
)

Definition at line 121 of file eventmanager.cpp.

References m_responders.

Referenced by EventResponder::sendCommand().

122 {
123  vector< EventResponder* >::reverse_iterator iter;
124  //Loop through the event chain, starting at the end.
125  for (iter = m_responders.rbegin(); iter != m_responders.rend(); iter++)
126  if ( (*iter)->processCommand( id, control ) )
127  //Somebody handled it!
128  break;
129 }
void EventManager::sendInputEvent ( const InputEvent event)
protected

Definition at line 132 of file eventmanager.cpp.

References checkForShutDownEventManager(), i, KEY_DOWN_EVENT, KEY_UP_EVENT, m_mouseLoc, m_responders, MOUSE_DOWN_EVENT, MOUSE_DRAG_EVENT, MOUSE_MOVE_EVENT, MOUSE_UP_EVENT, and InputEvent::type.

Referenced by ProcessMouseActive(), ProcessMouseClick(), and ProcessMousePassive().

133 {
134  //Record the mouse position.
135  //This is used (at least) to render the cursor.
136  switch (event.type)
137  {
138  case MOUSE_DOWN_EVENT:
139  case MOUSE_UP_EVENT:
140  case MOUSE_MOVE_EVENT:
141  case MOUSE_DRAG_EVENT:
142  m_mouseLoc = event.loc;
143  break;
144  default:
145  m_mouseLoc = event.loc;
146  break;
147  }
148  //Loop through the event chain, starting at the end.
149  //WARNING: The functions in this loop can change the responders list.
150  //Iterate through the list carefully!
151  for (size_t i = m_responders.size(); i > 0; i--) {
152  bool result = false;
153  if (i < m_responders.size()+1) {
154  //Check this in case responders get deleted.
155  switch (event.type)
156  {
157  case KEY_DOWN_EVENT:
158  result = m_responders[i-1]->processKeyDown( event );
159  break;
160  case KEY_UP_EVENT:
161  result = m_responders[i-1]->processKeyUp( event );
162  break;
163  case MOUSE_DOWN_EVENT:
164  result = m_responders[i-1]->processMouseDown( event );
165  break;
166  case MOUSE_UP_EVENT:
167  result = m_responders[i-1]->processMouseUp( event );
168  break;
169  case MOUSE_MOVE_EVENT:
170  result = m_responders[i-1]->processMouseMove( event );
171  break;
172  case MOUSE_DRAG_EVENT:
173  result = m_responders[i-1]->processMouseDrag( event );
174  break;
175  default:
176  //Event responder dispatch doesn't handle this type of input event!
177  assert( false );
178  break;
179  }
180  }
181  if (result)
182  //Somebody handled it!
183  break;
184  }
186 }

Member Data Documentation

Point EventManager::m_mouseLoc
protected

Definition at line 78 of file eventmanager.h.

Referenced by mouseLoc(), and sendInputEvent().

std::vector< EventResponder* > EventManager::m_responders
protected

The documentation for this class was generated from the following files: