]> git.gag.com Git - debian/openrocket/commitdiff
Implement persistence of ComponentPreset favorites to preferences. Implement favorit...
authorkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Wed, 4 Apr 2012 21:29:33 +0000 (21:29 +0000)
committerkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Wed, 4 Apr 2012 21:29:33 +0000 (21:29 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@516 180e2498-e6e9-4542-8430-84ac67f01cd8

core/resources/l10n/messages.properties
core/src/net/sf/openrocket/database/ComponentPresetDao.java
core/src/net/sf/openrocket/gui/adaptors/Column.java
core/src/net/sf/openrocket/gui/adaptors/ColumnTableModel.java
core/src/net/sf/openrocket/gui/adaptors/PresetModel.java
core/src/net/sf/openrocket/gui/dialogs/preset/ComponentPresetChooserDialog.java
core/src/net/sf/openrocket/gui/util/SwingPreferences.java
core/src/net/sf/openrocket/preset/ComponentPreset.java
core/src/net/sf/openrocket/rocketcomponent/BodyTube.java
core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java
core/src/net/sf/openrocket/startup/Preferences.java

index 876dcdbbcabafe55dcef33a6399850cf2d8beaa1..471e5d08cb6a0146135ebd986ffa0856dd6ff777 100644 (file)
@@ -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
 
index 0cbdb1b543f43cf3b78f57097382e3e2e80a439e..fca47d17aad555d8b1bfdacdf6b0f2bf37b199f9 100644 (file)
@@ -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<ComponentPreset> templates = new ArrayList<ComponentPreset>();
 
        // Package scope constructor to control creation pattern.
        public ComponentPresetDao() {}
-       
+
        public void initialize() throws IOException {
+
+               Set<String> favorites = Application.getPreferences().getComponentFavorites();
                
                InputStream is = ComponentPresetDao.class.getResourceAsStream("/datafiles/bodytubepresets.csv");
-               
+
                PresetCSVReader parser = new PresetCSVReader(is);
                List<TypedPropertyMap> 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<ComponentPreset> listAll() {
                return templates;
        }
-       
+
        public void insert( ComponentPreset preset ) {
                templates.add(preset);
        }
+
+       public List<ComponentPreset> listForType( ComponentPreset.Type type ) {
+               if ( type == null ) {
+                       return Collections.<ComponentPreset>emptyList();
+               }
+               
+               List<ComponentPreset> result = new ArrayList<ComponentPreset>(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<ComponentPreset> listForType( ComponentPreset.Type type, boolean favorite ) {
+
+               if ( !favorite ) {
+                       return listForType(type);
+               }
+
+               List<ComponentPreset> result = new ArrayList<ComponentPreset>(templates.size()/6);
+
+               for( ComponentPreset preset : templates ) {
+                       if ( preset.isFavorite() && preset.get(ComponentPreset.TYPE).equals(type) ) {
+                               result.add(preset);
+                       }
+               }
+               return result;
+
+
+       }
+
+       public List<ComponentPreset> listForTypes( ComponentPreset.Type ... type ) {
+
+               if( type == null || type.length == 0 ) {
+                       return Collections.<ComponentPreset>emptyList();
+               }
+
+               if (type.length == 1 ) {
+                       return listForType(type[0]);
+               }
+
+               List<ComponentPreset> result = new ArrayList<ComponentPreset>(templates.size()/6);
+
+               for( ComponentPreset preset : templates ) {
+                       ComponentPreset.Type presetType = preset.get(ComponentPreset.TYPE);
+                       typeLoop: for( int i=0; i<type.length; i++ ) {
+                               if ( !presetType.equals(type) ) {
+                                       result.add(preset);
+                                       break typeLoop; // from inner loop.
+                               }
+                       }
+
+               }
+               return result;
+       }
+
+       public void setFavorite( ComponentPreset preset, boolean favorite ) {
+               preset.setFavorite(favorite);
+               Application.getPreferences().setComponentFavorite( preset, favorite );
+       }
        
-}
+}
\ No newline at end of file
index 87997c484736884ac4a2a1a76b32b26b3660bf80..9c4801a613d10953291b07e3e4cd7fc00f11bf25 100644 (file)
@@ -63,5 +63,16 @@ public abstract class Column {
         * @return              the value at the specified position.
         */
        public abstract Object getValueAt(int row);
+
+       /**
+        * Set a value in the table.
+        * 
+        * Override if the cell is editable.
+        * 
+        * @param row
+        * @param value
+        */
+       public void setValueAt(int row, Object value ) {
+       }
        
 }
index e50a8ea5b87cd2100e03320513c49d3482e431b8..b8b8d3ec3e19904981d413bc0b4e36cc28d78380 100644 (file)
@@ -52,5 +52,10 @@ public abstract class ColumnTableModel extends AbstractTableModel {
                }
                return columns[col].getValueAt(row);
        }
+
+       @Override
+       public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
+               columns[columnIndex].setValueAt(rowIndex, aValue);
+       }
        
 }
