From: Bill Kuker Date: Fri, 12 Nov 2010 14:39:47 +0000 (+0000) Subject: Removed stupid tree X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=502e561fc7edf94b78f7d54a98d655f9a7f43372;p=sw%2Fmotorsim Removed stupid tree Removed fuel editing from main window Added fuel edit window Still need to plumb fuel editor and FuelResolver --- diff --git a/gui/com/billkuker/rocketry/motorsim/visual/workbench/AbstractFuelEditor.java b/gui/com/billkuker/rocketry/motorsim/visual/workbench/AbstractFuelEditor.java deleted file mode 100644 index af3fa26..0000000 --- a/gui/com/billkuker/rocketry/motorsim/visual/workbench/AbstractFuelEditor.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.billkuker.rocketry.motorsim.visual.workbench; - -import java.awt.Component; - -import javax.measure.quantity.Pressure; -import javax.measure.quantity.Velocity; -import javax.measure.quantity.VolumetricDensity; -import javax.measure.unit.SI; -import javax.swing.JSplitPane; -import javax.swing.SwingUtilities; - -import org.jscience.physics.amount.Amount; - -import com.billkuker.rocketry.motorsim.Fuel; -import com.billkuker.rocketry.motorsim.fuel.EditableCombustionProduct; -import com.billkuker.rocketry.motorsim.fuel.PiecewiseSaintRobertFuel; -import com.billkuker.rocketry.motorsim.visual.Chart; -import com.billkuker.rocketry.motorsim.visual.Editor; - -public abstract class AbstractFuelEditor extends JSplitPane { - private static final long serialVersionUID = 1L; - - protected static class EditablePSRFuel extends PiecewiseSaintRobertFuel { - - @SuppressWarnings("unchecked") - private Amount idealDensity = (Amount) Amount - .valueOf("1 g/mm^3"); - - private double combustionEfficiency = 1; - private double densityRatio = 1; - private EditableCombustionProduct cp; - private String name = "New Fuel"; - - public EditablePSRFuel(Type t) { - super(t); - cp = new EditableCombustionProduct(); - } - - public void clear(){ - super.clear(); - } - - public void setType(Type t){ - super.setType(t); - } - - public void add(Amount p, final double _a, final double _n) { - super.add(p, _a, _n); - - } - - public Amount getIdealDensity() { - return idealDensity; - } - - public void setIdealDensity(Amount idealDensity) { - this.idealDensity = idealDensity; - } - - public double getCombustionEfficiency() { - return combustionEfficiency; - } - - public void setCombustionEfficiency(double combustionEfficiency) { - this.combustionEfficiency = combustionEfficiency; - } - - public double getDensityRatio() { - return densityRatio; - } - - public void setDensityRatio(double densityRatio) { - this.densityRatio = densityRatio; - } - - @Override - public CombustionProduct getCombustionProduct() { - return cp; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - } - - private final JSplitPane editParent; - private final JSplitPane editTop; - private final Fuel f; - private Chart burnRate; - - public AbstractFuelEditor(Fuel f){ - super(HORIZONTAL_SPLIT); - this.f = f; - - editTop = new JSplitPane(JSplitPane.VERTICAL_SPLIT); - editTop.setTopComponent(new Editor(f)); - editTop.setBottomComponent(new Editor(f.getCombustionProduct())); - - editParent = new JSplitPane(JSplitPane.VERTICAL_SPLIT); - setLeftComponent(editParent); - editParent.setTopComponent(editTop); - editParent.setBottomComponent(getBurnrateEditComponent()); - - setResizeWeight(0); - setDividerLocation(.3); - editParent.setDividerLocation(.5); - editTop.setDividerLocation(.5); - editParent.resetToPreferredSizes(); - revalidate(); - - update(); - } - - protected abstract Component getBurnrateEditComponent(); - - public Fuel getFuel(){ - return f; - } - - - - protected void update() { - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - editTop.setTopComponent(new Editor(f)); - editTop.setBottomComponent(new Editor(f.getCombustionProduct())); - if (burnRate != null) - AbstractFuelEditor.this.remove(burnRate); - try { - burnRate = new Chart( - SI.MEGA(SI.PASCAL), SI.MILLIMETER.divide(SI.SECOND) - .asType(Velocity.class), f, "burnRate"); - } catch (NoSuchMethodException e) { - throw new Error(e); - } - burnRate.setDomain(burnRate.new IntervalDomain(Amount.valueOf( - 0, SI.MEGA(SI.PASCAL)), Amount.valueOf(11, SI - .MEGA(SI.PASCAL)), 50)); - AbstractFuelEditor.this.setRightComponent(burnRate); - AbstractFuelEditor.this.revalidate(); - } - }); - } - -} diff --git a/gui/com/billkuker/rocketry/motorsim/visual/workbench/FuelsEditor.java b/gui/com/billkuker/rocketry/motorsim/visual/workbench/FuelsEditor.java deleted file mode 100644 index 61f7ca8..0000000 --- a/gui/com/billkuker/rocketry/motorsim/visual/workbench/FuelsEditor.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.billkuker.rocketry.motorsim.visual.workbench; - -import java.awt.Frame; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; - -import javax.swing.JFrame; -import javax.swing.JMenuBar; - -import com.billkuker.rocketry.motorsim.Fuel; -import com.billkuker.rocketry.motorsim.fuel.EditableFuel; -import com.billkuker.rocketry.motorsim.fuel.PiecewiseLinearFuel; -import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel; -import com.billkuker.rocketry.motorsim.io.MotorIO; -import com.billkuker.rocketry.motorsim.visual.FuelPanel; -import com.billkuker.rocketry.motorsim.visual.MultiObjectEditor; -import com.billkuker.rocketry.motorsim.visual.workbench.AbstractFuelEditor.EditablePSRFuel; - -public class FuelsEditor extends MultiObjectEditor { - - public FuelsEditor(Frame frame) { - super(frame, "Fuel"); - } - - @Override - public AbstractFuelEditor createEditor(Fuel o) { - if ( o instanceof PiecewiseLinearFuel ){ - return new LinearFuelEditor((PiecewiseLinearFuel)o); - } else if ( o instanceof EditableFuel ){ - return new SRFuelEditor(new EditablePSRFuel(SaintRobertFuel.Type.SI)); - } - return null; - } - - @Override - public Fuel newObject() { - return new PiecewiseLinearFuel(); - } - - @Override - protected Fuel loadFromFile(File f) throws IOException { - return MotorIO.readFuel(new FileInputStream(f)); - } - - @Override - protected void saveToFile(Fuel o, File f) throws IOException { - MotorIO.writeFuel(o, new FileOutputStream(f)); - } - - public static void main(String args[]){ - JFrame f = new JFrame(); - f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - FuelsEditor fe; - f.add(fe = new FuelsEditor(f)); - JMenuBar b; - f.setJMenuBar(b = new JMenuBar()); - b.add(fe.getMenu()); - f.setSize(1024, 768); - f.show(); - } - -} diff --git a/gui/com/billkuker/rocketry/motorsim/visual/workbench/LinearFuelEditor.java b/gui/com/billkuker/rocketry/motorsim/visual/workbench/LinearFuelEditor.java deleted file mode 100644 index 65a255a..0000000 --- a/gui/com/billkuker/rocketry/motorsim/visual/workbench/LinearFuelEditor.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.billkuker.rocketry.motorsim.visual.workbench; - -import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.beans.PropertyChangeEvent; -import java.text.DecimalFormat; -import java.text.NumberFormat; -import java.util.Collections; -import java.util.Vector; - -import javax.measure.quantity.Pressure; -import javax.measure.quantity.Velocity; -import javax.measure.unit.SI; -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.JTable; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.table.AbstractTableModel; - -import org.jscience.physics.amount.Amount; - -import com.billkuker.rocketry.motorsim.RocketScience; -import com.billkuker.rocketry.motorsim.fuel.PiecewiseLinearFuel; -import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel; -import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type; - -public class LinearFuelEditor extends AbstractFuelEditor { - private static final long serialVersionUID = 1L; - - private static final NumberFormat nf = new DecimalFormat("##########.###"); - - private class Entry implements Comparable { - Amount p = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(RocketScience.PSI)); - Amount v = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(SI.METERS_PER_SECOND)); - - @Override - public int compareTo(Entry o) { - return p.compareTo(o.p); - } - } - - private class TM extends AbstractTableModel { - private static final long serialVersionUID = 1L; - - @Override - public int getColumnCount() { - return 2; - } - - @Override - public int getRowCount() { - return entries.size(); - } - - @Override - public String getColumnName(int col) { - switch (col) { - case 0: - return "Pressure"; - case 1: - return "Burn Rate"; - } - return null; - } - - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - Entry e = entries.get(rowIndex); - switch (columnIndex) { - case 0: - return RocketScience.ammountToString(e.p); - case 1: - return RocketScience.ammountToString(e.v); - } - return null; - } - - public boolean isCellEditable(int row, int col) { - return true; - } - - @SuppressWarnings("unchecked") - public void setValueAt(Object value, int row, int col) { - Entry e = entries.get(row); - try { - switch (col) { - case 0: - try { - e.p = (Amount) Amount.valueOf((String) value); - } catch ( Exception ee ){ - double d = Double.parseDouble((String)value); - e.p = (Amount)Amount.valueOf(d, e.p.getUnit()); - } - break; - case 1: - try { - e.v = (Amount) Amount.valueOf((String) value); - } catch ( Exception ee ){ - double d = Double.parseDouble((String)value); - e.v = (Amount)Amount.valueOf(d, e.v.getUnit()); - } - break; - } - } catch (Exception ex) { - ex.printStackTrace(); - } - Collections.sort(entries); - fireTableDataChanged(); - //f = new EditablePSRFuel(SaintRobertFuel.Type.NONSI); - f.clear(); - for (Entry en : entries) { - f.add(en.p, en.v); - } - f.firePropertyChange(new PropertyChangeEvent(f,"entries", null, null)); - - update(); - - } - - @Override - public void fireTableDataChanged() { - super.fireTableDataChanged(); - } - - }; - - private Vector entries = new Vector(); - JPanel controls; - final PiecewiseLinearFuel f; - - public LinearFuelEditor(PiecewiseLinearFuel f) { - super( f ); - this.f = f; - } - - protected Component getBurnrateEditComponent(){ - final TM tm = new TM(); - - JSplitPane editBottom = new JSplitPane(JSplitPane.VERTICAL_SPLIT); - - - JTable table = new JTable(tm); - JScrollPane scrollpane = new JScrollPane(table); - scrollpane.setMinimumSize(new Dimension(200, 200)); - editBottom.setTopComponent(scrollpane); - - - JButton add = new JButton("Add Data"); - add.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - entries.add(new Entry()); - tm.fireTableDataChanged(); - } - }); - controls = new JPanel(); - controls.setPreferredSize(new Dimension(200, 50)); - controls.setLayout(new FlowLayout()); - - controls.add(add); - - editBottom.setBottomComponent(controls); - - - - editBottom.setDividerLocation(.8); - - return editBottom; - } - - public static void main(String args[]) { - JFrame f = new JFrame(); - f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - f.setContentPane(new LinearFuelEditor(new PiecewiseLinearFuel())); - f.setSize(800, 600); - f.setVisible(true); - - } - -} diff --git a/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java b/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java index ad2ecf7..2dd251a 100644 --- a/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java +++ b/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java @@ -427,7 +427,7 @@ public class MotorEditor extends JPanel implements PropertyChangeListener { public MotorEditor(Motor m, Collection fuels) { setLayout( new BorderLayout()); - tabs = new JTabbedPane(JTabbedPane.BOTTOM); + tabs = new JTabbedPane(JTabbedPane.TOP); add(tabs, BorderLayout.CENTER); for ( Fuel f : fuels ) diff --git a/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java b/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java index 9c58d6e..5e9652f 100644 --- a/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java +++ b/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java @@ -1,12 +1,9 @@ package com.billkuker.rocketry.motorsim.visual.workbench; import java.awt.BorderLayout; -import java.awt.Dimension; import java.awt.FileDialog; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -22,48 +19,44 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButtonMenuItem; import javax.swing.JSeparator; -import javax.swing.JSplitPane; import javax.swing.JTabbedPane; -import javax.swing.JTree; import javax.swing.WindowConstants; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.TreePath; -import javax.swing.tree.TreeSelectionModel; import com.billkuker.rocketry.motorsim.Burn; import com.billkuker.rocketry.motorsim.Fuel; import com.billkuker.rocketry.motorsim.Motor; import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference; import com.billkuker.rocketry.motorsim.fuel.FuelResolver; -import com.billkuker.rocketry.motorsim.fuel.PiecewiseLinearFuel; -import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel; import com.billkuker.rocketry.motorsim.io.ENGExporter; import com.billkuker.rocketry.motorsim.io.MotorIO; -import com.billkuker.rocketry.motorsim.visual.FuelPanel; -import com.billkuker.rocketry.motorsim.visual.workbench.AbstractFuelEditor.EditablePSRFuel; -import com.billkuker.rocketry.motorsim.visual.workbench.WorkbenchTreeModel.FuelEditNode; -import com.billkuker.rocketry.motorsim.visual.workbench.WorkbenchTreeModel.FuelNode; -public class MotorWorkbench extends JFrame implements TreeSelectionListener { +import fuel.FuelsEditor; + +public class MotorWorkbench extends JFrame { private static final long serialVersionUID = 1L; private JPanel top; - private JSplitPane split; - private JTree tree; private JTabbedPane motors; - private JTabbedPane fuels; - private WorkbenchTreeModel tm; private MultiBurnChart mb; private JFrame allBurns; + + private JFrame fuelEditorFrame = new JFrame(){ + private static final long serialVersionUID = 1L; + { + setSize(1024, 768); + add(fuelEditor = new FuelsEditor(this)); + JMenuBar b; + setJMenuBar(b = new JMenuBar()); + b.add(fuelEditor.getMenu()); + setTitle("MotorSim - Fuel Editor"); + } + }; + private FuelsEditor fuelEditor; private HashMap e2f = new HashMap(); private HashMap f2e = new HashMap(); private HashMap m2e = new HashMap(); - - private static final int TREE_WIDTH = 200; public MotorWorkbench() { setTitle("MotorSim 1.0 RC1"); @@ -80,23 +73,8 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { allBurns.add(mb); motors = new JTabbedPane(); - fuels = new JTabbedPane(); - - tree = new JTree(tm = new WorkbenchTreeModel()); - tree.setCellRenderer(new WorkbenchTreeCellRenderer()); - tree.getSelectionModel().setSelectionMode( - TreeSelectionModel.SINGLE_TREE_SELECTION); - tree.setMinimumSize(new Dimension(TREE_WIDTH, 100)); - - // Listen for when the selection changes. - tree.addTreeSelectionListener(this); - - split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, - tree, motors); - split.setDividerLocation(TREE_WIDTH); - split.revalidate(); - top.add(split, BorderLayout.CENTER); + top.add(motors, BorderLayout.CENTER); for ( Fuel f : FuelResolver.getFuelMap().values() ){ addFuel(f); @@ -172,7 +150,6 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { public void actionPerformed(ActionEvent ev) { MotorEditor e = (MotorEditor) motors .getSelectedComponent(); - tm.removeMotor(e.getMotor()); motors.remove(e); f2e.remove(e2f.get(e)); e2f.remove(e); @@ -232,40 +209,6 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { }); - add(new JSeparator()); - add(new JMenu("New Fuel"){ - private static final long serialVersionUID = 1L; - { - add(new JMenuItem("Saint-Robert") { - private static final long serialVersionUID = 1L; - { - addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent arg0) { - newFuel(new SRFuelEditor(new EditablePSRFuel(SaintRobertFuel.Type.SI))); - } - }); - - } - }); - add(new JMenuItem("Linear"){ - private static final long serialVersionUID = 1L; - { - addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent arg0) { - newFuel(new LinearFuelEditor(new PiecewiseLinearFuel())); - } - }); - - } - }); - } - }); - - add(new JMenuItem("Save Fuel") { - private static final long serialVersionUID = 1L; - }); add(new JSeparator()); add(new JMenuItem("Export .ENG"){ private static final long serialVersionUID = 1L; @@ -326,7 +269,7 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { add(new JMenu("View") { private static final long serialVersionUID = 1L; { - add(new JMenuItem("Show All Motors Graph") { + add(new JMenuItem("All Motors Graph") { private static final long serialVersionUID = 1L; { addActionListener(new ActionListener() { @@ -338,6 +281,18 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { }); } }); + add(new JMenuItem("Fuel Editor") { + private static final long serialVersionUID = 1L; + { + addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + fuelEditorFrame.setVisible(true); + fuelEditorFrame.toFront(); + } + }); + } + }); } }); } @@ -347,33 +302,8 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { private void addFuel(Fuel f){ for ( MotorEditor e : m2e.values() ) e.addFuel(f); - FuelPanel fp = new FuelPanel(f); - FuelNode fn = tm.new FuelNode(fp, f); - tm.getFuels().add(fn); - tm.nodeStructureChanged(tm.getFuels()); - fuels.addTab(f.getName(), fp); } - private void newFuel(final AbstractFuelEditor ed){ - for ( MotorEditor e : m2e.values() ) - e.addFuel(ed.getFuel()); - final FuelEditNode node = tm.new FuelEditNode(ed); - tm.getFuels().add(node); - tm.nodeStructureChanged(tm.getFuels()); - fuels.addTab(ed.getFuel().getName(), ed); - ed.getFuel().addPropertyChangeListener(new PropertyChangeListener(){ - @Override - public void propertyChange(PropertyChangeEvent evt) { - if ( evt.getPropertyName().equals("Name")){ - for ( int i = 0; i < fuels.getTabCount(); i++ ){ - if ( fuels.getComponent(i) == ed ){ - fuels.setTitleAt(i, ed.getFuel().getName()); - tm.nodeChanged(node); - } - } - } - }}); - } private void save(Motor m, File f) { try { @@ -386,7 +316,6 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { } public void addMotor(Motor m, File f) { - tm.addMotor(m); MotorEditor e = new MotorEditor(m, FuelResolver.getFuelMap().values()); e.addBurnWatcher(mb); String title; @@ -401,40 +330,5 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener { motors.addTab(title, e); } - @Override - public void valueChanged(TreeSelectionEvent e) { - if (e.getPath().getLastPathComponent() instanceof FuelNode) { - FuelNode fen = ((FuelNode) e.getPath().getLastPathComponent()); - fuels.setSelectedComponent(fen.getUserObject()); - split.setRightComponent(fuels); - split.setDividerLocation(TREE_WIDTH); - split.revalidate(); - } - - Motor m = getMotor(e.getPath()); - - if (m == null) - return; - - split.setRightComponent(motors); - split.setDividerLocation(TREE_WIDTH); - split.revalidate(); - motors.setSelectedComponent(m2e.get(m)); - - if (e.getPath().getLastPathComponent() instanceof DefaultMutableTreeNode) { - Object o = ((DefaultMutableTreeNode) e.getPath() - .getLastPathComponent()).getUserObject(); - m2e.get(m).focusOnObject(o); - } - - } - - private Motor getMotor(TreePath p) { - if (p.getLastPathComponent() instanceof WorkbenchTreeModel.MotorNode) { - return ((WorkbenchTreeModel.MotorNode) p.getLastPathComponent()) - .getUserObject(); - } else if (p.getPath().length > 1) - return getMotor(p.getParentPath()); - return null; - } + } diff --git a/gui/com/billkuker/rocketry/motorsim/visual/workbench/SRFuelEditor.java b/gui/com/billkuker/rocketry/motorsim/visual/workbench/SRFuelEditor.java deleted file mode 100644 index d4aa6d0..0000000 --- a/gui/com/billkuker/rocketry/motorsim/visual/workbench/SRFuelEditor.java +++ /dev/null @@ -1,217 +0,0 @@ -package com.billkuker.rocketry.motorsim.visual.workbench; - -import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.beans.PropertyChangeEvent; -import java.text.DecimalFormat; -import java.text.NumberFormat; -import java.util.Collections; -import java.util.Vector; - -import javax.measure.quantity.Pressure; -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.JTable; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.table.AbstractTableModel; - -import org.jscience.physics.amount.Amount; - -import com.billkuker.rocketry.motorsim.RocketScience; -import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel; -import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type; - -public class SRFuelEditor extends AbstractFuelEditor { - private static final long serialVersionUID = 1L; - - private static final NumberFormat nf = new DecimalFormat("##########.###"); - - private class Entry implements Comparable { - Amount p = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(RocketScience.PSI)); - double a; - double n; - - @Override - public int compareTo(Entry o) { - return p.compareTo(o.p); - } - } - - private class TM extends AbstractTableModel { - private static final long serialVersionUID = 1L; - - @Override - public int getColumnCount() { - return 3; - } - - @Override - public int getRowCount() { - return entries.size(); - } - - @Override - public String getColumnName(int col) { - switch (col) { - case 0: - return "Pressure"; - case 1: - return "Coefficient (a)"; - case 2: - return "Exponent (n)"; - } - return null; - } - - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - Entry e = entries.get(rowIndex); - switch (columnIndex) { - case 0: - //Format like 100 psi or 4.8 Mpa - return nf.format(e.p.doubleValue(e.p.getUnit())) + " " + e.p.getUnit(); - case 1: - return e.a; - case 2: - return e.n; - } - return null; - } - - public boolean isCellEditable(int row, int col) { - return true; - } - - @SuppressWarnings("unchecked") - public void setValueAt(Object value, int row, int col) { - Entry e = entries.get(row); - try { - switch (col) { - case 0: - try { - e.p = (Amount) Amount.valueOf((String) value); - } catch ( Exception ee ){ - double d = Double.parseDouble((String)value); - e.p = (Amount)Amount.valueOf(d, e.p.getUnit()); - } - break; - case 1: - e.a = Double.valueOf((String) value); - break; - case 2: - e.n = Double.valueOf((String) value); - } - } catch (Exception ex) { - ex.printStackTrace(); - } - Collections.sort(entries); - fireTableDataChanged(); - //f = new EditablePSRFuel(SaintRobertFuel.Type.NONSI); - f.clear(); - for (Entry en : entries) { - f.add(en.p, en.a, en.n); - } - f.firePropertyChange(new PropertyChangeEvent(f,"entries", null, null)); - - update(); - - } - - @Override - public void fireTableDataChanged() { - super.fireTableDataChanged(); - } - - }; - - private Vector entries = new Vector(); - JPanel controls; - final EditablePSRFuel f; - - public SRFuelEditor(EditablePSRFuel f) { - - super( f); - - this.f = f; - - } - - protected Component getBurnrateEditComponent(){ - final TM tm = new TM(); - - JSplitPane editBottom = new JSplitPane(JSplitPane.VERTICAL_SPLIT); - - - JTable table = new JTable(tm); - JScrollPane scrollpane = new JScrollPane(table); - scrollpane.setMinimumSize(new Dimension(200, 200)); - editBottom.setTopComponent(scrollpane); - - - JButton add = new JButton("Add Data"); - add.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - entries.add(new Entry()); - tm.fireTableDataChanged(); - } - }); - controls = new JPanel(); - controls.setPreferredSize(new Dimension(200, 50)); - controls.setLayout(new FlowLayout()); - - controls.add(add); - - - final JRadioButton si, nonsi; - ButtonGroup type = new ButtonGroup(); - JPanel radio = new JPanel(); - radio.add(si = new JRadioButton("SI")); - radio.add(nonsi = new JRadioButton("NonSI")); - controls.add(radio); - type.add(si); - type.add(nonsi); - - si.setSelected(true); - - si.addChangeListener(new ChangeListener(){ - @Override - public void stateChanged(ChangeEvent e) { - if ( si.isSelected() ){ - System.err.println("SI"); - f.setType(Type.SI); - } else { - System.err.println("NONSI"); - f.setType(Type.NONSI); - } - update(); - }}); - - editBottom.setBottomComponent(controls); - - - - editBottom.setDividerLocation(.8); - - return editBottom; - } - - public static void main(String args[]) { - JFrame f = new JFrame(); - f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - f.setContentPane(new SRFuelEditor(new EditablePSRFuel(SaintRobertFuel.Type.SI))); - f.setSize(800, 600); - f.setVisible(true); - - } - -} diff --git a/gui/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java b/gui/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java deleted file mode 100644 index ae3e3a6..0000000 --- a/gui/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeCellRenderer.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.billkuker.rocketry.motorsim.visual.workbench; - -import java.awt.Color; -import java.awt.Component; - -import javax.swing.JTree; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellRenderer; - -import com.billkuker.rocketry.motorsim.Motor; -import com.billkuker.rocketry.motorsim.Validating; -import com.billkuker.rocketry.motorsim.Validating.ValidationException; -import com.billkuker.rocketry.motorsim.visual.workbench.WorkbenchTreeModel.FuelNode; - -public class WorkbenchTreeCellRenderer extends DefaultTreeCellRenderer { - private static final long serialVersionUID = 1L; - - @Override - public Component getTreeCellRendererComponent(JTree tree, final Object value, - boolean sel, boolean expanded, boolean leaf, int row, - boolean hasFocus) { - - String tip = null; - setTextNonSelectionColor(Color.black); - setTextSelectionColor(Color.white); - - Object part = null; - if (value instanceof DefaultMutableTreeNode) { - part = ((DefaultMutableTreeNode) value).getUserObject(); - } - - if ( part instanceof Validating ){ - try { - ((Validating)part).validate(); - } catch (ValidationException e) { - setTextSelectionColor(Color.RED); - setTextNonSelectionColor(Color.RED); - setToolTipText(e.getMessage()); - tip = e.getMessage(); - } - } - - super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, - row, hasFocus); - - if (part instanceof Motor) { - setText(((Motor) part).getName()); - } else if ( value instanceof FuelNode ){ - setText(((FuelNode)value).getFuel().getName()); - } else if ( part instanceof String ) { - setText((String)part); - } else if ( part == null ) { - setText(""); - } else { - setText(part.getClass().getSimpleName()); - } - setToolTipText(tip); - - - - return this; - } -} diff --git a/gui/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java b/gui/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java deleted file mode 100644 index 1db767f..0000000 --- a/gui/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.billkuker.rocketry.motorsim.visual.workbench; - -import java.awt.Component; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.Enumeration; - -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreeNode; - -import com.billkuker.rocketry.motorsim.ChangeListening; -import com.billkuker.rocketry.motorsim.Fuel; -import com.billkuker.rocketry.motorsim.Motor; -import com.billkuker.rocketry.motorsim.grain.MultiGrain; - -public class WorkbenchTreeModel extends DefaultTreeModel { - - private static final long serialVersionUID = 1L; - - //TreeNode root = new DefaultMutableTreeNode("Root"); - DefaultMutableTreeNode motors = new DefaultMutableTreeNode("All Motors"); - DefaultMutableTreeNode fuel = new DefaultMutableTreeNode("Fuels"); - - public class MultiGrainNode extends PartNode{ - private static final long serialVersionUID = 1L; - public MultiGrainNode(MultiGrain part) { - super(part); - setAllowsChildren(true); - add(new PartNode(part.getGrain())); - } - @Override - public void propertyChange(PropertyChangeEvent e) { - if ( e.getPropertyName().equals("Grain")){ - remove(0); - add(new PartNode(((MultiGrain)getUserObject()).getGrain())); - nodesChanged(this, new int[]{0}); - } - super.propertyChange(e); - } - } - - public class FuelNode extends DefaultMutableTreeNode{ - private static final long serialVersionUID = 1L; - Fuel f; - public FuelNode(Component c, Fuel f){ - super(c, false); - this.f = f; - } - - @Override - public Component getUserObject(){ - return (Component)super.getUserObject(); - } - - public Fuel getFuel(){ - return f; - } - } - - public class FuelEditNode extends FuelNode { - private static final long serialVersionUID = 1L; - - public FuelEditNode(AbstractFuelEditor sr){ - super(sr, sr.getFuel()); - sr.getFuel().addPropertyChangeListener(new PropertyChangeListener(){ - - @Override - public void propertyChange(PropertyChangeEvent evt) { - nodeChanged(FuelEditNode.this); - }}); - } - - @Override - public AbstractFuelEditor getUserObject(){ - return (AbstractFuelEditor)super.getUserObject(); - } - - } - - public class PartNode extends DefaultMutableTreeNode implements PropertyChangeListener { - private static final long serialVersionUID = 1L; - - public PartNode(Object part) { - super(part, false); - if (part instanceof ChangeListening.Subject) { - ((ChangeListening.Subject) part).addPropertyChangeListener(this); - } - } - - @Override - public void propertyChange(PropertyChangeEvent e) { - nodeChanged(this); - } - - } - - public class MotorNode extends PartNode implements PropertyChangeListener { - private static final long serialVersionUID = 1L; - Motor motor; - PartNode cn, nn, gn, fn; - - public MotorNode(Motor m) { - super(m); - setAllowsChildren(true); - motor = m; - add( cn = new PartNode(m.getChamber())); - add( nn = new PartNode(m.getNozzle())); - if ( m.getGrain() instanceof MultiGrain ){ - gn = new MultiGrainNode(((MultiGrain)m.getGrain())); - } else { - gn = new PartNode(m.getGrain()); - } - add(gn); - if (m instanceof ChangeListening.Subject) { - ((ChangeListening.Subject) m).addPropertyChangeListener(this); - } - } - - @Override - public Motor getUserObject(){ - return (Motor)super.getUserObject(); - } - - @Override - public void propertyChange(PropertyChangeEvent e) { - nodeChanged(this); - super.propertyChange(e); - } - - } - - public WorkbenchTreeModel() { - super(new DefaultMutableTreeNode("Root"), true); - getRoot().add(motors); - getRoot().add(fuel); - } - - @Override - public DefaultMutableTreeNode getRoot(){ - return (DefaultMutableTreeNode)super.getRoot(); - } - - public DefaultMutableTreeNode getMotors(){ - return motors; - } - - public DefaultMutableTreeNode getFuels(){ - return fuel; - } - - public void addMotor(Motor m){ - motors.add(new MotorNode(m)); - nodesWereInserted(motors, new int[]{motors.getChildCount()-1}); - - } - - @SuppressWarnings("unchecked") - public void removeMotor(Motor m){ - Enumeration e = motors.children(); - while ( e.hasMoreElements() ){ - TreeNode n = e.nextElement(); - if ( n instanceof MotorNode ){ - if ( ((MotorNode)n).getUserObject() == m ){ - removeNodeFromParent((MotorNode)n); - } - } - } - } - -} diff --git a/gui/fuel/AbstractFuelEditor.java b/gui/fuel/AbstractFuelEditor.java new file mode 100644 index 0000000..23da52a --- /dev/null +++ b/gui/fuel/AbstractFuelEditor.java @@ -0,0 +1,81 @@ +package fuel; + +import java.awt.Component; + +import javax.measure.quantity.Pressure; +import javax.measure.quantity.Velocity; +import javax.measure.unit.SI; +import javax.swing.JSplitPane; +import javax.swing.SwingUtilities; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.Fuel; +import com.billkuker.rocketry.motorsim.visual.Chart; +import com.billkuker.rocketry.motorsim.visual.Editor; + +public abstract class AbstractFuelEditor extends JSplitPane { + private static final long serialVersionUID = 1L; + + private final JSplitPane editParent; + private final JSplitPane editTop; + private final Fuel f; + private Chart burnRate; + + public AbstractFuelEditor(Fuel f){ + super(HORIZONTAL_SPLIT); + this.f = f; + + editTop = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + editTop.setTopComponent(new Editor(f)); + editTop.setBottomComponent(new Editor(f.getCombustionProduct())); + + editParent = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + setLeftComponent(editParent); + editParent.setTopComponent(editTop); + editParent.setBottomComponent(getBurnrateEditComponent()); + + setResizeWeight(0); + setDividerLocation(.3); + editParent.setDividerLocation(.5); + editTop.setDividerLocation(.5); + editParent.resetToPreferredSizes(); + revalidate(); + + update(); + } + + protected abstract Component getBurnrateEditComponent(); + + public Fuel getFuel(){ + return f; + } + + + + protected void update() { + SwingUtilities.invokeLater(new Runnable() { + + @Override + public void run() { + editTop.setTopComponent(new Editor(f)); + editTop.setBottomComponent(new Editor(f.getCombustionProduct())); + if (burnRate != null) + AbstractFuelEditor.this.remove(burnRate); + try { + burnRate = new Chart( + SI.MEGA(SI.PASCAL), SI.MILLIMETER.divide(SI.SECOND) + .asType(Velocity.class), f, "burnRate"); + } catch (NoSuchMethodException e) { + throw new Error(e); + } + burnRate.setDomain(burnRate.new IntervalDomain(Amount.valueOf( + 0, SI.MEGA(SI.PASCAL)), Amount.valueOf(11, SI + .MEGA(SI.PASCAL)), 50)); + AbstractFuelEditor.this.setRightComponent(burnRate); + AbstractFuelEditor.this.revalidate(); + } + }); + } + +} diff --git a/gui/fuel/FuelsEditor.java b/gui/fuel/FuelsEditor.java new file mode 100644 index 0000000..4d599f6 --- /dev/null +++ b/gui/fuel/FuelsEditor.java @@ -0,0 +1,87 @@ +package fuel; + +import java.awt.Frame; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +import javax.swing.JFrame; +import javax.swing.JMenuBar; + +import com.billkuker.rocketry.motorsim.Fuel; +import com.billkuker.rocketry.motorsim.fuel.editable.EditablePiecewiseLinearFuel; +import com.billkuker.rocketry.motorsim.fuel.editable.EditablePiecewiseSaintRobertFuel; +import com.billkuker.rocketry.motorsim.io.MotorIO; +import com.billkuker.rocketry.motorsim.visual.MultiObjectEditor; + +public class FuelsEditor extends MultiObjectEditor { + + private static final long serialVersionUID = 1L; + + public FuelsEditor(Frame frame) { + super(frame, "Fuel"); + addCreator(new ObjectCreator() { + @Override + public Fuel newObject() { + return new EditablePiecewiseLinearFuel(); + } + + @Override + public String getName() { + return "Linear Fuel"; + } + }); + addCreator(new ObjectCreator() { + @Override + public Fuel newObject() { + return new EditablePiecewiseSaintRobertFuel(); + } + + @Override + public String getName() { + return "Saint Robert Fuel"; + } + }); + } + + @Override + public AbstractFuelEditor createEditor(Fuel o) { + if ( o instanceof EditablePiecewiseLinearFuel ){ + return new LinearFuelEditor((EditablePiecewiseLinearFuel)o); + } else if ( o instanceof EditablePiecewiseSaintRobertFuel ){ + return new SRFuelEditor((EditablePiecewiseSaintRobertFuel)o); + } + return null; + } + + @Override + public Fuel newObject() { + return new EditablePiecewiseLinearFuel(); + } + + @Override + protected Fuel loadFromFile(File f) throws IOException { + Fuel fuel = MotorIO.readFuel(new FileInputStream(f)); + return fuel; + } + + @Override + protected void saveToFile(Fuel o, File f) throws IOException { + MotorIO.writeFuel(o, new FileOutputStream(f)); + } + + @SuppressWarnings("deprecation") + public static void main(String args[]){ + JFrame f = new JFrame(); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + FuelsEditor fe; + f.add(fe = new FuelsEditor(f)); + JMenuBar b; + f.setJMenuBar(b = new JMenuBar()); + b.add(fe.getMenu()); + f.setSize(1024, 768); + f.show(); + } + +} diff --git a/gui/fuel/LinearFuelEditor.java b/gui/fuel/LinearFuelEditor.java new file mode 100644 index 0000000..93aff74 --- /dev/null +++ b/gui/fuel/LinearFuelEditor.java @@ -0,0 +1,187 @@ +package fuel; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.util.Collections; +import java.util.Map; +import java.util.Vector; + +import javax.measure.quantity.Pressure; +import javax.measure.quantity.Velocity; +import javax.measure.unit.SI; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JTable; +import javax.swing.table.AbstractTableModel; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.RocketScience; +import com.billkuker.rocketry.motorsim.fuel.editable.EditablePiecewiseLinearFuel; + +public class LinearFuelEditor extends AbstractFuelEditor { + private static final long serialVersionUID = 1L; + + private class Entry implements Comparable { + Amount p = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(RocketScience.PSI)); + Amount v = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(SI.METERS_PER_SECOND)); + + @Override + public int compareTo(Entry o) { + return p.compareTo(o.p); + } + } + + private class TM extends AbstractTableModel { + private static final long serialVersionUID = 1L; + + @Override + public int getColumnCount() { + return 2; + } + + @Override + public int getRowCount() { + return entries.size(); + } + + @Override + public String getColumnName(int col) { + switch (col) { + case 0: + return "Pressure"; + case 1: + return "Burn Rate"; + } + return null; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + Entry e = entries.get(rowIndex); + switch (columnIndex) { + case 0: + return RocketScience.ammountToString(e.p); + case 1: + return RocketScience.ammountToString(e.v); + } + return null; + } + + public boolean isCellEditable(int row, int col) { + return true; + } + + @SuppressWarnings("unchecked") + public void setValueAt(Object value, int row, int col) { + Entry e = entries.get(row); + try { + switch (col) { + case 0: + try { + e.p = (Amount) Amount.valueOf((String) value); + } catch ( Exception ee ){ + double d = Double.parseDouble((String)value); + e.p = (Amount)Amount.valueOf(d, e.p.getUnit()); + } + break; + case 1: + try { + e.v = (Amount) Amount.valueOf((String) value); + } catch ( Exception ee ){ + double d = Double.parseDouble((String)value); + e.v = (Amount)Amount.valueOf(d, e.v.getUnit()); + } + break; + } + } catch (Exception ex) { + ex.printStackTrace(); + } + Collections.sort(entries); + fireTableDataChanged(); + //f = new EditablePSRFuel(SaintRobertFuel.Type.NONSI); + f.clear(); + for (Entry en : entries) { + f.add(en.p, en.v); + } + f.firePropertyChange(new PropertyChangeEvent(f,"entries", null, null)); + + update(); + + } + + @Override + public void fireTableDataChanged() { + super.fireTableDataChanged(); + } + + }; + + private Vector entries = new Vector(); + JPanel controls; + final EditablePiecewiseLinearFuel f; + + public LinearFuelEditor(EditablePiecewiseLinearFuel f) { + super( f ); + this.f = f; + for ( Map.Entry, Amount> e : f.getEntries().entrySet() ){ + Entry n = new Entry(); + n.p = e.getKey(); + n.v = e.getValue(); + entries.add(n); + } + Collections.sort(entries); + } + + protected Component getBurnrateEditComponent(){ + final TM tm = new TM(); + + JSplitPane editBottom = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + + + JTable table = new JTable(tm); + JScrollPane scrollpane = new JScrollPane(table); + scrollpane.setMinimumSize(new Dimension(200, 200)); + editBottom.setTopComponent(scrollpane); + + + JButton add = new JButton("Add Data"); + add.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + entries.add(new Entry()); + tm.fireTableDataChanged(); + } + }); + controls = new JPanel(); + controls.setPreferredSize(new Dimension(200, 50)); + controls.setLayout(new FlowLayout()); + + controls.add(add); + + editBottom.setBottomComponent(controls); + + + + editBottom.setDividerLocation(.8); + + return editBottom; + } + + public static void main(String args[]) { + JFrame f = new JFrame(); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + f.setContentPane(new LinearFuelEditor(new EditablePiecewiseLinearFuel())); + f.setSize(800, 600); + f.setVisible(true); + + } + +} diff --git a/gui/fuel/SRFuelEditor.java b/gui/fuel/SRFuelEditor.java new file mode 100644 index 0000000..53e3dd4 --- /dev/null +++ b/gui/fuel/SRFuelEditor.java @@ -0,0 +1,223 @@ +package fuel; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.Collections; +import java.util.Vector; + +import javax.measure.quantity.Pressure; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JTable; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.table.AbstractTableModel; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.RocketScience; +import com.billkuker.rocketry.motorsim.fuel.SaintRobertFuel.Type; +import com.billkuker.rocketry.motorsim.fuel.editable.EditablePiecewiseSaintRobertFuel; + +public class SRFuelEditor extends AbstractFuelEditor { + private static final long serialVersionUID = 1L; + + private static final NumberFormat nf = new DecimalFormat("##########.###"); + + private class Entry implements Comparable { + Amount p = Amount.valueOf(0, RocketScience.UnitPreference.getUnitPreference().getPreferredUnit(RocketScience.PSI)); + double a; + double n; + + @Override + public int compareTo(Entry o) { + return p.compareTo(o.p); + } + } + + private class TM extends AbstractTableModel { + private static final long serialVersionUID = 1L; + + @Override + public int getColumnCount() { + return 3; + } + + @Override + public int getRowCount() { + return entries.size(); + } + + @Override + public String getColumnName(int col) { + switch (col) { + case 0: + return "Pressure"; + case 1: + return "Coefficient (a)"; + case 2: + return "Exponent (n)"; + } + return null; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + Entry e = entries.get(rowIndex); + switch (columnIndex) { + case 0: + //Format like 100 psi or 4.8 Mpa + return nf.format(e.p.doubleValue(e.p.getUnit())) + " " + e.p.getUnit(); + case 1: + return e.a; + case 2: + return e.n; + } + return null; + } + + public boolean isCellEditable(int row, int col) { + return true; + } + + @SuppressWarnings("unchecked") + public void setValueAt(Object value, int row, int col) { + Entry e = entries.get(row); + try { + switch (col) { + case 0: + try { + e.p = (Amount) Amount.valueOf((String) value); + } catch ( Exception ee ){ + double d = Double.parseDouble((String)value); + e.p = (Amount)Amount.valueOf(d, e.p.getUnit()); + } + break; + case 1: + e.a = Double.valueOf((String) value); + break; + case 2: + e.n = Double.valueOf((String) value); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + Collections.sort(entries); + fireTableDataChanged(); + //f = new EditablePSRFuel(SaintRobertFuel.Type.NONSI); + f.clear(); + for (Entry en : entries) { + f.add(en.p, en.a, en.n); + } + f.firePropertyChange(new PropertyChangeEvent(f,"entries", null, null)); + + update(); + + } + + @Override + public void fireTableDataChanged() { + super.fireTableDataChanged(); + } + + }; + + private Vector entries = new Vector(); + JPanel controls; + final EditablePiecewiseSaintRobertFuel f; + + public SRFuelEditor(EditablePiecewiseSaintRobertFuel f) { + super( f); + this.f = f; + + for ( Amount p : f.getAMap().keySet() ){ + Entry e = new Entry(); + e.a = f.getAMap().get(p); + e.n = f.getNMap().get(p); + entries.add(e); + } + Collections.sort(entries); + + } + + protected Component getBurnrateEditComponent(){ + final TM tm = new TM(); + + JSplitPane editBottom = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + + + JTable table = new JTable(tm); + JScrollPane scrollpane = new JScrollPane(table); + scrollpane.setMinimumSize(new Dimension(200, 200)); + editBottom.setTopComponent(scrollpane); + + + JButton add = new JButton("Add Data"); + add.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + entries.add(new Entry()); + tm.fireTableDataChanged(); + } + }); + controls = new JPanel(); + controls.setPreferredSize(new Dimension(200, 50)); + controls.setLayout(new FlowLayout()); + + controls.add(add); + + + final JRadioButton si, nonsi; + ButtonGroup type = new ButtonGroup(); + JPanel radio = new JPanel(); + radio.add(si = new JRadioButton("SI")); + radio.add(nonsi = new JRadioButton("NonSI")); + controls.add(radio); + type.add(si); + type.add(nonsi); + + si.setSelected(true); + + si.addChangeListener(new ChangeListener(){ + @Override + public void stateChanged(ChangeEvent e) { + if ( si.isSelected() ){ + System.err.println("SI"); + f.setType(Type.SI); + } else { + System.err.println("NONSI"); + f.setType(Type.NONSI); + } + update(); + }}); + + editBottom.setBottomComponent(controls); + + + + editBottom.setDividerLocation(.8); + + return editBottom; + } + + public static void main(String args[]) { + JFrame f = new JFrame(); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + f.setContentPane(new SRFuelEditor(new EditablePiecewiseSaintRobertFuel())); + f.setSize(800, 600); + f.setVisible(true); + + } + +}