New layout, new views...
authorCharles du Jeu <charles.dujeu@gmail.com>
Thu, 29 Apr 2010 10:47:37 +0000 (10:47 +0000)
committerCharles du Jeu <charles.dujeu@gmail.com>
Thu, 29 Apr 2010 10:47:37 +0000 (10:47 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@3521 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/INodeProvider.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/ContextNodeInputView.js
server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/ListView.js [new file with mode: 0644]
server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/PlainXmlViewer.js
server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/TreeView.js

index 0c01772d58e5021a4ae412c3c960514d4b0ad04b..c997eaab5bef8b7642c9673362e8b6ddff3f505f 100644 (file)
@@ -42,9 +42,9 @@ qx.Class.define("org.argeo.jcr.ria.JcrBrowser",
                viewsManager.getViewPanesContainer().add(this._tBar);\r
                \r
                this._splitPane = new qx.ui.splitpane.Pane("horizontal");\r
-               var leftPane = new org.argeo.ria.components.ViewPane("treeview", "Tree View");\r
+               var leftPane = new org.argeo.ria.components.TabbedViewPane("treeview", "Tree View");\r
                this._splitPane.add(leftPane, 1);\r
-               var mainPane = new org.argeo.ria.components.ViewPane("fulltree", "Editor View");\r
+               var mainPane = new org.argeo.ria.components.TabbedViewPane("editor", "Editor View", true);\r
                this._splitPane.add(mainPane, 2);\r
                viewsManager.registerViewPane(this._tBar);\r
                viewsManager.registerViewPane(mainPane);      \r
@@ -67,11 +67,17 @@ qx.Class.define("org.argeo.jcr.ria.JcrBrowser",
                var inputView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.ContextNodeInputView, "toolbar", dataModel);\r
                inputView.load();\r
                \r
+               /*\r
                var testView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.PlainXmlViewer, "fulltree", dataModel);\r
                testView.load();\r
+               */\r
+               var listView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.ListView, "editor", dataModel);\r
+               listView.load();\r
                \r
                var treeView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.TreeView, "treeview", dataModel);\r
                treeView.load();\r
+               \r
+               dataModel.requireContextChange();\r
        },\r
        \r
        remove : function(viewsManager){\r
index 4432c80665eb0f917dbda82c99dea87b1f7e306b..a8f75c0ebf776665f1cd56155b520f2c36f6f5d3 100644 (file)
@@ -17,6 +17,11 @@ qx.Class.define("org.argeo.jcr.ria.model.DataModel", {
                        check : "Array",\r
                        event : "changeSelection",\r
                        init : []\r
+               },\r
+               selectionSource : {\r
+                       check : "Object",\r
+                       init : null,\r
+                       nullable : true\r
                }\r
        },\r
        \r
@@ -58,7 +63,11 @@ qx.Class.define("org.argeo.jcr.ria.model.DataModel", {
                                this.fireDataEvent("changeContextNode", targetNode);\r
                        };\r
                        targetNode.addListener("changeLoadState", observer, this);\r
-                       targetNode.load();\r
+                       targetNode.load(1);\r
+               },\r
+               setSelectionWithSource : function(selection, source){\r
+                       this.setSelectionSource(source);\r
+                       this.setSelection(selection);\r
                }\r
        }\r
        \r
