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.
104 lines
3.2 KiB
104 lines
3.2 KiB
define([ |
|
"dojo/_base/declare", // declare |
|
"dojo/_base/kernel", |
|
"dojo/_base/lang", // hitch |
|
"dojo/query", // query |
|
"../registry", // registry.byNode |
|
"../popup", // dijit.popup2.hide |
|
"./Button", |
|
"../_Container", |
|
"../_HasDropDown", |
|
"dojo/text!./templates/DropDownButton.html", |
|
"../a11yclick" // template uses ondijitclick |
|
], function(declare, kernel, lang, query, registry, popup, Button, _Container, _HasDropDown, template){ |
|
|
|
// module: |
|
// dijit/form/DropDownButton |
|
|
|
return declare("dijit.form.DropDownButton", [Button, _Container, _HasDropDown], { |
|
// summary: |
|
// A button with a drop down |
|
// |
|
// example: |
|
// | <button data-dojo-type="dijit/form/DropDownButton"> |
|
// | Hello world |
|
// | <div data-dojo-type="dijit/Menu">...</div> |
|
// | </button> |
|
// |
|
// example: |
|
// | var button1 = new DropDownButton({ label: "hi", dropDown: new dijit.Menu(...) }); |
|
// | win.body().appendChild(button1); |
|
// |
|
|
|
baseClass: "dijitDropDownButton", |
|
|
|
templateString: template, |
|
|
|
_fillContent: function(){ |
|
// Overrides _TemplatedMixin#_fillContent(). |
|
// My inner HTML possibly contains both the button label and/or a drop down widget, like |
|
// <DropDownButton> <span>push me</span> <Menu> ... </Menu> </DropDownButton> |
|
|
|
var source = this.srcNodeRef; |
|
var dest = this.containerNode; |
|
if(source && dest){ |
|
while(source.hasChildNodes()){ |
|
var child = source.firstChild; |
|
if(child.hasAttribute && (child.hasAttribute("data-dojo-type") || child.hasAttribute("dojoType") || |
|
child.hasAttribute("data-" + kernel._scopeName + "-type") || |
|
child.hasAttribute(kernel._scopeName + "Type"))){ |
|
// The parser hasn't gotten to this node yet, so save it in a wrapper <div> |
|
// and then grab the instantiated widget in startup(). |
|
this.dropDownContainer = this.ownerDocument.createElement("div"); |
|
this.dropDownContainer.appendChild(child); |
|
}else{ |
|
dest.appendChild(child); |
|
} |
|
} |
|
} |
|
}, |
|
|
|
startup: function(){ |
|
if(this._started){ |
|
return; |
|
} |
|
|
|
// the child widget from srcNodeRef is the dropdown widget. Insert it in the page DOM, |
|
// make it invisible, and store a reference to pass to the popup code. |
|
if(!this.dropDown && this.dropDownContainer){ |
|
this.dropDown = registry.byNode(this.dropDownContainer.firstChild); |
|
delete this.dropDownContainer; |
|
} |
|
if(this.dropDown){ |
|
popup.hide(this.dropDown); |
|
} |
|
|
|
this.inherited(arguments); |
|
}, |
|
|
|
isLoaded: function(){ |
|
// Returns whether or not we are loaded - if our dropdown has an href, |
|
// then we want to check that. |
|
var dropDown = this.dropDown; |
|
return (!!dropDown && (!dropDown.href || dropDown.isLoaded)); |
|
}, |
|
|
|
loadDropDown: function(/*Function*/ callback){ |
|
// Default implementation assumes that drop down already exists, |
|
// but hasn't loaded it's data (ex: ContentPane w/href). |
|
// App must override if the drop down is lazy-created. |
|
var dropDown = this.dropDown; |
|
var handler = dropDown.on("load", lang.hitch(this, function(){ |
|
handler.remove(); |
|
callback(); |
|
})); |
|
dropDown.refresh(); // tell it to load |
|
}, |
|
|
|
isFocusable: function(){ |
|
// Overridden so that focus is handled by the _HasDropDown mixin, not by |
|
// the _FormWidget mixin. |
|
return this.inherited(arguments) && !this._mouseDown; |
|
} |
|
}); |
|
});
|
|
|