1 | /* |
2 | * Copyright (c) 2005 The PseudoQ Project. |
3 | * |
4 | * This file is part of PseudoQ. |
5 | * |
6 | * PseudoQ is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU Lesser General Public License as published by |
8 | * the Free Software Foundation; either version 2.1 of the License, or |
9 | * (at your option) any later version. |
10 | * |
11 | * PseudoQ is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU Lesser General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Lesser General Public License |
17 | * along with PseudoQ; if not, write to the Free Software |
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
19 | */ |
20 | |
21 | package net.sourceforge.pseudoq.gui; |
22 | |
23 | import javax.swing.JFileChooser; |
24 | import javax.swing.JOptionPane; |
25 | import net.sourceforge.pseudoq.generation.GenerationException; |
26 | import net.sourceforge.pseudoq.generation.GenerationStyleEnum; |
27 | |
28 | import net.sourceforge.pseudoq.generation.Generator; |
29 | import net.sourceforge.pseudoq.generation.GeneratorFactory; |
30 | import net.sourceforge.pseudoq.model.Puzzle; |
31 | import net.sourceforge.pseudoq.model.PuzzleFactory; |
32 | import net.sourceforge.pseudoq.model.io.PuzzleFileReader; |
33 | |
34 | /** |
35 | * Main GUI frame. Contains options to open existing puzzles or create new |
36 | * ones. |
37 | * @author <a href="http://sourceforge.net/users/stevensa">Andrew Stevens</a> |
38 | */ |
39 | public class LauncherFrame extends javax.swing.JFrame { |
40 | /** Log4J logger */ |
41 | private static final org.apache.log4j.Logger log = |
42 | org.apache.log4j.LogManager.getLogger(LauncherFrame.class); |
43 | |
44 | /** |
45 | * Creates new form LauncherFrame |
46 | */ |
47 | public LauncherFrame() { |
48 | initComponents(); |
49 | } |
50 | |
51 | /** This method is called from within the constructor to |
52 | * initialize the form. |
53 | * WARNING: Do NOT modify this code. The content of this method is |
54 | * always regenerated by the Form Editor. |
55 | */ |
56 | // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents |
57 | private void initComponents() { |
58 | jPanel1 = new javax.swing.JPanel(); |
59 | jButton1 = new javax.swing.JButton(); |
60 | jButton2 = new javax.swing.JButton(); |
61 | menuBar = new javax.swing.JMenuBar(); |
62 | fileMenu = new javax.swing.JMenu(); |
63 | newMenuItem = new javax.swing.JMenuItem(); |
64 | openMenuItem = new javax.swing.JMenuItem(); |
65 | exitMenuItem = new javax.swing.JMenuItem(); |
66 | helpMenu = new javax.swing.JMenu(); |
67 | contentsMenuItem = new javax.swing.JMenuItem(); |
68 | aboutMenuItem = new javax.swing.JMenuItem(); |
69 | |
70 | setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); |
71 | setTitle("PseudoQ"); |
72 | jPanel1.setLayout(new java.awt.GridLayout(3, 0, 0, 10)); |
73 | |
74 | jPanel1.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(30, 30, 30, 30))); |
75 | jButton1.setMnemonic('g'); |
76 | jButton1.setText("Generate/Design"); |
77 | jButton1.addActionListener(new java.awt.event.ActionListener() { |
78 | public void actionPerformed(java.awt.event.ActionEvent evt) { |
79 | jButton1ActionPerformed(evt); |
80 | } |
81 | }); |
82 | |
83 | jPanel1.add(jButton1); |
84 | |
85 | jButton2.setMnemonic('L'); |
86 | jButton2.setText("Load"); |
87 | jButton2.addActionListener(new java.awt.event.ActionListener() { |
88 | public void actionPerformed(java.awt.event.ActionEvent evt) { |
89 | jButton2ActionPerformed(evt); |
90 | } |
91 | }); |
92 | |
93 | jPanel1.add(jButton2); |
94 | |
95 | getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER); |
96 | |
97 | fileMenu.setMnemonic('f'); |
98 | fileMenu.setText("File"); |
99 | newMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK)); |
100 | newMenuItem.setMnemonic('n'); |
101 | newMenuItem.setText("New"); |
102 | newMenuItem.addActionListener(new java.awt.event.ActionListener() { |
103 | public void actionPerformed(java.awt.event.ActionEvent evt) { |
104 | newMenuItemActionPerformed(evt); |
105 | } |
106 | }); |
107 | |
108 | fileMenu.add(newMenuItem); |
109 | |
110 | openMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK)); |
111 | openMenuItem.setMnemonic('o'); |
112 | openMenuItem.setText("Open"); |
113 | openMenuItem.addActionListener(new java.awt.event.ActionListener() { |
114 | public void actionPerformed(java.awt.event.ActionEvent evt) { |
115 | openMenuItemActionPerformed(evt); |
116 | } |
117 | }); |
118 | |
119 | fileMenu.add(openMenuItem); |
120 | |
121 | exitMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, java.awt.event.InputEvent.ALT_MASK)); |
122 | exitMenuItem.setMnemonic('x'); |
123 | exitMenuItem.setText("Exit"); |
124 | exitMenuItem.addActionListener(new java.awt.event.ActionListener() { |
125 | public void actionPerformed(java.awt.event.ActionEvent evt) { |
126 | exitMenuItemActionPerformed(evt); |
127 | } |
128 | }); |
129 | |
130 | fileMenu.add(exitMenuItem); |
131 | |
132 | menuBar.add(fileMenu); |
133 | |
134 | helpMenu.setMnemonic('h'); |
135 | helpMenu.setText("Help"); |
136 | contentsMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0)); |
137 | contentsMenuItem.setText("Contents"); |
138 | contentsMenuItem.setEnabled(false); |
139 | helpMenu.add(contentsMenuItem); |
140 | |
141 | aboutMenuItem.setMnemonic('a'); |
142 | aboutMenuItem.setText("About"); |
143 | aboutMenuItem.addActionListener(new java.awt.event.ActionListener() { |
144 | public void actionPerformed(java.awt.event.ActionEvent evt) { |
145 | aboutMenuItemActionPerformed(evt); |
146 | } |
147 | }); |
148 | |
149 | helpMenu.add(aboutMenuItem); |
150 | |
151 | menuBar.add(helpMenu); |
152 | |
153 | setJMenuBar(menuBar); |
154 | |
155 | pack(); |
156 | } |
157 | // </editor-fold>//GEN-END:initComponents |
158 | |
159 | private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed |
160 | openMenuItemActionPerformed(evt); |
161 | }//GEN-LAST:event_jButton2ActionPerformed |
162 | |
163 | private void newMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newMenuItemActionPerformed |
164 | NewPuzzleWizard wizard = new NewPuzzleWizard(); |
165 | |
166 | wizard.showInDialog("Create new puzzle", this, true); |
167 | if (!wizard.wasCanceled()) { |
168 | if (wizard.isGenerate()) { |
169 | log.debug("Generate new " + wizard.getPuzzleType() + " puzzle."); |
170 | // TODO: get style and difficulty params from model |
171 | Generator generator = GeneratorFactory.newInstance( |
172 | wizard.getPuzzleType(), GenerationStyleEnum.RANDOM, 1); |
173 | if (generator != null) { |
174 | try { |
175 | final Puzzle puzzle = generator.generate(); |
176 | javax.swing.SwingUtilities.invokeLater(new Runnable() { |
177 | public void run() { |
178 | new PuzzleFrame(puzzle).setVisible(true); |
179 | } |
180 | }); |
181 | } catch (GenerationException e) { |
182 | log.error("No puzzle returned by generator", e); |
183 | JOptionPane.showMessageDialog(this, |
184 | "Error creating puzzle.", |
185 | "Error", JOptionPane.ERROR_MESSAGE); |
186 | } |
187 | } else { |
188 | log.error("No generator for type " + wizard.getPuzzleType()); |
189 | JOptionPane.showMessageDialog(this, |
190 | "Error creating puzzle.", |
191 | "Error", JOptionPane.ERROR_MESSAGE); |
192 | } |
193 | } else { |
194 | log.debug("Design new " + wizard.getPuzzleType() + " puzzle."); |
195 | final Puzzle puzzle = PuzzleFactory.newInstance( |
196 | wizard.getPuzzleType()); |
197 | if (puzzle != null) { |
198 | javax.swing.SwingUtilities.invokeLater(new Runnable() { |
199 | public void run() { |
200 | new PuzzleFrame(puzzle).setVisible(true); |
201 | } |
202 | }); |
203 | } else { |
204 | log.error("No puzzle returned by factory"); |
205 | JOptionPane.showMessageDialog(this, |
206 | "Unknown error creating puzzle.", |
207 | "Error", JOptionPane.ERROR_MESSAGE); |
208 | } |
209 | } |
210 | } else { |
211 | log.debug("No puzzle right now."); |
212 | } |
213 | }//GEN-LAST:event_newMenuItemActionPerformed |
214 | |
215 | private void openMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openMenuItemActionPerformed |
216 | JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir")); |
217 | fileChooser.addChoosableFileFilter( |
218 | new javax.swing.filechooser.FileFilter() { |
219 | public boolean accept(java.io.File file) { |
220 | if (file.isDirectory()) { |
221 | return true; |
222 | } |
223 | String filename = file.getName(); |
224 | return filename.endsWith(".xml"); |
225 | } |
226 | public String getDescription() { |
227 | return "XML files (*.xml)"; |
228 | } |
229 | }); |
230 | fileChooser.setFileFilter( |
231 | new javax.swing.filechooser.FileFilter() { |
232 | public boolean accept(java.io.File file) { |
233 | if (file.isDirectory()) { |
234 | return true; |
235 | } |
236 | String filename = file.getName(); |
237 | return filename.endsWith(".pdq"); |
238 | } |
239 | public String getDescription() { |
240 | return "PseudoQ puzzles (*.pdq)"; |
241 | } |
242 | }); |
243 | |
244 | // Open file dialog. |
245 | int result = fileChooser.showOpenDialog(this); |
246 | if (result == JFileChooser.APPROVE_OPTION) { |
247 | String selectedFile = fileChooser.getSelectedFile().getPath(); |
248 | log.debug("Open " + selectedFile); |
249 | try { |
250 | final Puzzle puzzle = PuzzleFileReader.read(selectedFile); |
251 | javax.swing.SwingUtilities.invokeLater(new Runnable() { |
252 | public void run() { |
253 | new PuzzleFrame(puzzle).setVisible(true); |
254 | } |
255 | }); |
256 | } catch (java.io.IOException e) { |
257 | log.error("IO Problem: " + e.getLocalizedMessage(), e); |
258 | JOptionPane.showMessageDialog(this, |
259 | "I/O error reading file:\n" + e.getLocalizedMessage(), |
260 | "File Read Error", JOptionPane.ERROR_MESSAGE); |
261 | } catch (javax.xml.parsers.ParserConfigurationException e) { |
262 | log.error("XML parser problem: " + e.getLocalizedMessage(), e); |
263 | JOptionPane.showMessageDialog(this, |
264 | "Invalid file.\nCouldn't parse file contents:\n" + e.getLocalizedMessage(), |
265 | "File Read Error", JOptionPane.ERROR_MESSAGE); |
266 | } |
267 | } else { |
268 | log.debug("Forget it"); |
269 | } |
270 | }//GEN-LAST:event_openMenuItemActionPerformed |
271 | |
272 | private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed |
273 | newMenuItemActionPerformed(evt); |
274 | }//GEN-LAST:event_jButton1ActionPerformed |
275 | |
276 | private void aboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_aboutMenuItemActionPerformed |
277 | javax.swing.SwingUtilities.invokeLater(new Runnable() { |
278 | public void run() { |
279 | new AboutDialog(LauncherFrame.this, true).setVisible(true); |
280 | } |
281 | }); |
282 | }//GEN-LAST:event_aboutMenuItemActionPerformed |
283 | |
284 | private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed |
285 | System.exit(0); |
286 | }//GEN-LAST:event_exitMenuItemActionPerformed |
287 | |
288 | /** |
289 | * @param args the command line arguments |
290 | */ |
291 | public static void main(String args[]) { |
292 | java.awt.EventQueue.invokeLater(new Runnable() { |
293 | public void run() { |
294 | new LauncherFrame().setVisible(true); |
295 | } |
296 | }); |
297 | } |
298 | |
299 | // Variables declaration - do not modify//GEN-BEGIN:variables |
300 | private javax.swing.JMenuItem aboutMenuItem; |
301 | private javax.swing.JMenuItem contentsMenuItem; |
302 | private javax.swing.JMenuItem exitMenuItem; |
303 | private javax.swing.JMenu fileMenu; |
304 | private javax.swing.JMenu helpMenu; |
305 | private javax.swing.JButton jButton1; |
306 | private javax.swing.JButton jButton2; |
307 | private javax.swing.JPanel jPanel1; |
308 | private javax.swing.JMenuBar menuBar; |
309 | private javax.swing.JMenuItem newMenuItem; |
310 | private javax.swing.JMenuItem openMenuItem; |
311 | // End of variables declaration//GEN-END:variables |
312 | |
313 | } |