From 3a736e5fc28b9a84c47703d447c6c8870ff9608c Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Wed, 1 Jul 2009 09:26:27 +0000
Subject: [PATCH] LMS-967 Some refactorings needed for fixing a GUI bug for
 Phosphonetx

SVN: 11618
---
 .../ui/field/ChosenEntitySetter.java          | 54 +++++++++++++++++++
 .../ui/field/EntityChooserDialog.java         | 13 -----
 .../ui/field/ExperimentChooserField.java      | 33 ++++++------
 .../ui/field/IChosenEntityListener.java       | 27 ++++++++++
 .../ui/field/MaterialChooserField.java        | 10 ++--
 .../ui/field/SampleChooserField.java          |  8 +--
 .../ui/grid/AbstractSimpleBrowserGrid.java    |  8 ++-
 7 files changed, 109 insertions(+), 44 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ChosenEntitySetter.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/IChosenEntityListener.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ChosenEntitySetter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ChosenEntitySetter.java
new file mode 100644
index 00000000000..1c5ec96414c
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ChosenEntitySetter.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2009 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.field;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import com.extjs.gxt.ui.client.widget.form.TextField;
+
+public abstract class ChosenEntitySetter<T> extends TextField<String>
+{
+    private static final int TEXT_CHOOSER_FIELD_WIDTH = 342;
+    
+    private final Set<IChosenEntityListener<T>> listeners =
+            new LinkedHashSet<IChosenEntityListener<T>>();
+
+    protected ChosenEntitySetter()
+    {
+        setWidth(TEXT_CHOOSER_FIELD_WIDTH);
+    }
+    
+    public void addChosenEntityListener(IChosenEntityListener<T> listener)
+    {
+        listeners.add(listener);
+    }
+
+    void setChosenEntity(T entityOrNull)
+    {
+        if (entityOrNull != null)
+        {
+            setValue(renderEntity(entityOrNull));
+        }
+        for (IChosenEntityListener<T> listener : listeners)
+        {
+            listener.entityChosen(entityOrNull);
+        }
+    }
+    
+    abstract String renderEntity(T entity);
+}
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/EntityChooserDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/EntityChooserDialog.java
index 477aea3628d..3f48235943e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/EntityChooserDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/EntityChooserDialog.java
@@ -17,7 +17,6 @@
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field;
 
 import com.extjs.gxt.ui.client.event.ComponentEvent;
-import com.extjs.gxt.ui.client.widget.form.TextField;
 import com.google.gwt.user.client.Event;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
@@ -47,18 +46,6 @@ class EntityChooserDialog<T> extends SimpleDialog
 
     private final IDelegatedAction onCancelAction;
 
-    public static abstract class ChosenEntitySetter<T> extends TextField<String>
-    {
-        private static final int TEXT_CHOOSER_FIELD_WIDTH = 342;
-
-        protected ChosenEntitySetter()
-        {
-            setWidth(TEXT_CHOOSER_FIELD_WIDTH);
-        }
-
-        abstract void setChosenEntity(T entity);
-    }
-
     public EntityChooserDialog(DisposableEntityChooser<T> entityBrowser,
             ChosenEntitySetter<T> chosenEntitySetter, String title, IMessageProvider messageProvider)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ExperimentChooserField.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ExperimentChooserField.java
index 3fada205d65..ed41223e8c8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ExperimentChooserField.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/ExperimentChooserField.java
@@ -23,15 +23,14 @@ import com.extjs.gxt.ui.client.widget.button.Button;
 import com.extjs.gxt.ui.client.widget.form.AdapterField;
 import com.extjs.gxt.ui.client.widget.form.Field;
 import com.extjs.gxt.ui.client.widget.form.MultiField;
-import com.extjs.gxt.ui.client.widget.form.TextField;
 
 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.experiment.ExperimentBrowserGrid;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.EntityChooserDialog.ChosenEntitySetter;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.StringUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
 
@@ -48,7 +47,7 @@ public final class ExperimentChooserField extends ChosenEntitySetter<Experiment>
     {
         Field<?> getField();
         
-        TextField<String> getTextField();
+        ExperimentChooserField getChooserField();
         
         Button getChooseButton();
 
@@ -93,14 +92,14 @@ public final class ExperimentChooserField extends ChosenEntitySetter<Experiment>
                     return chooseButton;
                 }
 
-                public TextField<String> getTextField()
+                public ExperimentChooserField getChooserField()
                 {
                     return chooserField;
                 }
 
                 public ExperimentIdentifier getValue()
                 {
-                    return chooserField.identifer;
+                    return chooserField.tryGetIdentifier();
                 }
 
                 public void updateOriginalValue()
