Subversion Repositories DevTools

Rev

Rev 13 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/* Copyright (c) 2005 Tim Taylor Consulting (see LICENSE.txt) */

ToolMan._dragsortFactory = {
        makeSortable : function(item) {
                var group = ToolMan.drag().createSimpleGroup(item)

                group.register('dragstart', this._onDragStart)
                group.register('dragmove', this._onDragMove)
                group.register('dragend', this._onDragEnd)

                return group
        },

        /** 
         * Iterates over a list's items, making them sortable, applying
         * optional functions to each item.
         *
         * example: makeListSortable(myList, myFunc1, myFunc2, ... , myFuncN)
         */
        makeListSortable : function(list) {
                var helpers = ToolMan.helpers()
                var coordinates = ToolMan.coordinates()
                var items = list.getElementsByTagName("li")

                helpers.map(items, function(item) {
                        var dragGroup = dragsort.makeSortable(item)
                        dragGroup.setThreshold(4)
                        var min, max
                        dragGroup.addTransform(function(coordinate, dragEvent) {
                                return coordinate.constrainTo(min, max)
                        })
                        dragGroup.register('dragstart', function() {
                                var items = list.getElementsByTagName("li")
                                min = max = coordinates.topLeftOffset(items[0])
                                for (var i = 1, n = items.length; i < n; i++) {
                                        var offset = coordinates.topLeftOffset(items[i])
                                        min = min.min(offset)
                                        max = max.max(offset)
                                }
                        })
                })
                for (var i = 1, n = arguments.length; i < n; i++)
                        helpers.map(items, arguments[i])
        },

        _onDragStart : function(dragEvent) {
        },

        _onDragMove : function(dragEvent) {
                var helpers = ToolMan.helpers()
                var coordinates = ToolMan.coordinates()

                var item = dragEvent.group.element
                var xmouse = dragEvent.transformedMouseOffset
                var moveTo = null

                var previous = helpers.previousItem(item, item.nodeName)
                while (previous != null) {
                        var bottomRight = coordinates.bottomRightOffset(previous)
                        if (xmouse.y <= bottomRight.y && xmouse.x <= bottomRight.x) {
                                moveTo = previous
                        }
                        previous = helpers.previousItem(previous, item.nodeName)
                }
                if (moveTo != null) {
                        helpers.moveBefore(item, moveTo)
                        return
                }

                var next = helpers.nextItem(item, item.nodeName)
                while (next != null) {
                        var topLeft = coordinates.topLeftOffset(next)
                        if (topLeft.y <= xmouse.y && topLeft.x <= xmouse.x) {
                                moveTo = next
                        }
                        next = helpers.nextItem(next, item.nodeName)
                }
                if (moveTo != null) {
                        helpers.moveBefore(item, helpers.nextItem(moveTo, item.nodeName))
                        return
                }
        },

        _onDragEnd : function(dragEvent) {
                ToolMan.coordinates().create(0, 0).reposition(dragEvent.group.element)
        }
}