1 package net.sf.openrocket.gui.configdialog;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
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;
13 import net.miginfocom.swing.MigLayout;
14 import net.sf.openrocket.gui.SpinnerEditor;
15 import net.sf.openrocket.gui.adaptors.DoubleModel;
16 import net.sf.openrocket.gui.adaptors.EnumModel;
17 import net.sf.openrocket.gui.adaptors.IntegerModel;
18 import net.sf.openrocket.gui.adaptors.MaterialModel;
19 import net.sf.openrocket.gui.components.BasicSlider;
20 import net.sf.openrocket.gui.components.HtmlLabel;
21 import net.sf.openrocket.gui.components.StyledLabel;
22 import net.sf.openrocket.gui.components.UnitSelector;
23 import net.sf.openrocket.gui.components.StyledLabel.Style;
24 import net.sf.openrocket.l10n.Translator;
25 import net.sf.openrocket.material.Material;
26 import net.sf.openrocket.rocketcomponent.MassObject;
27 import net.sf.openrocket.rocketcomponent.Parachute;
28 import net.sf.openrocket.rocketcomponent.RocketComponent;
29 import net.sf.openrocket.rocketcomponent.MotorMount.IgnitionEvent;
30 import net.sf.openrocket.startup.Application;
31 import net.sf.openrocket.unit.UnitGroup;
33 public class ParachuteConfig extends RecoveryDeviceConfig {
34 private static final Translator trans = Application.getTranslator();
36 public ParachuteConfig(final RocketComponent component) {
39 JPanel primary = new JPanel(new MigLayout());
41 JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::][]",""));
45 panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Canopy"), Style.BOLD), "wrap unrel");
48 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Diameter")));
50 DoubleModel m = new DoubleModel(component,"Diameter",UnitGroup.UNITS_LENGTH,0);
52 JSpinner spin = new JSpinner(m.getSpinnerModel());
53 spin.setEditor(new SpinnerEditor(spin));
54 panel.add(spin,"growx");
55 panel.add(new UnitSelector(m),"growx");
56 panel.add(new BasicSlider(m.getSliderModel(0, 0.4, 1.5)),"w 100lp, wrap");
59 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material")));
61 JComboBox combo = new JComboBox(new MaterialModel(panel, component,
62 Material.Type.SURFACE));
63 //// The component material affects the weight of the component.
64 combo.setToolTipText(trans.get("ParachuteCfg.combo.MaterialModel"));
65 panel.add(combo,"spanx 3, growx, wrap paragraph");
67 // materialPanel(panel, Material.Type.SURFACE, "Material:", null);
72 //// <html>Drag coefficient C<sub>D</sub>:
73 JLabel label = new HtmlLabel(trans.get("ParachuteCfg.lbl.longA1"));
74 String tip = trans.get("ParachuteCfg.lbl.longB1") +
75 trans.get("ParachuteCfg.lbl.longB2") + " " +
76 trans.get("ParachuteCfg.lbl.longB3");
77 label.setToolTipText(tip);
80 m = new DoubleModel(component,"CD",UnitGroup.UNITS_COEFFICIENT,0);
82 spin = new JSpinner(m.getSpinnerModel());
83 spin.setToolTipText(tip);
84 spin.setEditor(new SpinnerEditor(spin));
85 panel.add(spin,"growx");
88 JButton button = new JButton(trans.get("ParachuteCfg.but.Reset"));
89 button.addActionListener(new ActionListener() {
91 public void actionPerformed(ActionEvent e) {
92 Parachute p = (Parachute)component;
93 p.setCD(Parachute.DEFAULT_CD);
96 panel.add(button,"spanx, wrap 30lp");
101 panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Shroudlines"), Style.BOLD), "wrap unrel");
103 //// Number of lines:
104 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Numberoflines")));
105 IntegerModel im = new IntegerModel(component,"LineCount",0);
107 spin = new JSpinner(im.getSpinnerModel());
108 spin.setEditor(new SpinnerEditor(spin));
109 panel.add(spin,"growx, wrap");
112 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Linelength")));
114 m = new DoubleModel(component,"LineLength",UnitGroup.UNITS_LENGTH,0);
116 spin = new JSpinner(m.getSpinnerModel());
117 spin.setEditor(new SpinnerEditor(spin));
118 panel.add(spin,"growx");
119 panel.add(new UnitSelector(m),"growx");
120 panel.add(new BasicSlider(m.getSliderModel(0, 0.4, 1.5)),"w 100lp, wrap");
123 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material")));
125 combo = new JComboBox(new MaterialModel(panel, component, Material.Type.LINE,
127 panel.add(combo,"spanx 3, growx, wrap");
131 primary.add(panel, "grow, gapright 20lp");
132 panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::][]",""));
138 //// Position relative to:
139 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Posrelativeto")));
141 combo = new JComboBox(
142 new EnumModel<RocketComponent.Position>(component, "RelativePosition",
143 new RocketComponent.Position[] {
144 RocketComponent.Position.TOP,
145 RocketComponent.Position.MIDDLE,
146 RocketComponent.Position.BOTTOM,
147 RocketComponent.Position.ABSOLUTE
149 panel.add(combo,"spanx, growx, wrap");
152 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plus")),"right");
154 m = new DoubleModel(component,"PositionValue",UnitGroup.UNITS_LENGTH);
155 spin = new JSpinner(m.getSpinnerModel());
156 spin.setEditor(new SpinnerEditor(spin));
157 panel.add(spin,"growx");
159 panel.add(new UnitSelector(m),"growx");
160 panel.add(new BasicSlider(m.getSliderModel(
161 new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE),
162 new DoubleModel(component.getParent(), "Length"))),
168 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Packedlength")));
170 m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
172 spin = new JSpinner(m.getSpinnerModel());
173 spin.setEditor(new SpinnerEditor(spin));
174 panel.add(spin,"growx");
176 panel.add(new UnitSelector(m),"growx");
177 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.5)),"w 100lp, wrap");
181 //// Packed diameter:
182 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Packeddiam")));
184 DoubleModel od = new DoubleModel(component,"Radius",2,UnitGroup.UNITS_LENGTH,0);
185 // Diameter = 2*Radius
187 spin = new JSpinner(od.getSpinnerModel());
188 spin.setEditor(new SpinnerEditor(spin));
189 panel.add(spin,"growx");
191 panel.add(new UnitSelector(od),"growx");
192 panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)),"w 100lp, wrap 30lp");
197 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Deploysat")),"");
199 combo = new JComboBox(new EnumModel<IgnitionEvent>(component, "DeployEvent"));
200 panel.add(combo,"spanx 3, growx, wrap");
204 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plus")),"right");
206 m = new DoubleModel(component,"DeployDelay",0);
207 spin = new JSpinner(m.getSpinnerModel());
208 spin.setEditor(new SpinnerEditor(spin));
209 panel.add(spin,"spanx, split");
212 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.seconds")),"wrap paragraph");
215 label = new JLabel(trans.get("ParachuteCfg.lbl.Altitude"));
216 altitudeComponents.add(label);
219 m = new DoubleModel(component,"DeployAltitude",UnitGroup.UNITS_DISTANCE,0);
221 spin = new JSpinner(m.getSpinnerModel());
222 spin.setEditor(new SpinnerEditor(spin));
223 altitudeComponents.add(spin);
224 panel.add(spin,"growx");
225 UnitSelector unit = new UnitSelector(m);
226 altitudeComponents.add(unit);
227 panel.add(unit,"growx");
228 BasicSlider slider = new BasicSlider(m.getSliderModel(100, 1000));
229 altitudeComponents.add(slider);
230 panel.add(slider,"w 100lp, wrap");
233 primary.add(panel, "grow");
237 //// General and General properties
238 tabbedPane.insertTab(trans.get("ParachuteCfg.tab.General"), null, primary, trans.get("ParachuteCfg.tab.ttip.General"), 0);
239 //// Radial position and Radial position configuration
240 tabbedPane.insertTab(trans.get("ParachuteCfg.tab.Radialpos"), null, positionTab(),
241 trans.get("ParachuteCfg.tab.ttip.Radialpos"), 1);
242 tabbedPane.setSelectedIndex(0);
249 protected JPanel positionTab() {
250 JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::]",""));
253 //// Radial distance:
254 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Radialdistance")));
256 DoubleModel m = new DoubleModel(component,"RadialPosition",UnitGroup.UNITS_LENGTH,0);
258 JSpinner spin = new JSpinner(m.getSpinnerModel());
259 spin.setEditor(new SpinnerEditor(spin));
260 panel.add(spin,"growx");
262 panel.add(new UnitSelector(m),"growx");
263 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)),"w 100lp, wrap");
266 //// Radial direction:
267 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Radialdirection")));
269 m = new DoubleModel(component,"RadialDirection",UnitGroup.UNITS_ANGLE,0);
271 spin = new JSpinner(m.getSpinnerModel());
272 spin.setEditor(new SpinnerEditor(spin));
273 panel.add(spin,"growx");
275 panel.add(new UnitSelector(m),"growx");
276 panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)),"w 100lp, wrap");
280 JButton button = new JButton(trans.get("ParachuteCfg.but.Reset"));
281 button.addActionListener(new ActionListener() {
283 public void actionPerformed(ActionEvent e) {
284 ((MassObject) component).setRadialDirection(0.0);
285 ((MassObject) component).setRadialPosition(0.0);
288 panel.add(button,"spanx, right");