blob: 7d03423885a78a39c659126a6708155af51b8beb [file] [log] [blame]
/*
Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
if(!dojo._hasResource["dijit._HasDropDown"]){
dojo._hasResource["dijit._HasDropDown"]=true;
dojo.provide("dijit._HasDropDown");
dojo.require("dijit._base.place");
dojo.require("dijit._Widget");
dojo.declare("dijit._HasDropDown",null,{_buttonNode:null,_arrowWrapperNode:null,_popupStateNode:null,_aroundNode:null,dropDown:null,autoWidth:true,forceWidth:false,maxHeight:0,dropDownPosition:["below","above"],_stopClickEvents:true,_onDropDownMouse:function(e){
if(e.type=="click"&&!this._seenKeydown){
return;
}
this._seenKeydown=false;
if(e.type=="mousedown"){
this._docHandler=this.connect(dojo.doc,"onmouseup","_onDropDownMouseup");
}
if(this.disabled||this.readOnly){
return;
}
if(this._stopClickEvents){
dojo.stopEvent(e);
}
this.toggleDropDown();
if(e.type=="click"||e.type=="keypress"){
this._onDropDownMouseup();
}
},_onDropDownMouseup:function(e){
if(e&&this._docHandler){
this.disconnect(this._docHandler);
}
var _1=this.dropDown,_2=false;
if(e&&this._opened){
var c=dojo.position(this._buttonNode,true);
if(!(e.pageX>=c.x&&e.pageX<=c.x+c.w)||!(e.pageY>=c.y&&e.pageY<=c.y+c.h)){
var t=e.target;
while(t&&!_2){
if(dojo.hasClass(t,"dijitPopup")){
_2=true;
}else{
t=t.parentNode;
}
}
if(_2){
t=e.target;
if(_1.onItemClick){
var _3;
while(t&&!(_3=dijit.byNode(t))){
t=t.parentNode;
}
if(_3&&_3.onClick&&_3.getParent){
_3.getParent().onItemClick(_3,e);
}
}
return;
}
}
}
if(this._opened&&_1.focus){
window.setTimeout(dojo.hitch(_1,"focus"),1);
}
},_setupDropdown:function(){
this._buttonNode=this._buttonNode||this.focusNode||this.domNode;
this._popupStateNode=this._popupStateNode||this.focusNode||this._buttonNode;
this._aroundNode=this._aroundNode||this.domNode;
this.connect(this._buttonNode,"onmousedown","_onDropDownMouse");
this.connect(this._buttonNode,"onclick","_onDropDownMouse");
this.connect(this._buttonNode,"onkeydown","_onDropDownKeydown");
this.connect(this._buttonNode,"onblur","_onDropDownBlur");
this.connect(this._buttonNode,"onkeypress","_onKey");
if(this._setStateClass){
this.connect(this,"openDropDown","_setStateClass");
this.connect(this,"closeDropDown","_setStateClass");
}
var _4={"after":this.isLeftToRight()?"Right":"Left","before":this.isLeftToRight()?"Left":"Right","above":"Up","below":"Down","left":"Left","right":"Right"}[this.dropDownPosition[0]]||this.dropDownPosition[0]||"Down";
dojo.addClass(this._arrowWrapperNode||this._buttonNode,"dijit"+_4+"ArrowButton");
},postCreate:function(){
this._setupDropdown();
this.inherited(arguments);
},destroyDescendants:function(){
if(this.dropDown){
if(!this.dropDown._destroyed){
this.dropDown.destroyRecursive();
}
delete this.dropDown;
}
this.inherited(arguments);
},_onDropDownKeydown:function(e){
this._seenKeydown=true;
},_onKeyPress:function(e){
if(this._opened&&e.charOrCode==dojo.keys.ESCAPE&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){
this.toggleDropDown();
dojo.stopEvent(e);
return;
}
this.inherited(arguments);
},_onDropDownBlur:function(e){
this._seenKeydown=false;
},_onKey:function(e){
if(this.disabled||this.readOnly){
return;
}
var d=this.dropDown;
if(d&&this._opened&&d.handleKey){
if(d.handleKey(e)===false){
return;
}
}
if(d&&this._opened&&e.keyCode==dojo.keys.ESCAPE){
this.toggleDropDown();
return;
}
if(e.keyCode==dojo.keys.DOWN_ARROW||e.keyCode==dojo.keys.ENTER||e.charOrCode==" "){
this._onDropDownMouse(e);
}
},_onBlur:function(){
this.closeDropDown();
this.inherited(arguments);
},isLoaded:function(){
return true;
},loadDropDown:function(_5){
_5();
},toggleDropDown:function(){
if(this.disabled||this.readOnly){
return;
}
this.focus();
var _6=this.dropDown;
if(!_6){
return;
}
if(!this._opened){
if(!this.isLoaded()){
this.loadDropDown(dojo.hitch(this,"openDropDown"));
return;
}else{
this.openDropDown();
}
}else{
this.closeDropDown();
}
},openDropDown:function(){
var _7=this.dropDown;
var _8=_7.domNode;
var _9=this;
if(!this._preparedNode){
dijit.popup.moveOffScreen(_8);
this._preparedNode=true;
if(_8.style.width){
this._explicitDDWidth=true;
}
if(_8.style.height){
this._explicitDDHeight=true;
}
}
if(this.maxHeight||this.forceWidth||this.autoWidth){
var _a={display:"",visibility:"hidden"};
if(!this._explicitDDWidth){
_a.width="";
}
if(!this._explicitDDHeight){
_a.height="";
}
dojo.style(_8,_a);
var mb=dojo.marginBox(_8);
var _b=(this.maxHeight&&mb.h>this.maxHeight);
dojo.style(_8,{overflow:_b?"auto":"hidden"});
if(this.forceWidth){
mb.w=this.domNode.offsetWidth;
}else{
if(this.autoWidth){
mb.w=Math.max(mb.w,this.domNode.offsetWidth);
}else{
delete mb.w;
}
}
if(_b){
mb.h=this.maxHeight;
if("w" in mb){
mb.w+=16;
}
}else{
delete mb.h;
}
delete mb.t;
delete mb.l;
if(dojo.isFunction(_7.resize)){
_7.resize(mb);
}else{
dojo.marginBox(_8,mb);
}
}
var _c=dijit.popup.open({parent:this,popup:_7,around:this._aroundNode,orient:dijit.getPopupAroundAlignment((this.dropDownPosition&&this.dropDownPosition.length)?this.dropDownPosition:["below"],this.isLeftToRight()),onExecute:function(){
_9.closeDropDown(true);
},onCancel:function(){
_9.closeDropDown(true);
},onClose:function(){
dojo.attr(_9._popupStateNode,"popupActive",false);
dojo.removeClass(_9._popupStateNode,"dijitHasDropDownOpen");
_9._opened=false;
_9.state="";
}});
dojo.attr(this._popupStateNode,"popupActive","true");
dojo.addClass(_9._popupStateNode,"dijitHasDropDownOpen");
this._opened=true;
this.state="Opened";
return _c;
},closeDropDown:function(_d){
if(this._opened){
dijit.popup.close(this.dropDown);
if(_d){
this.focus();
}
this._opened=false;
this.state="";
}
}});
}