Tweak nodes, provider and data model objects.
authorCharles du Jeu <charles.dujeu@gmail.com>
Wed, 28 Apr 2010 10:09:02 +0000 (10:09 +0000)
committerCharles du Jeu <charles.dujeu@gmail.com>
Wed, 28 Apr 2010 10:09:02 +0000 (10:09 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@3511 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/JcrBrowser.js
server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/model/DataModel.js
server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/model/Node.js
server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/provider/XmlNodeProvider.js
server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/XmlNodeEditor.js

index 4e36ba1a0019b69012b3ed55ca9781064e6cea39..fd8d933f7cbb385a108f624ef317757e12cdfc63 100644 (file)
@@ -41,12 +41,17 @@ qx.Class.define("org.argeo.jcr.ria.JcrBrowser",
        \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
index 5cb49bab6661310a9b5a3a3625c150469901078d..9ed6205394c9222639fb8587e95092f37687c673 100644 (file)
@@ -1,14 +1,17 @@
 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
@@ -19,6 +22,43 @@ qx.Class.define("org.argeo.jcr.ria.model.DataModel", {
        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
index c5e45f7f2fd6f0d57ddc837ab54b332ee3812bc8..fcd5e6d22f05e86db5860f308919cf902f6a63f1 100644 (file)
@@ -66,7 +66,8 @@ qx.Class.define("org.argeo.jcr.ria.model.Node", {
                                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
index a7f7d1b31cd771b9e81e2d33cdab693aa3b6f402..0f7057a37f9b4091e2cc6026bc1b3a7cda5d184c 100644 (file)
@@ -33,22 +33,39 @@ qx.Class.define("org.argeo.jcr.ria.provider.XmlNodeProvider", {
                        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
index 2c1b25955d3e9bfd829a71eaee349529661188ac..28a2bc5441ad0a607a78d1b5cda0d284631e61c2 100644 (file)
@@ -21,15 +21,14 @@ qx.Class.define("org.argeo.jcr.ria.views.XmlNodeEditor", {
                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
@@ -41,17 +40,29 @@ qx.Class.define("org.argeo.jcr.ria.views.XmlNodeEditor", {
                 * @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
@@ -68,7 +79,7 @@ qx.Class.define("org.argeo.jcr.ria.views.XmlNodeEditor", {
                            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
@@ -78,8 +89,43 @@ qx.Class.define("org.argeo.jcr.ria.views.XmlNodeEditor", {
                                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