[#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

@ -1,117 +1,115 @@
package net.sf.openrocket.gui.main; 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 javax.swing.JFileChooser;
import java.util.List;
import net.sf.openrocket.document.OpenRocketDocument;
import javax.swing.JFileChooser; import net.sf.openrocket.document.StorageOptions;
import net.sf.openrocket.document.StorageOptions.FileType;
import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.util.FileHelper;
import net.sf.openrocket.document.StorageOptions; import net.sf.openrocket.gui.util.SimpleFileFilter;
import net.sf.openrocket.document.StorageOptions.FileType; import net.sf.openrocket.gui.util.SwingPreferences;
import net.sf.openrocket.gui.util.FileHelper; import net.sf.openrocket.gui.widgets.SaveFileChooser;
import net.sf.openrocket.gui.util.SimpleFileFilter; import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.startup.Application;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.startup.Application; public class DesignFileSaveAsFileChooser extends SaveFileChooser {
public class SaveAsFileChooser extends JFileChooser { private final FileType type;
private final OpenRocketDocument document;
private final FileType type; private final StorageOptionChooser storageChooser;
private final OpenRocketDocument document;
private final StorageOptionChooser storageChooser; private static final Translator trans = Application.getTranslator();
private static final Translator trans = Application.getTranslator(); public static DesignFileSaveAsFileChooser build(OpenRocketDocument document, FileType type ) {
return new DesignFileSaveAsFileChooser(document,type);
public static SaveAsFileChooser build( OpenRocketDocument document, FileType type ) { }
return new SaveAsFileChooser(document,type);
} private DesignFileSaveAsFileChooser(OpenRocketDocument document, FileType type ) {
this.document = document;
private SaveAsFileChooser( OpenRocketDocument document, FileType type ) { this.type = type;
this.document = document;
this.type = type; this.setAcceptAllFileFilterUsed(false);
this.setAcceptAllFileFilterUsed(false); File defaultFilename = document.getFileNoExtension();
File defaultFilename = document.getFileNoExtension(); switch( type ) {
default:
switch( type ) { case OPENROCKET:
default: defaultFilename = FileHelper.forceExtension(defaultFilename,"ork");
case OPENROCKET: this.setDialogTitle(trans.get("saveAs.openrocket.title"));
defaultFilename = FileHelper.forceExtension(defaultFilename,"ork"); storageChooser = new StorageOptionChooser(document, document.getDefaultStorageOptions());
this.setDialogTitle(trans.get("saveAs.openrocket.title")); this.setAccessory(storageChooser);
storageChooser = new StorageOptionChooser(document, document.getDefaultStorageOptions()); this.addChoosableFileFilter(FileHelper.OPENROCKET_DESIGN_FILTER);
this.setAccessory(storageChooser); this.setFileFilter(FileHelper.OPENROCKET_DESIGN_FILTER);
this.addChoosableFileFilter(FileHelper.OPENROCKET_DESIGN_FILTER); break;
this.setFileFilter(FileHelper.OPENROCKET_DESIGN_FILTER); case ROCKSIM:
break; defaultFilename = FileHelper.forceExtension(defaultFilename,"rkt");
case ROCKSIM: this.setDialogTitle(trans.get("saveAs.rocksim.title"));
defaultFilename = FileHelper.forceExtension(defaultFilename,"rkt"); storageChooser = null;
this.setDialogTitle(trans.get("saveAs.rocksim.title")); this.addChoosableFileFilter(FileHelper.ROCKSIM_DESIGN_FILTER);
storageChooser = null; this.setFileFilter(FileHelper.ROCKSIM_DESIGN_FILTER);
this.addChoosableFileFilter(FileHelper.ROCKSIM_DESIGN_FILTER); break;
this.setFileFilter(FileHelper.ROCKSIM_DESIGN_FILTER); }
break;
} final RememberFilenamePropertyListener listener = new RememberFilenamePropertyListener();
this.addPropertyChangeListener(JFileChooser.FILE_FILTER_CHANGED_PROPERTY, listener);
final RememberFilenamePropertyListener listener = new RememberFilenamePropertyListener(); this.addPropertyChangeListener(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY, listener);
this.addPropertyChangeListener(JFileChooser.FILE_FILTER_CHANGED_PROPERTY, listener); this.addPropertyChangeListener(JFileChooser.SELECTED_FILES_CHANGED_PROPERTY, listener);
this.addPropertyChangeListener(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY, listener);
this.addPropertyChangeListener(JFileChooser.SELECTED_FILES_CHANGED_PROPERTY, listener); this.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory());
this.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory()); if (defaultFilename != null) {
this.setSelectedFile(defaultFilename);
if (defaultFilename != null) { }
this.setSelectedFile(defaultFilename); }
}
} public void storeOptions(StorageOptions opts) {
if ( storageChooser != null ) {
public void storeOptions(StorageOptions opts) { storageChooser.storeOptions(opts);
if ( storageChooser != null ) { }
storageChooser.storeOptions(opts); }
}
} }
} class RememberFilenamePropertyListener implements PropertyChangeListener {
private String oldFileName=null;
class RememberFilenamePropertyListener implements PropertyChangeListener {
private String oldFileName=null; @Override
public void propertyChange(PropertyChangeEvent event){
@Override if( JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(event.getPropertyName())){
public void propertyChange(PropertyChangeEvent event){ if(null != event.getOldValue()){
if( JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(event.getPropertyName())){ this.oldFileName = ((File)event.getOldValue()).getName();
if(null != event.getOldValue()){ }
this.oldFileName = ((File)event.getOldValue()).getName(); }else if(JFileChooser.FILE_FILTER_CHANGED_PROPERTY.equals(event.getPropertyName())) {
} JFileChooser chooser = (JFileChooser)event.getSource();
}else if(JFileChooser.FILE_FILTER_CHANGED_PROPERTY.equals(event.getPropertyName())) { if( chooser.getFileFilter() instanceof SimpleFileFilter) {
JFileChooser chooser = (JFileChooser)event.getSource(); SimpleFileFilter filter = (SimpleFileFilter) (chooser.getFileFilter());
if( chooser.getFileFilter() instanceof SimpleFileFilter) { String desiredExtension = filter.getExtensions()[0];
SimpleFileFilter filter = (SimpleFileFilter) (chooser.getFileFilter());
String desiredExtension = filter.getExtensions()[0]; if (null == this.oldFileName) {
return;
if (null == this.oldFileName) { }
return; String thisFileName = this.oldFileName;
}
String thisFileName = this.oldFileName; if (filter.accept(new File(thisFileName))) {
// nop
if (filter.accept(new File(thisFileName))) { return;
// nop } else {
return; String[] splitResults = thisFileName.split("\\.");
} else { if (0 < splitResults.length) {
String[] splitResults = thisFileName.split("\\."); thisFileName = splitResults[0];
if (0 < splitResults.length) { }
thisFileName = splitResults[0]; chooser.setSelectedFile(new File(thisFileName + desiredExtension));
} return;
chooser.setSelectedFile(new File(thisFileName + desiredExtension)); }
return; }
} }
} }
}
} }
}

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;
}
}