From c21ae0a2cf738a0dca4cbdbd40732a07631ec971 Mon Sep 17 00:00:00 2001
From: izabel <izabel>
Date: Wed, 10 Nov 2010 12:39:19 +0000
Subject: [PATCH] [LMS-1875] merge add/edit scripts; open add/edit script in
 new tab

SVN: 18620
---
 .../web/client/ICommonClientService.java      |   4 +
 .../web/client/ICommonClientServiceAsync.java |   6 +-
 .../client/web/client/application/Dict.java   |   2 +
 .../framework/ComponentProvider.java          |  42 +++++-
 .../ui/field/ScriptChooserField.java          |   2 +-
 .../AbstractScriptEditRegisterForm.java}      | 132 +++++++++++------
 .../application/ui/script/ScriptEditForm.java | 134 ++++++++++++++++++
 .../ui/{ => script}/ScriptGrid.java           | 119 ++++++++--------
 .../ui/script/ScriptRegistrationForm.java     |  96 +++++++++++++
 .../web/server/CommonClientService.java       |  14 ++
 .../openbis/generic/server/CommonServer.java  |   7 +
 .../generic/server/CommonServerLogger.java    |   5 +
 .../openbis/generic/shared/ICommonServer.java |   7 +
 .../cisd/openbis/public/common-dictionary.js  |   2 +
 14 files changed, 466 insertions(+), 106 deletions(-)
 rename openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/{AddScriptDialog.java => script/AbstractScriptEditRegisterForm.java} (52%)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptEditForm.java
 rename openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/{ => script}/ScriptGrid.java (78%)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptRegistrationForm.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index cf4045233cd..ee73c558613 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -925,4 +925,8 @@ public interface ICommonClientService extends IClientService
     public LinkModel retrieveLinkFromDataSet(DatastoreServiceDescription serviceDescription,
             String dataSetCode);
 
+    /**
+     * Returns script with given {@link TechId}.
+     */
+    public Script getScriptInfo(TechId scriptId) throws UserFailureException;
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index dd6cd442a08..c05f4598351 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -817,5 +817,9 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     public void retrieveLinkFromDataSet(DatastoreServiceDescription serviceDescription,
             String dataSetCode, AsyncCallback<LinkModel> callback);
 
-    // --
+    /**
+     * @see ICommonClientService#getScriptInfo(TechId)
+     */
+    public void getScriptInfo(TechId scriptId, AsyncCallback<Script> scriptInfoCallback);
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
index 327c9ce294b..80e0cdf04b1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
@@ -334,6 +334,8 @@ public abstract class Dict
 
     public static final String SCRIPT = "script";
 
+    public static final String SCRIPT_REGISTRATION = "script_registration";
+
     public static final String PROPERTY_TYPE = "property_type";
 
     public static final String PROPERTY_TYPE_CODE = "property_type_code";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
index 63540ffcb2b..8890e9f0b44 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
@@ -28,7 +28,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpP
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AuthorizationGroupGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.PersonGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.RoleAssignmentGrid;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.ScriptGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.SpaceGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.LinkExtractor;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetBatchUpdatePanel;
@@ -55,6 +54,8 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleRegistrationPanel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleSearchHitGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleTypeGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.script.ScriptGrid;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.script.ScriptRegistrationForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.vocabulary.VocabularyGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.vocabulary.VocabularyRegistrationForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.log.LoggingConsole;
@@ -796,6 +797,45 @@ public final class ComponentProvider
             };
     }
 
