From 3ad331a1a95273625d88268ed7bc12c17cfcfee4 Mon Sep 17 00:00:00 2001 From: kruland2607 Date: Wed, 4 Apr 2012 21:29:33 +0000 Subject: [PATCH] Implement persistence of ComponentPreset favorites to preferences. Implement favorite check box in ComponentPresetChooserDialog. Added getPresetType to RocketComponent which returns the ComponentPreset.Type of the most compatible presets. git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@516 180e2498-e6e9-4542-8430-84ac67f01cd8 --- core/resources/l10n/messages.properties | 1 + .../database/ComponentPresetDao.java | 93 ++++++++++++++++++- .../sf/openrocket/gui/adaptors/Column.java | 11 +++ .../gui/adaptors/ColumnTableModel.java | 5 + .../openrocket/gui/adaptors/PresetModel.java | 3 +- .../preset/ComponentPresetChooserDialog.java | 28 +++++- .../openrocket/gui/util/SwingPreferences.java | 20 ++++ .../sf/openrocket/preset/ComponentPreset.java | 39 +++++++- .../openrocket/rocketcomponent/BodyTube.java | 5 + .../rocketcomponent/RocketComponent.java | 10 ++ .../sf/openrocket/startup/Preferences.java | 4 + 11 files changed, 206 insertions(+), 13 deletions(-) diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 876dcdbb..471e5d08 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -1595,4 +1595,5 @@ table.column.PartNo = Part Number table.column.OuterDiameter = Outer Diameter table.column.InnerDiameter = Inner Diameter table.column.Length = Length +table.column.Favorite = Favorite diff --git a/core/src/net/sf/openrocket/database/ComponentPresetDao.java b/core/src/net/sf/openrocket/database/ComponentPresetDao.java index 0cbdb1b5..fca47d17 100644 --- a/core/src/net/sf/openrocket/database/ComponentPresetDao.java +++ b/core/src/net/sf/openrocket/database/ComponentPresetDao.java @@ -3,43 +3,126 @@ package net.sf.openrocket.database; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Set; import net.sf.openrocket.file.preset.PresetCSVReader; import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.InvalidComponentPresetException; import net.sf.openrocket.preset.TypedPropertyMap; +import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.BugException; public class ComponentPresetDao { + // List of all ComponentPresets private final List templates = new ArrayList(); // Package scope constructor to control creation pattern. public ComponentPresetDao() {} - + public void initialize() throws IOException { + + Set favorites = Application.getPreferences().getComponentFavorites(); InputStream is = ComponentPresetDao.class.getResourceAsStream("/datafiles/bodytubepresets.csv"); - + PresetCSVReader parser = new PresetCSVReader(is); List list = parser.parse(); for( TypedPropertyMap o : list ) { try { ComponentPreset preset = ComponentPreset.create(o); + if ( favorites.contains(preset.preferenceKey())) { + preset.setFavorite(true); + } this.insert(preset); } catch ( InvalidComponentPresetException ex ) { throw new BugException( ex ); } } + + } - + public List listAll() { return templates; } - + public void insert( ComponentPreset preset ) { templates.add(preset); } + + public List listForType( ComponentPreset.Type type ) { + if ( type == null ) { + return Collections.emptyList(); + } + + List result = new ArrayList(templates.size()/6); + + for( ComponentPreset preset : templates ) { + if ( preset.get(ComponentPreset.TYPE).equals(type) ) { + result.add(preset); + } + } + return result; + + } + + /** + * Return a list of component presets based on the type. + * All components returned will be of Type type. + * + * @param type + * @param favorite if true, only return the favorites. otherwise return all matching. + * @return + */ + public List listForType( ComponentPreset.Type type, boolean favorite ) { + + if ( !favorite ) { + return listForType(type); + } + + List result = new ArrayList(templates.size()/6); + + for( ComponentPreset preset : templates ) { + if ( preset.isFavorite() && preset.get(ComponentPreset.TYPE).equals(type) ) { + result.add(preset); + } + } + return result; + + + } + + public List listForTypes( ComponentPreset.Type ... type ) { + + if( type == null || type.length == 0 ) { + return Collections.emptyList(); + } + + if (type.length == 1 ) { + return listForType(type[0]); + } + + List result = new ArrayList(templates.size()/6); + + for( ComponentPreset preset : templates ) { + ComponentPreset.Type presetType = preset.get(ComponentPreset.TYPE); + typeLoop: for( int i=0; i presets; public PresetModel(RocketComponent component) { - // FIXME: This should load only the user's favorites, NOT all presets - presets = Application.getComponentPresetDao().listAll(); + presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true); this.component = component; previousPreset = component.getPresetComponent(); component.addComponentChangeListener(this); diff --git a/core/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java b/core/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java index 8b7b4235..068243b6 100644 --- a/core/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java +++ b/core/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java @@ -48,11 +48,28 @@ public class ComponentPresetChooserDialog extends JDialog { JPanel panel = new JPanel(new MigLayout("fill")); - final Column[] columns = new Column[columnKeys.length]; + final Column[] columns = new Column[columnKeys.length+1]; + columns[0] = new Column(trans.get("table.column.Favorite") ) { + @Override + public Object getValueAt(int row) { + return Boolean.valueOf(ComponentPresetChooserDialog.this.presets.get(row).isFavorite()); + } + + @Override + public void setValueAt(int row, Object value) { + Application.getComponentPresetDao().setFavorite(ComponentPresetChooserDialog.this.presets.get(row), (Boolean) value); + } + + @Override + public Class getColumnClass() { + return Boolean.class; + } + + }; for (int i = 0; i < columnKeys.length; i++) { final TypedKey key = columnKeys[i]; - columns[i] = new Column(trans.get("table.column." + columnKeys[i].getName())) { + columns[i+1] = new Column(trans.get("table.column." + columnKeys[i].getName())) { @Override public Object getValueAt(int row) { if (key.getType() == Double.class && key.getUnitGroup() != null) { @@ -70,9 +87,16 @@ public class ComponentPresetChooserDialog extends JDialog { public int getRowCount() { return ComponentPresetChooserDialog.this.presets.size(); } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnIndex == 0; + } + }; final JTable table = new JTable( tableModel ); + table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); final TableRowSorter sorter = new TableRowSorter(tableModel); diff --git a/core/src/net/sf/openrocket/gui/util/SwingPreferences.java b/core/src/net/sf/openrocket/gui/util/SwingPreferences.java index 45f2e0dc..233bd9bf 100644 --- a/core/src/net/sf/openrocket/gui/util/SwingPreferences.java +++ b/core/src/net/sf/openrocket/gui/util/SwingPreferences.java @@ -5,6 +5,7 @@ import java.awt.Dimension; import java.awt.Point; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -17,6 +18,7 @@ import net.sf.openrocket.arch.SystemInfo; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.logging.LogHelper; import net.sf.openrocket.material.Material; +import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.simulation.FlightDataType; import net.sf.openrocket.simulation.RK4SimulationStepper; @@ -553,7 +555,25 @@ public class SwingPreferences extends net.sf.openrocket.startup.Preferences { return materials; } + public void setComponentFavorite( ComponentPreset preset, boolean favorite ) { + Preferences prefs = PREFNODE.node("favoritePresets"); + if ( favorite ) { + prefs.putBoolean(preset.preferenceKey(), true); + } else { + prefs.remove(preset.preferenceKey()); + } + } + public Set getComponentFavorites( ) { + Preferences prefs = PREFNODE.node("favoritePresets"); + Set collection = new HashSet(); + try { + collection.addAll( Arrays.asList(prefs.keys())); + } catch ( BackingStoreException bex ) { + + } + return collection; + } //// Helper methods } diff --git a/core/src/net/sf/openrocket/preset/ComponentPreset.java b/core/src/net/sf/openrocket/preset/ComponentPreset.java index 79e5eb4a..c06c0708 100644 --- a/core/src/net/sf/openrocket/preset/ComponentPreset.java +++ b/core/src/net/sf/openrocket/preset/ComponentPreset.java @@ -19,16 +19,37 @@ import net.sf.openrocket.util.BugException; * * @author Sampo Niskanen */ +// FIXME - Implement clone. public class ComponentPreset { private final TypedPropertyMap properties = new TypedPropertyMap(); - - // TODO - Implement clone. + private boolean favorite = false; public enum Type { BODY_TUBE, - NOSE_CONE + NOSE_CONE; + + Type[] compatibleTypes; + + Type () { + compatibleTypes = new Type[1]; + compatibleTypes[0] = this; + } + + Type( Type ... t ) { + + compatibleTypes = new Type[t.length+1]; + compatibleTypes[0] = this; + for( int i=0; i MANUFACTURER = new TypedKey("Manufacturer", Manufacturer.class); @@ -158,10 +179,20 @@ public class ComponentPreset { return (T) value; } + public boolean isFavorite() { + return favorite; + } + + public void setFavorite(boolean favorite) { + this.favorite = favorite; + } + @Override public String toString() { return get(MANUFACTURER).toString() + " " + get(PARTNO); } - + public String preferenceKey() { + return get(MANUFACTURER).toString() + "|" + get(PARTNO); + } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/BodyTube.java b/core/src/net/sf/openrocket/rocketcomponent/BodyTube.java index 5c0e52ea..8dae2945 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/BodyTube.java +++ b/core/src/net/sf/openrocket/rocketcomponent/BodyTube.java @@ -63,6 +63,11 @@ public class BodyTube extends SymmetricComponent implements MotorMount, Coaxial /************ Get/set component parameter methods ************/ + @Override + public ComponentPreset.Type getPresetType() { + return ComponentPreset.Type.BODY_TUBE; + } + /** * Return the outer radius of the body tube. * diff --git a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java index 566b793d..6b0a891b 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java @@ -672,6 +672,16 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab return presetComponent; } + /** + * Return the most compatible preset type for this component. + * This method should be overridden by components which have presets + * + * @return the most compatible ComponentPreset.Type or null if no presets are compatible. + */ + public ComponentPreset.Type getPresetType() { + return null; + } + /** * Set the preset component this component is based upon and load all of the * preset values. diff --git a/core/src/net/sf/openrocket/startup/Preferences.java b/core/src/net/sf/openrocket/startup/Preferences.java index 0a5e62b9..c8a3a575 100644 --- a/core/src/net/sf/openrocket/startup/Preferences.java +++ b/core/src/net/sf/openrocket/startup/Preferences.java @@ -7,6 +7,7 @@ import java.util.Set; import net.sf.openrocket.database.Databases; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.material.Material; +import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.rocketcomponent.BodyComponent; import net.sf.openrocket.rocketcomponent.FinSet; import net.sf.openrocket.rocketcomponent.InternalComponent; @@ -363,6 +364,9 @@ public abstract class Preferences { public abstract Set getUserMaterials(); public abstract void removeUserMaterial(Material m); + public abstract void setComponentFavorite( ComponentPreset preset, boolean favorite ); + public abstract Set getComponentFavorites( ); + /* * Map of default line styles */ -- 2.47.2