New file |
0,0 → 1,225 |
/* |
Copyright (c) 2004-2006, The Dojo Foundation |
All Rights Reserved. |
|
Licensed under the Academic Free License version 2.1 or above OR the |
modified BSD license. For more information on Dojo licensing, see: |
|
http://dojotoolkit.org/community/licensing.shtml |
*/ |
|
dojo.provide("dojo.widget.Parse"); |
dojo.require("dojo.widget.Manager"); |
dojo.require("dojo.dom"); |
dojo.widget.Parse = function (fragment) { |
this.propertySetsList = []; |
this.fragment = fragment; |
this.createComponents = function (frag, parentComp) { |
var comps = []; |
var built = false; |
try { |
if (frag && frag.tagName && (frag != frag.nodeRef)) { |
var djTags = dojo.widget.tags; |
var tna = String(frag.tagName).split(";"); |
for (var x = 0; x < tna.length; x++) { |
var ltn = tna[x].replace(/^\s+|\s+$/g, "").toLowerCase(); |
frag.tagName = ltn; |
var ret; |
if (djTags[ltn]) { |
built = true; |
ret = djTags[ltn](frag, this, parentComp, frag.index); |
comps.push(ret); |
} else { |
if (ltn.indexOf(":") == -1) { |
ltn = "dojo:" + ltn; |
} |
ret = dojo.widget.buildWidgetFromParseTree(ltn, frag, this, parentComp, frag.index); |
if (ret) { |
built = true; |
comps.push(ret); |
} |
} |
} |
} |
} |
catch (e) { |
dojo.debug("dojo.widget.Parse: error:", e); |
} |
if (!built) { |
comps = comps.concat(this.createSubComponents(frag, parentComp)); |
} |
return comps; |
}; |
this.createSubComponents = function (fragment, parentComp) { |
var frag, comps = []; |
for (var item in fragment) { |
frag = fragment[item]; |
if (frag && typeof frag == "object" && (frag != fragment.nodeRef) && (frag != fragment.tagName) && (!dojo.dom.isNode(frag))) { |
comps = comps.concat(this.createComponents(frag, parentComp)); |
} |
} |
return comps; |
}; |
this.parsePropertySets = function (fragment) { |
return []; |
}; |
this.parseProperties = function (fragment) { |
var properties = {}; |
for (var item in fragment) { |
if ((fragment[item] == fragment.tagName) || (fragment[item] == fragment.nodeRef)) { |
} else { |
var frag = fragment[item]; |
if (frag.tagName && dojo.widget.tags[frag.tagName.toLowerCase()]) { |
} else { |
if (frag[0] && frag[0].value != "" && frag[0].value != null) { |
try { |
if (item.toLowerCase() == "dataprovider") { |
var _this = this; |
this.getDataProvider(_this, frag[0].value); |
properties.dataProvider = this.dataProvider; |
} |
properties[item] = frag[0].value; |
var nestedProperties = this.parseProperties(frag); |
for (var property in nestedProperties) { |
properties[property] = nestedProperties[property]; |
} |
} |
catch (e) { |
dojo.debug(e); |
} |
} |
} |
switch (item.toLowerCase()) { |
case "checked": |
case "disabled": |
if (typeof properties[item] != "boolean") { |
properties[item] = true; |
} |
break; |
} |
} |
} |
return properties; |
}; |
this.getDataProvider = function (objRef, dataUrl) { |
dojo.io.bind({url:dataUrl, load:function (type, evaldObj) { |
if (type == "load") { |
objRef.dataProvider = evaldObj; |
} |
}, mimetype:"text/javascript", sync:true}); |
}; |
this.getPropertySetById = function (propertySetId) { |
for (var x = 0; x < this.propertySetsList.length; x++) { |
if (propertySetId == this.propertySetsList[x]["id"][0].value) { |
return this.propertySetsList[x]; |
} |
} |
return ""; |
}; |
this.getPropertySetsByType = function (componentType) { |
var propertySets = []; |
for (var x = 0; x < this.propertySetsList.length; x++) { |
var cpl = this.propertySetsList[x]; |
var cpcc = cpl.componentClass || cpl.componentType || null; |
var propertySetId = this.propertySetsList[x]["id"][0].value; |
if (cpcc && (propertySetId == cpcc[0].value)) { |
propertySets.push(cpl); |
} |
} |
return propertySets; |
}; |
this.getPropertySets = function (fragment) { |
var ppl = "dojo:propertyproviderlist"; |
var propertySets = []; |
var tagname = fragment.tagName; |
if (fragment[ppl]) { |
var propertyProviderIds = fragment[ppl].value.split(" "); |
for (var propertySetId in propertyProviderIds) { |
if ((propertySetId.indexOf("..") == -1) && (propertySetId.indexOf("://") == -1)) { |
var propertySet = this.getPropertySetById(propertySetId); |
if (propertySet != "") { |
propertySets.push(propertySet); |
} |
} else { |
} |
} |
} |
return this.getPropertySetsByType(tagname).concat(propertySets); |
}; |
this.createComponentFromScript = function (nodeRef, componentName, properties, ns) { |
properties.fastMixIn = true; |
var ltn = (ns || "dojo") + ":" + componentName.toLowerCase(); |
if (dojo.widget.tags[ltn]) { |
return [dojo.widget.tags[ltn](properties, this, null, null, properties)]; |
} |
return [dojo.widget.buildWidgetFromParseTree(ltn, properties, this, null, null, properties)]; |
}; |
}; |
dojo.widget._parser_collection = {"dojo":new dojo.widget.Parse()}; |
dojo.widget.getParser = function (name) { |
if (!name) { |
name = "dojo"; |
} |
if (!this._parser_collection[name]) { |
this._parser_collection[name] = new dojo.widget.Parse(); |
} |
return this._parser_collection[name]; |
}; |
dojo.widget.createWidget = function (name, props, refNode, position) { |
var isNode = false; |
var isNameStr = (typeof name == "string"); |
if (isNameStr) { |
var pos = name.indexOf(":"); |
var ns = (pos > -1) ? name.substring(0, pos) : "dojo"; |
if (pos > -1) { |
name = name.substring(pos + 1); |
} |
var lowerCaseName = name.toLowerCase(); |
var namespacedName = ns + ":" + lowerCaseName; |
isNode = (dojo.byId(name) && !dojo.widget.tags[namespacedName]); |
} |
if ((arguments.length == 1) && (isNode || !isNameStr)) { |
var xp = new dojo.xml.Parse(); |
var tn = isNode ? dojo.byId(name) : name; |
return dojo.widget.getParser().createComponents(xp.parseElement(tn, null, true))[0]; |
} |
function fromScript(placeKeeperNode, name, props, ns) { |
props[namespacedName] = {dojotype:[{value:lowerCaseName}], nodeRef:placeKeeperNode, fastMixIn:true}; |
props.ns = ns; |
return dojo.widget.getParser().createComponentFromScript(placeKeeperNode, name, props, ns); |
} |
props = props || {}; |
var notRef = false; |
var tn = null; |
var h = dojo.render.html.capable; |
if (h) { |
tn = document.createElement("span"); |
} |
if (!refNode) { |
notRef = true; |
refNode = tn; |
if (h) { |
dojo.body().appendChild(refNode); |
} |
} else { |
if (position) { |
dojo.dom.insertAtPosition(tn, refNode, position); |
} else { |
tn = refNode; |
} |
} |
var widgetArray = fromScript(tn, name.toLowerCase(), props, ns); |
if ((!widgetArray) || (!widgetArray[0]) || (typeof widgetArray[0].widgetType == "undefined")) { |
throw new Error("createWidget: Creation of \"" + name + "\" widget failed."); |
} |
try { |
if (notRef && widgetArray[0].domNode.parentNode) { |
widgetArray[0].domNode.parentNode.removeChild(widgetArray[0].domNode); |
} |
} |
catch (e) { |
dojo.debug(e); |
} |
return widgetArray[0]; |
}; |
|