+    public final AbstractTabItemFactory getScriptRegistration(final EntityKind entityKindOrNull)
+    {
+        return new AbstractTabItemFactory()
+            {
+                @Override
+                public ITabItem create()
+                {
+                    Component component =
+                            ScriptRegistrationForm.create(viewContext, entityKindOrNull);
+                    return DefaultTabItem.createUnaware(getTabTitle(), component, true);
+                }
+
+                @Override
+                public String getId()
+                {
+                    return ScriptRegistrationForm.createId();
+                }
+
+                @Override
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.SCRIPT, HelpPageAction.REGISTER);
+                }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return getMessage(Dict.SCRIPT_REGISTRATION);
+                }
+
+                @Override
+                public String tryGetLink()
+                {
+                    return null;
+                }
+
+            };
+    }
+
     public final AbstractTabItemFactory getVocabularyBrowser()
     {
         return new AbstractTabItemFactory()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ScriptChooserField.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ScriptChooserField.java
index 187c1046a69..84c9517a68c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ScriptChooserField.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ScriptChooserField.java
@@ -21,8 +21,8 @@ import com.extjs.gxt.ui.client.event.ComponentEvent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.ScriptGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.script.ScriptGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AddScriptDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/AbstractScriptEditRegisterForm.java
similarity index 52%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AddScriptDialog.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/AbstractScriptEditRegisterForm.java
index 1dbe6bff702..823e2a5c15d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AddScriptDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/AbstractScriptEditRegisterForm.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008 ETH Zuerich, CISD
+ * Copyright 2010 ETH Zuerich, CISD
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,65 +14,71 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui;
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.script;
 
-import com.extjs.gxt.ui.client.widget.Window;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
 import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
 import com.extjs.gxt.ui.client.widget.form.SimpleComboBox;
 import com.extjs.gxt.ui.client.widget.form.TextField;
-import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.google.gwt.user.client.Element;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.DescriptionField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.MultilineVarcharField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ScriptField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.VarcharField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractRegistrationDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
 
 /**
- * {@link Window} containing script registration form.
+ * {@link AbstractRegistrationForm} for registering and editing scripts.
  * 
  * @author Izabela Adamczyk
  */
-public class AddScriptDialog extends AbstractRegistrationDialog
+abstract public class AbstractScriptEditRegisterForm extends AbstractRegistrationForm
 {
-    private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-    private final TextField<String> nameField;
+    protected final IViewContext<ICommonClientServiceAsync> viewContext;
 
-    private final DescriptionField descriptionField;
+    protected final TextField<String> nameField;
 
-    private final MultilineVarcharField scriptField;
+    protected final DescriptionField descriptionField;
 
-    private SimpleComboBox<String> entityKindField;
+    protected final MultilineVarcharField scriptField;
 
-    public AddScriptDialog(final IViewContext<ICommonClientServiceAsync> viewContext,
-            final IDelegatedAction postRegistrationCallback, EntityKind entityKindOrNull)
-    {
-        super(viewContext, viewContext.getMessage(Dict.ADD_SCRIPT_TITLE), postRegistrationCallback);
-        this.viewContext = viewContext;
-        this.nameField = new VarcharField(viewContext.getMessage(Dict.NAME), true);
-        addField(nameField);
+    protected SimpleComboBox<String> entityKindField;
 
-        this.entityKindField = createEntityKindOrAllField(entityKindOrNull);
-        addField(entityKindField);
+    abstract protected void saveScript();
 
-        this.descriptionField = createDescriptionField(viewContext);
-        addField(descriptionField);
+    abstract protected void setValues();
 
+    protected AbstractScriptEditRegisterForm(
+            final IViewContext<ICommonClientServiceAsync> viewContext, EntityKind entityKindOrNull)
+    {
+        this(viewContext, null, entityKindOrNull);
+    }
+
+    protected AbstractScriptEditRegisterForm(
+            final IViewContext<ICommonClientServiceAsync> viewContext, TechId scriptIdOrNull,
+            EntityKind entityKindOrNull)
+    {
+        super(viewContext, createId(scriptIdOrNull), DEFAULT_LABEL_WIDTH + 20, DEFAULT_FIELD_WIDTH);
+        this.viewContext = viewContext;
+        this.nameField = new VarcharField(viewContext.getMessage(Dict.NAME), true);
+        this.entityKindField = createEntityKindOrAllField(entityKindOrNull, scriptIdOrNull == null);
+        this.descriptionField = AbstractRegistrationDialog.createDescriptionField(viewContext);
         this.scriptField = createScriptField(viewContext);
-        new MultilineVarcharField(viewContext.getMessage(Dict.SCRIPT), true, 20);
-        addField(scriptField);
     }
 
-    private SimpleComboBox<String> createEntityKindOrAllField(EntityKind entityKindOrNull)
+    private SimpleComboBox<String> createEntityKindOrAllField(EntityKind entityKindOrNull,
+            boolean enabled)
     {
         SimpleComboBox<String> options = new SimpleComboBox<String>();
         options.add(GenericConstants.ALL_ENTITY_KINDS);
@@ -92,6 +98,7 @@ public class AddScriptDialog extends AbstractRegistrationDialog
         options.setEditable(false);
         options.setAllowBlank(false);
         FieldUtil.markAsMandatory(options);
+        options.setEnabled(enabled);
         return options;
     }
 
@@ -103,20 +110,65 @@ public class AddScriptDialog extends AbstractRegistrationDialog
         return field;
     }
 
+    public static String createId(TechId id)
+    {
+        String editOrRegister = (id == null) ? "register" : ("edit_" + id);
+        return GenericConstants.ID_PREFIX + "script-" + editOrRegister + "_form";
+    }
+
     @Override
-    protected void register(AsyncCallback<Void> registrationCallback)
+    protected void resetPanel()
     {
-        Script newScript = new Script();
-        newScript.setDescription(descriptionField.getValue());
-        newScript.setName(nameField.getValue());
-        newScript.setScript(scriptField.getValue());
-        EntityKind kind = null;
-        String selectedEntityKind = entityKindField.getValue().getValue();
-        if (selectedEntityKind.equals(GenericConstants.ALL_ENTITY_KINDS) == false)
-        {
-            kind = EntityKind.valueOf(selectedEntityKind);
-        }
-        newScript.setEntityKind(kind);
-        viewContext.getService().registerScript(newScript, registrationCallback);
+        super.resetPanel();
+        nameField.reset();
+    }
+
+    private final void addFormFields()
+    {
+        formPanel.add(nameField);
+        formPanel.add(entityKindField);
+        formPanel.add(descriptionField);
+        formPanel.add(scriptField);
+        redefineSaveListeners();
     }
+
+    void redefineSaveListeners()
+    {
+        saveButton.removeAllListeners();
+        saveButton.addSelectionListener(new SelectionListener<ButtonEvent>()
+            {
+                @Override
+                public final void componentSelected(final ButtonEvent ce)
+                {
+                    if (formPanel.isValid())
+                    {
+                        saveScript();
+                    }
+                }
+            });
+    }
+
+    @Override
+    protected final void submitValidForm()
+    {
+    }
+
+    @Override
+    protected final void onRender(final Element target, final int index)
+    {
+        super.onRender(target, index);
+        setLoading(true);
+        loadForm();
+    }
+
+    protected abstract void loadForm();
+
+    protected void initGUI()
+    {
+        addFormFields();
+        setValues();
+        setLoading(false);
+        layout();
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptEditForm.java
new file mode 100644
index 00000000000..3027fc9db0a
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptEditForm.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2010 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.script;
+
+import com.extjs.gxt.ui.client.widget.Component;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
+
+/**
+ * {@link AbstractScriptEditRegisterForm} extension for editing scripts.
+ * 
+ * @author Izabela Adamczyk
+ */
+public class ScriptEditForm extends AbstractScriptEditRegisterForm
+{
+
+    private Script originalScript;
+
+    private TechId scriptId;
+
+    protected ScriptEditForm(IViewContext<ICommonClientServiceAsync> viewContext, TechId scriptId)
+    {
+        super(viewContext, scriptId, null);
+        this.scriptId = scriptId;
+    }
+
+    @Override
+    protected void saveScript()
+    {
+        Script script = new Script();
+        script.setId(scriptId.getId());
+        script.setDescription(descriptionField.getValue());
+        script.setScript(scriptField.getValue());
+        script.setName(nameField.getValue());
+        viewContext.getService().updateScript(script, new ScriptEditCallback(viewContext));
+    }
+
+    @Override
+    protected void setValues()
+    {
+        descriptionField.setValue(originalScript.getDescription());// FIXME: unescape?
+        scriptField.setValue(originalScript.getScript());
+        nameField.setValue(originalScript.getName());
+        String entityKind =
+                originalScript.getEntityKind() == null ? GenericConstants.ALL_ENTITY_KINDS
+                        : originalScript.getEntityKind().name();
+        entityKindField.setSimpleValue(entityKind);
+    }
+
+    public void updateOriginalValues()
+    {
+        descriptionField.setOriginalValue(descriptionField.getValue());
+        scriptField.setOriginalValue(scriptField.getValue());
+        nameField.setOriginalValue(nameField.getValue());
+        entityKindField.setOriginalValue(entityKindField.getValue());
+    }
+
+    @Override
+    protected void loadForm()
+    {
+        viewContext.getService().getScriptInfo(scriptId, new ScriptInfoCallback(viewContext));
+    }
+
+    void setOriginalScript(Script script)
+    {
+        this.originalScript = script;
+    }
+
+    private final class ScriptEditCallback extends
+            AbstractRegistrationForm.AbstractRegistrationCallback<Void>
+    {
+        ScriptEditCallback(final IViewContext<?> viewContext)
+        {
+            super(viewContext);
+        }
+
+        @Override
+        protected void process(final Void result)
+        {
+            // originalScript.setModificationDate(result);
+            updateOriginalValues();
+            super.process(result);
+        }
+
+        @Override
+        protected String createSuccessfullRegistrationInfo(Void result)
+        {
+            return "Script <b>" + originalScript.getName() + "</b> successfully updated.";
+        }
+    }
+
+    private final class ScriptInfoCallback extends AbstractAsyncCallback<Script>
+    {
+
+        private ScriptInfoCallback(final IViewContext<ICommonClientServiceAsync> viewContext)
+        {
+            super(viewContext);
+        }
+
+        @Override
+        protected final void process(final Script result)
+        {
+            setOriginalScript(result);
+            initGUI();
+        }
+    }
+
+    public static Component create(IViewContext<ICommonClientServiceAsync> viewContext,
+            TechId scriptId)
+    {
+        return new ScriptEditForm(viewContext, scriptId);
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ScriptGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptGrid.java
similarity index 78%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ScriptGrid.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptGrid.java
index efa1dd0d7f2..76791456202 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/ScriptGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptGrid.java
@@ -14,39 +14,38 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui;
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.script;
 
 import java.util.List;
 
 import com.extjs.gxt.ui.client.event.ButtonEvent;
 import com.extjs.gxt.ui.client.event.SelectionListener;
+import com.extjs.gxt.ui.client.widget.Component;
 import com.extjs.gxt.ui.client.widget.Dialog;
-import com.extjs.gxt.ui.client.widget.Window;
 import com.extjs.gxt.ui.client.widget.button.Button;
-import com.extjs.gxt.ui.client.widget.form.TextField;
-import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AbstractTabItemFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ComponentProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DefaultTabItem;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItem;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.ScriptColDefKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.DescriptionField;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.MultilineVarcharField;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ScriptField;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.VarcharField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractSimpleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ColumnDefsAndConfigs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IBrowserGridActionInvoker;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataListDeletionConfirmationDialog;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractRegistrationDialog;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListScriptsCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
@@ -76,8 +75,6 @@ public class ScriptGrid extends AbstractSimpleBrowserGrid<Script>
 
     public static final String EDIT_BUTTON_ID = BROWSER_ID + "-edit-button";
 
-    private final IDelegatedAction postRegistrationCallback;
-
     private final EntityKind entityKindOrNull;
 
     public static DisposableEntityChooser<Script> create(
@@ -93,7 +90,6 @@ public class ScriptGrid extends AbstractSimpleBrowserGrid<Script>
     {
         super(viewContext, BROWSER_ID, GRID_ID, DisplayTypeIDGenerator.SCRIPTS_BROWSER_GRID);
         this.entityKindOrNull = entityKindOrNull;
-        postRegistrationCallback = createRefreshGridAction();
     }
 
     private void extendBottomToolbar()
@@ -107,10 +103,8 @@ public class ScriptGrid extends AbstractSimpleBrowserGrid<Script>
                         @Override
                         public void componentSelected(ButtonEvent ce)
                         {
-                            AddScriptDialog dialog =
-                                    new AddScriptDialog(viewContext, createRefreshGridAction(),
-                                            entityKindOrNull);
-                            dialog.show();
+                            DispatcherHelper.dispatchNaviEvent(new ComponentProvider(viewContext)
+                                    .getScriptRegistration(entityKindOrNull));
                         }
                     });
         addScriptButton.setId(ADD_BUTTON_ID);
@@ -123,8 +117,7 @@ public class ScriptGrid extends AbstractSimpleBrowserGrid<Script>
                                 public void invoke(BaseEntityModel<Script> selectedItem,
                                         boolean keyPressed)
                                 {
-                                    Script script = selectedItem.getBaseObject();
-                                    createEditDialog(script).show();
+                                    openEditor(selectedItem, keyPressed);
                                 }
                             });
         editButton.setId(EDIT_BUTTON_ID);
@@ -143,53 +136,11 @@ public class ScriptGrid extends AbstractSimpleBrowserGrid<Script>
                                 }
                             });
         addButton(deleteButton);
