ocpicker.h
Go to the documentation of this file.00001 #ifndef ocpicker_h
00002 #define ocpicker_h
00003
00004 #include <InterViews/input.h>
00005 #include <InterViews/event.h>
00006 #include <InterViews/handler.h>
00007 #include "rubband.h"
00008
00009 class HandlerList;
00010 class Canvas;
00011 class Allocation;
00012 class Hit;
00013
00014
00015
00016 class StandardPicker {
00017 public:
00018 StandardPicker();
00019 virtual ~StandardPicker();
00020
00021 virtual boolean pick(Canvas*, Glyph*, int depth, Hit& h);
00022
00023 void bind_select(Rubberband* rb) {bind_press(Event::left, rb);}
00024 void bind_adjust(Rubberband* rb) {bind_press(Event::middle, rb);}
00025 void bind_menu(Rubberband* rb) {bind_press(Event::right, rb);}
00026 void bind_press(EventButton eb, Rubberband*);
00027
00028 void bind_select(OcHandler* h) {bind_press(Event::left, h);}
00029 void bind_adjust(OcHandler* h) {bind_press(Event::middle, h);}
00030 void bind_menu(OcHandler* h) {bind_press(Event::right, h);}
00031
00032 void bind_move(OcHandler* h) {bind(0, 0, h);}
00033 void bind_press(EventButton eb, OcHandler* h) {bind(1, eb, h);}
00034 void bind_drag(EventButton eb, OcHandler* h) {bind(2, eb, h);}
00035 void bind_release(EventButton eb, OcHandler* h) {bind(3, eb, h);}
00036 void bind(int, EventButton eb, OcHandler* h);
00037
00038 void unbind(int, EventButton);
00039 void remove_all(EventButton);
00040 private:
00041 void event(const Event&);
00042 private:
00043 typedef int State;
00044 enum {motion, press, drag, release, unknown};
00045 State ms_;
00046 EventButton mb_;
00047 HandlerList* handlers_[unknown];
00048 };
00049
00050
00051
00052
00053
00054
00055 #if defined(__STDC__) || defined(__ANSI_CPP__)
00056 #define __HandlerCallback(T) T##_HandlerCallback
00057 #define HandlerCallback(T) __HandlerCallback(T)
00058 #define __HandlerMemberFunction(T) T##_HandlerMemberFunction
00059 #define HandlerMemberFunction(T) __HandlerMemberFunction(T)
00060 #else
00061 #define __HandlerCallback(T) T_HandlerCallback
00062 #define HandlerCallback(T) __HandlerCallback(T)
00063 #define __HandlerMemberFunction(T) T_HandlerMemberFunction
00064 #define HandlerMemberFunction(T) __HandlerMemberFunction(T)
00065 #endif
00066
00067 #define declareHandlerCallback(T) \
00068 typedef boolean (T::*HandlerMemberFunction(T))(Event&); \
00069 class HandlerCallback(T) : public Handler { \
00070 public: \
00071 HandlerCallback(T)(T*, HandlerMemberFunction(T)); \
00072 virtual ~HandlerCallback(T)(); \
00073 \
00074 virtual boolean event(Event&); \
00075 private: \
00076 T* obj_; \
00077 HandlerMemberFunction(T) func_; \
00078 };
00079
00080 #define implementHandlerCallback(T) \
00081 HandlerCallback(T)::HandlerCallback(T)( \
00082 T* obj, HandlerMemberFunction(T) func \
00083 ) { \
00084 obj_ = obj; \
00085 func_ = func; \
00086 } \
00087 \
00088 HandlerCallback(T)::~HandlerCallback(T)() { } \
00089 \
00090 boolean HandlerCallback(T)::event(Event& e) { \
00091 return (obj_->*func_)(e); \
00092 }
00093
00094 #endif