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.require("dojo.html.common");
13
dojo.require("dojo.html.common");
12
dojo.provide("dojo.html.selection");
14
dojo.provide("dojo.html.selection");
13
dojo.require("dojo.dom");
15
dojo.require("dojo.dom");
14
dojo.require("dojo.lang.common");
16
dojo.require("dojo.lang.common");
15
dojo.html.selectionType = {NONE:0, TEXT:1, CONTROL:2};
17
dojo.html.selectionType = {NONE:0, TEXT:1, CONTROL:2};
16
dojo.html.clearSelection = function () {
18
dojo.html.clearSelection = function () {
17
	var _window = dojo.global();
19
	var _window = dojo.global();
18
	var _document = dojo.doc();
20
	var _document = dojo.doc();
19
	try {
21
	try {
20
		if (_window["getSelection"]) {
22
		if (_window["getSelection"]) {
21
			if (dojo.render.html.safari) {
23
			if (dojo.render.html.safari) {
22
				_window.getSelection().collapse();
24
				_window.getSelection().collapse();
23
			} else {
25
			} else {
24
				_window.getSelection().removeAllRanges();
26
				_window.getSelection().removeAllRanges();
25
			}
27
			}
26
		} else {
28
		} else {
27
			if (_document.selection) {
29
			if (_document.selection) {
28
				if (_document.selection.empty) {
30
				if (_document.selection.empty) {
29
					_document.selection.empty();
31
					_document.selection.empty();
30
				} else {
32
				} else {
31
					if (_document.selection.clear) {
33
					if (_document.selection.clear) {
32
						_document.selection.clear();
34
						_document.selection.clear();
33
					}
35
					}
34
				}
36
				}
35
			}
37
			}
36
		}
38
		}
37
		return true;
39
		return true;
38
	}
40
	}
39
	catch (e) {
41
	catch (e) {
40
		dojo.debug(e);
42
		dojo.debug(e);
41
		return false;
43
		return false;
42
	}
44
	}
43
};
45
};
44
dojo.html.disableSelection = function (element) {
46
dojo.html.disableSelection = function (element) {
45
	element = dojo.byId(element) || dojo.body();
47
	element = dojo.byId(element) || dojo.body();
46
	var h = dojo.render.html;
48
	var h = dojo.render.html;
47
	if (h.mozilla) {
49
	if (h.mozilla) {
48
		element.style.MozUserSelect = "none";
50
		element.style.MozUserSelect = "none";
49
	} else {
51
	} else {
50
		if (h.safari) {
52
		if (h.safari) {
51
			element.style.KhtmlUserSelect = "none";
53
			element.style.KhtmlUserSelect = "none";
52
		} else {
54
		} else {
53
			if (h.ie) {
55
			if (h.ie) {
54
				element.unselectable = "on";
56
				element.unselectable = "on";
55
			} else {
57
			} else {
56
				return false;
58
				return false;
57
			}
59
			}
58
		}
60
		}
59
	}
61
	}
60
	return true;
62
	return true;
61
};
63
};
62
dojo.html.enableSelection = function (element) {
64
dojo.html.enableSelection = function (element) {
63
	element = dojo.byId(element) || dojo.body();
65
	element = dojo.byId(element) || dojo.body();
64
	var h = dojo.render.html;
66
	var h = dojo.render.html;
65
	if (h.mozilla) {
67
	if (h.mozilla) {
66
		element.style.MozUserSelect = "";
68
		element.style.MozUserSelect = "";
67
	} else {
69
	} else {
68
		if (h.safari) {
70
		if (h.safari) {
69
			element.style.KhtmlUserSelect = "";
71
			element.style.KhtmlUserSelect = "";
70
		} else {
72
		} else {
71
			if (h.ie) {
73
			if (h.ie) {
72
				element.unselectable = "off";
74
				element.unselectable = "off";
73
			} else {
75
			} else {
74
				return false;
76
				return false;
75
			}
77
			}
76
		}
78
		}
77
	}
79
	}
78
	return true;
80
	return true;
79
};
81
};
80
dojo.html.selectElement = function (element) {
82
dojo.html.selectElement = function (element) {
81
	dojo.deprecated("dojo.html.selectElement", "replaced by dojo.html.selection.selectElementChildren", 0.5);
83
	dojo.deprecated("dojo.html.selectElement", "replaced by dojo.html.selection.selectElementChildren", 0.5);
82
};
84
};
83
dojo.html.selectInputText = function (element) {
85
dojo.html.selectInputText = function (element) {
84
	var _window = dojo.global();
86
	var _window = dojo.global();
85
	var _document = dojo.doc();
87
	var _document = dojo.doc();
86
	element = dojo.byId(element);
88
	element = dojo.byId(element);
87
	if (_document["selection"] && dojo.body()["createTextRange"]) {
89
	if (_document["selection"] && dojo.body()["createTextRange"]) {
88
		var range = element.createTextRange();
90
		var range = element.createTextRange();
89
		range.moveStart("character", 0);
91
		range.moveStart("character", 0);
90
		range.moveEnd("character", element.value.length);
92
		range.moveEnd("character", element.value.length);
91
		range.select();
93
		range.select();
92
	} else {
94
	} else {
93
		if (_window["getSelection"]) {
95
		if (_window["getSelection"]) {
94
			var selection = _window.getSelection();
96
			var selection = _window.getSelection();
95
			element.setSelectionRange(0, element.value.length);
97
			element.setSelectionRange(0, element.value.length);
96
		}
98
		}
97
	}
99
	}
98
	element.focus();
100
	element.focus();
99
};
101
};
100
dojo.html.isSelectionCollapsed = function () {
102
dojo.html.isSelectionCollapsed = function () {
101
	dojo.deprecated("dojo.html.isSelectionCollapsed", "replaced by dojo.html.selection.isCollapsed", 0.5);
103
	dojo.deprecated("dojo.html.isSelectionCollapsed", "replaced by dojo.html.selection.isCollapsed", 0.5);
102
	return dojo.html.selection.isCollapsed();
104
	return dojo.html.selection.isCollapsed();
103
};
105
};
104
dojo.lang.mixin(dojo.html.selection, {getType:function () {
106
dojo.lang.mixin(dojo.html.selection, {getType:function () {
105
	if (dojo.doc()["selection"]) {
107
	if (dojo.doc()["selection"]) {
106
		return dojo.html.selectionType[dojo.doc().selection.type.toUpperCase()];
108
		return dojo.html.selectionType[dojo.doc().selection.type.toUpperCase()];
107
	} else {
109
	} else {
108
		var stype = dojo.html.selectionType.TEXT;
110
		var stype = dojo.html.selectionType.TEXT;
109
		var oSel;
111
		var oSel;
110
		try {
112
		try {
111
			oSel = dojo.global().getSelection();
113
			oSel = dojo.global().getSelection();
112
		}
114
		}
113
		catch (e) {
115
		catch (e) {
114
		}
116
		}
115
		if (oSel && oSel.rangeCount == 1) {
117
		if (oSel && oSel.rangeCount == 1) {
116
			var oRange = oSel.getRangeAt(0);
118
			var oRange = oSel.getRangeAt(0);
117
			if (oRange.startContainer == oRange.endContainer && (oRange.endOffset - oRange.startOffset) == 1 && oRange.startContainer.nodeType != dojo.dom.TEXT_NODE) {
119
			if (oRange.startContainer == oRange.endContainer && (oRange.endOffset - oRange.startOffset) == 1 && oRange.startContainer.nodeType != dojo.dom.TEXT_NODE) {
118
				stype = dojo.html.selectionType.CONTROL;
120
				stype = dojo.html.selectionType.CONTROL;
119
			}
121
			}
120
		}
122
		}
121
		return stype;
123
		return stype;
122
	}
124
	}
123
}, isCollapsed:function () {
125
}, isCollapsed:function () {
124
	var _window = dojo.global();
126
	var _window = dojo.global();
125
	var _document = dojo.doc();
127
	var _document = dojo.doc();
126
	if (_document["selection"]) {
128
	if (_document["selection"]) {
127
		return _document.selection.createRange().text == "";
129
		return _document.selection.createRange().text == "";
128
	} else {
130
	} else {
129
		if (_window["getSelection"]) {
131
		if (_window["getSelection"]) {
130
			var selection = _window.getSelection();
132
			var selection = _window.getSelection();
131
			if (dojo.lang.isString(selection)) {
133
			if (dojo.lang.isString(selection)) {
132
				return selection == "";
134
				return selection == "";
133
			} else {
135
			} else {
134
				return selection.isCollapsed || selection.toString() == "";
136
				return selection.isCollapsed || selection.toString() == "";
135
			}
137
			}
136
		}
138
		}
137
	}
139
	}
138
}, getSelectedElement:function () {
140
}, getSelectedElement:function () {
139
	if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
141
	if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
140
		if (dojo.doc()["selection"]) {
142
		if (dojo.doc()["selection"]) {
141
			var range = dojo.doc().selection.createRange();
143
			var range = dojo.doc().selection.createRange();
142
			if (range && range.item) {
144
			if (range && range.item) {
143
				return dojo.doc().selection.createRange().item(0);
145
				return dojo.doc().selection.createRange().item(0);
144
			}
146
			}
145
		} else {
147
		} else {
146
			var selection = dojo.global().getSelection();
148
			var selection = dojo.global().getSelection();
147
			return selection.anchorNode.childNodes[selection.anchorOffset];
149
			return selection.anchorNode.childNodes[selection.anchorOffset];
148
		}
150
		}
149
	}
151
	}
150
}, getParentElement:function () {
152
}, getParentElement:function () {
151
	if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
153
	if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
152
		var p = dojo.html.selection.getSelectedElement();
154
		var p = dojo.html.selection.getSelectedElement();
153
		if (p) {
155
		if (p) {
154
			return p.parentNode;
156
			return p.parentNode;
155
		}
157
		}
156
	} else {
158
	} else {
157
		if (dojo.doc()["selection"]) {
159
		if (dojo.doc()["selection"]) {
158
			return dojo.doc().selection.createRange().parentElement();
160
			return dojo.doc().selection.createRange().parentElement();
159
		} else {
161
		} else {
160
			var selection = dojo.global().getSelection();
162
			var selection = dojo.global().getSelection();
161
			if (selection) {
163
			if (selection) {
162
				var node = selection.anchorNode;
164
				var node = selection.anchorNode;
163
				while (node && node.nodeType != dojo.dom.ELEMENT_NODE) {
165
				while (node && node.nodeType != dojo.dom.ELEMENT_NODE) {
164
					node = node.parentNode;
166
					node = node.parentNode;
165
				}
167
				}
166
				return node;
168
				return node;
167
			}
169
			}
168
		}
170
		}
169
	}
171
	}
170
}, getSelectedText:function () {
172
}, getSelectedText:function () {
171
	if (dojo.doc()["selection"]) {
173
	if (dojo.doc()["selection"]) {
172
		if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
174
		if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
173
			return null;
175
			return null;
174
		}
176
		}
175
		return dojo.doc().selection.createRange().text;
177
		return dojo.doc().selection.createRange().text;
176
	} else {
178
	} else {
177
		var selection = dojo.global().getSelection();
179
		var selection = dojo.global().getSelection();
178
		if (selection) {
180
		if (selection) {
179
			return selection.toString();
181
			return selection.toString();
180
		}
182
		}
181
	}
183
	}
