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