From 4b5f53368086934516596997526b08e541ea1f64 Mon Sep 17 00:00:00 2001 From: Thomas <thomas.musset@pasteur.fr> Date: Fri, 5 Jul 2024 14:39:52 +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 | 7 ++- .../MicroscopeRemotePlugin.java | 10 +++-- .../Microscopy/gui/InverterCheckBox.java | 2 +- .../Microscopy/gui/MemoryButton.java | 11 +++-- .../Microscopy/gui/PanelMoverXY.java | 15 ++++--- .../tprovoost/Microscopy/gui/PanelMoverZ.java | 13 +++--- .../tprovoost/Microscopy/gui/RemoteFrame.java | 27 ++++++----- src/main/resources/micro-remote.png | Bin 0 -> 14770 bytes 9 files changed, 84 insertions(+), 43 deletions(-) create mode 100644 src/main/resources/micro-remote.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 66e632e..c51c2ad 100644 --- a/pom.xml +++ b/pom.xml @@ -8,12 +8,12 @@ <parent> <artifactId>pom-icy</artifactId> <groupId>org.bioimageanalysis.icy</groupId> - <version>2.2.0</version> + <version>3.0.0-a.1</version> </parent> <!-- Project Information --> <artifactId>microscope-remote</artifactId> - <version>3.0.0</version> + <version>3.0.0-a.1</version> <name>Microscope Remote</name> <description>Move your XY Stage and Focus Device with your mouse.</description> @@ -63,8 +63,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/tprovoost/Microscopy/MicroscopeRemote/MicroscopeRemotePlugin.java b/src/main/java/plugins/tprovoost/Microscopy/MicroscopeRemote/MicroscopeRemotePlugin.java index d49896a..8269d84 100644 --- a/src/main/java/plugins/tprovoost/Microscopy/MicroscopeRemote/MicroscopeRemotePlugin.java +++ b/src/main/java/plugins/tprovoost/Microscopy/MicroscopeRemote/MicroscopeRemotePlugin.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,14 +18,18 @@ package plugins.tprovoost.Microscopy.MicroscopeRemote; -import icy.gui.frame.IcyFrameAdapter; -import icy.gui.frame.IcyFrameEvent; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginIcon; +import org.bioimageanalysis.icy.extension.plugin.annotation_.IcyPluginName; +import org.bioimageanalysis.icy.gui.frame.IcyFrameAdapter; +import org.bioimageanalysis.icy.gui.frame.IcyFrameEvent; import plugins.tprovoost.Microscopy.MicroManagerForIcy.MicroscopePlugin; import plugins.tprovoost.Microscopy.gui.RemoteFrame; /** * @author Irsath Nguyen */ +@IcyPluginName("Microscope Remote") +@IcyPluginIcon(path = "/micro-remote.png") public class MicroscopeRemotePlugin extends MicroscopePlugin { // static instance static RemoteFrame instance = null; diff --git a/src/main/java/plugins/tprovoost/Microscopy/gui/InverterCheckBox.java b/src/main/java/plugins/tprovoost/Microscopy/gui/InverterCheckBox.java index 2f16258..b64c4fb 100644 --- a/src/main/java/plugins/tprovoost/Microscopy/gui/InverterCheckBox.java +++ b/src/main/java/plugins/tprovoost/Microscopy/gui/InverterCheckBox.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 diff --git a/src/main/java/plugins/tprovoost/Microscopy/gui/MemoryButton.java b/src/main/java/plugins/tprovoost/Microscopy/gui/MemoryButton.java index 4cf2a33..13dee07 100644 --- a/src/main/java/plugins/tprovoost/Microscopy/gui/MemoryButton.java +++ b/src/main/java/plugins/tprovoost/Microscopy/gui/MemoryButton.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,9 +18,8 @@ package plugins.tprovoost.Microscopy.gui; -import icy.gui.frame.progress.AnnounceFrame; -import icy.gui.frame.progress.FailedAnnounceFrame; -import icy.type.point.Point3D; +import org.bioimageanalysis.icy.common.geom.point.Point3D; +import org.bioimageanalysis.icy.system.logging.IcyLogger; import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover; import javax.swing.*; @@ -103,7 +102,7 @@ public class MemoryButton extends JButton implements MouseListener { gotoPoint(); } catch (final Exception e1) { - new AnnounceFrame("Error while going to the saved point."); + IcyLogger.error(this.getClass(), e1, "Error while going to the saved point."); } } else { @@ -112,7 +111,7 @@ public class MemoryButton extends JButton implements MouseListener { rememberPoint(); } catch (final Exception e1) { - new FailedAnnounceFrame("Failed to save position, please try again", 3); + IcyLogger.error(this.getClass(), e1, "Failed to save position, please try again."); } } } diff --git a/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverXY.java b/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverXY.java index ce128cc..7969156 100644 --- a/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverXY.java +++ b/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverXY.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,6 +18,8 @@ package plugins.tprovoost.Microscopy.gui; +import org.bioimageanalysis.icy.system.logging.IcyLogger; +import org.jetbrains.annotations.NotNull; import plugins.tprovoost.Microscopy.MicroManager.MicroManager; import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover; @@ -45,7 +47,7 @@ public class PanelMoverXY extends JPanel implements MouseListener, MouseMotionLi private final RemoteFrame frame; private final Thread moveThread; - public PanelMoverXY(final RemoteFrame frame) { + public PanelMoverXY(final @NotNull RemoteFrame frame) { super(); this.frame = frame; @@ -154,14 +156,14 @@ public class PanelMoverXY extends JPanel implements MouseListener, MouseMotionLi StageMover.moveXYRelative(movementX, movementY, true); } - private double norm(final Point2D vector) { + private double norm(final @NotNull Point2D vector) { final double x = vector.getX(); final double y = vector.getY(); return Math.sqrt(x * x + y * y); } @Override - public void mouseDragged(final MouseEvent e) { + public void mouseDragged(final @NotNull MouseEvent e) { int x = e.getX(); int y = e.getY(); final int width = getWidth(); @@ -181,7 +183,7 @@ public class PanelMoverXY extends JPanel implements MouseListener, MouseMotionLi } @Override - public void mousePressed(final MouseEvent e) { + public void mousePressed(final @NotNull MouseEvent e) { vector.setLocation(e.getX() - (getWidth() / 2d), e.getY() - (getHeight() / 2d)); repaint(); } @@ -208,6 +210,7 @@ public class PanelMoverXY extends JPanel implements MouseListener, MouseMotionLi public void mouseExited(final MouseEvent e) { } + @SuppressWarnings("BusyWait") @Override public void run() { while (!moveThread.isInterrupted()) { @@ -219,7 +222,7 @@ public class PanelMoverXY extends JPanel implements MouseListener, MouseMotionLi moveThread.interrupt(); } catch (final Exception e) { - System.err.println(e.getMessage()); + IcyLogger.error(this.getClass(), e); } } } diff --git a/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverZ.java b/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverZ.java index 6aa7088..e082b4b 100644 --- a/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverZ.java +++ b/src/main/java/plugins/tprovoost/Microscopy/gui/PanelMoverZ.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,6 +18,8 @@ package plugins.tprovoost.Microscopy.gui; +import org.bioimageanalysis.icy.system.logging.IcyLogger; +import org.jetbrains.annotations.NotNull; import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover; import javax.swing.*; @@ -50,7 +52,7 @@ public class PanelMoverZ extends JPanel implements MouseListener, MouseMotionLis private final Thread moveThread; private double offZ = 0d; - public PanelMoverZ(final RemoteFrame frame) { + public PanelMoverZ(final @NotNull RemoteFrame frame) { super(); this.frame = frame; @@ -100,7 +102,7 @@ public class PanelMoverZ extends JPanel implements MouseListener, MouseMotionLis } @Override - public void mouseDragged(final MouseEvent e) { + public void mouseDragged(final @NotNull MouseEvent e) { final int movY = e.getY() - oldY; if (movY == 0) return; @@ -143,7 +145,7 @@ public class PanelMoverZ extends JPanel implements MouseListener, MouseMotionLis } @Override - public void mousePressed(final MouseEvent e) { + public void mousePressed(final @NotNull MouseEvent e) { oldY = e.getY(); setCursor(new Cursor(Cursor.S_RESIZE_CURSOR)); repaint(); @@ -155,6 +157,7 @@ public class PanelMoverZ extends JPanel implements MouseListener, MouseMotionLis repaint(); } + @SuppressWarnings("BusyWait") @Override public void run() { while (!moveThread.isInterrupted()) { @@ -174,7 +177,7 @@ public class PanelMoverZ extends JPanel implements MouseListener, MouseMotionLis moveThread.interrupt(); } catch (final Exception e) { - System.err.println(e.getMessage()); + IcyLogger.error(this.getClass(), e); } } } diff --git a/src/main/java/plugins/tprovoost/Microscopy/gui/RemoteFrame.java b/src/main/java/plugins/tprovoost/Microscopy/gui/RemoteFrame.java index 0decec3..28214dd 100644 --- a/src/main/java/plugins/tprovoost/Microscopy/gui/RemoteFrame.java +++ b/src/main/java/plugins/tprovoost/Microscopy/gui/RemoteFrame.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,13 +18,14 @@ package plugins.tprovoost.Microscopy.gui; -import icy.gui.frame.IcyFrame; -import icy.gui.util.GuiUtil; -import icy.image.ImageUtil; -import icy.network.NetworkUtil; -import icy.resource.icon.IcyIcon; -import icy.type.point.Point3D; -import icy.util.StringUtil; +import org.bioimageanalysis.icy.common.geom.point.Point3D; +import org.bioimageanalysis.icy.common.string.StringUtil; +import org.bioimageanalysis.icy.gui.GuiUtil; +import org.bioimageanalysis.icy.gui.LookAndFeelUtil; +import org.bioimageanalysis.icy.gui.frame.IcyFrame; +import org.bioimageanalysis.icy.model.image.ImageUtil; +import org.bioimageanalysis.icy.network.NetworkUtil; +import org.jetbrains.annotations.NotNull; import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover; import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover.StageListener; import plugins.tprovoost.Microscopy.MicroManagerForIcy.MicroscopePlugin; @@ -84,7 +85,7 @@ public class RemoteFrame extends IcyFrame implements StageListener { private static final String REMOTE = "prefs_remote"; private static final String SPEED = "speed"; - public RemoteFrame(final MicroscopeRemotePlugin plugin) { + public RemoteFrame(final @NotNull MicroscopeRemotePlugin plugin) { super("Remote", false, true, false, true); this.plugin = plugin; @@ -130,7 +131,6 @@ public class RemoteFrame extends IcyFrame implements StageListener { panel_speed.setOpaque(false); _sliderSpeed = new JSlider(1, 10, 1) { - private static final long serialVersionUID = 1L; private final BufferedImage toDraw; final int heightKnob; @@ -188,9 +188,8 @@ public class RemoteFrame extends IcyFrame implements StageListener { final MemoryButton btnM3 = new MemoryButton("M3", imgMemBtnOn, imgMemBtnOff); final MemoryButton btnM4 = new MemoryButton("M4", imgMemBtnOn, imgMemBtnOff); - final JButton btnHelp = new JButton(new IcyIcon(imgMemBtnOff)) { - private static final long serialVersionUID = 1L; - + final int iconSize = LookAndFeelUtil.getDefaultIconSize(); + final JButton btnHelp = new JButton(new ImageIcon(imgMemBtnOff.getScaledInstance(iconSize, iconSize, Image.SCALE_SMOOTH))) { @Override public void paint(final Graphics g) { final int w = getWidth(); @@ -245,7 +244,7 @@ public class RemoteFrame extends IcyFrame implements StageListener { final JPanel panelAll = new JPanel() { @Override - protected void paintComponent(final Graphics g) { + protected void paintComponent(final @NotNull Graphics g) { checkInverts(); g.drawImage(imgRemoteBg, 0, 0, getWidth(), getHeight(), null); } diff --git a/src/main/resources/micro-remote.png b/src/main/resources/micro-remote.png new file mode 100644 index 0000000000000000000000000000000000000000..733d83a9526fa9eeda04f6a6bba56f9d76bd5a7f GIT binary patch literal 14770 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 M07*qoM6N<$g0NJV7ytkO literal 0 HcmV?d00001 -- GitLab