index 87045931db3b45be8b5f0599e33fd9f278aaf36f..05cf6329f3ec415bbb26eae8b11eff5c65247afd 100644 (file)
@@ -28,8 +28,7 @@ public class PresetModel extends AbstractListModel implements ComboBoxModel, Com
        private final List<ComponentPreset> 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);
index 8b7b4235ccb0b76a2a13bc902fe2d0cdd628e7ec..068243b673316274377d5b359eff530308af8ddb 100644 (file)
@@ -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<TableModel> sorter = new TableRowSorter<TableModel>(tableModel);
index 45f2e0dc2944d074d5f4d5153ed819f5258bf2b6..233bd9bfc4cdb6afbf8b384c57e30105440eb182 100644 (file)
@@ -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<String> getComponentFavorites( ) {
+               Preferences prefs = PREFNODE.node("favoritePresets");
+               Set<String> collection = new HashSet<String>();
+               try {
+                       collection.addAll( Arrays.asList(prefs.keys()));
+               } catch ( BackingStoreException bex ) {
+                       
+               }
+               return collection;
+       }
        ////  Helper methods
        
 }
index 79e5eb4a908d694682e9aef59151ad51287d0d8e..c06c0708900d0b811790ed1f2e6f6ff2e23d16a9 100644 (file)
@@ -19,16 +19,37 @@ import net.sf.openrocket.util.BugException;
  * 
  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
  */
+// 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<t.length; i++ ) {
+                               compatibleTypes[i+1] = t[i];
+                       }
+               }
+               
+               public Type[] getCompatibleTypes() {
+                       return compatibleTypes;
+               }
+               
        }
        
        public final static TypedKey<Manufacturer> MANUFACTURER = new TypedKey<Manufacturer>("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);
+       }
 }
index 5c0e52ea810f2e9f8893b3c0f7fede7ffdfd3eea..8dae294541d4f006a02d21942492656d7fa69f91 100644 (file)
@@ -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.
         *
index 566b793deefa6334b13cf1f062d6cb3c18e46178..6b0a891b9ddccc71393fa4880688f1c904ac937b 100644 (file)
@@ -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 <code>null</code> 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.
index 0a5e62b94e0441a75d7124e6976d7ab281a1f87c..c8a3a57596985ce673180e62dfcc613ebcf30377 100644 (file)
@@ -7,6 +7,7 @@ import java.util.Set;
 import net.sf.openrocket.database.Databases;\r
 import net.sf.openrocket.l10n.Translator;\r
 import net.sf.openrocket.material.Material;\r
+import net.sf.openrocket.preset.ComponentPreset;\r
 import net.sf.openrocket.rocketcomponent.BodyComponent;\r
 import net.sf.openrocket.rocketcomponent.FinSet;\r
 import net.sf.openrocket.rocketcomponent.InternalComponent;\r
@@ -363,6 +364,9 @@ public abstract class Preferences {
        public abstract Set<Material> getUserMaterials();\r
        public abstract void removeUserMaterial(Material m);\r
 \r
+       public abstract void setComponentFavorite( ComponentPreset preset, boolean favorite );\r
+       public abstract Set<String> getComponentFavorites( );\r
+\r
        /*\r
         * Map of default line styles\r
         */\r