Geant4 Cross Reference |
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