From 30dcbe9aa87fc979d94f70dc19cbe7deae55c484 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Tue, 10 Aug 2010 14:02:49 +0000
Subject: [PATCH] [LMS-1676] introduced SampleChooserButton for sample
 registration/edition

SVN: 17383
---
 .../client/web/client/application/Dict.java   |   2 +
 .../ui/field/ChosenEntitySetter.java          |   4 +-
 .../ui/field/EntityChooserDialog.java         |   8 +-
 .../ui/field/IChosenEntityListener.java       |   4 +-
 .../ui/field/IChosenEntitySetter.java         |  25 +++
 .../ui/field/SampleChooserButton.java         | 178 ++++++++++++++++++
 .../client/web/public/generic-dictionary.js   |   1 +
 ...AbstractGenericSampleRegisterEditForm.java |  20 +-
 .../application/sample/ParentSamplesArea.java |   2 +-
 9 files changed, 226 insertions(+), 18 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/IChosenEntitySetter.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserButton.java

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 334edcd09d0..2e4449e12a3 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
@@ -500,6 +500,8 @@ public abstract class Dict
 
     public static final String GENERATED_FROM_SAMPLE = "generated_from_sample";
 
+    public static final String ADD_PARENT = "add_parent";
+
     public static final String PART_OF_SAMPLE = "part_of_sample";
 
     //
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
index d7e86361191..fa4c4f2075d 100644
--- 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
@@ -21,7 +21,7 @@ import java.util.Set;
 
 import com.extjs.gxt.ui.client.widget.form.TriggerField;
 
-public abstract class ChosenEntitySetter<T> extends TriggerField<String>
+abstract class ChosenEntitySetter<T> extends TriggerField<String> implements IChosenEntitySetter<T>
 {
     private static final int TEXT_CHOOSER_FIELD_WIDTH = 342;
 
@@ -40,7 +40,7 @@ public abstract class ChosenEntitySetter<T> extends TriggerField<String>
         listeners.add(listener);
     }
 
