d4aa6d03988ed2361ceda9e265738e18fac32e62
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / workbench / SRFuelEditor.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.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;
26
27 import org.jscience.physics.amount.Amount;
28
29 import com.billkuker.rocketry.motorsim.RocketScience;
30 import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel;
31 import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type;
32
33 public class SRFuelEditor extends AbstractFuelEditor {
34         private static final long serialVersionUID = 1L;
35
36         private static final NumberFormat nf = new DecimalFormat("##########.###");
37
38         private class Entry implements Comparable<Entry> {
39                 Amount<Pressure> p = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(RocketScience.PSI));
40                 double a;
41                 double n;
42
43                 @Override
44                 public int compareTo(Entry o) {
45                         return p.compareTo(o.p);
46                 }
47         }
48
49         private class TM extends AbstractTableModel {
50                 private static final long serialVersionUID = 1L;
51
52                 @Override
53                 public int getColumnCount() {
54                         return 3;
55                 }
56
57                 @Override
58                 public int getRowCount() {
59                         return entries.size();
60                 }
61
62                 @Override
63                 public String getColumnName(int col) {
64                         switch (col) {
65                         case 0:
66                                 return "Pressure";
67                         case 1:
68                                 return "Coefficient (a)";
69                         case 2:
70                                 return "Exponent (n)";
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                                 //Format like 100 psi or 4.8 Mpa
81                                 return nf.format(e.p.doubleValue(e.p.getUnit())) + " " + e.p.getUnit();
82                         case 1:
83                                 return e.a;
84                         case 2:
85                                 return e.n;
86                         }
87                         return null;
88                 }
89
90                 public boolean isCellEditable(int row, int col) {
91                         return true;
92                 }
93
94                 @SuppressWarnings("unchecked")
95                 public void setValueAt(Object value, int row, int col) {
96                         Entry e = entries.get(row);
97                         try {
98                                 switch (col) {
99                                 case 0:
100                                         try {
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());
105                                         }
106                                         break;
107                                 case 1:
108                                         e.a = Double.valueOf((String) value);
109                                         break;
110                                 case 2:
111                                         e.n = Double.valueOf((String) value);
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.a, en.n);
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 EditablePSRFuel f;
139
140         public SRFuelEditor(EditablePSRFuel f) {
141                 
142                 super( f);
143                 
144                 this.f = f;
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                 
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"));
180                 controls.add(radio);
181                 type.add(si);
182                 type.add(nonsi);
183
184                 si.setSelected(true);
185                 
186                 si.addChangeListener(new ChangeListener(){
187                         @Override
188                         public void stateChanged(ChangeEvent e) {
189                                 if ( si.isSelected() ){
190                                         System.err.println("SI");
191                                         f.setType(Type.SI);
192                                 } else {
193                                         System.err.println("NONSI");
194                                         f.setType(Type.NONSI);
195                                 }
196                                 update();
197                         }});
198                 
199                 editBottom.setBottomComponent(controls);
200                 
201                 
202
203                 editBottom.setDividerLocation(.8);
204                 
205                 return editBottom;
206         }
207
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)));
212                 f.setSize(800, 600);
213                 f.setVisible(true);
214
215         }
216
217 }