From 3e2aec6e3e25106fed8f3d78445bf2c4639e923a Mon Sep 17 00:00:00 2001 From: SiboVG Date: Fri, 31 Mar 2023 18:01:25 +0200 Subject: [PATCH] WIP --- core/resources/l10n/messages.properties | 13 +++- core/resources/l10n/messages_ar.properties | 4 +- core/resources/l10n/messages_nl.properties | 4 +- .../preferences/GeneralPreferencesPanel.java | 47 ++++++++++++-- .../preferences/PreferencesDialog.java | 8 +++ .../sf/openrocket/gui/util/FileHelper.java | 4 ++ .../gui/util/PreferencesExporter.java | 61 +++++++++++++++++++ .../gui/util/PreferencesImporter.java | 48 +++++++++++++++ .../openrocket/gui/util/SwingPreferences.java | 4 ++ 9 files changed, 181 insertions(+), 12 deletions(-) create mode 100644 swing/src/net/sf/openrocket/gui/util/PreferencesExporter.java create mode 100644 swing/src/net/sf/openrocket/gui/util/PreferencesImporter.java diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 88290ee6d..aa902f8f4 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -122,6 +122,7 @@ FileHelper.RASAERO_DESIGN_FILTER = RASAero designs (*.CDX1) FileHelper.OPEN_ROCKET_COMPONENT_FILTER = OpenRocket presets (*.orc) FileHelper.PNG_FILTER = PNG image (*.png) FileHelper.IMAGES = Image files +FileHelper.XML_FILTER = XML files (*.xml) ! About Dialog @@ -290,8 +291,12 @@ pref.dlg.tab.Simulation = Simulation pref.dlg.tab.Launch = Launch pref.dlg.tab.Miscellaneousoptions = Miscellaneous options pref.dlg.lbl.RockSimWarning = Show warning when saving in RockSim format -pref.dlg.but.clearCachedPreferences = Reset all preferences -pref.dlg.but.clearCachedPreferences.ttip = Reset all the preferences, including cached preferences (UI settings, recent files, etc.) +pref.dlg.but.resetAllPreferences = Reset all preferences +pref.dlg.but.resetAllPreferences.ttip = Reset all the preferences, including cached preferences (UI settings, recent files, etc.) +pref.dlg.but.exportPreferences = Export preferences +pref.dlg.but.exportPreferences.ttip = Export all your OpenRocket preferences to an external file +pref.dlg.but.importPreferences = Import preferences +pref.dlg.but.importPreferences.ttip = Import new OpenRocket preferences from an external file pref.dlg.clearCachedPreferences.title = Reset preferences? pref.dlg.clearCachedPreferences.message = Are you sure you want to reset all your preferences? @@ -372,6 +377,10 @@ generalprefs.lbl.language = Interface language generalprefs.languages.default = System default generalprefs.lbl.languageEffect = The language will change the next time you start OpenRocket. +PreferencesExporter.chooser.title = Export the Preferences File + +PreferencesImporter.chooser.title = Import a Preferences File + ! Welcome dialog welcome.dlg.title = Welcome to OpenRocket welcome.dlg.lbl.thankYou = Thank you for downloading OpenRocket diff --git a/core/resources/l10n/messages_ar.properties b/core/resources/l10n/messages_ar.properties index 5db732751..96b45e6ab 100644 --- a/core/resources/l10n/messages_ar.properties +++ b/core/resources/l10n/messages_ar.properties @@ -276,8 +276,8 @@ pref.dlg.tab.Simulation = محاكاة pref.dlg.tab.Launch = إطلاق pref.dlg.tab.Miscellaneousoptions = الخيارات المتنوعة pref.dlg.lbl.RockSimWarning = إظهار تحذير عند الحفظ بتنسيق روكسيم -pref.dlg.but.clearCachedPreferences = إعادة تعيين كل التفضيلات -pref.dlg.but.clearCachedPreferences.ttip = (إعدادات واجهة المستخدم والملفات الحديثة وما إلى ذلك)إعادة تعيين جميع التفضيلات ، بما في ذلك التفضيلات المخزنة مؤقتًا +pref.dlg.but.resetAllPreferences = إعادة تعيين كل التفضيلات +pref.dlg.but.resetAllPreferences.ttip = (إعدادات واجهة المستخدم والملفات الحديثة وما إلى ذلك)إعادة تعيين جميع التفضيلات ، بما في ذلك التفضيلات المخزنة مؤقتًا pref.dlg.clearCachedPreferences.title = هل تريد إعادة تعيين التفضيلات؟ pref.dlg.clearCachedPreferences.message = هل أنت متأكد أنك تريد إعادة تعيين كل تفضيلاتك؟ diff --git a/core/resources/l10n/messages_nl.properties b/core/resources/l10n/messages_nl.properties index a2de9a92c..cf6f94ddd 100644 --- a/core/resources/l10n/messages_nl.properties +++ b/core/resources/l10n/messages_nl.properties @@ -277,8 +277,8 @@ pref.dlg.tab.Simulation = Simulatie pref.dlg.tab.Launch = Lanceer pref.dlg.tab.Miscellaneousoptions = Diverse opties pref.dlg.lbl.RockSimWarning = Toon waarschuwingen bij opslaan in RockSim-formaat -pref.dlg.but.clearCachedPreferences = Alle voorkeuren opnieuw instellen -pref.dlg.but.clearCachedPreferences.ttip = Alle voorkeuren opnieuw instellen, inclusief voorkeuren in de cache (UI-instellingen, recente bestanden, enz.) +pref.dlg.but.resetAllPreferences = Alle voorkeuren opnieuw instellen +pref.dlg.but.resetAllPreferences.ttip = Alle voorkeuren opnieuw instellen, inclusief voorkeuren in de cache (UI-instellingen, recente bestanden, enz.) pref.dlg.clearCachedPreferences.title = Voorkeuren opnieuw instellen? pref.dlg.clearCachedPreferences.message = Bent u zeker dat u al uw voorkeuren opnieuw wilt instellen? diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/GeneralPreferencesPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/GeneralPreferencesPanel.java index de73270f9..cd2be571d 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/GeneralPreferencesPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/GeneralPreferencesPanel.java @@ -19,6 +19,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JTextField; +import javax.swing.SwingUtilities; import javax.swing.Timer; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; @@ -35,6 +36,8 @@ import net.sf.openrocket.gui.dialogs.UpdateInfoDialog; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.gui.util.SimpleFileFilter; import net.sf.openrocket.gui.util.SwingPreferences; +import net.sf.openrocket.gui.util.PreferencesExporter; +import net.sf.openrocket.gui.util.PreferencesImporter; import net.sf.openrocket.l10n.L10N; import net.sf.openrocket.logging.Markers; import net.sf.openrocket.startup.Preferences; @@ -46,7 +49,7 @@ import net.sf.openrocket.gui.widgets.SelectColorButton; @SuppressWarnings("serial") public class GeneralPreferencesPanel extends PreferencesPanel { - public GeneralPreferencesPanel(JDialog parent) { + public GeneralPreferencesPanel(PreferencesDialog parent) { super(parent, new MigLayout("fillx, ins 30lp n n n")); @@ -240,10 +243,41 @@ public class GeneralPreferencesPanel extends PreferencesPanel { }); this.add(rocksimWarningDialogBox,"spanx, wrap"); - //// Clear cached preferences - final JButton clearCachedPreferences = new SelectColorButton(trans.get("pref.dlg.but.clearCachedPreferences")); - clearCachedPreferences.setToolTipText(trans.get("pref.dlg.but.clearCachedPreferences.ttip")); - clearCachedPreferences.addActionListener(new ActionListener() { + // Preference buttons + JPanel buttonPanel = new JPanel(new MigLayout("fillx, ins 0")); + + //// Export preferences + final JButton exportPreferences = new SelectColorButton(trans.get("pref.dlg.but.exportPreferences")); + exportPreferences.setToolTipText(trans.get("pref.dlg.but.exportPreferences.ttip")); + exportPreferences.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + PreferencesExporter.exportPreferences(parent, preferences.getPreferences()); + } + }); + buttonPanel.add(exportPreferences); + + //// Import preferences + final JButton importPreferences = new SelectColorButton(trans.get("pref.dlg.but.importPreferences")); + importPreferences.setToolTipText(trans.get("pref.dlg.but.importPreferences.ttip")); + importPreferences.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + PreferencesImporter.importPreferences(parent); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + PreferencesDialog.showPreferences(parent.getParentFrame()); // Refresh the preferences dialog + } + }); + } + }); + buttonPanel.add(importPreferences); + + //// Reset all preferences + final JButton resetAllPreferences = new SelectColorButton(trans.get("pref.dlg.but.resetAllPreferences")); + resetAllPreferences.setToolTipText(trans.get("pref.dlg.but.resetAllPreferences.ttip")); + resetAllPreferences.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int resultYesNo = JOptionPane.showConfirmDialog(parent, trans.get("pref.dlg.clearCachedPreferences.message"), @@ -253,8 +287,9 @@ public class GeneralPreferencesPanel extends PreferencesPanel { } } }); - this.add(clearCachedPreferences, "spanx, pushy, bottom, wrap"); + buttonPanel.add(resetAllPreferences, "pushx, right, wrap"); + this.add(buttonPanel, "spanx, growx, pushy, bottom, wrap"); } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/PreferencesDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/PreferencesDialog.java index 6a438e3d2..5b1065f9b 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/PreferencesDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/PreferencesDialog.java @@ -33,11 +33,15 @@ public class PreferencesDialog extends JDialog { private final SwingPreferences preferences = (SwingPreferences) Application .getPreferences(); + private BasicFrame parentFrame; + private PreferencesDialog(BasicFrame parent) { // // Preferences super(parent, trans.get("pref.dlg.title.Preferences"), Dialog.ModalityType.APPLICATION_MODAL); + this.parentFrame = parent; + JPanel panel = new JPanel(new MigLayout("fill, gap unrel", "[grow]", "[grow][]")); @@ -104,6 +108,10 @@ public class PreferencesDialog extends JDialog { GUIUtil.setDisposableDialogOptions(this, close); } + public BasicFrame getParentFrame() { + return parentFrame; + } + // ////// Singleton implementation //////// private static PreferencesDialog dialog = null; diff --git a/swing/src/net/sf/openrocket/gui/util/FileHelper.java b/swing/src/net/sf/openrocket/gui/util/FileHelper.java index 9ea309450..c2bc914d6 100644 --- a/swing/src/net/sf/openrocket/gui/util/FileHelper.java +++ b/swing/src/net/sf/openrocket/gui/util/FileHelper.java @@ -64,6 +64,10 @@ public final class FileHelper { public static final FileFilter PNG_FILTER = new SimpleFileFilter(trans.get("FileHelper.PNG_FILTER"), ".png"); + /** File filter for XML files (*.xml) */ + public static final FileFilter XML_FILTER = + new SimpleFileFilter(trans.get("FileHelper.XML_FILTER"), ".xml"); + diff --git a/swing/src/net/sf/openrocket/gui/util/PreferencesExporter.java b/swing/src/net/sf/openrocket/gui/util/PreferencesExporter.java new file mode 100644 index 000000000..02564fafb --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/util/PreferencesExporter.java @@ -0,0 +1,61 @@ +package net.sf.openrocket.gui.util; + +import net.sf.openrocket.gui.widgets.SaveFileChooser; +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.startup.Application; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.swing.JFileChooser; +import java.awt.Window; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.prefs.BackingStoreException; +import java.util.prefs.Preferences; + +public abstract class PreferencesExporter { + private static final Translator trans = Application.getTranslator(); + private static final Logger log = LoggerFactory.getLogger(PreferencesExporter.class); + + public static boolean exportPreferences(Window parent, Preferences preferences) { + JFileChooser chooser = new SaveFileChooser(); + chooser.setDialogTitle(trans.get("PreferencesExporter.chooser.title")); + chooser.setAcceptAllFileFilterUsed(false); + chooser.setFileFilter(FileHelper.XML_FILTER); + chooser.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory()); + + + // TODO: add storageoptions to choose whether to export user directories or not (default to not) + + + //// Ensures No Problems When Choosing File + if (chooser.showSaveDialog(parent) != JFileChooser.APPROVE_OPTION) { + log.info("Cancelled export of preferences."); + return false; + } + + ((SwingPreferences) Application.getPreferences()).setDefaultDirectory(chooser.getCurrentDirectory()); + + File file = chooser.getSelectedFile(); + if (file == null) { + log.info("No file selected to export preferences to."); + return false; + } + + file = FileHelper.forceExtension(file, "xml"); + if (!FileHelper.confirmWrite(file, parent)) { + log.info("Cancelled export of preferences."); + return false; + } + + try (FileOutputStream fos = new FileOutputStream(file)) { + preferences.exportSubtree(fos); + log.info("Preferences exported successfully."); + } catch (IOException | BackingStoreException e) { + log.warn("Error while importing preferences: " + e.getMessage()); + } + + return true; + } +} diff --git a/swing/src/net/sf/openrocket/gui/util/PreferencesImporter.java b/swing/src/net/sf/openrocket/gui/util/PreferencesImporter.java new file mode 100644 index 000000000..7b3aba43f --- /dev/null +++ b/swing/src/net/sf/openrocket/gui/util/PreferencesImporter.java @@ -0,0 +1,48 @@ +package net.sf.openrocket.gui.util; + +import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.startup.Application; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.swing.JFileChooser; +import java.awt.Window; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.prefs.InvalidPreferencesFormatException; +import java.util.prefs.Preferences; + +public abstract class PreferencesImporter { + private static final Translator trans = Application.getTranslator(); + private static final Logger log = LoggerFactory.getLogger(PreferencesImporter.class); + + public static boolean importPreferences(Window parent) { + final JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(trans.get("PreferencesImporter.chooser.title")); + chooser.setCurrentDirectory(((SwingPreferences) Application.getPreferences()).getDefaultDirectory()); + chooser.setFileFilter(FileHelper.XML_FILTER); + chooser.setAcceptAllFileFilterUsed(false); + + int returnVal = chooser.showOpenDialog(parent); + if (returnVal != JFileChooser.APPROVE_OPTION) { + log.info("Cancelled import of preferences."); + return false; + } + + ((SwingPreferences) Application.getPreferences()).setDefaultDirectory(chooser.getCurrentDirectory()); + + File importFile = chooser.getSelectedFile(); + try (FileInputStream fis = new FileInputStream(importFile)) { + + // TODO: don't import user directories? + + Preferences.importPreferences(fis); + log.info("Preferences imported successfully."); + } catch (IOException | InvalidPreferencesFormatException e) { + log.warn("Error while importing preferences: " + e.getMessage()); + } + + return true; + } +} diff --git a/swing/src/net/sf/openrocket/gui/util/SwingPreferences.java b/swing/src/net/sf/openrocket/gui/util/SwingPreferences.java index bf30f6c39..9ac18081f 100644 --- a/swing/src/net/sf/openrocket/gui/util/SwingPreferences.java +++ b/swing/src/net/sf/openrocket/gui/util/SwingPreferences.java @@ -92,6 +92,10 @@ public class SwingPreferences extends net.sf.openrocket.startup.Preferences { ////////////////////// + + public Preferences getPreferences() { + return PREFNODE; + } public void clearPreferences() { try {