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