diff --git a/swing/src/net/sf/openrocket/gui/main/SaveAsFileChooser.java b/swing/src/net/sf/openrocket/gui/main/SaveAsFileChooser.java new file mode 100644 index 000000000..80bffaaf7 --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/main/SaveAsFileChooser.java @@ -0,0 +1,113 @@ +package net.sf.openrocket.gui.main; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.File; + +import javax.swing.JFileChooser; + +import net.sf.openrocket.document.OpenRocketDocument; +import net.sf.openrocket.document.StorageOptions; +import net.sf.openrocket.document.StorageOptions.FileType; +import net.sf.openrocket.gui.util.FileHelper; +import net.sf.openrocket.gui.util.SimpleFileFilter; +import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.startup.Application; + +public class SaveAsFileChooser extends JFileChooser { + + private final FileType type; + private final OpenRocketDocument document; + private final StorageOptionChooser storageChooser; + + private static final Translator trans = Application.getTranslator(); + + public static SaveAsFileChooser build( OpenRocketDocument document, FileType type ) { + return new SaveAsFileChooser(document,type); + } + + private SaveAsFileChooser( OpenRocketDocument document, FileType type ) { + this.document = document; + this.type = type; + + this.setAcceptAllFileFilterUsed(true); + + File defaultFilename = document.getFile(); + + switch( type ) { + default: + case OPENROCKET: + defaultFilename = FileHelper.forceExtension(defaultFilename,"ork"); + this.setDialogTitle(trans.get("saveAs.openrocket.title")); + storageChooser = new StorageOptionChooser(document, document.getDefaultStorageOptions()); + this.setAccessory(storageChooser); + this.addChoosableFileFilter(FileHelper.OPENROCKET_DESIGN_FILTER); + this.setFileFilter(FileHelper.OPENROCKET_DESIGN_FILTER); + break; + case ROCKSIM: + defaultFilename = FileHelper.forceExtension(defaultFilename,"rkt"); + this.setDialogTitle(trans.get("saveAs.rocksim.title")); + storageChooser = null; + this.addChoosableFileFilter(FileHelper.ROCKSIM_DESIGN_FILTER); + this.setFileFilter(FileHelper.ROCKSIM_DESIGN_FILTER); + break; + } + + final RememberFilenamePropertyListener listner = new RememberFilenamePropertyListener(); + this.addPropertyChangeListener(JFileChooser.FILE_FILTER_CHANGED_PROPERTY, listner); + this.addPropertyChangeListener(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY, listner); + this.addPropertyChangeListener(JFileChooser.SELECTED_FILES_CHANGED_PROPERTY, listner); + + this.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory()); + + if (defaultFilename != null) { + this.setSelectedFile(defaultFilename); + } + } + + public void storeOptions(StorageOptions opts) { + if ( storageChooser != null ) { + storageChooser.storeOptions(opts); + } + } + +} + +class RememberFilenamePropertyListener implements PropertyChangeListener { + private String oldFileName=null; + + @Override + public void propertyChange(PropertyChangeEvent event){ + if( JFileChooser.SELECTED_FILE_CHANGED_PROPERTY == event.getPropertyName()){ + if(null != event.getOldValue()){ + this.oldFileName = ((File)event.getOldValue()).getName(); + } + return; + }else if(JFileChooser.FILE_FILTER_CHANGED_PROPERTY == event.getPropertyName()){ + JFileChooser chooser = (JFileChooser)event.getSource(); + SimpleFileFilter filter = (SimpleFileFilter)(chooser.getFileFilter()); + String desiredExtension = filter.getExtensions()[0]; + + if( null == this.oldFileName){ + return; + } + String thisFileName = this.oldFileName; + + if ( filter.accept( new File(thisFileName))){ + // nop + return; + }else{ + String[] splitResults = thisFileName.split("\\."); + if(0 < splitResults.length){ + thisFileName = splitResults[0]; + } + chooser.setSelectedFile(new File( thisFileName+desiredExtension)); + return; + } + } + } + +} + +