Main Page | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

CSMessageDispatchable Class Reference

#include <CSMessageDispatchable.h>

Inheritance diagram for CSMessageDispatchable:

CSGame CSGrafikElement CSSprite SDLMain CSBar CSButton CSCheckBox CSCombobox CSDesktop CSHTMLPanel CSIcon CSLabel CSListbox CSPanel CSScrollbar CSTextarea CSTextfield CSWindow

Detailed Description

This is the base class for all classes that wish to dispatch messages to other classes.

Just inherit from this class and everything should be fine. There are only three self explanatory methods:

// send a message according to its type and priority - now, or later void sendMessage(CSMessage &message);

// can't add same listener twice! void addMessageListener(CSMessageListener* listener);

// return # of listeners removed - should allways be 0 or 1 int removeMessageListener(CSMessageListener* listener);

A message is allways sent to ALL listeners!

Definition at line 51 of file CSMessageDispatchable.h.

Public Member Functions

 CSMessageDispatchable ()
virtual ~CSMessageDispatchable ()
virtual std::string getType ()
void sendMessage (CSMessage &message)
void addMessageListener (CSMessageListener *listener, int typeOfMessage=-1)
int removeMessageListener (CSMessageListener *listener)
int removeMessageListener (CSMessageListener *listener, int typeOfMessage)

Static Public Attributes

const char * CLASS = "CSMessageDispatchable"


Constructor & Destructor Documentation

CSMessageDispatchable::CSMessageDispatchable  )  [inline]
 

Definition at line 57 of file CSMessageDispatchable.h.

00057 {}

virtual CSMessageDispatchable::~CSMessageDispatchable  )  [inline, virtual]
 

Definition at line 58 of file CSMessageDispatchable.h.

00058 {}


Member Function Documentation

virtual std::string CSMessageDispatchable::getType  )  [inline, virtual]
 

Reimplemented in CSBar, CSButton, CSDragButton, CSCheckBox, CSCombobox, CSDesktop, CSGrafikElement, CSHTMLPanel, CSIcon, CSPictureIcon, CSTextIcon, CSLabel, CSListbox, CSMenu, CSMenuBar, CSMenuItem, CSMessageBox, CSPanel, CSScrollbar, CSTextarea, CSTextfield, CSWindow, CSGame, CSSprite, and SDLMain.

Definition at line 60 of file CSMessageDispatchable.h.

References CLASS.

00060 {return (std::string) CLASS;}

void CSMessageDispatchable::sendMessage CSMessage message  ) 
 

send a message according to its type and priority - now, or later

Definition at line 11 of file CSMessageDispatchable.cpp.

References CSMessageListener::dispatchMessage(), CSMessage::getType(), ListenerInteresteds, ListenerInterested::mInterestedIn, and ListenerInterested::mListener.

Referenced by CSGame::checkCollisions(), CSGame::checkOutOfBounds(), CSGame::handleEvents(), CSSprite::next(), CSButton::reactOnMessageButton(), CSCheckBox::reactOnMessageCheckBox(), CSCombobox::reactOnMessageCombobox(), CSDragButton::reactOnMessageDragButton(), CSListbox::reactOnMessageListbox(), CSMenuItem::reactOnMessageMenuItem(), CSTextfield::reactOnMessageTextField(), SDLMain::resetVideo(), CSDesktop::setFocusedComponent(), and CSListbox::setGrafikCursor().

00012 {
00013     static char *functionName="sendMessage";
00014     // saftey meassure. if a listener is removed while sending!
00015     ListenerInteresteds listeners = mListeners;
00016     ListenerInteresteds::iterator iter;
00017     for (iter = listeners.begin(); iter != listeners.end(); iter++)
00018     {
00019         ListenerInterested *listenerInterested = *iter;
00020         if ((listenerInterested->mInterestedIn == -1 ) || (listenerInterested->mInterestedIn == message.getType()))
00021         {
00022             // todo! 
00023             // something to make sure, that a message is not sent twice to the same listener!
00024             listenerInterested->mListener->dispatchMessage(&message);
00025         }
00026     }
00027 }

