You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.2 KiB
110 lines
3.2 KiB
define(["dojo/_base/array", "dojo/_base/declare", "dojo/_base/lang", "dojo/dom-style", "dojo/_base/kernel", "dojo/query", "dijit/registry", "dijit/Menu","dijit/MenuItem"], |
|
function(array, declare, lang, style, kernel, query, registry, Menu, MenuItem){ |
|
|
|
kernel.experimental("dojox.widget.PlaceholderMenuItem"); |
|
|
|
var PlaceholderMenuItem = declare("dojox.widget.PlaceholderMenuItem", 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(){ |
|
style.set(this.domNode, "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(); |
|
|
|
array.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; |
|
array.forEach(this._replacedWith, function(item){ |
|
p.removeChild(item); |
|
if(destroy){ |
|
item.destroyRecursive(); |
|
} |
|
}); |
|
this._replacedWith = []; |
|
this._replaced = false; |
|
|
|
return r; // dijit/MenuItem[] |
|
} |
|
}); |
|
|
|
// Se need to extend dijit.Menu so that we have a getPlaceholders function. |
|
lang.extend(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(); |
|
array.forEach(children, 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 = query("[widgetId]", child.dropDownContainer)[0]; |
|
var menu = registry.byNode(node); |
|
if(menu.getPlaceholders){ |
|
r = r.concat(menu.getPlaceholders(label)); |
|
} |
|
} |
|
}, this); |
|
return r; // dojox/widget/PlaceholderMenuItem[] |
|
} |
|
}); |
|
|
|
return PlaceholderMenuItem; |
|
|
|
});
|
|
|