import javax.swing.JFrame;\r
import javax.swing.JMenu;\r
import javax.swing.JMenuItem;\r
+import javax.swing.JScrollPane;\r
import javax.swing.JSeparator;\r
import java.awt.event.ActionListener;\r
\r
\r
MultiMotorThrustChart mbc = new MultiMotorThrustChart();\r
MultiMotorPressureChart mpc = new MultiMotorPressureChart();\r
+ MultiMotorTable mmt = new MultiMotorTable();\r
\r
public MotorsEditor(JFrame f) {\r
super(f, "Motor");\r
\r
+ addTab("All Motors", new JScrollPane(mmt));\r
addTab("All Thrust", mbc);\r
addTab("All Pressure", mpc);\r
\r
protected void objectAdded(Motor m, MotorEditor e){\r
e.addBurnWatcher(mbc);\r
e.addBurnWatcher(mpc);\r
+ e.addBurnWatcher(mmt);\r
}\r
\r
@Override\r
protected void objectRemoved(Motor m, MotorEditor e){\r
mbc.removeBurn(e.burn);\r
mpc.removeBurn(e.burn);\r
+ mmt.removeBurn(e.burn);\r
}\r
\r
@Override\r
--- /dev/null
+package com.billkuker.rocketry.motorsim.visual.workbench;\r
+\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Vector;\r
+\r
+import javax.swing.JTable;\r
+import javax.swing.table.AbstractTableModel;\r
+\r
+import com.billkuker.rocketry.motorsim.Burn;\r
+import com.billkuker.rocketry.motorsim.BurnSummary;\r
+import com.billkuker.rocketry.motorsim.Motor;\r
+import com.billkuker.rocketry.motorsim.RocketScience;\r
+\r
+public class MultiMotorTable extends JTable implements BurnWatcher, RocketScience.UnitPreferenceListener {\r
+\r
+ private class Entry {\r
+ Motor m;\r
+ BurnSummary bs;\r
+ }\r
+\r
+ private List<Entry> entries = new Vector<Entry>();\r
+\r
+ private class TM extends AbstractTableModel {\r
+ @Override\r
+ public String getColumnName(int col) {\r
+ switch (col) {\r
+ case 0:\r
+ return "Motor";\r
+ case 1:\r
+ return "Fuel";\r
+ case 2:\r
+ return "Rating";\r
+ case 3:\r
+ return "Total Impulse";\r
+ case 4:\r
+ return "ISP";\r
+ case 5:\r
+ return "Max Thrust";\r
+ case 6:\r
+ return "Average Thrust";\r
+ case 7:\r
+ return "Max Pressure";\r
+ case 8:\r
+ return "Fuel Mass";\r
+ }\r
+ return null;\r
+ }\r
+ \r
+ @Override\r
+ public int getColumnCount() {\r
+ return 9;\r
+ }\r
+\r
+ @Override\r
+ public int getRowCount() {\r
+ return entries.size();\r
+ }\r
+\r
+ @Override\r
+ public Object getValueAt(int rowIdx, int col) {\r
+ if (rowIdx >= entries.size() || rowIdx < 0)\r
+ throw new IndexOutOfBoundsException("Row out of bounds");\r
+ BurnSummary bs = entries.get(rowIdx).bs;\r
+ Motor m = entries.get(rowIdx).m;\r
+ switch (col) {\r
+ case 0:\r
+ return m.getName();\r
+ case 1:\r
+ return m.getFuel().getName();\r
+ case 2:\r
+ return bs.getRating();\r
+ case 3:\r
+ return RocketScience.ammountToRoundedString(bs.totalImpulse());\r
+ case 4:\r
+ return RocketScience.ammountToRoundedString(bs.specificImpulse());\r
+ case 5:\r
+ return RocketScience.ammountToRoundedString(bs.maxThrust());\r
+ case 6:\r
+ return RocketScience.ammountToRoundedString(bs.averageThrust());\r
+ case 7:\r
+ return RocketScience.ammountToRoundedString(bs.maxPressure());\r
+ case 8:\r
+ return RocketScience.ammountToRoundedString(bs.getPropellantMass());\r
+ }\r
+ throw new IndexOutOfBoundsException("Col out of bounds");\r
+ }\r
+\r
+ }\r
+\r
+ private TM tm = new TM();\r
+\r
+ public MultiMotorTable() {\r
+ setModel(tm);\r
+ RocketScience.addUnitPreferenceListener(this);\r
+ }\r
+\r
+ public void addBurn(Burn b) {\r
+ Entry e = new Entry();\r
+ e.m = b.getMotor();\r
+ e.bs = new BurnSummary(b);\r
+ entries.add(e);\r
+ tm.fireTableDataChanged();\r
+ }\r
+\r
+ public void removeBurn(Burn b) {\r
+ Iterator<Entry> i = entries.iterator();\r
+ while (i.hasNext()) {\r
+ if (i.next().m == b.getMotor())\r
+ i.remove();\r
+ }\r
+ tm.fireTableDataChanged();\r
+ }\r
+\r
+ @Override\r
+ public void replace(Burn oldBurn, Burn newBurn) {\r
+ if (oldBurn != null)\r
+ removeBurn(oldBurn);\r
+ if (newBurn != null)\r
+ addBurn(newBurn);\r
+ }\r
+\r
+ @Override\r
+ public void preferredUnitsChanged() {\r
+ tm.fireTableDataChanged();\r
+ }\r
+}\r