00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "mesh/bmesh.H"
00010 #include "mesh/base_ref_image.H"
00011 #include "std/config.H"
00012 #include "geom/winsys.H"
00013
00014 #include "pen.H"
00015
00016
00017
00018
00019 Pen::Pen(Cstr_ptr& pen_name,
00020 CGEST_INTptr &gest_int,
00021 CEvent &d, CEvent &m, CEvent &u,
00022 CEvent &shift_d, CEvent &shift_u,
00023 CEvent &ctrl_d, CEvent &ctrl_u) :
00024 Simple_int(d, m, u),
00025 _gest_int(gest_int),
00026 _pen_name(pen_name),
00027 _view(VIEW::peek()),
00028 _fsa(&_draw_start)
00029 {
00030 if (!(shift_d == Event())) {
00031 _shift_fsa = create_fsa(
00032 shift_d, m, shift_u,
00033 &Pen::erase_down, &Pen::erase_move, &Pen::erase_up);
00034 }
00035 if (!(ctrl_d == Event())) {
00036 _ctrl_fsa = create_fsa(ctrl_d, m, ctrl_u,
00037 &Pen::ctrl_down, &Pen::ctrl_move,
00038 &Pen::ctrl_up);
00039 }
00040
00041 _entry.set_name(str_ptr("Pen Entry - ") + pen_name);
00042 }
00043
00044
00045
00046
00047 State *
00048 Pen::create_fsa(
00049 CEvent &d,
00050 CEvent &m,
00051 CEvent &u,
00052 callback_meth_t down_cb,
00053 callback_meth_t move_cb,
00054 callback_meth_t up_cb
00055 )
00056 {
00057 State *beg_state = new State;
00058 State *mid_state = new State;
00059
00060
00061
00062
00063 *beg_state += Arc(d, Cb((_callb::_method) down_cb, mid_state ));
00064 *mid_state += Arc(m, Cb((_callb::_method) move_cb ));
00065 *mid_state += Arc(u, Cb((_callb::_method) up_cb, (State*)-1));
00066
00067 return beg_state;
00068 }
00069
00070 int
00071 Pen::check_interactive(CEvent &e, State *&s)
00072 {
00073 DEVice_buttons *btns=(DEVice_buttons *)e._d;
00074 DEVice_2d *ptr=btns->ptr2d();
00075 RAYhit r(ptr->cur());
00076
00077 return (e.view()->intersect(r).success() &&
00078 ray_geom(r,GEOM::null) &&
00079 ray_geom(r,GEOM::null)->interactive(e,s));
00080 }
00081
00082 void
00083 Pen::notify_gesture(GEST_INT* gi, CGESTUREptr& gest)
00084 {
00085 if (Config::get_var_bool("DEBUG_GESTURES",false)) {
00086 gest->print_stats();
00087 gest->print_types();
00088 }
00089
00090 _fsa.handle_event(gest);
00091
00092 if (_fsa.is_reset())
00093 gi->reset();
00094 }
00095
00096 int
00097 Pen::down(CEvent &e, State *&s)
00098 {
00099 return check_interactive(e, s);
00100 }
00101
00102 int
00103 Pen::move(CEvent &,State *&)
00104 {
00105 return 0;
00106 }
00107
00108 int
00109 Pen::up(CEvent &,State *&)
00110 {
00111 return 0;
00112 }
00113
00114 int
00115 Pen::erase_down(CEvent &e, State *&s)
00116 {
00117 return check_interactive(e, s);
00118 }
00119
00120 int
00121 Pen::erase_move(CEvent &,State *&)
00122 {
00123 return 0;
00124 }
00125
00126 int
00127 Pen::erase_up(CEvent &, State *&)
00128 {
00129 return 0;
00130 }
00131
00132 void
00133 Pen::activate(State *start)
00134 {
00135 if (_gest_int) {
00136 _gest_int->reset();
00137 _gest_int->add_obs(this);
00138 } else {
00139 *start += _entry;
00140 }
00141
00142 if (_shift_fsa)
00143 *start += *_shift_fsa;
00144 if (_ctrl_fsa)
00145 *start += *_ctrl_fsa;
00146 ModeName::push_name(_pen_name);
00147 }
00148
00149 bool
00150 Pen::deactivate(State *start)
00151 {
00152 ModeName::pop_name();
00153
00154 if (_ctrl_fsa)
00155 *start -= *_ctrl_fsa;
00156 if (_shift_fsa)
00157 *start -= *_shift_fsa;
00158
00159 if (_gest_int) {
00160 _gest_int->rem_obs(this);
00161 _gest_int->reset();
00162 } else {
00163 *start -= _entry;
00164 }
00165 return true;
00166 }
00167
00168