Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / core / src / net / sf / openrocket / gui / configdialog / RocketComponentConfig.java
index 95853b0246602b28cf8708123bbd2a2711e0773c..c2fbd63ec362ca22ae2c83e5d836ae264e56c751 100644 (file)
@@ -9,6 +9,7 @@ import java.awt.event.FocusListener;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 
 import javax.swing.BorderFactory;
 import javax.swing.JButton;
@@ -24,12 +25,14 @@ import javax.swing.JTextArea;
 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;
@@ -40,6 +43,7 @@ import net.sf.openrocket.gui.util.GUIUtil;
 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;
@@ -60,7 +64,9 @@ public class RocketComponentConfig extends JPanel {
        
        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;
@@ -68,11 +74,11 @@ public class RocketComponentConfig extends JPanel {
        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;
                
@@ -80,7 +86,7 @@ public class RocketComponentConfig extends JPanel {
                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();
@@ -88,11 +94,20 @@ public class RocketComponentConfig extends JPanel {
                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(),
@@ -119,8 +134,8 @@ public class RocketComponentConfig extends JPanel {
                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");
@@ -158,33 +173,38 @@ public class RocketComponentConfig extends JPanel {
                                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("");
                }
        }
        
@@ -197,6 +217,7 @@ public class RocketComponentConfig extends JPanel {
        
        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"));
@@ -207,7 +228,7 @@ public class RocketComponentConfig extends JPanel {
                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>
@@ -286,7 +307,7 @@ public class RocketComponentConfig extends JPanel {
                bm.addEnableComponent(bs);
                panel.add(bs, "growx 5, w 100lp, wrap");
                
-
+               
                ////  CG override
                bm = new BooleanModel(component, "CGOverridden");
                check = new JCheckBox(bm);
@@ -324,7 +345,7 @@ public class RocketComponentConfig extends JPanel {
                bm.addEnableComponent(bs);
                panel.add(bs, "growx 5, w 100lp, wrap 35lp");
                
-
+               
                // Override subcomponents checkbox
                bm = new BooleanModel(component, "OverrideSubcomponents");
                check = new JCheckBox(bm);
@@ -336,7 +357,7 @@ public class RocketComponentConfig extends JPanel {
                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;
@@ -364,7 +385,7 @@ public class RocketComponentConfig extends JPanel {
        }
        
        
-
+       
        private JPanel figureTab() {
                JPanel panel = new JPanel(new MigLayout("align 20% 20%"));
                
@@ -384,7 +405,7 @@ public class RocketComponentConfig extends JPanel {
                                }
                                
                                //// 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) {
@@ -450,7 +471,7 @@ public class RocketComponentConfig extends JPanel {
        }
        
        
-
+       
        protected JPanel shoulderTab() {
                JPanel panel = new JPanel(new MigLayout("fill"));
                JPanel sub;
@@ -460,7 +481,7 @@ public class RocketComponentConfig extends JPanel {
                JCheckBox check;
                JSpinner spin;
                
-
+               
                ////  Fore shoulder, not for NoseCone
                
                if (!(component instanceof NoseCone)) {
@@ -469,7 +490,7 @@ public class RocketComponentConfig extends JPanel {
                        //// Fore shoulder
                        sub.setBorder(BorderFactory.createTitledBorder(trans.get("RocketCompCfg.border.Foreshoulder")));
                        
-
+                       
                        ////  Radius
                        //// Diameter:
                        sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Diameter")));
@@ -484,7 +505,7 @@ public class RocketComponentConfig extends JPanel {
                        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")));
                        
@@ -497,7 +518,7 @@ public class RocketComponentConfig extends JPanel {
                        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")));
                        
@@ -511,7 +532,7 @@ public class RocketComponentConfig extends JPanel {
                        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);
@@ -521,11 +542,11 @@ public class RocketComponentConfig extends JPanel {
                        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::]", ""));
                
@@ -536,7 +557,7 @@ public class RocketComponentConfig extends JPanel {
                        //// Aft shoulder
                        sub.setBorder(BorderFactory.createTitledBorder(trans.get("RocketCompCfg.title.Aftshoulder")));
                
-
+               
                ////  Radius
                //// Diameter:
                sub.add(new JLabel(trans.get("RocketCompCfg.lbl.Diameter")));
@@ -551,7 +572,7 @@ public class RocketComponentConfig extends JPanel {
                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")));
                
@@ -564,7 +585,7 @@ public class RocketComponentConfig extends JPanel {
                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")));
                
@@ -578,7 +599,7 @@ public class RocketComponentConfig extends JPanel {
                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);
@@ -588,16 +609,16 @@ public class RocketComponentConfig extends JPanel {
                check.setToolTipText(trans.get("RocketCompCfg.ttip.Endcapped"));
                sub.add(check, "spanx");
                
-
+               
                panel.add(sub);
                
-
+               
                return panel;
        }
        
        
-
-
+       
+       
        /*
         * Private inner class to handle events in componentNameField.
         */
@@ -635,6 +656,8 @@ public class RocketComponentConfig extends JPanel {
                for (Invalidatable i : invalidatables) {
                        i.invalidate();
                }
+               ((ComponentPresetDatabase) Application.getComponentPresetDao()).removeChangeListener(presetModel);
+               
        }
        
 }
\ No newline at end of file