[#2131] Throw warning message when design filename contains illegal characters

This commit is contained in:
SiboVG 2023-03-23 01:20:58 +01:00
parent f4f6200662
commit e1c86f6a74
4 changed files with 172 additions and 119 deletions

View File

@ -1341,6 +1341,10 @@ SaveRktWarningDialog.donotshow=Do not show this dialog again
saveAs.openrocket.title=Save as OpenRocket ork file saveAs.openrocket.title=Save as OpenRocket ork file
saveAs.rocksim.title=Export as RockSim rkt file saveAs.rocksim.title=Export as RockSim rkt file
! SaveAsFileChooser
SaveAsFileChooser.illegalFilename.title = Illegal filename
SaveAsFileChooser.illegalFilename.message = The filename '%s' may not contain the character ' %c '. Please remove it.
! StorageOptionChooser ! StorageOptionChooser
StorageOptChooser.lbl.Simdatatostore = Simulated data to store: StorageOptChooser.lbl.Simdatatostore = Simulated data to store:
StorageOptChooser.rdbut.Allsimdata = All simulated data StorageOptChooser.rdbut.Allsimdata = All simulated data

View File

@ -86,6 +86,7 @@ import net.sf.openrocket.gui.util.OpenFileWorker;
import net.sf.openrocket.gui.util.SaveFileWorker; import net.sf.openrocket.gui.util.SaveFileWorker;
import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.gui.util.SwingPreferences;
import net.sf.openrocket.gui.util.URLUtil; import net.sf.openrocket.gui.util.URLUtil;
import net.sf.openrocket.gui.widgets.SaveFileChooser;
import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.Markers; import net.sf.openrocket.logging.Markers;
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
@ -1410,7 +1411,7 @@ public class BasicFrame extends JFrame {
public boolean exportRockSimAction() { public boolean exportRockSimAction() {
File file; File file;
final SaveAsFileChooser chooser = SaveAsFileChooser.build(document, FileType.ROCKSIM); final DesignFileSaveAsFileChooser chooser = DesignFileSaveAsFileChooser.build(document, FileType.ROCKSIM);
int option = chooser.showSaveDialog(BasicFrame.this); int option = chooser.showSaveDialog(BasicFrame.this);
@ -1507,10 +1508,15 @@ public class BasicFrame extends JFrame {
private boolean saveAsAction() { private boolean saveAsAction() {
File file = null; File file = null;
final SaveAsFileChooser chooser = SaveAsFileChooser.build(document, FileType.OPENROCKET); final DesignFileSaveAsFileChooser chooser = DesignFileSaveAsFileChooser.build(document, FileType.OPENROCKET);
int option = chooser.showSaveDialog(BasicFrame.this); 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) { if (option != JFileChooser.APPROVE_OPTION) {
log.info(Markers.USER_MARKER, "User decided not to save, option=" + option); log.info(Markers.USER_MARKER, "User decided not to save, option=" + option);
return false; return false;

View File

@ -3,9 +3,6 @@ package net.sf.openrocket.gui.main;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JFileChooser; import javax.swing.JFileChooser;
@ -15,10 +12,11 @@ import net.sf.openrocket.document.StorageOptions.FileType;
import net.sf.openrocket.gui.util.FileHelper; import net.sf.openrocket.gui.util.FileHelper;
import net.sf.openrocket.gui.util.SimpleFileFilter; import net.sf.openrocket.gui.util.SimpleFileFilter;
import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.gui.util.SwingPreferences;
import net.sf.openrocket.gui.widgets.SaveFileChooser;
import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Application;
public class SaveAsFileChooser extends JFileChooser { public class DesignFileSaveAsFileChooser extends SaveFileChooser {
private final FileType type; private final FileType type;
private final OpenRocketDocument document; private final OpenRocketDocument document;
@ -26,11 +24,11 @@ public class SaveAsFileChooser extends JFileChooser {
private static final Translator trans = Application.getTranslator(); private static final Translator trans = Application.getTranslator();
public static SaveAsFileChooser build( OpenRocketDocument document, FileType type ) { public static DesignFileSaveAsFileChooser build(OpenRocketDocument document, FileType type ) {
return new SaveAsFileChooser(document,type); return new DesignFileSaveAsFileChooser(document,type);
} }
private SaveAsFileChooser( OpenRocketDocument document, FileType type ) { private DesignFileSaveAsFileChooser(OpenRocketDocument document, FileType type ) {
this.document = document; this.document = document;
this.type = type; this.type = type;

View File

@ -0,0 +1,45 @@
package net.sf.openrocket.gui.widgets;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.startup.Application;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import java.awt.Component;
import java.awt.HeadlessException;
import java.io.File;
public class SaveFileChooser extends JFileChooser {
private static final Translator trans = Application.getTranslator();
private static final char[] ILLEGAL_CHARS = new char[] { '/', '\\', ':', '*', '?', '"', '<', '>', '|' };
public static final int ILLEGAL_FILENAME_ERROR = 23111998;
@Override
public int showSaveDialog(Component parent) throws HeadlessException {
int option = super.showSaveDialog(parent);
if (option != JFileChooser.APPROVE_OPTION) {
return option;
}
// Check for invalid characters
File file = getSelectedFile();
if (file == null) {
return ERROR_OPTION;
}
String filename = file.getName();
for (char c : ILLEGAL_CHARS) {
if (filename.indexOf(c) >= 0) {
// Illegal character found
JOptionPane.showMessageDialog(parent,
String.format(trans.get("SaveAsFileChooser.illegalFilename.message"), filename, c),
trans.get("SaveAsFileChooser.illegalFilename.title"),
JOptionPane.WARNING_MESSAGE);
return ILLEGAL_FILENAME_ERROR;
}
}
return option;
}
}