]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
Handle order, editor, toggle autoOpen when adding to batch, added toggleInitialState...
authorCharles du Jeu <charles.dujeu@gmail.com>
Sat, 28 Feb 2009 20:58:52 +0000 (20:58 +0000)
committerCharles du Jeu <charles.dujeu@gmail.com>
Sat, 28 Feb 2009 20:58:52 +0000 (20:58 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@2208 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.slc.webapp/src/main/webapp/argeo-ria-lib/slc-web/class/org/argeo/slc/web/LauncherPerspective.js
org.argeo.slc.webapp/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/NewLauncherApplet.js
org.argeo.slc.webapp/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/BatchEntrySpec.js
org.argeo.slc.webapp/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/SpecEditor.js
org.argeo.slc.webapp/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/execution/Value.js
org.argeo.slc.webapp/src/main/webapp/argeo-ria-src/class/org/argeo/ria/event/Command.js
org.argeo.slc.webapp/src/main/webapp/argeo-ria-src/class/org/argeo/ria/event/CommandsManager.js

index f0f54884914595f96992b429cb55c8191f4b3787..8fb95ab80d1c9f4acaef4a03931d2a247903c7c7 100644 (file)
@@ -40,7 +40,7 @@ qx.Class.define("org.argeo.slc.web.LauncherPerspective",
        },\r
        \r
        initViews : function(viewsManager){\r
-         var formApplet = viewsManager.initIViewClass(org.argeo.slc.ria.LauncherApplet, "form");\r
+         var formApplet = viewsManager.initIViewClass(org.argeo.slc.ria.NewLauncherApplet, "form");\r
          formApplet.load();\r
          \r
          var logger = viewsManager.initIViewClass(org.argeo.slc.ria.SlcExecLoggerApplet, "main");\r
index 6004291975ee1bf064cfe62641b728c761e8cfe0..d91a4a98d2b8be68c8070190adb048ba6ddff018 100644 (file)
@@ -9,11 +9,7 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
 
   construct : function(){
        this.base(arguments);
-       this.setLayout(new qx.ui.layout.Dock());
-       
-       this.COMMON_FORM_HEADER_LABEL = "Choose Agent";
-       this.CHOOSE_AGENT_LABEL = "Agent Uuid";
-       this.CHOOSE_FORM_PART_LABEL = "Test Type";
+       this.setLayout(new qx.ui.layout.Dock());        
   },
 
   properties : 
@@ -29,7 +25,11 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                check:"org.argeo.ria.components.ViewSelection"
        },              
        instanceId : {init:""},
-       instanceLabel : {init:""},      
+       instanceLabel : {init:""},  
+       autoOpen : {
+               init : true,
+               check : "Boolean"
+       },
        /**
         * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions} 
         */
@@ -45,7 +45,45 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                                callback        : function(e){},
                                submenu         : [],
                                submenuCallback : function(commandId){
-                                       alert("Execute Batch on Agent "+commandId);
+                                       //alert("Execute Batch on Agent "+commandId);
+                                       this.executeBatchOnAgent(commandId);
+                               },
+                               command         : null
+                       },                      
+                       "addtobatch" : {
+                               label           : "Add to batch", 
+                               icon            : "resource/slc/list-add.png",
+                               shortcut        : null,
+                               enabled         : true,
+                               menu            : null,
+                               toolbar         : null,
+                               callback        : function(e){
+                                       this._addFlowToBatch();
+                               },
+                               selectionChange : function(viewId, selection){
+                                       if(viewId != "form:tree") return;
+                                       if(!selection || selection.length != 1) return;
+                                       var item = selection[0];
+                                       this.setEnabled(false);
+                                       if(qx.Class.isSubClassOf(qx.Class.getByName(item.classname), qx.ui.tree.TreeFile)){
+                                               this.setEnabled(true);
+                                       }
+                                       
+                               },                              
+                               command         : null
+                       }, 
+                       "toggleopenonadd" : {
+                               label           : "Auto Open", 
+                               icon            : "resource/slc/document-open.png",
+                               shortcut        : null,
+                               enabled         : true,
+                               toggle          : true,
+                               toggleInitialState      : true,
+                               menu            : "Launcher",
+                               toolbar         : "launcher",
+                               callback        : function(event){
+                                       var state = event.getTarget().getUserData("slc.command.toggleState");
+                                       this.setAutoOpen(state);
                                },
                                command         : null
                        },                      
