1 package com.billkuker.rocketry.motorsim.visual.workbench;
\r
3 import java.awt.BorderLayout;
\r
4 import java.awt.FileDialog;
\r
5 import java.awt.event.ActionEvent;
\r
6 import java.awt.event.ActionListener;
\r
8 import java.io.FileInputStream;
\r
9 import java.io.FileOutputStream;
\r
10 import java.util.HashMap;
\r
11 import java.util.Vector;
\r
13 import javax.swing.ButtonGroup;
\r
14 import javax.swing.JFrame;
\r
15 import javax.swing.JMenu;
\r
16 import javax.swing.JMenuBar;
\r
17 import javax.swing.JMenuItem;
\r
18 import javax.swing.JOptionPane;
\r
19 import javax.swing.JPanel;
\r
20 import javax.swing.JRadioButtonMenuItem;
\r
21 import javax.swing.JSeparator;
\r
22 import javax.swing.JTabbedPane;
\r
23 import javax.swing.WindowConstants;
\r
25 import com.billkuker.rocketry.motorsim.Burn;
\r
26 import com.billkuker.rocketry.motorsim.Motor;
\r
27 import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference;
\r
28 import com.billkuker.rocketry.motorsim.fuel.FuelsEditor;
\r
29 import com.billkuker.rocketry.motorsim.io.ENGExporter;
\r
30 import com.billkuker.rocketry.motorsim.io.MotorIO;
\r
33 public class MotorWorkbench extends JFrame {
\r
34 private static final long serialVersionUID = 1L;
\r
37 private JTabbedPane motors;
\r
38 private MultiBurnChart mb;
\r
39 private JFrame allBurns;
\r
41 private JFrame fuelEditorFrame = new JFrame(){
\r
42 private static final long serialVersionUID = 1L;
\r
45 add(fuelEditor = new FuelsEditor(this));
\r
47 setJMenuBar(b = new JMenuBar());
\r
48 b.add(fuelEditor.getMenu());
\r
49 setTitle("MotorSim - Fuel Editor");
\r
52 private FuelsEditor fuelEditor;
\r
54 private HashMap<MotorEditor, File> e2f = new HashMap<MotorEditor, File>();
\r
55 private HashMap<File, MotorEditor> f2e = new HashMap<File, MotorEditor>();
\r
57 private HashMap<Motor, MotorEditor> m2e = new HashMap<Motor, MotorEditor>();
\r
59 public MotorWorkbench() {
\r
60 setTitle("MotorSim 1.0 RC1");
\r
63 top = new JPanel(new BorderLayout());
\r
64 setContentPane(top);
\r
66 mb = new MultiBurnChart();
\r
67 allBurns = new JFrame();
\r
68 allBurns.setTitle("All Burns");
\r
69 allBurns.setSize(800, 600);
\r
70 setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
\r
73 motors = new JTabbedPane();
\r
75 top.add(motors, BorderLayout.CENTER);
\r
77 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
\r
82 private void addMenu() {
\r
84 setJMenuBar(new JMenuBar() {
\r
85 private static final long serialVersionUID = 1L;
\r
88 add(new JMenu("File") {
\r
89 private static final long serialVersionUID = 1L;
\r
92 add(new JMenuItem("New Motor") {
\r
93 private static final long serialVersionUID = 1L;
\r
95 addActionListener(new ActionListener() {
\r
98 public void actionPerformed(ActionEvent arg0) {
\r
99 addMotor(MotorEditor.defaultMotor(), null);
\r
105 add(new JMenuItem("Open...") {
\r
106 private static final long serialVersionUID = 1L;
\r
108 addActionListener(new ActionListener() {
\r
110 public void actionPerformed(ActionEvent arg0) {
\r
112 final FileDialog fd = new FileDialog(MotorWorkbench.this, "Open Motor", FileDialog.LOAD);
\r
113 fd.setVisible(true);
\r
114 if ( fd.getFile() != null ) {
\r
115 File file = new File(fd.getDirectory() + fd.getFile());
\r
116 if (f2e.get(file) != null) {
\r
117 motors.setSelectedComponent(f2e
\r
123 .readMotor(new FileInputStream(file));
\r
126 } catch (Exception e) {
\r
127 JOptionPane.showMessageDialog(
\r
128 MotorWorkbench.this, e
\r
137 add(new JSeparator());
\r
139 add(new JMenuItem("Close Motor") {
\r
140 private static final long serialVersionUID = 1L;
\r
142 addActionListener(new ActionListener() {
\r
144 public void actionPerformed(ActionEvent ev) {
\r
145 MotorEditor e = (MotorEditor) motors
\r
146 .getSelectedComponent();
\r
148 f2e.remove(e2f.get(e));
\r
150 m2e.remove(e.getMotor());
\r
151 mb.removeBurn(e.burn);
\r
157 add(new JMenuItem("Save Motor") {
\r
158 private static final long serialVersionUID = 1L;
\r
160 addActionListener(new ActionListener() {
\r
162 public void actionPerformed(ActionEvent e) {
\r
163 MotorEditor m = (MotorEditor) motors
\r
164 .getSelectedComponent();
\r
165 File f = e2f.get(m);
\r
167 save(m.getMotor(), f);
\r
173 add(new JMenuItem("Save Motor As...") {
\r
174 private static final long serialVersionUID = 1L;
\r
176 addActionListener(new ActionListener() {
\r
178 public void actionPerformed(ActionEvent arg0) {
\r
180 final FileDialog fd = new FileDialog(MotorWorkbench.this, "Save Motor As", FileDialog.SAVE);
\r
181 fd.setVisible(true);
\r
182 if (fd.getFile() != null ) {
\r
183 File file = new File(fd.getDirectory() + fd.getFile());
\r
184 MotorEditor m = (MotorEditor) motors
\r
185 .getSelectedComponent();
\r
187 save(m.getMotor(), file);
\r
190 motors.setTitleAt(motors
\r
191 .getSelectedIndex(),
\r
193 // TODO Set tab title
\r
194 } catch (Exception e) {
\r
195 JOptionPane.showMessageDialog(
\r
196 MotorWorkbench.this, e
\r
206 add(new JSeparator());
\r
207 add(new JMenuItem("Export .ENG"){
\r
208 private static final long serialVersionUID = 1L;
\r
211 addActionListener(new ActionListener() {
\r
213 public void actionPerformed(ActionEvent arg0) {
\r
215 final FileDialog fd = new FileDialog(MotorWorkbench.this, "Export .ENG File", FileDialog.SAVE);
\r
216 fd.setFile("motorsim.eng");
\r
217 fd.setVisible(true);
\r
218 if (fd.getFile() != null ) {
\r
219 File file = new File(fd.getDirectory() + fd.getFile());
\r
220 Vector<Burn> bb = new Vector<Burn>();
\r
221 for( MotorEditor me : m2e.values() )
\r
224 ENGExporter.export(bb, file);
\r
225 } catch ( Exception e ){
\r
226 e.printStackTrace();
\r
235 add(new JMenu("Settings") {
\r
236 private static final long serialVersionUID = 1L;
\r
238 ButtonGroup units = new ButtonGroup();
\r
239 JRadioButtonMenuItem sci = new JRadioButtonMenuItem(
\r
241 JRadioButtonMenuItem nonsci = new JRadioButtonMenuItem(
\r
245 sci.setSelected(UnitPreference.getUnitPreference() == UnitPreference.SI);
\r
246 nonsci.setSelected(UnitPreference.getUnitPreference() == UnitPreference.NONSI);
\r
247 sci.addActionListener(new ActionListener() {
\r
248 public void actionPerformed(ActionEvent arg0) {
\r
250 .setUnitPreference(UnitPreference.SI);
\r
253 nonsci.addActionListener(new ActionListener() {
\r
254 public void actionPerformed(ActionEvent arg0) {
\r
256 .setUnitPreference(UnitPreference.NONSI);
\r
263 add(new JMenu("View") {
\r
264 private static final long serialVersionUID = 1L;
\r
266 add(new JMenuItem("All Motors Graph") {
\r
267 private static final long serialVersionUID = 1L;
\r
269 addActionListener(new ActionListener() {
\r
271 public void actionPerformed(ActionEvent arg0) {
\r
272 allBurns.setVisible(true);
\r
273 allBurns.toFront();
\r
278 add(new JMenuItem("Fuel Editor") {
\r
279 private static final long serialVersionUID = 1L;
\r
281 addActionListener(new ActionListener() {
\r
283 public void actionPerformed(ActionEvent arg0) {
\r
284 fuelEditorFrame.setVisible(true);
\r
285 fuelEditorFrame.toFront();
\r
298 private void save(Motor m, File f) {
\r
300 FileOutputStream fo;
\r
301 MotorIO.writeMotor(m, fo = new FileOutputStream(f));
\r
303 } catch (Throwable t) {
\r
304 JOptionPane.showMessageDialog(MotorWorkbench.this, t.getMessage());
\r
308 public void addMotor(Motor m, File f) {
\r
309 MotorEditor e = new MotorEditor(m);
\r
310 e.addBurnWatcher(mb);
\r
313 title = "New Motor";
\r
315 title = f.getName();
\r
320 motors.addTab(title, e);
\r