-        allowMultipleSelection(); // we allow deletion of multiple projects
+        allowMultipleSelection();
 
         addEntityOperationsSeparator();
     }
 
-    private Window createEditDialog(final Script script)
-    {
-        final String name = script.getName();
-        final String description = script.getDescription();
-        final String title =
-                viewContext.getMessage(Dict.EDIT_TITLE, viewContext.getMessage(Dict.SCRIPT), name);
-
-        return new AbstractRegistrationDialog(viewContext, title, postRegistrationCallback)
-            {
-                private final TextField<String> nameField;
-
-                private final DescriptionField descriptionField;
-
-                private final MultilineVarcharField scriptField;
-
-                {
-                    this.nameField = new VarcharField(viewContext.getMessage(Dict.NAME), true);
-                    this.nameField.setValue(StringEscapeUtils.unescapeHtml(script.getName()));
-                    addField(nameField);
-
-                    descriptionField = createDescriptionField(viewContext);
-                    descriptionField.setValue(StringEscapeUtils.unescapeHtml(description));
-                    addField(descriptionField);
-
-                    this.scriptField = new ScriptField(viewContext);
-                    // new MultilineVarcharField(viewContext.getMessage(Dict.SCRIPT), true, 20);
-                    this.scriptField.setValue(StringEscapeUtils.unescapeHtml(script.getScript()));
-                    addField(scriptField);
-                }
-
-                @Override
-                protected void register(AsyncCallback<Void> registrationCallback)
-                {
-                    script.setDescription(descriptionField.getValue());
-                    script.setScript(scriptField.getValue());
-                    script.setName(nameField.getValue());
-
-                    viewContext.getService().updateScript(script, registrationCallback);
-                }
-            };
-    }
-
     @Override
     protected IColumnDefinitionKind<Script>[] getStaticColumnsDefinition()
     {
@@ -244,6 +195,48 @@ public class ScriptGrid extends AbstractSimpleBrowserGrid<Script>
                     DatabaseModificationKind.edit(ObjectKind.SCRIPT) };
     }
 
