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