X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fgui%2FMenuManager.java;h=998a533ce4a73f58c1ae43cb95a2e5af84a24b7a;hb=1ee49ae3c8ef3aa2e63eadd458531e5f8bd4f92c;hp=b97bb76bf660b0f72bf43c6fef948624c898f8f6;hpb=da0b1f449260a0b4a94318006382a9039726ef3e;p=GpsPrune.git diff --git a/tim/prune/gui/MenuManager.java b/tim/prune/gui/MenuManager.java index b97bb76..998a533 100644 --- a/tim/prune/gui/MenuManager.java +++ b/tim/prune/gui/MenuManager.java @@ -5,9 +5,8 @@ import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; -import javax.swing.ImageIcon; import javax.swing.JButton; -import javax.swing.JFrame; +import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; @@ -16,11 +15,18 @@ import javax.swing.KeyStroke; import tim.prune.App; import tim.prune.DataSubscriber; +import tim.prune.FunctionLibrary; +import tim.prune.GenericFunction; import tim.prune.I18nManager; +import tim.prune.UpdateMessageBroker; +import tim.prune.config.Config; +import tim.prune.data.Photo; import tim.prune.data.PhotoList; import tim.prune.data.Selection; import tim.prune.data.Track; import tim.prune.data.TrackInfo; +import tim.prune.function.RearrangeWaypointsFunction.Rearrange; +import tim.prune.function.browser.UrlGenerator; /** * Class to manage the menu bar and tool bar, @@ -28,13 +34,13 @@ import tim.prune.data.TrackInfo; */ public class MenuManager implements DataSubscriber { - private JFrame _parent = null; private App _app = null; private Track _track = null; private Selection _selection = null; private PhotoList _photos = null; // Menu items which need enabling/disabling + private JMenuItem _sendGpsItem = null; private JMenuItem _saveItem = null; private JMenuItem _exportKmlItem = null; private JMenuItem _exportGpxItem = null; @@ -45,24 +51,39 @@ public class MenuManager implements DataSubscriber private JMenuItem _editWaypointNameItem = null; private JMenuItem _deletePointItem = null; private JMenuItem _deleteRangeItem = null; - private JMenuItem _deleteDuplicatesItem = null; private JMenuItem _compressItem = null; + private JMenuItem _deleteMarkedPointsItem = null; private JMenuItem _interpolateItem = null; + private JMenuItem _averageItem = null; private JMenuItem _selectAllItem = null; private JMenuItem _selectNoneItem = null; private JMenuItem _selectStartItem = null; private JMenuItem _selectEndItem = null; + private JMenuItem _findWaypointItem = null; + private JMenuItem _duplicatePointItem = null; private JMenuItem _reverseItem = null; + private JMenuItem _addTimeOffsetItem = null; + private JMenuItem _addAltitudeOffsetItem = null; + private JMenuItem _mergeSegmentsItem = null; private JMenu _rearrangeMenu = null; - private JMenuItem _rearrangeStartItem = null; - private JMenuItem _rearrangeEndItem = null; - private JMenuItem _rearrangeNearestItem = null; + private JMenuItem _cutAndMoveItem = null; + private JMenuItem _convertNamesToTimesItem = null; + private JCheckBoxMenuItem _mapCheckbox = null; private JMenuItem _show3dItem = null; + private JMenu _browserMapMenu = null; + private JMenuItem _chartItem = null; + private JMenuItem _getGpsiesItem = null; + private JMenuItem _distanceItem = null; + private JMenuItem _fullRangeDetailsItem = null; private JMenuItem _saveExifItem = null; private JMenuItem _connectPhotoItem = null; private JMenuItem _deletePhotoItem = null; private JMenuItem _disconnectPhotoItem = null; private JMenuItem _correlatePhotosItem = null; + private JMenuItem _rearrangePhotosItem = null; + private JMenuItem _rotatePhotoLeft = null; + private JMenuItem _rotatePhotoRight = null; + private JMenuItem _ignoreExifThumb = null; // ActionListeners for reuse by menu and toolbar private ActionListener _openFileAction = null; @@ -70,6 +91,8 @@ public class MenuManager implements DataSubscriber private ActionListener _saveAction = null; private ActionListener _undoAction = null; private ActionListener _editPointAction = null; + private ActionListener _deletePointAction = null; + private ActionListener _deleteRangeAction = null; private ActionListener _selectStartAction = null; private ActionListener _selectEndAction = null; private ActionListener _connectPhotoAction = null; @@ -78,20 +101,28 @@ public class MenuManager implements DataSubscriber private JButton _saveButton = null; private JButton _undoButton = null; private JButton _editPointButton = null; + private JButton _deletePointButton = null; + private JButton _deleteRangeButton = null; private JButton _selectStartButton = null; private JButton _selectEndButton = null; private JButton _connectPhotoButton = null; + /** Array of key events */ + private static final int[] KEY_EVENTS = { + KeyEvent.VK_A, KeyEvent.VK_B, KeyEvent.VK_C, KeyEvent.VK_D, KeyEvent.VK_E, + KeyEvent.VK_F, KeyEvent.VK_G, KeyEvent.VK_H, KeyEvent.VK_I, KeyEvent.VK_J, + KeyEvent.VK_K, KeyEvent.VK_L, KeyEvent.VK_M, KeyEvent.VK_N, KeyEvent.VK_O, + KeyEvent.VK_P, KeyEvent.VK_Q, KeyEvent.VK_R, KeyEvent.VK_S, KeyEvent.VK_T, + KeyEvent.VK_U, KeyEvent.VK_V, KeyEvent.VK_W, KeyEvent.VK_X, KeyEvent.VK_Y, KeyEvent.VK_Z}; + /** * Constructor - * @param inParent parent object for dialogs * @param inApp application to call on menu actions * @param inTrackInfo track info object */ - public MenuManager(JFrame inParent, App inApp, TrackInfo inTrackInfo) + public MenuManager(App inApp, TrackInfo inTrackInfo) { - _parent = inParent; _app = inApp; _track = inTrackInfo.getTrack(); _selection = inTrackInfo.getSelection(); @@ -107,9 +138,10 @@ public class MenuManager implements DataSubscriber { JMenuBar menubar = new JMenuBar(); JMenu fileMenu = new JMenu(I18nManager.getText("menu.file")); + setAltKey(fileMenu, "altkey.menu.file"); // Open file JMenuItem openMenuItem = new JMenuItem(I18nManager.getText("menu.file.open")); - openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK)); + setShortcut(openMenuItem, "shortcut.menu.file.open"); _openFileAction = new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -128,8 +160,19 @@ public class MenuManager implements DataSubscriber }; addPhotosMenuItem.addActionListener(_addPhotoAction); fileMenu.add(addPhotosMenuItem); + fileMenu.addSeparator(); + // Load from GPS + JMenuItem loadFromGpsMenuItem = makeMenuItem(FunctionLibrary.FUNCTION_GPSLOAD); + setShortcut(loadFromGpsMenuItem, "shortcut.menu.file.load"); + fileMenu.add(loadFromGpsMenuItem); + // Send to GPS + _sendGpsItem = makeMenuItem(FunctionLibrary.FUNCTION_GPSSAVE); + _sendGpsItem.setEnabled(false); + fileMenu.add(_sendGpsItem); + fileMenu.addSeparator(); // Save _saveItem = new JMenuItem(I18nManager.getText("menu.file.save"), KeyEvent.VK_S); + setShortcut(_saveItem, "shortcut.menu.file.save"); _saveAction = new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -140,33 +183,15 @@ public class MenuManager implements DataSubscriber _saveItem.setEnabled(false); fileMenu.add(_saveItem); // Export - Kml - _exportKmlItem = new JMenuItem(I18nManager.getText("menu.file.exportkml")); - _exportKmlItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - _app.exportKml(); - } - }); + _exportKmlItem = makeMenuItem(FunctionLibrary.FUNCTION_KMLEXPORT); _exportKmlItem.setEnabled(false); fileMenu.add(_exportKmlItem); // Gpx - _exportGpxItem = new JMenuItem(I18nManager.getText("menu.file.exportgpx")); - _exportGpxItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - _app.exportGpx(); - } - }); + _exportGpxItem = makeMenuItem(FunctionLibrary.FUNCTION_GPXEXPORT); _exportGpxItem.setEnabled(false); fileMenu.add(_exportGpxItem); // Pov - _exportPovItem = new JMenuItem(I18nManager.getText("menu.file.exportpov")); - _exportPovItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - _app.exportPov(); - } - }); + _exportPovItem = makeMenuItem(FunctionLibrary.FUNCTION_POVEXPORT); _exportPovItem.setEnabled(false); fileMenu.add(_exportPovItem); fileMenu.addSeparator(); @@ -179,9 +204,11 @@ public class MenuManager implements DataSubscriber }); fileMenu.add(exitMenuItem); menubar.add(fileMenu); - JMenu editMenu = new JMenu(I18nManager.getText("menu.edit")); - editMenu.setMnemonic(KeyEvent.VK_E); + // Track menu + JMenu trackMenu = new JMenu(I18nManager.getText("menu.track")); + setAltKey(trackMenu, "altkey.menu.track"); _undoItem = new JMenuItem(I18nManager.getText("menu.edit.undo")); + setShortcut(_undoItem, "shortcut.menu.edit.undo"); _undoAction = new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -190,7 +217,7 @@ public class MenuManager implements DataSubscriber }; _undoItem.addActionListener(_undoAction); _undoItem.setEnabled(false); - editMenu.add(_undoItem); + trackMenu.add(_undoItem); _clearUndoItem = new JMenuItem(I18nManager.getText("menu.edit.clearundo")); _clearUndoItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) @@ -199,64 +226,138 @@ public class MenuManager implements DataSubscriber } }); _clearUndoItem.setEnabled(false); - editMenu.add(_clearUndoItem); - editMenu.addSeparator(); - _editPointItem = new JMenuItem(I18nManager.getText("menu.edit.editpoint")); - _editPointAction = new ActionListener() { + trackMenu.add(_clearUndoItem); + trackMenu.addSeparator(); + _compressItem = makeMenuItem(FunctionLibrary.FUNCTION_COMPRESS); + setShortcut(_compressItem, "shortcut.menu.edit.compress"); + _compressItem.setEnabled(false); + trackMenu.add(_compressItem); + _deleteMarkedPointsItem = new JMenuItem(I18nManager.getText("menu.edit.deletemarked")); + _deleteMarkedPointsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _app.editCurrentPoint(); + _app.finishCompressTrack(); } - }; - _editPointItem.addActionListener(_editPointAction); - _editPointItem.setEnabled(false); - editMenu.add(_editPointItem); - _editWaypointNameItem = new JMenuItem(I18nManager.getText("menu.edit.editwaypointname")); - _editWaypointNameItem.addActionListener(new ActionListener() { + }); + _deleteMarkedPointsItem.setEnabled(false); + trackMenu.add(_deleteMarkedPointsItem); + trackMenu.addSeparator(); + // Rearrange waypoints + _rearrangeMenu = new JMenu(I18nManager.getText("menu.edit.rearrange")); + _rearrangeMenu.setEnabled(false); + JMenuItem rearrangeStartItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.start")); + rearrangeStartItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _app.editCurrentPointName(); + FunctionLibrary.FUNCTION_REARRANGE_WAYPOINTS.rearrangeWaypoints(Rearrange.TO_START); } }); - _editWaypointNameItem.setEnabled(false); - editMenu.add(_editWaypointNameItem); - _deletePointItem = new JMenuItem(I18nManager.getText("menu.edit.deletepoint")); - _deletePointItem.addActionListener(new ActionListener() { + rearrangeStartItem.setEnabled(true); + _rearrangeMenu.add(rearrangeStartItem); + JMenuItem rearrangeEndItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.end")); + rearrangeEndItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _app.deleteCurrentPoint(); + FunctionLibrary.FUNCTION_REARRANGE_WAYPOINTS.rearrangeWaypoints(Rearrange.TO_END); } }); - _deletePointItem.setEnabled(false); - editMenu.add(_deletePointItem); + rearrangeEndItem.setEnabled(true); + _rearrangeMenu.add(rearrangeEndItem); + JMenuItem rearrangeNearestItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.nearest")); + rearrangeNearestItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + FunctionLibrary.FUNCTION_REARRANGE_WAYPOINTS.rearrangeWaypoints(Rearrange.TO_NEAREST); + } + }); + rearrangeNearestItem.setEnabled(true); + _rearrangeMenu.add(rearrangeNearestItem); + trackMenu.add(_rearrangeMenu); + // Get gpsies tracks + _getGpsiesItem = makeMenuItem(FunctionLibrary.FUNCTION_GET_GPSIES); + _getGpsiesItem.setEnabled(false); + trackMenu.add(_getGpsiesItem); + menubar.add(trackMenu); + + // Range menu + JMenu rangeMenu = new JMenu(I18nManager.getText("menu.range")); + setAltKey(rangeMenu, "altkey.menu.range"); + _selectAllItem = new JMenuItem(I18nManager.getText("menu.select.all")); + setShortcut(_selectAllItem, "shortcut.menu.select.all"); + _selectAllItem.setEnabled(false); + _selectAllItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + _selection.selectRange(0, _track.getNumPoints()-1); + } + }); + rangeMenu.add(_selectAllItem); + _selectNoneItem = new JMenuItem(I18nManager.getText("menu.select.none")); + _selectNoneItem.setEnabled(false); + _selectNoneItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) + { + _app.selectNone(); + } + }); + rangeMenu.add(_selectNoneItem); + rangeMenu.addSeparator(); + _selectStartItem = new JMenuItem(I18nManager.getText("menu.select.start")); + _selectStartItem.setEnabled(false); + _selectStartAction = new ActionListener() { + public void actionPerformed(ActionEvent e) + { + _selection.selectRangeStart(); + } + }; + _selectStartItem.addActionListener(_selectStartAction); + rangeMenu.add(_selectStartItem); + _selectEndItem = new JMenuItem(I18nManager.getText("menu.select.end")); + _selectEndItem.setEnabled(false); + _selectEndAction = new ActionListener() { + public void actionPerformed(ActionEvent e) + { + _selection.selectRangeEnd(); + } + }; + _selectEndItem.addActionListener(_selectEndAction); + rangeMenu.add(_selectEndItem); + rangeMenu.addSeparator(); _deleteRangeItem = new JMenuItem(I18nManager.getText("menu.edit.deleterange")); - _deleteRangeItem.addActionListener(new ActionListener() { + _deleteRangeAction = new ActionListener() { public void actionPerformed(ActionEvent e) { _app.deleteSelectedRange(); } - }); + }; + _deleteRangeItem.addActionListener(_deleteRangeAction); _deleteRangeItem.setEnabled(false); - editMenu.add(_deleteRangeItem); - _deleteDuplicatesItem = new JMenuItem(I18nManager.getText("menu.edit.deleteduplicates")); - _deleteDuplicatesItem.addActionListener(new ActionListener() { + rangeMenu.add(_deleteRangeItem); + _reverseItem = new JMenuItem(I18nManager.getText("menu.edit.reverse")); + _reverseItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _app.deleteDuplicates(); + _app.reverseRange(); } }); - _deleteDuplicatesItem.setEnabled(false); - editMenu.add(_deleteDuplicatesItem); - _compressItem = new JMenuItem(I18nManager.getText("menu.edit.compress")); - _compressItem.addActionListener(new ActionListener() { + _reverseItem.setEnabled(false); + rangeMenu.add(_reverseItem); + _addTimeOffsetItem = makeMenuItem(FunctionLibrary.FUNCTION_ADD_TIME_OFFSET); + _addTimeOffsetItem.setEnabled(false); + rangeMenu.add(_addTimeOffsetItem); + _addAltitudeOffsetItem = makeMenuItem(FunctionLibrary.FUNCTION_ADD_ALTITUDE_OFFSET); + _addAltitudeOffsetItem.setEnabled(false); + rangeMenu.add(_addAltitudeOffsetItem); + _mergeSegmentsItem = new JMenuItem(I18nManager.getText("menu.edit.mergetracksegments")); + _mergeSegmentsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _app.compressTrack(); + _app.mergeTrackSegments(); } }); - _compressItem.setEnabled(false); - editMenu.add(_compressItem); - editMenu.addSeparator(); + _mergeSegmentsItem.setEnabled(false); + rangeMenu.add(_mergeSegmentsItem); + rangeMenu.addSeparator(); _interpolateItem = new JMenuItem(I18nManager.getText("menu.edit.interpolate")); _interpolateItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) @@ -265,94 +366,147 @@ public class MenuManager implements DataSubscriber } }); _interpolateItem.setEnabled(false); - editMenu.add(_interpolateItem); - _reverseItem = new JMenuItem(I18nManager.getText("menu.edit.reverse")); - _reverseItem.addActionListener(new ActionListener() { + rangeMenu.add(_interpolateItem); + _averageItem = new JMenuItem(I18nManager.getText("menu.edit.average")); + _averageItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _app.reverseRange(); + _app.averageSelection(); } }); - _reverseItem.setEnabled(false); - editMenu.add(_reverseItem); - // Rearrange waypoints - _rearrangeMenu = new JMenu(I18nManager.getText("menu.edit.rearrange")); - _rearrangeMenu.setEnabled(false); - _rearrangeStartItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.start")); - _rearrangeStartItem.addActionListener(new ActionListener() { + _averageItem.setEnabled(false); + rangeMenu.add(_averageItem); + _cutAndMoveItem = new JMenuItem(I18nManager.getText("menu.edit.cutandmove")); + _cutAndMoveItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _app.rearrangeWaypoints(App.REARRANGE_TO_START); + _app.cutAndMoveSelection(); } }); - _rearrangeStartItem.setEnabled(true); - _rearrangeMenu.add(_rearrangeStartItem); - _rearrangeEndItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.end")); - _rearrangeEndItem.addActionListener(new ActionListener() { + _cutAndMoveItem.setEnabled(false); + rangeMenu.add(_cutAndMoveItem); + _convertNamesToTimesItem = makeMenuItem(FunctionLibrary.FUNCTION_CONVERT_NAMES_TO_TIMES); + _convertNamesToTimesItem.setEnabled(false); + rangeMenu.add(_convertNamesToTimesItem); + menubar.add(rangeMenu); + + // Point menu + JMenu pointMenu = new JMenu(I18nManager.getText("menu.point")); + setAltKey(pointMenu, "altkey.menu.point"); + _editPointItem = new JMenuItem(I18nManager.getText("menu.edit.editpoint")); + _editPointAction = new ActionListener() { + public void actionPerformed(ActionEvent e) + { + _app.editCurrentPoint(); + } + }; + _editPointItem.addActionListener(_editPointAction); + _editPointItem.setEnabled(false); + pointMenu.add(_editPointItem); + _editWaypointNameItem = makeMenuItem(FunctionLibrary.FUNCTION_EDIT_WAYPOINT_NAME); + _editWaypointNameItem.setEnabled(false); + pointMenu.add(_editWaypointNameItem); + _deletePointItem = new JMenuItem(I18nManager.getText("menu.edit.deletepoint")); + _deletePointAction = new ActionListener() { public void actionPerformed(ActionEvent e) { - _app.rearrangeWaypoints(App.REARRANGE_TO_END); + _app.deleteCurrentPoint(); + } + }; + _deletePointItem.addActionListener(_deletePointAction); + _deletePointItem.setEnabled(false); + pointMenu.add(_deletePointItem); + pointMenu.addSeparator(); + // find a waypoint + _findWaypointItem = makeMenuItem(FunctionLibrary.FUNCTION_FIND_WAYPOINT); + _findWaypointItem.setEnabled(false); + pointMenu.add(_findWaypointItem); + // duplicate current point + _duplicatePointItem = makeMenuItem(FunctionLibrary.FUNCTION_DUPLICATE_POINT); + _duplicatePointItem.setEnabled(false); + pointMenu.add(_duplicatePointItem); + // paste coordinates function + JMenuItem pasteCoordsItem = makeMenuItem(FunctionLibrary.FUNCTION_PASTE_COORDINATES); + pointMenu.add(pasteCoordsItem); + menubar.add(pointMenu); + + // Add view menu + JMenu viewMenu = new JMenu(I18nManager.getText("menu.view")); + setAltKey(viewMenu, "altkey.menu.view"); + // Turn map display on/off + _mapCheckbox = new JCheckBoxMenuItem( + I18nManager.getText("menu.map.showmap"), false); + _mapCheckbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Config.setConfigBoolean(Config.KEY_SHOW_MAP, _mapCheckbox.isSelected()); + UpdateMessageBroker.informSubscribers(); } }); - _rearrangeEndItem.setEnabled(true); - _rearrangeMenu.add(_rearrangeEndItem); - _rearrangeNearestItem = new JMenuItem(I18nManager.getText("menu.edit.rearrange.nearest")); - _rearrangeNearestItem.addActionListener(new ActionListener() { + viewMenu.add(_mapCheckbox); + _show3dItem = makeMenuItem(FunctionLibrary.FUNCTION_3D); + _show3dItem.setEnabled(false); + viewMenu.add(_show3dItem); + // browser submenu + _browserMapMenu = new JMenu(I18nManager.getText("menu.view.browser")); + _browserMapMenu.setEnabled(false); + JMenuItem googleMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.google")); + googleMapsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _app.rearrangeWaypoints(App.REARRANGE_TO_NEAREST); + _app.showExternalMap(UrlGenerator.MAP_SOURCE_GOOGLE); } }); - _rearrangeNearestItem.setEnabled(true); - _rearrangeMenu.add(_rearrangeNearestItem); - editMenu.add(_rearrangeMenu); - menubar.add(editMenu); - - // Select menu - JMenu selectMenu = new JMenu(I18nManager.getText("menu.select")); - _selectAllItem = new JMenuItem(I18nManager.getText("menu.select.all")); - _selectAllItem.setEnabled(false); - _selectAllItem.addActionListener(new ActionListener() { + _browserMapMenu.add(googleMapsItem); + JMenuItem openMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.openstreetmap")); + openMapsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _app.selectAll(); + _app.showExternalMap(UrlGenerator.MAP_SOURCE_OSM); } }); - selectMenu.add(_selectAllItem); - _selectNoneItem = new JMenuItem(I18nManager.getText("menu.select.none")); - _selectNoneItem.setEnabled(false); - _selectNoneItem.addActionListener(new ActionListener() { + _browserMapMenu.add(openMapsItem); + JMenuItem mapquestMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.mapquest")); + mapquestMapsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _app.selectNone(); + _app.showExternalMap(UrlGenerator.MAP_SOURCE_MAPQUEST); } }); - selectMenu.add(_selectNoneItem); - selectMenu.addSeparator(); - _selectStartItem = new JMenuItem(I18nManager.getText("menu.select.start")); - _selectStartItem.setEnabled(false); - _selectStartAction = new ActionListener() { + _browserMapMenu.add(mapquestMapsItem); + JMenuItem yahooMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.yahoo")); + yahooMapsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _selection.selectRangeStart(); + _app.showExternalMap(UrlGenerator.MAP_SOURCE_YAHOO); } - }; - _selectStartItem.addActionListener(_selectStartAction); - selectMenu.add(_selectStartItem); - _selectEndItem = new JMenuItem(I18nManager.getText("menu.select.end")); - _selectEndItem.setEnabled(false); - _selectEndAction = new ActionListener() { + }); + _browserMapMenu.add(yahooMapsItem); + JMenuItem bingMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.bing")); + bingMapsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _selection.selectRangeEnd(); + _app.showExternalMap(UrlGenerator.MAP_SOURCE_BING); } - }; - _selectEndItem.addActionListener(_selectEndAction); - selectMenu.add(_selectEndItem); - menubar.add(selectMenu); + }); + _browserMapMenu.add(bingMapsItem); + viewMenu.add(_browserMapMenu); + // Charts + _chartItem = makeMenuItem(FunctionLibrary.FUNCTION_CHARTS); + _chartItem.setEnabled(false); + viewMenu.add(_chartItem); + // Distances + _distanceItem = makeMenuItem(FunctionLibrary.FUNCTION_DISTANCES); + _distanceItem.setEnabled(false); + viewMenu.add(_distanceItem); + // full range details + _fullRangeDetailsItem = makeMenuItem(FunctionLibrary.FUNCTION_FULL_RANGE_DETAILS); + _fullRangeDetailsItem.setEnabled(false); + viewMenu.add(_fullRangeDetailsItem); + menubar.add(viewMenu); // Add photo menu JMenu photoMenu = new JMenu(I18nManager.getText("menu.photo")); + setAltKey(photoMenu, "altkey.menu.photo"); addPhotosMenuItem = new JMenuItem(I18nManager.getText("menu.file.addphotos")); addPhotosMenuItem.addActionListener(_addPhotoAction); photoMenu.add(addPhotosMenuItem); @@ -395,55 +549,119 @@ public class MenuManager implements DataSubscriber }); _deletePhotoItem.setEnabled(false); photoMenu.add(_deletePhotoItem); + // Rotate current photo + _rotatePhotoLeft = makeMenuItem(FunctionLibrary.FUNCTION_ROTATE_PHOTO_LEFT); + _rotatePhotoLeft.setEnabled(false); + photoMenu.add(_rotatePhotoLeft); + _rotatePhotoRight = makeMenuItem(FunctionLibrary.FUNCTION_ROTATE_PHOTO_RIGHT); + _rotatePhotoRight.setEnabled(false); + photoMenu.add(_rotatePhotoRight); + _ignoreExifThumb = makeMenuItem(FunctionLibrary.FUNCTION_IGNORE_EXIF_THUMB); + _ignoreExifThumb.setEnabled(false); + photoMenu.add(_ignoreExifThumb); photoMenu.addSeparator(); // correlate all photos - _correlatePhotosItem = new JMenuItem(I18nManager.getText("menu.photo.correlate")); - _correlatePhotosItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - _app.beginCorrelatePhotos(); - } - }); + _correlatePhotosItem = makeMenuItem(FunctionLibrary.FUNCTION_CORRELATE_PHOTOS); _correlatePhotosItem.setEnabled(false); photoMenu.add(_correlatePhotosItem); + // rearrange photo points + _rearrangePhotosItem = makeMenuItem(FunctionLibrary.FUNCTION_REARRANGE_PHOTOS); + _rearrangePhotosItem.setEnabled(false); + photoMenu.add(_rearrangePhotosItem); menubar.add(photoMenu); - // Add 3d menu (whether java3d available or not) - JMenu threeDMenu = new JMenu(I18nManager.getText("menu.3d")); - _show3dItem = new JMenuItem(I18nManager.getText("menu.3d.show3d")); - _show3dItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - _app.show3dWindow(); - } - }); - _show3dItem.setEnabled(false); - threeDMenu.add(_show3dItem); - menubar.add(threeDMenu); + // Settings menu + JMenu settingsMenu = new JMenu(I18nManager.getText("menu.settings")); + setAltKey(settingsMenu, "altkey.menu.settings"); + // Set the map background + JMenuItem mapBgItem = makeMenuItem(FunctionLibrary.FUNCTION_SET_MAP_BG); + settingsMenu.add(mapBgItem); + // Set kmz image size + JMenuItem setKmzImageSizeItem = makeMenuItem(FunctionLibrary.FUNCTION_SET_KMZ_IMAGE_SIZE); + settingsMenu.add(setKmzImageSizeItem); + // Set program paths + JMenuItem setPathsItem = makeMenuItem(FunctionLibrary.FUNCTION_SET_PATHS); + settingsMenu.add(setPathsItem); + // Set colours + JMenuItem setColoursItem = makeMenuItem(FunctionLibrary.FUNCTION_SET_COLOURS); + settingsMenu.add(setColoursItem); + // Set language + JMenuItem setLanguageItem = makeMenuItem(FunctionLibrary.FUNCTION_SET_LANGUAGE); + settingsMenu.add(setLanguageItem); + settingsMenu.addSeparator(); + // Save configuration + JMenuItem saveConfigMenuItem = makeMenuItem(FunctionLibrary.FUNCTION_SAVECONFIG); + settingsMenu.add(saveConfigMenuItem); + menubar.add(settingsMenu); // Help menu JMenu helpMenu = new JMenu(I18nManager.getText("menu.help")); - JMenuItem helpItem = new JMenuItem(I18nManager.getText("menu.help")); - helpItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - _app.showHelp(); - } - }); + setAltKey(helpMenu, "altkey.menu.help"); + JMenuItem helpItem = makeMenuItem(FunctionLibrary.FUNCTION_HELP); + setShortcut(helpItem, "shortcut.menu.help.help"); helpMenu.add(helpItem); - JMenuItem aboutItem = new JMenuItem(I18nManager.getText("menu.help.about")); - aboutItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) - { - new AboutScreen(_parent).show(); - } - }); + JMenuItem showKeysItem = makeMenuItem(FunctionLibrary.FUNCTION_SHOW_KEYS); + helpMenu.add(showKeysItem); + JMenuItem aboutItem = makeMenuItem(FunctionLibrary.FUNCTION_ABOUT); helpMenu.add(aboutItem); + JMenuItem checkVersionItem = makeMenuItem(FunctionLibrary.FUNCTION_CHECK_VERSION); + helpMenu.add(checkVersionItem); menubar.add(helpMenu); return menubar; } + /** + * Convenience method for making a menu item using a function + * @param inFunction function + * @return menu item using localized name of function + */ + private static JMenuItem makeMenuItem(GenericFunction inFunction) + { + JMenuItem item = new JMenuItem(I18nManager.getText(inFunction.getNameKey())); + item.addActionListener(new FunctionLauncher(inFunction)); + return item; + } + + /** + * Set the alt key for the given menu + * @param inMenu menu to set + * @param inKey key to lookup to get language-sensitive altkey + */ + private static void setAltKey(JMenu inMenu, String inKey) + { + // Lookup the key in the properties + String altKey = I18nManager.getText(inKey); + if (altKey != null && altKey.length() == 1) + { + int code = altKey.charAt(0) - 'A'; + if (code >= 0 && code < 26) + { + // Found a valid code between A and Z + inMenu.setMnemonic(KEY_EVENTS[code]); + } + } + } + + /** + * Set the shortcut key for the given menu item + * @param inMenuItem menu item to set + * @param inKey key to lookup to get language-sensitive shortcut + */ + private static void setShortcut(JMenuItem inMenuItem, String inKey) + { + // Lookup the key in the properties + String altKey = I18nManager.getText(inKey); + if (altKey != null && altKey.length() == 1) + { + int code = altKey.charAt(0) - 'A'; + if (code >= 0 && code < 26) + { + // Found a valid code between A and Z + inMenuItem.setAccelerator(KeyStroke.getKeyStroke(KEY_EVENTS[code], InputEvent.CTRL_DOWN_MASK)); + } + } + } /** * Create a JToolBar containing all toolbar buttons @@ -453,45 +671,57 @@ public class MenuManager implements DataSubscriber { JToolBar toolbar = new JToolBar(); // Add text file - JButton openFileButton = new JButton(new ImageIcon(getClass().getResource("images/add_textfile_icon.png"))); + JButton openFileButton = new JButton(IconManager.getImageIcon(IconManager.OPEN_FILE)); openFileButton.setToolTipText(I18nManager.getText("menu.file.open")); openFileButton.addActionListener(_openFileAction); toolbar.add(openFileButton); // Add photo - JButton addPhotoButton = new JButton(new ImageIcon(getClass().getResource("images/add_photo_icon.png"))); + JButton addPhotoButton = new JButton(IconManager.getImageIcon(IconManager.ADD_PHOTO)); addPhotoButton.setToolTipText(I18nManager.getText("menu.file.addphotos")); addPhotoButton.addActionListener(_addPhotoAction); toolbar.add(addPhotoButton); // Save - _saveButton = new JButton(new ImageIcon(getClass().getResource("images/save_icon.gif"))); + _saveButton = new JButton(IconManager.getImageIcon(IconManager.SAVE_FILE)); _saveButton.setToolTipText(I18nManager.getText("menu.file.save")); _saveButton.addActionListener(_saveAction); _saveButton.setEnabled(false); toolbar.add(_saveButton); // Undo - _undoButton = new JButton(new ImageIcon(getClass().getResource("images/undo_icon.gif"))); + _undoButton = new JButton(IconManager.getImageIcon(IconManager.UNDO)); _undoButton.setToolTipText(I18nManager.getText("menu.edit.undo")); _undoButton.addActionListener(_undoAction); _undoButton.setEnabled(false); toolbar.add(_undoButton); // Edit point - _editPointButton = new JButton(new ImageIcon(getClass().getResource("images/edit_point_icon.gif"))); + _editPointButton = new JButton(IconManager.getImageIcon(IconManager.EDIT_POINT)); _editPointButton.setToolTipText(I18nManager.getText("menu.edit.editpoint")); _editPointButton.addActionListener(_editPointAction); _editPointButton.setEnabled(false); toolbar.add(_editPointButton); + // Delete point + _deletePointButton = new JButton(IconManager.getImageIcon(IconManager.DELETE_POINT)); + _deletePointButton.setToolTipText(I18nManager.getText("menu.edit.deletepoint")); + _deletePointButton.addActionListener(_deletePointAction); + _deletePointButton.setEnabled(false); + toolbar.add(_deletePointButton); + // Delete range + _deleteRangeButton = new JButton(IconManager.getImageIcon(IconManager.DELETE_RANGE)); + _deleteRangeButton.setToolTipText(I18nManager.getText("menu.edit.deleterange")); + _deleteRangeButton.addActionListener(_deleteRangeAction); + _deleteRangeButton.setEnabled(false); + toolbar.add(_deleteRangeButton); // Select start, end - _selectStartButton = new JButton(new ImageIcon(getClass().getResource("images/set_start_icon.png"))); + _selectStartButton = new JButton(IconManager.getImageIcon(IconManager.SET_RANGE_START)); _selectStartButton.setToolTipText(I18nManager.getText("menu.select.start")); _selectStartButton.addActionListener(_selectStartAction); _selectStartButton.setEnabled(false); toolbar.add(_selectStartButton); - _selectEndButton = new JButton(new ImageIcon(getClass().getResource("images/set_end_icon.png"))); + _selectEndButton = new JButton(IconManager.getImageIcon(IconManager.SET_RANGE_END)); _selectEndButton.setToolTipText(I18nManager.getText("menu.select.end")); _selectEndButton.addActionListener(_selectEndAction); _selectEndButton.setEnabled(false); toolbar.add(_selectEndButton); - _connectPhotoButton = new JButton(new ImageIcon(getClass().getResource("images/connect_photo_icon.png"))); + _connectPhotoButton = new JButton(IconManager.getImageIcon(IconManager.CONNECT_PHOTO)); _connectPhotoButton.setToolTipText(I18nManager.getText("menu.photo.connect")); _connectPhotoButton.addActionListener(_connectPhotoAction); _connectPhotoButton.setEnabled(false); @@ -508,10 +738,11 @@ public class MenuManager implements DataSubscriber public void informFileLoaded() { // save, undo, delete enabled + _sendGpsItem.setEnabled(true); _saveItem.setEnabled(true); _undoItem.setEnabled(true); - _deleteDuplicatesItem.setEnabled(true); _compressItem.setEnabled(true); + _deleteMarkedPointsItem.setEnabled(false); } @@ -522,18 +753,23 @@ public class MenuManager implements DataSubscriber { boolean hasData = (_track != null && _track.getNumPoints() > 0); // set functions which require data + _sendGpsItem.setEnabled(hasData); _saveItem.setEnabled(hasData); _saveButton.setEnabled(hasData); _exportKmlItem.setEnabled(hasData); _exportGpxItem.setEnabled(hasData); _exportPovItem.setEnabled(hasData); - _deleteDuplicatesItem.setEnabled(hasData); _compressItem.setEnabled(hasData); - _rearrangeMenu.setEnabled(hasData && _track.hasMixedData()); + _deleteMarkedPointsItem.setEnabled(hasData && _track.hasMarkedPoints()); + _rearrangeMenu.setEnabled(hasData && _track.hasTrackPoints() && _track.hasWaypoints()); _selectAllItem.setEnabled(hasData); _selectNoneItem.setEnabled(hasData); - if (_show3dItem != null) - _show3dItem.setEnabled(hasData); + _show3dItem.setEnabled(hasData); + _chartItem.setEnabled(hasData); + _browserMapMenu.setEnabled(hasData); + _distanceItem.setEnabled(hasData); + _getGpsiesItem.setEnabled(hasData); + _findWaypointItem.setEnabled(hasData && _track.hasWaypoints()); // is undo available? boolean hasUndo = !_app.getUndoStack().isEmpty(); _undoItem.setEnabled(hasUndo); @@ -545,29 +781,59 @@ public class MenuManager implements DataSubscriber _editPointButton.setEnabled(hasPoint); _editWaypointNameItem.setEnabled(hasPoint); _deletePointItem.setEnabled(hasPoint); + _deletePointButton.setEnabled(hasPoint); _selectStartItem.setEnabled(hasPoint); _selectStartButton.setEnabled(hasPoint); _selectEndItem.setEnabled(hasPoint); _selectEndButton.setEnabled(hasPoint); + _duplicatePointItem.setEnabled(hasPoint); // are there any photos? boolean anyPhotos = _photos != null && _photos.getNumPhotos() > 0; _saveExifItem.setEnabled(anyPhotos); // is there a current photo? boolean hasPhoto = anyPhotos && _selection.getCurrentPhotoIndex() >= 0; - // connect is only available when current photo is not connected to current point - boolean connectAvailable = hasPhoto && hasPoint - && _track.getPoint(_selection.getCurrentPointIndex()).getPhoto() == null; + // connect is available if photo and point selected, and photo has no point + Photo currentPhoto = _photos.getPhoto(_selection.getCurrentPhotoIndex()); + boolean connectAvailable = hasPhoto && hasPoint && currentPhoto != null + && currentPhoto.getDataPoint() == null; _connectPhotoItem.setEnabled(connectAvailable); _connectPhotoButton.setEnabled(connectAvailable); - _disconnectPhotoItem.setEnabled(hasPhoto && _photos.getPhoto(_selection.getCurrentPhotoIndex()) != null - && _photos.getPhoto(_selection.getCurrentPhotoIndex()).getDataPoint() != null); + _disconnectPhotoItem.setEnabled(hasPhoto && currentPhoto != null && currentPhoto.getDataPoint() != null); _correlatePhotosItem.setEnabled(anyPhotos && hasData); + _rearrangePhotosItem.setEnabled(anyPhotos && hasData && _track.getNumPoints() > 1); _deletePhotoItem.setEnabled(hasPhoto); + _rotatePhotoLeft.setEnabled(hasPhoto); + _rotatePhotoRight.setEnabled(hasPhoto); + _ignoreExifThumb.setEnabled(hasPhoto && currentPhoto != null && currentPhoto.getExifThumbnail() != null); // is there a current range? boolean hasRange = (hasData && _selection.hasRangeSelected()); _deleteRangeItem.setEnabled(hasRange); + _deleteRangeButton.setEnabled(hasRange); _interpolateItem.setEnabled(hasRange && (_selection.getEnd() - _selection.getStart()) == 1); + _averageItem.setEnabled(hasRange); + _mergeSegmentsItem.setEnabled(hasRange); _reverseItem.setEnabled(hasRange); + _addTimeOffsetItem.setEnabled(hasRange); + _addAltitudeOffsetItem.setEnabled(hasRange); + _convertNamesToTimesItem.setEnabled(hasRange && _track.hasWaypoints()); + _fullRangeDetailsItem.setEnabled(hasRange); + // Is the currently selected point outside the current range? + _cutAndMoveItem.setEnabled(hasRange && hasPoint && + (_selection.getCurrentPointIndex() < _selection.getStart() + || _selection.getCurrentPointIndex() > (_selection.getEnd()+1))); + // Has the map been switched on/off? + boolean mapsOn = Config.getConfigBoolean(Config.KEY_SHOW_MAP); + if (_mapCheckbox.isSelected() != mapsOn) { + _mapCheckbox.setSelected(mapsOn); + } } + + + /** + * Ignore action completed signals + * @see tim.prune.DataSubscriber#actionCompleted(java.lang.String) + */ + public void actionCompleted(String inMessage) + {} }