#include <CSMessageDispatchable.h>
Inheritance diagram for CSMessageDispatchable:
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" |
|
Definition at line 57 of file CSMessageDispatchable.h.
00057 {} |
|
Definition at line 58 of file CSMessageDispatchable.h.
00058 {} |
|
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;} |
|
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:
|
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:
|
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 } |
|
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 } |
|
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(). |