diff --git a/pom.xml b/pom.xml index a6381e55ff482bb8601c583b4bb74f3b14fe23e0..8e2972eea66a2f775e690a63c105690c8c32a540 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ </parent> <artifactId>icy-micromanager</artifactId> - <version>1.8.0</version> + <version>1.9.0</version> <packaging>jar</packaging> diff --git a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/MicroManager.java b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/MicroManager.java index 2a6a8fa70c8f0d1aa68416c4fd875980b8447238..2519367e317c9688078a36e1ff0942a104440d20 100644 --- a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/MicroManager.java +++ b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/MicroManager.java @@ -39,6 +39,7 @@ import mmcorej.TaggedImage; import plugins.tprovoost.Microscopy.MicroManager.core.AcquisitionResult; import plugins.tprovoost.Microscopy.MicroManager.event.AcquisitionListener; import plugins.tprovoost.Microscopy.MicroManager.event.LiveListener; +import plugins.tprovoost.Microscopy.MicroManager.gui.LiveSettingsPanel; import plugins.tprovoost.Microscopy.MicroManager.gui.LoadFrame; import plugins.tprovoost.Microscopy.MicroManager.gui.LoadingFrame; import plugins.tprovoost.Microscopy.MicroManager.gui.MMMainFrame; @@ -1862,8 +1863,13 @@ public class MicroManager final SequenceSettings settings = getAcquisitionSettings(); final JSONObject metadata = getAcquisitionMetaData(); + // set sequence prefix for acquisition + final LiveSettingsPanel livePanel = instance.livePanel; + if (livePanel.hasCustomAcqName()) settings.prefix = livePanel.getAcqName(); + else settings.prefix = "Acquisition"; + // create the acquisition manager - acquisitionManager = new AcquisitionResult(settings, metadata); + acquisitionManager = new AcquisitionResult(settings, metadata, livePanel.hasDateSuffix()); // send acquisition started event for (AcquisitionListener l : listeners) diff --git a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/core/AcquisitionResult.java b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/core/AcquisitionResult.java index 686e8bda53e0886d4390cb495f85ac4e9e5ac4e1..f8952f33e55f396e3dc36983810eae11ce9b747b 100644 --- a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/core/AcquisitionResult.java +++ b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/core/AcquisitionResult.java @@ -15,7 +15,6 @@ import org.micromanager.utils.MMScriptException; import icy.gui.viewer.Viewer; import icy.main.Icy; import icy.sequence.Sequence; -import icy.util.DateUtil; import icy.util.StringUtil; import mmcorej.TaggedImage; import plugins.tprovoost.Microscopy.MicroManager.MicroManager; @@ -33,13 +32,15 @@ public class AcquisitionResult protected final Map<Integer, Sequence> sequences; protected final SequenceSettings settings; protected final JSONObject summaryMetadata; + protected final boolean dateSuffix; protected final long startTime; protected boolean done; - public AcquisitionResult(SequenceSettings settings, JSONObject summaryMetadata) + public AcquisitionResult(SequenceSettings settings, JSONObject summaryMetadata, boolean dateSuffix) { this.settings = settings; this.summaryMetadata = summaryMetadata; + this.dateSuffix = dateSuffix; sequences = new HashMap<Integer, Sequence>(); startTime = Calendar.getInstance().getTimeInMillis(); done = false; @@ -61,8 +62,9 @@ public class AcquisitionResult final String positionName = MDUtils.getPositionName(tags); // create a new sequence - seq = new Sequence("Acquisition - " + (!StringUtil.isEmpty(positionName) ? positionName + " - " : "") - + DateUtil.now("yyyy-MM-dd HH'h'mm'm'ss's'")); + seq = new Sequence(settings.prefix + + (!StringUtil.isEmpty(positionName) && settings.usePositionList ? " - " + positionName : "") + + (dateSuffix ? " - " + MMUtils.getDateString() : "")); sequences.put(position, seq); // display enabled ? diff --git a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/ActionsPanel.java b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/ActionsPanel.java index 05f3e81866b6c9b452e40c6171d7e865b99e2004..b1deb6e7afbff2be1cf0b9b04f7263244671cd4b 100644 --- a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/ActionsPanel.java +++ b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/ActionsPanel.java @@ -27,7 +27,6 @@ import icy.sequence.Sequence; import icy.sequence.SequenceEvent; import icy.sequence.SequenceListener; import icy.system.IcyExceptionHandler; -import icy.util.DateUtil; import icy.util.StringUtil; import mmcorej.CMMCore; import mmcorej.TaggedImage; @@ -270,8 +269,10 @@ public class ActionsPanel extends JPanel implements LiveListener, SequenceListen return; final boolean liveRunning = MicroManager.isLiveRunning(); - final Sequence sequence = new Sequence("Image snap - " + getDateString()); final LiveSettingsPanel livePanel = mainFrame.livePanel; + final String prefix = livePanel.hasCustomAcqName() ? livePanel.getAcqName() : "Image snap"; + final Sequence sequence = new Sequence( + prefix + (livePanel.hasDateSuffix() ? " - " + MMUtils.getDateString() : "")); try { @@ -341,7 +342,8 @@ public class ActionsPanel extends JPanel implements LiveListener, SequenceListen if (albumSequence.isEmpty()) { - albumSequence.setName("Album - " + getDateString()); + final String prefix = livePanel.hasCustomAcqName() ? livePanel.getAcqName() : "Album"; + albumSequence.setName(prefix + (livePanel.hasDateSuffix() ? " - " + MMUtils.getDateString() : "")); albumDate = Calendar.getInstance().getTimeInMillis(); } try @@ -433,11 +435,6 @@ public class ActionsPanel extends JPanel implements LiveListener, SequenceListen mainFrame.refreshGUI(); } - static String getDateString() - { - return DateUtil.now("yyyy-MM-dd HH'h'mm'm'ss's'"); - } - void prepareSequences() { // lazy creation diff --git a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/LiveSettingsPanel.java b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/LiveSettingsPanel.java index 1aec464a6d4f3d174a41ad76dd372c45747cb74e..5fe6c3f3144c7da4aaf1434588c9f05d82d6d485 100644 --- a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/LiveSettingsPanel.java +++ b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/LiveSettingsPanel.java @@ -3,9 +3,13 @@ package plugins.tprovoost.Microscopy.MicroManager.gui; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JTextField; import javax.swing.border.TitledBorder; import icy.gui.component.NumberTextField; @@ -25,6 +29,9 @@ public class LiveSettingsPanel extends JPanel private NumberTextField zEndField; private JLabel lblNewLabel; private NumberTextField zStepField; + JCheckBox customAcqNameCheckBox; + JTextField acqNameField; + private JCheckBox dateSuffixCheckBox; /** * Create the panel. @@ -39,6 +46,15 @@ public class LiveSettingsPanel extends JPanel this.mainFrame = mainFrame; initialize(); + + customAcqNameCheckBox.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + acqNameField.setEnabled(customAcqNameCheckBox.isSelected()); + } + }); } private void initialize() @@ -47,12 +63,45 @@ public class LiveSettingsPanel extends JPanel null)); GridBagLayout gridBagLayout = new GridBagLayout(); - gridBagLayout.columnWidths = new int[] {60, 0, 60, 0, 60, 0, 0}; - gridBagLayout.rowHeights = new int[] {0, 0}; - gridBagLayout.columnWeights = new double[] {0.0, 1.0, 0.0, 1.0, 0.0, 1.0, Double.MIN_VALUE}; - gridBagLayout.rowWeights = new double[] {0.0, Double.MIN_VALUE}; + gridBagLayout.columnWidths = new int[] {60, 0, 60, 0, 0, 60, 0, 0}; + gridBagLayout.rowHeights = new int[] {0, 0, 0}; + gridBagLayout.columnWeights = new double[] {0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[] {0.0, 0.0, Double.MIN_VALUE}; setLayout(gridBagLayout); + customAcqNameCheckBox = new JCheckBox("Acquisition name"); + customAcqNameCheckBox.setToolTipText("Set a custom acquisition name"); + GridBagConstraints gbc_customAcqNameCheckBox = new GridBagConstraints(); + gbc_customAcqNameCheckBox.anchor = GridBagConstraints.WEST; + gbc_customAcqNameCheckBox.gridwidth = 2; + gbc_customAcqNameCheckBox.insets = new Insets(0, 0, 5, 5); + gbc_customAcqNameCheckBox.gridx = 0; + gbc_customAcqNameCheckBox.gridy = 0; + add(customAcqNameCheckBox, gbc_customAcqNameCheckBox); + + acqNameField = new JTextField(); + acqNameField.setEnabled(false); + acqNameField.setText("Acquisition"); + GridBagConstraints gbc_acqNameField = new GridBagConstraints(); + gbc_acqNameField.gridwidth = 3; + gbc_acqNameField.insets = new Insets(0, 0, 5, 5); + gbc_acqNameField.fill = GridBagConstraints.HORIZONTAL; + gbc_acqNameField.gridx = 2; + gbc_acqNameField.gridy = 0; + add(acqNameField, gbc_acqNameField); + acqNameField.setColumns(10); + + dateSuffixCheckBox = new JCheckBox("Date suffix"); + dateSuffixCheckBox.setToolTipText("Add date suffix to acquisition name"); + dateSuffixCheckBox.setSelected(true); + GridBagConstraints gbc_dateSuffixCheckBox = new GridBagConstraints(); + gbc_dateSuffixCheckBox.anchor = GridBagConstraints.WEST; + gbc_dateSuffixCheckBox.gridwidth = 2; + gbc_dateSuffixCheckBox.insets = new Insets(0, 0, 5, 5); + gbc_dateSuffixCheckBox.gridx = 5; + gbc_dateSuffixCheckBox.gridy = 0; + add(dateSuffixCheckBox, gbc_dateSuffixCheckBox); + lblZStart = new JLabel("Z start"); lblZStart.setToolTipText("Z start position (um) for stack acquisition (used only if Z step is not 0)"); GridBagConstraints gbc_lblZStart = new GridBagConstraints(); @@ -60,7 +109,7 @@ public class LiveSettingsPanel extends JPanel gbc_lblZStart.anchor = GridBagConstraints.WEST; gbc_lblZStart.insets = new Insets(0, 0, 0, 5); gbc_lblZStart.gridx = 0; - gbc_lblZStart.gridy = 0; + gbc_lblZStart.gridy = 1; add(lblZStart, gbc_lblZStart); zStartField = new NumberTextField(); @@ -69,7 +118,7 @@ public class LiveSettingsPanel extends JPanel gbc_zStartField.insets = new Insets(0, 0, 0, 5); gbc_zStartField.fill = GridBagConstraints.BOTH; gbc_zStartField.gridx = 1; - gbc_zStartField.gridy = 0; + gbc_zStartField.gridy = 1; add(zStartField, gbc_zStartField); zStartField.setColumns(4); @@ -79,7 +128,7 @@ public class LiveSettingsPanel extends JPanel gbc_lblNewLabel.insets = new Insets(0, 0, 0, 5); gbc_lblNewLabel.anchor = GridBagConstraints.WEST; gbc_lblNewLabel.gridx = 2; - gbc_lblNewLabel.gridy = 0; + gbc_lblNewLabel.gridy = 1; add(lblNewLabel, gbc_lblNewLabel); zEndField = new NumberTextField(); @@ -87,8 +136,8 @@ public class LiveSettingsPanel extends JPanel GridBagConstraints gbc_zEndField = new GridBagConstraints(); gbc_zEndField.insets = new Insets(0, 0, 0, 5); gbc_zEndField.fill = GridBagConstraints.BOTH; - gbc_zEndField.gridx = 3; - gbc_zEndField.gridy = 0; + gbc_zEndField.gridx = 4; + gbc_zEndField.gridy = 1; add(zEndField, gbc_zEndField); zEndField.setColumns(4); @@ -98,20 +147,50 @@ public class LiveSettingsPanel extends JPanel gbc_lblZSlices.fill = GridBagConstraints.VERTICAL; gbc_lblZSlices.insets = new Insets(0, 0, 0, 5); gbc_lblZSlices.anchor = GridBagConstraints.WEST; - gbc_lblZSlices.gridx = 4; - gbc_lblZSlices.gridy = 0; + gbc_lblZSlices.gridx = 5; + gbc_lblZSlices.gridy = 1; add(lblZSlices, gbc_lblZSlices); zStepField = new NumberTextField(); zStepField.setText("0"); GridBagConstraints gbc_zStepField = new GridBagConstraints(); gbc_zStepField.fill = GridBagConstraints.BOTH; - gbc_zStepField.gridx = 5; - gbc_zStepField.gridy = 0; + gbc_zStepField.gridx = 6; + gbc_zStepField.gridy = 1; add(zStepField, gbc_zStepField); zStepField.setColumns(4); } + public boolean hasCustomAcqName() + { + return customAcqNameCheckBox.isSelected(); + } + + public void setCustomAcqName(boolean value) + { + customAcqNameCheckBox.setSelected(value); + } + + public String getAcqName() + { + return acqNameField.getText(); + } + + public void setAcqName(String value) + { + acqNameField.setText(value); + } + + public boolean hasDateSuffix() + { + return dateSuffixCheckBox.isSelected(); + } + + public void setDateSuffix(boolean value) + { + dateSuffixCheckBox.setSelected(value); + } + public boolean isZStackAcquisition() { return getZStep() != 0d; diff --git a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/MMMainFrame.java b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/MMMainFrame.java index 87ae10848f21623723c6ba5ce13041bd2701407b..8bf14d1f91ac834de60494bbf24e9acf3013bfa3 100644 --- a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/MMMainFrame.java +++ b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/MMMainFrame.java @@ -83,12 +83,12 @@ public class MMMainFrame extends IcyFrame Preferences contrastPrefs; // panels composing the main frame - ActionsPanel actionsPanel; - ConfigurationPanel configPanel; - CameraSettingsPanel cameraPanel; - LiveSettingsPanel livePanel; - AcquisitionInfoPanel acquisitionInfoPanel; - PluginsToolbar pluginsPanel; + public ActionsPanel actionsPanel; + public ConfigurationPanel configPanel; + public CameraSettingsPanel cameraPanel; + public LiveSettingsPanel livePanel; + public AcquisitionInfoPanel acquisitionInfoPanel; + public PluginsToolbar pluginsPanel; // MM event handler MMEventCallback mainCallback; @@ -301,7 +301,7 @@ public class MMMainFrame extends IcyFrame final ToolTipFrame tooltip = new ToolTipFrame( "<html>You can access more Micro-Manager options from menu by clicking on top left icon:<br>" - + "<img src=\"" + getClass().getResource("/res/image/menu_tip.jpg").toString() + "\" /></html>", + + "<img src=\"" + getClass().getResource("/image/menu_tip.jpg").toString() + "\" /></html>", 30, "MicroManager.HiddenMenu.Tip"); tooltip.setSize(264, 192); } diff --git a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/tools/MMUtils.java b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/tools/MMUtils.java index 40d940d166d5ba7b183a4bb1648158291464a0bb..6bbb832d2f7585016a77f8a8792a56d2b4662607 100644 --- a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/tools/MMUtils.java +++ b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/tools/MMUtils.java @@ -43,6 +43,7 @@ import icy.type.collection.CollectionUtil; import icy.type.collection.array.Array2DUtil; import icy.type.collection.array.ArrayUtil; import icy.type.point.Point3D; +import icy.util.DateUtil; import icy.util.OMEUtil; import icy.util.ReflectionUtil; import icy.util.StringUtil; @@ -173,7 +174,9 @@ public class MMUtils } catch (Throwable t) { - throw new RuntimeException("Cannot patch Micro-Manager classes, you may need to restart Icy !", t); + // maybe already patched --> just display a warning message + new FailedAnnounceFrame( + "Cannot patch Micro-Manager classes, it may not work correctly until you restart Icy !"); } // load DLL @@ -222,6 +225,14 @@ public class MMUtils return false; } + /** + * @return a date formatted String (used for acquisition name) + */ + public static String getDateString() + { + return DateUtil.now("yyyy-MM-dd HH'h'mm'm'ss's'"); + } + /** * Convert a list of {@link TaggedImage} (Micro Manager) to {@link IcyBufferedImage} (Icy) where each * {@link TaggedImage} represents one channel of the output image.