Source: josm/ui/menu.mjs

/**
 * Provides a collection of namespaces, classes and functions to work with
 * JOSMs menu system.
 *
 * @module josm/ui/menu
 * @example
 * import {JSAction} from 'josm/ui/menu'
 */

/* global Java */
/* global Plugin */

const MainApplication = Java.type('org.openstreetmap.josm.gui.MainApplication')
import * as util from 'josm/util'

/**
 * Represents JOSMs global menu bar.
 *
 * @class
 * @name MenuBar
 */
export const MenuBar =  {}

/**
 * Replies the number of menus in the JOSM menu bar.
 *
 * @example
 * import josm from 'josm'
 * // display the number of menus
 * josm.alert(josm.menu.length)
 *
 * @property {number} length the number of menues
 * @name length
 * @summary the number of menus in the JOSM menu bar
 * @memberof module:josm/ui/menu~MenuBar
 * @static
 */
Object.defineProperty(MenuBar, 'length', {
  enumerable: true,
  get: function () {
    if (!MainApplication.getMenu()) return 0
    return MainApplication.getMenu().getMenuCount()
  }
})

/**
 * Replies a menu in the JOSM menu bar.
 *
 * <code>key</code> is either a numberic index or one of the following
 * symbolic names as string:
 * <ul>
 *   <li><code>file</code></li>
 *   <li><code>edit</code></li>
 *   <li><code>view</code></li>
 *   <li><code>tools</code></li>
 *   <li><code>presets</code></li>
 *   <li><code>imagery</code></li>
 *   <li><code>window</code></li>
 *   <li><code>help</code></li>
 * </ul>
 *
 * @example
 * import josm from 'josm'
 * // get the edit menu with a numeric index
 * const editMenu = josm.menu.get(1)
 *
 * // get the file menu with a symbolic name
 * const fileMenu = josm.menu.get('file')
 *
 * @return {javax.swing.JMenu} the menu
 * @summary Replies a menu in the JOSM menu bar.
 * @param {number|string} key  the key denoting the menu
 * @memberof module:josm/ui/menu~MenuBar
 * @name get
 * @function
 * @static
 */
MenuBar.get = function (key) {
  util.assert(util.isSomething(key), 'key: must not be null or undefined')
  const mainMenu = MainApplication.getMenu()
  if (util.isNumber(key)) {
    util.assert(key >= 0 && key < MenuBar.length,
      'key: index out of range, got {0}', key)
    return mainMenu.getMenu(key)
  } else if (util.isString(key)) {
    key = util.trim(key).toLowerCase()
    switch (key) {
      case 'file': return mainMenu.fileMenu
      case 'edit': return mainMenu.editMenu
      case 'view': return mainMenu.viewMenu
      case 'tools': return mainMenu.toolsMenu
      case 'presets': return mainMenu.presetsMenu
      case 'imagery': return mainMenu.imageryMenu
      case 'window': return mainMenu.windowMenu
      case 'help': return mainMenu.helpMenu
      default:
        util.assert(false,
          'Unsupported key to access a menu, got {0}', key)
    }
  } else {
    util.assert(false, 'Unexpected value, got {0}', key)
  }
}

/**
 * Replies an array with the symbolic menu names.
 *
 * @memberof module:josm/ui/menu~MenuBar
 * @name menuNames
 * @property {array} menuNames the names of the menues in the menu bar
 * @readOnly
 * @summary Replies an array with the symbolic menu names.
 *
 */
Object.defineProperty(MenuBar, 'menuNames', {
  enumerable: true,
  get: function () {
    return ['file', 'edit', 'view', 'tools', 'presets',
      'imagery', 'window', 'help']
  }
})

/**
 * Callback type for JSAction
 * 
 * @callback JSActionCallback
 */

/**
 * The named options for building a JSAction.
 * 
 * @typedef JSActionOptions 
 * @property {string} [name]  The optional name of the action. Default: an auto generated name
 * @property {string} [tooltip] The optional tooltip of the action. Default: empty string
 * @property {string} [iconName] The optional name of an icon. Default: null
 * @property {string} [toolbarId] The optional name of the tooblar to which this action is added.
 *   Note that it isn't added automatically, when this action is created. Default: null.
 * @property {module:josm/ui/menu~JSActionCallback} [onExecute=null] The optional function which is called when the action is executed.
 *   Default: null.
 * @property {module:josm/ui/menu~JSActionCallback} [onInitEnabled=null] The optional function which is called when the <em>enabled</em>
 *   state of the function is evaluated the first time. Default: null.
 * @property {module:josm/ui/menu~JSActionCallback} [onUpdateEnabled=null] The (optional) function which is called when the <em>enabled</em>
 *   state of the function is reevaluated, in particular, when layer change
 *   events or selection change events occur. Default: null.
 */

/**
 * JSAction is an action for which a menu item or a toolbar item can be
 * added to  JOSMs menu or JOSMs toolbar respectively.
 *
 * This is just a shortcut for the Java class
 * {@class org.openstreetmap.josm.plugins.scripting.js.JSAction}.
 *
 * The constructor accepts an object with {@link module:josm/ui/menu~JSActionOptions named parameters}.
 *
 * @example
 * import {JSAction} from 'josm/ui/menu'
 * import * as util from 'josm/util'
 * import josm from 'josm'
 * const JMenuItem = Java.type('javax.swing.JMenuItem')
 *
 * // create the menu action
 * const helloWorldAction = new JSAction({
 *   name: "My Action",
 *   iconName: 'myicon',
 *   toolbarId: 'myToolbarId',
 *   tooltip: "This is my action",
 *
 *   onInitEnabled: function() {
 *     util.println('onInitEnabled: entering ...')
 *   },
 *
 *   onUpdateEnabled: function() {
 *     util.println('onUpdateEnabled: entering ...')
 *   },
 *
 *   onExecute: function() {
 *     util.println('Hello World!')
 *   }
 * })
 *
 * // register a new menu item in the file menu
 * const fileMenu = josm.menu.get('file')
 * fileMenu.addSeparator()
 * fileMenu.add(new JMenuItem(helloWorldAction))
 *
 *
 * @property {org.openstreetmap.josm.plugins.scripting.graalvm.JSAction} JSAction
 */
export const JSAction = Plugin.type('org.openstreetmap.josm.plugins.scripting.graalvm.JSAction')