From b076d103c3d8f3f024803a61de60e5804e9d94b4 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Tue, 10 Aug 2010 08:00:18 +0000
Subject: [PATCH] [LMS-1676] improved Parents column for sample browsers; sort
 parents by code

SVN: 17374
---
 .../renderer/InternalLinkCellRenderer.java    | 21 +++++++++++++++++--
 .../web/client/application/ui/CodesArea.java  |  3 ++-
 .../sample/AbstractParentSampleColDef.java    |  7 ++++++-
 .../ParentGeneratedFromSampleColDef.java      | 17 ++++++++++++++-
 .../ui/sample/SampleBrowserGrid.java          | 10 ++++++++-
 .../generic/shared/basic/dto/Sample.java      | 12 ++++++-----
 .../sample/GenericSampleEditForm.java         |  5 +++--
 .../sample/GenericSampleViewer.java           | 10 ++++-----
 .../application/sample/SamplesArea.java       |  3 ++-
 .../plugin/generic/server/GenericServer.java  |  5 ++++-
 10 files changed, 73 insertions(+), 20 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/InternalLinkCellRenderer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/InternalLinkCellRenderer.java
index 75fb413277a..0e74b76fadf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/InternalLinkCellRenderer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/InternalLinkCellRenderer.java
@@ -9,6 +9,17 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.Base
 
 public class InternalLinkCellRenderer implements GridCellRenderer<BaseEntityModel<?>>
 {
+    private final boolean renderOriginalValueForEmptyToken;
+
+    public InternalLinkCellRenderer(boolean renderOriginalValueForEmptyToken)
+    {
+        this.renderOriginalValueForEmptyToken = renderOriginalValueForEmptyToken;
+    }
+
+    public InternalLinkCellRenderer()
+    {
+        this(false);
+    }
 
     public Object render(BaseEntityModel<?> model, String property, ColumnData config,
             int rowIndex, int colIndex, ListStore<BaseEntityModel<?>> store,
@@ -21,8 +32,14 @@ public class InternalLinkCellRenderer implements GridCellRenderer<BaseEntityMode
         { // TODO 2010-05-18, IA: almost the same as LinkRenderer#createLinkRenderer()
             String originalValue = String.valueOf(model.get(property));
             String tokenOrNull = model.tryGetLink(property);
-            String href = "#" + (tokenOrNull != null ? tokenOrNull : "");
-            return LinkRenderer.renderAsLinkWithAnchor(originalValue, href, false);
+            if (tokenOrNull == null && renderOriginalValueForEmptyToken)
+            {
+                return originalValue;
+            } else
+            {
+                String href = "#" + (tokenOrNull != null ? tokenOrNull : "");
+                return LinkRenderer.renderAsLinkWithAnchor(originalValue, href, false);
+            }
         }
     }
 }
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
index 5b6826116b8..3f3d5e471ec 100644
--- 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
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui;
 
+import java.util.Collection;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.MultilineVarcharField;
@@ -36,7 +37,7 @@ abstract public class CodesArea<T extends ICodeHolder> extends MultilineVarcharF
         setEmptyText(emptyTextMsg);
     }
 
-    public final void setCodeProviders(List<T> codeProviders)
+    public final void setCodeProviders(Collection<T> codeProviders)
     {
         List<String> codes = Code.extractCodes(codeProviders);
         setCodes(codes);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java
index a9192fe0d9f..7d4787f7e6c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java
@@ -39,13 +39,18 @@ public abstract class AbstractParentSampleColDef extends AbstractColumnDefinitio
         Sample parent = tryGetParent(sample);
         if (parent != null)
         {
-            return parent.getIdentifier();
+            return getAsValue(parent);
         } else
         {
             return null;
         }
     }
 
+    protected final String getAsValue(Sample sample)
+    {
+        return sample.getIdentifier();
+    }
+
     @Override
     public String tryGetLink(Sample sample)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java
