From 94a1e107918606d0ab77320d6df4f2b8ecd35835 Mon Sep 17 00:00:00 2001 From: Tiago Ferreira Date: Thu, 8 Jun 2023 13:51:19 -0400 Subject: [PATCH] Code cleanup --- src/main/java/sc/fiji/snt/gui/DemoRunner.java | 4 +- .../java/sc/fiji/snt/gui/FileChooser.java | 302 ++++++++++++++++++ src/main/java/sc/fiji/snt/gui/GuiUtils.java | 213 ++++++------ .../sc/fiji/snt/gui/SNTCommandFinder.java | 20 +- 4 files changed, 404 insertions(+), 135 deletions(-) create mode 100644 src/main/java/sc/fiji/snt/gui/FileChooser.java diff --git a/src/main/java/sc/fiji/snt/gui/DemoRunner.java b/src/main/java/sc/fiji/snt/gui/DemoRunner.java index bad210f9d..64900a2a7 100644 --- a/src/main/java/sc/fiji/snt/gui/DemoRunner.java +++ b/src/main/java/sc/fiji/snt/gui/DemoRunner.java @@ -240,8 +240,8 @@ public ImagePlus getImage() { public void load() { super.load(); // apply tags - ui.getPathManager().runCommand("Traced Channel"); - ui.getPathManager().runCommand("Traced Frame"); + ui.getPathManager().applyDefaultTags("Traced Channel"); + ui.getPathManager().applyDefaultTags("Traced Frame"); } }; entry.summary = "Downloads a Drosophila S2 cell undergoing mitosis in which K-fibers were traced during anaphase."; diff --git a/src/main/java/sc/fiji/snt/gui/FileChooser.java b/src/main/java/sc/fiji/snt/gui/FileChooser.java new file mode 100644 index 000000000..02943805a --- /dev/null +++ b/src/main/java/sc/fiji/snt/gui/FileChooser.java @@ -0,0 +1,302 @@ +/*- + * #%L + * Fiji distribution of ImageJ for the life sciences. + * %% + * Copyright (C) 2010 - 2023 Fiji developers. + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * . + * #L% + */ + +package sc.fiji.snt.gui; + +import java.awt.BasicStroke; +import java.awt.Component; +import java.awt.Desktop; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.RenderingHints; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Line2D; +import java.awt.geom.Path2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.RoundRectangle2D; +import java.io.File; +import java.io.IOException; + +import javax.swing.AbstractButton; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JToggleButton; +import javax.swing.UIManager; +import javax.swing.filechooser.FileFilter; + +import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.icons.FlatAbstractIcon; +import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.util.SystemInfo; + +/** + * Improvements to JFileChooser, namely: + * + * Other fixes (current directory always the root folder on linux) and tweaks + * (drag & drop, etc.) are provided by GuiUtils to keep dependencies to a + * minimum. TODO: submit this upstream porting to SciJava + */ +public class FileChooser extends JFileChooser { + + private static final long serialVersionUID = 9398079702362074L; + private JToggleButton toggleHiddenFilesButton; + private String userFilterPattern; + + public FileChooser() { + setAcceptAllFileFilterUsed(true); + attachAccessoryPanel(); + } + + @Override + public void setFileHidingEnabled(final boolean b) { + if (toggleHiddenFilesButton != null) + toggleHiddenFilesButton.setSelected(!b); + super.setFileHidingEnabled(b); + } + + @Override + public void approveSelection() { + final File f = getSelectedFile(); + if (f.exists() && getDialogType() == SAVE_DIALOG) { + final int result = JOptionPane.showConfirmDialog(this, + String.format("%s already exists.%nOverwrite?", f.getName()), "Override File?", + JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); + switch (result) { + case JOptionPane.YES_OPTION: + super.approveSelection(); + return; + case JOptionPane.CANCEL_OPTION: + cancelSelection(); + return; + default: + return; + } + } + super.approveSelection(); + } + + private void attachAccessoryPanel() { + final JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); + toggleHiddenFilesButton = new JToggleButton(new HiddenFilesIcon()); + toggleHiddenFilesButton.setToolTipText("Toggle visibility of hidden files"); + panel.add(toggleHiddenFilesButton); + toggleHiddenFilesButton.addItemListener(e -> setFileHidingEnabled(!toggleHiddenFilesButton.isSelected())); + final JButton rescanButton = new JButton(new ReloadFilesIcon()); + rescanButton.setToolTipText("Refresh contents"); + rescanButton.addActionListener(e -> rescanCurrentDirectory()); + panel.add(rescanButton); + final JButton filterButton = new JButton(new FilterFilesIcon()); + filterButton.setToolTipText("Filter current file list"); + filterButton.addActionListener(e -> applyFilterPattern()); + panel.add(filterButton); + final JButton revealButton = new JButton(new RevealFilesIcon()); + revealButton.setToolTipText("Show current directory in native file explorer"); + revealButton.addActionListener(e -> { + final File f = (getSelectedFile() == null || isMultiSelectionEnabled()) ? getCurrentDirectory() + : getSelectedFile(); + reveal(f); + }); + panel.add(revealButton); + mod(toggleHiddenFilesButton, rescanButton, filterButton, revealButton); + setAccessory(panel); + } + + private void mod(final AbstractButton... buttons) { + // as per FlatFileChooser.* icons + final Insets margin = UIManager.getInsets("Button.margin"); + for (final AbstractButton b : buttons) { + b.putClientProperty(FlatClientProperties.BUTTON_TYPE, FlatClientProperties.BUTTON_TYPE_TOOLBAR_BUTTON); + b.setMargin(margin); + b.setFocusable(false); + } + } + + private void applyFilterPattern() { + if (userFilterPattern == null) + userFilterPattern = ""; + final String result = (String) JOptionPane.showInputDialog(this, "Only show filenames containing:", + "Filter by Pattern", JOptionPane.PLAIN_MESSAGE, null, null, userFilterPattern); + if (result != null && !result.isEmpty()) { + userFilterPattern = result; + final FileFilter filter = new FileNamePatternFilter(userFilterPattern); + addChoosableFileFilter(filter); + setFileFilter(filter); + } + } + + private void error(final String msg) { + JOptionPane.showMessageDialog(this, msg, "Error", JOptionPane.ERROR_MESSAGE); + } + + private void fileNotAccessibleError(final File dir) { + if (dir == null) + error("Directory does not seem to be accessible."); + else + error("Could not access\n" + dir.getAbsolutePath()); + } + + protected void reveal(final File file) { + if (file == null) { + fileNotAccessibleError(file); + return; + } + final File dir = (file.isDirectory()) ? file : file.getParentFile(); + try { + Desktop.getDesktop().open(dir); // TODO: Move to java9: Desktop.getDesktop().browseFileDirectory(file); + } catch (final UnsupportedOperationException ue) { + if (SystemInfo.isLinux) + try { + Runtime.getRuntime().exec(new String[] { "xdg-open", dir.getAbsolutePath() }); + } catch (final Exception ignored) { + fileNotAccessibleError(dir); + } + } catch (final NullPointerException | IllegalArgumentException | IOException iae) { + fileNotAccessibleError(dir); + } + } + + private static class FileNamePatternFilter extends FileFilter { + final String pattern; + + FileNamePatternFilter(final String pattern) { + this.pattern = pattern; + } + + @Override + public boolean accept(final File f) { + return f.getName().contains(pattern); + } + + @Override + public String getDescription() { + return "Files and Folders containing '" + pattern + "'"; + } + + } + + /* Icon definitions, mostly duplicated from FlatLaf */ + private static class RevealFilesIcon extends FlatAbstractIcon { + + public RevealFilesIcon() { + // from FlatFileChooser.* icons + super(16, 16, UIManager.getColor("Actions.Grey")); + } + + void prepGraphics(final Graphics2D g) { + // from FlatFileViewComputerIcon + g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); + g.setStroke(new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); + } + + @Override + protected void paintIcon(final Component c, final Graphics2D g) { + prepGraphics(g); + // from FlatFileViewComputerIcon + g.draw(new RoundRectangle2D.Float(2.5f, 3.5f, 11, 7, 2, 2)); + g.drawLine(8, 11, 8, 12); + g.draw(new Line2D.Float(4.5f, 12.5f, 11.5f, 12.5f)); + } + } + + private static class HiddenFilesIcon extends RevealFilesIcon { + + @Override + protected void paintIcon(final Component c, final Graphics2D g) { + prepGraphics(g); + // from FlatRevealIcon + final Path2D path = new Path2D.Float(Path2D.WIND_EVEN_ODD); + path.append(new Ellipse2D.Float(5.15f, 6.15f, 5.7f, 5.7f), false); + path.append(new Ellipse2D.Float(6, 7, 4, 4), false); + g.fill(path); + final Path2D path2 = new Path2D.Float(Path2D.WIND_EVEN_ODD); + path2.append(new Ellipse2D.Float(2.15f, 4.15f, 11.7f, 11.7f), false); + path2.append(new Ellipse2D.Float(3, 5, 10, 10), false); + final Area area = new Area(path2); + area.subtract(new Area(new Rectangle2D.Float(0, 9.5f, 16, 16))); + g.fill(area); + } + } + + private static class FilterFilesIcon extends RevealFilesIcon { + private Area area; + + @Override + protected void paintIcon(final Component c, final Graphics2D g) { + prepGraphics(g); + // from FlatSearchIcon + if (area == null) { + area = new Area(new Ellipse2D.Float(2, 2, 10, 10)); + area.subtract(new Area(new Ellipse2D.Float(3, 3, 8, 8))); + area.add(new Area(FlatUIUtils.createPath(10.813, 9.75, 14, 12.938, 12.938, 14, 9.75, 10.813))); + } + g.fill(area); + } + } + + private static class ReloadFilesIcon extends RevealFilesIcon { + + @Override + protected void paintIcon(final Component c, final Graphics2D g) { + g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); + g.setStroke(new BasicStroke(0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); + // converted from FlatLaf /demo/icons/refresh.svg (16px viewBox) scaled to 14px + final Path2D p = new Path2D.Float(); + p.moveTo(10.820312, 10.605469); + p.curveTo(9.796875, 11.6875, 8.328125, 12.332031, 6.722656, 12.246094); + p.curveTo(4.136719, 12.109375, 2.085938, 10.125, 1.785156, 7.640625); + p.lineTo(3.410156, 7.78125); + p.curveTo(3.75, 9.363281, 5.117188, 10.582031, 6.808594, 10.671875); + p.curveTo(7.945312, 10.730469, 8.988281, 10.265625, 9.703125, 9.488281); + p.lineTo(7.886719, 7.667969); + p.lineTo(12.261719, 7.667969); + p.lineTo(12.261719, 12.042969); + p.closePath(); + g.fill(p); + p.moveTo(3.183594, 3.398438); + p.curveTo(4.203125, 2.320312, 5.671875, 1.675781, 7.273438, 1.761719); + p.curveTo(9.824219, 1.894531, 11.855469, 3.828125, 12.199219, 6.265625); + p.lineTo(10.570312, 6.125); + p.curveTo(10.195312, 4.589844, 8.851562, 3.417969, 7.191406, 3.328125); + p.curveTo(6.054688, 3.269531, 5.011719, 3.734375, 4.296875, 4.511719); + p.lineTo(6.121094, 6.335938); + p.lineTo(1.746094, 6.335938); + p.lineTo(1.746094, 1.960938); + p.lineTo(3.183594, 3.398438); + p.closePath(); + g.fill(p); + } + } + +} diff --git a/src/main/java/sc/fiji/snt/gui/GuiUtils.java b/src/main/java/sc/fiji/snt/gui/GuiUtils.java index 12b1f76f1..2cd9b55a0 100644 --- a/src/main/java/sc/fiji/snt/gui/GuiUtils.java +++ b/src/main/java/sc/fiji/snt/gui/GuiUtils.java @@ -22,20 +22,6 @@ package sc.fiji.snt.gui; -import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.FlatDarculaLaf; -import com.formdev.flatlaf.FlatDarkLaf; -import com.formdev.flatlaf.FlatIntelliJLaf; -import com.formdev.flatlaf.FlatLaf; -import com.formdev.flatlaf.FlatLightLaf; -import com.formdev.flatlaf.icons.FlatWindowCloseIcon; -import com.jidesoft.plaf.LookAndFeelFactory; -import com.jidesoft.popup.JidePopup; -import com.jidesoft.utils.ProductNames; - -import ij.IJ; -import ij.ImageJ; - import java.awt.BorderLayout; import java.awt.Canvas; import java.awt.Color; @@ -94,8 +80,51 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; -import javax.swing.*; +import javax.swing.AbstractAction; +import javax.swing.AbstractButton; +import javax.swing.Action; +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.ButtonGroup; +import javax.swing.DefaultListCellRenderer; +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JColorChooser; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JEditorPane; +import javax.swing.JFileChooser; +import javax.swing.JFormattedTextField; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JSpinner; import javax.swing.JSpinner.DefaultEditor; +import javax.swing.JTabbedPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.JTextPane; +import javax.swing.JTree; +import javax.swing.KeyStroke; +import javax.swing.ListSelectionModel; +import javax.swing.LookAndFeel; +import javax.swing.MenuElement; +import javax.swing.SpinnerModel; +import javax.swing.SpinnerNumberModel; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.UIManager; +import javax.swing.WindowConstants; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.colorchooser.AbstractColorChooserPanel; @@ -116,6 +145,19 @@ import org.scijava.util.PlatformUtils; import org.scijava.util.Types; +import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.FlatDarculaLaf; +import com.formdev.flatlaf.FlatDarkLaf; +import com.formdev.flatlaf.FlatIntelliJLaf; +import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.FlatLightLaf; +import com.formdev.flatlaf.icons.FlatClearIcon; +import com.jidesoft.plaf.LookAndFeelFactory; +import com.jidesoft.popup.JidePopup; +import com.jidesoft.utils.ProductNames; + +import ij.IJ; +import ij.ImageJ; import sc.fiji.snt.SNTPrefs; import sc.fiji.snt.SNTUtils; import sc.fiji.snt.analysis.SNTChart; @@ -212,7 +254,7 @@ private void showNotification(final JLabel msg, final boolean disposeOnClick) { popup.setFocusable(false); popup.setEnsureInOneScreen(true); - final JButton button = new JButton(new FlatWindowCloseIcon()); + final JButton button = new JButton(new FlatClearIcon());//new FlatTabbedPaneCloseIcon()); button.setMargin(new Insets(0, 0, 0, 0)); button.setBorder(null); button.setBorderPainted(false); @@ -221,7 +263,7 @@ private void showNotification(final JLabel msg, final boolean disposeOnClick) { popup.addExcludedComponent(button); final JPanel panel = new JPanel(); - applyRoundCorners(panel); + applyRoundCorners(msg); panel.add(button); panel.add(msg); popup.add(panel); @@ -820,21 +862,23 @@ public File[] getReconstructionFiles() { public File getReconstructionFile(final File file, final String extension) { FileNameExtensionFilter filter; if ("swc".equals(extension)) - filter = new FileNameExtensionFilter("SWC (.swc)", "swc"); + filter = new FileNameExtensionFilter("SWC files (.swc)", "swc"); else if ("traces".equals(extension)) - filter = new FileNameExtensionFilter("TRACES (.traces)", "traces"); + filter = new FileNameExtensionFilter("SNT TRACES files (.traces)", "traces"); else if ("json".equals(extension)) - filter = new FileNameExtensionFilter("JSON (.json)", "json"); + filter = new FileNameExtensionFilter("JSON files (.json)", "json"); else if ("ndf".equals(extension)) - filter = new FileNameExtensionFilter("NDF (.ndf)", "ndf"); + filter = new FileNameExtensionFilter("NeuronJ NDF files (.ndf)", "ndf"); else if ("labels".equals(extension)) - filter = new FileNameExtensionFilter("LABELS (.labels)", "labels"); + filter = new FileNameExtensionFilter("AmiraMesh labels (.labels)", "labels"); else filter = null; final JFileChooser fileChooser = getReconstructionFileChooser(filter); fileChooser.setSelectedFile(file); if (extension == null) fileChooser.setDialogTitle("Choose Reconstruction File"); + else if ("labels".equals(extension)) + fileChooser.setDialogTitle("Choose LABELS File"); else fileChooser.setDialogTitle("Choose Reconstrution (" + extension.toUpperCase() + ") File"); fileChooser.setMultiSelectionEnabled(false); @@ -1134,30 +1178,7 @@ public void mouseClicked(final MouseEvent e) { } public void showDirectory(final File file) { - if (file == null) { - dirNotAccessibleError(file); - return; - } - final File dir = (file.isDirectory()) ? file : file.getParentFile(); - try { - Desktop.getDesktop().open(dir); // TODO: Move to java9: Desktop.getDesktop().browseFileDirectory(file); - } catch (final UnsupportedOperationException ue) { - if (PlatformUtils.isLinux()) - try { - Runtime.getRuntime().exec(new String[] { "xdg-open", dir.getAbsolutePath() }); - } catch (final Exception ignored) { - dirNotAccessibleError(dir); - } - } catch (final NullPointerException | IllegalArgumentException | IOException iae) { - dirNotAccessibleError(dir); - } - } - - private void dirNotAccessibleError(final File dir) { - if (dir == null) - error("Directory does not seem to be accessible."); - else - error("Could not access
" + dir.getAbsolutePath()); + new FileChooser().reveal(file); } /* Static methods */ @@ -1844,93 +1865,39 @@ else if (current instanceof Container) { } public static JFileChooser getDnDFileChooser() { - final JFileChooser fileChooser = new JFileChooser() { - private static final long serialVersionUID = 9398079702362074L; - + @SuppressWarnings("serial") + final JFileChooser fileChooser = new FileChooser() { @Override public File getCurrentDirectory() { - // Workaround Linux bug where setting current directory sets it to root + // Workaround Linux bug where somehow directory always becomes root if (super.getCurrentDirectory() == null || super.getCurrentDirectory().toPath().getNameCount() == 0) { return SNTPrefs.lastknownDir(); } return super.getCurrentDirectory(); } - - @Override - public void approveSelection() { - final File f = getSelectedFile(); - if (f.exists() && getDialogType() == SAVE_DIALOG) { - final int result = JOptionPane.showConfirmDialog(this, - String.format("%s already exists.%nOverwrite?", f.getName()), "Override File?", - JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); - switch (result) { - case JOptionPane.YES_OPTION: - super.approveSelection(); - return; - case JOptionPane.CANCEL_OPTION: - cancelSelection(); - return; - default: - return; - } - } - super.approveSelection(); - } }; - fileChooser.setDragEnabled(true); - new FileDrop(fileChooser, new FileDrop.Listener() { - - final GuiUtils guiUtils = new GuiUtils(fileChooser); - - @Override - public void filesDropped(final File[] files) { - if (files.length == 0) { // Is this even possible? - guiUtils.error("Dropped file(s) not recognized."); - return; - } - // see ij.io.DragAndDropHandler - final File firstFile = files[0]; - if (fileChooser.isMultiSelectionEnabled()) { - final File dir = (firstFile.isDirectory()) ? firstFile : firstFile.getParentFile(); - fileChooser.setCurrentDirectory(dir); - fileChooser.setSelectedFiles(files); - } else { - if (fileChooser.getFileSelectionMode() == JFileChooser.DIRECTORIES_ONLY && !firstFile.isDirectory()) - fileChooser.setCurrentDirectory(firstFile.getParentFile()); - if (fileChooser.getDialogType() == JFileChooser.SAVE_DIALOG && firstFile.isDirectory()) - fileChooser.setCurrentDirectory(firstFile); - else - fileChooser.setSelectedFile(firstFile); - } - fileChooser.rescanCurrentDirectory(); - } - }); - - fileChooser.setAcceptAllFileFilterUsed(true); fileChooser.setCurrentDirectory(SNTPrefs.lastknownDir()); - - @SuppressWarnings("serial") - final AbstractAction hAction = new AbstractAction() { - - @Override - public void actionPerformed(final ActionEvent e) { - final JFileChooser jf = (JFileChooser) e.getSource(); - jf.setFileHidingEnabled(!jf.isFileHidingEnabled()); - } - }; - @SuppressWarnings("serial") - final AbstractAction rAction = new AbstractAction() { - @Override - public void actionPerformed(final ActionEvent e) { - ((JFileChooser) e.getSource()).rescanCurrentDirectory(); + new FileDrop(fileChooser, files -> { + if (files.length == 0) { // Is this even possible? + new GuiUtils(fileChooser).error("Dropped file(s) not recognized."); + return; } - }; - fileChooser.getActionMap().put("toggleHiddenFiles", hAction); - fileChooser.getActionMap().put("rescanFiles", rAction); - final InputMap inputMap = fileChooser.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); - inputMap.put(KeyStroke.getKeyStroke('h'), "toggleHiddenFiles"); - inputMap.put(KeyStroke.getKeyStroke('r'), "rescanFiles"); - + // see ij.io.DragAndDropHandler + final File firstFile = files[0]; + if (fileChooser.isMultiSelectionEnabled()) { + final File dir = (firstFile.isDirectory()) ? firstFile : firstFile.getParentFile(); + fileChooser.setCurrentDirectory(dir); + fileChooser.setSelectedFiles(files); + } else { + if (fileChooser.getFileSelectionMode() == JFileChooser.DIRECTORIES_ONLY && !firstFile.isDirectory()) + fileChooser.setCurrentDirectory(firstFile.getParentFile()); + if (fileChooser.getDialogType() == JFileChooser.SAVE_DIALOG && firstFile.isDirectory()) + fileChooser.setCurrentDirectory(firstFile); + else + fileChooser.setSelectedFile(firstFile); + } + fileChooser.rescanCurrentDirectory(); + }); return fileChooser; } diff --git a/src/main/java/sc/fiji/snt/gui/SNTCommandFinder.java b/src/main/java/sc/fiji/snt/gui/SNTCommandFinder.java index 0bc2d867d..b5153592a 100644 --- a/src/main/java/sc/fiji/snt/gui/SNTCommandFinder.java +++ b/src/main/java/sc/fiji/snt/gui/SNTCommandFinder.java @@ -303,20 +303,20 @@ private void recordCmdSNTUI(final CmdAction cmdAction) { sb.append("snt.getUI().getPathManager()."); if (tagCmd) sb.append("applyDefaultTags(\"").append(cmdAction.id).append("\")"); - else if (promptCmd) - sb.append("runCommand(\"").append(cmdAction.id).append("\", \"[(optional) prompt options here...]\")"); else sb.append("runCommand(\"").append(cmdAction.id).append("\")"); } else { sb.append("snt.getUI().runCommand(\"").append(cmdAction.id).append("\")"); } - if (promptCmd && !pmCmd) + if (promptCmd) { noOptionsRecorderComment(); + sb.append(", \"[optional prompt options here...]\")"); + } recorder.recordCmd(sb.toString()); } private void noOptionsRecorderComment() { - recorder.recordComment("NB: Next line may rely on non-recorded prompt options"); + recorder.recordComment("NB: Next line may rely on non-recorded prompt options. See documentation for examples"); } private void recordSNTViewerCmd(final CmdAction cmdAction) { @@ -449,8 +449,8 @@ private class SearchField extends GuiUtils.TextFieldWithPlaceholder { SearchField(final boolean enableRecordButton) { super(" Search for commands and actions (e.g., Sholl)"); - setMargin(new Insets(PADDING, PADDING, PADDING, PADDING)); - setFont(REF_FONT.deriveFont(REF_FONT.getSize() * 1.2f)); + setMargin(new Insets((int) (PADDING *1.5), PADDING, (int) (PADDING *1.5), PADDING)); + setFont(REF_FONT.deriveFont(REF_FONT.getSize() * 1.1f)); putClientProperty( FlatClientProperties.TEXT_FIELD_LEADING_COMPONENT, new JLabel( new FlatSearchIcon( false ) ) ); if (enableRecordButton) putClientProperty( FlatClientProperties.TEXT_FIELD_TRAILING_COMPONENT, recordButton() ); @@ -606,9 +606,9 @@ void center(final Container component) { int x = bounds.x + (bounds.width - w.width) / 2; int y = bounds.y + (bounds.height - w.height) / 2; if (x < 0) - x = 0; + x = 0; //component.getX(); if (y < 0) - y = 0; + y = 0;// component.getY(); setLocation(x, y); } } @@ -655,8 +655,8 @@ CmdTableModel getInternalModel() { private class CmdTableRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; - final Font col0Font = REF_FONT.deriveFont(REF_FONT.getSize() * 1.1f); - final Font col1Font = REF_FONT.deriveFont(REF_FONT.getSize() * 1f); + final Font col0Font = REF_FONT.deriveFont(REF_FONT.getSize() * 1f); + final Font col1Font = REF_FONT.deriveFont(REF_FONT.getSize() * .9f); @Override public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected,