Menu manipulation routines.
Functions to add MenuItems or SubMenus to given MenuTitles (by index) and to remove MenuItems (by handle). Useful for "Recent Files" and correct implementation of the "Window" menu. It's a bit more elegant than deleting and rebuilding the entire menu over and over again.
Code: Select all
Procedure AppendItemToMenu(MenuItemID, Text$, Menu, MenuTitleIndex, ImageID=0)
Protected mnuArray = MenuID(Menu)
Protected newParent = CocoaMessage(0, mnuArray, "objectAtIndex:", MenuTitleIndex)
Protected mItem = MenuItem(MenuItemID, Text$, ImageID)
Protected oldParent = CocoaMessage(0, mItem, "menu")
CocoaMessage(0, oldParent, "removeItem:", mItem)
CocoaMessage(0, newParent, "addItem:", mItem)
ProcedureReturn mItem
EndProcedure
Procedure AppendSubmenuToMenu(Text$, Menu, MenuTitleIndex, ImageID=0)
Protected mnuArray = MenuID(Menu)
Protected newParent = CocoaMessage(0, mnuArray, "objectAtIndex:", MenuTitleIndex)
Protected mItem = MenuItem(0, Text$, ImageID)
Protected subMenu = CocoaMessage(0, 0, "NSMenu alloc")
CocoaMessage(0, subMenu, "initWithTitle:$", @Text$)
Protected oldParent = CocoaMessage(0, mItem, "menu")
CocoaMessage(0, oldParent, "removeItem:", mItem)
CocoaMessage(0, newParent, "addItem:", mItem)
CocoaMessage(0, mItem, "setSubmenu:", subMenu)
ProcedureReturn subMenu
EndProcedure
Procedure AppendItemToSubmenu(MenuItemID, Text$, SubMenu, ImageID=0)
Protected mItem = MenuItem(MenuItemID, Text$, ImageID)
Protected oldParent = CocoaMessage(0, mItem, "menu")
CocoaMessage(0, oldParent, "removeItem:", mItem)
CocoaMessage(0, SubMenu, "addItem:", mItem)
ProcedureReturn mItem
EndProcedure
Procedure RemoveMenuItem(MenuItemHandle)
Protected Parent = CocoaMessage(0, MenuItemHandle, "menu")
CocoaMessage(0, Parent, "removeItem:", MenuItemHandle)
EndProcedure
; DEMO
OpenWindow(0, 200, 200, 200, 100, "Menu Example")
; create a menu and fill it with two MenuTitles and a few items
CreateMenu(0, WindowID(0))
; a file menu
MenuTitle("File")
MenuItem(1, "Open" +Chr(9)+"Cmd+O")
MenuItem(2, "Save" +Chr(9)+"Cmd+S")
; an edit menu
MenuTitle("Edit")
MenuItem(4, "Cut")
MenuItem(5, "Copy")
MenuItem(6, "Paste")
delme = MenuItem(7, "Delete me")
; now we append an item to the "File" menu (which is at index 0)
AppendItemToMenu(3, "Save as...", 0, 0)
; and we'll append a submenu to the first (index 0) menu too
sub = AppendSubmenuToMenu("Recent Files", 0, 0)
; our newly created sub menu needs a few items
AppendItemToSubmenu(100, "File number one" +Chr(9)+"Shift+Cmd+1", sub, 0)
AppendItemToSubmenu(101, "File number two" +Chr(9)+"Shift+Cmd+2", sub, 0)
AppendItemToSubmenu(102, "File number three" +Chr(9)+"Shift+Cmd+3", sub, 0)
; get rid of the "delete me" item
RemoveMenuItem(delme)