      /********************************************************/
      /*                   Widget-Builder               (1)   */
      /* This program was written by Brian R. Gardner, 1988.  */
      /* It was created as a visual, easy to use, technique   */
      /* for rapid proto-typing of user interfaces. It allows */
      /* its user to design the layout of an X-window based   */
      /* user interface, complete with sub-windows, buttons,  */
      /* labels, and other "widgets". This program will also  */
      /* serve as a programmer's aid by writing out to a file */
      /* the source code required to re-generate the created  */
      /* visual user interface. The code generated is usually */
      /* substantial, reflecting immense savings in the time  */
      /* neccessary to program using X-windows.               */
      /*    Note that this program is only a simple test      */
      /* version. It was the author's first introduction to   */
      /* the Athena environment, as well as X-windows and the */
      /*  X-Toolkit. It was written in 2 weeks.               */
      /*    This was written under the roof of Project Athena */
      /* at Massachusetts Institute of Technology, by         */
      /* Brian Gardner (DEC), and hence reasonably available. */
      /* Read that as "FREE"         :-)                      */
      /* with the usual friendly restrictions.                */
      /********************************************************/

     /************************************************************/
     /* Copyright 1988, Massachusetts Institute of Technology.   */
     /* See X(1) for a full statement of rights and permissions. */
     /************************************************************/

#include "wb_include.h"
#include "wbformP.h"

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

void create_form_menu(popup_widget, edited_widget)
     Widget popup_widget;    /* edit menu */
     Widget edited_widget;   /* widget being edited via popup_widget */
 {
   int i;
   WidgetNode *node;
   Widget Butwidget0, Butwidget1, Butwidget2;
   Widget Butwidget3, Butwidget4, Butwidget5;
   Widget Butwidget12, Butwidget13, Butwidget14;
   Widget Butwidget22, Butwidget23;
   Widget Butwidget24, Butwidget25, Butwidget26;
   Widget Butwidget30, Butwidget31, Butwidget31a, Butwidget32, Butwidget32a;
   Widget Butborder_choose;
   Widget Butinverse_choose, Butadd_widget, Butdone;
   struct menu_state *state;

   node = find_widgets_node(edited_widget, HeadWidgetList);

   /* Set which buttons are activated in this menu */
   state = node->edit_states;

   /* Create Form Widget, to choose variable name (used in writing C code) */
   Butwidget0 = WBcreate_form(popup_widget, NULL);
   Butwidget1 = WBcreate_label(Butwidget0, "variable's name:");
   Butwidget2 = WBcreate_ascii_text(Butwidget0, Butwidget1, 
				    node->varName, &(state->varName_string));
   state->varName = Butwidget2;

   /* Create Form Widget, for choosing internal widget name */
   Butwidget3 = WBcreate_form(popup_widget, Butwidget1);
   Butwidget4 = WBcreate_label(Butwidget3, "internal name:");
   Butwidget5 = WBcreate_ascii_text(Butwidget3, Butwidget4,
				    node->name, &(state->name_string));
   state->name = Butwidget5;

   /* Create Form Widget, for choosing inverse-video titlebars */
   Butinverse_choose = WBcreate_form(popup_widget, Butwidget3);
   Butwidget12 = WBcreate_label(Butinverse_choose, "inverse-video:");
   Butwidget13 = WBcreate_button(Butinverse_choose, Butwidget12,
			       WBbutton_handler, node, WBinverseVideo, "No");
   Butwidget14 = WBcreate_button(Butinverse_choose, Butwidget13,
			       WBbutton_handler, node, WBinverseVideo, "Yes");
   state->inverseVideo = Butwidget13;
   state->inverseVideo_string = "No";
   inverseVideo(Butwidget13);    /* highlight "no" */

   /* Create Form Widget, for choosing border width */
   Butborder_choose = WBcreate_form(popup_widget, Butinverse_choose);
   Butwidget22 = WBcreate_label(Butborder_choose, "border width:");
   Butwidget23 = WBcreate_button(Butborder_choose, Butwidget22, 
				 WBbutton_handler, node, WBborderwidth,"0");
   Butwidget24 = WBcreate_button(Butborder_choose, Butwidget23,
				 WBbutton_handler, node, WBborderwidth, "1");
   Butwidget25 = WBcreate_button(Butborder_choose, Butwidget24, 
				 WBbutton_handler, node, WBborderwidth, "2");
   Butwidget30 = WBcreate_button(Butborder_choose, Butwidget25, 
				 WBbutton_handler, node, WBborderwidth, "3");
   Butwidget31 = WBcreate_button(Butborder_choose, Butwidget30, 
				 WBbutton_handler, node, WBborderwidth, "4");
   Butwidget32 = WBcreate_button(Butborder_choose, Butwidget31, 
				 WBbutton_handler, node, WBborderwidth, "5");
   state->borderWidth = Butwidget23;
   inverseVideo(Butwidget23);    /* highlight "0" */

   /* Create Form Widget, for adding a new widget */
   Butadd_widget = WBcreate_form(popup_widget, Butborder_choose);
   Butwidget22 = WBcreate_label(Butadd_widget, "Add new widget:");
   Butwidget23 = WBcreate_button(Butadd_widget, Butwidget22, 
				 WBbutton_handler, node,
				 "button", "button");
   Butwidget24 = WBcreate_button(Butadd_widget, Butwidget23,
				 WBbutton_handler, node, 
				  "label", "label");
   Butwidget25 = WBcreate_button(Butadd_widget, Butwidget24, 
				 WBbutton_handler, node, 
				 "blank line", "blank line");
   Butwidget30 = WBcreate_button(Butadd_widget, Butwidget25, 
				 WBbutton_handler, node, 
				 "form", "form");
   Butwidget31 = WBcreate_button(Butadd_widget, Butwidget30, 
				 WBbutton_handler, node,
				 "mail field", "mail field");
   Butwidget31a = WBcreate_button(Butadd_widget, Butwidget31, 
				 WBbutton_handler, node,
				 "asciitext", "asciitext");
   Butwidget32a = WBcreate_button(Butadd_widget, Butwidget31a, 
				 WBbutton_handler, node,
				 "video", "video");

   /* Create Form & Button Widget("Done"), whose parent is popup_widget */
   Butwidget26 =  WBcreate_form(popup_widget, Butadd_widget);
   Butdone = WBcreate_button(Butwidget26, NULL, done_button,
				 node, "Done", "Done");
   i = 0;
   XtSetArg(arg_list[i], XtNwidth, 98); i++;
   /* Form related instance variables, about placement */
   XtSetArg(arg_list[i], XtNleft, XtChainLeft); i++;
   XtSetArg(arg_list[i], XtNright, XtChainRight); i++;
   XtSetArg(arg_list[i], XtNtop, XtRubber); i++;
   XtSetArg(arg_list[i], XtNbottom, XtChainBottom); i++;
   XtSetArg(arg_list[i], XtNfont, timesBold12); i++;
   XtSetArg(arg_list[i], NULL, NULL);
   XtSetValues(Butdone, arg_list, i);
   XtSetArg(arg_list[0], XtNborderWidth, 2);
   XtSetValues(Butwidget26, arg_list, 1);
   XtSetValues(Butdone, arg_list, 1);

 };    /* end of create_form_menu()  */

