package com.billkuker.rocketry.motorsim.visual.openRocket;\r
\r
+import java.awt.BorderLayout;\r
+import java.awt.Color;\r
+import java.awt.Component;\r
import java.awt.event.MouseAdapter;\r
import java.awt.event.MouseEvent;\r
import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.IOException;\r
+import java.util.HashSet;\r
import java.util.Iterator;\r
import java.util.List;\r
+import java.util.Set;\r
import java.util.Vector;\r
\r
import javax.measure.unit.SI;\r
+import javax.swing.JPanel;\r
import javax.swing.JScrollPane;\r
import javax.swing.JTable;\r
import javax.swing.SwingUtilities;\r
import javax.swing.table.AbstractTableModel;\r
+import javax.swing.table.DefaultTableCellRenderer;\r
\r
+import net.sf.openrocket.aerodynamics.Warning;\r
import net.sf.openrocket.document.OpenRocketDocument;\r
import net.sf.openrocket.document.Simulation;\r
+import net.sf.openrocket.file.DatabaseMotorFinder;\r
import net.sf.openrocket.file.RocketLoadException;\r
-import net.sf.openrocket.file.openrocket.OpenRocketLoader;\r
+import net.sf.openrocket.file.openrocket.importt.OpenRocketLoader;\r
import net.sf.openrocket.gui.plot.PlotConfiguration;\r
import net.sf.openrocket.gui.plot.SimulationPlotDialog;\r
import net.sf.openrocket.gui.util.SwingPreferences;\r
import org.jscience.physics.amount.Amount;\r
\r
import com.billkuker.rocketry.motorsim.Burn;\r
+import com.billkuker.rocketry.motorsim.Colors;\r
import com.billkuker.rocketry.motorsim.Motor;\r
import com.billkuker.rocketry.motorsim.RocketScience;\r
import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference;\r
import com.billkuker.rocketry.motorsim.visual.workbench.BurnWatcher;\r
\r
-public class RocketSimTable extends JScrollPane implements BurnWatcher,\r
+public class RocketSimTable extends JPanel implements BurnWatcher,\r
RocketScience.UnitPreferenceListener {\r
static final long serialVersionUID = 1L;\r
\r
static {\r
Application.setBaseTranslator(new ResourceBundleTranslator(\r
"l10n.messages"));\r
- Application.setMotorSetDatabase(new OneMotorDatabase());\r
+ //Application.setMotorSetDatabase(new OneMotorDatabase());\r
Application.setPreferences(new SwingPreferences());\r
\r
}\r
Burn b;\r
}\r
\r
- List<Entry> entries = new Vector<Entry>();\r
-\r
class TM extends AbstractTableModel {\r
private static final long serialVersionUID = 1L;\r
\r
private TM tm = new TM();\r
private JTable table = new JTable(tm);\r
private OpenRocketDocument doc;\r
+ List<Entry> entries = new Vector<Entry>();\r
+ Set<Burn> burns = new HashSet<Burn>();\r
\r
public RocketSimTable() {\r
- setViewportView(table);\r
+ setLayout(new BorderLayout());\r
+ JScrollPane scroll = new JScrollPane();\r
+ scroll.setViewportView(table);\r
+ add(scroll, BorderLayout.CENTER);\r
+\r
+ table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ public Component getTableCellRendererComponent(JTable table,\r
+ Object value, boolean isSelected, boolean hasFocus,\r
+ int row, int column) {\r
+ Component c = super.getTableCellRendererComponent(table, value,\r
+ isSelected, hasFocus, row, column);\r
+ Entry e = entries.get(row);\r
+ if (e.ready && e.s.getSimulatedWarnings().size() > 0) {\r
+ c.setBackground(Colors.RED);\r
+ c.setForeground(Color.WHITE);\r
+ StringBuilder sb = new StringBuilder();\r
+ sb.append("<html>");\r
+ for (Warning w : e.s.getSimulatedWarnings()) {\r
+ sb.append(w.toString());\r
+ sb.append("<br>");\r
+ }\r
+ sb.append("<html>");\r
+ setToolTipText(sb.toString());\r
+ } else {\r
+ c.setBackground(table.getBackground());\r
+ c.setForeground(table.getForeground());\r
+ }\r
+ return c;\r
+ }\r
+ });\r
+\r
RocketScience.addUnitPreferenceListener(this);\r
table.addMouseListener(new MouseAdapter() {\r
public void mouseClicked(MouseEvent e) {\r
preferredUnitsChanged();\r
}\r
\r
- public void openRocket(File f) throws RocketLoadException {\r
- this.doc = new OpenRocketLoader().load(f);\r
- }\r
+ public void openRocket(File f) throws RocketLoadException, IOException {\r
+ this.doc = new OpenRocketLoader().loadFromStream(new FileInputStream(f), new DatabaseMotorFinder());\r
+ // JPanel rocketInfo = new JPanel();\r
+ // JLabel name = new JLabel("File: " + f.getAbsolutePath());\r
+ // rocketInfo.add(name);\r
+ // add(rocketInfo, BorderLayout.NORTH);\r
\r
- private Entry toEntry(Burn b) {\r
- final Entry e = new Entry(b.getMotor(), doc.getSimulation(0).copy(), b);\r
- OneMotorDatabase.setBurn(b);\r
-\r
- e.s.getConfiguration().getMotorConfigurationID();\r
- Iterator<RocketComponent> iterator = doc.getRocket().iterator();\r
- while (iterator.hasNext()) {\r
- RocketComponent c = iterator.next();\r
- if (c instanceof MotorMount) {\r
- ((MotorMount) c).setMotorDelay(e.s.getConfiguration()\r
- .getMotorConfigurationID(), b.getMotor()\r
- .getEjectionDelay().doubleValue(SI.SECOND));\r
- }\r
+ RocketPanel p = new RocketPanel(this.doc);\r
+ add(p, BorderLayout.NORTH);\r
+\r
+ entries = new Vector<Entry>();\r
+ for (Burn b : burns) {\r
+ entries.add(toEntry(b));\r
}\r
+ tm.fireTableDataChanged();\r
+ revalidate();\r
+ }\r
\r
+ private Entry toEntry(final Burn b) {\r
+ final Entry e = new Entry(b.getMotor(), doc.getSimulation(0).copy(), b);\r
tm.fireTableDataChanged();\r
new Thread() {\r
@Override\r
public void run() {\r
try {\r
- e.s.simulate();\r
- e.ready = true;\r
- tm.fireTableDataChanged();\r
+ synchronized (OneMotorDatabase.lock) {\r
+\r
+ OneMotorDatabase.setBurn(b);\r
+\r
+ e.s.getConfiguration().getMotorConfigurationID();\r
+ Iterator<RocketComponent> iterator = doc.getRocket()\r
+ .iterator();\r
+ while (iterator.hasNext()) {\r
+ RocketComponent c = iterator.next();\r
+ if (c instanceof MotorMount) {\r
+ ((MotorMount) c).setMotorDelay(e.s\r
+ .getConfiguration()\r
+ .getMotorConfigurationID(), b\r
+ .getMotor().getEjectionDelay()\r
+ .doubleValue(SI.SECOND));\r
+ }\r
+ }\r
+\r
+ e.s.simulate();\r
+ e.ready = true;\r
+ tm.fireTableDataChanged();\r
+ }\r
} catch (SimulationException e1) {\r
e1.printStackTrace();\r
}\r
\r
@Override\r
public void replace(Burn oldBurn, Burn newBurn) {\r
+ burns.add(newBurn);\r
+ burns.remove(oldBurn);\r
+\r
if (doc == null) {\r
return; // TODO, deal with changing rockets\r
}\r
public void preferredUnitsChanged() {\r
tm.fireTableDataChanged();\r
if (UnitPreference.getUnitPreference() == UnitPreference.NONSI) {\r
- System.err.println("NONSI");\r
UnitGroup.setDefaultImperialUnits();\r
} else {\r
- System.err.println("SI");\r
UnitGroup.setDefaultMetricUnits();\r
}\r
}\r