@@ -59,8 +97,7 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                                callback        : function(e){
                                        var sel = this.list.getSortedSelection();
                                        var item = sel[0];
-                                       var execFlow = item.getUserData("batchEntrySpec").getFlow();
-                                       var specEditor = new org.argeo.slc.ria.execution.SpecEditor(execFlow);
+                                        var specEditor = new org.argeo.slc.ria.execution.SpecEditor(item.getUserData("batchEntrySpec"));
                                        specEditor.attachAndShow();
                                },
                                selectionChange : function(viewId, selection){
@@ -205,7 +242,6 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
        init : function(viewPane){
                this.setView(viewPane);
                this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));
-               //this._createForm();
                this._amqClient = org.argeo.ria.remote.JmsClient.getInstance();
                this._amqClient.startPolling();
        },
@@ -289,6 +325,7 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                );
                this.tree.setRoot(root);
                root.setOpen(true);
+               this.tree.setContextMenu(org.argeo.ria.event.CommandsManager.getInstance().createMenuFromIds(["addtobatch", "reloadtree"]));
                
                this.tree.addListener("changeSelection", function(e){
                        var viewSelection = this.getViewSelection();
@@ -319,24 +356,52 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                                
                this.listPane.add(listToolBar, {edge:"north"});
                
+               var indicator = new qx.ui.core.Widget();
+               indicator.setDecorator(new qx.ui.decoration.Single().set({top:[1,"solid","#33508D"]}));
+               indicator.setHeight(0);
+               indicator.setOpacity(0.5);
+               indicator.setZIndex(100);
+               indicator.setLayoutProperties({left:-1000,top:-1000});
+               org.argeo.ria.Application.INSTANCE.getRoot().add(indicator);
+               
+               
                this.list = new qx.ui.form.List();
                this.list.setDecorator(null);
                this.list.setSelectionMode("multi");
                this.list.setDroppable(true);
+               this.list.setDraggable(true);
+               this.list.setContextMenu(org.argeo.ria.event.CommandsManager.getInstance().createMenuFromIds(["editexecutionspecs", "removefrombatch"]));
+               
+               
+               this.list.addListener("dragstart", function(e){
+                       e.addType(["items"]);
+                       e.addAction(["move"]);
+               },this);
+               this.list.addListener("dragend", function(e){
+                       indicator.setDomPosition(-1000,-1000);
+               });
+               this.list.addListener("dragover", function(e){
+                       var orig = e.getOriginalTarget();
+                       var origCoords = orig.getContainerLocation();
+                       indicator.setWidth(orig.getBounds().width);
+                       indicator.setDomPosition(origCoords.left, origCoords.bottom);
+               });
+               this.list.addListener("drag", function(e){
+                       var orig = e.getOriginalTarget();
+                       var origCoords = orig.getContainerLocation();
+                       indicator.setWidth(orig.getBounds().width);
+                       indicator.setDomPosition(origCoords.left, origCoords.bottom);
+               });
+               
                this.list.addListener("drop", function(e){
                        var target = e.getRelatedTarget();
-                       var executionModule = target.getUserData("executionModule");
-                       var executionFlow = target.getUserData("executionFlow");
-                       var label = executionModule.getName()+"/"+executionModule.getVersion()+"/"+executionFlow.getName();
-                       var icon = target.getIcon();
-                       
-                 var item = new qx.ui.form.ListItem(label, icon);
-                 item.setUserData("batchEntrySpec", new org.argeo.slc.ria.execution.BatchEntrySpec(executionModule, executionFlow));
-                 item.setPaddingTop(1);
-                 item.setPaddingBottom(2);
-                 this.list.add(item);
-                 this.list.select(item);
-                 this.getCommands()["editexecutionspecs"].command.execute();
+                       var afterItem = e.getOriginalTarget();
+                       indicator.setDomPosition(-1000,-1000);
+                       if(afterItem.classname != "qx.ui.form.ListItem") afterItem = null;
+                       if(!target){
+                               target = this.list.getSortedSelection()[0];
+                       }
+                       this._addFlowToBatch(target, afterItem);
                }, this);               
                this.listPane.add(this.list, {edge:"center"});          
                
@@ -351,260 +416,41 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                }, this);
                
                splitPane.add(this.tree, 0);
