Platforms to show: All Mac Windows Linux Cross-Platform
/MacBase/Menus/NSMenuPopupEvents
Required plugins for this example: MBS MacBase Plugin, MBS Main Plugin
Last modified Sat, 27th Dec 2024.
You find this example project in your MBS Xojo Plugin download as a Xojo project file within the examples folder: /MacBase/Menus/NSMenuPopupEvents
Download this example: NSMenuPopupEvents.zip
Project "NSMenuPopupEvents.xojo_binary_project"
Class App Inherits DesktopApplication
Const kEditClear = "&Delete"
Const kFileQuit = "&Quit"
Const kFileQuitShortcut = ""
EventHandler Sub Opening()
End EventHandler
Sub Constructor()
End Sub
End Class
Class Window1 Inherits DesktopWindow
Control Label1 Inherits DesktopLabel
ControlInstance Label1 Inherits DesktopLabel
End Control
Control TextArea1 Inherits DesktopTextArea
ControlInstance TextArea1 Inherits DesktopTextArea
EventHandler Function ConstructContextualMenu(base As DesktopMenuItem, x As Integer, y As Integer) As Boolean
System.DebugLog CurrentMethodName
// build a context menu using Xojo methods
' Add some items
base.AddMenu(New DesktopMenuItem("Test 1"))
base.AddMenu(New DesktopMenuItem("Test 2"))
base.AddMenu(New DesktopMenuItem("Test 3"))
' Add a Separator
base.AddMenu(New DesktopMenuItem(DesktopMenuItem.TextSeparator))
' Add a sub menu
Var submenu As New DesktopMenuItem("SubMenu")
submenu.AddMenu(New DesktopMenuItem("SubMenu Test 1"))
submenu.AddMenu(New DesktopMenuItem("SubMenu Test 2"))
submenu.AddMenu(New DesktopMenuItem("SubMenu Test 3"))
base.AddMenu(submenu)
' Add a Separator
base.AddMenu(New DesktopMenuItem(DesktopMenuItem.TextSeparator))
Return True
End EventHandler
EventHandler Function ContextualMenuItemSelected(selectedItem As DesktopMenuItem) As Boolean
System.DebugLog CurrentMethodName
If selectedItem = Nil Then
System.DebugLog "none selected"
Else
System.DebugLog "selected: "+selectedItem.Text
End If
End EventHandler
End Control
Control Button1 Inherits DesktopButton
ControlInstance Button1 Inherits DesktopButton
EventHandler Sub Pressed()
System.DebugLog CurrentMethodName
// build a context menu using Xojo methods
Var base As New DesktopMenuitem
' Add some items
base.AddMenu(New DesktopMenuItem("Test 1"))
base.AddMenu(New DesktopMenuItem("Test 2"))
base.AddMenu(New DesktopMenuItem("Test 3"))
' Add a Separator
base.AddMenu(New DesktopMenuItem(DesktopMenuItem.TextSeparator))
' Add a sub menu
Var submenu As New DesktopMenuItem("SubMenu")
submenu.AddMenu(New DesktopMenuItem("SubMenu Test 1"))
submenu.AddMenu(New DesktopMenuItem("SubMenu Test 2"))
submenu.AddMenu(New DesktopMenuItem("SubMenu Test 3"))
base.AddMenu(submenu)
' Add a Separator
base.AddMenu(New DesktopMenuItem(DesktopMenuItem.TextSeparator))
// and show it!
Call base.PopUp
End EventHandler
End Control
EventHandler Function ConstructContextualMenu(base As DesktopMenuItem, x As Integer, y As Integer) As Boolean
System.DebugLog CurrentMethodName
// build a context menu using Xojo methods
' Add some items
base.AddMenu(New DesktopMenuItem("Test 1"))
base.AddMenu(New DesktopMenuItem("Test 2"))
base.AddMenu(New DesktopMenuItem("Test 3"))
' Add a Separator
base.AddMenu(New DesktopMenuItem(DesktopMenuItem.TextSeparator))
' Add a sub menu
Var submenu As New DesktopMenuItem("SubMenu")
submenu.AddMenu(New DesktopMenuItem("SubMenu Test 1"))
submenu.AddMenu(New DesktopMenuItem("SubMenu Test 2"))
submenu.AddMenu(New DesktopMenuItem("SubMenu Test 3"))
base.AddMenu(submenu)
' Add a Separator
base.AddMenu(New DesktopMenuItem(DesktopMenuItem.TextSeparator))
Return True
End EventHandler
EventHandler Function ContextualMenuItemSelected(selectedItem As DesktopMenuItem) As Boolean
System.DebugLog CurrentMethodName
If selectedItem = Nil Then
System.DebugLog "none selected"
Else
System.DebugLog "selected: "+selectedItem.Text
End If
End EventHandler
EventHandler Sub Opening()
// just initialize early, so we can add ourselves between the app and NSMenu
m = New MyNSMenuPopupEvents
End EventHandler
Property m As MyNSMenuPopupEvents
End Class
MenuBar MainMenuBar
MenuItem FileMenu = "&File"
MenuItem FileQuit = "#App.kFileQuit"
MenuItem EditMenu = "&Edit"
MenuItem EditUndo = "&Undo"
MenuItem EditSeparator1 = "-"
MenuItem EditCut = "Cu&t"
MenuItem EditCopy = "&Copy"
MenuItem EditPaste = "&Paste"
MenuItem EditClear = "#App.kEditClear"
MenuItem EditSeparator2 = "-"
MenuItem EditSelectAll = "Select &All"
MenuItem HelpMenu = "&Help"
End MenuBar
Sign
End Sign
Class MyNSMenuPopupEvents Inherits NSMenuPopupEventsMBS
EventHandler Sub didCloseMenu(menu as NSMenuMBS, theEvent as NSEventMBS, view as NSViewMBS)
// the menu closed
System.DebugLog CurrentMethodName
End EventHandler
EventHandler Function popUpMenuAtPosition(menu as NSMenuMBS, item as NSMenuItemMBS, location as NSPointMBS, view as NSViewMBS) As Boolean
// the menu pops up and you can modify it
// will also get an willOpenMenu event next
System.DebugLog CurrentMethodName
Var title As String = menu.Title
Var items() As NSMenuItemMBS = menu.items
Var it As NSMenuItemMBS = items(0)
it.Title = it.Title + " !"
// let macOS add more
menu.allowsContextMenuPlugIns = True
// macOS 15.2 or newer
'menu.automaticallyInsertsWritingToolsItems = True
// return true to disable menu
End EventHandler
EventHandler Sub willOpenMenu(menu as NSMenuMBS, theEvent as NSEventMBS, view as NSViewMBS)
// the menu opens and you can modify it
System.DebugLog CurrentMethodName
Var title As String = menu.Title
Var items() As NSMenuItemMBS = menu.items
Var it As NSMenuItemMBS = items(0)
it.Title = it.Title + " 😀"
// let macOS add more
menu.allowsContextMenuPlugIns = True
// macOS 15.2 or newer
'menu.automaticallyInsertsWritingToolsItems = True
// return true to disable menu
End EventHandler
End Class
End Project
Download this example: NSMenuPopupEvents.zip
The items on this page are in the following plugins: MBS MacBase Plugin.