-    void setChosenEntity(T entityOrNull)
+    public void setChosenEntity(T entityOrNull)
     {
         if (entityOrNull != null)
         {
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 9343b26b15e..5a0635560e0 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
@@ -45,7 +45,8 @@ class EntityChooserDialog<T> extends SimpleDialog
     private final IDelegatedAction onCancelAction;
 
     public EntityChooserDialog(DisposableEntityChooser<T> entityBrowser,
-            ChosenEntitySetter<T> chosenEntitySetter, String title, IMessageProvider messageProvider)
+            IChosenEntitySetter<T> chosenEntitySetter, String title,
+            IMessageProvider messageProvider)
     {
         super(entityBrowser.getComponent(), title, messageProvider.getMessage(Dict.BUTTON_CHOOSE),
                 messageProvider);
@@ -79,7 +80,7 @@ class EntityChooserDialog<T> extends SimpleDialog
     }
 
     private static <T> IDelegatedAction createAcceptAction(
-            final ChosenEntitySetter<T> chosenEntitySetter,
+            final IChosenEntitySetter<T> chosenEntitySetter,
             final DisposableEntityChooser<T> entityBrowser)
     {
         return new IDelegatedAction()
@@ -94,7 +95,8 @@ class EntityChooserDialog<T> extends SimpleDialog
     }
 
     private static <T> IDelegatedAction createCancelAction(
-            final ChosenEntitySetter<T> chosenEntitySetter, final IDisposableComponent entityBrowser)
+            final IChosenEntitySetter<T> chosenEntitySetter,
+            final IDisposableComponent entityBrowser)
     {
         return new IDelegatedAction()
             {
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
index 63155ba6034..5b9f8dd1c3a 100644
--- 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
@@ -17,9 +17,7 @@
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field;
 
 /**
- * 
- *
- * @author     Franz-Josef Elmer
+ * @author Franz-Josef Elmer
  */
 public interface IChosenEntityListener<T>
 {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/IChosenEntitySetter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/IChosenEntitySetter.java
new file mode 100644
index 00000000000..f85f45014e5
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/IChosenEntitySetter.java
@@ -0,0 +1,25 @@
+/*
+ * 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 Piotr Buczek
+ */
+public interface IChosenEntitySetter<T>
+{
+    public void setChosenEntity(T entityOrNull);
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserButton.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserButton.java
new file mode 100644
index 00000000000..34629acc32d
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/SampleChooserButton.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2008 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.event.ButtonEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
+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 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.framework.SampleTypeDisplayID;
+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.shared.basic.dto.Sample;
+
+/**
+ * ` A button for selecting a sample from a list.
+ * 
+ * @author Piotr Buczek
+ */
+public class SampleChooserButton extends Button implements IChosenEntitySetter<Sample>
+{
+    public interface SampleChooserButtonAdaptor
+    {
+        Field<?> getField();
+
+        SampleChooserButton getChooserButton();
+
+        /** @return the sample identifier (as a string) which is set as a field value */
+        String getValue();
+    }
+
+    private final Set<IChosenEntityListener<Sample>> listeners =
+            new LinkedHashSet<IChosenEntityListener<Sample>>();
+
+    /**
+     * Creates a text field with the additional browse button which allow to choose a sample from
+     * the list.
+     */
+    public static SampleChooserButtonAdaptor create(final String labelField,
+            final String buttonText, final boolean addShared, boolean addAll,
+            final boolean excludeWithoutExperiment,
+            final IViewContext<ICommonClientServiceAsync> viewContext,
+            SampleTypeDisplayID sampleTypeDisplayID)
+    {
+        return create(labelField, buttonText, addShared, addAll, excludeWithoutExperiment,
+                viewContext, null, sampleTypeDisplayID);
+
+    }
+
+    public static SampleChooserButtonAdaptor create(final String labelField,
+            final String buttonText, final boolean addShared, final boolean addAll,
+            final boolean excludeWithoutExperiment,
+            final IViewContext<ICommonClientServiceAsync> viewContext, String idOrNull,
+            final SampleTypeDisplayID sampleTypeDisplayID)
+    {
+        final SampleChooserButton chooserButton = new SampleChooserButton(viewContext, buttonText);
+        chooserButton.addSelectionListener(new SelectionListener<ButtonEvent>()
+            {
+
+                @Override
+                public void componentSelected(ButtonEvent ce)
+                {
+                    browse(viewContext, chooserButton, addShared, addAll, excludeWithoutExperiment,
+                            sampleTypeDisplayID);
+                }
+
+            });
+        if (idOrNull != null)
+        {
+            chooserButton.setId(idOrNull);
+        }
+        final SampleChooserButtonAdaptor adaptor = asSampleChooserFieldAdaptor(chooserButton);
+        Field<?> field = adaptor.getField();
+        field.setFieldLabel(labelField);
+        return adaptor;
+    }
+
+    private static SampleChooserButtonAdaptor asSampleChooserFieldAdaptor(
+            final SampleChooserButton chooserButton)
+    {
+        final Field<?> chooserField = new AdapterField(chooserButton);
+        return new SampleChooserButtonAdaptor()
+            {
+                public Field<?> getField()
+                {
+                    return chooserField;
+                }
+
+                public SampleChooserButton getChooserButton()
+                {
+                    return chooserButton;
+                }
+
+                public String getValue()
+                {
+                    return chooserButton.getValue();
+                }
+
+            };
+    }
+
+    private static void browse(final IViewContext<ICommonClientServiceAsync> viewContext,
+            final IChosenEntitySetter<Sample> chooserSampleSetter, final boolean addShared,
+            boolean addAll, final boolean excludeWithoutExperiment,
+            SampleTypeDisplayID sampleTypeDisplayID)
+    {
+        DisposableEntityChooser<Sample> browser =
+                SampleBrowserGrid.createChooser(viewContext, addShared, addAll,
+                        excludeWithoutExperiment, sampleTypeDisplayID);
+        String title = viewContext.getMessage(Dict.TITLE_CHOOSE_SAMPLE);
+        new EntityChooserDialog<Sample>(browser, chooserSampleSetter, title, viewContext).show();
+    }
+
+    // ------------------
+
+    // @Override
+    public String renderEntity(Sample entityOrNull)
+    {
+        return entityOrNull.getIdentifier();
+    }
+
+    private SampleChooserButton(final IViewContext<ICommonClientServiceAsync> viewContext,
+            final String buttonText)
+    {
+        super(buttonText);
+    }
+
+    public void setChosenEntity(Sample entityOrNull)
+    {
+        if (entityOrNull != null)
+        {
+            setValue(renderEntity(entityOrNull));
+        }
+        for (IChosenEntityListener<Sample> listener : listeners)
+        {
+            listener.entityChosen(entityOrNull);
+        }
+    }
+
+    private String value;
+
+    public String getValue()
+    {
+        return value;
+    }
+
+    public void setValue(String value)
+    {
+        this.value = value;
+    }
+
+    public void addChosenEntityListener(IChosenEntityListener<Sample> listener)
+    {
+        listeners.add(listener);
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/public/generic-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/public/generic-dictionary.js
index ac49fb91009..da71a6b8c3e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/public/generic-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/public/generic-dictionary.js
@@ -25,6 +25,7 @@ var generic = {
   
   instance_sample: "Shared",
   generated_from_sample: "Parent",
+  add_parent: "Add Parent",
   part_of_sample: "Container",
   parents: "Parents",
   
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java
index ec96b78c155..73204a13346 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/AbstractGenericSampleRegisterEditForm.java
@@ -36,8 +36,10 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.GroupSelectionWidget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.IChosenEntityListener;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserButton;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField.ExperimentChooserFieldAdaptor;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserButton.SampleChooserButtonAdaptor;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField.SampleChooserFieldAdaptor;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.file.AttachmentsFileFieldManager;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil;
@@ -84,7 +86,7 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
 
     protected SampleChooserFieldAdaptor container;
 
-    protected SampleChooserFieldAdaptor parent;
+    protected SampleChooserButtonAdaptor parentButton;
 
     protected ParentSamplesArea parentsArea;
 
@@ -176,7 +178,7 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
                 new ArrayList<DatabaseModificationAwareField<?>>();
         fields.add(wrapUnaware(experimentField.getField()));
         fields.add(groupSelectionWidget.asDatabaseModificationAware());
-        fields.add(wrapUnaware(parent.getField()));
+        fields.add(wrapUnaware(parentButton.getField()));
         fields.add(wrapUnaware(parentsArea));
         fields.add(wrapUnaware(container.getField()));
         return fields;
@@ -210,15 +212,15 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
                 new GroupSelectionWidget(viewContext, getId(), true, false, initialGroupCodeOrNull);
         FieldUtil.markAsMandatory(groupSelectionWidget);
         groupSelectionWidget.setFieldLabel(viewContext.getMessage(Dict.GROUP));
-        parent =
-                SampleChooserField.create(viewContext.getMessage(Dict.GENERATED_FROM_SAMPLE),
-                        false, null, true, false, false, viewContext.getCommonViewContext(),
-                        getId() + ID_SUFFIX_PARENT,
+        parentButton =
+                SampleChooserButton.create(viewContext.getMessage(Dict.PARENTS), viewContext
+                        .getMessage(Dict.ADD_PARENT), true, false, false, viewContext
+                        .getCommonViewContext(), getId() + ID_SUFFIX_PARENT,
                         SampleTypeDisplayID.SAMPLE_REGISTRATION_PARENT_CHOOSER
                                 .withSuffix(getSampleTypeCode()));
         parentsArea = new ParentSamplesArea(viewContext, simpleId);
-        SampleChooserField parentChooserField = parent.getChooserField();
-        parentChooserField.addChosenEntityListener(new IChosenEntityListener<Sample>()
+        SampleChooserButton parentChooserButton = parentButton.getChooserButton();
+        parentChooserButton.addChosenEntityListener(new IChosenEntityListener<Sample>()
             {
                 public void entityChosen(Sample entity)
                 {
@@ -276,7 +278,7 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
         boolean showContainer = sampleType.isShowContainer();
         boolean showParents = sampleType.isShowParents();
         FieldUtil.setVisibility(showContainer, container.getField());
-        FieldUtil.setVisibility(showParents, parent.getField(), parentsArea);
+        FieldUtil.setVisibility(showParents, parentButton.getField(), parentsArea);
     }
 
     private String getSampleTypeCode()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesArea.java
index 594762dbcdf..55fbbc9ab59 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesArea.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesArea.java
@@ -32,7 +32,7 @@ final class ParentSamplesArea extends SamplesArea
     public ParentSamplesArea(IMessageProvider messageProvider, String idPrefix)
     {
         super(messageProvider.getMessage(Dict.SAMPLES_LIST));
-        this.setFieldLabel(messageProvider.getMessage(Dict.PARENTS));
+        setLabelSeparator("");
         setId(createId(idPrefix));
     }
 
-- 
GitLab