index 51f305068e7..c1de7882d3e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java
@@ -16,12 +16,15 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.MultilineHTML;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 public class ParentGeneratedFromSampleColDef extends AbstractParentSampleColDef
 {
     private static final String IDENTIFIER = "generatedFromParent";
 
+    private static final int MAX_PARENTS = 4;
+
     // GWT only
     public ParentGeneratedFromSampleColDef()
     {
@@ -62,7 +65,19 @@ public class ParentGeneratedFromSampleColDef extends AbstractParentSampleColDef
             return super.tryGetValue(sample);
         } else
         {
-            return parentsSize + "";
+            StringBuilder sb = new StringBuilder();
+            int counter = 0;
+            for (Sample parent : sample.getParents())
+            {
+                if (counter == MAX_PARENTS)
+                {
+                    sb.append("... (").append(parentsSize - MAX_PARENTS).append(" more)");
+                    break;
+                }
+                sb.append(getAsValue(parent)).append("\n");
+                counter++;
+            }
+            return new MultilineHTML(sb.toString()).toString();
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
index a1789e6d6bf..9f58645e23a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
@@ -42,6 +42,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.SampleTypeDisplayID;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.SampleModelFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.InternalLinkCellRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.DisplayedAndSelectedEntities;
 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.sample.AbstractParentSampleColDef;
@@ -612,9 +613,11 @@ public class SampleBrowserGrid extends
                 linkCellRenderer);
         schema.setGridCellRendererFor(CommonSampleColDefKind.PROJECT.id(), linkCellRenderer);
         // setup link renderers and listeners on parent columns
+        GridCellRenderer<BaseEntityModel<?>> parentLinkCellRenderer =
+                createParentLinkCellRenderer();
         for (final AbstractParentSampleColDef parentColDef : parentColumnsSchema)
         {
-            schema.setGridCellRendererFor(parentColDef.getIdentifier(), linkCellRenderer);
+            schema.setGridCellRendererFor(parentColDef.getIdentifier(), parentLinkCellRenderer);
             registerLinkClickListenerFor(parentColDef.getIdentifier(),
                     new OpenEntityDetailsTabCellClickListener()
                         {
@@ -629,6 +632,11 @@ public class SampleBrowserGrid extends
         return schema;
     }
 
+    protected final GridCellRenderer<BaseEntityModel<?>> createParentLinkCellRenderer()
+    {
+        return new InternalLinkCellRenderer(true);
+    }
+
     @Override
     protected boolean hasColumnsDefinitionChanged(ListSampleDisplayCriteria newCriteria)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Sample.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Sample.java
index 2fbb11ffd5a..303735ea505 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Sample.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Sample.java
@@ -19,6 +19,8 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
 
 import ch.systemsx.cisd.common.annotation.CollectionMapping;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IAttachmentHolder;
@@ -52,7 +54,7 @@ public final class Sample extends CodeWithRegistration<Sample> implements IInval
 
     private Sample container;
 
-    private List<Sample> parents = new ArrayList<Sample>();
+    private Set<Sample> parents = new TreeSet<Sample>();
 
     private List<IEntityProperty> properties;
 
@@ -156,12 +158,12 @@ public final class Sample extends CodeWithRegistration<Sample> implements IInval
         this.container = container;
     }
 
-    public List<Sample> getParents()
+    public Set<Sample> getParents()
     {
         return parents;
     }
 
-    public void setParents(List<Sample> parents)
+    public void setParents(Set<Sample> parents)
     {
         this.parents = parents;
     }
@@ -182,13 +184,13 @@ public final class Sample extends CodeWithRegistration<Sample> implements IInval
             throw new IllegalStateException("Sample " + getIdentifier()
                     + " has more than one parent");
         }
-        return parents.get(0);
+        return parents.iterator().next();
     }
 
     // used only for testing
     public void setGeneratedFrom(final Sample generatedFrom)
     {
-        parents = new ArrayList<Sample>();
+        parents = new TreeSet<Sample>();
         parents.add(generatedFrom);
     }
 
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 11cf3cf3143..eb98d7c3c56 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
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample;
 
 import java.util.List;
