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 /* steer to the right method in response to a mouse action */
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  * Handler denoted by an object and member function to call on the object.
00052  * Used the FieldEditorAction as a template
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
Generated on Mon Jun 13 08:10:24 2011 for NEURON by  doxygen 1.6.3