diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/LogicalImageSeriesViewer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/LogicalImageSeriesViewer.java index 2ca9e031b6c8e050630985d4db2e71c8d5e93116..f2d55d2663c3a192acdea9e6738a32f94af26e39 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/LogicalImageSeriesViewer.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/LogicalImageSeriesViewer.java @@ -40,6 +40,169 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ImageChannelSt */ class LogicalImageSeriesViewer { + public static LayoutContainer create(String sessionId, + List<ImageChannelStack> channelStackImages, LogicalImageReference images, + String channel, int imageWidth, int imageHeight) + { + LogicalImageSeriesViewerModel model = new LogicalImageSeriesViewerModel(channelStackImages); + List<LayoutContainer> frames = + createTimepointFrames(model.getSortedChannelStackSeriesPoints(), images, channel, + sessionId, imageWidth, imageHeight); + + return createMoviePlayer(frames, model.getSortedPoints()); + } + + private static List<List<ImageChannelStack>> getSortedSeries( + Map<ImageSeriesPoint, List<ImageChannelStack>> channelStackImagesBySeries, + List<ImageSeriesPoint> sortedPoints) + { + List<List<ImageChannelStack>> sortedSeries = new ArrayList<List<ImageChannelStack>>(); + for (ImageSeriesPoint point : sortedPoints) + { + List<ImageChannelStack> series = channelStackImagesBySeries.get(point); + sortedSeries.add(series); + } + return sortedSeries; + } + + private static List<ImageSeriesPoint> sortPoints(Set<ImageSeriesPoint> points) + { + ArrayList<ImageSeriesPoint> pointsList = new ArrayList<ImageSeriesPoint>(points); + Collections.sort(pointsList); + return pointsList; + } + + private static LayoutContainer createMoviePlayer(final List<LayoutContainer> frames, + final List<ImageSeriesPoint> sortedPoints) + { + final LayoutContainer mainContainer = new LayoutContainer(); + addAll(mainContainer, frames); + + final Slider slider = createTimepointsSlider(frames.size(), new Listener<SliderEvent>() + { + public void handleEvent(SliderEvent e) + { + int oldValue = e.getOldValue(); + int newValue = e.getNewValue(); + if (oldValue > 0) + { + frames.get(oldValue - 1).hide(); + } + frames.get(newValue - 1).show(); + mainContainer.remove(mainContainer.getItem(0)); + mainContainer + .insert(new Label(createTimepointLabel(sortedPoints, newValue)), 0); + mainContainer.layout(); + } + }); + mainContainer.insert(slider, 0); + mainContainer.insert(new Label(createTimepointLabel(sortedPoints, 1)), 0); + slider.setValue(1); + + return mainContainer; + } + + /** + * @param sortedChannelStackSeriesPoints - one element on the list are all tiles for a fixed + * series point + */ + private static List<LayoutContainer> createTimepointFrames( + List<List<ImageChannelStack>> sortedChannelStackSeriesPoints, + LogicalImageReference images, String channel, String sessionId, int imageWidth, + int imageHeight) + { + final List<LayoutContainer> frames = new ArrayList<LayoutContainer>(); + int counter = 0; + for (List<ImageChannelStack> seriesPointStacks : sortedChannelStackSeriesPoints) + { + final LayoutContainer container = + createTilesGridForTimepoint(seriesPointStacks, images, channel, sessionId, + imageWidth, imageHeight); + frames.add(container); + if (counter > 0) + { + container.setVisible(false); + } + counter++; + } + return frames; + } + + private static void addAll(LayoutContainer container, List<LayoutContainer> frames) + { + for (LayoutContainer frame : frames) + { + container.add(frame); + } + } + + private static LayoutContainer createTilesGridForTimepoint( + List<ImageChannelStack> seriesPointStacks, LogicalImageReference images, + String channel, String sessionId, int imageWidth, int imageHeight) + { + final LayoutContainer container = + new LayoutContainer(new TableLayout(images.getTileColsNum())); + + ImageChannelStack[/* tileRow */][/* tileCol */] tilesMap = + createTilesMap(seriesPointStacks, images); + for (int row = 1; row <= images.getTileRowsNum(); row++) + { + for (int col = 1; col <= images.getTileColsNum(); col++) + { + ImageChannelStack stackRef = tilesMap[row - 1][col - 1]; + if (stackRef != null) + { + ImageUrlUtils.addImageUrlWidget(container, sessionId, images, channel, + stackRef, imageWidth, imageHeight); + } else + { + addDummyImage(container, imageWidth, imageHeight); + } + } + } + return container; + } + + private static ImageChannelStack[][] createTilesMap(List<ImageChannelStack> stackReferences, + LogicalImageReference images) + { + int rows = images.getTileRowsNum(); + int cols = images.getTileColsNum(); + ImageChannelStack[][] map = new ImageChannelStack[rows][cols]; + for (ImageChannelStack stackRef : stackReferences) + { + map[stackRef.getTileRow() - 1][stackRef.getTileCol() - 1] = stackRef; + } + return map; + } + + private static void addDummyImage(LayoutContainer container, int imageWidth, int imageHeight) + { + Label dummy = new Label(); + dummy.setWidth(imageWidth); + dummy.setHeight(imageHeight); + container.add(dummy); + } + + private static String createTimepointLabel(List<ImageSeriesPoint> sortedPoints, + int sequenceNumber) + { + ImageSeriesPoint point = sortedPoints.get(sequenceNumber - 1); + int numberOfSequences = sortedPoints.size(); + return point.getLabel() + " (" + sequenceNumber + "/" + numberOfSequences + ")"; + } + + private static final Slider createTimepointsSlider(int maxValue, Listener<SliderEvent> listener) + { + final Slider slider = new Slider(); + slider.setWidth(230); + slider.setIncrement(1); + slider.setMinValue(1); + slider.setMaxValue(maxValue); + slider.setClickToChange(true); + slider.addListener(Events.Change, listener); + return slider; + } static class ImageSeriesPoint implements Comparable<ImageSeriesPoint> { @@ -204,167 +367,4 @@ class LogicalImageSeriesViewer } } - public static LayoutContainer create(String sessionId, - List<ImageChannelStack> channelStackImages, LogicalImageReference images, - String channel, int imageWidth, int imageHeight) - { - LogicalImageSeriesViewerModel model = new LogicalImageSeriesViewerModel(channelStackImages); - List<LayoutContainer> frames = - createTimepointFrames(model.getSortedChannelStackSeriesPoints(), images, channel, - sessionId, imageWidth, imageHeight); - - return createMoviePlayer(frames, model.getSortedPoints()); - } - - private static List<List<ImageChannelStack>> getSortedSeries( - Map<ImageSeriesPoint, List<ImageChannelStack>> channelStackImagesBySeries, - List<ImageSeriesPoint> sortedPoints) - { - List<List<ImageChannelStack>> sortedSeries = new ArrayList<List<ImageChannelStack>>(); - for (ImageSeriesPoint point : sortedPoints) - { - List<ImageChannelStack> series = channelStackImagesBySeries.get(point); - sortedSeries.add(series); - } - return sortedSeries; - } - - private static List<ImageSeriesPoint> sortPoints(Set<ImageSeriesPoint> points) - { - ArrayList<ImageSeriesPoint> pointsList = new ArrayList<ImageSeriesPoint>(points); - Collections.sort(pointsList); - return pointsList; - } - - private static LayoutContainer createMoviePlayer(final List<LayoutContainer> frames, - final List<ImageSeriesPoint> sortedPoints) - { - final LayoutContainer mainContainer = new LayoutContainer(); - addAll(mainContainer, frames); - - final Slider slider = createTimepointsSlider(frames.size(), new Listener<SliderEvent>() - { - public void handleEvent(SliderEvent e) - { - int oldValue = e.getOldValue(); - int newValue = e.getNewValue(); - if (oldValue > 0) - { - frames.get(oldValue - 1).hide(); - } - frames.get(newValue - 1).show(); - mainContainer.remove(mainContainer.getItem(0)); - mainContainer - .insert(new Label(createTimepointLabel(sortedPoints, newValue)), 0); - mainContainer.layout(); - } - }); - mainContainer.insert(slider, 0); - mainContainer.insert(new Label(createTimepointLabel(sortedPoints, 1)), 0); - slider.setValue(1); - - return mainContainer; - } - - /** - * @param sortedChannelStackSeriesPoints - one element on the list are all tiles for a fixed - * series point - */ - private static List<LayoutContainer> createTimepointFrames( - List<List<ImageChannelStack>> sortedChannelStackSeriesPoints, - LogicalImageReference images, String channel, String sessionId, int imageWidth, - int imageHeight) - { - final List<LayoutContainer> frames = new ArrayList<LayoutContainer>(); - int counter = 0; - for (List<ImageChannelStack> seriesPointStacks : sortedChannelStackSeriesPoints) - { - final LayoutContainer container = - createTilesGridForTimepoint(seriesPointStacks, images, channel, sessionId, - imageWidth, imageHeight); - frames.add(container); - if (counter > 0) - { - container.setVisible(false); - } - counter++; - } - return frames; - } - - private static void addAll(LayoutContainer container, List<LayoutContainer> frames) - { - for (LayoutContainer frame : frames) - { - container.add(frame); - } - } - - private static LayoutContainer createTilesGridForTimepoint( - List<ImageChannelStack> seriesPointStacks, LogicalImageReference images, - String channel, String sessionId, int imageWidth, int imageHeight) - { - final LayoutContainer container = - new LayoutContainer(new TableLayout(images.getTileColsNum())); - - ImageChannelStack[/* tileRow */][/* tileCol */] tilesMap = - createTilesMap(seriesPointStacks, images); - for (int row = 1; row <= images.getTileRowsNum(); row++) - { - for (int col = 1; col <= images.getTileColsNum(); col++) - { - ImageChannelStack stackRef = tilesMap[row - 1][col - 1]; - if (stackRef != null) - { - ImageUrlUtils.addImageUrlWidget(container, sessionId, images, channel, - stackRef, imageWidth, imageHeight); - } else - { - addDummyImage(container, imageWidth, imageHeight); - } - } - } - return container; - } - - private static ImageChannelStack[][] createTilesMap(List<ImageChannelStack> stackReferences, - LogicalImageReference images) - { - int rows = images.getTileRowsNum(); - int cols = images.getTileColsNum(); - ImageChannelStack[][] map = new ImageChannelStack[rows][cols]; - for (ImageChannelStack stackRef : stackReferences) - { - map[stackRef.getTileRow() - 1][stackRef.getTileCol() - 1] = stackRef; - } - return map; - } - - private static void addDummyImage(LayoutContainer container, int imageWidth, int imageHeight) - { - Label dummy = new Label(); - dummy.setWidth(imageWidth); - dummy.setHeight(imageHeight); - container.add(dummy); - } - - private static String createTimepointLabel(List<ImageSeriesPoint> sortedPoints, - int sequenceNumber) - { - ImageSeriesPoint point = sortedPoints.get(sequenceNumber - 1); - int numberOfSequences = sortedPoints.size(); - return point.getLabel() + " (" + sequenceNumber + "/" + numberOfSequences + ")"; - } - - private static final Slider createTimepointsSlider(int maxValue, Listener<SliderEvent> listener) - { - final Slider slider = new Slider(); - slider.setWidth(230); - slider.setIncrement(1); - slider.setMinValue(1); - slider.setMaxValue(maxValue); - slider.setClickToChange(true); - slider.addListener(Events.Change, listener); - return slider; - } }