qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", {\r
extend : qx.ui.container.Composite,\r
implement : [org.argeo.ria.components.IView],\r
+ include : [org.argeo.ria.session.MPrefHolder],\r
\r
construct : function() {\r
this.base(arguments);\r
instanceLabel : {\r
init : ""\r
},\r
+ executeAfterAdd : {\r
+ init : false,\r
+ check : "Boolean"\r
+ },\r
/**\r
* Commands definition, see\r
* {@link org.argeo.ria.event.CommandsManager#definitions}\r
init : {\r
"addtobatch" : {\r
label : "Add to batch",\r
- icon : "resource/slc/list-add.png",\r
+ icon : "org.argeo.slc.ria/list-add.png",\r
shortcut : null,\r
enabled : true,\r
menu : null,\r
return;\r
}\r
}\r
+ if(this.getExecuteAfterAdd() && batchView.getCommands()){\r
+ batchView.setForceClearPreference(true);\r
+ batchView.getCommands()["submitform"].command.execute();\r
+ }\r
+ this.setExecuteAfterAdd(false);\r
},\r
selectionChange : function(viewId, selection) {\r
if (viewId != "form:tree")\r
case "qx.ui.tree.TreeFile" :\r
this.setEnabled(true);\r
break;\r
- case "qx.ui.tree.TreeFolder" :\r
- if (item.getTree().getRoot() == item)\r
+ case "org.argeo.ria.components.PersistentTreeFolder" :\r
+ if (item.getTree() && item.getTree().getRoot() == item)\r
break;\r
this.setEnabled(true);\r
break;\r
case "org.argeo.ria.components.DynamicTreeFolder" :\r
- if (item.getTree().getRoot() == item)\r
+ if (item.getTree() && item.getTree().getRoot() == item)\r
break; \r
if (item.getState() == "loaded")\r
this.setEnabled(true);\r
},\r
command : null\r
},\r
+ "preferredHost" : {\r
+ label : "Toggle 'Preferred Host'",\r
+ icon : "ria/bookmark.png",\r
+ shortcut : null,\r
+ enabled : true,\r
+ menu : null,\r
+ toolbar : null,\r
+ callback : function(e) {\r
+ if (this.tree.isSelectionEmpty()) {\r
+ return;\r
+ }\r
+ var selection = this.tree.getSelection();\r
+ if(selection.length != 1) return;\r
+ var agentNode = selection[0];\r
+ if(!agentNode.getUserData("agentHost")) return;\r
+ this.togglePreferredHost(agentNode);\r
+ },\r
+ selectionChange : function(viewId, selection) {\r
+ if (viewId != "form:tree")\r
+ return;\r
+ if (!selection || selection.length != 1)\r
+ return;\r
+ var item = selection[0];\r
+ this.setEnabled(false);\r
+ if(item.getUserData("agentHost")){\r
+ this.setEnabled(true);\r
+ }\r
+ },\r
+ command : null\r
+ },\r
+ "reloadfull" : {\r
+ label : "Reload Agents",\r
+ icon : "org.argeo.slc.ria/view-refresh.png",\r
+ shortcut : "control+h",\r
+ enabled : true,\r
+ menu : "Launcher",\r
+ toolbar : "list",\r
+ callback : function(e) {\r
+ this.rootNode.reload();\r
+ },\r
+ command : null\r
+ }, \r
"reloadtree" : {\r
- label : "Reload",\r
- icon : "resource/slc/view-refresh.png",\r
- shortcut : "Control+m",\r
+ label : "Reload Node",\r
+ icon : "org.argeo.slc.ria/view-refresh.png",\r
+ shortcut : null,\r
enabled : false,\r
- menu : "Launcher",\r
- toolbar : "launcher",\r
+ menu : null,\r
+ toolbar : null,\r
callback : function(e) {\r
if (this.tree.isSelectionEmpty()) { return; } \r
var selected = this.tree.getSelection()[0];\r
}\r
},\r
\r
- statics : {\r
+ statics : { \r
+ \r
+ riaPreferences : {\r
+ "flowSelector.preferred.hosts" : {\r
+ label : "Preferred Hosts (Execution View)",\r
+ type : "string"\r
+ }\r
+ },\r
+ \r
/**\r
* Static loader for the "agent" level (first level)\r
* \r
* @param folder\r
- * {qx.ui.tree.TreeFolder} The root Tree Folder.\r
+ * {org.argeo.ria.components.PersistentTreeFolder} The root Tree Folder.\r
*/\r
agentLoader : function(folder) {\r
\r
+ var preferredHosts = org.argeo.ria.session.MPrefHolder.loadRiaPreferenceValue("flowSelector.preferred.hosts");\r
+ if(preferredHosts && preferredHosts!=""){\r
+ preferredHosts = preferredHosts.split(",");\r
+ }\r
var req = org.argeo.slc.ria.SlcApi.getListAgentsService("agents"); \r
var agents = {};\r
if(folder.getState() == "loaded" && folder.getUserData("agentsMap")){\r
req.addListener("completed", function(response) {\r
var xmlDoc = response.getContent();\r
var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc,\r
- "//slc:slc-agent-descriptor");\r
+ "/slc:object-list/slc:slc-agent-descriptor");\r
var modulesLoader = org.argeo.slc.ria.FlowsSelectorView.modulesLoader;\r
\r
for (var i = 0; i < nodes.length; i++) {\r
- var uuid = org.argeo.ria.util.Element.getSingleNodeText(\r
- nodes[i], "@uuid");\r
+ var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid");\r
+ var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");\r
if(agents[uuid]){\r
newAgents[uuid] = host;\r
continue;\r
}\r
- var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");\r
agents[uuid] = host;\r
if(newAgents) newAgents[uuid] = host;\r
var agentFolder = new org.argeo.ria.components.DynamicTreeFolder(\r
- host + ' (' + uuid + ')', modulesLoader,\r
- "Loading Modules...", folder.getDragData());\r
+ host, modulesLoader, "Loading Modules...", folder.getDragData());\r
+ org.argeo.slc.ria.FlowsSelectorView.attachToolTip(agentFolder, uuid);\r
+ agentFolder.setPersistentTreeID(folder.getPersistentTreeID()+"_"+uuid);\r
+ agentFolder.setUserData("agentHost", host); // Used by bookmark system\r
agentFolder.setUserData("agentUuid", uuid);\r
- agentFolder.setIcon("resource/slc/mime-xsl-22.png");\r
- folder.add(agentFolder);\r
+ if(preferredHosts && preferredHosts instanceof Array && qx.lang.Array.contains(preferredHosts, host)){\r
+ folder.addAtBegin(agentFolder);\r
+ agentFolder.setIcon("org.argeo.slc.ria/computer_bookmarked.png");\r
+ }else{\r
+ folder.add(agentFolder);\r
+ agentFolder.setIcon("org.argeo.slc.ria/computer.png");\r
+ }\r
}\r
if(newAgents){\r
// Make sure some agents should not be removed\r
* root folder.\r
* \r
* @param folder\r
- * {qx.ui.tree.TreeFolder} The root folder\r
+ * {org.argeo.ria.components.PersistentTreeFolder} The root folder\r
*/\r
modulesLoader : function(folder) {\r
var agentId = folder.getUserData("agentUuid");\r
req.addListener("completed", function(response) {\r
var descriptors = org.argeo.ria.util.Element.selectNodes(\r
response.getContent(),\r
- "slc:object-list/slc:execution-module-descriptor");\r
+ "slc:object-list/" + org.argeo.slc.ria.execution.Module.XPATH_ROOT);\r
var mods = {};\r
for (var i = 0; i < descriptors.length; i++) {\r
- var name = org.argeo.ria.util.Element.getSingleNodeText(\r
- descriptors[i], "slc:name");\r
- var version = org.argeo.ria.util.Element.getSingleNodeText(\r
- descriptors[i], "slc:version");\r
+ var tmpModule = new org.argeo.slc.ria.execution.Module();\r
+ try{ \r
+ tmpModule.setXmlNode(descriptors[i]);\r
+ }catch(e){\r
+ qx.log.Logger.error(e);\r
+ }\r
+ var name = tmpModule.getName();\r
+ var version = tmpModule.getVersion();\r
if (!mods[name])\r
mods[name] = [];\r
- mods[name].push(version);\r
+ mods[name].push(tmpModule);\r
}\r
var flowLoader = org.argeo.slc.ria.FlowsSelectorView.flowLoader;\r
for (var key in mods) {\r
for (var i = 0; i < mods[key].length; i++) {\r
+ var module = mods[key][i];\r
var versionFolder = new org.argeo.ria.components.DynamicTreeFolder(\r
- key + ' (' + mods[key][i] + ')', flowLoader,\r
+ module.getLabel(), flowLoader,\r
"Loading Flows", folder.getDragData());\r
- folder.add(versionFolder);\r
versionFolder.setUserData("moduleData", {\r
name : key,\r
- version : mods[key][i]\r
+ version : module.getVersion()\r
});\r
+ versionFolder.setIcon("org.argeo.slc.ria/archive.png");\r
versionFolder.setUserData("agentUuid", agentId);\r
+ var sep = (module.getDescription()!=""?" - ":"");\r
+ org.argeo.slc.ria.FlowsSelectorView.attachToolTip(versionFolder, key + ' (' + module.getVersion() + ')'+sep+module.getDescription());\r
+ // Warning, we must add it AFTER setting the user data, \r
+ // because of the persistent loading mechanism.\r
+ folder.add(versionFolder);\r
}\r
}\r
folder.setLoaded(true);\r
* and create its children.\r
* \r
* @param folder\r
- * {qx.ui.tree.TreeFolder} A Tree folder containing in the\r
+ * {org.argeo.ria.components.PersistentTreeFolder} A Tree folder containing in the\r
* key "moduleData" of its user data a map containing the\r
* keys {name,version}\r
*/\r
}\r
var execFlows = executionModule.getExecutionFlows();\r
for (var key in execFlows) {\r
- var file = new qx.ui.tree.TreeFile(key);\r
var path = execFlows[key].getPath();\r
+ var name = execFlows[key].getName();\r
+ var nodeLabel = key;\r
+ var sep = "\/";\r
+ if(name && name.indexOf(sep)>-1 && !path){\r
+ // Use given name to build the path.\r
+ // split dirname and basename\r
+ var parts = name.split(sep);\r
+ var basename = parts.pop();\r
+ var dirname = parts.join("/");\r
+ path = dirname;\r
+ nodeLabel = basename;\r
+ }\r
+ var file = new qx.ui.tree.TreeFile(nodeLabel);\r
+ if(execFlows[key].getDescription() != ""){\r
+ org.argeo.slc.ria.FlowsSelectorView.attachToolTip(file, execFlows[key].getDescription());\r
+ }\r
+ file.setIcon("org.argeo.slc.ria/system.png");\r
file.setUserData("executionModule", executionModule);\r
file.setUserData("executionFlow", execFlows[key]);\r
file.setUserData("agentUuid", agentUuid);\r
req.send();\r
},\r
\r
+ attachToolTip : function(nodeItem, description){\r
+ var tt = new qx.ui.tooltip.ToolTip(description);\r
+ tt.setShowTimeout(0);\r
+ nodeItem.setToolTip(tt); \r
+ },\r
+ \r
/**\r
* Parse a string path and search if there is a root node.\r
* \r
continue;\r
crtPath += "/" + parts[i]; \r
if (!model[crtPath]) {\r
- var virtualFolder = new qx.ui.tree.TreeFolder(parts[i]);\r
+ var virtualFolder = new org.argeo.ria.components.PersistentTreeFolder(parts[i]);\r
if (userData && qx.lang.Object.getLength(userData)) {\r
for (var key in userData) {\r
virtualFolder.setUserData(key, userData[key]);\r
this.remoteNotifier.stopPolling();\r
},\r
\r
+ /**\r
+ * \r
+ * @param agentNode {qx.ui.tree.AbstractTreeItem}\r
+ */\r
+ togglePreferredHost : function(agentNode){\r
+ var hostName = agentNode.getUserData("agentHost");\r
+ var pref = this.getRiaPreferenceValue("flowSelector.preferred.hosts");\r
+ var prefArray = [];\r
+ if(pref){\r
+ prefArray = pref.split(",");\r
+ }\r
+ if(qx.lang.Array.contains(prefArray, hostName)){\r
+ qx.lang.Array.remove(prefArray, hostName);\r
+ agentNode.setIcon("org.argeo.slc.ria/computer.png");\r
+ }else{\r
+ prefArray.push(hostName);\r
+ agentNode.setIcon("org.argeo.slc.ria/computer_bookmarked.png");\r
+ var parent = agentNode.getParent();\r
+ parent.remove(agentNode);\r
+ parent.addAtBegin(agentNode);\r
+ }\r
+ this.setRiaPreferenceValue("flowSelector.preferred.hosts", prefArray.join(","));\r
+ },\r
+ \r
/**\r
* Creates the main applet layout.\r
*/\r
"Tests", this.self(arguments).agentLoader,\r
"Loading Agents", dragData);\r
this.tree.setRoot(this.rootNode);\r
+ this.tree.setHideRoot(true);\r
+ this.rootNode.setPersistentTreeID("org.argeo.slc.ria.FlowsSelector")\r
this.rootNode.setOpen(true);\r
this.tree.setContextMenu(org.argeo.ria.event.CommandsManager\r
.getInstance().createMenuFromIds(["addtobatch",\r
- "reloadtree"]));\r
+ "reloadtree", "preferredHost"]));\r
\r
this.tree.addListener("changeSelection", function(e) {\r
var viewSelection = this.getViewSelection();\r
}\r
}, this);\r
\r
+ this.tree.addListener("dblclick", function(e){\r
+ var sel = this.tree.getSortedSelection();\r
+ if(sel && sel.length!=1) return;\r
+ var origin = sel[0];\r
+ if(origin.classname == "qx.ui.tree.TreeFile"){\r
+ this.setExecuteAfterAdd(true);\r
+ this.getCommands()["addtobatch"].command.execute();\r
+ }\r
+ }, this);\r
\r
this.add(this.tree);\r
},\r