webui-aria2/js/libs/dojox/mobile/app/ListSelector.js.uncompressed.js
2012-05-01 19:52:07 +08:00

224 lines
5.1 KiB
JavaScript

//>>built
// wrapped by build app
define("dojox/mobile/app/ListSelector", ["dijit","dojo","dojox","dojo/require!dojox/mobile/app/_Widget,dojo/fx"], function(dijit,dojo,dojox){
dojo.provide("dojox.mobile.app.ListSelector");
dojo.experimental("dojox.mobile.app.ListSelector");
dojo.require("dojox.mobile.app._Widget");
dojo.require("dojo.fx");
dojo.declare("dojox.mobile.app.ListSelector", dojox.mobile.app._Widget, {
// data: Array
// The array of items to display. Each element in the array
// should have both a label and value attribute, e.g.
// [{label: "Open", value: 1} , {label: "Delete", value: 2}]
data: null,
// controller: Object
// The current SceneController widget.
controller: null,
// onChoose: Function
// The callback function for when an item is selected
onChoose: null,
destroyOnHide: false,
_setDataAttr: function(data){
this.data = data;
if(this.data){
this.render();
}
},
postCreate: function(){
dojo.addClass(this.domNode, "listSelector");
var _this = this;
this.connect(this.domNode, "onclick", function(event){
if(!dojo.hasClass(event.target, "listSelectorRow")){
return;
}
if(_this.onChoose){
_this.onChoose(_this.data[event.target._idx].value);
}
_this.hide();
});
this.connect(this.domNode, "onmousedown", function(event){
if(!dojo.hasClass(event.target, "listSelectorRow")){
return;
}
dojo.addClass(event.target, "listSelectorRow-selected");
});
this.connect(this.domNode, "onmouseup", function(event){
if(!dojo.hasClass(event.target, "listSelectorRow")){
return;
}
dojo.removeClass(event.target, "listSelectorRow-selected");
});
this.connect(this.domNode, "onmouseout", function(event){
if(!dojo.hasClass(event.target, "listSelectorRow")){
return;
}
dojo.removeClass(event.target, "listSelectorRow-selected");
});
var viewportSize = this.controller.getWindowSize();
this.mask = dojo.create("div", {"class": "dialogUnderlayWrapper",
innerHTML: "<div class=\"dialogUnderlay\"></div>"
}, this.controller.assistant.domNode);
this.connect(this.mask, "onclick", function(){
_this.onChoose && _this.onChoose();
_this.hide();
});
},
show: function(fromNode){
// Using dojo.fx here. Must figure out how to do this with CSS animations!!
var startPos;
var windowSize = this.controller.getWindowSize();
var fromNodePos;
if(fromNode){
fromNodePos = dojo._abs(fromNode);
startPos = fromNodePos;
}else{
startPos.x = windowSize.w / 2;
startPos.y = 200;
}
console.log("startPos = ", startPos);
dojo.style(this.domNode, {
opacity: 0,
display: "",
width: Math.floor(windowSize.w * 0.8) + "px"
});
var maxWidth = 0;
dojo.query(">", this.domNode).forEach(function(node){
dojo.style(node, {
"float": "left"
});
maxWidth = Math.max(maxWidth, dojo.marginBox(node).w);
dojo.style(node, {
"float": "none"
});
});
maxWidth = Math.min(maxWidth, Math.round(windowSize.w * 0.8))
+ dojo.style(this.domNode, "paddingLeft")
+ dojo.style(this.domNode, "paddingRight")
+ 1;
dojo.style(this.domNode, "width", maxWidth + "px");
var targetHeight = dojo.marginBox(this.domNode).h;
var _this = this;
var targetY = fromNodePos ?
Math.max(30, fromNodePos.y - targetHeight - 10) :
this.getScroll().y + 30;
console.log("fromNodePos = ", fromNodePos, " targetHeight = ", targetHeight,
" targetY = " + targetY, " startPos ", startPos);
var anim1 = dojo.animateProperty({
node: this.domNode,
duration: 400,
properties: {
width: {start: 1, end: maxWidth},
height: {start: 1, end: targetHeight},
top: {start: startPos.y, end: targetY},
left: {start: startPos.x, end: (windowSize.w/2 - maxWidth/2)},
opacity: {start: 0, end: 1},
fontSize: {start: 1}
},
onEnd: function(){
dojo.style(_this.domNode, "width", "inherit");
}
});
var anim2 = dojo.fadeIn({
node: this.mask,
duration: 400
});
dojo.fx.combine([anim1, anim2]).play();
},
hide: function(){
// Using dojo.fx here. Must figure out how to do this with CSS animations!!
var _this = this;
var anim1 = dojo.animateProperty({
node: this.domNode,
duration: 500,
properties: {
width: {end: 1},
height: {end: 1},
opacity: {end: 0},
fontSize: {end: 1}
},
onEnd: function(){
if(_this.get("destroyOnHide")){
_this.destroy();
}
}
});
var anim2 = dojo.fadeOut({
node: this.mask,
duration: 400
});
dojo.fx.combine([anim1, anim2]).play();
},
render: function(){
// summary:
// Renders
dojo.empty(this.domNode);
dojo.style(this.domNode, "opacity", 0);
var row;
for(var i = 0; i < this.data.length; i++){
// Create each row and add any custom classes. Also set the _idx property.
row = dojo.create("div", {
"class": "listSelectorRow " + (this.data[i].className || ""),
innerHTML: this.data[i].label
}, this.domNode);
row._idx = i;
if(i == 0){
dojo.addClass(row, "first");
}
if(i == this.data.length - 1){
dojo.addClass(row, "last");
}
}
},
destroy: function(){
this.inherited(arguments);
dojo.destroy(this.mask);
}
});
});