From 8352b759283d2be93a5773b1fb4c030fd1e9b074 Mon Sep 17 00:00:00 2001 From: kruland2607 Date: Sun, 8 Apr 2012 02:02:46 +0000 Subject: [PATCH] Make ComponentPresetDao and interface with implementation in ComponentPresetDatabase. ComponentPresetDatabase extends Database so it can support listeners. PresetModel implements DatabaseListener so it updates when the user changes the favorite settings. git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@526 180e2498-e6e9-4542-8430-84ac67f01cd8 --- .../database/ComponentPresetDao.java | 115 +-------------- .../database/ComponentPresetDatabase.java | 139 ++++++++++++++++++ .../net/sf/openrocket/database/Database.java | 26 +++- .../openrocket/gui/adaptors/PresetModel.java | 20 ++- .../gui/configdialog/BodyTubeConfig.java | 85 ++++++----- .../preset/ComponentPresetChooserDialog.java | 2 +- .../sf/openrocket/preset/ComponentPreset.java | 21 ++- .../net/sf/openrocket/startup/Startup.java | 6 +- 8 files changed, 259 insertions(+), 155 deletions(-) create mode 100644 core/src/net/sf/openrocket/database/ComponentPresetDatabase.java diff --git a/core/src/net/sf/openrocket/database/ComponentPresetDao.java b/core/src/net/sf/openrocket/database/ComponentPresetDao.java index fca47d17..905e7a88 100644 --- a/core/src/net/sf/openrocket/database/ComponentPresetDao.java +++ b/core/src/net/sf/openrocket/database/ComponentPresetDao.java @@ -1,73 +1,16 @@ 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 { +public interface 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; + public List listAll(); + + public void insert( ComponentPreset preset ); - } + public List listForType( ComponentPreset.Type type ); /** * Return a list of component presets based on the type. @@ -77,52 +20,10 @@ public class ComponentPresetDao { * @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 listForType( ComponentPreset.Type type, boolean favorite ); - } - return result; - } + public List listForTypes( ComponentPreset.Type ... type ); - public void setFavorite( ComponentPreset preset, boolean favorite ) { - preset.setFavorite(favorite); - Application.getPreferences().setComponentFavorite( preset, favorite ); - } + public void setFavorite( ComponentPreset preset, boolean favorite ); } \ No newline at end of file diff --git a/core/src/net/sf/openrocket/database/ComponentPresetDatabase.java b/core/src/net/sf/openrocket/database/ComponentPresetDatabase.java new file mode 100644 index 00000000..bfb025dc --- /dev/null +++ b/core/src/net/sf/openrocket/database/ComponentPresetDatabase.java @@ -0,0 +1,139 @@ +package net.sf.openrocket.database; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import net.sf.openrocket.file.Loader; +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 ComponentPresetDatabase extends Database implements ComponentPresetDao { + + private static class ComponentPresetLoader implements Loader { + + @Override + public Collection load(InputStream stream, + String filename) throws IOException { + Set favorites = Application.getPreferences().getComponentFavorites(); + + List returnval = new ArrayList(); + + 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); + } + returnval.add(preset); + } catch ( InvalidComponentPresetException ex ) { + throw new BugException( ex ); + } + } + return returnval; + } + + } + + public ComponentPresetDatabase() { + super(new ComponentPresetLoader()); + } + + @Override + public List listAll() { + return list; + } + + @Override + public void insert( ComponentPreset preset ) { + list.add(preset); + } + + @Override + public List listForType( ComponentPreset.Type type ) { + if ( type == null ) { + return Collections.emptyList(); + } + + List result = new ArrayList(list.size()/6); + + for( ComponentPreset preset : list ) { + 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 + */ + @Override + public List listForType( ComponentPreset.Type type, boolean favorite ) { + + if ( !favorite ) { + return listForType(type); + } + + List result = new ArrayList(list.size()/6); + + for( ComponentPreset preset : list ) { + if ( preset.isFavorite() && preset.get(ComponentPreset.TYPE).equals(type) ) { + result.add(preset); + } + } + return result; + } + + @Override + 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(list.size()/6); + + for( ComponentPreset preset : list ) { + ComponentPreset.Type presetType = preset.get(ComponentPreset.TYPE); + typeLoop: for( int i=0; i> extends AbstractSet { private static final LogHelper log = Application.getLogger(); - private final List list = new ArrayList(); + protected final List list = new ArrayList(); private final ArrayList> listeners = new ArrayList>(); private final Loader loader; @@ -126,7 +130,27 @@ public class Database> extends AbstractSet { //////// Directory loading + public void load( String dir, final String pattern ) throws IOException { + + FileFilter filter = new FileFilter() { + @Override + public boolean accept(File pathname) { + return pathname.getName().matches(pattern); + } + + }; + + FileIterator files = DirectoryIterator.findDirectory(dir, filter); + while( files != null && files.hasNext() ) { + Pair file = files.next(); + try { + this.addAll(loader.load(file.getV(), file.getU())); + } catch (IOException e) { + log.warn("Error loading file " + file + ": " + e.getMessage(), e); + } + } + } /** * Load all files in a directory to the motor database. Only files with file diff --git a/core/src/net/sf/openrocket/gui/adaptors/PresetModel.java b/core/src/net/sf/openrocket/gui/adaptors/PresetModel.java index 05cf6329..3a111d92 100644 --- a/core/src/net/sf/openrocket/gui/adaptors/PresetModel.java +++ b/core/src/net/sf/openrocket/gui/adaptors/PresetModel.java @@ -5,6 +5,8 @@ import java.util.List; import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; +import net.sf.openrocket.database.Database; +import net.sf.openrocket.database.DatabaseListener; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.logging.LogHelper; import net.sf.openrocket.preset.ComponentPreset; @@ -13,7 +15,7 @@ import net.sf.openrocket.rocketcomponent.ComponentChangeListener; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.startup.Application; -public class PresetModel extends AbstractListModel implements ComboBoxModel, ComponentChangeListener { +public class PresetModel extends AbstractListModel implements ComboBoxModel, ComponentChangeListener, DatabaseListener { private static final LogHelper log = Application.getLogger(); private static final Translator trans = Application.getTranslator(); @@ -25,7 +27,7 @@ public class PresetModel extends AbstractListModel implements ComboBoxModel, Com private final RocketComponent component; private ComponentPreset previousPreset; - private final List presets; + private List presets; public PresetModel(RocketComponent component) { presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true); @@ -84,6 +86,16 @@ public class PresetModel extends AbstractListModel implements ComboBoxModel, Com } } - // FIXME: Make model invalidatable - + @Override + public void elementAdded(ComponentPreset element, Database source) { + presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true); + this.fireContentsChanged(this, 0, getSize()); + } + + @Override + public void elementRemoved(ComponentPreset element, Database source) { + presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true); + this.fireContentsChanged(this, 0, getSize()); + } + } diff --git a/core/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java b/core/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java index 320b3084..d93112b3 100644 --- a/core/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java +++ b/core/src/net/sf/openrocket/gui/configdialog/BodyTubeConfig.java @@ -13,6 +13,7 @@ import javax.swing.JSpinner; import javax.swing.SwingUtilities; import net.miginfocom.swing.MigLayout; +import net.sf.openrocket.database.ComponentPresetDatabase; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.gui.SpinnerEditor; import net.sf.openrocket.gui.adaptors.BooleanModel; @@ -30,23 +31,26 @@ import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; public class BodyTubeConfig extends RocketComponentConfig { - + private MotorConfig motorConfigPane = null; private DoubleModel maxLength; private JComboBox presetComboBox; + private PresetModel presetModel; private static final Translator trans = Application.getTranslator(); - + public BodyTubeConfig(OpenRocketDocument d, RocketComponent c) { super(d, c); - + JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", "")); - - - + + + //// Body tube template // FIXME: Move to proper location panel.add(new JLabel(trans.get("PresetModel.lbl.select"))); - presetComboBox = new JComboBox(new PresetModel(component)); + presetModel = new PresetModel(component); + ((ComponentPresetDatabase)Application.getComponentPresetDao()).addDatabaseListener(presetModel); + presetComboBox = new JComboBox(presetModel); presetComboBox.setEditable(false); panel.add(presetComboBox, "wrap para"); //FIXME: temporarily put the select from table button in the config dialog. @@ -72,77 +76,77 @@ public class BodyTubeConfig extends RocketComponentConfig { panel.add( opendialog, "wrap" ); } - + //// Body tube length panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Bodytubelength"))); - + maxLength = new DoubleModel(2.0); DoubleModel length = new DoubleModel(component, "Length", UnitGroup.UNITS_LENGTH, 0); - + JSpinner spin = new JSpinner(length.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); - + panel.add(new UnitSelector(length), "growx"); panel.add(new BasicSlider(length.getSliderModel(0, 0.5, maxLength)), "w 100lp, wrap"); - - + + //// Body tube diameter panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Outerdiameter"))); - + DoubleModel od = new DoubleModel(component, "OuterRadius", 2, UnitGroup.UNITS_LENGTH, 0); // Diameter = 2*Radius - + spin = new JSpinner(od.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); - + panel.add(new UnitSelector(od), "growx"); panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 0px"); - + JCheckBox check = new JCheckBox(od.getAutomaticAction()); //// Automatic check.setText(trans.get("BodyTubecfg.checkbox.Automatic")); panel.add(check, "skip, span 2, wrap"); - - + + //// Inner diameter panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Innerdiameter"))); - + // Diameter = 2*Radius DoubleModel m = new DoubleModel(component, "InnerRadius", 2, UnitGroup.UNITS_LENGTH, 0); - - + + spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); - + panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(new DoubleModel(0), od)), "w 100lp, wrap"); - - + + //// Wall thickness panel.add(new JLabel(trans.get("BodyTubecfg.lbl.Wallthickness"))); - + m = new DoubleModel(component, "Thickness", UnitGroup.UNITS_LENGTH, 0); - + spin = new JSpinner(m.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); panel.add(spin, "growx"); - + panel.add(new UnitSelector(m), "growx"); panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap 0px"); - + //// Filled check = new JCheckBox(new BooleanModel(component, "Filled")); check.setText(trans.get("BodyTubecfg.checkbox.Filled")); panel.add(check, "skip, span 2, wrap"); - - + + //// Material panel.add(materialPanel(new JPanel(new MigLayout()), Material.Type.BULK), "cell 4 0, gapleft paragraph, aligny 0%, spany"); - + //// General and General properties tabbedPane.insertTab(trans.get("BodyTubecfg.tab.General"), null, panel, trans.get("BodyTubecfg.tab.Generalproperties"), 0); @@ -151,17 +155,22 @@ public class BodyTubeConfig extends RocketComponentConfig { tabbedPane.insertTab(trans.get("BodyTubecfg.tab.Motor"), null, motorConfigPane, trans.get("BodyTubecfg.tab.Motormountconf"), 1); tabbedPane.setSelectedIndex(0); - - + + } - + @Override public void updateFields() { super.updateFields(); if (motorConfigPane != null) motorConfigPane.updateFields(); } - - - + + @Override + public void invalidateModels() { + super.invalidateModels(); + ((ComponentPresetDatabase)Application.getComponentPresetDao()).removeChangeListener(presetModel); + } + + } 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 068243b6..fef3a26a 100644 --- a/core/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java +++ b/core/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java @@ -76,7 +76,7 @@ public class ComponentPresetChooserDialog extends JDialog { double v = (Double) ComponentPresetChooserDialog.this.presets.get(row).get(key); return new Value( v, key.getUnitGroup() ); } else { - return ComponentPresetChooserDialog.this.presets.get(row); + return ComponentPresetChooserDialog.this.presets.get(row).get(key); } } }; diff --git a/core/src/net/sf/openrocket/preset/ComponentPreset.java b/core/src/net/sf/openrocket/preset/ComponentPreset.java index c06c0708..26ea12b2 100644 --- a/core/src/net/sf/openrocket/preset/ComponentPreset.java +++ b/core/src/net/sf/openrocket/preset/ComponentPreset.java @@ -20,7 +20,7 @@ import net.sf.openrocket.util.BugException; * @author Sampo Niskanen */ // FIXME - Implement clone. -public class ComponentPreset { +public class ComponentPreset implements Comparable { private final TypedPropertyMap properties = new TypedPropertyMap(); @@ -167,6 +167,14 @@ public class ComponentPreset { } + public Manufacturer getManufacturer() { + return properties.get(MANUFACTURER); + } + + public String getPartNo() { + return properties.get(PARTNO); + } + public boolean has(Object key) { return properties.containsKey(key); } @@ -187,6 +195,16 @@ public class ComponentPreset { this.favorite = favorite; } + @Override + public int compareTo(ComponentPreset p2) { + int manuCompare = this.getManufacturer().getSimpleName().compareTo(p2.getManufacturer().getSimpleName()); + if ( manuCompare != 0 ) + return manuCompare; + + int partNoCompare = this.getPartNo().compareTo(p2.getPartNo()); + return partNoCompare; + } + @Override public String toString() { return get(MANUFACTURER).toString() + " " + get(PARTNO); @@ -195,4 +213,5 @@ public class ComponentPreset { public String preferenceKey() { return get(MANUFACTURER).toString() + "|" + get(PARTNO); } + } diff --git a/core/src/net/sf/openrocket/startup/Startup.java b/core/src/net/sf/openrocket/startup/Startup.java index 1b6cfc8b..5c7a6c66 100644 --- a/core/src/net/sf/openrocket/startup/Startup.java +++ b/core/src/net/sf/openrocket/startup/Startup.java @@ -4,7 +4,7 @@ import java.io.PrintStream; import java.util.Locale; import java.util.prefs.Preferences; -import net.sf.openrocket.database.ComponentPresetDao; +import net.sf.openrocket.database.ComponentPresetDatabase; import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.l10n.DebugTranslator; import net.sf.openrocket.l10n.L10N; @@ -57,8 +57,8 @@ public class Startup { initializeL10n(); // Must be done after localization is initialized - ComponentPresetDao componentPresetDao = new ComponentPresetDao(); - componentPresetDao.initialize(); + ComponentPresetDatabase componentPresetDao = new ComponentPresetDatabase(); + componentPresetDao.load("datafiles", ".*csv"); Application.setComponentPresetDao( componentPresetDao ); // Continue startup in Startup2 class (where Application is already set up) -- 2.47.2