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

arsmessage.cpp

Go to the documentation of this file.
00001 #include "SdlArs.h"
00002 
00003 namespace Ars
00004 {
00005 
00006 unsigned int MouseMessage::TranslateSDLButton(Uint8 SDLButton)
00007 {
00008         unsigned int Button = 0;
00009         switch (SDLButton)
00010         {
00011                 case SDL_BUTTON_LEFT:
00012                         Button = LEFT;
00013                         break;
00014                 case SDL_BUTTON_RIGHT:
00015                         Button = RIGHT;
00016                         break;
00017                 case SDL_BUTTON_MIDDLE:
00018                         Button = MIDDLE;
00019                         break;
00020         }
00021 
00022         return Button;
00023 }
00024 
00025 
00026 unsigned int MouseMessage::TranslateSDLButtonState(Uint8 SDLButtonState)
00027 {
00028         unsigned int Button = 0;
00029         if (SDLButtonState & SDL_BUTTON(1))
00030                 Button |= LEFT;
00031         if (SDLButtonState & SDL_BUTTON(2))
00032                 Button |= RIGHT;
00033         if (SDLButtonState & SDL_BUTTON(3))
00034                 Button |= MIDDLE;
00035 
00036         return Button;
00037 }
00038 
00040 MessageClient::MessageClient( void )
00041 {
00042         MessageServer::Instance().RegisterMessageClient( this , Message::DEREG_CHILD );
00043 }
00044 
00045 MessageClient::~MessageClient( void )
00046 {
00047         MessageServer::Instance().DeregisterMessageClient( this );
00048         MessageServer::Instance().DeregisterMessageClient( this , Message::DEREG_CHILD );
00049 }
00050 
00051 const bool MessageClient::HandleMessage( const Message &msg )
00052 {
00053         bool ans = false;
00054 
00055         switch( msg.MessageType() )
00056         {
00057                 case Message::KEYBOARD_KEYDOWN :  
00058                         if( IsVisible() )       ans = evKeyDown( dynamic_cast<const KeyboardMessage &>( msg ) );        break;
00059                 case Message::KEYBOARD_KEYUP :  
00060                         if( IsVisible() )       ans = evKeyUp( dynamic_cast<const KeyboardMessage &>( msg ) );  break;
00061                 
00062                 case Message::MOUSE_BUTTONDOWN :  
00063                         if( IsVisible() )       ans = evMouseButtonDown( dynamic_cast<const MouseMessage &>( msg ) );   break;
00064                 case Message::MOUSE_BUTTONUP :  
00065                         if( IsVisible() )       ans = evMouseButtonUp( dynamic_cast<const MouseMessage &>( msg ) );     break;
00066                 case Message::MOUSE_MOVE :  
00067                         ans = evMouseMove( dynamic_cast<const MouseMessage &>( msg ) ); break;
00068                 
00069                 case Message::CTRL_LCLICK :  
00070                         if( IsVisible() )       ans = evMouseLClick( dynamic_cast<const CtrlMessage &>( msg ) );        break;
00071                 case Message::CTRL_RCLICK :  
00072                         if( IsVisible() )       ans = evMouseMClick( dynamic_cast<const CtrlMessage &>( msg ) );        break;
00073                 case Message::CTRL_MCLICK :  
00074                         if( IsVisible() )       ans = evMouseRClick( dynamic_cast<const CtrlMessage &>( msg ) );        break;
00075                 
00076                 case Message::CTRL_VALUECHANGE :  
00077                         ans = evValueChange( dynamic_cast<const CtrlMessage &>( msg ) );        break;
00078                 case Message::CTRL_VALUECHANGING :  
00079                         ans = evValueChanging( dynamic_cast<const CtrlMessage &>( msg ) );      break;
00080                 case Message::CTRL_TIMER :      
00081                         ans = evTimer( dynamic_cast<const CtrlMessage &>( msg ) );      break;
00082 
00083                 case Message::CTRL_RESIZE :  
00084                         ans = wmResize( dynamic_cast<const ResizeMessage &>( msg ) );   break;
00085 
00086                 case Message::DEREG_CHILD :  
00087                         ans = DeregChild( dynamic_cast<const CtrlMessage &>( msg ) );   break;
00088                 case Message::APP_PAINT :  
00089                         ans = wmPaint( msg );   break;
00090                 case Message::LOST_FOCUS :  
00091                         ans = wmLostFocus( dynamic_cast<const CtrlMessage &>( msg ) );  break;
00092                 case Message::SET_FOCUS :  
00093                         if( IsVisible() )       ans = wmSetFocus( msg );        break;
00094                 
00095                 case Message::SETUP_WINDOW : 
00096                         ans = SetupWindow( msg );       break;
00097                 case Message::APP_EXIT :  
00098                         ans = wmExit( msg );    break;
00099                 
00100                 case Message::PLAY_MPEG :  
00101                         ans = evPlayMpeg( dynamic_cast<const CtrlMessage &>( msg ) );   break;
00102 
00103                 case Message::USER :  
00104                         ans = evMessage( dynamic_cast<const UserMessage &>( msg ) );    break;
00105         }
00106 
00107         return ans;
00108 }
00109 
00111 MessageServer* MessageServer::instance = 0;
00112 
00113 MessageServer::MessageServer( void )
00114 {
00115 }
00116 
00117 
00118 MessageServer::~MessageServer( void )
00119 {
00120         while( !empty() )
00121         {
00122                 delete front();
00123                 pop_front();
00124         }
00125         messageClients.clear();
00126         clear();
00127 }
00128 
00129 
00130 MessageServer& MessageServer::Instance(void)
00131 {
00132         if( !instance )
00133                 instance = new MessageServer;
00134 
00135         return *instance;
00136 }
00137 
00138 
00139 void MessageServer::RegisterMessageClient( MessageClient *pClient , const Message::EMessageType eMessageType )
00140 {
00141         std::map<Message::EMessageType,std::vector< std::pair<MessageClient *, bool> > >::iterator at = messageClients.find( eMessageType );
00142         if( at == messageClients.end() )
00143         {
00144                 std::vector< std::pair<MessageClient *, bool> > tmp;
00145                 at = messageClients.insert( std::make_pair( eMessageType , tmp ) ).first;
00146         }
00147         at->second.push_back( std::make_pair( pClient , true ) );
00148 }
00149 
00150 
00151 void MessageServer::DeregisterMessageClient( MessageClient* pClient, const Message::EMessageType eMessageType )
00152 {
00153         std::map<Message::EMessageType,std::vector< std::pair<MessageClient *, bool> > >::iterator at = messageClients.find( eMessageType );
00154         if( at != messageClients.end() )
00155         {
00156                 for( std::vector< std::pair<MessageClient *, bool> >::iterator it = at->second.begin() ; it != at->second.end() ; ++it )
00157                         if( it->first == pClient )
00158                         {
00159                                 it->second = false;
00160                                 break;
00161                         }
00162         }
00163 }
00164 
00165 void MessageServer::DeregisterMessageClient( MessageClient* pClient )
00166 {
00167         for( std::map<Message::EMessageType,std::vector< std::pair<MessageClient *, bool> > >::iterator it = messageClients.begin() ; it != messageClients.end() ; ++it )
00168                 if( it->first != Message::DEREG_CHILD )
00169                         DeregisterMessageClient( pClient , it->first );
00170 }
00171 
00172 void MessageServer::ProcessMessage( void )
00173 {
00174         if( !empty() )
00175         {
00176                 Message *msg2 = front();
00177                 Message &msg = *msg2;
00178                 pop_front();
00179                 std::map<Message::EMessageType,std::vector< std::pair<MessageClient *, bool> > >::iterator at = messageClients.find( msg.MessageType() );
00181                 if( at != messageClients.end() )
00182                 {
00183                         if( msg.Destination() == 0 )
00184                         {
00185                                 std::vector< std::pair<MessageClient *, bool> > tmp = at->second;
00186                                 for( std::vector< std::pair<MessageClient *, bool> >::iterator it = tmp.begin() ; it != tmp.end() ; ++it )
00187                                         if( it->second && it->first->HandleMessage( msg ) )
00188                                                 break;
00189                         }
00190                         else 
00191                                 HandleTillRoot( msg );
00192                 }
00193                 delete msg2;
00194         }
00195 
00196         for( std::map<Message::EMessageType,std::vector< std::pair<MessageClient *, bool> > >::iterator at = messageClients.begin() ; at != messageClients.end() ; ++at )
00197                 for( std::vector< std::pair<MessageClient *, bool> >::iterator it = at->second.begin() ; it != at->second.end() ; )
00198                         if( !it->second )
00199                         {
00200                                 at->second.erase( it );
00201                                 it = at->second.begin();
00202                         }
00203                         else
00204                                 ++it;
00205 }
00206 
00207 void MessageServer::HandleTillRoot( Message &msg )
00208 {
00209         bool stopLoop = false;
00210 
00211         while( !stopLoop )
00212         {
00213                 if( IsRegistered( msg.MessageType() , msg.Destination() ) )
00214                         stopLoop = msg.Destination()->HandleMessage( msg );
00215 
00216                 if( !stopLoop )
00217                 {
00218                         Window *wnd = dynamic_cast<Window *>( msg.Destination() );
00219 
00220                         if( wnd && wnd->GetParent() )
00221                                 msg.SetTarget( wnd->GetParent() );
00222                         else
00223                                 stopLoop = true;
00224                 }
00225         }
00226 }
00227 
00228 const bool MessageServer::IsRegistered( const Message::EMessageType &type , const MessageClient *target )
00229 {
00230         std::map<Message::EMessageType,std::vector< std::pair<MessageClient *, bool> > >::iterator at = messageClients.find( type );
00231         if( at != messageClients.end() )
00232                 for( std::vector< std::pair<MessageClient *, bool> >::iterator it = at->second.begin() ; it != at->second.end() ; ++it )
00233                         if( it->first == target )
00234                                 return it->second;
00235         return false;
00236 }
00237 
00238 void MessageServer::QueueMessage( Message *msg , const int aLine , const std::string aFile , void *aFrom )
00239 {
00240         msg->file = aFile;
00241         msg->line = aLine;
00242         msg->from = aFrom;
00243         push_back( msg );
00244 }
00245 
00246 void MessageServer::LaunchMessage( Message *msg )
00247 {
00248         if( msg->Destination() != 0 )
00249                 HandleTillRoot( *msg );
00250         else
00251         {
00252                 std::map<Message::EMessageType,std::vector< std::pair<MessageClient *, bool> > >::iterator at = messageClients.find( msg->MessageType() );
00253                 std::vector< std::pair<MessageClient *, bool> > tmp = at->second;
00254 
00255                 for( std::vector< std::pair<MessageClient *, bool> >::iterator it = tmp.begin() ; it != tmp.end() ; ++it )
00256                         if( it->second )
00257                                 it->first->HandleMessage( *msg );
00258         }
00259         delete msg;
00260 }
00261 
00262 }

Generated on Fri Dec 5 04:05:59 2003 for Borqueror by doxygen 1.3.3