      /********************************************************/
      /*                   Widget-Builder               (2)   */
      /* 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. */
     /************************************************************/


#define WBjustify "justify"
#define WBfont "font"
#define WBborderwidth "borderWidth"
#define WBinverseVideo "inverseVideo"

#define MIN_ASCII_STRING_LENGTH 70
#define MIN_ASCII_STRING_BOXSIZE 150

extern char *gensym();

struct menu_state {    /* Which buttons are activated in a given menu */
  Widget varName;
  char *varName_string;
  Widget name;
  char *name_string;
  Widget label;
  char *label_string;
  Widget callback;
  char *callback_string;
  Widget font;
  Widget justify;
  Widget inverseVideo;
  char *inverseVideo_string;
  Widget borderWidth;
 } *state;

struct marker_info {   /* info about marked widget, passed to button_handler */
  Widget widget;
  WidgetNode *widget_node;
  char *option;
  char *value;
  struct menu_state *state;
 };

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

void done_button(widget, closure, call_data)
     Widget widget;
     caddr_t closure;
     caddr_t call_data;
 {
   struct marker_info *callback_info; /* callback info about what to change */
   WidgetNode *widget_node;           /* info about widget being changed    */
   char *val_string;                  /* string data from a menu widget     */
   char *set_string;                  /* new string data for edited widget  */

   callback_info = (struct marker_info *) closure;
   widget_node = callback_info->widget_node;

   /* If varName was edited, replace old string with copy of new one in menu */
   /* ---------------------------------------------------------------------- */
   val_string =  (callback_info->state)->varName_string;
   if (strcmp(val_string, (widget_node->varName)) != 0)  /* it was edited */
     { /* update variable name */
       widget_node->varName = val_string;
     };

   /* If name was edited, replace old string with copy of new one in menu */
   /* ------------------------------------------------------------------- */
   val_string =  (callback_info->state)->name_string;
   if (strcmp(val_string, (widget_node->name)) != 0)  /* it was edited */
     { /* update widget name */
       widget_node->name = val_string;
     };

   /* If label was edited, replace old string with copy of new one in menu */
   /* -------------------------------------------------------------------- */
   if (strcmp(widget_node->type, "blank line") != 0)
     {     /* can't edit blank line */
       val_string =  (callback_info->state)->label_string;
       XtSetArg(arg_list[0], XtNlabel, &set_string);
       XtSetArg(arg_list[1], NULL, NULL);
       XtGetValues((callback_info->widget), arg_list, 1); /* old label */
       if (strcmp(val_string, set_string) != 0)  /* it was edited */
	 { /* update label */
	   XtSetArg(arg_list[0], XtNlabel, val_string);
	   XtSetValues(widget_node->widget, arg_list, 1);
	 };
     };

   /* If callback function name was edited,           */
   /* replace old string with copy of new one in menu */
   /* ----------------------------------------------- */
   val_string =  (callback_info->state)->callback_string;
   if ((strcmp(val_string, (widget_node->callback)) != 0)  /* it was edited */
       && (strcmp(widget_node->type, "button") == 0))      /* uses callback */
     { /* update callback function name */
       widget_node->callback = val_string;
     };

   /* Pop Down the Menu */
   /* ----------------- */
   XtPopdown(WBMarkedShell);

 };      /* end of done_button() */

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

