]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/gui/MenuManager.java
Version 7, February 2009
[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 import javax.swing.JButton;
8 import javax.swing.JMenu;
9 import javax.swing.JMenuBar;
10 import javax.swing.JMenuItem;
11 import javax.swing.JToolBar;
12 import javax.swing.KeyStroke;
13
14 import tim.prune.App;
15 import tim.prune.DataSubscriber;
16 import tim.prune.FunctionLibrary;
17 import tim.prune.GenericFunction;
18 import tim.prune.I18nManager;
19 import tim.prune.data.PhotoList;
20 import tim.prune.data.Selection;
21 import tim.prune.data.Track;
22 import tim.prune.data.TrackInfo;
23 import tim.prune.function.RearrangeWaypointsFunction.Rearrange;
24 import tim.prune.function.browser.UrlGenerator;
25
26 /**
27  * Class to manage the menu bar and tool bar,
28  * including enabling and disabling the items
29  */
30 public class MenuManager implements DataSubscriber
31 {
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 _sendGpsItem = null;
39         private JMenuItem _saveItem = null;
40         private JMenuItem _exportKmlItem = null;
41         private JMenuItem _exportGpxItem = null;
42         private JMenuItem _exportPovItem = null;
43         private JMenuItem _undoItem = null;
44         private JMenuItem _clearUndoItem = null;
45         private JMenuItem _editPointItem = null;
46         private JMenuItem _editWaypointNameItem = null;
47         private JMenuItem _deletePointItem = null;
48         private JMenuItem _deleteRangeItem = null;
49         private JMenuItem _compressItem = null;
50         private JMenuItem _deleteMarkedPointsItem = null;
51         private JMenuItem _interpolateItem = null;
52         private JMenuItem _averageItem = null;
53         private JMenuItem _selectAllItem = null;
54         private JMenuItem _selectNoneItem = null;
55         private JMenuItem _selectStartItem = null;
56         private JMenuItem _selectEndItem = null;
57         private JMenuItem _reverseItem = null;
58         private JMenuItem _addTimeOffsetItem = null;
59         private JMenuItem _mergeSegmentsItem = null;
60         private JMenu     _rearrangeMenu = null;
61         private JMenuItem _cutAndMoveItem = null;
62         private JMenuItem _show3dItem = null;
63         private JMenu     _browserMapMenu = null;
64         private JMenuItem _chartItem = null;
65         private JMenuItem _distanceItem = null;
66         private JMenuItem _saveExifItem = null;
67         private JMenuItem _connectPhotoItem = null;
68         private JMenuItem _deletePhotoItem = null;
69         private JMenuItem _disconnectPhotoItem = null;
70         private JMenuItem _correlatePhotosItem = null;
71
72         // ActionListeners for reuse by menu and toolbar
73         private ActionListener _openFileAction = null;
74         private ActionListener _addPhotoAction = null;
75         private ActionListener _saveAction = null;
76         private ActionListener _undoAction = null;
77         private ActionListener _editPointAction = null;
78         private ActionListener _deletePointAction = null;
79         private ActionListener _deleteRangeAction = null;
80         private ActionListener _selectStartAction = null;
81         private ActionListener _selectEndAction = null;
82         private ActionListener _connectPhotoAction = null;
83
84         // Toolbar buttons which need enabling/disabling
85         private JButton _saveButton = null;
86         private JButton _undoButton = null;
87         private JButton _editPointButton = null;
88         private JButton _deletePointButton = null;
89         private JButton _deleteRangeButton = null;
90         private JButton _selectStartButton = null;
91         private JButton _selectEndButton = null;
92         private JButton _connectPhotoButton = null;
93
94
95         /**
96          * Constructor
97          * @param inApp application to call on menu actions
98          * @param inTrackInfo track info object
99          */
100         public MenuManager(App inApp, TrackInfo inTrackInfo)
101         {
102                 _app = inApp;
103                 _track = inTrackInfo.getTrack();
104                 _selection = inTrackInfo.getSelection();
105                 _photos = inTrackInfo.getPhotoList();
106         }
107
108
109         /**
110          * Create a JMenuBar containing all menu items
111          * @return JMenuBar
112          */
113         public JMenuBar createMenuBar()
114         {
115                 JMenuBar menubar = new JMenuBar();
116                 JMenu fileMenu = new JMenu(I18nManager.getText("menu.file"));
117                 // Open file
118                 JMenuItem openMenuItem = new JMenuItem(I18nManager.getText("menu.file.open"));
119                 openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
120                 _openFileAction = new ActionListener() {
121                         public void actionPerformed(ActionEvent e)
122                         {
123                                 _app.openFile();
124                         }
125                 };
126                 openMenuItem.addActionListener(_openFileAction);
127                 fileMenu.add(openMenuItem);
128                 // Add photos
129                 JMenuItem addPhotosMenuItem = new JMenuItem(I18nManager.getText("menu.file.addphotos"));
130                 _addPhotoAction = new ActionListener() {
131                         public void actionPerformed(ActionEvent e)
132                         {
133                                 _app.addPhotos();
134                         }
135                 };
136                 addPhotosMenuItem.addActionListener(_addPhotoAction);
137                 fileMenu.add(addPhotosMenuItem);
138                 fileMenu.addSeparator();
139                 // Load from GPS
140                 JMenuItem loadFromGpsMenuItem = makeMenuItem(FunctionLibrary.FUNCTION_GPSLOAD);
141                 loadFromGpsMenuItem.addActionListener(new ActionListener() {
142                         public void actionPerformed(ActionEvent e)
143                         {
144                                 FunctionLibrary.FUNCTION_GPSLOAD.begin();
145                         }
146                 });
147                 fileMenu.add(loadFromGpsMenuItem);
148                 // Save to GPS
149                 _sendGpsItem = makeMenuItem(FunctionLibrary.FUNCTION_GPSSAVE);
150                 _sendGpsItem.addActionListener(new ActionListener() {
151                         public void actionPerformed(ActionEvent e)
152                         {
153                                 FunctionLibrary.FUNCTION_GPSSAVE.begin();
154                         }
155                 });
156                 _sendGpsItem.setEnabled(false);
157                 fileMenu.add(_sendGpsItem);
158                 fileMenu.addSeparator();
159                 // Save
160                 _saveItem = new JMenuItem(I18nManager.getText("menu.file.save"), KeyEvent.VK_S);
161                 _saveAction = new ActionListener() {
162                         public void actionPerformed(ActionEvent e)
163                         {
164                                 _app.saveFile();
165                         }
166                 };
167                 _saveItem.addActionListener(_saveAction);
168                 _saveItem.setEnabled(false);
169                 fileMenu.add(_saveItem);
170                 // Export - Kml
171                 _exportKmlItem = makeMenuItem(FunctionLibrary.FUNCTION_KMLEXPORT);
172                 _exportKmlItem.addActionListener(new ActionListener() {
173                         public void actionPerformed(ActionEvent e)
174                         {
175                                 FunctionLibrary.FUNCTION_KMLEXPORT.begin();
176                         }
177                 });
178                 _exportKmlItem.setEnabled(false);
179                 fileMenu.add(_exportKmlItem);
180                 // Gpx
181                 _exportGpxItem = makeMenuItem(FunctionLibrary.FUNCTION_GPXEXPORT);
182                 _exportGpxItem.addActionListener(new ActionListener() {
183                         public void actionPerformed(ActionEvent e)
184                         {
185                                 FunctionLibrary.FUNCTION_GPXEXPORT.begin();
186                         }
187                 });
188                 _exportGpxItem.setEnabled(false);
189                 fileMenu.add(_exportGpxItem);
190                 // Pov
191                 _exportPovItem = makeMenuItem(FunctionLibrary.FUNCTION_POVEXPORT);
192                 _exportPovItem.addActionListener(new ActionListener() {
193                         public void actionPerformed(ActionEvent e)
194                         {
195                                 FunctionLibrary.FUNCTION_POVEXPORT.begin();
196                         }
197                 });
198                 _exportPovItem.setEnabled(false);
199                 fileMenu.add(_exportPovItem);
200                 fileMenu.addSeparator();
201                 JMenuItem exitMenuItem = new JMenuItem(I18nManager.getText("menu.file.exit"));
202                 exitMenuItem.addActionListener(new ActionListener() {
203                         public void actionPerformed(ActionEvent e)
204                         {
205                                 _app.exit();
206                         }
207                 });
208                 fileMenu.add(exitMenuItem);
209                 menubar.add(fileMenu);
210                 // Edit menu
211                 JMenu editMenu = new JMenu(I18nManager.getText("menu.edit"));
212                 editMenu.setMnemonic(KeyEvent.VK_E);
213                 _undoItem = new JMenuItem(I18nManager.getText("menu.edit.undo"));
214                 _undoAction = new ActionListener() {
215                         public void actionPerformed(ActionEvent e)
216                         {
217                                 _app.beginUndo();
218                         }
219                 };
220                 _undoItem.addActionListener(_undoAction);
221                 _undoItem.setEnabled(false);
222                 editMenu.add(_undoItem);
223                 _clearUndoItem = new JMenuItem(I18nManager.getText("menu.edit.clearundo"));
224                 _clearUndoItem.addActionListener(new ActionListener() {
225                         public void actionPerformed(ActionEvent e)
226                         {
227                                 _app.clearUndo();
228                         }
229                 });
230                 _clearUndoItem.setEnabled(false);
231                 editMenu.add(_clearUndoItem);
232                 editMenu.addSeparator();
233                 _editPointItem = new JMenuItem(I18nManager.getText("menu.edit.editpoint"));
234                 _editPointAction = new ActionListener() {
235                         public void actionPerformed(ActionEvent e)
236                         {
237                                 _app.editCurrentPoint();
238                         }
239                 };
240                 _editPointItem.addActionListener(_editPointAction);
241                 _editPointItem.setEnabled(false);
242                 editMenu.add(_editPointItem);
243                 _editWaypointNameItem = new JMenuItem(I18nManager.getText("menu.edit.editwaypointname"));
244                 _editWaypointNameItem.addActionListener(new ActionListener() {
245                         public void actionPerformed(ActionEvent e)
246                         {
247                                 _app.editCurrentPointName();
248                         }
249                 });
250                 _editWaypointNameItem.setEnabled(false);
251                 editMenu.add(_editWaypointNameItem);
252                 _deletePointItem = new JMenuItem(I18nManager.getText("menu.edit.deletepoint"));
253                 _deletePointAction = new ActionListener() {
254                         public void actionPerformed(ActionEvent e)
255                         {
256                                 _app.deleteCurrentPoint();
257                         }
258                 };
259                 _deletePointItem.addActionListener(_deletePointAction);
260                 _deletePointItem.setEnabled(false);
261                 editMenu.add(_deletePointItem);
262                 _deleteRangeItem = new JMenuItem(I18nManager.getText("menu.edit.deleterange"));
263                 _deleteRangeAction = new ActionListener() {
264                         public void actionPerformed(ActionEvent e)
265                         {
266                                 _app.deleteSelectedRange();
267                         }
268                 };
269                 _deleteRangeItem.addActionListener(_deleteRangeAction);
270                 _deleteRangeItem.setEnabled(false);
271                 editMenu.add(_deleteRangeItem);
272                 editMenu.addSeparator();
273                 _compressItem = makeMenuItem(FunctionLibrary.FUNCTION_COMPRESS);
274                 _compressItem.addActionListener(new ActionListener() {
275                         public void actionPerformed(ActionEvent e)
276                         {
277                                 FunctionLibrary.FUNCTION_COMPRESS.begin();
278                         }
279                 });
280                 _compressItem.setEnabled(false);
281                 editMenu.add(_compressItem);
282                 _deleteMarkedPointsItem = new JMenuItem(I18nManager.getText("menu.edit.deletemarked"));
283                 _deleteMarkedPointsItem.addActionListener(new ActionListener() {
284                         public void actionPerformed(ActionEvent e)
285                         {
286                                 _app.finishCompressTrack();
287                         }
288                 });
289                 _deleteMarkedPointsItem.setEnabled(false);
290                 editMenu.add(_deleteMarkedPointsItem);
291                 editMenu.addSeparator();
292                 _interpolateItem = new JMenuItem(I18nManager.getText("menu.edit.interpolate"));
293                 _interpolateItem.addActionListener(new ActionListener() {
294                         public void actionPerformed(ActionEvent e)
295                         {
296                                 _app.interpolateSelection();
297                         }
298                 });
299                 _interpolateItem.setEnabled(false);
300                 editMenu.add(_interpolateItem);
301                 _averageItem = new JMenuItem(I18nManager.getText("menu.edit.average"));
302                 _averageItem.addActionListener(new ActionListener() {
303                         public void actionPerformed(ActionEvent e)
304                         {
305                                 _app.averageSelection();
306                         }
307                 });
308                 _averageItem.setEnabled(false);
309                 editMenu.add(_averageItem);
310                 _reverseItem = new JMenuItem(I18nManager.getText("menu.edit.reverse"));
311                 _reverseItem.addActionListener(new ActionListener() {
312                         public void actionPerformed(ActionEvent e)
313                         {
314                                 _app.reverseRange();
315                         }
316                 });
317                 _reverseItem.setEnabled(false);
318                 editMenu.add(_reverseItem);
319                 _addTimeOffsetItem = makeMenuItem(FunctionLibrary.FUNCTION_ADD_TIME_OFFSET);
320                 _addTimeOffsetItem.addActionListener(new ActionListener() {
321                         public void actionPerformed(ActionEvent e)
322                         {
323                                 FunctionLibrary.FUNCTION_ADD_TIME_OFFSET.begin();
324                         }
325                 });
326                 _addTimeOffsetItem.setEnabled(false);
327                 editMenu.add(_addTimeOffsetItem);
328                 _mergeSegmentsItem = new JMenuItem(I18nManager.getText("menu.edit.mergetracksegments"));
329                 _mergeSegmentsItem.addActionListener(new ActionListener() {
330                         public void actionPerformed(ActionEvent e)
331                         {
332                                 _app.mergeTrackSegments();
333                         }
334                 });
335                 _mergeSegmentsItem.setEnabled(false);
336                 editMenu.add(_mergeSegmentsItem);
337                 // Rearrange waypoints
338                 _rearrangeMenu = new JMenu(I18nManager.getText("menu.edit.rearrange"));
339                 _rearrangeMenu.setEnabled(false);
340                 JMenuItem  rearrangeStartItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.start"));
341                 rearrangeStartItem.addActionListener(new ActionListener() {
342                         public void actionPerformed(ActionEvent e)
343                         {
344                                 FunctionLibrary.FUNCTION_REARRANGE_WAYPOINTS.rearrangeWaypoints(Rearrange.TO_START);
345                         }
346                 });
347                 rearrangeStartItem.setEnabled(true);
348                 _rearrangeMenu.add(rearrangeStartItem);
349                 JMenuItem rearrangeEndItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.end"));
350                 rearrangeEndItem.addActionListener(new ActionListener() {
351                         public void actionPerformed(ActionEvent e)
352                         {
353                                 FunctionLibrary.FUNCTION_REARRANGE_WAYPOINTS.rearrangeWaypoints(Rearrange.TO_END);
354                         }
355                 });
356                 rearrangeEndItem.setEnabled(true);
357                 _rearrangeMenu.add(rearrangeEndItem);
358                 JMenuItem rearrangeNearestItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.nearest"));
359                 rearrangeNearestItem.addActionListener(new ActionListener() {
360                         public void actionPerformed(ActionEvent e)
361                         {
362                                 FunctionLibrary.FUNCTION_REARRANGE_WAYPOINTS.rearrangeWaypoints(Rearrange.TO_NEAREST);
363                         }
364                 });
365                 rearrangeNearestItem.setEnabled(true);
366                 _rearrangeMenu.add(rearrangeNearestItem);
367                 editMenu.add(_rearrangeMenu);
368                 _cutAndMoveItem = new JMenuItem(I18nManager.getText("menu.edit.cutandmove"));
369                 _cutAndMoveItem.addActionListener(new ActionListener() {
370                         public void actionPerformed(ActionEvent e)
371                         {
372                                 _app.cutAndMoveSelection();
373                         }
374                 });
375                 _cutAndMoveItem.setEnabled(false);
376                 editMenu.add(_cutAndMoveItem);
377                 menubar.add(editMenu);
378
379                 // Select menu
380                 JMenu selectMenu = new JMenu(I18nManager.getText("menu.select"));
381                 _selectAllItem = new JMenuItem(I18nManager.getText("menu.select.all"));
382                 _selectAllItem.setEnabled(false);
383                 _selectAllItem.addActionListener(new ActionListener() {
384                         public void actionPerformed(ActionEvent e)
385                         {
386                                 _app.selectAll();
387                         }
388                 });
389                 selectMenu.add(_selectAllItem);
390                 _selectNoneItem = new JMenuItem(I18nManager.getText("menu.select.none"));
391                 _selectNoneItem.setEnabled(false);
392                 _selectNoneItem.addActionListener(new ActionListener() {
393                         public void actionPerformed(ActionEvent e)
394                         {
395                                 _app.selectNone();
396                         }
397                 });
398                 selectMenu.add(_selectNoneItem);
399                 selectMenu.addSeparator();
400                 _selectStartItem = new JMenuItem(I18nManager.getText("menu.select.start"));
401                 _selectStartItem.setEnabled(false);
402                 _selectStartAction = new ActionListener() {
403                         public void actionPerformed(ActionEvent e)
404                         {
405                                 _selection.selectRangeStart();
406                         }
407                 };
408                 _selectStartItem.addActionListener(_selectStartAction);
409                 selectMenu.add(_selectStartItem);
410                 _selectEndItem = new JMenuItem(I18nManager.getText("menu.select.end"));
411                 _selectEndItem.setEnabled(false);
412                 _selectEndAction = new ActionListener() {
413                         public void actionPerformed(ActionEvent e)
414                         {
415                                 _selection.selectRangeEnd();
416                         }
417                 };
418                 _selectEndItem.addActionListener(_selectEndAction);
419                 selectMenu.add(_selectEndItem);
420                 menubar.add(selectMenu);
421
422                 // Add view menu
423                 JMenu viewMenu = new JMenu(I18nManager.getText("menu.view"));
424                 _show3dItem = makeMenuItem(FunctionLibrary.FUNCTION_3D);
425                 _show3dItem.addActionListener(new ActionListener() {
426                         public void actionPerformed(ActionEvent e)
427                         {
428                                 FunctionLibrary.FUNCTION_3D.begin();
429                         }
430                 });
431                 _show3dItem.setEnabled(false);
432                 viewMenu.add(_show3dItem);
433                 // browser submenu
434                 _browserMapMenu = new JMenu(I18nManager.getText("menu.view.browser"));
435                 _browserMapMenu.setEnabled(false);
436                 JMenuItem googleMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.google"));
437                 googleMapsItem.addActionListener(new ActionListener() {
438                         public void actionPerformed(ActionEvent e)
439                         {
440                                 _app.showExternalMap(UrlGenerator.MAP_SOURCE_GOOGLE);
441                         }
442                 });
443                 _browserMapMenu.add(googleMapsItem);
444                 JMenuItem openMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.openstreetmap"));
445                 openMapsItem.addActionListener(new ActionListener() {
446                         public void actionPerformed(ActionEvent e)
447                         {
448                                 _app.showExternalMap(UrlGenerator.MAP_SOURCE_OSM);
449                         }
450                 });
451                 _browserMapMenu.add(openMapsItem);
452                 JMenuItem mapquestMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.mapquest"));
453                 mapquestMapsItem.addActionListener(new ActionListener() {
454                         public void actionPerformed(ActionEvent e)
455                         {
456                                 _app.showExternalMap(UrlGenerator.MAP_SOURCE_MAPQUEST);
457                         }
458                 });
459                 _browserMapMenu.add(mapquestMapsItem);
460                 JMenuItem yahooMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.yahoo"));
461                 yahooMapsItem.addActionListener(new ActionListener() {
462                         public void actionPerformed(ActionEvent e)
463                         {
464                                 _app.showExternalMap(UrlGenerator.MAP_SOURCE_YAHOO);
465                         }
466                 });
467                 _browserMapMenu.add(yahooMapsItem);
468                 viewMenu.add(_browserMapMenu);
469                 // Charts
470                 _chartItem = makeMenuItem(FunctionLibrary.FUNCTION_CHARTS);
471                 _chartItem.addActionListener(new ActionListener() {
472                         public void actionPerformed(ActionEvent e)
473                         {
474                                 FunctionLibrary.FUNCTION_CHARTS.begin();
475                         }
476                 });
477                 _chartItem.setEnabled(false);
478                 viewMenu.add(_chartItem);
479                 // Distances
480                 _distanceItem = makeMenuItem(FunctionLibrary.FUNCTION_DISTANCES);
481                 _distanceItem.setEnabled(false);
482                 _distanceItem.addActionListener(new ActionListener() {
483                         public void actionPerformed(ActionEvent e) {
484                                 FunctionLibrary.FUNCTION_DISTANCES.begin();
485                         }
486                 });
487                 viewMenu.add(_distanceItem);
488                 // Set the map background
489                 JMenuItem mapBgItem = makeMenuItem(FunctionLibrary.FUNCTION_SET_MAP_BG);
490                 mapBgItem.addActionListener(new ActionListener() {
491                         public void actionPerformed(ActionEvent arg0) {
492                                 FunctionLibrary.FUNCTION_SET_MAP_BG.begin();
493                         }
494                 });
495                 viewMenu.add(mapBgItem);
496                 menubar.add(viewMenu);
497
498                 // Add photo menu
499                 JMenu photoMenu = new JMenu(I18nManager.getText("menu.photo"));
500                 addPhotosMenuItem = new JMenuItem(I18nManager.getText("menu.file.addphotos"));
501                 addPhotosMenuItem.addActionListener(_addPhotoAction);
502                 photoMenu.add(addPhotosMenuItem);
503                 _saveExifItem = new JMenuItem(I18nManager.getText("menu.photo.saveexif"));
504                 _saveExifItem.addActionListener(new ActionListener() {
505                         public void actionPerformed(ActionEvent e)
506                         {
507                                 _app.saveExif();
508                         }
509                 });
510                 _saveExifItem.setEnabled(false);
511                 photoMenu.add(_saveExifItem);
512                 _connectPhotoItem = new JMenuItem(I18nManager.getText("menu.photo.connect"));
513                 _connectPhotoAction = new ActionListener() {
514                         public void actionPerformed(ActionEvent e)
515                         {
516                                 _app.connectPhotoToPoint();
517                         }
518                 };
519                 _connectPhotoItem.addActionListener(_connectPhotoAction);
520                 _connectPhotoItem.setEnabled(false);
521                 photoMenu.addSeparator();
522                 photoMenu.add(_connectPhotoItem);
523                 // disconnect photo
524                 _disconnectPhotoItem = new JMenuItem(I18nManager.getText("menu.photo.disconnect"));
525                 _disconnectPhotoItem.addActionListener(new ActionListener() {
526                         public void actionPerformed(ActionEvent e)
527                         {
528                                 _app.disconnectPhotoFromPoint();
529                         }
530                 });
531                 _disconnectPhotoItem.setEnabled(false);
532                 photoMenu.add(_disconnectPhotoItem);
533                 _deletePhotoItem = new JMenuItem(I18nManager.getText("menu.photo.delete"));
534                 _deletePhotoItem.addActionListener(new ActionListener() {
535                         public void actionPerformed(ActionEvent e)
536                         {
537                                 _app.deleteCurrentPhoto();
538                         }
539                 });
540                 _deletePhotoItem.setEnabled(false);
541                 photoMenu.add(_deletePhotoItem);
542                 photoMenu.addSeparator();
543                 // correlate all photos
544                 _correlatePhotosItem = makeMenuItem(FunctionLibrary.FUNCTION_CORRELATE_PHOTOS);
545                 _correlatePhotosItem.addActionListener(new ActionListener() {
546                         public void actionPerformed(ActionEvent e)
547                         {
548                                 FunctionLibrary.FUNCTION_CORRELATE_PHOTOS.begin();
549                         }
550                 });
551                 _correlatePhotosItem.setEnabled(false);
552                 photoMenu.add(_correlatePhotosItem);
553                 menubar.add(photoMenu);
554
555                 // Help menu
556                 JMenu helpMenu = new JMenu(I18nManager.getText("menu.help"));
557                 JMenuItem helpItem = makeMenuItem(FunctionLibrary.FUNCTION_HELP);
558                 helpItem.addActionListener(new ActionListener() {
559                         public void actionPerformed(ActionEvent e)
560                         {
561                                 FunctionLibrary.FUNCTION_HELP.begin();
562                         }
563                 });
564                 helpMenu.add(helpItem);
565                 JMenuItem aboutItem = makeMenuItem(FunctionLibrary.FUNCTION_ABOUT);
566                 aboutItem.addActionListener(new ActionListener() {
567                         public void actionPerformed(ActionEvent e)
568                         {
569                                 FunctionLibrary.FUNCTION_ABOUT.begin();
570                         }
571                 });
572                 helpMenu.add(aboutItem);
573                 JMenuItem checkVersionItem = makeMenuItem(FunctionLibrary.FUNCTION_CHECK_VERSION);
574                 checkVersionItem.addActionListener(new ActionListener() {
575                         public void actionPerformed(ActionEvent e)
576                         {
577                                 FunctionLibrary.FUNCTION_CHECK_VERSION.begin();
578                         }
579                 });
580                 helpMenu.add(checkVersionItem);
581                 menubar.add(helpMenu);
582
583                 return menubar;
584         }
585
586         /**
587          * Convenience method for making a menu item using a function
588          * @param inFunction function
589          * @return menu item using localized name of function
590          */
591         private static JMenuItem makeMenuItem(GenericFunction inFunction)
592         {
593                 return new JMenuItem(I18nManager.getText(inFunction.getNameKey()));
594         }
595
596         /**
597          * Create a JToolBar containing all toolbar buttons
598          * @return toolbar containing buttons
599          */
600         public JToolBar createToolBar()
601         {
602                 JToolBar toolbar = new JToolBar();
603                 // Add text file
604                 JButton openFileButton = new JButton(IconManager.getImageIcon(IconManager.OPEN_FILE));
605                 openFileButton.setToolTipText(I18nManager.getText("menu.file.open"));
606                 openFileButton.addActionListener(_openFileAction);
607                 toolbar.add(openFileButton);
608                 // Add photo
609                 JButton addPhotoButton = new JButton(IconManager.getImageIcon(IconManager.ADD_PHOTO));
610                 addPhotoButton.setToolTipText(I18nManager.getText("menu.file.addphotos"));
611                 addPhotoButton.addActionListener(_addPhotoAction);
612                 toolbar.add(addPhotoButton);
613                 // Save
614                 _saveButton = new JButton(IconManager.getImageIcon(IconManager.SAVE_FILE));
615                 _saveButton.setToolTipText(I18nManager.getText("menu.file.save"));
616                 _saveButton.addActionListener(_saveAction);
617                 _saveButton.setEnabled(false);
618                 toolbar.add(_saveButton);
619                 // Undo
620                 _undoButton = new JButton(IconManager.getImageIcon(IconManager.UNDO));
621                 _undoButton.setToolTipText(I18nManager.getText("menu.edit.undo"));
622                 _undoButton.addActionListener(_undoAction);
623                 _undoButton.setEnabled(false);
624                 toolbar.add(_undoButton);
625                 // Edit point
626                 _editPointButton = new JButton(IconManager.getImageIcon(IconManager.EDIT_POINT));
627                 _editPointButton.setToolTipText(I18nManager.getText("menu.edit.editpoint"));
628                 _editPointButton.addActionListener(_editPointAction);
629                 _editPointButton.setEnabled(false);
630                 toolbar.add(_editPointButton);
631                 // Delete point
632                 _deletePointButton = new JButton(IconManager.getImageIcon(IconManager.DELETE_POINT));
633                 _deletePointButton.setToolTipText(I18nManager.getText("menu.edit.deletepoint"));
634                 _deletePointButton.addActionListener(_deletePointAction);
635                 _deletePointButton.setEnabled(false);
636                 toolbar.add(_deletePointButton);
637                 // Delete range
638                 _deleteRangeButton = new JButton(IconManager.getImageIcon(IconManager.DELETE_RANGE));
639                 _deleteRangeButton.setToolTipText(I18nManager.getText("menu.edit.deleterange"));
640                 _deleteRangeButton.addActionListener(_deleteRangeAction);
641                 _deleteRangeButton.setEnabled(false);
642                 toolbar.add(_deleteRangeButton);
643                 // Select start, end
644                 _selectStartButton = new JButton(IconManager.getImageIcon(IconManager.SET_RANGE_START));
645                 _selectStartButton.setToolTipText(I18nManager.getText("menu.select.start"));
646                 _selectStartButton.addActionListener(_selectStartAction);
647                 _selectStartButton.setEnabled(false);
648                 toolbar.add(_selectStartButton);
649                 _selectEndButton = new JButton(IconManager.getImageIcon(IconManager.SET_RANGE_END));
650                 _selectEndButton.setToolTipText(I18nManager.getText("menu.select.end"));
651                 _selectEndButton.addActionListener(_selectEndAction);
652                 _selectEndButton.setEnabled(false);
653                 toolbar.add(_selectEndButton);
654                 _connectPhotoButton = new JButton(IconManager.getImageIcon(IconManager.CONNECT_PHOTO));
655                 _connectPhotoButton.setToolTipText(I18nManager.getText("menu.photo.connect"));
656                 _connectPhotoButton.addActionListener(_connectPhotoAction);
657                 _connectPhotoButton.setEnabled(false);
658                 toolbar.add(_connectPhotoButton);
659                 // finish off
660                 toolbar.setFloatable(false);
661                 return toolbar;
662         }
663
664
665         /**
666          * Method to update menu when file loaded
667          */
668         public void informFileLoaded()
669         {
670                 // save, undo, delete enabled
671                 _sendGpsItem.setEnabled(true);
672                 _saveItem.setEnabled(true);
673                 _undoItem.setEnabled(true);
674                 _compressItem.setEnabled(true);
675                 _deleteMarkedPointsItem.setEnabled(false);
676         }
677
678
679         /**
680          * @see tim.prune.DataSubscriber#dataUpdated(tim.prune.data.Track)
681          */
682         public void dataUpdated(byte inUpdateType)
683         {
684                 boolean hasData = (_track != null && _track.getNumPoints() > 0);
685                 // set functions which require data
686                 _sendGpsItem.setEnabled(hasData);
687                 _saveItem.setEnabled(hasData);
688                 _saveButton.setEnabled(hasData);
689                 _exportKmlItem.setEnabled(hasData);
690                 _exportGpxItem.setEnabled(hasData);
691                 _exportPovItem.setEnabled(hasData);
692                 _compressItem.setEnabled(hasData);
693                 _deleteMarkedPointsItem.setEnabled(hasData && _track.hasMarkedPoints());
694                 _rearrangeMenu.setEnabled(hasData && _track.hasMixedData());
695                 _selectAllItem.setEnabled(hasData);
696                 _selectNoneItem.setEnabled(hasData);
697                 _show3dItem.setEnabled(hasData);
698                 _chartItem.setEnabled(hasData);
699                 _browserMapMenu.setEnabled(hasData);
700                 _distanceItem.setEnabled(hasData);
701                 // is undo available?
702                 boolean hasUndo = !_app.getUndoStack().isEmpty();
703                 _undoItem.setEnabled(hasUndo);
704                 _undoButton.setEnabled(hasUndo);
705                 _clearUndoItem.setEnabled(hasUndo);
706                 // is there a current point?
707                 boolean hasPoint = (hasData && _selection.getCurrentPointIndex() >= 0);
708                 _editPointItem.setEnabled(hasPoint);
709                 _editPointButton.setEnabled(hasPoint);
710                 _editWaypointNameItem.setEnabled(hasPoint);
711                 _deletePointItem.setEnabled(hasPoint);
712                 _deletePointButton.setEnabled(hasPoint);
713                 _selectStartItem.setEnabled(hasPoint);
714                 _selectStartButton.setEnabled(hasPoint);
715                 _selectEndItem.setEnabled(hasPoint);
716                 _selectEndButton.setEnabled(hasPoint);
717                 // are there any photos?
718                 boolean anyPhotos = _photos != null && _photos.getNumPhotos() > 0;
719                 _saveExifItem.setEnabled(anyPhotos);
720                 // is there a current photo?
721                 boolean hasPhoto = anyPhotos && _selection.getCurrentPhotoIndex() >= 0;
722                 // connect is available if photo and point selected, and photo has no point
723                 boolean connectAvailable = hasPhoto && hasPoint && _photos.getPhoto(_selection.getCurrentPhotoIndex()) != null
724                         && _photos.getPhoto(_selection.getCurrentPhotoIndex()).getDataPoint() == null;
725                 _connectPhotoItem.setEnabled(connectAvailable);
726                 _connectPhotoButton.setEnabled(connectAvailable);
727                 _disconnectPhotoItem.setEnabled(hasPhoto && _photos.getPhoto(_selection.getCurrentPhotoIndex()) != null
728                         && _photos.getPhoto(_selection.getCurrentPhotoIndex()).getDataPoint() != null);
729                 _correlatePhotosItem.setEnabled(anyPhotos && hasData);
730                 _deletePhotoItem.setEnabled(hasPhoto);
731                 // is there a current range?
732                 boolean hasRange = (hasData && _selection.hasRangeSelected());
733                 _deleteRangeItem.setEnabled(hasRange);
734                 _deleteRangeButton.setEnabled(hasRange);
735                 _interpolateItem.setEnabled(hasRange
736                         && (_selection.getEnd() - _selection.getStart()) == 1);
737                 _averageItem.setEnabled(hasRange);
738                 _mergeSegmentsItem.setEnabled(hasRange);
739                 _reverseItem.setEnabled(hasRange);
740                 _addTimeOffsetItem.setEnabled(hasRange);
741                 // Is the currently selected point outside the current range?
742                 _cutAndMoveItem.setEnabled(hasRange && hasPoint &&
743                         (_selection.getCurrentPointIndex() < _selection.getStart()
744                                 || _selection.getCurrentPointIndex() > (_selection.getEnd()+1)));
745         }
746
747
748         /**
749          * Ignore action completed signals
750          * @see tim.prune.DataSubscriber#actionCompleted(java.lang.String)
751          */
752         public void actionCompleted(String inMessage)
753         {}
754 }