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
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
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
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
\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
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
\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