-               splitPane.add(this.listPane, 1);
-               //this.add(this.scroll, {edge:'center'});
-               
-       },
-               
-       /**
-        * Creates the form.
-        */
-       _createForm : function(){
-               this.fields = {};
-               this.hiddenFields = {};
-               this.freeFields = [];
-               
-               var execButtonPane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
-               var execButton = new qx.ui.form.Button(
-                       "Execute", 
-                       "resource/slc/media-playback-start-32.png"                      
-               )
-               execButton.addListener("click", function(){
-                       this.submitForm();
-               }, this);
-               execButtonPane.setPadding(10, 80);
-               execButtonPane.add(execButton, {edge:"center"});
-               this.formPane.add(execButtonPane);
-               
-               this.agentSelector = new qx.ui.form.SelectBox();
-               var serviceManager = org.argeo.ria.remote.RequestManager.getInstance();
-               serviceManager.addListener("reload", function(reloadEvent){
-                       if(reloadEvent.getDataType()!= "agents") return ;
-                       var xmlDoc = reloadEvent.getContent();
-                       var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc, "//slc:slc-agent-descriptor");
-                       var newTopics = {};
-                       for(var i=0;i<nodes.length;i++){
-                               var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid");
-                               var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");
-                               newTopics[uuid] = host+" ("+uuid+")";
-                       }
-                       this.setRegisteredTopics(newTopics);
-               }, this);
-               
-               var commonForm = {pane:this.formPane};          
-               this._addFormHeader(commonForm, this.COMMON_FORM_HEADER_LABEL);
-               this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_AGENT_LABEL), this.agentSelector);
-               this._createFormVariableParts();
-               if(!this.parts) return;
-               if(qx.lang.Object.getLength(this.parts) > 1){
-                       // Add chooser
-                       this.partChooser = new qx.ui.form.SelectBox();
-                       for(var key in this.parts){
-                               this.partChooser.add(new qx.ui.form.ListItem(this.parts[key].label, null, key));
-                       }
-                       this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_FORM_PART_LABEL), this.partChooser);
-                       this.partChooser.addListener("changeValue", function(ev){
-                               this._showSelectedPart(ev.getData());
-                       }, this);
-               }
-               this._showSelectedPart(qx.lang.Object.getKeys(this.parts)[0]);          
-       },
-       
-       /**
-        * Show a form part given its id.
-        * @param partId {String} The part id
-        */
-       _showSelectedPart : function(partId){
-               if(!this.parts) return;
-               if(!this.partsContainer){
-                       this.partsContainer = new qx.ui.container.Composite(new qx.ui.layout.Canvas());
-                       this.formPane.add(this.partsContainer);                 
-               }
-               for(var i in this.parts){
-                       var formObject = this.parts[i];
-                       if(!formObject.added){
-                               this.partsContainer.add(formObject.pane, {top:0, left:0});
-                               formObject.added = true;
-                       }
-                       formObject.pane.hide();
-               }
-               if(this.parts[partId]){
-                       this.parts[partId].pane.show();
-               }
-       },
-       
-       /**
-        * Init a form part : creates a pane, a set of fields, etc.
-        * @param formId {String} A unique ID
-        * @param label {String} A label
-        * @return {Map} The form part.
-        */
-       _initFormPart : function(formId, label){
-               if(!this.parts) this.parts = {};                
-               var formObject = {};
-               formObject.hiddenFields = {};
-               formObject.freeFields = [];
-               formObject.fields = {};
-               formObject.id = formId;
-               formObject.label = label;
-               this.parts[formId] = formObject;
-               formObject.pane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));
-               return formObject;
-       },
-       
-       /**
-        * To be overriden by this class children.
-        */
-       _createFormVariableParts : function(){
-               var standard = this._initFormPart("standard", "Canonical");
-               this._createStandardForm(standard);
-               var simple = this._initFormPart("simple", "SLC Sample");
-               this._createSimpleForm(simple);
-       },
-       
-       /**
-        * Creates a form for SLC demo
-        * @param formObject {Map} The form part
-        */
-       _createSimpleForm : function(formObject){
-
-               this._addFormInputText(formObject, "ant.file", "File", "Category1/SubCategory2/build.xml");
-               var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png");
-               moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter"));
-               moreButton.setCursor("pointer");
-               moreButton.addListener("click", function(){
-                       this._addFormInputText(formObject);
-               }, this);
-               this._addFormHeader(formObject, "Add optionnal parameters", moreButton);
-               this._addFormInputText(formObject);
-               this._addFormInputText(formObject);             
-               
+               splitPane.add(this.listPane, 1);                
        },
