af9fb9157236f6672e89c626ab90b3846411f449
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / workbench / MultiMotorTable.java
1 package com.billkuker.rocketry.motorsim.visual.workbench;\r
2 \r
3 import java.util.Iterator;\r
4 import java.util.List;\r
5 import java.util.Vector;\r
6 \r
7 import javax.swing.JTable;\r
8 import javax.swing.table.AbstractTableModel;\r
9 \r
10 import com.billkuker.rocketry.motorsim.Burn;\r
11 import com.billkuker.rocketry.motorsim.BurnSummary;\r
12 import com.billkuker.rocketry.motorsim.Motor;\r
13 import com.billkuker.rocketry.motorsim.RocketScience;\r
14 \r
15 public class MultiMotorTable extends JTable implements BurnWatcher, RocketScience.UnitPreferenceListener {\r
16         private static final long serialVersionUID = 1L;\r
17 \r
18         private class Entry {\r
19                 Motor m;\r
20                 BurnSummary bs;\r
21         }\r
22 \r
23         private List<Entry> entries = new Vector<Entry>();\r
24 \r
25         private class TM extends AbstractTableModel {\r
26                 private static final long serialVersionUID = 1L;\r
27 \r
28                 @Override\r
29                 public String getColumnName(int col) {\r
30                         switch (col) {\r
31                         case 0:\r
32                                 return "Motor";\r
33                         case 1:\r
34                                 return "Fuel";\r
35                         case 2:\r
36                                 return "Rating";\r
37                         case 3:\r
38                                 return "Total Impulse";\r
39                         case 4:\r
40                                 return "ISP";\r
41                         case 5:\r
42                                 return "Max Thrust";\r
43                         case 6:\r
44                                 return "Average Thrust";\r
45                         case 7:\r
46                                 return "Max Pressure";\r
47                         case 8:\r
48                                 return "Volume Loading";\r
49                         case 9:\r
50                                 return "Fuel Mass";\r
51                         }\r
52                         return null;\r
53                 }\r
54                 \r
55                 @Override\r
56                 public int getColumnCount() {\r
57                         return 10;\r
58                 }\r
59 \r
60                 @Override\r
61                 public int getRowCount() {\r
62                         return entries.size();\r
63                 }\r
64 \r
65                 @Override\r
66                 public Object getValueAt(int rowIdx, int col) {\r
67                         if (rowIdx >= entries.size() || rowIdx < 0)\r
68                                 throw new IndexOutOfBoundsException("Row out of bounds");\r
69                         BurnSummary bs = entries.get(rowIdx).bs;\r
70                         Motor m = entries.get(rowIdx).m;\r
71                         switch (col) {\r
72                         case 0:\r
73                                 return m.getName();\r
74                         case 1:\r
75                                 return m.getFuel().getName();\r
76                         case 2:\r
77                                 return bs.getRating();\r
78                         case 3:\r
79                                 return RocketScience.ammountToRoundedString(bs.totalImpulse());\r
80                         case 4:\r
81                                 return RocketScience.ammountToRoundedString(bs.specificImpulse());\r
82                         case 5:\r
83                                 return RocketScience.ammountToRoundedString(bs.maxThrust());\r
84                         case 6:\r
85                                 return RocketScience.ammountToRoundedString(bs.averageThrust());\r
86                         case 7:\r
87                                 return RocketScience.ammountToRoundedString(bs.maxPressure());\r
88                         case 8:\r
89                                 return Integer.toString((int)(bs.getVolumeLoading()*100.0)) + "%";\r
90                         case 9:\r
91                                 return RocketScience.ammountToRoundedString(bs.getPropellantMass());\r
92                         }\r
93                         throw new IndexOutOfBoundsException("Col out of bounds");\r
94                 }\r
95 \r
96         }\r
97 \r
98         private TM tm = new TM();\r
99 \r
100         public MultiMotorTable() {\r
101                 setModel(tm);\r
102                 RocketScience.addUnitPreferenceListener(this);\r
103         }\r
104 \r
105         public void addBurn(Burn b) {\r
106                 Entry e = new Entry();\r
107                 e.m = b.getMotor();\r
108                 e.bs = new BurnSummary(b);\r
109                 entries.add(e);\r
110                 tm.fireTableDataChanged();\r
111         }\r
112 \r
113         public void removeBurn(Burn b) {\r
114                 Iterator<Entry> i = entries.iterator();\r
115                 while (i.hasNext()) {\r
116                         if (i.next().m == b.getMotor())\r
117                                 i.remove();\r
118                 }\r
119                 tm.fireTableDataChanged();\r
120         }\r
121 \r
122         @Override\r
123         public void replace(Burn oldBurn, Burn newBurn) {\r
124                 if (oldBurn != null)\r
125                         removeBurn(oldBurn);\r
126                 if (newBurn != null)\r
127                         addBurn(newBurn);\r
128         }\r
129 \r
130         @Override\r
131         public void preferredUnitsChanged() {\r
132                 tm.fireTableDataChanged();\r
133         }\r
134 }\r