00001 #if !defined( __ARSMESSAGES_H__ )
00002 #define __ARSMESSAGES_H__
00003
00004 namespace Ars
00005 {
00006
00007 class MessageClient;
00008
00009 class Message {
00010 public:
00011
00012 enum EMessageType
00013 {
00014 UNKNOWN = 0,
00015 KEYBOARD_KEYDOWN = 1,
00016 KEYBOARD_KEYUP = 2,
00017 MOUSE_BUTTONDOWN = 3,
00018 MOUSE_BUTTONUP = 4,
00019 MOUSE_MOVE = 5,
00020 CTRL_LCLICK = 7,
00021 CTRL_RCLICK = 8,
00022 CTRL_MCLICK = 9,
00023 CTRL_VALUECHANGE = 10,
00024 CTRL_VALUECHANGING = 11,
00025 CTRL_RESIZE = 12,
00026 CTRL_TIMER = 13,
00027 APP_PAINT = 14,
00028 APP_EXIT = 15,
00029 SETUP_WINDOW = 16,
00030 LOST_FOCUS = 17 ,
00031 SET_FOCUS = 18 ,
00032 DEREG_CHILD = 19 ,
00033 PLAY_MPEG = 20 ,
00034 USER = 200
00035 };
00036
00037 private:
00038
00040 const EMessageType messageType;
00041
00043 MessageClient *destination;
00044
00045 public:
00046
00047 void *from;
00048 unsigned int line;
00049 std::string file;
00050
00054 Message( const EMessageType MessageType , MessageClient *pdestination = 0 )
00055 : messageType( MessageType ) , destination( pdestination ) {}
00056
00058 virtual ~Message( void ) {}
00059
00061 const EMessageType MessageType( void ) const { return messageType; }
00062
00064 MessageClient *Destination( void ) const { return destination; }
00065
00066 void SetTarget( MessageClient *dest ) { destination = dest; }
00067 };
00068
00069 class KeyboardMessage : public Message {
00070 private:
00071
00072 public:
00080 KeyboardMessage( const EMessageType MessageType, MessageClient *pDestination, const unsigned char ScanCode, const SDLMod Modifiers, const SDLKey Key, const Uint16 Unicode)
00081 : Message( MessageType , pDestination ) , ScanCode(ScanCode), Modifiers(Modifiers), Key(Key), Unicode(Unicode)
00082 {}
00083
00084 const unsigned char ScanCode;
00085 const SDLMod Modifiers;
00086 const SDLKey Key;
00087 const Uint16 Unicode;
00088 };
00089
00090
00092 class MouseMessage : public Message {
00093 public:
00095 enum EMouseButton
00096 {
00097 NONE = 0,
00098 LEFT = 1,
00099 RIGHT = 2,
00100 MIDDLE = 4
00101 };
00102
00109 MouseMessage( const EMessageType MessageType, MessageClient* pDestination, const XPoint &Point, const XPoint &Relative, const unsigned int Button)
00110 : Message( MessageType , pDestination ) , Point(Point), Relative(Relative), Button(Button)
00111 {}
00112
00113
00115 static unsigned int TranslateSDLButton(Uint8 SDLButton);
00116
00118 static unsigned int TranslateSDLButtonState(Uint8 SDLButtonState);
00119
00120 const XPoint Point;
00121 const XPoint Relative;
00122 const unsigned int Button;
00123 };
00124
00125
00127 class CtrlMessage : public Message {
00128 public:
00134 CtrlMessage( const EMessageType MessageType, MessageClient* pDestination, const void* pSource, const long int aValue = 0 )
00135 : Message( MessageType , pDestination ) , source( pSource ) , value( aValue )
00136 {}
00137
00139 const void *source;
00140
00142 const long int value;
00143 };
00144
00145
00147
00148 class ResizeMessage : public CtrlMessage {
00149 public:
00155 ResizeMessage( const EMessageType MessageType, MessageClient* pDestination, const void* pSource, const XPoint& NewSize)
00156 : CtrlMessage( MessageType , pDestination , pSource ) , size( NewSize )
00157 {}
00158
00159
00161 const XPoint size;
00162 };
00163
00164
00166 class UserMessage : public Message {
00167 private:
00169 const unsigned long int subMessage;
00170
00172 const void *data;
00173
00174 public:
00180 UserMessage( const EMessageType MessageType , MessageClient* pDestination , const unsigned long int aSubMessage , const void *pData = 0 )
00181 : Message( MessageType , pDestination ) , subMessage( aSubMessage ) , data( pData )
00182 {}
00183
00184 const unsigned long int SubMessage( void ) const { return subMessage; }
00185
00186 const void *Data( void ) const { return data; }
00187 };
00188
00189 class MessageClient {
00190 public:
00192 MessageClient( void );
00193
00195 virtual ~MessageClient( void );
00196
00201 virtual const bool HandleMessage( const Message &msg );
00202
00203 virtual const bool IsVisible( void ) const { return true; };
00204
00205 virtual const bool evKeyDown( const KeyboardMessage &msg ) { return false; }
00206 virtual const bool evKeyUp( const KeyboardMessage &msg ) { return false; }
00207 virtual const bool evMouseButtonDown( const MouseMessage &msg ) { return false; }
00208 virtual const bool evMouseButtonUp( const MouseMessage &msg ) { return false; }
00209 virtual const bool evMouseMove( const MouseMessage &msg ) { return false; }
00210 virtual const bool evMouseLClick( const CtrlMessage &msg ) { return false; }
00211 virtual const bool evMouseMClick( const CtrlMessage &msg ) { return false; }
00212 virtual const bool evMouseRClick( const CtrlMessage &msg ) { return false; }
00213 virtual const bool evValueChange( const CtrlMessage &msg ) { return false; }
00214 virtual const bool evValueChanging( const CtrlMessage &msg ) { return false; }
00215 virtual const bool evTimer( const CtrlMessage &msg ) { return false; }
00216 virtual const bool wmResize( const ResizeMessage &msg ) { return false; }
00217 virtual const bool wmSetFocus( const Message &msg ) { return false; }
00218 virtual const bool wmLostFocus( const CtrlMessage &msg ) { return false; }
00219 virtual const bool wmPaint( const Message &msg ) { return false; }
00220 virtual const bool SetupWindow( const Message &msg ) { return false; }
00221 virtual const bool wmExit( const Message &msg ) { return false; }
00222 virtual const bool DeregChild( const CtrlMessage &msg ) { return false; }
00226 virtual const bool evPlayMpeg( const CtrlMessage &msg ) { return false; }
00227 virtual const bool evMessage( const UserMessage &msg ) { return false; }
00228 };
00229
00231
00232
00234
00235
00237
00241
00242 class MessageServer : public std::deque<Message *> {
00243 protected:
00244
00245 friend class Form;
00246
00247 static MessageServer *instance;
00248 std::map< Message::EMessageType , std::vector< std::pair<MessageClient *, bool> > > messageClients;
00249
00251 MessageServer(void);
00252
00253 public:
00254
00255 virtual ~MessageServer(void);
00256
00258 static MessageServer& Instance( void );
00259
00264 void RegisterMessageClient( MessageClient* pClient, const Message::EMessageType eMessageType );
00265
00269 void DeregisterMessageClient( MessageClient* pClient, const Message::EMessageType eMessageType );
00270
00273 void DeregisterMessageClient( MessageClient* pClient );
00274
00276 void ProcessMessage( void );
00277
00280 void QueueMessage( Message *msg , const int aLine , const std::string aFile , void *aFrom );
00281
00283 void LaunchMessage( Message *msg);
00284
00285 const bool IsRegistered( const Message::EMessageType &type , const MessageClient *target );
00286
00287 private:
00288
00289 void HandleTillRoot( Message &msg );
00290 };
00291
00292 #define ArsPostMessage( a ) MessageServer::Instance().QueueMessage( new a , __LINE__ , __FILE__ , this )
00293 #define ArsSendMessage( a ) MessageServer::Instance().LaunchMessage( new a )
00294
00295 }
00296
00297 #endif