preset component framework
[debian/openrocket] / src / net / sf / openrocket / rocketcomponent / ExternalComponent.java
index 9f96bbdc9d740282e2f2834a8954af3b31e7be69..23cea24074368f56983fd6fa6e20a2e8b8f122ab 100644 (file)
@@ -1,26 +1,39 @@
 package net.sf.openrocket.rocketcomponent;
 
+import java.util.List;
+
+import net.sf.openrocket.l10n.Translator;
 import net.sf.openrocket.material.Material;
+import net.sf.openrocket.material.Material.Type;
+import net.sf.openrocket.preset.ExternalComponentPreset;
+import net.sf.openrocket.preset.RocketComponentPreset;
+import net.sf.openrocket.startup.Application;
 import net.sf.openrocket.unit.UnitGroup;
 import net.sf.openrocket.util.Prefs;
 
 /**
  * Class of components with well-defined physical appearance and which have an effect on
- * aerodynamic simulation.  They have material defined for them, and the mass of the component 
+ * aerodynamic simulation.  They have material defined for them, and the mass of the component
  * is calculated using the component's volume.
- * 
+ *
  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
  */
 
 public abstract class ExternalComponent extends RocketComponent {
        
        public enum Finish {
-               ROUGH("Rough", 500e-6),
-               UNFINISHED("Unfinished", 150e-6),
-               NORMAL("Regular paint", 60e-6),
-               SMOOTH("Smooth paint", 20e-6),
-               POLISHED("Polished", 2e-6);
+               //// Rough
+               ROUGH("ExternalComponent.Rough", 500e-6),
+               //// Unfinished
+               UNFINISHED("ExternalComponent.Unfinished", 150e-6),
+               //// Regular paint
+               NORMAL("ExternalComponent.Regularpaint", 60e-6),
+               //// Smooth paint
+               SMOOTH("ExternalComponent.Smoothpaint", 20e-6),
+               //// Polished
+               POLISHED("ExternalComponent.Polished", 2e-6);
                
+               private static final Translator trans = Application.getTranslator();
                private final String name;
                private final double roughnessSize;
                
@@ -35,20 +48,20 @@ public abstract class ExternalComponent extends RocketComponent {
                
                @Override
                public String toString() {
-                       return name + " (" + UnitGroup.UNITS_ROUGHNESS.toStringUnit(roughnessSize) + ")";
+                       return trans.get(name) + " (" + UnitGroup.UNITS_ROUGHNESS.toStringUnit(roughnessSize) + ")";
                }
        }
        
-
+       
        /**
         * The material of the component.
         */
-       protected Material material=null;
+       protected Material material = null;
        
        protected Finish finish = Finish.NORMAL;
        
        
-       
+
        /**
         * Constructor that sets the relative position of the component.
         */
@@ -56,13 +69,13 @@ public abstract class ExternalComponent extends RocketComponent {
                super(relativePosition);
                this.material = Prefs.getDefaultComponentMaterial(this.getClass(), Material.Type.BULK);
        }
-
+       
        /**
         * Returns the volume of the component.  This value is used in calculating the mass
         * of the object.
         */
        public abstract double getComponentVolume();
-
+       
        /**
         * Calculates the mass of the component as the product of the volume and interior density.
         */
@@ -70,7 +83,7 @@ public abstract class ExternalComponent extends RocketComponent {
        public double getComponentMass() {
                return material.getDensity() * getComponentVolume();
        }
-
+       
        /**
         * ExternalComponent has aerodynamic effect, so return true.
         */
@@ -95,12 +108,13 @@ public abstract class ExternalComponent extends RocketComponent {
        public void setMaterial(Material mat) {
                if (mat.getType() != Material.Type.BULK) {
                        throw new IllegalArgumentException("ExternalComponent requires a bulk material" +
-                                       " type="+mat.getType());
+                                       " type=" + mat.getType());
                }
-
+               
                if (material.equals(mat))
                        return;
                material = mat;
+               clearPreset();
                fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
        }
        
@@ -115,4 +129,34 @@ public abstract class ExternalComponent extends RocketComponent {
                fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
        }
        
+       
+       @Override
+       protected void loadFromPreset(RocketComponentPreset preset) {
+               super.loadFromPreset(preset);
+               
+               ExternalComponentPreset p = (ExternalComponentPreset) preset;
+               String materialName = p.getMaterialName();
+               double mass = p.getMass();
+               
+               double volume = getComponentVolume();
+               double density;
+               if (volume > 0.00001) {
+                       density = mass / volume;
+               } else {
+                       density = 1000;
+               }
+               
+               Material mat = Material.newMaterial(Type.BULK, materialName, density, true);
+               setMaterial(mat);
+       }
+       
+       
+       @Override
+       protected List<RocketComponent> copyFrom(RocketComponent c) {
+               ExternalComponent src = (ExternalComponent) c;
+               this.finish = src.finish;
+               this.material = src.material;
+               return super.copyFrom(c);
+       }
+       
 }