index f8d59f7f76679fa1a25fa511ea73719daaf47a8a..81edc5218757fefe966583d5d77d077be02312ee 100644 (file)
@@ -41,8 +41,10 @@ qx.Class.define("org.argeo.jcr.ria.model.Node", {
                _children : null,\r
                _properties : null,\r
                \r
-               load : function(){\r
-                       this.getNodeProvider().loadNode(this);\r
+               load : function(depth, filter){\r
+                       if(!depth) depth = 1;\r
+                       if(!filter) filter = '';\r
+                       this.getNodeProvider().loadNode(this, depth, filter);\r
                },\r
                \r
                remove : function(){\r
index fe81c569d4b353de96bcf5a7d65569740cb8694d..867ad611a5738d253f6ad2f77e45a2aef506f3d0 100644 (file)
@@ -1,6 +1,6 @@
 qx.Interface.define("org.argeo.jcr.ria.provider.INodeProvider", {\r
        members : {\r
                initProvider : function(properties){},\r
-               loadNode : function(path, nodeCallback, childCallback){}\r
+               loadNode : function(path, depth, filter){}\r
        }\r
 });
\ No newline at end of file
index 41a830c8323d3801cc8b123add6b17505bb032cb..19990d04ff51589e696de67631fbba1e145630ad 100644 (file)
@@ -27,7 +27,7 @@ qx.Class.define("org.argeo.jcr.ria.provider.XmlNodeProvider", {
                 * @param nodeCallback Function\r
                 * @param childCallback Function\r
                 */\r
-               loadNode : function(node, nodeCallback, childCallback){\r
+               loadNode : function(node, depth, filter){\r
                        if(node.getLoadState() == "loaded") return;\r
                        \r
                        if(this.getXmlDocLoaded()){\r
@@ -41,21 +41,23 @@ qx.Class.define("org.argeo.jcr.ria.provider.XmlNodeProvider", {
                                }\r
                        }else{\r
                                this.addListenerOnce("changeXmlDocLoaded", function(){\r
-                                       this.loadNode(node, nodeCallback, childCallback);\r
+                                       this.loadNode(node, depth, filter);\r
                                }, this);\r
                                node.setLoadState("loading");\r
-                               this.loadXmlDoc(node);\r
+                               this.loadXmlDoc(node, depth, filter);\r
                        }\r
                },\r
                                \r
-               loadXmlDoc : function(node){\r
+               loadXmlDoc : function(node, depth, filter){\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
-                                       request.setParameter("depth", 1);\r
+                                       if(depth && depth != -1){\r
+                                               request.setParameter("depth", depth);\r
+                                       }\r
                                }\r
                                request.addListener("completed", function(response){\r
                                        this._xmlDoc = response.getContent();\r
index 5b94762c17ca7a5e2ca27a104adb741f7c0e38ed..bf01cefbc41d22c3c181d03d94a9588ad36980c7 100644 (file)
@@ -45,7 +45,7 @@ qx.Class.define("org.argeo.jcr.ria.views.ContextNodeInputView", {
                        this.set({\r
                                layout : new qx.ui.layout.HBox(),\r
                                dataModel : dataModel,\r
-                               padding: 10\r
+                               padding: 5\r
                                decorator : 'toolbar'\r
                        });                     \r
                        \r
@@ -60,6 +60,7 @@ qx.Class.define("org.argeo.jcr.ria.views.ContextNodeInputView", {
                        \r
                        this.selectionInput = new qx.ui.form.TextField();\r
                        this.selectionInput.setWidth(300);\r
+                       this.selectionInput.setReadOnly(true);\r
                        this.add(this.selectionInput);\r
                        \r
                        this._attachInputsToDM();                       \r
diff --git a/server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/ListView.js b/server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/ListView.js
new file mode 100644 (file)
index 0000000..24ee649
--- /dev/null
@@ -0,0 +1,137 @@
+qx.Class.define("org.argeo.jcr.ria.views.ListView", {\r
+       extend : qx.ui.container.Composite, \r
+       implement : [org.argeo.ria.components.IView],\r
+       properties : {\r
+               /**\r
+                * The commands definition Map that will be automatically added and wired to the menubar and toolbar.\r
+                * See {@link org.argeo.ria.event.CommandsManager#definitions} for the keys to use for defining commands.\r
+                */\r
+               commands : {\r
+                       init : {}\r
+               },\r
+               viewSelection : {\r
+                       nullable:false, \r
+                       check:"org.argeo.ria.components.ViewSelection"\r
+               },\r
+               instanceId : {\r
+                       init:"listView",\r
+                       event : "changeInstanceId"\r
+               },\r
+               instanceLabel : {\r
+                       init:"List",\r
+                       event : "changeInstanceLabel"\r
+               },\r
+               dataModel : {\r
+                       \r
+               }\r
+       },\r
+       \r
+       construct : function(){\r
+               this.base(arguments);\r
+       },\r
+       \r
+       members : {\r
+               /**\r
+                * The implementation should contain the GUI initialisation.\r
+                * This is the role of the manager to actually add the graphical component to the pane, \r
+                * so it's not necessary to do it here. \r
+                * @param viewPane {org.argeo.ria.components.ViewPane} The pane manager\r
+                * @param data {Mixed} Any object or data passed by the initiator of the view\r
+                * @return {Boolean}\r
+                */\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
+                       var split = new qx.ui.splitpane.Pane("vertical");\r
+                       split.setDecorator(null);\r
+                       this.add(split, {flex:1});\r
+                       \r
+                       this.list = new qx.ui.form.List();                      \r
+                       split.add(this.list,1);\r
+                       \r
+                       this.propInput = new qx.ui.form.TextArea();\r
+                       split.add(this.propInput,1);\r
+                       var call = new qx.util.DeferredCall(function(){\r
+                               qx.bom.element.Style.set(this.propInput.getContentElement().getDomElement(), "lineHeight", "1.8");\r
+                       }, this);\r
+                       call.schedule();\r
+               },\r
+               /**\r
+                * The implementation should contain the real data loading (i.o. query...)\r
+                * @return {Boolean}\r
+                */\r
+               load : function(){\r
+                       var dataModel = this.getDataModel();\r
+                       dataModel.addListener("changeSelection", function(event){\r
+                               if(dataModel.getSelectionSource() == this) return;\r
+                               var selection = event.getData();\r
+                               this.list.removeAll();\r
+                               if(!selection.length) {\r
+                                       return;\r
+                               }\r
+                               var contextNode = selection[0];\r
+                               this._parseNode(contextNode);\r
+                       }, this);\r
+               },\r
+               \r
+               _parseNode : function (jcrNode){\r
+                       if(jcrNode.getLoadState() == "loaded"){\r
+                               this.list.removeAll();\r
+                               if(jcrNode.getParent()){\r
+                                       this.list.add(this._initListItem(jcrNode.getParent(), ".."));\r
+                               }\r
+                               var children = jcrNode.getChildren();\r
+                               for(var i=0;i<children.length;i++){\r
+                                       this.list.add(this._initListItem(children[i]));\r
+                               }\r
+                               if(this.list.hasChildren()){\r
+                                       this.list.setSelection([this.list.getChildren()[0]]);\r
+                               }\r
+                               var properties = jcrNode.getProperties();\r
+                               var propString = "";\r
+                               for(var i=0;i<properties.length;i++){\r
+                                       propString += properties[i].getName()+"="+properties[i].getValue()+"\n";\r
+                               }\r
+                               this.propInput.setValue(propString);\r
+                       }else{\r
+                               var listener = function(event){\r
+                                       if(event.getData() == "loaded"){\r
+                                               this._parseNode(jcrNode);\r
+                                               jcrNode.removeListener("changeLoadState", listener, this);\r
+                                       }\r
+                               };\r
+                               jcrNode.addListener("changeLoadState", listener, this);\r
+                               if(jcrNode.getLoadState() != "loading"){\r
+                                       jcrNode.load();\r
+                               }\r
+                       }\r
+               },\r
+               \r
+               _initListItem : function(jcrNode, label){\r
+                       var li = new qx.ui.form.ListItem((label?label:jcrNode.getName()));\r
+                       li.setModel(jcrNode);\r
+                       li.addListener("dblclick", function(){\r
+                               this.getDataModel().setSelectionWithSource([jcrNode], this);\r
+                       }, this);\r
+                       return li;\r
+               },\r
+               \r
+               /**\r
+                * Whether this component is already contained in a scroller (return false) or not (return true).\r
+                * @return {Boolean}\r
+                */\r
+               addScroll : function(){\r
+                       return false;\r
+               },\r
+               /**\r
+                * Called at destruction time\r
+                * Perform all the clean operations (stopping polling queries, etc.) \r
+                */\r
+               close : function(){\r
+                       \r
+               }               \r
+               \r
+       }\r
+});\r
index a164315a51a3e32631732734c5c4ff1e741226d4..92b6755e89d59cbf399ffaddf090b56332e9a03b 100644 (file)
@@ -8,7 +8,21 @@ qx.Class.define("org.argeo.jcr.ria.views.PlainXmlViewer", {
                 * See {@link org.argeo.ria.event.CommandsManager#definitions} for the keys to use for defining commands.\r
                 */\r
                commands : {\r
-                       init : {}\r
+                       init : {\r
+                               "close" : {\r
+                                       label           : "Close",\r
+                                       shared          : true,\r
+                                       icon            : "org.argeo.slc.ria/window-close.png",\r
+                                       shortcut        : "Control+w",\r
+                                       enabled         : true,\r
+                                       menu            : "Test",\r
+                                       toolbar         : "result",\r
+                                       callback        : function(e){\r
+                                               this._viewPane.closeCurrent();\r
+                                       },\r
+                                       command         : null\r
+                               }                               \r
+                       }\r
                },\r
                viewSelection : {\r
                        nullable:false, \r
@@ -21,9 +35,6 @@ qx.Class.define("org.argeo.jcr.ria.views.PlainXmlViewer", {
                instanceLabel : {\r
                        init:"Xml Editor",\r
                        event : "changeInstanceLabel"\r
-               },\r
-               dataModel : {\r
-                       \r
                }\r
        },\r
        \r
@@ -40,11 +51,14 @@ qx.Class.define("org.argeo.jcr.ria.views.PlainXmlViewer", {
                 * @param data {Mixed} Any object or data passed by the initiator of the view\r
                 * @return {Boolean}\r
                 */\r
-               init : function(viewPane, dataModel){\r
+               init : function(viewPane, jcrNode){\r
+                       this._viewPane = viewPane;\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
+                       \r
+                       this.setInstanceId("edit:" + jcrNode.getPath());\r
+                       this.setInstanceLabel("Node '" + jcrNode.getName()+"'");\r
+                       \r
                        this.htmlPane = new qx.ui.embed.Html();\r
                        this.htmlPane.setOverflow("auto", "auto");\r
                        this.htmlPane.setDecorator("input");\r
@@ -55,52 +69,56 @@ qx.Class.define("org.argeo.jcr.ria.views.PlainXmlViewer", {
                 * The implementation should contain the real data loading (i.o. query...)\r
                 * @return {Boolean}\r
                 */\r
-               load : function(){\r
-                       var dataModel = this.getDataModel();\r
-                       dataModel.addListener("changeSelection", function(event){\r
-                               var selection = event.getData();\r
-                               if(!selection.length) {\r
-                                       this.htmlPane.setHtml("");\r
-                                       return;\r
+               load : function(jcrNode){\r
+                       // Load full XML (deep)                 \r
+                       //jcrNode.load(-1);\r
+                       var fakeNode = new org.argeo.jcr.ria.model.Node(jcrNode.getName(), jcrNode.getNodeProvider(), true);\r
+                       fakeNode.setPath(jcrNode.getPath());\r
+                       fakeNode.addListener("changeLoadState", function(event){\r
+                               if(event.getData() == "loaded"){\r
+                                       var xmlString = fakeNode.toXmlString(true);\r
+                                       this._loadXmlString(xmlString);\r
+                               }\r
+                       }, this);\r
+                       fakeNode.load(-1);\r
+               },\r
+               \r
+               _loadXmlString : function(xmlString){\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
+                   var TAG_ATTRIBUTE = new RegExp("\\s([0-9a-zA-Z:_]+)\\=\"([^\"]*)\"", "gi");\r
+                   // Not implemented yet\r
+                   var TAG_COMMENT = new RegExp("(<!--.*-->)", "gi");\r
+                   var TAG_CDATA_START = new RegExp("(\\<!\\[CDATA\\[).*", "gi");\r
+                   var TAG_CDATA_END = new RegExp(".*(]]>)", "gi");\r
+                       \r
+                   xmlString = xmlString.replace(TAG_START_PATTERN, 'xml_div_begin&lt;xml_tagname_begin$1xml_tagname_end$2&gt;');\r
+                   xmlString = xmlString.replace(TAG_END_PATTERN, '&lt;/xml_tagname_begin$1xml_tagname_end&gt;xml_div_end');\r
+                   xmlString = xmlString.replace(TAG_CLOSE_PATTERN, '&gt;');\r
+                   \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: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_attname_begin)", "g"), '<b>');\r
+                       xmlString = xmlString.replace(new RegExp("(xml_attname_end)", "g"), '</b>');\r
+                       xmlString = xmlString.replace(new RegExp("(xml_attvalue_begin)", "g"), '<span style="color:rgb(0,0,255)">');\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
+                       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
-                               var xmlString = selection[0].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
-                           var TAG_ATTRIBUTE = new RegExp("\\s([0-9a-zA-Z:_]+)\\=\"([^\"]*)\"", "gi");\r
-                           // Not implemented yet\r
-                           var TAG_COMMENT = new RegExp("(<!--.*-->)", "gi");\r
-                           var TAG_CDATA_START = new RegExp("(\\<!\\[CDATA\\[).*", "gi");\r
-                           var TAG_CDATA_END = new RegExp(".*(]]>)", "gi");\r
-                               \r
-                           xmlString = xmlString.replace(TAG_START_PATTERN, 'xml_div_begin&lt;xml_tagname_begin$1xml_tagname_end$2&gt;');\r
-                           xmlString = xmlString.replace(TAG_END_PATTERN, '&lt;/xml_tagname_begin$1xml_tagname_end&gt;xml_div_end');\r
-                           xmlString = xmlString.replace(TAG_CLOSE_PATTERN, '&gt;');\r
-                           \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: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_attname_begin)", "g"), '<b>');\r
-                               xmlString = xmlString.replace(new RegExp("(xml_attname_end)", "g"), '</b>');\r
-                               xmlString = xmlString.replace(new RegExp("(xml_attvalue_begin)", "g"), '<span style="color:rgb(0,0,255)">');\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
-                               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
                        }, this);\r
-                       dataModel.requireContextChange();                       \r
+                       call.schedule();                        \r
                },\r
                \r
                _setAttributesSpanEditable : function(span){\r
index 9fd2e163cd452a5005e0ef7af652e6084c8cfb97..1dff09f3749ac81a85828d2f142f113bf7d17af7 100644 (file)
@@ -14,8 +14,8 @@ qx.Class.define("org.argeo.jcr.ria.views.TreeView", {
                                        icon : "org.argeo.slc.ria/media-playback-start.png",\r
                                        shortcut : null,\r
                                        enabled : true,\r
-                                       menu : "Context",\r
-                                       toolbar : "context",\r
+                                       menu : "Zoom",\r
+                                       toolbar : "zoom",\r
                                        callback : function(e) {\r
                                                var selection = this.tree.getSelection();\r
                                                if(!selection.length) return;\r
@@ -38,8 +38,8 @@ qx.Class.define("org.argeo.jcr.ria.views.TreeView", {
                                        icon : "org.argeo.slc.ria/media-playback-start.png",\r
                                        shortcut : null,\r
                                        enabled : true,\r
-                                       menu : "Context",\r
-                                       toolbar : "context",\r
+                                       menu : "Zoom",\r
+                                       toolbar : "zoom",\r
                                        submenu : [],\r
                                        callback : function(e) {\r
                                        },\r
@@ -69,6 +69,26 @@ qx.Class.define("org.argeo.jcr.ria.views.TreeView", {
                                                }\r
                                                this.setMenu(pathes);\r
                                        }\r
+                               },\r
+                               "open" : {\r
+                                       label : "Open",\r
+                                       icon : "org.argeo.slc.ria/media-playback-start.png",\r
+                                       shortcut : null,\r
+                                       enabled : true,\r
+                                       menu : "Selection",\r
+                                       toolbar : "selection",\r
+                                       callback : function(e) {\r
+                                               var selection = this.tree.getSelection();\r
+                                               if(!selection.length) return;\r
+                                               var jcrNode = selection[0].getJcrNode();\r
+                                               var viewsManager = org.argeo.ria.components.ViewsManager.getInstance();                                         \r
+                                               var testView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.PlainXmlViewer, "editor", jcrNode);\r
+                                               testView.load(jcrNode);\r
+                                               \r
+                                       },\r
+                                       selectionChange : function(viewId, selection){\r
+                                               \r
+                                       }\r
                                }                               \r
                        }\r
                },\r
@@ -81,7 +101,7 @@ qx.Class.define("org.argeo.jcr.ria.views.TreeView", {
                        event : "changeInstanceId"\r
                },\r
                instanceLabel : {\r
-                       init:"Tree View",\r
+                       init:"Full Tree",\r
                        event : "changeInstanceLabel"\r
                },\r
                dataModel : {\r
@@ -118,7 +138,6 @@ qx.Class.define("org.argeo.jcr.ria.views.TreeView", {
                        var dataModel = this.getDataModel();\r
                        dataModel.addListener("changeContextNode", function(event){\r
                                var contextNode = event.getData();\r
-                               var loader = function(){};\r
                                var newRoot = new org.argeo.jcr.ria.views.JcrTreeFolder(contextNode);\r
                                this.tree.setRoot(newRoot);\r
                                this.tree.setSelection([newRoot]);\r
@@ -132,10 +151,32 @@ qx.Class.define("org.argeo.jcr.ria.views.TreeView", {
                                        selection.push(sel[i].getJcrNode());\r
                                        viewSelection.addNode(sel[i]);\r
                                }\r
-                               this.getDataModel().setSelection(selection);\r
+                               this.getDataModel().setSelectionWithSource(selection, this);\r
+                       }, this);\r
+                       dataModel.addListener("changeSelection", function(e){\r
+                               if(this.getDataModel().getSelectionSource() == this) return;\r
+                               var selection = this.getDataModel().getSelection();\r
+                               // Arbitrary : for the moment, external select can only apply\r
+                               // to children of the current selection\r
+                               var crtSel = this.tree.getSelection();\r
+                               if(!crtSel.length || !selection.length) return;\r
+                               var crtTreeSel = crtSel[0];\r
+                               if(selection[0].getParent() && crtTreeSel.getJcrNode().getPath() == selection[0].getParent().getPath()){\r
+                                       crtTreeSel.setOpen(true);\r
+                                       var crtChildren =crtTreeSel.getChildren(); \r
+                                       for(var i=0;i<crtChildren.length;i++){\r
+                                               if(crtChildren[i].getJcrNode().getPath() == selection[0].getPath()){\r
+                                                       this.tree.setSelection([crtChildren[i]]);\r
+                                                       return;\r
+                                               }\r
+                                       }\r
+                               }else if(crtTreeSel.getParent() && crtTreeSel.getJcrNode().getParent().getPath() == selection[0].getPath()){\r
+                                       this.tree.setSelection([crtTreeSel.getParent()]);\r
+                               }\r
+                               \r
                        }, this);\r
                        this.tree.setContextMenu(org.argeo.ria.event.CommandsManager\r
-                                       .getInstance().createMenuFromIds(["zoom_in", "zoom_out"]));                             \r
+                                       .getInstance().createMenuFromIds(["open", "zoom_in", "zoom_out"]));                             \r
                },\r
                \r
                /**\r