/****************************************************************/
 int debug = 0;    /* DEBUG */

Widget make_editable_form(parent_widget)
     Widget parent_widget;
     {
       char *widget_name;
       Widget widget;
       void prstr_form();

       /* Create a form widget */
       /* ---------------------- */
       widget_name = (char *) gensym();
       widget = XtCreateWidget(widget_name,
		       formWidgetClass,
   		       parent_widget, 
		       form_arg_list, XtNumber(form_arg_list));

       /* Set the cursor to made editable widgets stand-out */
       /* ------------------------------------------------- */
       XtSetArg(arg_list[0], XtNcursor, the_other_cursor);
       XtSetArg(arg_list[1], NULL, NULL);
       XtSetValues(widget, arg_list, 1);

       /* Add this widget to the linked list of created widgets */
       /* ----------------------------------------------------- */
       add_widget_node(widget, parent_widget, "form", prstr_form);
       widgetsUsed.form = TRUE;

       /* make the form widget editable via a popup menu form editor     */
       /* this must be done before the new widget is realized (managed)  */
       /*--------------------------------------------------------------- */
       create_form_menu(create_empty_popupmenu(widget,
						 parent_widget, "form"),
			  widget);

       make_widget_movable(widget, parent_widget);
       make_widget_resizable(widget, parent_widget);

       if (debug > 0)                                     /* DEBUG */
         { make_widget_debugable(widget, parent_widget);  /* DEBUG */
           debug++;                                       /* DEBUG */
         };                                               /* DEBUG */

       /* Now allow the new widget to become managed (and realized) */
       XtManageChild(widget);

       return(widget);

     };        /* end of  make_editable_form() */

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

void write_form(outfile, node)
     FILE *outfile;
     WidgetNode *node;
 {

   /* Output C code to create a Form living inside a form (typical) */
   /* ------------------------------------------------------------- */
   fprintf(outfile, "   i = 0;\n");     /* initialize the index in output */
   write_general_widget(outfile, node, 0, "formWidgetClass", "Form");

 };        /* end of write_form()  */

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

void prstr_form(buffer, node)
     MailBuffer *buffer;
     WidgetNode *node;
  {
    prstr_general_widget(buffer, node);
  };         /* end of prstr_form()  */

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