void WBbutton_handler(widget, closure, call_data)
     Widget widget;
     caddr_t closure;
     caddr_t call_data;
 {
   struct marker_info *callback_info;
   WidgetNode *widget_node;
   int i;

   callback_info = (struct marker_info *) closure;
   widget_node = callback_info->widget_node;

   if (strcmp(callback_info->option, WBjustify) == 0)      /* re-justify     */
     {
       XtSetArg(arg_list[0], XtNjustify, 
	     ((strcmp(callback_info->value, "center") == 0) ? XtJustifyCenter
		  : ((strcmp(callback_info->value, "right") == 0)
		     ? XtJustifyRight : XtJustifyLeft)));
       XtSetValues(widget_node->widget, arg_list, 1); /* re-justify          */
       inverseVideo((callback_info->state)->justify); /* de-activate button  */
       (callback_info->state)->justify = widget;      /* set state           */
       inverseVideo(widget);                          /* activate new button */
     }
   else if (strcmp(callback_info->option, WBfont) == 0)    /* font change    */
     {
       widget_node->font = callback_info->value;
       XtSetArg(arg_list[0], XtNfont, fontstruct(callback_info->value));
       XtSetValues(widget_node->widget, arg_list, 1); /* re-set font         */
       inverseVideo((callback_info->state)->font);    /* de-activate button  */
       (callback_info->state)->font = widget;         /* set state           */
       inverseVideo(widget);                          /* activate new button */
     }
   else if (strcmp(callback_info->option,
		   WBborderwidth) == 0)                    /* border width   */
     {
       sscanf(callback_info->value, "%d", &i);        /* convert str to int  */
       XtSetArg(arg_list[0], XtNborderWidth, i);
       XtSetValues(widget_node->widget, arg_list, 1); /* set border width    */
       inverseVideo((callback_info->state)->borderWidth);  /* de-activate    */
       (callback_info->state)->borderWidth = widget;  /* set state           */
       inverseVideo(widget);                          /* activate new button */
     }
   else if ((strcmp(callback_info->option,
		   WBinverseVideo) == 0)                   /* inverse video  */
	    && (strcmp((callback_info->state)->inverseVideo_string,
		  callback_info->value) != 0))        /* & a change was made */
     {
       if (strcmp((callback_info->state)->inverseVideo_string,
		  "No") == 0)                         /* turn inverse off    */
	 (callback_info->state)->inverseVideo_string = "Yes";
       else                                           /* turn inverse on     */
	 (callback_info->state)->inverseVideo_string = "No";
       inverseVideo(widget_node->widget);             /* do actual flip work */
       inverseVideo((callback_info->state)->inverseVideo); /* de-activate    */
       (callback_info->state)->inverseVideo = widget; /* set state           */
       inverseVideo(widget);                          /* activate new button */
     };

 };      /* end of button_handler() */

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

Widget WBcreate_form(parent, above)
     Widget parent, above;
 {
   int i;
   Widget widget;

   /* Create Form Widget, whose parent is parent */
   i = 0;
   XtSetArg(arg_list[i], XtNborderWidth, 0); 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, XtRubber); i++;
   XtSetArg(arg_list[i], XtNresizable, TRUE); i++;
   XtSetArg(arg_list[i], XtNfromVert, above); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   widget =
      XtCreateManagedWidget(gensym(),
               formWidgetClass,
               parent, arg_list, i);

   return(widget);
 };        /* end of WBcreate_form() */

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

Widget WBcreate_button(parent, left, func, markerWidgetNode, option, label)
     Widget parent, left;           /* menu form to add button to, & sibling */
     void func();                   /* callback function */
     WidgetNode *markerWidgetNode;  /* WidgetNode for widget being edited    */
     char *option, *label;          /* property to alter, and possible value */
 {
   int i;
   Widget widget;
   struct marker_info *callback_info;

   /* Create Button Widget, whose parent is parent */

   i = 0;
   XtSetArg(arg_list[i], XtNlabel, label); i++;
   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); 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], XtNfromHoriz, left); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;
   XtSetArg(arg_list[i], NULL, NULL);

   widget =
      XtCreateManagedWidget(gensym(),
               commandWidgetClass,
               parent, arg_list, i);

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

   /* store info about widget being edited by this menu button */
   callback_info = (struct marker_info *) calloc(sizeof(struct marker_info),1);
   callback_info->widget = markerWidgetNode->widget;
   callback_info->widget_node = markerWidgetNode;
   callback_info->option = option;
   callback_info->value = label;
   callback_info->state = state;
   XtAddCallback(widget, XtNcallback, func,
		 (caddr_t) callback_info);
   return(widget);
 };        /* end of WBcreate_button() */

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

