diff --git a/core/src/net/sf/openrocket/file/RocketSaver.java b/core/src/net/sf/openrocket/file/RocketSaver.java index 91c3d6b60..30b13cd62 100644 --- a/core/src/net/sf/openrocket/file/RocketSaver.java +++ b/core/src/net/sf/openrocket/file/RocketSaver.java @@ -9,6 +9,17 @@ import net.sf.openrocket.document.StorageOptions; public abstract class RocketSaver { + /** + * Save the document to the specified output stream using the default storage options. + * + * @param dest the destination stream. + * @param doc the document to save. + * @throws IOException in case of an I/O error. + */ + public final void save(OutputStream dest, OpenRocketDocument doc) throws IOException { + save(dest, doc, doc.getDefaultStorageOptions()); + } + /** * Save the document to the specified output stream using the given storage options. * @@ -17,8 +28,7 @@ public abstract class RocketSaver { * @param options the storage options. * @throws IOException in case of an I/O error. */ - public abstract void save(OutputStream dest, OpenRocketDocument doc, - StorageOptions options) throws IOException; + public abstract void save(OutputStream dest, OpenRocketDocument doc, StorageOptions options) throws IOException; /** * Provide an estimate of the file size when saving the document with the diff --git a/core/src/net/sf/openrocket/gui/main/BasicFrame.java b/core/src/net/sf/openrocket/gui/main/BasicFrame.java index 8ac0c895a..a845a7724 100644 --- a/core/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/core/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -1082,27 +1082,50 @@ public class BasicFrame extends JFrame { * @return true if opened successfully. */ private static boolean open(URL url, BasicFrame parent) { - String filename = null; + String displayName = null; - if ( filename == null ) { - filename = ""; + // First figure out the file name from the URL + + // Try using URI.getPath(); + try { + URI uri = url.toURI(); + displayName = uri.getPath(); + } catch (URISyntaxException ignore) { + } + + // Try URL-decoding the URL + if (displayName == null) { + try { + displayName = URLDecoder.decode(url.toString(), "UTF-8"); + } catch (UnsupportedEncodingException ignore) { + } + } + + if ( displayName == null ) { + displayName = ""; } // Remove path from filename - if (filename.lastIndexOf('/') >= 0) { - filename = filename.substring(filename.lastIndexOf('/') + 1); + if (displayName.lastIndexOf('/') >= 0) { + displayName = displayName.substring(displayName.lastIndexOf('/') + 1); } // Open the file - log.info("Opening file from url=" + url + " filename=" + filename); + log.info("Opening file from url=" + url + " filename=" + displayName); try { InputStream is = url.openStream(); - open(is, filename, url, parent); + if (open(is, displayName, url, parent)) { + // Close previous window if replacing + if (parent.replaceable && parent.document.isSaved()) { + parent.closeAction(); + parent.replaceable = false; + } + } } catch (IOException e) { log.warn("Error opening file" + e); JOptionPane.showMessageDialog(parent, - "An error occurred while opening the file " + filename, + "An error occurred while opening the file " + displayName, "Error loading file", JOptionPane.ERROR_MESSAGE); } @@ -1115,13 +1138,13 @@ public class BasicFrame extends JFrame { * occurs, an error dialog is shown and false is returned. * * @param stream the stream to load from. - * @param filename the file name to display in dialogs (not set to the document). + * @param displayName the file name to display in dialogs (not set to the document). * @param parent the parent component for which a progress dialog is opened. * @return whether the file was successfully loaded and opened. */ - private static boolean open(InputStream stream, String filename, URL fileURL, Window parent) { + private static boolean open(InputStream stream, String displayName, URL fileURL, Window parent) { OpenFileWorker worker = new OpenFileWorker(stream, fileURL, ROCKET_LOADER); - return open(worker, filename, null, parent); + return open(worker, displayName, parent); } @@ -1135,7 +1158,7 @@ public class BasicFrame extends JFrame { */ public static boolean open(File file, Window parent) { OpenFileWorker worker = new OpenFileWorker(file, ROCKET_LOADER); - return open(worker, file.getName(), file, parent); + return open(worker, file.getName(), parent); } @@ -1143,18 +1166,18 @@ public class BasicFrame extends JFrame { * Open the specified file using the provided worker. * * @param worker the OpenFileWorker that loads the file. - * @param filename the file name to display in dialogs. + * @param displayName the file name to display in dialogs. * @param file the File to set the document to (may be null). * @param parent * @return */ - private static boolean open(OpenFileWorker worker, String filename, File file, Window parent) { + private static boolean open(OpenFileWorker worker, String displayName, Window parent) { MotorDatabaseLoadingDialog.check(parent); // Open the file in a Swing worker thread log.info("Starting OpenFileWorker"); - if (!SwingWorkerDialog.runWorker(parent, "Opening file", "Reading " + filename + "...", worker)) { + if (!SwingWorkerDialog.runWorker(parent, "Opening file", "Reading " + displayName + "...", worker)) { // User cancelled the operation log.info("User cancelled the OpenFileWorker"); return false; @@ -1175,7 +1198,7 @@ public class BasicFrame extends JFrame { log.warn("File not found", cause); JOptionPane.showMessageDialog(parent, - "File not found: " + filename, + "File not found: " + displayName, "Error opening file", JOptionPane.ERROR_MESSAGE); return false; @@ -1183,7 +1206,7 @@ public class BasicFrame extends JFrame { log.warn("Error loading the file", cause); JOptionPane.showMessageDialog(parent, - "Unable to open file '" + filename + "': " + "Unable to open file '" + displayName + "': " + cause.getMessage(), "Error opening file", JOptionPane.ERROR_MESSAGE); return false; @@ -1209,21 +1232,15 @@ public class BasicFrame extends JFrame { log.info("Warnings while reading file: " + warnings); WarningDialog.showWarnings(parent, new Object[] { - //// The following problems were encountered while opening - trans.get("BasicFrame.WarningDialog.txt1") + " " + filename + ".", - //// Some design features may not have been loaded correctly. - trans.get("BasicFrame.WarningDialog.txt2") - }, - //// Warnings while opening file - trans.get("BasicFrame.WarningDialog.title"), warnings); + //// The following problems were encountered while opening + trans.get("BasicFrame.WarningDialog.txt1") + " " + displayName + ".", + //// Some design features may not have been loaded correctly. + trans.get("BasicFrame.WarningDialog.txt2") + }, + //// Warnings while opening file + trans.get("BasicFrame.WarningDialog.title"), warnings); } - - // Set document state - doc.setFile(file); - doc.setSaved(true); - - // Open the frame log.debug("Opening new frame with the document"); BasicFrame frame = new BasicFrame(doc); diff --git a/core/src/net/sf/openrocket/gui/util/OpenFileWorker.java b/core/src/net/sf/openrocket/gui/util/OpenFileWorker.java index 841bc9dff..98ee971bd 100644 --- a/core/src/net/sf/openrocket/gui/util/OpenFileWorker.java +++ b/core/src/net/sf/openrocket/gui/util/OpenFileWorker.java @@ -75,7 +75,13 @@ public class OpenFileWorker extends SwingWorker { is = new ProgressInputStream(is); try { - return loader.load(is, fileInfo, new DatabaseMotorFinder()); + OpenRocketDocument document = loader.load(is, fileInfo, new DatabaseMotorFinder()); + + // Set document state + document.setFile(file); + document.setSaved(true); + + return document; } finally { try { is.close();