From b218cc8a65108f07a53cb5b4e6b7a2642daa7b3a Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Mon, 4 Jul 2011 09:29:18 +0000
Subject: [PATCH] [LMS-2354] introduced MaterialMergedSummarySection (not shown
 yet because of some bugs), extracted code for experiment chooser to
 SingleOrAllExperimentsChooser

SVN: 21957
---
 .../client/web/client/application/Dict.java   |   3 +
 .../application/DisplayTypeIDGenerator.java   |   8 +-
 .../detailviewers/ImagingMaterialViewer.java  |  27 ++-
 ...alFeaturesFromAllExperimentsComponent.java |   1 +
 .../MaterialMergedSummarySection.java         | 105 ++++++++++
 .../SingleOrAllExperimentsChooser.java        | 194 ++++++++++++++++++
 .../detailviewers/WellSearchGrid.java         | 154 +-------------
 .../client/web/public/screening-dictionary.js |   1 +
 .../shared/basic/dto/WellSearchCriteria.java  |  21 ++
 9 files changed, 359 insertions(+), 155 deletions(-)
 create mode 100644 screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialMergedSummarySection.java
 create mode 100644 screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/SingleOrAllExperimentsChooser.java

diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/Dict.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/Dict.java
index 0e5d5541b0e..b78854132fc 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/Dict.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/Dict.java
@@ -64,6 +64,9 @@ public final class Dict extends ch.systemsx.cisd.openbis.generic.client.web.clie
 
     public static final String PLATE_LOCATIONS = "plate_locations";
 
+    public static final String MATERIAL_MERGED_SUMMARY_SECTION_TITLE =
+            "MATERIAL_MERGED_SUMMARY_SECTION_TITLE";
+
     public static final String MATERIAL_REPLICA_SUMMARY_SECTION_TITLE =
             "MATERIAL_REPLICA_SUMMARY_SECTION_TITLE";
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/DisplayTypeIDGenerator.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/DisplayTypeIDGenerator.java
index a0929d89762..5ffc9eb5447 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/DisplayTypeIDGenerator.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/DisplayTypeIDGenerator.java
@@ -28,7 +28,7 @@ public enum DisplayTypeIDGenerator implements IDisplayTypeIDGenerator
     PLATE_LAYOUT_SAMPLE_SECTION("plate-layout-sample-section"),
 
     LOGICAL_IMAGE_WELL_SECTION("logical-image-well-section"),
-    
+
     PLATE_LAYOUT_DATASET_SECTION("plate-layout-dataset-section"),
 
     LOGICAL_IMAGE_DATASET_SECTION("logical-image-dataset-section"),
@@ -40,9 +40,11 @@ public enum DisplayTypeIDGenerator implements IDisplayTypeIDGenerator
     EXPERIMENT_WELL_MATERIALS_SECTION("experiment-well-materials-section"),
 
     EXPERIMENT_FEATURE_VECTOR_SUMMARY_SECTION("experiment-feature-vector-summary-section"),
-    
+
+    MATERIAL_MERGED_SUMMARY_SECTION("material-merged-summary-section"),
+
     MATERIAL_REPLICA_SUMMARY_SECTION("material-replica-summary-section"),
