Make all-views detachable
[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.event.ActionEvent;\r
5 import java.awt.event.ActionListener;\r
6 import java.awt.event.WindowEvent;\r
7 import java.awt.event.WindowListener;\r
8 import java.io.File;\r
9 import java.io.FileInputStream;\r
10 import java.io.FileOutputStream;\r
11 import java.io.IOException;\r
12 import java.util.Vector;\r
13 \r
14 import javax.swing.JFrame;\r
15 import javax.swing.JMenu;\r
16 import javax.swing.JMenuItem;\r
17 import javax.swing.JScrollPane;\r
18 import javax.swing.JSeparator;\r
19 import javax.swing.JTabbedPane;\r
20 \r
21 import com.billkuker.rocketry.motorsim.Burn;\r
22 import com.billkuker.rocketry.motorsim.Motor;\r
23 import com.billkuker.rocketry.motorsim.io.ENGExporter;\r
24 import com.billkuker.rocketry.motorsim.io.MotorIO;\r
25 import com.billkuker.rocketry.motorsim.visual.MultiObjectEditor;\r
26 \r
27 public class MotorsEditor extends MultiObjectEditor<Motor, MotorEditor> {\r
28         private static final long serialVersionUID = 1L;\r
29 \r
30         MultiMotorThrustChart mbc = new MultiMotorThrustChart();\r
31         MultiMotorPressureChart mpc = new MultiMotorPressureChart();\r
32         JScrollPane mmtScroll;\r
33         MultiMotorTable mmt = new MultiMotorTable();\r
34 \r
35         JFrame detached;\r
36         JTabbedPane detachedTabs;\r
37 \r
38         public MotorsEditor(JFrame f) {\r
39                 super(f, "Motor");\r
40 \r
41                 mmtScroll = new JScrollPane(mmt);\r
42                 \r
43 \r
44 \r
45                 addCreator(new ObjectCreator() {\r
46                         @Override\r
47                         public Motor newObject() {\r
48                                 return MotorEditor.defaultMotor();\r
49                         }\r
50 \r
51                         @Override\r
52                         public String getName() {\r
53                                 return "Motor";\r
54                         }\r
55                 });\r
56 \r
57                 detached = new JFrame();\r
58                 detached.setSize(800, 600);\r
59                 detached.setTitle(MotorWorkbench.name + " - All Motors");\r
60                 detached.setContentPane(detachedTabs = new JTabbedPane());\r
61 \r
62                 detached.addWindowListener(new WindowListener() {\r
63                         @Override\r
64                         public void windowClosing(WindowEvent arg0) {\r
65                                 attach();\r
66                         }\r
67                         @Override\r
68                         public void windowOpened(WindowEvent arg0) {}\r
69                         @Override\r
70                         public void windowIconified(WindowEvent arg0) {}\r
71                         @Override\r
72                         public void windowDeiconified(WindowEvent arg0) {}\r
73                         @Override\r
74                         public void windowDeactivated(WindowEvent arg0) {}\r
75                         @Override\r
76                         public void windowClosed(WindowEvent arg0) {}\r
77                         @Override\r
78                         public void windowActivated(WindowEvent arg0) {}\r
79                 });\r
80                 attach();\r
81         }\r
82 \r
83         public void attach() {\r
84                 detachedTabs.remove(mbc);\r
85                 detachedTabs.remove(mpc);\r
86                 detachedTabs.remove(mmtScroll);\r
87                 insertTab("All Motors", null, mmtScroll, null, 0);\r
88                 insertTab("All Thrust", null, mbc, null, 1);\r
89                 insertTab("All Pressure", null, mpc, null, 2);\r
90                 detached.setVisible(false);\r
91         }\r
92         \r
93         public void detach() {\r
94                 if (detached.isVisible())\r
95                         return;\r
96                 remove(mbc);\r
97                 remove(mpc);\r
98                 remove(mmtScroll);\r
99                 detachedTabs.addTab("All Motors",mmtScroll);\r
100                 detachedTabs.addTab("All Thrust", mbc);\r
101                 detachedTabs.addTab("All Pressure", mpc);\r
102                 detached.setVisible(true);\r
103         }\r
104 \r
105         @Override\r
106         protected void objectAdded(Motor m, MotorEditor e) {\r
107                 e.addBurnWatcher(mbc);\r
108                 e.addBurnWatcher(mpc);\r
109                 e.addBurnWatcher(mmt);\r
110         }\r
111 \r
112         @Override\r
113         protected void objectRemoved(Motor m, MotorEditor e) {\r
114                 mbc.removeBurn(e.burn);\r
115                 mpc.removeBurn(e.burn);\r
116                 mmt.removeBurn(e.burn);\r
117         }\r
118 \r
119         @Override\r
120         public MotorEditor createEditor(Motor o) {\r
121                 return new MotorEditor(o);\r
122         }\r
123 \r
124         @Override\r
125         protected Motor loadFromFile(File f) throws IOException {\r
126                 return MotorIO.readMotor(new FileInputStream(f));\r
127         }\r
128 \r
129         @Override\r
130         protected void saveToFile(Motor o, File f) throws IOException {\r
131                 MotorIO.writeMotor(o, new FileOutputStream(f));\r
132         }\r
133 \r
134         @Override\r
135         public JMenu getMenu() {\r
136                 JMenu ret = super.getMenu();\r
137                 ret.add(new JSeparator());\r
138                 ret.add(new JMenuItem("Export .ENG") {\r
139                         private static final long serialVersionUID = 1L;\r
140                         {\r
141                                 addActionListener(new ActionListener() {\r
142                                         @Override\r
143                                         public void actionPerformed(ActionEvent arg0) {\r
144 \r
145                                                 final FileDialog fd = new FileDialog(frame,\r
146                                                                 "Export .ENG File", FileDialog.SAVE);\r
147                                                 fd.setFile("motorsim.eng");\r
148                                                 fd.setVisible(true);\r
149                                                 if (fd.getFile() != null) {\r
150                                                         File file = new File(fd.getDirectory()\r
151                                                                         + fd.getFile());\r
152                                                         MotorEditor me = getSelectedEditor();\r
153                                                         Vector<Burn> bb = new Vector<Burn>();\r
154                                                         bb.add(me.burn);\r
155                                                         try {\r
156                                                                 ENGExporter.export(bb, file);\r
157                                                         } catch (IOException e) {\r
158                                                                 // TODO Auto-generated catch block\r
159                                                                 e.printStackTrace();\r
160                                                         }\r
161                                                 }\r
162                                         }\r
163                                 });\r
164                         }\r
165                 });\r
166                 return ret;\r
167         }\r
168 }\r