1 /* See license.txt for terms of usage */ 2 3 define([ 4 "firebug/lib/trace", 5 "firebug/lib/locale", 6 "firebug/lib/options", 7 "firebug/lib/css", 8 "firebug/lib/deprecated" 9 ], 10 function(FBTrace, Locale, Options, Css, Deprecated) { 11 12 // ********************************************************************************************* // 13 // Constants 14 15 var Menu = {}; 16 17 // ********************************************************************************************* // 18 19 Menu.createMenu = function(popup, item) 20 { 21 if (typeof item == "string") 22 { 23 return Deprecated.deprecated("The function's header changed to "+ 24 "createMenu(popup, item)", 25 Menu.createMenu, [popup, {label: item}])(); 26 } 27 28 var menu = popup.ownerDocument.createElement("menu"); 29 30 Menu.setItemIntoElement(menu, item); 31 32 var menuPopup = popup.ownerDocument.createElement("menupopup"); 33 34 popup.appendChild(menu); 35 menu.appendChild(menuPopup); 36 37 if (item.items) 38 { 39 for (var i = 0, len = item.items.length; i < len; ++i) 40 Menu.createMenuItem(menuPopup, item.items[i]); 41 } 42 43 return menuPopup; 44 }; 45 46 // Menu.createMenuItems(popup, items[, before]) 47 Menu.createMenuItems = function(popup, items, before) 48 { 49 for (var i=0; i<items.length; i++) 50 Menu.createMenuItem(popup, items[i], before); 51 }; 52 53 Menu.createMenuItem = function(popup, item, before) 54 { 55 if ((typeof(item) == "string" && item == "-") || item.label == "-") 56 return Menu.createMenuSeparator(popup, item, before); 57 58 if (item.items) 59 return Menu.createMenu(popup, item); 60 61 var menuitem = popup.ownerDocument.createElement("menuitem"); 62 63 Menu.setItemIntoElement(menuitem, item); 64 65 if (before) 66 popup.insertBefore(menuitem, before); 67 else 68 popup.appendChild(menuitem); 69 70 return menuitem; 71 }; 72 73 Menu.setItemIntoElement = function(element, item) 74 { 75 var label = item.nol10n ? item.label : Locale.$STR(item.label); 76 77 element.setAttribute("label", label); 78 79 if (item.id) 80 element.setAttribute("id", item.id); 81 82 if (item.type) 83 element.setAttribute("type", item.type); 84 85 // Avoid closing the popup menu if a preference has been changed. 86 // This allows to quickly change more options. 87 if (item.type == "checkbox" && !item.closemenu) 88 element.setAttribute("closemenu", "none"); 89 90 if (item.checked) 91 element.setAttribute("checked", "true"); 92 93 if (item.disabled) 94 element.setAttribute("disabled", "true"); 95 96 if (item.image) 97 { 98 element.setAttribute("class", "menuitem-iconic"); 99 element.setAttribute("image", item.image); 100 } 101 102 if (item.command) 103 element.addEventListener("command", item.command, false); 104 105 if (item.commandID) 106 element.setAttribute("command", item.commandID); 107 108 if (item.option) 109 element.setAttribute("option", item.option); 110 111 if (item.tooltiptext) 112 { 113 var tooltiptext = item.nol10n ? item.tooltiptext : Locale.$STR(item.tooltiptext); 114 element.setAttribute("tooltiptext", tooltiptext); 115 } 116 117 if (item.className) 118 Css.setClass(element, item.className); 119 120 if (item.acceltext) 121 element.setAttribute("acceltext", item.acceltext); 122 else if (item.key) 123 element.setAttribute("key", item.key); 124 125 if (item.name) 126 element.setAttribute("name", item.name); 127 128 if (item.items && (item.command || item.commandID)) 129 element.setAttribute("type", "splitmenu"); 130 131 return element; 132 } 133 134 Menu.createMenuHeader = function(popup, item) 135 { 136 var header = popup.ownerDocument.createElement("label"); 137 header.setAttribute("class", "menuHeader"); 138 139 var label = item.nol10n ? item.label : Locale.$STR(item.label); 140 141 header.setAttribute("value", label); 142 143 popup.appendChild(header); 144 return header; 145 }; 146 147 Menu.createMenuSeparator = function(popup, item, before) 148 { 149 if (item instanceof Node) 150 { 151 return Deprecated.deprecated("The function's header changed to "+ 152 "createMenuSeparator(popup, item, before)", 153 Menu.createMenuSeparator, [popup, null, before])(); 154 } 155 156 if (!popup.firstChild) 157 return; 158 159 if (FBTrace.DBG_MENU) 160 FBTrace.sysout("createMenuSeparator", {popup: popup, item: item, before: before}); 161 162 var menuItem = popup.ownerDocument.createElement("menuseparator"); 163 if (typeof item == "object" && item.id) 164 menuItem.setAttribute("id", item.id); 165 166 if (before) 167 popup.insertBefore(menuItem, before); 168 else 169 popup.appendChild(menuItem); 170 return menuItem; 171 }; 172 173 /** 174 * Create an option menu item definition. This method is usually used in methods like: 175 * {@link Firebug.Panel.getOptionsMenuItems} or {@link Firebug.Panel.getContextMenuItems}. 176 * 177 * @param {String} label Name of the string from *.properties file. 178 * @param {String} option Name of the associated option. 179 * @param {String, Optional} tooltiptext Optional name of the string from *.properties file 180 * that should be used as a tooltip for the menu. 181 */ 182 Menu.optionMenu = function(label, option, tooltiptext) 183 { 184 return { 185 label: label, 186 type: "checkbox", 187 checked: Firebug[option], 188 option: option, 189 tooltiptext: tooltiptext, 190 command: function() { 191 return Options.togglePref(option); 192 } 193 }; 194 }; 195 196 // ********************************************************************************************* // 197 // Registration 198 199 return Menu; 200 201 // ********************************************************************************************* // 202 }); 203