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 }