From 06b9232b9226285e7b68964f1f2f7efe9881cc4e Mon Sep 17 00:00:00 2001 From: Thomas <thomas.musset@pasteur.fr> Date: Mon, 1 Jul 2024 11:49:42 +0200 Subject: [PATCH] updated pom to v3.0.0-a.1, fix classes accordingly to new architecture, added icon, updated .gitignore --- .gitignore | 42 +++++++- pom.xml | 13 +-- .../adufour/viewers/ChannelMontage.java | 95 +++++++++--------- src/main/resources/Channel_Montage.png | Bin 0 -> 15247 bytes 4 files changed, 95 insertions(+), 55 deletions(-) create mode 100644 src/main/resources/Channel_Montage.png diff --git a/.gitignore b/.gitignore index 8d47cac..57f16fb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,41 @@ -.idea/ +/build* +/workspace +setting.xml +release/ target/ -.settings/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +icy.log + +### IntelliJ IDEA ### +.idea/ +*.iws *.iml -.project +*.ipr + +### Eclipse ### +.apt_generated .classpath -**/.DS_Store \ No newline at end of file +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +**/.DS_Store +Icon? \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8e1e791..4753928 100644 --- a/pom.xml +++ b/pom.xml @@ -8,14 +8,12 @@ <parent> <groupId>org.bioimageanalysis.icy</groupId> <artifactId>pom-icy</artifactId> - <version>2.2.0</version> + <version>3.0.0-a.1</version> </parent> <!-- Project Information --> <artifactId>channel-montage</artifactId> - <version>3.0.0</version> - - <packaging>jar</packaging> + <version>3.0.0-a.1</version> <name>Channel Montage</name> <description> @@ -58,6 +56,10 @@ <!-- List of project's dependencies --> <dependencies> + <dependency> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>ezplug</artifactId> + </dependency> <dependency> <groupId>org.bioimageanalysis.icy</groupId> <artifactId>blockvars</artifactId> @@ -68,8 +70,7 @@ <repositories> <repository> <id>icy</id> - <name>Icy's Nexus</name> - <url>https://icy-nexus.pasteur.fr/repository/Icy/</url> + <url>https://nexus-icy.pasteur.cloud/repository/icy/</url> </repository> </repositories> </project> \ No newline at end of file diff --git a/src/main/java/plugins/adufour/viewers/ChannelMontage.java b/src/main/java/plugins/adufour/viewers/ChannelMontage.java index 2d7e08d..d5cd9c7 100644 --- a/src/main/java/plugins/adufour/viewers/ChannelMontage.java +++ b/src/main/java/plugins/adufour/viewers/ChannelMontage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2023. Institut Pasteur. + * Copyright (c) 2010-2024. Institut Pasteur. * * This file is part of Icy. * Icy is free software: you can redistribute it and/or modify @@ -18,29 +18,31 @@ package plugins.adufour.viewers; -import icy.canvas.IcyCanvas; -import icy.canvas.IcyCanvas2D; -import icy.canvas.Layer; -import icy.gui.component.button.IcyButton; -import icy.gui.viewer.Viewer; -import icy.image.IcyBufferedImage; -import icy.image.IcyBufferedImageUtil; -import icy.image.colormap.IcyColorMap; -import icy.image.colormap.LinearColorMap; -import icy.image.lut.LUT; -import icy.image.lut.LUT.LUTChannel; -import icy.plugin.abstract_.Plugin; -import icy.plugin.interface_.PluginCanvas; -import icy.preferences.CanvasPreferences; -import icy.resource.ResourceUtil; -import icy.resource.icon.IcyIcon; -import icy.roi.ROI; -import icy.sequence.DimensionId; -import icy.sequence.SequenceEvent.SequenceEventType; -import icy.system.IcyExceptionHandler; -import icy.system.thread.SingleProcessor; -import icy.type.point.Point5D; -import icy.util.GraphicsUtil; +import org.bioimageanalysis.icy.common.geom.point.Point5D; +import org.bioimageanalysis.icy.extension.plugin.abstract_.Plugin; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.bioimageanalysis.icy.extension.plugin.interface_.PluginCanvas; +import org.bioimageanalysis.icy.gui.GraphicsUtil; +import org.bioimageanalysis.icy.gui.canvas.IcyCanvas2D; +import org.bioimageanalysis.icy.gui.canvas.Layer; +import org.bioimageanalysis.icy.gui.component.button.IcyButton; +import org.bioimageanalysis.icy.gui.component.icon.IcySVGIcon; +import org.bioimageanalysis.icy.gui.component.icon.SVGIcon; +import org.bioimageanalysis.icy.gui.viewer.Viewer; +import org.bioimageanalysis.icy.model.colormap.IcyColorMap; +import org.bioimageanalysis.icy.model.colormap.LinearColorMap; +import org.bioimageanalysis.icy.model.image.IcyBufferedImage; +import org.bioimageanalysis.icy.model.image.IcyBufferedImageUtil; +import org.bioimageanalysis.icy.model.lut.LUT; +import org.bioimageanalysis.icy.model.roi.ROI; +import org.bioimageanalysis.icy.model.sequence.DimensionId; +import org.bioimageanalysis.icy.model.sequence.SequenceEvent; +import org.bioimageanalysis.icy.system.logging.IcyLogger; +import org.bioimageanalysis.icy.system.preferences.CanvasPreferences; +import org.bioimageanalysis.icy.system.thread.SingleProcessor; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; import plugins.adufour.vars.gui.model.IntegerRangeModel; import plugins.adufour.vars.gui.swing.SwingVarEditor; import plugins.adufour.vars.lang.Var; @@ -61,18 +63,20 @@ import java.util.List; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -public class ChannelMontage extends Plugin implements PluginCanvas { +@IcyPluginName("Channel Montage") +@IcyPluginIcon(path = "/Channel_Montage.png") +public class ChannelMontage extends Plugin implements PluginCanvas<ChannelMontage.ChannelMontageCanvas> { @Override public String getCanvasClassName() { return ChannelMontage.class.getName(); } @Override - public IcyCanvas createCanvas(final Viewer viewer) { + public ChannelMontageCanvas createCanvas(final Viewer viewer) { return new ChannelMontageCanvas(viewer); } - public class ChannelMontageCanvas extends IcyCanvas2D implements MouseWheelListener { + public static class ChannelMontageCanvas extends IcyCanvas2D implements MouseWheelListener { final ScrollableFlowLayout layout = new ScrollableFlowLayout(ScrollableFlowLayout.Orientation.VERTICAL, FlowLayout.CENTER, 5, 5); final JPanel mainPanel = new JPanel(layout); @@ -163,13 +167,13 @@ public class ChannelMontage extends Plugin implements PluginCanvas { } @Override - public void customizeToolbar(final JToolBar toolbar) { - final IcyIcon rgbIcon = new IcyIcon(ResourceUtil.ICON_RGB_COLOR, false); - final IcyIcon grayIcon = new IcyIcon(ResourceUtil.ICON_GRAY_COLOR, false); + public void customizeToolbar(final @NotNull JToolBar toolbar) { + final IcySVGIcon rgbIcon = new IcySVGIcon(SVGIcon.RGB_IMAGE); + final IcySVGIcon grayIcon = new IcySVGIcon(SVGIcon.GRAYSCALE_IMAGE); toolbar.addSeparator(); - final IcyButton color = new IcyButton(grayIcon); + final IcyButton color = new IcyButton(SVGIcon.GRAYSCALE_IMAGE); color.setToolTipText("Switch to grayscale mode"); color.setFocusable(false); color.addActionListener(e -> { @@ -188,7 +192,6 @@ public class ChannelMontage extends Plugin implements PluginCanvas { imageSize.setDefaultEditorModel(new IntegerRangeModel(250, 20, 2048, 1)); imageSize.addListener(new VarListener<>() { - @Override public void valueChanged(final Var<Integer> source, final Integer oldValue, final Integer newValue) { resizeViews(); @@ -206,7 +209,6 @@ public class ChannelMontage extends Plugin implements PluginCanvas { margin.setDefaultEditorModel(new IntegerRangeModel(5, 0, 100, 1)); margin.addListener(new VarListener<>() { - @Override public void valueChanged(final Var<Integer> source, final Integer oldValue, final Integer newValue) { layout.setHgap(newValue); @@ -311,7 +313,7 @@ public class ChannelMontage extends Plugin implements PluginCanvas { } final ChannelView currentView = channelViews.get(channel); - final ChannelView globalView = channelViews.get(channelViews.size() - 1); + final ChannelView globalView = channelViews.getLast(); currentView.imageCache.updateLUT(); currentView.imageChanged(); @@ -338,7 +340,7 @@ public class ChannelMontage extends Plugin implements PluginCanvas { } @Override - protected void sequenceROIChanged(final ROI roi, final SequenceEventType type) { + protected void sequenceROIChanged(final ROI roi, final SequenceEvent.SequenceEventType type) { super.sequenceROIChanged(roi, type); repaint(); } @@ -405,6 +407,8 @@ public class ChannelMontage extends Plugin implements PluginCanvas { processor.submit(this); } + @SuppressWarnings("UnstableApiUsage") + @Contract(mutates = "this") private void invalidCache() { needRebuild = true; } @@ -419,7 +423,7 @@ public class ChannelMontage extends Plugin implements PluginCanvas { if (channel != -1) { for (int c = 0; c < getCurrentImage().getSizeC(); c++) { - final LUTChannel lutC = lut.getLutChannel(c); + final LUT.LUTChannel lutC = lut.getLutChannel(c); lutC.setEnabled(c == channel); if (grayscale.getValue()) lutC.setColorMap(grayMap, false); } @@ -447,7 +451,7 @@ public class ChannelMontage extends Plugin implements PluginCanvas { result.get(); } catch (final Exception e) { - e.printStackTrace(); + IcyLogger.error(ChannelMontage.class, e, e.getLocalizedMessage()); } } @@ -472,7 +476,7 @@ public class ChannelMontage extends Plugin implements PluginCanvas { imageCache = IcyBufferedImageUtil.toBufferedImage(img, imageCache, lut); } catch (final InterruptedException e) { - IcyExceptionHandler.showErrorMessage(e, false); + // ignore } } else imageCache = null; @@ -538,7 +542,7 @@ public class ChannelMontage extends Plugin implements PluginCanvas { } @Override - public void mouseMoved(final MouseEvent e) { + public void mouseMoved(final @NotNull MouseEvent e) { final Point2D p2 = canvasToImage(e.getPoint()); mousePosition.setX(p2.getX()); mousePosition.setY(p2.getY()); @@ -552,7 +556,7 @@ public class ChannelMontage extends Plugin implements PluginCanvas { } @Override - public void mouseDragged(final MouseEvent e) { + public void mouseDragged(final @NotNull MouseEvent e) { final Point2D p2 = canvasToImage(e.getPoint()); mousePosition.setX(p2.getX()); mousePosition.setY(p2.getY()); @@ -564,7 +568,7 @@ public class ChannelMontage extends Plugin implements PluginCanvas { } @Override - public void mouseWheelMoved(final MouseWheelEvent e) { + public void mouseWheelMoved(final @NotNull MouseWheelEvent e) { // sizeSlider.setValue(sizeSlider.getValue() + e.getWheelRotation()); imageSize.setValue(imageSize.getValue() + e.getWheelRotation()); } @@ -742,7 +746,6 @@ public class ChannelMontage extends Plugin implements PluginCanvas { public boolean isCacheValid() { return imageCache.isValid(); } - } @Override @@ -790,7 +793,7 @@ public class ChannelMontage extends Plugin implements PluginCanvas { } @Override - public void mouseWheelMoved(final MouseWheelEvent e) { + public void mouseWheelMoved(final @NotNull MouseWheelEvent e) { // sizeSlider.setValue(sizeSlider.getValue() + e.getWheelRotation()); imageSize.setValue(imageSize.getValue() + e.getWheelRotation()); } @@ -840,7 +843,8 @@ public class ChannelMontage extends Plugin implements PluginCanvas { return super.preferredLayoutSize(target); } - private static Dimension computeMinSize(final Container target) { + @Contract("_ -> new") + private static @NotNull Dimension computeMinSize(final @NotNull Container target) { synchronized (target.getTreeLock()) { int minx = Integer.MAX_VALUE; //int miny = Integer.MIN_VALUE; @@ -864,7 +868,8 @@ public class ChannelMontage extends Plugin implements PluginCanvas { } } - private Dimension computeSize(final Container target) { + @Contract("_ -> new") + private @NotNull Dimension computeSize(final @NotNull Container target) { synchronized (target.getTreeLock()) { final int hgap = getHgap(); final int vgap = getVgap(); diff --git a/src/main/resources/Channel_Montage.png b/src/main/resources/Channel_Montage.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1dee0f172b3099e13231b08a77c5f145f7c30a GIT binary patch literal 15247 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 KDqSmS68t}}QVGid literal 0 HcmV?d00001 -- GitLab