/* w5a.c  demonstrate dialog boxes and data input, App and Va style */
/*        and enumeration type, and Widgets local to main function  */

/* 2/10/08 JSS fix for RedHat change to Motif/Lestif                */
#define XMSTRINGDEFINES 1
#include <Xm/XmStrDefs.h>  /* to fix XtAddCallback failure */

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <Xm/MainW.h>
#include <Xm/RowColumn.h>
#include <Xm/CascadeB.h>
#include <Xm/SelectioB.h>

/* w5.h  has all global definitions. The  GLOBAL  is stripped here.   */
#define W5_DEFS         /* Every where else, just include. get extern */
#include "w5.h"
/* external definitions from  w5.h  have  GLOBAL  stripped */

enum Choice { OK, CANCEL, HELP };

Arg  args[10];  /* ArgList for widgets, cnt is number of args*/
Cardinal  cnt;

int main(int argc, char *argv[])
{

  /* widgets   indented according to heirarchy */
               /*  underscore b, "_b" are visible buttons that can be pushed */
               /*  underscore dia, "_dia" are dialog box widgets             */
  Widget  toplevel;
  Widget  main_window;
    Widget  menu_bar;
      Widget  value_pulldown, value_b;
        Widget  value_num_b, value_view_ang_b, value_name_b,
                value_apply_b, value_quit_b, value_num2_b;
        Widget  value_num_dia, value_view_ang_dia, value_name_dia,
                value_num2_dia;

  /* callback functions */

  void  DoValue_num();
  void  Dovalue_num_dia();
  void  Dovalue_num2();
  void  Dovalue_num2_dia();
  void  DoValue_view_ang();
  void  Dovalue_view_ang_dia();
  void  DoValue_name();
  void  DoValue_name_dia();
  void  DoValue_apply();
  void  DoQuit();

  XtAppContext app;

  toplevel = XtVaAppInitialize(&app, "W5", NULL, 0, &argc, argv, NULL, NULL);

  main_window = XtVaCreateManagedWidget("Main",
                                        xmMainWindowWidgetClass, toplevel,
                                        XmNresizePolicy, XmRESIZE_GROW,
                                        XmNwidth, 300,
                                        XmNheight, 300,
                                        NULL );
  cnt = 0;
  menu_bar = XmCreateMenuBar(main_window, "Menu", args, cnt);
  XtManageChild(menu_bar);

    cnt = 0;
    value_pulldown = XmCreatePulldownMenu(menu_bar, "Value_P", args, cnt);
    XtSetArg(args[cnt],XmNsubMenuId,value_pulldown); cnt++;
    value_b = XmCreateCascadeButton(menu_bar, "Set Values", args, cnt);
    XtManageChild(value_b);
    
      value_num_b = XtCreateManagedWidget("Number",
                        xmCascadeButtonWidgetClass, value_pulldown, NULL, 0);
      XtAddCallback(value_num_b, XmNactivateCallback,
                    DoValue_num, &value_num_dia);
        cnt = 0;
        XtSetArg(args[cnt], XmNselectionLabelString, XmStringCreateLtoR
          ("Give me a number from one to ten. ",
           XmSTRING_DEFAULT_CHARSET));  cnt++;
        value_num_dia = XmCreatePromptDialog(toplevel, "dialog", args, cnt);
        XtAddCallback (value_num_dia, XmNokCallback,
                       Dovalue_num_dia, (XtPointer)OK);
        XtAddCallback (value_num_dia, XmNcancelCallback,
                       Dovalue_num_dia, (XtPointer)CANCEL);
        XtAddCallback (value_num_dia, XmNhelpCallback,
                       Dovalue_num_dia, (XtPointer)HELP);



      value_view_ang_b = XtCreateManagedWidget("View Angle",
                        xmCascadeButtonWidgetClass, value_pulldown, NULL, 0);
      XtAddCallback(value_view_ang_b, XmNactivateCallback,
                    DoValue_view_ang, &value_view_ang_dia);

        cnt = 0;
        XtSetArg(args[cnt], XmNselectionLabelString, XmStringCreateLtoR
          ("Give X Y Z of viewer (blank separated float). ",
           XmSTRING_DEFAULT_CHARSET));  cnt++;
        value_view_ang_dia = XmCreatePromptDialog(toplevel, "dialog",
                                                            args, cnt);
        XtAddCallback (value_view_ang_dia, XmNokCallback,
                       Dovalue_view_ang_dia, (XtPointer)OK);
        XtAddCallback (value_view_ang_dia, XmNcancelCallback,
                       Dovalue_view_ang_dia, (XtPointer)CANCEL);
        XtUnmanageChild(XmSelectionBoxGetChild(value_view_ang_dia,
                                               XmDIALOG_HELP_BUTTON));
 
      value_name_b = XtCreateManagedWidget("Name",
                        xmCascadeButtonWidgetClass, value_pulldown, NULL, 0);
      XtAddCallback(value_name_b, XmNactivateCallback,
                    DoValue_name, &value_name_dia);

        cnt = 0;
        XtSetArg(args[cnt], XmNselectionLabelString, XmStringCreateLtoR
          ("What is your name? ",
           XmSTRING_DEFAULT_CHARSET));  cnt++;
        value_name_dia = XmCreatePromptDialog(toplevel, "dialog", args, cnt);
        XtAddCallback (value_name_dia, XmNokCallback,
                       DoValue_name_dia, (XtPointer)OK);
        XtAddCallback (value_name_dia, XmNcancelCallback,
                       DoValue_name_dia, (XtPointer)CANCEL);
        XtUnmanageChild(XmSelectionBoxGetChild(value_name_dia,
                        XmDIALOG_HELP_BUTTON));

      value_apply_b = XtCreateManagedWidget("Apply", xmCascadeButtonWidgetClass,
                      value_pulldown, NULL, 0);
      XtAddCallback(value_apply_b, XmNactivateCallback,
                    DoValue_apply, 0);

      value_quit_b = XtCreateManagedWidget("Quit", xmCascadeButtonWidgetClass,
                      value_pulldown, NULL, 0);
      XtAddCallback(value_quit_b, XmNactivateCallback,
                    DoQuit, 0);

  XtRealizeWidget(toplevel);

  XtAppMainLoop(app);
}

