// This code implementation is the intellectual property of // the GEANT4 collaboration. // // By copying, distributing or modifying the Program (or any work // based on the Program) you indicate your acceptance of this statement, // and all its terms. // // $Id: G4OpenGLXmConvenienceRoutines.cc,v 1.3 1999/12/15 14:54:09 gunter Exp $ // GEANT4 tag $Name: geant4-01-01 $ // // // Andrew Walkden 16th April 1997 // G4OpenGLXmConvenienceRoutines : // Collection of routines to facilitate // the addition of simple push button boxes, // and slider bars to the control panel. // // See G4OpenGLXmConvenienceRoutines.hh for more information. #ifdef G4VIS_BUILD_OPENGLXM_DRIVER //#include "G4OpenGLXmConvenienceRoutines.hh" #include "G4OpenGLXmViewer.hh" void G4OpenGLXmViewer::Add_four_arrow_buttons (G4OpenGLXmViewer* pView, XtCallbackRec** arrow_callbacks, Widget* parent_widget) { Widget arrow_form = XtVaCreateWidget ("arrow_form", xmFormWidgetClass, *parent_widget, XmNfractionBase, 3, XtNvisual, pView->vi->visual, XtNdepth, pView->vi->depth, XtNcolormap, pView->cmap, XtNborderColor, pView->borcol, XtNbackground, pView->bgnd, NULL); Widget arrow = XtVaCreateManagedWidget ("up_arrow", xmArrowButtonGadgetClass, arrow_form, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 0, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 1, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 1, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, XmNarrowDirection, XmARROW_UP, NULL); XtVaSetValues (arrow, XmNuserData, True, NULL); XtAddCallbacks (arrow, XmNactivateCallback, arrow_callbacks[0]); XtAddCallbacks (arrow, XmNarmCallback, arrow_callbacks[0]); XtAddCallbacks (arrow, XmNdisarmCallback, arrow_callbacks[0]); arrow = XtVaCreateManagedWidget ("down_arrow", xmArrowButtonGadgetClass, arrow_form, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 2, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 3, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 1, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, XmNarrowDirection, XmARROW_DOWN, NULL); XtVaSetValues (arrow, XmNuserData, False, NULL); XtAddCallbacks (arrow, XmNactivateCallback, arrow_callbacks[1]); XtAddCallbacks (arrow, XmNarmCallback, arrow_callbacks[1]); XtAddCallbacks (arrow, XmNdisarmCallback, arrow_callbacks[1]); arrow = XtVaCreateManagedWidget ("left_arrow", xmArrowButtonGadgetClass, arrow_form, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 1, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 1, XmNarrowDirection, XmARROW_LEFT, NULL); XtVaSetValues (arrow, XmNuserData, False, NULL); XtAddCallbacks (arrow, XmNactivateCallback, arrow_callbacks[2]); XtAddCallbacks (arrow, XmNarmCallback, arrow_callbacks[2]); XtAddCallbacks (arrow, XmNdisarmCallback, arrow_callbacks[2]); arrow = XtVaCreateManagedWidget ("right_arrow", xmArrowButtonGadgetClass, arrow_form, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 1, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 2, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 3, XmNarrowDirection, XmARROW_RIGHT, NULL); XtVaSetValues (arrow, XmNuserData, True, NULL); XtAddCallbacks (arrow, XmNactivateCallback, arrow_callbacks[3]); XtAddCallbacks (arrow, XmNarmCallback, arrow_callbacks[3]); XtAddCallbacks (arrow, XmNdisarmCallback, arrow_callbacks[3]); XtManageChild (arrow_form); } void G4OpenGLXmViewer::Add_radio_box (char* label_string, Widget* parent_widget, XtCallbackRec* radio_box_callback, G4int num_buttons, G4int default_button, char* radio_box_name, char** button_names, G4OpenGLXmViewer* pView) { XmString button_str; Arg** args; args = new Arg* [num_buttons]; Widget button; G4int i; for (i = 0; i < num_buttons; i++) { args[i] = new Arg[7]; button_str = XmStringCreateLocalized (button_names[i]); XtSetArg (args[i][0], XtNvisual, pView->vi->visual); XtSetArg (args[i][1], XtNdepth, pView->vi->depth); XtSetArg (args[i][2], XtNcolormap, pView->cmap); XtSetArg (args[i][3], XtNborderColor, pView->borcol); XtSetArg (args[i][4], XtNbackground, pView->bgnd); XtSetArg (args[i][5], XmNlabelString, button_str); if (i == default_button) { XtSetArg (args[i][6], XmNset, True); } else { XtSetArg (args[i][6], XmNset, False); } } Widget radio_box = XtVaCreateWidget (radio_box_name, xmRowColumnWidgetClass, *parent_widget, XmNisHomogeneous, False, XmNradioBehavior, True, XmNradioAlwaysOne, True, XmNuserData, pView, XtNvisual, pView->vi->visual, XtNdepth, pView->vi->depth, XtNcolormap, pView->cmap, XtNborderColor, pView->borcol, XtNbackground, pView->bgnd, NULL); XmString lab = XmStringCreateLocalized (label_string); Widget label = XtVaCreateManagedWidget ("radio_label", xmLabelWidgetClass, radio_box, XmNalignment, XmALIGNMENT_CENTER, XmNlabelString, lab, XtNvisual, pView->vi->visual, XtNdepth, pView->vi->depth, XtNcolormap, pView->cmap, XtNborderColor, pView->borcol, XtNbackground, pView->bgnd, NULL); XmStringFree (lab); for (i = 0; i < num_buttons; i++) { button = XtCreateManagedWidget (button_names[i], xmToggleButtonWidgetClass, radio_box, args[i], 7); XtVaSetValues (button, XmNuserData, i, NULL); XtAddCallbacks (button, XmNarmCallback, radio_box_callback); } XtManageChild (radio_box); XmStringFree (button_str); for (i = 0; i < num_buttons; i++) { delete[] args[i]; } delete[] args; } void G4OpenGLXmViewer::Add_set_field (char* w_name, char* w_text, Widget* row_col_box, Widget* wid, G4double* val, G4OpenGLXmViewer* pView) { char local_w_text[50]; strcpy (local_w_text, w_text); char label_name[50]; strcpy (label_name, w_name); strcat (label_name, "_label"); char text_field_name[50]; strcpy (text_field_name, w_name); strcat (text_field_name, "_text_field"); XmString local_text = XmStringCreateLocalized (local_w_text); Widget label = XtVaCreateManagedWidget (label_name, xmLabelWidgetClass, *row_col_box, XmNlabelString, local_text, XtNvisual, pView->vi->visual, XtNdepth, pView->vi->depth, XtNcolormap, pView->cmap, XtNborderColor, pView->borcol, XtNbackground, pView->bgnd, NULL); XmStringFree (local_text); char initial[50]; sprintf (initial, "%6.2f\0", *val); *wid = XtVaCreateManagedWidget (text_field_name, xmTextFieldWidgetClass, *row_col_box, XmNvalue, (String)initial, XtNvisual, pView->vi->visual, XtNdepth, pView->vi->depth, XtNcolormap, pView->cmap, XtNborderColor, pView->borcol, XtNbackground, pView->bgnd, NULL); XtAddCallback (*wid, XmNvalueChangedCallback, G4OpenGLXmViewer::get_double_value_callback, val); Widget sep = XtVaCreateManagedWidget ("sep", xmSeparatorWidgetClass, *row_col_box, XmNorientation, XmHORIZONTAL, XtNvisual, pView->vi->visual, XtNdepth, pView->vi->depth, XtNcolormap, pView->cmap, XtNborderColor, pView->borcol, XtNbackground, pView->bgnd, NULL); sep = XtVaCreateManagedWidget ("sep", xmSeparatorWidgetClass, *row_col_box, XmNseparatorType, XmNO_LINE, XmNmargin, 1, XmNorientation, XmHORIZONTAL, XtNvisual, pView->vi->visual, XtNdepth, pView->vi->depth, XtNcolormap, pView->cmap, XtNborderColor, pView->borcol, XtNbackground, pView->bgnd, NULL); } void G4OpenGLXmViewer::Add_slider_box (char* label_string, G4int num_sliders, char** slider_names, G4OpenGLXmViewer* pView, G4double* min_array, G4double* max_array, G4double* value_array, G4bool* show, short* decimals, unsigned char* orientation, unsigned char* direction, XtCallbackRec** slider_box_callbacks, Widget* parent_widget) { XmString slider_name_str; Arg** slider_args; slider_args = new Arg*[num_sliders]; Widget slider; G4int j = 0; G4int i; for (i = 0; i < num_sliders; i++) { j = 0; slider_args[i] = new Arg[13]; slider_name_str = XmStringCreateLtoR (slider_names[i], XmFONTLIST_DEFAULT_TAG); XtSetArg (slider_args[i][j], XtNvisual, pView->vi->visual); j++; XtSetArg (slider_args[i][j], XtNdepth, pView->vi->depth); j++; XtSetArg (slider_args[i][j], XtNcolormap, pView->cmap); j++; XtSetArg (slider_args[i][j], XtNborderColor, pView->borcol); j++; XtSetArg (slider_args[i][j], XtNbackground, pView->bgnd); j++; XtSetArg (slider_args[i][j], XmNtitleString, slider_name_str); j++; XtSetArg (slider_args[i][j], XmNmaximum, G4int(max_array[i] * pow(10.0, (G4double)decimals[i]))); j++; XtSetArg (slider_args[i][j], XmNminimum, G4int(min_array[i] * pow(10.0, (G4double)decimals[i]))); j++; XtSetArg (slider_args[i][j], XmNvalue, G4int(value_array[i] * pow(10.0, (G4double)decimals[i]))); j++; XtSetArg (slider_args[i][j], XmNshowValue, show[i]); j++; XtSetArg (slider_args[i][j], XmNdecimalPoints, decimals[i]); j++; XtSetArg (slider_args[i][j], XmNorientation, orientation[i]); j++; XtSetArg (slider_args[i][j], XmNprocessingDirection, direction[i]); j++; } Widget slider_box = XtVaCreateWidget ("slider_box", xmRowColumnWidgetClass, *parent_widget, XmNisHomogeneous, False, XtNvisual, pView->vi->visual, XtNdepth, pView->vi->depth, XtNcolormap, pView->cmap, XtNborderColor, pView->borcol, XtNbackground, pView->bgnd, NULL); XmString lab = XmStringCreateLocalized (label_string); Widget label = XtVaCreateManagedWidget ("slider_label", xmLabelWidgetClass, slider_box, XmNlabelString, lab, XmNalignment, XmALIGNMENT_CENTER, XtNvisual, pView->vi->visual, XtNdepth, pView->vi->depth, XtNcolormap, pView->cmap, XtNborderColor, pView->borcol, XtNbackground, pView->bgnd, NULL); XmStringFree (lab); for (i = 0; i < num_sliders; i++) { slider = XtCreateManagedWidget (slider_names[i], xmScaleWidgetClass, slider_box, slider_args[i], j); XtAddCallbacks (slider, XmNvalueChangedCallback, slider_box_callbacks[i]); XtAddCallbacks (slider, XmNdragCallback, slider_box_callbacks[i]); } XtManageChild (slider_box); XmStringFree (slider_name_str); for (i = 0; i < num_sliders; i++) { delete[] slider_args[i]; } delete[] slider_args; } void G4OpenGLXmViewer::get_double_value_callback (Widget w, XtPointer clientData, XtPointer) { G4double* val = (G4double*) clientData; String string; XtVaGetValues (w, XmNvalue, &string, NULL); sscanf (string, "%lg", val); } void G4OpenGLXmViewer::get_text_callback (Widget w, XtPointer clientData, XtPointer) { char* txt = (char*)clientData; String string; XtVaGetValues (w, XmNvalue, &string, NULL); sscanf (string, "%s", txt); } G4bool G4OpenGLXmViewer::get_boolean_userData (Widget w) { XtPointer userData; XtVaGetValues (w,XmNuserData,&userData,NULL); return (G4bool)(unsigned long)userData; } G4int G4OpenGLXmViewer::get_int_userData (Widget w) { XtPointer userData; XtVaGetValues (w,XmNuserData,&userData,NULL); return (G4int)(unsigned long)userData; } #endif