-       
-       /**
-        * Create a canonical form.
-        * @param formObject {Map} The form part
-        */
-       _createStandardForm : function(formObject){
-               
-               this._addFormHeader(formObject, "Set Execution Parameters");
-               this._addFormInputText(formObject, "status", "Status", "STARTED");
-               this._addFormInputText(formObject, "host", "Host", "localhost");
-               this._addFormInputText(formObject, "user", "User", "user");
                
-               var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png");
-               moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter"));
-               moreButton.setCursor("pointer");
-               moreButton.addListener("click", function(){
-                       this._addFormInputText(formObject);
-               }, this);
-               this._addFormHeader(formObject, "Add optionnal parameters", moreButton);
-               this._addFormInputText(formObject);
-               this._addFormInputText(formObject);             
-       },
-       
-       /**
-        * Add an hidden field to the form
-        * @param formObject {Map} The form part
-        * @param fieldName {String} Name
-        * @param fieldValue {String} Value
-        */
-       _addFormHiddenField : function(formObject, fieldName, fieldValue){
-               formObject.hiddenFields[fieldName] = fieldValue;
-       },
-       
-       /**
-        * Creates a simple label/input form entry.
-        * @param formObject {Map} The form part
-        * @param fieldName {String} Name
-        * @param fieldLabel {String} Label of the field
-        * @param defaultValue {String} The default value
-        * @param choiceValues {Map} An map of values
-        */
-       _addFormInputText : function(formObject, fieldName, fieldLabel, defaultValue, choiceValues){
-               var labelElement;
-               if(choiceValues){
-                       var fieldElement = new qx.ui.form.SelectBox();
-                       for(var key in choiceValues){
-                               fieldElement.add(new qx.ui.form.ListItem(choiceValues[key], null, key));
-                       }
-               }else{
-                       var fieldElement = new qx.ui.form.TextField();
-               }
-               if(defaultValue){
-                       fieldElement.setValue(defaultValue);
+       _addFlowToBatch : function(target, after){
+               this.debug(target);
+               if(!target){
+                        target = this.tree.getSelectedItem();
+                        if(!target) return;
+               }else if(target.classname == "qx.ui.form.ListItem"){
+                       if(!after) return;
+                       if(after == "first") this.list.addAt(target, 0);
+                       else this.list.addAfter(target, after);
+                       return;
                }
-               if(fieldName && fieldLabel){
-                       labelElement = new qx.ui.basic.Label(fieldLabel);
-                       formObject.fields[fieldName] = fieldElement;
+               var executionModule = target.getUserData("executionModule");
+               var executionFlow = target.getUserData("executionFlow");
+               var batchEntry = new org.argeo.slc.ria.execution.BatchEntrySpec(executionModule, executionFlow);
+               var label = batchEntry.getLabel();
+               var icon = target.getIcon();
+               var item = new qx.ui.form.ListItem(label, icon);
+               item.setUserData("batchEntrySpec", batchEntry);
+               item.setPaddingTop(1);
+               item.setPaddingBottom(2);
+               if(after){
+                       if(after == "first") this.list.addAt(item, 0);
+                       else this.list.addAfter(item, after);
                }else{
-                       labelElement = new qx.ui.form.TextField();
-                       formObject.freeFields.push({
-                               labelEl:labelElement, 
-                               valueEl:fieldElement
-                       });
-               }
-               this._addFormEntry(formObject, labelElement, fieldElement);
-       },
-       
-       /**
-        * Add an header
-        * @param formObject {Map} The form part
-        * @param content {Mixed} Content to add.
-        * @param additionnalButton {Mixed} Any widget to add on the east.
-        */
-       _addFormHeader : function(formObject, content, additionnalButton){
-               var header = new qx.ui.basic.Label('<b>'+content+'</b>');
-               header.setRich(true);           
-               if(!additionnalButton){
-                       header.setPaddingTop(10);
-                       formObject.pane.add(header);
-               }else{
-                       var pane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
-                       pane.setPaddingTop(10);
-                       pane.setPaddingRight(10);
-                       pane.add(header, {edge:'center'});
-                       pane.add(additionnalButton, {edge:'east'});
-                       formObject.pane.add(pane);
-               }
-       },
-       
-       /**
-        * Adds a label/input like entry in the form.
-        * @param formObject {Map} The form part
-        * @param labelElement {Object} Either a label or an input 
-        * @param fieldElement {Object} Any form input.
-        */
-       _addFormEntry : function(formObject, labelElement, fieldElement){
-               var entryPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5));
-               labelElement.setWidth(100);
-               labelElement.setTextAlign("right");             
-               entryPane.add(labelElement);
-               entryPane.add(new qx.ui.basic.Label(':'));
-               fieldElement.setWidth(150);
-               entryPane.add(fieldElement);
-               formObject.pane.add(entryPane);
-       },
-       
-       /*
-       _refreshTopicsSubscriptions : function(changeTopicsEvent){
-               var oldTopics = changeTopicsEvent.getOldData() || {};
-               var newTopics = changeTopicsEvent.getData();
-               var removed = [];
-               var added = [];
-               for(var key in oldTopics){
-                       if(!newTopics[key]) {
-                               //this._removeAmqListener(key);
-                       }
+                       this.list.add(item);
                }
-               for(var key in newTopics){
-                       if(!oldTopics[key]) {
-                               //this._addAmqListener(key);
-                       }                       
+               this.list.select(item);
+               if(this.getAutoOpen()){
+                       this.getCommands()["editexecutionspecs"].command.execute();
                }
        },
-       */
-               
+                       
        /**
         * Refresh the selector when the topics are updated.
         * @param changeTopicsEvent {qx.event.type.DataEvent} The reload event.
@@ -618,27 +464,29 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet",
                        var submenu = {"label":topics[key],"icon":"resource/slc/mime-xsl.png", "commandId":key};
                        menu.push(submenu);
                }
+               // FAKE!!
+               if(!menu.length){
+                       menu.push({"label":"Fake Agent", "icon":"resource/slc/mime-xsl.png", "commandId":"fake_agent_uuid"});
+               }
                command.clearMenus();
                command.setMenu(menu);
                if(menu.length) command.setEnabled(true);
        },
-       
-       /*
-       _addAmqListener: function(uuid){
-               this._amqClient.addListener("slcExec", "topic://agent."+uuid+".newExecution", function(response){
-                       var message = org.argeo.ria.util.Element.selectSingleNode(response, "slc:slc-execution");                               
-                       var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(message.getAttribute("uuid"));
-                       slcExec.fromXml(message);
-                       this.logModel.addRows([
-                               [new Date().toString(), slcExec.getHost()+' ('+slcExec.getUuid()+')', slcExec.getStatus()]
-                       ]);                             
-               }, this);
+               
+       currentBatchToXml : function(){
+               var selection = this.list.getChildren();
+               var xmlString = "";
+               for(var i=0;i<selection.length;i++){
+                       var batchEntrySpec = selection[i].getUserData("batchEntrySpec");
+                       xmlString += batchEntrySpec.toXml();
+               }
+               return xmlString;
        },
        
-       _removeAmqListener : function(uuid){
-               this._amqClient.removeListener("slcExec", "topic://agent."+uuid+".newExecution");
+       executeBatchOnAgent : function(agentUuid){
+               var xmlString = agentUuid + this.currentBatchToXml();
+               alert(xmlString);
        },
-       */
        
        /**
         * Make an SlcExecutionMessage from the currently displayed form.
index 5eae2b3b1f2709e56d13dcd5c359180b70ff225c..2662984e05b3b20ae74bd3b52f8667244c375439 100644 (file)
@@ -15,10 +15,23 @@ qx.Class.define("org.argeo.slc.ria.execution.BatchEntrySpec", {
                this.setModule(module);\r
                this.setFlow(flow);\r
                this.setOriginalSpec(flow.getExecutionSpec());\r
+               this.setName(flow.getExecutionSpec().getName());\r
                this.fetchInstanceValues();\r
        },\r
        \r
        members :  {\r
+               \r
+               getLabel : function(){\r
+                       var label = this.getModule().getName();\r
+                       label += "/" + this.getModule().getVersion();\r
+                       label += "/" + this.getFlow().getName();\r
+                       return label;\r
+               },\r
+               \r
+               toXml : function(){\r
+                       return this.getLabel() + "\n";\r
+               },\r
+               \r
                /**\r
                 * Fetch the Spec Values with the Flow Values to make the current instance value\r
                 */\r
index f302c3da54735ca8fd1c9ee8e948587acb24a5ef..d4b6217813db178876a315580af748ac8ed86e63 100644 (file)
@@ -7,11 +7,19 @@ qx.Class.define("org.argeo.slc.ria.execution.SpecEditor",
 {\r
        extend : qx.ui.window.Window,\r
   \r
+       properties : {\r
+               batchEntrySpec : {\r
+                       check : "org.argeo.slc.ria.execution.BatchEntrySpec"\r
+               }\r
+       },\r
+       \r
        events : {\r
                /**\r
-                * Triggered when the user clicks the "ok" button. \r
+                * Triggered when the user clicks the "save" button. \r
                 */\r
-               "ok" : "qx.event.type.Event"\r
+               "save" : "qx.event.type.Event",\r
+               "modified" : "qx.event.type.Event"\r
+\r
        },\r
        /**\r
         * \r
@@ -19,32 +27,66 @@ qx.Class.define("org.argeo.slc.ria.execution.SpecEditor",
         * @param icon {String} Icon of the window\r
         * @param text {String} Default content of the window.\r
         */\r
-       construct : function(executionFlow){\r
-               this.base(arguments, "Spec Editor");\r
+       construct : function(batchEntrySpec){\r
+               var editorLabel = "Edit Specs for "+batchEntrySpec.getLabel();\r
+               this.base(arguments, editorLabel);\r
                this.set({\r
+                       batchEntrySpec : batchEntrySpec,\r
                        showMaximize : false,\r
                        showMinimize : false,\r
-                       width: parseInt(qx.bom.Viewport.getWidth()*80/100),\r
-                       height: parseInt(qx.bom.Viewport.getHeight()*80/100)\r
+                       width: Math.min(parseInt(qx.bom.Viewport.getWidth()*90/100), 400),\r
+                       height: parseInt(qx.bom.Viewport.getHeight()*60/100)\r
                });\r
                this.setLayout(new qx.ui.layout.Dock());\r
                this.setModal(true);\r
                this.center();\r
-               if(executionFlow){\r
-                       this.addContent(new qx.ui.basic.Label("Editing specs for flow : "+executionFlow.getName()));\r
-               }else{\r
-                       this.addCloseButton();\r
-               }\r
+               this._initFormObject(this.getBatchEntrySpec().getLabel());\r
+               this._addFormHeader(this.formObject, editorLabel);\r
+               this.createFormFromSpec();\r
+               this.addContent(this.formObject.pane);\r
+               this.addOkCancel();\r
+               this.addListener("save", function(e){\r
+                       this.saveFormToSpec();\r
+               }, this);\r
        },\r
        \r
        members : {\r
+               createFormFromSpec : function(){\r
+                       var values = this.getBatchEntrySpec().getValues();\r
+                       for(var key in values){\r
+                               var valueObj = values[key];\r
+                               var label = key;\r
+                               var hidden = valueObj.getHidden();\r
+                               var disabled = valueObj.getFrozen();\r
+                               var value = valueObj.getValue();\r
+                               var type = valueObj.getSpecType();\r
+                               var subType = valueObj.getSpecSubType();\r
+                               if(type == "primitive" && !hidden){\r
+                                       this._addFormInputText(this.formObject, key, key, value, disabled, subType);\r
+                               }\r
+                       }\r
+               },\r
+               \r
+               saveFormToSpec : function(){\r
+                       var values = this.getBatchEntrySpec().getValues();\r
+                       for(var key in values){\r
+                               var valueObj = values[key];\r
+                               var hidden = valueObj.getHidden();\r
+                               var disabled = valueObj.getFrozen();\r
+                               if(valueObj.getSpecType() == "primitive"){\r
+                                       if(!hidden && !disabled){\r
+                                               valueObj.setValue(this.formObject.fields[key].getValue());\r
+                                       }\r
+                               }\r
+                       }                       \r
+               },\r
+               \r
                /**\r
                 * Display a component (panel) in the center of the popup\r
                 * @param panel {qx.ui.core.Widget} A gui component (will be set at width 100%).\r
                 */\r
                addContent: function(panel){\r
-                       this.add(panel, {edge:'center', width:'100%'});\r
-                       this.addCloseButton();\r
+                       this.add(new qx.ui.container.Scroll(panel), {edge:'center', width:'100%'});\r
                },\r
                /**\r
                 * Automatically attach to the application root, then show.\r
@@ -53,6 +95,105 @@ qx.Class.define("org.argeo.slc.ria.execution.SpecEditor",
                        org.argeo.ria.components.ViewsManager.getInstance().getApplicationRoot().add(this);                     \r
                        this.show();\r
                },\r
+               /**\r
+                * Init a form part : creates a pane, a set of fields, etc.\r
+                * @param label {String} A label\r
+                * @return {Map} The form part.\r
+                */\r
+               _initFormObject : function(label){\r
+                       this.formObject = {};\r
+                       this.formObject.hiddenFields = {};\r
+                       this.formObject.freeFields = [];\r
+                       this.formObject.fields = {};\r
+                       this.formObject.label = label;\r
+                       this.formObject.pane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5));\r
+                       return this.formObject;\r
+               },\r
+                               \r
+               /**\r
+                * Creates a simple label/input form entry.\r
+                * @param formObject {Map} The form part\r
+                * @param fieldName {String} Name\r
+                * @param fieldLabel {String} Label of the field\r
+                * @param defaultValue {String} The default value\r
+                * @param choiceValues {Map} An map of values\r
+                */\r
+               _addFormInputText : function(formObject, fieldName, fieldLabel, defaultValue, disabled, subType, choiceValues){\r
+                       var labelElement;\r
+                       if(choiceValues){\r
+                               var fieldElement = new qx.ui.form.SelectBox();\r
+                               for(var key in choiceValues){\r
+                                       fieldElement.add(new qx.ui.form.ListItem(choiceValues[key], null, key));\r
+                               }\r
+                               fieldElement.addListener("changeSelected", function(e){this.fireEvent("modified")}, this);\r
+                       }else{\r
+                               var fieldElement = new qx.ui.form.TextField();\r
+                               if(subType == "integer"){\r
+                                       fieldElement.addListener("changeValue", function(e){\r
+                                               var isNum = !isNaN(e.getData() * 1);\r
+                                               if(!isNum){\r
+                                                       alert("Warning, this field only accepts Integers!");\r
+                                               }\r
+                                       }, this);                                       \r
+                               }\r
+                               fieldElement.addListener("input", function(e){this.fireEvent("modified")}, this);                       \r
+                       }\r
+                       if(defaultValue){\r
+                               fieldElement.setValue(defaultValue);\r
+                       }\r
+                       if(fieldName && fieldLabel){\r
+                               labelElement = new qx.ui.basic.Label(fieldLabel);\r
+                               formObject.fields[fieldName] = fieldElement;\r
+                       }else{\r
+                               labelElement = new qx.ui.form.TextField();\r
+                               formObject.freeFields.push({\r
+                                       labelEl:labelElement, \r
+                                       valueEl:fieldElement\r
+                               });\r
+                       }\r
+                       if(disabled) fieldElement.setEnabled(false);\r
+                       this._addFormEntry(formObject, labelElement, fieldElement);\r
+               },\r
+               \r
+               /**\r
+                * Add an header\r
+                * @param formObject {Map} The form part\r
+                * @param content {Mixed} Content to add.\r
+                * @param additionnalButton {Mixed} Any widget to add on the east.\r
+                */\r
+               _addFormHeader : function(formObject, content, additionnalButton){\r
+                       var header = new qx.ui.basic.Label('<big><b>'+content+'</b></big>');\r
+                       header.setRich(true);           \r
+                       if(!additionnalButton){\r
+                               header.setPaddingBottom(10);\r
+                               formObject.pane.add(header);\r
+                       }else{\r
+                               var pane = new qx.ui.container.Composite(new qx.ui.layout.Dock());\r
+                               pane.setPaddingBottom(10);\r
+                               pane.setPaddingRight(10);\r
+                               pane.add(header, {edge:'center'});\r
+                               pane.add(additionnalButton, {edge:'east'});\r
+                               formObject.pane.add(pane);\r
+                       }\r
+               },\r
+               \r
+               /**\r
+                * Adds a label/input like entry in the form.\r
+                * @param formObject {Map} The form part\r
+                * @param labelElement {Object} Either a label or an input \r
+                * @param fieldElement {Object} Any form input.\r
+                */\r
+               _addFormEntry : function(formObject, labelElement, fieldElement){\r
+                       var entryPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5));\r
+                       labelElement.setWidth(150);\r
+                       labelElement.setTextAlign("right");             \r
+                       entryPane.add(labelElement);\r
+                       entryPane.add(new qx.ui.basic.Label(':'));\r
+                       fieldElement.setWidth(150);\r
+                       entryPane.add(fieldElement);\r
+                       formObject.pane.add(entryPane);\r
+               },\r
+                       \r
                /**\r
                 * Adds a close button bottom-center aligned to the popup\r
                 */\r
@@ -69,12 +210,16 @@ qx.Class.define("org.argeo.slc.ria.execution.SpecEditor",
                        var buttonPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5, 'right'));\r
                        buttonPane.setAlignX("center");\r
                        this.add(buttonPane, {edge:"south"});\r
