Updates to keep up with rocksim. MotorDB Broken
[sw/motorsim] / gpl / com / billkuker / rocketry / motorsim / visual / openRocket / RocketSimTable.java
index b6155f3864d450c61d45f23027c48d9cd4e3fc83..b8cc0a67caed077f5befff8e8462a2201d4a43bc 100644 (file)
@@ -1,22 +1,33 @@
 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
@@ -30,19 +41,20 @@ import net.sf.openrocket.unit.UnitGroup;
 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
@@ -60,8 +72,6 @@ public class RocketSimTable extends JScrollPane implements BurnWatcher,
                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
@@ -136,9 +146,43 @@ public class RocketSimTable extends JScrollPane implements BurnWatcher,
        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
@@ -154,33 +198,53 @@ public class RocketSimTable extends JScrollPane implements BurnWatcher,
                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
@@ -193,6 +257,9 @@ public class RocketSimTable extends JScrollPane implements BurnWatcher,
 \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
@@ -218,10 +285,8 @@ public class RocketSimTable extends JScrollPane implements BurnWatcher,
        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