+    private void openEditor(BaseEntityModel<Script> selectedItem, boolean keyPressed)
+    {
+        final Script script = selectedItem.getBaseObject();
+        final TechId scriptId = TechId.create(script);
+        AbstractTabItemFactory tabFactory = new AbstractTabItemFactory()
+            {
+                @Override
+                public ITabItem create()
+                {
+                    Component component = ScriptEditForm.create(viewContext, scriptId);
+                    return DefaultTabItem.createUnaware(getTabTitle(), component, true);
+                }
+
+                @Override
+                public String getId()
+                {
+                    return ScriptEditForm.createId(scriptId);
+                }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return viewContext.getMessage(Dict.EDIT_TITLE,
+                            viewContext.getMessage(Dict.SCRIPT), "");
+                }
+
+                @Override
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.SCRIPT, HelpPageAction.EDIT);
+                }
+
+                @Override
+                public String tryGetLink()
+                {
+                    return null;
+                }
+            };
+        tabFactory.setInBackground(keyPressed);
+        DispatcherHelper.dispatchNaviEvent(tabFactory);
+    }
+
     private static final class ScriptListDeletionConfirmationDialog extends
             AbstractDataListDeletionConfirmationDialog<Script>
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptRegistrationForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptRegistrationForm.java
new file mode 100644
index 00000000000..d9a9bf82b73
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptRegistrationForm.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2010 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.script;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractRegistrationForm;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Script;
+
+/**
+ * @author Izabela Adamczyk
+ */
+public class ScriptRegistrationForm extends AbstractScriptEditRegisterForm
+{
+
+    public static ScriptRegistrationForm create(
+            IViewContext<ICommonClientServiceAsync> viewContext, EntityKind entityKindOrNull)
+    {
+        return new ScriptRegistrationForm(viewContext, entityKindOrNull);
+    }
+
+    protected ScriptRegistrationForm(IViewContext<ICommonClientServiceAsync> viewContext,
+            EntityKind entityKindOrNull)
+    {
+        super(viewContext, entityKindOrNull);
+    }
+
+    @Override
+    protected void saveScript()
+    {
+        Script newScript = new Script();
+        newScript.setDescription(descriptionField.getValue());
+        newScript.setName(nameField.getValue());
+        newScript.setScript(scriptField.getValue());
+        EntityKind kind = null;
+        String selectedEntityKind = entityKindField.getValue().getValue();
+        if (selectedEntityKind.equals(GenericConstants.ALL_ENTITY_KINDS) == false)
+        {
+            kind = EntityKind.valueOf(selectedEntityKind);
+        }
+        newScript.setEntityKind(kind);
+        viewContext.getService().registerScript(newScript,
+                new ScriptRegistrationCallback(viewContext, newScript));
+    }
+
+    private final class ScriptRegistrationCallback extends
+            AbstractRegistrationForm.AbstractRegistrationCallback<Void>
+    {
+        private final Script script;
+
+        ScriptRegistrationCallback(final IViewContext<?> viewContext, final Script script)
+        {
+            super(viewContext);
+            this.script = script;
+        }
+
+        @Override
+        protected String createSuccessfullRegistrationInfo(Void result)
+        {
+            return "Script <b>" + script.getName().toUpperCase() + "</b> successfully registered.";
+        }
+    }
+
+    public static String createId()
+    {
+        return AbstractScriptEditRegisterForm.createId(null);
+    }
+
+    @Override
+    protected void setValues()
+    {
+    }
+
+    @Override
+    protected void loadForm()
+    {
+        initGUI();
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index f70246f49c3..9a038e63373 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -2584,4 +2584,18 @@ public final class CommonClientService extends AbstractClientService implements
         }
     }
 
