Save document preferences in design file

This commit is contained in:
SiboVG 2024-07-22 00:02:08 +02:00
parent 144efb5610
commit 500c75aeab
8 changed files with 207 additions and 2 deletions

View File

@ -5,6 +5,7 @@ import java.util.*;
import info.openrocket.core.file.wavefrontobj.export.OBJExportOptions;
import info.openrocket.core.preferences.ApplicationPreferences;
import info.openrocket.core.preferences.DocumentPreferences;
import info.openrocket.core.rocketcomponent.*;
import info.openrocket.core.util.StateChangeListener;
import org.slf4j.Logger;
@ -38,6 +39,7 @@ import info.openrocket.core.util.ArrayList;
public class OpenRocketDocument implements ComponentChangeListener, StateChangeListener {
private static final Logger log = LoggerFactory.getLogger(OpenRocketDocument.class);
private static final ApplicationPreferences prefs = Application.getPreferences();
private final DocumentPreferences docPrefs = new DocumentPreferences();
private final List<String> file_extensions = Arrays.asList("ork", "ork.gz", "rkt", "rkt.gz"); // Possible extensions of an OpenRocket document
/**
* The minimum number of undo levels that are stored.
@ -848,6 +850,13 @@ public class OpenRocketDocument implements ComponentChangeListener, StateChangeL
l.documentChanged(event);
}
}
public void fireDocumentSavingEvent(DocumentChangeEvent event) {
DocumentChangeListener[] array = listeners.toArray(new DocumentChangeListener[0]);
for (DocumentChangeListener l : array) {
l.documentSaving(event);
}
}
public String toSimulationDetail(){
StringBuilder str = new StringBuilder();
@ -868,4 +877,8 @@ public class OpenRocketDocument implements ComponentChangeListener, StateChangeL
public void setPhotoSettings(Map<String, String> photoSettings) {
this.photoSettings = photoSettings;
}
public DocumentPreferences getDocumentPreferences() {
return docPrefs;
}
}

View File

@ -2,6 +2,10 @@ package info.openrocket.core.document.events;
public interface DocumentChangeListener {
public void documentChanged(DocumentChangeEvent event);
void documentChanged(DocumentChangeEvent event);
default void documentSaving(DocumentChangeEvent event) {
// Do nothing
}
}

View File

@ -11,6 +11,7 @@ import info.openrocket.core.file.openrocket.savers.PhotoStudioSaver;
import info.openrocket.core.logging.ErrorSet;
import info.openrocket.core.logging.SimulationAbort;
import info.openrocket.core.logging.WarningSet;
import info.openrocket.core.preferences.DocumentPreferences;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -107,6 +108,9 @@ public class OpenRocketSaver extends RocketSaver {
// Save PhotoSettings
savePhotoSettings(document.getPhotoSettings());
// Save document preferences
saveDocumentPreferences(document.getDocumentPreferences());
indent--;
writeln("</openrocket>");
@ -428,6 +432,21 @@ public class OpenRocketSaver extends RocketSaver {
writeln("</photostudio>");
}
private void saveDocumentPreferences(DocumentPreferences docPrefs) throws IOException {
log.debug("Saving Document Preferences");
writeln("<docprefs>");
indent++;
Map<String, DocumentPreferences.DocumentPreference> prefs = docPrefs.getPreferencesMap();
for (Map.Entry<String, DocumentPreferences.DocumentPreference> entry : prefs.entrySet()) {
DocumentPreferences.DocumentPreference pref = entry.getValue();
writeEntry("pref", entry.getKey(), pref.getValue(), true);
}
indent--;
writeln("</docprefs>");
}
/**
* Write an entry element, which has a key and type attribute, and a value, to the output.

View File

@ -0,0 +1,66 @@
package info.openrocket.core.file.openrocket.importt;
import info.openrocket.core.preferences.DocumentPreferences;
import info.openrocket.core.document.OpenRocketDocument;
import info.openrocket.core.file.simplesax.ElementHandler;
import info.openrocket.core.file.simplesax.PlainTextHandler;
import info.openrocket.core.logging.WarningSet;
import org.xml.sax.SAXException;
import java.util.HashMap;
public class DocumentPreferencesHandler extends EntryHandler {
private final OpenRocketDocument document;
public DocumentPreferencesHandler(OpenRocketDocument document) {
this.document = document;
}
@Override
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) throws SAXException {
if (element.equals("pref") && "list".equals(attributes.get("type"))) {
listHandler = new ConfigHandler();
return listHandler;
} else {
return PlainTextHandler.INSTANCE;
}
}
@Override
public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
if (element.equals("pref")) {
String key = attributes.get("key");
String type = attributes.get("type");
Object value = EntryHelper.getValueFromEntry(DocumentPreferencesHandler.this, attributes, content);
if (value == null) {
return;
}
if (key != null) {
addValueToDocumentPreferences(key, value, type);
} else {
list.add(value);
}
} else {
super.closeElement(element, attributes, content, warnings);
}
}
private void addValueToDocumentPreferences(String key, Object value, String type) {
DocumentPreferences docPrefs = document.getDocumentPreferences();
if ("boolean".equals(type)) {
docPrefs.putBoolean(key, (Boolean) value);
} else if ("string".equals(type)) {
docPrefs.putString(key, (String) value);
} else if ("integer".equals(type)) {
docPrefs.putInt(key, (Integer) value);
} else if ("double".equals(type)) {
docPrefs.putDouble(key, (Double) value);
} else if ("number".equals(type)) {
throw new RuntimeException("Number preferences are not supported");
} else if ("list".equals(type)) {
// We don't support nested preferences
throw new RuntimeException("Nested preferences are not supported");
}
}
}

View File

@ -65,7 +65,11 @@ class OpenRocketContentHandler extends AbstractElementHandler {
}
if (element.equals("photostudio")) {
return new PhotoStudioHandler(context.getOpenRocketDocument().getPhotoSettings());
return new PhotoStudioHandler(getDocument().getPhotoSettings());
}
if (element.equals("docprefs")) {
return new DocumentPreferencesHandler(getDocument());
}
warnings.add(Warning.fromString("Unknown element " + element + ", ignoring."));

View File

@ -0,0 +1,97 @@
package info.openrocket.core.preferences;
import info.openrocket.core.util.ChangeSource;
import info.openrocket.core.util.StateChangeListener;
import java.util.HashMap;
import java.util.Map;
/**
* ORPreferences specific to an OpenRocket document (= preferences that are saved in the document file, not
* implemented application-wise).
*
* @author Sibo Van Gool <sibo.vangool@hotmail.com>
*/
public class DocumentPreferences implements ChangeSource, ORPreferences {
// Map that stores all the document preferences
private final Map<String, DocumentPreference> preferencesMap = new HashMap<>();
@Override
public void addChangeListener(StateChangeListener listener) {
}
@Override
public void removeChangeListener(StateChangeListener listener) {
}
@Override
public boolean getBoolean(String key, boolean defaultValue) {
DocumentPreference pref = preferencesMap.get(key);
return preferencesMap.containsKey(key) ? (Boolean) pref.getValue() : defaultValue;
}
@Override
public void putBoolean(String key, boolean value) {
preferencesMap.put(key, new DocumentPreference(value));
}
@Override
public int getInt(String key, int defaultValue) {
DocumentPreference pref = preferencesMap.get(key);
return preferencesMap.containsKey(key) ? (Integer) pref.getValue() : defaultValue;
}
@Override
public void putInt(String key, int value) {
preferencesMap.put(key, new DocumentPreference(value));
}
@Override
public double getDouble(String key, double defaultValue) {
DocumentPreference pref = preferencesMap.get(key);
return preferencesMap.containsKey(key) ? (Double) pref.getValue() : defaultValue;
}
@Override
public void putDouble(String key, double value) {
preferencesMap.put(key, new DocumentPreference(value));
}
@Override
public String getString(String key, String defaultValue) {
DocumentPreference pref = preferencesMap.get(key);
return preferencesMap.containsKey(key) ? (String) pref.getValue() : defaultValue;
}
@Override
public void putString(String key, String value) {
preferencesMap.put(key, new DocumentPreference(value));
}
/**
* Returns the map that stores all the document preferences key-value pairs.
* @return The document preferences map
*/
public Map<String, DocumentPreference> getPreferencesMap() {
return preferencesMap;
}
public static class DocumentPreference {
private final Object value;
private final Class<?> type;
public DocumentPreference(Object value) {
this.value = value;
this.type = value.getClass();
}
public Object getValue() {
return value;
}
public Class<?> getType() {
return type;
}
}
}

View File

@ -69,3 +69,4 @@ The following file format versions exist:
1.10: Introduced with OpenRocket 24.XX.
Added a priority attribute to simulation warnings.
Added document preferences (<docprefs>).

View File

@ -1388,6 +1388,7 @@ public class BasicFrame extends JFrame {
* @return true if the file was saved, false otherwise
*/
private boolean saveAction() {
document.fireDocumentSavingEvent(new DocumentChangeEvent(this));
File file = document.getFile();
if (file == null || document.getDefaultStorageOptions().getFileType().equals(FileType.ROCKSIM)
|| document.getDefaultStorageOptions().getFileType().equals(FileType.RASAERO)) {