packages icon
                                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...