Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

pen.C

Go to the documentation of this file.
00001 /*!
00002  *  \file pen.C
00003  *  \brief Contains the implementation of the Pen class.
00004  *
00005  *  \sa pen.C
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  * Pen:
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  * FSA stuff 
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    // This is a subclass of Simple_int, so the callback paramater to
00061    // Cb must be a CallMeth_t<Simple_int,Event>::_method), so we do a
00062    // cast
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 /* end of file pen.C */

Generated on Mon Sep 18 11:39:32 2006 for jot by  doxygen 1.4.4