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(MINGW) || defined(MAC)
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,
57  const char* name,
58  const char* action,
59  int style,
60  Object* pyvar = NULL,
61  Object* pyact = NULL);
62  HocMenu* menu(const char* name, bool add2menubar = false);
63  MenuItem* menuItem(const char* name,
64  const char* action,
65  bool activate = false,
66  Object* pyact = 0);
67  MenuItem* menuStateItem(double* pd,
68  const char* name,
69  const char* action,
70  Object* pyvar = NULL,
71  Object* pyact = NULL);
72  void valueEd(const char* prompt,
73  const char* variable,
74  const char* action = 0,
75  bool canrun = false,
76  double* pd = NULL,
77  bool deflt = false,
78  bool keep_updated = false,
79  HocSymExtension* extra = NULL,
80  Object* pyvar = NULL,
81  Object* pyact = NULL);
82  void valueEd(const char* prompt,
83  Object* pyvar,
84  Object* pyact = 0,
85  bool canrun = false,
86  bool deflt = false,
87  bool keep_updated = false);
88 
89  // ZFM added vert
90  void slider(double*,
91  float low = 0,
92  float high = 100,
93  float resolution = 1,
94  int steps = 10,
95  const char* send_cmd = NULL,
96  bool vert = false,
97  bool slow = false,
98  Object* pyvar = NULL,
99  Object* pysend = NULL);
100  virtual void write(ostream&);
101  virtual void save(ostream&);
102  virtual HocItem* hoc_item();
103  void label(const char*);
104  void var_label(char**, Object* pyvar = NULL);
105  PolyGlyph* box();
106  const char* getName();
107  void itemAppend(const char*);
108  void notifyHocValue();
109  void check_valid_pointers(void*, int);
110  Coord left_, bottom_; // write by makeTray read by dissolve
111  static void save_all(ostream&);
112  void data_path(HocDataPaths*, bool);
113  void item_append(HocItem*);
114 #if MAC
115  void mac_menubar();
116  void mac_menubar(int&, int&, int); // recurse per menu through list
117 #endif
118  static void keep_updated();
119  static void keep_updated(HocUpdateItem*, bool);
120  static void paneltool(const char* name,
121  const char* procname,
122  const char* action,
123  ScenePicker*,
124  Object* pycallback = NULL,
125  Object* pyselact = NULL);
126  static void update_ptrs();
127 
128  private:
129  PolyGlyph* box_;
130  HocUpdateItemList elist_;
131  HocItemList ilist_;
132  static HocUpdateItemList* update_list_;
133  bool horizontal_;
134  InputHandler* ih_;
135 };
136 
137 class HocItem: public Resource {
138  public:
139  HocItem(const char*, HocItem* parent = NULL);
140  virtual ~HocItem();
141  virtual void write(ostream&);
142  const char* getStr();
143  virtual void help(const char* childpath = NULL);
144  virtual void help_parent(HocItem*);
145 #if MAC
146  virtual int mac_menubar(int&, int, int);
147 #endif
148  private:
151 };
152 
153 class HocPushButton: public HocItem {
154  public:
156  virtual ~HocPushButton();
157  virtual void write(ostream&);
158 #if MAC
159  virtual int mac_menubar(int&, int, int);
160 #endif
161  private:
163 };
164 
165 class HocRadioButton: public HocItem {
166  public:
167  HocRadioButton(const char*, HocRadioAction*, HocItem* parent = NULL);
168  virtual ~HocRadioButton();
169  virtual void write(ostream&);
170 #if MAC
171  virtual int mac_menubar(int&, int, int);
172 #endif
173  private:
174  HocRadioAction* a_;
175 };
176 
177 class HocMenu: public HocItem {
178  public:
179  HocMenu(const char*, Menu*, MenuItem*, HocItem* parent = NULL, bool add2menubar = false);
180  virtual ~HocMenu();
181  virtual void write(ostream&);
182  virtual Menu* menu() {
183  return menu_;
184  }
185  virtual MenuItem* item() {
186  return mi_;
187  }
188 #if MAC
189  virtual int mac_menubar(int&, int, int);
190 #endif
191  private:
195 };
196 
197 class HocUpdateItem: public HocItem {
198  public:
199  HocUpdateItem(const char*, HocItem* parent = NULL);
200  virtual ~HocUpdateItem();
201  virtual void update_hoc_item();
202  virtual void check_pointer(void*, int vector_size);
203  virtual void data_path(HocDataPaths*, bool);
204  virtual void update_ptrs() {}
205  void update_ptrs_helper(double**);
206 };
207 
208 class HocLabel: public HocItem {
209  public:
210  HocLabel(const char*);
211  virtual ~HocLabel();
212  virtual void write(ostream&);
213 };
214 
215 class HocVarLabel: public HocUpdateItem {
216  public:
217  HocVarLabel(char**, PolyGlyph*, Object* pyvar = NULL);
218  virtual ~HocVarLabel();
219  virtual void write(ostream&);
220  virtual void update_hoc_item();
221  virtual void check_pointer(void*, int);
222  virtual void data_path(HocDataPaths*, bool);
223 
224  private:
226  char** cpp_;
227  char* cp_;
230 };
231 
232 class HocAction: public Action {
233  public:
234  HocAction(const char* action, Object* pyact = NULL);
235  virtual ~HocAction();
236  virtual void execute();
237  const char* name() const;
238  virtual void help();
240 
241  private:
244 };
245 
246 class HocMenuAction: public HocAction {
247  public:
248  HocMenuAction(const char* action, Object* pyact, HocMenu*);
249  virtual ~HocMenuAction();
250  virtual void execute();
251 
252  private:
254  HocPanel* hp_; // a temporary. hm_ is not part of this panel
255 };
256 
258  public:
260  virtual ~HocEditorForItem();
261 
262  virtual void keystroke(const Event&);
263  virtual void press(const Event&);
264  virtual void drag(const Event&);
265  virtual void release(const Event&);
266  virtual void val_inc(const Event&);
267 
268  virtual InputHandler* focus_in();
269  virtual void focus_out();
270 
271  private:
274  int index_;
276 };
277 
278 class HocValStepper: public Stepper {
279  public:
282  virtual ~HocValStepper();
283 
284  virtual void press(const Event&);
285  virtual void release(const Event&);
286  virtual void menu_up(Event&);
287  void default_inc(bool, double);
288  double default_inc();
289  static StepperMenu* menu() {
290  return menu_;
291  }
292 
293  protected:
294  virtual void adjust();
295 
296  private:
297  void left();
298  void middle();
299  void right();
300 
301  private:
303  int steps_;
305  float inc_;
307  static StepperMenu* menu_;
308 };
309 
311  public:
312  HocValEditor(const char* name,
313  const char* variable,
314  ValEdLabel*,
315  HocValAction*,
316  double* pd = 0,
317  bool canrun = false,
318  HocItem* parent = NULL,
319  Object* pvar = NULL);
320  virtual ~HocValEditor();
322  return fe_;
323  }
324  virtual Stepper* stepper() {
325  return NULL;
326  }
327  virtual void update_hoc_item();
328  void evalField();
329  void audit();
330  virtual void updateField();
331  virtual void write(ostream&);
332  virtual void data_path(HocDataPaths*, bool);
333  virtual void check_pointer(void*, int);
334  virtual void print(Printer*, const Allocation&) const;
335  virtual int hoc_default_val_editor() {
336  return 0;
337  }
338  void set_val(double);
339  double get_val();
340  virtual void exec_action();
341  const char* variable() const;
342  virtual void setlimits(float*);
343  virtual double domain_limits(double);
344  bool active() {
345  return active_;
346  }
347  virtual void update_ptrs();
348 
349  private:
350  friend class HocEditorForItem;
351  friend class HocValStepper;
353  bool active_;
354  bool canrun_;
357  double* pval_;
358  ValEdLabel* prompt_;
361 };
362 
364  public:
366  const char* variable,
367  ValEdLabel*,
368  HocValAction*,
369  double* pd = 0,
370  bool canrun = false,
371  HocItem* parent = NULL,
372  Object* pyvar = NULL);
374  virtual Stepper* stepper() {
375  return vs_;
376  }
377  virtual void updateField();
378  virtual int hoc_default_val_editor() {
379  return 1;
380  }
381  void deflt(double);
382  void def_action();
383  void def_change(float, float);
385  return checkbox_;
386  }
387 
388  private:
389  Button* checkbox_; // not your normal checkbox. see xmenu.cpp
390  double deflt_;
391  double most_recent_;
393 };
394 
396  public:
398  const char* variable,
399  ValEdLabel*,
400  HocValAction*,
401  double*,
402  HocItem* parent = NULL,
403  Object* pyvar = NULL);
405  virtual void write(ostream&);
406 };
407 
408 class HocValAction: public HocAction {
409  public:
410  HocValAction(const char* action, Object* pyact = 0);
411  HocValAction(Object* pyaction);
412  virtual ~HocValAction();
414  void execute();
416 #if UseFieldEditor
418  return fea_;
419  }
420 #else
422  return fea_;
423  }
424 #endif
425  private:
427 #if UseFieldEditor
429 #else
431 #endif
432 };
433 
434 
435 // ZFM added vert_
436 class OcSlider: public HocUpdateItem, public Observer {
437  public:
438  OcSlider(double*,
439  float low,
440  float high,
441  float resolution,
442  int nsteps,
443  const char* send_cmd,
444  bool vert,
445  bool slow = false,
446  Object* pyvar = NULL,
447  Object* pysend = NULL);
448  virtual ~OcSlider();
449  virtual void write(ostream&);
450 
452 
453  virtual void update(Observable*);
454 
455  virtual void update_hoc_item();
456  virtual void check_pointer(void*, int vector_size);
457  virtual void data_path(HocDataPaths*, bool);
458  virtual double slider_val();
459  virtual void update_ptrs();
460 
461  private:
462  void audit();
463 
464  private:
465  float resolution_;
468  double* pval_;
472  bool vert_;
473  bool slow_;
474 };
475 
476 
477 class HocStateButton: public HocUpdateItem, public Observer {
478  public:
479  HocStateButton(double*,
480  const char*,
481  Button*,
482  HocAction*,
483  int,
484  HocItem* parent = NULL,
485  Object* pyvar = NULL);
486  virtual ~HocStateButton();
487  virtual void write(ostream&);
488 
489  bool chosen();
491 
492  virtual void update_hoc_item();
493  virtual void check_pointer(void*, int);
494  virtual void data_path(HocDataPaths*, bool);
495  virtual void print(Printer*, const Allocation&) const;
496  virtual void update_ptrs();
497  enum { CHECKBOX, PALETTE };
498 
499  private:
500  int style_;
503  double* pval_;
507 };
508 
509 
510 class HocStateMenuItem: public HocUpdateItem, public Observer {
511  public:
513  const char*,
514  MenuItem*,
515  HocAction*,
516  HocItem* parent = NULL,
517  Object* pyvar = NULL);
518  virtual ~HocStateMenuItem();
519  virtual void write(ostream&);
520 
521  bool chosen();
523 
524  virtual void update_hoc_item();
525  virtual void check_pointer(void*, int);
526  virtual void data_path(HocDataPaths*, bool);
527  virtual void print(Printer*, const Allocation&) const;
528  virtual void update_ptrs();
529 
530  private:
533  double* pval_;
537 };
538 
539 
540 #endif
#define InputHandler
Definition: _defines.h:151
#define Patch
Definition: _defines.h:201
#define TelltaleState
Definition: _defines.h:296
#define Menu
Definition: _defines.h:176
#define Style
Definition: _defines.h:281
#define FieldEditorAction
Definition: _defines.h:112
#define Coord
Definition: _defines.h:19
#define Adjustable
Definition: _defines.h:29
#define Printer
Definition: _defines.h:211
#define MenuItem
Definition: _defines.h:179
#define Event
Definition: _defines.h:107
#define Button
Definition: _defines.h:62
#define EventButton
Definition: _defines.h:21
#define PolyGlyph
Definition: _defines.h:207
#define Stepper
Definition: _defines.h:275
#define Action
Definition: _defines.h:27
#define Glyph
Definition: _defines.h:132
virtual ~HocAction()
const char * name() const
HocAction(const char *action, Object *pyact=NULL)
virtual void help()
HocItem * hi_
Definition: xmenu.h:243
virtual void execute()
void hoc_item(HocItem *)
HocCommand * action_
Definition: xmenu.h:242
void deflt(double)
virtual Stepper * stepper()
Definition: xmenu.h:374
virtual ~HocDefaultValEditor()
double most_recent_
Definition: xmenu.h:391
Button * checkbox()
Definition: xmenu.h:384
virtual int hoc_default_val_editor()
Definition: xmenu.h:378
HocValStepper * vs_
Definition: xmenu.h:392
virtual void updateField()
HocDefaultValEditor(const char *name, const char *variable, ValEdLabel *, HocValAction *, double *pd=0, bool canrun=false, HocItem *parent=NULL, Object *pyvar=NULL)
Button * checkbox_
Definition: xmenu.h:389
void def_change(float, float)
HocEditorForItem(HocValEditor *, HocValAction *)
virtual void release(const Event &)
virtual void val_inc(const Event &)
virtual void press(const Event &)
virtual void keystroke(const Event &)
virtual ~HocEditorForItem()
virtual void focus_out()
virtual void drag(const Event &)
EventButton b_
Definition: xmenu.h:275
HocValEditor * hve_
Definition: xmenu.h:272
virtual InputHandler * focus_in()
Definition: xmenu.h:137
CopyString str_
Definition: xmenu.h:149
HocItem * help_parent_
Definition: xmenu.h:150
virtual void help_parent(HocItem *)
virtual void write(ostream &)
HocItem(const char *, HocItem *parent=NULL)
virtual ~HocItem()
virtual void help(const char *childpath=NULL)
const char * getStr()
virtual void write(ostream &)
HocLabel(const char *)
virtual ~HocLabel()
virtual ~HocMenuAction()
HocPanel * hp_
Definition: xmenu.h:254
virtual void execute()
HocMenuAction(const char *action, Object *pyact, HocMenu *)
HocMenu * hm_
Definition: xmenu.h:253
Definition: xmenu.h:177
HocMenu(const char *, Menu *, MenuItem *, HocItem *parent=NULL, bool add2menubar=false)
virtual ~HocMenu()
virtual void write(ostream &)
MenuItem * mi_
Definition: xmenu.h:192
virtual Menu * menu()
Definition: xmenu.h:182
bool add2menubar_
Definition: xmenu.h:194
Menu * menu_
Definition: xmenu.h:193
virtual MenuItem * item()
Definition: xmenu.h:185
HocAction * a_
Definition: xmenu.h:162
HocPushButton(const char *, HocAction *, HocItem *parent=NULL)
virtual ~HocPushButton()
virtual void write(ostream &)
virtual void write(ostream &)
HocRadioAction * a_
Definition: xmenu.h:174
HocRadioButton(const char *, HocRadioAction *, HocItem *parent=NULL)
virtual ~HocRadioButton()
void button_action()
virtual void update_hoc_item()
virtual ~HocStateButton()
HocAction * action_
Definition: xmenu.h:506
CopyString * variable_
Definition: xmenu.h:501
Button * b_
Definition: xmenu.h:505
virtual void data_path(HocDataPaths *, bool)
double * pval_
Definition: xmenu.h:503
virtual void check_pointer(void *, int)
virtual void update_ptrs()
HocStateButton(double *, const char *, Button *, HocAction *, int, HocItem *parent=NULL, Object *pyvar=NULL)
CopyString * name_
Definition: xmenu.h:502
virtual void write(ostream &)
virtual void print(Printer *, const Allocation &) const
int style_
Definition: xmenu.h:500
Object * pyvar_
Definition: xmenu.h:504
MenuItem * b_
Definition: xmenu.h:535
virtual void check_pointer(void *, int)
virtual void write(ostream &)
virtual void data_path(HocDataPaths *, bool)
double * pval_
Definition: xmenu.h:533
virtual void update_hoc_item()
HocAction * action_
Definition: xmenu.h:536
virtual void update_ptrs()
CopyString * variable_
Definition: xmenu.h:531
CopyString * name_
Definition: xmenu.h:532
HocStateMenuItem(double *, const char *, MenuItem *, HocAction *, HocItem *parent=NULL, Object *pyvar=NULL)
Object * pyvar_
Definition: xmenu.h:534
virtual void print(Printer *, const Allocation &) const
virtual ~HocStateMenuItem()
virtual void update_hoc_item()
HocUpdateItem(const char *, HocItem *parent=NULL)
void update_ptrs_helper(double **)
virtual void check_pointer(void *, int vector_size)
virtual ~HocUpdateItem()
virtual void data_path(HocDataPaths *, bool)
virtual void update_ptrs()
Definition: xmenu.h:204
FieldSEditorAction * fea_
Definition: xmenu.h:430
void accept(FieldSEditor *)
HocValAction(const char *action, Object *pyact=0)
HocValEditor * fe_
Definition: xmenu.h:426
FieldSEditorAction * fea()
Definition: xmenu.h:421
virtual ~HocValAction()
HocValAction(Object *pyaction)
void execute()
void setFieldSEditor(HocValEditor *)
double * pval_
Definition: xmenu.h:357
Object * pyvar_
Definition: xmenu.h:360
virtual void write(ostream &)
HocAction * action_
Definition: xmenu.h:355
virtual void updateField()
virtual int hoc_default_val_editor()
Definition: xmenu.h:335
virtual void update_hoc_item()
CopyString * variable_
Definition: xmenu.h:356
virtual void print(Printer *, const Allocation &) const
double get_val()
virtual ~HocValEditor()
HocValEditor(const char *name, const char *variable, ValEdLabel *, HocValAction *, double *pd=0, bool canrun=false, HocItem *parent=NULL, Object *pvar=NULL)
bool canrun_
Definition: xmenu.h:354
const char * variable() const
virtual void exec_action()
virtual Stepper * stepper()
Definition: xmenu.h:324
ValEdLabel * prompt_
Definition: xmenu.h:358
virtual void setlimits(float *)
void evalField()
virtual void data_path(HocDataPaths *, bool)
void set_val(double)
bool active_
Definition: xmenu.h:353
FieldSEditor * field_editor()
Definition: xmenu.h:321
virtual void check_pointer(void *, int)
float * domain_limits_
Definition: xmenu.h:359
virtual double domain_limits(double)
HocEditorForItem * fe_
Definition: xmenu.h:352
bool active()
Definition: xmenu.h:344
virtual void update_ptrs()
virtual ~HocValEditorKeepUpdated()
HocValEditorKeepUpdated(const char *name, const char *variable, ValEdLabel *, HocValAction *, double *, HocItem *parent=NULL, Object *pyvar=NULL)
virtual void write(ostream &)
float inc_
Definition: xmenu.h:305
HocValStepper(HocValEditor *, Glyph *, Style *, TelltaleState *)
virtual void menu_up(Event &)
virtual ~HocValStepper()
void default_inc(bool, double)
double default_inc()
static HocValStepper * instance(HocValEditor *)
virtual void release(const Event &)
float default_inc_
Definition: xmenu.h:304
HocValEditor * hve_
Definition: xmenu.h:306
bool geometric_
Definition: xmenu.h:302
virtual void adjust()
virtual void press(const Event &)
static StepperMenu * menu_
Definition: xmenu.h:307
int steps_
Definition: xmenu.h:303
static StepperMenu * menu()
Definition: xmenu.h:289
virtual void data_path(HocDataPaths *, bool)
virtual void write(ostream &)
virtual ~HocVarLabel()
Object * pyvar_
Definition: xmenu.h:229
char ** cpp_
Definition: xmenu.h:226
char * cp_
Definition: xmenu.h:227
CopyString * variable_
Definition: xmenu.h:228
Patch * p_
Definition: xmenu.h:225
HocVarLabel(char **, PolyGlyph *, Object *pyvar=NULL)
virtual void check_pointer(void *, int)
virtual void update_hoc_item()
virtual void save(std::ostream &)
void audit()
virtual void data_path(HocDataPaths *, bool)
double * pval_
Definition: xmenu.h:468
bool vert_
Definition: xmenu.h:472
CopyString * variable_
Definition: xmenu.h:470
virtual void write(ostream &)
virtual double slider_val()
float resolution_
Definition: xmenu.h:465
virtual void update(Observable *)
bool slow_
Definition: xmenu.h:473
OcSlider(double *, float low, float high, float resolution, int nsteps, const char *send_cmd, bool vert, bool slow=false, Object *pyvar=NULL, Object *pysend=NULL)
BoundedValue * bv_
Definition: xmenu.h:466
virtual void update_ptrs()
Object * pyvar_
Definition: xmenu.h:469
virtual void update_hoc_item()
virtual void check_pointer(void *, int vector_size)
Adjustable * adjustable()
bool scrolling_
Definition: xmenu.h:471
virtual ~OcSlider()
HocCommand * send_
Definition: xmenu.h:467
char * name
Definition: init.cpp:16
static void activate()
#define parent
Definition: rbtqueue.cpp:47
#define NULL
Definition: sptree.h:16
Definition: hocdec.h:227
declarePtrList(HocUpdateItemList, HocUpdateItem) declarePtrList(HocItemList