d2e7fd4772537330578d38f2b65136b232af39b2
[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         }\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 (RocketLoadException 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