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.ResizeLabel;
21 import net.sf.openrocket.gui.components.UnitSelector;
22 import net.sf.openrocket.material.Material;
23 import net.sf.openrocket.rocketcomponent.MassComponent;
24 import net.sf.openrocket.rocketcomponent.RocketComponent;
25 import net.sf.openrocket.rocketcomponent.MotorMount.IgnitionEvent;
26 import net.sf.openrocket.unit.UnitGroup;
28 public class StreamerConfig extends RecoveryDeviceConfig {
30 public StreamerConfig(final RocketComponent component) {
33 JPanel primary = new JPanel(new MigLayout());
35 JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::][]",""));
39 panel.add(new JLabel("Strip length:"));
41 DoubleModel m = new DoubleModel(component,"StripLength",UnitGroup.UNITS_LENGTH,0);
43 JSpinner spin = new JSpinner(m.getSpinnerModel());
44 spin.setEditor(new SpinnerEditor(spin));
45 panel.add(spin,"growx");
46 panel.add(new UnitSelector(m),"growx");
47 panel.add(new BasicSlider(m.getSliderModel(0, 0.6, 1.5)),"w 100lp, wrap");
50 panel.add(new JLabel("Strip width:"));
52 m = new DoubleModel(component,"StripWidth",UnitGroup.UNITS_LENGTH,0);
54 spin = new JSpinner(m.getSpinnerModel());
55 spin.setEditor(new SpinnerEditor(spin));
56 panel.add(spin,"growx");
57 panel.add(new UnitSelector(m),"growx");
58 panel.add(new BasicSlider(m.getSliderModel(0, 0.2)),"w 100lp, wrap 20lp");
63 panel.add(new JLabel("Strip area:"));
65 m = new DoubleModel(component,"Area",UnitGroup.UNITS_AREA,0);
67 spin = new JSpinner(m.getSpinnerModel());
68 spin.setEditor(new SpinnerEditor(spin));
69 panel.add(spin,"growx");
70 panel.add(new UnitSelector(m),"growx");
71 panel.add(new BasicSlider(m.getSliderModel(0, 0.04, 0.25)),"w 100lp, wrap");
74 panel.add(new JLabel("Aspect ratio:"));
76 m = new DoubleModel(component,"AspectRatio",UnitGroup.UNITS_NONE,0);
78 spin = new JSpinner(m.getSpinnerModel());
79 spin.setEditor(new SpinnerEditor(spin));
80 panel.add(spin,"growx");
81 // panel.add(new UnitSelector(m),"growx");
82 panel.add(new BasicSlider(m.getSliderModel(2, 15)),"skip, w 100lp, wrap 20lp");
86 panel.add(new JLabel("Material:"));
88 JComboBox combo = new JComboBox(new MaterialModel(panel, component,
89 Material.Type.SURFACE));
90 combo.setToolTipText("The component material affects the weight of the component.");
91 panel.add(combo,"spanx 3, growx, wrap 20lp");
96 JLabel label = new JLabel("<html>Drag coefficient C<sub>D</sub>:");
97 String tip = "<html>The drag coefficient relative to the total area of the streamer.<br>" +
98 "A larger drag coefficient yields a slowed descent rate.";
99 label.setToolTipText(tip);
102 m = new DoubleModel(component,"CD",UnitGroup.UNITS_COEFFICIENT,0);
104 spin = new JSpinner(m.getSpinnerModel());
105 spin.setToolTipText(tip);
106 spin.setEditor(new SpinnerEditor(spin));
107 panel.add(spin,"growx");
109 JCheckBox check = new JCheckBox(m.getAutomaticAction());
110 check.setText("Automatic");
111 panel.add(check,"skip, span, wrap");
113 panel.add(new ResizeLabel("The drag coefficient is relative to the area of the streamer.",
118 primary.add(panel, "grow, gapright 20lp");
119 panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::][]",""));
126 panel.add(new JLabel("Position relative to:"));
128 combo = new JComboBox(
129 new EnumModel<RocketComponent.Position>(component, "RelativePosition",
130 new RocketComponent.Position[] {
131 RocketComponent.Position.TOP,
132 RocketComponent.Position.MIDDLE,
133 RocketComponent.Position.BOTTOM,
134 RocketComponent.Position.ABSOLUTE
136 panel.add(combo,"spanx, growx, wrap");
138 panel.add(new JLabel("plus"),"right");
140 m = new DoubleModel(component,"PositionValue",UnitGroup.UNITS_LENGTH);
141 spin = new JSpinner(m.getSpinnerModel());
142 spin.setEditor(new SpinnerEditor(spin));
143 panel.add(spin,"growx");
145 panel.add(new UnitSelector(m),"growx");
146 panel.add(new BasicSlider(m.getSliderModel(
147 new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE),
148 new DoubleModel(component.getParent(), "Length"))),
153 panel.add(new JLabel("Packed length:"));
155 m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
157 spin = new JSpinner(m.getSpinnerModel());
158 spin.setEditor(new SpinnerEditor(spin));
159 panel.add(spin,"growx");
161 panel.add(new UnitSelector(m),"growx");
162 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.5)),"w 100lp, wrap");
166 panel.add(new JLabel("Packed diameter:"));
168 DoubleModel od = new DoubleModel(component,"Radius",2,UnitGroup.UNITS_LENGTH,0);
169 // Diameter = 2*Radius
171 spin = new JSpinner(od.getSpinnerModel());
172 spin.setEditor(new SpinnerEditor(spin));
173 panel.add(spin,"growx");
175 panel.add(new UnitSelector(od),"growx");
176 panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)),"w 100lp, wrap 30lp");
181 panel.add(new JLabel("Deploys at:"),"");
183 combo = new JComboBox(new EnumModel<IgnitionEvent>(component, "DeployEvent"));
184 panel.add(combo,"spanx 3, growx, wrap");
187 panel.add(new JLabel("plus"),"right");
189 m = new DoubleModel(component,"DeployDelay",0);
190 spin = new JSpinner(m.getSpinnerModel());
191 spin.setEditor(new SpinnerEditor(spin));
192 panel.add(spin,"spanx, split");
194 panel.add(new JLabel("seconds"),"wrap paragraph");
197 label = new JLabel("Altitude:");
198 altitudeComponents.add(label);
201 m = new DoubleModel(component,"DeployAltitude",UnitGroup.UNITS_DISTANCE,0);
203 spin = new JSpinner(m.getSpinnerModel());
204 spin.setEditor(new SpinnerEditor(spin));
205 altitudeComponents.add(spin);
206 panel.add(spin,"growx");
207 UnitSelector unit = new UnitSelector(m);
208 altitudeComponents.add(unit);
209 panel.add(unit,"growx");
210 BasicSlider slider = new BasicSlider(m.getSliderModel(100, 1000));
211 altitudeComponents.add(slider);
212 panel.add(slider,"w 100lp, wrap");
215 primary.add(panel, "grow");
219 tabbedPane.insertTab("General", null, primary, "General properties", 0);
220 tabbedPane.insertTab("Radial position", null, positionTab(),
221 "Radial position configuration", 1);
222 tabbedPane.setSelectedIndex(0);
229 protected JPanel positionTab() {
230 JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::]",""));
233 panel.add(new JLabel("Radial distance:"));
235 DoubleModel m = new DoubleModel(component,"RadialPosition",UnitGroup.UNITS_LENGTH,0);
237 JSpinner spin = new JSpinner(m.getSpinnerModel());
238 spin.setEditor(new SpinnerEditor(spin));
239 panel.add(spin,"growx");
241 panel.add(new UnitSelector(m),"growx");
242 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)),"w 100lp, wrap");
245 //// Radial direction
246 panel.add(new JLabel("Radial direction:"));
248 m = new DoubleModel(component,"RadialDirection",UnitGroup.UNITS_ANGLE,0);
250 spin = new JSpinner(m.getSpinnerModel());
251 spin.setEditor(new SpinnerEditor(spin));
252 panel.add(spin,"growx");
254 panel.add(new UnitSelector(m),"growx");
255 panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)),"w 100lp, wrap");
259 JButton button = new JButton("Reset");
260 button.addActionListener(new ActionListener() {
262 public void actionPerformed(ActionEvent e) {
263 ((MassComponent) component).setRadialDirection(0.0);
264 ((MassComponent) component).setRadialPosition(0.0);
267 panel.add(button,"spanx, right");