90c6800739640dfde9cae4166978983360140beb
[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         }\r
141 \r
142         @Override\r
143         public MotorEditor createEditor(Motor o) {\r
144                 return new MotorEditor(o);\r
145         }\r
146 \r
147         @Override\r
148         protected Motor loadFromFile(File f) throws IOException {\r
149                 return MotorIO.readMotor(new FileInputStream(f));\r
150         }\r
151 \r
152         @Override\r
153         protected void saveToFile(Motor o, File f) throws IOException {\r
154                 MotorIO.writeMotor(o, new FileOutputStream(f));\r
155         }\r
156         \r
157         private void openRocket(){\r
158                 final FileDialog fd = new FileDialog(frame, "Open Rocket...", FileDialog.LOAD);\r
159                 fd.setVisible(true);\r
160                 if ( fd.getFile() != null ) {\r
161                         File file = new File(fd.getDirectory() + fd.getFile());\r
162                         log.warn("Opening File " + file.getAbsolutePath());\r
163                         try {\r
164                                 rst.openRocket(file);\r
165                         } catch (RocketLoadException e) {\r
166                                 log.error(e);\r
167                         }\r
168                 }\r
169         }\r
170 \r
171         @Override\r
172         public JMenu getMenu() {\r
173                 JMenu ret = super.getMenu();\r
174                 ret.add(new JSeparator());\r
175                 \r
176                 ret.add(new JMenuItem("Open Rocket..."){\r
177                         private static final long serialVersionUID = 1L;\r
178                         {\r
179                                 addActionListener(new ActionListener() {\r
180                                         @Override\r
181                                         public void actionPerformed(ActionEvent ae) {\r
182                                                 log.debug("Open Rocksim...");\r
183                                                 openRocket();\r
184                                         }\r
185                                 });\r
186                         }\r
187                 });\r
188                 \r
189                 ret.add(new JSeparator());\r
190                 ret.add(new JMenu("Export"){\r
191                         private static final long serialVersionUID = 1L;\r
192                         {\r
193                                 add(new JMenuItem("Export .ENG") {\r
194                                         private static final long serialVersionUID = 1L;\r
195                                         {\r
196                                                 addActionListener(new ActionListener() {\r
197                                                         @Override\r
198                                                         public void actionPerformed(ActionEvent arg0) {\r
199 \r
200                                                                 final FileDialog fd = new FileDialog(frame,\r
201                                                                                 "Export .ENG File", FileDialog.SAVE);\r
202                                                                 fd.setFile("motorsim.eng");\r
203                                                                 fd.setVisible(true);\r
204                                                                 if (fd.getFile() != null) {\r
205                                                                         File file = new File(fd.getDirectory()\r
206                                                                                         + fd.getFile());\r
207                                                                         MotorEditor me = getSelectedEditor();\r
208                                                                         Vector<Burn> bb = new Vector<Burn>();\r
209                                                                         bb.add(me.burn);\r
210                                                                         try {\r
211                                                                                 ENGExporter.export(bb, file);\r
212                                                                         } catch (IOException e) {\r
213                                                                                 log.error(e);\r
214                                                                         }\r
215                                                                 }\r
216                                                         }\r
217                                                 });\r
218                                         }\r
219                                 });     \r
220                                 add(new JMenuItem("Export HTML to Clipboard") {\r
221                                         private static final long serialVersionUID = 1L;\r
222                                         {\r
223                                                 addActionListener(new ActionListener() {\r
224                                                         @Override\r
225                                                         public void actionPerformed(ActionEvent arg0) {\r
226                                                                 ByteArrayOutputStream out = new ByteArrayOutputStream();\r
227                                                                 MotorEditor me = getSelectedEditor();\r
228                                                                 try {\r
229                                                                         HTMLExporter.export(me.burn, out);\r
230                                                                         String html = new String(out.toByteArray());\r
231                                                                         Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();\r
232                                                                         clipboard.setContents( new StringSelection(html), null );\r
233                                                                         JOptionPane.showMessageDialog(MotorsEditor.this, "HTML Copied to Clipboard");\r
234                                                                 } catch (Exception e) {\r
235                                                                         \r
236                                                                 }\r
237                                                                 \r
238                                                         }\r
239                                                 });\r
240                                         }\r
241                                 });     \r
242                         }\r
243                 });\r
244                 return ret;\r
245         }\r
246 }\r