00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef CINPUTFILTER_H
00020 #define CINPUTFILTER_H
00021
00022 #include "KeyTypes.h"
00023 #include "MouseTypes.h"
00024 #include "ProtocolTypes.h"
00025 #include "IPlatformScreen.h"
00026 #include "CString.h"
00027 #include "stdmap.h"
00028 #include "stdset.h"
00029
00030 class CPrimaryClient;
00031 class CEvent;
00032
00033 class CInputFilter {
00034 public:
00035
00036
00037
00038 enum EFilterStatus {
00039 kNoMatch,
00040 kActivate,
00041 kDeactivate
00042 };
00043
00044 class CCondition {
00045 public:
00046 CCondition();
00047 virtual ~CCondition();
00048
00049 virtual CCondition* clone() const = 0;
00050 virtual CString format() const = 0;
00051
00052 virtual EFilterStatus match(const CEvent&) = 0;
00053
00054 virtual void enablePrimary(CPrimaryClient*);
00055 virtual void disablePrimary(CPrimaryClient*);
00056 };
00057
00058
00059 class CKeystrokeCondition : public CCondition {
00060 public:
00061 CKeystrokeCondition(IPlatformScreen::CKeyInfo*);
00062 CKeystrokeCondition(KeyID key, KeyModifierMask mask);
00063 virtual ~CKeystrokeCondition();
00064
00065 KeyID getKey() const;
00066 KeyModifierMask getMask() const;
00067
00068
00069 virtual CCondition* clone() const;
00070 virtual CString format() const;
00071 virtual EFilterStatus match(const CEvent&);
00072 virtual void enablePrimary(CPrimaryClient*);
00073 virtual void disablePrimary(CPrimaryClient*);
00074
00075 private:
00076 UInt32 m_id;
00077 KeyID m_key;
00078 KeyModifierMask m_mask;
00079 };
00080
00081
00082 class CMouseButtonCondition : public CCondition {
00083 public:
00084 CMouseButtonCondition(IPlatformScreen::CButtonInfo*);
00085 CMouseButtonCondition(ButtonID, KeyModifierMask mask);
00086 virtual ~CMouseButtonCondition();
00087
00088 ButtonID getButton() const;
00089 KeyModifierMask getMask() const;
00090
00091
00092 virtual CCondition* clone() const;
00093 virtual CString format() const;
00094 virtual EFilterStatus match(const CEvent&);
00095
00096 private:
00097 ButtonID m_button;
00098 KeyModifierMask m_mask;
00099 };
00100
00101
00102 class CScreenConnectedCondition : public CCondition {
00103 public:
00104 CScreenConnectedCondition(const CString& screen);
00105 virtual ~CScreenConnectedCondition();
00106
00107
00108 virtual CCondition* clone() const;
00109 virtual CString format() const;
00110 virtual EFilterStatus match(const CEvent&);
00111
00112 private:
00113 CString m_screen;
00114 };
00115
00116
00117
00118
00119
00120 class CAction {
00121 public:
00122 CAction();
00123 virtual ~CAction();
00124
00125 virtual CAction* clone() const = 0;
00126 virtual CString format() const = 0;
00127
00128 virtual void perform(const CEvent&) = 0;
00129 };
00130
00131
00132 class CLockCursorToScreenAction : public CAction {
00133 public:
00134 enum Mode { kOff, kOn, kToggle };
00135
00136 CLockCursorToScreenAction(Mode = kToggle);
00137
00138 Mode getMode() const;
00139
00140
00141 virtual CAction* clone() const;
00142 virtual CString format() const;
00143 virtual void perform(const CEvent&);
00144
00145 private:
00146 Mode m_mode;
00147 };
00148
00149
00150 class CSwitchToScreenAction : public CAction {
00151 public:
00152 CSwitchToScreenAction(const CString& screen);
00153
00154 CString getScreen() const;
00155
00156
00157 virtual CAction* clone() const;
00158 virtual CString format() const;
00159 virtual void perform(const CEvent&);
00160
00161 private:
00162 CString m_screen;
00163 };
00164
00165
00166 class CSwitchInDirectionAction : public CAction {
00167 public:
00168 CSwitchInDirectionAction(EDirection);
00169
00170 EDirection getDirection() const;
00171
00172
00173 virtual CAction* clone() const;
00174 virtual CString format() const;
00175 virtual void perform(const CEvent&);
00176
00177 private:
00178 EDirection m_direction;
00179 };
00180
00181
00182 class CKeyboardBroadcastAction : public CAction {
00183 public:
00184 enum Mode { kOff, kOn, kToggle };
00185
00186 CKeyboardBroadcastAction(Mode = kToggle);
00187 CKeyboardBroadcastAction(Mode, const std::set<CString>& screens);
00188
00189 Mode getMode() const;
00190 std::set<CString> getScreens() const;
00191
00192
00193 virtual CAction* clone() const;
00194 virtual CString format() const;
00195 virtual void perform(const CEvent&);
00196
00197 private:
00198 Mode m_mode;
00199 CString m_screens;
00200 };
00201
00202
00203 class CKeystrokeAction : public CAction {
00204 public:
00205 CKeystrokeAction(IPlatformScreen::CKeyInfo* adoptedInfo, bool press);
00206 ~CKeystrokeAction();
00207
00208 void adoptInfo(IPlatformScreen::CKeyInfo*);
00209 const IPlatformScreen::CKeyInfo*
00210 getInfo() const;
00211 bool isOnPress() const;
00212
00213
00214 virtual CAction* clone() const;
00215 virtual CString format() const;
00216 virtual void perform(const CEvent&);
00217
00218 protected:
00219 virtual const char* formatName() const;
00220
00221 private:
00222 IPlatformScreen::CKeyInfo* m_keyInfo;
00223 bool m_press;
00224 };
00225
00226
00227 class CMouseButtonAction : public CAction {
00228 public:
00229 CMouseButtonAction(IPlatformScreen::CButtonInfo* adoptedInfo,
00230 bool press);
00231 ~CMouseButtonAction();
00232
00233 const IPlatformScreen::CButtonInfo*
00234 getInfo() const;
00235 bool isOnPress() const;
00236
00237
00238 virtual CAction* clone() const;
00239 virtual CString format() const;
00240 virtual void perform(const CEvent&);
00241
00242 protected:
00243 virtual const char* formatName() const;
00244
00245 private:
00246 IPlatformScreen::CButtonInfo* m_buttonInfo;
00247 bool m_press;
00248 };
00249
00250 class CRule {
00251 public:
00252 CRule();
00253 CRule(CCondition* adopted);
00254 CRule(const CRule&);
00255 ~CRule();
00256
00257 CRule& operator=(const CRule&);
00258
00259
00260 void setCondition(CCondition* adopted);
00261
00262
00263 void adoptAction(CAction*, bool onActivation);
00264
00265
00266 void removeAction(bool onActivation, UInt32 index);
00267
00268
00269 void replaceAction(CAction* adopted,
00270 bool onActivation, UInt32 index);
00271
00272
00273 void enable(CPrimaryClient*);
00274 void disable(CPrimaryClient*);
00275
00276
00277 bool handleEvent(const CEvent&);
00278
00279
00280 CString format() const;
00281
00282
00283 const CCondition*
00284 getCondition() const;
00285
00286
00287 UInt32 getNumActions(bool onActivation) const;
00288
00289
00290 const CAction& getAction(bool onActivation, UInt32 index) const;
00291
00292 private:
00293 void clear();
00294 void copy(const CRule&);
00295
00296 private:
00297 typedef std::vector<CAction*> CActionList;
00298
00299 CCondition* m_condition;
00300 CActionList m_activateActions;
00301 CActionList m_deactivateActions;
00302 };
00303
00304
00305
00306
00307 typedef std::vector<CRule> CRuleList;
00308
00309 CInputFilter();
00310 CInputFilter(const CInputFilter&);
00311 virtual ~CInputFilter();
00312
00313 CInputFilter& operator=(const CInputFilter&);
00314
00315
00316 void addFilterRule(const CRule& rule);
00317
00318
00319 void removeFilterRule(UInt32 index);
00320
00321
00322 CRule& getRule(UInt32 index);
00323
00324
00325
00326 void setPrimaryClient(CPrimaryClient* client);
00327
00328
00329 CString format(const CString& linePrefix) const;
00330
00331
00332 UInt32 getNumRules() const;
00333
00335 bool operator==(const CInputFilter&) const;
00337 bool operator!=(const CInputFilter&) const;
00338
00339 private:
00340
00341 void handleEvent(const CEvent&, void*);
00342
00343 private:
00344 CRuleList m_ruleList;
00345 CPrimaryClient* m_primaryClient;
00346 };
00347
00348 #endif