NEURON
xmenu.h
Go to the documentation of this file.
1 #ifndef xmenu_h
2 #define xmenu_h
3 
4 #include <InterViews/window.h>
5 #include <InterViews/box.h>
6 #include <InterViews/event.h>
7 #include <OS/list.h>
8 #include <OS/string.h>
9 #include <IV-look/kit.h>
10 #include <IV-look/stepper.h>
11 #include <IV-look/dialogs.h>
12 #if defined(WIN32) || defined(MAC) || defined(CYGWIN)
13 #define UseFieldEditor 1
14 #else
15 #define UseFieldEditor 0 // Use the FieldSEditor
16 #endif
17 #if UseFieldEditor
18 #include <IV-look/field.h>
19 #define FieldSEditor FieldEditor
20 #else
21 #include "field.h"
22 #endif
23 #include "ocglyph.h"
24 #include "apwindow.h"
25 #include "ivocconf.h"
26 
27 class HocPanel; // panel is a vbox with menus, buttons, value editors, etc.
28 class HocMenu; // popup menu panel item
29 class HocAction; // button/menuItem action
30 class HocValEditor; // field editor with button
31 class HocValAction; // knows what to do when value editor or associated button pressed.
32 class HocItem; // for printing
33 class HocDataPaths;
34 class HocCommand;
35 class HocVarLabel;
36 class HocUpdateItem;
37 class Patch;
38 class BoundedValue;
39 class HocRadioAction;
40 class StepperMenu;
41 class ValEdLabel;
42 class ScenePicker;
43 struct HocSymExtension;
44 
45 declarePtrList(HocUpdateItemList, HocUpdateItem)
46 declarePtrList(HocItemList, HocItem)
47 declarePtrList(HocPanelList, HocPanel)
48 
49 class HocPanel : public OcGlyph {
50 public:
51  HocPanel(const char* name, bool horizontal=false);
52  virtual ~HocPanel();
53  virtual void map_window(int scroll = -1); // -1 leave up to panel_scroll attribute
54 
55  void pushButton(const char* name, const char* action, bool activate = false, Object* pyact = 0);
56  void stateButton(double *pd, const char* name, const char* action, int style, Object* pyvar = NULL, Object* pyact = NULL);
57  HocMenu* menu(const char* name, bool add2menubar = false);
58  MenuItem* menuItem(const char* name, const char* action, bool activate = false, Object* pyact = 0);
59  MenuItem* menuStateItem(double *pd, const char* name, const char* action, Object* pyvar = NULL, Object* pyact = NULL);
60  void valueEd(const char* prompt, const char* variable, const char* action=0,
61  bool canrun=false, double* pd=NULL, bool deflt=false,
62  bool keep_updated=false, HocSymExtension* extra=NULL,
63  Object* pyvar=NULL, Object* pyact=NULL);
64  void valueEd(const char* prompt, Object* pyvar, Object* pyact=0,
65  bool canrun=false, bool deflt=false,
66  bool keep_updated=false);
67 
68 // ZFM added vert
69  void slider(double*, float low = 0, float high = 100,
70  float resolution = 1, int steps = 10,
71  const char* send_cmd = NULL, bool vert = false,
72  bool slow = false, Object* pyvar=NULL, Object* pysend=NULL);
73  virtual void write(ostream&);
74  virtual void save(ostream&);
75  virtual HocItem* hoc_item();
76  void label(const char*);
77  void var_label(char**, Object* pyvar = NULL);
78  PolyGlyph* box();
79  const char* getName();
80  void itemAppend(const char*);
81  void notifyHocValue();
82  void check_valid_pointers(void*, int);
83  Coord left_, bottom_; // write by makeTray read by dissolve
84  static void save_all(ostream&);
85  void data_path(HocDataPaths*, bool);
86  void item_append(HocItem*);
87 #if MAC
88  void mac_menubar();
89  void mac_menubar(int&, int&, int); // recurse per menu through list
90 #endif
91  static void keep_updated();
92  static void keep_updated(HocUpdateItem*, bool);
93  static void paneltool(const char* name, const char* procname, const char* action, ScenePicker*, Object* pycallback = NULL, Object* pyselact = NULL);
94  static void update_ptrs();
95 private:
96  PolyGlyph* box_;
97  HocUpdateItemList elist_;
98  HocItemList ilist_;
99  static HocUpdateItemList* update_list_;
100  bool horizontal_;
101  InputHandler* ih_;
102 };
103 
104 class HocItem : public Resource {
105 public:
106  HocItem(const char*, HocItem* parent = NULL);
107  virtual ~HocItem();
108  virtual void write(ostream&);
109  const char* getStr();
110  virtual void help(const char* childpath = NULL);
111  virtual void help_parent(HocItem*);
112 #if MAC
113  virtual int mac_menubar(int&, int, int);
114 #endif
115 private:
118 };
119 
120 class HocPushButton : public HocItem {
121 public:
122  HocPushButton(const char*, HocAction*, HocItem* parent = NULL);
123  virtual ~HocPushButton();
124  virtual void write(ostream&);
125 #if MAC
126  virtual int mac_menubar(int&, int, int);
127 #endif
128 private:
130 };
131 
132 class HocRadioButton : public HocItem {
133 public:
134  HocRadioButton(const char*, HocRadioAction*, HocItem* parent = NULL);
135  virtual ~HocRadioButton();
136  virtual void write(ostream&);
137 #if MAC
138  virtual int mac_menubar(int&, int, int);
139 #endif
140 private:
141  HocRadioAction* a_;
142 };
143 
144 class HocMenu : public HocItem {
145 public:
146  HocMenu(const char*, Menu*, MenuItem*, HocItem* parent = NULL, bool add2menubar = false);
147  virtual ~HocMenu();
148  virtual void write(ostream&);
149  virtual Menu* menu() { return menu_;}
150  virtual MenuItem* item() { return mi_; }
151 #if MAC
152  virtual int mac_menubar(int&, int, int);
153 #endif
154 private:
158 };
159 
160 class HocUpdateItem : public HocItem {
161 public:
162  HocUpdateItem(const char*, HocItem* parent = NULL);
163  virtual ~HocUpdateItem();
164  virtual void update_hoc_item();
165  virtual void check_pointer(void*, int vector_size);
166  virtual void data_path(HocDataPaths*, bool);
167  virtual void update_ptrs(){}
168  void update_ptrs_helper(double**);
169 };
170 
171 class HocLabel : public HocItem {
172 public:
173  HocLabel(const char*);
174  virtual ~HocLabel();
175  virtual void write(ostream&);
176 };
177 
178 class HocVarLabel : public HocUpdateItem {
179 public:
180  HocVarLabel(char**, PolyGlyph*, Object* pyvar = NULL);
181  virtual ~HocVarLabel();
182  virtual void write(ostream&);
183  virtual void update_hoc_item();
184  virtual void check_pointer(void*, int);
185  virtual void data_path(HocDataPaths*, bool);
186 private:
188  char** cpp_;
189  char* cp_;
192 };
193 
194 class HocAction : public Action {
195 public:
196  HocAction(const char* action, Object* pyact = NULL);
197  virtual ~HocAction();
198  virtual void execute();
199  const char* name() const;
200  virtual void help();
201  void hoc_item(HocItem*);
202 private:
205 };
206 
207 class HocMenuAction : public HocAction {
208 public:
209  HocMenuAction(const char* action, Object* pyact, HocMenu*);
210  virtual ~HocMenuAction();
211  virtual void execute();
212 private:
214  HocPanel* hp_; // a temporary. hm_ is not part of this panel
215 };
216 
218 public:
220  virtual ~HocEditorForItem();
221 
222  virtual void keystroke(const Event&);
223  virtual void press(const Event&);
224  virtual void drag(const Event&);
225  virtual void release(const Event&);
226  virtual void val_inc(const Event&);
227 
228  virtual InputHandler* focus_in();
229  virtual void focus_out();
230 private:
233  int index_;
235 };
236 
237 class HocValStepper : public Stepper {
238 public:
239  static HocValStepper* instance(HocValEditor*);
241  virtual ~HocValStepper();
242 
243  virtual void press(const Event&);
244  virtual void release(const Event&);
245  virtual void menu_up(Event&);
246  void default_inc(bool, double);
247  double default_inc();
248  static StepperMenu* menu() { return menu_;}
249 protected:
250  virtual void adjust();
251 private:
252  void left();
253  void middle();
254  void right();
255 private:
257  int steps_;
259  float inc_;
261  static StepperMenu* menu_;
262 };
263 
264 class HocValEditor : public HocUpdateItem {
265 public:
266  HocValEditor(const char* name, const char* variable, ValEdLabel*,
267  HocValAction*, double* pd=0, bool canrun=false,
268  HocItem* parent = NULL, Object* pvar = NULL);
269  virtual ~HocValEditor();
270  FieldSEditor* field_editor() { return fe_; }
271  virtual Stepper* stepper() { return NULL; }
272  virtual void update_hoc_item();
273  void evalField();
274  void audit();
275  virtual void updateField();
276  virtual void write(ostream&);
277  virtual void data_path(HocDataPaths*, bool);
278  virtual void check_pointer(void*, int);
279  virtual void print(Printer*, const Allocation&)const;
280  virtual int hoc_default_val_editor() {return 0;}
281  void set_val(double);
282  double get_val();
283  virtual void exec_action();
284  const char* variable() const;
285  virtual void setlimits(float*);
286  virtual double domain_limits(double);
287  bool active() { return active_;}
288  virtual void update_ptrs();
289 private:
290  friend class HocEditorForItem;
291  friend class HocValStepper;
293  bool active_;
294  bool canrun_;
297  double* pval_;
298  ValEdLabel* prompt_;
301 };
302 
304 public:
305  HocDefaultValEditor(const char* name, const char* variable, ValEdLabel*,
306  HocValAction*, double* pd=0, bool canrun=false,
307  HocItem* parent = NULL, Object* pyvar=NULL);
308  virtual ~HocDefaultValEditor();
309  virtual Stepper* stepper() { return vs_; }
310  virtual void updateField();
311  virtual int hoc_default_val_editor() {return 1;}
312  void deflt(double);
313  void def_action();
314  void def_change(float, float);
315  Button* checkbox() { return checkbox_; }
316 private:
317  Button* checkbox_; // not your normal checkbox. see xmenu.cpp
318  double deflt_;
319  double most_recent_;
321 };
322 
324 public:
325  HocValEditorKeepUpdated(const char* name, const char* variable, ValEdLabel*,
326  HocValAction*, double*, HocItem* parent = NULL, Object* pyvar=NULL);
327  virtual ~HocValEditorKeepUpdated();
328  virtual void write(ostream&);
329 };
330 
331 class HocValAction : public HocAction {
332 public:
333  HocValAction(const char* action, Object* pyact = 0);
334  HocValAction(Object* pyaction);
335  virtual ~HocValAction();
336  void accept(FieldSEditor*);
337  void execute();
338  void setFieldSEditor(HocValEditor*);
339 #if UseFieldEditor
340  FieldEditorAction* fea(){return fea_;}
341 #else
342  FieldSEditorAction* fea(){return fea_;}
343 #endif
344 private:
346 #if UseFieldEditor
347  FieldEditorAction* fea_;
348 #else
350 #endif
351 };
352 
353 
354 // ZFM added vert_
355 class OcSlider : public HocUpdateItem, public Observer {
356 public:
357  OcSlider(double*, float low, float high,
358  float resolution, int nsteps,
359  const char* send_cmd, bool vert,
360  bool slow = false, Object* pyvar=NULL, Object* pysend=NULL);
361  virtual ~OcSlider();
362  virtual void write(ostream&);
363 
364  Adjustable* adjustable();
365 
366  virtual void update(Observable*);
367 
368  virtual void update_hoc_item();
369  virtual void check_pointer(void*, int vector_size);
370  virtual void data_path(HocDataPaths*, bool);
371  virtual double slider_val();
372  virtual void update_ptrs();
373 private:
374  void audit();
375 private:
376  float resolution_;
379  double *pval_;
383  bool vert_;
384  bool slow_;
385 };
386 
387 
388 
389 class HocStateButton : public HocUpdateItem, public Observer {
390  public:
391  HocStateButton(double*, const char*, Button*, HocAction*, int, HocItem* parent = NULL, Object* pyvar = NULL);
392  virtual ~HocStateButton();
393  virtual void write(ostream&);
394 
395  bool chosen();
396  void button_action();
397 
398  virtual void update_hoc_item();
399  virtual void check_pointer(void*, int);
400  virtual void data_path(HocDataPaths*, bool);
401  virtual void print(Printer*, const Allocation&) const;
402  virtual void update_ptrs();
403  enum { CHECKBOX,PALETTE };
404 
405  private:
406  int style_;
409  double* pval_;
413 };
414 
415 
416 class HocStateMenuItem : public HocUpdateItem, public Observer {
417  public:
418  HocStateMenuItem(double*, const char*, MenuItem*, HocAction*, HocItem* parent = NULL, Object* pyvar = NULL);
419  virtual ~HocStateMenuItem();
420  virtual void write(ostream&);
421 
422  bool chosen();
423  void button_action();
424 
425  virtual void update_hoc_item();
426  virtual void check_pointer(void*, int);
427  virtual void data_path(HocDataPaths*, bool);
428  virtual void print(Printer*, const Allocation&) const;
429  virtual void update_ptrs();
430 
431  private:
434  double* pval_;
438 };
439 
440 
441 #endif
442 
443 
444 
Definition: xmenu.h:144
Button * checkbox_
Definition: xmenu.h:317
Patch * p_
Definition: xmenu.h:187
Definition: xmenu.h:104
float inc_
Definition: xmenu.h:259
virtual void update_ptrs()
Definition: xmenu.h:167
bool active_
Definition: xmenu.h:293
FieldSEditorAction * fea_
Definition: xmenu.h:349
CopyString * variable_
Definition: xmenu.h:407
char ** cpp_
Definition: xmenu.h:188
void execute(Inst *p)
Definition: code.cpp:2651
int style_
Definition: xmenu.h:406
CopyString * variable_
Definition: xmenu.h:190
HocValEditor * fe_
Definition: xmenu.h:345
CopyString * variable_
Definition: xmenu.h:432
#define Glyph
Definition: _defines.h:132
#define Coord
Definition: _defines.h:19
#define InputHandler
Definition: _defines.h:151
double * pval_
Definition: xmenu.h:379
bool geometric_
Definition: xmenu.h:256
FieldSEditorAction * fea()
Definition: xmenu.h:342
MenuItem * mi_
Definition: xmenu.h:155
HocAction * action_
Definition: xmenu.h:295
Button * checkbox()
Definition: xmenu.h:315
HocItem * help_parent_
Definition: xmenu.h:117
HocRadioAction * a_
Definition: xmenu.h:141
static void update(NrnThread *)
Definition: fadvance.cpp:570
#define print
Definition: redef.h:109
bool canrun_
Definition: xmenu.h:294
Button * b_
Definition: xmenu.h:411
virtual int hoc_default_val_editor()
Definition: xmenu.h:311
EventButton b_
Definition: xmenu.h:234
#define PolyGlyph
Definition: _defines.h:207
ValEdLabel * prompt_
Definition: xmenu.h:298
static double adjust(void *v)
Definition: ocbox.cpp:292
BoundedValue * bv_
Definition: xmenu.h:377
CopyString * name_
Definition: xmenu.h:433
HocItem * hi_
Definition: xmenu.h:204
static StepperMenu * menu()
Definition: xmenu.h:248
HocEditorForItem * fe_
Definition: xmenu.h:292
virtual void save(std::ostream &)
float * domain_limits_
Definition: xmenu.h:299
FieldSEditor * field_editor()
Definition: xmenu.h:270
Object * pyvar_
Definition: xmenu.h:410
HocCommand * action_
Definition: xmenu.h:203
HocPanel * hp_
Definition: xmenu.h:214
virtual Stepper * stepper()
Definition: xmenu.h:271
bool add2menubar_
Definition: xmenu.h:157
Menu * menu_
Definition: xmenu.h:156
Object * pyvar_
Definition: xmenu.h:191
MenuItem * b_
Definition: xmenu.h:436
Object * pyvar_
Definition: xmenu.h:435
#define Menu
Definition: _defines.h:176
#define Printer
Definition: _defines.h:211
HocValEditor * hve_
Definition: xmenu.h:260
virtual void drag(const Event &e)
Definition: ocinput.h:21
virtual void press(const Event &e)
Definition: ocinput.h:20
static StepperMenu * menu_
Definition: xmenu.h:261
virtual Stepper * stepper()
Definition: xmenu.h:309
static void help(const char *)
Definition: hel2mos.cpp:104
HocValEditor * hve_
Definition: xmenu.h:231
#define Patch
Definition: _defines.h:201
HocValStepper * vs_
Definition: xmenu.h:320
bool vert_
Definition: xmenu.h:383
Object * pyvar_
Definition: xmenu.h:380
virtual int hoc_default_val_editor()
Definition: xmenu.h:280
char * name
Definition: init.cpp:16
double * pval_
Definition: xmenu.h:297
HocAction * action_
Definition: xmenu.h:412
#define Stepper
Definition: _defines.h:275
#define parent
Definition: rbtqueue.cpp:47
HocMenu * hm_
Definition: xmenu.h:213
int steps_
Definition: xmenu.h:257
#define left
Definition: rbtqueue.cpp:45
#define Event
Definition: _defines.h:107
virtual void release(const Event &e)
Definition: ocinput.h:22
#define FieldEditorAction
Definition: _defines.h:112
#define right
Definition: rbtqueue.cpp:46
float default_inc_
Definition: xmenu.h:258
CopyString * variable_
Definition: xmenu.h:381
HocAction * a_
Definition: xmenu.h:129
HocAction * action_
Definition: xmenu.h:437
static int active_
Definition: netpar.cpp:206
CopyString * variable_
Definition: xmenu.h:296
double * pval_
Definition: xmenu.h:409
Definition: hocdec.h:226
float resolution_
Definition: xmenu.h:376
double * pval_
Definition: xmenu.h:434
char * cp_
Definition: xmenu.h:189
bool active()
Definition: xmenu.h:287
#define Adjustable
Definition: _defines.h:29
#define Action
Definition: _defines.h:27
Object * pyvar_
Definition: xmenu.h:300
#define Style
Definition: _defines.h:281
static void activate()
double most_recent_
Definition: xmenu.h:319
CopyString str_
Definition: xmenu.h:116
#define MenuItem
Definition: _defines.h:179
CopyString * name_
Definition: xmenu.h:408
HocCommand * send_
Definition: xmenu.h:378
#define EventButton
Definition: _defines.h:21
virtual Menu * menu()
Definition: xmenu.h:149
#define TelltaleState
Definition: _defines.h:296
declarePtrList(HocUpdateItemList, HocUpdateItem) declarePtrList(HocItemList
virtual MenuItem * item()
Definition: xmenu.h:150
return NULL
Definition: cabcode.cpp:461
#define Button
Definition: _defines.h:62
bool slow_
Definition: xmenu.h:384
bool scrolling_
Definition: xmenu.h:382