00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifdef G4VIS_BUILD_OPENGLXM_DRIVER
00039
00040 #include "G4OpenGLXmViewer.hh"
00041
00042 #include <Xm/Form.h>
00043 #include <Xm/ToggleB.h>
00044 #include <Xm/ArrowBG.h>
00045 #include <Xm/RowColumn.h>
00046 #include <Xm/TextF.h>
00047 #include <Xm/Separator.h>
00048 #include <Xm/Scale.h>
00049
00050 void G4OpenGLXmViewer::Add_four_arrow_buttons (G4OpenGLXmViewer* pView,
00051 XtCallbackRec** arrow_callbacks,
00052 Widget* parent_widget) {
00053
00054 Widget arrow_form = XtVaCreateWidget
00055 ("arrow_form",
00056 xmFormWidgetClass,
00057 *parent_widget,
00058 XmNfractionBase, 3,
00059 XtNvisual, pView->vi->visual,
00060 XtNdepth, pView->vi->depth,
00061 XtNcolormap, pView->cmap,
00062 XtNborderColor, pView->borcol,
00063 XtNbackground, pView->bgnd,
00064 NULL);
00065
00066 Widget arrow = XtVaCreateManagedWidget
00067 ("up_arrow",
00068 xmArrowButtonGadgetClass,
00069 arrow_form,
00070 XmNtopAttachment, XmATTACH_POSITION,
00071 XmNtopPosition, 0,
00072 XmNbottomAttachment, XmATTACH_POSITION,
00073 XmNbottomPosition, 1,
00074 XmNleftAttachment, XmATTACH_POSITION,
00075 XmNleftPosition, 1,
00076 XmNrightAttachment, XmATTACH_POSITION,
00077 XmNrightPosition, 2,
00078 XmNarrowDirection, XmARROW_UP,
00079 NULL);
00080
00081 XtVaSetValues (arrow,
00082 XmNuserData, True,
00083 NULL);
00084
00085 XtAddCallbacks (arrow,
00086 XmNactivateCallback,
00087 arrow_callbacks[0]);
00088
00089 XtAddCallbacks (arrow,
00090 XmNarmCallback,
00091 arrow_callbacks[0]);
00092
00093 XtAddCallbacks (arrow,
00094 XmNdisarmCallback,
00095 arrow_callbacks[0]);
00096
00097 arrow = XtVaCreateManagedWidget
00098 ("down_arrow",
00099 xmArrowButtonGadgetClass,
00100 arrow_form,
00101 XmNtopAttachment, XmATTACH_POSITION,
00102 XmNtopPosition, 2,
00103 XmNbottomAttachment, XmATTACH_POSITION,
00104 XmNbottomPosition, 3,
00105 XmNleftAttachment, XmATTACH_POSITION,
00106 XmNleftPosition, 1,
00107 XmNrightAttachment, XmATTACH_POSITION,
00108 XmNrightPosition, 2,
00109 XmNarrowDirection, XmARROW_DOWN,
00110 NULL);
00111
00112 XtVaSetValues (arrow,
00113 XmNuserData, False,
00114 NULL);
00115
00116 XtAddCallbacks (arrow,
00117 XmNactivateCallback,
00118 arrow_callbacks[1]);
00119
00120 XtAddCallbacks (arrow,
00121 XmNarmCallback,
00122 arrow_callbacks[1]);
00123
00124 XtAddCallbacks (arrow,
00125 XmNdisarmCallback,
00126 arrow_callbacks[1]);
00127
00128 arrow = XtVaCreateManagedWidget
00129 ("left_arrow",
00130 xmArrowButtonGadgetClass,
00131 arrow_form,
00132 XmNtopAttachment, XmATTACH_POSITION,
00133 XmNtopPosition, 1,
00134 XmNbottomAttachment, XmATTACH_POSITION,
00135 XmNbottomPosition, 2,
00136 XmNleftAttachment, XmATTACH_POSITION,
00137 XmNleftPosition, 0,
00138 XmNrightAttachment, XmATTACH_POSITION,
00139 XmNrightPosition, 1,
00140 XmNarrowDirection, XmARROW_LEFT,
00141 NULL);
00142
00143 XtVaSetValues (arrow,
00144 XmNuserData, False,
00145 NULL);
00146
00147 XtAddCallbacks (arrow,
00148 XmNactivateCallback,
00149 arrow_callbacks[2]);
00150
00151 XtAddCallbacks (arrow,
00152 XmNarmCallback,
00153 arrow_callbacks[2]);
00154
00155 XtAddCallbacks (arrow,
00156 XmNdisarmCallback,
00157 arrow_callbacks[2]);
00158
00159 arrow = XtVaCreateManagedWidget
00160 ("right_arrow",
00161 xmArrowButtonGadgetClass,
00162 arrow_form,
00163 XmNtopAttachment, XmATTACH_POSITION,
00164 XmNtopPosition, 1,
00165 XmNbottomAttachment, XmATTACH_POSITION,
00166 XmNbottomPosition, 2,
00167 XmNleftAttachment, XmATTACH_POSITION,
00168 XmNleftPosition, 2,
00169 XmNrightAttachment, XmATTACH_POSITION,
00170 XmNrightPosition, 3,
00171 XmNarrowDirection, XmARROW_RIGHT,
00172 NULL);
00173
00174 XtVaSetValues (arrow,
00175 XmNuserData, True,
00176 NULL);
00177
00178 XtAddCallbacks (arrow,
00179 XmNactivateCallback,
00180 arrow_callbacks[3]);
00181
00182 XtAddCallbacks (arrow,
00183 XmNarmCallback,
00184 arrow_callbacks[3]);
00185
00186 XtAddCallbacks (arrow,
00187 XmNdisarmCallback,
00188 arrow_callbacks[3]);
00189
00190 XtManageChild (arrow_form);
00191
00192 }
00193
00194 void G4OpenGLXmViewer::Add_radio_box (char* label_string,
00195 Widget* parent_widget,
00196 XtCallbackRec* radio_box_callback,
00197 G4int num_buttons,
00198 G4int default_button,
00199 char* radio_box_name,
00200 char** button_names,
00201 G4OpenGLXmViewer* pView)
00202 {
00203 XmString button_str = XmStringCreateLocalized((char*) "");
00204
00205 Arg** args;
00206 args = new Arg* [num_buttons];
00207 Widget button;
00208
00209 G4int i;
00210 for (i = 0; i < num_buttons; i++) {
00211
00212 args[i] = new Arg[7];
00213 button_str = XmStringCreateLocalized (button_names[i]);
00214
00215 XtSetArg (args[i][0], XtNvisual, pView->vi->visual);
00216 XtSetArg (args[i][1], XtNdepth, pView->vi->depth);
00217 XtSetArg (args[i][2], XtNcolormap, pView->cmap);
00218 XtSetArg (args[i][3], XtNborderColor, pView->borcol);
00219 XtSetArg (args[i][4], XtNbackground, pView->bgnd);
00220 XtSetArg (args[i][5], XmNlabelString, button_str);
00221
00222 if (i == default_button) {
00223 XtSetArg (args[i][6], XmNset, True);
00224 } else {
00225 XtSetArg (args[i][6], XmNset, False);
00226 }
00227 }
00228
00229 Widget radio_box = XtVaCreateWidget (radio_box_name,
00230 xmRowColumnWidgetClass,
00231 *parent_widget,
00232 XmNisHomogeneous, False,
00233 XmNradioBehavior, True,
00234 XmNradioAlwaysOne, True,
00235 XmNuserData, pView,
00236 XtNvisual, pView->vi->visual,
00237 XtNdepth, pView->vi->depth,
00238 XtNcolormap, pView->cmap,
00239 XtNborderColor, pView->borcol,
00240 XtNbackground, pView->bgnd,
00241 NULL);
00242
00243 XmString lab = XmStringCreateLocalized (label_string);
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 XmStringFree (lab);
00259
00260 for (i = 0; i < num_buttons; i++) {
00261 button = XtCreateManagedWidget (button_names[i],
00262 xmToggleButtonWidgetClass,
00263 radio_box,
00264 args[i],
00265 7);
00266 XtVaSetValues (button,
00267 XmNuserData, i,
00268 NULL);
00269
00270 XtAddCallbacks (button,
00271 XmNarmCallback,
00272 radio_box_callback);
00273 }
00274
00275 XtManageChild (radio_box);
00276
00277 XmStringFree (button_str);
00278
00279 for (i = 0; i < num_buttons; i++) {
00280
00281 delete[] args[i];
00282
00283 }
00284
00285 delete[] args;
00286 }
00287
00288 void G4OpenGLXmViewer::Add_set_field (char* w_name,
00289 char* w_text,
00290 Widget* row_col_box,
00291 Widget* wid,
00292 G4double* val,
00293 G4OpenGLXmViewer* pView)
00294 {
00295
00296 char local_w_text[50];
00297 strcpy (local_w_text, w_text);
00298
00299 char label_name[50];
00300 strcpy (label_name, w_name);
00301 strcat (label_name, "_label");
00302
00303 char text_field_name[50];
00304 strcpy (text_field_name, w_name);
00305 strcat (text_field_name, "_text_field");
00306
00307 XmString local_text = XmStringCreateLocalized (local_w_text);
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321 XmStringFree (local_text);
00322
00323 char initial[50];
00324 sprintf (initial, "%6.2f", *val);
00325
00326 *wid = XtVaCreateManagedWidget (text_field_name,
00327 xmTextFieldWidgetClass,
00328 *row_col_box,
00329 XmNvalue, (String)initial,
00330 XtNvisual, pView->vi->visual,
00331 XtNdepth, pView->vi->depth,
00332 XtNcolormap, pView->cmap,
00333 XtNborderColor, pView->borcol,
00334 XtNbackground, pView->bgnd,
00335 NULL);
00336
00337 XtAddCallback (*wid,
00338 XmNvalueChangedCallback,
00339 get_double_value_callback,
00340 val);
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368 XtVaCreateManagedWidget ("sep",
00369 xmSeparatorWidgetClass,
00370 *row_col_box,
00371 XmNseparatorType, XmNO_LINE,
00372 XmNmargin, 1,
00373 XmNorientation, XmHORIZONTAL,
00374 XtNvisual, pView->vi->visual,
00375 XtNdepth, pView->vi->depth,
00376 XtNcolormap, pView->cmap,
00377 XtNborderColor, pView->borcol,
00378 XtNbackground, pView->bgnd,
00379 NULL);
00380 }
00381
00382 void G4OpenGLXmViewer::Add_slider_box (char* label_string,
00383 G4int num_sliders,
00384 char** slider_names,
00385 G4OpenGLXmViewer* pView,
00386 G4double* min_array,
00387 G4double* max_array,
00388 G4double* value_array,
00389 G4bool* show,
00390 short* decimals,
00391 unsigned char* orientation,
00392 unsigned char* direction,
00393 XtCallbackRec** slider_box_callbacks,
00394 Widget* parent_widget)
00395 {
00396 XmString slider_name_str = XmStringCreateLocalized((char*) "");
00397
00398 Arg** slider_args;
00399 slider_args = new Arg*[num_sliders];
00400 Widget slider;
00401 G4int j = 0;
00402
00403 G4int i;
00404 for (i = 0; i < num_sliders; i++) {
00405 j = 0;
00406 slider_args[i] = new Arg[13];
00407 slider_name_str = XmStringCreateLtoR (slider_names[i],
00408 XmFONTLIST_DEFAULT_TAG);
00409
00410 XtSetArg (slider_args[i][j],
00411 XtNvisual, pView->vi->visual); j++;
00412 XtSetArg (slider_args[i][j],
00413 XtNdepth, pView->vi->depth); j++;
00414 XtSetArg (slider_args[i][j],
00415 XtNcolormap, pView->cmap); j++;
00416 XtSetArg (slider_args[i][j],
00417 XtNborderColor, pView->borcol); j++;
00418 XtSetArg (slider_args[i][j],
00419 XtNbackground, pView->bgnd); j++;
00420
00421 XtSetArg (slider_args[i][j],
00422 XmNtitleString, slider_name_str); j++;
00423
00424 XtSetArg (slider_args[i][j],
00425 XmNmaximum, G4int(max_array[i] * std::pow(10.0, (G4double)decimals[i]))); j++;
00426 XtSetArg (slider_args[i][j],
00427 XmNminimum, G4int(min_array[i] * std::pow(10.0, (G4double)decimals[i]))); j++;
00428 XtSetArg (slider_args[i][j],
00429 XmNvalue, G4int(value_array[i] * std::pow(10.0, (G4double)decimals[i]))); j++;
00430 XtSetArg (slider_args[i][j],
00431 XmNshowValue, show[i]); j++;
00432 XtSetArg (slider_args[i][j],
00433 XmNdecimalPoints, decimals[i]); j++;
00434
00435 XtSetArg (slider_args[i][j],
00436 XmNorientation, orientation[i]); j++;
00437 XtSetArg (slider_args[i][j],
00438 XmNprocessingDirection, direction[i]); j++;
00439
00440 }
00441
00442 Widget slider_box = XtVaCreateWidget ("slider_box",
00443 xmRowColumnWidgetClass,
00444 *parent_widget,
00445 XmNisHomogeneous, False,
00446 XtNvisual, pView->vi->visual,
00447 XtNdepth, pView->vi->depth,
00448 XtNcolormap, pView->cmap,
00449 XtNborderColor, pView->borcol,
00450 XtNbackground, pView->bgnd,
00451 NULL);
00452
00453 XmString lab = XmStringCreateLocalized (label_string);
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468 XmStringFree (lab);
00469
00470 for (i = 0; i < num_sliders; i++) {
00471
00472 slider = XtCreateManagedWidget (slider_names[i],
00473 xmScaleWidgetClass,
00474 slider_box,
00475 slider_args[i],
00476 j);
00477
00478 XtAddCallbacks (slider,
00479 XmNvalueChangedCallback,
00480 slider_box_callbacks[i]);
00481
00482 XtAddCallbacks (slider,
00483 XmNdragCallback,
00484 slider_box_callbacks[i]);
00485
00486 }
00487
00488 XtManageChild (slider_box);
00489 XmStringFree (slider_name_str);
00490
00491 for (i = 0; i < num_sliders; i++) {
00492
00493 delete[] slider_args[i];
00494
00495 }
00496
00497 delete[] slider_args;
00498
00499 }
00500
00501 void G4OpenGLXmViewer::get_double_value_callback (Widget w,
00502 XtPointer clientData,
00503 XtPointer)
00504 {
00505 G4double* val = (G4double*) clientData;
00506 String string;
00507
00508 XtVaGetValues (w,
00509 XmNvalue, &string,
00510 NULL);
00511
00512 sscanf (string, "%lg", val);
00513
00514 }
00515
00516 void G4OpenGLXmViewer::get_text_callback (Widget w,
00517 XtPointer clientData,
00518 XtPointer)
00519 {
00520 char* txt = (char*)clientData;
00521 String string;
00522
00523 XtVaGetValues (w,
00524 XmNvalue, &string,
00525 NULL);
00526
00527 sscanf (string, "%s", txt);
00528 }
00529
00530 G4bool G4OpenGLXmViewer::get_boolean_userData (Widget w)
00531 {
00532 XtPointer userData;
00533 XtVaGetValues (w,XmNuserData,&userData,NULL);
00534 return (G4bool)(((unsigned long)userData)&0xffff);
00535 }
00536
00537 G4int G4OpenGLXmViewer::get_int_userData (Widget w)
00538 {
00539 XtPointer userData;
00540 XtVaGetValues (w,XmNuserData,&userData,NULL);
00541 return (G4int)(unsigned long)userData;
00542 }
00543
00544 #endif
00545
00546
00547
00548
00549