182
}, getSelectedHtml:function () {
184
}, getSelectedHtml:function () {
183
	if (dojo.doc()["selection"]) {
185
	if (dojo.doc()["selection"]) {
184
		if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
186
		if (dojo.html.selection.getType() == dojo.html.selectionType.CONTROL) {
185
			return null;
187
			return null;
186
		}
188
		}
187
		return dojo.doc().selection.createRange().htmlText;
189
		return dojo.doc().selection.createRange().htmlText;
188
	} else {
190
	} else {
189
		var selection = dojo.global().getSelection();
191
		var selection = dojo.global().getSelection();
190
		if (selection && selection.rangeCount) {
192
		if (selection && selection.rangeCount) {
191
			var frag = selection.getRangeAt(0).cloneContents();
193
			var frag = selection.getRangeAt(0).cloneContents();
192
			var div = document.createElement("div");
194
			var div = document.createElement("div");
193
			div.appendChild(frag);
195
			div.appendChild(frag);
194
			return div.innerHTML;
196
			return div.innerHTML;
195
		}
197
		}
196
		return null;
198
		return null;
197
	}
199
	}
198
}, hasAncestorElement:function (tagName) {
200
}, hasAncestorElement:function (tagName) {
199
	return (dojo.html.selection.getAncestorElement.apply(this, arguments) != null);
201
	return (dojo.html.selection.getAncestorElement.apply(this, arguments) != null);
200
}, getAncestorElement:function (tagName) {
202
}, getAncestorElement:function (tagName) {
201
	var node = dojo.html.selection.getSelectedElement() || dojo.html.selection.getParentElement();
203
	var node = dojo.html.selection.getSelectedElement() || dojo.html.selection.getParentElement();
202
	while (node) {
204
	while (node) {
203
		if (dojo.html.selection.isTag(node, arguments).length > 0) {
205
		if (dojo.html.selection.isTag(node, arguments).length > 0) {
204
			return node;
206
			return node;
205
		}
207
		}
206
		node = node.parentNode;
208
		node = node.parentNode;
207
	}
209
	}
208
	return null;
210
	return null;
209
}, isTag:function (node, tags) {
211
}, isTag:function (node, tags) {
210
	if (node && node.tagName) {
212
	if (node && node.tagName) {
211
		for (var i = 0; i < tags.length; i++) {
213
		for (var i = 0; i < tags.length; i++) {
212
			if (node.tagName.toLowerCase() == String(tags[i]).toLowerCase()) {
214
			if (node.tagName.toLowerCase() == String(tags[i]).toLowerCase()) {
213
				return String(tags[i]).toLowerCase();
215
				return String(tags[i]).toLowerCase();
214
			}
216
			}
215
		}
217
		}
216
	}
218
	}
217
	return "";
219
	return "";
218
}, selectElement:function (element) {
220
}, selectElement:function (element) {
219
	var _window = dojo.global();
221
	var _window = dojo.global();
220
	var _document = dojo.doc();
222
	var _document = dojo.doc();
221
	element = dojo.byId(element);
223
	element = dojo.byId(element);
222
	if (_document.selection && dojo.body().createTextRange) {
224
	if (_document.selection && dojo.body().createTextRange) {
223
		try {
225
		try {
224
			var range = dojo.body().createControlRange();
226
			var range = dojo.body().createControlRange();
225
			range.addElement(element);
227
			range.addElement(element);
226
			range.select();
228
			range.select();
227
		}
229
		}
228
		catch (e) {
230
		catch (e) {
229
			dojo.html.selection.selectElementChildren(element);
231
			dojo.html.selection.selectElementChildren(element);
230
		}
232
		}
231
	} else {
233
	} else {
232
		if (_window["getSelection"]) {
234
		if (_window["getSelection"]) {
233
			var selection = _window.getSelection();
235
			var selection = _window.getSelection();
234
			if (selection["removeAllRanges"]) {
236
			if (selection["removeAllRanges"]) {
235
				var range = _document.createRange();
237
				var range = _document.createRange();
236
				range.selectNode(element);
238
				range.selectNode(element);
237
				selection.removeAllRanges();
239
				selection.removeAllRanges();
238
				selection.addRange(range);
240
				selection.addRange(range);
239
			}
241
			}
240
		}
242
		}
241
	}
243
	}
242
}, selectElementChildren:function (element) {
244
}, selectElementChildren:function (element) {
243
	var _window = dojo.global();
245
	var _window = dojo.global();
244
	var _document = dojo.doc();
246
	var _document = dojo.doc();
245
	element = dojo.byId(element);
247
	element = dojo.byId(element);
246
	if (_document.selection && dojo.body().createTextRange) {
248
	if (_document.selection && dojo.body().createTextRange) {
247
		var range = dojo.body().createTextRange();
249
		var range = dojo.body().createTextRange();
248
		range.moveToElementText(element);
250
		range.moveToElementText(element);
249
		range.select();
251
		range.select();
250
	} else {
252
	} else {
251
		if (_window["getSelection"]) {
253
		if (_window["getSelection"]) {
252
			var selection = _window.getSelection();
254
			var selection = _window.getSelection();
253
			if (selection["setBaseAndExtent"]) {
255
			if (selection["setBaseAndExtent"]) {
254
				selection.setBaseAndExtent(element, 0, element, element.innerText.length - 1);
256
				selection.setBaseAndExtent(element, 0, element, element.innerText.length - 1);
255
			} else {
257
			} else {
256
				if (selection["selectAllChildren"]) {
258
				if (selection["selectAllChildren"]) {
257
					selection.selectAllChildren(element);
259
					selection.selectAllChildren(element);
258
				}
260
				}
259
			}
261
			}
260
		}
262
		}
261
	}
263
	}
262
}, getBookmark:function () {
264
}, getBookmark:function () {
263
	var bookmark;
265
	var bookmark;
264
	var _document = dojo.doc();
266
	var _document = dojo.doc();
265
	if (_document["selection"]) {
267
	if (_document["selection"]) {
266
		var range = _document.selection.createRange();
268
		var range = _document.selection.createRange();
267
		bookmark = range.getBookmark();
269
		bookmark = range.getBookmark();
268
	} else {
270
	} else {
269
		var selection;
271
		var selection;
270
		try {
272
		try {
271
			selection = dojo.global().getSelection();
273
			selection = dojo.global().getSelection();
272
		}
274
		}
273
		catch (e) {
275
		catch (e) {
274
		}
276
		}
275
		if (selection) {
277
		if (selection) {
276
			var range = selection.getRangeAt(0);
278
			var range = selection.getRangeAt(0);
277
			bookmark = range.cloneRange();
279
			bookmark = range.cloneRange();
278
		} else {
280
		} else {
279
			dojo.debug("No idea how to store the current selection for this browser!");
281
			dojo.debug("No idea how to store the current selection for this browser!");
280
		}
282
		}
281
	}
283
	}
282
	return bookmark;
284
	return bookmark;
283
}, moveToBookmark:function (bookmark) {
285
}, moveToBookmark:function (bookmark) {
284
	var _document = dojo.doc();
286
	var _document = dojo.doc();
285
	if (_document["selection"]) {
287
	if (_document["selection"]) {
286
		var range = _document.selection.createRange();
288
		var range = _document.selection.createRange();
287
		range.moveToBookmark(bookmark);
289
		range.moveToBookmark(bookmark);
288
		range.select();
290
		range.select();
289
	} else {
291
	} else {
290
		var selection;
292
		var selection;
291
		try {
293
		try {
292
			selection = dojo.global().getSelection();
294
			selection = dojo.global().getSelection();
293
		}
295
		}
294
		catch (e) {
296
		catch (e) {
295
		}
297
		}
296
		if (selection && selection["removeAllRanges"]) {
298
		if (selection && selection["removeAllRanges"]) {
297
			selection.removeAllRanges();
299
			selection.removeAllRanges();
298
			selection.addRange(bookmark);
300
			selection.addRange(bookmark);
299
		} else {
301
		} else {
300
			dojo.debug("No idea how to restore selection for this browser!");
302
			dojo.debug("No idea how to restore selection for this browser!");
301
		}
303
		}
302
	}
304
	}
303
}, collapse:function (beginning) {
305
}, collapse:function (beginning) {
304
	if (dojo.global()["getSelection"]) {
306
	if (dojo.global()["getSelection"]) {
305
		var selection = dojo.global().getSelection();
307
		var selection = dojo.global().getSelection();
306
		if (selection.removeAllRanges) {
308
		if (selection.removeAllRanges) {
307
			if (beginning) {
309
			if (beginning) {
308
				selection.collapseToStart();
310
				selection.collapseToStart();
309
			} else {
311
			} else {
310
				selection.collapseToEnd();
312
				selection.collapseToEnd();
311
			}
313
			}
312
		} else {
314
		} else {
313
			dojo.global().getSelection().collapse(beginning);
315
			dojo.global().getSelection().collapse(beginning);
314
		}
316
		}
315
	} else {
317
	} else {
316
		if (dojo.doc().selection) {
318
		if (dojo.doc().selection) {
317
			var range = dojo.doc().selection.createRange();
319
			var range = dojo.doc().selection.createRange();
318
			range.collapse(beginning);
320
			range.collapse(beginning);
319
			range.select();
321
			range.select();
320
		}
322
		}
321
	}
323
	}
322
}, remove:function () {
324
}, remove:function () {
323
	if (dojo.doc().selection) {
325
	if (dojo.doc().selection) {
324
		var selection = dojo.doc().selection;
326
		var selection = dojo.doc().selection;
325
		if (selection.type.toUpperCase() != "NONE") {
327
		if (selection.type.toUpperCase() != "NONE") {
326
			selection.clear();
328
			selection.clear();
327
		}
329
		}
328
		return selection;
330
		return selection;
329
	} else {
331
	} else {
330
		var selection = dojo.global().getSelection();
332
		var selection = dojo.global().getSelection();
331
		for (var i = 0; i < selection.rangeCount; i++) {
333
		for (var i = 0; i < selection.rangeCount; i++) {
332
			selection.getRangeAt(i).deleteContents();
334
			selection.getRangeAt(i).deleteContents();
333
		}
335
		}
334
		return selection;
336
		return selection;
335
	}
337
	}
336
}});
338
}});
337
 
339