create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / gui / configdialog / ParachuteConfig.java
1 package net.sf.openrocket.gui.configdialog;
2
3
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6
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;
12
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;
33
34 public class ParachuteConfig extends RecoveryDeviceConfig {
35         private static final Translator trans = Application.getTranslator();
36         
37         public ParachuteConfig(OpenRocketDocument d, final RocketComponent component) {
38                 super(d, component);
39                 
40                 JPanel primary = new JPanel(new MigLayout());
41                 
42                 JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
43                 
44                 
45                 //// Canopy
46                 panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Canopy"), Style.BOLD), "wrap unrel");
47                 
48                 //// Diameter:
49                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Diameter")));
50                 
51                 DoubleModel m = new DoubleModel(component, "Diameter", UnitGroup.UNITS_LENGTH, 0);
52                 
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");
58                 
59                 // CD
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);
65                 panel.add(label);
66                 
67                 m = new DoubleModel(component, "CD", UnitGroup.UNITS_COEFFICIENT, 0);
68                 
69                 spin = new JSpinner(m.getSpinnerModel());
70                 spin.setToolTipText(tip);
71                 spin.setEditor(new SpinnerEditor(spin));
72                 panel.add(spin, "growx");
73                 
74                 //// Reset button
75                 JButton button = new JButton(trans.get("ParachuteCfg.but.Reset"));
76                 button.addActionListener(new ActionListener() {
77                         @Override
78                         public void actionPerformed(ActionEvent e) {
79                                 Parachute p = (Parachute) component;
80                                 p.setCD(Parachute.DEFAULT_CD);
81                         }
82                 });
83                 panel.add(button, "spanx, wrap para");
84                 
85                 //// Material:
86                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material")));
87                 
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");
92                 
93                 
94                 
95                 
96                 ////  Shroud lines
97                 panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Shroudlines"), Style.BOLD), "wrap unrel");
98                 
99                 //// Number of lines:
100                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Numberoflines")));
101                 IntegerModel im = new IntegerModel(component, "LineCount", 0);
102                 
103                 spin = new JSpinner(im.getSpinnerModel());
104                 spin.setEditor(new SpinnerEditor(spin));
105                 panel.add(spin, "growx, wrap");
106                 
107                 //// Line length:
108                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Linelength")));
109                 
110                 m = new DoubleModel(component, "LineLength", UnitGroup.UNITS_LENGTH, 0);
111                 
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");
117                 
118                 //// Material:
119                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material")));
120                 
121                 combo = new JComboBox(new MaterialModel(panel, component, Material.Type.LINE,
122                                 "LineMaterial"));
123                 panel.add(combo, "spanx 3, growx, wrap");
124                 
125                 
126                 
127                 primary.add(panel, "grow, gapright 20lp");
128                 panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
129                 
130                 
131                 
132                 
133                 //// Position
134                 //// Position relative to:
135                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Posrelativeto")));
136                 
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
144                                                 }));
145                 panel.add(combo, "spanx, growx, wrap");
146                 
147                 //// plus
148                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plus")), "right");
149                 
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");
154                 
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"))),
159                                 "w 100lp, wrap");
160                 
161                 
162                 ////  Spatial length
163                 //// Packed length:
164                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Packedlength")));
165                 
166                 m = new DoubleModel(component, "Length", UnitGroup.UNITS_LENGTH, 0);
167                 
168                 spin = new JSpinner(m.getSpinnerModel());
169                 spin.setEditor(new SpinnerEditor(spin));
170                 panel.add(spin, "growx");
171                 
172                 panel.add(new UnitSelector(m), "growx");
173                 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.5)), "w 100lp, wrap");
174                 
175                 
176                 //// Tube diameter
177                 //// Packed diameter:
178                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Packeddiam")));
179                 
180                 DoubleModel od = new DoubleModel(component, "Radius", 2, UnitGroup.UNITS_LENGTH, 0);
181                 // Diameter = 2*Radius
182                 
183                 spin = new JSpinner(od.getSpinnerModel());
184                 spin.setEditor(new SpinnerEditor(spin));
185                 panel.add(spin, "growx");
186                 
187                 panel.add(new UnitSelector(od), "growx");
188                 panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap 30lp");
189                 
190                 
191                 //// Deployment
192                 //// Deploys at:
193                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Deploysat")), "");
194                 
195                 combo = new JComboBox(new EnumModel<IgnitionEvent>(component, "DeployEvent"));
196                 panel.add(combo, "spanx 3, growx, wrap");
197                 
198                 // ... and delay
199                 //// plus
200                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plusdelay")), "right");
201                 
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");
206                 
207                 //// seconds
208                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.seconds")), "wrap paragraph");
209                 
210                 // Altitude:
211                 label = new JLabel(trans.get("ParachuteCfg.lbl.Altitude"));
212                 altitudeComponents.add(label);
213                 panel.add(label);
214                 
215                 m = new DoubleModel(component, "DeployAltitude", UnitGroup.UNITS_DISTANCE, 0);
216                 
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");
227                 
228                 
229                 primary.add(panel, "grow");
230                 
231                 updateFields();
232                 
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);
239         }
240         
241         
242         
243         
244         
245         protected JPanel positionTab() {
246                 JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", ""));
247                 
248                 ////  Radial position
249                 //// Radial distance:
250                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Radialdistance")));
251                 
252                 DoubleModel m = new DoubleModel(component, "RadialPosition", UnitGroup.UNITS_LENGTH, 0);
253                 
254                 JSpinner spin = new JSpinner(m.getSpinnerModel());
255                 spin.setEditor(new SpinnerEditor(spin));
256                 panel.add(spin, "growx");
257                 
258                 panel.add(new UnitSelector(m), "growx");
259                 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap");
260                 
261                 
262                 //// Radial direction:
263                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Radialdirection")));
264                 
265                 m = new DoubleModel(component, "RadialDirection", UnitGroup.UNITS_ANGLE);
266                 
267                 spin = new JSpinner(m.getSpinnerModel());
268                 spin.setEditor(new SpinnerEditor(spin));
269                 panel.add(spin, "growx");
270                 
271                 panel.add(new UnitSelector(m), "growx");
272                 panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)), "w 100lp, wrap");
273                 
274                 
275                 //// Reset button
276                 JButton button = new JButton(trans.get("ParachuteCfg.but.Reset"));
277                 button.addActionListener(new ActionListener() {
278                         @Override
279                         public void actionPerformed(ActionEvent e) {
280                                 ((MassObject) component).setRadialDirection(0.0);
281                                 ((MassObject) component).setRadialPosition(0.0);
282                         }
283                 });
284                 panel.add(button, "spanx, right");
285                 
286                 return panel;
287         }
288 }