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