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.document.OpenRocketDocument;
16 import net.sf.openrocket.gui.SpinnerEditor;
17 import net.sf.openrocket.gui.adaptors.DoubleModel;
18 import net.sf.openrocket.gui.adaptors.EnumModel;
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.UnitSelector;
24 import net.sf.openrocket.l10n.Translator;
25 import net.sf.openrocket.material.Material;
26 import net.sf.openrocket.rocketcomponent.MassComponent;
27 import net.sf.openrocket.rocketcomponent.MotorMount.IgnitionEvent;
28 import net.sf.openrocket.rocketcomponent.RocketComponent;
29 import net.sf.openrocket.startup.Application;
30 import net.sf.openrocket.unit.UnitGroup;
32 public class StreamerConfig extends RecoveryDeviceConfig {
33 private static final Translator trans = Application.getTranslator();
35 public StreamerConfig(OpenRocketDocument d, final RocketComponent component) {
38 JPanel primary = new JPanel(new MigLayout());
40 JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
44 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Striplength")));
46 DoubleModel m = new DoubleModel(component, "StripLength", UnitGroup.UNITS_LENGTH, 0);
48 JSpinner spin = new JSpinner(m.getSpinnerModel());
49 spin.setEditor(new SpinnerEditor(spin));
50 panel.add(spin, "growx");
51 panel.add(new UnitSelector(m), "growx");
52 panel.add(new BasicSlider(m.getSliderModel(0, 0.6, 1.5)), "w 100lp, wrap");
55 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Stripwidth")));
57 m = new DoubleModel(component, "StripWidth", UnitGroup.UNITS_LENGTH, 0);
59 spin = new JSpinner(m.getSpinnerModel());
60 spin.setEditor(new SpinnerEditor(spin));
61 panel.add(spin, "growx");
62 panel.add(new UnitSelector(m), "growx");
63 panel.add(new BasicSlider(m.getSliderModel(0, 0.2)), "w 100lp, wrap 20lp");
68 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Striparea")));
70 m = new DoubleModel(component, "Area", UnitGroup.UNITS_AREA, 0);
72 spin = new JSpinner(m.getSpinnerModel());
73 spin.setEditor(new SpinnerEditor(spin));
74 panel.add(spin, "growx");
75 panel.add(new UnitSelector(m), "growx");
76 panel.add(new BasicSlider(m.getSliderModel(0, 0.04, 0.25)), "w 100lp, wrap");
79 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Aspectratio")));
81 m = new DoubleModel(component, "AspectRatio", UnitGroup.UNITS_NONE, 0);
83 spin = new JSpinner(m.getSpinnerModel());
84 spin.setEditor(new SpinnerEditor(spin));
85 panel.add(spin, "growx");
86 // panel.add(new UnitSelector(m),"growx");
87 panel.add(new BasicSlider(m.getSliderModel(2, 15)), "skip, w 100lp, wrap 20lp");
91 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Material")));
93 JComboBox combo = new JComboBox(new MaterialModel(panel, component,
94 Material.Type.SURFACE));
95 //// The component material affects the weight of the component.
96 combo.setToolTipText(trans.get("StreamerCfg.combo.ttip.MaterialModel"));
97 panel.add(combo, "spanx 3, growx, wrap 20lp");
102 //// <html>Drag coefficient C<sub>D</sub>:
103 JLabel label = new HtmlLabel(trans.get("StreamerCfg.lbl.longA1"));
104 //// <html>The drag coefficient relative to the total area of the streamer.<br>
105 String tip = trans.get("StreamerCfg.lbl.longB1") +
106 //// "A larger drag coefficient yields a slowed descent rate.
107 trans.get("StreamerCfg.lbl.longB2");
108 label.setToolTipText(tip);
111 m = new DoubleModel(component, "CD", UnitGroup.UNITS_COEFFICIENT, 0);
113 spin = new JSpinner(m.getSpinnerModel());
114 spin.setToolTipText(tip);
115 spin.setEditor(new SpinnerEditor(spin));
116 panel.add(spin, "growx");
118 JCheckBox check = new JCheckBox(m.getAutomaticAction());
120 check.setText(trans.get("StreamerCfg.lbl.Automatic"));
121 panel.add(check, "skip, span, wrap");
123 //// The drag coefficient is relative to the area of the streamer.
124 panel.add(new StyledLabel(trans.get("StreamerCfg.lbl.longC1"),
129 primary.add(panel, "grow, gapright 20lp");
130 panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
136 //// Position relative to:
137 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Posrelativeto")));
139 combo = new JComboBox(
140 new EnumModel<RocketComponent.Position>(component, "RelativePosition",
141 new RocketComponent.Position[] {
142 RocketComponent.Position.TOP,
143 RocketComponent.Position.MIDDLE,
144 RocketComponent.Position.BOTTOM,
145 RocketComponent.Position.ABSOLUTE
147 panel.add(combo, "spanx, growx, wrap");
150 panel.add(new JLabel(trans.get("StreamerCfg.lbl.plus")), "right");
152 m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH);
153 spin = new JSpinner(m.getSpinnerModel());
154 spin.setEditor(new SpinnerEditor(spin));
155 panel.add(spin, "growx");
157 panel.add(new UnitSelector(m), "growx");
158 panel.add(new BasicSlider(m.getSliderModel(
159 new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE),
160 new DoubleModel(component.getParent(), "Length"))),
165 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Packedlength")));
167 m = new DoubleModel(component, "Length", UnitGroup.UNITS_LENGTH, 0);
169 spin = new JSpinner(m.getSpinnerModel());
170 spin.setEditor(new SpinnerEditor(spin));
171 panel.add(spin, "growx");
173 panel.add(new UnitSelector(m), "growx");
174 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.5)), "w 100lp, wrap");
178 //// Packed diameter:
179 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Packeddiam")));
181 DoubleModel od = new DoubleModel(component, "Radius", 2, UnitGroup.UNITS_LENGTH, 0);
182 // Diameter = 2*Radius
184 spin = new JSpinner(od.getSpinnerModel());
185 spin.setEditor(new SpinnerEditor(spin));
186 panel.add(spin, "growx");
188 panel.add(new UnitSelector(od), "growx");
189 panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 30lp");
194 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Deploysat")), "");
196 combo = new JComboBox(new EnumModel<IgnitionEvent>(component, "DeployEvent"));
197 panel.add(combo, "spanx 3, growx, wrap");
201 panel.add(new JLabel(trans.get("StreamerCfg.lbl.plusdelay")), "right");
203 m = new DoubleModel(component, "DeployDelay", 0);
204 spin = new JSpinner(m.getSpinnerModel());
205 spin.setEditor(new SpinnerEditor(spin));
206 panel.add(spin, "spanx, split");
209 panel.add(new JLabel(trans.get("StreamerCfg.lbl.seconds")), "wrap paragraph");
212 label = new JLabel(trans.get("StreamerCfg.lbl.Altitude"));
213 altitudeComponents.add(label);
216 m = new DoubleModel(component, "DeployAltitude", UnitGroup.UNITS_DISTANCE, 0);
218 spin = new JSpinner(m.getSpinnerModel());
219 spin.setEditor(new SpinnerEditor(spin));
220 altitudeComponents.add(spin);
221 panel.add(spin, "growx");
222 UnitSelector unit = new UnitSelector(m);
223 altitudeComponents.add(unit);
224 panel.add(unit, "growx");
225 BasicSlider slider = new BasicSlider(m.getSliderModel(100, 1000));
226 altitudeComponents.add(slider);
227 panel.add(slider, "w 100lp, wrap");
230 primary.add(panel, "grow");
234 //// General and General properties
235 tabbedPane.insertTab(trans.get("StreamerCfg.tab.General"), null, primary,
236 trans.get("StreamerCfg.tab.ttip.General"), 0);
237 //// Radial position and Radial position configuration
238 tabbedPane.insertTab(trans.get("StreamerCfg.tab.Radialpos"), null, positionTab(),
239 trans.get("StreamerCfg.tab.ttip.Radialpos"), 1);
240 tabbedPane.setSelectedIndex(0);
247 protected JPanel positionTab() {
248 JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", ""));
251 //// Radial distance:
252 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Radialdistance")));
254 DoubleModel m = new DoubleModel(component, "RadialPosition", UnitGroup.UNITS_LENGTH, 0);
256 JSpinner spin = new JSpinner(m.getSpinnerModel());
257 spin.setEditor(new SpinnerEditor(spin));
258 panel.add(spin, "growx");
260 panel.add(new UnitSelector(m), "growx");
261 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap");
264 //// Radial direction
265 //// Radial direction:
266 panel.add(new JLabel(trans.get("StreamerCfg.lbl.Radialdirection")));
268 m = new DoubleModel(component, "RadialDirection", UnitGroup.UNITS_ANGLE, 0);
270 spin = new JSpinner(m.getSpinnerModel());
271 spin.setEditor(new SpinnerEditor(spin));
272 panel.add(spin, "growx");
274 panel.add(new UnitSelector(m), "growx");
275 panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap");
279 JButton button = new JButton(trans.get("StreamerCfg.but.Reset"));
280 button.addActionListener(new ActionListener() {
282 public void actionPerformed(ActionEvent e) {
283 ((MassComponent) component).setRadialDirection(0.0);
284 ((MassComponent) component).setRadialPosition(0.0);
287 panel.add(button, "spanx, right");