| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-ux-DataView-Draggable'>/**</span> * @class Ext.ux.DataView.Draggable * @extends Object * @author Ed Spencer *<pre><code>Ext.create('Ext.view.View', {    mixins: {        draggable: 'Ext.ux.DataView.Draggable'    },    initComponent: function() {        this.mixins.draggable.init(this, {            ddConfig: {                ddGroup: 'someGroup'            }        });        this.callParent(arguments);    }});</code></pre> * */Ext.define('Ext.ux.DataView.Draggable', {    requires: 'Ext.dd.DragZone',<span id='Ext-ux-DataView-Draggable-cfg-ghostCls'>    /**</span>     * @cfg {String} ghostCls The CSS class added to the outermost element of the created ghost proxy     * (defaults to 'x-dataview-draggable-ghost')     */    ghostCls: 'x-dataview-draggable-ghost',<span id='Ext-ux-DataView-Draggable-cfg-ghostTpl'>    /**</span>     * @cfg {Ext.XTemplate/Array} ghostTpl The template used in the ghost DataView     */    ghostTpl: [        '<tpl for=".">',            '{title}',        '</tpl>'    ],<span id='Ext-ux-DataView-Draggable-cfg-ddConfig'>    /**</span>     * @cfg {Object} ddConfig Config object that is applied to the internally created DragZone     */<span id='Ext-ux-DataView-Draggable-cfg-ghostConfig'>    /**</span>     * @cfg {String} ghostConfig Config object that is used to configure the internally created DataView     */    init: function(dataview, config) {<span id='Ext-ux-DataView-Draggable-property-dataview'>        /**</span>         * @property dataview         * @type Ext.view.View         * The Ext.view.View instance that this DragZone is attached to         */        this.dataview = dataview;        dataview.on('render', this.onRender, this);        Ext.apply(this, {            itemSelector: dataview.itemSelector,            ghostConfig : {}        }, config || {});        Ext.applyIf(this.ghostConfig, {            itemSelector: 'img',            cls: this.ghostCls,            tpl: this.ghostTpl        });    },<span id='Ext-ux-DataView-Draggable-method-onRender'>    /**</span>     * @private     * Called when the attached DataView is rendered. Sets up the internal DragZone     */    onRender: function() {        var config = Ext.apply({}, this.ddConfig || {}, {            dvDraggable: this,            dataview   : this.dataview,            getDragData: this.getDragData,            getTreeNode: this.getTreeNode,            afterRepair: this.afterRepair,            getRepairXY: this.getRepairXY        });<span id='Ext-ux-DataView-Draggable-property-dragZone'>        /**</span>         * @property dragZone         * @type Ext.dd.DragZone         * The attached DragZone instane         */        this.dragZone = Ext.create('Ext.dd.DragZone', this.dataview.getEl(), config);    },    getDragData: function(e) {        var draggable = this.dvDraggable,            dataview  = this.dataview,            selModel  = dataview.getSelectionModel(),            target    = e.getTarget(draggable.itemSelector),            selected, dragData;        if (target) {            if (!dataview.isSelected(target)) {                selModel.select(dataview.getRecord(target));            }            selected = dataview.getSelectedNodes();            dragData = {                copy: true,                nodes: selected,                records: selModel.getSelection(),                item: true            };            if (selected.length == 1) {                dragData.single = true;                dragData.ddel = target;            } else {                dragData.multi = true;                dragData.ddel = draggable.prepareGhost(selModel.getSelection()).dom;            }            return dragData;        }        return false;    },    getTreeNode: function() {        // console.log('test');    },    afterRepair: function() {        this.dragging = false;        var nodes  = this.dragData.nodes,            length = nodes.length,            i;        //FIXME: Ext.fly does not work here for some reason, only frames the last node        for (i = 0; i < length; i++) {            Ext.get(nodes[i]).frame('#8db2e3', 1);        }    },<span id='Ext-ux-DataView-Draggable-method-getRepairXY'>    /**</span>     * @private     * Returns the x and y co-ordinates that the dragged item should be animated back to if it was dropped on an     * invalid drop target. If we're dragging more than one item we don't animate back and just allow afterRepair     * to frame each dropped item.     */    getRepairXY: function(e) {        if (this.dragData.multi) {            return false;        } else {            var repairEl = Ext.get(this.dragData.ddel),                repairXY = repairEl.getXY();            //take the item's margins and padding into account to make the repair animation line up perfectly            repairXY[0] += repairEl.getPadding('t') + repairEl.getMargin('t');            repairXY[1] += repairEl.getPadding('l') + repairEl.getMargin('l');            return repairXY;        }    },<span id='Ext-ux-DataView-Draggable-method-prepareGhost'>    /**</span>     * Updates the internal ghost DataView by ensuring it is rendered and contains the correct records     * @param {Array} records The set of records that is currently selected in the parent DataView     * @return {Ext.view.View} The Ghost DataView     */    prepareGhost: function(records) {        var ghost = this.createGhost(records),            store = ghost.store;        store.removeAll();        store.add(records);        return ghost.getEl();    },<span id='Ext-ux-DataView-Draggable-method-createGhost'>    /**</span>     * @private     * Creates the 'ghost' DataView that follows the mouse cursor during the drag operation. This div is usually a     * lighter-weight representation of just the nodes that are selected in the parent DataView.     */    createGhost: function(records) {        if (!this.ghost) {            var ghostConfig = Ext.apply({}, this.ghostConfig, {                store: Ext.create('Ext.data.Store', {                    model: records[0].modelName                })            });            this.ghost = Ext.create('Ext.view.View', ghostConfig);            this.ghost.render(document.createElement('div'));        }        return this.ghost;    }});</pre></body></html>
 |