1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11 
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16 
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #ifndef BURIED_MESSAGE_H
24 #define BURIED_MESSAGE_H
25 
26 #include "common/keyboard.h"
27 #include "common/rect.h"
28 
29 namespace Buried {
30 
31 // This is all based on the Windows messaging system
32 // ...but less stupid
33 
34 class Window;
35 
36 enum MessageType {
37 	// Actual message types
38 	kMessageTypeKeyUp,
39 	kMessageTypeKeyDown,
40 	kMessageTypeTimer,
41 	kMessageTypeMouseMove,
42 	kMessageTypeLButtonUp,
43 	kMessageTypeLButtonDown,
44 	kMessageTypeMButtonUp,
45 	kMessageTypeRButtonUp,
46 	kMessageTypeRButtonDown,
47 	kMessageTypeSetCursor,
48 	kMessageTypeEnable,
49 
50 	// Ranges of messages
51 	kMessageTypeMouseBegin = kMessageTypeMouseMove,
52 	kMessageTypeMouseEnd = kMessageTypeRButtonDown,
53 	kMessageTypeKeyBegin = kMessageTypeKeyUp,
54 	kMessageTypeKeyEnd = kMessageTypeKeyDown
55 };
56 
57 
58 class Message {
59 public:
~Message()60 	virtual ~Message() {}
61 
62 	virtual MessageType getMessageType() const = 0;
63 };
64 
65 // Templated version to make stuff a bit neater
66 template <MessageType type>
67 class MessageTypeIntern : public Message {
68 public:
getMessageType()69 	MessageType getMessageType() const { return type; }
70 };
71 
72 // Some common template classes
73 template <MessageType type>
74 class MouseMessage : public MessageTypeIntern<type> {
75 public:
MouseMessage(const Common::Point & point,uint flags)76 	MouseMessage(const Common::Point &point, uint flags) : _point(point), _flags(flags) {}
77 
getPoint()78 	Common::Point getPoint() const { return _point; }
getFlags()79 	uint getFlags() const { return _flags; }
80 
81 private:
82 	Common::Point _point;
83 	uint _flags;
84 };
85 
86 template <MessageType type>
87 class KeyMessage : public MessageTypeIntern<type> {
88 public:
KeyMessage(const Common::KeyState & keyState,uint flags)89 	KeyMessage(const Common::KeyState &keyState, uint flags) : _keyState(keyState), _flags(flags) {}
90 
getKeyState()91 	Common::KeyState getKeyState() const { return _keyState; }
getFlags()92 	uint getFlags() const { return _flags; }
93 
94 private:
95 	Common::KeyState _keyState;
96 	uint _flags;
97 };
98 
99 // Types for everything that falls under one of the above categories
100 typedef KeyMessage<kMessageTypeKeyUp>                  KeyUpMessage;
101 typedef KeyMessage<kMessageTypeKeyDown>                KeyDownMessage;
102 typedef MouseMessage<kMessageTypeMouseMove>            MouseMoveMessage;
103 typedef MouseMessage<kMessageTypeLButtonUp>            LButtonUpMessage;
104 typedef MouseMessage<kMessageTypeLButtonDown>          LButtonDownMessage;
105 typedef MouseMessage<kMessageTypeMButtonUp>            MButtonUpMessage;
106 typedef MouseMessage<kMessageTypeRButtonUp>            RButtonUpMessage;
107 typedef MouseMessage<kMessageTypeRButtonDown>          RButtonDownMessage;
108 
109 // ...and the rest
110 class SetCursorMessage : public MessageTypeIntern<kMessageTypeSetCursor> {
111 public:
112 	// Hit-test is purposely skipped
SetCursorMessage(uint message)113 	SetCursorMessage(uint message) : _message(message) {}
114 
getMessage()115 	uint getMessage() const { return _message; }
116 
117 private:
118 	uint _message;
119 };
120 
121 class TimerMessage : public MessageTypeIntern<kMessageTypeTimer> {
122 public:
TimerMessage(uint timer)123 	TimerMessage(uint timer) : _timer(timer) {}
124 
getTimer()125 	uint getTimer() const { return _timer; }
126 
127 private:
128 	uint _timer;
129 };
130 
131 class EnableMessage : public MessageTypeIntern<kMessageTypeEnable> {
132 public:
EnableMessage(bool enable)133 	EnableMessage(bool enable) : _enable(enable) {}
134 
getEnable()135 	bool getEnable() const { return _enable; }
136 
137 private:
138 	bool _enable;
139 };
140 
141 } // End of namespace Buried
142 
143 #endif
144