Merged l10n branch to trunk
[debian/openrocket] / src / net / sf / openrocket / gui / scalefigure / RocketPanel.java
index 94bf1017de70cbbbfc31b9fe79a5237672b7f549..c367d7e29d3a184c0c56a6daea9b44401048a0a8 100644 (file)
@@ -1,35 +1,6 @@
 package net.sf.openrocket.gui.scalefigure;
 
 
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.Point;
-import java.awt.event.ActionEvent;
-import java.awt.event.InputEvent;
-import java.awt.event.MouseEvent;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JSlider;
-import javax.swing.JToggleButton;
-import javax.swing.JViewport;
-import javax.swing.SwingUtilities;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import javax.swing.event.TreeSelectionEvent;
-import javax.swing.event.TreeSelectionListener;
-import javax.swing.tree.TreePath;
-import javax.swing.tree.TreeSelectionModel;
-
 import net.miginfocom.swing.MigLayout;
 import net.sf.openrocket.aerodynamics.AerodynamicCalculator;
 import net.sf.openrocket.aerodynamics.BarrowmanCalculator;
@@ -37,32 +8,66 @@ import net.sf.openrocket.aerodynamics.FlightConditions;
 import net.sf.openrocket.aerodynamics.WarningSet;
 import net.sf.openrocket.document.OpenRocketDocument;
 import net.sf.openrocket.document.Simulation;
-import net.sf.openrocket.gui.BasicSlider;
-import net.sf.openrocket.gui.StageSelector;
-import net.sf.openrocket.gui.UnitSelector;
 import net.sf.openrocket.gui.adaptors.DoubleModel;
 import net.sf.openrocket.gui.adaptors.MotorConfigurationModel;
+import net.sf.openrocket.gui.components.BasicSlider;
+import net.sf.openrocket.gui.components.StageSelector;
+import net.sf.openrocket.gui.components.UnitSelector;
 import net.sf.openrocket.gui.configdialog.ComponentConfigDialog;
 import net.sf.openrocket.gui.figureelements.CGCaret;
 import net.sf.openrocket.gui.figureelements.CPCaret;
 import net.sf.openrocket.gui.figureelements.Caret;
 import net.sf.openrocket.gui.figureelements.RocketInfo;
-import net.sf.openrocket.gui.main.ComponentTreeModel;
 import net.sf.openrocket.gui.main.SimulationWorker;
+import net.sf.openrocket.gui.main.componenttree.ComponentTreeModel;
+import net.sf.openrocket.l10n.Translator;
+import net.sf.openrocket.masscalc.BasicMassCalculator;
+import net.sf.openrocket.masscalc.MassCalculator;
+import net.sf.openrocket.masscalc.MassCalculator.MassCalcType;
 import net.sf.openrocket.rocketcomponent.Configuration;
 import net.sf.openrocket.rocketcomponent.Rocket;
 import net.sf.openrocket.rocketcomponent.RocketComponent;
 import net.sf.openrocket.rocketcomponent.SymmetricComponent;
 import net.sf.openrocket.simulation.FlightData;
-import net.sf.openrocket.simulation.SimulationListener;
-import net.sf.openrocket.simulation.listeners.ApogeeEndListener;
-import net.sf.openrocket.simulation.listeners.InterruptListener;
+import net.sf.openrocket.simulation.listeners.SimulationListener;
+import net.sf.openrocket.simulation.listeners.system.ApogeeEndListener;
+import net.sf.openrocket.simulation.listeners.system.InterruptListener;
+import net.sf.openrocket.startup.Application;
 import net.sf.openrocket.unit.UnitGroup;
 import net.sf.openrocket.util.ChangeSource;
