2013-05-30 12:16:54 +00:00
|
|
|
BrowserWindow = require 'browser-window'
|
2013-08-14 04:03:37 +00:00
|
|
|
EventEmitter = require('events').EventEmitter
|
2013-05-30 12:16:54 +00:00
|
|
|
MenuItem = require 'menu-item'
|
2013-05-14 11:24:52 +00:00
|
|
|
|
2013-05-16 02:54:37 +00:00
|
|
|
bindings = process.atomBinding 'menu'
|
2013-05-16 11:34:23 +00:00
|
|
|
|
2013-05-16 02:54:37 +00:00
|
|
|
Menu = bindings.Menu
|
2013-05-14 11:24:52 +00:00
|
|
|
Menu::__proto__ = EventEmitter.prototype
|
|
|
|
|
|
|
|
popup = Menu::popup
|
|
|
|
Menu::popup = (window) ->
|
2013-05-15 11:19:35 +00:00
|
|
|
throw new TypeError('Invalid window') unless window?.constructor is BrowserWindow
|
2013-05-14 11:24:52 +00:00
|
|
|
|
|
|
|
popup.call this, window
|
|
|
|
|
2013-05-16 12:06:25 +00:00
|
|
|
Menu::append = (item) ->
|
|
|
|
@insert @getItemCount(), item
|
|
|
|
|
2013-05-16 11:34:23 +00:00
|
|
|
Menu::insert = (pos, item) ->
|
|
|
|
throw new TypeError('Invalid item') unless item?.constructor is MenuItem
|
|
|
|
|
|
|
|
switch item.type
|
|
|
|
when 'normal' then @insertItem pos, item.commandId, item.label
|
|
|
|
when 'checkbox' then @insertCheckItem pos, item.commandId, item.label
|
|
|
|
when 'radio' then @insertRadioItem pos, item.commandId, item.label, item.groupId
|
|
|
|
when 'separator' then @insertSeparator pos
|
|
|
|
when 'submenu' then @insertSubMenu pos, item.commandId, item.label, item.submenu
|
2013-05-14 14:17:25 +00:00
|
|
|
|
2013-05-16 11:34:23 +00:00
|
|
|
@setSublabel pos, item.sublabel if item.sublabel?
|
2013-05-14 14:17:25 +00:00
|
|
|
|
2013-08-14 04:03:37 +00:00
|
|
|
unless @delegate?
|
|
|
|
@commandsMap = {}
|
|
|
|
@items = []
|
2013-05-16 12:06:25 +00:00
|
|
|
@delegate =
|
2013-08-14 04:03:37 +00:00
|
|
|
isCommandIdChecked: (commandId) => @commandsMap[commandId]?.checked
|
|
|
|
isCommandIdEnabled: (commandId) => @commandsMap[commandId]?.enabled
|
|
|
|
isCommandIdVisible: (commandId) => @commandsMap[commandId]?.visible
|
|
|
|
getAcceleratorForCommandId: (commandId) => @commandsMap[commandId]?.accelerator
|
2013-08-14 04:51:47 +00:00
|
|
|
executeCommand: (commandId) =>
|
|
|
|
activeItem = @commandsMap[commandId]
|
2013-10-05 06:31:30 +00:00
|
|
|
activeItem.click() if activeItem?
|
2013-08-14 04:03:37 +00:00
|
|
|
@items.splice pos, 0, item
|
|
|
|
@commandsMap[item.commandId] = item
|
2013-05-16 11:34:23 +00:00
|
|
|
|
2013-10-05 04:56:30 +00:00
|
|
|
applicationMenu = null
|
2013-05-16 02:54:37 +00:00
|
|
|
Menu.setApplicationMenu = (menu) ->
|
|
|
|
throw new TypeError('Invalid menu') unless menu?.constructor is Menu
|
2013-10-05 04:56:30 +00:00
|
|
|
applicationMenu = menu # Keep a reference.
|
2013-10-05 06:31:30 +00:00
|
|
|
|
|
|
|
if process.platform is 'darwin'
|
|
|
|
bindings.setApplicationMenu menu
|
|
|
|
else
|
2013-12-26 10:41:21 +00:00
|
|
|
windows = BrowserWindow.getAllWindows()
|
2013-10-05 06:31:30 +00:00
|
|
|
w.setMenu menu for w in windows
|
2013-05-16 11:34:23 +00:00
|
|
|
|
2013-10-05 13:05:59 +00:00
|
|
|
Menu.getApplicationMenu = -> applicationMenu
|
|
|
|
|
2013-05-16 09:25:02 +00:00
|
|
|
Menu.sendActionToFirstResponder = bindings.sendActionToFirstResponder
|
2013-05-16 02:54:37 +00:00
|
|
|
|
2013-05-16 14:43:58 +00:00
|
|
|
Menu.buildFromTemplate = (template) ->
|
|
|
|
throw new TypeError('Invalid template for Menu') unless Array.isArray template
|
|
|
|
|
|
|
|
menu = new Menu
|
|
|
|
for item in template
|
|
|
|
throw new TypeError('Invalid template for MenuItem') unless typeof item is 'object'
|
|
|
|
|
|
|
|
item.submenu = Menu.buildFromTemplate item.submenu if item.submenu?
|
2013-08-14 03:00:08 +00:00
|
|
|
menuItem = new MenuItem(item)
|
2013-08-15 08:09:34 +00:00
|
|
|
menuItem[key] = value for key, value of item when not menuItem[key]?
|
2013-08-14 03:00:08 +00:00
|
|
|
|
|
|
|
menu.append menuItem
|
2013-05-16 14:43:58 +00:00
|
|
|
|
|
|
|
menu
|
|
|
|
|
2013-05-14 11:24:52 +00:00
|
|
|
module.exports = Menu
|