-                       this.okButton = new qx.ui.form.Button("Ok");\r
+                       this.okButton = new qx.ui.form.Button("Save");\r
+                       this.okButton.setEnabled(false);\r
+                       this.addListener("modified", function(e){\r
+                               this.okButton.setEnabled(true);\r
+                       }, this);\r
                        this.okButton.addListener("execute", function(e){\r
-                               this.fireEvent("ok");\r
-                               this._closeAndDestroy();\r
+                               this.fireEvent("save");\r
+                               this.okButton.setEnabled(false);\r
                        }, this);\r
-                       this.cancelButton = new qx.ui.form.Button("Cancel");\r
+                       this.cancelButton = new qx.ui.form.Button("Close");\r
                        this.cancelButton.addListener("execute", this._closeAndDestroy, this);\r
                        buttonPane.add(this.okButton);\r
                        buttonPane.add(this.cancelButton);\r
index 9981f46ceb507c75f6cd089154431150abebb4fb..41431f3bb65f49b83d31a651a8a204f533fb6dae 100644 (file)
@@ -30,7 +30,7 @@ qx.Class.define("org.argeo.slc.ria.execution.Value", {
                        check : "Boolean"\r
                },\r
                value : {\r
-                       \r
+                       nullable : true\r
                },\r
                /**\r
                 * Castor representation of the object \r
index 127e20c516c729a11d6a67036b51c5ab0eadcb0b..77abef851b132498c7de63304894f156e2091d12 100644 (file)
         * Weather this command is a true/false state \r
         */\r
        toggle : {init:false},\r
+       /**\r
+        * It toggle button, initial state \r
+        */\r
+       toggleInitialState : {init : false},\r
        /**\r
         * Sub menu if needed \r
         */\r
                        button.setEnabled(this.getEnabled());\r
                }else if(this.getToggle()){\r
                        button = new qx.ui.toolbar.CheckBox(this.getLabel(), this.getIcon());\r
+                       if(this.getToggleInitialState()){\r
+                               button.setChecked(true);\r
+                       }\r
                        this._registerToggleButtonListeners(button);\r
                }else{\r
                        button = new qx.ui.toolbar.Button(\r
                        this.fireEvent("execute");\r
                }, this);\r
                this.addListener("execute", function(event){\r
-                       if(this.getUserData("slc;command.toggleStateSource") == button) return;\r
+                       if(this.getUserData("slc.command.toggleStateSource") == button) return;\r
                        button.setUserData("disableListener", true);\r
                        button.setChecked(this.getUserData("slc.command.toggleState"));\r
                        button.setUserData("disableListener", false);\r
index 8f0428076b95378e9a78d809d18ad4b33d99b971..f4e38a4084211662b58faa004fe74c20f0398f05 100644 (file)
@@ -140,6 +140,9 @@ qx.Class.define("org.argeo.ria.event.CommandsManager",
                                command.setEnabled(definition.enabled);\r
                                if(definition.toggle){\r
                                        command.setToggle(true);\r
+                                       if(definition.toggleInitialState){\r
+                                               command.setToggleInitialState(definition.toggleInitialState);\r
+                                       }\r
                                }\r
                                this._attachListener(command, definition.callback, definition.callbackContext);\r
                                if(definition.init){\r