Files
geant4/source/visualization/OpenGL/src/G4OpenGLXmConvenienceRoutines.cc
T
2016-06-08 15:34:16 +02:00

501 lines
12 KiB
C++

// 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