diff options
author | isjusterin <erinproductions@gmail.com> | 2015-07-22 19:06:03 -0500 |
---|---|---|
committer | isjusterin <erinproductions@gmail.com> | 2015-07-22 19:06:03 -0500 |
commit | eda26599175299cd1481bc93ecfc57c4840f8705 (patch) | |
tree | 5bb7fed81f5788ed955bcc1f341667466d3c6d0c /comiccontrol/draganddrop/drag.js | |
parent | 2e1397a1c1ee6bde877c351010e0fdaed43efd25 (diff) | |
download | ComicControl-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.js | 235 |
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 + } + } +} |