From 4d96c5beb8b2e698c845ad04e2380e9d0196d7ed Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Fri, 6 Aug 2010 09:42:18 +0000
Subject: [PATCH] [LMS-1676] added parent samples area; refactorization:
 extracted common code & introduced abstract CodesArea

SVN: 17349
---
 .../web/client/application/ui/CodesArea.java  | 65 ++++++++++++++++++
 .../ui/data/DataSetParentsArea.java           | 66 ++++---------------
 .../ui/field/MultilineVarcharField.java       |  2 +-
 .../client/web/public/generic-dictionary.js   |  1 +
 .../experiment/ExperimentSamplesArea.java     | 57 ++--------------
 ...AbstractGenericSampleRegisterEditForm.java | 13 +++-
 .../sample/GenericSampleEditForm.java         | 22 +++++--
 .../application/sample/ParentSamplesArea.java | 44 +++++++++++++
 .../application/sample/SamplesArea.java       | 54 +++++++++++++++
 .../ExperimentPlateLocationsSection.java      |  2 +-
 10 files changed, 209 insertions(+), 117 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CodesArea.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesArea.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CodesArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CodesArea.java
new file mode 100644
index 00000000000..ad41660b43c
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CodesArea.java
@@ -0,0 +1,65 @@
+/*
+ * 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;
+
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.MultilineVarcharField;
+import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code;
+
+/**
+ * A text area to specify list of codes. Codes are specified separated by commas, spaces or new
+ * lines.
+ * 
+ * @author Piotr Buczek
+ */
+abstract public class CodesArea<T extends ICodeHolder> extends MultilineVarcharField
+{
+    public CodesArea(String emptyTextMsg)
+    {
+        super("", false);
+        setEmptyText(emptyTextMsg);
+    }
+
+    public final void setCodeProviders(List<T> codeProviders)
+    {
+        List<String> codes = Code.extractCodes(codeProviders);
+        setCodes(codes.toArray(new String[0]));
+    }
+
+    public final void setCodes(String[] codes)
+    {
+        String textValue = createTextValue(codes);
+        setValue(textValue);
+        setOriginalValue(textValue);
+    }
+
+    private static String createTextValue(String[] codes)
+    {
+        StringBuffer sb = new StringBuffer();
+        for (String code : codes)
+        {
+            if (sb.length() > 0)
+            {
+                sb.append(", ");
+            }
+            sb.append(code);
+        }
+        return sb.toString();
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetParentsArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetParentsArea.java
index 17236c69bbd..e384547dd74 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetParentsArea.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetParentsArea.java
@@ -18,12 +18,8 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data;
 
 import java.util.List;
 
-import com.extjs.gxt.ui.client.widget.form.TextArea;
-
-import ch.systemsx.cisd.common.shared.basic.utils.StringUtils;
 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.ui.field.MultilineVarcharField;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.CodesArea;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 
@@ -33,18 +29,15 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
  * 
  * @author Piotr Buczek
  */
-public final class DataSetParentsArea extends TextArea
+public final class DataSetParentsArea extends CodesArea<ExternalData>
 {
 
     public static final String ID_SUFFIX_PARENTS = "_parents";
 
     public DataSetParentsArea(IMessageProvider messageProvider, String idPrefix)
     {
-        super();
-
-        setHeight("" + MultilineVarcharField.EM_TO_PIXEL * 10);
-        this.setFieldLabel(messageProvider.getMessage(Dict.PARENTS));
-        setEmptyText(messageProvider.getMessage(Dict.PARENTS_EMPTY));
+        super(messageProvider.getMessage(Dict.PARENTS_EMPTY));
+		this.setFieldLabel(messageProvider.getMessage(Dict.PARENTS));
         setId(createId(idPrefix));
     }
 
@@ -53,59 +46,22 @@ public final class DataSetParentsArea extends TextArea
         return idPrefix + ID_SUFFIX_PARENTS;
     }
 
-    // null if the area has not been modified, the list of all data set parent
-    // codes otherwise
+    // delegation to abstract class methods
+
+    // null if the area has not been modified,
+    // the list of all data set parent codes otherwise
     public final String[] tryGetModifiedParentCodes()
     {
-        if (isDirty() == false)
-        {
-            return null;
-        }
-        String text = getValue();
-        if (StringUtils.isBlank(text) == false)
-        {
-            return text.split(GenericConstants.CODES_TEXTAREA_REGEX);
-        } else
-        {
-            return new String[0];
-        }
+        return tryGetModifiedItemList();
     }
 
     public final void setParents(List<ExternalData> parents)
     {
-        setParentCodes(extractCodes(parents));
-    }
-
-    private static String[] extractCodes(List<ExternalData> parents)
-    {
-        String[] codes = new String[parents.size()];
-        int i = 0;
-        for (ExternalData parent : parents)
-        {
-            codes[i] = parent.getCode();
-            i++;
-        }
-        return codes;
+        setCodeProviders(parents);
     }
 
     public final void setParentCodes(String[] parentCodes)
     {
-        String textValue = createTextValue(parentCodes);
-        setValue(textValue);
-        setOriginalValue(textValue);
-    }
-
-    private static String createTextValue(String[] parentCodes)
-    {
-        StringBuffer sb = new StringBuffer();
-        for (String parentCode : parentCodes)
-        {
-            if (sb.length() > 0)
-            {
-                sb.append(", ");
-            }
-            sb.append(parentCode);
-        }
-        return sb.toString();
+        setCodes(parentCodes);
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MultilineVarcharField.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MultilineVarcharField.java
index dad3b8675c1..974a682aae0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MultilineVarcharField.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/MultilineVarcharField.java
@@ -67,7 +67,7 @@ public class MultilineVarcharField extends TextArea
      * null if the area has not been modified, the list of all items (separated by comma or a new
      * line) otherwise
      */
-    public final String[] tryParseItemList()
+    public final String[] tryGetModifiedItemList()
     {
         if (isDirty() == false)
         {
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 69513aabbd0..ac49fb91009 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
@@ -26,6 +26,7 @@ var generic = {
   instance_sample: "Shared",
   generated_from_sample: "Parent",
   part_of_sample: "Container",
+  parents: "Parents",
   
   //
   // Data Set Viewer
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesArea.java
index eac1bf99ded..65b2a3bf7c3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesArea.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentSamplesArea.java
@@ -16,29 +16,23 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment;
 
-import java.util.List;
-
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.MultilineVarcharField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample.SamplesArea;
 
 /**
- * A text area to specify samples for an experiment. Samples are specified by giving codes separated
- * by commas, spaces or new lines.
+ * {@link SamplesArea} extension to specify samples for an experiment.
  * 
  * @author Tomasz Pylak
  */
-final class ExperimentSamplesArea extends MultilineVarcharField
+final class ExperimentSamplesArea extends SamplesArea
 {
-
     public static final String ID_SUFFIX_SAMPLES = "_samples";
 
     public ExperimentSamplesArea(IMessageProvider messageProvider, String idPrefix)
     {
-        super("", false);
+        super(messageProvider.getMessage(Dict.SAMPLES_LIST));
         setLabelSeparator("");
-        setEmptyText(messageProvider.getMessage(Dict.SAMPLES_LIST));
         setId(createId(idPrefix));
     }
 
@@ -47,47 +41,4 @@ final class ExperimentSamplesArea extends MultilineVarcharField
         return idPrefix + ID_SUFFIX_SAMPLES;
     }
 
-    // null if the area has not been modified, the list of all sample codes otherwise
-    public final String[] tryGetSampleCodes()
-    {
-        return tryParseItemList();
-    }
-
-    public final void setSamples(List<Sample> samples)
-    {
-        setSampleCodes(extractCodes(samples));
-    }
-
-    private static String[] extractCodes(List<Sample> samples)
-    {
-        String[] codes = new String[samples.size()];
-        int i = 0;
-        for (Sample sample : samples)
-        {
-            codes[i] = sample.getCode();
-            i++;
-        }
-        return codes;
-    }
-
-    public final void setSampleCodes(String[] samples)
-    {
-        String textValue = createTextValue(samples);
-        setValue(textValue);
-        setOriginalValue(textValue);
-    }
-
-    private static String createTextValue(String[] samples)
-    {
-        StringBuffer sb = new StringBuffer();
-        for (String sample : samples)
-        {
-            if (sb.length() > 0)
-            {
-                sb.append(", ");
-            }
-            sb.append(sample);
-        }
-        return sb.toString();
-    }
 }
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 63cf6debde2..3a1504a4ad5 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
@@ -84,6 +84,8 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
 
     protected SampleChooserFieldAdaptor parent;
 
+    protected ParentSamplesArea parentsArea;
+
     protected AbstractGenericSampleRegisterEditForm(
             IViewContext<IGenericClientServiceAsync> viewContext, ActionContext actionContext)
     {
@@ -173,6 +175,7 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
         fields.add(wrapUnaware(experimentField.getField()));
         fields.add(groupSelectionWidget.asDatabaseModificationAware());
         fields.add(wrapUnaware(parent.getField()));
+        fields.add(wrapUnaware(parentsArea));
         fields.add(wrapUnaware(container.getField()));
         return fields;
     }
@@ -211,6 +214,7 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
                         getId() + ID_SUFFIX_PARENT,
                         SampleTypeDisplayID.SAMPLE_REGISTRATION_PARENT_CHOOSER
                                 .withSuffix(getSampleTypeCode()));
+        parentsArea = new ParentSamplesArea(viewContext, simpleId);
         container =
                 SampleChooserField.create(viewContext.getMessage(Dict.PART_OF_SAMPLE), false, null,
                         true, false, false, viewContext.getCommonViewContext(), getId()
@@ -257,8 +261,8 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
     {
         boolean showContainer = sampleType.isShowContainer();
         boolean showParents = sampleType.isShowParents();
-        container.getField().setVisible(showContainer);
-        parent.getField().setVisible(showParents);
+        FieldUtil.setVisibility(showContainer, container.getField());
+        FieldUtil.setVisibility(showParents, parent.getField(), parentsArea);
     }
 
     private String getSampleTypeCode()
@@ -266,4 +270,9 @@ abstract public class AbstractGenericSampleRegisterEditForm extends
         return sampleType.getCode();
     }
 
+    protected String[] getSamples()
+    {
+        return parentsArea.tryGetSampleCodes();
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
index 422758df6f9..e39feb2386f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
@@ -102,9 +102,10 @@ public final class GenericSampleEditForm extends AbstractGenericSampleRegisterEd
     {
         updatePropertyFieldsOriginalValues();
         experimentField.updateOriginalValue();
-        groupSelectionWidget.updateOriginalValue(groupSelectionWidget.getValue());
+        updateFieldOriginalValue(groupSelectionWidget);
         container.updateOriginalValue();
         parent.updateOriginalValue();
+        updateFieldOriginalValue(parentsArea);
     }
 
     private void setOriginalSample(Sample sample)
@@ -126,6 +127,7 @@ public final class GenericSampleEditForm extends AbstractGenericSampleRegisterEd
         initializeGroup();
         initializeContainedInParent();
         initializeGeneratedFromParent();
+        initializeParents();
     }
 
     private void initializeGroup()
@@ -152,14 +154,24 @@ public final class GenericSampleEditForm extends AbstractGenericSampleRegisterEd
 
     private void initializeGeneratedFromParent()
     {
-        // FIXME 2010-08-05, Piotr Buczek: use parents - not generatedFrom
-        Sample parentSample = originalSample.getGeneratedFrom(); 
-        if (parentSample != null)
+        List<Sample> parents = originalSample.getParents();
+        if (parents.size() == 1)
         {
-            parent.updateValue(parentSample.getIdentifier());
+            Sample parentSample = originalSample.getGeneratedFrom();
+            if (parentSample != null)
+            {
+                parent.updateValue(parentSample.getIdentifier());
+            }
         }
     }
 
+    private void initializeParents()
+    {
+        // TODO 2010-08-06, Piotr Buczek: load in background? like in experiment
+        List<Sample> parents = originalSample.getParents();
+        parentsArea.setSamples(parents);
+    }
+
     @Override
     protected void loadForm()
     {
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
new file mode 100644
index 00000000000..594762dbcdf
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/ParentSamplesArea.java
@@ -0,0 +1,44 @@
+/*
+ * 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.plugin.generic.client.web.client.application.sample;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
+
+/**
+ * {@link SamplesArea} extension to specify parent samples.
+ * 
+ * @author Piotr Buczek
+ */
+final class ParentSamplesArea extends SamplesArea
+{
+
+    public static final String ID_SUFFIX_PARENT_SAMPLES = "_parent_samples";
+
+    public ParentSamplesArea(IMessageProvider messageProvider, String idPrefix)
+    {
+        super(messageProvider.getMessage(Dict.SAMPLES_LIST));
+        this.setFieldLabel(messageProvider.getMessage(Dict.PARENTS));
+        setId(createId(idPrefix));
+    }
+
+    public static String createId(String idPrefix)
+    {
+        return idPrefix + ID_SUFFIX_PARENT_SAMPLES;
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java
new file mode 100644
index 00000000000..49f6d4405bf
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.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.plugin.generic.client.web.client.application.sample;
+
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.CodesArea;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
+
+/**
+ * Abstract {@link CodesArea} extension for samples introducing methods with convenient names.
+ * 
+ * @author Piotr Buczek
+ */
+abstract public class SamplesArea extends CodesArea<Sample>
+{
+    public SamplesArea(String emptyTextMsg)
+    {
+        super(emptyTextMsg);
+    }
+
+    // delegation to abstract class methods
+
+    // null if the area has not been modified,
+    // the list of all sample codes otherwise
+    public final String[] tryGetSampleCodes()
+    {
+        return tryGetModifiedItemList();
+    }
+
+    public final void setSamples(List<Sample> samples)
+    {
+        setCodeProviders(samples);
+    }
+
+    public final void setSampleCodes(String[] codes)
+    {
+        setCodes(codes);
+    }
+}
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentPlateLocationsSection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentPlateLocationsSection.java
index 24094882104..a1e9f20ace3 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentPlateLocationsSection.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ExperimentPlateLocationsSection.java
@@ -140,7 +140,7 @@ public class ExperimentPlateLocationsSection extends SingleSectionPanel
 
     private IDisposableComponent tryCreatePlateMaterialReviewer()
     {
-        String[] materialItemList = materialListField.tryParseItemList();
+        String[] materialItemList = materialListField.tryGetModifiedItemList();
         if (materialItemList == null || materialItemList.length == 0)
         {
             return null;
-- 
GitLab