#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/StringDefs.h> /* string definitions for things like XtNwidth */
#include <X11/Xresource.h>
#include <X11/Intrinsic.h>  /* include all the intrinsic headers */
                            /* includes XToolkit definitions     */
#include <X11/Xatom.h>
#include <X11/Xutil.h>
#include <X11/Composite.h>  /* facilitate creation of composite widgets */
#include <X11/Shell.h>      /* include shell widget class header files  */
#include <X11/Form.h>       /* not only includes the Form widget defs   */
                            /* but also the constraint defs             */
#include <X11/Command.h>    /* include command widget class header file */
#include <X11/Box.h>        /* include box widget class header files    */
#include <X11/Label.h>      /* include label widget class header files  */

static Arg arg_list[40];

   XFontStruct *timesRoman12, *timesBold12;  /* font structures needed   */
   XFontStruct *fixedFont;

/*********************************************************/

 create_all_widgets(base_widget)
     Widget base_widget;
 {
   int i;
   Display *the_display;
   Widget WBwidget0;
   Widget titlebar;
   Widget title;
   Widget quitbutton;
   Widget dostuffbutton;
   Widget docform;
   Widget WBwidget10;
   Widget docheader;
   Widget documentation_line;
   Widget mouseform;
   Widget author;
   Widget mouseline;
   Widget userArea;

   /* Load in necessary fonts */
   /* ----------------------- */
   the_display = XtDisplay(base_widget);      /* first get the display */
   timesRoman12 = XLoadQueryFont(the_display, "times-roman12");
   timesBold12 = XLoadQueryFont(the_display, "times-bold12");
   fixedFont = XLoadQueryFont(the_display, "fixed");
   i = 0;

   /* Create Form Widget, whose parent is base_widget */

   XtSetArg(arg_list[i], XtNheight, 297); i++;
   XtSetArg(arg_list[i], XtNwidth, 554); i++;
   XtSetArg(arg_list[i], XtNx, 0); i++;
   XtSetArg(arg_list[i], XtNy, 0); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNleft, XtRubber); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNtop, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   WBwidget0 =
      XtCreateManagedWidget("WBwidget0",
               formWidgetClass,
               base_widget, arg_list, i);
   i = 0;

   /* Create Form Widget, whose parent is WBwidget0 */

   XtSetArg(arg_list[i], XtNheight, 28); i++;
   XtSetArg(arg_list[i], XtNwidth, 546); i++;
   XtSetArg(arg_list[i], XtNx, 2); i++;
   XtSetArg(arg_list[i], XtNy, 2); i++;
   XtSetArg(arg_list[i], XtNbackground, 0); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNvertDistance, 2); i++;
   XtSetArg(arg_list[i], XtNhorizDistance, 2); i++;
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   titlebar =
      XtCreateManagedWidget("titlebar",
               formWidgetClass,
               WBwidget0, arg_list, i);
   i = 0;

   /* Create Label Widget("WIDGET BUILDER"), whose parent is titlebar */

   XtSetArg(arg_list[i], XtNlabel,
      "WIDGET BUILDER"); i++;
   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); i++;
   XtSetArg(arg_list[i], XtNborderWidth, 0); i++;
   XtSetArg(arg_list[i], XtNheight, 17); i++;
   XtSetArg(arg_list[i], XtNwidth, 120); i++;
   XtSetArg(arg_list[i], XtNx, 190); i++;
   XtSetArg(arg_list[i], XtNy, 7); i++;
   XtSetArg(arg_list[i], XtNforeground, 1); i++;
   XtSetArg(arg_list[i], XtNbackground, 0); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNvertDistance, 7); i++;
   XtSetArg(arg_list[i], XtNhorizDistance, 190); i++;
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesBold12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   title =
      XtCreateManagedWidget("title",
               labelWidgetClass,
               titlebar, arg_list, i);
   i = 0;

   /* Create Button Widget("Quit"), whose parent is titlebar */

   XtSetArg(arg_list[i], XtNlabel,
      "Quit"); i++;
   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); i++;
   XtSetArg(arg_list[i], XtNheight, 17); i++;
   XtSetArg(arg_list[i], XtNwidth, 30); i++;
   XtSetArg(arg_list[i], XtNx, 4); i++;
   XtSetArg(arg_list[i], XtNy, 5); i++;
   XtSetArg(arg_list[i], XtNhighlightThickness, 2); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNvertDistance, 5); i++;
   XtSetArg(arg_list[i], XtNhorizDistance, 4); i++;
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesBold12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   quitbutton =
      XtCreateManagedWidget("quitbutton",
               commandWidgetClass,
               titlebar, arg_list, i);

      XtAddCallback(quitbutton, XtNcallback, MMMexit_button, (caddr_t) NULL);
   XtAddCallback(quitbutton, XtNcallback,
                MMMexit_button, NULL);
   i = 0;

   /* Create Button Widget("Do Stuff"), whose parent is titlebar */

   XtSetArg(arg_list[i], XtNlabel,
      "Do Stuff"); i++;
   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); i++;
   XtSetArg(arg_list[i], XtNheight, 17); i++;
   XtSetArg(arg_list[i], XtNwidth, 52); i++;
   XtSetArg(arg_list[i], XtNx, 488); i++;
   XtSetArg(arg_list[i], XtNy, 4); i++;
   XtSetArg(arg_list[i], XtNhighlightThickness, 2); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNvertDistance, 4); i++;
   XtSetArg(arg_list[i], XtNhorizDistance, 488); i++;
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesBold12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   dostuffbutton =
      XtCreateManagedWidget("dostuffbutton",
               commandWidgetClass,
               titlebar, arg_list, i);

      XtAddCallback(dostuffbutton, XtNcallback, WB_dostuff_button, (caddr_t) NULL);
   XtAddCallback(dostuffbutton, XtNcallback,
                WB_dostuff_button, NULL);
   i = 0;

   /* Create Form Widget, whose parent is WBwidget0 */

   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); i++;
   XtSetArg(arg_list[i], XtNheight, 24); i++;
   XtSetArg(arg_list[i], XtNwidth, 548); i++;
   XtSetArg(arg_list[i], XtNx, 0); i++;
   XtSetArg(arg_list[i], XtNy, 241); i++;
   XtSetArg(arg_list[i], XtNhighlightThickness, 2); i++;
   XtSetArg(arg_list[i], XtNbackground, 0); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNvertDistance, 241); i++;
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   docform =
      XtCreateManagedWidget("docform",
               formWidgetClass,
               WBwidget0, arg_list, i);
   i = 0;

   /* Create Label Widget(" "), whose parent is docform */

   XtSetArg(arg_list[i], XtNlabel,
      " "); i++;
   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); i++;
   XtSetArg(arg_list[i], XtNborderWidth, 0); i++;
   XtSetArg(arg_list[i], XtNheight, 17); i++;
   XtSetArg(arg_list[i], XtNwidth, 14); i++;
   XtSetArg(arg_list[i], XtNx, 530); i++;
   XtSetArg(arg_list[i], XtNy, 3); i++;
   XtSetArg(arg_list[i], XtNhighlightThickness, 2); i++;
   XtSetArg(arg_list[i], XtNforeground, 1); i++;
   XtSetArg(arg_list[i], XtNbackground, 0); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNvertDistance, 3); i++;
   XtSetArg(arg_list[i], XtNhorizDistance, 530); i++;
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   WBwidget10 =
      XtCreateManagedWidget("docline_spaceholder",
               labelWidgetClass,
               docform, arg_list, i);
   i = 0;

   /* Create Label Widget("Messages:"), whose parent is docform */

   XtSetArg(arg_list[i], XtNlabel,
      "Messages:"); i++;
   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); i++;
   XtSetArg(arg_list[i], XtNborderWidth, 0); i++;
   XtSetArg(arg_list[i], XtNheight, 17); i++;
   XtSetArg(arg_list[i], XtNwidth, 62); i++;
   XtSetArg(arg_list[i], XtNx, 0); i++;
   XtSetArg(arg_list[i], XtNy, 1); i++;
   XtSetArg(arg_list[i], XtNhighlightThickness, 2); i++;
   XtSetArg(arg_list[i], XtNforeground, 1); i++;
   XtSetArg(arg_list[i], XtNbackground, 0); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNvertDistance, 1); i++;
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   docheader =
      XtCreateManagedWidget("docheader",
               labelWidgetClass,
               docform, arg_list, i);
   i = 0;

   /* Create Label Widget("Click on "Do Stuff" with Left mouse button to begin."), whose parent is docform */

   XtSetArg(arg_list[i], XtNlabel,
      "Click on "Do Stuff" with Left mouse button to begin."); i++;
   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); i++;
   XtSetArg(arg_list[i], XtNborderWidth, 0); i++;
   XtSetArg(arg_list[i], XtNheight, 17); i++;
   XtSetArg(arg_list[i], XtNwidth, 320); i++;
   XtSetArg(arg_list[i], XtNx, 64); i++;
   XtSetArg(arg_list[i], XtNy, 2); i++;
   XtSetArg(arg_list[i], XtNhighlightThickness, 2); i++;
   XtSetArg(arg_list[i], XtNforeground, 1); i++;
   XtSetArg(arg_list[i], XtNbackground, 0); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNvertDistance, 2); i++;
   XtSetArg(arg_list[i], XtNhorizDistance, 64); i++;
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   documentation_line =
      XtCreateManagedWidget("documentation_line",
               labelWidgetClass,
               docform, arg_list, i);
   i = 0;

   /* Create Form Widget, whose parent is WBwidget0 */

   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); i++;
   XtSetArg(arg_list[i], XtNheight, 24); i++;
   XtSetArg(arg_list[i], XtNwidth, 548); i++;
   XtSetArg(arg_list[i], XtNx, 0); i++;
   XtSetArg(arg_list[i], XtNy, 267); i++;
   XtSetArg(arg_list[i], XtNhighlightThickness, 2); i++;
   XtSetArg(arg_list[i], XtNforeground, 1); i++;
   XtSetArg(arg_list[i], XtNbackground, 0); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNvertDistance, 267); i++;
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   mouseform =
      XtCreateManagedWidget("mouseform",
               formWidgetClass,
               WBwidget0, arg_list, i);
   i = 0;

   /* Create Label Widget("BG"), whose parent is mouseform */

   XtSetArg(arg_list[i], XtNlabel,
      "BG"); i++;
   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); i++;
   XtSetArg(arg_list[i], XtNborderWidth, 0); i++;
   XtSetArg(arg_list[i], XtNheight, 17); i++;
   XtSetArg(arg_list[i], XtNwidth, 25); i++;
   XtSetArg(arg_list[i], XtNx, 519); i++;
   XtSetArg(arg_list[i], XtNy, 3); i++;
   XtSetArg(arg_list[i], XtNhighlightThickness, 2); i++;
   XtSetArg(arg_list[i], XtNforeground, 1); i++;
   XtSetArg(arg_list[i], XtNbackground, 0); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNvertDistance, 3); i++;
   XtSetArg(arg_list[i], XtNhorizDistance, 519); i++;
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   author =
      XtCreateManagedWidget("author",
               labelWidgetClass,
               mouseform, arg_list, i);
   i = 0;

   /* Create Label Widget("Mouse=> Left: Edit Widget.  Middle: Resize Widget.  Right: Move Widget. "), whose parent is mouseform */

   XtSetArg(arg_list[i], XtNlabel,
      "Mouse=> Left: Edit Widget.  Middle: Resize Widget.  Right: Move Widget. "); i++;
   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); i++;
   XtSetArg(arg_list[i], XtNborderWidth, 0); i++;
   XtSetArg(arg_list[i], XtNheight, 17); i++;
   XtSetArg(arg_list[i], XtNwidth, 440); i++;
   XtSetArg(arg_list[i], XtNx, 0); i++;
   XtSetArg(arg_list[i], XtNy, 2); i++;
   XtSetArg(arg_list[i], XtNhighlightThickness, 2); i++;
   XtSetArg(arg_list[i], XtNforeground, 1); i++;
   XtSetArg(arg_list[i], XtNbackground, 0); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNvertDistance, 2); i++;
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   mouseline =
      XtCreateManagedWidget("mouseline",
               labelWidgetClass,
               mouseform, arg_list, i);
   i = 0;

   /* Create Form Widget, whose parent is WBwidget0 */

   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); i++;
   XtSetArg(arg_list[i], XtNheight, 203); i++;
   XtSetArg(arg_list[i], XtNwidth, 546); i++;
   XtSetArg(arg_list[i], XtNx, 2); i++;
   XtSetArg(arg_list[i], XtNy, 34); i++;
   XtSetArg(arg_list[i], XtNhighlightThickness, 2); i++;
   XtSetArg(arg_list[i], XtNforeground, 1); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNvertDistance, 34); i++;
   XtSetArg(arg_list[i], XtNhorizDistance, 2); i++;
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   userArea =
      XtCreateManagedWidget("userArea",
               formWidgetClass,
               WBwidget0, arg_list, i);

 };    /* end of create_all_widgets() */

/*********************************************************/
/*********************************************************/

main(argc, argv)
     int argc;
     char *argv[];
 {
   Widget shell;          /* the top level application shell      */
   Widget base_widget;    /* the base widget (visible background) */

   /* Initialize a toplevel root shell widget */
   /* --------------------------------------- */
   shell = XtInitialize(argv[0],
		       "Top Level Shell",
		       NULL, 0, &argc, argv);

   /* Allow top level shell resize by child */
   /* ------------------------------------- */
   XtSetArg(arg_list[0], XtNallowShellResize, TRUE);
   XtSetArg(arg_list[1], NULL,  (XtArgVal) NULL);
   XtSetValues(shell, arg_list, 1);

   /* Create main (background) widget for the application */
   /* --------------------------------------------------- */
   XtSetArg(arg_list[0], XtNresizable, TRUE);
   base_widget = XtCreateManagedWidget("Top Level Form",
			       boxWidgetClass, shell,
			       arg_list, 1);

   create_all_widgets(base_widget);  /* Hang all widgets off base_widget */

   XtRealizeWidget(shell);           /* Make all widgets visible */

   XtMainLoop();                     /* Infinite event loop */

 };        /* end of main() */

