[#2131] Throw warning message when design filename contains illegal characters
This commit is contained in:
parent
f4f6200662
commit
e1c86f6a74
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
45
swing/src/net/sf/openrocket/gui/widgets/SaveFileChooser.java
Normal file
45
swing/src/net/sf/openrocket/gui/widgets/SaveFileChooser.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user