Development Update November 2007
‘Hydra4GL’ allows you to create a front end application launcher menu with pull down menus. The menu structure, contents and actions can be defined using a tool (MakeMenu) which stores the data in the database or dynamically within your 4GL application code.
MakeMenu Tool
'MakeMenu' is a graphical tool (written in 4GL) which allows the developer to create/manage/modify the application launcher menu.

The developer creates and modifies sub menus, server application launch and local client application launch configurations. The configurations are stored in a database and processed by the login program.
User Authentication
The application launcher menu bar can either manage its own users and groups or use the application server's Operating System user/password authentication system. Additionally, the three most common security encryption and validation methods Crypt, Shadow and PAM are fully supported.
License Utilisation
Any 4GL application which is launched from this menu will utilize the same runtime license (one seat license for many applications).
Example: Nested Menu Bar

This is an example of how a menu bar could look using a customized application launcher menu bar. It should also be noted that any application which is launched from the menu bar is utilizing one and the same concurrent runtime license.
Defining the application launcher menu bar dynamically
'Hydra4GL' 4.3 also allows the developer to dynamically create and manage the application launcher menu bar within the 4GL code. The following set of functions can be used for the management:
create_menu()
Creates the main menu, returns the menu ID (destroys existing menu)
menu_add_option(menu_id INTEGER, label VARCHAR(255), action_id INTEGER)
Add a command to the menu identified by menu ID
menu_add_submenu(menu_id INTEGER, label VARCHAR(255) )
Add a submenu to the menu identified by menu ID (returns the menu ID)
menu_publish()
Send the menu to the client. Once published, you cannot change it
execute_menu()
Get a user response from the menu. This is not buffered, so the menu is useless unless this is called. Returns the 'action_id' of the option pressed.
Example Code:
MAIN
DEFINE main_menu_id INTEGER
DEFINE sub_menu_id INTEGER
DEFINE action_id INTEGER
OPEN FORM f_login FROM "login_sample"
DISPLAY FORM f_login
LET main_menu_id = create_menu()
LET sub_menu_id = menu_add_submenu(main_menu_id, "Top Menu 1")
CALL menu_add_option(sub_menu_id, "Sub Option 1", 1)
CALL menu_add_option(sub_menu_id, "Sub Option 2", 2)
CALL menu_add_option(sub_menu_id, "Exit", 3)
LET sub_menu_id = menu_add_submenu(main_menu_id, "Top Menu 2")
CALL menu_add_option(sub_menu_id, "Another Option", 4)
LET sub_menu_id = menu_add_submenu(sub_menu_id, "Sub Menu 1")
CALL menu_add_option(sub_menu_id, "A cascading option", 5)
CALL menu_publish()
WHILE (TRUE)
LET action_id = execute_menu()
IF action_id = 3 THEN # 3 is the arbitrary action ID I gave to 'exit', only trying to examplify.
EXIT WHILE
ELSE
DISPLAY "action_id = ", action_id AT 10, 2
END IF
END WHILE
END MAIN