/** * @class Ext.air.SystemMenu * * Provides platform independent handling of adding item to the application menu, creating the menu or * items as needed.
* * This class also provides the ability to bind standard Ext.Action instances with NativeMenuItems * * @singleton */ Ext.air.SystemMenu = function(){ var menu; // windows if(air.NativeWindow.supportsMenu && nativeWindow.systemChrome != air.NativeWindowSystemChrome.NONE) { menu = new air.NativeMenu(); nativeWindow.menu = menu; } // mac if(air.NativeApplication.supportsMenu) { menu = air.NativeApplication.nativeApplication.menu; } function find(menu, text){ for(var i = 0, len = menu.items.length; i < len; i++){ if(menu.items[i]['label'] == text){ return menu.items[i]; } } return null; } return { /** * Add items to one of the application menus * @param {String} text The application menu to add the actions to (e.g. 'File' or 'Edit'). * @param {Array} actions An array of Ext.Action objects or menu item configs * @param {Number} mindex The index of the character in "text" which should be used for * keyboard access * @return air.NativeMenu The raw submenu */ add: function(text, actions, mindex){ var item = find(menu, text); if(!item){ item = menu.addItem(new air.NativeMenuItem(text)); item.mnemonicIndex = mindex || 0; item.submenu = new air.NativeMenu(); } for (var i = 0, len = actions.length; i < len; i++) { item.submenu.addItem(actions[i] == '-' ? new air.NativeMenuItem("", true) : Ext.air.MenuItem(actions[i])); } return item.submenu; }, /** * Returns the application menu */ get : function(){ return menu; } }; }(); // ability to bind native menu items to an Ext.Action Ext.air.MenuItem = function(action){ if(!action.isAction){ action = new Ext.Action(action); } var cfg = action.initialConfig; var nativeItem = new air.NativeMenuItem(cfg.itemText || cfg.text); nativeItem.enabled = !cfg.disabled; if(!Ext.isEmpty(cfg.checked)){ nativeItem.checked = cfg.checked; } var handler = cfg.handler; var scope = cfg.scope; nativeItem.addEventListener(air.Event.SELECT, function(){ handler.call(scope || window, cfg); }); action.addComponent({ setDisabled : function(v){ nativeItem.enabled = !v; }, setText : function(v){ nativeItem.label = v; }, setVisible : function(v){ // could not find way to hide in air so disable? nativeItem.enabled = !v; }, setHandler : function(newHandler, newScope){ handler = newHandler; scope = newScope; }, // empty function on : function(){} }); return nativeItem; }