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: // | // // 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 // push me ... 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
// 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; } }); });