More Fuel work
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / workbench / MotorWorkbench.java
1 package com.billkuker.rocketry.motorsim.visual.workbench;\r
2 \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
7 import java.io.File;\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
12 \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
24 \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
31 \r
32 \r
33 public class MotorWorkbench extends JFrame {\r
34         private static final long serialVersionUID = 1L;\r
35         \r
36         private JPanel top;\r
37         private JTabbedPane motors;\r
38         private MultiBurnChart mb;\r
39         private JFrame allBurns;\r
40         \r
41         private JFrame fuelEditorFrame = new JFrame(){\r
42                 private static final long serialVersionUID = 1L;\r
43                 {\r
44                         setSize(1024, 768);\r
45                         add(fuelEditor = new FuelsEditor(this));\r
46                         JMenuBar b;\r
47                         setJMenuBar(b = new JMenuBar());\r
48                         b.add(fuelEditor.getMenu());\r
49                         setTitle("MotorSim - Fuel Editor");\r
50                 }\r
51         };\r
52         private FuelsEditor fuelEditor;\r
53 \r
54         private HashMap<MotorEditor, File> e2f = new HashMap<MotorEditor, File>();\r
55         private HashMap<File, MotorEditor> f2e = new HashMap<File, MotorEditor>();\r
56 \r
57         private HashMap<Motor, MotorEditor> m2e = new HashMap<Motor, MotorEditor>();\r
58         \r
59         public MotorWorkbench() {\r
60                 setTitle("MotorSim 1.0 RC1");\r
61                 addMenu();\r
62                 setSize(1024, 768);\r
63                 top = new JPanel(new BorderLayout());\r
64                 setContentPane(top);\r
65                 \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
71                 allBurns.add(mb);\r
72 \r
73                 motors = new JTabbedPane();\r
74                 \r
75                 top.add(motors, BorderLayout.CENTER);\r
76 \r
77                 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);\r
78                 setVisible(true);\r
79 \r
80         }\r
81 \r
82         private void addMenu() {\r
83 \r
84                 setJMenuBar(new JMenuBar() {\r
85                         private static final long serialVersionUID = 1L;\r
86 \r
87                         {\r
88                                 add(new JMenu("File") {\r
89                                         private static final long serialVersionUID = 1L;\r
90 \r
91                                         {\r
92                                                 add(new JMenuItem("New Motor") {\r
93                                                         private static final long serialVersionUID = 1L;\r
94                                                         {\r
95                                                                 addActionListener(new ActionListener() {\r
96 \r
97                                                                         @Override\r
98                                                                         public void actionPerformed(ActionEvent arg0) {\r
99                                                                                 addMotor(MotorEditor.defaultMotor(), null);\r
100                                                                         }\r
101                                                                 });\r
102 \r
103                                                         }\r
104                                                 });\r
105                                                 add(new JMenuItem("Open...") {\r
106                                                         private static final long serialVersionUID = 1L;\r
107                                                         {\r
108                                                                 addActionListener(new ActionListener() {\r
109                                                                         @Override\r
110                                                                         public void actionPerformed(ActionEvent arg0) {\r
111 \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
118                                                                                                                 .get(file));\r
119                                                                                                 return;\r
120                                                                                         }\r
121                                                                                         try {\r
122                                                                                                 Motor m = MotorIO\r
123                                                                                                                 .readMotor(new FileInputStream(file));\r
124                                                                                                 addMotor(m, file);\r
125                                                                                                 \r
126                                                                                         } catch (Exception e) {\r
127                                                                                                 JOptionPane.showMessageDialog(\r
128                                                                                                                 MotorWorkbench.this, e\r
129                                                                                                                                 .getMessage());\r
130                                                                                         }\r
131                                                                                 }\r
132                                                                         }\r
133                                                                 });\r
134                                                         }\r
135                                                 });\r
136                                                 \r
137                                                 add(new JSeparator());\r
138                                                 \r
139                                                 add(new JMenuItem("Close Motor") {\r
140                                                         private static final long serialVersionUID = 1L;\r
141                                                         {\r
142                                                                 addActionListener(new ActionListener() {\r
143                                                                         @Override\r
144                                                                         public void actionPerformed(ActionEvent ev) {\r
145                                                                                 MotorEditor e = (MotorEditor) motors\r
146                                                                                                 .getSelectedComponent();\r
147                                                                                 motors.remove(e);\r
148                                                                                 f2e.remove(e2f.get(e));\r
149                                                                                 e2f.remove(e);\r
150                                                                                 m2e.remove(e.getMotor());\r
151                                                                                 mb.removeBurn(e.burn);\r
152                                                                         }\r
153                                                                 });\r
154                                                         }\r
155                                                 });\r
156                                                 \r
157                                                 add(new JMenuItem("Save Motor") {\r
158                                                         private static final long serialVersionUID = 1L;\r
159                                                         {\r
160                                                                 addActionListener(new ActionListener() {\r
161                                                                         @Override\r
162                                                                         public void actionPerformed(ActionEvent e) {\r
163                                                                                 MotorEditor m = (MotorEditor) motors\r
164                                                                                                 .getSelectedComponent();\r
165                                                                                 File f = e2f.get(m);\r
166                                                                                 if (f != null)\r
167                                                                                         save(m.getMotor(), f);\r
168 \r
169                                                                         }\r
170                                                                 });\r
171                                                         }\r
172                                                 });\r
173                                                 add(new JMenuItem("Save Motor As...") {\r
174                                                         private static final long serialVersionUID = 1L;\r
175                                                         {\r
176                                                                 addActionListener(new ActionListener() {\r
177                                                                         @Override\r
178                                                                         public void actionPerformed(ActionEvent arg0) {\r
179 \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
186                                                                                         try {\r
187                                                                                                 save(m.getMotor(), file);\r
188                                                                                                 e2f.put(m, file);\r
189                                                                                                 f2e.put(file, m);\r
190                                                                                                 motors.setTitleAt(motors\r
191                                                                                                                 .getSelectedIndex(),\r
192                                                                                                                 file.getName());\r
193                                                                                                 // TODO Set tab title\r
194                                                                                         } catch (Exception e) {\r
195                                                                                                 JOptionPane.showMessageDialog(\r
196                                                                                                                 MotorWorkbench.this, e\r
197                                                                                                                                 .getMessage());\r
198                                                                                         }\r
199                                                                                 }\r
200                                                                         }\r
201                                                                 });\r
202                                                         }\r
203                                                 });\r
204                                                 \r
205 \r
206                                                 add(new JSeparator());\r
207                                                 add(new JMenuItem("Export .ENG"){\r
208                                                         private static final long serialVersionUID = 1L;\r
209 \r
210                                                         {\r
211                                                                 addActionListener(new ActionListener() {\r
212                                                                         @Override\r
213                                                                         public void actionPerformed(ActionEvent arg0) {\r
214 \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
222                                                                                                 bb.add(me.burn);\r
223                                                                                         try{\r
224                                                                                                 ENGExporter.export(bb, file);\r
225                                                                                         } catch ( Exception e ){\r
226                                                                                                 e.printStackTrace();\r
227                                                                                         }\r
228                                                                                 }\r
229                                                                         }\r
230                                                                 });\r
231                                                         }\r
232                                                 });\r
233                                         }\r
234                                 });\r
235                                 add(new JMenu("Settings") {\r
236                                         private static final long serialVersionUID = 1L;\r
237                                         {\r
238                                                 ButtonGroup units = new ButtonGroup();\r
239                                                 JRadioButtonMenuItem sci = new JRadioButtonMenuItem(\r
240                                                                 "SI");\r
241                                                 JRadioButtonMenuItem nonsci = new JRadioButtonMenuItem(\r
242                                                                 "NonSI");\r
243                                                 units.add(sci);\r
244                                                 units.add(nonsci);\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
249                                                                 UnitPreference\r
250                                                                                 .setUnitPreference(UnitPreference.SI);\r
251                                                         }\r
252                                                 });\r
253                                                 nonsci.addActionListener(new ActionListener() {\r
254                                                         public void actionPerformed(ActionEvent arg0) {\r
255                                                                 UnitPreference\r
256                                                                                 .setUnitPreference(UnitPreference.NONSI);\r
257                                                         }\r
258                                                 });\r
259                                                 add(sci);\r
260                                                 add(nonsci);\r
261                                         }\r
262                                 });\r
263                                 add(new JMenu("View") {\r
264                                         private static final long serialVersionUID = 1L;\r
265                                         {\r
266                                                 add(new JMenuItem("All Motors Graph") {\r
267                                                         private static final long serialVersionUID = 1L;\r
268                                                         {\r
269                                                                 addActionListener(new ActionListener() {\r
270                                                                         @Override\r
271                                                                         public void actionPerformed(ActionEvent arg0) {\r
272                                                                                 allBurns.setVisible(true);\r
273                                                                                 allBurns.toFront();\r
274                                                                         }\r
275                                                                 });\r
276                                                         }\r
277                                                 });\r
278                                                 add(new JMenuItem("Fuel Editor") {\r
279                                                         private static final long serialVersionUID = 1L;\r
280                                                         {\r
281                                                                 addActionListener(new ActionListener() {\r
282                                                                         @Override\r
283                                                                         public void actionPerformed(ActionEvent arg0) {\r
284                                                                                 fuelEditorFrame.setVisible(true);\r
285                                                                                 fuelEditorFrame.toFront();\r
286                                                                         }\r
287                                                                 });\r
288                                                         }\r
289                                                 });\r
290                                         }\r
291                                 });\r
292                         }\r
293                 });\r
294         }\r
295 \r
296         \r
297 \r
298         private void save(Motor m, File f) {\r
299                 try {\r
300                         FileOutputStream fo;\r
301                         MotorIO.writeMotor(m, fo = new FileOutputStream(f));\r
302                         fo.close();\r
303                 } catch (Throwable t) {\r
304                         JOptionPane.showMessageDialog(MotorWorkbench.this, t.getMessage());\r
305                 }\r
306         }\r
307 \r
308         public void addMotor(Motor m, File f) {\r
309                 MotorEditor e = new MotorEditor(m);\r
310                 e.addBurnWatcher(mb);\r
311                 String title;\r
312                 if (f == null) {\r
313                         title = "New Motor";\r
314                 } else {\r
315                         title = f.getName();\r
316                         e2f.put(e, f);\r
317                         f2e.put(f, e);\r
318                 }\r
319                 m2e.put(m, e);\r
320                 motors.addTab(title, e);\r
321         }\r
322 \r
323         \r
324 }\r