Index: closure/goog/fx/draglistgroup.js |
=================================================================== |
--- closure/goog/fx/draglistgroup.js (revision 450) |
+++ closure/goog/fx/draglistgroup.js (working copy) |
@@ -36,6 +36,7 @@ |
goog.require('goog.fx.Dragger.EventType'); |
goog.require('goog.math.Coordinate'); |
goog.require('goog.style'); |
+goog.require('goog.fx.AbstractDragDrop'); |
/** |
@@ -372,15 +373,90 @@ |
this.dragItems_.push(dragItem); |
this.eventHandler_.listen( |
dragItemHandle, goog.events.EventType.MOUSEDOWN, |
- this.handleDragStart_); |
+ this.mouseDown_); |
} |
} |
this.isInitialized_ = true; |
}; |
+/** |
+ * Adds mouse move, mouse out, and mouse up handlers. |
+ * |
+ * @private |
+ */ |
+goog.fx.DragListGroup.prototype.maybeStartDrag_ = function(event, element) { |
+ goog.events.listen(element, goog.events.EventType.MOUSEMOVE, |
+ this.mouseMove_, false, this); |
+ goog.events.listen(element, goog.events.EventType.MOUSEOUT, |
+ this.mouseMove_, false, this); |
+ goog.events.listen(element, goog.events.EventType.MOUSEUP, |
+ this.mouseUp_, false, this); |
+ this.currentDragElement_ = element; |
+ this.startPosition_ = new goog.math.Coordinate( |
+ event.clientX, event.clientY); |
+ event.preventDefault(); |
+}; |
+ |
/** |
+ * Event handler for mouse down. |
+ * |
+ * @param {goog.events.BrowserEvent} event Mouse down event. |
+ * @private |
+ */ |
+goog.fx.DragListGroup.prototype.mouseDown_ = function(event) { |
+ // Get the draggable element for the target. |
+ var element = /** @type {Element} */(event.currentTarget); |
+ if (element) { |
+ this.maybeStartDrag_(event, element); |
+ } |
+}; |
+ |
+/** |
+ * Event handler for mouse up. Removes mouse move, mouse out and mouse up event |
+ * handlers. |
+ * |
+ * @param {goog.events.BrowserEvent} event Mouse up event. |
+ * @private |
+ */ |
+goog.fx.DragListGroup.prototype.mouseUp_ = function(event) { |
+ var currentDragElement = this.currentDragElement_; |
+ goog.events.unlisten(currentDragElement, goog.events.EventType.MOUSEMOVE, |
+ this.mouseMove_, false, this); |
+ goog.events.unlisten(currentDragElement, goog.events.EventType.MOUSEOUT, |
+ this.mouseMove_, false, this); |
+ goog.events.unlisten(currentDragElement, goog.events.EventType.MOUSEUP, |
+ this.mouseUp_, false, this); |
+ delete this.startPosition_; |
+ this.currentDragElement_ = null; |
+}; |
+ |
+/** |
+ * Event handler for mouse move. Starts drag operation if moved more than the |
+ * threshold value. |
+ * |
+ * @param {goog.events.BrowserEvent} event Mouse move or mouse out event. |
+ * @private |
+ */ |
+goog.fx.DragListGroup.prototype.mouseMove_ = function(event) { |
+ var distance = Math.abs(event.clientX - this.startPosition_.x) + |
+ Math.abs(event.clientY - this.startPosition_.y); |
+ |
+ if (distance > goog.fx.AbstractDragDrop.initDragDistanceThreshold) { |
+ var currentDragElement = this.currentDragElement_; |
+ goog.events.unlisten(currentDragElement, goog.events.EventType.MOUSEMOVE, |
+ this.mouseMove_, false, this); |
+ goog.events.unlisten(currentDragElement, goog.events.EventType.MOUSEOUT, |
+ this.mouseMove_, false, this); |
+ goog.events.unlisten(currentDragElement, goog.events.EventType.MOUSEUP, |
+ this.mouseUp_, false, this); |
+ |
+ this.handleDragStart_(event, currentDragElement); |
+ } |
+}; |
+ |
+/** |
* Disposes of the DragListGroup. |
*/ |
goog.fx.DragListGroup.prototype.disposeInternal = function() { |
@@ -411,9 +487,9 @@ |
* @return {boolean} Whether the event was handled. |
* @private |
*/ |
-goog.fx.DragListGroup.prototype.handleDragStart_ = function(e) { |
+goog.fx.DragListGroup.prototype.handleDragStart_ = function(e, dragElem) { |
- var uid = goog.getUid(/** @type {Node} */ (e.currentTarget)); |
+ var uid = goog.getUid(/** @type {Node} */ (dragElem)); |
var currDragItem = /** @type {Element} */ (this.dragItemForHandle_[uid]); |
var rv = this.dispatchEvent( |