1 package com.billkuker.rocketry.motorsim.visual;
\r
3 import java.awt.Color;
\r
4 import java.awt.Dimension;
\r
5 import java.awt.GridLayout;
\r
6 import java.text.DecimalFormat;
\r
8 import javax.measure.quantity.Length;
\r
9 import javax.measure.unit.SI;
\r
10 import javax.swing.JLabel;
\r
11 import javax.swing.JPanel;
\r
12 import javax.swing.JProgressBar;
\r
13 import javax.swing.SwingUtilities;
\r
15 import org.jscience.physics.amount.Amount;
\r
17 import com.billkuker.rocketry.motorsim.Burn;
\r
18 import com.billkuker.rocketry.motorsim.BurnSummary;
\r
19 import com.billkuker.rocketry.motorsim.RocketScience;
\r
21 public class SummaryPanel extends JPanel implements Burn.BurnProgressListener, RocketScience.UnitPreferenceListener {
\r
22 private static final long serialVersionUID = 1L;
\r
23 private static final Color RED = new Color(196, 0, 0);
\r
24 private static final Color GREEN = new Color(0, 196, 0);
\r
25 private static final Color ORANGE = new Color(160, 96, 0);
\r
26 private final Burn burn;
\r
27 private final JProgressBar bar = new JProgressBar();
\r
28 private BurnSummary bs;
\r
31 public SummaryPanel(Burn b) {
\r
32 setPreferredSize(new Dimension(100, 40));
\r
33 setLayout(new GridLayout(1, 1));
\r
34 bar.setStringPainted(true);
\r
37 burn.addBurnProgressListener(this);
\r
41 public void setProgress(float p) {
\r
42 int pct = (int) (p * 100);
\r
44 Amount<Length> web = burn.getMotor().getGrain().webThickness();
\r
45 Amount<Length> remaining = web.times(1.0 - p);
\r
46 if ( remaining.isLessThan(Amount.valueOf(0, SI.MILLIMETER))){
\r
47 remaining = Amount.valueOf(0, remaining.getUnit());
\r
49 bar.setString("Burn Progress: " + pct + "% (" + RocketScience.ammountToRoundedString(remaining) + " web thickness remaining)");
\r
53 public void burnComplete() {
\r
54 setBurnSummary(bs = new BurnSummary(burn));
\r
55 RocketScience.addUnitPreferenceListener(this);
\r
60 public void preferredUnitsChanged() {
\r
65 private void setBurnSummary(final BurnSummary bi) {
\r
66 SwingUtilities.invokeLater(new Thread() {
\r
69 setLayout(new GridLayout(2, 5));
\r
70 SummaryPanel.this.add(new JLabel("Rating"));
\r
71 SummaryPanel.this.add(new JLabel("Total Impulse"));
\r
72 SummaryPanel.this.add(new JLabel("ISP"));
\r
73 SummaryPanel.this.add(new JLabel("Max Thrust"));
\r
74 SummaryPanel.this.add(new JLabel("Average Thust"));
\r
75 SummaryPanel.this.add(new JLabel("Max Pressure"));
\r
76 SummaryPanel.this.add(new JLabel("Fuel Mass"));
\r
77 SummaryPanel.this.add(new JLabel("Volume Loading"));
\r
78 SummaryPanel.this.add(new JLabel("Safty Factor"));
\r
80 SummaryPanel.this.add(new JLabel(bi.getRating()));
\r
81 SummaryPanel.this.add(new JLabel(RocketScience
\r
82 .ammountToRoundedString(bi.totalImpulse())));
\r
83 SummaryPanel.this.add(new JLabel(RocketScience
\r
84 .ammountToRoundedString(bi.specificImpulse())));
\r
85 SummaryPanel.this.add(new JLabel(RocketScience
\r
86 .ammountToRoundedString(bi.maxThrust())));
\r
87 SummaryPanel.this.add(new JLabel(RocketScience
\r
88 .ammountToRoundedString(bi.averageThrust())));
\r
89 SummaryPanel.this.add(new JLabel(RocketScience
\r
90 .ammountToRoundedString(bi.maxPressure())));
\r
91 SummaryPanel.this.add(new JLabel(RocketScience
\r
92 .ammountToRoundedString(bi.getPropellantMass())));
\r
93 SummaryPanel.this.add(new JLabel(Integer.toString((int)(bi.getVolumeLoading()*100.0)) + "%"));
\r
96 if (bi.getSaftyFactor() == null) {
\r
98 saftyColor = Color.BLACK;
\r
99 SummaryPanel.this.add(new JLabel("NA"));
\r
101 double d = bi.getSaftyFactor();
\r
103 saftyColor = GREEN;
\r
104 } else if (d > 1) {
\r
105 saftyColor = ORANGE;
\r
109 JLabel l = new JLabel(new DecimalFormat("##########.##")
\r
110 .format(bi.getSaftyFactor()));
\r
112 l.setBackground(saftyColor);
\r
113 l.setForeground(Color.WHITE);
\r
114 SummaryPanel.this.add(l);
\r