Play with context node and selection changes.
authorCharles du Jeu <charles.dujeu@gmail.com>
Wed, 28 Apr 2010 15:42:00 +0000 (15:42 +0000)
committerCharles du Jeu <charles.dujeu@gmail.com>
Wed, 28 Apr 2010 15:42:00 +0000 (15:42 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@3514 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/ContextNodeInputView.js [new file with mode: 0644]
server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/JcrTreeFolder.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 [new file with mode: 0644]

index 1def8d5aeac799be9e267f9ea37453e27eff3213..48191b259bf422ed0798467c4143deb640aa6ceb 100644 (file)
@@ -26,15 +26,18 @@ qx.Class.define("org.argeo.jcr.ria.JcrBrowser",
        \r
        initViewPanes : function(viewsManager){\r
                \r
+               this._tBar = new org.argeo.ria.components.ViewPane("toolbar", "");\r
+               this._tBar.header.setVisibility("excluded");\r
+               viewsManager.getViewPanesContainer().add(this._tBar);\r
+               \r
                this._splitPane = new qx.ui.splitpane.Pane("horizontal");\r
-               var mainPane = new org.argeo.ria.components.ViewPane("fulltree", "Full Tree");\r
-               this._splitPane.add(mainPane, 1);\r
+               var leftPane = new org.argeo.ria.components.ViewPane("treeview", "Tree View");\r
+               this._splitPane.add(leftPane, 1);\r
+               var mainPane = new org.argeo.ria.components.ViewPane("fulltree", "Editor View");\r
+               this._splitPane.add(mainPane, 2);\r
+               viewsManager.registerViewPane(this._tBar);\r
                viewsManager.registerViewPane(mainPane);      \r
-               /*\r
-               var uploadPane = new org.argeo.ria.components.ViewPane("upload", "Upload a distribution");\r
-               this._splitPane.add(uploadPane, 1);\r
-               viewsManager.registerViewPane(uploadPane);   \r
-               */   \r
+               viewsManager.registerViewPane(leftPane);   \r
                viewsManager.getViewPanesContainer().add(this._splitPane, {flex:1});\r
                \r
        },\r
@@ -46,16 +49,23 @@ qx.Class.define("org.argeo.jcr.ria.JcrBrowser",
                        dynamic : true,\r
                        pathParameter:"path"\r
                        });             \r
-               var rootNode = new org.argeo.jcr.ria.model.Node("Root", true);\r
+               var rootNode = new org.argeo.jcr.ria.model.Node("Root", nodeProvider, true);\r
                rootNode.setPath('/slc');\r
-               rootNode.setNodeProvider(nodeProvider);\r
                var dataModel = new org.argeo.jcr.ria.model.DataModel(rootNode);\r
+               \r
+               var inputView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.ContextNodeInputView, "toolbar", dataModel);\r
+               inputView.load();\r
+               \r
                var testView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.PlainXmlViewer, "fulltree", dataModel);\r
                testView.load();\r
+               \r
+               var treeView = viewsManager.initIViewClass(org.argeo.jcr.ria.views.TreeView, "treeview", dataModel);\r
+               treeView.load();\r
        },\r
        \r
        remove : function(viewsManager){\r
                viewsManager.getViewPanesContainer().remove(this._splitPane);           \r
+               viewsManager.getViewPanesContainer().remove(this._tBar);\r
        }\r
        \r
   }\r
index 9ed6205394c9222639fb8587e95092f37687c673..4432c80665eb0f917dbda82c99dea87b1f7e306b 100644 (file)
@@ -14,8 +14,9 @@ qx.Class.define("org.argeo.jcr.ria.model.DataModel", {
                        check : "org.argeo.jcr.ria.model.Node"\r
                },\r
                selection : {\r
-                       check : "org.argeo.jcr.ria.model.Node[]",\r
-                       event : "changeSelection"\r
+                       check : "Array",\r
+                       event : "changeSelection",\r
+                       init : []\r
                }\r
        },\r
        \r
