1 //
2 // Neuros Database Manipulator
3 // Copyright (C) 2003 Neuros Database Manipulator
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 //
19 // For information about Neuros Database Manipulator and its authors,
20 // please contact the Neuros Database Manipulator Web Site at
21 // http://neurosdbm.sourceforge.net
22 //
23 //
24
25 package net.sourceforge.neurosdbm;
26
27
28 import java.awt.event.ActionEvent;
29 import java.awt.event.ActionListener;
30
31 import javax.swing.JCheckBoxMenuItem;
32 import javax.swing.JMenu;
33 import javax.swing.JMenuBar;
34 import javax.swing.JMenuItem;
35 import javax.swing.JOptionPane;
36 import javax.swing.JPopupMenu;
37
38 import net.sourceforge.neurosdbm.actions.About;
39 import net.sourceforge.neurosdbm.actions.AddTrack;
40 import net.sourceforge.neurosdbm.actions.AddTracksToPlaylist;
41 import net.sourceforge.neurosdbm.actions.BackupDatabase;
42 import net.sourceforge.neurosdbm.actions.ChangeDevice;
43 import net.sourceforge.neurosdbm.actions.CreateEmptyDatabase;
44 import net.sourceforge.neurosdbm.actions.DatabaseInfo;
45 import net.sourceforge.neurosdbm.actions.DeleteTrack;
46 import net.sourceforge.neurosdbm.actions.Exit;
47 import net.sourceforge.neurosdbm.actions.License;
48 import net.sourceforge.neurosdbm.actions.PlayTracks;
49 import net.sourceforge.neurosdbm.actions.RebuildDatabase;
50 import net.sourceforge.neurosdbm.actions.RefreshDatabase;
51 import net.sourceforge.neurosdbm.actions.RestoreDatabase;
52 import net.sourceforge.neurosdbm.actions.SortDatabase;
53 import net.sourceforge.neurosdbm.actions.Synchronize;
54 import net.sourceforge.neurosdbm.actions.UsersGuide;
55 import net.sourceforge.neurosdbm.db.Database;
56 import net.sourceforge.neurosdbm.db.DatabaseInternalCorruptionException;
57
58 public class MainMenuBar extends JMenuBar {
59
60 private MainFrame parent;
61 private Database database;
62
63 private JMenu fileMenu;
64 private Synchronize synchronizeAction;
65 private ChangeDevice changeDeviceAction;
66 private Exit exitAction;
67
68 private JMenu databaseMenu;
69 private BackupDatabase backupAction;
70 private RestoreDatabase restoreAction;
71 private CreateEmptyDatabase createAction;
72 private RefreshDatabase refreshAction;
73 private RebuildDatabase rebuildAction;
74 private SortDatabase sortAction;
75 private DatabaseInfo infoAction;
76
77 private JMenu trackMenu;
78 private AddTrack addTrackAction;
79 private DeleteTrack deleteTrackAction;
80 private AddTracksToPlaylist addTracksToPlaylistAction;
81 private PlayTracks playTracksAction;
82
83 private JMenu optionsMenu;
84 private JCheckBoxMenuItem autoSortMenuItem;
85 private JCheckBoxMenuItem autoBackupMenuItem;
86 private JMenuItem neurosMusicPathMenuItem;
87 private JCheckBoxMenuItem deleteFileMenuItem;
88 private JCheckBoxMenuItem allowDuplicatesMenuItem;
89 private JCheckBoxMenuItem convertExtendedASCIIMenuItem;
90 private JMenuItem columnChooserMenuItem;
91 private JCheckBoxMenuItem highlightTracksMenuItem;
92
93 private JMenu debugMenu;
94 private JMenuItem addTrack1MenuItem;
95 private JMenuItem addTrack2MenuItem;
96 private JMenuItem addMoreTracksMenuItem;
97 private JMenuItem addRandomTrackMenuItem;
98 private JMenuItem writeDatabaseMenuItem;
99 private JMenuItem printDatabaseMenuItem;
100
101 private JMenu helpMenu;
102 private UsersGuide usersGuideAction;
103 private About aboutAction;
104 private License gplLicenseAction;
105
106 MainMenuBar(MainFrame parent, Database database) {
107 this.parent = parent;
108 this.database = database;
109
110 fileMenu = new JMenu();
111 fileMenu.setText("File");
112
113 synchronizeAction = new Synchronize(parent, database);
114 fileMenu.add(synchronizeAction);
115 ActionLock.register(synchronizeAction);
116
117 changeDeviceAction = new ChangeDevice(parent, database);
118 fileMenu.add(changeDeviceAction);
119 ActionLock.register(changeDeviceAction);
120
121 exitAction = new Exit(parent);
122 fileMenu.add(exitAction);
123 ActionLock.register(exitAction);
124
125 this.add(fileMenu);
126
127
128 databaseMenu = new JMenu();
129 databaseMenu.setText("Database");
130
131 backupAction = new BackupDatabase(parent, database);
132 databaseMenu.add(backupAction);
133 ActionLock.register(backupAction);
134
135 restoreAction = new RestoreDatabase(parent, database);
136 databaseMenu.add(restoreAction);
137 ActionLock.register(restoreAction);
138
139 createAction = new CreateEmptyDatabase(parent, database);
140 databaseMenu.add(createAction);
141 ActionLock.register(createAction);
142
143 refreshAction = new RefreshDatabase(parent, database);
144 databaseMenu.add(refreshAction);
145 ActionLock.register(refreshAction);
146
147 rebuildAction = new RebuildDatabase(parent, database);
148 databaseMenu.add(rebuildAction);
149 ActionLock.register(rebuildAction);
150
151 sortAction = new SortDatabase(parent, database);
152 databaseMenu.add(sortAction);
153 ActionLock.register(sortAction);
154
155 infoAction = new DatabaseInfo(parent, database);
156 databaseMenu.add(infoAction);
157 ActionLock.register(infoAction);
158
159 this.add(databaseMenu);
160
161
162 trackMenu = new JMenu();
163 trackMenu.setText("Track");
164
165 addTrackAction = new AddTrack(parent, database);
166 trackMenu.add(addTrackAction);
167 ActionLock.register(addTrackAction);
168
169 deleteTrackAction = new DeleteTrack(parent, database);
170 trackMenu.add(deleteTrackAction);
171 ActionLock.register(deleteTrackAction);
172
173 addTracksToPlaylistAction = new AddTracksToPlaylist(parent, database);
174 trackMenu.add(addTracksToPlaylistAction);
175 ActionLock.register(addTracksToPlaylistAction);
176
177 playTracksAction = new PlayTracks(parent);
178 trackMenu.add(playTracksAction);
179 ActionLock.register(playTracksAction);
180
181 this.add(trackMenu);
182 TrackPopupMenu.setMenu(trackMenu);
183
184
185 optionsMenu = new JMenu();
186 optionsMenu.setText("Options");
187
188 autoSortMenuItem = new JCheckBoxMenuItem();
189 autoSortMenuItem.setText("Auto Sort");
190 autoSortMenuItem.setState(true);
191 autoSortMenuItem.addActionListener(new OptionsAutoSort());
192 optionsMenu.add(autoSortMenuItem);
193 ActionLock.register(autoSortMenuItem);
194
195 autoBackupMenuItem = new JCheckBoxMenuItem();
196 autoBackupMenuItem.setText("Auto Backup");
197 autoBackupMenuItem.setState(NeurosProperties.isAutoBackup());
198 autoBackupMenuItem.addActionListener(new OptionsAutoBackup());
199 optionsMenu.add(autoBackupMenuItem);
200 ActionLock.register(autoBackupMenuItem);
201
202 neurosMusicPathMenuItem = new JMenuItem();
203 neurosMusicPathMenuItem.setText("Neuros Music Path");
204 neurosMusicPathMenuItem.addActionListener(new OptionsNeurosMusicPath());
205 optionsMenu.add(neurosMusicPathMenuItem);
206 ActionLock.register(neurosMusicPathMenuItem);
207
208 deleteFileMenuItem = new JCheckBoxMenuItem();
209 deleteFileMenuItem.setText("Delete File");
210 deleteFileMenuItem.setState(NeurosProperties.isDeleteFile());
211 deleteFileMenuItem.addActionListener(new OptionsDeleteFile());
212 optionsMenu.add(deleteFileMenuItem);
213 ActionLock.register(deleteFileMenuItem);
214
215 allowDuplicatesMenuItem = new JCheckBoxMenuItem();
216 allowDuplicatesMenuItem.setText("Allow Duplicates");
217 allowDuplicatesMenuItem.setState(NeurosProperties.allowDuplicates());
218 allowDuplicatesMenuItem.addActionListener(new OptionsAllowDuplicates());
219 optionsMenu.add(allowDuplicatesMenuItem);
220 ActionLock.register(allowDuplicatesMenuItem);
221
222 convertExtendedASCIIMenuItem = new JCheckBoxMenuItem();
223 convertExtendedASCIIMenuItem.setText("Convert Extended ASCII");
224 convertExtendedASCIIMenuItem.setState(NeurosProperties.isConvertExtendedASCII());
225 convertExtendedASCIIMenuItem.addActionListener(new OptionsConvertExtendedASCII());
226 optionsMenu.add(convertExtendedASCIIMenuItem);
227 ActionLock.register(convertExtendedASCIIMenuItem);
228
229 columnChooserMenuItem = new JMenuItem();
230 columnChooserMenuItem.setText("Column Chooser");
231 columnChooserMenuItem.addActionListener(new OptionsColumnChooser());
232 optionsMenu.add(columnChooserMenuItem);
233 ActionLock.register(columnChooserMenuItem);
234
235 highlightTracksMenuItem = new JCheckBoxMenuItem();
236 highlightTracksMenuItem.setText("HIghlight Queued/Removed tracks");
237 highlightTracksMenuItem.setState(NeurosProperties.isHighlightTracks());
238 highlightTracksMenuItem.addActionListener(new OptionsHiglightTracks());
239 optionsMenu.add(highlightTracksMenuItem);
240 ActionLock.register(highlightTracksMenuItem);
241
242 this.add(optionsMenu);
243
244
245 debugMenu = new JMenu();
246 debugMenu.setText("Debug");
247
248 addTrack1MenuItem = new JMenuItem();
249 addTrack1MenuItem.setText("Add track 1");
250 addTrack1MenuItem.addActionListener(new DebugAddTrack1());
251 debugMenu.add(addTrack1MenuItem);
252 ActionLock.register(addTrack1MenuItem);
253
254 addTrack2MenuItem = new JMenuItem();
255 addTrack2MenuItem.setText("Add track 2");
256 addTrack2MenuItem.addActionListener(new DebugAddTrack2());
257 debugMenu.add(addTrack2MenuItem);
258 ActionLock.register(addTrack2MenuItem);
259
260 addMoreTracksMenuItem = new JMenuItem();
261 addMoreTracksMenuItem.setText("Add more tracks");
262 addMoreTracksMenuItem.addActionListener(new DebugAddMoreTracks());
263 debugMenu.add(addMoreTracksMenuItem);
264 ActionLock.register(addMoreTracksMenuItem);
265
266 addRandomTrackMenuItem = new JMenuItem();
267 addRandomTrackMenuItem.setText("Add random track");
268 addRandomTrackMenuItem.addActionListener(new DebugAddRandomTrack());
269 debugMenu.add(addRandomTrackMenuItem);
270 ActionLock.register(addRandomTrackMenuItem);
271
272 writeDatabaseMenuItem = new JMenuItem();
273 writeDatabaseMenuItem.setText("Write Database");
274 writeDatabaseMenuItem.addActionListener(new DebugWriteDatabase());
275 debugMenu.add(writeDatabaseMenuItem);
276 ActionLock.register(writeDatabaseMenuItem);
277
278 printDatabaseMenuItem = new JMenuItem();
279 printDatabaseMenuItem.setText("Print Database");
280 printDatabaseMenuItem.addActionListener(new DebugPrintDatabase());
281 debugMenu.add(printDatabaseMenuItem);
282 ActionLock.register(printDatabaseMenuItem);
283
284 if (NeurosProperties.isDebug()) {
285 this.add(debugMenu);
286 }
287
288
289 helpMenu = new JMenu();
290 helpMenu.setText("Help");
291
292 usersGuideAction = new UsersGuide(parent);
293 helpMenu.add(usersGuideAction);
294
295 aboutAction = new About(parent);
296 helpMenu.add(aboutAction);
297
298 gplLicenseAction = new License(parent);
299 helpMenu.add(gplLicenseAction);
300
301 this.add(helpMenu);
302 }
303
304
305 abstract private class MenuHandler implements ActionListener {
306 public void actionPerformed(ActionEvent evt) {
307 try {
308 action();
309 } catch (Exception exp) {
310 Logging.fatal("Exception occured");
311 Logging.fatal(exp);
312
313 System.err.println("An exception occured. Please check the log file.");
314 String message = "An exception occured. Please check the log file.\n";
315 message += "Exception: " + exp + "\n";
316 if (exp.getMessage() != null)
317 message += "Message: " + exp.getMessage();
318 JOptionPane.showMessageDialog(parent, message,
319 "Neuros Database Manipulator",
320 JOptionPane.ERROR_MESSAGE);
321 }
322 }
323
324 abstract void action();
325 }
326
327
328 private class DebugAddTrack1 extends MenuHandler {
329 void action() {
330 try {
331 database.testTrackAdd1();
332 } catch (DatabaseInternalCorruptionException exp) {
333 System.out.println("Exception: " + exp);
334 }
335 parent.dataChanged();
336 }
337 }
338
339 private class DebugAddTrack2 extends MenuHandler {
340 void action() {
341 try {
342 database.testTrackAdd2();
343 } catch (DatabaseInternalCorruptionException exp) {
344 System.out.println("Exception: " + exp);
345 }
346 parent.dataChanged();
347 }
348 }
349
350 private class DebugAddMoreTracks extends MenuHandler {
351 void action() {
352 try {
353 for (int cnt=0; cnt<15; cnt++)
354 database.testTrackAdd1();
355 for (int cnt=0; cnt<15; cnt++)
356 database.testTrackAdd2();
357 } catch (DatabaseInternalCorruptionException exp) {
358 System.out.println("Exception: " + exp);
359 }
360 parent.dataChanged();
361 }
362 }
363
364
365 private class DebugAddRandomTrack extends MenuHandler {
366 void action() {
367 try {
368 database.testTrackAddRandom();
369 } catch (DatabaseInternalCorruptionException exp) {
370 System.out.println("Exception: " + exp);
371 }
372 parent.dataChanged();
373 }
374 }
375
376
377 private class DebugWriteDatabase extends MenuHandler {
378 void action() {
379 try {
380 database.write();
381 } catch (Exception exp) {
382 exp.printStackTrace();
383 }
384 }
385 }
386
387 private class DebugPrintDatabase extends MenuHandler {
388 void action() {
389 Logging.warning(database.toString());
390 }
391 }
392
393
394 private class OptionsAutoSort extends MenuHandler {
395 void action() {
396 JOptionPane.showMessageDialog(parent,
397 "Auto Sort enabled for now...",
398 "Not Implemented",
399 JOptionPane.INFORMATION_MESSAGE);
400 autoSortMenuItem.setState(true);
401 }
402 }
403
404
405 private class OptionsAutoBackup extends MenuHandler {
406 void action() {
407 if (NeurosProperties.isAutoBackup()) {
408 autoBackupMenuItem.setState(false);
409 NeurosProperties.setAutoBackup(false);
410 NeurosProperties.save();
411 } else {
412 autoBackupMenuItem.setState(true);
413 NeurosProperties.setAutoBackup(true);
414 NeurosProperties.save();
415 }
416 }
417 }
418
419
420 private class OptionsNeurosMusicPath extends MenuHandler {
421 void action() {
422 MusicPathDialog musicPathDialog =
423 new MusicPathDialog(parent, "Enter Neuros Music Path");
424 musicPathDialog.setVisible(true);
425 }
426 }
427
428
429 private class OptionsDeleteFile extends MenuHandler {
430 void action() {
431 if (NeurosProperties.isDeleteFile()) {
432 deleteFileMenuItem.setState(false);
433 NeurosProperties.setDeleteFile(false);
434 } else {
435 deleteFileMenuItem.setState(true);
436 NeurosProperties.setDeleteFile(true);
437 }
438 }
439 }
440
441
442 private class OptionsAllowDuplicates extends MenuHandler {
443 void action() {
444 if (NeurosProperties.allowDuplicates()) {
445 allowDuplicatesMenuItem.setState(false);
446 NeurosProperties.setAllowDuplicates(false);
447 } else {
448 allowDuplicatesMenuItem.setState(true);
449 NeurosProperties.setAllowDuplicates(true);
450 }
451 }
452 }
453
454
455 private class OptionsConvertExtendedASCII extends MenuHandler {
456 void action() {
457 if (NeurosProperties.isConvertExtendedASCII()) {
458 convertExtendedASCIIMenuItem.setState(false);
459 NeurosProperties.setConvertExtendedASCII(false);
460 } else {
461 convertExtendedASCIIMenuItem.setState(true);
462 NeurosProperties.setConvertExtendedASCII(true);
463 }
464 }
465 }
466
467
468 private class OptionsColumnChooser extends MenuHandler {
469 void action() {
470 ColumnChooser cc = new ColumnChooser(parent);
471 cc.show();
472 parent.dataChanged();
473 }
474 }
475
476 private class OptionsHiglightTracks extends MenuHandler {
477 void action() {
478 if (NeurosProperties.isHighlightTracks()) {
479 highlightTracksMenuItem.setState(false);
480 NeurosProperties.setHighlightTracks(false);
481 }
482 else {
483 highlightTracksMenuItem.setState(true);
484 NeurosProperties.setHighlightTracks(true);
485 }
486 parent.repaint();
487 }
488 }
489
490 public JPopupMenu getTrackPopupMenu() {
491 return trackMenu.getPopupMenu();
492 }
493
494 public JPopupMenu getDatabasePopupMenu() {
495 return databaseMenu.getPopupMenu();
496 }
497 }
498