home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / m / master12.zip / mastering / Newapp / Menu.c < prev    next >
C/C++ Source or Header  |  1992-08-19  |  13KB  |  389 lines

  1. /*  Menu.c -- This file contains these functions:
  2.  
  3.                 CreateMenuBar()  -- a convenience function for creating
  4.                                     the application's menu bar.
  5.  
  6.                 CreateMenuButton() -- a convenience function for adding
  7.                                       individual buttons to panes within
  8.                                       the menu bar.
  9.  
  10.                 AddSeparator() -- a convenience function for adding 
  11.                                   separators to panes within the menu bar.  */
  12.  
  13. #include "Global.h"
  14. #include "Menu.h"
  15.  
  16. int    currentView;     /*  This holds the current state of the View menu. */
  17.  
  18. int    currentOption;   /*  This holds the current option (from the second
  19.                 group of toggles in the Text menu).  */
  20.  
  21. Widget opt1Toggle, opt2Toggle, opt3Toggle;  /* These are the radio buttons 
  22.                            from the Text menu. */
  23.  
  24. Widget CreateMenuButton();
  25.  
  26. Widget CreateMenuBar (parent)
  27.      Widget  parent;
  28. {
  29.   Widget  menuBar;
  30.   Widget  cascade;
  31.   Widget  pulldownPane;
  32.   Widget  button;
  33.   Widget  optionsMenu;
  34.  
  35.   XmString  label;
  36.  
  37.   /* Create menu bar. */
  38.   ac = 0;
  39.   menuBar = XmCreateMenuBar (parent, "menuBar", al, ac);
  40.  
  41.   /************************************************************
  42.                             F i l e
  43.  ************************************************************/
  44.  
  45.   ac = 0;
  46.   pulldownPane = XmCreatePulldownMenu (menuBar, "pulldownPane", al, ac);
  47.  
  48.   /*** New ... ***/ CreateMenuButton (pulldownPane, NULL, MENU_File_New,
  49.                       "New ...", 'N', PushButton,
  50.                       NULL, NULL);
  51.  
  52.   /*** Open ... ***/ CreateMenuButton (pulldownPane, NULL, MENU_File_Open,
  53.                        "Open ...", 'O', PushButton,
  54.                        NULL, NULL);
  55.  
  56.   /* ----------------- */  AddSeparator(pulldownPane);
  57.  
  58.   /*** Save ***/ CreateMenuButton (pulldownPane, NULL, MENU_File_Save,
  59.                    "Save", 'S', PushButton,
  60.                    NULL, NULL);
  61.  
  62.   /*** Save As ... ***/ CreateMenuButton (pulldownPane, NULL, MENU_File_SaveAs,
  63.                       "Save As ...", 'A', PushButton,
  64.                       NULL, NULL);
  65.  
  66.   /* ----------------- */  AddSeparator(pulldownPane);
  67.  
  68.   /*** Print ... ***/ CreateMenuButton (pulldownPane, NULL, MENU_File_Print,
  69.                     "Print ...", 'P', PushButton,
  70.                     NULL, NULL);
  71.  
  72.   /* ----------------- */  AddSeparator(pulldownPane);
  73.  
  74.   /*** Exit ***/ CreateMenuButton (pulldownPane, NULL, MENU_File_Exit,
  75.                    "Exit", 'E', PushButton,
  76.                    "Meta<Key>F4:","Meta+F4");
  77.  
  78.   /*** File cascade button ****/
  79.   label = XmStringCreateSimple ("File");
  80.   ac = 0;
  81.   XtSetArg (al[ac], XmNsubMenuId, pulldownPane);  ac++;
  82.   XtSetArg (al[ac], XmNlabelString, label);  ac++;
  83.   XtSetArg (al[ac], XmNmnemonic, 'F'); ac++;
  84.   cascade= XmCreateCascadeButtonGadget (menuBar, NULL, al, ac);
  85.   XtManageChild (cascade);
  86.   XmStringFree(label);  
  87.  
  88.   /************************************************************
  89.                         E d i t
  90.  ************************************************************/
  91.  
  92.   ac = 0;
  93.   pulldownPane = XmCreatePulldownMenu (menuBar, "pulldownPane", al, ac);
  94.  
  95.   /*** Undo ***/ CreateMenuButton (pulldownPane, NULL, MENU_Edit_Undo,
  96.                    "Undo", 'U', PushButton,
  97.                    "Meta<Key>BackSpace:","Alt+Backspace");
  98.  
  99.   /* ----------------- */  AddSeparator(pulldownPane);
  100.  
  101.   /*** Cut ***/ CreateMenuButton (pulldownPane, NULL, MENU_Edit_Cut,
  102.                   "Cut", 't', PushButton,
  103.                   "Shift<Key>DeleteChar:", "Shift+Del");
  104.  
  105.   /*** Copy ***/ CreateMenuButton (pulldownPane, NULL, MENU_Edit_Copy,
  106.                    "Copy", 'C', PushButton,
  107.                    "Ctrl<Key>InsertChar:", "Ctrl+Ins");
  108.  
  109.   /*** Paste ***/ CreateMenuButton (pulldownPane, NULL, MENU_Edit_Paste,
  110.                     "Paste", 'P', PushButton,
  111.                     "Shift<Key>InsertChar:", "Shift+Ins");
  112.  
  113.   /* ----------------- */  AddSeparator(pulldownPane);
  114.  
  115.   /*** Clear ***/ CreateMenuButton (pulldownPane, NULL, MENU_Edit_Clear,
  116.                     "Clear", 'e', PushButton,
  117.                     NULL, NULL);
  118.  
  119.   /*** Delete ***/ CreateMenuButton (pulldownPane, NULL, MENU_Edit_Delete,
  120.                      "Delete", 'D', PushButton,
  121.                      NULL, NULL);
  122.  
  123.   /*** Edit cascade button ****/
  124.   label = XmStringCreateSimple ("Edit");
  125.   ac = 0;
  126.   XtSetArg (al[ac], XmNsubMenuId, pulldownPane);  ac++;
  127.   XtSetArg (al[ac], XmNlabelString, label);  ac++;
  128.   XtSetArg (al[ac], XmNmnemonic, 'E'); ac++;
  129.   cascade = XmCreateCascadeButtonGadget (menuBar, NULL, al, ac);
  130.   XtManageChild (cascade);
  131.   XmStringFree(label);
  132.  
  133.   /************************************************************
  134.                              V i e w
  135.  ************************************************************/
  136.  
  137.   /* This menu pane demonstrates how setting the XmNradioBehavior resources
  138.      enables the menu pane (a row column manager) to enforce a one-of-many
  139.      selection among its toggle button children.  
  140.  
  141.      This technique has a side effect worth noting: The MenuCB() routine
  142.      is called twice each time the user chooses a toggle button from the
  143.      menu pane.     The first call occurs when the row column manager unsets
  144.      the current selection.  The second call occurs when the row column
  145.      manager sets the new selection.  Refer to the MenuCB() routine to
  146.      see how behavior for the View menu is handled.     */
  147.  
  148.   ac = 0;
  149.   XtSetArg (al[ac], XmNradioBehavior, True);  ac++;
  150.   pulldownPane = XmCreatePulldownMenu (menuBar, "pulldownPane", al, ac);
  151.  
  152.   /*** As One ***/ CreateMenuButton (pulldownPane, NULL, MENU_View_AsOne,
  153.                      "As One", 'O', RadioButtonOn,
  154.                      NULL, NULL); 
  155.   currentView = MENU_View_AsOne;
  156.  
  157.   /*** As Two ***/ CreateMenuButton (pulldownPane, NULL, MENU_View_AsTwo,
  158.                      "As Two", 'w', RadioButton,
  159.                      NULL, NULL);
  160.  
  161.   /*** As Three ***/ CreateMenuButton (pulldownPane, NULL, MENU_View_AsThree,
  162.                        "As Three", 'h', RadioButton,
  163.                        NULL, NULL);
  164.  
  165.   /*** View cascade button ****/
  166.   label = XmStringCreateSimple ("View");
  167.   ac = 0;
  168.   XtSetArg (al[ac], XmNsubMenuId, pulldownPane);  ac++;
  169.   XtSetArg (al[ac], XmNlabelString, label); ac++;
  170.   XtSetArg (al[ac], XmNmnemonic, 'V'); ac++;
  171.   cascade = XmCreateCascadeButtonGadget (menuBar, NULL, al, ac);
  172.   XtManageChild (cascade);
  173.   XmStringFree(label);
  174.  
  175.   /************************************************************
  176.                       T e x t
  177.  ************************************************************/
  178.  
  179.   /* This menu pane contains two groups of toggle buttons: One group of
  180.      check boxes, and one group of radio buttons.  Since the pane (row
  181.      column manager) has no way of distinguishing separate groups, radio
  182.      behavior cannot be enforced using the same technique used in the View
  183.      menu.  
  184.  
  185.      In this case, the radio behavior for the second group of toggle
  186.      buttons is implemented within the MenuCB() routine.  The widget IDs
  187.      for the three radio buttons are saved in variables (eg. opt1Toggle)
  188.      for access within MenuCB(). 
  189.  
  190.      More than one check box item can be chosen at a time.  Only one
  191.      radio button item can be chosen at a time. */
  192.  
  193.   ac = 0;
  194.   pulldownPane = XmCreatePulldownMenu (menuBar, "pulldownPane", al, ac);
  195.  
  196.  
  197.   CreateMenuButton (pulldownPane, NULL, MENU_checkbox_A,
  198.                        "Underline", 'U', CheckBoxOn,
  199.                        NULL, NULL);
  200.  
  201.   CreateMenuButton (pulldownPane, NULL, MENU_checkbox_B,
  202.                        "Bold", 'B', CheckBox,
  203.                        NULL, NULL);
  204.  
  205.   CreateMenuButton (pulldownPane, NULL, MENU_checkbox_C,
  206.                        "Italic", 'I', CheckBox,
  207.                        NULL, NULL);
  208.  
  209.   /* ----------------- */  AddSeparator(pulldownPane);
  210.   
  211.                      opt1Toggle = 
  212.   CreateMenuButton (pulldownPane, NULL, MENU_radio_1,       
  213.                        "8 point", '8', RadioButtonOn,
  214.                        NULL, NULL);
  215.   currentOption = MENU_radio_1;
  216.  
  217.                      opt2Toggle = 
  218.   CreateMenuButton (pulldownPane, NULL, MENU_radio_2,
  219.                        "12 point", '2', RadioButton,
  220.                        NULL, NULL);
  221.  
  222.                      opt3Toggle = 
  223.   CreateMenuButton (pulldownPane, NULL, MENU_radio_3,
  224.                        "16 point", '6', RadioButton,
  225.                        NULL, NULL);
  226.  
  227.  
  228.   /*** Enhancements cascade button ****/
  229.   label = XmStringCreateSimple ("Text");
  230.   ac = 0;
  231.   XtSetArg (al[ac], XmNsubMenuId, pulldownPane);  ac++;
  232.   XtSetArg (al[ac], XmNlabelString, label); ac++;
  233.   XtSetArg (al[ac], XmNmnemonic, 'T'); ac++;
  234.   cascade = XmCreateCascadeButtonGadget (menuBar, NULL, al, ac);
  235.   XtManageChild (cascade);
  236.   XmStringFree(label);
  237.  
  238.    
  239.   /************************************************************
  240.                        H e l p     
  241.  ************************************************************/
  242.  
  243.   ac = 0;
  244.   pulldownPane = XmCreatePulldownMenu (menuBar, "pulldownPane", al, ac);
  245.  
  246.   /*** On Item ... ***/ CreateMenuButton (pulldownPane, NULL, MENU_Help_OnItem,
  247.                       "On Item ...", 'I', PushButton,
  248.                       NULL, NULL);
  249.  
  250.   /*** On Application ... ***/ CreateMenuButton (pulldownPane, NULL,
  251.                          MENU_Help_OnApplication,
  252.                          "On Application ...", 'A',
  253.                          PushButton, "<Key>F1", "F1");
  254.  
  255.   /*** On Help ... ***/ CreateMenuButton (pulldownPane, NULL, MENU_Help_OnHelp,
  256.                       "On Help ...", 'H', PushButton,
  257.                       NULL, NULL);
  258.  
  259.   /* ----------------- */  AddSeparator(pulldownPane);
  260.  
  261.   /*** Index ... ***/ CreateMenuButton (pulldownPane, NULL, 
  262.                     MENU_Help_Index,
  263.                     "Index ...", 'x', PushButton,
  264.                     NULL, NULL);
  265.  
  266.   /*** Tutorial ... ***/ CreateMenuButton (pulldownPane, NULL, 
  267.                        MENU_Help_Tutorial,
  268.                        "Tutorial ...", 'T', PushButton,
  269.                        NULL, NULL);
  270.  
  271.   /* ----------------- */  AddSeparator(pulldownPane);
  272.  
  273.   /*** On Version ... ***/ CreateMenuButton (pulldownPane, NULL, 
  274.                          MENU_Help_OnVersion, 
  275.                          "On Version ...", 'V', PushButton,
  276.                          NULL, NULL);
  277.  
  278.   /*** Help cascade button ****/
  279.   label = XmStringCreateSimple ("Help");
  280.   ac = 0;
  281.   XtSetArg (al[ac], XmNsubMenuId, pulldownPane);  ac++;
  282.   XtSetArg (al[ac], XmNlabelString, label);  ac++;
  283.   XtSetArg (al[ac], XmNmnemonic, 'H'); ac++;
  284.   cascade = XmCreateCascadeButtonGadget (menuBar, NULL, al, ac);
  285.   XtManageChild (cascade);
  286.   XmStringFree(label);
  287.  
  288.   /*** Make Help button right-justified in menu bar ***/
  289.   ac = 0;
  290.   XtSetArg (al[ac], XmNmenuHelpWidget, cascade); ac++;
  291.   XtSetValues(menuBar, al, ac);
  292.   
  293.   return(menuBar);
  294.  
  295. } /* End of the CreateMenuBar() function. */
  296.  
  297.  
  298.  
  299. /******************************************************************************
  300.               C r e a t e   M e n u   B u t t o n   U t i l i t y
  301. ******************************************************************************/
  302.  
  303. Widget CreateMenuButton(parent, name, buttonID, 
  304.             buttonLabelStr, buttonMnemonic, buttonType,
  305.             buttonAccelerator, buttonAcceleratorTextStr)
  306.      Widget  parent;
  307.      char    *name;
  308.      int     buttonID;                    /* Values defined in Menu.h */
  309.      int     buttonType;                  /* Values defined in Menu.h */
  310.      char    *buttonLabelStr;
  311.      char    buttonMnemonic;
  312.      char    *buttonAccelerator;
  313.      char    *buttonAcceleratorTextStr;
  314. {
  315.   Widget    button;
  316.   XmString  buttonLabel;
  317.   XmString  buttonAcceleratorText;
  318.  
  319.   if (strlen(buttonLabelStr) > 0)
  320.     buttonLabel = XmStringCreateSimple (buttonLabelStr);
  321.   else
  322.     buttonLabel = NULL;
  323.  
  324.   if (strlen(buttonAcceleratorTextStr) > 0)
  325.     buttonAcceleratorText = XmStringCreateSimple (buttonAcceleratorTextStr);
  326.   else
  327.     buttonAcceleratorText = NULL;
  328.  
  329.   ac = 0;
  330.   XtSetArg (al[ac], XmNlabelString, buttonLabel); ac++;
  331.   XtSetArg (al[ac], XmNmnemonic, buttonMnemonic); ac++;
  332.   XtSetArg (al[ac], XmNaccelerator, buttonAccelerator); ac++;
  333.   XtSetArg (al[ac], XmNacceleratorText, buttonAcceleratorText); ac++;
  334.  
  335.   if (buttonType == CascadeButton)
  336.     {
  337.       button = XmCreateCascadeButtonGadget (parent, NULL, al, ac);
  338.     }
  339.   else if (buttonType == CheckBox    || buttonType == CheckBoxOn ||
  340.        buttonType == RadioButton || buttonType == RadioButtonOn)
  341.     {
  342.       /* Radio buttons should have one-of-many (diamond shaped) indicator. */
  343.       if (buttonType == RadioButton || buttonType == RadioButtonOn)
  344.     {
  345.       XtSetArg (al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
  346.     }
  347.  
  348.       /* If the toggle button is "on," set the "set" resource. */
  349.       if (buttonType == CheckBoxOn || buttonType == RadioButtonOn)
  350.     {
  351.       XtSetArg (al[ac], XmNset, True); ac++;
  352.     }
  353.  
  354.       button = XmCreateToggleButtonGadget (parent, NULL, al, ac);
  355.       XtAddCallback(button, XmNvalueChangedCallback, MenuCB, buttonID);
  356.     }
  357.   else /* Create a push button by default. */
  358.     {
  359.       button = XmCreatePushButtonGadget (parent, NULL, al, ac);
  360.       XtAddCallback(button, XmNactivateCallback, MenuCB, buttonID);
  361.     }
  362.   XtManageChild (button);
  363.  
  364.   XmStringFree(buttonLabel);
  365.   XmStringFree(buttonAcceleratorText);
  366.  
  367.   return (button);
  368.  
  369. }
  370.  
  371.  
  372.  
  373. /******************************************************************************
  374.                    A d d   S e p a r a t o r   U t i l i t y
  375. ******************************************************************************/
  376.  
  377. static AddSeparator(parent)
  378.      Widget parent;
  379. {
  380.   Widget separator;
  381.   Arg    al[10];
  382.   int    ac;
  383.   
  384.   ac = 0;
  385.   separator = XmCreateSeparatorGadget (parent, NULL, al, ac);
  386.   XtManageChild (separator);
  387. }
  388.  
  389.