a9d4f61ad440a5a20804fb369808c69c1a16e118
[debian/openrocket] / src / net / sf / openrocket / gui / configdialog / NoseConeConfig.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.JCheckBox;
8 import javax.swing.JComboBox;
9 import javax.swing.JLabel;
10 import javax.swing.JPanel;
11 import javax.swing.JSlider;
12 import javax.swing.JSpinner;
13
14 import net.miginfocom.swing.MigLayout;
15 import net.sf.openrocket.gui.SpinnerEditor;
16 import net.sf.openrocket.gui.adaptors.BooleanModel;
17 import net.sf.openrocket.gui.adaptors.DoubleModel;
18 import net.sf.openrocket.gui.components.BasicSlider;
19 import net.sf.openrocket.gui.components.DescriptionArea;
20 import net.sf.openrocket.gui.components.UnitSelector;
21 import net.sf.openrocket.l10n.Translator;
22 import net.sf.openrocket.material.Material;
23 import net.sf.openrocket.rocketcomponent.NoseCone;
24 import net.sf.openrocket.rocketcomponent.RocketComponent;
25 import net.sf.openrocket.rocketcomponent.Transition;
26 import net.sf.openrocket.startup.Application;
27 import net.sf.openrocket.unit.UnitGroup;
28
29 public class NoseConeConfig extends RocketComponentConfig {
30
31         private JComboBox typeBox;
32         
33         private DescriptionArea description;
34         
35         private JLabel shapeLabel;
36         private JSpinner shapeSpinner;
37         private JSlider shapeSlider;
38         private static final Translator trans = Application.getTranslator();
39
40         // Prepended to the description from NoseCone.DESCRIPTIONS
41         private static final String PREDESC = "<html>";
42         
43         public NoseConeConfig(RocketComponent c) {
44                 super(c);
45                 
46                 DoubleModel m;
47                 JPanel panel = new JPanel(new MigLayout("","[][65lp::][30lp::]"));
48
49                 
50                 
51
52                 ////  Shape selection
53                 //// Nose cone shape:
54                 panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Noseconeshape")));
55
56                 Transition.Shape selected = ((NoseCone)component).getType();
57                 Transition.Shape[] typeList = Transition.Shape.values();
58                 
59                 typeBox = new JComboBox(typeList);
60                 typeBox.setEditable(false);
61                 typeBox.setSelectedItem(selected);
62                 typeBox.addActionListener(new ActionListener() {
63                         public void actionPerformed(ActionEvent e) {
64                                 Transition.Shape s = (Transition.Shape)typeBox.getSelectedItem();
65                                 ((NoseCone)component).setType(s);
66                                 description.setText(PREDESC + s.getNoseConeDescription());
67                                 updateEnabled();
68                         }
69                 });
70                 panel.add(typeBox,"span, wrap rel");
71
72                 
73                 
74
75                 ////  Shape parameter
76                 ////  Shape parameter:
77                 shapeLabel = new JLabel(trans.get("NoseConeCfg.lbl.Shapeparam"));
78                 panel.add(shapeLabel);
79                 
80                 m = new DoubleModel(component,"ShapeParameter");
81                 
82                 shapeSpinner = new JSpinner(m.getSpinnerModel());
83                 shapeSpinner.setEditor(new SpinnerEditor(shapeSpinner));
84                 panel.add(shapeSpinner,"growx");
85                 
86                 DoubleModel min = new DoubleModel(component,"ShapeParameterMin");
87                 DoubleModel max = new DoubleModel(component,"ShapeParameterMax");
88                 shapeSlider = new BasicSlider(m.getSliderModel(min,max)); 
89                 panel.add(shapeSlider,"skip, w 100lp, wrap para");
90                 
91                 updateEnabled();
92
93                 
94                 ////  Length
95                 //// Nose cone length:
96                 panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Noseconelength")));
97
98                 m = new DoubleModel(component,"Length",UnitGroup.UNITS_LENGTH,0);
99                 JSpinner spin = new JSpinner(m.getSpinnerModel());
100                 spin.setEditor(new SpinnerEditor(spin));
101                 panel.add(spin,"growx");
102                 
103                 panel.add(new UnitSelector(m),"growx");
104                 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.7)),"w 100lp, wrap");
105                 
106                 ////  Diameter
107                 //// Base diameter:
108                 panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Basediam")));
109
110                 m = new DoubleModel(component,"AftRadius",2.0,UnitGroup.UNITS_LENGTH,0);  // Diameter = 2*Radius
111                 spin = new JSpinner(m.getSpinnerModel());
112                 spin.setEditor(new SpinnerEditor(spin));
113                 panel.add(spin,"growx");
114                 
115                 panel.add(new UnitSelector(m),"growx");
116                 panel.add(new BasicSlider(m.getSliderModel(0, 0.04, 0.2)),"w 100lp, wrap 0px");
117                 
118                 JCheckBox check = new JCheckBox(m.getAutomaticAction());
119                 //// Automatic
120                 check.setText(trans.get("NoseConeCfg.checkbox.Automatic"));
121                 panel.add(check,"skip, span 2, wrap");
122                 
123
124                 ////  Wall thickness:
125                 panel.add(new JLabel(trans.get("NoseConeCfg.lbl.Wallthickness")));
126                 
127                 m = new DoubleModel(component,"Thickness",UnitGroup.UNITS_LENGTH,0);
128                 
129                 spin = new JSpinner(m.getSpinnerModel());
130                 spin.setEditor(new SpinnerEditor(spin));
131                 panel.add(spin,"growx");
132                 
133                 panel.add(new UnitSelector(m),"growx");
134                 panel.add(new BasicSlider(m.getSliderModel(0,0.01)),"w 100lp, wrap 0px");
135                 
136
137                 check = new JCheckBox(new BooleanModel(component,"Filled"));
138                 //// Filled
139                 check.setText(trans.get("NoseConeCfg.checkbox.Filled"));
140                 panel.add(check,"skip, span 2, wrap");
141
142                 
143                 panel.add(new JLabel(""), "growy");
144                 
145                 
146                 
147                 ////  Description
148                 
149                 JPanel panel2 = new JPanel(new MigLayout("ins 0"));
150                 
151                 description = new DescriptionArea(5);
152                 description.setText(PREDESC + ((NoseCone)component).getType().getNoseConeDescription());
153                 panel2.add(description, "wmin 250lp, spanx, growx, wrap para");
154                 
155
156                 //// Material
157                 
158                 
159                 materialPanel(panel2, Material.Type.BULK);
160                 panel.add(panel2, "cell 4 0, gapleft paragraph, aligny 0%, spany");
161                 
162
163                 //// General and General properties
164                 tabbedPane.insertTab(trans.get("NoseConeCfg.tab.General"), null, panel, 
165                                 trans.get("NoseConeCfg.tab.ttip.General"), 0);
166                 //// Shoulder and Shoulder properties
167                 tabbedPane.insertTab(trans.get("NoseConeCfg.tab.Shoulder"), null, shoulderTab(), 
168                                 trans.get("NoseConeCfg.tab.ttip.Shoulder"), 1);
169                 tabbedPane.setSelectedIndex(0);
170         }
171         
172
173         private void updateEnabled() {
174                 boolean e = ((NoseCone)component).getType().usesParameter();
175                 shapeLabel.setEnabled(e);
176                 shapeSpinner.setEnabled(e);
177                 shapeSlider.setEnabled(e);
178         }
179
180         
181 }