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