00001 #include "SdlArs.h" 00002 00003 namespace Ars 00004 { 00005 00006 Form::~Form( void ) 00007 { 00008 for( vector<Window *>::iterator it = begin() ; it != end() ; ++it ) 00009 { 00010 if( (*it)->GetParent() == 0 ) 00011 delete *it; 00012 } 00013 clear(); 00014 } 00015 00016 Window *Form::FindWindowParent( const XRect &r ) 00017 { 00018 Window *ans = 0; 00019 00020 for( vector<Window *>::iterator it = begin() ; it != end() ; ++it ) 00021 { 00022 if( (*it)->x == r.x && (*it)->y == r.y && (*it)->Bottom() == r.Bottom() && (*it)->Right() == r.Right() ) 00023 continue; 00024 if( r.x >= (*it)->x && r.Right() <= (*it)->Right() && r.y >= (*it)->y && r.Bottom() <= (*it)->Bottom() ) 00025 if( ans == 0 || 00026 ((*it)->x >= ans->GetWindowRect().x && (*it)->Right() <= ans->GetWindowRect().Right() && (*it)->y >= ans->GetWindowRect().y && (*it)->Bottom() <= ans->GetWindowRect().Bottom()) ) 00027 ans = (*it); 00028 } 00029 00030 return ans; 00031 } 00032 00033 Window *Form::GetArsObject( const int obId ) 00034 { 00035 for( vector<Window *>::iterator it = begin() ; it != end() ; ++it ) 00036 if( (*it)->GetId() == obId ) 00037 return (*it); 00038 00039 return 0; 00040 } 00041 00042 void Form::Draw( void ) 00043 { 00044 for( vector<Window *>::iterator it = begin() ; it != end() ; ++it ) 00045 (*it)->ResetFlags( F_HIDETREE ); 00046 00047 if( !empty() ) 00048 ArsSendMessage( Message( Message::APP_PAINT , *begin() ) ); 00049 } 00050 00051 void Form::InitDialog( Window *This ) 00052 { 00053 while( !MessageServer::Instance().empty() ) 00054 MessageServer::Instance().ProcessMessage(); 00055 00056 for( vector<Window *>::iterator it = begin() ; it != end() ; ++it ) 00057 { 00058 ArsSendMessage( Message( Message::SETUP_WINDOW , (*it) ) ); 00059 (*it)->SetFlags( F_HIDETREE ); 00060 if( (*it)->GetParent() == 0 ) 00061 { 00062 Window *w = FindWindowParent( (*it)->GetWindowRect() ); 00063 if( w == 0 || w == (*it) ) 00064 (*it)->SetParent( This ); 00065 else 00066 (*it)->SetParent( w ); 00067 } 00068 } 00069 00070 while( !MessageServer::Instance().empty() ) 00071 MessageServer::Instance().ProcessMessage(); 00072 } 00073 00074 void Form::ShutdownDialog( Window *This ) 00075 { 00076 while( !MessageServer::Instance().empty() ) 00077 MessageServer::Instance().ProcessMessage(); 00078 00079 (*begin())->SetParent( 0 ); 00080 00081 while( !MessageServer::Instance().empty() ) 00082 MessageServer::Instance().ProcessMessage(); 00083 00084 This->SetDirty(); 00085 ArsSendMessage( Message( Message::APP_PAINT , This ) ); 00086 } 00087 00088 void Form::DoDialog( const int aWait ) 00089 { 00090 SDL_Event event; 00091 if( ArsApplication::GetInstance()->IsRunning() ) 00092 { 00093 while( SDL_PollEvent( &event ) ) 00094 ArsApplication::GetInstance()->HandleSDLEvent( event ); 00095 00096 while( !MessageServer::Instance().empty() ) 00097 ProcessMessage(); 00098 00099 if( aWait ) 00100 SDL_Delay( aWait ); 00101 } 00102 } 00103 00104 void Form::ProcessMessage( void ) 00105 { 00106 if( !MessageServer::Instance().empty() ) 00107 { 00108 Message *msg2 = MessageServer::Instance().front(); 00109 Message &msg = *msg2; 00110 MessageServer::Instance().pop_front(); 00111 std::map<Message::EMessageType,std::vector< std::pair<MessageClient *, bool> > >::iterator at = MessageServer::Instance().messageClients.find( msg.MessageType() ); 00113 if( at != MessageServer::Instance().messageClients.end() ) 00114 { 00115 if( msg.Destination() == 0 ) 00116 { 00117 bool ans = false; 00118 std::vector< std::pair<MessageClient *, bool> > tmp = at->second; 00119 for( std::vector< std::pair<MessageClient *, bool> >::iterator it = tmp.begin() ; it != tmp.end() ; ++it ) 00120 { 00121 if( it->second ) 00122 { 00123 Window *wnd = *begin(); 00124 Window *tgt = 0; 00125 XToolTip *tt = 0; 00126 try{ 00127 tgt = dynamic_cast<Window *>( it->first ); 00128 tt = dynamic_cast<XToolTip *>( it->first ); 00129 }catch( ... ) 00130 { 00131 tgt = 0; tt = 0; 00132 MessageServer::Instance().DeregisterMessageClient( it->first ); 00133 } 00134 if( wnd->IsChild( tgt ) || tt != 0 ) 00135 if( it->first->HandleMessage( msg ) ) 00136 ans = true; 00137 } 00138 } 00139 } 00140 else 00141 HandleTillRoot( msg ); 00142 } 00143 delete msg2; 00144 } 00145 00146 for( std::map<Message::EMessageType,std::vector< std::pair<MessageClient *, bool> > >::iterator at = MessageServer::Instance().messageClients.begin() ; at != MessageServer::Instance().messageClients.end() ; ++at ) 00147 for( std::vector< std::pair<MessageClient *, bool> >::iterator it = at->second.begin() ; it != at->second.end() ; ) 00148 if( !it->second ) 00149 { 00150 at->second.erase( it ); 00151 it = at->second.begin(); 00152 } 00153 else 00154 ++it; 00155 } 00156 00157 void Form::HandleTillRoot( Message &msg ) 00158 { 00159 bool stopLoop = false; 00160 00161 while( !stopLoop ) 00162 { 00163 if( MessageServer::Instance().IsRegistered( msg.MessageType() , msg.Destination() ) && (*begin())->IsChild( dynamic_cast<Window *>( msg.Destination() ) ) ) 00164 stopLoop = msg.Destination()->HandleMessage( msg ); 00165 00166 if( !stopLoop ) 00167 { 00168 Window *wnd = dynamic_cast<Window *>( msg.Destination() ); 00169 00170 if( wnd && wnd->GetParent() ) 00171 msg.SetTarget( wnd->GetParent() ); 00172 else 00173 stopLoop = true; 00174 } 00175 } 00176 } 00177 00178 00179 } 00180