DGP - Changes to file filtering, extensions, etc. for Save and Save As.

This commit is contained in:
Doug Pedrick 2012-01-11 04:50:37 +00:00
parent c44c29f635
commit 46ee5f943e
3 changed files with 103 additions and 70 deletions

View File

@ -17,8 +17,6 @@ public class ParachuteDTO extends BasePartDTO {
@XmlElement(name = RocksimCommonConstants.DIAMETER)
private double dia = 0d;
@XmlElement(name = RocksimCommonConstants.SPILL_HOLE_DIA)
private double spillHoleDia = 0d;
@XmlElement(name = RocksimCommonConstants.SHROUD_LINE_COUNT)
private int ShroudLineCount = 0;
@XmlElement(name = RocksimCommonConstants.THICKNESS)
@ -63,14 +61,6 @@ public class ParachuteDTO extends BasePartDTO {
dia = theDia;
}
public double getSpillHoleDia() {
return spillHoleDia;
}
public void setSpillHoleDia(double theSpillHoleDia) {
spillHoleDia = theSpillHoleDia;
}
public int getShroudLineCount() {
return ShroudLineCount;
}

View File

@ -1212,10 +1212,14 @@ public class BasicFrame extends JFrame {
return true;
}
/**
* "Save" action. If the design is new, then this is identical to "Save As", with a default file filter for .ork.
* If the rocket being edited previously was opened from a .ork file, then it will be saved immediately to the same
* file. But clicking on 'Save' for an existing design file with a .rkt will bring up a confirmation dialog because
* it's potentially a destructive write (loss of some fidelity if it's truly an original Rocksim generated file).
*
* @return true if the file was saved, false otherwise
*/
private boolean saveAction() {
File file = document.getFile();
if (file == null) {
@ -1224,42 +1228,45 @@ public class BasicFrame extends JFrame {
}
log.info("Saving document to " + file);
// Saving RockSim designs is not supported
if (FileHelper.ROCKSIM_DESIGN_FILTER.accept(file)) {
file = new File(file.getAbsolutePath().replaceAll(".[rR][kK][tT](.[gG][zZ])?$",
".ork"));
log.info("Attempting to save in RockSim format, renaming to " + file);
int option = JOptionPane.showConfirmDialog(this, new Object[] {
"Saving designs in RockSim format is not supported.",
"Save in OpenRocket format instead (" + file.getName() + ")?"
}, "Save " + file.getName(), JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE, null);
if (option != JOptionPane.YES_OPTION) {
log.user("User chose not to save");
return false;
}
document.setFile(file);
return saveAsRocksim(file);
}
return saveAs(file);
}
/**
* "Save As" action.
*
* Never should a .rkt file contain an OpenRocket content, or an .ork file contain a Rocksim design. Regardless of
* what extension the user has chosen, it would violate the Principle of Least Astonishment to do otherwise
* (and we want to make doing the wrong thing really hard to do). So always force the appropriate extension.
*
* This can result in some odd looking filenames (MyDesign.rkt.ork, MyDesign.rkt.ork.rkt, etc.) if the user is
* not paying attention, but the user can control that by modifying the filename in the dialog.
*
* @return true if the file was saved, false otherwise
*/
private boolean saveAsAction() {
File file = null;
// TODO: HIGH: what if *.rkt chosen?
StorageOptionChooser storageChooser =
new StorageOptionChooser(document, document.getDefaultStorageOptions());
JFileChooser chooser = new JFileChooser();
final JFileChooser chooser = new JFileChooser();
chooser.addChoosableFileFilter(FileHelper.OPENROCKET_DESIGN_FILTER);
chooser.addChoosableFileFilter(FileHelper.ROCKSIM_DESIGN_FILTER);
//Force the file filter to match the file extension that was opened. Will default to OR if the file is null.
if (FileHelper.ROCKSIM_DESIGN_FILTER.accept(document.getFile())) {
chooser.setFileFilter(FileHelper.ROCKSIM_DESIGN_FILTER);
}
else {
chooser.setFileFilter(FileHelper.OPENROCKET_DESIGN_FILTER);
}
chooser.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory());
chooser.setAccessory(storageChooser);
if (document.getFile() != null)
if (document.getFile() != null) {
chooser.setSelectedFile(document.getFile());
}
int option = chooser.showSaveDialog(BasicFrame.this);
if (option != JFileChooser.APPROVE_OPTION) {
@ -1276,16 +1283,24 @@ public class BasicFrame extends JFrame {
((SwingPreferences) Application.getPreferences()).setDefaultDirectory(chooser.getCurrentDirectory());
storageChooser.storeOptions(document.getDefaultStorageOptions());
if (chooser.getFileFilter().equals(FileHelper.OPENROCKET_DESIGN_FILTER)) {
file = FileHelper.ensureExtension(file, "ork");
if (!FileHelper.confirmWrite(file, this)) {
return false;
if (chooser.getFileFilter().equals(FileHelper.ROCKSIM_DESIGN_FILTER)) {
return saveAsRocksim(file);
}
else {
file = FileHelper.forceExtension(file, "ork");
return FileHelper.confirmWrite(file, this) && saveAs(file);
}
}
return saveAs(file);
}
else if (chooser.getFileFilter().equals(FileHelper.ROCKSIM_DESIGN_FILTER)) {
file = FileHelper.ensureExtension(file, "rkt");
/**
* Perform the writing of the design to the given file in Rocksim format.
*
* @param file the chosen file
*
* @return true if the file was written
*/
private boolean saveAsRocksim(File file) {
file = FileHelper.forceExtension(file, "rkt");
if (!FileHelper.confirmWrite(file, this)) {
return false;
}
@ -1297,11 +1312,14 @@ public class BasicFrame extends JFrame {
return false;
}
}
else {
return false;
}
}
/**
* Perform the writing of the design to the given file in OpenRocket format.
*
* @param file the chosen file
*
* @return true if the file was written
*/
private boolean saveAs(File file) {
log.info("Saving document as " + file);
boolean saved = false;

View File

@ -1,17 +1,16 @@
package net.sf.openrocket.gui.util;
import java.awt.Component;
import java.io.File;
import java.io.IOException;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;
import net.sf.openrocket.l10n.L10N;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.startup.Application;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.io.File;
import java.io.IOException;
/**
* Helper methods related to user-initiated file manipulation.
* <p>
@ -61,7 +60,7 @@ public final class FileHelper {
*
* @param original the original file
* @param extension the extension to append if none exists (without preceding dot)
* @return the resulting filen
* @return the resulting file
*/
public static File ensureExtension(File original, String extension) {
@ -75,6 +74,32 @@ public final class FileHelper {
return original;
}
/**
* Ensure that the provided file has the given file extension. This differs from ensureExtension in that this
* method guarantees that the file will have the extension, whereas ensureExtension only treats the extension
* as a default.
*
* @param original the original file
* @param extension the extension to guarantee (without preceding dot)
* @return the resulting file
*/
public static File forceExtension(File original, String extension) {
if (!original.getName().toLowerCase().endsWith(extension.toLowerCase())) {
log.debug(1, "File name does not contain extension, adding '" + extension + "'");
String name = original.getAbsolutePath();
if (extension.startsWith(".")) {
name = name + extension;
}
else {
name = name + "." + extension;
}
return new File(name);
}
return original;
}
/**
* Confirm that it is allowed to write to a file. If the file exists,