0
|
1 /*
|
|
2 * jQuery UI Selectable 1.8.11
|
|
3 *
|
|
4 * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
|
|
5 * Dual licensed under the MIT or GPL Version 2 licenses.
|
|
6 * http://jquery.org/license
|
|
7 *
|
|
8 * http://docs.jquery.com/UI/Selectables
|
|
9 *
|
|
10 * Depends:
|
|
11 * jquery.ui.core.js
|
|
12 * jquery.ui.mouse.js
|
|
13 * jquery.ui.widget.js
|
|
14 */
|
|
15 (function( $, undefined ) {
|
|
16
|
|
17 $.widget("ui.selectable", $.ui.mouse, {
|
|
18 options: {
|
|
19 appendTo: 'body',
|
|
20 autoRefresh: true,
|
|
21 distance: 0,
|
|
22 filter: '*',
|
|
23 tolerance: 'touch'
|
|
24 },
|
|
25 _create: function() {
|
|
26 var self = this;
|
|
27
|
|
28 this.element.addClass("ui-selectable");
|
|
29
|
|
30 this.dragged = false;
|
|
31
|
|
32 // cache selectee children based on filter
|
|
33 var selectees;
|
|
34 this.refresh = function() {
|
|
35 selectees = $(self.options.filter, self.element[0]);
|
|
36 selectees.each(function() {
|
|
37 var $this = $(this);
|
|
38 var pos = $this.offset();
|
|
39 $.data(this, "selectable-item", {
|
|
40 element: this,
|
|
41 $element: $this,
|
|
42 left: pos.left,
|
|
43 top: pos.top,
|
|
44 right: pos.left + $this.outerWidth(),
|
|
45 bottom: pos.top + $this.outerHeight(),
|
|
46 startselected: false,
|
|
47 selected: $this.hasClass('ui-selected'),
|
|
48 selecting: $this.hasClass('ui-selecting'),
|
|
49 unselecting: $this.hasClass('ui-unselecting')
|
|
50 });
|
|
51 });
|
|
52 };
|
|
53 this.refresh();
|
|
54
|
|
55 this.selectees = selectees.addClass("ui-selectee");
|
|
56
|
|
57 this._mouseInit();
|
|
58
|
|
59 this.helper = $("<div class='ui-selectable-helper'></div>");
|
|
60 },
|
|
61
|
|
62 destroy: function() {
|
|
63 this.selectees
|
|
64 .removeClass("ui-selectee")
|
|
65 .removeData("selectable-item");
|
|
66 this.element
|
|
67 .removeClass("ui-selectable ui-selectable-disabled")
|
|
68 .removeData("selectable")
|
|
69 .unbind(".selectable");
|
|
70 this._mouseDestroy();
|
|
71
|
|
72 return this;
|
|
73 },
|
|
74
|
|
75 _mouseStart: function(event) {
|
|
76 var self = this;
|
|
77
|
|
78 this.opos = [event.pageX, event.pageY];
|
|
79
|
|
80 if (this.options.disabled)
|
|
81 return;
|
|
82
|
|
83 var options = this.options;
|
|
84
|
|
85 this.selectees = $(options.filter, this.element[0]);
|
|
86
|
|
87 this._trigger("start", event);
|
|
88
|
|
89 $(options.appendTo).append(this.helper);
|
|
90 // position helper (lasso)
|
|
91 this.helper.css({
|
|
92 "left": event.clientX,
|
|
93 "top": event.clientY,
|
|
94 "width": 0,
|
|
95 "height": 0
|
|
96 });
|
|
97
|
|
98 if (options.autoRefresh) {
|
|
99 this.refresh();
|
|
100 }
|
|
101
|
|
102 this.selectees.filter('.ui-selected').each(function() {
|
|
103 var selectee = $.data(this, "selectable-item");
|
|
104 selectee.startselected = true;
|
|
105 if (!event.metaKey) {
|
|
106 selectee.$element.removeClass('ui-selected');
|
|
107 selectee.selected = false;
|
|
108 selectee.$element.addClass('ui-unselecting');
|
|
109 selectee.unselecting = true;
|
|
110 // selectable UNSELECTING callback
|
|
111 self._trigger("unselecting", event, {
|
|
112 unselecting: selectee.element
|
|
113 });
|
|
114 }
|
|
115 });
|
|
116
|
|
117 $(event.target).parents().andSelf().each(function() {
|
|
118 var selectee = $.data(this, "selectable-item");
|
|
119 if (selectee) {
|
|
120 var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
|
|
121 selectee.$element
|
|
122 .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
|
|
123 .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
|
|
124 selectee.unselecting = !doSelect;
|
|
125 selectee.selecting = doSelect;
|
|
126 selectee.selected = doSelect;
|
|
127 // selectable (UN)SELECTING callback
|
|
128 if (doSelect) {
|
|
129 self._trigger("selecting", event, {
|
|
130 selecting: selectee.element
|
|
131 });
|
|
132 } else {
|
|
133 self._trigger("unselecting", event, {
|
|
134 unselecting: selectee.element
|
|
135 });
|
|
136 }
|
|
137 return false;
|
|
138 }
|
|
139 });
|
|
140
|
|
141 },
|
|
142
|
|
143 _mouseDrag: function(event) {
|
|
144 var self = this;
|
|
145 this.dragged = true;
|
|
146
|
|
147 if (this.options.disabled)
|
|
148 return;
|
|
149
|
|
150 var options = this.options;
|
|
151
|
|
152 var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
|
|
153 if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
|
|
154 if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
|
|
155 this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
|
|
156
|
|
157 this.selectees.each(function() {
|
|
158 var selectee = $.data(this, "selectable-item");
|
|
159 //prevent helper from being selected if appendTo: selectable
|
|
160 if (!selectee || selectee.element == self.element[0])
|
|
161 return;
|
|
162 var hit = false;
|
|
163 if (options.tolerance == 'touch') {
|
|
164 hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
|
|
165 } else if (options.tolerance == 'fit') {
|
|
166 hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
|
|
167 }
|
|
168
|
|
169 if (hit) {
|
|
170 // SELECT
|
|
171 if (selectee.selected) {
|
|
172 selectee.$element.removeClass('ui-selected');
|
|
173 selectee.selected = false;
|
|
174 }
|
|
175 if (selectee.unselecting) {
|
|
176 selectee.$element.removeClass('ui-unselecting');
|
|
177 selectee.unselecting = false;
|
|
178 }
|
|
179 if (!selectee.selecting) {
|
|
180 selectee.$element.addClass('ui-selecting');
|
|
181 selectee.selecting = true;
|
|
182 // selectable SELECTING callback
|
|
183 self._trigger("selecting", event, {
|
|
184 selecting: selectee.element
|
|
185 });
|
|
186 }
|
|
187 } else {
|
|
188 // UNSELECT
|
|
189 if (selectee.selecting) {
|
|
190 if (event.metaKey && selectee.startselected) {
|
|
191 selectee.$element.removeClass('ui-selecting');
|
|
192 selectee.selecting = false;
|
|
193 selectee.$element.addClass('ui-selected');
|
|
194 selectee.selected = true;
|
|
195 } else {
|
|
196 selectee.$element.removeClass('ui-selecting');
|
|
197 selectee.selecting = false;
|
|
198 if (selectee.startselected) {
|
|
199 selectee.$element.addClass('ui-unselecting');
|
|
200 selectee.unselecting = true;
|
|
201 }
|
|
202 // selectable UNSELECTING callback
|
|
203 self._trigger("unselecting", event, {
|
|
204 unselecting: selectee.element
|
|
205 });
|
|
206 }
|
|
207 }
|
|
208 if (selectee.selected) {
|
|
209 if (!event.metaKey && !selectee.startselected) {
|
|
210 selectee.$element.removeClass('ui-selected');
|
|
211 selectee.selected = false;
|
|
212
|
|
213 selectee.$element.addClass('ui-unselecting');
|
|
214 selectee.unselecting = true;
|
|
215 // selectable UNSELECTING callback
|
|
216 self._trigger("unselecting", event, {
|
|
217 unselecting: selectee.element
|
|
218 });
|
|
219 }
|
|
220 }
|
|
221 }
|
|
222 });
|
|
223
|
|
224 return false;
|
|
225 },
|
|
226
|
|
227 _mouseStop: function(event) {
|
|
228 var self = this;
|
|
229
|
|
230 this.dragged = false;
|
|
231
|
|
232 var options = this.options;
|
|
233
|
|
234 $('.ui-unselecting', this.element[0]).each(function() {
|
|
235 var selectee = $.data(this, "selectable-item");
|
|
236 selectee.$element.removeClass('ui-unselecting');
|
|
237 selectee.unselecting = false;
|
|
238 selectee.startselected = false;
|
|
239 self._trigger("unselected", event, {
|
|
240 unselected: selectee.element
|
|
241 });
|
|
242 });
|
|
243 $('.ui-selecting', this.element[0]).each(function() {
|
|
244 var selectee = $.data(this, "selectable-item");
|
|
245 selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
|
|
246 selectee.selecting = false;
|
|
247 selectee.selected = true;
|
|
248 selectee.startselected = true;
|
|
249 self._trigger("selected", event, {
|
|
250 selected: selectee.element
|
|
251 });
|
|
252 });
|
|
253 this._trigger("stop", event);
|
|
254
|
|
255 this.helper.remove();
|
|
256
|
|
257 return false;
|
|
258 }
|
|
259
|
|
260 });
|
|
261
|
|
262 $.extend($.ui.selectable, {
|
|
263 version: "1.8.11"
|
|
264 });
|
|
265
|
|
266 })(jQuery);
|