diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ChannelChooser.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ChannelChooser.java index 8abbd437ca99285904e9c9af50095fcb807d0930..687ca0fa1c8f82bea60215739fc13ff683952a69 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ChannelChooser.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ChannelChooser.java @@ -28,9 +28,12 @@ import java.util.Set; import com.extjs.gxt.ui.client.event.BaseEvent; import com.extjs.gxt.ui.client.event.Listener; +import com.extjs.gxt.ui.client.event.SelectionChangedEvent; +import com.extjs.gxt.ui.client.event.SelectionChangedListener; import com.extjs.gxt.ui.client.widget.LayoutContainer; import com.extjs.gxt.ui.client.widget.Text; import com.extjs.gxt.ui.client.widget.form.FieldSet; +import com.extjs.gxt.ui.client.widget.form.SimpleComboValue; import com.extjs.gxt.ui.client.widget.layout.FormLayout; import com.extjs.gxt.ui.client.widget.layout.MarginData; import com.extjs.gxt.ui.client.widget.layout.RowLayout; @@ -44,25 +47,25 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.Abstrac import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.CheckBoxGroupWithModel; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.CheckBoxGroupWithModel.CheckBoxGroupListner; import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.LabeledItem; +import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.SimpleModelComboBox; import ch.systemsx.cisd.openbis.generic.shared.basic.utils.GroupByMap; import ch.systemsx.cisd.openbis.generic.shared.basic.utils.IGroupKeyExtractor; 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.detailviewers.AnalysisProcedureChooser.IAnalysisProcedureSelectionListener; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.dto.ImageDatasetChannel; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.dto.LogicalImageChannelsReference; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.dto.LogicalImageReference; +import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.utils.EntityTypeLabelUtils; import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.utils.GuiUtils; -import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.AnalysisProcedures; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.DatasetImagesReference; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.DatasetOverlayImagesReference; +import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.DatasetReference; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ImageDatasetParameters; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ImageResolution; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.IntensityRange; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.InternalImageChannel; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.InternalImageTransformationInfo; import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConstants; -import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellSearchCriteria.AnalysisProcedureCriteria; /** * Handles displaying images in different channels and allows to choose the overlays. @@ -213,62 +216,106 @@ class ChannelChooser }).getMap(); } + public interface OverlayDataSetSelectionListener + { + public void overlayDataSetSelected(DatasetOverlayImagesReference reference); + } + + public Widget createAndConnectOverlayImageDatasetChooser(String labelText, + List<DatasetOverlayImagesReference> imageDatasets, + final OverlayDataSetSelectionListener listener, IViewContext<?> viewContext) + { + List<String> labels = + EntityTypeLabelUtils.createDatasetLabels(overlaysAsReferences(imageDatasets), true, true); + imageDatasets.add(0, null); + labels.add(0, "All"); + SimpleModelComboBox<DatasetOverlayImagesReference> datasetChooser = + ImagingDatasetGuiUtils.createDatasetChooserComboBox(viewContext, imageDatasets, labels, labels); + + datasetChooser + .addSelectionChangedListener(new SelectionChangedListener<SimpleComboValue<LabeledItem<DatasetOverlayImagesReference>>>() + { + @Override + public void selectionChanged( + SelectionChangedEvent<SimpleComboValue<LabeledItem<DatasetOverlayImagesReference>>> se) + { + DatasetOverlayImagesReference chosenDataset = + SimpleModelComboBox.getChosenItem(se); + listener.overlayDataSetSelected(chosenDataset); + } + }); + DatasetOverlayImagesReference chosenDataset = datasetChooser.tryGetChosenItem(); + listener.overlayDataSetSelected(chosenDataset); + + return ImagingDatasetGuiUtils.withLabel(datasetChooser, labelText); + } + + private static List<DatasetReference> overlaysAsReferences( + List<DatasetOverlayImagesReference> imageDatasets) + { + List<DatasetReference> refs = new ArrayList<DatasetReference>(); + for (DatasetOverlayImagesReference dataset : imageDatasets) + { + DatasetReference r = dataset.getDatasetReference(); + refs.add(r); + } + return refs; + } + private Widget createOverlayChannelsChooser( List<DatasetOverlayImagesReference> overlayDatasets, IViewContext<?> viewContext) { + LinkedList<DatasetOverlayImagesReference> sortedDataSets = new LinkedList<DatasetOverlayImagesReference>(overlayDatasets); + Collections.sort(sortedDataSets, new ProcedureDatasetSortingOrder()); + final Map<String, List<DatasetOverlayImagesReference>> datasetsByAnalysisProcMap = groupByAnalysisProcedure(overlayDatasets); - if (datasetsByAnalysisProcMap.size() > 1) + if (sortedDataSets.size() > 1) { - AnalysisProcedures analysisProcedures = - new AnalysisProcedures(datasetsByAnalysisProcMap.keySet()); - LayoutContainer chooserPanel = new LayoutContainer(); chooserPanel.setLayout(new RowLayout()); final LayoutContainer objectsChooserContainer = new LayoutContainer(); - IAnalysisProcedureSelectionListener selectionListener = + OverlayDataSetSelectionListener selectionListener = createAnalysisProcedureSelectionListener(datasetsByAnalysisProcMap, objectsChooserContainer); - AnalysisProcedureChooser analysisProcedureChooser = - AnalysisProcedureChooser.create(viewContext, analysisProcedures, - AnalysisProcedureCriteria.createAllProcedures(), selectionListener); - chooserPanel.add(analysisProcedureChooser); + + Widget overlaysChooser = createAndConnectOverlayImageDatasetChooser(OVERLAYS_MSG, sortedDataSets, selectionListener, viewContext); + chooserPanel.add(overlaysChooser); chooserPanel.add(objectsChooserContainer); + return chooserPanel; } else { final LayoutContainer objectsChooserContainer = new LayoutContainer(); - addOverlayChannelsChoosers(overlayDatasets, objectsChooserContainer); + addOverlayChannelsChoosers(sortedDataSets, objectsChooserContainer); return objectsChooserContainer; } } - private IAnalysisProcedureSelectionListener createAnalysisProcedureSelectionListener( + private OverlayDataSetSelectionListener createAnalysisProcedureSelectionListener( final Map<String, List<DatasetOverlayImagesReference>> datasetsByAnalysisProcMap, final LayoutContainer objectsChooserContainer) { - return new IAnalysisProcedureSelectionListener() + return new OverlayDataSetSelectionListener() { @Override - public void analysisProcedureSelected(AnalysisProcedureCriteria criteria) + public void overlayDataSetSelected(DatasetOverlayImagesReference reference) { - refreshObjectChooser(criteria, datasetsByAnalysisProcMap, - objectsChooserContainer); + refreshObjectChooser(reference, datasetsByAnalysisProcMap, objectsChooserContainer); } }; } - private void refreshObjectChooser(AnalysisProcedureCriteria criteria, + private void refreshObjectChooser(DatasetOverlayImagesReference image, final Map<String, List<DatasetOverlayImagesReference>> datasetsByAnalysisProcMap, final LayoutContainer objectsChooserContainer) { - List<DatasetOverlayImagesReference> overlayDatasetsForOneAnalysisProc; + List<DatasetOverlayImagesReference> overlayDatasetsForOneAnalysisProc = new LinkedList<DatasetOverlayImagesReference>(); - if (criteria.isAllProcedures()) + if (image == null) { - overlayDatasetsForOneAnalysisProc = new LinkedList<DatasetOverlayImagesReference>(); for (String ap : datasetsByAnalysisProcMap.keySet()) { overlayDatasetsForOneAnalysisProc.addAll(datasetsByAnalysisProcMap.get(ap)); @@ -276,13 +323,11 @@ class ChannelChooser } else { - String analysisProcedureCode = criteria.tryGetAnalysisProcedureCode(); - overlayDatasetsForOneAnalysisProc = datasetsByAnalysisProcMap.get(analysisProcedureCode); + overlayDatasetsForOneAnalysisProc.add(image); } objectsChooserContainer.removeAll(); - if (overlayDatasetsForOneAnalysisProc != null - && overlayDatasetsForOneAnalysisProc.size() > 0) + if (overlayDatasetsForOneAnalysisProc.size() > 0) { addOverlayChannelsChoosers(overlayDatasetsForOneAnalysisProc, objectsChooserContainer); } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingDatasetGuiUtils.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingDatasetGuiUtils.java index f3c37f06c13c5c1bd278cd2c4b12bbb0bdf38eaf..bf5e98dfe521f5f7fbccda269b125aa6e8cdb0c4 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingDatasetGuiUtils.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImagingDatasetGuiUtils.java @@ -518,7 +518,7 @@ class ImagingDatasetGuiUtils return refs; } - private static <T> SimpleModelComboBox<T> createDatasetChooserComboBox( + static <T> SimpleModelComboBox<T> createDatasetChooserComboBox( IMessageProvider messageProvider, List<T> items, List<String> labels, List<String> tooltips) { diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtils.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtils.java index 2f57d5e4f31a597dce058f3e35dc8359b269b723..623e005fcaa9e9a7ba4a89d51047a5092f4b8d2c 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtils.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtils.java @@ -34,13 +34,20 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConst */ public class EntityTypeLabelUtils { - public final static List<String> createDatasetLabels(List<DatasetReference> datasetReferences, + + public final static List<String> createDatasetLabels(List<? extends DatasetReference> datasetReferences, boolean withFileType) + { + return createDatasetLabels(datasetReferences, withFileType, false); + } + + public final static List<String> createDatasetLabels(List<? extends DatasetReference> datasetReferences, + boolean withFileType, boolean useAnalysisProcedureInPlaceOfType) { List<String> labels = new ArrayList<String>(datasetReferences.size()); for (DatasetReference datasetReference : datasetReferences) { - labels.add(createDatasetLabel(datasetReference, withFileType, null, true)); + labels.add(createDatasetLabel(datasetReference, withFileType, null, true, useAnalysisProcedureInPlaceOfType)); } return labels; } @@ -96,17 +103,34 @@ public class EntityTypeLabelUtils */ public static String createDatasetLabel(DatasetReference datasetReference, boolean withFileType, String analysisProcedure, boolean withDatasetCode) + { + return createDatasetLabel(datasetReference, withFileType, analysisProcedure, withDatasetCode, false); + } + + public static String createDatasetLabel(DatasetReference datasetReference, + boolean withFileType, String analysisProcedure, boolean withDatasetCode, boolean useAnalysisProcedureInteadOfDataSetType) { String registrationDate = renderDate(datasetReference); return createDatasetLabel(datasetReference, withFileType, registrationDate, - analysisProcedure, withDatasetCode); + analysisProcedure, withDatasetCode, useAnalysisProcedureInteadOfDataSetType); } // private, just for tests static String createDatasetLabel(DatasetReference datasetReference, boolean withFileType, - String registrationDate, String analysisProcedure, boolean withDatasetCode) + String registrationDate, String analysisProcedure, boolean withDatasetCode, boolean useAnalysisProcedureInteadOfDataSetType) { - String typeLabel = getDatasetUserFriendlyTypeCode(datasetReference); + String typeLabel; + if (useAnalysisProcedureInteadOfDataSetType) + { + typeLabel = datasetReference.getAnalysisProcedure(); + if (typeLabel == null) + { + typeLabel = "Unspecified Analysis Procedure"; + } + } else + { + typeLabel = getDatasetUserFriendlyTypeCode(datasetReference); + } String fileType = withFileType && datasetReference.getFileTypeCode() != null ? " (" + datasetReference.getFileTypeCode() + ")" : ""; @@ -177,8 +201,8 @@ public class EntityTypeLabelUtils } /** - * Changes capitalization and replaces '_' wit ' '. Letters are made small, first letter gets - * capitalized if captalizeFirstLetter is true, e.g. 'COdE_XYZ' is changed to 'Code Xyz'. + * Changes capitalization and replaces '_' wit ' '. Letters are made small, first letter gets capitalized if captalizeFirstLetter is true, e.g. + * 'COdE_XYZ' is changed to 'Code Xyz'. */ public static String formatAsTitle(String text, boolean captalizeFirstLetter) { diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtilsTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtilsTest.java index 089bd35906846684030dca49f43c82ae9856b110..6048abdf808ae42e1a9a4ec289c84ff3ff0e5020 100644 --- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtilsTest.java +++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/utils/EntityTypeLabelUtilsTest.java @@ -49,7 +49,7 @@ public class EntityTypeLabelUtilsTest extends AssertJUnit DatasetReference ref = new DatasetReference(0, "123412342314-1234", typeCode, null, "DAT", null, null, null, null, null, labelTest); - return EntityTypeLabelUtils.createDatasetLabel(ref, false, "2011-05-30", null, true); + return EntityTypeLabelUtils.createDatasetLabel(ref, false, "2011-05-30", null, true, false); } private String createLabel(String typeCode, boolean withFileType) @@ -57,6 +57,6 @@ public class EntityTypeLabelUtilsTest extends AssertJUnit DatasetReference ref = new DatasetReference(0, "123412342314-1234", typeCode, null, "DAT", null, null, null, null, null, null); - return EntityTypeLabelUtils.createDatasetLabel(ref, withFileType, "2011-05-30", null, true); + return EntityTypeLabelUtils.createDatasetLabel(ref, withFileType, "2011-05-30", null, true, false); } } \ No newline at end of file