/* this callback called when Set Values, Number is chosen from menu */
void DoValue_num(Widget w,
                 Widget *b, /* notice second formal is pointer to a widget */
                 XmAnyCallbackStruct *call_data)
{
  /* pop dialog box and ask for number 1 to 10 */
  XtManageChild(*b);
}

/* this callback called when OK, CANCEL or HELP pressed on popup dialog */
void Dovalue_num_dia(Widget w, int client_data, XmAnyCallbackStruct *call_data)
{
  char *s;
  XmSelectionBoxCallbackStruct *selection;

  int n;

  switch (client_data)
  {
    case OK:  
      selection=(XmSelectionBoxCallbackStruct *) call_data;
      XmStringGetLtoR(selection->value, XmSTRING_DEFAULT_CHARSET, &s);
      printf("user entered=%s \n", s);
      sscanf(s,"%d", &n);
            /* error check and tell to enter again */
      printf("number %d \n", n);
      XtFree(s);
      break;
    case HELP:
      printf("That is 1, 2, 3, ... 10 ! \n");
      break; /* should pop up a help information box */
    case CANCEL:
      break;     /* not really needed in switch, does nothing */
  }
} /* end Dovalue_num_dia */



void	DoValue_view_ang(Widget w, Widget *b, XmAnyCallbackStruct *call_data)
{
  /* pop dialog box and ask for number 1 to 10 */
  XtManageChild(*b);
}

void Dovalue_view_ang_dia(Widget w,
                          enum Choice client_data,
                          XmAnyCallbackStruct *call_data)
{
  char *s;
  XmSelectionBoxCallbackStruct *selection;

  if(client_data==OK)
  {
    selection=(XmSelectionBoxCallbackStruct *) call_data;
    XmStringGetLtoR(selection->value, XmSTRING_DEFAULT_CHARSET, &s);
    printf("user view angles=%s \n", s);
    sscanf(s,"%f %f %f", &view_pitch, &view_roll, &view_yaw );
            /* error check and tell to enter again */
    printf("view roll, pitch, yaw %f %f %f \n",
             view_pitch, view_roll, view_yaw );
    XtFree(s);
  }
} /* end Dovalue_view_ang_dia */


void	DoValue_name(Widget w, Widget *b, XmAnyCallbackStruct *call_data)
{
  /* pop dialog box and ask for name */
  XtManageChild(*b);
}

void DoValue_name_dia(Widget w, 
                      enum Choice client_data,
                      XmAnyCallbackStruct *call_data)
{
  char *s;
  XmSelectionBoxCallbackStruct *selection;
  
  if(client_data==OK)
  {

    selection=(XmSelectionBoxCallbackStruct *) call_data;
    XmStringGetLtoR(selection->value, XmSTRING_DEFAULT_CHARSET, &s);
    printf("user entered name =%s \n", s);
    /* save the name somewhere */
    XtFree(s);
  }
} /* end DoValue_name_dia */


void	DoValue_apply(Widget w, int flag, XmAnyCallbackStruct *call_data)
{
  printf("DoValue_apply \n");
  /* really do something with inputs */
}

void	DoQuit(Widget w, int flag, XmAnyCallbackStruct *call_data)
{
  exit(0);
}

