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