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