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.5 KiB
104 lines
3.5 KiB
define([ |
|
"dojo/_base/declare", |
|
"dojo/_base/Deferred", |
|
"dojo/_base/lang", |
|
"dojo/_base/window", |
|
"dojo/dom-class", |
|
"dojo/dom-construct", |
|
"dojo/dom-style", |
|
"dojo/dom-geometry", |
|
"./Tooltip", |
|
"./Overlay", |
|
"./lazyLoadUtils" |
|
], function(declare, Deferred, lang, win, domClass, domConstruct, domStyle, domGeometry, Tooltip, Overlay, lazyLoadUtils){ |
|
|
|
var isOverlay = domClass.contains(win.doc.documentElement, "dj_phone"); |
|
|
|
var cls = declare("dojox.mobile.Opener", isOverlay ? Overlay : Tooltip, { |
|
// summary: |
|
// A non-templated popup widget that will use either Tooltip or |
|
// Overlay depending on screen size. |
|
|
|
// lazy: String |
|
// If true, the content of the widget, which includes dojo markup, |
|
// is instantiated lazily. That is, only when the widget is opened |
|
// by the user, the required modules are loaded and the content |
|
// widgets are instantiated. |
|
lazy: false, |
|
|
|
// requires: String |
|
// Comma-separated required module names to be lazily loaded. This |
|
// is effective only when lazy=true. All the modules specified with |
|
// dojoType and their depending modules are automatically loaded |
|
// when the widget is opened. However, if you need other extra |
|
// modules to be loaded, use this parameter. |
|
requires: "", |
|
|
|
buildRendering: function(){ |
|
this.inherited(arguments); |
|
this.cover = domConstruct.create('div', { |
|
onclick: lang.hitch(this, '_onBlur'), 'class': 'mblOpenerUnderlay', |
|
style: { position: isOverlay ? 'absolute' : 'fixed', backgroundColor:'transparent', overflow:'hidden', zIndex:'-1' } |
|
}, this.domNode, 'first'); |
|
}, |
|
|
|
onShow: function(/*DomNode*/node){}, |
|
onHide: function(/*DomNode*/node, /*Anything*/v){}, |
|
|
|
show: function(node, positions){ |
|
if(this.lazy){ |
|
this.lazy = false; |
|
var _this = this; |
|
return Deferred.when(lazyLoadUtils.instantiateLazyWidgets(this.domNode, this.requires), function(){ |
|
return _this.show(node, positions); |
|
}); |
|
} |
|
this.node = node; |
|
this.onShow(node); |
|
domStyle.set(this.cover, { top:'0px', left:'0px', width:'0px', height:'0px' }); // move cover temporarily to calculate domNode vertical position correctly |
|
this._resizeCover(domGeometry.position(this.domNode, false)); // must be before this.inherited(arguments) for Tooltip sizing |
|
return this.inherited(arguments); |
|
}, |
|
|
|
hide: function(/*Anything*/ val){ |
|
this.inherited(arguments); |
|
this.onHide(this.node, val); |
|
}, |
|
|
|
_reposition: function(){ |
|
// tags: |
|
// private |
|
var popupPos = this.inherited(arguments); |
|
this._resizeCover(popupPos); |
|
return popupPos; |
|
}, |
|
|
|
_resizeCover: function(popupPos){ |
|
// tags: |
|
// private |
|
if(isOverlay){ |
|
if(parseInt(domStyle.get(this.cover, 'top')) != -popupPos.y || parseInt(domStyle.get(this.cover, 'height')) != popupPos.y){ |
|
var x = Math.max(popupPos.x, 0); // correct onorientationchange values |
|
domStyle.set(this.cover, { top:-popupPos.y+'px', left:-x+'px', width:popupPos.w+x+'px', height:popupPos.y+'px' }); |
|
} |
|
}else{ |
|
domStyle.set(this.cover, { |
|
width:Math.max(win.doc.documentElement.scrollWidth || win.body().scrollWidth || win.doc.documentElement.clientWidth)+'px', |
|
height:Math.max(win.doc.documentElement.scrollHeight || win.body().scrollHeight || win.doc.documentElement.clientHeight)+'px' |
|
}); |
|
} |
|
}, |
|
|
|
_onBlur: function(e){ |
|
// tags: |
|
// private |
|
var ret = this.onBlur(e); |
|
if(ret !== false){ // only exactly false prevents hide() |
|
this.hide(e); |
|
} |
|
return ret; |
|
} |
|
}); |
|
cls.prototype.baseClass += " mblOpener"; // add to either mblOverlay or mblTooltip |
|
return cls; |
|
});
|
|
|