Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4OpenGLXmConvenienceRoutines.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 //
27 // $Id$
28 //
29 //
30 // Andrew Walkden 16th April 1997
31 // G4OpenGLXmConvenienceRoutines :
32 // Collection of routines to facilitate
33 // the addition of simple push button boxes,
34 // and slider bars to the control panel.
35 //
36 // See G4OpenGLXmConvenienceRoutines.hh for more information.
37 
38 #ifdef G4VIS_BUILD_OPENGLXM_DRIVER
39 
40 #include "G4OpenGLXmViewer.hh"
41 
42 #include <Xm/Form.h>
43 #include <Xm/ToggleB.h>
44 #include <Xm/ArrowBG.h>
45 #include <Xm/RowColumn.h>
46 #include <Xm/TextF.h>
47 #include <Xm/Separator.h>
48 #include <Xm/Scale.h>
49 
50 void G4OpenGLXmViewer::Add_four_arrow_buttons (G4OpenGLXmViewer* pView,
51  XtCallbackRec** arrow_callbacks,
52  Widget* parent_widget) {
53 
54  Widget arrow_form = XtVaCreateWidget
55  ("arrow_form",
56  xmFormWidgetClass,
57  *parent_widget,
58  XmNfractionBase, 3,
59  XtNvisual, pView->vi->visual,
60  XtNdepth, pView->vi->depth,
61  XtNcolormap, pView->cmap,
62  XtNborderColor, pView->borcol,
63  XtNbackground, pView->bgnd,
64  NULL);
65 
66  Widget arrow = XtVaCreateManagedWidget
67  ("up_arrow",
68  xmArrowButtonGadgetClass,
69  arrow_form,
70  XmNtopAttachment, XmATTACH_POSITION,
71  XmNtopPosition, 0,
72  XmNbottomAttachment, XmATTACH_POSITION,
73  XmNbottomPosition, 1,
74  XmNleftAttachment, XmATTACH_POSITION,
75  XmNleftPosition, 1,
76  XmNrightAttachment, XmATTACH_POSITION,
77  XmNrightPosition, 2,
78  XmNarrowDirection, XmARROW_UP,
79  NULL);
80 
81  XtVaSetValues (arrow,
82  XmNuserData, True,
83  NULL);
84 
85  XtAddCallbacks (arrow,
86  XmNactivateCallback,
87  arrow_callbacks[0]);
88 
89  XtAddCallbacks (arrow,
90  XmNarmCallback,
91  arrow_callbacks[0]);
92 
93  XtAddCallbacks (arrow,
94  XmNdisarmCallback,
95  arrow_callbacks[0]);
96 
97  arrow = XtVaCreateManagedWidget
98  ("down_arrow",
99  xmArrowButtonGadgetClass,
100  arrow_form,
101  XmNtopAttachment, XmATTACH_POSITION,
102  XmNtopPosition, 2,
103  XmNbottomAttachment, XmATTACH_POSITION,
104  XmNbottomPosition, 3,
105  XmNleftAttachment, XmATTACH_POSITION,
106  XmNleftPosition, 1,
107  XmNrightAttachment, XmATTACH_POSITION,
108  XmNrightPosition, 2,
109  XmNarrowDirection, XmARROW_DOWN,
110  NULL);
111 
112  XtVaSetValues (arrow,
113  XmNuserData, False,
114  NULL);
115 
116  XtAddCallbacks (arrow,
117  XmNactivateCallback,
118  arrow_callbacks[1]);
119 
120  XtAddCallbacks (arrow,
121  XmNarmCallback,
122  arrow_callbacks[1]);
123 
124  XtAddCallbacks (arrow,
125  XmNdisarmCallback,
126  arrow_callbacks[1]);
127 
128  arrow = XtVaCreateManagedWidget
129  ("left_arrow",
130  xmArrowButtonGadgetClass,
131  arrow_form,
132  XmNtopAttachment, XmATTACH_POSITION,
133  XmNtopPosition, 1,
134  XmNbottomAttachment, XmATTACH_POSITION,
135  XmNbottomPosition, 2,
136  XmNleftAttachment, XmATTACH_POSITION,
137  XmNleftPosition, 0,
138  XmNrightAttachment, XmATTACH_POSITION,
139  XmNrightPosition, 1,
140  XmNarrowDirection, XmARROW_LEFT,
141  NULL);
142 
143  XtVaSetValues (arrow,
144  XmNuserData, False,
145  NULL);
146 
147  XtAddCallbacks (arrow,
148  XmNactivateCallback,
149  arrow_callbacks[2]);
150 
151  XtAddCallbacks (arrow,
152  XmNarmCallback,
153  arrow_callbacks[2]);
154 
155  XtAddCallbacks (arrow,
156  XmNdisarmCallback,
157  arrow_callbacks[2]);
158 
159  arrow = XtVaCreateManagedWidget
160  ("right_arrow",
161  xmArrowButtonGadgetClass,
162  arrow_form,
163  XmNtopAttachment, XmATTACH_POSITION,
164  XmNtopPosition, 1,
165  XmNbottomAttachment, XmATTACH_POSITION,
166  XmNbottomPosition, 2,
167  XmNleftAttachment, XmATTACH_POSITION,
168  XmNleftPosition, 2,
169  XmNrightAttachment, XmATTACH_POSITION,
170  XmNrightPosition, 3,
171  XmNarrowDirection, XmARROW_RIGHT,
172  NULL);
173 
174  XtVaSetValues (arrow,
175  XmNuserData, True,
176  NULL);
177 
178  XtAddCallbacks (arrow,
179  XmNactivateCallback,
180  arrow_callbacks[3]);
181 
182  XtAddCallbacks (arrow,
183  XmNarmCallback,
184  arrow_callbacks[3]);
185 
186  XtAddCallbacks (arrow,
187  XmNdisarmCallback,
188  arrow_callbacks[3]);
189 
190  XtManageChild (arrow_form);
191 
192 }
193 
194 void G4OpenGLXmViewer::Add_radio_box (char* label_string,
195  Widget* parent_widget,
196  XtCallbackRec* radio_box_callback,
197  G4int num_buttons,
198  G4int default_button,
199  char* radio_box_name,
200  char** button_names,
201  G4OpenGLXmViewer* pView)
202 {
203  XmString button_str = XmStringCreateLocalized((char*) ""); // ...to
204  // initialise to something to avoid pedantic warning.
205  Arg** args;
206  args = new Arg* [num_buttons];
207  Widget button;
208 
209  G4int i;
210  for (i = 0; i < num_buttons; i++) {
211 
212  args[i] = new Arg[7];
213  button_str = XmStringCreateLocalized (button_names[i]);
214 
215  XtSetArg (args[i][0], XtNvisual, pView->vi->visual);
216  XtSetArg (args[i][1], XtNdepth, pView->vi->depth);
217  XtSetArg (args[i][2], XtNcolormap, pView->cmap);
218  XtSetArg (args[i][3], XtNborderColor, pView->borcol);
219  XtSetArg (args[i][4], XtNbackground, pView->bgnd);
220  XtSetArg (args[i][5], XmNlabelString, button_str);
221 
222  if (i == default_button) {
223  XtSetArg (args[i][6], XmNset, True);
224  } else {
225  XtSetArg (args[i][6], XmNset, False);
226  }
227  }
228 
229  Widget radio_box = XtVaCreateWidget (radio_box_name,
230  xmRowColumnWidgetClass,
231  *parent_widget,
232  XmNisHomogeneous, False,
233  XmNradioBehavior, True,
234  XmNradioAlwaysOne, True,
235  XmNuserData, pView,
236  XtNvisual, pView->vi->visual,
237  XtNdepth, pView->vi->depth,
238  XtNcolormap, pView->cmap,
239  XtNborderColor, pView->borcol,
240  XtNbackground, pView->bgnd,
241  NULL);
242 
243  XmString lab = XmStringCreateLocalized (label_string);
244 
245  // Unused!
246  //Widget label = XtVaCreateManagedWidget ("radio_label",
247  // xmLabelWidgetClass,
248  // radio_box,
249  // XmNalignment, XmALIGNMENT_CENTER,
250  // XmNlabelString, lab,
251  // XtNvisual, pView->vi->visual,
252  // XtNdepth, pView->vi->depth,
253  // XtNcolormap, pView->cmap,
254  // XtNborderColor, pView->borcol,
255  // XtNbackground, pView->bgnd,
256  // NULL);
257 
258  XmStringFree (lab);
259 
260  for (i = 0; i < num_buttons; i++) {
261  button = XtCreateManagedWidget (button_names[i],
262  xmToggleButtonWidgetClass,
263  radio_box,
264  args[i],
265  7);
266  XtVaSetValues (button,
267  XmNuserData, i,
268  NULL);
269 
270  XtAddCallbacks (button,
271  XmNarmCallback,
272  radio_box_callback);
273  }
274 
275  XtManageChild (radio_box);
276 
277  XmStringFree (button_str);
278 
279  for (i = 0; i < num_buttons; i++) {
280 
281  delete[] args[i];
282 
283  }
284 
285  delete[] args;
286 }
287 
288 void G4OpenGLXmViewer::Add_set_field (char* w_name,
289  char* w_text,
290  Widget* row_col_box,
291  Widget* wid,
292  G4double* val,
293  G4OpenGLXmViewer* pView)
294 {
295 
296  char local_w_text[50];
297  strcpy (local_w_text, w_text);
298 
299  char label_name[50];
300  strcpy (label_name, w_name);
301  strcat (label_name, "_label");
302 
303  char text_field_name[50];
304  strcpy (text_field_name, w_name);
305  strcat (text_field_name, "_text_field");
306 
307  XmString local_text = XmStringCreateLocalized (local_w_text);
308 
309  // Unused!
310  // Widget label = XtVaCreateManagedWidget (label_name,
311  // xmLabelWidgetClass,
312  // *row_col_box,
313  // XmNlabelString, local_text,
314  // XtNvisual, pView->vi->visual,
315  // XtNdepth, pView->vi->depth,
316  // XtNcolormap, pView->cmap,
317  // XtNborderColor, pView->borcol,
318  // XtNbackground, pView->bgnd,
319  // NULL);
320 
321  XmStringFree (local_text);
322 
323  char initial[50];
324  sprintf (initial, "%6.2f", *val);
325 
326  *wid = XtVaCreateManagedWidget (text_field_name,
327  xmTextFieldWidgetClass,
328  *row_col_box,
329  XmNvalue, (String)initial,
330  XtNvisual, pView->vi->visual,
331  XtNdepth, pView->vi->depth,
332  XtNcolormap, pView->cmap,
333  XtNborderColor, pView->borcol,
334  XtNbackground, pView->bgnd,
335  NULL);
336 
337  XtAddCallback (*wid,
338  XmNvalueChangedCallback,
339  get_double_value_callback,
340  val);
341 
342  /* Not actually used - comment out to prevent compiler warnings.
343  Instead, just in case it matters, just invoke
344  XtVaCreateManagedWidget (JA)
345  Widget sep = XtVaCreateManagedWidget ("sep",
346  xmSeparatorWidgetClass,
347  *row_col_box,
348  XmNorientation, XmHORIZONTAL,
349  XtNvisual, pView->vi->visual,
350  XtNdepth, pView->vi->depth,
351  XtNcolormap, pView->cmap,
352  XtNborderColor, pView->borcol,
353  XtNbackground, pView->bgnd,
354  NULL);
355  sep = XtVaCreateManagedWidget ("sep",
356  xmSeparatorWidgetClass,
357  *row_col_box,
358  XmNseparatorType, XmNO_LINE,
359  XmNmargin, 1,
360  XmNorientation, XmHORIZONTAL,
361  XtNvisual, pView->vi->visual,
362  XtNdepth, pView->vi->depth,
363  XtNcolormap, pView->cmap,
364  XtNborderColor, pView->borcol,
365  XtNbackground, pView->bgnd,
366  NULL);
367  */
368  XtVaCreateManagedWidget ("sep",
369  xmSeparatorWidgetClass,
370  *row_col_box,
371  XmNseparatorType, XmNO_LINE,
372  XmNmargin, 1,
373  XmNorientation, XmHORIZONTAL,
374  XtNvisual, pView->vi->visual,
375  XtNdepth, pView->vi->depth,
376  XtNcolormap, pView->cmap,
377  XtNborderColor, pView->borcol,
378  XtNbackground, pView->bgnd,
379  NULL);
380 }
381 
382 void G4OpenGLXmViewer::Add_slider_box (char* label_string,
383  G4int num_sliders,
384  char** slider_names,
385  G4OpenGLXmViewer* pView,
386  G4double* min_array,
387  G4double* max_array,
388  G4double* value_array,
389  G4bool* show,
390  short* decimals,
391  unsigned char* orientation,
392  unsigned char* direction,
393  XtCallbackRec** slider_box_callbacks,
394  Widget* parent_widget)
395 {
396  XmString slider_name_str = XmStringCreateLocalized((char*) ""); // ...to
397  // initialise to something to avoid pedantic warning.
398  Arg** slider_args;
399  slider_args = new Arg*[num_sliders];
400  Widget slider;
401  G4int j = 0;
402 
403  G4int i;
404  for (i = 0; i < num_sliders; i++) {
405  j = 0;
406  slider_args[i] = new Arg[13];
407  slider_name_str = XmStringCreateLtoR (slider_names[i],
408  XmFONTLIST_DEFAULT_TAG);
409 
410  XtSetArg (slider_args[i][j],
411  XtNvisual, pView->vi->visual); j++;
412  XtSetArg (slider_args[i][j],
413  XtNdepth, pView->vi->depth); j++;
414  XtSetArg (slider_args[i][j],
415  XtNcolormap, pView->cmap); j++;
416  XtSetArg (slider_args[i][j],
417  XtNborderColor, pView->borcol); j++;
418  XtSetArg (slider_args[i][j],
419  XtNbackground, pView->bgnd); j++;
420 
421  XtSetArg (slider_args[i][j],
422  XmNtitleString, slider_name_str); j++;
423 
424  XtSetArg (slider_args[i][j],
425  XmNmaximum, G4int(max_array[i] * std::pow(10.0, (G4double)decimals[i]))); j++;
426  XtSetArg (slider_args[i][j],
427  XmNminimum, G4int(min_array[i] * std::pow(10.0, (G4double)decimals[i]))); j++;
428  XtSetArg (slider_args[i][j],
429  XmNvalue, G4int(value_array[i] * std::pow(10.0, (G4double)decimals[i]))); j++;
430  XtSetArg (slider_args[i][j],
431  XmNshowValue, show[i]); j++;
432  XtSetArg (slider_args[i][j],
433  XmNdecimalPoints, decimals[i]); j++;
434 
435  XtSetArg (slider_args[i][j],
436  XmNorientation, orientation[i]); j++;
437  XtSetArg (slider_args[i][j],
438  XmNprocessingDirection, direction[i]); j++;
439 
440  }
441 
442  Widget slider_box = XtVaCreateWidget ("slider_box",
443  xmRowColumnWidgetClass,
444  *parent_widget,
445  XmNisHomogeneous, False,
446  XtNvisual, pView->vi->visual,
447  XtNdepth, pView->vi->depth,
448  XtNcolormap, pView->cmap,
449  XtNborderColor, pView->borcol,
450  XtNbackground, pView->bgnd,
451  NULL);
452 
453  XmString lab = XmStringCreateLocalized (label_string);
454 
455  // Unused!
456  //Widget label = XtVaCreateManagedWidget ("slider_label",
457  // xmLabelWidgetClass,
458  // slider_box,
459  // XmNlabelString, lab,
460  // XmNalignment, XmALIGNMENT_CENTER,
461  // XtNvisual, pView->vi->visual,
462  // XtNdepth, pView->vi->depth,
463  // XtNcolormap, pView->cmap,
464  // XtNborderColor, pView->borcol,
465  // XtNbackground, pView->bgnd,
466  // NULL);
467 
468  XmStringFree (lab);
469 
470  for (i = 0; i < num_sliders; i++) {
471 
472  slider = XtCreateManagedWidget (slider_names[i],
473  xmScaleWidgetClass,
474  slider_box,
475  slider_args[i],
476  j);
477 
478  XtAddCallbacks (slider,
479  XmNvalueChangedCallback,
480  slider_box_callbacks[i]);
481 
482  XtAddCallbacks (slider,
483  XmNdragCallback,
484  slider_box_callbacks[i]);
485 
486  }
487 
488  XtManageChild (slider_box);
489  XmStringFree (slider_name_str);
490 
491  for (i = 0; i < num_sliders; i++) {
492 
493  delete[] slider_args[i];
494 
495  }
496 
497  delete[] slider_args;
498 
499 }
500 
501 void G4OpenGLXmViewer::get_double_value_callback (Widget w,
502  XtPointer clientData,
503  XtPointer)
504 {
505  G4double* val = (G4double*) clientData;
506  String string;
507 
508  XtVaGetValues (w,
509  XmNvalue, &string,
510  NULL);
511 
512  sscanf (string, "%lg", val);
513 
514 }
515 
516 void G4OpenGLXmViewer::get_text_callback (Widget w,
517  XtPointer clientData,
518  XtPointer)
519 {
520  char* txt = (char*)clientData;
521  String string;
522 
523  XtVaGetValues (w,
524  XmNvalue, &string,
525  NULL);
526 
527  sscanf (string, "%s", txt);
528 }
529 
530 G4bool G4OpenGLXmViewer::get_boolean_userData (Widget w)
531 {
532  XtPointer userData;
533  XtVaGetValues (w,XmNuserData,&userData,NULL);
534  return (G4bool)(((unsigned long)userData)&0xffff);
535 }
536 
537 G4int G4OpenGLXmViewer::get_int_userData (Widget w)
538 {
539  XtPointer userData;
540  XtVaGetValues (w,XmNuserData,&userData,NULL);
541  return (G4int)(unsigned long)userData;
542 }
543 
544 #endif
545 
546 
547 
548 
549