Kbase P11541: How to create dynamic menus
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  01/07/2004 |
|
Status: Unverified
GOAL:
How to create dynamic menus
FACT(s) (Environment):
Progress 8.x
FACT(s) (Environment):
Progress 9.x
FIX:
Sometimes it is necessary to restrict user access to a specific function in an application. The dynamic menu feature in Progress can help you do this.
EXPLANATION:
In order to create a menu-bar, it is necessary to have three widgets, MENU, SUB-MENU, and MENU-ITEM. To reference these widgets, define them as WIDGET-HANDLE variables:
DEFINE VARIABLE hMenu AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE hSubMenu AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE hMenuItem AS WIDGET-HANDLE NO-UNDO.
Widgets have a hierarchy in the menu-bar. The MENU widget is the top level, the next level is the SUB-MENU widget, and the bottom level is the MENU-ITEM widget. The MENU widget must be related to the window widget using the property MENUBAR:
ASSIGN CURRENT-WINDOW:MENUBAR = hMenu:HANDLE.
According to the widgets hierarchy in the menu-bar, the SUB-MENU widget must be related to the MENU widget using it's Parent property and the MENU-ITEM widget must be related to the SUB-MENU widget using it's Parent property:
CREATE MENU hMenu.
CREATE SUB-MENU hSubMenu
ASSIGN PARENT = hMenu
. . . . . .
CREATE MENU-ITEM hMenuItem
ASSIGN PARENT = hSubMenu
. . . . . .
This example also demonstrates how to dynamically declare ACCELERATOR keys
The following example shows how to create a dynamic menu-bar:
CURRENT-WINDOW:HEIGHT-CHARS = 18.
CURRENT-WINDOW:WIDTH-CHARS = 132.
DEFINE VARIABLE hMenu AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE hSubMenu AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE hMenuItem AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE cSubMenues AS CHARACTER INITIAL "File,Edit"
NO-UNDO.
DEFINE VARIABLE cMenuItem1 AS CHARACTER INITIAL "New,Open,Close,Save,
Exit" NO-UNDO.
DEFINE VARIABLE cMenuItem2 AS CHARACTER INITIAL "Undo,Copy,Cut,Paste"
NO-UNDO.
DEFINE VARIABLE iAuxlr1 AS INTEGER NO-UNDO.
DEFINE VARIABLE iAuxlr2 AS INTEGER NO-UNDO.
DEFINE VARIABLE iItems AS INTEGER NO-UNDO.
DEFINE VARIABLE cItems AS CHARACTER NO-UNDO.
CREATE MENU hMenu.
DO iAuxlr1 = 1 TO NUM-ENTRIES(cSubMenues):
CREATE SUB-MENU hSubMenu
ASSIGN PARENT = hMenu
NAME = ENTRY(iAuxlr1, cSubMenues)
LABEL = ENTRY(iAuxlr1, cSubMenues).
CASE hSubMenu:NAME:
WHEN "File"
THEN ASSIGN iItems = NUM-ENTRIES(cMenuItem1)
cItems = cMenuItem1.
WHEN "Edit"
THEN ASSIGN iItems = NUM-ENTRIES(cMenuItem2)
cItems = cMenuItem2.
END. /*CASE hSubMenu:NAME:*/
DO iAuxlr2 = 1 TO iItems:
CREATE MENU-ITEM hMenuItem
ASSIGN PARENT = hSubMenu
NAME = hSubMenu:NAME + ENTRY(iAuxlr2, cItems)
LABEL = ENTRY(iAuxlr2, cItems)
/* This IS WHERE the ACCELERATOR KEYS are DEFINED */
ACCELERATOR = SUBSTRING(ENTRY(iAuxlr2, cItems),2,1)
/*This version just declares the 2nd letter AS the ACCELERATOR.
You may remove the above LINE IF you DO NOT want TO USE
ACCELERATORS. */
TRIGGERS:
ON CHOOSE PERSISTENT RUN MenuItemChoose IN
THIS-PROCEDURE (INPUT hMenuItem:NAME).
END TRIGGERS.
/*Example of how to disable a Menu-Item*/
IF hMenuItem:NAME = "EditUndo"
THEN ASSIGN hMenuItem:SENSITIVE = FALSE.
END. /*DO iAuxlr2 = 1 TO iItems:*/
END. /*DO iAuxlr1 = 1 TO NUM-ENTRIES(cSubMenues):*/
ASSIGN CURRENT-WINDOW:MENUBAR = hMenu:HANDLE.
DEFINE FRAME F1
WITH SIZE 132 BY 18 THREE-D NO-LABELS.
ENABLE ALL WITH FRAME F1.
WAIT-FOR CLOSE OF CURRENT-WINDOW.
PROCEDURE MenuItemChoose.
DEFINE INPUT PARAMETER cMenuItemName AS CHARACTER NO-UNDO.
MESSAGE "Item Selected:" SKIP(1)
"'" + cMenuItemName + "'" VIEW-AS ALERT-BOX INFORMATION.
IF cMenuItemName = 'FileExit' THEN QUIT.
END PROCEDURE.