1 package com.billkuker.rocketry.motorsim.visual.openRocket;
\r
3 import java.awt.BorderLayout;
\r
4 import java.awt.Color;
\r
5 import java.awt.Component;
\r
6 import java.awt.event.MouseAdapter;
\r
7 import java.awt.event.MouseEvent;
\r
9 import java.util.Iterator;
\r
10 import java.util.List;
\r
11 import java.util.Vector;
\r
13 import javax.measure.unit.SI;
\r
14 import javax.swing.JLabel;
\r
15 import javax.swing.JPanel;
\r
16 import javax.swing.JScrollPane;
\r
17 import javax.swing.JTable;
\r
18 import javax.swing.SwingUtilities;
\r
19 import javax.swing.table.AbstractTableModel;
\r
20 import javax.swing.table.DefaultTableCellRenderer;
\r
22 import net.sf.openrocket.aerodynamics.Warning;
\r
23 import net.sf.openrocket.document.OpenRocketDocument;
\r
24 import net.sf.openrocket.document.Simulation;
\r
25 import net.sf.openrocket.file.RocketLoadException;
\r
26 import net.sf.openrocket.file.openrocket.OpenRocketLoader;
\r
27 import net.sf.openrocket.gui.plot.PlotConfiguration;
\r
28 import net.sf.openrocket.gui.plot.SimulationPlotDialog;
\r
29 import net.sf.openrocket.gui.util.SwingPreferences;
\r
30 import net.sf.openrocket.l10n.ResourceBundleTranslator;
\r
31 import net.sf.openrocket.rocketcomponent.MotorMount;
\r
32 import net.sf.openrocket.rocketcomponent.RocketComponent;
\r
33 import net.sf.openrocket.simulation.exception.SimulationException;
\r
34 import net.sf.openrocket.startup.Application;
\r
35 import net.sf.openrocket.unit.UnitGroup;
\r
37 import org.jscience.physics.amount.Amount;
\r
39 import com.billkuker.rocketry.motorsim.Burn;
\r
40 import com.billkuker.rocketry.motorsim.Colors;
\r
41 import com.billkuker.rocketry.motorsim.Motor;
\r
42 import com.billkuker.rocketry.motorsim.RocketScience;
\r
43 import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference;
\r
44 import com.billkuker.rocketry.motorsim.visual.workbench.BurnWatcher;
\r
46 public class RocketSimTable extends JPanel implements BurnWatcher,
\r
47 RocketScience.UnitPreferenceListener {
\r
48 static final long serialVersionUID = 1L;
\r
51 Application.setBaseTranslator(new ResourceBundleTranslator(
\r
53 Application.setMotorSetDatabase(new OneMotorDatabase());
\r
54 Application.setPreferences(new SwingPreferences());
\r
59 Entry(Motor m, Simulation s, Burn b) {
\r
65 boolean ready = false;
\r
71 List<Entry> entries = new Vector<Entry>();
\r
73 class TM extends AbstractTableModel {
\r
74 private static final long serialVersionUID = 1L;
\r
77 public String getColumnName(int col) {
\r
98 public int getColumnCount() {
\r
103 public int getRowCount() {
\r
104 return entries.size();
\r
108 public Object getValueAt(int row, int col) {
\r
109 Entry e = entries.get(row);
\r
112 if (e.ready == false)
\r
116 return e.m.getName();
\r
118 return RocketScience.ammountToRoundedString(Amount.valueOf(e.s
\r
119 .getSimulatedData().getMaxAltitude(), SI.METER));
\r
121 return RocketScience.ammountToRoundedString(Amount.valueOf(e.s
\r
122 .getSimulatedData().getMaxVelocity(),
\r
123 SI.METERS_PER_SECOND));
\r
125 return RocketScience.ammountToRoundedString(Amount.valueOf(e.s
\r
126 .getSimulatedData().getDeploymentVelocity(),
\r
127 SI.METERS_PER_SECOND));
\r
129 return RocketScience.ammountToRoundedString(Amount.valueOf(e.s
\r
130 .getSimulatedData().getGroundHitVelocity(),
\r
131 SI.METERS_PER_SECOND));
\r
133 return RocketScience.ammountToRoundedString(Amount.valueOf(e.s
\r
134 .getSimulatedData().getTimeToApogee(), SI.SECOND));
\r
136 return RocketScience.ammountToRoundedString(Amount.valueOf(e.s
\r
137 .getSimulatedData().getFlightTime(), SI.SECOND));
\r
144 private TM tm = new TM();
\r
145 private JTable table = new JTable(tm);
\r
146 private OpenRocketDocument doc;
\r
148 public RocketSimTable() {
\r
149 setLayout(new BorderLayout());
\r
150 JScrollPane scroll = new JScrollPane();
\r
151 scroll.setViewportView(table);
\r
152 add(scroll, BorderLayout.CENTER);
\r
154 table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
\r
155 private static final long serialVersionUID = 1L;
\r
157 public Component getTableCellRendererComponent(JTable table,
\r
158 Object value, boolean isSelected, boolean hasFocus,
\r
159 int row, int column) {
\r
160 Component c = super.getTableCellRendererComponent(table, value,
\r
161 isSelected, hasFocus, row, column);
\r
162 Entry e = entries.get(row);
\r
163 if (e.ready && e.s.getSimulatedWarnings().size() > 0) {
\r
164 c.setBackground(Colors.RED);
\r
165 c.setForeground(Color.WHITE);
\r
166 StringBuilder sb = new StringBuilder();
\r
167 sb.append("<html>");
\r
168 for (Warning w : e.s.getSimulatedWarnings()) {
\r
169 sb.append(w.toString());
\r
172 sb.append("<html>");
\r
173 setToolTipText(sb.toString());
\r
175 c.setBackground(table.getBackground());
\r
176 c.setForeground(table.getForeground());
\r
182 RocketScience.addUnitPreferenceListener(this);
\r
183 table.addMouseListener(new MouseAdapter() {
\r
184 public void mouseClicked(MouseEvent e) {
\r
185 if (e.getClickCount() == 2) {
\r
186 Entry entry = entries.get(table.getSelectedRow());
\r
187 SimulationPlotDialog.showPlot(SwingUtilities
\r
188 .getWindowAncestor(RocketSimTable.this), entry.s,
\r
189 PlotConfiguration.DEFAULT_CONFIGURATIONS[0]
\r
194 preferredUnitsChanged();
\r
197 public void openRocket(File f) throws RocketLoadException {
\r
198 this.doc = new OpenRocketLoader().load(f);
\r
199 JPanel rocketInfo = new JPanel();
\r
200 JLabel name = new JLabel("File: " + f.getAbsolutePath());
\r
201 rocketInfo.add(name);
\r
202 add(rocketInfo, BorderLayout.NORTH);
\r
206 private Entry toEntry(Burn b) {
\r
207 final Entry e = new Entry(b.getMotor(), doc.getSimulation(0).copy(), b);
\r
208 OneMotorDatabase.setBurn(b);
\r
210 e.s.getConfiguration().getMotorConfigurationID();
\r
211 Iterator<RocketComponent> iterator = doc.getRocket().iterator();
\r
212 while (iterator.hasNext()) {
\r
213 RocketComponent c = iterator.next();
\r
214 if (c instanceof MotorMount) {
\r
215 ((MotorMount) c).setMotorDelay(e.s.getConfiguration()
\r
216 .getMotorConfigurationID(), b.getMotor()
\r
217 .getEjectionDelay().doubleValue(SI.SECOND));
\r
221 tm.fireTableDataChanged();
\r
224 public void run() {
\r
228 tm.fireTableDataChanged();
\r
229 } catch (SimulationException e1) {
\r
230 e1.printStackTrace();
\r
240 public void replace(Burn oldBurn, Burn newBurn) {
\r
242 return; // TODO, deal with changing rockets
\r
245 if (oldBurn != null) {
\r
246 for (int i = 0; i < entries.size(); i++) {
\r
247 if (entries.get(i).b == oldBurn) {
\r
248 if (newBurn != null) {
\r
249 entries.set(i, toEntry(newBurn));
\r
257 entries.add(toEntry(newBurn));
\r
259 tm.fireTableDataChanged();
\r
263 public void preferredUnitsChanged() {
\r
264 tm.fireTableDataChanged();
\r
265 if (UnitPreference.getUnitPreference() == UnitPreference.NONSI) {
\r
266 System.err.println("NONSI");
\r
267 UnitGroup.setDefaultImperialUnits();
\r
269 System.err.println("SI");
\r
270 UnitGroup.setDefaultMetricUnits();
\r