Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/OpenGL/src/G4OpenGLXmConvenienceRoutines.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 
 47 const G4String G4OpenGLXmViewer::e_str = "";
 48 
 49 void G4OpenGLXmViewer::Add_four_arrow_buttons (G4OpenGLXmViewer* pView,
 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 
193 void 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 
287 void G4OpenGLXmViewer::Add_set_field (char* w_name, 
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,
338      get_double_value_callback,
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 
381 void 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 
500 void G4OpenGLXmViewer::get_double_value_callback (Widget w, 
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 
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   strcpy(txt, string);
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