189 lines
5.4 KiB
JavaScript
189 lines
5.4 KiB
JavaScript
define("dojox/mobile/SimpleDialog", [
|
|
"dojo/_base/declare",
|
|
"dojo/_base/window",
|
|
"dojo/dom-class",
|
|
"dojo/dom-construct",
|
|
"./Pane",
|
|
"./iconUtils"
|
|
], function(declare, win, domClass, domConstruct, Pane, iconUtils){
|
|
// module:
|
|
// dojox/mobile/SimpleDialog
|
|
|
|
return declare("dojox.mobile.SimpleDialog", Pane, {
|
|
// summary:
|
|
// A dialog box for mobile.
|
|
// description:
|
|
// SimpleDialog is a dialog box for mobile.
|
|
// When a SimpleDialog is created, it is initially hidden and not
|
|
// displayed (display="none"). To show the dialog box, you need to
|
|
// get a reference to the widget and to call its show() method.
|
|
//
|
|
// The contents can be arbitrary HTML, text, or widgets. Note,
|
|
// however, that the widget is initially hidden. You need to be
|
|
// careful when you place something that cannot be initialized
|
|
// under the hidden state into a SimpleDialog.
|
|
//
|
|
// This widget has much less functionalities than dijit/Dialog,
|
|
// but it has the advantage of a much smaller code size.
|
|
|
|
// top: String
|
|
// The top edge position of the widget. If "auto", the widget is
|
|
// placed at the middle of the screen. Otherwise, the value
|
|
// (ex. "20px") is used as the top style of widget's domNode.
|
|
top: "auto",
|
|
|
|
// left: String
|
|
// The left edge position of the widget. If "auto", the widget is
|
|
// placed at the center of the screen. Otherwise, the value
|
|
// (ex. "20px") is used as the left style of widget's domNode.
|
|
left: "auto",
|
|
|
|
// modal: Boolean
|
|
// If true, a translucent cover is added over the entire page to
|
|
// prevent the user from interacting with elements on the page.
|
|
modal: true,
|
|
|
|
// closeButton: Boolean
|
|
// If true, a button to close the dialog box is displayed at the
|
|
// top-right corner.
|
|
closeButton: false,
|
|
|
|
// closeButtonClass: String
|
|
// A class name of a DOM button to be used as a close button.
|
|
closeButtonClass: "mblDomButtonSilverCircleRedCross",
|
|
|
|
// tabIndex: String
|
|
// Tabindex setting for the item so users can hit the tab key to
|
|
// focus on it.
|
|
tabIndex: "0",
|
|
|
|
// _setTabIndexAttr: [private] String
|
|
// Sets tabIndex to domNode.
|
|
_setTabIndexAttr: "",
|
|
|
|
/* internal properties */
|
|
|
|
// baseClass: String
|
|
// The name of the CSS class of this widget.
|
|
baseClass: "mblSimpleDialog",
|
|
|
|
// _cover: [private] Array
|
|
// Array for sharing the cover instances.
|
|
_cover: [],
|
|
|
|
buildRendering: function(){
|
|
this.containerNode = domConstruct.create("div", {className:"mblSimpleDialogContainer"});
|
|
if(this.srcNodeRef){
|
|
// reparent
|
|
for(var i = 0, len = this.srcNodeRef.childNodes.length; i < len; i++){
|
|
this.containerNode.appendChild(this.srcNodeRef.removeChild(this.srcNodeRef.firstChild));
|
|
}
|
|
}
|
|
this.inherited(arguments);
|
|
domClass.add(this.domNode, "mblSimpleDialogDecoration");
|
|
this.domNode.style.display = "none";
|
|
this.domNode.appendChild(this.containerNode);
|
|
if(this.closeButton){
|
|
this.closeButtonNode = domConstruct.create("div", {
|
|
className: "mblSimpleDialogCloseBtn "+this.closeButtonClass
|
|
}, this.domNode);
|
|
iconUtils.createDomButton(this.closeButtonNode);
|
|
this._clickHandle = this.connect(this.closeButtonNode, "onclick", "_onCloseButtonClick");
|
|
}
|
|
this._keydownHandle = this.connect(this.domNode, "onkeydown", "_onKeyDown"); // for desktop browsers
|
|
},
|
|
|
|
startup: function(){
|
|
if(this._started){ return; }
|
|
this.inherited(arguments);
|
|
win.body().appendChild(this.domNode);
|
|
},
|
|
|
|
addCover: function(){
|
|
// summary:
|
|
// Adds the transparent DIV cover.
|
|
if(!this._cover[0]){
|
|
this._cover[0] = domConstruct.create("div", {
|
|
className: "mblSimpleDialogCover"
|
|
}, win.body());
|
|
}else{
|
|
this._cover[0].style.display = "";
|
|
}
|
|
},
|
|
|
|
removeCover: function(){
|
|
// summary:
|
|
// Removes the transparent DIV cover.
|
|
this._cover[0].style.display = "none";
|
|
},
|
|
|
|
_onCloseButtonClick: function(e){
|
|
// tags:
|
|
// private
|
|
if(this.onCloseButtonClick(e) === false){ return; } // user's click action
|
|
this.hide();
|
|
},
|
|
|
|
onCloseButtonClick: function(/*Event*/ /*===== e =====*/){
|
|
// summary:
|
|
// User-defined function to handle clicks.
|
|
// tags:
|
|
// callback
|
|
},
|
|
|
|
_onKeyDown: function(e){
|
|
// tags:
|
|
// private
|
|
if(e.keyCode == 27){ // ESC
|
|
this.hide();
|
|
}
|
|
},
|
|
|
|
refresh: function(){ // TODO: should we call refresh on resize?
|
|
// summary:
|
|
// Refreshes the layout of the dialog.
|
|
var n = this.domNode;
|
|
if(this.closeButton){
|
|
var b = this.closeButtonNode;
|
|
var s = Math.round(b.offsetHeight / 2);
|
|
b.style.top = -s + "px";
|
|
b.style.left = n.offsetWidth - s + "px";
|
|
}
|
|
if(this.top === "auto"){
|
|
var h = win.global.innerHeight || win.doc.documentElement.clientHeight;
|
|
n.style.top = Math.round((h - n.offsetHeight) / 2) + "px";
|
|
}else{
|
|
n.style.top = this.top;
|
|
}
|
|
if(this.left === "auto"){
|
|
var h = win.global.innerWidth || win.doc.documentElement.clientWidth;
|
|
n.style.left = Math.round((h - n.offsetWidth) / 2) + "px";
|
|
}else{
|
|
n.style.left = this.left;
|
|
}
|
|
},
|
|
|
|
show: function(){
|
|
// summary:
|
|
// Shows the dialog.
|
|
if(this.domNode.style.display === ""){ return; }
|
|
if(this.modal){
|
|
this.addCover();
|
|
}
|
|
this.domNode.style.display = "";
|
|
this.refresh();
|
|
this.domNode.focus();
|
|
},
|
|
|
|
hide: function(){
|
|
// summary:
|
|
// Hides the dialog.
|
|
if(this.domNode.style.display === "none"){ return; }
|
|
this.domNode.style.display = "none";
|
|
if(this.modal){
|
|
this.removeCover();
|
|
}
|
|
}
|
|
});
|
|
});
|