+package com.billkuker.rocketry.motorsim.visual.workbench;\r
+\r
+import java.awt.Component;\r
+\r
+import javax.measure.quantity.Pressure;\r
+import javax.measure.quantity.Velocity;\r
+import javax.measure.quantity.VolumetricDensity;\r
+import javax.measure.unit.SI;\r
+import javax.swing.JSplitPane;\r
+import javax.swing.SwingUtilities;\r
+\r
+import org.jscience.physics.amount.Amount;\r
+\r
+import com.billkuker.rocketry.motorsim.Fuel;\r
+import com.billkuker.rocketry.motorsim.fuel.EditableCombustionProduct;\r
+import com.billkuker.rocketry.motorsim.fuel.PiecewiseSaintRobertFuel;\r
+import com.billkuker.rocketry.motorsim.visual.Chart;\r
+import com.billkuker.rocketry.motorsim.visual.Editor;\r
+\r
+public abstract class AbstractFuelEditor extends JSplitPane {\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ protected static class EditablePSRFuel extends PiecewiseSaintRobertFuel {\r
+\r
+ @SuppressWarnings("unchecked")\r
+ private Amount<VolumetricDensity> idealDensity = (Amount<VolumetricDensity>) Amount\r
+ .valueOf("1 g/mm^3");\r
+ \r
+ private double combustionEfficiency = 1;\r
+ private double densityRatio = 1;\r
+ private EditableCombustionProduct cp;\r
+ private String name = "New Fuel";\r
+\r
+ public EditablePSRFuel(Type t) {\r
+ super(t);\r
+ cp = new EditableCombustionProduct();\r
+ }\r
+ \r
+ public void clear(){\r
+ super.clear();\r
+ }\r
+ \r
+ public void setType(Type t){\r
+ super.setType(t);\r
+ }\r
+\r
+ public void add(Amount<Pressure> p, final double _a, final double _n) {\r
+ super.add(p, _a, _n);\r
+\r
+ }\r
+\r
+ public Amount<VolumetricDensity> getIdealDensity() {\r
+ return idealDensity;\r
+ }\r
+\r
+ public void setIdealDensity(Amount<VolumetricDensity> idealDensity) {\r
+ this.idealDensity = idealDensity;\r
+ }\r
+\r
+ public double getCombustionEfficiency() {\r
+ return combustionEfficiency;\r
+ }\r
+\r
+ public void setCombustionEfficiency(double combustionEfficiency) {\r
+ this.combustionEfficiency = combustionEfficiency;\r
+ }\r
+\r
+ public double getDensityRatio() {\r
+ return densityRatio;\r
+ }\r
+\r
+ public void setDensityRatio(double densityRatio) {\r
+ this.densityRatio = densityRatio;\r
+ }\r
+\r
+ @Override\r
+ public CombustionProduct getCombustionProduct() {\r
+ return cp;\r
+ }\r
+\r
+ public String getName() {\r
+ return name;\r
+ }\r
+\r
+ public void setName(String name) {\r
+ this.name = name;\r
+ }\r
+\r
+ }\r
+ \r
+ private final JSplitPane editParent;\r
+ private final JSplitPane editTop;\r
+ private final Fuel f;\r
+ private Chart<Pressure, Velocity> burnRate;\r
+ \r
+ public AbstractFuelEditor(Fuel f){\r
+ super(HORIZONTAL_SPLIT);\r
+ this.f = f;\r
+ \r
+ editTop = new JSplitPane(JSplitPane.VERTICAL_SPLIT);\r
+ editTop.setTopComponent(new Editor(f));\r
+ editTop.setBottomComponent(new Editor(f.getCombustionProduct()));\r
+ \r
+ editParent = new JSplitPane(JSplitPane.VERTICAL_SPLIT);\r
+ setLeftComponent(editParent);\r
+ editParent.setTopComponent(editTop);\r
+ editParent.setBottomComponent(getBurnrateEditComponent());\r
+ \r
+ setResizeWeight(0);\r
+ setDividerLocation(.3);\r
+ editParent.setDividerLocation(.5);\r
+ editTop.setDividerLocation(.5);\r
+ editParent.resetToPreferredSizes();\r
+ revalidate();\r
+\r
+ update();\r
+ }\r
+ \r
+ protected abstract Component getBurnrateEditComponent();\r
+ \r
+ public Fuel getFuel(){\r
+ return f;\r
+ }\r
+ \r
+\r
+\r
+ protected void update() {\r
+ SwingUtilities.invokeLater(new Runnable() {\r
+\r
+ @Override\r
+ public void run() {\r
+ editTop.setTopComponent(new Editor(f));\r
+ editTop.setBottomComponent(new Editor(f.getCombustionProduct()));\r
+ if (burnRate != null)\r
+ AbstractFuelEditor.this.remove(burnRate);\r
+ try {\r
+ burnRate = new Chart<Pressure, Velocity>(\r
+ SI.MEGA(SI.PASCAL), SI.MILLIMETER.divide(SI.SECOND)\r
+ .asType(Velocity.class), f, "burnRate");\r
+ } catch (NoSuchMethodException e) {\r
+ throw new Error(e);\r
+ }\r
+ burnRate.setDomain(burnRate.new IntervalDomain(Amount.valueOf(\r
+ 0, SI.MEGA(SI.PASCAL)), Amount.valueOf(11, SI\r
+ .MEGA(SI.PASCAL)), 50));\r
+ AbstractFuelEditor.this.setRightComponent(burnRate);\r
+ AbstractFuelEditor.this.revalidate();\r
+ }\r
+ });\r
+ }\r
+ \r
+}\r