De-localize Material and FlightDataType objects when persisting in ork files. Added...
[debian/openrocket] / core / src / net / sf / openrocket / preset / loader / MaterialHolder.java
index 7ac24592dc50896079e0c1efeefdfb13c7a4e112..3a8dbfaaed6e78ad70dfd13694d13f5dbb6ae53e 100644 (file)
@@ -3,18 +3,31 @@ package net.sf.openrocket.preset.loader;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 
+import net.sf.openrocket.database.Database;
 import net.sf.openrocket.material.Material;
 import net.sf.openrocket.unit.UnitGroup;
 
 public class MaterialHolder {
 
        private final Map<String,Material.Bulk> bulkMaterials = new HashMap<String,Material.Bulk>();
-       
+
        private final Map<String,Material.Surface> surfaceMaterials = new HashMap<String,Material.Surface>();
-       
+
        private final Map<String, Material.Line> lineMaterials = new HashMap<String,Material.Line>();
+
+       public MaterialHolder() {}
+       
+       public MaterialHolder( List<Material> materials ) {
+               if (materials == null) {
+                       return;
+               }
+               for (Material material : materials) {
+                       this.put(material);
+               }
+       }
        
        public void put( Material material ) {
                switch ( material.getType() ) {
@@ -29,12 +42,25 @@ public class MaterialHolder {
                        break;
                }
        }
-       
+
+       public Material getMaterial ( Material material ) {
+               switch ( material.getType() ) {
+               case BULK:
+                       return getBulkMaterial( (Material.Bulk)material );
+               case SURFACE:
+                       return getSurfaceMaterial( (Material.Surface) material, null );
+               case LINE:
+                       return getLineMaterial( (Material.Line) material );
+               default:
+                       return null;
+               }
+       }
+
        public Material.Bulk getBulkMaterial( Material.Bulk material ) {
                Material.Bulk m = bulkMaterials.get( material.getName() );
-               return (m==null) ? material : m;
+               return m;
        }
-       
+
        public Material.Surface getSurfaceMaterial( Material.Surface material, Double thickness ) {
                Material.Surface m = surfaceMaterials.get(material.getName() );
                if ( m != null ) {
@@ -43,7 +69,7 @@ public class MaterialHolder {
                // Try to see if we can convert a bulk material.
                if ( thickness == null ) {
                        // if we have no thickness, there is nothing we can do
-                       return material;
+                       return null;
                }
                String thicknessName = UnitGroup.UNITS_LENGTH.getUnit("mm").toString(thickness);
                String convertedMaterialName = material.getName() + "(" + thicknessName + ")";
@@ -52,39 +78,55 @@ public class MaterialHolder {
                        return m;
                }
                Material.Bulk bulk = bulkMaterials.get(material.getName() );
-               
+
                if ( bulk == null ) {
-                       return material;
+                       return null;
                }
-               
+
                // Ok, now we have a thickness and a bulk material of the correct name,
                // we can make our own surface material.
-               
-               Material.Surface surface = new Material.Surface( convertedMaterialName, bulk.getDensity() * thickness , true);
-               
+
+               Material.Surface surface = (Material.Surface) Material.newUserMaterial(Material.Type.SURFACE, convertedMaterialName, bulk.getDensity() * thickness);
+
                this.put(surface);
 
                return surface;
-               
+
        }
-       
+
        public Material.Line getLineMaterial( Material.Line material ) {
                Material.Line m = lineMaterials.get( material.getName() );
-               return (m==null) ? material : m;
+               return m;
        }
-       
+
        public int size() {
                return bulkMaterials.size() + surfaceMaterials.size() + lineMaterials.size();
        }
 
        public Collection<Material> values() {
-               
+
                HashSet<Material> allMats = new HashSet<Material>();
                allMats.addAll( bulkMaterials.values() );
                allMats.addAll( surfaceMaterials.values() );
                allMats.addAll( lineMaterials.values() );
-               
+
                return allMats;
-               
+
+       }
+
+       public Database<Material> asDatabase(Material.Type theType) {
+               Database<Material> result = new Database<Material>();
+               switch (theType) {
+               case LINE:
+                       result.addAll(lineMaterials.values());
+                       break;
+               case SURFACE:
+                       result.addAll(surfaceMaterials.values());
+                       break;
+               case BULK:
+               default:
+                       result.addAll(bulkMaterials.values());
+               }
+               return result;
        }
 }