#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>
#include <X11/Xos.h>
#include <X11/Xmu/Misc.h>
#include <X11/Xaw/AsciiText.h>
#include <X11/Xaw/Cardinals.h>
#include <X11/Xaw/Command.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/DialogP.h>
#include <X11/Xaw/XawInit.h>
#include "Private.h"
#define MAGIC_VALUE ((char *)3)
#define streq(a,b) (strcmp((a), (b)) == 0)
static void XawDialogConstraintInitialize(Widget, Widget,
ArgList, Cardinal*);
static void XawDialogGetValuesHook(Widget, ArgList, Cardinal*);
static void XawDialogInitialize(Widget, Widget, ArgList, Cardinal*);
static Boolean XawDialogSetValues(Widget, Widget, Widget,
ArgList, Cardinal*);
static void CreateDialogValueWidget(Widget);
static XtResource resources[] = {
{
XtNlabel,
XtCLabel,
XtRString,
sizeof(String),
XtOffsetOf(DialogRec, dialog.label),
XtRString,
NULL
},
{
XtNvalue,
XtCValue,
XtRString,
sizeof(String),
XtOffsetOf(DialogRec, dialog.value),
XtRString,
NULL
},
{
XtNicon,
XtCIcon,
XtRBitmap,
sizeof(Pixmap),
XtOffsetOf(DialogRec, dialog.icon),
XtRImmediate,
0
},
};
DialogClassRec dialogClassRec = {
{
(WidgetClass)&formClassRec,
"Dialog",
sizeof(DialogRec),
XawInitializeWidgetSet,
NULL,
False,
XawDialogInitialize,
NULL,
XtInheritRealize,
NULL,
0,
resources,
XtNumber(resources),
NULLQUARK,
True,
True,
True,
False,
NULL,
XtInheritResize,
XtInheritExpose,
XawDialogSetValues,
NULL,
XtInheritSetValuesAlmost,
XawDialogGetValuesHook,
NULL,
XtVersion,
NULL,
NULL,
XtInheritQueryGeometry,
XtInheritDisplayAccelerator,
NULL,
},
{
XtInheritGeometryManager,
XtInheritChangeManaged,
XtInheritInsertChild,
XtInheritDeleteChild,
NULL,
},
{
NULL,
0,
sizeof(DialogConstraintsRec),
XawDialogConstraintInitialize,
NULL,
NULL,
NULL,
},
{
XtInheritLayout,
},
{
NULL,
}
};
WidgetClass dialogWidgetClass = (WidgetClass)&dialogClassRec;
static void
XawDialogInitialize(Widget request, Widget cnew,
ArgList args, Cardinal *num_args)
{
DialogWidget dw = (DialogWidget)cnew;
Arg arglist[9];
Cardinal arg_cnt = 0;
XtSetArg(arglist[arg_cnt], XtNborderWidth, 0); arg_cnt++;
XtSetArg(arglist[arg_cnt], XtNleft, XtChainLeft); arg_cnt++;
if (dw->dialog.icon != (Pixmap)0) {
XtSetArg(arglist[arg_cnt], XtNbitmap, dw->dialog.icon); arg_cnt++;
XtSetArg(arglist[arg_cnt], XtNright, XtChainLeft); arg_cnt++;
dw->dialog.iconW = XtCreateManagedWidget("icon", labelWidgetClass,
cnew, arglist, arg_cnt);
arg_cnt = 2;
XtSetArg(arglist[arg_cnt], XtNfromHoriz, dw->dialog.iconW); arg_cnt++;
}
else
dw->dialog.iconW = NULL;
XtSetArg(arglist[arg_cnt], XtNlabel, dw->dialog.label); arg_cnt++;
XtSetArg(arglist[arg_cnt], XtNright, XtChainRight); arg_cnt++;
dw->dialog.labelW = XtCreateManagedWidget("label", labelWidgetClass,
cnew, arglist, arg_cnt);
if (dw->dialog.iconW != NULL &&
XtHeight(dw->dialog.labelW) < XtHeight(dw->dialog.iconW)) {
XtSetArg(arglist[0], XtNheight, XtHeight(dw->dialog.iconW));
XtSetValues(dw->dialog.labelW, arglist, 1);
}
if (dw->dialog.value != NULL)
CreateDialogValueWidget((Widget)dw);
else
dw->dialog.valueW = NULL;
}
static void
XawDialogConstraintInitialize(Widget request, Widget cnew,
ArgList args, Cardinal *num_args)
{
DialogWidget dw = (DialogWidget)cnew->core.parent;
DialogConstraints constraint = (DialogConstraints)cnew->core.constraints;
if (!XtIsSubclass(cnew, commandWidgetClass))
return;
constraint->form.left = constraint->form.right = XtChainLeft;
if (dw->dialog.valueW == NULL)
constraint->form.vert_base = dw->dialog.labelW;
else
constraint->form.vert_base = dw->dialog.valueW;
if (dw->composite.num_children > 1) {
WidgetList children = dw->composite.children;
Widget *childP;
for (childP = children + dw->composite.num_children - 1;
childP >= children; childP-- ) {
if (*childP == dw->dialog.labelW || *childP == dw->dialog.valueW)
break;
if (XtIsManaged(*childP) &&
XtIsSubclass(*childP, commandWidgetClass)) {
constraint->form.horiz_base = *childP;
break;
}
}
}
}
#define ICON 0
#define LABEL 1
#define NUM_CHECKS 2
static Boolean
XawDialogSetValues(Widget current, Widget request, Widget cnew,
ArgList in_args, Cardinal *in_num_args)
{
DialogWidget w = (DialogWidget)cnew;
DialogWidget old = (DialogWidget)current;
Arg args[5];
Cardinal num_args;
unsigned int i;
Bool checks[NUM_CHECKS];
for (i = 0; i < NUM_CHECKS; i++)
checks[i] = False;
for (i = 0; i < *in_num_args; i++) {
if (streq(XtNicon, in_args[i].name))
checks[ICON] = True;
else if (streq(XtNlabel, in_args[i].name))
checks[LABEL] = True;
}
if (checks[ICON]) {
if (w->dialog.icon != 0) {
XtSetArg(args[0], XtNbitmap, w->dialog.icon);
if (old->dialog.iconW != NULL)
XtSetValues(old->dialog.iconW, args, 1);
else {
XtSetArg(args[1], XtNborderWidth, 0);
XtSetArg(args[2], XtNleft, XtChainLeft);
XtSetArg(args[3], XtNright, XtChainLeft);
w->dialog.iconW = XtCreateWidget("icon", labelWidgetClass,
cnew, args, 4);
((DialogConstraints)w->dialog.labelW->core.constraints)->
form.horiz_base = w->dialog.iconW;
XtManageChild(w->dialog.iconW);
}
}
else if (old->dialog.icon != 0) {
((DialogConstraints)w->dialog.labelW->core.constraints)->
form.horiz_base = NULL;
XtDestroyWidget(old->dialog.iconW);
w->dialog.iconW = NULL;
}
}
if (checks[LABEL]) {
num_args = 0;
XtSetArg(args[num_args], XtNlabel, w->dialog.label); num_args++;
if (w->dialog.iconW != NULL &&
XtHeight(w->dialog.labelW) <= XtHeight(w->dialog.iconW)) {
XtSetArg(args[num_args], XtNheight, XtHeight(w->dialog.iconW));
num_args++;
}
XtSetValues(w->dialog.labelW, args, num_args);
}
if (w->dialog.value != old->dialog.value) {
if (w->dialog.value == NULL)
XtDestroyWidget(old->dialog.valueW);
else if (old->dialog.value == NULL) {
XtWidth(w) = XtWidth(old);
XtHeight(w) = XtHeight(old);
CreateDialogValueWidget(cnew);
}
else {
Arg nargs[1];
XtSetArg(nargs[0], XtNstring, w->dialog.value);
XtSetValues(w->dialog.valueW, nargs, 1);
w->dialog.value = MAGIC_VALUE;
}
}
return (False);
}
static void
XawDialogGetValuesHook(Widget w, ArgList args, Cardinal *num_args)
{
Arg a[1];
String s;
DialogWidget src = (DialogWidget)w;
unsigned int i;
for (i = 0; i < *num_args; i++)
if (streq(args[i].name, XtNvalue)) {
XtSetArg(a[0], XtNstring, &s);
XtGetValues(src->dialog.valueW, a, 1);
*((char **)args[i].value) = s;
}
else if (streq(args[i].name, XtNlabel)) {
XtSetArg(a[0], XtNlabel, &s);
XtGetValues(src->dialog.labelW, a, 1);
*((char **)args[i].value) = s;
}
}
static void
CreateDialogValueWidget(Widget w)
{
DialogWidget dw = (DialogWidget)w;
Arg arglist[10];
Cardinal num_args = 0;
XtSetArg(arglist[num_args], XtNstring, dw->dialog.value); num_args++;
XtSetArg(arglist[num_args], XtNresizable, True); num_args++;
XtSetArg(arglist[num_args], XtNeditType, XawtextEdit); num_args++;
XtSetArg(arglist[num_args], XtNfromVert, dw->dialog.labelW); num_args++;
XtSetArg(arglist[num_args], XtNleft, XtChainLeft); num_args++;
XtSetArg(arglist[num_args], XtNright, XtChainRight); num_args++;
dw->dialog.valueW = XtCreateWidget("value", asciiTextWidgetClass,
w, arglist, num_args);
if (dw->composite.num_children > 1) {
WidgetList children = dw->composite.children;
Widget *childP;
for (childP = children + dw->composite.num_children - 1;
childP >= children; childP-- ) {
if (*childP == dw->dialog.labelW || *childP == dw->dialog.valueW)
continue;
if (XtIsManaged(*childP) &&
XtIsSubclass(*childP, commandWidgetClass)) {
((DialogConstraints)(*childP)->core.constraints)->
form.vert_base = dw->dialog.valueW;
}
}
}
XtManageChild(dw->dialog.valueW);
XtSetKeyboardFocus(w, dw->dialog.valueW);
dw->dialog.value = MAGIC_VALUE;
}
void
XawDialogAddButton(Widget dialog, _Xconst char* name, XtCallbackProc function,
XtPointer param)
{
Widget button;
button = XtCreateManagedWidget(name, commandWidgetClass, dialog, NULL, 0);
if (function != NULL)
XtAddCallback(button, XtNcallback, function, param);
}
char *
XawDialogGetValueString(Widget w)
{
Arg args[1];
char *value;
XtSetArg(args[0], XtNstring, &value);
XtGetValues(((DialogWidget)w)->dialog.valueW, args, 1);
return(value);
}