\r
initViews : function(viewsManager){\r
var nodeProvider = new org.argeo.jcr.ria.provider.XmlNodeProvider();\r
- nodeProvider.initProvider({xmlSrc : "/org.argeo.slc.webapp/getJcrItem.jcr?path=/slc/testresults"}) \r
- var rootNode = new org.argeo.jcr.ria.model.Node("Root", true); \r
+ nodeProvider.initProvider({\r
+ xmlSrc : "/org.argeo.slc.webapp/getJcrItem.jcr?",\r
+ dynamic : true,\r
+ pathParameter:"path"\r
+ }); \r
+ var rootNode = new org.argeo.jcr.ria.model.Node("Root", true);\r
+ rootNode.setPath('/slc');\r
rootNode.setNodeProvider(nodeProvider);\r
- //rootNode.load();\r
- var testView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.XmlNodeEditor, "fulltree");\r
- testView.load(rootNode);\r
+ var dataModel = new org.argeo.jcr.ria.model.DataModel(rootNode);\r
+ var testView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.XmlNodeEditor, "fulltree", dataModel);\r
+ testView.load();\r
},\r
\r
remove : function(viewsManager){\r
qx.Class.define("org.argeo.jcr.ria.model.DataModel", {\r
extend : qx.core.Object,\r
\r
+ events : {\r
+ "changeContextNode" : "qx.event.type.Data"\r
+ },\r
+ \r
properties : {\r
rootNode : {\r
check : "org.argeo.jcr.ria.model.Node",\r
event : "changeRootNode" \r
},\r
contextNode : {\r
- check : "org.argeo.jcr.ria.model.Node",\r
- event : "changeContextNode"\r
+ check : "org.argeo.jcr.ria.model.Node"\r
},\r
selection : {\r
check : "org.argeo.jcr.ria.model.Node[]",\r
construct : function(rootNode){\r
this.base(arguments);\r
this.setRootNode(rootNode);\r
+ },\r
+ \r
+ members : {\r
+ requireContextChange : function(path){\r
+ var targetNode;\r
+ var rootNode = this.getRootNode();\r
+ if(!path){\r
+ targetNode = rootNode;\r
+ }else{\r
+ // Create a fake node\r
+ if(path[path.length-1] == '/'){\r
+ path = path.substring(0, path.length-1);\r
+ }\r
+ var base = path.substring(path.lastIndexOf("/")+1);\r
+ targetNode = new org.argeo.jcr.ria.model.Node(base);\r
+ rootNode.addChild(targetNode);\r
+ targetNode.setNodeProvider(rootNode.getNodeProvider());\r
+ targetNode.setPath(path); \r
+ }\r
+ var observer = function(event){\r
+ var state = event.getData();\r
+ if(state == "loading"){\r
+ targetNode.loadingNode = new org.argeo.jcr.ria.model.Node("loading"); \r
+ targetNode.addChild(targetNode.loadingNode);\r
+ }else if(state == "loaded"){\r
+ if(targetNode.loadingNode) {\r
+ targetNode.loadingNode.remove();\r
+ targetNode.loadingNode = null;\r
+ }\r
+ targetNode.removeListener("changeLoadState", observer, this);\r
+ } \r
+ this.setContextNode(targetNode);\r
+ this.fireDataEvent("changeContextNode", targetNode);\r
+ };\r
+ targetNode.addListener("changeLoadState", observer, this);\r
+ targetNode.load();\r
+ }\r
}\r
\r
});
\ No newline at end of file
var jcrChild = new org.argeo.jcr.ria.model.Node(child.nodeName);\r
this.addChild(jcrChild);\r
jcrChild.fromDomElement(child);\r
- } \r
+ }\r
+ this.setLoadState("loaded");\r
},\r
\r
toXmlString : function(recurse, childrenWriter){\r
if(this.getXmlDocLoaded()){\r
// Parse document and load\r
node.setName(this._xmlDoc.documentElement.nodeName);\r
+ var properties = this.getSettings(); \r
+ // STUB : prune sub children, load only level 1\r
+ /*\r
+ var children = this._xmlDoc.documentElement.childNodes;\r
+ for(var i=0;i<children.length;i++){\r
+ var subchildren = children[i].childNodes;\r
+ for(var j=0;j<subchildren.length;j++){\r
+ children[i].removeChild(subchildren[j]);\r
+ }\r
+ }\r
+ */\r
+ // END STUB\r
node.fromDomElement(this._xmlDoc.documentElement);\r
- node.setLoadState("loaded");\r
+ if(properties.dynamic){\r
+ this.setXmlDocLoaded(false);\r
+ }\r
}else{\r
this.addListenerOnce("changeXmlDocLoaded", function(){\r
this.loadNode(node, nodeCallback, childCallback);\r
}, this);\r
node.setLoadState("loading");\r
- this.loadXmlDoc();\r
+ this.loadXmlDoc(node);\r
}\r
},\r
\r
- loadXmlDoc : function(){\r
+ loadXmlDoc : function(node){\r
var properties = this.getSettings();\r
if(!properties.xmlSrc && !properties.xmlString) return;\r
if(properties.xmlSrc){\r
var request = new org.argeo.ria.remote.Request(properties.xmlSrc, 'GET', 'application/xml');\r
+ if(properties.dynamic && properties.pathParameter){\r
+ request.setParameter(properties.pathParameter, (node.getPath()|| "/"));\r
+ }\r
request.addListener("completed", function(response){\r
this._xmlDoc = response.getContent();\r
this.setXmlDocLoaded(true);\r
instanceLabel : {\r
init:"Xml Editor",\r
event : "changeInstanceLabel"\r
+ },\r
+ dataModel : {\r
+ \r
}\r
},\r
\r
construct : function(){\r
this.base(arguments);\r
- this.setLayout(new qx.ui.layout.VBox());\r
- this.htmlPane = new qx.ui.embed.Html();\r
- this.htmlPane.setOverflow("auto", "auto");\r
- this.add(this.htmlPane, {flex:1});\r
},\r
\r
members : {\r
* @param data {Mixed} Any object or data passed by the initiator of the view\r
* @return {Boolean}\r
*/\r
- init : function(viewPane, data){\r
+ init : function(viewPane, dataModel){\r
this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId())); \r
+ this.setLayout(new qx.ui.layout.VBox());\r
+ this.setDataModel(dataModel);\r
+ \r
+ this.input = new qx.ui.form.TextField();\r
+ this.add(this.input);\r
+ \r
+ this._attachInputToDM();\r
+ \r
+ this.htmlPane = new qx.ui.embed.Html();\r
+ this.htmlPane.setOverflow("auto", "auto");\r
+ this.add(this.htmlPane, {flex:1});\r
+ \r
},\r
/**\r
* The implementation should contain the real data loading (i.o. query...)\r
* @return {Boolean}\r
*/\r
- load : function(rootNode){\r
- rootNode.load();\r
- rootNode.addListener("changeLoadState", function(){\r
- var xmlString = rootNode.toXmlString(true);\r
+ load : function(){\r
+ var dataModel = this.getDataModel();\r
+ dataModel.addListener("changeContextNode", function(event){\r
+ var xmlString = event.getData().toXmlString(true);\r
var TAG_START_PATTERN = new RegExp("<([0-9a-zA-Z\.]+)([^>]*)>", "gi");\r
var TAG_END_PATTERN = new RegExp("</([0-9a-zA-Z\.]+)>", "gi");\r
var TAG_CLOSE_PATTERN = new RegExp("(/?>)", "gi");\r
xmlString = xmlString.replace(TAG_ATTRIBUTE, ' xml_attname_begin$1xml_attname_end="xml_attvalue_begin$2xml_attvalue_end"');\r
\r
//xmlString = qx.xml.String.escape(xmlString);\r
- xmlString = xmlString.replace(new RegExp("(xml_div_begin)", "g"), '<div style="padding-top:2px;padding-left:15px;">');\r
+ xmlString = xmlString.replace(new RegExp("(xml_div_begin)", "g"), '<div style="padding:1px;line-height:17px;padding-left:15px;">');\r
xmlString = xmlString.replace(new RegExp("(xml_div_end)", "g"), '</div>');\r
xmlString = xmlString.replace(new RegExp("(xml_tagname_begin)", "g"), '<b style="color:rgb(63,127,127);">');\r
xmlString = xmlString.replace(new RegExp("(xml_tagname_end)", "g"), '</b>');\r
xmlString = xmlString.replace(new RegExp("(xml_attvalue_end)", "g"), '</span>');\r
xmlString = '<div style="margin-left:-10px;">' + xmlString + '</div>';\r
this.htmlPane.setHtml(xmlString);\r
+ /*\r
+ var call = new qx.util.DeferredCall(function(){\r
+ var htmlDom = this.htmlPane.getContentElement().getDomElement();\r
+ var spans = qx.bom.Selector.query("span", htmlDom);\r
+ for(var i=0;i<spans.length;i++){\r
+ var oThis = this;\r
+ spans[i].onclick = function(){oThis._setAttributesSpanEditable(this)};\r
+ }\r
+ }, this);\r
+ call.schedule();\r
+ */\r
}, this);\r
+ dataModel.requireContextChange(); \r
+ },\r
+ \r
+ _setAttributesSpanEditable : function(span){\r
+ var width = qx.bom.element.Dimension.getWidth(span);\r
+ var value = span.innerHTML;\r
+ qx.bom.element.Style.set(span, "display", "none");\r
+ var input = qx.bom.Element.create("input", {value:value, style:'width:'+width+'px;'});\r
+ qx.dom.Element.insertAfter(input, span); \r
+ },\r
+ \r
+ _attachInputToDM : function(){\r
+ var dm = this.getDataModel();\r
+ this.input.addListener("keypress", function(event){\r
+ if(event.getKeyIdentifier() != "Enter") return;\r
+ var path = this.input.getValue();\r
+ dm.requireContextChange(path);\r
+ }, this);\r
+ dm.addListener("changeContextNode", function(event){\r
+ var ctxtNode = event.getData();\r
+ this.input.setValue(ctxtNode.getPath());\r
+ }, this);\r
+ \r
},\r
+ \r
/**\r
* Whether this component is already contained in a scroller (return false) or not (return true).\r
* @return {Boolean}\r