aa0e972cbe1333f785dc849b4a767276b920c79c
[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(final float p) {\r
41                 SwingUtilities.invokeLater(new Thread() {\r
42                         public void run() {\r
43                                 int pct = (int) (p * 100);\r
44                                 bar.setValue(pct);\r
45                                 Amount<Length> web = burn.getMotor().getGrain().webThickness();\r
46                                 Amount<Length> remaining = web.times(1.0 - p);\r
47                                 if (remaining.isLessThan(Amount.valueOf(0, SI.MILLIMETER))) {\r
48                                         remaining = Amount.valueOf(0, remaining.getUnit());\r
49                                 }\r
50                                 bar.setString("Burn Progress: " + pct + "% ("\r
51                                                 + RocketScience.ammountToRoundedString(remaining)\r
52                                                 + " web thickness remaining)");\r
53                         }\r
54                 });\r
55         }\r
56 \r
57         @Override\r
58         public void burnComplete() {\r
59                 setBurnSummary(bs = new BurnSummary(burn));\r
60                 RocketScience.addUnitPreferenceListener(this);\r
61         }\r
62         \r
63 \r
64         @Override\r
65         public void preferredUnitsChanged() {\r
66                 if ( bs != null )\r
67                         setBurnSummary(bs);\r
68         }\r
69 \r
70         private void setBurnSummary(final BurnSummary bi) {\r
71                 SwingUtilities.invokeLater(new Thread() {\r
72                         public void run() {\r
73                                 remove(bar);\r
74                                 setLayout(new GridLayout(2, 5));\r
75                                 add(new JLabel("Rating"));\r
76                                 add(new JLabel("Total Impulse"));\r
77                                 add(new JLabel("ISP"));\r
78                                 add(new JLabel("Max Thrust"));\r
79                                 add(new JLabel("Average Thust"));\r
80                                 add(new JLabel("Max Pressure"));\r
81                                 add(new JLabel("Fuel Mass"));\r
82                                 add(new JLabel("Volume Loading"));\r
83                                 add(new JLabel("Safty Factor"));\r
84 \r
85                                 add(new JLabel(bi.getRating()));\r
86                                 add(new JLabel(RocketScience.ammountToRoundedString(bi\r
87                                                 .totalImpulse())));\r
88                                 add(new JLabel(RocketScience.ammountToRoundedString(bi\r
89                                                 .specificImpulse())));\r
90                                 add(new JLabel(RocketScience.ammountToRoundedString(bi\r
91                                                 .maxThrust())));\r
92                                 add(new JLabel(RocketScience.ammountToRoundedString(bi\r
93                                                 .averageThrust())));\r
94                                 add(new JLabel(RocketScience.ammountToRoundedString(bi\r
95                                                 .maxPressure())));\r
96                                 add(new JLabel(RocketScience.ammountToRoundedString(bi\r
97                                                 .getPropellantMass())));\r
98                                 add(new JLabel(\r
99                                                 Integer.toString((int) (bi.getVolumeLoading() * 100.0))\r
100                                                                 + "%"));\r
101 \r
102                                 Color saftyColor;\r
103                                 if (bi.getSaftyFactor() == null) {\r
104 \r
105                                         saftyColor = Color.BLACK;\r
106                                         add(new JLabel("NA"));\r
107                                 } else {\r
108                                         double d = bi.getSaftyFactor();\r
109                                         if (d >= 1.5) {\r
110                                                 saftyColor = Colors.GREEN;\r
111                                         } else if (d > 1) {\r
112                                                 saftyColor = Colors.ORANGE;\r
113                                         } else {\r
114                                                 saftyColor = Colors.RED;\r
115                                         }\r
116                                         JLabel l = new JLabel(new DecimalFormat("##########.##")\r
117                                                         .format(bi.getSaftyFactor()));\r
118                                         l.setOpaque(true);\r
119                                         l.setBackground(saftyColor);\r
120                                         l.setForeground(Color.WHITE);\r
121                                         add(l);\r
122                                 }\r
123                                 revalidate();\r
124                                 repaint();\r
125                         }\r
126                 });\r
127         }\r
128 \r
129 }\r