Add linear fuel editor
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / workbench / LinearFuelEditor.java
1 package com.billkuker.rocketry.motorsim.visual.workbench;
2
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;
13
14 import javax.measure.quantity.Pressure;
15 import javax.measure.quantity.Velocity;
16 import javax.measure.unit.SI;
17 import javax.swing.ButtonGroup;
18 import javax.swing.JButton;
19 import javax.swing.JFrame;
20 import javax.swing.JPanel;
21 import javax.swing.JRadioButton;
22 import javax.swing.JScrollPane;
23 import javax.swing.JSplitPane;
24 import javax.swing.JTable;
25 import javax.swing.event.ChangeEvent;
26 import javax.swing.event.ChangeListener;
27 import javax.swing.table.AbstractTableModel;
28
29 import org.jscience.physics.amount.Amount;
30
31 import com.billkuker.rocketry.motorsim.RocketScience;
32 import com.billkuker.rocketry.motorsim.fuel.PiecewiseLinearFuel;
33 import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel;
34 import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type;
35
36 public class LinearFuelEditor extends AbstractFuelEditor {
37         private static final long serialVersionUID = 1L;
38
39         private static final NumberFormat nf = new DecimalFormat("##########.###");
40
41         private class Entry implements Comparable<Entry> {
42                 Amount<Pressure> p = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(RocketScience.PSI));
43                 Amount<Velocity> v = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(SI.METERS_PER_SECOND));
44
45                 @Override
46                 public int compareTo(Entry o) {
47                         return p.compareTo(o.p);
48                 }
49         }
50
51         private class TM extends AbstractTableModel {
52                 private static final long serialVersionUID = 1L;
53
54                 @Override
55                 public int getColumnCount() {
56                         return 2;
57                 }
58
59                 @Override
60                 public int getRowCount() {
61                         return entries.size();
62                 }
63
64                 @Override
65                 public String getColumnName(int col) {
66                         switch (col) {
67                         case 0:
68                                 return "Pressure";
69                         case 1:
70                                 return "Burn Rate";
71                         }
72                         return null;
73                 }
74
75                 @Override
76                 public Object getValueAt(int rowIndex, int columnIndex) {
77                         Entry e = entries.get(rowIndex);
78                         switch (columnIndex) {
79                         case 0:
80                                 return RocketScience.ammountToString(e.p);
81                         case 1:
82                                 return RocketScience.ammountToString(e.v);
83                         }
84                         return null;
85                 }
86
87                 public boolean isCellEditable(int row, int col) {
88                         return true;
89                 }
90
91                 @SuppressWarnings("unchecked")
92                 public void setValueAt(Object value, int row, int col) {
93                         Entry e = entries.get(row);
94                         try {
95                                 switch (col) {
96                                 case 0:
97                                         try {
98                                                 e.p = (Amount<Pressure>) Amount.valueOf((String) value);
99                                         } catch ( Exception ee ){
100                                                 double d = Double.parseDouble((String)value);
101                                                 e.p = (Amount<Pressure>)Amount.valueOf(d, e.p.getUnit());
102                                         }
103                                         break;
104                                 case 1:
105                                         try {
106                                                 e.v = (Amount<Velocity>) Amount.valueOf((String) value);
107                                         } catch ( Exception ee ){
108                                                 double d = Double.parseDouble((String)value);
109                                                 e.v = (Amount<Velocity>)Amount.valueOf(d, e.v.getUnit());
110                                         }
111                                         break;
112                                 }
113                         } catch (Exception ex) {
114                                 ex.printStackTrace();
115                         }
116                         Collections.sort(entries);
117                         fireTableDataChanged();
118                         //f = new EditablePSRFuel(SaintRobertFuel.Type.NONSI);
119                         f.clear();
120                         for (Entry en : entries) {
121                                 f.add(en.p, en.v);
122                         }
123                         f.firePropertyChange(new PropertyChangeEvent(f,"entries", null, null));
124
125                         update();
126
127                 }
128
129                 @Override
130                 public void fireTableDataChanged() {
131                         super.fireTableDataChanged();
132                 }
133
134         };
135         
136         private Vector<Entry> entries = new Vector<Entry>();
137         JPanel controls;
138         final PiecewiseLinearFuel f;
139
140         public LinearFuelEditor() {
141                 
142                 super( new PiecewiseLinearFuel() );
143                 
144                 this.f = (PiecewiseLinearFuel)getFuel();
145                 
146         }
147         
148         protected  Component getBurnrateEditComponent(){
149                 final TM tm = new TM();
150
151                 JSplitPane editBottom = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
152                 
153
154                 JTable table = new JTable(tm);
155                 JScrollPane scrollpane = new JScrollPane(table);
156                 scrollpane.setMinimumSize(new Dimension(200, 200));
157                 editBottom.setTopComponent(scrollpane);
158
159                 
160                 JButton add = new JButton("Add Data");
161                 add.addActionListener(new ActionListener() {
162                         @Override
163                         public void actionPerformed(ActionEvent e) {
164                                 entries.add(new Entry());
165                                 tm.fireTableDataChanged();
166                         }
167                 });
168                 controls = new JPanel();
169                 controls.setPreferredSize(new Dimension(200, 50));
170                 controls.setLayout(new FlowLayout());
171                         
172                 controls.add(add);
173                 
174                 editBottom.setBottomComponent(controls);
175                 
176                 
177
178                 editBottom.setDividerLocation(.8);
179                 
180                 return editBottom;
181         }
182
183         public static void main(String args[]) {
184                 JFrame f = new JFrame();
185                 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
186                 f.setContentPane(new LinearFuelEditor());
187                 f.setSize(800, 600);
188                 f.setVisible(true);
189
190         }
191
192 }