summaryrefslogtreecommitdiffstats
path: root/comiccontrol/draganddrop/drag.js
diff options
context:
space:
mode:
authorisjusterin <erinproductions@gmail.com>2015-07-22 19:06:03 -0500
committerisjusterin <erinproductions@gmail.com>2015-07-22 19:06:03 -0500
commiteda26599175299cd1481bc93ecfc57c4840f8705 (patch)
tree5bb7fed81f5788ed955bcc1f341667466d3c6d0c /comiccontrol/draganddrop/drag.js
parent2e1397a1c1ee6bde877c351010e0fdaed43efd25 (diff)
downloadComicControl-3.0-master.zip
ComicControl-3.0-master.tar.gz
ComicControl-3.0-master.tar.bz2
ComicControl files to be dumped in root folderHEADorigin/masterorigin/HEADmaster
Diffstat (limited to 'comiccontrol/draganddrop/drag.js')
-rw-r--r--comiccontrol/draganddrop/drag.js235
1 files changed, 235 insertions, 0 deletions
diff --git a/comiccontrol/draganddrop/drag.js b/comiccontrol/draganddrop/drag.js
new file mode 100644
index 0000000..861c7ea
--- /dev/null
+++ b/comiccontrol/draganddrop/drag.js
@@ -0,0 +1,235 @@
+/* Copyright (c) 2005 Tim Taylor Consulting (see LICENSE.txt) */
+
+ToolMan._dragFactory = {
+ createSimpleGroup : function(element, handle) {
+ handle = handle ? handle : element
+ var group = this.createGroup(element)
+ group.setHandle(handle)
+ group.transparentDrag()
+ group.onTopWhileDragging()
+ return group
+ },
+
+ createGroup : function(element) {
+ var group = new _ToolManDragGroup(this, element)
+
+ var position = ToolMan.css().readStyle(element, 'position')
+ if (position == 'static') {
+ element.style["position"] = 'relative'
+ } else if (position == 'absolute') {
+ /* for Safari 1.2 */
+ ToolMan.coordinates().topLeftOffset(element).reposition(element)
+ }
+
+ // TODO: only if ToolMan.isDebugging()
+ group.register('draginit', this._showDragEventStatus)
+ group.register('dragmove', this._showDragEventStatus)
+ group.register('dragend', this._showDragEventStatus)
+
+ return group
+ },
+
+ _showDragEventStatus : function(dragEvent) {
+ window.status = dragEvent.toString()
+ },
+
+ constraints : function() {
+ return this._constraintFactory
+ },
+
+ _createEvent : function(type, event, group) {
+ return new _ToolManDragEvent(type, event, group)
+ }
+}
+
+function _ToolManDragGroup(factory, element) {
+ this.factory = factory
+ this.element = element
+ this._handle = null
+ this._thresholdDistance = 0
+ this._transforms = new Array()
+ // TODO: refactor into a helper object, move into events.js
+ this._listeners = new Array()
+ this._listeners['draginit'] = new Array()
+ this._listeners['dragstart'] = new Array()
+ this._listeners['dragmove'] = new Array()
+ this._listeners['dragend'] = new Array()
+}
+
+_ToolManDragGroup.prototype = {
+ /*
+ * TODO:
+ * - unregister(type, func)
+ * - move custom event listener stuff into Event library
+ * - keyboard nudging of "selected" group
+ */
+
+ setHandle : function(handle) {
+ var events = ToolMan.events()
+
+ handle.toolManDragGroup = this
+ events.register(handle, 'mousedown', this._dragInit)
+ handle.onmousedown = function() { return false }
+
+ if (this.element != handle)
+ events.unregister(this.element, 'mousedown', this._dragInit)
+ },
+
+ register : function(type, func) {
+ this._listeners[type].push(func)
+ },
+
+ addTransform : function(transformFunc) {
+ this._transforms.push(transformFunc)
+ },
+
+ verticalOnly : function() {
+ this.addTransform(this.factory.constraints().vertical())
+ },
+
+ horizontalOnly : function() {
+ this.addTransform(this.factory.constraints().horizontal())
+ },
+
+ setThreshold : function(thresholdDistance) {
+ this._thresholdDistance = thresholdDistance
+ },
+
+ transparentDrag : function(opacity) {
+ var opacity = typeof(opacity) != "undefined" ? opacity : 0.75;
+ var originalOpacity = ToolMan.css().readStyle(this.element, "opacity")
+
+ this.register('dragstart', function(dragEvent) {
+ var element = dragEvent.group.element
+ element.style.opacity = opacity
+ element.style.filter = 'alpha(opacity=' + (opacity * 100) + ')'
+ })
+ this.register('dragend', function(dragEvent) {
+ var element = dragEvent.group.element
+ element.style.opacity = originalOpacity
+ element.style.filter = 'alpha(opacity=100)'
+ })
+ },
+
+ onTopWhileDragging : function(zIndex) {
+ var zIndex = typeof(zIndex) != "undefined" ? zIndex : 100000;
+ var originalZIndex = ToolMan.css().readStyle(this.element, "z-index")
+
+ this.register('dragstart', function(dragEvent) {
+ dragEvent.group.element.style.zIndex = zIndex
+ })
+ this.register('dragend', function(dragEvent) {
+ dragEvent.group.element.style.zIndex = originalZIndex
+ })
+ },
+
+ _dragInit : function(event) {
+ event = ToolMan.events().fix(event)
+ var group = document.toolManDragGroup = this.toolManDragGroup
+ var dragEvent = group.factory._createEvent('draginit', event, group)
+
+ group._isThresholdExceeded = false
+ group._initialMouseOffset = dragEvent.mouseOffset
+ group._grabOffset = dragEvent.mouseOffset.minus(dragEvent.topLeftOffset)
+ ToolMan.events().register(document, 'mousemove', group._drag)
+ document.onmousemove = function() { return false }
+ ToolMan.events().register(document, 'mouseup', group._dragEnd)
+
+ group._notifyListeners(dragEvent)
+ },
+
+ _drag : function(event) {
+ event = ToolMan.events().fix(event)
+ var coordinates = ToolMan.coordinates()
+ var group = this.toolManDragGroup
+ if (!group) return
+ var dragEvent = group.factory._createEvent('dragmove', event, group)
+
+ var newTopLeftOffset = dragEvent.mouseOffset.minus(group._grabOffset)
+
+ // TODO: replace with DragThreshold object
+ if (!group._isThresholdExceeded) {
+ var distance =
+ dragEvent.mouseOffset.distance(group._initialMouseOffset)
+ if (distance < group._thresholdDistance) return
+ group._isThresholdExceeded = true
+ group._notifyListeners(
+ group.factory._createEvent('dragstart', event, group))
+ }
+
+ for (i in group._transforms) {
+ var transform = group._transforms[i]
+ newTopLeftOffset = transform(newTopLeftOffset, dragEvent)
+ }
+
+ var dragDelta = newTopLeftOffset.minus(dragEvent.topLeftOffset)
+ var newTopLeftPosition = dragEvent.topLeftPosition.plus(dragDelta)
+ newTopLeftPosition.reposition(group.element)
+ dragEvent.transformedMouseOffset = newTopLeftOffset.plus(group._grabOffset)
+
+ group._notifyListeners(dragEvent)
+
+ var errorDelta = newTopLeftOffset.minus(coordinates.topLeftOffset(group.element))
+ if (errorDelta.x != 0 || errorDelta.y != 0) {
+ coordinates.topLeftPosition(group.element).plus(errorDelta).reposition(group.element)
+ }
+ },
+
+ _dragEnd : function(event) {
+ event = ToolMan.events().fix(event)
+ var group = this.toolManDragGroup
+ var dragEvent = group.factory._createEvent('dragend', event, group)
+
+ group._notifyListeners(dragEvent)
+
+ this.toolManDragGroup = null
+ ToolMan.events().unregister(document, 'mousemove', group._drag)
+ document.onmousemove = null
+ ToolMan.events().unregister(document, 'mouseup', group._dragEnd)
+ },
+
+ _notifyListeners : function(dragEvent) {
+ var listeners = this._listeners[dragEvent.type]
+ for (i in listeners) {
+ listeners[i](dragEvent)
+ }
+ }
+}
+
+function _ToolManDragEvent(type, event, group) {
+ this.type = type
+ this.group = group
+ this.mousePosition = ToolMan.coordinates().mousePosition(event)
+ this.mouseOffset = ToolMan.coordinates().mouseOffset(event)
+ this.transformedMouseOffset = this.mouseOffset
+ this.topLeftPosition = ToolMan.coordinates().topLeftPosition(group.element)
+ this.topLeftOffset = ToolMan.coordinates().topLeftOffset(group.element)
+}
+
+_ToolManDragEvent.prototype = {
+ toString : function() {
+ return "mouse: " + this.mousePosition + this.mouseOffset + " " +
+ "xmouse: " + this.transformedMouseOffset + " " +
+ "left,top: " + this.topLeftPosition + this.topLeftOffset
+ }
+}
+
+ToolMan._dragFactory._constraintFactory = {
+ vertical : function() {
+ return function(coordinate, dragEvent) {
+ var x = dragEvent.topLeftOffset.x
+ return coordinate.x != x
+ ? coordinate.factory.create(x, coordinate.y)
+ : coordinate
+ }
+ },
+
+ horizontal : function() {
+ return function(coordinate, dragEvent) {
+ var y = dragEvent.topLeftOffset.y
+ return coordinate.y != y
+ ? coordinate.factory.create(coordinate.x, y)
+ : coordinate
+ }
+ }
+}