Here is the call graph for this function:

void CSMessageDispatchable::addMessageListener CSMessageListener listener,
int  typeOfMessage = -1
 

can't add same listener twice!

Definition at line 29 of file CSMessageDispatchable.cpp.

References LOG_ENTER, LOG_EXIT, and removeMessageListener().

Referenced by CSGrafikElement::CSGrafikElement(), CSMenu::openMenu(), CSScrollbar::rebuildElement(), CSListbox::rebuildElement(), CSCombobox::rebuildElement(), and CSWindow::rebuildElementWindow().

00030 {
00031     static char *functionName="addMessageListener";
00032     LOG_ENTER 
00033     // savety meassure, not to add twice!
00034     removeMessageListener(listener, typeOfMessage);
00035     ListenerInterested *listenerInterested = new ListenerInterested(listener, typeOfMessage);
00036     mListeners.push_back(listenerInterested);
00037     LOG_EXIT
00038 }

Here is the call graph for this function:

int CSMessageDispatchable::removeMessageListener CSMessageListener listener  ) 
 

return # of listeners removed - should allways be 0 or 1

Definition at line 40 of file CSMessageDispatchable.cpp.

References LOG_ENTER, and LOG_EXIT.

Referenced by addMessageListener(), CSScrollbar::rebuildElement(), CSListbox::rebuildElement(), CSCombobox::rebuildElement(), CSWindow::rebuildElementWindow(), CSGrafikElement::removeMainElement(), and CSGrafikElement::~CSGrafikElement().

00041 {
00042     static char *functionName="removeMessageListener";
00043     LOG_ENTER 
00044     int count = 0;
00045     ListenerInteresteds::iterator iter = mListeners.begin();
00046     while ( iter != mListeners.end())
00047     {
00048         if ((*iter)->mListener == listener)
00049         {
00050             mListeners.erase(iter);
00051             delete ((*iter));
00052             iter = mListeners.begin();  // restart!
00053             count++;
00054         }
00055         else
00056         {
00057             iter++;
00058         }
00059     }
00060 
00061     // TODO: ensure, that the listener is not currently enqueued with
00062     //       a waiting message!
00063     LOG_EXIT
00064     return count;
00065 }

int CSMessageDispatchable::removeMessageListener CSMessageListener listener,
int  typeOfMessage
 

return # of listeners removed - should allways be 0 or 1

Definition at line 67 of file CSMessageDispatchable.cpp.

References LOG_ENTER, LOG_EXIT, ListenerInterested::mInterestedIn, and ListenerInterested::mListener.

00068 {
00069     static char *functionName="removeMessageListener";
00070     LOG_ENTER 
00071     int count = 0;
00072     ListenerInteresteds::iterator iter = mListeners.begin();
00073     while ( iter != mListeners.end())
00074     {
00075         ListenerInterested *listenerInterested = *iter;
00076         if ((listenerInterested->mInterestedIn == typeOfMessage)
00077             && ( listenerInterested->mListener == listener))
00078         {
00079             mListeners.erase(iter);
00080             delete (listenerInterested);
00081             iter = mListeners.begin();
00082             count++;
00083         }
00084         else
00085         {
00086             iter++;
00087         }
00088     }
00089     // TODO: ensure, that the listener is not currently enqueued with
00090     //       a waiting message!
00091     LOG_EXIT
00092     return count;
00093 }


Field Documentation

const char * CSMessageDispatchable::CLASS = "CSMessageDispatchable" [static]
 

Reimplemented in CSBar, CSButton, CSDragButton, CSCheckBox, CSCombobox, CSDesktop, CSGrafikElement, CSHTMLPanel, CSIcon, CSPictureIcon, CSTextIcon, CSLabel, CSListbox, CSMenu, CSMenuBar, CSMenuItem, CSMessageBox, CSPanel, CSScrollbar, CSTextarea, CSTextfield, CSWindow, CSGame, CSSprite, and SDLMain.

Definition at line 9 of file CSMessageDispatchable.cpp.

Referenced by getType().


Generated on Wed Jul 14 00:44:55 2004 for CSLib by doxygen 1.3.6