NEURON
ocpicker.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 #if HAVE_IV // to end of file
3 
4 #include <OS/list.h>
5 #include <InterViews/hit.h>
6 #include <stdio.h>
7 #include "ocpicker.h"
8 #include "rubband.h"
9 
10 /*static*/ class ButtonHandler {
11  public:
12  ButtonHandler(EventButton, OcHandler*);
13  ButtonHandler(EventButton, Rubberband*);
14  ~ButtonHandler();
15  OcHandler* handler_;
16  Rubberband* rband_;
17  EventButton eb_;
18 };
19 
20 ButtonHandler::ButtonHandler(EventButton eb, OcHandler* a) {
21  eb_ = eb;
22  handler_ = a;
23  rband_ = NULL;
24  Resource::ref(a);
25 }
26 
27 ButtonHandler::ButtonHandler(EventButton eb, Rubberband* rb) {
28  eb_ = eb;
29  handler_ = NULL;
30  rband_ = rb;
31  Resource::ref(rb);
32 }
33 
34 ButtonHandler::~ButtonHandler() {
35  Resource::unref(handler_);
36  Resource::unref(rband_);
37 }
38 
39 declarePtrList(HandlerList, ButtonHandler);
40 implementPtrList(HandlerList, ButtonHandler);
41 
43  ms_ = unknown;
44  for (int i = 0; i < unknown; ++i) {
45  handlers_[i] = new HandlerList(1);
46  }
47 }
49  for (int i = 0; i < unknown; ++i) {
50  long cnt = handlers_[i]->count();
51  for (long j = 0; j < cnt; j++) {
52  delete handlers_[i]->item(j);
53  }
54  delete handlers_[i];
55  }
56 }
57 bool StandardPicker::pick(Canvas* c, Glyph* glyph, int depth, Hit& h) {
58  if (!h.event()) {
59  return false;
60  }
61  const Event& e = *h.event();
62  if (e.grabber()) {
63  h.target(depth, glyph, 0, e.grabber());
64  return true;
65  }
66  event(e);
67 
68  long cnt = handlers_[ms_]->count();
69  for (long i = 0; i < cnt; ++i) {
70  ButtonHandler& b = *handlers_[ms_]->item(i);
71  if (b.eb_ == Event::any || b.eb_ == mb_) {
72  if (b.handler_) {
73  h.target(depth, glyph, 0, b.handler_);
74  } else {
75  b.rband_->canvas(c);
76  h.target(depth, glyph, 0, b.rband_);
77  }
78  return true;
79  }
80  }
81  return false;
82 }
83 
84 /* from /interviews/input.cpp */
85 void StandardPicker::event(const Event& e) {
86  switch (e.type()) {
87  case Event::down:
88  // printf("press\n");
89  ms_ = press;
90  mb_ = e.pointer_button();
91  break;
92  case Event::motion:
93  if ((ms_ == drag || ms_ == press) &&
94  (e.left_is_down() || e.right_is_down() || e.middle_is_down())) {
95  // printf("drag\n");
96  ms_ = drag;
97  } else {
98  // printf("motion\n");
99  ms_ = motion;
100  mb_ = 0;
101  }
102  break;
103  case Event::up:
104  // printf("release\n");
105  ms_ = release;
106  mb_ = e.pointer_button();
107  break;
108  }
109 }
110 
111 void StandardPicker::unbind(int m, EventButton eb) {
112  long cnt = handlers_[m]->count();
113  long i, j;
114  for (i = 0, j = 0; i < cnt; ++i) {
115  ButtonHandler& b = *handlers_[m]->item(j);
116  if (b.eb_ == Event::any || b.eb_ == eb) {
117  delete handlers_[m]->item(j);
118  handlers_[m]->remove(j);
119  } else {
120  ++j;
121  }
122  }
123 }
124 
125 void StandardPicker::bind(int m, EventButton eb, OcHandler* h) {
126  unbind(m, eb);
127  if (h) {
128  handlers_[m]->append(new ButtonHandler(eb, h));
129  }
130 }
131 
133  int m = 1;
134  unbind(m, eb);
135  if (rb) {
136  handlers_[m]->append(new ButtonHandler(eb, rb));
137  }
138 }
139 
141  for (int m = 0; m < unknown; ++m) {
142  unbind(m, eb);
143  }
144 }
145 #endif
#define Canvas
Definition: _defines.h:65
#define Hit
Definition: _defines.h:147
#define Event
Definition: _defines.h:107
#define EventButton
Definition: _defines.h:21
#define Glyph
Definition: _defines.h:132
virtual void ref() const
Definition: resource.cpp:47
virtual void unref() const
Definition: resource.cpp:52
void bind_press(EventButton eb, Rubberband *)
virtual bool pick(Canvas *, Glyph *, int depth, Hit &h)
void remove_all(EventButton)
HandlerList * handlers_[unknown]
Definition: ocpicker.h:69
void event(const Event &)
virtual ~StandardPicker()
EventButton mb_
Definition: ocpicker.h:68
void unbind(int, EventButton)
void bind(int, EventButton eb, OcHandler *h)
#define c
#define implementPtrList(PtrList, T)
#define declarePtrList(PtrList, T)
#define i
Definition: md1redef.h:12
size_t j
#define e
Definition: passive0.cpp:22
#define cnt
Definition: spt2queue.cpp:19
#define NULL
Definition: sptree.h:16