4dcd5104efca3efe026963ce1a3ed1fc8117f8b0
[debian/openrocket] / 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.gui.SpinnerEditor;
15 import net.sf.openrocket.gui.adaptors.DoubleModel;
16 import net.sf.openrocket.gui.adaptors.EnumModel;
17 import net.sf.openrocket.gui.adaptors.IntegerModel;
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.gui.components.StyledLabel.Style;
24 import net.sf.openrocket.l10n.Translator;
25 import net.sf.openrocket.material.Material;
26 import net.sf.openrocket.rocketcomponent.MassObject;
27 import net.sf.openrocket.rocketcomponent.Parachute;
28 import net.sf.openrocket.rocketcomponent.RocketComponent;
29 import net.sf.openrocket.rocketcomponent.MotorMount.IgnitionEvent;
30 import net.sf.openrocket.startup.Application;
31 import net.sf.openrocket.unit.UnitGroup;
32
33 public class ParachuteConfig extends RecoveryDeviceConfig {
34         private static final Translator trans = Application.getTranslator();
35
36         public ParachuteConfig(final RocketComponent component) {
37                 super(component);
38
39                 JPanel primary = new JPanel(new MigLayout());
40                 
41                 JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::][]",""));
42                 
43                 
44                 //// Canopy
45                 panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Canopy"), Style.BOLD), "wrap unrel");
46                 
47                 //// Diameter:
48                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Diameter")));
49                 
50                 DoubleModel m = new DoubleModel(component,"Diameter",UnitGroup.UNITS_LENGTH,0);
51                 
52                 JSpinner spin = new JSpinner(m.getSpinnerModel());
53                 spin.setEditor(new SpinnerEditor(spin));
54                 panel.add(spin,"growx");
55                 panel.add(new UnitSelector(m),"growx");
56                 panel.add(new BasicSlider(m.getSliderModel(0, 0.4, 1.5)),"w 100lp, wrap");
57
58                 //// Material:
59                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material")));
60                 
61                 JComboBox combo = new JComboBox(new MaterialModel(panel, component, 
62                                 Material.Type.SURFACE));
63                 //// The component material affects the weight of the component.
64                 combo.setToolTipText(trans.get("ParachuteCfg.combo.MaterialModel"));
65                 panel.add(combo,"spanx 3, growx, wrap paragraph");
66
67 //              materialPanel(panel, Material.Type.SURFACE, "Material:", null);
68                 
69                 
70                 
71                 // CD
72                 //// <html>Drag coefficient C<sub>D</sub>:
73                 JLabel label = new HtmlLabel(trans.get("ParachuteCfg.lbl.longA1"));
74                 String tip = trans.get("ParachuteCfg.lbl.longB1") +
75                 trans.get("ParachuteCfg.lbl.longB2") + "  " +
76                 trans.get("ParachuteCfg.lbl.longB3");
77                 label.setToolTipText(tip);
78                 panel.add(label);
79                 
80                 m = new DoubleModel(component,"CD",UnitGroup.UNITS_COEFFICIENT,0);
81                 
82                 spin = new JSpinner(m.getSpinnerModel());
83                 spin.setToolTipText(tip);
84                 spin.setEditor(new SpinnerEditor(spin));
85                 panel.add(spin,"growx");
86                 
87                 //// Reset button
88                 JButton button = new JButton(trans.get("ParachuteCfg.but.Reset"));
89                 button.addActionListener(new ActionListener() {
90                         @Override
91                         public void actionPerformed(ActionEvent e) {
92                                 Parachute p = (Parachute)component;
93                                 p.setCD(Parachute.DEFAULT_CD);
94                         }
95                 });
96                 panel.add(button,"spanx, wrap 30lp");
97
98                 
99                 
100                 ////  Shroud lines
101                 panel.add(new StyledLabel(trans.get("ParachuteCfg.lbl.Shroudlines"), Style.BOLD), "wrap unrel");
102
103                 //// Number of lines:
104                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Numberoflines")));
105                 IntegerModel im = new IntegerModel(component,"LineCount",0);
106                 
107                 spin = new JSpinner(im.getSpinnerModel());
108                 spin.setEditor(new SpinnerEditor(spin));
109                 panel.add(spin,"growx, wrap");
110                 
111                 //// Line length:
112                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Linelength")));
113
114                 m = new DoubleModel(component,"LineLength",UnitGroup.UNITS_LENGTH,0);
115                 
116                 spin = new JSpinner(m.getSpinnerModel());
117                 spin.setEditor(new SpinnerEditor(spin));
118                 panel.add(spin,"growx");
119                 panel.add(new UnitSelector(m),"growx");
120                 panel.add(new BasicSlider(m.getSliderModel(0, 0.4, 1.5)),"w 100lp, wrap");
121
122                 //// Material:
123                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Material")));
124                 
125                 combo = new JComboBox(new MaterialModel(panel, component, Material.Type.LINE, 
126                                 "LineMaterial"));
127                 panel.add(combo,"spanx 3, growx, wrap");
128
129                 
130                 
131                 primary.add(panel, "grow, gapright 20lp");
132                 panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::][]",""));
133
134                 
135                 
136                 
137                 //// Position
138                 //// Position relative to:
139                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Posrelativeto")));
140
141                 combo = new JComboBox(
142                                 new EnumModel<RocketComponent.Position>(component, "RelativePosition",
143                                                 new RocketComponent.Position[] {
144                                                 RocketComponent.Position.TOP,
145                                                 RocketComponent.Position.MIDDLE,
146                                                 RocketComponent.Position.BOTTOM,
147                                                 RocketComponent.Position.ABSOLUTE
148                                 }));
149                 panel.add(combo,"spanx, growx, wrap");
150                 
151                 //// plus
152                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plus")),"right");
153
154                 m = new DoubleModel(component,"PositionValue",UnitGroup.UNITS_LENGTH);
155                 spin = new JSpinner(m.getSpinnerModel());
156                 spin.setEditor(new SpinnerEditor(spin));
157                 panel.add(spin,"growx");
158                 
159                 panel.add(new UnitSelector(m),"growx");
160                 panel.add(new BasicSlider(m.getSliderModel(
161                                 new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE),
162                                 new DoubleModel(component.getParent(), "Length"))),
163                                 "w 100lp, wrap");
164
165
166                 ////  Spatial length
167                 //// Packed length:
168                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Packedlength")));
169                 
170                 m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
171                 
172                 spin = new JSpinner(m.getSpinnerModel());
173                 spin.setEditor(new SpinnerEditor(spin));
174                 panel.add(spin,"growx");
175                 
176                 panel.add(new UnitSelector(m),"growx");
177                 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.5)),"w 100lp, wrap");
178                 
179                 
180                 //// Tube diameter
181                 //// Packed diameter:
182                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Packeddiam")));
183
184                 DoubleModel od  = new DoubleModel(component,"Radius",2,UnitGroup.UNITS_LENGTH,0);
185                 // Diameter = 2*Radius
186
187                 spin = new JSpinner(od.getSpinnerModel());
188                 spin.setEditor(new SpinnerEditor(spin));
189                 panel.add(spin,"growx");
190                 
191                 panel.add(new UnitSelector(od),"growx");
192                 panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)),"w 100lp, wrap 30lp");
193                 
194                 
195                 //// Deployment
196                 //// Deploys at:
197                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Deploysat")),"");
198                 
199                 combo = new JComboBox(new EnumModel<IgnitionEvent>(component, "DeployEvent"));
200                 panel.add(combo,"spanx 3, growx, wrap");
201                 
202                 // ... and delay
203                 //// plus
204                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.plusdelay")),"right");
205                 
206                 m = new DoubleModel(component,"DeployDelay",0);
207                 spin = new JSpinner(m.getSpinnerModel());
208                 spin.setEditor(new SpinnerEditor(spin));
209                 panel.add(spin,"spanx, split");
210                 
211                 //// seconds
212                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.seconds")),"wrap paragraph");
213
214                 // Altitude:
215                 label = new JLabel(trans.get("ParachuteCfg.lbl.Altitude"));
216                 altitudeComponents.add(label);
217                 panel.add(label);
218                 
219                 m = new DoubleModel(component,"DeployAltitude",UnitGroup.UNITS_DISTANCE,0);
220                 
221                 spin = new JSpinner(m.getSpinnerModel());
222                 spin.setEditor(new SpinnerEditor(spin));
223                 altitudeComponents.add(spin);
224                 panel.add(spin,"growx");
225                 UnitSelector unit = new UnitSelector(m);
226                 altitudeComponents.add(unit);
227                 panel.add(unit,"growx");
228                 BasicSlider slider = new BasicSlider(m.getSliderModel(100, 1000));
229                 altitudeComponents.add(slider);
230                 panel.add(slider,"w 100lp, wrap");
231
232                 
233                 primary.add(panel, "grow");
234                 
235                 updateFields();
236
237                 //// General and General properties
238                 tabbedPane.insertTab(trans.get("ParachuteCfg.tab.General"), null, primary, trans.get("ParachuteCfg.tab.ttip.General"), 0);
239                 //// Radial position and Radial position configuration
240                 tabbedPane.insertTab(trans.get("ParachuteCfg.tab.Radialpos"), null, positionTab(), 
241                                 trans.get("ParachuteCfg.tab.ttip.Radialpos"), 1);
242                 tabbedPane.setSelectedIndex(0);
243         }
244         
245         
246         
247
248
249         protected JPanel positionTab() {
250                 JPanel panel = new JPanel(new MigLayout("gap rel unrel","[][65lp::][30lp::]",""));
251                 
252                 ////  Radial position
253                 //// Radial distance:
254                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Radialdistance")));
255                 
256                 DoubleModel m = new DoubleModel(component,"RadialPosition",UnitGroup.UNITS_LENGTH,0);
257                 
258                 JSpinner spin = new JSpinner(m.getSpinnerModel());
259                 spin.setEditor(new SpinnerEditor(spin));
260                 panel.add(spin,"growx");
261                 
262                 panel.add(new UnitSelector(m),"growx");
263                 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)),"w 100lp, wrap");
264                 
265                 
266                 //// Radial direction:
267                 panel.add(new JLabel(trans.get("ParachuteCfg.lbl.Radialdirection")));
268                 
269                 m = new DoubleModel(component,"RadialDirection",UnitGroup.UNITS_ANGLE,0);
270                 
271                 spin = new JSpinner(m.getSpinnerModel());
272                 spin.setEditor(new SpinnerEditor(spin));
273                 panel.add(spin,"growx");
274                 
275                 panel.add(new UnitSelector(m),"growx");
276                 panel.add(new BasicSlider(m.getSliderModel(-Math.PI, Math.PI)),"w 100lp, wrap");
277
278                 
279                 //// Reset button
280                 JButton button = new JButton(trans.get("ParachuteCfg.but.Reset"));
281                 button.addActionListener(new ActionListener() {
282                         @Override
283                         public void actionPerformed(ActionEvent e) {
284                                 ((MassObject) component).setRadialDirection(0.0);
285                                 ((MassObject) component).setRadialPosition(0.0);
286                         }
287                 });
288                 panel.add(button,"spanx, right");
289                 
290                 return panel;
291         }
292 }