// TODO: auto scroll? define("dojox/mobile/_EditableListMixin", [ "dojo/_base/array", "dojo/_base/connect", "dojo/_base/declare", "dojo/_base/event", "dojo/dom-class", "dojo/dom-geometry", "dojo/dom-style", "dojo/touch", "dijit/registry", "./ListItem" ], function(array, connect, declare, event, domClass, domGeometry, domStyle, touch, registry, ListItem){ // module: // dojox/mobile/EditableRoundRectList return declare("dojox.mobile._EditableListMixin", null, { // summary: // A rounded rectangle list. // description: // EditableRoundRectList is a rounded rectangle list, which can be used to // display a group of items. Each item must be a dojox/mobile/ListItem. rightIconForEdit: "mblDomButtonGrayKnob", deleteIconForEdit: "mblDomButtonRedCircleMinus", // isEditing: Boolean // A read-only flag that indicates whether the widget is in the editing mode. isEditing: false, destroy: function(){ // summary: // Destroys the widget. if(this._blankItem){ this._blankItem.destroy(); } this.inherited(arguments); }, _setupMoveItem: function(/*DomNode*/node){ // tags: // private domStyle.set(node, { width: domGeometry.getContentBox(node).w + "px", top: node.offsetTop + "px" }); domClass.add(node, "mblListItemFloat"); }, _resetMoveItem: function(/*DomNode*/node){ // tags: // private setTimeout(function(){ // iPhone needs setTimeout domClass.remove(node, "mblListItemFloat"); domStyle.set(node, { width: "", top: "" }); }, 0); }, _onClick: function(e){ // summary: // Internal handler for click events. // tags: // private if(e && e.type === "keydown" && e.keyCode !== 13){ return; } if(this.onClick(e) === false){ return; } // user's click action var item = registry.getEnclosingWidget(e.target); for(var n = e.target; n !== item.domNode; n = n.parentNode){ if(n === item.deleteIconNode){ connect.publish("/dojox/mobile/deleteListItem", [item]); break; } } }, onClick: function(/*Event*/ /*===== e =====*/){ // summary: // User-defined function to handle clicks. // tags: // callback }, _onTouchStart: function(e){ // tags: // private if(this.getChildren().length <= 1){ return; } if(!this._blankItem){ this._blankItem = new ListItem(); } var item = this._movingItem = registry.getEnclosingWidget(e.target); var rightIconPressed = false; for(var n = e.target; n !== item.domNode; n = n.parentNode){ if(n === item.rightIconNode){ rightIconPressed = true; break; } } if(!rightIconPressed){ return; } var ref = item.getNextSibling(); ref = ref ? ref.domNode : null; this.containerNode.insertBefore(this._blankItem.domNode, ref); this._setupMoveItem(item.domNode); this.containerNode.appendChild(item.domNode); if(!this._conn){ this._conn = [ this.connect(this.domNode, touch.move, "_onTouchMove"), this.connect(this.domNode, touch.release, "_onTouchEnd") ]; } this._pos = []; array.forEach(this.getChildren(), function(c, index){ this._pos.push(domGeometry.position(c.domNode, true).y); }, this); this.touchStartY = e.touches ? e.touches[0].pageY : e.pageY; this._startTop = domGeometry.getMarginBox(item.domNode).t; event.stop(e); }, _onTouchMove: function(e){ // tags: // private var y = e.touches ? e.touches[0].pageY : e.pageY; var index = this._pos.length - 1; for(var i = 1; i < this._pos.length; i++){ if(y < this._pos[i]){ index = i - 1; break; } } var item = this.getChildren()[index]; var blank = this._blankItem; if(item !== blank){ var p = item.domNode.parentNode; if(item.getIndexInParent() < blank.getIndexInParent()){ p.insertBefore(blank.domNode, item.domNode); }else{ p.insertBefore(item.domNode, blank.domNode); } } this._movingItem.domNode.style.top = this._startTop + (y - this.touchStartY) + "px"; }, _onTouchEnd: function(e){ // tags: // private var ref = this._blankItem.getNextSibling(); ref = ref ? ref.domNode : null; this.containerNode.insertBefore(this._movingItem.domNode, ref); this.containerNode.removeChild(this._blankItem.domNode); this._resetMoveItem(this._movingItem.domNode); array.forEach(this._conn, connect.disconnect); this._conn = null; }, startEdit: function(){ // summary: // Starts the editing. this.isEditing = true; domClass.add(this.domNode, "mblEditableRoundRectList"); array.forEach(this.getChildren(), function(child){ if(!child.deleteIconNode){ child.set("rightIcon", this.rightIconForEdit); child.set("deleteIcon", this.deleteIconForEdit); child.deleteIconNode.tabIndex = child.tabIndex; } child.rightIconNode.style.display = ""; child.deleteIconNode.style.display = ""; }, this); if(!this._handles){ this._handles = [ this.connect(this.domNode, touch.press, "_onTouchStart"), this.connect(this.domNode, "onclick", "_onClick"), this.connect(this.domNode, "onkeydown", "_onClick") // for desktop browsers ]; } }, endEdit: function(){ // summary: // Ends the editing. domClass.remove(this.domNode, "mblEditableRoundRectList"); array.forEach(this.getChildren(), function(child){ child.rightIconNode.style.display = "none"; child.deleteIconNode.style.display = "none"; }); if(this._handles){ array.forEach(this._handles, this.disconnect, this); this._handles = null; } this.isEditing = false; } }); });