@@ -28,6 +29,7 @@ qx.Class.define("org.argeo.jcr.ria.model.DataModel", {
                requireContextChange : function(path){\r
                        var targetNode;\r
                        var rootNode = this.getRootNode();\r
+                       this.setSelection([]);\r
                        if(!path){\r
                                targetNode = rootNode;\r
                        }else{\r
@@ -36,9 +38,8 @@ qx.Class.define("org.argeo.jcr.ria.model.DataModel", {
                                        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
+                               targetNode = new org.argeo.jcr.ria.model.Node(base, rootNode.getNodeProvider());\r
                                rootNode.addChild(targetNode);\r
-                               targetNode.setNodeProvider(rootNode.getNodeProvider());\r
                                targetNode.setPath(path);                               \r
                        }\r
                        var observer = function(event){\r
index fcd5e6d22f05e86db5860f308919cf902f6a63f1..3cf7e49647addb16811a7e027162b244884f0fa8 100644 (file)
@@ -18,15 +18,19 @@ qx.Class.define("org.argeo.jcr.ria.model.Node", {
                        event : "changeLoadState"\r
                },\r
                nodeProvider : {\r
-                       check : "org.argeo.jcr.ria.provider.INodeProvider"                      \r
+                       check : "org.argeo.jcr.ria.provider.INodeProvider",\r
+                       nullable : true\r
                }\r
        },\r
        \r
-       construct : function(nodeName, isRoot){\r
+       construct : function(nodeName, nodeProvider, isRoot){\r
                this.base(arguments);\r
                this._children = {};\r
                this._properties = {};  \r
                this.setName(nodeName);\r
+               if(nodeProvider){\r
+                       this.setNodeProvider(nodeProvider);                     \r
+               }\r
                if(isRoot){\r
                        this.setPath("");\r
                        this.setRoot(this);\r
@@ -63,11 +67,11 @@ qx.Class.define("org.argeo.jcr.ria.model.Node", {
                        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
+                               var jcrChild = new org.argeo.jcr.ria.model.Node(child.nodeName, this.getNodeProvider());\r
                                this.addChild(jcrChild);\r
                                jcrChild.fromDomElement(child);\r
                        }\r
-                       this.setLoadState("loaded");\r
+                       //this.setLoadState("loaded");\r
                },\r
                \r
                toXmlString : function(recurse, childrenWriter){\r
index 0f7057a37f9b4091e2cc6026bc1b3a7cda5d184c..ee98349734931297f724c77c8b08a175aa5860c0 100644 (file)
@@ -33,9 +33,8 @@ 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
+                               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
@@ -43,9 +42,9 @@ qx.Class.define("org.argeo.jcr.ria.provider.XmlNodeProvider", {
                                                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
diff --git a/server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/ContextNodeInputView.js b/server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/ContextNodeInputView.js
new file mode 100644 (file)
index 0000000..5b94762
--- /dev/null
@@ -0,0 +1,112 @@
+qx.Class.define("org.argeo.jcr.ria.views.ContextNodeInputView", {\r
+       extend : qx.ui.container.Composite,\r
+       implement : [org.argeo.ria.components.IView], \r
+\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:"inputViewer",\r
+                       event : "changeInstanceId"\r
+               },\r
+               instanceLabel : {\r
+                       init:"Xml Editor",\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.set({\r
+                               layout : new qx.ui.layout.HBox(),\r
+                               dataModel : dataModel,\r
+                               padding: 10, \r
+                               decorator : 'toolbar'\r
+                       });                     \r
+                       \r
+                       this.contextInput = new qx.ui.form.TextField();\r
+                       this.contextInput.setWidth(100);\r
+                       this.contextInput.setTextAlign("right");\r
+                       this.add(this.contextInput);\r
+\r
+                       var sep = new qx.ui.basic.Label(":");\r
+                       sep.set({paddingTop:3, paddingLeft:2,paddingRight:2});\r
+                       this.add(sep);\r
+                       \r
+                       this.selectionInput = new qx.ui.form.TextField();\r
+                       this.selectionInput.setWidth(300);\r
+                       this.add(this.selectionInput);\r
+                       \r
+                       this._attachInputsToDM();                       \r
+               },\r
+               /**\r
+                * The implementation should contain the real data loading (i.o. query...)\r
+                * @return {Boolean}\r
+                */\r
+               load : function(){\r
+               },\r
+                               \r
+               _attachInputsToDM : function(){\r
+                       var dm = this.getDataModel();\r
+                       this.contextInput.addListener("keypress", function(event){\r
+                               if(event.getKeyIdentifier() != "Enter") return;\r
+                               var path = this.contextInput.getValue();\r
+                               dm.requireContextChange(path);\r
+                       }, this);\r
+                       dm.addListener("changeContextNode", function(event){\r
+                               var ctxtNode = event.getData();\r
+                               this.contextInput.setValue(ctxtNode.getPath());\r
+                       }, this);\r
+                       dm.addListener("changeSelection", function(event){\r
+                               var sel = event.getData();\r
+                               if(!sel.length){\r
+                                       this.selectionInput.setValue("/");\r
+                               }else{\r
+                                       this.selectionInput.setValue(sel[0].getPath().substring(this.contextInput.getValue().length));\r
+                               }\r
+                       },this);\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
+});
\ No newline at end of file
diff --git a/server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/JcrTreeFolder.js b/server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/JcrTreeFolder.js
new file mode 100644 (file)
index 0000000..96505f8
--- /dev/null
@@ -0,0 +1,43 @@
+qx.Class.define("org.argeo.jcr.ria.views.JcrTreeFolder", {\r
+       extend : org.argeo.ria.components.DynamicTreeFolder,\r
+       properties : {\r
+               jcrNode : {\r
+                       \r
+               }\r
+       },\r
+       construct : function(jcrNode){\r
+               this.base(arguments, jcrNode.getName(), org.argeo.jcr.ria.views.JcrTreeFolder.loader);\r
+               this.setJcrNode(jcrNode);\r
+       },\r
+       \r
+       statics : {\r
+               loader : function(treeFolder){\r
+                       if(treeFolder.getState() == "loaded") return;\r
+                       var jcrNode = treeFolder.getJcrNode();\r
+                       jcrNode.addListener("changeLoadState", function(event){\r
+                               if(event.getData() == "loaded"){\r
+                                       org.argeo.jcr.ria.views.JcrTreeFolder.jcrNodeToTreeFolder(jcrNode, treeFolder);\r
+                               }\r
+                       });\r
+                       if(jcrNode.getLoadState()=="loaded"){\r
+                               org.argeo.jcr.ria.views.JcrTreeFolder.jcrNodeToTreeFolder(jcrNode, treeFolder);\r
+                       }else if(jcrNode.getLoadState() == "empty"){\r
+                               //treeFolder.removeAll();\r
+                               jcrNode.load();\r
+                       }\r
+               },\r
+               \r
+               jcrNodeToTreeFolder : function(loadedNode, parentTreeFolder){\r
+                       var children = loadedNode.getChildren();\r
+                       for(var i=0;i<children.length;i++){\r
+                               var newFolder = new org.argeo.jcr.ria.views.JcrTreeFolder(children[i]);\r
+                               parentTreeFolder.add(newFolder);\r
+                       }\r
+                       parentTreeFolder.setState("loaded");\r
+               }               \r
+       },\r
+       members : {\r
+               openListener : function(e){\r
+               }               \r
+       }\r
+});
\ No newline at end of file
index db862d20e57ba54a4153d265dda0b44340f6dc8b..c21f3ac56209bea8f390a5bd70b456814e3f4545 100644 (file)
@@ -44,14 +44,10 @@ qx.Class.define("org.argeo.jcr.ria.views.PlainXmlViewer", {
                        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
+                                               \r
                        this.htmlPane = new qx.ui.embed.Html();\r
                        this.htmlPane.setOverflow("auto", "auto");\r
+                       this.htmlPane.setDecorator("input");\r
                        this.add(this.htmlPane, {flex:1});\r
                        \r
                },\r
@@ -61,12 +57,17 @@ qx.Class.define("org.argeo.jcr.ria.views.PlainXmlViewer", {
                 */\r
                load : function(){\r
                        var dataModel = this.getDataModel();\r
-                       dataModel.addListener("changeContextNode", function(event){\r
-                               var xmlString = event.getData().toXmlString(true);\r
+                       dataModel.addListener("changeSelection", function(event){\r
+                               var selection = event.getData();\r
+                               if(!selection.length) {\r
+                                       this.htmlPane.setHtml("");\r
+                                       return;\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
+                           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
@@ -111,21 +112,7 @@ qx.Class.define("org.argeo.jcr.ria.views.PlainXmlViewer", {
                        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
                /**\r
                 * Whether this component is already contained in a scroller (return false) or not (return true).\r
                 * @return {Boolean}\r
diff --git a/server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/TreeView.js b/server/org.argeo.slc.ria/src/argeo-ria-lib/jcr/class/org/argeo/jcr/ria/views/TreeView.js
new file mode 100644 (file)
index 0000000..233c316
--- /dev/null
@@ -0,0 +1,156 @@
+qx.Class.define("org.argeo.jcr.ria.views.TreeView", {\r
+       extend : qx.ui.container.Composite,\r
+       implement : [org.argeo.ria.components.IView], \r
+\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
+                               "zoom_in" : {\r
+                                       label : "Zoom To Node",\r
+                                       icon : "org.argeo.slc.ria/media-playback-start.png",\r
+                                       shortcut : null,\r
+                                       enabled : true,\r
+                                       menu : "Context",\r
+                                       toolbar : "context",\r
+                                       callback : function(e) {\r
+                                               var selection = this.tree.getSelection();\r
+                                               if(!selection.length) return;\r
+                                               var path = selection[0].getJcrNode().getPath();\r
+                                               this.getDataModel().requireContextChange(path);\r
+                                       },\r
+                                       selectionChange : function(viewId, selection){\r
+                                               if(viewId != "treeview") return;\r
+                                               if(!selection || !selection.length) return;\r
+                                               var treeNode = selection[0];\r
+                                               if(treeNode.getParent()!=null){\r
+                                                       this.setEnabled(true);\r
+                                               }else{\r
+                                                       this.setEnabled(false);\r
+                                               }\r
+                                       }\r
+                               },\r
+                               "zoom_out" : {\r
+                                       label : "Zoom Out",\r
+                                       icon : "org.argeo.slc.ria/media-playback-start.png",\r
+                                       shortcut : null,\r
+                                       enabled : true,\r
+                                       menu : "Context",\r
+                                       toolbar : "context",\r
+                                       submenu : [],\r
+                                       callback : function(e) {\r
+                                       },\r
+                                       submenuCallback : function(commandId){\r
+                                               this.getDataModel().requireContextChange(commandId);\r
+                                       },\r
+                                       selectionChange : function(viewId, selection){\r
+                                               if(viewId != "treeview") return;\r
+                                               if(!selection || !selection.length) return;\r
+                                               var treeNode = selection[0];\r
+                                               if(treeNode.getParent()!=null || treeNode.getJcrNode().itemIsRoot()){\r
+                                                       this.setEnabled(false);\r
+                                                       return;\r
+                                               }\r
+                                               this.setEnabled(true);\r
+                                               var nodePath = treeNode.getJcrNode().getPath();\r
+                                               var parts = nodePath.split("\/");\r
+                                               var pathes = [];\r
+                                               parts.pop();\r
+                                               if(parts.length > 1){\r
+                                                       for(var i=0;i<parts.length;i++){\r
+                                                               var newPath = parts.join("/");\r
+                                                               pathes.push({label:newPath,icon:'', commandId:newPath});\r
+                                                               parts.pop();\r
+                                                       }\r
+                                               }\r
+                                               this.setMenu(pathes);\r
+                                       }\r
+                               }                               \r
+                       }\r
+               },\r
+               viewSelection : {\r
+                       nullable:false, \r
+                       check:"org.argeo.ria.components.ViewSelection"\r
+               },\r
+               instanceId : {\r
+                       init:"treeView",\r
+                       event : "changeInstanceId"\r
+               },\r
+               instanceLabel : {\r
+                       init:"Tree View",\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
+                       this.tree = new qx.ui.tree.Tree();                      \r
+                       this.add(this.tree, {flex:1});\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("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
+                       }, this);\r
+                       this.tree.addListener("changeSelection", function(e){\r
+                               var sel = this.tree.getSelection();\r
+                               var selection = [];\r
+                               var viewSelection = this.getViewSelection();\r
+                               viewSelection.clear();                          \r
+                               for(var i=0;i<sel.length;i++){\r
+                                       selection.push(sel[i].getJcrNode());\r
+                                       viewSelection.addNode(sel[i]);\r
+                               }\r
+                               this.getDataModel().setSelection(selection);\r
+                       }, this);\r
+                       this.tree.setContextMenu(org.argeo.ria.event.CommandsManager\r
+                                       .getInstance().createMenuFromIds(["zoom_in", "zoom_out"]));                             \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
+});
\ No newline at end of file