+import net.sf.openrocket.util.Chars;
 import net.sf.openrocket.util.Coordinate;
 import net.sf.openrocket.util.MathUtil;
 import net.sf.openrocket.util.Prefs;
 
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JSlider;
+import javax.swing.JToggleButton;
+import javax.swing.JViewport;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.tree.TreePath;
+import javax.swing.tree.TreeSelectionModel;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
 /**
  * A JPanel that contains a RocketFigure and buttons to manipulate the figure. 
  * 
@@ -70,18 +75,20 @@ import net.sf.openrocket.util.Prefs;
  */
 public class RocketPanel extends JPanel implements TreeSelectionListener, ChangeSource {
        
+       private static final Translator trans = Application.getTranslator();
        private final RocketFigure figure;
        private final ScaleScrollPane scrollPane;
-
+       
        private JLabel infoMessage;
        
        private TreeSelectionModel selectionModel = null;
-
        
+
        /* Calculation of CP and CG */
-       private AerodynamicCalculator calculator;
-       
+       private AerodynamicCalculator aerodynamicCalculator;
+       private MassCalculator massCalculator;
        
+
        private final OpenRocketDocument document;
        private final Configuration configuration;
        
@@ -89,7 +96,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
        private Caret extraCG = null;
        private RocketInfo extraText = null;
        
-       
+
        private double cpAOA = Double.NaN;
        private double cpTheta = Double.NaN;
        private double cpMach = Double.NaN;
@@ -99,13 +106,13 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
        private int flightDataFunctionalID = -1;
        private String flightDataMotorID = null;
        
-       
+
        private SimulationWorker backgroundSimulationWorker = null;
+       private boolean dirty = false;
        
-
        private List<ChangeListener> listeners = new ArrayList<ChangeListener>();
        
-       
+
        /**
         * The executor service used for running the background simulations.
         * This uses a fixed-sized thread pool for all background simulations
@@ -115,15 +122,16 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
        static {
                backgroundSimulationExecutor = Executors.newFixedThreadPool(Prefs.getMaxThreadCount(),
                                new ThreadFactory() {
-                       private ThreadFactory factory = Executors.defaultThreadFactory();
-                       @Override
-                       public Thread newThread(Runnable r) {
-                               Thread t = factory.newThread(r);
-                               t.setDaemon(true);
-                               t.setPriority(Thread.MIN_PRIORITY);
-                               return t;
-                       }
-               });
+                                       private ThreadFactory factory = Executors.defaultThreadFactory();
+                                       
+                                       @Override
+                                       public Thread newThread(Runnable r) {
+                                               Thread t = factory.newThread(r);
+                                               t.setDaemon(true);
+                                               t.setPriority(Thread.MIN_PRIORITY);
+                                               return t;
+                                       }
+                               });
        }
        
        
@@ -133,7 +141,8 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                configuration = document.getDefaultConfiguration();
                
                // TODO: FUTURE: calculator selection
-               calculator = new BarrowmanCalculator(configuration);
+               aerodynamicCalculator = new BarrowmanCalculator();
+               massCalculator = new BasicMassCalculator();
                
                // Create figure and custom scroll pane
                figure = new RocketFigure(configuration);
@@ -146,9 +155,9 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                };
                scrollPane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
                scrollPane.setFitting(true);
-
+               
                createPanel();
-
+               
                configuration.addChangeListener(new ChangeListener() {
                        @Override
                        public void stateChanged(ChangeEvent e) {
@@ -164,25 +173,29 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
         * Creates the layout and components of the panel.
         */
        private void createPanel() {
-               setLayout(new MigLayout("","[shrink][grow]","[shrink][shrink][grow][shrink]"));
+               setLayout(new MigLayout("", "[shrink][grow]", "[shrink][shrink][grow][shrink]"));
                
-               setPreferredSize(new Dimension(800,300));
+               setPreferredSize(new Dimension(800, 300));
                
 
                //// Create toolbar
                
                // Side/back buttons
                FigureTypeAction action = new FigureTypeAction(RocketFigure.TYPE_SIDE);
-               action.putValue(Action.NAME, "Side view");
-               action.putValue(Action.SHORT_DESCRIPTION, "Side view");
+               //// Side view
+               action.putValue(Action.NAME, trans.get("RocketPanel.FigTypeAct.Sideview"));
+               //// Side view
+               action.putValue(Action.SHORT_DESCRIPTION, trans.get("RocketPanel.FigTypeAct.ttip.Sideview"));
                JToggleButton toggle = new JToggleButton(action);
-               add(toggle,"spanx, split");
+               add(toggle, "spanx, split");
                
                action = new FigureTypeAction(RocketFigure.TYPE_BACK);
-               action.putValue(Action.NAME, "Back view");
-               action.putValue(Action.SHORT_DESCRIPTION, "Rear view");
+               //// Back view
+               action.putValue(Action.NAME, trans.get("RocketPanel.FigTypeAct.Backview"));
+               //// Back view
+               action.putValue(Action.SHORT_DESCRIPTION, trans.get("RocketPanel.FigTypeAct.ttip.Backview"));
                toggle = new JToggleButton(action);
-               add(toggle,"gap rel");
+               add(toggle, "gap rel");
                
 
                // Zoom level selector
@@ -190,81 +203,105 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                add(scaleSelector);
                
 
-               
+
                // Stage selector
                StageSelector stageSelector = new StageSelector(configuration);
-               add(stageSelector,"");
-               
-               
+               add(stageSelector, "");
                
+
+
                // Motor configuration selector
-               
-               JLabel label = new JLabel("Motor configuration:");
+               //// Motor configuration:
+               JLabel label = new JLabel(trans.get("RocketPanel.lbl.Motorcfg"));
                label.setHorizontalAlignment(JLabel.RIGHT);
-               add(label,"growx, right");
-               add(new JComboBox(new MotorConfigurationModel(configuration)),"wrap");
-               
-               
-               
-               
+               add(label, "growx, right");
+               add(new JComboBox(new MotorConfigurationModel(configuration)), "wrap");
                
+
+
+
+
                // Create slider and scroll pane
                
-               DoubleModel theta = new DoubleModel(figure,"Rotation",
-                               UnitGroup.UNITS_ANGLE,0,2*Math.PI);
-               UnitSelector us = new UnitSelector(theta,true);
+               DoubleModel theta = new DoubleModel(figure, "Rotation",
+                               UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI);
+               UnitSelector us = new UnitSelector(theta, true);
                us.setHorizontalAlignment(JLabel.CENTER);
-               add(us,"alignx 50%, growx");
-
-               // Add the rocket figure
-               add(scrollPane,"grow, spany 2, wmin 300lp, hmin 100lp, wrap");
+               add(us, "alignx 50%, growx");
                
+               // Add the rocket figure
+               add(scrollPane, "grow, spany 2, wmin 300lp, hmin 100lp, wrap");
                
+
                // Add rotation slider
                // Minimum size to fit "360deg"
-               JLabel l = new JLabel("360\u00b0");
+               JLabel l = new JLabel("360" + Chars.DEGREE);
                Dimension d = l.getPreferredSize();
                
-               add(new BasicSlider(theta.getSliderModel(0,2*Math.PI),JSlider.VERTICAL,true),
-                               "ax 50%, wrap, width "+(d.width+6)+"px:null:null, growy");
-
-
-               infoMessage = new JLabel("<html>" +
-                               "Click to select &nbsp;&nbsp; " +
-                               "Shift+click to select other &nbsp;&nbsp; " +
-                               "Double-click to edit &nbsp;&nbsp; " +
-                               "Click+drag to move");
+               add(new BasicSlider(theta.getSliderModel(0, 2 * Math.PI), JSlider.VERTICAL, true),
+                               "ax 50%, wrap, width " + (d.width + 6) + "px:null:null, growy");
+               
+               
+               //// <html>Click to select &nbsp;&nbsp; Shift+click to select other &nbsp;&nbsp; Double-click to edit &nbsp;&nbsp; Click+drag to move
+               infoMessage = new JLabel(trans.get("RocketPanel.lbl.infoMessage"));
                infoMessage.setFont(new Font("Sans Serif", Font.PLAIN, 9));
-               add(infoMessage,"skip, span, gapleft 25, wrap");
+               add(infoMessage, "skip, span, gapleft 25, wrap");
                
                addExtras();
        }
        
        
-       
+
        public RocketFigure getFigure() {
                return figure;
        }
        
-       public AerodynamicCalculator getCalculator() {
-               return calculator;
+       public AerodynamicCalculator getAerodynamicCalculator() {
+               return aerodynamicCalculator;
        }
        
        public Configuration getConfiguration() {
                return configuration;
        }
-       
-       public void setSelectionModel(TreeSelectionModel m) {
+
+    /**
+     * Get the center of pressure figure element.
+     * 
+     * @return center of pressure info
+     */
+    public Caret getExtraCP () {
+        return extraCP;
+    }
+
+    /**
+     * Get the center of gravity figure element.
+     * 
+     * @return center of gravity info
+     */
+    public Caret getExtraCG () {
+        return extraCG;
+    }
+
+    /**
+     * Get the extra text figure element.
+     * 
+     * @return extra text that contains info about the rocket design
+     */
+    public RocketInfo getExtraText () {
+        return extraText;
+    }
+
+    public void setSelectionModel(TreeSelectionModel m) {
                if (selectionModel != null) {
                        selectionModel.removeTreeSelectionListener(this);
                }
                selectionModel = m;
                selectionModel.addTreeSelectionListener(this);
-               valueChanged((TreeSelectionEvent)null);   // updates FigureParameters
+               valueChanged((TreeSelectionEvent) null); // updates FigureParameters
        }
        
        
-       
+
        /**
         * Return the angle of attack used in CP calculation.  NaN signifies the default value
         * of zero.
@@ -334,11 +371,12 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
        }
        
        
-       
+
        @Override
        public void addChangeListener(ChangeListener listener) {
-               listeners.add(0,listener);
+               listeners.add(0, listener);
        }
+       
        @Override
        public void removeChangeListener(ChangeListener listener) {
                listeners.remove(listener);
@@ -347,25 +385,25 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
        protected void fireChangeEvent() {
                ChangeEvent e = new ChangeEvent(this);
                ChangeListener[] list = listeners.toArray(new ChangeListener[0]);
-               for (ChangeListener l: list) {
+               for (ChangeListener l : list) {
                        l.stateChanged(e);
                }
        }
-
-       
        
        
+
+
        /**
         * Handle clicking on figure shapes.  The functioning is the following:
         * 
         * Get the components clicked.
         * If no component is clicked, do nothing.
-        * If the primary currently selected component is in the set, keep it, 
+        * If the currently selected component is in the set, keep it, 
         * unless the selector specified is pressed.  If it is pressed, cycle to 
         * the next component. Otherwise select the first component in the list. 
         */
        public static final int CYCLE_SELECTION_MODIFIER = InputEvent.SHIFT_DOWN_MASK;
-
+       
        private void handleMouseClick(MouseEvent event) {
                if (event.getButton() != MouseEvent.BUTTON1)
                        return;
@@ -375,7 +413,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                int y = p0.y + p1.y;
                
                RocketComponent[] clicked = figure.getComponentsByPoint(x, y);
-
+               
                // If no component is clicked, do nothing
                if (clicked.length == 0)
                        return;
@@ -383,12 +421,12 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                // Check whether the currently selected component is in the clicked components.
                TreePath path = selectionModel.getSelectionPath();
                if (path != null) {
-                       RocketComponent current = (RocketComponent)path.getLastPathComponent();
+                       RocketComponent current = (RocketComponent) path.getLastPathComponent();
                        path = null;
-                       for (int i=0; i<clicked.length; i++) {
+                       for (int i = 0; i < clicked.length; i++) {
                                if (clicked[i] == current) {
-                                       if (event.isShiftDown() && (event.getClickCount()==1)) {
-                                               path = ComponentTreeModel.makeTreePath(clicked[(i+1)%clicked.length]);
+                                       if (event.isShiftDown() && (event.getClickCount() == 1)) {
+                                               path = ComponentTreeModel.makeTreePath(clicked[(i + 1) % clicked.length]);
                                        } else {
                                                path = ComponentTreeModel.makeTreePath(clicked[i]);
                                        }
@@ -396,38 +434,43 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                                }
                        }
                }
-
+               
                // Currently selected component not clicked
                if (path == null) {
-                       path = ComponentTreeModel.makeTreePath(clicked[0]);
+                       if (event.isShiftDown() && event.getClickCount() == 1 && clicked.length > 1) {
+                               path = ComponentTreeModel.makeTreePath(clicked[1]);
+                       } else {
+                               path = ComponentTreeModel.makeTreePath(clicked[0]);
+                       }
                }
                
                // Set selection and check for double-click
                selectionModel.setSelectionPath(path);
                if (event.getClickCount() == 2) {
-                       RocketComponent component = (RocketComponent)path.getLastPathComponent();
+                       RocketComponent component = (RocketComponent) path.getLastPathComponent();
                        
-                       ComponentConfigDialog.showDialog(SwingUtilities.getWindowAncestor(this), 
+                       ComponentConfigDialog.showDialog(SwingUtilities.getWindowAncestor(this),
                                        document, component);
                }
        }
        
-
        
 
+
        /**
         * Updates the extra data included in the figure.  Currently this includes
         * the CP and CG carets.
         */
        private WarningSet warnings = new WarningSet();
+       
        private void updateExtras() {
-               Coordinate cp,cg;
+               Coordinate cp, cg;
                double cpx, cgx;
-
+               
                // TODO: MEDIUM: User-definable conditions
                FlightConditions conditions = new FlightConditions(configuration);
                warnings.clear();
-
+               
                if (!Double.isNaN(cpMach)) {
                        conditions.setMach(cpMach);
                        extraText.setMach(cpMach);
@@ -448,18 +491,18 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                } else {
                        conditions.setRollRate(0);
                }
-
+               
                if (!Double.isNaN(cpTheta)) {
                        conditions.setTheta(cpTheta);
-                       cp = calculator.getCP(conditions, warnings);
+                       cp = aerodynamicCalculator.getCP(configuration, conditions, warnings);
                } else {
-                       cp = calculator.getWorstCP(conditions, warnings);
+                       cp = aerodynamicCalculator.getWorstCP(configuration, conditions, warnings);
                }
                extraText.setTheta(cpTheta);
                
 
-               cg = calculator.getCG(0);
-//             System.out.println("CG computed as "+cg+ " CP as "+cp);
+               cg = massCalculator.getCG(configuration, MassCalcType.LAUNCH_MASS);
+               //              System.out.println("CG computed as "+cg+ " CP as "+cp);
                
                if (cp.weight > 0.000001)
                        cpx = cp.x;
@@ -476,7 +519,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                Collection<Coordinate> bounds = configuration.getBounds();
                if (!bounds.isEmpty()) {
                        double minX = Double.POSITIVE_INFINITY, maxX = Double.NEGATIVE_INFINITY;
-                       for (Coordinate c: bounds) {
+                       for (Coordinate c : bounds) {
                                if (c.x < minX)
                                        minX = c.x;
                                if (c.x > maxX)
@@ -485,28 +528,28 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                        length = maxX - minX;
                }
                
-               for (RocketComponent c: configuration) {
+               for (RocketComponent c : configuration) {
                        if (c instanceof SymmetricComponent) {
-                               double d1 = ((SymmetricComponent)c).getForeRadius() * 2;
-                               double d2 = ((SymmetricComponent)c).getAftRadius() * 2;
+                               double d1 = ((SymmetricComponent) c).getForeRadius() * 2;
+                               double d2 = ((SymmetricComponent) c).getAftRadius() * 2;
                                diameter = MathUtil.max(diameter, d1, d2);
                        }
                }
-
+               
                extraText.setCG(cgx);
                extraText.setCP(cpx);
                extraText.setLength(length);
                extraText.setDiameter(diameter);
                extraText.setMass(cg.weight);
                extraText.setWarnings(warnings);
-                       
                
-               if (figure.getType() == RocketFigure.TYPE_SIDE && length > 0) {
 
+               if (figure.getType() == RocketFigure.TYPE_SIDE && length > 0) {
+                       
                        // TODO: LOW: Y-coordinate and rotation
                        extraCP.setPosition(cpx * RocketFigure.EXTRA_SCALE, 0);
                        extraCG.setPosition(cgx * RocketFigure.EXTRA_SCALE, 0);
-
+                       
                } else {
                        
                        extraCP.setPosition(Double.NaN, Double.NaN);
@@ -514,7 +557,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                        
                }
                
-               
+
                ////////  Flight simulation in background
                
                // Check whether to compute or not
@@ -530,7 +573,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                                flightDataMotorID == configuration.getMotorConfigurationID()) {
                        return;
                }
-
+               
                flightDataFunctionalID = configuration.getRocket().getFunctionalModID();
                flightDataMotorID = configuration.getMotorConfigurationID();
                
@@ -543,15 +586,15 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                        extraText.setCalculatingData(false);
                        return;
                }
-
+               
                // Start calculation process
                extraText.setCalculatingData(true);
                
-               Rocket duplicate = configuration.getRocket().copy();
+               Rocket duplicate = (Rocket) configuration.getRocket().copy();
                Simulation simulation = Prefs.getBackgroundSimulation(duplicate);
                simulation.getConditions().setMotorConfigurationID(
                                configuration.getMotorConfigurationID());
-
+               
                backgroundSimulationWorker = new BackgroundSimulationWorker(simulation);
                backgroundSimulationExecutor.execute(backgroundSimulationWorker);
        }
@@ -566,14 +609,14 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                }
        }
        
-
+       
        /**
         * A SimulationWorker that simulates the rocket flight in the background and
         * sets the results to the extra text when finished.  The worker can be cancelled
         * if necessary.
         */
        private class BackgroundSimulationWorker extends SimulationWorker {
-
+               
                public BackgroundSimulationWorker(Simulation sim) {
                        super(sim);
                }
@@ -584,17 +627,18 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                        // Pause a little while to allow faster UI reaction
                        try {
                                Thread.sleep(300);
-                       } catch (InterruptedException ignore) { }
+                       } catch (InterruptedException ignore) {
+                       }
                        if (isCancelled() || backgroundSimulationWorker != this)
                                return null;
                        
                        return super.doInBackground();
                }
-
+               
                @Override
                protected void simulationDone() {
                        // Do nothing if cancelled
-                       if (isCancelled() || backgroundSimulationWorker != this)  // Double-check
+                       if (isCancelled() || backgroundSimulationWorker != this)
                                return;
                        
                        backgroundSimulationWorker = null;
@@ -602,19 +646,18 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                        extraText.setCalculatingData(false);
                        figure.repaint();
                }
-
+               
                @Override
                protected SimulationListener[] getExtraListeners() {
                        return new SimulationListener[] {
                                        InterruptListener.INSTANCE,
-                                       ApogeeEndListener.INSTANCE
-                       };
+                                       ApogeeEndListener.INSTANCE };
                }
-
+               
                @Override
                protected void simulationInterrupted(Throwable t) {
                        // Do nothing on cancel, set N/A data otherwise
-                       if (isCancelled() || backgroundSimulationWorker != this)  // Double-check
+                       if (isCancelled() || backgroundSimulationWorker != this) // Double-check
                                return;
                        
                        backgroundSimulationWorker = null;
@@ -625,41 +668,42 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
        }
        
        
-       
+
        /**
         * Adds the extra data to the figure.  Currently this includes the CP and CG carets.
         */
        private void addExtras() {
                figure.clearRelativeExtra();
-               extraCG = new CGCaret(0,0);
-               extraCP = new CPCaret(0,0);
+               extraCG = new CGCaret(0, 0);
+               extraCP = new CPCaret(0, 0);
                extraText = new RocketInfo(configuration);
                updateExtras();
                figure.addRelativeExtra(extraCP);
                figure.addRelativeExtra(extraCG);
                figure.addAbsoluteExtra(extraText);
        }
-
+       
        
        /**
         * Updates the selection in the FigureParameters and repaints the figure.  
         * Ignores the event itself.
         */
+       @Override
        public void valueChanged(TreeSelectionEvent e) {
                TreePath[] paths = selectionModel.getSelectionPaths();
-               if (paths==null) {
+               if (paths == null) {
                        figure.setSelection(null);
                        return;
                }
                
                RocketComponent[] components = new RocketComponent[paths.length];
-               for (int i=0; i<paths.length; i++)
-                       components[i] = (RocketComponent)paths[i].getLastPathComponent();
+               for (int i = 0; i < paths.length; i++)
+                       components[i] = (RocketComponent) paths[i].getLastPathComponent();
                figure.setSelection(components);
        }
-
        
        
+
        /**
         * An <code>Action</code> that shows whether the figure type is the type
         * given in the constructor.
@@ -675,8 +719,9 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                        figure.addChangeListener(this);
                }
                
+               @Override
                public void actionPerformed(ActionEvent e) {
-                       boolean state = (Boolean)getValue(Action.SELECTED_KEY);
+                       boolean state = (Boolean) getValue(Action.SELECTED_KEY);
                        if (state == true) {
                                // This view has been selected
                                figure.setType(type);
@@ -684,10 +729,11 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                        }
                        stateChanged(null);
                }
-
+               
+               @Override
                public void stateChanged(ChangeEvent e) {
-                       putValue(Action.SELECTED_KEY,figure.getType() == type);
+                       putValue(Action.SELECTED_KEY, figure.getType() == type);
                }
        }
-
+       
 }