-    
+
     MATERIAL_FEATURES_FROM_ALL_EXPERIMENTS_SECTION("material-features-all-experiments-section");
 
     private final String genericNameOrPrefix;
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingMaterialViewer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingMaterialViewer.java
index ca934c964df..3d2842365de 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingMaterialViewer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingMaterialViewer.java
@@ -40,6 +40,8 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCrit
 public class ImagingMaterialViewer extends GenericMaterialViewer
 {
 
+    private static final boolean SUMMARY_SECTION_IMPLEMENTED = false; // FIXME
+
     /**
      * @param experimentCriteriaOrNull if the experiment criteria are specified, they will be chosen
      *            automatically when the window opens.
@@ -56,14 +58,14 @@ public class ImagingMaterialViewer extends GenericMaterialViewer
 
     private final IViewContext<IScreeningClientServiceAsync> screeningViewContext;
 
-    private final ExperimentSearchCriteria experimentCriteriaOrNull;
+    private final ExperimentSearchCriteria initialExperimentCriteriaOrNull;
 
     private ImagingMaterialViewer(IViewContext<IScreeningClientServiceAsync> viewContext,
             TechId materialTechId, ExperimentSearchCriteria experimentCriteriaOrNull)
     {
         super(viewContext, materialTechId);
         this.screeningViewContext = viewContext;
-        this.experimentCriteriaOrNull = experimentCriteriaOrNull;
+        this.initialExperimentCriteriaOrNull = experimentCriteriaOrNull;
     }
 
     @Override
@@ -80,20 +82,29 @@ public class ImagingMaterialViewer extends GenericMaterialViewer
 
         WellSearchMaterialSection wellSearchSection =
                 new WellSearchMaterialSection(screeningViewContext, materialId,
-                        experimentCriteriaOrNull);
+                        initialExperimentCriteriaOrNull);
         sections.add(wellSearchSection);
 
-        String experimentPermId = tryGetExperimentPermId();
+        boolean restrictGlobalScopeLinkToProject =
+                isRestrictGlobalScopeLinkToProject(initialExperimentCriteriaOrNull);
+        if (SUMMARY_SECTION_IMPLEMENTED)
+        {
+            MaterialMergedSummarySection summarySection =
+                    new MaterialMergedSummarySection(screeningViewContext, material,
+                            initialExperimentCriteriaOrNull, restrictGlobalScopeLinkToProject);
+            sections.add(summarySection);
+        }
+
+        String experimentPermId = tryGetExperimentPermId(initialExperimentCriteriaOrNull);
         if (experimentPermId != null)
         {
-            boolean restrictGlobalScopeLinkToProject =
-                    isRestrictGlobalScopeLinkToProject(experimentCriteriaOrNull);
             MaterialReplicaSummarySection replicaSummarySection =
                     new MaterialReplicaSummarySection(screeningViewContext, material,
                             experimentPermId, restrictGlobalScopeLinkToProject);
             sections.add(replicaSummarySection);
         }
-        ExperimentSearchByProjectCriteria experimentCriteria = tryConvert(experimentCriteriaOrNull);
+        ExperimentSearchByProjectCriteria experimentCriteria =
+                tryConvert(initialExperimentCriteriaOrNull);
         MaterialFeaturesFromAllExpermentsSection featuresFromAllExperimentsSection =
                 new MaterialFeaturesFromAllExpermentsSection(screeningViewContext, material,
                         experimentCriteria);
@@ -126,7 +137,7 @@ public class ImagingMaterialViewer extends GenericMaterialViewer
         }
     }
 
-    private String tryGetExperimentPermId()
+    private static String tryGetExperimentPermId(ExperimentSearchCriteria experimentCriteriaOrNull)
     {
         if (experimentCriteriaOrNull != null)
         {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExperimentsComponent.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExperimentsComponent.java
index 975a27c370c..59585851dbf 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExperimentsComponent.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialFeaturesFromAllExperimentsComponent.java
@@ -61,4 +61,5 @@ public class MaterialFeaturesFromAllExperimentsComponent
         return MaterialComponentUtils.createMaterialViewer(screeningViewContext, material,
                 headingText, gridComponent);
     }
+
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialMergedSummarySection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialMergedSummarySection.java
new file mode 100644
index 00000000000..5ba68f92431
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MaterialMergedSummarySection.java
@@ -0,0 +1,105 @@
+package ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.DisposableTabContent;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
+import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.IScreeningClientServiceAsync;
+import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.Dict;
+import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.DisplayTypeIDGenerator;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteriaHolder;
+
+/**
+ * Section in material detail view which presents either
+ * {@link MaterialFeaturesFromAllExperimentsComponent} or {@link MaterialReplicaSummaryComponent}
+ * for a selected experiment.
+ * 
+ * @author Piotr Buczek
+ */
+class MaterialMergedSummarySection extends DisposableTabContent
+{
+    private final IViewContext<IScreeningClientServiceAsync> screeningViewContext;
+
+    private final Material material;
+
+    private final boolean restrictGlobalScopeLinkToProject;
+
+    private ExperimentSearchCriteriaHolder experimentSearchCriteriaHolder;
+
+    public MaterialMergedSummarySection(
+            IViewContext<IScreeningClientServiceAsync> screeningViewContext, Material material,
+            ExperimentSearchCriteria experimentCriteriaOrNull,
+            boolean restrictGlobalScopeLinkToProject)
+    {
+        super(screeningViewContext.getMessage(Dict.MATERIAL_MERGED_SUMMARY_SECTION_TITLE),
+                screeningViewContext, material);
+        this.screeningViewContext = screeningViewContext;
+        this.material = material;
+        this.restrictGlobalScopeLinkToProject = restrictGlobalScopeLinkToProject;
+        this.experimentSearchCriteriaHolder =
+                new ExperimentSearchCriteriaHolder(experimentCriteriaOrNull);
+        setIds(DisplayTypeIDGenerator.MATERIAL_MERGED_SUMMARY_SECTION);
+    }
+
+    private IDelegatedAction createRefreshAction(
+            final ExperimentSearchCriteriaHolder searchCriteriaHolder)
+    {
+        return new IDelegatedAction()
+            {
+
+                public void execute()
+                {
+                    ExperimentSearchCriteria criteriaOrNull = searchCriteriaHolder.tryGetCriteria();
+                    if (criteriaOrNull != null && criteriaOrNull.tryGetExperiment() != null)
+                    {
+                        final String experimentPermId =
+                                criteriaOrNull.tryGetExperiment().getExperimentPermId();
+                        screeningViewContext.getCommonService().getExperimentInfoByPermId(
+                                experimentPermId,
+                                new AbstractAsyncCallback<Experiment>(screeningViewContext)
+                                    {
+                                        @Override
+                                        protected void process(Experiment experiment)
+                                        {
+                                            setHeading(screeningViewContext.getMessage(
+                                                    Dict.MATERIAL_REPLICA_SUMMARY_SECTION_TITLE,
+                                                    experiment.getCode()));
+                                            replaceContent(MaterialReplicaSummaryComponent
+                                                    .createViewer(screeningViewContext, experiment,
+                                                            material,
+                                                            restrictGlobalScopeLinkToProject));
+                                        }
+                                    });
+                    } else
+                    {
+                        replaceContent(MaterialFeaturesFromAllExperimentsComponent.createComponent(
+                                screeningViewContext, material, criteriaOrNull == null ? null
+                                        : criteriaOrNull.tryAsSearchByProjectCriteria()));
+                    }
+                }
+            };
+    }
+
+    @Override
+    protected IDisposableComponent createDisposableContent()
+    {
+        return null; // content will be automatically added on criteria change
+    }
+
+    @Override
+    protected void showContent()
+    {
+        super.showContent();
+        // getHeader().setText("");
+        setHeading("");
+        getHeader().addTool(
+                new SingleOrAllExperimentsChooser(screeningViewContext,
+                        experimentSearchCriteriaHolder,
+                        createRefreshAction(experimentSearchCriteriaHolder)));
+    }
+
+}
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/SingleOrAllExperimentsChooser.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/SingleOrAllExperimentsChooser.java
new file mode 100644
index 00000000000..c0123db21da
--- /dev/null
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/SingleOrAllExperimentsChooser.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2011 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.screening.client.web.client.application.detailviewers;
+
+import com.extjs.gxt.ui.client.Style.Orientation;
+import com.extjs.gxt.ui.client.event.BaseEvent;
+import com.extjs.gxt.ui.client.event.Events;
+import com.extjs.gxt.ui.client.event.Listener;
+import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.form.Radio;
+import com.extjs.gxt.ui.client.widget.form.RadioGroup;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+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.ExperimentChooserField.ExperimentChooserFieldAdaptor;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.IChosenEntityListener;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteriaHolder;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria;
+
+/**
+ * A {@link LayoutContainer} making it possible to choose between either all experiments and a
+ * single experiment.
+ */
+class SingleOrAllExperimentsChooser extends LayoutContainer
+{
+    private static final String SINGLE_EXPERIMENT_TEXT = "Single experiment";
+
+    private static final String ALL_EXPERIMENTS_TEXT = "All experiments";
+
+    private static final String CHOOSE_ONE_EXPERIMENT_TEXT = "Choose one experiment...";
+
+    private SingleExperimentSearchCriteria singleExperimentChooserStateOrNull;
+
+    private final IViewContext<?> viewContext;
+
+    private final IDelegatedAction refreshAction;
+
+    private final ExperimentSearchCriteriaHolder experimentCriteriaHolder;
+
+    public SingleOrAllExperimentsChooser(IViewContext<?> viewContext,
+            ExperimentSearchCriteriaHolder experimentCriteriaHolder, IDelegatedAction refreshAction)
+    {
+        this.viewContext = viewContext;
+        this.experimentCriteriaHolder = experimentCriteriaHolder;
+        this.refreshAction = refreshAction;
+        ExperimentChooserFieldAdaptor singleExperimentChooser = createSingleExperimentChooser();
+        RadioGroup experimentRadioChooser = createExperimentRadio(singleExperimentChooser);
+
+        setWidth(400);
+        add(experimentRadioChooser);
+        add(singleExperimentChooser.getField());
+    }
+
+    private ExperimentSearchCriteria tryGetExperimentSearchCriteria()
+    {
+        return experimentCriteriaHolder.tryGetCriteria();
+    }
+
+    private boolean isAllExperimentsChoosen()
+    {
+        ExperimentSearchCriteria criteriaOrNull = tryGetExperimentSearchCriteria();
+        return criteriaOrNull != null && criteriaOrNull.tryGetExperiment() == null;
+    }
+
+    private ExperimentChooserFieldAdaptor createSingleExperimentChooser()
+    {
+        ExperimentChooserFieldAdaptor experimentChooser =
+                ExperimentChooserField.create("", true, null, viewContext.getCommonViewContext());
+        final ExperimentChooserField chooserField = experimentChooser.getChooserField();
+        chooserField
+                .addChosenEntityListener(new IChosenEntityListener<TableModelRowWithObject<Experiment>>()
+                    {
+                        public void entityChosen(TableModelRowWithObject<Experiment> row)
+                        {
+                            if (row != null)
+                            {
+                                chooseSingleExperiment(chooserField, row.getObjectOrNull());
+                            }
+                        }
+                    });
+
+        chooserField.setEditable(false);
+        ExperimentSearchCriteria criteriaOrNull = tryGetExperimentSearchCriteria();
+
+        if (criteriaOrNull == null || criteriaOrNull.tryGetExperiment() == null)
+        {
+            // we search in all experiments or single experiment has not been chosen
+            this.singleExperimentChooserStateOrNull = null;
+            chooserField.reset();
+        } else
+        {
+            // we search in a single experiment
+            updateSingleExperimentChooser(chooserField, criteriaOrNull.tryGetExperiment());
+        }
+        if (criteriaOrNull == null || criteriaOrNull.tryGetExperiment() != null)
+        {
+            chooserField.setEmptyText(CHOOSE_ONE_EXPERIMENT_TEXT);
+        } else
+        {
+            chooserField.setEmptyText(ALL_EXPERIMENTS_TEXT);
+        }
+        return experimentChooser;
+    }
+
+    private RadioGroup createExperimentRadio(
+            final ExperimentChooserFieldAdaptor singleExperimentChooser)
+    {
+        final RadioGroup experimentRadio = new RadioGroup();
+        experimentRadio.setSelectionRequired(true);
+        experimentRadio.setOrientation(Orientation.HORIZONTAL);
+
+        final Radio allExps = new Radio();
+        allExps.setBoxLabel(ALL_EXPERIMENTS_TEXT);
+        experimentRadio.add(allExps);
+
+        final Radio oneExps = new Radio();
+        oneExps.setBoxLabel(SINGLE_EXPERIMENT_TEXT);
+        experimentRadio.add(oneExps);
+
+        experimentRadio.setValue(isAllExperimentsChoosen() ? allExps : oneExps);
+        experimentRadio.setAutoHeight(true);
+        experimentRadio.addListener(Events.Change, new Listener<BaseEvent>()
+            {
+                public void handleEvent(BaseEvent be)
+                {
+                    if (allExps.getValue())
+                    {
+                        singleExperimentChooser.getChooserField().setEnabled(false);
+                        singleExperimentChooser.getChooserField()
+                                .setEmptyText(ALL_EXPERIMENTS_TEXT);
+                        experimentCriteriaHolder.setCriteria(ExperimentSearchCriteria
+                                .createAllExperiments());
+                        refreshAction.execute();
+                    } else
+                    {
+                        singleExperimentChooser.getChooserField().setEmptyText(
+                                CHOOSE_ONE_EXPERIMENT_TEXT);
+
+                        singleExperimentChooser.getChooserField().setEnabled(true);
+                        if (singleExperimentChooserStateOrNull == null)
+                        {
+                            experimentCriteriaHolder.setCriteria(null);
+                        } else
+                        {
+                            experimentCriteriaHolder.setCriteria(ExperimentSearchCriteria
+                                    .createExperiment(singleExperimentChooserStateOrNull));
+                            refreshAction.execute();
+                        }
+                    }
+                }
+            });
+        return experimentRadio;
+    }
+
+    private void chooseSingleExperiment(final ExperimentChooserField chooserField,
+            Experiment experiment)
+    {
+        SingleExperimentSearchCriteria singleExperiment =
+                new SingleExperimentSearchCriteria(experiment.getId(), experiment.getPermId(),
+                        experiment.getIdentifier());
+        updateSingleExperimentChooser(chooserField, singleExperiment);
+        experimentCriteriaHolder.setCriteria(ExperimentSearchCriteria
+                .createExperiment(singleExperiment));
+        refreshAction.execute();
+    }
+
+    private void updateSingleExperimentChooser(ExperimentChooserField chooserField,
+            SingleExperimentSearchCriteria singleExperiment)
+    {
+        this.singleExperimentChooserStateOrNull = singleExperiment;
+        chooserField.updateValue(new ExperimentIdentifier(singleExperiment
+                .getExperimentIdentifier()));
+    }
+
+}
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
index 4f8179277ce..60479507242 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/WellSearchGrid.java
@@ -21,16 +21,9 @@ import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
-import com.extjs.gxt.ui.client.Style.Orientation;
-import com.extjs.gxt.ui.client.event.BaseEvent;
-import com.extjs.gxt.ui.client.event.Events;
-import com.extjs.gxt.ui.client.event.Listener;
 import com.extjs.gxt.ui.client.store.ListStore;
 import com.extjs.gxt.ui.client.widget.Component;
 import com.extjs.gxt.ui.client.widget.Label;
-import com.extjs.gxt.ui.client.widget.LayoutContainer;
-import com.extjs.gxt.ui.client.widget.form.Radio;
-import com.extjs.gxt.ui.client.widget.form.RadioGroup;
 import com.extjs.gxt.ui.client.widget.grid.ColumnData;
 import com.extjs.gxt.ui.client.widget.grid.Grid;
 import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
@@ -50,15 +43,11 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpP
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.TypedTableGrid;
 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.field.ExperimentChooserField;
-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.IChosenEntityListener;
 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.ICellListenerAndLinkGenerator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
-import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TableExportCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithIdentifier;
@@ -84,8 +73,8 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ImageDatasetPa
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellContent;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteria;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.ExperimentSearchCriteriaHolder;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.MaterialSearchCriteria;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.SingleExperimentSearchCriteria;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.grids.WellSearchGridColumnIds;
 
 /**
@@ -98,12 +87,6 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
 
     private static final String CHANNEL_CHOOSER_LABEL = "Channel:";
 
-    private static final String SINGLE_EXPERIMENT_TEXT = "Single experiment";
-
-    private static final String ALL_EXPERIMENTS_TEXT = "All experiments";
-
-    private static final String CHOOSE_ONE_EXPERIMENT_TEXT = "Choose one experiment...";
-
     private static final int IMAGE_SIZE_PX = 80;
 
     // by experiment perm id
@@ -248,9 +231,9 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
 
     private final MaterialSearchCriteria materialCriteria;
 
-    private ExperimentSearchCriteria experimentCriteriaOrNull;
+    private final ExperimentSearchCriteriaHolder experimentCriteriaHolder;
 
-    private SingleExperimentSearchCriteria singleExperimentChooserStateOrNull;
+    // private ExperimentSearchCriteria experimentCriteriaOrNull;
 
     private ChannelChooserPanel channelChooser;
 
@@ -261,7 +244,9 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
         super(viewContext.getCommonViewContext(), BROWSER_ID, experimentCriteriaOrNull != null,
                 DisplayTypeIDGenerator.PLATE_MATERIAL_REVIEWER);
         this.viewContext = viewContext;
-        this.experimentCriteriaOrNull = experimentCriteriaOrNull;
+
+        this.experimentCriteriaHolder =
+                new ExperimentSearchCriteriaHolder(experimentCriteriaOrNull);
         this.materialCriteria = materialCriteria;
 
         final IDefaultChannelState defaultChannelState =
@@ -521,129 +506,8 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
 
     private Component createExperimentChooser()
     {
-        LayoutContainer container = new LayoutContainer();
-        container.setWidth(400);
-
-        ExperimentChooserFieldAdaptor singleExperimentChooser = createSingleExperimentChooser();
-        RadioGroup experimentRadioChooser = createExperimentRadio(singleExperimentChooser);
-
-        container.add(experimentRadioChooser);
-        container.add(singleExperimentChooser.getField());
-        return container;
-    }
-
-    private ExperimentChooserFieldAdaptor createSingleExperimentChooser()
-    {
-        ExperimentChooserFieldAdaptor experimentChooser =
-                ExperimentChooserField.create("", true, null, viewContext.getCommonViewContext());
-        final ExperimentChooserField chooserField = experimentChooser.getChooserField();
-        chooserField
-                .addChosenEntityListener(new IChosenEntityListener<TableModelRowWithObject<Experiment>>()
-                    {
-                        public void entityChosen(TableModelRowWithObject<Experiment> row)
-                        {
-                            if (row != null)
-                            {
-                                chooseSingleExperiment(chooserField, row.getObjectOrNull());
-                            }
-                        }
-                    });
-
-        chooserField.setEditable(false);
-        if (experimentCriteriaOrNull != null && experimentCriteriaOrNull.tryGetExperiment() != null)
-        {
-            // we search in a single experiment
-            updateSingleExperimentChooser(chooserField, experimentCriteriaOrNull.tryGetExperiment());
-        } else
-        {
-            // we search in all experiments or single experiment has not been chosen
-            this.singleExperimentChooserStateOrNull = null;
-            chooserField.reset();
-        }
-        if (experimentCriteriaOrNull == null || experimentCriteriaOrNull.tryGetExperiment() != null)
-        {
-            chooserField.setEmptyText(CHOOSE_ONE_EXPERIMENT_TEXT);
-        } else
-        {
-            chooserField.setEmptyText(ALL_EXPERIMENTS_TEXT);
-        }
-        return experimentChooser;
-    }
-
-    private void chooseSingleExperiment(final ExperimentChooserField chooserField,
-            Experiment experiment)
-    {
-        SingleExperimentSearchCriteria singleExperiment =
-                new SingleExperimentSearchCriteria(experiment.getId(), experiment.getPermId(),
-                        experiment.getIdentifier());
-        updateSingleExperimentChooser(chooserField, singleExperiment);
-        this.experimentCriteriaOrNull =
-                ExperimentSearchCriteria.createExperiment(singleExperiment);
-        refresh();
-    }
-
-    private void updateSingleExperimentChooser(ExperimentChooserField chooserField,
-            SingleExperimentSearchCriteria singleExperiment)
-    {
-        this.singleExperimentChooserStateOrNull = singleExperiment;
-        chooserField.updateValue(new ExperimentIdentifier(singleExperiment
-                .getExperimentIdentifier()));
-    }
-
-    private boolean isAllExperimentsChoosen()
-    {
-        return experimentCriteriaOrNull != null
-                && experimentCriteriaOrNull.tryGetExperiment() == null;
-    }
-
-    private RadioGroup createExperimentRadio(
-            final ExperimentChooserFieldAdaptor singleExperimentChooser)
-    {
-        final RadioGroup experimentRadio = new RadioGroup();
-        experimentRadio.setSelectionRequired(true);
-        experimentRadio.setOrientation(Orientation.HORIZONTAL);
-
-        final Radio allExps = new Radio();
-        allExps.setBoxLabel(ALL_EXPERIMENTS_TEXT);
-        experimentRadio.add(allExps);
-
-        final Radio oneExps = new Radio();
-        oneExps.setBoxLabel(SINGLE_EXPERIMENT_TEXT);
-        experimentRadio.add(oneExps);
-
-        experimentRadio.setValue(isAllExperimentsChoosen() ? allExps : oneExps);
-        experimentRadio.setAutoHeight(true);
-        experimentRadio.addListener(Events.Change, new Listener<BaseEvent>()
-            {
-                public void handleEvent(BaseEvent be)
-                {
-                    if (allExps.getValue())
-                    {
-                        singleExperimentChooser.getChooserField().setEnabled(false);
-                        singleExperimentChooser.getChooserField()
-                                .setEmptyText(ALL_EXPERIMENTS_TEXT);
-                        experimentCriteriaOrNull = ExperimentSearchCriteria.createAllExperiments();
-                        refresh();
-                    } else
-                    {
-                        singleExperimentChooser.getChooserField().setEmptyText(
-                                CHOOSE_ONE_EXPERIMENT_TEXT);
-
-                        singleExperimentChooser.getChooserField().setEnabled(true);
-                        if (singleExperimentChooserStateOrNull == null)
-                        {
-                            experimentCriteriaOrNull = null;
-                        } else
-                        {
-                            experimentCriteriaOrNull =
-                                    ExperimentSearchCriteria
-                                            .createExperiment(singleExperimentChooserStateOrNull);
-                            refresh();
-                        }
-                    }
-                }
-            });
-        return experimentRadio;
+        return new SingleOrAllExperimentsChooser(viewContext, experimentCriteriaHolder,
+                createRefreshGridAction());
     }
 
     @Override
@@ -714,6 +578,8 @@ public class WellSearchGrid extends TypedTableGrid<WellContent>
             DefaultResultSetConfig<String, TableModelRowWithObject<WellContent>> resultSetConfig,
             final AsyncCallback<TypedTableResultSet<WellContent>> callback)
     {
+        ExperimentSearchCriteria experimentCriteriaOrNull =
+                experimentCriteriaHolder.tryGetCriteria();
         assert experimentCriteriaOrNull != null : "experiment not specified";
 
         WellSearchCriteria searchCriteria =
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/screening-dictionary.js b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/screening-dictionary.js
index cddd80974b6..02e4b0118b9 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/screening-dictionary.js
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/public/screening-dictionary.js
@@ -66,6 +66,7 @@ separator: "Separator",
 // Material Viewer
 //
 plate_locations: "Plate Locations",
+MATERIAL_MERGED_SUMMARY_SECTION_TITLE: "Summary",
 MATERIAL_REPLICA_SUMMARY_SECTION_TITLE: "{0} Summary",
 
 //
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java
index 9a35e3cc2f1..cf6607688c7 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/WellSearchCriteria.java
@@ -90,6 +90,27 @@ public class WellSearchCriteria implements ISerializable
         }
     }
 
+    public static final class ExperimentSearchCriteriaHolder
+    {
+        private ExperimentSearchCriteria criteriaOrNull;
+
+        public ExperimentSearchCriteriaHolder(ExperimentSearchCriteria criteriaOrNull)
+        {
+            this.criteriaOrNull = criteriaOrNull;
+        }
+
+        public ExperimentSearchCriteria tryGetCriteria()
+        {
+            return criteriaOrNull;
+        }
+
+        public void setCriteria(ExperimentSearchCriteria criteria)
+        {
+            this.criteriaOrNull = criteria;
+        }
+
+    }
+
     /** Points to one experiment, all experiments of a project or all accessible experiments. */
     public static final class ExperimentSearchCriteria implements IsSerializable, Serializable
     {
-- 
GitLab