Widget WBcreate_label(parent, label)
     Widget parent;
     char *label;
 {
   int i;
   Widget widget;

   /* Create Label Widget, whose parent is parent */

   i = 0;
   XtSetArg(arg_list[i], XtNlabel, label); i++;
   XtSetArg(arg_list[i], XtNborderWidth, 0); i++;
   XtSetArg(arg_list[i], XtNjustify, XtJustifyCenter); 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);

   widget =
      XtCreateManagedWidget(gensym(),
               labelWidgetClass,
               parent, arg_list, i);

   return(widget);
 };        /* end of WBcreate_label() */

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

Widget WBcreate_ascii_text(parent, left, default_string, state_string_ptr)
     Widget parent, left;
     char *default_string;
     char **state_string_ptr;
 {
   char *val_string;
   int i;
   Widget widget;

   /* Create Ascii Text Widget, whose parent is parent */

   i = 0;
   /* 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], XtNfromHoriz, left); i++;
   XtSetArg(arg_list[i], XtNfont, timesRoman12); i++;

   /* Create input Value field as an AsciiText widget */
   /* ----------------------------------------------- */
   val_string = (char *) calloc(MIN_ASCII_STRING_LENGTH, 1);
   strcpy(val_string, default_string);
   *state_string_ptr = val_string;
   XtSetArg(arg_list[i], XtNstring, val_string); i++;
   XtSetArg(arg_list[i], XtNeditType, XttextEdit); i++;
   XtSetArg(arg_list[i], XtNlength, MIN_ASCII_STRING_BOXSIZE); i++;
/*   XtSetArg(arg_list[i], XtNmaxLength, MIN_ASCII_STRING_LENGTH); i++; */
   XtSetArg(arg_list[i], XtNtextOptions, resizeHeight | resizeWidth); i++;

   XtSetArg(arg_list[i], NULL, NULL);

   widget =
      XtCreateManagedWidget(gensym(),
               asciiStringWidgetClass,
               parent, arg_list, i);

   return(widget);
 };        /* end of WBcreate_ascii_text() */

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

Widget create_empty_popupmenu(parent, grandparent_widget, type)
     Widget parent, grandparent_widget;
     char *type;
 {
   Widget edit_shell;  /* the Override Shell that holds button editor */
   Widget edit_menu;   /* the background box for button editor menu   */
   Widget menu_label;
   char *shell_name;       /* a unique shell name for this popup menu */
   char *str;

   /* Create an empty popup edit menu for a widget */
   /* -------------------------------------------- */
   shell_name = (char *) gensym();
   edit_shell = XtCreatePopupShell(shell_name,
			  overrideShellWidgetClass,
			  grandparent_widget,
			  NULL, 0);
   edit_menu = 
	   XtCreateManagedWidget((char *) gensym(),
		       boxWidgetClass,
   		       edit_shell,
		       NULL, 0);

   /* Link new popup edit menu to parent_widget */
   /* ----------------------------------------- */
   /* alloc space for translation table string  */
   str = (char *) calloc((strlen(shell_name) + strlen(type) 
	        + strlen("<Btn1Down>: MarkWidget(\"\") MenuPopup(\"\")")
		+ 1 + 10) , 1);  
   /* make translation table string */
   sprintf(str,
	   "<Btn1Down>: MarkWidget(\"%s\",\"%d\") MenuPopup(\"%s\")",
	   type, (int) edit_shell, shell_name);    
   XtOverrideTranslations(parent, 
			  XtParseTranslationTable(str));

   /* Place a sensible Label ontop of the popup edit menu */
   /* ------------------------------------------------------ */
   str = (char *) calloc((strlen(type) + 20), 1);
   sprintf(str, "   %s options   ", type);
   arg_list[0].name = XtNlabel;
   arg_list[0].value = (XtArgVal) str;
   menu_label = XtCreateManagedWidget((char *) gensym(),
			       labelWidgetClass, edit_menu,
			       arg_list, 1);
   inverseVideo(menu_label);    /* Highlight the label */

   return(edit_menu);

  };         /* end of create_empty_popupmenu()  */

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