+import java.util.Set;
 
 import ch.systemsx.cisd.common.shared.basic.utils.StringUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -156,7 +157,7 @@ public final class GenericSampleEditForm extends AbstractGenericSampleRegisterEd
 
     private void initializeGeneratedFromParent()
     {
-        List<Sample> parents = originalSample.getParents();
+        Set<Sample> parents = originalSample.getParents();
         if (parents.size() == 1)
         {
             Sample parentSample = originalSample.getGeneratedFrom();
@@ -170,7 +171,7 @@ public final class GenericSampleEditForm extends AbstractGenericSampleRegisterEd
     private void initializeParents()
     {
         // TODO 2010-08-06, Piotr Buczek: load in background? like in experiment
-        List<Sample> parents = originalSample.getParents();
+        Set<Sample> parents = originalSample.getParents();
         parentsArea.setSamples(parents);
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
index c2a99e4602d..d095dc73724 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
@@ -202,17 +202,17 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme
         containerSamplesSection = new ContainerSamplesSection(viewContext, generator);
         containerSamplesSection.setDisplayID(DisplayTypeIDGenerator.CONTAINER_SAMPLES_SECTION,
                 displayIdSuffix);
-        container.addPanel(containerSamplesSection);
+        container.addPanel(containerSamplesSection, false);
         // Derived samples
         derivedSamplesSection = new DerivedSamplesSection(viewContext, generator);
         derivedSamplesSection.setDisplayID(DisplayTypeIDGenerator.DERIVED_SAMPLES_SECTION,
                 displayIdSuffix);
-        container.addPanel(derivedSamplesSection);
+        container.addPanel(derivedSamplesSection, false);
         // Parent samples
         parentSamplesSection = new ParentSamplesSection(viewContext, generator);
         parentSamplesSection.setDisplayID(DisplayTypeIDGenerator.PARENT_SAMPLES_SECTION,
                 displayIdSuffix);
-        container.addPanel(parentSamplesSection);
+        container.addPanel(parentSamplesSection, false);
         // Data Sets
         CheckBox showOnlyDirectlyConnectedCheckBox = createShowOnlyDirectlyConnectedCheckBox();
         dataSetBrowser =
@@ -290,11 +290,11 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme
         {
             properties.put(messageProvider.getMessage(Dict.DERIVED_SAMPLE) + "s", generated.length);
         }
-        final List<Sample> parents = sample.getParents();
+        final Set<Sample> parents = sample.getParents();
         final int parentsSize = parents.size();
         if (parentsSize == 1)
         {
-            properties.put(messageProvider.getMessage(Dict.PARENT), parents.get(0));
+            properties.put(messageProvider.getMessage(Dict.PARENT), parents.iterator().next());
         } else if (parentsSize > 1)
         {
             properties.put(messageProvider.getMessage(Dict.PARENTS), parentsSize);
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
index 2354cbaa0bb..8772464e680 100644
--- 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
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample;
 
+import java.util.Collection;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.CodesArea;
@@ -42,7 +43,7 @@ abstract public class SamplesArea extends CodesArea<Sample>
         return tryGetModifiedItemList();
     }
 
-    public final void setSamples(List<Sample> samples)
+    public final void setSamples(Collection<Sample> samples)
     {
         setCodeProviders(samples);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
index 105979dc8b6..24d4167ac95 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.plugin.generic.server;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -681,7 +682,9 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
         SampleUpdateResult result = new SampleUpdateResult();
         SamplePE sample = sampleBO.getSample();
         result.setModificationDate(sample.getModificationDate());
-        result.setParents(Code.extractCodes(sample.getParents()));
+        List<String> parents = Code.extractCodes(sample.getParents());
+        Collections.sort(parents);
+        result.setParents(parents);
         return result;
     }
 
-- 
GitLab