component config refactoring, localization fixes
[debian/openrocket] / src / net / sf / openrocket / gui / configdialog / ParachuteConfig.java
1 package net.sf.openrocket.gui.configdialog;
2
3
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6
7 import javax.swing.JButton;
8 import javax.swing.JComboBox;
9 import javax.swing.JLabel;
10 import javax.swing.JPanel;
11 import javax.swing.JSpinner;
12
13 import net.miginfocom.swing.MigLayout;
14 import net.sf.openrocket.document.OpenRocketDocument;
15 import net.sf.openrocket.gui.SpinnerEditor;
16 import net.sf.openrocket.gui.adaptors.DoubleModel;
17 import net.sf.openrocket.gui.adaptors.EnumModel;
18 import net.sf.openrocket.gui.adaptors.IntegerModel;
19 import net.sf.openrocket.gui.adaptors.MaterialModel;
20 import net.sf.openrocket.gui.components.BasicSlider;
21 import net.sf.openrocket.gui.components.HtmlLabel;
22 import net.sf.openrocket.gui.components.StyledLabel;
23 import net.sf.openrocket.gui.components.StyledLabel.Style;
24 import net.sf.openrocket.gui.components.UnitSelector;
25 import net.sf.openrocket.l10n.Translator;
26 import net.sf.openrocket.material.Material;
27 import net.sf.openrocket.rocketcomponent.MassObject;
28 import net.sf.openrocket.rocketcomponent.MotorMount.IgnitionEvent;
29 import net.sf.openrocket.rocketcomponent.Parachute;
30 import net.sf.openrocket.rocketcomponent.RocketComponent;
31 import net.sf.openrocket.startup.Application;
32 import net.sf.openrocket.unit.UnitGroup;
33
34 public class ParachuteConfig extends RecoveryDeviceConfig {
35         private static final Translator trans = Application.getTranslator();
36         
37         public ParachuteConfig(OpenRocketDocument d, final RocketComponent component) {
38                 super(d, component);
39                 
40                 JPanel primary = new JPanel(new MigLayout());
41                 
42                 JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
43                 
44
45                 //// Canopy
46                 panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Canopy"), Style.BOLD), "wrap unrel");
47                 
48                 //// Diameter:
49                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Diameter")));
50                 
51                 DoubleModel m = new DoubleModel(component, "Diameter", UnitGroup.UNITS_LENGTH, 0);
52                 
53                 JSpinner spin = new JSpinner(m.getSpinnerModel());
54                 spin.setEditor(new SpinnerEditor(spin));
55                 panel.add(spin, "growx");
56                 panel.add(new UnitSelector(m), "growx");
57                 panel.add(new BasicSlider(m.getSliderModel(0, 0.4, 1.5)), "w 100lp, wrap");
58                 
59                 //// Material:
60                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material")));
61                 
62                 JComboBox combo = new JComboBox(new MaterialModel(panel, component,
63                                 Material.Type.SURFACE));
64                 //// The component material affects the weight of the component.
65                 combo.setToolTipText(trans.get("ParachuteCfg.combo.MaterialModel"));
66                 panel.add(combo, "spanx 3, growx, wrap paragraph");
67                 
68                 //              materialPanel(panel, Material.Type.SURFACE, "Material:", null);
69                 
70
71
72                 // CD
73                 //// <html>Drag coefficient C<sub>D</sub>:
74                 JLabel label = new HtmlLabel(trans.get("ParachuteCfg.lbl.longA1"));
75                 String tip = trans.get("ParachuteCfg.lbl.longB1") +
76                                 trans.get("ParachuteCfg.lbl.longB2") + "  " +
77                                 trans.get("ParachuteCfg.lbl.longB3");
78                 label.setToolTipText(tip);
79                 panel.add(label);
80                 
81                 m = new DoubleModel(component, "CD", UnitGroup.UNITS_COEFFICIENT, 0);
82                 
83                 spin = new JSpinner(m.getSpinnerModel());
84                 spin.setToolTipText(tip);
85                 spin.setEditor(new SpinnerEditor(spin));
86                 panel.add(spin, "growx");
87                 
88                 //// Reset button
89                 JButton button = new JButton(trans.get("ParachuteCfg.but.Reset"));
90                 button.addActionListener(new ActionListener() {
91                         @Override
92                         public void actionPerformed(ActionEvent e) {
93                                 Parachute p = (Parachute) component;
94                                 p.setCD(Parachute.DEFAULT_CD);
95                         }
96                 });
97                 panel.add(button, "spanx, wrap 30lp");
98                 
99
100
101                 ////  Shroud lines
102                 panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Shroudlines"), Style.BOLD), "wrap unrel");
103                 
104                 //// Number of lines:
105                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Numberoflines")));
106                 IntegerModel im = new IntegerModel(component, "LineCount", 0);
107                 
108                 spin = new JSpinner(im.getSpinnerModel());
109                 spin.setEditor(new SpinnerEditor(spin));
110                 panel.add(spin, "growx, wrap");
111                 
112                 //// Line length:
113                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Linelength")));
114                 
115                 m = new DoubleModel(component, "LineLength", UnitGroup.UNITS_LENGTH, 0);
116                 
117                 spin = new JSpinner(m.getSpinnerModel());
118                 spin.setEditor(new SpinnerEditor(spin));
119                 panel.add(spin, "growx");
120                 panel.add(new UnitSelector(m), "growx");
121                 panel.add(new BasicSlider(m.getSliderModel(0, 0.4, 1.5)), "w 100lp, wrap");
122                 
123                 //// Material:
124                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material")));
125                 
126                 combo = new JComboBox(new MaterialModel(panel, component, Material.Type.LINE,
127                                 "LineMaterial"));
128                 panel.add(combo, "spanx 3, growx, wrap");
129                 
130
131
132                 primary.add(panel, "grow, gapright 20lp");
133                 panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
134                 
135
136
137
138                 //// Position
139                 //// Position relative to:
140                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Posrelativeto")));
141                 
142                 combo = new JComboBox(
143                                 new EnumModel<RocketComponent.Position>(component, "RelativePosition",
144                                                 new RocketComponent.Position[] {
145                                                                 RocketComponent.Position.TOP,
146                                                                 RocketComponent.Position.MIDDLE,
147                                                                 RocketComponent.Position.BOTTOM,
148                                                                 RocketComponent.Position.ABSOLUTE
149                                 }));
150                 panel.add(combo, "spanx, growx, wrap");
151                 
152                 //// plus
153                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plus")), "right");
154                 
155                 m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH);
156                 spin = new JSpinner(m.getSpinnerModel());
157                 spin.setEditor(new SpinnerEditor(spin));
158                 panel.add(spin, "growx");
159                 
160                 panel.add(new UnitSelector(m), "growx");
161                 panel.add(new BasicSlider(m.getSliderModel(
162                                 new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE),
163                                 new DoubleModel(component.getParent(), "Length"))),
164                                 "w 100lp, wrap");
165                 
166
167                 ////  Spatial length
168                 //// Packed length:
169                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Packedlength")));
170                 
171                 m = new DoubleModel(component, "Length", UnitGroup.UNITS_LENGTH, 0);
172                 
173                 spin = new JSpinner(m.getSpinnerModel());
174                 spin.setEditor(new SpinnerEditor(spin));
175                 panel.add(spin, "growx");
176                 
177                 panel.add(new UnitSelector(m), "growx");
178                 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.5)), "w 100lp, wrap");
179                 
180
181                 //// Tube diameter
182                 //// Packed diameter:
183                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Packeddiam")));
184                 
185                 DoubleModel od = new DoubleModel(component, "Radius", 2, UnitGroup.UNITS_LENGTH, 0);
186                 // Diameter = 2*Radius
187                 
188                 spin = new JSpinner(od.getSpinnerModel());
189                 spin.setEditor(new SpinnerEditor(spin));
190                 panel.add(spin, "growx");
191                 
192                 panel.add(new UnitSelector(od), "growx");
193                 panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 30lp");
194                 
195
196                 //// Deployment
197                 //// Deploys at:
198                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Deploysat")), "");
199                 
200                 combo = new JComboBox(new EnumModel<IgnitionEvent>(component, "DeployEvent"));
201                 panel.add(combo, "spanx 3, growx, wrap");
202                 
203                 // ... and delay
204                 //// plus
205                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plusdelay")), "right");
206                 
207                 m = new DoubleModel(component, "DeployDelay", 0);
208                 spin = new JSpinner(m.getSpinnerModel());
209                 spin.setEditor(new SpinnerEditor(spin));
210                 panel.add(spin, "spanx, split");
211                 
212                 //// seconds
213                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.seconds")), "wrap paragraph");
214                 
215                 // Altitude:
216                 label = new JLabel(trans.get("ParachuteCfg.lbl.Altitude"));
217                 altitudeComponents.add(label);
218                 panel.add(label);
219                 
220                 m = new DoubleModel(component, "DeployAltitude", UnitGroup.UNITS_DISTANCE, 0);
221                 
222                 spin = new JSpinner(m.getSpinnerModel());
223                 spin.setEditor(new SpinnerEditor(spin));
224                 altitudeComponents.add(spin);
225                 panel.add(spin, "growx");
226                 UnitSelector unit = new UnitSelector(m);
227                 altitudeComponents.add(unit);
228                 panel.add(unit, "growx");
229                 BasicSlider slider = new BasicSlider(m.getSliderModel(100, 1000));
230                 altitudeComponents.add(slider);
231                 panel.add(slider, "w 100lp, wrap");
232                 
233
234                 primary.add(panel, "grow");
235                 
236                 updateFields();
237                 
238                 //// General and General properties
239                 tabbedPane.insertTab(trans.get("ParachuteCfg.tab.General"), null, primary, trans.get("ParachuteCfg.tab.ttip.General"), 0);
240                 //// Radial position and Radial position configuration
241                 tabbedPane.insertTab(trans.get("ParachuteCfg.tab.Radialpos"), null, positionTab(),
242                                 trans.get("ParachuteCfg.tab.ttip.Radialpos"), 1);
243                 tabbedPane.setSelectedIndex(0);
244         }
245         
246         
247
248
249
250         protected JPanel positionTab() {
251                 JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", ""));
252                 
253                 ////  Radial position
254                 //// Radial distance:
255                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Radialdistance")));
256                 
257                 DoubleModel m = new DoubleModel(component, "RadialPosition", UnitGroup.UNITS_LENGTH, 0);
258                 
259                 JSpinner spin = new JSpinner(m.getSpinnerModel());
260                 spin.setEditor(new SpinnerEditor(spin));
261                 panel.add(spin, "growx");
262                 
263                 panel.add(new UnitSelector(m), "growx");
264                 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap");
265                 
266
267                 //// Radial direction:
268                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Radialdirection")));
269                 
270                 m = new DoubleModel(component, "RadialDirection", UnitGroup.UNITS_ANGLE, 0);
271                 
272                 spin = new JSpinner(m.getSpinnerModel());
273                 spin.setEditor(new SpinnerEditor(spin));
274                 panel.add(spin, "growx");
275                 
276                 panel.add(new UnitSelector(m), "growx");
277                 panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap");
278                 
279
280                 //// Reset button
281                 JButton button = new JButton(trans.get("ParachuteCfg.but.Reset"));
282                 button.addActionListener(new ActionListener() {
283                         @Override
284                         public void actionPerformed(ActionEvent e) {
285                                 ((MassObject) component).setRadialDirection(0.0);
286                                 ((MassObject) component).setRadialPosition(0.0);
287                         }
288                 });
289                 panel.add(button, "spanx, right");
290                 
291                 return panel;
292         }
293 }