Split out common fuel editor supertype for linear peicewise editor
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / workbench / AbstractFuelEditor.java
1 package com.billkuker.rocketry.motorsim.visual.workbench;\r
2 \r
3 import java.awt.Component;\r
4 \r
5 import javax.measure.quantity.Pressure;\r
6 import javax.measure.quantity.Velocity;\r
7 import javax.measure.quantity.VolumetricDensity;\r
8 import javax.measure.unit.SI;\r
9 import javax.swing.JSplitPane;\r
10 import javax.swing.SwingUtilities;\r
11 \r
12 import org.jscience.physics.amount.Amount;\r
13 \r
14 import com.billkuker.rocketry.motorsim.Fuel;\r
15 import com.billkuker.rocketry.motorsim.fuel.EditableCombustionProduct;\r
16 import com.billkuker.rocketry.motorsim.fuel.PiecewiseSaintRobertFuel;\r
17 import com.billkuker.rocketry.motorsim.visual.Chart;\r
18 import com.billkuker.rocketry.motorsim.visual.Editor;\r
19 \r
20 public abstract class AbstractFuelEditor  extends JSplitPane {\r
21         private static final long serialVersionUID = 1L;\r
22 \r
23         protected static class EditablePSRFuel extends PiecewiseSaintRobertFuel {\r
24 \r
25                 @SuppressWarnings("unchecked")\r
26                 private Amount<VolumetricDensity> idealDensity = (Amount<VolumetricDensity>) Amount\r
27                                 .valueOf("1 g/mm^3");\r
28                 \r
29                 private double combustionEfficiency = 1;\r
30                 private double densityRatio = 1;\r
31                 private EditableCombustionProduct cp;\r
32                 private String name = "New Fuel";\r
33 \r
34                 public EditablePSRFuel(Type t) {\r
35                         super(t);\r
36                         cp = new EditableCombustionProduct();\r
37                 }\r
38                 \r
39                 public void clear(){\r
40                         super.clear();\r
41                 }\r
42                 \r
43                 public void setType(Type t){\r
44                         super.setType(t);\r
45                 }\r
46 \r
47                 public void add(Amount<Pressure> p, final double _a, final double _n) {\r
48                         super.add(p, _a, _n);\r
49 \r
50                 }\r
51 \r
52                 public Amount<VolumetricDensity> getIdealDensity() {\r
53                         return idealDensity;\r
54                 }\r
55 \r
56                 public void setIdealDensity(Amount<VolumetricDensity> idealDensity) {\r
57                         this.idealDensity = idealDensity;\r
58                 }\r
59 \r
60                 public double getCombustionEfficiency() {\r
61                         return combustionEfficiency;\r
62                 }\r
63 \r
64                 public void setCombustionEfficiency(double combustionEfficiency) {\r
65                         this.combustionEfficiency = combustionEfficiency;\r
66                 }\r
67 \r
68                 public double getDensityRatio() {\r
69                         return densityRatio;\r
70                 }\r
71 \r
72                 public void setDensityRatio(double densityRatio) {\r
73                         this.densityRatio = densityRatio;\r
74                 }\r
75 \r
76                 @Override\r
77                 public CombustionProduct getCombustionProduct() {\r
78                         return cp;\r
79                 }\r
80 \r
81                 public String getName() {\r
82                         return name;\r
83                 }\r
84 \r
85                 public void setName(String name) {\r
86                         this.name = name;\r
87                 }\r
88 \r
89         }\r
90         \r
91         private final JSplitPane editParent;\r
92         private final JSplitPane editTop;\r
93         private final Fuel f;\r
94         private Chart<Pressure, Velocity> burnRate;\r
95         \r
96         public AbstractFuelEditor(Fuel f){\r
97                 super(HORIZONTAL_SPLIT);\r
98                 this.f = f;\r
99                 \r
100                 editTop = new JSplitPane(JSplitPane.VERTICAL_SPLIT);\r
101                 editTop.setTopComponent(new Editor(f));\r
102                 editTop.setBottomComponent(new Editor(f.getCombustionProduct()));\r
103                 \r
104                 editParent = new JSplitPane(JSplitPane.VERTICAL_SPLIT);\r
105                 setLeftComponent(editParent);\r
106                 editParent.setTopComponent(editTop);\r
107                 editParent.setBottomComponent(getBurnrateEditComponent());\r
108                 \r
109                 setResizeWeight(0);\r
110                 setDividerLocation(.3);\r
111                 editParent.setDividerLocation(.5);\r
112                 editTop.setDividerLocation(.5);\r
113                 editParent.resetToPreferredSizes();\r
114                 revalidate();\r
115 \r
116                 update();\r
117         }\r
118         \r
119         protected abstract Component getBurnrateEditComponent();\r
120         \r
121         public Fuel getFuel(){\r
122                 return f;\r
123         }\r
124         \r
125 \r
126 \r
127         protected void update() {\r
128                 SwingUtilities.invokeLater(new Runnable() {\r
129 \r
130                         @Override\r
131                         public void run() {\r
132                                 editTop.setTopComponent(new Editor(f));\r
133                                 editTop.setBottomComponent(new Editor(f.getCombustionProduct()));\r
134                                 if (burnRate != null)\r
135                                         AbstractFuelEditor.this.remove(burnRate);\r
136                                 try {\r
137                                         burnRate = new Chart<Pressure, Velocity>(\r
138                                                         SI.MEGA(SI.PASCAL), SI.MILLIMETER.divide(SI.SECOND)\r
139                                                                         .asType(Velocity.class), f, "burnRate");\r
140                                 } catch (NoSuchMethodException e) {\r
141                                         throw new Error(e);\r
142                                 }\r
143                                 burnRate.setDomain(burnRate.new IntervalDomain(Amount.valueOf(\r
144                                                 0, SI.MEGA(SI.PASCAL)), Amount.valueOf(11, SI\r
145                                                 .MEGA(SI.PASCAL)), 50));\r
146                                 AbstractFuelEditor.this.setRightComponent(burnRate);\r
147                                 AbstractFuelEditor.this.revalidate();\r
148                         }\r
149                 });\r
150         }\r
151         \r
152 }\r