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.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;
34 public class ParachuteConfig extends RecoveryDeviceConfig {
35 private static final Translator trans = Application.getTranslator();
37 public ParachuteConfig(OpenRocketDocument d, final RocketComponent component) {
40 JPanel primary = new JPanel(new MigLayout());
42 JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
46 panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Canopy"), Style.BOLD), "wrap unrel");
49 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Diameter")));
51 DoubleModel m = new DoubleModel(component, "Diameter", UnitGroup.UNITS_LENGTH, 0);
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");
60 JLabel label = new HtmlLabel(trans.get("ParachuteCfg.lbl.longA1"));
61 String tip = trans.get("ParachuteCfg.lbl.longB1") +
62 trans.get("ParachuteCfg.lbl.longB2") + " " +
63 trans.get("ParachuteCfg.lbl.longB3");
64 label.setToolTipText(tip);
67 m = new DoubleModel(component, "CD", UnitGroup.UNITS_COEFFICIENT, 0);
69 spin = new JSpinner(m.getSpinnerModel());
70 spin.setToolTipText(tip);
71 spin.setEditor(new SpinnerEditor(spin));
72 panel.add(spin, "growx");
75 JButton button = new JButton(trans.get("ParachuteCfg.but.Reset"));
76 button.addActionListener(new ActionListener() {
78 public void actionPerformed(ActionEvent e) {
79 Parachute p = (Parachute) component;
80 p.setCD(Parachute.DEFAULT_CD);
83 panel.add(button, "spanx, wrap para");
86 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material")));
88 JComboBox combo = new JComboBox(new MaterialModel(panel, component,
89 Material.Type.SURFACE));
90 combo.setToolTipText(trans.get("ParachuteCfg.combo.MaterialModel"));
91 panel.add(combo, "spanx 3, growx, wrap 30lp");
97 panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Shroudlines"), Style.BOLD), "wrap unrel");
100 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Numberoflines")));
101 IntegerModel im = new IntegerModel(component, "LineCount", 0);
103 spin = new JSpinner(im.getSpinnerModel());
104 spin.setEditor(new SpinnerEditor(spin));
105 panel.add(spin, "growx, wrap");
108 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Linelength")));
110 m = new DoubleModel(component, "LineLength", UnitGroup.UNITS_LENGTH, 0);
112 spin = new JSpinner(m.getSpinnerModel());
113 spin.setEditor(new SpinnerEditor(spin));
114 panel.add(spin, "growx");
115 panel.add(new UnitSelector(m), "growx");
116 panel.add(new BasicSlider(m.getSliderModel(0, 0.4, 1.5)), "w 100lp, wrap");
119 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material")));
121 combo = new JComboBox(new MaterialModel(panel, component, Material.Type.LINE,
123 panel.add(combo, "spanx 3, growx, wrap");
127 primary.add(panel, "grow, gapright 20lp");
128 panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
134 //// Position relative to:
135 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Posrelativeto")));
137 combo = new JComboBox(
138 new EnumModel<RocketComponent.Position>(component, "RelativePosition",
139 new RocketComponent.Position[] {
140 RocketComponent.Position.TOP,
141 RocketComponent.Position.MIDDLE,
142 RocketComponent.Position.BOTTOM,
143 RocketComponent.Position.ABSOLUTE
145 panel.add(combo, "spanx, growx, wrap");
148 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plus")), "right");
150 m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH);
151 spin = new JSpinner(m.getSpinnerModel());
152 spin.setEditor(new SpinnerEditor(spin));
153 panel.add(spin, "growx");
155 panel.add(new UnitSelector(m), "growx");
156 panel.add(new BasicSlider(m.getSliderModel(
157 new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE),
158 new DoubleModel(component.getParent(), "Length"))),
164 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Packedlength")));
166 m = new DoubleModel(component, "Length", UnitGroup.UNITS_LENGTH, 0);
168 spin = new JSpinner(m.getSpinnerModel());
169 spin.setEditor(new SpinnerEditor(spin));
170 panel.add(spin, "growx");
172 panel.add(new UnitSelector(m), "growx");
173 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.5)), "w 100lp, wrap");
177 //// Packed diameter:
178 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Packeddiam")));
180 DoubleModel od = new DoubleModel(component, "Radius", 2, UnitGroup.UNITS_LENGTH, 0);
181 // Diameter = 2*Radius
183 spin = new JSpinner(od.getSpinnerModel());
184 spin.setEditor(new SpinnerEditor(spin));
185 panel.add(spin, "growx");
187 panel.add(new UnitSelector(od), "growx");
188 panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 30lp");
193 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Deploysat")), "");
195 combo = new JComboBox(new EnumModel<IgnitionEvent>(component, "DeployEvent"));
196 panel.add(combo, "spanx 3, growx, wrap");
200 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plusdelay")), "right");
202 m = new DoubleModel(component, "DeployDelay", 0);
203 spin = new JSpinner(m.getSpinnerModel());
204 spin.setEditor(new SpinnerEditor(spin,3));
205 panel.add(spin, "spanx, split");
208 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.seconds")), "wrap paragraph");
211 label = new JLabel(trans.get("ParachuteCfg.lbl.Altitude"));
212 altitudeComponents.add(label);
215 m = new DoubleModel(component, "DeployAltitude", UnitGroup.UNITS_DISTANCE, 0);
217 spin = new JSpinner(m.getSpinnerModel());
218 spin.setEditor(new SpinnerEditor(spin));
219 altitudeComponents.add(spin);
220 panel.add(spin, "growx");
221 UnitSelector unit = new UnitSelector(m);
222 altitudeComponents.add(unit);
223 panel.add(unit, "growx");
224 BasicSlider slider = new BasicSlider(m.getSliderModel(100, 1000));
225 altitudeComponents.add(slider);
226 panel.add(slider, "w 100lp, wrap");
229 primary.add(panel, "grow");
233 //// General and General properties
234 tabbedPane.insertTab(trans.get("ParachuteCfg.tab.General"), null, primary, trans.get("ParachuteCfg.tab.ttip.General"), 0);
235 //// Radial position and Radial position configuration
236 tabbedPane.insertTab(trans.get("ParachuteCfg.tab.Radialpos"), null, positionTab(),
237 trans.get("ParachuteCfg.tab.ttip.Radialpos"), 1);
238 tabbedPane.setSelectedIndex(0);
245 protected JPanel positionTab() {
246 JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", ""));
249 //// Radial distance:
250 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Radialdistance")));
252 DoubleModel m = new DoubleModel(component, "RadialPosition", UnitGroup.UNITS_LENGTH, 0);
254 JSpinner spin = new JSpinner(m.getSpinnerModel());
255 spin.setEditor(new SpinnerEditor(spin));
256 panel.add(spin, "growx");
258 panel.add(new UnitSelector(m), "growx");
259 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap");
262 //// Radial direction:
263 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Radialdirection")));
265 m = new DoubleModel(component, "RadialDirection", UnitGroup.UNITS_ANGLE);
267 spin = new JSpinner(m.getSpinnerModel());
268 spin.setEditor(new SpinnerEditor(spin));
269 panel.add(spin, "growx");
271 panel.add(new UnitSelector(m), "growx");
272 panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap");
276 JButton button = new JButton(trans.get("ParachuteCfg.but.Reset"));
277 button.addActionListener(new ActionListener() {
279 public void actionPerformed(ActionEvent e) {
280 ((MassObject) component).setRadialDirection(0.0);
281 ((MassObject) component).setRadialPosition(0.0);
284 panel.add(button, "spanx, right");