
#include "wbbuttonP.h"
#include "wbbutton.h"

void edit_button(widget, event)
     Widget widget;
     XEvent *event;
 {
   char *str;
   WidgetNode *widget_node;

   /* Alter attributes of a button widget */
   /* ----------------------------------- */
   if (strcmp(WBMarkedWidgetOption, XtNlabel) == 0)     /* Change Label */
     { 
       str = (char *) calloc(11, 1);
       strcpy(str, "New Label");
       arg_list[0].name = XtNlabel;
       arg_list[0].value = (XtArgVal) str;
       XtSetValues(WBMarkedWidget, arg_list, 1);
     }
   else if (strcmp(WBMarkedWidgetOption,
		   XtNheight) == 0)                    /* Change Height */
     {
/*       arg_list[0].name = XtNheight;
       arg_list[0].value = (XtArgVal) 10;
       XtSetValues(WBMarkedWidget, arg_list, 1); */
     }
   else if (strcmp(WBMarkedWidgetOption,
		   XtNwidth) == 0)                     /* Change Width */
     {
/*       arg_list[0].name = XtNwidth;
       arg_list[0].value = (XtArgVal) 10;
       XtSetValues(WBMarkedWidget, arg_list, 1); */
     }
   else if (strcmp(WBMarkedWidgetOption,
		   XtNfont) == 0)                       /* Change Font   */
     {
       XtSetArg(arg_list[0], XtNfont, timesBold12);
       XtSetValues(WBMarkedWidget, arg_list, 1);
       widget_node = find_widgets_node(WBMarkedWidget, HeadWidgetList);
       widget_node->font = "times-bold12";
       widget_node->font_struct = timesBold12;
     }
   else if (strcmp(WBMarkedWidgetOption,
		   XtNborderWidth) == 0)                /* Change Border */
     {
       arg_list[0].name = XtNborderWidth;
       arg_list[0].value = (XtArgVal) 10;
       XtSetValues(WBMarkedWidget, arg_list, 1);
     }
   else if (strcmp(WBMarkedWidgetOption,
		   WBDestroyButtonWidget) == 0)         /* Destroy Widget */
     {
       XtDestroyWidget(WBMarkedWidget);
     }
   else                                                 /* Ignore Others */
     ;

 };       /* end of edit_button() */

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

Widget make_editable_button(parent_widget)
     Widget parent_widget;
     {
       char *widget_name;
       Widget widget;
       void prstr_button();

       /* Create a button widget */
       /* ---------------------- */
       widget_name = (char *) gensym();
       XtSetArg(button_arg_list[0], 
		 XtNfont, timesRoman12);
       widget = XtCreateWidget(widget_name,
		       commandWidgetClass,
   		       parent_widget, 
		       button_arg_list, XtNumber(button_arg_list));

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

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

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

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

       return(widget);

     };        /* end of  make_editable_button() */

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

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;
   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 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 write_button(outfile, node)
     FILE *outfile;
     WidgetNode *node;
 { 
   /* Output C code to create a Button living inside a form (typical) */
   /* --------------------------------------------------------------- */
   fprintf(outfile, "   i = 0;\n");     /* initialize the index in output */
   write_general_widget(outfile, node, 0, "commandWidgetClass", "Button");

   /* If widget has a callback function, output code for widget to access it */
   /* ---------------------------------------------------------------------- */
   if (node->callback != NULL)
     {
       fprintf(outfile, "   XtAddCallback(%s, XtNcallback,\n", 
		 ((node->varName != NULL) ? node->varName : "current_widget"));
       fprintf(outfile, "                %s, NULL);\n", node->callback);
     };
 };        /* end of write_button()  */

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

void prstr_button(buffer, node)
     MailBuffer *buffer;
     WidgetNode *node;
  {
    prstr_general_widget(buffer, node);

    AlMB_esc_prstring(buffer, (char *) XtNcallback, ',');
    AlMB_prstring(buffer, ", ");
    AlMB_esc_prstring(buffer, node->callback, ',');
    AlMB_prstring(buffer, ", ");

  };         /* end of prstr_button()  */

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