+qx.Class.define("org.argeo.jcr.ria.model.Node", {\r
+ extend : org.argeo.jcr.ria.model.AbstractItem,\r
+ \r
+ events : {\r
+ "clear" : "qx.event.type.Event",\r
+ "childNodeAdded" : "qx.event.type.Data",\r
+ "childNodeRemoved" : "qx.event.type.Data",\r
+ "childrenChanged" : "qx.event.type.Data",\r
+ \r
+ "propertyAdded" : "qx.event.type.Data",\r
+ "propertyRemoved" : "qx.event.type.Data",\r
+ "propertiesChanged" : "qx.event.type.Data"\r
+ },\r
+ properties : {\r
+ loadState : {\r
+ check : "String",\r
+ init : "empty", // Can be "empty" => "loading" => "loaded"\r
+ event : "changeLoadState"\r
+ },\r
+ nodeProvider : {\r
+ check : "org.argeo.jcr.ria.provider.INodeProvider" \r
+ }\r
+ },\r
+ \r
+ construct : function(nodeName, isRoot){\r
+ this.base(arguments);\r
+ this._children = {};\r
+ this._properties = {}; \r
+ this.setName(nodeName);\r
+ if(isRoot){\r
+ this.setPath("");\r
+ this.setRoot(this);\r
+ }\r
+ },\r
+\r
+ members : {\r
+ _children : null,\r
+ _properties : null,\r
+ \r
+ load : function(){\r
+ this.getNodeProvider().loadNode(this);\r
+ },\r
+ \r
+ remove : function(){\r
+ if(this.itemIsRoot()) return;\r
+ this.getParent().removeChild(this.getName());\r
+ },\r
+ \r
+ fromXmlString : function(xmlString){\r
+ var domDocument = qx.xml.Document.fromString(xmlString);\r
+ var root = domDocument.documentElement;\r
+ this.fromDomElement(root);\r
+ },\r
+ \r
+ fromDomElement : function(domElement){\r
+ if(domElement.nodeType != 1) return;\r
+ for(var i=0;i<domElement.attributes.length;i++){\r
+ var att = domElement.attributes[i];\r
+ var property = new org.argeo.jcr.ria.model.Property(att.nodeName);\r
+ this.addProperty(property);\r
+ property.fromDomElement(att);\r
+ }\r
+ for(var i=0;i<domElement.childNodes.length;i++){\r
+ var child = domElement.childNodes[i];\r
+ if(child.nodeType != 1) continue;\r
+ var jcrChild = new org.argeo.jcr.ria.model.Node(child.nodeName);\r
+ this.addChild(jcrChild);\r
+ jcrChild.fromDomElement(child);\r
+ } \r
+ },\r
+ \r
+ toXmlString : function(recurse, childrenWriter){\r
+ var string = "<"+this.getName();\r
+ var props = this.getProperties();\r
+ for(var i=0;i<props.length;i++){\r
+ string += " " + props[i].toXmlString();\r
+ }\r
+ string += ">";\r
+ if(recurse){\r
+ var childs = this.getChildren();\r
+ var childrenString = "";\r
+ for(var j=0;j<childs.length;j++){\r
+ childrenString += childs[j].toXmlString(recurse, childrenWriter);\r
+ }\r
+ if(childrenWriter){\r
+ string += childrenWriter(childrenString);\r
+ }else{\r
+ string += childrenString;\r
+ }\r
+ }\r
+ string += "</"+this.getName()+">";\r
+ return string;\r
+ }, \r
+ \r
+ getChild : function(childName){\r
+ return this._children[childName];\r
+ },\r
+ getProperty : function(propertyName){\r
+ return this._properties[propertyName];\r
+ },\r
+ addChild : function(childNode){\r
+ this._children[childNode.getName()] = childNode;\r
+ \r
+ childNode.setParent(this);\r
+ childNode.setRoot(this.getRoot());\r
+ childNode.setPath(this.getPath() + "/" + childNode.getName());\r
+ \r
+ this.fireDataEvent("childNodeAdded", childNode);\r
+ this.fireDataEvent("childNodeChanged");\r
+ },\r
+ removeChild : function(childName){\r
+ delete(this._children[childName]);\r
+ this.fireDataEvent("childNodeRemoved", childName);\r
+ this.fireDataEvent("childNodeChanged");\r
+ },\r
+ addProperty : function(property){\r
+ this._properties[property.getName()] = property;\r
+ \r
+ property.setParent(this);\r
+ property.setRoot(this.getRoot());\r
+ property.setPath(this.getPath() + "/" + property.getName());\r
+ \r
+ this.fireDataEvent("propertyAdded", property);\r
+ this.fireDataEvent("propertiesChanged");\r
+ },\r
+ removeProperty : function(propertyName){\r
+ delete(this._properties[propertyName]);\r
+ this.fireDataEvent("propertyRemoved", propertyName);\r
+ this.fireDataEvent("propertiesChanged");\r
+ },\r
+ getChildren : function(){\r
+ return qx.lang.Object.getValues(this._children);\r
+ },\r
+ getProperties : function(){\r
+ return qx.lang.Object.getValues(this._properties);\r
+ },\r
+ getChildrenCount : function(){\r
+ return qx.lang.Object.getLength(this._children);\r
+ },\r
+ getPropertiesCount : function(){\r
+ return qx.lang.Object.getLength(this._properties);\r
+ }\r
+ }\r
+});
\ No newline at end of file