+    public Script getScriptInfo(TechId scriptId)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        try
+        {
+            final String sessionToken = getSessionToken();
+            final Script script = commonServer.getScriptInfo(sessionToken, scriptId);
+            return script;
+        } catch (final ch.systemsx.cisd.common.exceptions.UserFailureException e)
+        {
+            throw UserFailureExceptionTranslator.translate(e);
+        }
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index d793c1adace..20db614b3cd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -2037,4 +2037,11 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                 serviceDescription.getDatastoreCode(), dataSetCode);
     }
 
+    public Script getScriptInfo(String sessionToken, TechId scriptId)
+    {
+        getSession(sessionToken);
+        ScriptPE script = getDAOFactory().getScriptDAO().getByTechId(scriptId);
+        return ScriptTranslator.translate(script);
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index dde64968fe4..bdf87d86ab5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -915,4 +915,9 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
         }
     }
 
+    public Script getScriptInfo(String sessionToken, TechId scriptId)
+    {
+        logAccess(sessionToken, "getScriptInfo", "SCRIPT(%s)", scriptId);
+        return null;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index f4a6024706e..c696c72ecc1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -1156,4 +1156,11 @@ public interface ICommonServer extends IServer
             DatastoreServiceDescription serviceDescription,
             @AuthorizationGuard(guardClass = DataSetCodePredicate.class) String dataSetCode);
 
+    /**
+     * For given {@link TechId} returns the corresponding {@link Script}.
+     */
+    @Transactional(readOnly = true)
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    public Script getScriptInfo(String sessionToken, TechId scriptId);
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
index e38c31b5b5e..7c83dc625da 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
@@ -1,3 +1,4 @@
+
 // Common dictionary
 var common = {
 
@@ -692,6 +693,7 @@ add_script_title: "Add a new script",
 title_choose_script: "Choose a Script",
 script_browser: "Scripts",
 ADMINISTRATION_MENU_SCRIPTS: "Scripts",
+script_registration: "Script Registration",
  
  // LAST LINE: KEEP IT AT THE END
   lastline: "" // we need a line without a comma
-- 
GitLab