#include <stdio.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/Toggle.h>
#include "xgc.h"
static void print_text_to_buffer(Widget, caddr_t, caddr_t);
ChoiceDesc *
create_choice(Widget w, XgcStuff *info)
{
ChoiceDesc *choice;
int i;
char *text;
static Arg labelargs[] = {
{XtNborderWidth, (XtArgVal) 0},
{XtNjustify, (XtArgVal) XtJustifyRight},
{XtNvertDistance, (XtArgVal) 4}
};
static Arg toggleargs[] = {
{XtNfromHoriz, (XtArgVal) NULL},
{XtNfromVert, (XtArgVal) NULL},
{XtNhorizDistance, (XtArgVal) 4},
{XtNvertDistance, (XtArgVal) 4},
{XtNradioGroup, (XtArgVal) NULL},
{XtNcallback, (XtArgVal) NULL}
};
static XtCallbackRec callbacklist[] = {
{(XtCallbackProc) print_text_to_buffer, NULL},
{NULL, NULL}
};
choice = (ChoiceDesc *) XtMalloc(sizeof(ChoiceDesc));
choice->widgets = (WidgetList) XtMalloc(sizeof(Widget) *
info->choice.num_toggles);
choice->size = info->choice.num_toggles;
choice->label = XtCreateManagedWidget(info->choice.name,labelWidgetClass,w,
labelargs,XtNumber(labelargs));
toggleargs[5].value = (XtArgVal) callbacklist;
for (i = 0; i < info->choice.num_toggles; ++i) {
if (i == 0) {
toggleargs[0].value = (XtArgVal) choice->label;
toggleargs[1].value = (XtArgVal) NULL;
toggleargs[2].value = (XtArgVal) 10;
toggleargs[3].value = (XtArgVal) 4;
toggleargs[4].value = (XtArgVal) NULL;
}
else {
toggleargs[4].value = (XtArgVal) choice->widgets[0];
if (info->choice.columns > 0 &&
i > 1 &&
(i % (info->choice.columns) == 0)) {
toggleargs[0].value = (XtArgVal) choice->label;
toggleargs[1].value = (XtArgVal) choice->widgets[i - info->choice.columns];
toggleargs[2].value = (XtArgVal) 10;
toggleargs[3].value = (XtArgVal) 4;
}
else {
toggleargs[0].value = (XtArgVal) choice->widgets[i - 1];
toggleargs[1].value = (XtArgVal) NULL;
toggleargs[2].value = (XtArgVal) -1;
toggleargs[3].value = (XtArgVal) 4;
}
if (info->choice.columns > 0 &&
i >= info->choice.columns) {
toggleargs[1].value = (XtArgVal) choice->widgets[i - info->choice.columns];
toggleargs[3].value = (XtArgVal) -1;
}
}
text = (char *) XtMalloc((unsigned) (strlen(info->choice.text) +
strlen((info->data)[i].text) + 3));
strcpy(text, info->choice.text);
strcat(text, " ");
strcat(text, (info->data)[i].text);
strcat(text, "\n");
callbacklist[0].closure = (caddr_t) text;
choice->widgets[i] = XtCreateManagedWidget((info->data[i]).name,
toggleWidgetClass,
w,
toggleargs,
XtNumber(toggleargs));
}
if (info->choice.columns > 0) {
Dimension maxwidth = 0;
Dimension width;
static Arg args[] = {
{XtNwidth, (XtArgVal) NULL}
};
args[0].value = (XtArgVal) &width;
for (i = 0; i < info->choice.num_toggles; ++i) {
XtGetValues(choice->widgets[i],args,1);
maxwidth = max(maxwidth,width);
}
args[0].value = (XtArgVal) maxwidth;
for (i = 0; i < info->choice.num_toggles; ++i)
XtSetValues(choice->widgets[i],args,1);
}
return (choice);
}
void
select_button(ChoiceDesc *choice, int togglenum)
{
static Arg toggleargs[] = {
{XtNstate, (XtArgVal) True}
};
XtSetValues(choice->widgets[togglenum],toggleargs,XtNumber(toggleargs));
}
void
line_up_labels(ChoiceDesc *descs[], int numdescs)
{
int i;
Dimension width;
Dimension maxwidth = (Dimension) 0;
static Arg widthargs[] = {
{XtNwidth, (XtArgVal) NULL }
};
widthargs[0].value = (XtArgVal) &width;
for (i = 0; i < numdescs; ++i) {
XtGetValues(descs[i]->label, widthargs, XtNumber(widthargs));
maxwidth = max(maxwidth,width);
}
widthargs[0].value = (XtArgVal) maxwidth;
for (i = 0; i < numdescs; ++i) {
XtSetValues(descs[i]->label, widthargs, XtNumber(widthargs));
}
}
void
choose_defaults(ChoiceDesc *descs[], int numdescs)
{
int i;
int j;
for (i = 0; i < numdescs; ++i) {
j = 0;
if (i == 0)
j = 3;
select_button(descs[i],j);
XtCallCallbacks(descs[i]->widgets[j], XtNcallback, (caddr_t) NULL);
}
}
static void
print_text_to_buffer(
Widget w,
caddr_t closure,
caddr_t call_data)
{
interpret((char *) closure);
}