diff --git a/swing/src/net/sf/openrocket/gui/dialogs/PrintDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/PrintDialog.java index 1e107363f..91336dd48 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/PrintDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/PrintDialog.java @@ -27,6 +27,7 @@ import javax.swing.event.TreeSelectionListener; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; +import net.sf.openrocket.gui.widgets.SaveFileChooser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -363,7 +364,7 @@ public class PrintDialog extends JDialog implements TreeSelectionListener { */ private boolean onSavePDF() { - JFileChooser chooser = new JFileChooser(); + JFileChooser chooser = new SaveFileChooser(); chooser.setFileFilter(FileHelper.PDF_FILTER); // Select initial directory diff --git a/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java index 5485c60b1..0354815ad 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java @@ -52,6 +52,7 @@ import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import net.sf.openrocket.arch.SystemInfo; +import net.sf.openrocket.gui.widgets.SaveFileChooser; import net.sf.openrocket.rocketcomponent.FlightConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -1154,7 +1155,7 @@ public class GeneralOptimizationDialog extends JDialog { trans.get("export.header"), trans.get("export.header.ttip")); - JFileChooser chooser = new JFileChooser(); + JFileChooser chooser = new SaveFileChooser(); chooser.setFileFilter(FileHelper.CSV_FILTER); chooser.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory()); chooser.setAccessory(csvOptions); diff --git a/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoFrame.java b/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoFrame.java index de088d5d0..e57ebc7f0 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoFrame.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/photo/PhotoFrame.java @@ -42,6 +42,7 @@ import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.Icons; import net.sf.openrocket.gui.util.SimpleFileFilter; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.widgets.SaveFileChooser; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.logging.LoggingSystemSetup; import net.sf.openrocket.logging.Markers; @@ -200,7 +201,7 @@ public class PhotoFrame extends JFrame { final FileFilter png = new SimpleFileFilter(trans.get("PhotoFrame.fileFilter.png"), ".png"); - final JFileChooser chooser = new JFileChooser(); + final JFileChooser chooser = new SaveFileChooser(); chooser.addChoosableFileFilter(png); chooser.setFileFilter(png); diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index 4efe32789..33d7f5266 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -1512,11 +1512,6 @@ public class BasicFrame extends JFrame { int option = chooser.showSaveDialog(BasicFrame.this); - // If the user entered an illegal filename, show the dialog again - while (option == SaveFileChooser.ILLEGAL_FILENAME_ERROR) { - option = chooser.showSaveDialog(BasicFrame.this); - } - if (option != JFileChooser.APPROVE_OPTION) { log.info(Markers.USER_MARKER, "User decided not to save, option=" + option); return false; diff --git a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java index 78731f5e3..17336d761 100644 --- a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java @@ -43,6 +43,7 @@ import net.sf.openrocket.arch.SystemInfo; import net.sf.openrocket.gui.components.CsvOptionPanel; import net.sf.openrocket.gui.util.FileHelper; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.widgets.SaveFileChooser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -403,25 +404,25 @@ public class SimulationPanel extends JPanel { return; } - JFileChooser fch = setUpSimExportCSVFileChooser(); - int selectionStatus = fch.showSaveDialog(tableParent); + JFileChooser chooser = setUpSimExportCSVFileChooser(); + int selectionStatus = chooser.showSaveDialog(tableParent); if (selectionStatus != JFileChooser.APPROVE_OPTION) { log.debug("User cancelled CSV export"); return; } // Fetch the info from the file chooser - File CSVFile = fch.getSelectedFile(); + File CSVFile = chooser.getSelectedFile(); CSVFile = FileHelper.forceExtension(CSVFile, "csv"); if (!FileHelper.confirmWrite(CSVFile, SimulationPanel.this)) { log.debug("User cancelled CSV export overwrite"); return; } - String separator = ((CsvOptionPanel) fch.getAccessory()).getFieldSeparator(); - int precision = ((CsvOptionPanel) fch.getAccessory()).getDecimalPlaces(); - boolean isExponentialNotation = ((CsvOptionPanel) fch.getAccessory()).isExponentialNotation(); - ((CsvOptionPanel) fch.getAccessory()).storePreferences(); + String separator = ((CsvOptionPanel) chooser.getAccessory()).getFieldSeparator(); + int precision = ((CsvOptionPanel) chooser.getAccessory()).getDecimalPlaces(); + boolean isExponentialNotation = ((CsvOptionPanel) chooser.getAccessory()).isExponentialNotation(); + ((CsvOptionPanel) chooser.getAccessory()).storePreferences(); // Handle some special separator options from CsvOptionPanel if (separator.equals(trans.get("CsvOptionPanel.separator.space"))) { @@ -439,29 +440,29 @@ public class SimulationPanel extends JPanel { * @return The file chooser. */ private JFileChooser setUpSimExportCSVFileChooser() { - JFileChooser fch = new JFileChooser(); - fch.setDialogTitle(trans.get("simpanel.pop.exportToCSV.save.dialog.title")); - fch.setFileFilter(FileHelper.CSV_FILTER); - fch.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory()); - fch.setAcceptAllFileFilterUsed(false); + JFileChooser chooser = new SaveFileChooser(); + chooser.setDialogTitle(trans.get("simpanel.pop.exportToCSV.save.dialog.title")); + chooser.setFileFilter(FileHelper.CSV_FILTER); + chooser.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory()); + chooser.setAcceptAllFileFilterUsed(false); // Default output CSV to same name as the document's rocket name. String fileName = document.getRocket().getName() + ".csv"; - fch.setSelectedFile(new File(fileName)); + chooser.setSelectedFile(new File(fileName)); // Add CSV options to FileChooser CsvOptionPanel CSVOptions = new CsvOptionPanel(SimulationTableCSVExport.class); - fch.setAccessory(CSVOptions); + chooser.setAccessory(CSVOptions); // TODO: update this dynamically instead of hard-coded values // The macOS file chooser has an issue where it does not update its size when the accessory is added. if (SystemInfo.getPlatform() == SystemInfo.Platform.MAC_OS) { - Dimension currentSize = fch.getPreferredSize(); + Dimension currentSize = chooser.getPreferredSize(); Dimension newSize = new Dimension((int) (1.5 * currentSize.width), (int) (1.3 * currentSize.height)); - fch.setPreferredSize(newSize); + chooser.setPreferredSize(newSize); } - return fch; + return chooser; } private Simulation[] getSelectedSimulations() { diff --git a/swing/src/net/sf/openrocket/gui/plot/SimulationPlotDialog.java b/swing/src/net/sf/openrocket/gui/plot/SimulationPlotDialog.java index 3c30fcd87..d9c1724ea 100644 --- a/swing/src/net/sf/openrocket/gui/plot/SimulationPlotDialog.java +++ b/swing/src/net/sf/openrocket/gui/plot/SimulationPlotDialog.java @@ -26,6 +26,7 @@ import net.sf.openrocket.gui.util.FileHelper; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.Icons; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.widgets.SaveFileChooser; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Preferences; @@ -173,7 +174,7 @@ public class SimulationPlotDialog extends JDialog { } private boolean doPngExport(ChartPanel chartPanel, JFreeChart chart){ - JFileChooser chooser = new JFileChooser(); + JFileChooser chooser = new SaveFileChooser(); chooser.setAcceptAllFileFilterUsed(false); chooser.setFileFilter(FileHelper.PNG_FILTER); chooser.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory()); diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationExportPanel.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationExportPanel.java index ad6172ffb..f42bd9800 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationExportPanel.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationExportPanel.java @@ -32,6 +32,7 @@ import net.sf.openrocket.gui.util.FileHelper; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.SaveCSVWorker; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.widgets.SaveFileChooser; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.simulation.FlightData; import net.sf.openrocket.simulation.FlightDataBranch; @@ -219,7 +220,7 @@ public class SimulationExportPanel extends JPanel { } public boolean doExport() { - JFileChooser chooser = new JFileChooser(); + JFileChooser chooser = new SaveFileChooser(); chooser.setFileFilter(FileHelper.CSV_FILTER); chooser.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory()); diff --git a/swing/src/net/sf/openrocket/gui/widgets/SaveFileChooser.java b/swing/src/net/sf/openrocket/gui/widgets/SaveFileChooser.java index 6ec9b0011..6ab633ca9 100644 --- a/swing/src/net/sf/openrocket/gui/widgets/SaveFileChooser.java +++ b/swing/src/net/sf/openrocket/gui/widgets/SaveFileChooser.java @@ -1,5 +1,6 @@ package net.sf.openrocket.gui.widgets; +import net.sf.openrocket.gui.main.BasicFrame; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.startup.Application; @@ -36,7 +37,15 @@ public class SaveFileChooser extends JFileChooser { String.format(trans.get("SaveAsFileChooser.illegalFilename.message"), filename, c), trans.get("SaveAsFileChooser.illegalFilename.title"), JOptionPane.WARNING_MESSAGE); - return ILLEGAL_FILENAME_ERROR; + + option = ILLEGAL_FILENAME_ERROR; + + // If the user entered an illegal filename, show the dialog again + while (option == SaveFileChooser.ILLEGAL_FILENAME_ERROR) { + option = showSaveDialog(parent); + } + + return option; } } diff --git a/swing/src/net/sf/openrocket/utils/ComponentPresetEditor.java b/swing/src/net/sf/openrocket/utils/ComponentPresetEditor.java index d6faa15f8..a70cfc878 100644 --- a/swing/src/net/sf/openrocket/utils/ComponentPresetEditor.java +++ b/swing/src/net/sf/openrocket/utils/ComponentPresetEditor.java @@ -37,6 +37,7 @@ import net.sf.openrocket.gui.preset.PresetResultListener; import net.sf.openrocket.gui.util.FileHelper; import net.sf.openrocket.gui.util.Icons; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.widgets.SaveFileChooser; import net.sf.openrocket.logging.Markers; import net.sf.openrocket.material.Material; import net.sf.openrocket.preset.ComponentPreset; @@ -404,7 +405,7 @@ public class ComponentPresetEditor extends JPanel implements PresetResultListene private boolean saveAsORC() throws JAXBException, IOException { File file = null; - final JFileChooser chooser = new JFileChooser(); + final JFileChooser chooser = new SaveFileChooser(); chooser.addChoosableFileFilter(FileHelper.OPEN_ROCKET_COMPONENT_FILTER); chooser.setFileFilter(FileHelper.OPEN_ROCKET_COMPONENT_FILTER);