Material localization support
[debian/openrocket] / core / src / net / sf / openrocket / file / openrocket / savers / RocketComponentSaver.java
1 package net.sf.openrocket.file.openrocket.savers;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6 import java.util.Locale;
7
8 import net.sf.openrocket.file.RocketSaver;
9 import net.sf.openrocket.l10n.Translator;
10 import net.sf.openrocket.material.Material;
11 import net.sf.openrocket.motor.Motor;
12 import net.sf.openrocket.motor.ThrustCurveMotor;
13 import net.sf.openrocket.preset.ComponentPreset;
14 import net.sf.openrocket.rocketcomponent.ComponentAssembly;
15 import net.sf.openrocket.rocketcomponent.MotorMount;
16 import net.sf.openrocket.rocketcomponent.Rocket;
17 import net.sf.openrocket.rocketcomponent.RocketComponent;
18 import net.sf.openrocket.startup.Application;
19 import net.sf.openrocket.util.BugException;
20 import net.sf.openrocket.util.Color;
21 import net.sf.openrocket.util.LineStyle;
22
23
24 public class RocketComponentSaver {
25         private static final Translator trans = Application.getTranslator();
26         
27         protected RocketComponentSaver() {
28                 // Prevent instantiation from outside the package
29         }
30         
31         protected void addParams(net.sf.openrocket.rocketcomponent.RocketComponent c, List<String> elements) {
32                 elements.add("<name>" + RocketSaver.escapeXML(c.getName()) + "</name>");
33                 
34                 ComponentPreset preset = c.getPresetComponent();
35                 if (preset != null) {
36                         elements.add("<preset type=\"" + preset.getType() +
37                                         "\" manufacturer=\"" + preset.getManufacturer().getSimpleName() +
38                                         "\" partno=\"" + preset.getPartNo() + "\" digest=\"" + preset.getDigest() + "\"/>");
39                 }
40                 
41                 
42                 // Save color and line style if significant
43                 if (!(c instanceof Rocket || c instanceof ComponentAssembly)) {
44                         Color color = c.getColor();
45                         if (color != null) {
46                                 elements.add("<color red=\"" + color.getRed() + "\" green=\"" + color.getGreen()
47                                                 + "\" blue=\"" + color.getBlue() + "\"/>");
48                         }
49                         
50                         LineStyle style = c.getLineStyle();
51                         if (style != null) {
52                                 // Type names currently equivalent to the enum names except for case.
53                                 elements.add("<linestyle>" + style.name().toLowerCase(Locale.ENGLISH) + "</linestyle>");
54                         }
55                 }
56                 
57                 
58                 // Save position unless "AFTER"
59                 if (c.getRelativePosition() != RocketComponent.Position.AFTER) {
60                         // The type names are currently equivalent to the enum names except for case.
61                         String type = c.getRelativePosition().name().toLowerCase(Locale.ENGLISH);
62                         elements.add("<position type=\"" + type + "\">" + c.getPositionValue() + "</position>");
63                 }
64                 
65                 
66                 // Overrides
67                 boolean overridden = false;
68                 if (c.isMassOverridden()) {
69                         elements.add("<overridemass>" + c.getOverrideMass() + "</overridemass>");
70                         overridden = true;
71                 }
72                 if (c.isCGOverridden()) {
73                         elements.add("<overridecg>" + c.getOverrideCGX() + "</overridecg>");
74                         overridden = true;
75                 }
76                 if (overridden) {
77                         elements.add("<overridesubcomponents>" + c.getOverrideSubcomponents()
78                                         + "</overridesubcomponents>");
79                 }
80                 
81                 
82                 // Comment
83                 if (c.getComment().length() > 0) {
84                         elements.add("<comment>" + RocketSaver.escapeXML(c.getComment()) + "</comment>");
85                 }
86                 
87         }
88         
89         
90         
91         
92         protected final String materialParam(Material mat) {
93                 return materialParam("material", mat);
94         }
95         
96         
97         protected final String materialParam(String tag, Material mat) {
98                 String str = "<" + tag;
99                 
100                 switch (mat.getType()) {
101                 case LINE:
102                         str += " type=\"line\"";
103                         break;
104                 case SURFACE:
105                         str += " type=\"surface\"";
106                         break;
107                 case BULK:
108                         str += " type=\"bulk\"";
109                         break;
110                 default:
111                         throw new BugException("Unknown material type: " + mat.getType());
112                 }
113                 
114                 String baseName = trans.getBaseText("material", mat.getName());
115                 
116                 return str + " density=\"" + mat.getDensity() + "\">" + RocketSaver.escapeXML(baseName) + "</" + tag + ">";
117         }
118         
119         
120         protected final List<String> motorMountParams(MotorMount mount) {
121                 if (!mount.isMotorMount())
122                         return Collections.emptyList();
123                 
124                 String[] motorConfigIDs = ((RocketComponent) mount).getRocket().getMotorConfigurationIDs();
125                 List<String> elements = new ArrayList<String>();
126                 
127                 elements.add("<motormount>");
128                 
129                 for (String id : motorConfigIDs) {
130                         Motor motor = mount.getMotor(id);
131                         
132                         // Nothing is stored if no motor loaded
133                         if (motor == null)
134                                 continue;
135                         
136                         elements.add("  <motor configid=\"" + id + "\">");
137                         if (motor.getMotorType() != Motor.Type.UNKNOWN) {
138                                 elements.add("    <type>" + motor.getMotorType().name().toLowerCase(Locale.ENGLISH) + "</type>");
139                         }
140                         if (motor instanceof ThrustCurveMotor) {
141                                 ThrustCurveMotor m = (ThrustCurveMotor) motor;
142                                 elements.add("    <manufacturer>" + RocketSaver.escapeXML(m.getManufacturer().getSimpleName()) +
143                                                 "</manufacturer>");
144                                 elements.add("    <digest>" + m.getDigest() + "</digest>");
145                         }
146                         elements.add("    <designation>" + RocketSaver.escapeXML(motor.getDesignation()) + "</designation>");
147                         elements.add("    <diameter>" + motor.getDiameter() + "</diameter>");
148                         elements.add("    <length>" + motor.getLength() + "</length>");
149                         
150                         // Motor delay
151                         if (mount.getMotorDelay(id) == Motor.PLUGGED) {
152                                 elements.add("    <delay>none</delay>");
153                         } else {
154                                 elements.add("    <delay>" + mount.getMotorDelay(id) + "</delay>");
155                         }
156                         
157                         elements.add("  </motor>");
158                 }
159                 
160                 elements.add("  <ignitionevent>"
161                                 + mount.getIgnitionEvent().name().toLowerCase(Locale.ENGLISH).replace("_", "")
162                                 + "</ignitionevent>");
163                 
164                 elements.add("  <ignitiondelay>" + mount.getIgnitionDelay() + "</ignitiondelay>");
165                 elements.add("  <overhang>" + mount.getMotorOverhang() + "</overhang>");
166                 
167                 elements.add("</motormount>");
168                 
169                 return elements;
170         }
171         
172 }