Move Summary to top of motor editor, make it show progress.
authorBill Kuker <bkuker@billkuker.com>
Mon, 8 Nov 2010 01:49:54 +0000 (01:49 +0000)
committerBill Kuker <bkuker@billkuker.com>
Mon, 8 Nov 2010 01:49:54 +0000 (01:49 +0000)
Awesome

gui/com/billkuker/rocketry/motorsim/visual/BurnPanel.java
gui/com/billkuker/rocketry/motorsim/visual/SummaryPanel.java
gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java

index 6ee32df1f6626df0e1f632be0e65a8fa795c8b53..e586d69522d5ab152dbcf59827d3336164ec74b6 100644 (file)
@@ -97,9 +97,6 @@ public class BurnPanel extends JPanel {
                        add( new SL(), BorderLayout.SOUTH);\r
                        \r
                        BurnSummary bi = new BurnSummary(burn);\r
-                       SummaryPanel text = new SummaryPanel(burn);\r
-                       text.setBurnSummary(bi);\r
-                       add(text, BorderLayout.NORTH);\r
                        \r
                        {\r
 \r
index 3d7bb99e128905084af33305da2c96664177696c..53f11d7fbcd4838b73470028c0e824a228f3307e 100644 (file)
 package com.billkuker.rocketry.motorsim.visual;\r
 \r
+import java.awt.BorderLayout;\r
 import java.awt.Color;\r
+import java.awt.Dimension;\r
 import java.awt.GridLayout;\r
 import java.text.DecimalFormat;\r
 \r
+import javax.measure.quantity.Length;\r
+import javax.measure.unit.SI;\r
 import javax.swing.JLabel;\r
 import javax.swing.JPanel;\r
+import javax.swing.JProgressBar;\r
+import javax.swing.SwingUtilities;\r
+\r
+import org.jscience.physics.amount.Amount;\r
 \r
 import com.billkuker.rocketry.motorsim.Burn;\r
 import com.billkuker.rocketry.motorsim.BurnSummary;\r
 import com.billkuker.rocketry.motorsim.RocketScience;\r
 \r
-public class SummaryPanel extends JPanel {\r
+public class SummaryPanel extends JPanel implements Burn.BurnProgressListener {\r
        private static final long serialVersionUID = 1L;\r
        private static final Color RED = new Color(196, 0, 0);\r
        private static final Color GREEN = new Color(0, 196, 0);\r
        private static final Color ORANGE = new Color(160, 96, 0);\r
+       private final Burn burn;\r
+       private final JProgressBar bar = new JProgressBar();\r
 \r
+       \r
        public SummaryPanel(Burn b) {\r
-               super(new GridLayout(2, 5));\r
+               setPreferredSize(new Dimension(100, 40));\r
+               setLayout(new GridLayout(1, 1));\r
+               bar.setStringPainted(true);\r
+               add(bar);\r
+               this.burn = b;\r
+               burn.addBurnProgressListener(this);\r
+       }\r
+\r
+       @Override\r
+       public void setProgress(float p) {\r
+               int pct = (int) (p * 100);\r
+               bar.setValue(pct);\r
+               Amount<Length> web = burn.getMotor().getGrain().webThickness();\r
+               Amount<Length> remaining = web.times(1.0 - p);\r
+               if ( remaining.isLessThan(Amount.valueOf(0, SI.MILLIMETER))){\r
+                       remaining = Amount.valueOf(0, remaining.getUnit());\r
+               }\r
+               bar.setString("Burn Progress: " + pct + "% (" + RocketScience.ammountToRoundedString(remaining) + " web thickness remaining)");\r
+       }\r
+\r
+       @Override\r
+       public void burnComplete() {\r
+               setBurnSummary(new BurnSummary(burn));\r
        }\r
 \r
-       public void setBurnSummary(BurnSummary bi) {\r
-               {\r
-                       this.add(new JLabel("Rating"));\r
-                       this.add(new JLabel("Total Impulse"));\r
-                       this.add(new JLabel("ISP"));\r
-                       this.add(new JLabel("Max Thrust"));\r
-                       this.add(new JLabel("Average Thust"));\r
-                       this.add(new JLabel("Max Pressure"));\r
+       private void setBurnSummary(final BurnSummary bi) {\r
+\r
+               removeAll();\r
+               setLayout(new GridLayout(2, 5));\r
+               SwingUtilities.invokeLater(new Thread() {\r
+                       public void run() {\r
+                               SummaryPanel.this.add(new JLabel("Rating"));\r
+                               SummaryPanel.this.add(new JLabel("Total Impulse"));\r
+                               SummaryPanel.this.add(new JLabel("ISP"));\r
+                               SummaryPanel.this.add(new JLabel("Max Thrust"));\r
+                               SummaryPanel.this.add(new JLabel("Average Thust"));\r
+                               SummaryPanel.this.add(new JLabel("Max Pressure"));\r
 \r
-                       this.add(new JLabel("Safty Factor"));\r
+                               SummaryPanel.this.add(new JLabel("Safty Factor"));\r
 \r
-                       this.add(new JLabel(bi.getRating()));\r
-                       this.add(new JLabel(RocketScience.ammountToRoundedString(bi\r
-                                       .totalImpulse())));\r
-                       this.add(new JLabel(RocketScience.ammountToRoundedString(bi\r
-                                       .specificImpulse())));\r
-                       this.add(new JLabel(RocketScience.ammountToRoundedString(bi\r
-                                       .maxThrust())));\r
-                       this.add(new JLabel(RocketScience.ammountToRoundedString(bi\r
-                                       .averageThrust())));\r
-                       this.add(new JLabel(RocketScience.ammountToRoundedString(bi\r
-                                       .maxPressure())));\r
+                               SummaryPanel.this.add(new JLabel(bi.getRating()));\r
+                               SummaryPanel.this.add(new JLabel(RocketScience\r
+                                               .ammountToRoundedString(bi.totalImpulse())));\r
+                               SummaryPanel.this.add(new JLabel(RocketScience\r
+                                               .ammountToRoundedString(bi.specificImpulse())));\r
+                               SummaryPanel.this.add(new JLabel(RocketScience\r
+                                               .ammountToRoundedString(bi.maxThrust())));\r
+                               SummaryPanel.this.add(new JLabel(RocketScience\r
+                                               .ammountToRoundedString(bi.averageThrust())));\r
+                               SummaryPanel.this.add(new JLabel(RocketScience\r
+                                               .ammountToRoundedString(bi.maxPressure())));\r
 \r
-                       Color saftyColor;\r
-                       if (bi.getSaftyFactor() == null) {\r
+                               Color saftyColor;\r
+                               if (bi.getSaftyFactor() == null) {\r
 \r
-                               saftyColor = Color.BLACK;\r
-                               this.add(new JLabel("NA"));\r
-                       } else {\r
-                               double d = bi.getSaftyFactor();\r
-                               if (d >= 1.5) {\r
-                                       saftyColor = GREEN;\r
-                               } else if (d > 1) {\r
-                                       saftyColor = ORANGE;\r
+                                       saftyColor = Color.BLACK;\r
+                                       SummaryPanel.this.add(new JLabel("NA"));\r
                                } else {\r
-                                       saftyColor = RED;\r
+                                       double d = bi.getSaftyFactor();\r
+                                       if (d >= 1.5) {\r
+                                               saftyColor = GREEN;\r
+                                       } else if (d > 1) {\r
+                                               saftyColor = ORANGE;\r
+                                       } else {\r
+                                               saftyColor = RED;\r
+                                       }\r
+                                       JLabel l = new JLabel(new DecimalFormat("##########.#")\r
+                                                       .format(bi.getSaftyFactor()));\r
+                                       l.setOpaque(true);\r
+                                       l.setBackground(saftyColor);\r
+                                       l.setForeground(Color.WHITE);\r
+                                       SummaryPanel.this.add(l);\r
                                }\r
-                               JLabel l = new JLabel(\r
-                                               new DecimalFormat("##########.#").format(bi\r
-                                                               .getSaftyFactor()));\r
-                               l.setOpaque(true);\r
-                               l.setBackground(saftyColor);\r
-                               l.setForeground(Color.WHITE);\r
-                               this.add(l);\r
+                               revalidate();\r
                        }\r
-\r
-               }\r
+               });\r
        }\r
+\r
 }\r
index d85780d8d76f07144aa93b602e2810e1fe5c3d73..4954ebe1ad3323660b66c4651b15fc4ca6867c1b 100644 (file)
@@ -63,14 +63,18 @@ import com.billkuker.rocketry.motorsim.visual.BurnPanel;
 import com.billkuker.rocketry.motorsim.visual.Editor;\r
 import com.billkuker.rocketry.motorsim.visual.GrainPanel;\r
 import com.billkuker.rocketry.motorsim.visual.HardwarePanel;\r
+import com.billkuker.rocketry.motorsim.visual.SummaryPanel;\r
 \r
-public class MotorEditor extends JTabbedPane implements PropertyChangeListener {\r
+public class MotorEditor extends JPanel implements PropertyChangeListener {\r
        private static final long serialVersionUID = 1L;\r
        private static Logger log = Logger.getLogger(MotorEditor.class);\r
        Motor motor;\r
        GrainEditor grainEditor;\r
        BurnTab bt;\r
        Burn burn;\r
+       SummaryPanel sp;\r
+       \r
+       JTabbedPane tabs;\r
 \r
        private Vector<BurnWatcher> burnWatchers = new Vector<BurnWatcher>();\r
        private DefaultComboBoxModel availableFuels = new DefaultComboBoxModel();\r
@@ -151,10 +155,6 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
                        currentThread = new Thread() {\r
                                public void run() {\r
                                        final Thread me = this;\r
-                                       final JProgressBar bar = new JProgressBar(0, 100);\r
-                                       add(bar, BorderLayout.NORTH);\r
-                                       final JLabel progress = new JLabel();\r
-                                       add(progress, BorderLayout.CENTER);\r
                                        try {\r
                                                final Burn b = new Burn(motor);\r
                                                b.addBurnProgressListener(\r
@@ -163,37 +163,30 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
                                                                        public void burnComplete(){};\r
                                                                        @Override\r
                                                                        public void setProgress(float f) {\r
-                                                                               int pct = (int)(f*100);\r
-                                                                               bar.setValue(pct);\r
-                                                                               Amount<Length> web = motor.getGrain().webThickness();\r
-                                                                               Amount<Length> remaining = web.times(1.0 - f);\r
-                                                                               \r
-                                                                               progress.setText("Progress: " + pct + "% (" + RocketScience.ammountToRoundedString(remaining) + " web thickness remaining)");\r
                                                                                if ( currentThread != me ){\r
                                                                                        throw new BurnCanceled();\r
                                                                                }\r
                                                                        }\r
                                                                });\r
+                                               if ( sp != null )\r
+                                                       MotorEditor.this.remove(sp);\r
+                                               MotorEditor.this.add(sp = new SummaryPanel(b), BorderLayout.NORTH);\r
+                                               revalidate();\r
                                                b.burn();\r
 \r
                                                final BurnPanel bp = new BurnPanel(b);\r
                                                SwingUtilities.invokeLater(new Thread() {\r
                                                        public void run() {\r
-                                                               remove(bar);\r
-                                                               remove(progress);\r
                                                                add(bp, BorderLayout.CENTER);\r
-\r
                                                                for (BurnWatcher bw : burnWatchers)\r
                                                                        bw.replace(burn, b);\r
                                                                burn = b;\r
-\r
                                                                revalidate();\r
                                                        }\r
                                                });\r
                                        } catch (BurnCanceled c){\r
                                                log.info("Burn Canceled!");\r
                                        } catch (Exception e) {\r
-                                               remove(bar);\r
                                                JTextArea t = new JTextArea(e.getMessage());\r
                                                t.setEditable(false);\r
                                                add(t);\r
@@ -359,7 +352,11 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
 \r
 \r
        public MotorEditor(Motor m, Collection<Fuel> fuels) {\r
-               super(JTabbedPane.BOTTOM);\r
+               \r
+               setLayout( new BorderLayout());\r
+               tabs = new JTabbedPane(JTabbedPane.BOTTOM);\r
+               add(tabs, BorderLayout.CENTER);\r
+\r
                for ( Fuel f : fuels )\r
                        addFuel(f);\r
                setMotor(m);\r
@@ -377,11 +374,11 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
                motor.addPropertyChangeListener(this);\r
                if (grainEditor != null)\r
                        remove(grainEditor);\r
-               while (getTabCount() > 1)\r
-                       removeTabAt(1);\r
-               add(new CaseEditor(motor.getNozzle(), motor.getChamber()), CASING_TAB);\r
-               add(new GrainEditor(motor.getGrain()), GRAIN_TAB);\r
-               add(bt = new BurnTab(), BURN_TAB);\r
+               while (tabs.getTabCount() > 1)\r
+                       tabs.removeTabAt(1);\r
+               tabs.add(new CaseEditor(motor.getNozzle(), motor.getChamber()), CASING_TAB);\r
+               tabs.add(new GrainEditor(motor.getGrain()), GRAIN_TAB);\r
+               tabs.add(bt = new BurnTab(), BURN_TAB);\r
        }\r
 \r
        public static Motor defaultMotor() {\r
@@ -421,9 +418,9 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener {
 \r
        public void focusOnObject(Object o) {\r
                if (o instanceof Grain)\r
-                       setSelectedIndex(GRAIN_TAB);\r
+                       tabs.setSelectedIndex(GRAIN_TAB);\r
                if (o instanceof Chamber || o instanceof Nozzle)\r
-                       setSelectedIndex(CASING_TAB);\r
+                       tabs.setSelectedIndex(CASING_TAB);\r
        }\r
 \r
        public void addBurnWatcher(BurnWatcher bw) {\r