annotate vakata-jstree-3.3.5/src/jstree.dnd.js @ 5:aacd5f53ac99 draft

v2.0.0
author mingchen0919
date Wed, 18 Apr 2018 13:17:28 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
mingchen0919
parents:
diff changeset
1 /**
mingchen0919
parents:
diff changeset
2 * ### Drag'n'drop plugin
mingchen0919
parents:
diff changeset
3 *
mingchen0919
parents:
diff changeset
4 * Enables dragging and dropping of nodes in the tree, resulting in a move or copy operations.
mingchen0919
parents:
diff changeset
5 */
mingchen0919
parents:
diff changeset
6 /*globals jQuery, define, exports, require, document */
mingchen0919
parents:
diff changeset
7 (function (factory) {
mingchen0919
parents:
diff changeset
8 "use strict";
mingchen0919
parents:
diff changeset
9 if (typeof define === 'function' && define.amd) {
mingchen0919
parents:
diff changeset
10 define('jstree.dnd', ['jquery','jstree'], factory);
mingchen0919
parents:
diff changeset
11 }
mingchen0919
parents:
diff changeset
12 else if(typeof exports === 'object') {
mingchen0919
parents:
diff changeset
13 factory(require('jquery'), require('jstree'));
mingchen0919
parents:
diff changeset
14 }
mingchen0919
parents:
diff changeset
15 else {
mingchen0919
parents:
diff changeset
16 factory(jQuery, jQuery.jstree);
mingchen0919
parents:
diff changeset
17 }
mingchen0919
parents:
diff changeset
18 }(function ($, jstree, undefined) {
mingchen0919
parents:
diff changeset
19 "use strict";
mingchen0919
parents:
diff changeset
20
mingchen0919
parents:
diff changeset
21 if($.jstree.plugins.dnd) { return; }
mingchen0919
parents:
diff changeset
22
mingchen0919
parents:
diff changeset
23 /**
mingchen0919
parents:
diff changeset
24 * stores all defaults for the drag'n'drop plugin
mingchen0919
parents:
diff changeset
25 * @name $.jstree.defaults.dnd
mingchen0919
parents:
diff changeset
26 * @plugin dnd
mingchen0919
parents:
diff changeset
27 */
mingchen0919
parents:
diff changeset
28 $.jstree.defaults.dnd = {
mingchen0919
parents:
diff changeset
29 /**
mingchen0919
parents:
diff changeset
30 * a boolean indicating if a copy should be possible while dragging (by pressint the meta key or Ctrl). Defaults to `true`.
mingchen0919
parents:
diff changeset
31 * @name $.jstree.defaults.dnd.copy
mingchen0919
parents:
diff changeset
32 * @plugin dnd
mingchen0919
parents:
diff changeset
33 */
mingchen0919
parents:
diff changeset
34 copy : true,
mingchen0919
parents:
diff changeset
35 /**
mingchen0919
parents:
diff changeset
36 * a number indicating how long a node should remain hovered while dragging to be opened. Defaults to `500`.
mingchen0919
parents:
diff changeset
37 * @name $.jstree.defaults.dnd.open_timeout
mingchen0919
parents:
diff changeset
38 * @plugin dnd
mingchen0919
parents:
diff changeset
39 */
mingchen0919
parents:
diff changeset
40 open_timeout : 500,
mingchen0919
parents:
diff changeset
41 /**
mingchen0919
parents:
diff changeset
42 * a function invoked each time a node is about to be dragged, invoked in the tree's scope and receives the nodes about to be dragged as an argument (array) and the event that started the drag - return `false` to prevent dragging
mingchen0919
parents:
diff changeset
43 * @name $.jstree.defaults.dnd.is_draggable
mingchen0919
parents:
diff changeset
44 * @plugin dnd
mingchen0919
parents:
diff changeset
45 */
mingchen0919
parents:
diff changeset
46 is_draggable : true,
mingchen0919
parents:
diff changeset
47 /**
mingchen0919
parents:
diff changeset
48 * a boolean indicating if checks should constantly be made while the user is dragging the node (as opposed to checking only on drop), default is `true`
mingchen0919
parents:
diff changeset
49 * @name $.jstree.defaults.dnd.check_while_dragging
mingchen0919
parents:
diff changeset
50 * @plugin dnd
mingchen0919
parents:
diff changeset
51 */
mingchen0919
parents:
diff changeset
52 check_while_dragging : true,
mingchen0919
parents:
diff changeset
53 /**
mingchen0919
parents:
diff changeset
54 * a boolean indicating if nodes from this tree should only be copied with dnd (as opposed to moved), default is `false`
mingchen0919
parents:
diff changeset
55 * @name $.jstree.defaults.dnd.always_copy
mingchen0919
parents:
diff changeset
56 * @plugin dnd
mingchen0919
parents:
diff changeset
57 */
mingchen0919
parents:
diff changeset
58 always_copy : false,
mingchen0919
parents:
diff changeset
59 /**
mingchen0919
parents:
diff changeset
60 * when dropping a node "inside", this setting indicates the position the node should go to - it can be an integer or a string: "first" (same as 0) or "last", default is `0`
mingchen0919
parents:
diff changeset
61 * @name $.jstree.defaults.dnd.inside_pos
mingchen0919
parents:
diff changeset
62 * @plugin dnd
mingchen0919
parents:
diff changeset
63 */
mingchen0919
parents:
diff changeset
64 inside_pos : 0,
mingchen0919
parents:
diff changeset
65 /**
mingchen0919
parents:
diff changeset
66 * when starting the drag on a node that is selected this setting controls if all selected nodes are dragged or only the single node, default is `true`, which means all selected nodes are dragged when the drag is started on a selected node
mingchen0919
parents:
diff changeset
67 * @name $.jstree.defaults.dnd.drag_selection
mingchen0919
parents:
diff changeset
68 * @plugin dnd
mingchen0919
parents:
diff changeset
69 */
mingchen0919
parents:
diff changeset
70 drag_selection : true,
mingchen0919
parents:
diff changeset
71 /**
mingchen0919
parents:
diff changeset
72 * controls whether dnd works on touch devices. If left as boolean true dnd will work the same as in desktop browsers, which in some cases may impair scrolling. If set to boolean false dnd will not work on touch devices. There is a special third option - string "selected" which means only selected nodes can be dragged on touch devices.
mingchen0919
parents:
diff changeset
73 * @name $.jstree.defaults.dnd.touch
mingchen0919
parents:
diff changeset
74 * @plugin dnd
mingchen0919
parents:
diff changeset
75 */
mingchen0919
parents:
diff changeset
76 touch : true,
mingchen0919
parents:
diff changeset
77 /**
mingchen0919
parents:
diff changeset
78 * controls whether items can be dropped anywhere on the node, not just on the anchor, by default only the node anchor is a valid drop target. Works best with the wholerow plugin. If enabled on mobile depending on the interface it might be hard for the user to cancel the drop, since the whole tree container will be a valid drop target.
mingchen0919
parents:
diff changeset
79 * @name $.jstree.defaults.dnd.large_drop_target
mingchen0919
parents:
diff changeset
80 * @plugin dnd
mingchen0919
parents:
diff changeset
81 */
mingchen0919
parents:
diff changeset
82 large_drop_target : false,
mingchen0919
parents:
diff changeset
83 /**
mingchen0919
parents:
diff changeset
84 * controls whether a drag can be initiated from any part of the node and not just the text/icon part, works best with the wholerow plugin. Keep in mind it can cause problems with tree scrolling on mobile depending on the interface - in that case set the touch option to "selected".
mingchen0919
parents:
diff changeset
85 * @name $.jstree.defaults.dnd.large_drag_target
mingchen0919
parents:
diff changeset
86 * @plugin dnd
mingchen0919
parents:
diff changeset
87 */
mingchen0919
parents:
diff changeset
88 large_drag_target : false,
mingchen0919
parents:
diff changeset
89 /**
mingchen0919
parents:
diff changeset
90 * controls whether use HTML5 dnd api instead of classical. That will allow better integration of dnd events with other HTML5 controls.
mingchen0919
parents:
diff changeset
91 * @reference http://caniuse.com/#feat=dragndrop
mingchen0919
parents:
diff changeset
92 * @name $.jstree.defaults.dnd.use_html5
mingchen0919
parents:
diff changeset
93 * @plugin dnd
mingchen0919
parents:
diff changeset
94 */
mingchen0919
parents:
diff changeset
95 use_html5: false
mingchen0919
parents:
diff changeset
96 };
mingchen0919
parents:
diff changeset
97 var drg, elm;
mingchen0919
parents:
diff changeset
98 // TODO: now check works by checking for each node individually, how about max_children, unique, etc?
mingchen0919
parents:
diff changeset
99 $.jstree.plugins.dnd = function (options, parent) {
mingchen0919
parents:
diff changeset
100 this.init = function (el, options) {
mingchen0919
parents:
diff changeset
101 parent.init.call(this, el, options);
mingchen0919
parents:
diff changeset
102 this.settings.dnd.use_html5 = this.settings.dnd.use_html5 && ('draggable' in document.createElement('span'));
mingchen0919
parents:
diff changeset
103 };
mingchen0919
parents:
diff changeset
104 this.bind = function () {
mingchen0919
parents:
diff changeset
105 parent.bind.call(this);
mingchen0919
parents:
diff changeset
106
mingchen0919
parents:
diff changeset
107 this.element
mingchen0919
parents:
diff changeset
108 .on(this.settings.dnd.use_html5 ? 'dragstart.jstree' : 'mousedown.jstree touchstart.jstree', this.settings.dnd.large_drag_target ? '.jstree-node' : '.jstree-anchor', $.proxy(function (e) {
mingchen0919
parents:
diff changeset
109 if(this.settings.dnd.large_drag_target && $(e.target).closest('.jstree-node')[0] !== e.currentTarget) {
mingchen0919
parents:
diff changeset
110 return true;
mingchen0919
parents:
diff changeset
111 }
mingchen0919
parents:
diff changeset
112 if(e.type === "touchstart" && (!this.settings.dnd.touch || (this.settings.dnd.touch === 'selected' && !$(e.currentTarget).closest('.jstree-node').children('.jstree-anchor').hasClass('jstree-clicked')))) {
mingchen0919
parents:
diff changeset
113 return true;
mingchen0919
parents:
diff changeset
114 }
mingchen0919
parents:
diff changeset
115 var obj = this.get_node(e.target),
mingchen0919
parents:
diff changeset
116 mlt = this.is_selected(obj) && this.settings.dnd.drag_selection ? this.get_top_selected().length : 1,
mingchen0919
parents:
diff changeset
117 txt = (mlt > 1 ? mlt + ' ' + this.get_string('nodes') : this.get_text(e.currentTarget));
mingchen0919
parents:
diff changeset
118 if(this.settings.core.force_text) {
mingchen0919
parents:
diff changeset
119 txt = $.vakata.html.escape(txt);
mingchen0919
parents:
diff changeset
120 }
mingchen0919
parents:
diff changeset
121 if(obj && obj.id && obj.id !== $.jstree.root && (e.which === 1 || e.type === "touchstart" || e.type === "dragstart") &&
mingchen0919
parents:
diff changeset
122 (this.settings.dnd.is_draggable === true || ($.isFunction(this.settings.dnd.is_draggable) && this.settings.dnd.is_draggable.call(this, (mlt > 1 ? this.get_top_selected(true) : [obj]), e)))
mingchen0919
parents:
diff changeset
123 ) {
mingchen0919
parents:
diff changeset
124 drg = { 'jstree' : true, 'origin' : this, 'obj' : this.get_node(obj,true), 'nodes' : mlt > 1 ? this.get_top_selected() : [obj.id] };
mingchen0919
parents:
diff changeset
125 elm = e.currentTarget;
mingchen0919
parents:
diff changeset
126 if (this.settings.dnd.use_html5) {
mingchen0919
parents:
diff changeset
127 $.vakata.dnd._trigger('start', e, { 'helper': $(), 'element': elm, 'data': drg });
mingchen0919
parents:
diff changeset
128 } else {
mingchen0919
parents:
diff changeset
129 this.element.trigger('mousedown.jstree');
mingchen0919
parents:
diff changeset
130 return $.vakata.dnd.start(e, drg, '<div id="jstree-dnd" class="jstree-' + this.get_theme() + ' jstree-' + this.get_theme() + '-' + this.get_theme_variant() + ' ' + ( this.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ) + '"><i class="jstree-icon jstree-er"></i>' + txt + '<ins class="jstree-copy" style="display:none;">+</ins></div>');
mingchen0919
parents:
diff changeset
131 }
mingchen0919
parents:
diff changeset
132 }
mingchen0919
parents:
diff changeset
133 }, this));
mingchen0919
parents:
diff changeset
134 if (this.settings.dnd.use_html5) {
mingchen0919
parents:
diff changeset
135 this.element
mingchen0919
parents:
diff changeset
136 .on('dragover.jstree', function (e) {
mingchen0919
parents:
diff changeset
137 e.preventDefault();
mingchen0919
parents:
diff changeset
138 $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg });
mingchen0919
parents:
diff changeset
139 return false;
mingchen0919
parents:
diff changeset
140 })
mingchen0919
parents:
diff changeset
141 //.on('dragenter.jstree', this.settings.dnd.large_drop_target ? '.jstree-node' : '.jstree-anchor', $.proxy(function (e) {
mingchen0919
parents:
diff changeset
142 // e.preventDefault();
mingchen0919
parents:
diff changeset
143 // $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg });
mingchen0919
parents:
diff changeset
144 // return false;
mingchen0919
parents:
diff changeset
145 // }, this))
mingchen0919
parents:
diff changeset
146 .on('drop.jstree', $.proxy(function (e) {
mingchen0919
parents:
diff changeset
147 e.preventDefault();
mingchen0919
parents:
diff changeset
148 $.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg });
mingchen0919
parents:
diff changeset
149 return false;
mingchen0919
parents:
diff changeset
150 }, this));
mingchen0919
parents:
diff changeset
151 }
mingchen0919
parents:
diff changeset
152 };
mingchen0919
parents:
diff changeset
153 this.redraw_node = function(obj, deep, callback, force_render) {
mingchen0919
parents:
diff changeset
154 obj = parent.redraw_node.apply(this, arguments);
mingchen0919
parents:
diff changeset
155 if (obj && this.settings.dnd.use_html5) {
mingchen0919
parents:
diff changeset
156 if (this.settings.dnd.large_drag_target) {
mingchen0919
parents:
diff changeset
157 obj.setAttribute('draggable', true);
mingchen0919
parents:
diff changeset
158 } else {
mingchen0919
parents:
diff changeset
159 var i, j, tmp = null;
mingchen0919
parents:
diff changeset
160 for(i = 0, j = obj.childNodes.length; i < j; i++) {
mingchen0919
parents:
diff changeset
161 if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) {
mingchen0919
parents:
diff changeset
162 tmp = obj.childNodes[i];
mingchen0919
parents:
diff changeset
163 break;
mingchen0919
parents:
diff changeset
164 }
mingchen0919
parents:
diff changeset
165 }
mingchen0919
parents:
diff changeset
166 if(tmp) {
mingchen0919
parents:
diff changeset
167 tmp.setAttribute('draggable', true);
mingchen0919
parents:
diff changeset
168 }
mingchen0919
parents:
diff changeset
169 }
mingchen0919
parents:
diff changeset
170 }
mingchen0919
parents:
diff changeset
171 return obj;
mingchen0919
parents:
diff changeset
172 };
mingchen0919
parents:
diff changeset
173 };
mingchen0919
parents:
diff changeset
174
mingchen0919
parents:
diff changeset
175 $(function() {
mingchen0919
parents:
diff changeset
176 // bind only once for all instances
mingchen0919
parents:
diff changeset
177 var lastmv = false,
mingchen0919
parents:
diff changeset
178 laster = false,
mingchen0919
parents:
diff changeset
179 lastev = false,
mingchen0919
parents:
diff changeset
180 opento = false,
mingchen0919
parents:
diff changeset
181 marker = $('<div id="jstree-marker">&#160;</div>').hide(); //.appendTo('body');
mingchen0919
parents:
diff changeset
182
mingchen0919
parents:
diff changeset
183 $(document)
mingchen0919
parents:
diff changeset
184 .on('dnd_start.vakata.jstree', function (e, data) {
mingchen0919
parents:
diff changeset
185 lastmv = false;
mingchen0919
parents:
diff changeset
186 lastev = false;
mingchen0919
parents:
diff changeset
187 if(!data || !data.data || !data.data.jstree) { return; }
mingchen0919
parents:
diff changeset
188 marker.appendTo('body'); //.show();
mingchen0919
parents:
diff changeset
189 })
mingchen0919
parents:
diff changeset
190 .on('dnd_move.vakata.jstree', function (e, data) {
mingchen0919
parents:
diff changeset
191 var isDifferentNode = data.event.target !== lastev.target;
mingchen0919
parents:
diff changeset
192 if(opento) {
mingchen0919
parents:
diff changeset
193 if (!data.event || data.event.type !== 'dragover' || isDifferentNode) {
mingchen0919
parents:
diff changeset
194 clearTimeout(opento);
mingchen0919
parents:
diff changeset
195 }
mingchen0919
parents:
diff changeset
196 }
mingchen0919
parents:
diff changeset
197 if(!data || !data.data || !data.data.jstree) { return; }
mingchen0919
parents:
diff changeset
198
mingchen0919
parents:
diff changeset
199 // if we are hovering the marker image do nothing (can happen on "inside" drags)
mingchen0919
parents:
diff changeset
200 if(data.event.target.id && data.event.target.id === 'jstree-marker') {
mingchen0919
parents:
diff changeset
201 return;
mingchen0919
parents:
diff changeset
202 }
mingchen0919
parents:
diff changeset
203 lastev = data.event;
mingchen0919
parents:
diff changeset
204
mingchen0919
parents:
diff changeset
205 var ins = $.jstree.reference(data.event.target),
mingchen0919
parents:
diff changeset
206 ref = false,
mingchen0919
parents:
diff changeset
207 off = false,
mingchen0919
parents:
diff changeset
208 rel = false,
mingchen0919
parents:
diff changeset
209 tmp, l, t, h, p, i, o, ok, t1, t2, op, ps, pr, ip, tm, is_copy, pn;
mingchen0919
parents:
diff changeset
210 // if we are over an instance
mingchen0919
parents:
diff changeset
211 if(ins && ins._data && ins._data.dnd) {
mingchen0919
parents:
diff changeset
212 marker.attr('class', 'jstree-' + ins.get_theme() + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ));
mingchen0919
parents:
diff changeset
213 is_copy = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)));
mingchen0919
parents:
diff changeset
214 data.helper
mingchen0919
parents:
diff changeset
215 .children().attr('class', 'jstree-' + ins.get_theme() + ' jstree-' + ins.get_theme() + '-' + ins.get_theme_variant() + ' ' + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' ))
mingchen0919
parents:
diff changeset
216 .find('.jstree-copy').first()[ is_copy ? 'show' : 'hide' ]();
mingchen0919
parents:
diff changeset
217
mingchen0919
parents:
diff changeset
218 // if are hovering the container itself add a new root node
mingchen0919
parents:
diff changeset
219 //console.log(data.event);
mingchen0919
parents:
diff changeset
220 if( (data.event.target === ins.element[0] || data.event.target === ins.get_container_ul()[0]) && ins.get_container_ul().children().length === 0) {
mingchen0919
parents:
diff changeset
221 ok = true;
mingchen0919
parents:
diff changeset
222 for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {
mingchen0919
parents:
diff changeset
223 ok = ok && ins.check( (data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)) ) ? "copy_node" : "move_node"), (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), $.jstree.root, 'last', { 'dnd' : true, 'ref' : ins.get_node($.jstree.root), 'pos' : 'i', 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) });
mingchen0919
parents:
diff changeset
224 if(!ok) { break; }
mingchen0919
parents:
diff changeset
225 }
mingchen0919
parents:
diff changeset
226 if(ok) {
mingchen0919
parents:
diff changeset
227 lastmv = { 'ins' : ins, 'par' : $.jstree.root, 'pos' : 'last' };
mingchen0919
parents:
diff changeset
228 marker.hide();
mingchen0919
parents:
diff changeset
229 data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');
mingchen0919
parents:
diff changeset
230 if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {
mingchen0919
parents:
diff changeset
231 data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move';
mingchen0919
parents:
diff changeset
232 }
mingchen0919
parents:
diff changeset
233 return;
mingchen0919
parents:
diff changeset
234 }
mingchen0919
parents:
diff changeset
235 }
mingchen0919
parents:
diff changeset
236 else {
mingchen0919
parents:
diff changeset
237 // if we are hovering a tree node
mingchen0919
parents:
diff changeset
238 ref = ins.settings.dnd.large_drop_target ? $(data.event.target).closest('.jstree-node').children('.jstree-anchor') : $(data.event.target).closest('.jstree-anchor');
mingchen0919
parents:
diff changeset
239 if(ref && ref.length && ref.parent().is('.jstree-closed, .jstree-open, .jstree-leaf')) {
mingchen0919
parents:
diff changeset
240 off = ref.offset();
mingchen0919
parents:
diff changeset
241 rel = (data.event.pageY !== undefined ? data.event.pageY : data.event.originalEvent.pageY) - off.top;
mingchen0919
parents:
diff changeset
242 h = ref.outerHeight();
mingchen0919
parents:
diff changeset
243 if(rel < h / 3) {
mingchen0919
parents:
diff changeset
244 o = ['b', 'i', 'a'];
mingchen0919
parents:
diff changeset
245 }
mingchen0919
parents:
diff changeset
246 else if(rel > h - h / 3) {
mingchen0919
parents:
diff changeset
247 o = ['a', 'i', 'b'];
mingchen0919
parents:
diff changeset
248 }
mingchen0919
parents:
diff changeset
249 else {
mingchen0919
parents:
diff changeset
250 o = rel > h / 2 ? ['i', 'a', 'b'] : ['i', 'b', 'a'];
mingchen0919
parents:
diff changeset
251 }
mingchen0919
parents:
diff changeset
252 $.each(o, function (j, v) {
mingchen0919
parents:
diff changeset
253 switch(v) {
mingchen0919
parents:
diff changeset
254 case 'b':
mingchen0919
parents:
diff changeset
255 l = off.left - 6;
mingchen0919
parents:
diff changeset
256 t = off.top;
mingchen0919
parents:
diff changeset
257 p = ins.get_parent(ref);
mingchen0919
parents:
diff changeset
258 i = ref.parent().index();
mingchen0919
parents:
diff changeset
259 break;
mingchen0919
parents:
diff changeset
260 case 'i':
mingchen0919
parents:
diff changeset
261 ip = ins.settings.dnd.inside_pos;
mingchen0919
parents:
diff changeset
262 tm = ins.get_node(ref.parent());
mingchen0919
parents:
diff changeset
263 l = off.left - 2;
mingchen0919
parents:
diff changeset
264 t = off.top + h / 2 + 1;
mingchen0919
parents:
diff changeset
265 p = tm.id;
mingchen0919
parents:
diff changeset
266 i = ip === 'first' ? 0 : (ip === 'last' ? tm.children.length : Math.min(ip, tm.children.length));
mingchen0919
parents:
diff changeset
267 break;
mingchen0919
parents:
diff changeset
268 case 'a':
mingchen0919
parents:
diff changeset
269 l = off.left - 6;
mingchen0919
parents:
diff changeset
270 t = off.top + h;
mingchen0919
parents:
diff changeset
271 p = ins.get_parent(ref);
mingchen0919
parents:
diff changeset
272 i = ref.parent().index() + 1;
mingchen0919
parents:
diff changeset
273 break;
mingchen0919
parents:
diff changeset
274 }
mingchen0919
parents:
diff changeset
275 ok = true;
mingchen0919
parents:
diff changeset
276 for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) {
mingchen0919
parents:
diff changeset
277 op = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? "copy_node" : "move_node";
mingchen0919
parents:
diff changeset
278 ps = i;
mingchen0919
parents:
diff changeset
279 if(op === "move_node" && v === 'a' && (data.data.origin && data.data.origin === ins) && p === ins.get_parent(data.data.nodes[t1])) {
mingchen0919
parents:
diff changeset
280 pr = ins.get_node(p);
mingchen0919
parents:
diff changeset
281 if(ps > $.inArray(data.data.nodes[t1], pr.children)) {
mingchen0919
parents:
diff changeset
282 ps -= 1;
mingchen0919
parents:
diff changeset
283 }
mingchen0919
parents:
diff changeset
284 }
mingchen0919
parents:
diff changeset
285 ok = ok && ( (ins && ins.settings && ins.settings.dnd && ins.settings.dnd.check_while_dragging === false) || ins.check(op, (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), p, ps, { 'dnd' : true, 'ref' : ins.get_node(ref.parent()), 'pos' : v, 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) }) );
mingchen0919
parents:
diff changeset
286 if(!ok) {
mingchen0919
parents:
diff changeset
287 if(ins && ins.last_error) { laster = ins.last_error(); }
mingchen0919
parents:
diff changeset
288 break;
mingchen0919
parents:
diff changeset
289 }
mingchen0919
parents:
diff changeset
290 }
mingchen0919
parents:
diff changeset
291 if(v === 'i' && ref.parent().is('.jstree-closed') && ins.settings.dnd.open_timeout) {
mingchen0919
parents:
diff changeset
292 if (!data.event || data.event.type !== 'dragover' || isDifferentNode) {
mingchen0919
parents:
diff changeset
293 if (opento) { clearTimeout(opento); }
mingchen0919
parents:
diff changeset
294 opento = setTimeout((function (x, z) { return function () { x.open_node(z); }; }(ins, ref)), ins.settings.dnd.open_timeout);
mingchen0919
parents:
diff changeset
295 }
mingchen0919
parents:
diff changeset
296 }
mingchen0919
parents:
diff changeset
297 if(ok) {
mingchen0919
parents:
diff changeset
298 pn = ins.get_node(p, true);
mingchen0919
parents:
diff changeset
299 if (!pn.hasClass('.jstree-dnd-parent')) {
mingchen0919
parents:
diff changeset
300 $('.jstree-dnd-parent').removeClass('jstree-dnd-parent');
mingchen0919
parents:
diff changeset
301 pn.addClass('jstree-dnd-parent');
mingchen0919
parents:
diff changeset
302 }
mingchen0919
parents:
diff changeset
303 lastmv = { 'ins' : ins, 'par' : p, 'pos' : v === 'i' && ip === 'last' && i === 0 && !ins.is_loaded(tm) ? 'last' : i };
mingchen0919
parents:
diff changeset
304 marker.css({ 'left' : l + 'px', 'top' : t + 'px' }).show();
mingchen0919
parents:
diff changeset
305 data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok');
mingchen0919
parents:
diff changeset
306 if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {
mingchen0919
parents:
diff changeset
307 data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move';
mingchen0919
parents:
diff changeset
308 }
mingchen0919
parents:
diff changeset
309 laster = {};
mingchen0919
parents:
diff changeset
310 o = true;
mingchen0919
parents:
diff changeset
311 return false;
mingchen0919
parents:
diff changeset
312 }
mingchen0919
parents:
diff changeset
313 });
mingchen0919
parents:
diff changeset
314 if(o === true) { return; }
mingchen0919
parents:
diff changeset
315 }
mingchen0919
parents:
diff changeset
316 }
mingchen0919
parents:
diff changeset
317 }
mingchen0919
parents:
diff changeset
318 $('.jstree-dnd-parent').removeClass('jstree-dnd-parent');
mingchen0919
parents:
diff changeset
319 lastmv = false;
mingchen0919
parents:
diff changeset
320 data.helper.find('.jstree-icon').removeClass('jstree-ok').addClass('jstree-er');
mingchen0919
parents:
diff changeset
321 if (data.event.originalEvent && data.event.originalEvent.dataTransfer) {
mingchen0919
parents:
diff changeset
322 data.event.originalEvent.dataTransfer.dropEffect = 'none';
mingchen0919
parents:
diff changeset
323 }
mingchen0919
parents:
diff changeset
324 marker.hide();
mingchen0919
parents:
diff changeset
325 })
mingchen0919
parents:
diff changeset
326 .on('dnd_scroll.vakata.jstree', function (e, data) {
mingchen0919
parents:
diff changeset
327 if(!data || !data.data || !data.data.jstree) { return; }
mingchen0919
parents:
diff changeset
328 marker.hide();
mingchen0919
parents:
diff changeset
329 lastmv = false;
mingchen0919
parents:
diff changeset
330 lastev = false;
mingchen0919
parents:
diff changeset
331 data.helper.find('.jstree-icon').first().removeClass('jstree-ok').addClass('jstree-er');
mingchen0919
parents:
diff changeset
332 })
mingchen0919
parents:
diff changeset
333 .on('dnd_stop.vakata.jstree', function (e, data) {
mingchen0919
parents:
diff changeset
334 $('.jstree-dnd-parent').removeClass('jstree-dnd-parent');
mingchen0919
parents:
diff changeset
335 if(opento) { clearTimeout(opento); }
mingchen0919
parents:
diff changeset
336 if(!data || !data.data || !data.data.jstree) { return; }
mingchen0919
parents:
diff changeset
337 marker.hide().detach();
mingchen0919
parents:
diff changeset
338 var i, j, nodes = [];
mingchen0919
parents:
diff changeset
339 if(lastmv) {
mingchen0919
parents:
diff changeset
340 for(i = 0, j = data.data.nodes.length; i < j; i++) {
mingchen0919
parents:
diff changeset
341 nodes[i] = data.data.origin ? data.data.origin.get_node(data.data.nodes[i]) : data.data.nodes[i];
mingchen0919
parents:
diff changeset
342 }
mingchen0919
parents:
diff changeset
343 lastmv.ins[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? 'copy_node' : 'move_node' ](nodes, lastmv.par, lastmv.pos, false, false, false, data.data.origin);
mingchen0919
parents:
diff changeset
344 }
mingchen0919
parents:
diff changeset
345 else {
mingchen0919
parents:
diff changeset
346 i = $(data.event.target).closest('.jstree');
mingchen0919
parents:
diff changeset
347 if(i.length && laster && laster.error && laster.error === 'check') {
mingchen0919
parents:
diff changeset
348 i = i.jstree(true);
mingchen0919
parents:
diff changeset
349 if(i) {
mingchen0919
parents:
diff changeset
350 i.settings.core.error.call(this, laster);
mingchen0919
parents:
diff changeset
351 }
mingchen0919
parents:
diff changeset
352 }
mingchen0919
parents:
diff changeset
353 }
mingchen0919
parents:
diff changeset
354 lastev = false;
mingchen0919
parents:
diff changeset
355 lastmv = false;
mingchen0919
parents:
diff changeset
356 })
mingchen0919
parents:
diff changeset
357 .on('keyup.jstree keydown.jstree', function (e, data) {
mingchen0919
parents:
diff changeset
358 data = $.vakata.dnd._get();
mingchen0919
parents:
diff changeset
359 if(data && data.data && data.data.jstree) {
mingchen0919
parents:
diff changeset
360 if (e.type === "keyup" && e.which === 27) {
mingchen0919
parents:
diff changeset
361 if (opento) { clearTimeout(opento); }
mingchen0919
parents:
diff changeset
362 lastmv = false;
mingchen0919
parents:
diff changeset
363 laster = false;
mingchen0919
parents:
diff changeset
364 lastev = false;
mingchen0919
parents:
diff changeset
365 opento = false;
mingchen0919
parents:
diff changeset
366 marker.hide().detach();
mingchen0919
parents:
diff changeset
367 $.vakata.dnd._clean();
mingchen0919
parents:
diff changeset
368 } else {
mingchen0919
parents:
diff changeset
369 data.helper.find('.jstree-copy').first()[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (e.metaKey || e.ctrlKey))) ? 'show' : 'hide' ]();
mingchen0919
parents:
diff changeset
370 if(lastev) {
mingchen0919
parents:
diff changeset
371 lastev.metaKey = e.metaKey;
mingchen0919
parents:
diff changeset
372 lastev.ctrlKey = e.ctrlKey;
mingchen0919
parents:
diff changeset
373 $.vakata.dnd._trigger('move', lastev);
mingchen0919
parents:
diff changeset
374 }
mingchen0919
parents:
diff changeset
375 }
mingchen0919
parents:
diff changeset
376 }
mingchen0919
parents:
diff changeset
377 });
mingchen0919
parents:
diff changeset
378 });
mingchen0919
parents:
diff changeset
379
mingchen0919
parents:
diff changeset
380 // helpers
mingchen0919
parents:
diff changeset
381 (function ($) {
mingchen0919
parents:
diff changeset
382 $.vakata.html = {
mingchen0919
parents:
diff changeset
383 div : $('<div />'),
mingchen0919
parents:
diff changeset
384 escape : function (str) {
mingchen0919
parents:
diff changeset
385 return $.vakata.html.div.text(str).html();
mingchen0919
parents:
diff changeset
386 },
mingchen0919
parents:
diff changeset
387 strip : function (str) {
mingchen0919
parents:
diff changeset
388 return $.vakata.html.div.empty().append($.parseHTML(str)).text();
mingchen0919
parents:
diff changeset
389 }
mingchen0919
parents:
diff changeset
390 };
mingchen0919
parents:
diff changeset
391 // private variable
mingchen0919
parents:
diff changeset
392 var vakata_dnd = {
mingchen0919
parents:
diff changeset
393 element : false,
mingchen0919
parents:
diff changeset
394 target : false,
mingchen0919
parents:
diff changeset
395 is_down : false,
mingchen0919
parents:
diff changeset
396 is_drag : false,
mingchen0919
parents:
diff changeset
397 helper : false,
mingchen0919
parents:
diff changeset
398 helper_w: 0,
mingchen0919
parents:
diff changeset
399 data : false,
mingchen0919
parents:
diff changeset
400 init_x : 0,
mingchen0919
parents:
diff changeset
401 init_y : 0,
mingchen0919
parents:
diff changeset
402 scroll_l: 0,
mingchen0919
parents:
diff changeset
403 scroll_t: 0,
mingchen0919
parents:
diff changeset
404 scroll_e: false,
mingchen0919
parents:
diff changeset
405 scroll_i: false,
mingchen0919
parents:
diff changeset
406 is_touch: false
mingchen0919
parents:
diff changeset
407 };
mingchen0919
parents:
diff changeset
408 $.vakata.dnd = {
mingchen0919
parents:
diff changeset
409 settings : {
mingchen0919
parents:
diff changeset
410 scroll_speed : 10,
mingchen0919
parents:
diff changeset
411 scroll_proximity : 20,
mingchen0919
parents:
diff changeset
412 helper_left : 5,
mingchen0919
parents:
diff changeset
413 helper_top : 10,
mingchen0919
parents:
diff changeset
414 threshold : 5,
mingchen0919
parents:
diff changeset
415 threshold_touch : 10
mingchen0919
parents:
diff changeset
416 },
mingchen0919
parents:
diff changeset
417 _trigger : function (event_name, e, data) {
mingchen0919
parents:
diff changeset
418 if (data === undefined) {
mingchen0919
parents:
diff changeset
419 data = $.vakata.dnd._get();
mingchen0919
parents:
diff changeset
420 }
mingchen0919
parents:
diff changeset
421 data.event = e;
mingchen0919
parents:
diff changeset
422 $(document).triggerHandler("dnd_" + event_name + ".vakata", data);
mingchen0919
parents:
diff changeset
423 },
mingchen0919
parents:
diff changeset
424 _get : function () {
mingchen0919
parents:
diff changeset
425 return {
mingchen0919
parents:
diff changeset
426 "data" : vakata_dnd.data,
mingchen0919
parents:
diff changeset
427 "element" : vakata_dnd.element,
mingchen0919
parents:
diff changeset
428 "helper" : vakata_dnd.helper
mingchen0919
parents:
diff changeset
429 };
mingchen0919
parents:
diff changeset
430 },
mingchen0919
parents:
diff changeset
431 _clean : function () {
mingchen0919
parents:
diff changeset
432 if(vakata_dnd.helper) { vakata_dnd.helper.remove(); }
mingchen0919
parents:
diff changeset
433 if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; }
mingchen0919
parents:
diff changeset
434 vakata_dnd = {
mingchen0919
parents:
diff changeset
435 element : false,
mingchen0919
parents:
diff changeset
436 target : false,
mingchen0919
parents:
diff changeset
437 is_down : false,
mingchen0919
parents:
diff changeset
438 is_drag : false,
mingchen0919
parents:
diff changeset
439 helper : false,
mingchen0919
parents:
diff changeset
440 helper_w: 0,
mingchen0919
parents:
diff changeset
441 data : false,
mingchen0919
parents:
diff changeset
442 init_x : 0,
mingchen0919
parents:
diff changeset
443 init_y : 0,
mingchen0919
parents:
diff changeset
444 scroll_l: 0,
mingchen0919
parents:
diff changeset
445 scroll_t: 0,
mingchen0919
parents:
diff changeset
446 scroll_e: false,
mingchen0919
parents:
diff changeset
447 scroll_i: false,
mingchen0919
parents:
diff changeset
448 is_touch: false
mingchen0919
parents:
diff changeset
449 };
mingchen0919
parents:
diff changeset
450 $(document).off("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag);
mingchen0919
parents:
diff changeset
451 $(document).off("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop);
mingchen0919
parents:
diff changeset
452 },
mingchen0919
parents:
diff changeset
453 _scroll : function (init_only) {
mingchen0919
parents:
diff changeset
454 if(!vakata_dnd.scroll_e || (!vakata_dnd.scroll_l && !vakata_dnd.scroll_t)) {
mingchen0919
parents:
diff changeset
455 if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; }
mingchen0919
parents:
diff changeset
456 return false;
mingchen0919
parents:
diff changeset
457 }
mingchen0919
parents:
diff changeset
458 if(!vakata_dnd.scroll_i) {
mingchen0919
parents:
diff changeset
459 vakata_dnd.scroll_i = setInterval($.vakata.dnd._scroll, 100);
mingchen0919
parents:
diff changeset
460 return false;
mingchen0919
parents:
diff changeset
461 }
mingchen0919
parents:
diff changeset
462 if(init_only === true) { return false; }
mingchen0919
parents:
diff changeset
463
mingchen0919
parents:
diff changeset
464 var i = vakata_dnd.scroll_e.scrollTop(),
mingchen0919
parents:
diff changeset
465 j = vakata_dnd.scroll_e.scrollLeft();
mingchen0919
parents:
diff changeset
466 vakata_dnd.scroll_e.scrollTop(i + vakata_dnd.scroll_t * $.vakata.dnd.settings.scroll_speed);
mingchen0919
parents:
diff changeset
467 vakata_dnd.scroll_e.scrollLeft(j + vakata_dnd.scroll_l * $.vakata.dnd.settings.scroll_speed);
mingchen0919
parents:
diff changeset
468 if(i !== vakata_dnd.scroll_e.scrollTop() || j !== vakata_dnd.scroll_e.scrollLeft()) {
mingchen0919
parents:
diff changeset
469 /**
mingchen0919
parents:
diff changeset
470 * triggered on the document when a drag causes an element to scroll
mingchen0919
parents:
diff changeset
471 * @event
mingchen0919
parents:
diff changeset
472 * @plugin dnd
mingchen0919
parents:
diff changeset
473 * @name dnd_scroll.vakata
mingchen0919
parents:
diff changeset
474 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
mingchen0919
parents:
diff changeset
475 * @param {DOM} element the DOM element being dragged
mingchen0919
parents:
diff changeset
476 * @param {jQuery} helper the helper shown next to the mouse
mingchen0919
parents:
diff changeset
477 * @param {jQuery} event the element that is scrolling
mingchen0919
parents:
diff changeset
478 */
mingchen0919
parents:
diff changeset
479 $.vakata.dnd._trigger("scroll", vakata_dnd.scroll_e);
mingchen0919
parents:
diff changeset
480 }
mingchen0919
parents:
diff changeset
481 },
mingchen0919
parents:
diff changeset
482 start : function (e, data, html) {
mingchen0919
parents:
diff changeset
483 if(e.type === "touchstart" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
mingchen0919
parents:
diff changeset
484 e.pageX = e.originalEvent.changedTouches[0].pageX;
mingchen0919
parents:
diff changeset
485 e.pageY = e.originalEvent.changedTouches[0].pageY;
mingchen0919
parents:
diff changeset
486 e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
mingchen0919
parents:
diff changeset
487 }
mingchen0919
parents:
diff changeset
488 if(vakata_dnd.is_drag) { $.vakata.dnd.stop({}); }
mingchen0919
parents:
diff changeset
489 try {
mingchen0919
parents:
diff changeset
490 e.currentTarget.unselectable = "on";
mingchen0919
parents:
diff changeset
491 e.currentTarget.onselectstart = function() { return false; };
mingchen0919
parents:
diff changeset
492 if(e.currentTarget.style) {
mingchen0919
parents:
diff changeset
493 e.currentTarget.style.touchAction = "none";
mingchen0919
parents:
diff changeset
494 e.currentTarget.style.msTouchAction = "none";
mingchen0919
parents:
diff changeset
495 e.currentTarget.style.MozUserSelect = "none";
mingchen0919
parents:
diff changeset
496 }
mingchen0919
parents:
diff changeset
497 } catch(ignore) { }
mingchen0919
parents:
diff changeset
498 vakata_dnd.init_x = e.pageX;
mingchen0919
parents:
diff changeset
499 vakata_dnd.init_y = e.pageY;
mingchen0919
parents:
diff changeset
500 vakata_dnd.data = data;
mingchen0919
parents:
diff changeset
501 vakata_dnd.is_down = true;
mingchen0919
parents:
diff changeset
502 vakata_dnd.element = e.currentTarget;
mingchen0919
parents:
diff changeset
503 vakata_dnd.target = e.target;
mingchen0919
parents:
diff changeset
504 vakata_dnd.is_touch = e.type === "touchstart";
mingchen0919
parents:
diff changeset
505 if(html !== false) {
mingchen0919
parents:
diff changeset
506 vakata_dnd.helper = $("<div id='vakata-dnd'></div>").html(html).css({
mingchen0919
parents:
diff changeset
507 "display" : "block",
mingchen0919
parents:
diff changeset
508 "margin" : "0",
mingchen0919
parents:
diff changeset
509 "padding" : "0",
mingchen0919
parents:
diff changeset
510 "position" : "absolute",
mingchen0919
parents:
diff changeset
511 "top" : "-2000px",
mingchen0919
parents:
diff changeset
512 "lineHeight" : "16px",
mingchen0919
parents:
diff changeset
513 "zIndex" : "10000"
mingchen0919
parents:
diff changeset
514 });
mingchen0919
parents:
diff changeset
515 }
mingchen0919
parents:
diff changeset
516 $(document).on("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag);
mingchen0919
parents:
diff changeset
517 $(document).on("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop);
mingchen0919
parents:
diff changeset
518 return false;
mingchen0919
parents:
diff changeset
519 },
mingchen0919
parents:
diff changeset
520 drag : function (e) {
mingchen0919
parents:
diff changeset
521 if(e.type === "touchmove" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
mingchen0919
parents:
diff changeset
522 e.pageX = e.originalEvent.changedTouches[0].pageX;
mingchen0919
parents:
diff changeset
523 e.pageY = e.originalEvent.changedTouches[0].pageY;
mingchen0919
parents:
diff changeset
524 e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
mingchen0919
parents:
diff changeset
525 }
mingchen0919
parents:
diff changeset
526 if(!vakata_dnd.is_down) { return; }
mingchen0919
parents:
diff changeset
527 if(!vakata_dnd.is_drag) {
mingchen0919
parents:
diff changeset
528 if(
mingchen0919
parents:
diff changeset
529 Math.abs(e.pageX - vakata_dnd.init_x) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) ||
mingchen0919
parents:
diff changeset
530 Math.abs(e.pageY - vakata_dnd.init_y) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold)
mingchen0919
parents:
diff changeset
531 ) {
mingchen0919
parents:
diff changeset
532 if(vakata_dnd.helper) {
mingchen0919
parents:
diff changeset
533 vakata_dnd.helper.appendTo("body");
mingchen0919
parents:
diff changeset
534 vakata_dnd.helper_w = vakata_dnd.helper.outerWidth();
mingchen0919
parents:
diff changeset
535 }
mingchen0919
parents:
diff changeset
536 vakata_dnd.is_drag = true;
mingchen0919
parents:
diff changeset
537 $(vakata_dnd.target).one('click.vakata', false);
mingchen0919
parents:
diff changeset
538 /**
mingchen0919
parents:
diff changeset
539 * triggered on the document when a drag starts
mingchen0919
parents:
diff changeset
540 * @event
mingchen0919
parents:
diff changeset
541 * @plugin dnd
mingchen0919
parents:
diff changeset
542 * @name dnd_start.vakata
mingchen0919
parents:
diff changeset
543 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
mingchen0919
parents:
diff changeset
544 * @param {DOM} element the DOM element being dragged
mingchen0919
parents:
diff changeset
545 * @param {jQuery} helper the helper shown next to the mouse
mingchen0919
parents:
diff changeset
546 * @param {Object} event the event that caused the start (probably mousemove)
mingchen0919
parents:
diff changeset
547 */
mingchen0919
parents:
diff changeset
548 $.vakata.dnd._trigger("start", e);
mingchen0919
parents:
diff changeset
549 }
mingchen0919
parents:
diff changeset
550 else { return; }
mingchen0919
parents:
diff changeset
551 }
mingchen0919
parents:
diff changeset
552
mingchen0919
parents:
diff changeset
553 var d = false, w = false,
mingchen0919
parents:
diff changeset
554 dh = false, wh = false,
mingchen0919
parents:
diff changeset
555 dw = false, ww = false,
mingchen0919
parents:
diff changeset
556 dt = false, dl = false,
mingchen0919
parents:
diff changeset
557 ht = false, hl = false;
mingchen0919
parents:
diff changeset
558
mingchen0919
parents:
diff changeset
559 vakata_dnd.scroll_t = 0;
mingchen0919
parents:
diff changeset
560 vakata_dnd.scroll_l = 0;
mingchen0919
parents:
diff changeset
561 vakata_dnd.scroll_e = false;
mingchen0919
parents:
diff changeset
562 $($(e.target).parentsUntil("body").addBack().get().reverse())
mingchen0919
parents:
diff changeset
563 .filter(function () {
mingchen0919
parents:
diff changeset
564 return (/^auto|scroll$/).test($(this).css("overflow")) &&
mingchen0919
parents:
diff changeset
565 (this.scrollHeight > this.offsetHeight || this.scrollWidth > this.offsetWidth);
mingchen0919
parents:
diff changeset
566 })
mingchen0919
parents:
diff changeset
567 .each(function () {
mingchen0919
parents:
diff changeset
568 var t = $(this), o = t.offset();
mingchen0919
parents:
diff changeset
569 if(this.scrollHeight > this.offsetHeight) {
mingchen0919
parents:
diff changeset
570 if(o.top + t.height() - e.pageY < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = 1; }
mingchen0919
parents:
diff changeset
571 if(e.pageY - o.top < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = -1; }
mingchen0919
parents:
diff changeset
572 }
mingchen0919
parents:
diff changeset
573 if(this.scrollWidth > this.offsetWidth) {
mingchen0919
parents:
diff changeset
574 if(o.left + t.width() - e.pageX < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = 1; }
mingchen0919
parents:
diff changeset
575 if(e.pageX - o.left < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = -1; }
mingchen0919
parents:
diff changeset
576 }
mingchen0919
parents:
diff changeset
577 if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) {
mingchen0919
parents:
diff changeset
578 vakata_dnd.scroll_e = $(this);
mingchen0919
parents:
diff changeset
579 return false;
mingchen0919
parents:
diff changeset
580 }
mingchen0919
parents:
diff changeset
581 });
mingchen0919
parents:
diff changeset
582
mingchen0919
parents:
diff changeset
583 if(!vakata_dnd.scroll_e) {
mingchen0919
parents:
diff changeset
584 d = $(document); w = $(window);
mingchen0919
parents:
diff changeset
585 dh = d.height(); wh = w.height();
mingchen0919
parents:
diff changeset
586 dw = d.width(); ww = w.width();
mingchen0919
parents:
diff changeset
587 dt = d.scrollTop(); dl = d.scrollLeft();
mingchen0919
parents:
diff changeset
588 if(dh > wh && e.pageY - dt < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = -1; }
mingchen0919
parents:
diff changeset
589 if(dh > wh && wh - (e.pageY - dt) < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = 1; }
mingchen0919
parents:
diff changeset
590 if(dw > ww && e.pageX - dl < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = -1; }
mingchen0919
parents:
diff changeset
591 if(dw > ww && ww - (e.pageX - dl) < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = 1; }
mingchen0919
parents:
diff changeset
592 if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) {
mingchen0919
parents:
diff changeset
593 vakata_dnd.scroll_e = d;
mingchen0919
parents:
diff changeset
594 }
mingchen0919
parents:
diff changeset
595 }
mingchen0919
parents:
diff changeset
596 if(vakata_dnd.scroll_e) { $.vakata.dnd._scroll(true); }
mingchen0919
parents:
diff changeset
597
mingchen0919
parents:
diff changeset
598 if(vakata_dnd.helper) {
mingchen0919
parents:
diff changeset
599 ht = parseInt(e.pageY + $.vakata.dnd.settings.helper_top, 10);
mingchen0919
parents:
diff changeset
600 hl = parseInt(e.pageX + $.vakata.dnd.settings.helper_left, 10);
mingchen0919
parents:
diff changeset
601 if(dh && ht + 25 > dh) { ht = dh - 50; }
mingchen0919
parents:
diff changeset
602 if(dw && hl + vakata_dnd.helper_w > dw) { hl = dw - (vakata_dnd.helper_w + 2); }
mingchen0919
parents:
diff changeset
603 vakata_dnd.helper.css({
mingchen0919
parents:
diff changeset
604 left : hl + "px",
mingchen0919
parents:
diff changeset
605 top : ht + "px"
mingchen0919
parents:
diff changeset
606 });
mingchen0919
parents:
diff changeset
607 }
mingchen0919
parents:
diff changeset
608 /**
mingchen0919
parents:
diff changeset
609 * triggered on the document when a drag is in progress
mingchen0919
parents:
diff changeset
610 * @event
mingchen0919
parents:
diff changeset
611 * @plugin dnd
mingchen0919
parents:
diff changeset
612 * @name dnd_move.vakata
mingchen0919
parents:
diff changeset
613 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
mingchen0919
parents:
diff changeset
614 * @param {DOM} element the DOM element being dragged
mingchen0919
parents:
diff changeset
615 * @param {jQuery} helper the helper shown next to the mouse
mingchen0919
parents:
diff changeset
616 * @param {Object} event the event that caused this to trigger (most likely mousemove)
mingchen0919
parents:
diff changeset
617 */
mingchen0919
parents:
diff changeset
618 $.vakata.dnd._trigger("move", e);
mingchen0919
parents:
diff changeset
619 return false;
mingchen0919
parents:
diff changeset
620 },
mingchen0919
parents:
diff changeset
621 stop : function (e) {
mingchen0919
parents:
diff changeset
622 if(e.type === "touchend" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) {
mingchen0919
parents:
diff changeset
623 e.pageX = e.originalEvent.changedTouches[0].pageX;
mingchen0919
parents:
diff changeset
624 e.pageY = e.originalEvent.changedTouches[0].pageY;
mingchen0919
parents:
diff changeset
625 e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset);
mingchen0919
parents:
diff changeset
626 }
mingchen0919
parents:
diff changeset
627 if(vakata_dnd.is_drag) {
mingchen0919
parents:
diff changeset
628 /**
mingchen0919
parents:
diff changeset
629 * triggered on the document when a drag stops (the dragged element is dropped)
mingchen0919
parents:
diff changeset
630 * @event
mingchen0919
parents:
diff changeset
631 * @plugin dnd
mingchen0919
parents:
diff changeset
632 * @name dnd_stop.vakata
mingchen0919
parents:
diff changeset
633 * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start
mingchen0919
parents:
diff changeset
634 * @param {DOM} element the DOM element being dragged
mingchen0919
parents:
diff changeset
635 * @param {jQuery} helper the helper shown next to the mouse
mingchen0919
parents:
diff changeset
636 * @param {Object} event the event that caused the stop
mingchen0919
parents:
diff changeset
637 */
mingchen0919
parents:
diff changeset
638 if (e.target !== vakata_dnd.target) {
mingchen0919
parents:
diff changeset
639 $(vakata_dnd.target).off('click.vakata');
mingchen0919
parents:
diff changeset
640 }
mingchen0919
parents:
diff changeset
641 $.vakata.dnd._trigger("stop", e);
mingchen0919
parents:
diff changeset
642 }
mingchen0919
parents:
diff changeset
643 else {
mingchen0919
parents:
diff changeset
644 if(e.type === "touchend" && e.target === vakata_dnd.target) {
mingchen0919
parents:
diff changeset
645 var to = setTimeout(function () { $(e.target).click(); }, 100);
mingchen0919
parents:
diff changeset
646 $(e.target).one('click', function() { if(to) { clearTimeout(to); } });
mingchen0919
parents:
diff changeset
647 }
mingchen0919
parents:
diff changeset
648 }
mingchen0919
parents:
diff changeset
649 $.vakata.dnd._clean();
mingchen0919
parents:
diff changeset
650 return false;
mingchen0919
parents:
diff changeset
651 }
mingchen0919
parents:
diff changeset
652 };
mingchen0919
parents:
diff changeset
653 }($));
mingchen0919
parents:
diff changeset
654
mingchen0919
parents:
diff changeset
655 // include the dnd plugin by default
mingchen0919
parents:
diff changeset
656 // $.jstree.defaults.plugins.push("dnd");
mingchen0919
parents:
diff changeset
657 }));