Updates to keep up with rocksim. MotorDB Broken
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / workbench / MotorsEditor.java
1 package com.billkuker.rocketry.motorsim.visual.workbench;\r
2 \r
3 import java.awt.FileDialog;\r
4 import java.awt.Toolkit;\r
5 import java.awt.datatransfer.Clipboard;\r
6 import java.awt.datatransfer.StringSelection;\r
7 import java.awt.event.ActionEvent;\r
8 import java.awt.event.ActionListener;\r
9 import java.awt.event.WindowEvent;\r
10 import java.awt.event.WindowListener;\r
11 import java.io.ByteArrayOutputStream;\r
12 import java.io.File;\r
13 import java.io.FileInputStream;\r
14 import java.io.FileOutputStream;\r
15 import java.io.IOException;\r
16 import java.util.Vector;\r
17 \r
18 import javax.swing.JFrame;\r
19 import javax.swing.JMenu;\r
20 import javax.swing.JMenuItem;\r
21 import javax.swing.JOptionPane;\r
22 import javax.swing.JScrollPane;\r
23 import javax.swing.JSeparator;\r
24 import javax.swing.JTabbedPane;\r
25 \r
26 import org.apache.log4j.Logger;\r
27 \r
28 import com.billkuker.rocketry.motorsim.Burn;\r
29 import com.billkuker.rocketry.motorsim.Motor;\r
30 import com.billkuker.rocketry.motorsim.io.ENGExporter;\r
31 import com.billkuker.rocketry.motorsim.io.HTMLExporter;\r
32 import com.billkuker.rocketry.motorsim.io.MotorIO;\r
33 import com.billkuker.rocketry.motorsim.visual.MultiObjectEditor;\r
34 import com.billkuker.rocketry.motorsim.visual.RememberJFrame;\r
35 import com.billkuker.rocketry.motorsim.visual.openRocket.RocketSimTable;\r
36 \r
37 public class MotorsEditor extends MultiObjectEditor<Motor, MotorEditor> {\r
38         private static Logger log = Logger.getLogger(MotorsEditor.class);\r
39                         \r
40         private static final long serialVersionUID = 1L;\r
41 \r
42         MultiMotorThrustChart mbc = new MultiMotorThrustChart();\r
43         MultiMotorPressureChart mpc = new MultiMotorPressureChart();\r
44         JScrollPane mmtScroll;\r
45         MultiMotorTable mmt = new MultiMotorTable();\r
46         RocketSimTable rst = new RocketSimTable();\r
47 \r
48         JFrame detached;\r
49         JTabbedPane detachedTabs;\r
50 \r
51         public MotorsEditor(JFrame f) {\r
52                 super(f, "Motor");\r
53 \r
54                 mmtScroll = new JScrollPane(mmt);\r
55                 \r
56 \r
57 \r
58                 addCreator(new ObjectCreator() {\r
59                         @Override\r
60                         public Motor newObject() {\r
61                                 return MotorEditor.defaultMotor();\r
62                         }\r
63 \r
64                         @Override\r
65                         public String getName() {\r
66                                 return "Motor";\r
67                         }\r
68                 });\r
69 \r
70                 detached = new RememberJFrame(800,600){\r
71                         private static final long serialVersionUID = 1L;\r
72                 };\r
73                 detached.setIconImage(MotorWorkbench.getIcon());\r
74                 detached.setTitle(MotorWorkbench.name + " - All Motors");\r
75                 detached.setContentPane(detachedTabs = new JTabbedPane());\r
76 \r
77                 detached.addWindowListener(new WindowListener() {\r
78                         @Override\r
79                         public void windowClosing(WindowEvent arg0) {\r
80                                 attach();\r
81                         }\r
82                         @Override\r
83                         public void windowOpened(WindowEvent arg0) {}\r
84                         @Override\r
85                         public void windowIconified(WindowEvent arg0) {}\r
86                         @Override\r
87                         public void windowDeiconified(WindowEvent arg0) {}\r
88                         @Override\r
89                         public void windowDeactivated(WindowEvent arg0) {}\r
90                         @Override\r
91                         public void windowClosed(WindowEvent arg0) {}\r
92                         @Override\r
93                         public void windowActivated(WindowEvent arg0) {}\r
94                 });\r
95                 attach();\r
96         }\r
97 \r
98         public void attach() {\r
99                 detachedTabs.remove(mbc);\r
100                 detachedTabs.remove(mpc);\r
101                 detachedTabs.remove(mmtScroll);\r
102                 detachedTabs.remove(rst);\r
103                 insertTab("All Motors", null, mmtScroll, null, 0);\r
104                 insertTab("All Thrust", null, mbc, null, 1);\r
105                 insertTab("All Pressure", null, mpc, null, 2);\r
106                 insertTab("Flight Sims", null, rst, null, 3);\r
107                 detached.setVisible(false);\r
108         }\r
109         \r
110         public void detach() {\r
111                 if (detached.isVisible())\r
112                         return;\r
113                 remove(mbc);\r
114                 remove(mpc);\r
115                 remove(mmtScroll);\r
116                 remove(rst);\r
117                 detachedTabs.addTab("All Motors",mmtScroll);\r
118                 detachedTabs.addTab("All Thrust", mbc);\r
119                 detachedTabs.addTab("All Pressure", mpc);\r
120                 detachedTabs.addTab("Flight Sims", rst);\r
121                 detached.setVisible(true);\r
122         }\r
123 \r
124         @Override\r
125         protected void objectAdded(Motor m, MotorEditor e) {\r
126                 e.addBurnWatcher(mbc);\r
127                 e.addBurnWatcher(mpc);\r
128                 e.addBurnWatcher(mmt);\r
129                 e.addBurnWatcher(rst);\r
130         }\r
131 \r
132         @Override\r
133         protected void objectRemoved(Motor m, MotorEditor e) {\r
134                 mbc.removeBurn(e.burn);\r
135                 mpc.removeBurn(e.burn);\r
136                 mmt.removeBurn(e.burn);\r
137                 rst.replace(e.burn, null);\r
138                 e.closed = true;\r
139         }\r
140 \r
141         @Override\r
142         public MotorEditor createEditor(Motor o) {\r
143                 return new MotorEditor(o);\r
144         }\r
145 \r
146         @Override\r
147         protected Motor loadFromFile(File f) throws IOException {\r
148                 return MotorIO.readMotor(new FileInputStream(f));\r
149         }\r
150 \r
151         @Override\r
152         protected void saveToFile(Motor o, File f) throws IOException {\r
153                 MotorIO.writeMotor(o, new FileOutputStream(f));\r
154         }\r
155         \r
156         private void openRocket(){\r
157                 final FileDialog fd = new FileDialog(frame, "Open Rocket...", FileDialog.LOAD);\r
158                 fd.setVisible(true);\r
159                 if ( fd.getFile() != null ) {\r
160                         File file = new File(fd.getDirectory() + fd.getFile());\r
161                         log.warn("Opening File " + file.getAbsolutePath());\r
162                         try {\r
163                                 rst.openRocket(file);\r
164                         } catch (Exception e) {\r
165                                 log.error(e);\r
166                         }\r
167                 }\r
168         }\r
169 \r
170         @Override\r
171         public JMenu getMenu() {\r
172                 JMenu ret = super.getMenu();\r
173                 ret.add(new JSeparator());\r
174                 \r
175                 ret.add(new JMenuItem("Open Rocket..."){\r
176                         private static final long serialVersionUID = 1L;\r
177                         {\r
178                                 addActionListener(new ActionListener() {\r
179                                         @Override\r
180                                         public void actionPerformed(ActionEvent ae) {\r
181                                                 log.debug("Open Rocksim...");\r
182                                                 openRocket();\r
183                                         }\r
184                                 });\r
185                         }\r
186                 });\r
187                 \r
188                 ret.add(new JSeparator());\r
189                 ret.add(new JMenu("Export"){\r
190                         private static final long serialVersionUID = 1L;\r
191                         {\r
192                                 add(new JMenuItem("Export .ENG") {\r
193                                         private static final long serialVersionUID = 1L;\r
194                                         {\r
195                                                 addActionListener(new ActionListener() {\r
196                                                         @Override\r
197                                                         public void actionPerformed(ActionEvent arg0) {\r
198 \r
199                                                                 final FileDialog fd = new FileDialog(frame,\r
200                                                                                 "Export .ENG File", FileDialog.SAVE);\r
201                                                                 fd.setFile("motorsim.eng");\r
202                                                                 fd.setVisible(true);\r
203                                                                 if (fd.getFile() != null) {\r
204                                                                         File file = new File(fd.getDirectory()\r
205                                                                                         + fd.getFile());\r
206                                                                         MotorEditor me = getSelectedEditor();\r
207                                                                         Vector<Burn> bb = new Vector<Burn>();\r
208                                                                         bb.add(me.burn);\r
209                                                                         try {\r
210                                                                                 ENGExporter.export(bb, file);\r
211                                                                         } catch (IOException e) {\r
212                                                                                 log.error(e);\r
213                                                                         }\r
214                                                                 }\r
215                                                         }\r
216                                                 });\r
217                                         }\r
218                                 });     \r
219                                 add(new JMenuItem("Export HTML to Clipboard") {\r
220                                         private static final long serialVersionUID = 1L;\r
221                                         {\r
222                                                 addActionListener(new ActionListener() {\r
223                                                         @Override\r
224                                                         public void actionPerformed(ActionEvent arg0) {\r
225                                                                 ByteArrayOutputStream out = new ByteArrayOutputStream();\r
226                                                                 MotorEditor me = getSelectedEditor();\r
227                                                                 try {\r
228                                                                         HTMLExporter.export(me.burn, out);\r
229                                                                         String html = new String(out.toByteArray());\r
230                                                                         Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();\r
231                                                                         clipboard.setContents( new StringSelection(html), null );\r
232                                                                         JOptionPane.showMessageDialog(MotorsEditor.this, "HTML Copied to Clipboard");\r
233                                                                 } catch (Exception e) {\r
234                                                                         \r
235                                                                 }\r
236                                                                 \r
237                                                         }\r
238                                                 });\r
239                                         }\r
240                                 });     \r
241                         }\r
242                 });\r
243                 return ret;\r
244         }\r
245 }\r