3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.awt.event.InputEvent;
6 import java.awt.event.KeyEvent;
8 import javax.swing.ImageIcon;
9 import javax.swing.JButton;
10 import javax.swing.JFrame;
11 import javax.swing.JMenu;
12 import javax.swing.JMenuBar;
13 import javax.swing.JMenuItem;
14 import javax.swing.JToolBar;
15 import javax.swing.KeyStroke;
18 import tim.prune.DataSubscriber;
19 import tim.prune.I18nManager;
20 import tim.prune.data.PhotoList;
21 import tim.prune.data.Selection;
22 import tim.prune.data.Track;
23 import tim.prune.data.TrackInfo;
26 * Class to manage the menu bar and tool bar,
27 * including enabling and disabling the items
29 public class MenuManager implements DataSubscriber
31 private JFrame _parent = null;
32 private App _app = null;
33 private Track _track = null;
34 private Selection _selection = null;
35 private PhotoList _photos = null;
37 // Menu items which need enabling/disabling
38 private JMenuItem _saveItem = null;
39 private JMenuItem _exportKmlItem = null;
40 private JMenuItem _exportPovItem = null;
41 private JMenuItem _undoItem = null;
42 private JMenuItem _clearUndoItem = null;
43 private JMenuItem _editPointItem = null;
44 private JMenuItem _editWaypointNameItem = null;
45 private JMenuItem _deletePointItem = null;
46 private JMenuItem _deleteRangeItem = null;
47 private JMenuItem _deleteDuplicatesItem = null;
48 private JMenuItem _compressItem = null;
49 private JMenuItem _interpolateItem = null;
50 private JMenuItem _selectAllItem = null;
51 private JMenuItem _selectNoneItem = null;
52 private JMenuItem _selectStartItem = null;
53 private JMenuItem _selectEndItem = null;
54 private JMenuItem _reverseItem = null;
55 private JMenu _rearrangeMenu = null;
56 private JMenuItem _rearrangeStartItem = null;
57 private JMenuItem _rearrangeEndItem = null;
58 private JMenuItem _rearrangeNearestItem = null;
59 private JMenuItem _show3dItem = null;
60 private JMenuItem _saveExifItem = null;
61 private JMenuItem _connectPhotoItem = null;
62 private JMenuItem _deletePhotoItem = null;
63 // TODO: Does Photo menu require disconnect option?
65 // ActionListeners for reuse by menu and toolbar
66 private ActionListener _openFileAction = null;
67 private ActionListener _addPhotoAction = null;
68 private ActionListener _saveAction = null;
69 private ActionListener _undoAction = null;
70 private ActionListener _editPointAction = null;
71 private ActionListener _selectStartAction = null;
72 private ActionListener _selectEndAction = null;
73 private ActionListener _connectPhotoAction = null;
75 // Toolbar buttons which need enabling/disabling
76 private JButton _saveButton = null;
77 private JButton _undoButton = null;
78 private JButton _editPointButton = null;
79 private JButton _selectStartButton = null;
80 private JButton _selectEndButton = null;
81 private JButton _connectPhotoButton = null;
86 * @param inParent parent object for dialogs
87 * @param inApp application to call on menu actions
89 public MenuManager(JFrame inParent, App inApp, TrackInfo inTrackInfo)
93 _track = inTrackInfo.getTrack();
94 _selection = inTrackInfo.getSelection();
95 _photos = inTrackInfo.getPhotoList();
100 * Create a JMenuBar containing all menu items
103 public JMenuBar createMenuBar()
105 JMenuBar menubar = new JMenuBar();
106 JMenu fileMenu = new JMenu(I18nManager.getText("menu.file"));
108 JMenuItem openMenuItem = new JMenuItem(I18nManager.getText("menu.file.open"));
109 openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
110 _openFileAction = new ActionListener() {
111 public void actionPerformed(ActionEvent e)
116 openMenuItem.addActionListener(_openFileAction);
117 fileMenu.add(openMenuItem);
119 JMenuItem addPhotosMenuItem = new JMenuItem(I18nManager.getText("menu.file.addphotos"));
120 _addPhotoAction = new ActionListener() {
121 public void actionPerformed(ActionEvent e)
126 addPhotosMenuItem.addActionListener(_addPhotoAction);
127 fileMenu.add(addPhotosMenuItem);
129 _saveItem = new JMenuItem(I18nManager.getText("menu.file.save"), KeyEvent.VK_S);
130 _saveAction = new ActionListener() {
131 public void actionPerformed(ActionEvent e)
136 _saveItem.addActionListener(_saveAction);
137 _saveItem.setEnabled(false);
138 fileMenu.add(_saveItem);
140 _exportKmlItem = new JMenuItem(I18nManager.getText("menu.file.exportkml"));
141 _exportKmlItem.addActionListener(new ActionListener() {
142 public void actionPerformed(ActionEvent e)
147 _exportKmlItem.setEnabled(false);
148 fileMenu.add(_exportKmlItem);
149 _exportPovItem = new JMenuItem(I18nManager.getText("menu.file.exportpov"));
150 _exportPovItem.addActionListener(new ActionListener() {
151 public void actionPerformed(ActionEvent e)
156 _exportPovItem.setEnabled(false);
157 fileMenu.add(_exportPovItem);
158 fileMenu.addSeparator();
159 JMenuItem exitMenuItem = new JMenuItem(I18nManager.getText("menu.file.exit"));
160 exitMenuItem.addActionListener(new ActionListener() {
161 public void actionPerformed(ActionEvent e)
166 fileMenu.add(exitMenuItem);
167 menubar.add(fileMenu);
168 JMenu editMenu = new JMenu(I18nManager.getText("menu.edit"));
169 editMenu.setMnemonic(KeyEvent.VK_E);
170 _undoItem = new JMenuItem(I18nManager.getText("menu.edit.undo"));
171 _undoAction = new ActionListener() {
172 public void actionPerformed(ActionEvent e)
177 _undoItem.addActionListener(_undoAction);
178 _undoItem.setEnabled(false);
179 editMenu.add(_undoItem);
180 _clearUndoItem = new JMenuItem(I18nManager.getText("menu.edit.clearundo"));
181 _clearUndoItem.addActionListener(new ActionListener() {
182 public void actionPerformed(ActionEvent e)
187 _clearUndoItem.setEnabled(false);
188 editMenu.add(_clearUndoItem);
189 editMenu.addSeparator();
190 _editPointItem = new JMenuItem(I18nManager.getText("menu.edit.editpoint"));
191 _editPointAction = new ActionListener() {
192 public void actionPerformed(ActionEvent e)
194 _app.editCurrentPoint();
197 _editPointItem.addActionListener(_editPointAction);
198 _editPointItem.setEnabled(false);
199 editMenu.add(_editPointItem);
200 _editWaypointNameItem = new JMenuItem(I18nManager.getText("menu.edit.editwaypointname"));
201 _editWaypointNameItem.addActionListener(new ActionListener() {
202 public void actionPerformed(ActionEvent e)
204 _app.editCurrentPointName();
207 _editWaypointNameItem.setEnabled(false);
208 editMenu.add(_editWaypointNameItem);
209 _deletePointItem = new JMenuItem(I18nManager.getText("menu.edit.deletepoint"));
210 _deletePointItem.addActionListener(new ActionListener() {
211 public void actionPerformed(ActionEvent e)
213 _app.deleteCurrentPoint();
216 _deletePointItem.setEnabled(false);
217 editMenu.add(_deletePointItem);
218 _deleteRangeItem = new JMenuItem(I18nManager.getText("menu.edit.deleterange"));
219 _deleteRangeItem.addActionListener(new ActionListener() {
220 public void actionPerformed(ActionEvent e)
222 _app.deleteSelectedRange();
225 _deleteRangeItem.setEnabled(false);
226 editMenu.add(_deleteRangeItem);
227 _deleteDuplicatesItem = new JMenuItem(I18nManager.getText("menu.edit.deleteduplicates"));
228 _deleteDuplicatesItem.addActionListener(new ActionListener() {
229 public void actionPerformed(ActionEvent e)
231 _app.deleteDuplicates();
234 _deleteDuplicatesItem.setEnabled(false);
235 editMenu.add(_deleteDuplicatesItem);
236 _compressItem = new JMenuItem(I18nManager.getText("menu.edit.compress"));
237 _compressItem.addActionListener(new ActionListener() {
238 public void actionPerformed(ActionEvent e)
240 _app.compressTrack();
243 _compressItem.setEnabled(false);
244 editMenu.add(_compressItem);
245 editMenu.addSeparator();
246 _interpolateItem = new JMenuItem(I18nManager.getText("menu.edit.interpolate"));
247 _interpolateItem.addActionListener(new ActionListener() {
248 public void actionPerformed(ActionEvent e)
250 _app.interpolateSelection();
253 _interpolateItem.setEnabled(false);
254 editMenu.add(_interpolateItem);
255 _reverseItem = new JMenuItem(I18nManager.getText("menu.edit.reverse"));
256 _reverseItem.addActionListener(new ActionListener() {
257 public void actionPerformed(ActionEvent e)
262 _reverseItem.setEnabled(false);
263 editMenu.add(_reverseItem);
264 // Rearrange waypoints
265 _rearrangeMenu = new JMenu(I18nManager.getText("menu.edit.rearrange"));
266 _rearrangeMenu.setEnabled(false);
267 _rearrangeStartItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.start"));
268 _rearrangeStartItem.addActionListener(new ActionListener() {
269 public void actionPerformed(ActionEvent e)
271 _app.rearrangeWaypoints(App.REARRANGE_TO_START);
274 _rearrangeStartItem.setEnabled(true);
275 _rearrangeMenu.add(_rearrangeStartItem);
276 _rearrangeEndItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.end"));
277 _rearrangeEndItem.addActionListener(new ActionListener() {
278 public void actionPerformed(ActionEvent e)
280 _app.rearrangeWaypoints(App.REARRANGE_TO_END);
283 _rearrangeEndItem.setEnabled(true);
284 _rearrangeMenu.add(_rearrangeEndItem);
285 _rearrangeNearestItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.nearest"));
286 _rearrangeNearestItem.addActionListener(new ActionListener() {
287 public void actionPerformed(ActionEvent e)
289 _app.rearrangeWaypoints(App.REARRANGE_TO_NEAREST);
292 _rearrangeNearestItem.setEnabled(true);
293 _rearrangeMenu.add(_rearrangeNearestItem);
294 editMenu.add(_rearrangeMenu);
295 menubar.add(editMenu);
298 JMenu selectMenu = new JMenu(I18nManager.getText("menu.select"));
299 _selectAllItem = new JMenuItem(I18nManager.getText("menu.select.all"));
300 _selectAllItem.setEnabled(false);
301 _selectAllItem.addActionListener(new ActionListener() {
302 public void actionPerformed(ActionEvent e)
307 selectMenu.add(_selectAllItem);
308 _selectNoneItem = new JMenuItem(I18nManager.getText("menu.select.none"));
309 _selectNoneItem.setEnabled(false);
310 _selectNoneItem.addActionListener(new ActionListener() {
311 public void actionPerformed(ActionEvent e)
316 selectMenu.add(_selectNoneItem);
317 selectMenu.addSeparator();
318 _selectStartItem = new JMenuItem(I18nManager.getText("menu.select.start"));
319 _selectStartItem.setEnabled(false);
320 _selectStartAction = new ActionListener() {
321 public void actionPerformed(ActionEvent e)
323 _selection.selectRangeStart();
326 _selectStartItem.addActionListener(_selectStartAction);
327 selectMenu.add(_selectStartItem);
328 _selectEndItem = new JMenuItem(I18nManager.getText("menu.select.end"));
329 _selectEndItem.setEnabled(false);
330 _selectEndAction = new ActionListener() {
331 public void actionPerformed(ActionEvent e)
333 _selection.selectRangeEnd();
336 _selectEndItem.addActionListener(_selectEndAction);
337 selectMenu.add(_selectEndItem);
338 menubar.add(selectMenu);
341 JMenu photoMenu = new JMenu(I18nManager.getText("menu.photo"));
342 addPhotosMenuItem = new JMenuItem(I18nManager.getText("menu.file.addphotos"));
343 addPhotosMenuItem.addActionListener(_addPhotoAction);
344 photoMenu.add(addPhotosMenuItem);
345 _saveExifItem = new JMenuItem(I18nManager.getText("menu.photo.saveexif"));
346 _saveExifItem.addActionListener(new ActionListener() {
347 public void actionPerformed(ActionEvent e)
352 _saveExifItem.setEnabled(false);
353 photoMenu.add(_saveExifItem);
354 _connectPhotoItem = new JMenuItem(I18nManager.getText("menu.photo.connect"));
355 _connectPhotoAction = new ActionListener() {
356 public void actionPerformed(ActionEvent e)
358 _app.connectPhotoToPoint();
361 _connectPhotoItem.addActionListener(_connectPhotoAction);
362 _connectPhotoItem.setEnabled(false);
363 photoMenu.add(_connectPhotoItem);
364 _deletePhotoItem = new JMenuItem(I18nManager.getText("menu.photo.delete"));
365 _deletePhotoItem.addActionListener(new ActionListener() {
366 public void actionPerformed(ActionEvent e)
368 _app.deleteCurrentPhoto();
371 _deletePhotoItem.setEnabled(false);
372 photoMenu.add(_deletePhotoItem);
373 menubar.add(photoMenu);
375 // Add 3d menu (whether java3d available or not)
376 JMenu threeDMenu = new JMenu(I18nManager.getText("menu.3d"));
377 _show3dItem = new JMenuItem(I18nManager.getText("menu.3d.show3d"));
378 _show3dItem.addActionListener(new ActionListener() {
379 public void actionPerformed(ActionEvent e)
384 _show3dItem.setEnabled(false);
385 threeDMenu.add(_show3dItem);
386 menubar.add(threeDMenu);
388 // Help menu for About
389 JMenu helpMenu = new JMenu(I18nManager.getText("menu.help"));
390 JMenuItem aboutItem = new JMenuItem(I18nManager.getText("menu.help.about"));
391 aboutItem.addActionListener(new ActionListener() {
392 public void actionPerformed(ActionEvent e)
394 new AboutScreen(_parent).show();
397 helpMenu.add(aboutItem);
398 menubar.add(helpMenu);
405 * Create a JToolBar containing all toolbar buttons
406 * @return toolbar containing buttons
408 public JToolBar createToolBar()
410 JToolBar toolbar = new JToolBar();
412 JButton openFileButton = new JButton(new ImageIcon(getClass().getResource("images/add_textfile_icon.png")));
413 openFileButton.setToolTipText(I18nManager.getText("menu.file.open"));
414 openFileButton.addActionListener(_openFileAction);
415 toolbar.add(openFileButton);
417 JButton addPhotoButton = new JButton(new ImageIcon(getClass().getResource("images/add_photo_icon.png")));
418 addPhotoButton.setToolTipText(I18nManager.getText("menu.file.addphotos"));
419 addPhotoButton.addActionListener(_addPhotoAction);
420 toolbar.add(addPhotoButton);
422 _saveButton = new JButton(new ImageIcon(getClass().getResource("images/save_icon.gif")));
423 _saveButton.setToolTipText(I18nManager.getText("menu.file.save"));
424 _saveButton.addActionListener(_saveAction);
425 _saveButton.setEnabled(false);
426 toolbar.add(_saveButton);
428 _undoButton = new JButton(new ImageIcon(getClass().getResource("images/undo_icon.gif")));
429 _undoButton.setToolTipText(I18nManager.getText("menu.edit.undo"));
430 _undoButton.addActionListener(_undoAction);
431 _undoButton.setEnabled(false);
432 toolbar.add(_undoButton);
434 _editPointButton = new JButton(new ImageIcon(getClass().getResource("images/edit_point_icon.gif")));
435 _editPointButton.setToolTipText(I18nManager.getText("menu.edit.editpoint"));
436 _editPointButton.addActionListener(_editPointAction);
437 _editPointButton.setEnabled(false);
438 toolbar.add(_editPointButton);
440 _selectStartButton = new JButton(new ImageIcon(getClass().getResource("images/set_start_icon.png")));
441 _selectStartButton.setToolTipText(I18nManager.getText("menu.select.start"));
442 _selectStartButton.addActionListener(_selectStartAction);
443 _selectStartButton.setEnabled(false);
444 toolbar.add(_selectStartButton);
445 _selectEndButton = new JButton(new ImageIcon(getClass().getResource("images/set_end_icon.png")));
446 _selectEndButton.setToolTipText(I18nManager.getText("menu.select.end"));
447 _selectEndButton.addActionListener(_selectEndAction);
448 _selectEndButton.setEnabled(false);
449 toolbar.add(_selectEndButton);
450 _connectPhotoButton = new JButton(new ImageIcon(getClass().getResource("images/connect_photo_icon.png")));
451 _connectPhotoButton.setToolTipText(I18nManager.getText("menu.photo.connect"));
452 _connectPhotoButton.addActionListener(_connectPhotoAction);
453 _connectPhotoButton.setEnabled(false);
454 toolbar.add(_connectPhotoButton);
456 toolbar.setFloatable(false);
462 * Method to update menu when file loaded
464 public void informFileLoaded()
466 // save, undo, delete enabled
467 _saveItem.setEnabled(true);
468 _undoItem.setEnabled(true);
469 _deleteDuplicatesItem.setEnabled(true);
470 _compressItem.setEnabled(true);
475 * @see tim.prune.DataSubscriber#dataUpdated(tim.prune.data.Track)
477 public void dataUpdated(byte inUpdateType)
479 boolean hasData = (_track != null && _track.getNumPoints() > 0);
480 // set functions which require data
481 _saveItem.setEnabled(hasData);
482 _saveButton.setEnabled(hasData);
483 _exportKmlItem.setEnabled(hasData);
484 _exportPovItem.setEnabled(hasData);
485 _deleteDuplicatesItem.setEnabled(hasData);
486 _compressItem.setEnabled(hasData);
487 _rearrangeMenu.setEnabled(hasData && _track.hasMixedData());
488 _selectAllItem.setEnabled(hasData);
489 _selectNoneItem.setEnabled(hasData);
490 if (_show3dItem != null)
491 _show3dItem.setEnabled(hasData);
492 // is undo available?
493 boolean hasUndo = !_app.getUndoStack().isEmpty();
494 _undoItem.setEnabled(hasUndo);
495 _undoButton.setEnabled(hasUndo);
496 _clearUndoItem.setEnabled(hasUndo);
497 // is there a current point?
498 boolean hasPoint = (hasData && _selection.getCurrentPointIndex() >= 0);
499 _editPointItem.setEnabled(hasPoint);
500 _editPointButton.setEnabled(hasPoint);
501 _editWaypointNameItem.setEnabled(hasPoint);
502 _deletePointItem.setEnabled(hasPoint);
503 _selectStartItem.setEnabled(hasPoint);
504 _selectStartButton.setEnabled(hasPoint);
505 _selectEndItem.setEnabled(hasPoint);
506 _selectEndButton.setEnabled(hasPoint);
507 // are there any photos?
508 _saveExifItem.setEnabled(_photos != null && _photos.getNumPhotos() > 0);
509 // is there a current photo?
510 boolean hasPhoto = _photos != null && _photos.getNumPhotos() > 0
511 && _selection.getCurrentPhotoIndex() >= 0;
512 // connect is only available when current photo is not connected to current point
513 boolean connectAvailable = hasPhoto && hasPoint
514 && _track.getPoint(_selection.getCurrentPointIndex()).getPhoto() == null;
515 _connectPhotoItem.setEnabled(connectAvailable);
516 _connectPhotoButton.setEnabled(connectAvailable);
517 _deletePhotoItem.setEnabled(hasPhoto);
518 // is there a current range?
519 boolean hasRange = (hasData && _selection.hasRangeSelected());
520 _deleteRangeItem.setEnabled(hasRange);
521 _interpolateItem.setEnabled(hasRange
522 && (_selection.getEnd() - _selection.getStart()) == 1);
523 _reverseItem.setEnabled(hasRange);