@@ -137,21 +136,22 @@ public final class ExperimentChooserField extends ChosenEntitySetter<Experiment>
 
     private final boolean mandatory;
     
-    private ExperimentIdentifier identifer;
-
     @Override
-    public void setChosenEntity(Experiment entityOrNull)
+    public String renderEntity(Experiment entity)
     {
-        if (entityOrNull != null)
-        {
-            identifer = ExperimentIdentifier.createIdentifier(entityOrNull);
-            setValue(identifer);
-        }
+        return print(ExperimentIdentifier.createIdentifier(entity));
     }
 
-    private void setValue(ExperimentIdentifier chosenEntity)
+    private ExperimentIdentifier tryGetIdentifier()
     {
-        super.setValue(print(chosenEntity));
+        String ident = getValue();
+        if (StringUtils.isBlank(ident))
+        {
+            return null;
+        } else
+        {
+            return new ExperimentIdentifier(ident);
+        }
     }
 
     private String print(ExperimentIdentifier chosenEntity)
@@ -169,10 +169,9 @@ public final class ExperimentChooserField extends ChosenEntitySetter<Experiment>
 
         setRegex(EXPERIMENT_IDENTIFIER_PATTERN);
         getMessages().setRegexText(viewContext.getMessage(Dict.INCORRECT_EXPERIMENT_SYNTAX));
-        identifer = initialValueOrNull;
         if (initialValueOrNull != null)
         {
-            setValue(initialValueOrNull);
+            super.setValue(print(initialValueOrNull));
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/IChosenEntityListener.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/IChosenEntityListener.java
new file mode 100644
index 00000000000..4151ff80d48
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/IChosenEntityListener.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2009 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.field;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public interface IChosenEntityListener<T>
+{
+    public void entityChosen(T entity);
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MaterialChooserField.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MaterialChooserField.java
index d3eccd889f8..a3edf96679c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MaterialChooserField.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MaterialChooserField.java
@@ -27,7 +27,6 @@ import com.extjs.gxt.ui.client.widget.form.MultiField;
 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.field.EntityChooserDialog.ChosenEntitySetter;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.material.MaterialBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil;
@@ -85,13 +84,10 @@ public final class MaterialChooserField extends ChosenEntitySetter<Material>
     private final boolean mandatory;
 
     @Override
-    public void setChosenEntity(Material materialOrNull)
+    public String renderEntity(Material materialOrNull)
     {
-        if (materialOrNull != null)
-        {
-            MaterialIdentifier chosenMaterial = createIdentifier(materialOrNull);
-            super.setValue(chosenMaterial.print());
-        }
+        MaterialIdentifier chosenMaterial = createIdentifier(materialOrNull);
+        return chosenMaterial.print();
     }
 
     private static MaterialIdentifier createIdentifier(Material material)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserField.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserField.java
index d7362963cfa..f68e21a1687 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserField.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserField.java
@@ -27,7 +27,6 @@ import com.extjs.gxt.ui.client.widget.form.MultiField;
 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.field.EntityChooserDialog.ChosenEntitySetter;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.DisposableEntityChooser;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.SampleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil;
@@ -116,12 +115,9 @@ public final class SampleChooserField extends ChosenEntitySetter<Sample>
     private final boolean mandatory;
 
     @Override
-    public void setChosenEntity(Sample entityOrNull)
+    public String renderEntity(Sample entityOrNull)
     {
-        if (entityOrNull != null)
-        {
-            setValue(entityOrNull.getIdentifier());
-        }
+        return entityOrNull.getIdentifier();
     }
 
     public SampleChooserField(boolean mandatory, String initialValueOrNull,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractSimpleBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractSimpleBrowserGrid.java
index 43fda1cfe54..2ab0cc242ef 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractSimpleBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractSimpleBrowserGrid.java
@@ -37,7 +37,13 @@ abstract public class AbstractSimpleBrowserGrid<T/* Entity */> extends
     protected AbstractSimpleBrowserGrid(IViewContext<ICommonClientServiceAsync> viewContext,
             String browserId, String gridId)
     {
-        super(viewContext, gridId, false, true);
+        this(viewContext, browserId, gridId, true);
+    }
+    
+    protected AbstractSimpleBrowserGrid(IViewContext<ICommonClientServiceAsync> viewContext,
+            String browserId, String gridId, boolean refreshAutomatically)
+    {
+        super(viewContext, gridId, false, refreshAutomatically);
         setId(browserId);
         updateDefaultRefreshButton();
     }
-- 
GitLab