void create_button_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 Butwidget6, Butwidget7, Butwidget8, Butwidget9, Butwidget10;
   Widget Butwidget11, Butwidget12, Butwidget13, Butwidget14, Butwidget15;
   Widget Butwidget16, Butwidget17, Butwidget18, Butwidget19, Butwidget20;
   Widget Butwidget21, Butwidget22, Butwidget23;
   Widget Butwidget24, Butwidget25, Butwidget26;
   Widget Butwidget30, Butwidget31, Butwidget32;
   Widget Butfont_choose, Butborder_choose;
   Widget Butinverse_choose, Butjustify_choose, Butdone;
   char *val_string;

   node = find_widgets_node(edited_widget);

   /* Set which buttons are activated in this menu */
   state = (struct menu_state *) calloc(sizeof(struct menu_state), 1);

   /* 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 the label */
   XtSetArg(arg_list[0], XtNlabel, &val_string);
   XtSetArg(arg_list[1], NULL, NULL);
   XtGetValues(edited_widget, arg_list, 1);
   Butwidget6 = WBcreate_form(popup_widget, Butwidget3);
   Butwidget7 = WBcreate_label(Butwidget6, "label:");
   Butwidget8 = WBcreate_ascii_text(Butwidget6, Butwidget7,
				    val_string, &(state->label_string));
   state->label = Butwidget8;

   /* Create Form Widget, for choosing the font */
   Butfont_choose = WBcreate_form(popup_widget, Butwidget6);
   Butwidget9 = WBcreate_label(Butfont_choose, "font:");
   Butwidget10 = WBcreate_button(Butfont_choose, Butwidget9,
			    WBbutton_handler, node, WBfont, "times-roman12");
   Butwidget11 = WBcreate_button(Butfont_choose, Butwidget10,
			    WBbutton_handler, node, WBfont, "times-bold12");
   state->font = Butwidget10;
   inverseVideo(Butwidget10);    /* highlight "times-roman12" */

   /* Create Form Widget, for choosing inverse-video titlebars */
   Butinverse_choose = WBcreate_form(popup_widget, Butfont_choose);
   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 the justification style */
   Butjustify_choose = WBcreate_form(popup_widget, Butinverse_choose);
   Butwidget15 = WBcreate_label(Butjustify_choose, "justify:");
   Butwidget16 = WBcreate_button(Butjustify_choose, Butwidget15,
				 WBbutton_handler, node, WBjustify, "left");
   Butwidget17 = WBcreate_button(Butjustify_choose, Butwidget16,
				 WBbutton_handler, node, WBjustify, "center");
   Butwidget18 = WBcreate_button(Butjustify_choose, Butwidget17,
				 WBbutton_handler, node, WBjustify, "right");
   state->justify = Butwidget17;
   inverseVideo(Butwidget17);    /* highlight "center" */

   /* Create Form Widget, for choosing border width */
   Butborder_choose = WBcreate_form(popup_widget, Butjustify_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 = Butwidget24;
   inverseVideo(Butwidget24);    /* highlight "1" */


   /* Create Form Widget, for choosing the callback function */
   Butwidget19 =  WBcreate_form(popup_widget, Butborder_choose);
   Butwidget20 = WBcreate_label(Butwidget19, 
				"function to call on button press:");
   Butwidget21 = WBcreate_ascii_text(Butwidget19, Butwidget20,
				     "", &(state->callback_string));
   state->callback = Butwidget21;

   /* Create Form & Button Widget("Done"), whose parent is popup_widget */
   Butwidget26 =  WBcreate_form(popup_widget, Butwidget19);
   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_button_menu()  */

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

void create_label_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 Butwidget6, Butwidget7, Butwidget8, Butwidget9, Butwidget10;
   Widget Butwidget11, Butwidget12, Butwidget13, Butwidget14, Butwidget15;
   Widget Butwidget16, Butwidget17, Butwidget18, Butwidget19, Butwidget20;
   Widget Butwidget21, Butwidget22, Butwidget23;
   Widget Butwidget24, Butwidget25, Butwidget26;
   Widget Butwidget30, Butwidget31, Butwidget32;
   Widget Butfont_choose, Butborder_choose;
   Widget Butinverse_choose, Butjustify_choose, Butdone;
   char *val_string;

   node = find_widgets_node(edited_widget);

   /* Set which buttons are activated in this menu */
   state = (struct menu_state *) calloc(sizeof(struct menu_state), 1);

   /* 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 the label */
   XtSetArg(arg_list[0], XtNlabel, &val_string);
   XtSetArg(arg_list[1], NULL, NULL);
   XtGetValues(edited_widget, arg_list, 1);
   Butwidget6 = WBcreate_form(popup_widget, Butwidget3);
   Butwidget7 = WBcreate_label(Butwidget6, "label:");
   Butwidget8 = WBcreate_ascii_text(Butwidget6, Butwidget7,
				    val_string, &(state->label_string));
   state->label = Butwidget8;

   /* Create Form Widget, for choosing the font */
   Butfont_choose = WBcreate_form(popup_widget, Butwidget6);
   Butwidget9 = WBcreate_label(Butfont_choose, "font:");
   Butwidget10 = WBcreate_button(Butfont_choose, Butwidget9,
			    WBbutton_handler, node, WBfont, "times-roman12");
   Butwidget11 = WBcreate_button(Butfont_choose, Butwidget10,
			    WBbutton_handler, node, WBfont, "times-bold12");
   state->font = Butwidget10;
   inverseVideo(Butwidget10);    /* highlight "times-roman12" */

   /* Create Form Widget, for choosing inverse-video titlebars */
   Butinverse_choose = WBcreate_form(popup_widget, Butfont_choose);
   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 the justification style */
   Butjustify_choose = WBcreate_form(popup_widget, Butinverse_choose);
   Butwidget15 = WBcreate_label(Butjustify_choose, "justify:");
   Butwidget16 = WBcreate_button(Butjustify_choose, Butwidget15,
				 WBbutton_handler, node, WBjustify, "left");
   Butwidget17 = WBcreate_button(Butjustify_choose, Butwidget16,
				 WBbutton_handler, node, WBjustify, "center");
   Butwidget18 = WBcreate_button(Butjustify_choose, Butwidget17,
				 WBbutton_handler, node, WBjustify, "right");
   state->justify = Butwidget17;
   inverseVideo(Butwidget17);    /* highlight "center" */

   /* Create Form Widget, for choosing border width */
   Butborder_choose = WBcreate_form(popup_widget, Butjustify_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 & Button Widget("Done"), whose parent is popup_widget */
   Butwidget26 =  WBcreate_form(popup_widget, Butborder_choose);
   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_label_menu()  */
/******************************************************************/

void create_blank_line_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, Butwidget32;
   Widget Butborder_choose;
   Widget Butinverse_choose, Butdone;

   node = find_widgets_node(edited_widget);

   /* Set which buttons are activated in this menu */
   state = (struct menu_state *) calloc(sizeof(struct menu_state), 1);

   /* 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 & Button Widget("Done"), whose parent is popup_widget */
   Butwidget26 =  WBcreate_form(popup_widget, Butborder_choose);
   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_blank_line_menu()  */
