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