Rework BodyTubeConfig and InnerTubeConfig removing the motor
configuration stuff. The motormount checkbox and default ignition configuration is now on the General tab. Removed ThicknessRingComponentConfig since that was only used by InnerTubeConfig. Moved the radialPanel from RingComponentConfig to InnerTubeConfig for now.
This commit is contained in:
parent
ed0444a909
commit
59e75d5c83
@ -16,13 +16,13 @@ import net.sf.openrocket.gui.components.UnitSelector;
|
||||
import net.sf.openrocket.l10n.Translator;
|
||||
import net.sf.openrocket.material.Material;
|
||||
import net.sf.openrocket.rocketcomponent.BodyTube;
|
||||
import net.sf.openrocket.rocketcomponent.MotorMount;
|
||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||
import net.sf.openrocket.startup.Application;
|
||||
import net.sf.openrocket.unit.UnitGroup;
|
||||
|
||||
public class BodyTubeConfig extends RocketComponentConfig {
|
||||
|
||||
private MotorConfig motorConfigPane = null;
|
||||
private DoubleModel maxLength;
|
||||
private static final Translator trans = Application.getTranslator();
|
||||
|
||||
@ -98,7 +98,10 @@ public class BodyTubeConfig extends RocketComponentConfig {
|
||||
check.setText(trans.get("BodyTubecfg.checkbox.Filled"));
|
||||
panel.add(check, "skip, span 2, wrap");
|
||||
|
||||
MotorConfig motorConfig = new MotorConfig((MotorMount)c);
|
||||
|
||||
panel.add(motorConfig,"spanx, growx");
|
||||
|
||||
//// Material
|
||||
panel.add(materialPanel(new JPanel(new MigLayout()), Material.Type.BULK),
|
||||
"cell 4 0, gapleft paragraph, aligny 0%, spany");
|
||||
@ -106,10 +109,7 @@ public class BodyTubeConfig extends RocketComponentConfig {
|
||||
//// General and General properties
|
||||
tabbedPane.insertTab(trans.get("BodyTubecfg.tab.General"), null, panel,
|
||||
trans.get("BodyTubecfg.tab.Generalproperties"), 0);
|
||||
motorConfigPane = new MotorConfig((BodyTube) c);
|
||||
//// Motor and Motor mount configuration
|
||||
tabbedPane.insertTab(trans.get("BodyTubecfg.tab.Motor"), null, motorConfigPane,
|
||||
trans.get("BodyTubecfg.tab.Motormountconf"), 1);
|
||||
|
||||
tabbedPane.setSelectedIndex(0);
|
||||
|
||||
|
||||
@ -118,8 +118,6 @@ public class BodyTubeConfig extends RocketComponentConfig {
|
||||
@Override
|
||||
public void updateFields() {
|
||||
super.updateFields();
|
||||
if (motorConfigPane != null)
|
||||
motorConfigPane.updateFields();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,28 +1,12 @@
|
||||
package net.sf.openrocket.gui.configdialog;
|
||||
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.gui.Resettable;
|
||||
import net.sf.openrocket.gui.SpinnerEditor;
|
||||
import net.sf.openrocket.gui.adaptors.DoubleModel;
|
||||
import net.sf.openrocket.gui.components.BasicSlider;
|
||||
import net.sf.openrocket.gui.components.UnitSelector;
|
||||
import net.sf.openrocket.l10n.Translator;
|
||||
import net.sf.openrocket.rocketcomponent.ClusterConfiguration;
|
||||
import net.sf.openrocket.rocketcomponent.Clusterable;
|
||||
import net.sf.openrocket.rocketcomponent.InnerTube;
|
||||
import net.sf.openrocket.rocketcomponent.MotorMount;
|
||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||
import net.sf.openrocket.startup.Application;
|
||||
import net.sf.openrocket.unit.UnitGroup;
|
||||
import net.sf.openrocket.util.BugException;
|
||||
import net.sf.openrocket.util.Coordinate;
|
||||
import net.sf.openrocket.util.StateChangeListener;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.BevelBorder;
|
||||
import java.awt.*;
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.RenderingHints;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.MouseEvent;
|
||||
@ -31,40 +15,258 @@ import java.awt.geom.Ellipse2D;
|
||||
import java.util.EventObject;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JSpinner;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.border.BevelBorder;
|
||||
|
||||
public class InnerTubeConfig extends ThicknessRingComponentConfig {
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.gui.Resettable;
|
||||
import net.sf.openrocket.gui.SpinnerEditor;
|
||||
import net.sf.openrocket.gui.adaptors.DoubleModel;
|
||||
import net.sf.openrocket.gui.adaptors.EnumModel;
|
||||
import net.sf.openrocket.gui.components.BasicSlider;
|
||||
import net.sf.openrocket.gui.components.DescriptionArea;
|
||||
import net.sf.openrocket.gui.components.UnitSelector;
|
||||
import net.sf.openrocket.l10n.Translator;
|
||||
import net.sf.openrocket.material.Material;
|
||||
import net.sf.openrocket.rocketcomponent.ClusterConfiguration;
|
||||
import net.sf.openrocket.rocketcomponent.Clusterable;
|
||||
import net.sf.openrocket.rocketcomponent.EngineBlock;
|
||||
import net.sf.openrocket.rocketcomponent.InnerTube;
|
||||
import net.sf.openrocket.rocketcomponent.MotorMount;
|
||||
import net.sf.openrocket.rocketcomponent.RingComponent;
|
||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||
import net.sf.openrocket.startup.Application;
|
||||
import net.sf.openrocket.unit.UnitGroup;
|
||||
import net.sf.openrocket.util.BugException;
|
||||
import net.sf.openrocket.util.Coordinate;
|
||||
import net.sf.openrocket.util.StateChangeListener;
|
||||
|
||||
|
||||
public class InnerTubeConfig extends RocketComponentConfig {
|
||||
private static final Translator trans = Application.getTranslator();
|
||||
|
||||
|
||||
|
||||
|
||||
public InnerTubeConfig(OpenRocketDocument d, RocketComponent c) {
|
||||
super(d, c);
|
||||
|
||||
//// General and General properties
|
||||
JPanel panel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::][]", ""));
|
||||
DoubleModel m;
|
||||
JSpinner spin;
|
||||
DoubleModel od = null;
|
||||
|
||||
//// Outer diameter
|
||||
panel.add(new JLabel(trans.get("ThicknessRingCompCfg.tab.Outerdiam")));
|
||||
|
||||
//// OuterRadius
|
||||
od = new DoubleModel(component, "OuterRadius", 2, UnitGroup.UNITS_LENGTH, 0);
|
||||
// Diameter = 2*Radius
|
||||
|
||||
spin = new JSpinner(od.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(od), "growx");
|
||||
panel.add(new BasicSlider(od.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap");
|
||||
|
||||
if (od.isAutomaticAvailable()) {
|
||||
JCheckBox check = new JCheckBox(od.getAutomaticAction());
|
||||
//// Automatic
|
||||
check.setText(trans.get("ringcompcfg.Automatic"));
|
||||
panel.add(check, "skip, span 2, wrap");
|
||||
}
|
||||
|
||||
//// Inner diameter
|
||||
panel.add(new JLabel(trans.get("ThicknessRingCompCfg.tab.Innerdiam")));
|
||||
|
||||
//// InnerRadius
|
||||
m = new DoubleModel(component, "InnerRadius", 2, UnitGroup.UNITS_LENGTH, 0);
|
||||
|
||||
spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
if (od == null)
|
||||
panel.add(new BasicSlider(m.getSliderModel(0, 0.04, 0.2)), "w 100lp, wrap");
|
||||
else
|
||||
panel.add(new BasicSlider(m.getSliderModel(new DoubleModel(0), od)),
|
||||
"w 100lp, wrap");
|
||||
|
||||
if (m.isAutomaticAvailable()) {
|
||||
JCheckBox check = new JCheckBox(m.getAutomaticAction());
|
||||
//// Automatic
|
||||
check.setText(trans.get("ringcompcfg.Automatic"));
|
||||
panel.add(check, "skip, span 2, wrap");
|
||||
}
|
||||
|
||||
|
||||
//// Wall thickness
|
||||
panel.add(new JLabel(trans.get("ThicknessRingCompCfg.tab.Wallthickness")));
|
||||
|
||||
//// Thickness
|
||||
m = new DoubleModel(component, "Thickness", UnitGroup.UNITS_LENGTH, 0);
|
||||
|
||||
spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
panel.add(new BasicSlider(m.getSliderModel(0, 0.01)), "w 100lp, wrap");
|
||||
|
||||
|
||||
//// Inner tube length
|
||||
panel.add(new JLabel(trans.get("ThicknessRingCompCfg.tab.Length")));
|
||||
|
||||
//// Length
|
||||
m = new DoubleModel(component, "Length", UnitGroup.UNITS_LENGTH, 0);
|
||||
|
||||
spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
panel.add(new BasicSlider(m.getSliderModel(0, 0.1, 1.0)), "w 100lp, wrap");
|
||||
|
||||
|
||||
//// Position
|
||||
|
||||
//// Position relative to:
|
||||
panel.add(new JLabel(trans.get("ringcompcfg.Positionrelativeto")));
|
||||
|
||||
JComboBox combo = new JComboBox(
|
||||
new EnumModel<RocketComponent.Position>(component, "RelativePosition",
|
||||
new RocketComponent.Position[] {
|
||||
RocketComponent.Position.TOP,
|
||||
RocketComponent.Position.MIDDLE,
|
||||
RocketComponent.Position.BOTTOM,
|
||||
RocketComponent.Position.ABSOLUTE
|
||||
}));
|
||||
panel.add(combo, "spanx 3, growx, wrap");
|
||||
|
||||
//// plus
|
||||
panel.add(new JLabel(trans.get("ringcompcfg.plus")), "right");
|
||||
|
||||
//// PositionValue
|
||||
m = new DoubleModel(component, "PositionValue", UnitGroup.UNITS_LENGTH);
|
||||
spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
panel.add(new BasicSlider(m.getSliderModel(
|
||||
new DoubleModel(component.getParent(), "Length", -1.0, UnitGroup.UNITS_NONE),
|
||||
new DoubleModel(component.getParent(), "Length"))),
|
||||
"w 100lp, wrap");
|
||||
|
||||
MotorConfig motorConfig = new MotorConfig((MotorMount)c);
|
||||
|
||||
JPanel tab;
|
||||
panel.add(motorConfig,"spanx, growx");
|
||||
|
||||
tab = new MotorConfig((MotorMount) c);
|
||||
//// Motor and Motor mount configuration
|
||||
tabbedPane.insertTab(trans.get("InnerTubeCfg.tab.Motor"), null, tab,
|
||||
trans.get("InnerTubeCfg.tab.ttip.Motor"), 1);
|
||||
|
||||
tab = clusterTab();
|
||||
//// Material
|
||||
panel.add(materialPanel(new JPanel(new MigLayout()), Material.Type.BULK),
|
||||
"cell 4 0, gapleft paragraph, aligny 0%, spany");
|
||||
|
||||
tabbedPane.insertTab(trans.get("ThicknessRingCompCfg.tab.General"), null, panel,
|
||||
trans.get("ThicknessRingCompCfg.tab.Generalprop"), 0);
|
||||
|
||||
JPanel tab = clusterTab();
|
||||
//// Cluster and Cluster configuration
|
||||
tabbedPane.insertTab(trans.get("InnerTubeCfg.tab.Cluster"), null, tab,
|
||||
trans.get("InnerTubeCfg.tab.ttip.Cluster"), 2);
|
||||
|
||||
|
||||
tab = positionTab();
|
||||
//// Radial position
|
||||
tabbedPane.insertTab(trans.get("InnerTubeCfg.tab.Radialpos"), null, tab,
|
||||
trans.get("InnerTubeCfg.tab.ttip.Radialpos"), 3);
|
||||
|
||||
|
||||
tabbedPane.setSelectedIndex(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected JPanel positionTab() {
|
||||
JPanel panel = new JPanel(new MigLayout("align 20% 20%, gap rel unrel",
|
||||
"[][65lp::][30lp::]", ""));
|
||||
|
||||
//// Radial position
|
||||
JLabel l = new JLabel(trans.get("ringcompcfg.Radialdistance"));
|
||||
//// Distance from the rocket centerline
|
||||
l.setToolTipText(trans.get("ringcompcfg.Distancefrom"));
|
||||
panel.add(l);
|
||||
|
||||
DoubleModel m = new DoubleModel(component, "RadialPosition", UnitGroup.UNITS_LENGTH, 0);
|
||||
|
||||
JSpinner spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
//// Distance from the rocket centerline
|
||||
spin.setToolTipText(trans.get("ringcompcfg.Distancefrom"));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
BasicSlider bs = new BasicSlider(m.getSliderModel(0, 0.1, 1.0));
|
||||
//// Distance from the rocket centerline
|
||||
bs.setToolTipText(trans.get("ringcompcfg.Distancefrom"));
|
||||
panel.add(bs, "w 100lp, wrap");
|
||||
|
||||
|
||||
//// Radial direction
|
||||
l = new JLabel(trans.get("ringcompcfg.Radialdirection"));
|
||||
//// The radial direction from the rocket centerline
|
||||
l.setToolTipText(trans.get("ringcompcfg.radialdirectionfrom"));
|
||||
panel.add(l);
|
||||
|
||||
m = new DoubleModel(component, "RadialDirection", UnitGroup.UNITS_ANGLE);
|
||||
|
||||
spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
//// The radial direction from the rocket centerline
|
||||
spin.setToolTipText(trans.get("ringcompcfg.radialdirectionfrom"));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
bs = new BasicSlider(m.getSliderModel(-Math.PI, Math.PI));
|
||||
//// The radial direction from the rocket centerline
|
||||
bs.setToolTipText(trans.get("ringcompcfg.radialdirectionfrom"));
|
||||
panel.add(bs, "w 100lp, wrap");
|
||||
|
||||
|
||||
//// Reset button
|
||||
JButton button = new JButton(trans.get("ringcompcfg.but.Reset"));
|
||||
//// Reset the component to the rocket centerline
|
||||
button.setToolTipText(trans.get("ringcompcfg.but.Resetcomponant"));
|
||||
button.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
((RingComponent) component).setRadialDirection(0.0);
|
||||
((RingComponent) component).setRadialPosition(0.0);
|
||||
}
|
||||
});
|
||||
panel.add(button, "spanx, right, wrap para");
|
||||
|
||||
|
||||
DescriptionArea note = new DescriptionArea(3);
|
||||
//// Note: An inner tube will not affect the aerodynamics of the rocket even if it is located outside of the body tube.
|
||||
note.setText(trans.get("ringcompcfg.note.desc"));
|
||||
panel.add(note, "spanx, growx");
|
||||
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
|
||||
private JPanel clusterTab() {
|
||||
JPanel panel = new JPanel(new MigLayout());
|
||||
|
||||
|
||||
JPanel subPanel = new JPanel(new MigLayout());
|
||||
|
||||
|
||||
// Cluster type selection
|
||||
//// Select cluster configuration:
|
||||
subPanel.add(new JLabel(trans.get("InnerTubeCfg.lbl.Selectclustercfg")), "spanx, wrap");
|
||||
@ -72,12 +274,12 @@ public class InnerTubeConfig extends ThicknessRingComponentConfig {
|
||||
// JPanel clusterSelection = new ClusterSelectionPanel((InnerTube)component);
|
||||
// clusterSelection.setBackground(Color.blue);
|
||||
// subPanel.add(clusterSelection);
|
||||
|
||||
|
||||
panel.add(subPanel);
|
||||
|
||||
|
||||
|
||||
subPanel = new JPanel(new MigLayout("gap rel unrel", "[][65lp::][30lp::]"));
|
||||
|
||||
|
||||
// Tube separation scale
|
||||
//// Tube separation:
|
||||
JLabel l = new JLabel(trans.get("InnerTubeCfg.lbl.TubeSep"));
|
||||
@ -85,18 +287,18 @@ public class InnerTubeConfig extends ThicknessRingComponentConfig {
|
||||
l.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.TubeSep"));
|
||||
subPanel.add(l);
|
||||
DoubleModel dm = new DoubleModel(component, "ClusterScale", 1, UnitGroup.UNITS_NONE, 0);
|
||||
|
||||
|
||||
JSpinner spin = new JSpinner(dm.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
//// The separation of the tubes, 1.0 = touching each other
|
||||
spin.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.TubeSep"));
|
||||
subPanel.add(spin, "growx");
|
||||
|
||||
|
||||
BasicSlider bs = new BasicSlider(dm.getSliderModel(0, 1, 4));
|
||||
//// The separation of the tubes, 1.0 = touching each other
|
||||
bs.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.TubeSep"));
|
||||
subPanel.add(bs, "skip,w 100lp, wrap");
|
||||
|
||||
|
||||
// Rotation:
|
||||
l = new JLabel(trans.get("InnerTubeCfg.lbl.Rotation"));
|
||||
//// Rotation angle of the cluster configuration
|
||||
@ -104,19 +306,19 @@ public class InnerTubeConfig extends ThicknessRingComponentConfig {
|
||||
subPanel.add(l);
|
||||
dm = new DoubleModel(component, "ClusterRotation", 1, UnitGroup.UNITS_ANGLE,
|
||||
-Math.PI, Math.PI);
|
||||
|
||||
|
||||
spin = new JSpinner(dm.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
//// Rotation angle of the cluster configuration
|
||||
spin.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.Rotation"));
|
||||
subPanel.add(spin, "growx");
|
||||
|
||||
|
||||
subPanel.add(new UnitSelector(dm), "growx");
|
||||
bs = new BasicSlider(dm.getSliderModel(-Math.PI, 0, Math.PI));
|
||||
//// Rotation angle of the cluster configuration
|
||||
bs.setToolTipText(trans.get("InnerTubeCfg.lbl.ttip.Rotation"));
|
||||
subPanel.add(bs, "w 100lp, wrap para");
|
||||
|
||||
|
||||
|
||||
|
||||
// Split button
|
||||
@ -139,19 +341,19 @@ public class InnerTubeConfig extends ThicknessRingComponentConfig {
|
||||
throw new BugException("Inconsistent state: component=" + component +
|
||||
" parent=" + parent + " parent.children=" + parent.getChildren());
|
||||
}
|
||||
|
||||
|
||||
InnerTube tube = (InnerTube) component;
|
||||
if (tube.getClusterCount() <= 1)
|
||||
return;
|
||||
|
||||
|
||||
document.addUndoPosition("Split cluster");
|
||||
|
||||
|
||||
Coordinate[] coords = { Coordinate.NUL };
|
||||
coords = component.shiftCoordinates(coords);
|
||||
parent.removeChild(index);
|
||||
for (int i = 0; i < coords.length; i++) {
|
||||
InnerTube copy = InnerTube.makeIndividualClusterComponent(coords[i], component.getName() + " #" + (i + 1), component);
|
||||
|
||||
InnerTube copy = InnerTube.makeIndividualClusterComponent(coords[i], component.getName() + " #" + (i + 1), component);
|
||||
|
||||
parent.addChild(copy, index + i);
|
||||
}
|
||||
}
|
||||
@ -159,7 +361,7 @@ public class InnerTubeConfig extends ThicknessRingComponentConfig {
|
||||
}
|
||||
});
|
||||
subPanel.add(split, "spanx, split 2, gapright para, sizegroup buttons, right");
|
||||
|
||||
|
||||
|
||||
// Reset button
|
||||
///// Reset settings
|
||||
@ -174,9 +376,9 @@ public class InnerTubeConfig extends ThicknessRingComponentConfig {
|
||||
}
|
||||
});
|
||||
subPanel.add(reset, "sizegroup buttons, right");
|
||||
|
||||
|
||||
panel.add(subPanel, "grow");
|
||||
|
||||
|
||||
|
||||
return panel;
|
||||
}
|
||||
@ -188,35 +390,35 @@ public class InnerTubeConfig extends ThicknessRingComponentConfig {
|
||||
class ClusterSelectionPanel extends JPanel {
|
||||
private static final int BUTTON_SIZE = 50;
|
||||
private static final int MOTOR_DIAMETER = 10;
|
||||
|
||||
|
||||
private static final Color SELECTED_COLOR = Color.RED;
|
||||
private static final Color UNSELECTED_COLOR = Color.WHITE;
|
||||
private static final Color MOTOR_FILL_COLOR = Color.GREEN;
|
||||
private static final Color MOTOR_BORDER_COLOR = Color.BLACK;
|
||||
|
||||
|
||||
public ClusterSelectionPanel(Clusterable component) {
|
||||
super(new MigLayout("gap 0 0",
|
||||
"[" + BUTTON_SIZE + "!][" + BUTTON_SIZE + "!][" + BUTTON_SIZE + "!][" + BUTTON_SIZE + "!]",
|
||||
"[" + BUTTON_SIZE + "!][" + BUTTON_SIZE + "!][" + BUTTON_SIZE + "!]"));
|
||||
|
||||
|
||||
for (int i = 0; i < ClusterConfiguration.CONFIGURATIONS.length; i++) {
|
||||
ClusterConfiguration config = ClusterConfiguration.CONFIGURATIONS[i];
|
||||
|
||||
|
||||
JComponent button = new ClusterButton(component, config);
|
||||
if (i % 4 == 3)
|
||||
add(button, "wrap");
|
||||
else
|
||||
add(button);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private class ClusterButton extends JPanel implements StateChangeListener, MouseListener,
|
||||
Resettable {
|
||||
Resettable {
|
||||
private Clusterable component;
|
||||
private ClusterConfiguration config;
|
||||
|
||||
|
||||
public ClusterButton(Clusterable c, ClusterConfiguration config) {
|
||||
component = c;
|
||||
this.config = config;
|
||||
@ -228,81 +430,81 @@ class ClusterSelectionPanel extends JPanel {
|
||||
component.addChangeListener(this);
|
||||
addMouseListener(this);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void paintComponent(Graphics g) {
|
||||
super.paintComponent(g);
|
||||
Graphics2D g2 = (Graphics2D) g;
|
||||
Rectangle area = g2.getClipBounds();
|
||||
|
||||
|
||||
if (component.getClusterConfiguration() == config)
|
||||
g2.setColor(SELECTED_COLOR);
|
||||
else
|
||||
g2.setColor(UNSELECTED_COLOR);
|
||||
|
||||
|
||||
g2.fillRect(area.x, area.y, area.width, area.height);
|
||||
|
||||
|
||||
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
|
||||
RenderingHints.VALUE_STROKE_NORMALIZE);
|
||||
g2.setRenderingHint(RenderingHints.KEY_RENDERING,
|
||||
RenderingHints.VALUE_RENDER_QUALITY);
|
||||
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
|
||||
RenderingHints.VALUE_ANTIALIAS_ON);
|
||||
|
||||
|
||||
List<Double> points = config.getPoints();
|
||||
Ellipse2D.Float circle = new Ellipse2D.Float();
|
||||
for (int i = 0; i < points.size() / 2; i++) {
|
||||
double x = points.get(i * 2);
|
||||
double y = points.get(i * 2 + 1);
|
||||
|
||||
|
||||
double px = BUTTON_SIZE / 2 + x * MOTOR_DIAMETER;
|
||||
double py = BUTTON_SIZE / 2 - y * MOTOR_DIAMETER;
|
||||
circle.setFrameFromCenter(px, py, px + MOTOR_DIAMETER / 2, py + MOTOR_DIAMETER / 2);
|
||||
|
||||
|
||||
g2.setColor(MOTOR_FILL_COLOR);
|
||||
g2.fill(circle);
|
||||
g2.setColor(MOTOR_BORDER_COLOR);
|
||||
g2.draw(circle);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void stateChanged(EventObject e) {
|
||||
repaint();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
if (e.getButton() == MouseEvent.BUTTON1) {
|
||||
component.setClusterConfiguration(config);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseEntered(MouseEvent e) {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseExited(MouseEvent e) {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mousePressed(MouseEvent e) {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent e) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void resetModel() {
|
||||
component.removeChangeListener(this);
|
||||
removeMouseListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -154,8 +154,6 @@ public class LaunchLugConfig extends RocketComponentConfig {
|
||||
@Override
|
||||
public void updateFields() {
|
||||
super.updateFields();
|
||||
if (motorConfigPane != null)
|
||||
motorConfigPane.updateFields();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,20 +1,16 @@
|
||||
package net.sf.openrocket.gui.configdialog;
|
||||
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Container;
|
||||
import java.awt.Font;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JSpinner;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
import javax.swing.event.ChangeListener;
|
||||
|
||||
@ -23,40 +19,27 @@ 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.FlightConfigurationModel;
|
||||
import net.sf.openrocket.gui.components.BasicSlider;
|
||||
import net.sf.openrocket.gui.components.StyledLabel;
|
||||
import net.sf.openrocket.gui.components.UnitSelector;
|
||||
import net.sf.openrocket.gui.dialogs.flightconfiguration.FlightConfigurationDialog;
|
||||
import net.sf.openrocket.gui.dialogs.motor.MotorChooserDialog;
|
||||
import net.sf.openrocket.l10n.Translator;
|
||||
import net.sf.openrocket.motor.Motor;
|
||||
import net.sf.openrocket.motor.ThrustCurveMotor;
|
||||
import net.sf.openrocket.rocketcomponent.Configuration;
|
||||
import net.sf.openrocket.rocketcomponent.IgnitionConfiguration;
|
||||
import net.sf.openrocket.rocketcomponent.MotorConfiguration;
|
||||
import net.sf.openrocket.rocketcomponent.MotorMount;
|
||||
import net.sf.openrocket.rocketcomponent.Rocket;
|
||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||
import net.sf.openrocket.startup.Application;
|
||||
import net.sf.openrocket.unit.UnitGroup;
|
||||
|
||||
public class MotorConfig extends JPanel {
|
||||
|
||||
private final Rocket rocket;
|
||||
private final MotorMount mount;
|
||||
private final Configuration configuration;
|
||||
private JPanel panel;
|
||||
private JLabel motorLabel;
|
||||
private static final Translator trans = Application.getTranslator();
|
||||
|
||||
public MotorConfig(MotorMount motorMount) {
|
||||
super(new MigLayout("fill"));
|
||||
|
||||
this.rocket = ((RocketComponent) motorMount).getRocket();
|
||||
this.mount = motorMount;
|
||||
this.configuration = ((RocketComponent) motorMount).getRocket().getDefaultConfiguration();
|
||||
|
||||
this.setBorder( BorderFactory.createLineBorder(Color.BLACK,1) );
|
||||
BooleanModel model;
|
||||
|
||||
model = new BooleanModel(motorMount, "MotorMount");
|
||||
@ -65,58 +48,10 @@ public class MotorConfig extends JPanel {
|
||||
check.setText(trans.get("MotorCfg.checkbox.compmotormount"));
|
||||
this.add(check, "wrap");
|
||||
|
||||
|
||||
panel = new JPanel(new MigLayout("fill"));
|
||||
final JPanel panel = new JPanel(new MigLayout("fill"));
|
||||
this.add(panel, "grow, wrap");
|
||||
|
||||
|
||||
// Motor configuration selector
|
||||
//// Motor configuration:
|
||||
panel.add(new JLabel(trans.get("MotorCfg.lbl.Flightcfg")), "shrink");
|
||||
|
||||
JComboBox combo = new JComboBox(new FlightConfigurationModel(configuration));
|
||||
panel.add(combo, "growx");
|
||||
combo.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
updateFields();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
//// New button
|
||||
JButton button = new JButton(trans.get("MotorCfg.but.New"));
|
||||
button.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
String id = rocket.newFlightConfigurationID();
|
||||
configuration.setFlightConfigurationID(id);
|
||||
}
|
||||
});
|
||||
panel.add(button, "");
|
||||
|
||||
//// Edit button
|
||||
button = new JButton(trans.get("MotorCfg.but.FlightcfgEdit"));
|
||||
button.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
JDialog configDialog = new FlightConfigurationDialog(rocket, SwingUtilities.windowForComponent(MotorConfig.this));
|
||||
configDialog.show();
|
||||
}
|
||||
});
|
||||
panel.add(button, "wrap unrel");
|
||||
|
||||
|
||||
// Current motor:
|
||||
panel.add(new JLabel(trans.get("MotorCfg.lbl.Currentmotor")), "shrink");
|
||||
|
||||
motorLabel = new JLabel();
|
||||
motorLabel.setFont(motorLabel.getFont().deriveFont(Font.BOLD));
|
||||
updateFields();
|
||||
panel.add(motorLabel, "wrap unrel");
|
||||
|
||||
|
||||
|
||||
// Overhang
|
||||
//// Motor overhang:
|
||||
panel.add(new JLabel(trans.get("MotorCfg.lbl.Motoroverhang")));
|
||||
@ -137,7 +72,7 @@ public class MotorConfig extends JPanel {
|
||||
panel.add(new JLabel(trans.get("MotorCfg.lbl.Ignitionat") + " " + CommonStrings.dagger), "");
|
||||
|
||||
IgnitionConfiguration ignitionConfig = mount.getIgnitionConfiguration().getDefault();
|
||||
combo = new JComboBox(new EnumModel<IgnitionConfiguration.IgnitionEvent>(ignitionConfig, "IgnitionEvent"));
|
||||
JComboBox combo = new JComboBox(new EnumModel<IgnitionConfiguration.IgnitionEvent>(ignitionConfig, "IgnitionEvent"));
|
||||
panel.add(combo, "growx, wrap");
|
||||
|
||||
// ... and delay
|
||||
@ -176,51 +111,6 @@ public class MotorConfig extends JPanel {
|
||||
}
|
||||
|
||||
|
||||
// Select etc. buttons
|
||||
//// Select motor
|
||||
button = new JButton(trans.get("MotorCfg.but.Selectmotor"));
|
||||
button.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
String id = configuration.getFlightConfigurationID();
|
||||
|
||||
MotorChooserDialog dialog = new MotorChooserDialog(mount.getMotor(id),
|
||||
mount.getMotorDelay(id), mount.getMotorMountDiameter(),
|
||||
SwingUtilities.getWindowAncestor(MotorConfig.this));
|
||||
dialog.setVisible(true);
|
||||
Motor m = dialog.getSelectedMotor();
|
||||
double d = dialog.getSelectedDelay();
|
||||
|
||||
if (m != null) {
|
||||
if (id == null) {
|
||||
id = rocket.newFlightConfigurationID();
|
||||
configuration.setFlightConfigurationID(id);
|
||||
}
|
||||
MotorConfiguration config = new MotorConfiguration();
|
||||
config.setMotor(m);
|
||||
config.setEjectionDelay(d);
|
||||
mount.getMotorConfiguration().set(id, config);
|
||||
}
|
||||
updateFields();
|
||||
}
|
||||
});
|
||||
panel.add(button, "span, split, growx");
|
||||
|
||||
//// Remove motor
|
||||
button = new JButton(trans.get("MotorCfg.but.Removemotor"));
|
||||
button.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
mount.getMotorConfiguration().resetDefault(configuration.getFlightConfigurationID());
|
||||
updateFields();
|
||||
}
|
||||
});
|
||||
panel.add(button, "growx, wrap");
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Set enabled status
|
||||
|
||||
setDeepEnabled(panel, motorMount.isMotorMount());
|
||||
@ -233,22 +123,6 @@ public class MotorConfig extends JPanel {
|
||||
|
||||
}
|
||||
|
||||
public void updateFields() {
|
||||
String id = configuration.getFlightConfigurationID();
|
||||
Motor m = mount.getMotor(id);
|
||||
if (m == null) {
|
||||
//// None
|
||||
motorLabel.setText(trans.get("MotorCfg.lbl.motorLabel"));
|
||||
} else {
|
||||
String str = "";
|
||||
if (m instanceof ThrustCurveMotor)
|
||||
str = ((ThrustCurveMotor) m).getManufacturer() + " ";
|
||||
str += m.getDesignation(mount.getMotorDelay(id));
|
||||
motorLabel.setText(str);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void setDeepEnabled(Component component, boolean enabled) {
|
||||
component.setEnabled(enabled);
|
||||
if (component instanceof Container) {
|
||||
|
@ -1,10 +1,6 @@
|
||||
package net.sf.openrocket.gui.configdialog;
|
||||
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JLabel;
|
||||
@ -22,7 +18,6 @@ import net.sf.openrocket.gui.components.UnitSelector;
|
||||
import net.sf.openrocket.l10n.Translator;
|
||||
import net.sf.openrocket.material.Material;
|
||||
import net.sf.openrocket.rocketcomponent.EngineBlock;
|
||||
import net.sf.openrocket.rocketcomponent.RingComponent;
|
||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||
import net.sf.openrocket.startup.Application;
|
||||
import net.sf.openrocket.unit.UnitGroup;
|
||||
@ -171,73 +166,4 @@ public class RingComponentConfig extends RocketComponentConfig {
|
||||
}
|
||||
|
||||
|
||||
protected JPanel positionTab() {
|
||||
JPanel panel = new JPanel(new MigLayout("align 20% 20%, gap rel unrel",
|
||||
"[][65lp::][30lp::]", ""));
|
||||
|
||||
//// Radial position
|
||||
JLabel l = new JLabel(trans.get("ringcompcfg.Radialdistance"));
|
||||
//// Distance from the rocket centerline
|
||||
l.setToolTipText(trans.get("ringcompcfg.Distancefrom"));
|
||||
panel.add(l);
|
||||
|
||||
DoubleModel m = new DoubleModel(component, "RadialPosition", UnitGroup.UNITS_LENGTH, 0);
|
||||
|
||||
JSpinner spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
//// Distance from the rocket centerline
|
||||
spin.setToolTipText(trans.get("ringcompcfg.Distancefrom"));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
BasicSlider bs = new BasicSlider(m.getSliderModel(0, 0.1, 1.0));
|
||||
//// Distance from the rocket centerline
|
||||
bs.setToolTipText(trans.get("ringcompcfg.Distancefrom"));
|
||||
panel.add(bs, "w 100lp, wrap");
|
||||
|
||||
|
||||
//// Radial direction
|
||||
l = new JLabel(trans.get("ringcompcfg.Radialdirection"));
|
||||
//// The radial direction from the rocket centerline
|
||||
l.setToolTipText(trans.get("ringcompcfg.radialdirectionfrom"));
|
||||
panel.add(l);
|
||||
|
||||
m = new DoubleModel(component, "RadialDirection", UnitGroup.UNITS_ANGLE);
|
||||
|
||||
spin = new JSpinner(m.getSpinnerModel());
|
||||
spin.setEditor(new SpinnerEditor(spin));
|
||||
//// The radial direction from the rocket centerline
|
||||
spin.setToolTipText(trans.get("ringcompcfg.radialdirectionfrom"));
|
||||
panel.add(spin, "growx");
|
||||
|
||||
panel.add(new UnitSelector(m), "growx");
|
||||
bs = new BasicSlider(m.getSliderModel(-Math.PI, Math.PI));
|
||||
//// The radial direction from the rocket centerline
|
||||
bs.setToolTipText(trans.get("ringcompcfg.radialdirectionfrom"));
|
||||
panel.add(bs, "w 100lp, wrap");
|
||||
|
||||
|
||||
//// Reset button
|
||||
JButton button = new JButton(trans.get("ringcompcfg.but.Reset"));
|
||||
//// Reset the component to the rocket centerline
|
||||
button.setToolTipText(trans.get("ringcompcfg.but.Resetcomponant"));
|
||||
button.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
((RingComponent) component).setRadialDirection(0.0);
|
||||
((RingComponent) component).setRadialPosition(0.0);
|
||||
}
|
||||
});
|
||||
panel.add(button, "spanx, right, wrap para");
|
||||
|
||||
|
||||
DescriptionArea note = new DescriptionArea(3);
|
||||
//// Note: An inner tube will not affect the aerodynamics of the rocket even if it is located outside of the body tube.
|
||||
note.setText(trans.get("ringcompcfg.note.desc"));
|
||||
panel.add(note, "spanx, growx");
|
||||
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,34 +0,0 @@
|
||||
package net.sf.openrocket.gui.configdialog;
|
||||
|
||||
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.l10n.Translator;
|
||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||
import net.sf.openrocket.startup.Application;
|
||||
|
||||
|
||||
|
||||
public class ThicknessRingComponentConfig extends RingComponentConfig {
|
||||
private static final Translator trans = Application.getTranslator();
|
||||
|
||||
public ThicknessRingComponentConfig(OpenRocketDocument d, RocketComponent c) {
|
||||
super(d, c);
|
||||
|
||||
JPanel tab;
|
||||
|
||||
//// Outer diameter:
|
||||
//// Inner diameter:
|
||||
//// Wall thickness:
|
||||
//// Length:
|
||||
tab = generalTab(trans.get("ThicknessRingCompCfg.tab.Outerdiam"),
|
||||
trans.get("ThicknessRingCompCfg.tab.Innerdiam"),
|
||||
trans.get("ThicknessRingCompCfg.tab.Wallthickness"), trans.get("ThicknessRingCompCfg.tab.Length"));
|
||||
//// General and General properties
|
||||
tabbedPane.insertTab(trans.get("ThicknessRingCompCfg.tab.General"), null, tab,
|
||||
trans.get("ThicknessRingCompCfg.tab.Generalprop"), 0);
|
||||
tabbedPane.setSelectedIndex(0);
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user