

#include <X11/Intrinsic.h>
#include <Xm/Xm.h>
#include <Xm/Label.h>
#include <Xm/Form.h>
#include <Xm/PushB.h>
#include <Xm/RowColumn.h>
#include <Xm/CascadeB.h>
#include <stdio.h>
#include <Xm/Separator.h>



Widget        CreateMenuBar       ( Widget parent ) ;
static Widget createMenu          ( Widget parent, char *name, char *label,  char mnemonic, Widget *cascadeBtn);
static Widget createMenuSeparator ( Widget parent, char *name);
static Widget createMenuItem      ( Widget parent, char *name, char *label, char mnemonic, void* callback, void *cbArg);
Widget        CreatePulldownMenu  ( Widget parent, char *name,   ArgList arglist, Cardinal  argcount);
void          doActionCB          ( Widget w,  char *client_data,   XmAnyCallbackStruct *call_data) ;



    



static Widget createMenu(Widget parent, char *name, char *label,  char mnemonic, Widget *cascadeBtn) {
    Widget menu, cascade;
    XmString st1;

    menu  = XmCreatePulldownMenu (parent, name, NULL, 0);
            
    cascade = XtVaCreateWidget(name, xmCascadeButtonWidgetClass, parent, 
        XmNlabelString, st1=XmStringCreateSimple(label),
        XmNsubMenuId, menu, NULL);
    XmStringFree(st1);
    if (mnemonic != 0)  XtVaSetValues(cascade, XmNmnemonic, mnemonic, NULL);

    XtManageChild(cascade);

    if (cascadeBtn != NULL)   *cascadeBtn = cascade;
    return menu;
}



static Widget createMenuItem(Widget parent, char *name, char *label, char mnemonic, void *callback, void *cbArg) {
    Widget button;
    XmString st1;    

    button = XtVaCreateWidget(name, xmPushButtonWidgetClass, parent,  
      XmNlabelString, st1=XmStringCreateSimple(label),  
      XmNmnemonic, mnemonic, 
      NULL);
    XtAddCallback(button, XmNactivateCallback, callback, cbArg);
    XmStringFree(st1);

    XtManageChild(button);

    return button;
}



static Widget createMenuSeparator(Widget parent, char *name) {
    Widget button;
    
    button = XmCreateSeparator(parent, name, NULL, 0);
    XtManageChild(button);

    return button;
}




Widget CreateMenuBar(Widget parent ) { 

    Widget menuBar, menuPane;
        
    menuBar = XmCreateMenuBar(parent, "menuBar", NULL, 0);
    XtManageChild(menuBar);

    menuPane = createMenu(menuBar, "fileMenu", "File",    'F', NULL);
    
    createMenuItem(menuPane,      "new",    "New",        'N', doActionCB, "new");
    createMenuItem(menuPane,      "open",   "Open...",    'O', doActionCB, "open_dialog");
    createMenuSeparator(menuPane, "sep1");
    createMenuItem(menuPane,      "close",  "Close",      'C', doActionCB, "close");
    createMenuItem(menuPane,      "save",   "Save",       'S', doActionCB, "save");
    createMenuItem(menuPane,      "saveAs", "Save As...", 'A', doActionCB, "save_as_dialog");
    createMenuSeparator(menuPane, "sep2");
    createMenuItem(menuPane,      "exit",   "Exit",       'x', doActionCB, "exit");   

 return menuBar;
}



void doActionCB(Widget w,  char *client_data,   XmAnyCallbackStruct *call_data)    {
   printf("%s\n",client_data);
}














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

  Widget toplevel, form, menu_bar, label;
  Arg al[10];
  int ac;

  toplevel = XtInitialize(argv[0],"",NULL,0,&argc,argv);

  /* resize the window */
  ac = 0;
  XtSetArg(al[ac],XmNheight,200); ac++;
  XtSetArg(al[ac],XmNwidth,200); ac++;
  XtSetValues(toplevel,al,ac);

  /* create a form widget */
  form = XtCreateManagedWidget("form", xmFormWidgetClass,  toplevel, NULL, 0);

  /* create a label widget */
  ac = 0;

  menu_bar = CreateMenuBar(form);

  label = XtVaCreateManagedWidget("label",xmLabelWidgetClass,  form,
    XmNlabelString, XmStringCreate("I'm a label",  XmSTRING_DEFAULT_CHARSET),
    XmNtopAttachment,    XmATTACH_WIDGET,
    XmNtopWidget,        menu_bar,
    XmNrightAttachment,  XmATTACH_FORM,
    XmNleftAttachment,   XmATTACH_FORM,
    XmNbottomAttachment, XmATTACH_FORM,
    NULL          
  );


   XtVaSetValues(menu_bar,
     XmNtopAttachment,    XmATTACH_FORM,
     XmNrightAttachment,  XmATTACH_FORM,
     XmNleftAttachment,   XmATTACH_FORM,
   NULL);


  XtRealizeWidget(toplevel);
  XtMainLoop();
  return 0;
}



