/* **************************************************************** */ /* functions to handle control panel (sliders, labels, etc.) */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "xmovie.h" #define POPUPSHELLCLASS overrideShellWidgetClass /* **************************************************************** */ /* local typedefs */ typedef void (*InitFunc)(Widget parent); typedef struct { char *name; XtCallbackProc exec_func; XtPointer data; InitFunc init_func; } ButtonStruct; #define NBTN(a) (sizeof(a)/sizeof(ButtonStruct)) typedef struct { char *name; int value; Widget w; } ToggleStruct; #define TGLCNT(x) (sizeof(x)/sizeof(ToggleStruct)) typedef struct { char *name; XtCallbackProc callback; ToggleStruct *buttons; int nbuttons; Widget lw; } RadioStruct; typedef struct { char *labelname; Widget *label; char *slidername; Widget *slider; XtCallbackProc callback; } SliderLabelStruct; typedef struct { Widget *w; XtGrabKind grab; Bool stop_motion; } PopupData; /* **************************************************************** */ /* local prototypes */ PRIVATE void SetSpeed(float percent); PRIVATE void NewSpeed(Widget w, XtPointer client_data, XtPointer percent); PRIVATE void SetPosition(float percent); PRIVATE void NewPosition(Widget w, XtPointer client_data, XtPointer percent); PRIVATE void SetThickness(float percent); PRIVATE void NewThickness(Widget w, XtPointer client_data, XtPointer percent); PRIVATE void AxisSelect(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void DirectionSelect(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void MotionSelect(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void FindAndDisplaySlider(Widget w, XtCallbackProc func); PRIVATE void DrawAxes(void); PRIVATE void MakeRadioGroup(Widget parent, RadioStruct *radio); PRIVATE void MakeSliderWithLabel(Widget parent, SliderLabelStruct *sl); PRIVATE void SetRadio(RadioStruct *radio); PRIVATE void do_start(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void do_stop(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void do_restart(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void do_step(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void do_back(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void do_save_off(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void do_save_on(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void do_save_one(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void do_popup(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void cancel_popup(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void init_quit(Widget w); PRIVATE void quit_ok(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void init_atoms(Widget w); PRIVATE void init_bonds(Widget w); PRIVATE void init_bg(Widget w); PRIVATE void init_file(Widget w); PRIVATE void color_apply(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void bond_apply(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void bg_apply(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void file_apply(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE Pixel ConvertColorToPixel(Widget w, String color); PRIVATE XtActionProc NoOp(Widget w, XEvent event, String *params, Cardinal nparams); PRIVATE void visible_toggle(Widget w, XtPointer client_data, XtPointer call_data); PRIVATE void bvisible_toggle(Widget w, XtPointer client_data, XtPointer call_data); /* **************************************************************** */ /* local data */ static Widget QuitPopup = (Widget) 0, AtomPopup = (Widget) 0, BondPopup = (Widget) 0, BackgroundPopup = (Widget) 0, FileColorPopup = (Widget) 0, TimeLabel = (Widget) 0, SpeedBar = (Widget) 0, SpeedLabel = (Widget) 0, PositionBar = (Widget) 0, PositionLabel = (Widget) 0, ThicknessBar = (Widget) 0, ThicknessLabel = (Widget) 0, Axes = (Widget) 0, ReadInfo = (Widget) 0; static Widget BGDialog = (Widget) 0, FileDialog = (Widget) 0, *FGDialog = (Widget *) NULL, *Visible = (Widget *) NULL, *Invisible = (Widget *) NULL, *SizeDialog = (Widget *) NULL, *BFGDialog = (Widget *) NULL, *BVisible = (Widget *) NULL, *BInvisible = (Widget *) NULL, *ThicknessDialog= (Widget *) NULL; static PopupData QuitData = { &QuitPopup, XtGrabExclusive, True}, AtomData = { &AtomPopup, XtGrabNone, False }, BondData = { &BondPopup, XtGrabNone, False }, BackgroundData = { &BackgroundPopup, XtGrabNone, False }, FileColorData = { &FileColorPopup, XtGrabNone, False }; static ButtonStruct Buttons[] = { { "quit", do_popup, (XtPointer) &QuitData, init_quit }, { "start", do_start, NULL, NULL }, { "stop", do_stop, NULL, NULL }, { "restart", do_restart, NULL, NULL }, { "step", do_step, NULL, NULL }, { "back", do_back, NULL, NULL }, }; static ButtonStruct SaveButtons[] = { { "Off while animating", do_save_off, NULL, NULL }, { "On while animating", do_save_on , NULL, NULL }, { "This snapshot", do_save_one, NULL, NULL }, }; static ButtonStruct ColorButtons[] = { { "atoms", do_popup, (XtPointer) &AtomData, init_atoms }, { "bonds", do_popup, (XtPointer) &BondData, init_bonds }, { "background", do_popup, (XtPointer) &BackgroundData, init_bg }, { "filecolor", do_popup, (XtPointer) &FileColorData, init_file } }; static int in_motion; static SliderLabelStruct SpeedSL = { "speed", &SpeedLabel, "speedbar", &SpeedBar, NewSpeed }, PositionSL = { "position", &PositionLabel, "positionbar", &PositionBar, NewPosition }, ThicknessSL = { "thickness", &ThicknessLabel, "thicknessbar", &ThicknessBar, NewThickness } ; static ToggleStruct AxisButtons[] = { { "x", 0 }, { "y", 1 }, { "z", 2 } }, DirectionButtons[] = { { "vplus", 1 }, { "vminus", 0 } }, MotionButtons[] = { { "mplus", 1 }, { "mminus", -1 } } ; static RadioStruct AxisRadio = { "axis", AxisSelect, AxisButtons, TGLCNT(AxisButtons) }, DirectionRadio = { "viewdir", DirectionSelect, DirectionButtons, TGLCNT(DirectionButtons) }, MotionRadio = { "motiondir", MotionSelect, MotionButtons, TGLCNT(MotionButtons) } ; static int normal = 1; static char *null_string = ""; static XtActionsRec actions[] = { { "NoOp", (XtActionProc) NoOp}, }; /* **************************************************************** */ Widget CreateControl(Widget parent, char *name) { Widget form, command, button, menu; ButtonStruct *bptr; int bcnt; /* register the new actions */ XtAppAddActions(XtWidgetToApplicationContext(parent), actions, XtNumber(actions)); /* create a form widget to handle layout */ form = XtCreateManagedWidget(name, formWidgetClass, parent, NULL, ZERO); /* create all the command buttons */ for(bcnt = NBTN(Buttons), bptr = Buttons;bcnt > 0; bcnt--, bptr++){ /* create a button */ command = XtCreateManagedWidget(bptr->name, commandWidgetClass, form, NULL, ZERO); /* Add the function as a callback */ XtAddCallback(command, XtNcallback, bptr->exec_func, bptr->data); /* call initialization routine */ if (bptr->init_func) (bptr->init_func)(command); } /* create the save menu */ command = XtCreateManagedWidget("save", menuButtonWidgetClass, form, NULL, ZERO); menu = XtCreatePopupShell("menu", simpleMenuWidgetClass, command, NULL, ZERO); for(bcnt=NBTN(SaveButtons), bptr=SaveButtons; bcnt>0; bcnt--,bptr++){ button = XtCreateManagedWidget(bptr->name, smeBSBObjectClass, menu, NULL, ZERO); XtAddCallback(button, XtNcallback, bptr->exec_func,bptr->data); if (bptr->init_func) (bptr->init_func)(button); } /* create the color menu */ command = XtCreateManagedWidget("color", menuButtonWidgetClass, form, NULL, ZERO); menu = XtCreatePopupShell("menu", simpleMenuWidgetClass, command, NULL, ZERO); for(bcnt=NBTN(ColorButtons), bptr=ColorButtons; bcnt>0; bcnt--,bptr++){ button = XtCreateManagedWidget(bptr->name, smeBSBObjectClass, menu, NULL, ZERO); XtAddCallback(button, XtNcallback, bptr->exec_func,bptr->data); if (bptr->init_func) (bptr->init_func)(button); } /* create a label widget to display time */ TimeLabel = XtCreateManagedWidget("time", labelWidgetClass, form, NULL, ZERO); SetTime("Time: 0"); /* ************************************************ */ /* create all the sliders */ /* ************************************************ */ MakeSliderWithLabel(form, &SpeedSL); MakeSliderWithLabel(form, &PositionSL); MakeSliderWithLabel(form, &ThicknessSL); /* ******************************************************** */ /* create a radio group for axis, view, motion directions */ /* ******************************************************** */ MakeRadioGroup(form, &AxisRadio); MakeRadioGroup(form, &DirectionRadio); MakeRadioGroup(form, &MotionRadio); /* create a label widget to put axes in */ /* SJP - 10/02, had to add last NULL argument to each call */ Axes = XtVaCreateManagedWidget("axes", labelWidgetClass, form, XtNlabel, null_string,NULL); ReadInfo = XtVaCreateManagedWidget("read", labelWidgetClass, form, XtNlabel, null_string,NULL); } PRIVATE XtActionProc NoOp(Widget w, XEvent event, String *params, Cardinal nparams) { return; } void SetTime(char *s) { XtVaSetValues(TimeLabel, XtNlabel, s, NULL); } PRIVATE void SetSpeed(float percent) { char string[40]; int speed; speed = percent * 100; (void) sprintf(string,"Speed: %i", speed); XtVaSetValues(SpeedLabel, XtNlabel, string, NULL); } PRIVATE void NewSpeed(Widget w, XtPointer client_data, XtPointer percent_ptr) { float percent; percent = * (float *) percent_ptr; /* delay between frames in milliseconds */ Common.delay = 30 + 10.0/(0.01 + percent); SetSpeed(percent); } PRIVATE void SetPosition(float position) { char string[40]; static char *axis[] = { "X", "Y", "Z" }; (void) sprintf(string,"%s Position: %6.3f", axis[Common.axis], position); XtVaSetValues(PositionLabel, XtNlabel, string, NULL); } PRIVATE void NewPosition(Widget w, XtPointer client_data, XtPointer percent_ptr) { float percent; int i; float old_pos; percent = * (float *) percent_ptr; i = Common.axis; old_pos = Common.position; Common.position = (Common.bounds[i].high - Common.bounds[i].low) * percent + Common.bounds[i].low; SetPosition(Common.position); if (Common.position == old_pos) return; if (normal) SceneUpdate(); } PRIVATE void SetThickness(float thickness) { char string[40]; (void) sprintf(string,"Thickness: %6.3f", thickness); XtVaSetValues(ThicknessLabel, XtNlabel, string, NULL); } PRIVATE void NewThickness(Widget w, XtPointer client_data, XtPointer percent_ptr) { float percent; int i; float old_thick; percent = * (float *) percent_ptr; i = Common.axis; old_thick = Common.thickness; Common.thickness = (Common.bounds[i].high - Common.bounds[i].low) * percent; if (old_thick == Common.thickness) return; SetThickness(Common.thickness); if (normal) SceneUpdate(); } /* **************************************************************** */ PRIVATE void AxisSelect(Widget w, XtPointer client_data, XtPointer call_data) { int new_axis; new_axis = (int) client_data; if (new_axis == Common.axis) return; Common.axis = new_axis; DrawAxes(); normal = 0; FindAndDisplaySlider(PositionBar, NewPosition); FindAndDisplaySlider(ThicknessBar, NewThickness); normal = 1; SceneUpdate(); } PRIVATE void DirectionSelect(Widget w, XtPointer client_data, XtPointer call_data) { int new_dir; new_dir = (int) client_data; if (new_dir == Common.direction) return; Common.direction = new_dir; DrawAxes(); SceneUpdate(); } PRIVATE void MotionSelect(Widget w, XtPointer client_data, XtPointer call_data) { int new_dir; new_dir = (int) client_data; Common.dstep = new_dir; } PRIVATE void FindAndDisplaySlider(Widget w, XtCallbackProc func) { float percent; XtVaGetValues(w, XtNtopOfThumb, &percent, NULL); (func)(NULL, NULL, &percent); } void PositionUpdate(void) { FindAndDisplaySlider(PositionBar, NewPosition); } void ThicknessUpdate(void) { FindAndDisplaySlider(ThicknessBar, NewThickness); } void SpeedUpdate(void) { FindAndDisplaySlider(SpeedBar, NewSpeed); } /* **************************************************************** */ typedef struct { int x; int y; char *name; } LABEL; typedef struct { XSegment lines[6]; LABEL labels[2]; } AXIS; static AXIS axis_data[] = { { { { 120, 120, 120, 30 }, { 115, 35, 120, 30 }, { 120, 30, 125, 35 }, { 120, 120, 30, 120 }, { 35, 125, 30, 120 }, { 30, 120, 35, 115 } }, { { 15, 127, "Z" }, { 115, 25, "Y" } }, }, { { { 20, 20, 20, 110 }, { 15, 105, 20, 110 }, { 20, 110, 25, 105 }, { 20, 20, 110, 20 }, { 105, 15, 110, 20 }, { 110, 20, 105, 25 } }, { { 115, 27, "X" }, { 15, 127, "Z" } }, }, { { { 20, 120, 20, 30 }, { 15, 35, 20, 30 }, { 20, 30, 25, 35 }, { 20, 120, 110, 120 }, { 105, 125, 110, 120 }, { 110, 120, 105, 115 } }, { { 115, 127, "X" }, { 15, 27, "Y" } }, }, { { { 20, 120, 20, 30 }, { 15, 35, 20, 30 }, { 20, 30, 25, 35 }, { 20, 120, 110, 120 }, { 105, 125, 110, 120 }, { 110, 120, 105, 115 } }, { { 115, 127, "Z" }, { 15, 27, "Y" } }, }, { { { 20, 120, 20, 30 }, { 15, 35, 20, 30 }, { 20, 30, 25, 35 }, { 20, 120, 110, 120 }, { 105, 125, 110, 120 }, { 110, 120, 105, 115 } }, { { 115, 127, "X" }, { 15, 27, "Z" } }, }, { { { 20, 20, 20, 110 }, { 15, 105, 20, 110 }, { 20, 110, 25, 105 }, { 20, 20, 110, 20 }, { 105, 15, 110, 20 }, { 110, 20, 105, 25 } }, { { 115, 27, "X" }, { 15, 127, "Y" } }, }, }; PRIVATE void DrawAxes(void) { static int first = 1; static GC gc; static Dimension height, width; XGCValues xgc; AXIS *a; int i; XFontStruct *font; if ( Common.axis < 0 || Common.direction < 0 || !Axes || !XtIsRealized(Axes) ) return; if (first) { xgc.function = GXcopy; XtVaGetValues(Axes, XtNbackground, &xgc.background, XtNforeground, &xgc.foreground, XtNfont, &font, XtNheight, &height, XtNwidth, &width, NULL ); xgc.font = font->fid; gc = XCreateGC(XtDisplay(Axes), XtWindow(Axes), GCFunction | GCBackground | GCForeground | GCFont, &xgc); first = 0; } XClearWindow(XtDisplay(Axes), XtWindow(Axes)); a = axis_data + Common.axis + 3*Common.direction; XDrawSegments(XtDisplay(Axes), XtWindow(Axes), gc, a->lines, 6); for(i = 0; i < 2; i++) XDrawString(XtDisplay(Axes), XtWindow(Axes), gc, a->labels[i].x, a->labels[i].y, a->labels[i].name, strlen(a->labels[i].name)); } void ExposeAxes(Widget w, XEvent *event, String *strings, Cardinal *nstrings) { DrawAxes(); } /* **************************************************************** */ PRIVATE void MakeRadioGroup(Widget parent, RadioStruct *radio) { ToggleStruct *t; int i; if (radio->name) radio->lw = XtCreateManagedWidget(radio->name, labelWidgetClass, parent , NULL, ZERO ); for(t = radio->buttons, i = radio->nbuttons; i; i--, t++) { t->w = XtCreateManagedWidget(t->name, toggleWidgetClass, parent, NULL, ZERO); XtAddCallback(t->w, XtNcallback, radio->callback, (XtPointer) t->value); } } /* **************************************************************** */ PRIVATE void MakeSliderWithLabel(Widget parent, SliderLabelStruct *sl) { /* create the slider */ *(sl->slider) = XtCreateManagedWidget(sl->slidername, scrollbarWidgetClass, parent, NULL, ZERO); /* add the callback */ XtAddCallback(*(sl->slider), XtNjumpProc, sl->callback, NULL); /* create the label */ *(sl->label) = XtCreateManagedWidget(sl->labelname, labelWidgetClass, parent, NULL, ZERO); /* Initialize the display */ FindAndDisplaySlider(*(sl->slider), sl->callback); } void UpdateRadios(void) { SetRadio(&AxisRadio); SetRadio(&DirectionRadio); SetRadio(&MotionRadio); } PRIVATE void SetRadio(RadioStruct *radio) { ToggleStruct *t; int i; char set_name[80], *rg; t = radio->buttons; /* find out which toggle is currently set */ strcpy(set_name, (char *) XawToggleGetCurrent(t->w)); for(i = radio->nbuttons; i; i--, t++) if (!strcmp(set_name, t->name)) goto found_set; t = radio->buttons; XtVaGetValues(t->w, XtNradioGroup, &rg, NULL); fprintf(stderr,"Error: radioData for radioGroup %s inconsistent.\n", rg); XtDestroyApplicationContext(XtWidgetToApplicationContext(TopLevel)); exit(0); found_set: /* call the callback with the proper data */ (radio->callback)((Widget) t->w, (XtPointer) t->value, (XtPointer) 0); } void SetReadString(char *s) { if (ReadInfo == (Widget) 0) return; XtVaSetValues(ReadInfo, XtNlabel, s, NULL); } /* **************************************************************** */ PRIVATE void init_quit(Widget parent) { Widget dialog; /* create a popup shell */ QuitPopup = XtCreatePopupShell("popup", POPUPSHELLCLASS, parent, NULL, ZERO); /* put a dialog box in it */ dialog = XtCreateManagedWidget("dialog", dialogWidgetClass, QuitPopup, NULL, ZERO); XawDialogAddButton(dialog, "ok", quit_ok, (XtPointer) dialog); XawDialogAddButton(dialog, "cancel", cancel_popup, (XtPointer) &QuitData); } /* **************************************************************** */ PRIVATE void do_popup(Widget w, XtPointer client_data, XtPointer call_data) { Position x, y; PopupData *pdata; pdata = (PopupData *) client_data; /* stop motion for now */ if (pdata->stop_motion) { in_motion = Common.motion; RemoveMotion(); } /* translate to corner of calling widgets window */ XtTranslateCoords(w, 0, 0, &x, &y); /* Set us to pop up there */ XtVaSetValues(*(pdata->w), XtNx, x, XtNy, y, NULL); /* do the popping */ XtPopup(*(pdata->w), pdata->grab); } PRIVATE void quit_ok(Widget w, XtPointer client_data, XtPointer call_data) { XtDestroyApplicationContext(XtWidgetToApplicationContext(w)); exit(0); } PRIVATE void cancel_popup(Widget w, XtPointer client_data, XtPointer call_data) { PopupData *pdata; pdata = (PopupData *) client_data; if (pdata->stop_motion && in_motion) InstallMotion(); XtPopdown(*(pdata->w)); } /* **************************************************************** */ PRIVATE void do_start(Widget w, XtPointer client_data, XtPointer call_data) { InstallMotion(); } PRIVATE void do_stop(Widget w, XtPointer client_data, XtPointer call_data) { RemoveMotion(); } PRIVATE void do_restart(Widget w, XtPointer client_data, XtPointer call_data) { RemoveMotion(); if (Common.dstep > 0) Common.step = 0; else Common.step = Common.ndata-1; InstallMotion(); } PRIVATE void do_step(Widget w, XtPointer client_data, XtPointer call_data) { RemoveMotion(); Common.step = CoerceStep(Common.step + 1); SceneUpdate(); } PRIVATE void do_back(Widget w, XtPointer client_data, XtPointer call_data) { RemoveMotion(); Common.step = CoerceStep(Common.step - 1); SceneUpdate(); } PRIVATE void do_save_off(Widget w, XtPointer client_data, XtPointer call_data) { Common.saveflag = 0; } PRIVATE void do_save_on(Widget w, XtPointer client_data, XtPointer call_data) { Common.saveflag = 1; } PRIVATE void do_save_one(Widget w, XtPointer client_data, XtPointer call_data) { SceneSave(); } /* **************************************************************** */ PRIVATE void init_atoms(Widget parent) { Widget outerform, form; Widget apply, cancel, last; char formname[80], fglabel[80], sizelabel[80]; char fgname[80], sizename[80], vname[80], iname[80]; int i, j; size_t size; /* create a popup shell for atom colors */ AtomPopup = XtCreatePopupShell("atomcolors", transientShellWidgetClass, TopLevel, NULL, ZERO); /* put a form widget in it for layout */ outerform = XtCreateManagedWidget("form", formWidgetClass, AtomPopup, NULL, ZERO); /* add the buttons */ apply = XtCreateManagedWidget("apply", commandWidgetClass, outerform, NULL, ZERO); XtAddCallback(apply, XtNcallback, color_apply, (XtPointer) NULL); cancel = XtVaCreateManagedWidget("cancel", commandWidgetClass, outerform, XtNfromHoriz, apply, NULL); XtAddCallback(cancel, XtNcallback, cancel_popup, (XtPointer) &AtomData); /* put the dialog boxes in it for the colors */ /* ************************************************ */ /* allocate all the widgets */ /* ************************************************ */ size = Common.natomcolors * sizeof(Widget); FGDialog = (Widget *) XtMalloc(size); SizeDialog = (Widget *) XtMalloc(size); Visible = (Widget *) XtMalloc(size); Invisible = (Widget *) XtMalloc(size); /* ************************************************ */ /* build the rest of the panel */ /* ************************************************ */ last = apply; for(i = 0; i < Common.natomcolors; i++) { j = i+1; sprintf(formname, "colorform%i", j); sprintf(fgname, "color%i", j); sprintf(fglabel, "Type %i Color", j); sprintf(sizename, "size%i", j); sprintf(sizelabel, "Type %i Diameter", j); sprintf(vname, "visible%i", j); sprintf(iname, "invisible%i", j); form = XtVaCreateManagedWidget(formname, formWidgetClass, outerform, XtNfromVert, last, NULL); FGDialog[i] = XtVaCreateManagedWidget(fgname, dialogWidgetClass, form, XtNlabel, fglabel, XtNvalue, "white", NULL); SizeDialog[i] = XtVaCreateManagedWidget(sizename, dialogWidgetClass, form, XtNlabel, sizelabel, XtNvalue, "10", XtNfromHoriz, FGDialog[i], NULL); Visible[i] = XtVaCreateManagedWidget(vname, toggleWidgetClass, form, XtNlabel, "Visible", XtNstate, True, XtNfromVert, FGDialog[i], NULL); Invisible[i] = XtVaCreateManagedWidget(iname, toggleWidgetClass, form, XtNlabel, "Invisible", XtNstate, False, XtNradioGroup, Visible[i], XtNfromHoriz, Visible[i], XtNfromVert, FGDialog[i], NULL); XtAddCallback(Visible[i], XtNcallback, visible_toggle, (XtPointer) i); XtAddCallback(Invisible[i], XtNcallback, visible_toggle, (XtPointer) i); Common.atoms_visible[i] = True; Common.diameter[i] = 10; last = form; } } /* **************************************************************** */ PRIVATE void init_bg(Widget parent) { Widget outerform; Widget apply, cancel; /* create a popup shell for background color */ BackgroundPopup = XtCreatePopupShell("backcolors", transientShellWidgetClass, TopLevel, NULL, ZERO); /* put a form widget in it for layout */ outerform = XtCreateManagedWidget("form", formWidgetClass, BackgroundPopup, NULL, ZERO); /* add the buttons */ apply = XtCreateManagedWidget("apply", commandWidgetClass, outerform, NULL, ZERO); XtAddCallback(apply, XtNcallback, bg_apply, (XtPointer) NULL); cancel = XtVaCreateManagedWidget("cancel", commandWidgetClass, outerform, XtNfromHoriz, apply, NULL); XtAddCallback(cancel, XtNcallback, cancel_popup, (XtPointer) &BackgroundData); /* put the dialog box in it for the color */ BGDialog = XtVaCreateManagedWidget("bg", dialogWidgetClass, outerform, XtNfromVert, apply, NULL); } /* **************************************************************** */ PRIVATE void init_file(Widget parent) { Widget outerform; Widget apply, cancel; /* create a popup shell for color file */ FileColorPopup = XtCreatePopupShell("filecolors", transientShellWidgetClass, TopLevel, NULL, ZERO); /* put a form widget in it for layout */ outerform = XtCreateManagedWidget("form", formWidgetClass, FileColorPopup, NULL, ZERO); /* add the buttons */ apply = XtCreateManagedWidget("apply", commandWidgetClass, outerform, NULL, ZERO); XtAddCallback(apply, XtNcallback, file_apply, (XtPointer) NULL); cancel = XtVaCreateManagedWidget("cancel", commandWidgetClass, outerform, XtNfromHoriz, apply, NULL); XtAddCallback(cancel, XtNcallback, cancel_popup, (XtPointer) &FileColorData); /* put the dialog box in it for the filename */ FileDialog = XtVaCreateManagedWidget("file", dialogWidgetClass, outerform, XtNfromVert, apply, NULL); } PRIVATE void init_bonds(Widget parent) { Widget outerform, form; Widget apply, cancel, last; char formname[80], fglabel[80], sizelabel[80]; char fgname[80], sizename[80], vname[80], iname[80]; int i, j; size_t size; /* create a popup shell for bond colors */ BondPopup = XtCreatePopupShell("bondcolors", transientShellWidgetClass, TopLevel, NULL, ZERO); /* put a form widget in it for layout */ outerform = XtCreateManagedWidget("form", formWidgetClass, BondPopup, NULL, ZERO); /* add the buttons */ apply = XtCreateManagedWidget("apply", commandWidgetClass, outerform, NULL, ZERO); XtAddCallback(apply, XtNcallback, bond_apply, (XtPointer) NULL); cancel = XtVaCreateManagedWidget("cancel", commandWidgetClass, outerform, XtNfromHoriz, apply, NULL); XtAddCallback(cancel, XtNcallback, cancel_popup, (XtPointer) &BondData); /* ************************************************ */ /* allocate all the widgets */ /* ************************************************ */ size = Common.nbondcolors * sizeof(Widget); BFGDialog = (Widget *) XtMalloc(size); ThicknessDialog = (Widget *) XtMalloc(size); BVisible = (Widget *) XtMalloc(size); BInvisible = (Widget *) XtMalloc(size); /* ************************************************ */ /* build the rest of the panel */ /* ************************************************ */ last = apply; for(i = 0; i < Common.nbondcolors; i++) { j = i+1; sprintf(formname, "bondform%i", j); sprintf(fgname, "color%i", j); sprintf(fglabel, "Bond Type %i Color", j); sprintf(sizename, "thickness%i", j); sprintf(sizelabel, "Bond Type %i Thickness",j); sprintf(vname, "visible%i", j); sprintf(iname, "invisible%i", j); form = XtVaCreateManagedWidget(formname, formWidgetClass, outerform, XtNfromVert, last, NULL); BFGDialog[i] = XtVaCreateManagedWidget(fgname, dialogWidgetClass, form, XtNlabel, fglabel, XtNvalue, "white", NULL); ThicknessDialog[i] = XtVaCreateManagedWidget(sizename, dialogWidgetClass, form, XtNlabel, sizelabel, XtNvalue, "1", XtNfromHoriz, BFGDialog[i], NULL); BVisible[i] = XtVaCreateManagedWidget(vname, toggleWidgetClass, form, XtNlabel, "Visible", XtNstate, True, XtNfromVert, BFGDialog[i], NULL); BInvisible[i] = XtVaCreateManagedWidget(iname, toggleWidgetClass, form, XtNlabel, "Invisible", XtNstate, False, XtNradioGroup, BVisible[i], XtNfromHoriz, BVisible[i], XtNfromVert, BFGDialog[i], NULL); XtAddCallback(BVisible[i], XtNcallback, bvisible_toggle, (XtPointer) i); XtAddCallback(BInvisible[i], XtNcallback, bvisible_toggle, (XtPointer) i); Common.bonds_visible[i] = True; last = form; } } /* **************************************************************** */ PRIVATE void color_apply(Widget w, XtPointer client_data, XtPointer call_data) { static String *fg, *size; static Pixel *fgpixel; static int *diam; static Bool first = True; Boolean ok; int i, n; if (first) { n = Common.natomcolors; fg = (String *) XtMalloc( n * sizeof(String) ); size = (String *) XtMalloc( n * sizeof(String) ); fgpixel = (Pixel *) XtMalloc( n * sizeof(Pixel) ); diam = (int *) XtMalloc( n * sizeof(int) ); first = False; } ok = True; for(i = 0; i < Common.natomcolors; i++) { fg[i] = XawDialogGetValueString(FGDialog[i]); fgpixel[i] = ConvertColorToPixel(FGDialog[i], fg[i]); if (fgpixel[i] == (Pixel) -1) { ok = False; XtVaSetValues(FGDialog[i], XtNvalue, "-Invalid Color-", NULL); } size[i] = XawDialogGetValueString(SizeDialog[i]); diam[i] = atoi(size[i]); if (diam[i] < 1 || diam[i] > MAXDIAM) { ok = False; XtVaSetValues(SizeDialog[i], XtNvalue, "-Invalid Size-", NULL); } } if (!ok){ XBell(XtDisplay(BGDialog), 0); return; } SetAtomColors(fgpixel); for(i = 0; i < Common.natomcolors; i++) Common.diameter[i] = diam[i]; SceneUpdate(); } /* **************************************************************** */ PRIVATE void bond_apply(Widget w, XtPointer client_data, XtPointer call_data) { static String *fg, *size; static Pixel *fgpixel; static Dimension *thick; static Bool first = True; Boolean ok; int i, n, ithick; if (first) { n = Common.nbondcolors; fg = (String *) XtMalloc( n * sizeof(String) ); size = (String *) XtMalloc( n * sizeof(String) ); fgpixel = (Pixel *) XtMalloc( n * sizeof(Pixel) ); thick = (Dimension *) XtMalloc( n * sizeof(Dimension) ); first = False; } ok = True; for(i = 0; i < Common.nbondcolors; i++) { fg[i] = XawDialogGetValueString(BFGDialog[i]); fgpixel[i] = ConvertColorToPixel(BFGDialog[i], fg[i]); if (fgpixel[i] == (Pixel) -1) { ok = False; XtVaSetValues(BFGDialog[i], XtNvalue, "-Invalid Color-", NULL); } size[i] = XawDialogGetValueString(ThicknessDialog[i]); ithick = atoi(size[i]); if (ithick < 1 || ithick > MAXTHICK) { ok = False; XtVaSetValues(ThicknessDialog[i], XtNvalue, "-Invalid Size-", NULL); } thick[i] = ithick; } if (!ok){ XBell(XtDisplay(BGDialog), 0); return; } SetBondColors(fgpixel, thick); SceneUpdate(); } /* **************************************************************** */ PRIVATE void bg_apply(Widget w, XtPointer client_data, XtPointer call_data) { String bg; Pixel bgpixel; bg = XawDialogGetValueString(BGDialog); bgpixel = ConvertColorToPixel(BGDialog, bg); if (bgpixel == (Pixel) -1) { XtVaSetValues(BGDialog, XtNvalue, "-Invalid Color-", NULL); XBell(XtDisplay(BGDialog), 0); return; } SetBGColor(bgpixel); SceneUpdate(); } PRIVATE Pixel ConvertColorToPixel(Widget w, String color) { XrmValue from, to; Pixel pixel; from.size = strlen(color) + 1; from.addr = color; /* SJP - 10/02, new Linux couldn't fine caddr_t */ /* to.addr = (caddr_t) &pixel; */ to.addr = (char *) &pixel; to.size = sizeof(pixel); if (XtConvertAndStore(w, XtRString, (XrmValuePtr) &from, XtRPixel, (XrmValuePtr) &to)) return(pixel); else return( (Pixel) -1); } PRIVATE void file_apply(Widget w, XtPointer client_data, XtPointer call_data) { String bg; Pixel bgpixel; static String *fg, *size; static Pixel *fgpixel; static int *diam; static Bool first = True; int i, n; if (first) { n = Common.natomcolors; fg = (String *) XtMalloc( n * sizeof(String) ); size = (String *) XtMalloc( n * sizeof(String) ); fgpixel = (Pixel *) XtMalloc( n * sizeof(Pixel) ); diam = (int *) XtMalloc( n * sizeof(int) ); first = False; } for(i = 0; i < Common.natomcolors; i++) { fg[i] = "red"; fgpixel[i] = ConvertColorToPixel(FGDialog[i], fg[i]); if (fgpixel[i] == (Pixel) -1) return; XtVaSetValues(FGDialog[i], XtNvalue, fg[i], NULL); size[i] = "20"; diam[i] = atoi(size[i]); if (diam[i] < 1 || diam[i] > MAXDIAM) return; XtVaSetValues(SizeDialog[i], XtNvalue, size[i], NULL); } SetAtomColors(fgpixel); for(i = 0; i < Common.natomcolors; i++) Common.diameter[i] = diam[i]; /* Common.atoms_visible[0] = 0; Common.atoms_visible[1] = 0; Common.atoms_visible[2] = 0; Common.atoms_visible[3] = 0; */ bg = "green"; bgpixel = ConvertColorToPixel(BGDialog, bg); if (bgpixel == (Pixel) -1) { XtVaSetValues(BGDialog, XtNvalue, "-Invalid Color-", NULL); XBell(XtDisplay(BGDialog), 0); return; } SetBGColor(bgpixel); SceneUpdate(); } PRIVATE void visible_toggle(Widget w, XtPointer client_data, XtPointer call_data) { int i; XtPointer data; char c; i = (int) client_data; XtVaGetValues(w, XtNradioData, &data, NULL); c = *((char *) data); Common.atoms_visible[i] = c == 'v'; } PRIVATE void bvisible_toggle(Widget w, XtPointer client_data, XtPointer call_data) { int i; XtPointer data; char c; i = (int) client_data; XtVaGetValues(w, XtNradioData, &data, NULL); c = *((char *) data); Common.bonds_visible[i] = c == 'v'; }