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 >
Wrap
C/C++ Source or Header
|
1992-08-19
|
13KB
|
389 lines
/* Menu.c -- This file contains these functions:
CreateMenuBar() -- a convenience function for creating
the application's menu bar.
CreateMenuButton() -- a convenience function for adding
individual buttons to panes within
the menu bar.
AddSeparator() -- a convenience function for adding
separators to panes within the menu bar. */
#include "Global.h"
#include "Menu.h"
int currentView; /* This holds the current state of the View menu. */
int currentOption; /* This holds the current option (from the second
group of toggles in the Text menu). */
Widget opt1Toggle, opt2Toggle, opt3Toggle; /* These are the radio buttons
from the Text menu. */
Widget CreateMenuButton();
Widget CreateMenuBar (parent)
Widget parent;
{
Widget menuBar;
Widget cascade;
Widget pulldownPane;
Widget button;
Widget optionsMenu;
XmString label;
/* Create menu bar. */
ac = 0;
menuBar = XmCreateMenuBar (parent, "menuBar", al, ac);
/************************************************************
F i l e
************************************************************/
ac = 0;
pulldownPane = XmCreatePulldownMenu (menuBar, "pulldownPane", al, ac);
/*** New ... ***/ CreateMenuButton (pulldownPane, NULL, MENU_File_New,
"New ...", 'N', PushButton,
NULL, NULL);
/*** Open ... ***/ CreateMenuButton (pulldownPane, NULL, MENU_File_Open,
"Open ...", 'O', PushButton,
NULL, NULL);
/* ----------------- */ AddSeparator(pulldownPane);
/*** Save ***/ CreateMenuButton (pulldownPane, NULL, MENU_File_Save,
"Save", 'S', PushButton,
NULL, NULL);
/*** Save As ... ***/ CreateMenuButton (pulldownPane, NULL, MENU_File_SaveAs,
"Save As ...", 'A', PushButton,
NULL, NULL);
/* ----------------- */ AddSeparator(pulldownPane);
/*** Print ... ***/ CreateMenuButton (pulldownPane, NULL, MENU_File_Print,
"Print ...", 'P', PushButton,
NULL, NULL);
/* ----------------- */ AddSeparator(pulldownPane);
/*** Exit ***/ CreateMenuButton (pulldownPane, NULL, MENU_File_Exit,
"Exit", 'E', PushButton,
"Meta<Key>F4:","Meta+F4");
/*** File cascade button ****/
label = XmStringCreateSimple ("File");
ac = 0;
XtSetArg (al[ac], XmNsubMenuId, pulldownPane); ac++;
XtSetArg (al[ac], XmNlabelString, label); ac++;
XtSetArg (al[ac], XmNmnemonic, 'F'); ac++;
cascade= XmCreateCascadeButtonGadget (menuBar, NULL, al, ac);
XtManageChild (cascade);
XmStringFree(label);
/************************************************************
E d i t
************************************************************/
ac = 0;
pulldownPane = XmCreatePulldownMenu (menuBar, "pulldownPane", al, ac);
/*** Undo ***/ CreateMenuButton (pulldownPane, NULL, MENU_Edit_Undo,
"Undo", 'U', PushButton,
"Meta<Key>BackSpace:","Alt+Backspace");
/* ----------------- */ AddSeparator(pulldownPane);
/*** Cut ***/ CreateMenuButton (pulldownPane, NULL, MENU_Edit_Cut,
"Cut", 't', PushButton,
"Shift<Key>DeleteChar:", "Shift+Del");
/*** Copy ***/ CreateMenuButton (pulldownPane, NULL, MENU_Edit_Copy,
"Copy", 'C', PushButton,
"Ctrl<Key>InsertChar:", "Ctrl+Ins");
/*** Paste ***/ CreateMenuButton (pulldownPane, NULL, MENU_Edit_Paste,
"Paste", 'P', PushButton,
"Shift<Key>InsertChar:", "Shift+Ins");
/* ----------------- */ AddSeparator(pulldownPane);
/*** Clear ***/ CreateMenuButton (pulldownPane, NULL, MENU_Edit_Clear,
"Clear", 'e', PushButton,
NULL, NULL);
/*** Delete ***/ CreateMenuButton (pulldownPane, NULL, MENU_Edit_Delete,
"Delete", 'D', PushButton,
NULL, NULL);
/*** Edit cascade button ****/
label = XmStringCreateSimple ("Edit");
ac = 0;
XtSetArg (al[ac], XmNsubMenuId, pulldownPane); ac++;
XtSetArg (al[ac], XmNlabelString, label); ac++;
XtSetArg (al[ac], XmNmnemonic, 'E'); ac++;
cascade = XmCreateCascadeButtonGadget (menuBar, NULL, al, ac);
XtManageChild (cascade);
XmStringFree(label);
/************************************************************
V i e w
************************************************************/
/* This menu pane demonstrates how setting the XmNradioBehavior resources
enables the menu pane (a row column manager) to enforce a one-of-many
selection among its toggle button children.
This technique has a side effect worth noting: The MenuCB() routine
is called twice each time the user chooses a toggle button from the
menu pane. The first call occurs when the row column manager unsets
the current selection. The second call occurs when the row column
manager sets the new selection. Refer to the MenuCB() routine to
see how behavior for the View menu is handled. */
ac = 0;
XtSetArg (al[ac], XmNradioBehavior, True); ac++;
pulldownPane = XmCreatePulldownMenu (menuBar, "pulldownPane", al, ac);
/*** As One ***/ CreateMenuButton (pulldownPane, NULL, MENU_View_AsOne,
"As One", 'O', RadioButtonOn,
NULL, NULL);
currentView = MENU_View_AsOne;
/*** As Two ***/ CreateMenuButton (pulldownPane, NULL, MENU_View_AsTwo,
"As Two", 'w', RadioButton,
NULL, NULL);
/*** As Three ***/ CreateMenuButton (pulldownPane, NULL, MENU_View_AsThree,
"As Three", 'h', RadioButton,
NULL, NULL);
/*** View cascade button ****/
label = XmStringCreateSimple ("View");
ac = 0;
XtSetArg (al[ac], XmNsubMenuId, pulldownPane); ac++;
XtSetArg (al[ac], XmNlabelString, label); ac++;
XtSetArg (al[ac], XmNmnemonic, 'V'); ac++;
cascade = XmCreateCascadeButtonGadget (menuBar, NULL, al, ac);
XtManageChild (cascade);
XmStringFree(label);
/************************************************************
T e x t
************************************************************/
/* This menu pane contains two groups of toggle buttons: One group of
check boxes, and one group of radio buttons. Since the pane (row
column manager) has no way of distinguishing separate groups, radio
behavior cannot be enforced using the same technique used in the View
menu.
In this case, the radio behavior for the second group of toggle
buttons is implemented within the MenuCB() routine. The widget IDs
for the three radio buttons are saved in variables (eg. opt1Toggle)
for access within MenuCB().
More than one check box item can be chosen at a time. Only one
radio button item can be chosen at a time. */
ac = 0;
pulldownPane = XmCreatePulldownMenu (menuBar, "pulldownPane", al, ac);
CreateMenuButton (pulldownPane, NULL, MENU_checkbox_A,
"Underline", 'U', CheckBoxOn,
NULL, NULL);
CreateMenuButton (pulldownPane, NULL, MENU_checkbox_B,
"Bold", 'B', CheckBox,
NULL, NULL);
CreateMenuButton (pulldownPane, NULL, MENU_checkbox_C,
"Italic", 'I', CheckBox,
NULL, NULL);
/* ----------------- */ AddSeparator(pulldownPane);
opt1Toggle =
CreateMenuButton (pulldownPane, NULL, MENU_radio_1,
"8 point", '8', RadioButtonOn,
NULL, NULL);
currentOption = MENU_radio_1;
opt2Toggle =
CreateMenuButton (pulldownPane, NULL, MENU_radio_2,
"12 point", '2', RadioButton,
NULL, NULL);
opt3Toggle =
CreateMenuButton (pulldownPane, NULL, MENU_radio_3,
"16 point", '6', RadioButton,
NULL, NULL);
/*** Enhancements cascade button ****/
label = XmStringCreateSimple ("Text");
ac = 0;
XtSetArg (al[ac], XmNsubMenuId, pulldownPane); ac++;
XtSetArg (al[ac], XmNlabelString, label); ac++;
XtSetArg (al[ac], XmNmnemonic, 'T'); ac++;
cascade = XmCreateCascadeButtonGadget (menuBar, NULL, al, ac);
XtManageChild (cascade);
XmStringFree(label);
/************************************************************
H e l p
************************************************************/
ac = 0;
pulldownPane = XmCreatePulldownMenu (menuBar, "pulldownPane", al, ac);
/*** On Item ... ***/ CreateMenuButton (pulldownPane, NULL, MENU_Help_OnItem,
"On Item ...", 'I', PushButton,
NULL, NULL);
/*** On Application ... ***/ CreateMenuButton (pulldownPane, NULL,
MENU_Help_OnApplication,
"On Application ...", 'A',
PushButton, "<Key>F1", "F1");
/*** On Help ... ***/ CreateMenuButton (pulldownPane, NULL, MENU_Help_OnHelp,
"On Help ...", 'H', PushButton,
NULL, NULL);
/* ----------------- */ AddSeparator(pulldownPane);
/*** Index ... ***/ CreateMenuButton (pulldownPane, NULL,
MENU_Help_Index,
"Index ...", 'x', PushButton,
NULL, NULL);
/*** Tutorial ... ***/ CreateMenuButton (pulldownPane, NULL,
MENU_Help_Tutorial,
"Tutorial ...", 'T', PushButton,
NULL, NULL);
/* ----------------- */ AddSeparator(pulldownPane);
/*** On Version ... ***/ CreateMenuButton (pulldownPane, NULL,
MENU_Help_OnVersion,
"On Version ...", 'V', PushButton,
NULL, NULL);
/*** Help cascade button ****/
label = XmStringCreateSimple ("Help");
ac = 0;
XtSetArg (al[ac], XmNsubMenuId, pulldownPane); ac++;
XtSetArg (al[ac], XmNlabelString, label); ac++;
XtSetArg (al[ac], XmNmnemonic, 'H'); ac++;
cascade = XmCreateCascadeButtonGadget (menuBar, NULL, al, ac);
XtManageChild (cascade);
XmStringFree(label);
/*** Make Help button right-justified in menu bar ***/
ac = 0;
XtSetArg (al[ac], XmNmenuHelpWidget, cascade); ac++;
XtSetValues(menuBar, al, ac);
return(menuBar);
} /* End of the CreateMenuBar() function. */
/******************************************************************************
C r e a t e M e n u B u t t o n U t i l i t y
******************************************************************************/
Widget CreateMenuButton(parent, name, buttonID,
buttonLabelStr, buttonMnemonic, buttonType,
buttonAccelerator, buttonAcceleratorTextStr)
Widget parent;
char *name;
int buttonID; /* Values defined in Menu.h */
int buttonType; /* Values defined in Menu.h */
char *buttonLabelStr;
char buttonMnemonic;
char *buttonAccelerator;
char *buttonAcceleratorTextStr;
{
Widget button;
XmString buttonLabel;
XmString buttonAcceleratorText;
if (strlen(buttonLabelStr) > 0)
buttonLabel = XmStringCreateSimple (buttonLabelStr);
else
buttonLabel = NULL;
if (strlen(buttonAcceleratorTextStr) > 0)
buttonAcceleratorText = XmStringCreateSimple (buttonAcceleratorTextStr);
else
buttonAcceleratorText = NULL;
ac = 0;
XtSetArg (al[ac], XmNlabelString, buttonLabel); ac++;
XtSetArg (al[ac], XmNmnemonic, buttonMnemonic); ac++;
XtSetArg (al[ac], XmNaccelerator, buttonAccelerator); ac++;
XtSetArg (al[ac], XmNacceleratorText, buttonAcceleratorText); ac++;
if (buttonType == CascadeButton)
{
button = XmCreateCascadeButtonGadget (parent, NULL, al, ac);
}
else if (buttonType == CheckBox || buttonType == CheckBoxOn ||
buttonType == RadioButton || buttonType == RadioButtonOn)
{
/* Radio buttons should have one-of-many (diamond shaped) indicator. */
if (buttonType == RadioButton || buttonType == RadioButtonOn)
{
XtSetArg (al[ac], XmNindicatorType, XmONE_OF_MANY); ac++;
}
/* If the toggle button is "on," set the "set" resource. */
if (buttonType == CheckBoxOn || buttonType == RadioButtonOn)
{
XtSetArg (al[ac], XmNset, True); ac++;
}
button = XmCreateToggleButtonGadget (parent, NULL, al, ac);
XtAddCallback(button, XmNvalueChangedCallback, MenuCB, buttonID);
}
else /* Create a push button by default. */
{
button = XmCreatePushButtonGadget (parent, NULL, al, ac);
XtAddCallback(button, XmNactivateCallback, MenuCB, buttonID);
}
XtManageChild (button);
XmStringFree(buttonLabel);
XmStringFree(buttonAcceleratorText);
return (button);
}
/******************************************************************************
A d d S e p a r a t o r U t i l i t y
******************************************************************************/
static AddSeparator(parent)
Widget parent;
{
Widget separator;
Arg al[10];
int ac;
ac = 0;
separator = XmCreateSeparatorGadget (parent, NULL, al, ac);
XtManageChild (separator);
}