1 package com.billkuker.rocketry.motorsim.visual.workbench;
3 import java.awt.Component;
4 import java.awt.Dimension;
5 import java.awt.FlowLayout;
6 import java.awt.event.ActionEvent;
7 import java.awt.event.ActionListener;
8 import java.beans.PropertyChangeEvent;
9 import java.text.DecimalFormat;
10 import java.text.NumberFormat;
11 import java.util.Collections;
12 import java.util.Vector;
14 import javax.measure.quantity.Pressure;
15 import javax.swing.ButtonGroup;
16 import javax.swing.JButton;
17 import javax.swing.JFrame;
18 import javax.swing.JPanel;
19 import javax.swing.JRadioButton;
20 import javax.swing.JScrollPane;
21 import javax.swing.JSplitPane;
22 import javax.swing.JTable;
23 import javax.swing.event.ChangeEvent;
24 import javax.swing.event.ChangeListener;
25 import javax.swing.table.AbstractTableModel;
27 import org.jscience.physics.amount.Amount;
29 import com.billkuker.rocketry.motorsim.RocketScience;
30 import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel;
31 import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type;
33 public class SRFuelEditor extends AbstractFuelEditor {
34 private static final long serialVersionUID = 1L;
36 private static final NumberFormat nf = new DecimalFormat("##########.###");
38 private class Entry implements Comparable<Entry> {
39 Amount<Pressure> p = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(RocketScience.PSI));
44 public int compareTo(Entry o) {
45 return p.compareTo(o.p);
49 private class TM extends AbstractTableModel {
50 private static final long serialVersionUID = 1L;
53 public int getColumnCount() {
58 public int getRowCount() {
59 return entries.size();
63 public String getColumnName(int col) {
68 return "Coefficient (a)";
70 return "Exponent (n)";
76 public Object getValueAt(int rowIndex, int columnIndex) {
77 Entry e = entries.get(rowIndex);
78 switch (columnIndex) {
80 //Format like 100 psi or 4.8 Mpa
81 return nf.format(e.p.doubleValue(e.p.getUnit())) + " " + e.p.getUnit();
90 public boolean isCellEditable(int row, int col) {
94 @SuppressWarnings("unchecked")
95 public void setValueAt(Object value, int row, int col) {
96 Entry e = entries.get(row);
101 e.p = (Amount<Pressure>) Amount.valueOf((String) value);
102 } catch ( Exception ee ){
103 double d = Double.parseDouble((String)value);
104 e.p = (Amount<Pressure>)Amount.valueOf(d, e.p.getUnit());
108 e.a = Double.valueOf((String) value);
111 e.n = Double.valueOf((String) value);
113 } catch (Exception ex) {
114 ex.printStackTrace();
116 Collections.sort(entries);
117 fireTableDataChanged();
118 //f = new EditablePSRFuel(SaintRobertFuel.Type.NONSI);
120 for (Entry en : entries) {
121 f.add(en.p, en.a, en.n);
123 f.firePropertyChange(new PropertyChangeEvent(f,"entries", null, null));
130 public void fireTableDataChanged() {
131 super.fireTableDataChanged();
136 private Vector<Entry> entries = new Vector<Entry>();
138 final EditablePSRFuel f;
140 public SRFuelEditor(EditablePSRFuel f) {
148 protected Component getBurnrateEditComponent(){
149 final TM tm = new TM();
151 JSplitPane editBottom = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
154 JTable table = new JTable(tm);
155 JScrollPane scrollpane = new JScrollPane(table);
156 scrollpane.setMinimumSize(new Dimension(200, 200));
157 editBottom.setTopComponent(scrollpane);
160 JButton add = new JButton("Add Data");
161 add.addActionListener(new ActionListener() {
163 public void actionPerformed(ActionEvent e) {
164 entries.add(new Entry());
165 tm.fireTableDataChanged();
168 controls = new JPanel();
169 controls.setPreferredSize(new Dimension(200, 50));
170 controls.setLayout(new FlowLayout());
175 final JRadioButton si, nonsi;
176 ButtonGroup type = new ButtonGroup();
177 JPanel radio = new JPanel();
178 radio.add(si = new JRadioButton("SI"));
179 radio.add(nonsi = new JRadioButton("NonSI"));
184 si.setSelected(true);
186 si.addChangeListener(new ChangeListener(){
188 public void stateChanged(ChangeEvent e) {
189 if ( si.isSelected() ){
190 System.err.println("SI");
193 System.err.println("NONSI");
194 f.setType(Type.NONSI);
199 editBottom.setBottomComponent(controls);
203 editBottom.setDividerLocation(.8);
208 public static void main(String args[]) {
209 JFrame f = new JFrame();
210 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
211 f.setContentPane(new SRFuelEditor(new EditablePSRFuel(SaintRobertFuel.Type.SI)));