diff --git a/core/src/net/sf/openrocket/file/preset/ColumnDefinition.java b/core/src/net/sf/openrocket/file/preset/ColumnDefinition.java index 5be16945d..a336cfae5 100644 --- a/core/src/net/sf/openrocket/file/preset/ColumnDefinition.java +++ b/core/src/net/sf/openrocket/file/preset/ColumnDefinition.java @@ -1,7 +1,14 @@ package net.sf.openrocket.file.preset; +import net.sf.openrocket.database.Databases; +import net.sf.openrocket.material.Material; +import net.sf.openrocket.motor.Manufacturer; +import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.TypedKey; import net.sf.openrocket.preset.TypedPropertyMap; +import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; +import net.sf.openrocket.rocketcomponent.Transition.Shape; +import net.sf.openrocket.startup.Application; public class ColumnDefinition { TypedKey key; @@ -9,9 +16,79 @@ public class ColumnDefinition { this.key = key; } public void setProperty( TypedPropertyMap preset, String value ) { - T o = (T) key.parseFromString(value); + T o = (T) parseFromString(key.getType(), value); if ( o != null ) { preset.put(key, o); } } + + private static Object parseFromString( Class type, String value ) { + if ( type.equals(Manufacturer.class)) { + Manufacturer m = Manufacturer.getManufacturer(value); + return m; + } + if ( type.equals(ComponentPreset.Type.class) ) { + ComponentPreset.Type t = ComponentPreset.Type.valueOf(value); + return t; + } + if ( type.equals(Boolean.class) ) { + return Boolean.parseBoolean(value); + } + if ( type.isAssignableFrom(Double.class) ) { + return Double.parseDouble(value); + } + if ( type.equals(String.class ) ) { + return value; + } + if ( type.equals(Finish.class) ) { + return Finish.valueOf(value); + } + if ( type.equals(Material.class) ) { + if ( "balsa".equalsIgnoreCase(value) ) { + String translated_value = Application.getTranslator().get("Databases.materials.Balsa"); + return getMaterialFor(translated_value); + } + throw new IllegalArgumentException("Invalid material " + value + " in component preset."); + } + if ( type.equals(Shape.class) ) { + //FIXME - ignore case! + if ( "ogive".equalsIgnoreCase(value) ) { + return Shape.OGIVE; + } + if ( "cone".equalsIgnoreCase(value) ) { + return Shape.CONICAL; + } + if ( "elliptical".equalsIgnoreCase(value) ) { + return Shape.ELLIPSOID; + } + if ( "parabolic".equalsIgnoreCase(value) ) { + return Shape.PARABOLIC; + } + if ( "sears-haack".equalsIgnoreCase(value) ) { + return Shape.HAACK; + } + if ( "power-series".equalsIgnoreCase(value) ) { + return Shape.POWER; + } + throw new IllegalArgumentException("Invalid shape " + value + " in component preset."); + } + throw new IllegalArgumentException("Invalid type " + type.getName() + " for component preset parameter." ); + } + + private static Material getMaterialFor( String translatedName ) { + Material material; + material = Databases.findMaterial(Material.Type.BULK, translatedName); + if ( material != null ) { + return material; + } + material = Databases.findMaterial(Material.Type.LINE, translatedName); + if ( material != null ) { + return material; + } + material = Databases.findMaterial(Material.Type.SURFACE, translatedName); + if ( material != null ) { + return material; + } + throw new IllegalArgumentException("Invalid Material: " + translatedName ); + } } diff --git a/core/src/net/sf/openrocket/preset/TypedKey.java b/core/src/net/sf/openrocket/preset/TypedKey.java index 57652007a..c3e447318 100644 --- a/core/src/net/sf/openrocket/preset/TypedKey.java +++ b/core/src/net/sf/openrocket/preset/TypedKey.java @@ -1,11 +1,5 @@ package net.sf.openrocket.preset; -import org.jfree.util.StringUtils; - -import net.sf.openrocket.material.Material; -import net.sf.openrocket.motor.Manufacturer; -import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; -import net.sf.openrocket.rocketcomponent.Transition.Shape; import net.sf.openrocket.unit.UnitGroup; public class TypedKey { @@ -41,73 +35,6 @@ public class TypedKey { return unitGroup; } - public Object parseFromString( String value ) { - if ( type.equals(Manufacturer.class)) { - Manufacturer m = Manufacturer.getManufacturer(value); - return m; - } - if ( type.equals(ComponentPreset.Type.class) ) { - ComponentPreset.Type t = ComponentPreset.Type.valueOf(value); - return t; - } - if ( type.equals(Boolean.class) ) { - return Boolean.parseBoolean(value); - } - if ( type.isAssignableFrom(Double.class) ) { - return Double.parseDouble(value); - } - if ( type.equals(String.class ) ) { - return value; - } - if ( type.equals(Finish.class) ) { - return Finish.valueOf(value); - } - if ( type.equals(Material.class) ) { - // FIXME - cannot parse Materials just yet. Need a way to do it without worrying about locale. - return null; - /* - String translated_value = Application.getTranslator().get(value); - Material material; - material = Databases.findMaterial(Material.Type.BULK, translated_value); - if ( material != null ) { - return material; - } - material = Databases.findMaterial(Material.Type.LINE, translated_value); - if ( material != null ) { - return material; - } - material = Databases.findMaterial(Material.Type.SURFACE, translated_value); - if ( material != null ) { - return material; - } - throw new IllegalArgumentException("Invalid material " + value + " in component preset."); - */ - } - if ( type.equals(Shape.class) ) { - //FIXME - ignore case! - if ( "ogive".equalsIgnoreCase(value) ) { - return Shape.OGIVE; - } - if ( "cone".equalsIgnoreCase(value) ) { - return Shape.CONICAL; - } - if ( "elliptical".equalsIgnoreCase(value) ) { - return Shape.ELLIPSOID; - } - if ( "parabolic".equalsIgnoreCase(value) ) { - return Shape.PARABOLIC; - } - if ( "sears-haack".equalsIgnoreCase(value) ) { - return Shape.HAACK; - } - if ( "power-series".equalsIgnoreCase(value) ) { - return Shape.POWER; - } - throw new IllegalArgumentException("Invalid shape " + value + " in component preset."); - } - throw new IllegalArgumentException("Inavlid type " + type.getName() + " for component preset parameter " + name); - } - @Override public int hashCode() { final int prime = 31;