import java.awt.Dimension;\r
import java.awt.event.ActionEvent;\r
import java.awt.event.ActionListener;\r
+import java.awt.event.ComponentEvent;\r
+import java.awt.event.ComponentListener;\r
import java.awt.event.FocusEvent;\r
import java.awt.event.FocusListener;\r
import java.beans.PropertyChangeEvent;\r
import java.beans.PropertyChangeListener;\r
import java.beans.PropertyVetoException;\r
-import java.io.IOException;\r
+import java.util.Collection;\r
import java.util.HashMap;\r
+import java.util.List;\r
import java.util.Map;\r
import java.util.Vector;\r
\r
import javax.measure.unit.SI;\r
import javax.swing.Box;\r
import javax.swing.BoxLayout;\r
-import javax.swing.ComboBoxModel;\r
+import javax.swing.DefaultComboBoxModel;\r
import javax.swing.JButton;\r
import javax.swing.JComboBox;\r
import javax.swing.JFrame;\r
import javax.swing.WindowConstants;\r
\r
import org.apache.log4j.Logger;\r
-import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;\r
-import org.fife.ui.rsyntaxtextarea.SyntaxConstants;\r
import org.jscience.physics.amount.Amount;\r
\r
import com.billkuker.rocketry.motorsim.Burn;\r
import com.billkuker.rocketry.motorsim.Motor;\r
import com.billkuker.rocketry.motorsim.Nozzle;\r
import com.billkuker.rocketry.motorsim.RocketScience;\r
+import com.billkuker.rocketry.motorsim.cases.Schedule40;\r
import com.billkuker.rocketry.motorsim.fuel.KNSU;\r
import com.billkuker.rocketry.motorsim.grain.CSlot;\r
import com.billkuker.rocketry.motorsim.grain.CoredCylindricalGrain;\r
import com.billkuker.rocketry.motorsim.grain.Moonburner;\r
import com.billkuker.rocketry.motorsim.grain.MultiGrain;\r
import com.billkuker.rocketry.motorsim.grain.RodAndTubeGrain;\r
-import com.billkuker.rocketry.motorsim.io.MotorIO;\r
+import com.billkuker.rocketry.motorsim.grain.Star;\r
import com.billkuker.rocketry.motorsim.visual.BurnPanel;\r
import com.billkuker.rocketry.motorsim.visual.Editor;\r
import com.billkuker.rocketry.motorsim.visual.GrainPanel;\r
public class MotorEditor extends JTabbedPane implements PropertyChangeListener {\r
private static final long serialVersionUID = 1L;\r
private static Logger log = Logger.getLogger(MotorEditor.class);\r
- RSyntaxTextArea text = new RSyntaxTextArea();\r
Motor motor;\r
GrainEditor grainEditor;\r
BurnTab bt;\r
Burn burn;\r
\r
private Vector<BurnWatcher> burnWatchers = new Vector<BurnWatcher>();\r
- private ComboBoxModel availableFuels;\r
+ private DefaultComboBoxModel availableFuels = new DefaultComboBoxModel();\r
+ \r
+ public void addFuel(Fuel f){\r
+ availableFuels.addElement(f);\r
+ }\r
\r
//private static final int XML_TAB = 0;\r
private static final int CASING_TAB = 0;\r
private static final int GRAIN_TAB = 1;\r
private static final int BURN_TAB = 2;\r
\r
- @SuppressWarnings("unchecked")\r
- private Class[] grainTypes = { CoredCylindricalGrain.class, Finocyl.class,\r
- Moonburner.class, RodAndTubeGrain.class, CSlot.class, EndBurner.class };\r
+ private List<Class<? extends Grain>> grainTypes = new Vector<Class<? extends Grain>>();\r
+ {\r
+ grainTypes.add(CoredCylindricalGrain.class);\r
+ grainTypes.add(Finocyl.class);\r
+ grainTypes.add(Star.class);\r
+ grainTypes.add(Moonburner.class);\r
+ grainTypes.add(RodAndTubeGrain.class);\r
+ grainTypes.add(CSlot.class);\r
+ grainTypes.add(EndBurner.class);\r
+ }\r
\r
private abstract class Chooser<T> extends JPanel {\r
private static final long serialVersionUID = 1L;\r
- private Class<? extends T>[] types;\r
+ private List<Class<? extends T>> types;\r
private Map<Class<? extends T>, T> old = new HashMap<Class<? extends T>, T>();\r
\r
- public Chooser(T initial, Class<? extends T>... ts) {\r
+ @SuppressWarnings("unchecked")\r
+ public Chooser(T initial, List<Class<? extends T>> ts) {\r
types = ts;\r
if ( initial != null )\r
old.put((Class<? extends T>)initial.getClass(), initial);\r
SwingUtilities.invokeLater(new Thread() {\r
public void run() {\r
remove(bar);\r
+ remove(progress);\r
add(bp, BorderLayout.CENTER);\r
\r
for (BurnWatcher bw : burnWatchers)\r
}\r
}\r
\r
- private class CaseEditor extends JSplitPane {\r
+ private class CaseEditor extends JSplitPane implements ComponentListener {\r
private static final long serialVersionUID = 1L;\r
\r
public CaseEditor(Nozzle n, Chamber c) {\r
super(JSplitPane.VERTICAL_SPLIT);\r
setName("General Parameters");\r
+ this.addComponentListener(this);\r
\r
JPanel parts = new JPanel();\r
parts.setLayout(new BoxLayout(parts, BoxLayout.X_AXIS));\r
}\r
});\r
nameAndFuel.add(new JLabel("Fuel:"));\r
- nameAndFuel.add( new JComboBox(availableFuels){{\r
- setMinimumSize(new Dimension(200, 20));\r
- setMaximumSize(new Dimension(Short.MAX_VALUE, 20));\r
- addActionListener(new ActionListener(){\r
- @Override\r
- public void actionPerformed(ActionEvent e) {\r
- motor.setFuel((Fuel)getSelectedItem());\r
- System.out.println("FUEL CHANGED");\r
- }});\r
- }});\r
+ nameAndFuel.add( new JComboBox(availableFuels){\r
+ {\r
+ this.setSelectedItem(motor.getFuel());\r
+ }\r
+ private static final long serialVersionUID = 1L;\r
+ {\r
+ setMinimumSize(new Dimension(200, 20));\r
+ setMaximumSize(new Dimension(Short.MAX_VALUE, 20));\r
+ addActionListener(new ActionListener(){\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ motor.setFuel((Fuel)getSelectedItem());\r
+ System.out.println("FUEL CHANGED");\r
+ }});\r
+ }\r
+ });\r
nameAndFuel.add(Box.createVerticalGlue());\r
parts.add(nameAndFuel);\r
\r
.addPropertyChangeListener(MotorEditor.this);\r
}\r
}\r
- }\r
\r
- {\r
- text.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_XML);\r
+ @Override\r
+ public void componentHidden(ComponentEvent arg0) {\r
\r
+ }\r
+\r
+ @Override\r
+ public void componentMoved(ComponentEvent arg0) {\r
+\r
+ }\r
+\r
+ @Override\r
+ public void componentResized(ComponentEvent arg0) {\r
+ setResizeWeight(.5);\r
+ setDividerLocation(.5);\r
+ }\r
+\r
+ @Override\r
+ public void componentShown(ComponentEvent arg0) {\r
+\r
+ }\r
}\r
\r
- public MotorEditor(Motor m, ComboBoxModel fuels) {\r
+\r
+ public MotorEditor(Motor m, Collection<Fuel> fuels) {\r
super(JTabbedPane.BOTTOM);\r
- this.availableFuels = fuels;\r
- text.setName("XML");\r
- text.setEditable(false);\r
- //add(text, XML_TAB);\r
- setMotor(m, true);\r
+ for ( Fuel f : fuels )\r
+ addFuel(f);\r
+ setMotor(m);\r
}\r
\r
public Motor getMotor() {\r
return motor;\r
}\r
\r
- private void reText() {\r
- try {\r
- text.setText(MotorIO.writeMotor(motor));\r
- } catch (IOException e) {\r
- throw new Error(e);\r
- }\r
- }\r
\r
- private void setMotor(Motor m, boolean retext) {\r
+ private void setMotor(Motor m) {\r
if (motor != null)\r
motor.removePropertyChangeListener(this);\r
motor = m;\r
motor.addPropertyChangeListener(this);\r
- if (retext)\r
- reText();\r
if (grainEditor != null)\r
remove(grainEditor);\r
while (getTabCount() > 1)\r
add(bt = new BurnTab(), BURN_TAB);\r
}\r
\r
- @Deprecated\r
public static Motor defaultMotor() {\r
Motor m = new Motor();\r
m.setName("Example Motor");\r
c.setID(Amount.valueOf(30, SI.MILLIMETER));\r
m.setChamber(c);\r
\r
+ Schedule40 pvc = new Schedule40();\r
+ pvc.setLength(Amount.valueOf(200, SI.MILLIMETER));\r
+ m.setChamber(pvc);\r
+ \r
CoredCylindricalGrain g = new CoredCylindricalGrain();\r
try {\r
g.setLength(Amount.valueOf(70, SI.MILLIMETER));\r
} catch (PropertyVetoException v) {\r
throw new Error(v);\r
}\r
+ \r
\r
m.setGrain(new MultiGrain(g, 2));\r
\r
}\r
\r
public void propertyChange(PropertyChangeEvent evt) {\r
- reText();\r
// Dont re-burn for a name change!\r
if (!evt.getPropertyName().equals("Name")){\r
bt.reBurn();\r