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