1 package net.sf.openrocket.gui.configdialog;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
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;
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;
27 public class NoseConeConfig extends RocketComponentConfig {
29 private JComboBox typeBox;
31 private DescriptionArea description;
33 private JLabel shapeLabel;
34 private JSpinner shapeSpinner;
35 private JSlider shapeSlider;
37 // Prepended to the description from NoseCone.DESCRIPTIONS
38 private static final String PREDESC = "<html><p style=\"font-size: x-small\">";
40 public NoseConeConfig(RocketComponent c) {
44 JPanel panel = new JPanel(new MigLayout("","[][65lp::][30lp::]"));
51 panel.add(new JLabel("Nose cone shape:"));
53 Transition.Shape selected = ((NoseCone)component).getType();
54 Transition.Shape[] typeList = Transition.Shape.values();
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());
67 panel.add(typeBox,"span, wrap rel");
73 shapeLabel = new JLabel("Shape parameter:");
74 panel.add(shapeLabel);
76 m = new DoubleModel(component,"ShapeParameter");
78 shapeSpinner = new JSpinner(m.getSpinnerModel());
79 shapeSpinner.setEditor(new SpinnerEditor(shapeSpinner));
80 panel.add(shapeSpinner,"growx");
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");
92 panel.add(new JLabel("Nose cone length:"));
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");
99 panel.add(new UnitSelector(m),"growx");
100 panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 0.7)),"w 100lp, wrap");
104 panel.add(new JLabel("Base diameter:"));
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");
111 panel.add(new UnitSelector(m),"growx");
112 panel.add(new BasicSlider(m.getSliderModel(0, 0.04, 0.2)),"w 100lp, wrap 0px");
114 JCheckBox check = new JCheckBox(m.getAutomaticAction());
115 check.setText("Automatic");
116 panel.add(check,"skip, span 2, wrap");
120 panel.add(new JLabel("Wall thickness:"));
122 m = new DoubleModel(component,"Thickness",UnitGroup.UNITS_LENGTH,0);
124 spin = new JSpinner(m.getSpinnerModel());
125 spin.setEditor(new SpinnerEditor(spin));
126 panel.add(spin,"growx");
128 panel.add(new UnitSelector(m),"growx");
129 panel.add(new BasicSlider(m.getSliderModel(0,0.01)),"w 100lp, wrap 0px");
132 check = new JCheckBox(new BooleanModel(component,"Filled"));
133 check.setText("Filled");
134 panel.add(check,"skip, span 2, wrap");
137 panel.add(new JLabel(""), "growy");
143 JPanel panel2 = new JPanel(new MigLayout("ins 0"));
145 description = new DescriptionArea(5);
146 description.setText(PREDESC + ((NoseCone)component).getType().getNoseConeDescription());
147 panel2.add(description, "wmin 250lp, spanx, growx, wrap para");
153 materialPanel(panel2, Material.Type.BULK);
154 panel.add(panel2, "cell 4 0, gapleft paragraph, aligny 0%, spany");
158 tabbedPane.insertTab("General", null, panel, "General properties", 0);
159 tabbedPane.insertTab("Shoulder", null, shoulderTab(), "Shoulder properties", 1);
160 tabbedPane.setSelectedIndex(0);
164 private void updateEnabled() {
165 boolean e = ((NoseCone)component).getType().usesParameter();
166 shapeLabel.setEnabled(e);
167 shapeSpinner.setEnabled(e);
168 shapeSlider.setEnabled(e);