| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | <!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-view-DragZone'>/**</span> * @private */Ext.define('Ext.view.DragZone', {    extend: 'Ext.dd.DragZone',    containerScroll: false,    constructor: function(config) {        var me = this,            view,            ownerCt,            el;        Ext.apply(me, config);        // Create a ddGroup unless one has been configured.        // User configuration of ddGroups allows users to specify which        // DD instances can interact with each other. Using one        // based on the id of the View would isolate it and mean it can only        // interact with a DropZone on the same View also using a generated ID.        if (!me.ddGroup) {            me.ddGroup = 'view-dd-zone-' + me.view.id;        }        // Ext.dd.DragDrop instances are keyed by the ID of their encapsulating element.        // So a View's DragZone cannot use the View's main element because the DropZone must use that        // because the DropZone may need to scroll on hover at a scrolling boundary, and it is the View's        // main element which handles scrolling.        // We use the View's parent element to drag from. Ideally, we would use the internal structure, but that        // is transient; DataView's recreate the internal structure dynamically as data changes.        // TODO: Ext 5.0 DragDrop must allow multiple DD objects to share the same element.        view = me.view;        ownerCt = view.ownerCt;        // We don't just grab the parent el, since the parent el may be        // some el injected by the layout        if (ownerCt) {            el = ownerCt.getTargetEl().dom;        } else {            el = view.el.dom.parentNode;        }        me.callParent([el]);        me.ddel = Ext.get(document.createElement('div'));        me.ddel.addCls(Ext.baseCSSPrefix + 'grid-dd-wrap');    },    init: function(id, sGroup, config) {        this.initTarget(id, sGroup, config);        this.view.mon(this.view, {            itemmousedown: this.onItemMouseDown,            scope: this        });    },    onValidDrop: function(target, e, id) {        this.callParent();        // focus the view that the node was dropped onto so that keynav will be enabled.        target.el.focus();    },        onItemMouseDown: function(view, record, item, index, e) {        if (!this.isPreventDrag(e, record, item, index)) {            // Since handleMouseDown prevents the default behavior of the event, which            // is to focus the view, we focus the view now.  This ensures that the view            // remains focused if the drag is cancelled, or if no drag occurs.            this.view.focus();            this.handleMouseDown(e);            // If we want to allow dragging of multi-selections, then veto the following handlers (which, in the absence of ctrlKey, would deselect)            // if the mousedowned record is selected            if (view.getSelectionModel().selectionMode == 'MULTI' && !e.ctrlKey && view.getSelectionModel().isSelected(record)) {                return false;            }        }    },    // private template method    isPreventDrag: function(e) {        return false;    },    getDragData: function(e) {        var view = this.view,            item = e.getTarget(view.getItemSelector());        if (item) {            return {                copy: view.copy || (view.allowCopy && e.ctrlKey),                event: new Ext.EventObjectImpl(e),                view: view,                ddel: this.ddel,                item: item,                records: view.getSelectionModel().getSelection(),                fromPosition: Ext.fly(item).getXY()            };        }    },    onInitDrag: function(x, y) {        var me = this,            data = me.dragData,            view = data.view,            selectionModel = view.getSelectionModel(),            record = view.getRecord(data.item),            e = data.event;        // Update the selection to match what would have been selected if the user had        // done a full click on the target node rather than starting a drag from it        if (!selectionModel.isSelected(record)) {            selectionModel.select(record, true);        }        data.records = selectionModel.getSelection();        me.ddel.update(me.getDragText());        me.proxy.update(me.ddel.dom);        me.onStartDrag(x, y);        return true;    },    getDragText: function() {        var count = this.dragData.records.length;        return Ext.String.format(this.dragText, count, count == 1 ? '' : 's');    },    getRepairXY : function(e, data){        return data ? data.fromPosition : false;    }});</pre></body></html>
 |