Use shared colors
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / SummaryPanel.java
1 package com.billkuker.rocketry.motorsim.visual;\r
2 \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
7 \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
14 \r
15 import org.jscience.physics.amount.Amount;\r
16 \r
17 import com.billkuker.rocketry.motorsim.Burn;\r
18 import com.billkuker.rocketry.motorsim.BurnSummary;\r
19 import com.billkuker.rocketry.motorsim.Colors;\r
20 import com.billkuker.rocketry.motorsim.RocketScience;\r
21 \r
22 public class SummaryPanel extends JPanel implements Burn.BurnProgressListener, RocketScience.UnitPreferenceListener {\r
23         private static final long serialVersionUID = 1L;\r
24 \r
25         private final Burn burn;\r
26         private final JProgressBar bar = new JProgressBar();\r
27         private BurnSummary bs;\r
28 \r
29         \r
30         public SummaryPanel(Burn b) {\r
31                 setPreferredSize(new Dimension(100, 40));\r
32                 setLayout(new GridLayout(1, 1));\r
33                 bar.setStringPainted(true);\r
34                 add(bar);\r
35                 this.burn = b;\r
36                 burn.addBurnProgressListener(this);\r
37         }\r
38 \r
39         @Override\r
40         public void setProgress(float p) {\r
41                 int pct = (int) (p * 100);\r
42                 bar.setValue(pct);\r
43                 Amount<Length> web = burn.getMotor().getGrain().webThickness();\r
44                 Amount<Length> remaining = web.times(1.0 - p);\r
45                 if ( remaining.isLessThan(Amount.valueOf(0, SI.MILLIMETER))){\r
46                         remaining = Amount.valueOf(0, remaining.getUnit());\r
47                 }\r
48                 bar.setString("Burn Progress: " + pct + "% (" + RocketScience.ammountToRoundedString(remaining) + " web thickness remaining)");\r
49         }\r
50 \r
51         @Override\r
52         public void burnComplete() {\r
53                 setBurnSummary(bs = new BurnSummary(burn));\r
54                 RocketScience.addUnitPreferenceListener(this);\r
55         }\r
56         \r
57 \r
58         @Override\r
59         public void preferredUnitsChanged() {\r
60                 if ( bs != null )\r
61                         setBurnSummary(bs);\r
62         }\r
63 \r
64         private void setBurnSummary(final BurnSummary bi) {\r
65                 SwingUtilities.invokeLater(new Thread() {\r
66                         public void run() {\r
67                                 removeAll();\r
68                                 setLayout(new GridLayout(2, 5));\r
69                                 SummaryPanel.this.add(new JLabel("Rating"));\r
70                                 SummaryPanel.this.add(new JLabel("Total Impulse"));\r
71                                 SummaryPanel.this.add(new JLabel("ISP"));\r
72                                 SummaryPanel.this.add(new JLabel("Max Thrust"));\r
73                                 SummaryPanel.this.add(new JLabel("Average Thust"));\r
74                                 SummaryPanel.this.add(new JLabel("Max Pressure"));\r
75                                 SummaryPanel.this.add(new JLabel("Fuel Mass"));\r
76                                 SummaryPanel.this.add(new JLabel("Volume Loading"));\r
77                                 SummaryPanel.this.add(new JLabel("Safty Factor"));\r
78 \r
79                                 SummaryPanel.this.add(new JLabel(bi.getRating()));\r
80                                 SummaryPanel.this.add(new JLabel(RocketScience\r
81                                                 .ammountToRoundedString(bi.totalImpulse())));\r
82                                 SummaryPanel.this.add(new JLabel(RocketScience\r
83                                                 .ammountToRoundedString(bi.specificImpulse())));\r
84                                 SummaryPanel.this.add(new JLabel(RocketScience\r
85                                                 .ammountToRoundedString(bi.maxThrust())));\r
86                                 SummaryPanel.this.add(new JLabel(RocketScience\r
87                                                 .ammountToRoundedString(bi.averageThrust())));\r
88                                 SummaryPanel.this.add(new JLabel(RocketScience\r
89                                                 .ammountToRoundedString(bi.maxPressure())));\r
90                                 SummaryPanel.this.add(new JLabel(RocketScience\r
91                                                 .ammountToRoundedString(bi.getPropellantMass())));\r
92                                 SummaryPanel.this.add(new JLabel(Integer.toString((int)(bi.getVolumeLoading()*100.0)) + "%"));\r
93                                 \r
94                                 Color saftyColor;\r
95                                 if (bi.getSaftyFactor() == null) {\r
96 \r
97                                         saftyColor = Color.BLACK;\r
98                                         SummaryPanel.this.add(new JLabel("NA"));\r
99                                 } else {\r
100                                         double d = bi.getSaftyFactor();\r
101                                         if (d >= 1.5) {\r
102                                                 saftyColor = Colors.GREEN;\r
103                                         } else if (d > 1) {\r
104                                                 saftyColor = Colors.ORANGE;\r
105                                         } else {\r
106                                                 saftyColor = Colors.RED;\r
107                                         }\r
108                                         JLabel l = new JLabel(new DecimalFormat("##########.##")\r
109                                                         .format(bi.getSaftyFactor()));\r
110                                         l.setOpaque(true);\r
111                                         l.setBackground(saftyColor);\r
112                                         l.setForeground(Color.WHITE);\r
113                                         SummaryPanel.this.add(l);\r
114                                 }\r
115                                 revalidate();\r
116                         }\r
117                 });\r
118         }\r
119 \r
120 \r
121 }\r