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.widget.Parse");
13
dojo.provide("dojo.widget.Parse");
12
dojo.require("dojo.widget.Manager");
14
dojo.require("dojo.widget.Manager");
13
dojo.require("dojo.dom");
15
dojo.require("dojo.dom");
14
dojo.widget.Parse = function (fragment) {
16
dojo.widget.Parse = function (fragment) {
15
	this.propertySetsList = [];
17
	this.propertySetsList = [];
16
	this.fragment = fragment;
18
	this.fragment = fragment;
17
	this.createComponents = function (frag, parentComp) {
19
	this.createComponents = function (frag, parentComp) {
18
		var comps = [];
20
		var comps = [];
19
		var built = false;
21
		var built = false;
20
		try {
22
		try {
21
			if (frag && frag.tagName && (frag != frag.nodeRef)) {
23
			if (frag && frag.tagName && (frag != frag.nodeRef)) {
22
				var djTags = dojo.widget.tags;
24
				var djTags = dojo.widget.tags;
23
				var tna = String(frag.tagName).split(";");
25
				var tna = String(frag.tagName).split(";");
24
				for (var x = 0; x < tna.length; x++) {
26
				for (var x = 0; x < tna.length; x++) {
25
					var ltn = tna[x].replace(/^\s+|\s+$/g, "").toLowerCase();
27
					var ltn = tna[x].replace(/^\s+|\s+$/g, "").toLowerCase();
26
					frag.tagName = ltn;
28
					frag.tagName = ltn;
27
					var ret;
29
					var ret;
28
					if (djTags[ltn]) {
30
					if (djTags[ltn]) {
29
						built = true;
31
						built = true;
30
						ret = djTags[ltn](frag, this, parentComp, frag.index);
32
						ret = djTags[ltn](frag, this, parentComp, frag.index);
31
						comps.push(ret);
33
						comps.push(ret);
32
					} else {
34
					} else {
33
						if (ltn.indexOf(":") == -1) {
35
						if (ltn.indexOf(":") == -1) {
34
							ltn = "dojo:" + ltn;
36
							ltn = "dojo:" + ltn;
35
						}
37
						}
36
						ret = dojo.widget.buildWidgetFromParseTree(ltn, frag, this, parentComp, frag.index);
38
						ret = dojo.widget.buildWidgetFromParseTree(ltn, frag, this, parentComp, frag.index);
37
						if (ret) {
39
						if (ret) {
38
							built = true;
40
							built = true;
39
							comps.push(ret);
41
							comps.push(ret);
40
						}
42
						}
41
					}
43
					}
42
				}
44
				}
43
			}
45
			}
44
		}
46
		}
45
		catch (e) {
47
		catch (e) {
46
			dojo.debug("dojo.widget.Parse: error:", e);
48
			dojo.debug("dojo.widget.Parse: error:", e);
47
		}
49
		}
48
		if (!built) {
50
		if (!built) {
49
			comps = comps.concat(this.createSubComponents(frag, parentComp));
51
			comps = comps.concat(this.createSubComponents(frag, parentComp));
50
		}
52
		}
51
		return comps;
53
		return comps;
52
	};
54
	};
53
	this.createSubComponents = function (fragment, parentComp) {
55
	this.createSubComponents = function (fragment, parentComp) {
54
		var frag, comps = [];
56
		var frag, comps = [];
55
		for (var item in fragment) {
57
		for (var item in fragment) {
56
			frag = fragment[item];
58
			frag = fragment[item];
57
			if (frag && typeof frag == "object" && (frag != fragment.nodeRef) && (frag != fragment.tagName) && (!dojo.dom.isNode(frag))) {
59
			if (frag && typeof frag == "object" && (frag != fragment.nodeRef) && (frag != fragment.tagName) && (!dojo.dom.isNode(frag))) {
58
				comps = comps.concat(this.createComponents(frag, parentComp));
60
				comps = comps.concat(this.createComponents(frag, parentComp));
59
			}
61
			}
60
		}
62
		}
61
		return comps;
63
		return comps;
62
	};
64
	};
63
	this.parsePropertySets = function (fragment) {
65
	this.parsePropertySets = function (fragment) {
64
		return [];
66
		return [];
65
	};
67
	};
66
	this.parseProperties = function (fragment) {
68
	this.parseProperties = function (fragment) {
67
		var properties = {};
69
		var properties = {};
68
		for (var item in fragment) {
70
		for (var item in fragment) {
69
			if ((fragment[item] == fragment.tagName) || (fragment[item] == fragment.nodeRef)) {
71
			if ((fragment[item] == fragment.tagName) || (fragment[item] == fragment.nodeRef)) {
70
			} else {
72
			} else {
71
				var frag = fragment[item];
73
				var frag = fragment[item];
72
				if (frag.tagName && dojo.widget.tags[frag.tagName.toLowerCase()]) {
74
				if (frag.tagName && dojo.widget.tags[frag.tagName.toLowerCase()]) {
73
				} else {
75
				} else {
74
					if (frag[0] && frag[0].value != "" && frag[0].value != null) {
76
					if (frag[0] && frag[0].value != "" && frag[0].value != null) {
75
						try {
77
						try {
76
							if (item.toLowerCase() == "dataprovider") {
78
							if (item.toLowerCase() == "dataprovider") {
77
								var _this = this;
79
								var _this = this;
78
								this.getDataProvider(_this, frag[0].value);
80
								this.getDataProvider(_this, frag[0].value);
79
								properties.dataProvider = this.dataProvider;
81
								properties.dataProvider = this.dataProvider;
80
							}
82
							}
81
							properties[item] = frag[0].value;
83
							properties[item] = frag[0].value;
82
							var nestedProperties = this.parseProperties(frag);
84
							var nestedProperties = this.parseProperties(frag);
83
							for (var property in nestedProperties) {
85
							for (var property in nestedProperties) {
84
								properties[property] = nestedProperties[property];
86
								properties[property] = nestedProperties[property];
85
							}
87
							}
86
						}
88
						}
87
						catch (e) {
89
						catch (e) {
88
							dojo.debug(e);
90
							dojo.debug(e);
89
						}
91
						}
90
					}
92
					}
91
				}
93
				}
92
				switch (item.toLowerCase()) {
94
				switch (item.toLowerCase()) {
93
				  case "checked":
95
				  case "checked":
94
				  case "disabled":
96
				  case "disabled":
95
					if (typeof properties[item] != "boolean") {
97
					if (typeof properties[item] != "boolean") {
96
						properties[item] = true;
98
						properties[item] = true;
97
					}
99
					}
98
					break;
100
					break;
99
				}
101
				}
100
			}
102
			}
101
		}
103
		}
102
		return properties;
104
		return properties;
103
	};
105
	};
104
	this.getDataProvider = function (objRef, dataUrl) {
106
	this.getDataProvider = function (objRef, dataUrl) {
105
		dojo.io.bind({url:dataUrl, load:function (type, evaldObj) {
107
		dojo.io.bind({url:dataUrl, load:function (type, evaldObj) {
106
			if (type == "load") {
108
			if (type == "load") {
107
				objRef.dataProvider = evaldObj;
109
				objRef.dataProvider = evaldObj;
108
			}
110
			}
109
		}, mimetype:"text/javascript", sync:true});
111
		}, mimetype:"text/javascript", sync:true});
110
	};
112
	};
111
	this.getPropertySetById = function (propertySetId) {
113
	this.getPropertySetById = function (propertySetId) {
112
		for (var x = 0; x < this.propertySetsList.length; x++) {
114
		for (var x = 0; x < this.propertySetsList.length; x++) {
113
			if (propertySetId == this.propertySetsList[x]["id"][0].value) {
115
			if (propertySetId == this.propertySetsList[x]["id"][0].value) {
114
				return this.propertySetsList[x];
116
				return this.propertySetsList[x];
115
			}
117
			}
116
		}
118
		}
117
		return "";
119
		return "";
118
	};
120
	};
119
	this.getPropertySetsByType = function (componentType) {
121
	this.getPropertySetsByType = function (componentType) {
120
		var propertySets = [];
122
		var propertySets = [];
121
		for (var x = 0; x < this.propertySetsList.length; x++) {
123
		for (var x = 0; x < this.propertySetsList.length; x++) {
122
			var cpl = this.propertySetsList[x];
124
			var cpl = this.propertySetsList[x];
123
			var cpcc = cpl.componentClass || cpl.componentType || null;
125
			var cpcc = cpl.componentClass || cpl.componentType || null;
124
			var propertySetId = this.propertySetsList[x]["id"][0].value;
126
			var propertySetId = this.propertySetsList[x]["id"][0].value;
125
			if (cpcc && (propertySetId == cpcc[0].value)) {
127
			if (cpcc && (propertySetId == cpcc[0].value)) {
126
				propertySets.push(cpl);
128
				propertySets.push(cpl);
127
			}
129
			}
128
		}
130
		}
129
		return propertySets;
131
		return propertySets;
130
	};
132
	};
131
	this.getPropertySets = function (fragment) {
133
	this.getPropertySets = function (fragment) {
132
		var ppl = "dojo:propertyproviderlist";
134
		var ppl = "dojo:propertyproviderlist";
133
		var propertySets = [];
135
		var propertySets = [];
134
		var tagname = fragment.tagName;
136
		var tagname = fragment.tagName;
135
		if (fragment[ppl]) {
137
		if (fragment[ppl]) {
136
			var propertyProviderIds = fragment[ppl].value.split(" ");
138
			var propertyProviderIds = fragment[ppl].value.split(" ");
137
			for (var propertySetId in propertyProviderIds) {
139
			for (var propertySetId in propertyProviderIds) {
138
				if ((propertySetId.indexOf("..") == -1) && (propertySetId.indexOf("://") == -1)) {
140
				if ((propertySetId.indexOf("..") == -1) && (propertySetId.indexOf("://") == -1)) {
139
					var propertySet = this.getPropertySetById(propertySetId);
141
					var propertySet = this.getPropertySetById(propertySetId);
140
					if (propertySet != "") {
142
					if (propertySet != "") {
141
						propertySets.push(propertySet);
143
						propertySets.push(propertySet);
142
					}
144
					}
143
				} else {
145
				} else {
144
				}
146
				}
145
			}
147
			}
146
		}
148
		}
147
		return this.getPropertySetsByType(tagname).concat(propertySets);
149
		return this.getPropertySetsByType(tagname).concat(propertySets);
148
	};
150
	};
149
	this.createComponentFromScript = function (nodeRef, componentName, properties, ns) {
151
	this.createComponentFromScript = function (nodeRef, componentName, properties, ns) {
150
		properties.fastMixIn = true;
152
		properties.fastMixIn = true;
151
		var ltn = (ns || "dojo") + ":" + componentName.toLowerCase();
153
		var ltn = (ns || "dojo") + ":" + componentName.toLowerCase();
152
		if (dojo.widget.tags[ltn]) {
154
		if (dojo.widget.tags[ltn]) {
153
			return [dojo.widget.tags[ltn](properties, this, null, null, properties)];
155
			return [dojo.widget.tags[ltn](properties, this, null, null, properties)];
154
		}
156
		}
155
		return [dojo.widget.buildWidgetFromParseTree(ltn, properties, this, null, null, properties)];
157
		return [dojo.widget.buildWidgetFromParseTree(ltn, properties, this, null, null, properties)];
156
	};
158
	};
157
};
159
};
158
dojo.widget._parser_collection = {"dojo":new dojo.widget.Parse()};
160
dojo.widget._parser_collection = {"dojo":new dojo.widget.Parse()};
159
dojo.widget.getParser = function (name) {
161
dojo.widget.getParser = function (name) {
160
	if (!name) {
162
	if (!name) {
161
		name = "dojo";
163
		name = "dojo";
162
	}
164
	}
163
	if (!this._parser_collection[name]) {
165
	if (!this._parser_collection[name]) {
164
		this._parser_collection[name] = new dojo.widget.Parse();
166
		this._parser_collection[name] = new dojo.widget.Parse();
165
	}
167
	}
166
	return this._parser_collection[name];
168
	return this._parser_collection[name];
167
};
169
};
168
dojo.widget.createWidget = function (name, props, refNode, position) {
170
dojo.widget.createWidget = function (name, props, refNode, position) {
169
	var isNode = false;
171
	var isNode = false;
170
	var isNameStr = (typeof name == "string");
172
	var isNameStr = (typeof name == "string");
171
	if (isNameStr) {
173
	if (isNameStr) {
172
		var pos = name.indexOf(":");
174
		var pos = name.indexOf(":");
173
		var ns = (pos > -1) ? name.substring(0, pos) : "dojo";
175
		var ns = (pos > -1) ? name.substring(0, pos) : "dojo";
174
		if (pos > -1) {
176
		if (pos > -1) {
175
			name = name.substring(pos + 1);
177
			name = name.substring(pos + 1);
176
		}
178
		}
177
		var lowerCaseName = name.toLowerCase();
179
		var lowerCaseName = name.toLowerCase();
178
		var namespacedName = ns + ":" + lowerCaseName;
180
		var namespacedName = ns + ":" + lowerCaseName;
179
		isNode = (dojo.byId(name) && !dojo.widget.tags[namespacedName]);
181
		isNode = (dojo.byId(name) && !dojo.widget.tags[namespacedName]);
180
	}
182
	}
181
	if ((arguments.length == 1) && (isNode || !isNameStr)) {
183
	if ((arguments.length == 1) && (isNode || !isNameStr)) {
182
		var xp = new dojo.xml.Parse();
184
		var xp = new dojo.xml.Parse();
183
		var tn = isNode ? dojo.byId(name) : name;
185
		var tn = isNode ? dojo.byId(name) : name;
184
		return dojo.widget.getParser().createComponents(xp.parseElement(tn, null, true))[0];
186
		return dojo.widget.getParser().createComponents(xp.parseElement(tn, null, true))[0];
185
	}
187
	}
186
	function fromScript(placeKeeperNode, name, props, ns) {
188
	function fromScript(placeKeeperNode, name, props, ns) {
187
		props[namespacedName] = {dojotype:[{value:lowerCaseName}], nodeRef:placeKeeperNode, fastMixIn:true};
189
		props[namespacedName] = {dojotype:[{value:lowerCaseName}], nodeRef:placeKeeperNode, fastMixIn:true};
188
		props.ns = ns;
190
		props.ns = ns;
189
		return dojo.widget.getParser().createComponentFromScript(placeKeeperNode, name, props, ns);
191
		return dojo.widget.getParser().createComponentFromScript(placeKeeperNode, name, props, ns);
190
	}
192
	}
191
	props = props || {};
193
	props = props || {};
192
	var notRef = false;
194
	var notRef = false;
193
	var tn = null;
195
	var tn = null;
194
	var h = dojo.render.html.capable;
196
	var h = dojo.render.html.capable;
195
	if (h) {
197
	if (h) {
196
		tn = document.createElement("span");
198
		tn = document.createElement("span");
197
	}
199
	}
198
	if (!refNode) {
200
	if (!refNode) {
199
		notRef = true;
201
		notRef = true;
200
		refNode = tn;
202
		refNode = tn;
201
		if (h) {
203
		if (h) {
202
			dojo.body().appendChild(refNode);
204
			dojo.body().appendChild(refNode);
203
		}
205
		}
204
	} else {
206
	} else {
205
		if (position) {
207
		if (position) {
206
			dojo.dom.insertAtPosition(tn, refNode, position);
208
			dojo.dom.insertAtPosition(tn, refNode, position);
207
		} else {
209
		} else {
208
			tn = refNode;
210
			tn = refNode;
209
		}
211
		}
210
	}
212
	}
211
	var widgetArray = fromScript(tn, name.toLowerCase(), props, ns);
213
	var widgetArray = fromScript(tn, name.toLowerCase(), props, ns);
212
	if ((!widgetArray) || (!widgetArray[0]) || (typeof widgetArray[0].widgetType == "undefined")) {
214
	if ((!widgetArray) || (!widgetArray[0]) || (typeof widgetArray[0].widgetType == "undefined")) {
213
		throw new Error("createWidget: Creation of \"" + name + "\" widget failed.");
215
		throw new Error("createWidget: Creation of \"" + name + "\" widget failed.");
214
	}
216
	}
215
	try {
217
	try {
216
		if (notRef && widgetArray[0].domNode.parentNode) {
218
		if (notRef && widgetArray[0].domNode.parentNode) {
217
			widgetArray[0].domNode.parentNode.removeChild(widgetArray[0].domNode);
219
			widgetArray[0].domNode.parentNode.removeChild(widgetArray[0].domNode);
218
		}
220
		}
219
	}
221
	}
220
	catch (e) {
222
	catch (e) {
221
		dojo.debug(e);
223
		dojo.debug(e);
222
	}
224
	}
223
	return widgetArray[0];
225
	return widgetArray[0];
224
};
226
};
225
 
227