105 lines
2.9 KiB
JavaScript
105 lines
2.9 KiB
JavaScript
|
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[]
|
||
|
}
|
||
|
});
|