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.JCheckBox;
9 import javax.swing.JComboBox;
10 import javax.swing.JLabel;
11 import javax.swing.JPanel;
12 import javax.swing.JSpinner;
14 import net.miginfocom.swing.MigLayout;
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.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.l10n.Translator;
24 import net.sf.openrocket.material.Material;
25 import net.sf.openrocket.rocketcomponent.MassComponent;
26 import net.sf.openrocket.rocketcomponent.MotorMount.IgnitionEvent;
27 import net.sf.openrocket.rocketcomponent.RocketComponent;
28 import net.sf.openrocket.startup.Application;
29 import net.sf.openrocket.unit.UnitGroup;
31 public class StreamerConfig extends RecoveryDeviceConfig {
32 private static final Translator trans = Application.getTranslator();
34 public StreamerConfig(final RocketComponent component) {
37 JPanel primary = new JPanel(new MigLayout());
39 JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
43 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Striplength")));
45 DoubleModel m = new DoubleModel(component, "StripLength", UnitGroup.UNITS_LENGTH, 0);
47 JSpinner spin = new JSpinner(m.getSpinnerModel());
48 spin.setEditor(new SpinnerEditor(spin));
49 panel.add(spin, "growx");
50 panel.add(new UnitSelector(m), "growx");
51 panel.add(new BasicSlider(m.getSliderModel(0, 0.6, 1.5)), "w 100lp, wrap");
54 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Stripwidth")));
56 m = new DoubleModel(component, "StripWidth", UnitGroup.UNITS_LENGTH, 0);
58 spin = new JSpinner(m.getSpinnerModel());
59 spin.setEditor(new SpinnerEditor(spin));
60 panel.add(spin, "growx");
61 panel.add(new UnitSelector(m), "growx");
62 panel.add(new BasicSlider(m.getSliderModel(0, 0.2)), "w 100lp, wrap 20lp");
67 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Striparea")));
69 m = new DoubleModel(component, "Area", UnitGroup.UNITS_AREA, 0);
71 spin = new JSpinner(m.getSpinnerModel());
72 spin.setEditor(new SpinnerEditor(spin));
73 panel.add(spin, "growx");
74 panel.add(new UnitSelector(m), "growx");
75 panel.add(new BasicSlider(m.getSliderModel(0, 0.04, 0.25)), "w 100lp, wrap");
78 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Aspectratio")));
80 m = new DoubleModel(component, "AspectRatio", UnitGroup.UNITS_NONE, 0);
82 spin = new JSpinner(m.getSpinnerModel());
83 spin.setEditor(new SpinnerEditor(spin));
84 panel.add(spin, "growx");
85 // panel.add(new UnitSelector(m),"growx");
86 panel.add(new BasicSlider(m.getSliderModel(2, 15)), "skip, w 100lp, wrap 20lp");
90 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Material")));
92 JComboBox combo = new JComboBox(new MaterialModel(panel, component,
93 Material.Type.SURFACE));
94 //// The component material affects the weight of the component.
95 combo.setToolTipText(trans.get("StreamerCfg.combo.ttip.MaterialModel"));
96 panel.add(combo, "spanx 3, growx, wrap 20lp");
101 //// <html>Drag coefficient C<sub>D</sub>:
102 JLabel label = new HtmlLabel(trans.get("StreamerCfg.lbl.longA1"));
103 //// <html>The drag coefficient relative to the total area of the streamer.<br>
104 String tip = trans.get("StreamerCfg.lbl.longB1") +
105 //// "A larger drag coefficient yields a slowed descent rate.
106 trans.get("StreamerCfg.lbl.longB2");
107 label.setToolTipText(tip);
110 m = new DoubleModel(component, "CD", UnitGroup.UNITS_COEFFICIENT, 0);
112 spin = new JSpinner(m.getSpinnerModel());
113 spin.setToolTipText(tip);
114 spin.setEditor(new SpinnerEditor(spin));
115 panel.add(spin, "growx");
117 JCheckBox check = new JCheckBox(m.getAutomaticAction());
119 check.setText(trans.get("StreamerCfg.lbl.Automatic"));
120 panel.add(check, "skip, span, wrap");
122 //// The drag coefficient is relative to the area of the streamer.
123 panel.add(new StyledLabel(trans.get("StreamerCfg.lbl.longC1"),
128 primary.add(panel, "grow, gapright 20lp");
129 panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
135 //// Position relative to:
136 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Posrelativeto")));
138 combo = new JComboBox(
139 new EnumModel<RocketComponent.Position>(component, "RelativePosition",
140 new RocketComponent.Position[] {
141 RocketComponent.Position.TOP,
142 RocketComponent.Position.MIDDLE,
143 RocketComponent.Position.BOTTOM,
144 RocketComponent.Position.ABSOLUTE
146 panel.add(combo, "spanx, growx, wrap");
149 panel.add(new JLabel(trans.get("StreamerCfg.lbl.plus")), "right");
151 m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH);
152 spin = new JSpinner(m.getSpinnerModel());
153 spin.setEditor(new SpinnerEditor(spin));
154 panel.add(spin, "growx");
156 panel.add(new UnitSelector(m), "growx");
157 panel.add(new BasicSlider(m.getSliderModel(
158 new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE),
159 new DoubleModel(component.getParent(), "Length"))),
164 panel.add(new JLabel(trans.get("StreamerCfg.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("StreamerCfg.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("StreamerCfg.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("StreamerCfg.lbl.plusdelay")), "right");
202 m = new DoubleModel(component, "DeployDelay", 0);
203 spin = new JSpinner(m.getSpinnerModel());
204 spin.setEditor(new SpinnerEditor(spin));
205 panel.add(spin, "spanx, split");
208 panel.add(new JLabel(trans.get("StreamerCfg.lbl.seconds")), "wrap paragraph");
211 label = new JLabel(trans.get("StreamerCfg.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("StreamerCfg.tab.General"), null, primary,
235 trans.get("StreamerCfg.tab.ttip.General"), 0);
236 //// Radial position and Radial position configuration
237 tabbedPane.insertTab(trans.get("StreamerCfg.tab.Radialpos"), null, positionTab(),
238 trans.get("StreamerCfg.tab.ttip.Radialpos"), 1);
239 tabbedPane.setSelectedIndex(0);
246 protected JPanel positionTab() {
247 JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", ""));
250 //// Radial distance:
251 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Radialdistance")));
253 DoubleModel m = new DoubleModel(component, "RadialPosition", UnitGroup.UNITS_LENGTH, 0);
255 JSpinner spin = new JSpinner(m.getSpinnerModel());
256 spin.setEditor(new SpinnerEditor(spin));
257 panel.add(spin, "growx");
259 panel.add(new UnitSelector(m), "growx");
260 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap");
263 //// Radial direction
264 //// Radial direction:
265 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Radialdirection")));
267 m = new DoubleModel(component, "RadialDirection", UnitGroup.UNITS_ANGLE, 0);
269 spin = new JSpinner(m.getSpinnerModel());
270 spin.setEditor(new SpinnerEditor(spin));
271 panel.add(spin, "growx");
273 panel.add(new UnitSelector(m), "growx");
274 panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap");
278 JButton button = new JButton(trans.get("StreamerCfg.but.Reset"));
279 button.addActionListener(new ActionListener() {
281 public void actionPerformed(ActionEvent e) {
282 ((MassComponent) component).setRadialDirection(0.0);
283 ((MassComponent) component).setRadialPosition(0.0);
286 panel.add(button, "spanx, right");