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 }