import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Locale;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;
+import net.sf.openrocket.database.ComponentPresetDatabase;
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.gui.SpinnerEditor;
import net.sf.openrocket.gui.adaptors.BooleanModel;
import net.sf.openrocket.gui.adaptors.DoubleModel;
import net.sf.openrocket.gui.adaptors.EnumModel;
import net.sf.openrocket.gui.adaptors.MaterialModel;
+import net.sf.openrocket.gui.adaptors.PresetModel;
import net.sf.openrocket.gui.components.BasicSlider;
import net.sf.openrocket.gui.components.ColorIcon;
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.util.SwingPreferences;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
+import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.rocketcomponent.ComponentAssembly;
import net.sf.openrocket.rocketcomponent.ExternalComponent;
import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish;
private final List<Invalidatable> invalidatables = new ArrayList<Invalidatable>();
-
+ private JComboBox presetComboBox;
+ private PresetModel presetModel;
+
protected final JTextField componentNameField;
protected JTextArea commentTextArea;
private final TextFieldListener textFieldListener;
private JCheckBox colorDefault;
private JPanel buttonPanel;
- private JLabel massLabel;
+ private JLabel infoLabel;
public RocketComponentConfig(OpenRocketDocument document, RocketComponent component) {
- setLayout(new MigLayout("fill", "[grow, fill]"));
+ setLayout(new MigLayout("fill", "[min,align right]:10[fill, grow]"));
this.document = document;
this.component = component;
JLabel label = new JLabel(trans.get("RocketCompCfg.lbl.Componentname"));
//// The component name.
label.setToolTipText(trans.get("RocketCompCfg.ttip.Thecomponentname"));
- this.add(label, "split, gapright 10");
+ this.add(label, "spanx, split");
componentNameField = new JTextField(15);
textFieldListener = new TextFieldListener();
componentNameField.addFocusListener(textFieldListener);
//// The component name.
componentNameField.setToolTipText(trans.get("RocketCompCfg.ttip.Thecomponentname"));
- this.add(componentNameField, "growx, growy 0, wrap");
+ this.add(componentNameField, "growx");
+
+ if (component.getPresetType() != null) {
+ // If the component supports a preset, show the preset selection box.
+ presetModel = new PresetModel(this, document, component);
+ ((ComponentPresetDatabase) Application.getComponentPresetDao()).addDatabaseListener(presetModel);
+ presetComboBox = new JComboBox(presetModel);
+ presetComboBox.setEditable(false);
+ this.add(presetComboBox, "");
+ }
+
-
tabbedPane = new JTabbedPane();
- this.add(tabbedPane, "growx, growy 1, wrap");
+ this.add(tabbedPane, "newline, span, growx, growy 1, wrap");
//// Override and Mass and CG override options
tabbedPane.addTab(trans.get("RocketCompCfg.tab.Override"), null, overrideTab(),
buttonPanel = new JPanel(new MigLayout("fill, ins 0"));
//// Mass:
- massLabel = new StyledLabel(trans.get("RocketCompCfg.lbl.Mass") + " ", -1);
- buttonPanel.add(massLabel, "growx");
+ infoLabel = new StyledLabel(" ", -1);
+ buttonPanel.add(infoLabel, "growx");
for (JButton b : buttons) {
buttonPanel.add(b, "right, gap para");
colorDefault.setSelected(component.getColor() == null);
}
- // Mass label
+ // Info label
+ StringBuilder sb = new StringBuilder();
+
+ if (component.getPresetComponent() != null) {
+ ComponentPreset preset = component.getPresetComponent();
+ sb.append(preset.getManufacturer() + " " + preset.getPartNo() + " ");
+ }
+
if (component.isMassive()) {
- //// Component mass:
- String text = trans.get("RocketCompCfg.lbl.Componentmass") + " ";
- text += UnitGroup.UNITS_MASS.getDefaultUnit().toStringUnit(
- component.getComponentMass());
+ sb.append(trans.get("RocketCompCfg.lbl.Componentmass") + " ");
+ sb.append(UnitGroup.UNITS_MASS.getDefaultUnit().toStringUnit(
+ component.getComponentMass()));
String overridetext = null;
if (component.isMassOverridden()) {
- //// (overridden to
overridetext = trans.get("RocketCompCfg.lbl.overriddento") + " " + UnitGroup.UNITS_MASS.getDefaultUnit().
toStringUnit(component.getOverrideMass()) + ")";
}
for (RocketComponent c = component.getParent(); c != null; c = c.getParent()) {
if (c.isMassOverridden() && c.getOverrideSubcomponents()) {
- ///// (overridden by
overridetext = trans.get("RocketCompCfg.lbl.overriddenby") + " " + c.getName() + ")";
}
}
- if (overridetext != null)
- text = text + " " + overridetext;
+ if (overridetext != null) {
+ sb.append(" " + overridetext);
+ }
- massLabel.setText(text);
+ infoLabel.setText(sb.toString());
} else {
- massLabel.setText("");
+ infoLabel.setText("");
}
}
protected JPanel materialPanel(JPanel panel, Material.Type type,
String materialString, String finishString) {
+
JLabel label = new JLabel(materialString);
//// The component material affects the weight of the component.
label.setToolTipText(trans.get("RocketCompCfg.lbl.ttip.componentmaterialaffects"));
combo.setToolTipText(trans.get("RocketCompCfg.combo.ttip.componentmaterialaffects"));
panel.add(combo, "spanx 4, growx, wrap paragraph");
-
+
if (component instanceof ExternalComponent) {
label = new JLabel(finishString);
////<html>The component finish affects the aerodynamic drag of the component.<br>
bm.addEnableComponent(bs);
panel.add(bs, "growx 5, w 100lp, wrap");
-
+
//// CG override
bm = new BooleanModel(component, "CGOverridden");
check = new JCheckBox(bm);
bm.addEnableComponent(bs);
panel.add(bs, "growx 5, w 100lp, wrap 35lp");
-
+
// Override subcomponents checkbox
bm = new BooleanModel(component, "OverrideSubcomponents");
check = new JCheckBox(bm);
panel.add(new StyledLabel(trans.get("RocketCompCfg.lbl.longB1") +
//// The center of gravity is measured from the front end of the
trans.get("RocketCompCfg.lbl.longB2") + " " +
- component.getComponentName().toLowerCase() + ".", -1),
+ component.getComponentName().toLowerCase(Locale.getDefault()) + ".", -1),
"spanx, wrap, gap para, height 0::30lp");
return panel;
}
-
+
private JPanel figureTab() {
JPanel panel = new JPanel(new MigLayout("align 20% 20%"));
}
//// Choose color
- Color awtColor = ColorConversion.toAwtColor(c);
+ Color awtColor = ColorConversion.toAwtColor(c);
awtColor = JColorChooser.showDialog(tabbedPane, trans.get("RocketCompCfg.lbl.Choosecolor"), awtColor);
c = ColorConversion.fromAwtColor(awtColor);
if (c != null) {
}
-
+
protected JPanel shoulderTab() {
JPanel panel = new JPanel(new MigLayout("fill"));
JPanel sub;
JCheckBox check;
JSpinner spin;
-
+
//// Fore shoulder, not for NoseCone
if (!(component instanceof NoseCone)) {
//// Fore shoulder
sub.setBorder(BorderFactory.createTitledBorder(trans.get("RocketCompCfg.border.Foreshoulder")));
-
+
//// Radius
//// Diameter:
sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Diameter")));
sub.add(new UnitSelector(m), "growx");
sub.add(new BasicSlider(m.getSliderModel(m0, m2)), "w 100lp, wrap");
-
+
//// Length:
sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Length")));
sub.add(new UnitSelector(m), "growx");
sub.add(new BasicSlider(m.getSliderModel(0, 0.02, 0.2)), "w 100lp, wrap");
-
+
//// Thickness:
sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Thickness")));
sub.add(new UnitSelector(m), "growx");
sub.add(new BasicSlider(m.getSliderModel(m0, m2)), "w 100lp, wrap");
-
+
//// Capped
bm = new BooleanModel(component, "ForeShoulderCapped");
check = new JCheckBox(bm);
check.setToolTipText(trans.get("RocketCompCfg.ttip.Endcapped"));
sub.add(check, "spanx");
-
+
panel.add(sub);
}
-
+
//// Aft shoulder
sub = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]", ""));
//// Aft shoulder
sub.setBorder(BorderFactory.createTitledBorder(trans.get("RocketCompCfg.title.Aftshoulder")));
-
+
//// Radius
//// Diameter:
sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Diameter")));
sub.add(new UnitSelector(m), "growx");
sub.add(new BasicSlider(m.getSliderModel(m0, m2)), "w 100lp, wrap");
-
+
//// Length:
sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Length")));
sub.add(new UnitSelector(m), "growx");
sub.add(new BasicSlider(m.getSliderModel(0, 0.02, 0.2)), "w 100lp, wrap");
-
+
//// Thickness:
sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Thickness")));
sub.add(new UnitSelector(m), "growx");
sub.add(new BasicSlider(m.getSliderModel(m0, m2)), "w 100lp, wrap");
-
+
//// Capped
bm = new BooleanModel(component, "AftShoulderCapped");
check = new JCheckBox(bm);
check.setToolTipText(trans.get("RocketCompCfg.ttip.Endcapped"));
sub.add(check, "spanx");
-
+
panel.add(sub);
-
+
return panel;
}
-
-
+
+
/*
* Private inner class to handle events in componentNameField.
*/
for (Invalidatable i : invalidatables) {
i.invalidate();
}
+ ((ComponentPresetDatabase) Application.getComponentPresetDao()).removeChangeListener(presetModel);
+
}
}
\ No newline at end of file