]> git.proxmox.com Git - extjs.git/blame - extjs/modern/modern/src/util/Droppable.js
add extjs 6.0.1 sources
[extjs.git] / extjs / modern / modern / src / util / Droppable.js
CommitLineData
6527f429
DM
1/**\r
2 *\r
3 */\r
4Ext.define('Ext.util.Droppable', {\r
5 mixins: {\r
6 observable: 'Ext.mixin.Observable'\r
7 },\r
8\r
9 config: {\r
10 /**\r
11 * The base CSS class to apply to this component's element.\r
12 * This will also be prepended to other elements within this component.\r
13 */\r
14 baseCls: Ext.baseCSSPrefix + 'droppable'\r
15 },\r
16\r
17 /**\r
18 * @cfg {String} activeCls\r
19 * The CSS added to a Droppable when a Draggable in the same group is being\r
20 * dragged.\r
21 */\r
22 activeCls: Ext.baseCSSPrefix + 'drop-active',\r
23\r
24 /**\r
25 * @cfg {String} invalidCls\r
26 * The CSS class to add to the droppable when dragging a draggable that is\r
27 * not in the same group.\r
28 */\r
29 invalidCls: Ext.baseCSSPrefix + 'drop-invalid',\r
30\r
31 /**\r
32 * @cfg {String} hoverCls\r
33 * The CSS class to add to the droppable when hovering over a valid drop.\r
34 */\r
35 hoverCls: Ext.baseCSSPrefix + 'drop-hover',\r
36\r
37 /**\r
38 * @cfg {String} validDropMode\r
39 * Determines when a drop is considered 'valid' whether it simply need to\r
40 * intersect the region or if it needs to be contained within the region.\r
41 * Valid values are: 'intersects' or 'contains'\r
42 */\r
43 validDropMode: 'intersect',\r
44\r
45 /**\r
46 * @cfg {Boolean} disabled\r
47 */\r
48 disabled: false,\r
49\r
50 /**\r
51 * @cfg {String} group\r
52 * Draggable and Droppable objects can participate in a group which are\r
53 * capable of interacting.\r
54 */\r
55 group: 'base',\r
56\r
57 // not yet implemented\r
58 tolerance: null,\r
59\r
60 /**\r
61 * @private\r
62 */\r
63 monitoring: false,\r
64\r
65 /**\r
66 * Creates new Droppable.\r
67 * @param {Mixed} el String, HtmlElement or Ext.Element representing an\r
68 * element on the page.\r
69 * @param {Object} config Configuration options for this class.\r
70 */\r
71 constructor: function(el, config) {\r
72 var me = this;\r
73\r
74 config = config || {};\r
75 Ext.apply(me, config);\r
76\r
77 /**\r
78 * @event dropactivate\r
79 * @param {Ext.util.Droppable} this\r
80 * @param {Ext.util.Draggable} draggable\r
81 * @param {Ext.event.Event} e\r
82 */\r
83\r
84 /**\r
85 * @event dropdeactivate\r
86 * @param {Ext.util.Droppable} this\r
87 * @param {Ext.util.Draggable} draggable\r
88 * @param {Ext.event.Event} e\r
89 */\r
90\r
91 /**\r
92 * @event dropenter\r
93 * @param {Ext.util.Droppable} this\r
94 * @param {Ext.util.Draggable} draggable\r
95 * @param {Ext.event.Event} e\r
96 */\r
97\r
98 /**\r
99 * @event dropleave\r
100 * @param {Ext.util.Droppable} this\r
101 * @param {Ext.util.Draggable} draggable\r
102 * @param {Ext.event.Event} e\r
103 */\r
104\r
105 /**\r
106 * @event drop\r
107 * @param {Ext.util.Droppable} this\r
108 * @param {Ext.util.Draggable} draggable\r
109 * @param {Ext.event.Event} e\r
110 */\r
111\r
112 me.el = Ext.get(el);\r
113 me.callParent();\r
114\r
115 me.mixins.observable.constructor.call(me);\r
116\r
117 if (!me.disabled) {\r
118 me.enable();\r
119 }\r
120\r
121 me.el.addCls(me.baseCls);\r
122 },\r
123\r
124 /**\r
125 * @private\r
126 */\r
127 onDragStart: function(draggable, e) {\r
128 if (draggable.group === this.group) {\r
129 this.monitoring = true;\r
130 this.el.addCls(this.activeCls);\r
131 this.region = this.el.getBox(true);\r
132\r
133 draggable.on({\r
134 drag: this.onDrag,\r
135 beforedragend: this.onBeforeDragEnd,\r
136 dragend: this.onDragEnd,\r
137 scope: this\r
138 });\r
139\r
140 if (this.isDragOver(draggable)) {\r
141 this.setCanDrop(true, draggable, e);\r
142 }\r
143\r
144 this.fireEvent('dropactivate', this, draggable, e);\r
145 }\r
146 else {\r
147 draggable.on({\r
148 dragend: function() {\r
149 this.el.removeCls(this.invalidCls);\r
150 },\r
151 scope: this,\r
152 single: true\r
153 });\r
154 this.el.addCls(this.invalidCls);\r
155 }\r
156 },\r
157\r
158 /**\r
159 * @private\r
160 */\r
161 isDragOver: function(draggable, region) {\r
162 return this.region[this.validDropMode](draggable.region);\r
163 },\r
164\r
165 /**\r
166 * @private\r
167 */\r
168 onDrag: function(draggable, e) {\r
169 this.setCanDrop(this.isDragOver(draggable), draggable, e);\r
170 },\r
171\r
172 /**\r
173 * @private\r
174 */\r
175 setCanDrop: function(canDrop, draggable, e) {\r
176 if (canDrop && !this.canDrop) {\r
177 this.canDrop = true;\r
178 this.el.addCls(this.hoverCls);\r
179 this.fireEvent('dropenter', this, draggable, e);\r
180 }\r
181 else if (!canDrop && this.canDrop) {\r
182 this.canDrop = false;\r
183 this.el.removeCls(this.hoverCls);\r
184 this.fireEvent('dropleave', this, draggable, e);\r
185 }\r
186 },\r
187\r
188 /**\r
189 * @private\r
190 */\r
191 onBeforeDragEnd: function(draggable, e) {\r
192 draggable.cancelRevert = this.canDrop;\r
193 },\r
194\r
195 /**\r
196 * @private\r
197 */\r
198 onDragEnd: function(draggable, e) {\r
199 this.monitoring = false;\r
200 this.el.removeCls(this.activeCls);\r
201\r
202 draggable.un({\r
203 drag: this.onDrag,\r
204 beforedragend: this.onBeforeDragEnd,\r
205 dragend: this.onDragEnd,\r
206 scope: this\r
207 });\r
208\r
209\r
210 if (this.canDrop) {\r
211 this.canDrop = false;\r
212 this.el.removeCls(this.hoverCls);\r
213 this.fireEvent('drop', this, draggable, e);\r
214 }\r
215\r
216 this.fireEvent('dropdeactivate', this, draggable, e);\r
217 },\r
218\r
219 /**\r
220 * Enable the Droppable target.\r
221 * This is invoked immediately after constructing a Droppable if the\r
222 * disabled parameter is NOT set to true.\r
223 */\r
224 enable: function() {\r
225 if (!this.mgr) {\r
226 this.mgr = Ext.util.Observable.observe(Ext.util.Draggable);\r
227 }\r
228 this.mgr.on({\r
229 dragstart: this.onDragStart,\r
230 scope: this\r
231 });\r
232 this.disabled = false;\r
233 },\r
234\r
235 /**\r
236 * Disable the Droppable target.\r
237 */\r
238 disable: function() {\r
239 this.mgr.un({\r
240 dragstart: this.onDragStart,\r
241 scope: this\r
242 });\r
243 this.disabled = true;\r
244 },\r
245\r
246 /**\r
247 * Method to determine whether this Component is currently disabled.\r
248 * @return {Boolean} the disabled state of this Component.\r
249 */\r
250 isDisabled: function() {\r
251 return this.disabled;\r
252 },\r
253\r
254 /**\r
255 * Method to determine whether this Droppable is currently monitoring drag operations of Draggables.\r
256 * @return {Boolean} the monitoring state of this Droppable\r
257 */\r
258 isMonitoring: function() {\r
259 return this.monitoring;\r
260 }\r
261});\r