SmartMessageBox Widget ----------
-------------------------------------------------------------------
This is the xmSmartMessageBoxWidget. The basic idea is that I decided that
dialogs should be simpler in Motif programs, ie, you shouldn't have to
unmanage unwanted widgets just to have a dialog. Plus, the Template dialog
is more voodoo than anything else. The SmartMessagBox widget manages
whatever you tell it to in 4 different ways: as a label, as a control
widget, as a separator, or as an action widget. You can have up to 1
label, up to 1 control, up to 1 separator, and as many action widgets as
you'd like. This is all handled throught constraint resources.
The basic setup is:
------------------------------------
- Label | -
- | Control -
-----------| Area -
- | _
- separator -
------------------------------------
- Action -
- Area -
------------------------------------
Although you don't need to have all of the different areas.
When you create a child of a SmartMessageBoxWidget, it's constraint
resource XmNchildType defaults to XmCHILD_ACTION, which means for it to be
managed in the action area. You can change this resource so that it is
managed in any of the 4 fields above. A basic dialog box would then look
like:
smb = XtCreateManagedWidget("SmartMessageBox",
xmSmartMessageBoxWidgetClass,
toplevel, NULL, 0);
n = 0; XtSetArg(warg[n], XmNchildType, XmCHILD_LABEL); n++;
XtCreateManagedWidget("Label", xmLabelWidgetClass, smb, warg, n);
n = 0; XtSetArg(warg[n], XmNchildType, XmCHILD_SEPARATOR);
n++;
XtCreateManagedWidget("Separator", xmSeparatorWidgetClass, smb, warg,
n);
n = 0; XtSetArg(warg[n], XmNchildType, XmCHILD_CONTROL);
n++;
XtCreateManagedWidget("MessageLabel", xmLabelWidgetClass, smb, warg,
n);
/* ** These default to the action area. */
defButton = XtCreateManagedWidget("OK", xmPushButtonWidgetClass, smb,
warg, n);
XtCreateManagedWidget("Help", xmPushButtonWidgetClass, smb, NULL, 0);
n = 0;
XtSetArg(warg[n], XmNdefaultButton, defButton); n++;
XtSetValues(smb, warg, n);
The other resources are:
XmNminimizeButtons: (Boolean) make all the widgets in the action
area the smallest possible
XmNdialogType: (XmDIALOG_INFORMATION, etc.) adds the appropriate
bitmap to the dialog as a label automatically
XmNdialogPositioning: positions the dialog on popups to
XmDIALOG_POSITIONING_LEAVE_ALONE: let the window manager do whatever
XmDIALOG_POSITIONING_INITIAL_CENTER: first time it pops up centered in
the screen, afterwards it pops up wherever it was left
XmDIALOG_POSITIONING_ALWAYS_CENTER: always pops up in the center of
the screen
XmDIALOG_POSITIONING_DEFAULT_AT_POINTER: positions the dialog up so that
the
default button is centered on the pointer
XmDIALOG_POSITIONING_CENTER_AT_POINTER: positions the dialog up so that the
dialog is centered on the pointer
To build the SmartMessageBoxWidget you will need Motif 1.2. Plus
if you have a version < 1.2.3 you will need to #define NEED_BBCONSTRAINT 1
since the Motif headers didn't have the Bulletin board constraint part like
they should have.
That's about it. Let me know what you think, and if I get encouraged
then maybe I'll write some more...See copyright or source files for
distribution info...
John L. Cwikla
cwikla@wri.com
Furthering "open software" into reality...