]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/gui/MenuManager.java
5a4b009ada4d092265b337cc72234fd76ad934e4
[GpsPrune.git] / tim / prune / gui / MenuManager.java
1 package tim.prune.gui;
2
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.awt.event.InputEvent;
6 import java.awt.event.KeyEvent;
7
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;
16
17 import tim.prune.App;
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;
24
25 /**
26  * Class to manage the menu bar and tool bar,
27  * including enabling and disabling the items
28  */
29 public class MenuManager implements DataSubscriber
30 {
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;
36
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?
64
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;
74
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;
82
83
84         /**
85          * Constructor
86          * @param inParent parent object for dialogs
87          * @param inApp application to call on menu actions
88          */
89         public MenuManager(JFrame inParent, App inApp, TrackInfo inTrackInfo)
90         {
91                 _parent = inParent;
92                 _app = inApp;
93                 _track = inTrackInfo.getTrack();
94                 _selection = inTrackInfo.getSelection();
95                 _photos = inTrackInfo.getPhotoList();
96         }
97
98
99         /**
100          * Create a JMenuBar containing all menu items
101          * @return JMenuBar
102          */
103         public JMenuBar createMenuBar()
104         {
105                 JMenuBar menubar = new JMenuBar();
106                 JMenu fileMenu = new JMenu(I18nManager.getText("menu.file"));
107                 // Open 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)
112                         {
113                                 _app.openFile();
114                         }
115                 };
116                 openMenuItem.addActionListener(_openFileAction);
117                 fileMenu.add(openMenuItem);
118                 // Add photos
119                 JMenuItem addPhotosMenuItem = new JMenuItem(I18nManager.getText("menu.file.addphotos"));
120                 _addPhotoAction = new ActionListener() {
121                         public void actionPerformed(ActionEvent e)
122                         {
123                                 _app.addPhotos();
124                         }
125                 };
126                 addPhotosMenuItem.addActionListener(_addPhotoAction);
127                 fileMenu.add(addPhotosMenuItem);
128                 // Save
129                 _saveItem = new JMenuItem(I18nManager.getText("menu.file.save"), KeyEvent.VK_S);
130                 _saveAction = new ActionListener() {
131                         public void actionPerformed(ActionEvent e)
132                         {
133                                 _app.saveFile();
134                         }
135                 };
136                 _saveItem.addActionListener(_saveAction);
137                 _saveItem.setEnabled(false);
138                 fileMenu.add(_saveItem);
139                 // Export
140                 _exportKmlItem = new JMenuItem(I18nManager.getText("menu.file.exportkml"));
141                 _exportKmlItem.addActionListener(new ActionListener() {
142                         public void actionPerformed(ActionEvent e)
143                         {
144                                 _app.exportKml();
145                         }
146                 });
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)
152                         {
153                                 _app.exportPov();
154                         }
155                 });
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)
162                         {
163                                 _app.exit();
164                         }
165                 });
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)
173                         {
174                                 _app.beginUndo();
175                         }
176                 };
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)
183                         {
184                                 _app.clearUndo();
185                         }
186                 });
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)
193                         {
194                                 _app.editCurrentPoint();
195                         }
196                 };
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)
203                         {
204                                 _app.editCurrentPointName();
205                         }
206                 });
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)
212                         {
213                                 _app.deleteCurrentPoint();
214                         }
215                 });
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)
221                         {
222                                 _app.deleteSelectedRange();
223                         }
224                 });
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)
230                         {
231                                 _app.deleteDuplicates();
232                         }
233                 });
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)
239                         {
240                                 _app.compressTrack();
241                         }
242                 });
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)
249                         {
250                                 _app.interpolateSelection();
251                         }
252                 });
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)
258                         {
259                                 _app.reverseRange();
260                         }
261                 });
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)
270                         {
271                                 _app.rearrangeWaypoints(App.REARRANGE_TO_START);
272                         }
273                 });
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)
279                         {
280                                 _app.rearrangeWaypoints(App.REARRANGE_TO_END);
281                         }
282                 });
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)
288                         {
289                                 _app.rearrangeWaypoints(App.REARRANGE_TO_NEAREST);
290                         }
291                 });
292                 _rearrangeNearestItem.setEnabled(true);
293                 _rearrangeMenu.add(_rearrangeNearestItem);
294                 editMenu.add(_rearrangeMenu);
295                 menubar.add(editMenu);
296
297                 // Select menu
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)
303                         {
304                                 _app.selectAll();
305                         }
306                 });
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)
312                         {
313                                 _app.selectNone();
314                         }
315                 });
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)
322                         {
323                                 _selection.selectRangeStart();
324                         }
325                 };
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)
332                         {
333                                 _selection.selectRangeEnd();
334                         }
335                 };
336                 _selectEndItem.addActionListener(_selectEndAction);
337                 selectMenu.add(_selectEndItem);
338                 menubar.add(selectMenu);
339
340                 // Add photo menu
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)
348                         {
349                                 _app.saveExif();
350                         }
351                 });
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)
357                         {
358                                 _app.connectPhotoToPoint();
359                         }
360                 };
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)
367                         {
368                                 _app.deleteCurrentPhoto();
369                         }
370                 });
371                 _deletePhotoItem.setEnabled(false);
372                 photoMenu.add(_deletePhotoItem);
373                 menubar.add(photoMenu);
374
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)
380                         {
381                                 _app.show3dWindow();
382                         }
383                 });
384                 _show3dItem.setEnabled(false);
385                 threeDMenu.add(_show3dItem);
386                 menubar.add(threeDMenu);
387
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)
393                         {
394                                 new AboutScreen(_parent).show();
395                         }
396                 });
397                 helpMenu.add(aboutItem);
398                 menubar.add(helpMenu);
399
400                 return menubar;
401         }
402
403
404         /**
405          * Create a JToolBar containing all toolbar buttons
406          * @return toolbar containing buttons
407          */
408         public JToolBar createToolBar()
409         {
410                 JToolBar toolbar = new JToolBar();
411                 // Add text file
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);
416                 // Add photo
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);
421                 // Save
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);
427                 // Undo
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);
433                 // Edit point
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);
439                 // Select start, end
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);
455                 // finish off
456                 toolbar.setFloatable(false);
457                 return toolbar;
458         }
459
460
461         /**
462          * Method to update menu when file loaded
463          */
464         public void informFileLoaded()
465         {
466                 // save, undo, delete enabled
467                 _saveItem.setEnabled(true);
468                 _undoItem.setEnabled(true);
469                 _deleteDuplicatesItem.setEnabled(true);
470                 _compressItem.setEnabled(true);
471         }
472
473
474         /**
475          * @see tim.prune.DataSubscriber#dataUpdated(tim.prune.data.Track)
476          */
477         public void dataUpdated(byte inUpdateType)
478         {
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);
524         }
525 }