dojo.provide("dojox.widget.PlaceholderMenuItem"); dojo.require("dijit.Menu"); dojo.declare("dojox.widget.PlaceholderMenuItem", dijit.MenuItem, { // summary: // A menu item that can be used as a placeholder. Set the label // of this item to a unique key and you can then use it to add new // items at that location. This item is not displayed. _replaced: false, _replacedWith: null, _isPlaceholder: true, postCreate: function(){ this.domNode.style.display = "none"; this._replacedWith = []; if(!this.label){ this.label = this.containerNode.innerHTML; } this.inherited(arguments); }, replace: function(/*dijit.MenuItem[]*/ menuItems){ // summary: // replaces this menu item with the given menuItems. The original // menu item is not actually removed from the menu - so if you want // it removed, you must do that explicitly. // returns: // true if the replace happened, false if not if(this._replaced){ return false; } var index = this.getIndexInParent(); if(index < 0){ return false; } var p = this.getParent(); dojo.forEach(menuItems, function(item){ p.addChild(item, index++); }); this._replacedWith = menuItems; this._replaced = true; return true; }, unReplace: function(/*Boolean?*/ destroy){ // summary: // Removes menu items added by calling replace(). It returns the // array of items that were actually removed (in case you want to // clean them up later) // destroy: // Also call destroy on any removed items. // returns: // The array of items that were actually removed if(!this._replaced){ return []; } var p = this.getParent(); if(!p){ return []; } var r = this._replacedWith; dojo.forEach(this._replacedWith, function(item){ p.removeChild(item); if(destroy){ item.destroy(); } }); this._replacedWith = []; this._replaced = false; return r; // dijit.MenuItem[] } }); // Se need to extend dijit.Menu so that we have a getPlaceholders function. dojo.extend(dijit.Menu, { getPlaceholders: function(/*String?*/ label){ // summary: // returns an array of placeholders with the given label. There // can be multiples. // label: // Label to search for - if not specified, then all placeholders // are returned // returns: // An array of placeholders that match the given label var r = []; var children = this.getChildren(); children.forEach(function(child){ if(child._isPlaceholder && (!label || child.label == label)){ r.push(child); }else if(child._started && child.popup && child.popup.getPlaceholders){ r = r.concat(child.popup.getPlaceholders(label)); }else if(!child._started && child.dropDownContainer){ var node = dojo.query("[widgetId]", child.dropDownContainer)[0]; var menu = dijit.byNode(node); if(menu.getPlaceholders){ r = r.concat(menu.getPlaceholders(label)); } } }, this); return r; // dojox.widget.PlaceholderMenuItem[] } });