]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
QX 1.1 Migration
authorCharles du Jeu <charles.dujeu@gmail.com>
Thu, 15 Jul 2010 09:23:46 +0000 (09:23 +0000)
committerCharles du Jeu <charles.dujeu@gmail.com>
Thu, 15 Jul 2010 09:23:46 +0000 (09:23 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@3698 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/MonitorPerspective.js
server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/Perspective.js
server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/TestList.js

index fd0f4d091c90981f73d7faa6bdea4140a211f293..12d90d40247b04445946bb9ae825c08d0a54555a 100644 (file)
@@ -5,7 +5,7 @@
 /* ************************************************************************\r
 #require(org.argeo.jcr.ria.JcrBrowser)\r
 #require(org.argeo.security.ria.Perspective)\r
-#asset(argeo-ria-lib/slc/resource/org.argeo.slc.ria/*)\r
+#asset(org/argeo/slc/ria/*)\r
 \r
 ************************************************************************ */ \r
 qx.Class.define("org.argeo.slc.web.MonitorPerspective",\r
@@ -20,7 +20,7 @@ qx.Class.define("org.argeo.slc.web.MonitorPerspective",
   \r
   statics : {\r
        LABEL : "SLC Administration",\r
-       ICON : "org.argeo.slc.ria/utilities-terminal.png"\r
+       ICON : "org/argeo/slc/ria/utilities-terminal.png"\r
        //ROLES_RESTRICTION : ["ROLE_ADMIN"]\r
   },\r
   \r
index 40d9761c65fa9ce71951bf0bf0fc24db090fdd64..8ee5d708453a0b209303bdca705bd71c1e697450 100644 (file)
@@ -19,7 +19,7 @@ qx.Class.define("org.argeo.slc.web.Perspective",
   \r
   statics : {\r
        LABEL : "Test Results",\r
-       ICON : "org.argeo.slc.ria/office-chart.png"\r
+       ICON : "org/argeo/slc/ria/office-chart.png"\r
   },\r
   \r
   members : {\r
index e0816ffce1f73378b9a2c3c44b707bda69b080a5..4e71dedb234c51965d6fc026b1b6876135763006 100644 (file)
-/**\r
- * Basic IView implementation for displaying the test results list, by collection.\r
- * \r
- * This component creates a Table object and feed it with the results. It adds a collection chooser to its viewPane header.\r
- *  \r
- * It creates the following commands : "loadtestlist", "polllistloading", "opentest", "download", "copytocollection", "deletetest".\r
- */\r
-qx.Class.define("org.argeo.slc.web.TestList",\r
-{\r
-  extend : qx.ui.container.Composite,\r
-  implement : [org.argeo.ria.components.IView], \r
-  include : [org.argeo.ria.session.MPrefHolder],\r
-\r
-  statics : {\r
-       riaPreferences : {\r
-               "slc.web.TestList.DefaultAction" : {\r
-                       label : "Test List : Double Click default action",\r
-                       type : "list",\r
-                       list : ["Open","Download Xls"],\r
-                       defaultValue : "Open"\r
-               }\r
-       }\r
-  },\r
-  \r
-  construct : function(){\r
-       this.base(arguments, new qx.ui.layout.VBox());          \r
-       var model = new qx.ui.table.model.Simple();\r
-       model.setColumns(["Test Case", "Date"]);\r
-       this.table = new qx.ui.table.Table(model, {\r
-               tableColumnModel: function(obj){\r
-                       return new qx.ui.table.columnmodel.Resize(obj)\r
-               }\r
-       });\r
-  },\r
-\r
-  properties : \r
-  {\r
-       /**\r
-        * The viewPane containing this applet.\r
-        */\r
-       view : {\r
-               init : null\r
-       },\r
-       viewSelection : {\r
-               nullable:false, \r
-               check:"org.argeo.ria.components.ViewSelection"\r
-       },  \r
-       instanceId : {init:""},\r
-       instanceLabel : {init:""},\r
-       /**\r
-        * The load list of available collection (Map of ids => labels)\r
-        */\r
-       collectionList : {\r
-               init : {},\r
-               check : "Map"\r
-       },\r
-       /**\r
-        * The current collection id selected.\r
-        */\r
-       collectionId:{\r
-               init : 'My Collection',\r
-               check : "String"\r
-       },\r
-       currentOpenInstanceId : {\r
-               check : "String",\r
-               nullable:true\r
-       },\r
-       /**\r
-        * The applet commands.\r
-        */\r
-       commands : {\r
-               init : {\r
-                       "loadtestlist" : {\r
-                               label           : "Load Collection", \r
-                               icon            : "org.argeo.slc.ria/view-refresh.png",\r
-                               shortcut        : "Control+l",\r
-                               enabled         : true,\r
-                               menu            : "Collection",\r
-                               toolbar         : "collection",\r
-                               callback        : function(e){\r
-                                       this.loadList();\r
-                               }, \r
-                               command         : null\r
-                       },\r
-                       "polllistloading" : {\r
-                               label           : "Auto load", \r
-                               icon            : "org.argeo.slc.ria/document-open-recent.png",\r
-                               shortcut        : "Control+l",\r
-                               enabled         : true,\r
-                               toggle          : true,\r
-                               menu            : "Collection",\r
-                               toolbar         : "collection",\r
-                               callback        : function(event){\r
-                                       this.pollListLoading(event.getTarget().getUserData("slc.command.toggleState"));\r
-                               }, \r
-                               command         : null\r
-                       },\r
-                       /*\r
-                       "copyfullcollection" : {\r
-                               label           : "Copy to...", \r
-                               icon            : "org.argeo.slc.ria/edit-copy.png",\r
-                               shortcut        : null,\r
-                               enabled         : false,\r
-                               menu            : "Collection",\r
-                               toolbar         : "collection",\r
-                               callback        : function(e){\r
-                                       // Call service to copy\r
-                               },\r
-                               submenu         : {},\r
-                               submenuCallback : function(commandId){\r
-                                       this.copySelectionToCollection(commandId, "current_collection");\r
-                               },\r
-                               init : function(){\r
-                                       // Call at command creation\r
-                                       org.argeo.ria.remote.RequestManager.getInstance().addListener("reload", function(event){\r
-                                               if(event.getDataType() == "collection" || event.getDataType() == "test_cases"){\r
-                                                       var testList = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("list").getContent();\r
-                                                       testList.collectionListToMenu(this);\r
-                                               }\r
-                                       }, this);\r
-                               },\r
-                               command         : null\r
-                       },\r
-                       */\r
-                       "opentest" : {\r
-                               label           : "Open", \r
-                               icon            : "org.argeo.slc.ria/media-playback-start.png",\r
-                               shortcut        : "Control+o",\r
-                               enabled         : false,\r
-                               menu            : "Selection",\r
-                               toolbar         : "selection",\r
-                               callback        : function(e){\r
-                                       var viewsManager = org.argeo.ria.components.ViewsManager.getInstance();\r
-                                       var classObj = org.argeo.slc.ria.Applet;\r
-                                       var xmlNodes = viewsManager.getViewPaneSelection("list").getNodes();\r
-                                       var iView = viewsManager.initIViewClass(classObj, "applet", xmlNodes[0]);\r
-                                       this.setCurrentOpenInstanceId(iView.getInstanceId());\r
-                                       iView.load(xmlNodes[0]);\r
-                               },\r
-                               selectionChange : function(viewId, xmlNodes){\r
-                                       if(viewId != "list") return;\r
-                                       this.setEnabled(false);\r
-                                       if(xmlNodes == null || !xmlNodes.length) return;\r
-                                       this.setEnabled(true);\r
-                               },\r
-                               command         : null\r
-                       },\r
-                       "download" : {\r
-                               label           : "Download as...", \r
-                               icon            : "org.argeo.slc.ria/go-down.png",\r
-                               shortcut        : null,\r
-                               enabled         : false,\r
-                               menu            : "Selection",\r
-                               toolbar         : "selection",\r
-                               callback        : function(e){ },\r
-                               command         : null,\r
-                               submenu         : [\r
-                                               {'label':"Xsl", 'icon':'org.argeo.slc.ria/mime-xsl.png', 'commandId':'xsl'},\r
-                                               {'label':"Xml", 'icon':'org.argeo.slc.ria/mime-xml.png', 'commandId':'xml'},\r
-                                               {'label':"Excel", 'icon':'org.argeo.slc.ria/mime-xls.png', 'commandId':'xls'},\r
-                                               {'label':"Pdf", 'icon':'org.argeo.slc.ria/mime-pdf.png', 'commandId':'pdf'}\r
-                                       ],\r
-                               submenuCallback : function(commandId){\r
-                                       var uuid = this.extractTestUuid();\r
-                                       var urls = {\r
-                                               xsl : "resultView.xslt",\r
-                                               xml : "resultViewXml.xslt",\r
-                                               xls : "resultView.xls",\r
-                                               pdf : "resultView.pdf"\r
-                                       };\r
-                                       var url = "../"+urls[commandId]+"?uuid="+uuid;\r
-                                       if(commandId == "xls" || commandId == "pdf"){\r
-                                               document.location.href = url;\r
-                                       }else{\r
-                                               var win = window.open(url);\r
-                                       }\r
-                               },\r
-                               selectionChange : function(viewId, xmlNodes){\r
-                                       if(viewId!="list")return;\r
-                                       //this.clearMenus();\r
-                                       this.setEnabled(false);\r
-                                       if(xmlNodes == null || !xmlNodes.length) return;\r
-                                       this.setEnabled(true);\r
-                               }\r
-                       },\r
-                       "attachments" : {\r
-                               label           : "Attachments", \r
-                               icon            : "org.argeo.slc.ria/document-save-as.png",\r
-                               shortcut        : null,\r
-                               enabled         : false,\r
-                               menu            : "Selection",\r
-                               toolbar         : "selection",\r
-                               callback        : function(e){ },\r
-                               command         : null,\r
-                               submenu         : [],\r
-                               submenuCallback : function(commandId){                                          \r
-                                       var split = commandId.split("__commandseparator__");\r
-                                       var uuid = split[0];\r
-                                       var contentType = split[1];\r
-                                       var name = split[2];\r
-                                       var url = org.argeo.slc.ria.SlcApi.buildGetAttachmentUrl(uuid, contentType, name);\r
-                                       var win = window.open(url);\r
-                               },\r
-                               selectionChange : function(viewId, xmlNodes){\r
-                                       if(viewId!="list")return;\r
-                                       this.clearMenus();\r
-                                       this.setEnabled(false);\r
-                                       if(xmlNodes == null || !xmlNodes.length || xmlNodes.length != 1) return;\r
-                                       // Check slc:simple-attachment tags\r
-                                       var attachs = org.argeo.ria.util.Element.selectNodes(xmlNodes[0], "slc:attachments/slc:simple-attachment");\r
-                                       if(attachs && attachs.length){\r
-                                               var submenus = [];\r
-                                               for(var i=0;i<attachs.length;i++){\r
-                                                       var uuid = org.argeo.ria.util.Element.getSingleNodeText(attachs[i], "slc:uuid");\r
-                                                       var contentType = (org.argeo.ria.util.Element.getSingleNodeText(attachs[i], "slc:content-type")||'');\r
-                                                       var name = org.argeo.ria.util.Element.getSingleNodeText(attachs[i], "slc:name");\r
-                                                       submenus.push({\r
-                                                               label:name, \r
-                                                               icon : 'org.argeo.slc.ria/mime-text-plain.png', \r
-                                                               commandId:uuid+'__commandseparator__'+contentType+'__commandseparator__'+name\r
-                                                       });\r
-                                               }\r
-                                               this.setMenu(submenus);\r
-                                               this.setEnabled(true);\r
-                                       }\r
-                               }\r
-                       },\r
-                       "copytocollection" : {\r
-                               label           : "Copy to...", \r
-                               icon            : "org.argeo.slc.ria/edit-copy.png",\r
-                               shortcut        : "Control+c",\r
-                               enabled         : false,\r
-                               menu            : "Selection",\r
-                               toolbar         : "selection",\r
-                               callback        : function(e){\r
-                                       // Call service to copy\r
-                               },\r
-                               submenu         : {},\r
-                               submenuCallback : function(commandId){\r
-                                       this.copySelectionToCollection(commandId, "current_selection");                                 \r
-                               },\r
-                               init : function(){\r
-                                       // Call at command creation\r
-                                       org.argeo.ria.remote.RequestManager.getInstance().addListener("reload", function(event){\r
-                                               if(event.getDataType() == "collection" || event.getDataType() == "test_cases"){\r
-                                                       var testList = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("list").getContent();\r
-                                                       testList.collectionListToMenu(this, true);\r
-                                               }\r
-                                       }, this);\r
-                               },\r
-                               selectionChange : function(viewId, xmlNodes){\r
-                                       if(viewId != "list") return;\r
-                                       this.setEnabled(false);\r
-                                       if(xmlNodes == null || !xmlNodes.length) return;\r
-                                       this.setEnabled(true);                                                  \r
-                               },\r
-                               command         : null\r
-                       },\r
-                       "deletetest" : {\r
-                               label           : "Delete", \r
-                               icon            : "org.argeo.slc.ria/edit-delete.png",\r
-                               shortcut        : "Control+d",\r
-                               enabled         : false,\r
-                               menu            : "Selection",\r
-                               toolbar         : "selection",\r
-                               callback        : function(e){\r
-                                       var modal = new org.argeo.ria.components.Modal("Confirm", null);\r
-                                       var testUuid = this.extractTestUuid();\r
-                                       modal.addConfirm("Are you sure you want to delete<br> test " + testUuid + "?");\r
-                                       modal.addListener("ok", function(){\r
-                                               var request = org.argeo.slc.ria.SlcApi.getRemoveResultService(this.getCollectionId(), this.extractTestUuid());\r
-                                               request.addListener("completed", function(response){\r
-                                                       if(this.getCurrentOpenInstanceId() == "test:"+testUuid){\r
-                                                               var appletView = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("applet");\r
-                                                               if(appletView.contentExists(this.getCurrentOpenInstanceId())){\r
-                                                                       appletView.closeCurrent();\r
-                                                               }\r
-                                                               this.setCurrentOpenInstanceId(null);\r
-                                                       }\r
-                                                       this.loadCollections();\r
-                                                       this.loadList();\r
-                                                       this.info("Test was successfully deleted");\r
-                                               }, this);\r
-                                               request.send();                                         \r
-                                       }, this);\r
-                                       modal.attachAndShow();\r
-                               },\r
-                               selectionChange : function(viewId, xmlNodes){\r
-                                       if(viewId != "list") return;\r
-                                       this.setEnabled(false);\r
-                                       if(xmlNodes == null || !xmlNodes.length) return;\r
-                                       this.setEnabled(true);                                                  \r
-                               },\r
-                               command         : null\r
-                       }\r
-               }\r
-       }\r
-  },\r
-  \r
-  members : {\r
-       init : function(viewPane, data){\r
-               this.setView(viewPane);\r
-               this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));          \r
-       },\r
-       load : function(){\r
-         this.table.set({              \r
-               statusBarVisible: false,\r
-               showCellFocusIndicator:false,\r
-               columnVisibilityButtonVisible:false,\r
-               contextMenu : org.argeo.ria.event.CommandsManager.getInstance().createMenuFromIds(["opentest", "download", "copytocollection", "deletetest"]),\r
-               decorator : new qx.ui.decoration.Background("#fff")\r
-         });\r
-         var viewPane = this.getView();\r
-         this.table.addListener("dblclick", function(e){\r
-               var pref = this.getRiaPreferenceValue("slc.web.TestList.DefaultAction");\r
-               if(pref == "Open"){\r
-                       org.argeo.ria.event.CommandsManager.getInstance().executeCommand("opentest");\r
-               }else{\r
-                       var uuid = this.extractTestUuid();\r
-                       var url = "../resultView.xslt?uuid="+uuid;\r
-                       alert('Should download : '+url);\r
-               }\r
-         }, this);\r
-         var columnModel = this.table.getTableColumnModel(); \r
-         columnModel.getBehavior().setWidth(0, "60%");\r
-         var renderer = new org.argeo.slc.web.XmlRenderer();\r
-         columnModel.setDataCellRenderer(0, renderer);\r
-         columnModel.setDataCellRenderer(1, renderer);\r
-         \r
-         this.table.getSelectionManager().getSelectionModel().addListener("changeSelection", function(e){\r
-               var viewSelection = this.getViewSelection();\r
-               viewSelection.clear();\r
-               var selectionModel = this.table.getSelectionManager().getSelectionModel();\r
-               if(!selectionModel.getSelectedCount()){\r
-                       return;\r
-               }\r
-               var ranges = this.table.getSelectionManager().getSelectionModel().getSelectedRanges();\r
-               var xmlNode = this.table.getTableModel().getRowData(ranges[0].minIndex);\r
-               viewSelection.addNode(xmlNode);\r
-               //viewPane.setViewSelection(viewSelection);\r
-         }, this);             \r
-         \r
-         var select = new qx.ui.form.SelectBox();\r
-         this.getView().addHeaderComponent(select);\r
-         this.getView().setViewTitle("");\r
-         this.add(this.table, {flex:1});\r
-\r
-         select.addListener("changeValue", this.collectionSelectorListener, this);\r
-\r
-         org.argeo.ria.remote.RequestManager.getInstance().addListener("reload", function(event){\r
-                if(event.getDataType()!="collection") return;\r
-                select.removeListener("changeValue", this.collectionSelectorListener, this);\r
-                var collectionList = event.getContent();\r
-                select.removeAll();\r
-                for(key in collectionList){\r
-                       var item = new qx.ui.form.ListItem(collectionList[key], "org.argeo.slc.ria/folder.png", key);\r
-                       select.add(item);\r
-                       if(key == this.getCollectionId()){\r
-                               select.setSelected(item);\r
-                       }\r
-                }\r
-                if(qx.lang.Object.getLength(collectionList)){\r
-                        this.setCollectionId(select.getSelected().getValue());\r
-                }\r
-                select.addListener("changeValue", this.collectionSelectorListener, this);\r
-         }, this);\r
-                 \r
-       },\r
-       \r
-       /**\r
-        * Use SlcApi to load the available collections.\r
-        */\r
-       loadCollections : function(){\r
-               var request = org.argeo.slc.ria.SlcApi.getListCollectionsService();\r
-               var NSMap = {slc:"http://argeo.org/projects/slc/schemas"};\r
-               request.addListener("completed", function(response){\r
-                       var xml = response.getContent();\r
-                       var collections = {};\r
-                       var nodes = org.argeo.ria.util.Element.selectNodes(xml, "//slc:ref", NSMap);\r
-                       for(var i=0;i<nodes.length;i++){\r
-                               var collId = qx.xml.Element.getSingleNodeText(nodes[i], ".");\r
-                               collections[collId] = collId;\r
-                       }\r
-                       this.setCollectionList(collections);\r
-                       org.argeo.ria.remote.RequestManager.getInstance().fireReloadEvent("collection", this.getCollectionList());\r
-               }, this);\r
-               request.setAsynchronous(false);\r
-               request.send();\r
-       },\r
-       \r
-       /**\r
-        * Load the results of the currently selected collection.\r
-        */\r
-       loadList : function(){\r
-               var model = this.table.getTableModel();\r
-               model.removeRows(0, model.getRowCount());\r
-               var commandManager = org.argeo.ria.event.CommandsManager.getInstance();\r
-               var request = org.argeo.slc.ria.SlcApi.getListResultsService(this.getCollectionId(), null, [commandManager.getCommandById("loadtestlist"), this.getView()]);\r
-               var NSMap = {slc:"http://argeo.org/projects/slc/schemas"};\r
-               request.addListener("completed", function(response){\r
-                       var xml = response.getContent();\r
-                       this.debug("Successfully loaded XML");\r
-                       var nodes = org.argeo.ria.util.Element.selectNodes(xml, "//slc:result-attributes", NSMap);\r
-                       //model.addRows(nodes);\r
-                       \r
-                       for(var i=0; i<nodes.length;i++){                               \r
-                               model.addRows([nodes[i]]);\r
-                       }                       \r
-               }, request);\r
-               request.send();         \r
-       },\r
-       \r
-       /**\r
-        * Enable/disable the automatic reloading of the list.\r
-        * @param state {Boolean} Whether the automatic reloading must be started or stopped.\r
-        */\r
-       pollListLoading : function(state){\r
-               if(!this.timer){\r
-                       this.timer = new qx.event.Timer(5000);\r
-                       this.timer.addListener("interval", this.loadList, this);\r
-               }\r
-               if(state){\r
-                       this.loadList();\r
-                       this.timer.start();\r
-               }else{\r
-                       this.timer.stop();\r
-               }\r
-       },\r
-       \r
-       /**\r
-        * Creates a menu gui component from the currently loaded collectionList.\r
-        * @param command {qx.event.Command} The command on which to attach the created menu. \r
-        * @param checkSelection {Boolean} Whether at the end, we must check the current viewSelection to enable/disable the command accordingly. \r
-        */\r
-       collectionListToMenu : function(command, checkSelection){\r
-               command.setEnabled(false);\r
-               command.clearMenus();\r
-               var collectionList = this.getCollectionList();\r
-               if(!collectionList) return;\r
-               var submenus = [];\r
-               for(var key in collectionList){\r
-                       if(this.getCollectionId() && key == this.getCollectionId()) continue;\r
-                       submenus.push({\r
-                               "label":collectionList[key], \r
-                               "icon":"org.argeo.slc.ria/folder.png", \r
-                               "commandId":key\r
-                       });\r
-               }               \r
-               submenus.push({'separator':true});\r
-               submenus.push({"label":"New...", "icon":"org.argeo.slc.ria/folder-new.png", "commandId":"slc.client.create"});\r
-               command.setMenu(submenus);\r
-               if(checkSelection){\r
-                       var viewSelection = this.getView().getViewSelection();\r
-                       if(viewSelection.getCount()) command.setEnabled(true);\r
-               }else{\r
-                       command.setEnabled(true);\r
-               }\r
-       },\r
-       /**\r
-        * Use SlcApi "addResult" service to add selected results to a given collection.\r
-        * If collectionId is "slc.client.create", first triggers a modal dialog to enter a new collection name, then retrigger itself with the new id.\r
-        * @param collectionId {String} The id of the destination collection, or "slc.client.create".\r
-        * @param selectionType {String} "current_collection"|"current_selection". The first adds the whole collection content to the destination, the second only selected results.\r
-        */\r
-       copySelectionToCollection:function(collectionId, selectionType){\r
-               if(collectionId == "slc.client.create"){\r
-                       var modal = new org.argeo.ria.components.Modal("Create collection", "org.argeo.slc.ria/folder-new.png");\r
-                       modal.makePromptForm("Enter the new collection name", function(value){\r
-                               if(value == ""){\r
-                                       alert("Please enter a name for the new collection!");\r
-                                       return false;\r
-                               }\r
-                               else {\r
-                                       // Create the collection now, then recall the callback with the new name.                                                               \r
-                                       this.copySelectionToCollection(value, selectionType);\r
-                                       return true;\r
-                               }\r
-                       }, this);\r
-                       modal.attachAndShow();\r
-                       return;\r
-               }\r
-\r
-               var currentFocus = org.argeo.ria.components.ViewsManager.getInstance().getCurrentFocus();\r
-               if(currentFocus.getViewId() == "applet"){\r
-                       alert("Should copy data from the applet - command was " + collectionId);\r
-                       return;\r
-               }\r
-               \r
-               if(selectionType == "current_collection"){\r
-                       this.error("Not implemented yet!");                     \r
-               }else if(selectionType == "current_selection"){\r
-                       // get selection ID\r
-                       var request = org.argeo.slc.ria.SlcApi.getAddResultService(collectionId,this.extractTestUuid());\r
-                       request.addListener("completed", function(response){\r
-                               this.info("Result successfully copied to collection!");\r
-                               this.loadCollections();\r
-                       }, this);\r
-                       request.send();         \r
-               }\r
-       },\r
-       \r
-       /**\r
-        * Utilitary function to extract test unique id from the currently selected node.\r
-        * @return {String} The test unique id.\r
-        */\r
-       extractTestUuid: function(){\r
-               var NSMap = {slc:"http://argeo.org/projects/slc/schemas"};\r
-               var xmlNodes = this.getView().getViewSelection().getNodes();\r
-               var uuid = qx.dom.Node.getText(org.argeo.ria.util.Element.selectSingleNode(xmlNodes[0], "slc:uuid"));\r
-               return uuid;\r
-       },\r
-       \r
-       /**\r
-        * Listener of the collection selector (select box added to the viewpane header). \r
-        * @param event {qx.event.type.Event} The event.\r
-        */\r
-        collectionSelectorListener : function(event){\r
-               this.setCollectionId(event.getData());\r
-               this.loadList();                \r
-       },\r
-       \r
-       addScroll : function(){\r
-               return false;\r
-       },\r
-       \r
-       close : function(){\r
-               if(this.timer){\r
-                       this.pollListLoading(false);\r
-               }\r
-       }\r
-       \r
-  }\r
+/**
+ * Basic IView implementation for displaying the test results list, by collection.
+ * 
+ * This component creates a Table object and feed it with the results. It adds a collection chooser to its viewPane header.
+ *  
+ * It creates the following commands : "loadtestlist", "polllistloading", "opentest", "download", "copytocollection", "deletetest".
+ */
+qx.Class.define("org.argeo.slc.web.TestList",
+{
+  extend : qx.ui.container.Composite,
+  implement : [org.argeo.ria.components.IView], 
+  include : [org.argeo.ria.session.MPrefHolder],
+
+  statics : {
+       riaPreferences : {
+               "slc.web.TestList.DefaultAction" : {
+                       label : "Test List : Double Click default action",
+                       type : "list",
+                       list : ["Open","Download Xls"],
+                       defaultValue : "Open"
+               }
+       }
+  },
+  
+  construct : function(){
+       this.base(arguments, new qx.ui.layout.VBox());          
+       var model = new qx.ui.table.model.Simple();
+       model.setColumns(["Test Case", "Date"]);
+       this.table = new qx.ui.table.Table(model, {
+               tableColumnModel: function(obj){
+                       return new qx.ui.table.columnmodel.Resize(obj)
+               }
+       });
+  },
+
+  properties : 
+  {
+       /**
+        * The viewPane containing this applet.
+        */
+       view : {
+               init : null
+       },
+       viewSelection : {
+               nullable:false, 
+               check:"org.argeo.ria.components.ViewSelection"
+       },  
+       instanceId : {init:""},
+       instanceLabel : {init:""},
+       /**
+        * The load list of available collection (Map of ids => labels)
+        */
+       collectionList : {
+               init : {},
+               check : "Map"
+       },
+       /**
+        * The current collection id selected.
+        */
+       collectionId:{
+               init : 'My Collection',
+               check : "String"
+       },
+       currentOpenInstanceId : {
+               check : "String",
+               nullable:true
+       },
+       /**
+        * The applet commands.
+        */
+       commands : {
+               init : {
+                       "loadtestlist" : {
+                               label           : "Load Collection", 
+                               icon            : "org/argeo/slc/ria/view-refresh.png",
+                               shortcut        : "Control+l",
+                               enabled         : true,
+                               menu            : "Collection",
+                               toolbar         : "collection",
+                               callback        : function(e){
+                                       this.loadList();
+                               }, 
+                               command         : null
+                       },
+                       "polllistloading" : {
+                               label           : "Auto load", 
+                               icon            : "org/argeo/slc/ria/document-open-recent.png",
+                               shortcut        : "Control+l",
+                               enabled         : true,
+                               toggle          : true,
+                               menu            : "Collection",
+                               toolbar         : "collection",
+                               callback        : function(event){
+                                       this.pollListLoading(event.getTarget().getUserData("slc.command.toggleState"));
+                               }, 
+                               command         : null
+                       },
+                       /*
+                       "copyfullcollection" : {
+                               label           : "Copy to...", 
+                               icon            : "org/argeo/slc/ria/edit-copy.png",
+                               shortcut        : null,
+                               enabled         : false,
+                               menu            : "Collection",
+                               toolbar         : "collection",
+                               callback        : function(e){
+                                       // Call service to copy
+                               },
+                               submenu         : {},
+                               submenuCallback : function(commandId){
+                                       this.copySelectionToCollection(commandId, "current_collection");
+                               },
+                               init : function(){
+                                       // Call at command creation
+                                       org.argeo.ria.remote.RequestManager.getInstance().addListener("reload", function(event){
+                                               if(event.getDataType() == "collection" || event.getDataType() == "test_cases"){
+                                                       var testList = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("list").getContent();
+                                                       testList.collectionListToMenu(this);
+                                               }
+                                       }, this);
+                               },
+                               command         : null
+                       },
+                       */
+                       "opentest" : {
+                               label           : "Open", 
+                               icon            : "org/argeo/slc/ria/media-playback-start.png",
+                               shortcut        : "Control+o",
+                               enabled         : false,
+                               menu            : "Selection",
+                               toolbar         : "selection",
+                               callback        : function(e){
+                                       var viewsManager = org.argeo.ria.components.ViewsManager.getInstance();
+                                       var classObj = org.argeo.slc.ria.Applet;
+                                       var xmlNodes = viewsManager.getViewPaneSelection("list").getNodes();
+                                       var iView = viewsManager.initIViewClass(classObj, "applet", xmlNodes[0]);
+                                       this.setCurrentOpenInstanceId(iView.getInstanceId());
+                                       iView.load(xmlNodes[0]);
+                               },
+                               selectionChange : function(viewId, xmlNodes){
+                                       if(viewId != "list") return;
+                                       this.setEnabled(false);
+                                       if(xmlNodes == null || !xmlNodes.length) return;
+                                       this.setEnabled(true);
+                               },
+                               command         : null
+                       },
+                       "download" : {
+                               label           : "Download as...", 
+                               icon            : "org/argeo/slc/ria/go-down.png",
+                               shortcut        : null,
+                               enabled         : false,
+                               menu            : "Selection",
+                               toolbar         : "selection",
+                               callback        : function(e){ },
+                               command         : null,
+                               submenu         : [
+                                               {'label':"Xsl", 'icon':'org/argeo/slc/ria/mime-xsl.png', 'commandId':'xsl'},
+                                               {'label':"Xml", 'icon':'org/argeo/slc/ria/mime-xml.png', 'commandId':'xml'},
+                                               {'label':"Excel", 'icon':'org/argeo/slc/ria/mime-xls.png', 'commandId':'xls'},
+                                               {'label':"Pdf", 'icon':'org/argeo/slc/ria/mime-pdf.png', 'commandId':'pdf'}
+                                       ],
+                               submenuCallback : function(commandId){
+                                       var uuid = this.extractTestUuid();
+                                       var urls = {
+                                               xsl : "resultView.xslt",
+                                               xml : "resultViewXml.xslt",
+                                               xls : "resultView.xls",
+                                               pdf : "resultView.pdf"
+                                       };
+                                       var url = org.argeo.slc.ria.SlcApi.DEFAULT_CONTEXT + "/"+urls[commandId]+"?uuid="+uuid;
+                                       if(commandId == "xls" || commandId == "pdf"){
+                                               document.location.href = url;
+                                       }else{
+                                               var win = window.open(url);
+                                       }
+                               },
+                               selectionChange : function(viewId, xmlNodes){
+                                       if(viewId!="list")return;
+                                       //this.clearMenus();
+                                       this.setEnabled(false);
+                                       if(xmlNodes == null || !xmlNodes.length) return;
+                                       this.setEnabled(true);
+                               }
+                       },
+                       "attachments" : {
+                               label           : "Attachments", 
+                               icon            : "org/argeo/slc/ria/document-save-as.png",
+                               shortcut        : null,
+                               enabled         : false,
+                               menu            : "Selection",
+                               toolbar         : "selection",
+                               callback        : function(e){ },
+                               command         : null,
+                               submenu         : [],
+                               submenuCallback : function(commandId){                                          
+                                       var split = commandId.split("__commandseparator__");
+                                       var uuid = split[0];
+                                       var contentType = split[1];
+                                       var name = split[2];
+                                       var url = org.argeo.slc.ria.SlcApi.buildGetAttachmentUrl(uuid, contentType, name);
+                                       var win = window.open(url);
+                               },
+                               selectionChange : function(viewId, xmlNodes){
+                                       if(viewId!="list")return;
+                                       this.clearMenus();
+                                       this.setEnabled(false);
+                                       if(xmlNodes == null || !xmlNodes.length || xmlNodes.length != 1) return;
+                                       // Check slc:simple-attachment tags
+                                       var attachs = org.argeo.ria.util.Element.selectNodes(xmlNodes[0], "slc:attachments/slc:simple-attachment");
+                                       if(attachs && attachs.length){
+                                               var submenus = [];
+                                               for(var i=0;i<attachs.length;i++){
+                                                       var uuid = org.argeo.ria.util.Element.getSingleNodeText(attachs[i], "slc:uuid");
+                                                       var contentType = (org.argeo.ria.util.Element.getSingleNodeText(attachs[i], "slc:content-type")||'');
+                                                       var name = org.argeo.ria.util.Element.getSingleNodeText(attachs[i], "slc:name");
+                                                       submenus.push({
+                                                               label:name, 
+                                                               icon : 'org.argeo.slc.ria/mime-text-plain.png', 
+                                                               commandId:uuid+'__commandseparator__'+contentType+'__commandseparator__'+name
+                                                       });
+                                               }
+                                               this.setMenuDef(submenus);
+                                               this.setEnabled(true);
+                                       }
+                               }
+                       },
+                       "copytocollection" : {
+                               label           : "Copy to...", 
+                               icon            : "org/argeo/slc/ria/edit-copy.png",
+                               shortcut        : "Control+c",
+                               enabled         : false,
+                               menu            : "Selection",
+                               toolbar         : "selection",
+                               callback        : function(e){
+                                       // Call service to copy
+                               },
+                               submenu         : {},
+                               submenuCallback : function(commandId){
+                                       this.copySelectionToCollection(commandId, "current_selection");                                 
+                               },
+                               init : function(){
+                                       // Call at command creation
+                                       org.argeo.ria.remote.RequestManager.getInstance().addListener("reload", function(event){
+                                               if(event.getDataType() == "collection" || event.getDataType() == "test_cases"){
+                                                       var testList = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("list").getContent();
+                                                       testList.collectionListToMenu(this, true);
+                                               }
+                                       }, this);
+                               },
+                               selectionChange : function(viewId, xmlNodes){
+                                       if(viewId != "list") return;
+                                       this.setEnabled(false);
+                                       if(xmlNodes == null || !xmlNodes.length) return;
+                                       this.setEnabled(true);                                                  
+                               },
+                               command         : null
+                       },
+                       "deletetest" : {
+                               label           : "Delete", 
+                               icon            : "org/argeo/slc/ria/edit-delete.png",
+                               shortcut        : "Control+d",
+                               enabled         : false,
+                               menu            : "Selection",
+                               toolbar         : "selection",
+                               callback        : function(e){
+                                       var modal = new org.argeo.ria.components.Modal("Confirm", null);
+                                       var testUuid = this.extractTestUuid();
+                                       modal.addConfirm("Are you sure you want to delete<br> test " + testUuid + "?");
+                                       modal.addListener("ok", function(){
+                                               var request = org.argeo.slc.ria.SlcApi.getRemoveResultService(this.getCollectionId(), this.extractTestUuid());
+                                               request.addListener("completed", function(response){
+                                                       if(this.getCurrentOpenInstanceId() == "test:"+testUuid){
+                                                               var appletView = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("applet");
+                                                               if(appletView.contentExists(this.getCurrentOpenInstanceId())){
+                                                                       appletView.closeCurrent();
+                                                               }
+                                                               this.setCurrentOpenInstanceId(null);
+                                                       }
+                                                       this.loadCollections();
+                                                       this.loadList();
+                                                       this.info("Test was successfully deleted");
+                                               }, this);
+                                               request.send();                                         
+                                       }, this);
+                                       modal.attachAndShow();
+                               },
+                               selectionChange : function(viewId, xmlNodes){
+                                       if(viewId != "list") return;
+                                       this.setEnabled(false);
+                                       if(xmlNodes == null || !xmlNodes.length) return;
+                                       this.setEnabled(true);                                                  
+                               },
+                               command         : null
+                       }
+               }
+       }
+  },
+  
+  members : {
+       init : function(viewPane, data){
+               this.setView(viewPane);
+               this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));          
+       },
+       load : function(){
+         this.table.set({              
+               statusBarVisible: false,
+               showCellFocusIndicator:false,
+               columnVisibilityButtonVisible:false,
+               contextMenu : org.argeo.ria.event.CommandsManager.getInstance().createMenuFromIds(["opentest", "download", "copytocollection", "deletetest"]),
+               decorator : new qx.ui.decoration.Background("#fff")
+         });
+         var viewPane = this.getView();
+         this.table.addListener("dblclick", function(e){
+               var pref = this.getRiaPreferenceValue("slc.web.TestList.DefaultAction");
+               if(pref == "Open"){
+                       org.argeo.ria.event.CommandsManager.getInstance().executeCommand("opentest");
+               }else{
+                       var uuid = this.extractTestUuid();
+                       var url = "../resultView.xslt?uuid="+uuid;
+                       alert('Should download : '+url);
+               }
+         }, this);
+         var columnModel = this.table.getTableColumnModel(); 
+         columnModel.getBehavior().setWidth(0, "60%");
+         var renderer = new org.argeo.slc.web.XmlRenderer();
+         columnModel.setDataCellRenderer(0, renderer);
+         columnModel.setDataCellRenderer(1, renderer);
+         
+         this.table.getSelectionManager().getSelectionModel().addListener("changeSelection", function(e){
+               var viewSelection = this.getViewSelection();
+               viewSelection.clear();
+               var selectionModel = this.table.getSelectionManager().getSelectionModel();
+               if(!selectionModel.getSelectedCount()){
+                       return;
+               }
+               var ranges = this.table.getSelectionManager().getSelectionModel().getSelectedRanges();
+               var xmlNode = this.table.getTableModel().getRowData(ranges[0].minIndex);
+               viewSelection.addNode(xmlNode);
+               //viewPane.setViewSelection(viewSelection);
+         }, this);             
+         
+         var select = new qx.ui.form.SelectBox();
+         this.getView().addHeaderComponent(select);
+         this.getView().setViewTitle("");
+         this.add(this.table, {flex:1});
+
+         select.addListener("changeSelection", this.collectionSelectorListener, this);
+
+         org.argeo.ria.remote.RequestManager.getInstance().addListener("reload", function(event){
+                if(event.getDataType()!="collection") return;
+                select.removeListener("changeSelection", this.collectionSelectorListener, this);
+                var collectionList = event.getContent();
+                select.removeAll();
+                for(key in collectionList){
+                       var item = new qx.ui.form.ListItem(collectionList[key], "org/argeo/slc/ria/folder.png", key);
+                       select.add(item);
+                       if(key == this.getCollectionId()){
+                               select.setSelection([item]);
+                       }
+                }
+                if(qx.lang.Object.getLength(collectionList)){
+                       var selection = select.getSelection();
+                       var value = selection[0].getModel();
+                        this.setCollectionId(value);
+                }
+                select.addListener("changeSelection", this.collectionSelectorListener, this);
+         }, this);
+                 
+       },
+       
+       /**
+        * Use SlcApi to load the available collections.
+        */
+       loadCollections : function(){
+               var request = org.argeo.slc.ria.SlcApi.getListCollectionsService();
+               var NSMap = {slc:"http://argeo.org/projects/slc/schemas"};
+               request.addListener("completed", function(response){
+                       var xml = response.getContent();
+                       var collections = {};
+                       var nodes = org.argeo.ria.util.Element.selectNodes(xml, "//slc:ref", NSMap);
+                       for(var i=0;i<nodes.length;i++){
+                               var collId = qx.xml.Element.getSingleNodeText(nodes[i], ".");
+                               collections[collId] = collId;
+                       }
+                       this.setCollectionList(collections);
+                       org.argeo.ria.remote.RequestManager.getInstance().fireReloadEvent("collection", this.getCollectionList());
+               }, this);
+               request.setAsynchronous(false);
+               request.send();
+       },
+       
+       /**
+        * Load the results of the currently selected collection.
+        */
+       loadList : function(){
+               var model = this.table.getTableModel();
+               model.removeRows(0, model.getRowCount());
+               var commandManager = org.argeo.ria.event.CommandsManager.getInstance();
+               var request = org.argeo.slc.ria.SlcApi.getListResultsService(this.getCollectionId(), null, [commandManager.getCommandById("loadtestlist"), this.getView()]);
+               var NSMap = {slc:"http://argeo.org/projects/slc/schemas"};
+               request.addListener("completed", function(response){
+                       var xml = response.getContent();
+                       this.debug("Successfully loaded XML");
+                       var nodes = org.argeo.ria.util.Element.selectNodes(xml, "//slc:result-attributes", NSMap);
+                       //model.addRows(nodes);
+                       
+                       for(var i=0; i<nodes.length;i++){                               
+                               model.addRows([nodes[i]]);
+                       }                       
+               }, request);
+               request.send();         
+       },
+       
+       /**
+        * Enable/disable the automatic reloading of the list.
+        * @param state {Boolean} Whether the automatic reloading must be started or stopped.
+        */
+       pollListLoading : function(state){
+               if(!this.timer){
+                       this.timer = new qx.event.Timer(5000);
+                       this.timer.addListener("interval", this.loadList, this);
+               }
+               if(state){
+                       this.loadList();
+                       this.timer.start();
+               }else{
+                       this.timer.stop();
+               }
+       },
+       
+       /**
+        * Creates a menu gui component from the currently loaded collectionList.
+        * @param command {qx.ui.core.Command} The command on which to attach the created menu. 
+        * @param checkSelection {Boolean} Whether at the end, we must check the current viewSelection to enable/disable the command accordingly. 
+        */
+       collectionListToMenu : function(command, checkSelection){
+               command.setEnabled(false);
+               command.clearMenus();
+               var collectionList = this.getCollectionList();
+               if(!collectionList) return;
+               var submenus = [];
+               for(var key in collectionList){
+                       if(this.getCollectionId() && key == this.getCollectionId()) continue;
+                       submenus.push({
+                               "label":collectionList[key], 
+                               "icon":"org/argeo/slc/ria/folder.png", 
+                               "commandId":key
+                       });
+               }               
+               submenus.push({'separator':true});
+               submenus.push({"label":"New...", "icon":"org/argeo/slc/ria/folder-new.png", "commandId":"slc.client.create"});
+               command.setMenuDef(submenus);
+               if(checkSelection){
+                       var viewSelection = this.getView().getViewSelection();
+                       if(viewSelection.getCount()) command.setEnabled(true);
+               }else{
+                       command.setEnabled(true);
+               }
+       },
+       /**
+        * Use SlcApi "addResult" service to add selected results to a given collection.
+        * If collectionId is "slc.client.create", first triggers a modal dialog to enter a new collection name, then retrigger itself with the new id.
+        * @param collectionId {String} The id of the destination collection, or "slc.client.create".
+        * @param selectionType {String} "current_collection"|"current_selection". The first adds the whole collection content to the destination, the second only selected results.
+        */
+       copySelectionToCollection:function(collectionId, selectionType){
+               if(collectionId == "slc.client.create"){
+                       var modal = new org.argeo.ria.components.Modal("Create collection", "org/argeo/slc/ria/folder-new.png");
+                       modal.makePromptForm("Enter the new collection name", function(value){
+                               if(value == ""){
+                                       alert("Please enter a name for the new collection!");
+                                       return false;
+                               }
+                               else {
+                                       // Create the collection now, then recall the callback with the new name.                                                               
+                                       this.copySelectionToCollection(value, selectionType);
+                                       return true;
+                               }
+                       }, this);
+                       modal.attachAndShow();
+                       return;
+               }
+
+               var currentFocus = org.argeo.ria.components.ViewsManager.getInstance().getCurrentFocus();
+               if(currentFocus.getViewId() == "applet"){
+                       alert("Should copy data from the applet - command was " + collectionId);
+                       return;
+               }
+               
+               if(selectionType == "current_collection"){
+                       this.error("Not implemented yet!");                     
+               }else if(selectionType == "current_selection"){
+                       // get selection ID
+                       var request = org.argeo.slc.ria.SlcApi.getAddResultService(collectionId,this.extractTestUuid());
+                       request.addListener("completed", function(response){
+                               this.info("Result successfully copied to collection!");
+                               this.loadCollections();
+                       }, this);
+                       request.send();         
+               }
+       },
+       
+       /**
+        * Utilitary function to extract test unique id from the currently selected node.
+        * @return {String} The test unique id.
+        */
+       extractTestUuid: function(){
+               var NSMap = {slc:"http://argeo.org/projects/slc/schemas"};
+               var xmlNodes = this.getView().getViewSelection().getNodes();
+               var uuid = qx.dom.Node.getText(org.argeo.ria.util.Element.selectSingleNode(xmlNodes[0], "slc:uuid"));
+               return uuid;
+       },
+       
+       /**
+        * Listener of the collection selector (select box added to the viewpane header). 
+        * @param event {qx.event.type.Event} The event.
+        */
+        collectionSelectorListener : function(event){
+               var selection = event.getData();
+               this.setCollectionId(selection[0].getModel());
+               this.loadList();                
+       },
+       
+       addScroll : function(){
+               return false;
+       },
+       
+       close : function(){
+               if(this.timer){
+                       this.pollListLoading(false);
+               }
+       }
+       
+  }
 });
\ No newline at end of file