Subversion Repositories Applications.papyrus

Rev

Rev 1372 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1372 Rev 1422
1
/*
1
/*
2
	Copyright (c) 2004-2006, The Dojo Foundation
2
	Copyright (c) 2004-2006, The Dojo Foundation
3
	All Rights Reserved.
3
	All Rights Reserved.
4
 
4
 
5
	Licensed under the Academic Free License version 2.1 or above OR the
5
	Licensed under the Academic Free License version 2.1 or above OR the
6
	modified BSD license. For more information on Dojo licensing, see:
6
	modified BSD license. For more information on Dojo licensing, see:
7
 
7
 
8
		http://dojotoolkit.org/community/licensing.shtml
8
		http://dojotoolkit.org/community/licensing.shtml
9
*/
9
*/
-
 
10
 
-
 
11
 
10
 
12
 
11
dojo.provide("dojo.dnd.HtmlDragManager");
13
dojo.provide("dojo.dnd.HtmlDragManager");
12
dojo.require("dojo.dnd.DragAndDrop");
14
dojo.require("dojo.dnd.DragAndDrop");
13
dojo.require("dojo.event.*");
15
dojo.require("dojo.event.*");
14
dojo.require("dojo.lang.array");
16
dojo.require("dojo.lang.array");
15
dojo.require("dojo.html.common");
17
dojo.require("dojo.html.common");
16
dojo.require("dojo.html.layout");
18
dojo.require("dojo.html.layout");
17
dojo.declare("dojo.dnd.HtmlDragManager", dojo.dnd.DragManager, {disabled:false, nestedTargets:false, mouseDownTimer:null, dsCounter:0, dsPrefix:"dojoDragSource", dropTargetDimensions:[], currentDropTarget:null, previousDropTarget:null, _dragTriggered:false, selectedSources:[], dragObjects:[], dragSources:[], dropTargets:[], currentX:null, currentY:null, lastX:null, lastY:null, mouseDownX:null, mouseDownY:null, threshold:7, dropAcceptable:false, cancelEvent:function (e) {
19
dojo.declare("dojo.dnd.HtmlDragManager", dojo.dnd.DragManager, {disabled:false, nestedTargets:false, mouseDownTimer:null, dsCounter:0, dsPrefix:"dojoDragSource", dropTargetDimensions:[], currentDropTarget:null, previousDropTarget:null, _dragTriggered:false, selectedSources:[], dragObjects:[], dragSources:[], dropTargets:[], currentX:null, currentY:null, lastX:null, lastY:null, mouseDownX:null, mouseDownY:null, threshold:7, dropAcceptable:false, cancelEvent:function (e) {
18
	e.stopPropagation();
20
	e.stopPropagation();
19
	e.preventDefault();
21
	e.preventDefault();
20
}, registerDragSource:function (ds) {
22
}, registerDragSource:function (ds) {
21
	if (ds["domNode"]) {
23
	if (ds["domNode"]) {
22
		var dp = this.dsPrefix;
24
		var dp = this.dsPrefix;
23
		var dpIdx = dp + "Idx_" + (this.dsCounter++);
25
		var dpIdx = dp + "Idx_" + (this.dsCounter++);
24
		ds.dragSourceId = dpIdx;
26
		ds.dragSourceId = dpIdx;
25
		this.dragSources[dpIdx] = ds;
27
		this.dragSources[dpIdx] = ds;
26
		ds.domNode.setAttribute(dp, dpIdx);
28
		ds.domNode.setAttribute(dp, dpIdx);
27
		if (dojo.render.html.ie) {
29
		if (dojo.render.html.ie) {
28
			dojo.event.browser.addListener(ds.domNode, "ondragstart", this.cancelEvent);
30
			dojo.event.browser.addListener(ds.domNode, "ondragstart", this.cancelEvent);
29
		}
31
		}
30
	}
32
	}
31
}, unregisterDragSource:function (ds) {
33
}, unregisterDragSource:function (ds) {
32
	if (ds["domNode"]) {
34
	if (ds["domNode"]) {
33
		var dp = this.dsPrefix;
35
		var dp = this.dsPrefix;
34
		var dpIdx = ds.dragSourceId;
36
		var dpIdx = ds.dragSourceId;
35
		delete ds.dragSourceId;
37
		delete ds.dragSourceId;
36
		delete this.dragSources[dpIdx];
38
		delete this.dragSources[dpIdx];
37
		ds.domNode.setAttribute(dp, null);
39
		ds.domNode.setAttribute(dp, null);
38
		if (dojo.render.html.ie) {
40
		if (dojo.render.html.ie) {
39
			dojo.event.browser.removeListener(ds.domNode, "ondragstart", this.cancelEvent);
41
			dojo.event.browser.removeListener(ds.domNode, "ondragstart", this.cancelEvent);
40
		}
42
		}
41
	}
43
	}
42
}, registerDropTarget:function (dt) {
44
}, registerDropTarget:function (dt) {
43
	this.dropTargets.push(dt);
45
	this.dropTargets.push(dt);
44
}, unregisterDropTarget:function (dt) {
46
}, unregisterDropTarget:function (dt) {
45
	var index = dojo.lang.find(this.dropTargets, dt, true);
47
	var index = dojo.lang.find(this.dropTargets, dt, true);
46
	if (index >= 0) {
48
	if (index >= 0) {
47
		this.dropTargets.splice(index, 1);
49
		this.dropTargets.splice(index, 1);
48
	}
50
	}
49
}, getDragSource:function (e) {
51
}, getDragSource:function (e) {
50
	var tn = e.target;
52
	var tn = e.target;
51
	if (tn === dojo.body()) {
53
	if (tn === dojo.body()) {
52
		return;
54
		return;
53
	}
55
	}
54
	var ta = dojo.html.getAttribute(tn, this.dsPrefix);
56
	var ta = dojo.html.getAttribute(tn, this.dsPrefix);
55
	while ((!ta) && (tn)) {
57
	while ((!ta) && (tn)) {
56
		tn = tn.parentNode;
58
		tn = tn.parentNode;
57
		if ((!tn) || (tn === dojo.body())) {
59
		if ((!tn) || (tn === dojo.body())) {
58
			return;
60
			return;
59
		}
61
		}
60
		ta = dojo.html.getAttribute(tn, this.dsPrefix);
62
		ta = dojo.html.getAttribute(tn, this.dsPrefix);
61
	}
63
	}
62
	return this.dragSources[ta];
64
	return this.dragSources[ta];
63
}, onKeyDown:function (e) {
65
}, onKeyDown:function (e) {
64
}, onMouseDown:function (e) {
66
}, onMouseDown:function (e) {
65
	if (this.disabled) {
67
	if (this.disabled) {
66
		return;
68
		return;
67
	}
69
	}
68
	if (dojo.render.html.ie) {
70
	if (dojo.render.html.ie) {
69
		if (e.button != 1) {
71
		if (e.button != 1) {
70
			return;
72
			return;
71
		}
73
		}
72
	} else {
74
	} else {
73
		if (e.which != 1) {
75
		if (e.which != 1) {
74
			return;
76
			return;
75
		}
77
		}
76
	}
78
	}
77
	var target = e.target.nodeType == dojo.html.TEXT_NODE ? e.target.parentNode : e.target;
79
	var target = e.target.nodeType == dojo.html.TEXT_NODE ? e.target.parentNode : e.target;
78
	if (dojo.html.isTag(target, "button", "textarea", "input", "select", "option")) {
80
	if (dojo.html.isTag(target, "button", "textarea", "input", "select", "option")) {
79
		return;
81
		return;
80
	}
82
	}
81
	var ds = this.getDragSource(e);
83
	var ds = this.getDragSource(e);
82
	if (!ds) {
84
	if (!ds) {
83
		return;
85
		return;
84
	}
86
	}
85
	if (!dojo.lang.inArray(this.selectedSources, ds)) {
87
	if (!dojo.lang.inArray(this.selectedSources, ds)) {
86
		this.selectedSources.push(ds);
88
		this.selectedSources.push(ds);
87
		ds.onSelected();
89
		ds.onSelected();
88
	}
90
	}
89
	this.mouseDownX = e.pageX;
91
	this.mouseDownX = e.pageX;
90
	this.mouseDownY = e.pageY;
92
	this.mouseDownY = e.pageY;
91
	e.preventDefault();
93
	e.preventDefault();
92
	dojo.event.connect(document, "onmousemove", this, "onMouseMove");
94
	dojo.event.connect(document, "onmousemove", this, "onMouseMove");
93
}, onMouseUp:function (e, cancel) {
95
}, onMouseUp:function (e, cancel) {
94
	if (this.selectedSources.length == 0) {
96
	if (this.selectedSources.length == 0) {
95
		return;
97
		return;
96
	}
98
	}
97
	this.mouseDownX = null;
99
	this.mouseDownX = null;
98
	this.mouseDownY = null;
100
	this.mouseDownY = null;
99
	this._dragTriggered = false;
101
	this._dragTriggered = false;
100
	e.dragSource = this.dragSource;
102
	e.dragSource = this.dragSource;
101
	if ((!e.shiftKey) && (!e.ctrlKey)) {
103
	if ((!e.shiftKey) && (!e.ctrlKey)) {
102
		if (this.currentDropTarget) {
104
		if (this.currentDropTarget) {
103
			this.currentDropTarget.onDropStart();
105
			this.currentDropTarget.onDropStart();
104
		}
106
		}
105
		dojo.lang.forEach(this.dragObjects, function (tempDragObj) {
107
		dojo.lang.forEach(this.dragObjects, function (tempDragObj) {
106
			var ret = null;
108
			var ret = null;
107
			if (!tempDragObj) {
109
			if (!tempDragObj) {
108
				return;
110
				return;
109
			}
111
			}
110
			if (this.currentDropTarget) {
112
			if (this.currentDropTarget) {
111
				e.dragObject = tempDragObj;
113
				e.dragObject = tempDragObj;
112
				var ce = this.currentDropTarget.domNode.childNodes;
114
				var ce = this.currentDropTarget.domNode.childNodes;
113
				if (ce.length > 0) {
115
				if (ce.length > 0) {
114
					e.dropTarget = ce[0];
116
					e.dropTarget = ce[0];
115
					while (e.dropTarget == tempDragObj.domNode) {
117
					while (e.dropTarget == tempDragObj.domNode) {
116
						e.dropTarget = e.dropTarget.nextSibling;
118
						e.dropTarget = e.dropTarget.nextSibling;
117
					}
119
					}
118
				} else {
120
				} else {
119
					e.dropTarget = this.currentDropTarget.domNode;
121
					e.dropTarget = this.currentDropTarget.domNode;
120
				}
122
				}
121
				if (this.dropAcceptable) {
123
				if (this.dropAcceptable) {
122
					ret = this.currentDropTarget.onDrop(e);
124
					ret = this.currentDropTarget.onDrop(e);
123
				} else {
125
				} else {
124
					this.currentDropTarget.onDragOut(e);
126
					this.currentDropTarget.onDragOut(e);
125
				}
127
				}
126
			}
128
			}
127
			e.dragStatus = this.dropAcceptable && ret ? "dropSuccess" : "dropFailure";
129
			e.dragStatus = this.dropAcceptable && ret ? "dropSuccess" : "dropFailure";
128
			dojo.lang.delayThese([function () {
130
			dojo.lang.delayThese([function () {
129
				try {
131
				try {
130
					tempDragObj.dragSource.onDragEnd(e);
132
					tempDragObj.dragSource.onDragEnd(e);
131
				}
133
				}
132
				catch (err) {
134
				catch (err) {
133
					var ecopy = {};
135
					var ecopy = {};
134
					for (var i in e) {
136
					for (var i in e) {
135
						if (i == "type") {
137
						if (i == "type") {
136
							ecopy.type = "mouseup";
138
							ecopy.type = "mouseup";
137
							continue;
139
							continue;
138
						}
140
						}
139
						ecopy[i] = e[i];
141
						ecopy[i] = e[i];
140
					}
142
					}
141
					tempDragObj.dragSource.onDragEnd(ecopy);
143
					tempDragObj.dragSource.onDragEnd(ecopy);
142
				}
144
				}
143
			}, function () {
145
			}, function () {
144
				tempDragObj.onDragEnd(e);
146
				tempDragObj.onDragEnd(e);
145
			}]);
147
			}]);
146
		}, this);
148
		}, this);
147
		this.selectedSources = [];
149
		this.selectedSources = [];
148
		this.dragObjects = [];
150
		this.dragObjects = [];
149
		this.dragSource = null;
151
		this.dragSource = null;
150
		if (this.currentDropTarget) {
152
		if (this.currentDropTarget) {
151
			this.currentDropTarget.onDropEnd();
153
			this.currentDropTarget.onDropEnd();
152
		}
154
		}
153
	} else {
155
	} else {
154
	}
156
	}
155
	dojo.event.disconnect(document, "onmousemove", this, "onMouseMove");
157
	dojo.event.disconnect(document, "onmousemove", this, "onMouseMove");
156
	this.currentDropTarget = null;
158
	this.currentDropTarget = null;
157
}, onScroll:function () {
159
}, onScroll:function () {
158
	for (var i = 0; i < this.dragObjects.length; i++) {
160
	for (var i = 0; i < this.dragObjects.length; i++) {
159
		if (this.dragObjects[i].updateDragOffset) {
161
		if (this.dragObjects[i].updateDragOffset) {
160
			this.dragObjects[i].updateDragOffset();
162
			this.dragObjects[i].updateDragOffset();
161
		}
163
		}
162
	}
164
	}
163
	if (this.dragObjects.length) {
165
	if (this.dragObjects.length) {
164
		this.cacheTargetLocations();
166
		this.cacheTargetLocations();
165
	}
167
	}
166
}, _dragStartDistance:function (x, y) {
168
}, _dragStartDistance:function (x, y) {
167
	if ((!this.mouseDownX) || (!this.mouseDownX)) {
169
	if ((!this.mouseDownX) || (!this.mouseDownX)) {
168
		return;
170
		return;
169
	}
171
	}
170
	var dx = Math.abs(x - this.mouseDownX);
172
	var dx = Math.abs(x - this.mouseDownX);
171
	var dx2 = dx * dx;
173
	var dx2 = dx * dx;
172
	var dy = Math.abs(y - this.mouseDownY);
174
	var dy = Math.abs(y - this.mouseDownY);
173
	var dy2 = dy * dy;
175
	var dy2 = dy * dy;
174
	return parseInt(Math.sqrt(dx2 + dy2), 10);
176
	return parseInt(Math.sqrt(dx2 + dy2), 10);
175
}, cacheTargetLocations:function () {
177
}, cacheTargetLocations:function () {
176
	dojo.profile.start("cacheTargetLocations");
178
	dojo.profile.start("cacheTargetLocations");
177
	this.dropTargetDimensions = [];
179
	this.dropTargetDimensions = [];
178
	dojo.lang.forEach(this.dropTargets, function (tempTarget) {
180
	dojo.lang.forEach(this.dropTargets, function (tempTarget) {
179
		var tn = tempTarget.domNode;
181
		var tn = tempTarget.domNode;
180
		if (!tn || !tempTarget.accepts([this.dragSource])) {
182
		if (!tn || !tempTarget.accepts([this.dragSource])) {
181
			return;
183
			return;
182
		}
184
		}
183
		var abs = dojo.html.getAbsolutePosition(tn, true);
185
		var abs = dojo.html.getAbsolutePosition(tn, true);
184
		var bb = dojo.html.getBorderBox(tn);
186
		var bb = dojo.html.getBorderBox(tn);
185
		this.dropTargetDimensions.push([[abs.x, abs.y], [abs.x + bb.width, abs.y + bb.height], tempTarget]);
187
		this.dropTargetDimensions.push([[abs.x, abs.y], [abs.x + bb.width, abs.y + bb.height], tempTarget]);
186
	}, this);
188
	}, this);
187
	dojo.profile.end("cacheTargetLocations");
189
	dojo.profile.end("cacheTargetLocations");
188
}, onMouseMove:function (e) {
190
}, onMouseMove:function (e) {
189
	if ((dojo.render.html.ie) && (e.button != 1)) {
191
	if ((dojo.render.html.ie) && (e.button != 1)) {
190
		this.currentDropTarget = null;
192
		this.currentDropTarget = null;
191
		this.onMouseUp(e, true);
193
		this.onMouseUp(e, true);
192
		return;
194
		return;
193
	}
195
	}
194
	if ((this.selectedSources.length) && (!this.dragObjects.length)) {
196
	if ((this.selectedSources.length) && (!this.dragObjects.length)) {
195
		var dx;
197
		var dx;
196
		var dy;
198
		var dy;
197
		if (!this._dragTriggered) {
199
		if (!this._dragTriggered) {
198
			this._dragTriggered = (this._dragStartDistance(e.pageX, e.pageY) > this.threshold);
200
			this._dragTriggered = (this._dragStartDistance(e.pageX, e.pageY) > this.threshold);
199
			if (!this._dragTriggered) {
201
			if (!this._dragTriggered) {
200
				return;
202
				return;
201
			}
203
			}
202
			dx = e.pageX - this.mouseDownX;
204
			dx = e.pageX - this.mouseDownX;
203
			dy = e.pageY - this.mouseDownY;
205
			dy = e.pageY - this.mouseDownY;
204
		}
206
		}
205
		this.dragSource = this.selectedSources[0];
207
		this.dragSource = this.selectedSources[0];
206
		dojo.lang.forEach(this.selectedSources, function (tempSource) {
208
		dojo.lang.forEach(this.selectedSources, function (tempSource) {
207
			if (!tempSource) {
209
			if (!tempSource) {
208
				return;
210
				return;
209
			}
211
			}
210
			var tdo = tempSource.onDragStart(e);
212
			var tdo = tempSource.onDragStart(e);
211
			if (tdo) {
213
			if (tdo) {
212
				tdo.onDragStart(e);
214
				tdo.onDragStart(e);
213
				tdo.dragOffset.y += dy;
215
				tdo.dragOffset.y += dy;
214
				tdo.dragOffset.x += dx;
216
				tdo.dragOffset.x += dx;
215
				tdo.dragSource = tempSource;
217
				tdo.dragSource = tempSource;
216
				this.dragObjects.push(tdo);
218
				this.dragObjects.push(tdo);
217
			}
219
			}
218
		}, this);
220
		}, this);
219
		this.previousDropTarget = null;
221
		this.previousDropTarget = null;
220
		this.cacheTargetLocations();
222
		this.cacheTargetLocations();
221
	}
223
	}
222
	dojo.lang.forEach(this.dragObjects, function (dragObj) {
224
	dojo.lang.forEach(this.dragObjects, function (dragObj) {
223
		if (dragObj) {
225
		if (dragObj) {
224
			dragObj.onDragMove(e);
226
			dragObj.onDragMove(e);
225
		}
227
		}
226
	});
228
	});
227
	if (this.currentDropTarget) {
229
	if (this.currentDropTarget) {
228
		var c = dojo.html.toCoordinateObject(this.currentDropTarget.domNode, true);
230
		var c = dojo.html.toCoordinateObject(this.currentDropTarget.domNode, true);
229
		var dtp = [[c.x, c.y], [c.x + c.width, c.y + c.height]];
231
		var dtp = [[c.x, c.y], [c.x + c.width, c.y + c.height]];
230
	}
232
	}
231
	if ((!this.nestedTargets) && (dtp) && (this.isInsideBox(e, dtp))) {
233
	if ((!this.nestedTargets) && (dtp) && (this.isInsideBox(e, dtp))) {
232
		if (this.dropAcceptable) {
234
		if (this.dropAcceptable) {
233
			this.currentDropTarget.onDragMove(e, this.dragObjects);
235
			this.currentDropTarget.onDragMove(e, this.dragObjects);
234
		}
236
		}
235
	} else {
237
	} else {
236
		var bestBox = this.findBestTarget(e);
238
		var bestBox = this.findBestTarget(e);
237
		if (bestBox.target === null) {
239
		if (bestBox.target === null) {
238
			if (this.currentDropTarget) {
240
			if (this.currentDropTarget) {
239
				this.currentDropTarget.onDragOut(e);
241
				this.currentDropTarget.onDragOut(e);
240
				this.previousDropTarget = this.currentDropTarget;
242
				this.previousDropTarget = this.currentDropTarget;
241
				this.currentDropTarget = null;
243
				this.currentDropTarget = null;
242
			}
244
			}
243
			this.dropAcceptable = false;
245
			this.dropAcceptable = false;
244
			return;
246
			return;
245
		}
247
		}
246
		if (this.currentDropTarget !== bestBox.target) {
248
		if (this.currentDropTarget !== bestBox.target) {
247
			if (this.currentDropTarget) {
249
			if (this.currentDropTarget) {
248
				this.previousDropTarget = this.currentDropTarget;
250
				this.previousDropTarget = this.currentDropTarget;
249
				this.currentDropTarget.onDragOut(e);
251
				this.currentDropTarget.onDragOut(e);
250
			}
252
			}
251
			this.currentDropTarget = bestBox.target;
253
			this.currentDropTarget = bestBox.target;
252
			e.dragObjects = this.dragObjects;
254
			e.dragObjects = this.dragObjects;
253
			this.dropAcceptable = this.currentDropTarget.onDragOver(e);
255
			this.dropAcceptable = this.currentDropTarget.onDragOver(e);
254
		} else {
256
		} else {
255
			if (this.dropAcceptable) {
257
			if (this.dropAcceptable) {
256
				this.currentDropTarget.onDragMove(e, this.dragObjects);
258
				this.currentDropTarget.onDragMove(e, this.dragObjects);
257
			}
259
			}
258
		}
260
		}
259
	}
261
	}
260
}, findBestTarget:function (e) {
262
}, findBestTarget:function (e) {
261
	var _this = this;
263
	var _this = this;
262
	var bestBox = new Object();
264
	var bestBox = new Object();
263
	bestBox.target = null;
265
	bestBox.target = null;
264
	bestBox.points = null;
266
	bestBox.points = null;
265
	dojo.lang.every(this.dropTargetDimensions, function (tmpDA) {
267
	dojo.lang.every(this.dropTargetDimensions, function (tmpDA) {
266
		if (!_this.isInsideBox(e, tmpDA)) {
268
		if (!_this.isInsideBox(e, tmpDA)) {
267
			return true;
269
			return true;
268
		}
270
		}
269
		bestBox.target = tmpDA[2];
271
		bestBox.target = tmpDA[2];
270
		bestBox.points = tmpDA;
272
		bestBox.points = tmpDA;
271
		return Boolean(_this.nestedTargets);
273
		return Boolean(_this.nestedTargets);
272
	});
274
	});
273
	return bestBox;
275
	return bestBox;
274
}, isInsideBox:function (e, coords) {
276
}, isInsideBox:function (e, coords) {
275
	if ((e.pageX > coords[0][0]) && (e.pageX < coords[1][0]) && (e.pageY > coords[0][1]) && (e.pageY < coords[1][1])) {
277
	if ((e.pageX > coords[0][0]) && (e.pageX < coords[1][0]) && (e.pageY > coords[0][1]) && (e.pageY < coords[1][1])) {
276
		return true;
278
		return true;
277
	}
279
	}
278
	return false;
280
	return false;
279
}, onMouseOver:function (e) {
281
}, onMouseOver:function (e) {
280
}, onMouseOut:function (e) {
282
}, onMouseOut:function (e) {
281
}});
283
}});
282
dojo.dnd.dragManager = new dojo.dnd.HtmlDragManager();
284
dojo.dnd.dragManager = new dojo.dnd.HtmlDragManager();
283
(function () {
285
(function () {
284
	var d = document;
286
	var d = document;
285
	var dm = dojo.dnd.dragManager;
287
	var dm = dojo.dnd.dragManager;
286
	dojo.event.connect(d, "onkeydown", dm, "onKeyDown");
288
	dojo.event.connect(d, "onkeydown", dm, "onKeyDown");
287
	dojo.event.connect(d, "onmouseover", dm, "onMouseOver");
289
	dojo.event.connect(d, "onmouseover", dm, "onMouseOver");
288
	dojo.event.connect(d, "onmouseout", dm, "onMouseOut");
290
	dojo.event.connect(d, "onmouseout", dm, "onMouseOut");
289
	dojo.event.connect(d, "onmousedown", dm, "onMouseDown");
291
	dojo.event.connect(d, "onmousedown", dm, "onMouseDown");
290
	dojo.event.connect(d, "onmouseup", dm, "onMouseUp");
292
	dojo.event.connect(d, "onmouseup", dm, "onMouseUp");
291
	dojo.event.connect(window, "onscroll", dm, "onScroll");
293
	dojo.event.connect(window, "onscroll", dm, "onScroll");
292
})();
294
})();
293
 
295