X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=tim%2Fprune%2Fgui%2FMenuManager.java;h=bce3b4d67b0a6df980b66882f175245af1134155;hp=47044f2b568637eec671ab38355226663eda18b8;hb=1a735a99408fd3b0c5ac4fe7b2fdbdbb23d38f40;hpb=f35b6d628f68e3b5ef19965ad8988d0dd1eb8efa diff --git a/tim/prune/gui/MenuManager.java b/tim/prune/gui/MenuManager.java index 47044f2..bce3b4d 100644 --- a/tim/prune/gui/MenuManager.java +++ b/tim/prune/gui/MenuManager.java @@ -20,13 +20,20 @@ import tim.prune.GenericFunction; import tim.prune.I18nManager; import tim.prune.UpdateMessageBroker; import tim.prune.config.Config; -import tim.prune.data.AudioFile; +import tim.prune.data.AudioClip; +import tim.prune.data.DataPoint; +import tim.prune.data.Field; import tim.prune.data.Photo; +import tim.prune.data.RecentFile; +import tim.prune.data.RecentFileList; 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.ChooseSingleParameter; +import tim.prune.function.SearchOpenCachingDeFunction; import tim.prune.function.browser.UrlGenerator; +import tim.prune.function.browser.WebMapFunction; +import tim.prune.function.search.SearchMapillaryFunction; /** * Class to manage the menu bar and tool bar, @@ -44,19 +51,25 @@ public class MenuManager implements DataSubscriber private JMenuItem _exportKmlItem = null; private JMenuItem _exportGpxItem = null; private JMenuItem _exportPovItem = null; - private JMenuItem _exportSvgItem = null; + private JMenuItem _exportImageItem = null; + private JMenu _recentFileMenu = null; private JMenuItem _undoItem = null; private JMenuItem _clearUndoItem = null; private JMenuItem _editPointItem = null; private JMenuItem _editWaypointNameItem = null; private JMenuItem _deletePointItem = null; private JMenuItem _deleteRangeItem = null; + private JMenuItem _cropTrackItem = null; private JMenuItem _compressItem = null; + private JMenuItem _markRectangleItem = null; + private JMenuItem _markUphillLiftsItem = null; private JMenuItem _deleteMarkedPointsItem = null; + private JMenuItem _deleteByDateItem = null; private JMenuItem _interpolateItem = null; private JMenuItem _averageItem = null; private JMenuItem _selectAllItem = null; private JMenuItem _selectNoneItem = null; + private JMenuItem _selectSegmentItem = null; private JMenuItem _selectStartItem = null; private JMenuItem _selectEndItem = null; private JMenuItem _findWaypointItem = null; @@ -65,21 +78,35 @@ public class MenuManager implements DataSubscriber private JMenuItem _addTimeOffsetItem = null; private JMenuItem _addAltitudeOffsetItem = null; private JMenuItem _mergeSegmentsItem = null; - private JMenu _rearrangeMenu = null; + private JMenuItem _rearrangeWaypointsItem = null; + private JMenuItem _splitSegmentsItem = null; + private JMenuItem _sewSegmentsItem = null; + private JMenuItem _createMarkerWaypointsItem = null; private JMenuItem _cutAndMoveItem = null; private JMenuItem _convertNamesToTimesItem = null; private JMenuItem _deleteFieldValuesItem = null; private JCheckBoxMenuItem _mapCheckbox = null; private JMenuItem _show3dItem = null; private JMenu _browserMapMenu = null; + private JMenuItem _routingGraphHopperItem = null; private JMenuItem _chartItem = null; private JMenuItem _getGpsiesItem = null; private JMenuItem _uploadGpsiesItem = null; private JMenuItem _lookupSrtmItem = null; - private JMenuItem _lookupWikipediaItem = null; + private JMenuItem _downloadSrtmItem = null; + private JMenuItem _nearbyWikipediaItem = null; + private JMenuItem _nearbyOsmPoiItem = null; + private JMenuItem _showPeakfinderItem = null; + private JMenuItem _showGeohackItem = null; + private JMenuItem _searchOpencachingDeItem = null; + private JMenuItem _searchMapillaryItem = null; private JMenuItem _downloadOsmItem = null; + private JMenuItem _getWeatherItem = null; private JMenuItem _distanceItem = null; private JMenuItem _fullRangeDetailsItem = null; + private JMenuItem _estimateTimeItem = null; + private JMenuItem _learnEstimationParams = null; + private JMenuItem _autoplayTrack = null; private JMenuItem _saveExifItem = null; private JMenuItem _photoPopupItem = null; private JMenuItem _selectNoPhotoItem = null; @@ -97,6 +124,7 @@ public class MenuManager implements DataSubscriber private JMenuItem _correlateAudiosItem = null; private JMenuItem _selectNoAudioItem = null; private JCheckBoxMenuItem _onlineCheckbox = null; + private JCheckBoxMenuItem _autosaveSettingsCheckbox = null; // ActionListeners for reuse by menu and toolbar private ActionListener _openFileAction = null; @@ -105,7 +133,6 @@ public class MenuManager implements DataSubscriber private ActionListener _undoAction = null; private ActionListener _editPointAction = null; private ActionListener _deletePointAction = null; - private ActionListener _deleteRangeAction = null; private ActionListener _selectStartAction = null; private ActionListener _selectEndAction = null; @@ -115,6 +142,7 @@ public class MenuManager implements DataSubscriber private JButton _editPointButton = null; private JButton _deletePointButton = null; private JButton _deleteRangeButton = null; + private JButton _cutAndMoveButton = null; private JButton _selectStartButton = null; private JButton _selectEndButton = null; private JButton _connectButton = null; @@ -160,6 +188,9 @@ public class MenuManager implements DataSubscriber }; openMenuItem.addActionListener(_openFileAction); fileMenu.add(openMenuItem); + // import through gpsbabel + JMenuItem importBabelItem = makeMenuItem(FunctionLibrary.FUNCTION_IMPORTBABEL); + fileMenu.add(importBabelItem); // Add photos JMenuItem addPhotosMenuItem = new JMenuItem(I18nManager.getText("menu.file.addphotos")); _addPhotoAction = new ActionListener() { @@ -169,9 +200,13 @@ public class MenuManager implements DataSubscriber }; addPhotosMenuItem.addActionListener(_addPhotoAction); fileMenu.add(addPhotosMenuItem); - // Add audio files + // Add audio clips JMenuItem addAudioMenuItem = makeMenuItem(FunctionLibrary.FUNCTION_LOAD_AUDIO); fileMenu.add(addAudioMenuItem); + // recent files + _recentFileMenu = new JMenu(I18nManager.getText("menu.file.recentfiles")); + _recentFileMenu.setEnabled(false); + fileMenu.add(_recentFileMenu); fileMenu.addSeparator(); // Load from GPS JMenuItem loadFromGpsMenuItem = makeMenuItem(FunctionLibrary.FUNCTION_GPSLOAD); @@ -201,10 +236,11 @@ public class MenuManager implements DataSubscriber // Pov _exportPovItem = makeMenuItem(FunctionLibrary.FUNCTION_POVEXPORT, false); fileMenu.add(_exportPovItem); - // Svg - _exportSvgItem = makeMenuItem(FunctionLibrary.FUNCTION_SVGEXPORT, false); - fileMenu.add(_exportSvgItem); + // Image + _exportImageItem = makeMenuItem(FunctionLibrary.FUNCTION_IMAGEEXPORT, false); + fileMenu.add(_exportImageItem); fileMenu.addSeparator(); + // Exit JMenuItem exitMenuItem = new JMenuItem(I18nManager.getText("menu.file.exit")); exitMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -213,6 +249,66 @@ public class MenuManager implements DataSubscriber }); fileMenu.add(exitMenuItem); menubar.add(fileMenu); + + //////////////////////////////////////////////////// + // Online menu + JMenu onlineMenu = new JMenu(I18nManager.getText("menu.online")); + setAltKey(onlineMenu, "altkey.menu.online"); + // SRTM + _lookupSrtmItem = makeMenuItem(FunctionLibrary.FUNCTION_LOOKUP_SRTM, false); + onlineMenu.add(_lookupSrtmItem); + _downloadSrtmItem = makeMenuItem(FunctionLibrary.FUNCTION_DOWNLOAD_SRTM, false); + onlineMenu.add(_downloadSrtmItem); + // Get gpsies tracks + _getGpsiesItem = makeMenuItem(FunctionLibrary.FUNCTION_GET_GPSIES, false); + onlineMenu.add(_getGpsiesItem); + // Upload to gpsies + _uploadGpsiesItem = makeMenuItem(FunctionLibrary.FUNCTION_UPLOAD_GPSIES, false); + onlineMenu.add(_uploadGpsiesItem); + + onlineMenu.addSeparator(); + // browser submenu + _browserMapMenu = new JMenu(I18nManager.getText("menu.view.browser")); + _browserMapMenu.setEnabled(false); + JMenuItem googleMapsItem = makeMenuItem(new WebMapFunction(_app, UrlGenerator.WebService.MAP_SOURCE_GOOGLE, "menu.view.browser.google")); + _browserMapMenu.add(googleMapsItem); + JMenuItem openMapsItem = makeMenuItem(new WebMapFunction(_app, UrlGenerator.WebService.MAP_SOURCE_OSM, "menu.view.browser.openstreetmap")); + _browserMapMenu.add(openMapsItem); + JMenuItem mapquestMapsItem = makeMenuItem(new WebMapFunction(_app, UrlGenerator.WebService.MAP_SOURCE_MAPQUEST, "menu.view.browser.mapquest")); + _browserMapMenu.add(mapquestMapsItem); + JMenuItem yahooMapsItem = makeMenuItem(new WebMapFunction(_app, UrlGenerator.WebService.MAP_SOURCE_YAHOO, "menu.view.browser.yahoo")); + _browserMapMenu.add(yahooMapsItem); + JMenuItem bingMapsItem = makeMenuItem(new WebMapFunction(_app, UrlGenerator.WebService.MAP_SOURCE_BING, "menu.view.browser.bing")); + _browserMapMenu.add(bingMapsItem); + JMenuItem inlineMapItem = makeMenuItem(new WebMapFunction(_app, UrlGenerator.WebService.MAP_SOURCE_INLINESKATE, "menu.view.browser.inlinemap")); + _browserMapMenu.add(inlineMapItem); + _routingGraphHopperItem = makeMenuItem(new WebMapFunction(_app, UrlGenerator.WebService.MAP_SOURCE_GRAPHHOPPER, "menu.view.browser.graphhopper")); + _browserMapMenu.add(_routingGraphHopperItem); + onlineMenu.add(_browserMapMenu); + // wikipedia + _nearbyWikipediaItem = makeMenuItem(FunctionLibrary.FUNCTION_NEARBY_WIKIPEDIA, false); + onlineMenu.add(_nearbyWikipediaItem); + JMenuItem searchWikipediaNamesItem = makeMenuItem(FunctionLibrary.FUNCTION_SEARCH_WIKIPEDIA); + onlineMenu.add(searchWikipediaNamesItem); + _nearbyOsmPoiItem = makeMenuItem(FunctionLibrary.FUNCTION_SEARCH_OSMPOIS); + onlineMenu.add(_nearbyOsmPoiItem); + _showPeakfinderItem = makeMenuItem(new WebMapFunction(_app, UrlGenerator.WebService.MAP_SOURCE_PEAKFINDER, "webservice.peakfinder"), false); + onlineMenu.add(_showPeakfinderItem); + _showGeohackItem = makeMenuItem(new WebMapFunction(_app, UrlGenerator.WebService.MAP_SOURCE_GEOHACK, "webservice.geohack"), false); + onlineMenu.add(_showGeohackItem); + + onlineMenu.addSeparator(); + _searchOpencachingDeItem = makeMenuItem(new SearchOpenCachingDeFunction(_app), false); + onlineMenu.add(_searchOpencachingDeItem); + _searchMapillaryItem = makeMenuItem(new SearchMapillaryFunction(_app), false); + onlineMenu.add(_searchMapillaryItem); + _downloadOsmItem = makeMenuItem(FunctionLibrary.FUNCTION_DOWNLOAD_OSM, false); + onlineMenu.add(_downloadOsmItem); + _getWeatherItem = makeMenuItem(FunctionLibrary.FUNCTION_GET_WEATHER_FORECAST, false); + onlineMenu.add(_getWeatherItem); + menubar.add(onlineMenu); + + //////////////////////////////////////////////////// // Track menu JMenu trackMenu = new JMenu(I18nManager.getText("menu.track")); setAltKey(trackMenu, "altkey.menu.track"); @@ -236,59 +332,39 @@ public class MenuManager implements DataSubscriber trackMenu.add(_clearUndoItem); trackMenu.addSeparator(); _compressItem = makeMenuItem(FunctionLibrary.FUNCTION_COMPRESS, false); - setShortcut(_compressItem, "shortcut.menu.edit.compress"); + setShortcut(_compressItem, "shortcut.menu.track.compress"); trackMenu.add(_compressItem); - _deleteMarkedPointsItem = new JMenuItem(I18nManager.getText("menu.track.deletemarked")); - _deleteMarkedPointsItem.addActionListener(new ActionListener() { + _markRectangleItem = new JMenuItem(I18nManager.getText("menu.track.markrectangle")); + _markRectangleItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - _app.finishCompressTrack(); + _app.setCurrentMode(App.AppMode.DRAWRECT); + UpdateMessageBroker.informSubscribers(); } }); - _deleteMarkedPointsItem.setEnabled(false); + _markRectangleItem.setEnabled(false); + trackMenu.add(_markRectangleItem); + _markUphillLiftsItem = makeMenuItem(FunctionLibrary.FUNCTION_MARK_LIFTS, false); + trackMenu.add(_markUphillLiftsItem); + _deleteMarkedPointsItem = makeMenuItem(FunctionLibrary.FUNCTION_DELETE_MARKED_POINTS, false); trackMenu.add(_deleteMarkedPointsItem); + _deleteByDateItem = makeMenuItem(FunctionLibrary.FUNCTION_DELETE_BY_DATE, false); + trackMenu.add(_deleteByDateItem); trackMenu.addSeparator(); // Rearrange waypoints - _rearrangeMenu = new JMenu(I18nManager.getText("menu.track.rearrange")); - _rearrangeMenu.setEnabled(false); - JMenuItem rearrangeStartItem = new JMenuItem(I18nManager.getText("menu.track.rearrange.start")); - rearrangeStartItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - FunctionLibrary.FUNCTION_REARRANGE_WAYPOINTS.rearrangeWaypoints(Rearrange.TO_START); - } - }); - rearrangeStartItem.setEnabled(true); - _rearrangeMenu.add(rearrangeStartItem); - JMenuItem rearrangeEndItem = new JMenuItem(I18nManager.getText("menu.track.rearrange.end")); - rearrangeEndItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - FunctionLibrary.FUNCTION_REARRANGE_WAYPOINTS.rearrangeWaypoints(Rearrange.TO_END); - } - }); - rearrangeEndItem.setEnabled(true); - _rearrangeMenu.add(rearrangeEndItem); - JMenuItem rearrangeNearestItem = new JMenuItem(I18nManager.getText("menu.track.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, false); - trackMenu.add(_getGpsiesItem); - // Upload to gpsies - _uploadGpsiesItem = makeMenuItem(FunctionLibrary.FUNCTION_UPLOAD_GPSIES, false); - trackMenu.add(_uploadGpsiesItem); - _lookupSrtmItem = makeMenuItem(FunctionLibrary.FUNCTION_LOOKUP_SRTM, false); - trackMenu.add(_lookupSrtmItem); - _lookupWikipediaItem = makeMenuItem(FunctionLibrary.FUNCTION_LOOKUP_WIKIPEDIA, false); - trackMenu.add(_lookupWikipediaItem); - JMenuItem searchWikipediaNamesItem = makeMenuItem(FunctionLibrary.FUNCTION_SEARCH_WIKIPEDIA); - trackMenu.add(searchWikipediaNamesItem); - _downloadOsmItem = makeMenuItem(FunctionLibrary.FUNCTION_DOWNLOAD_OSM, false); - trackMenu.add(_downloadOsmItem); + _rearrangeWaypointsItem = makeMenuItem(FunctionLibrary.FUNCTION_REARRANGE_WAYPOINTS, false); + trackMenu.add(_rearrangeWaypointsItem); + // Split track segments + _splitSegmentsItem = makeMenuItem(FunctionLibrary.FUNCTION_SPLIT_SEGMENTS, false); + trackMenu.add(_splitSegmentsItem); + // Sew track segments + _sewSegmentsItem = makeMenuItem(FunctionLibrary.FUNCTION_SEW_SEGMENTS, false); + trackMenu.add(_sewSegmentsItem); + // Create marker waypoints + _createMarkerWaypointsItem = makeMenuItem(FunctionLibrary.FUNCTION_CREATE_MARKER_WAYPOINTS, false); + trackMenu.add(_createMarkerWaypointsItem); + trackMenu.addSeparator(); + _learnEstimationParams = makeMenuItem(FunctionLibrary.FUNCTION_LEARN_ESTIMATION_PARAMS, false); + trackMenu.add(_learnEstimationParams); menubar.add(trackMenu); // Range menu @@ -311,6 +387,8 @@ public class MenuManager implements DataSubscriber } }); rangeMenu.add(_selectNoneItem); + _selectSegmentItem = makeMenuItem(FunctionLibrary.FUNCTION_SELECT_SEGMENT); + rangeMenu.add(_selectSegmentItem); rangeMenu.addSeparator(); _selectStartItem = new JMenuItem(I18nManager.getText("menu.range.start")); _selectStartItem.setEnabled(false); @@ -331,15 +409,10 @@ public class MenuManager implements DataSubscriber _selectEndItem.addActionListener(_selectEndAction); rangeMenu.add(_selectEndItem); rangeMenu.addSeparator(); - _deleteRangeItem = new JMenuItem(I18nManager.getText("menu.range.deleterange")); - _deleteRangeAction = new ActionListener() { - public void actionPerformed(ActionEvent e) { - _app.deleteSelectedRange(); - } - }; - _deleteRangeItem.addActionListener(_deleteRangeAction); - _deleteRangeItem.setEnabled(false); + _deleteRangeItem = makeMenuItem(FunctionLibrary.FUNCTION_DELETE_RANGE, false); rangeMenu.add(_deleteRangeItem); + _cropTrackItem = makeMenuItem(FunctionLibrary.FUNCTION_CROP_TRACK, false); + rangeMenu.add(_cropTrackItem); _reverseItem = new JMenuItem(I18nManager.getText("menu.range.reverse")); _reverseItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -363,13 +436,7 @@ public class MenuManager implements DataSubscriber _deleteFieldValuesItem = makeMenuItem(FunctionLibrary.FUNCTION_DELETE_FIELD_VALUES, false); rangeMenu.add(_deleteFieldValuesItem); rangeMenu.addSeparator(); - _interpolateItem = new JMenuItem(I18nManager.getText("menu.range.interpolate")); - _interpolateItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - _app.interpolateSelection(); - } - }); - _interpolateItem.setEnabled(false); + _interpolateItem = makeMenuItem(new ChooseSingleParameter(_app, FunctionLibrary.FUNCTION_INTERPOLATE), false); rangeMenu.add(_interpolateItem); _averageItem = new JMenuItem(I18nManager.getText("menu.range.average")); _averageItem.addActionListener(new ActionListener() { @@ -403,6 +470,7 @@ public class MenuManager implements DataSubscriber }; _editPointItem.addActionListener(_editPointAction); _editPointItem.setEnabled(false); + setShortcut(_editPointItem, "shortcut.menu.point.edit"); pointMenu.add(_editPointItem); _editWaypointNameItem = makeMenuItem(FunctionLibrary.FUNCTION_EDIT_WAYPOINT_NAME, false); pointMenu.add(_editWaypointNameItem); @@ -437,7 +505,7 @@ public class MenuManager implements DataSubscriber _mapCheckbox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Config.setConfigBoolean(Config.KEY_SHOW_MAP, _mapCheckbox.isSelected()); - UpdateMessageBroker.informSubscribers(); + UpdateMessageBroker.informSubscribers(MAPSERVER_CHANGED); } }); viewMenu.add(_mapCheckbox); @@ -449,58 +517,28 @@ public class MenuManager implements DataSubscriber _app.toggleSidebars(); } }); + sidebarsCheckbox.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F11, 0)); // shortcut F11 viewMenu.add(sidebarsCheckbox); // 3d _show3dItem = makeMenuItem(FunctionLibrary.FUNCTION_3D, 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.showExternalMap(UrlGenerator.MAP_SOURCE_GOOGLE); - } - }); - _browserMapMenu.add(googleMapsItem); - JMenuItem openMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.openstreetmap")); - openMapsItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - _app.showExternalMap(UrlGenerator.MAP_SOURCE_OSM); - } - }); - _browserMapMenu.add(openMapsItem); - JMenuItem mapquestMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.mapquest")); - mapquestMapsItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - _app.showExternalMap(UrlGenerator.MAP_SOURCE_MAPQUEST); - } - }); - _browserMapMenu.add(mapquestMapsItem); - JMenuItem yahooMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.yahoo")); - yahooMapsItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - _app.showExternalMap(UrlGenerator.MAP_SOURCE_YAHOO); - } - }); - _browserMapMenu.add(yahooMapsItem); - JMenuItem bingMapsItem = new JMenuItem(I18nManager.getText("menu.view.browser.bing")); - bingMapsItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - _app.showExternalMap(UrlGenerator.MAP_SOURCE_BING); - } - }); - _browserMapMenu.add(bingMapsItem); - viewMenu.add(_browserMapMenu); // Charts _chartItem = makeMenuItem(FunctionLibrary.FUNCTION_CHARTS, false); viewMenu.add(_chartItem); + viewMenu.addSeparator(); // Distances _distanceItem = makeMenuItem(FunctionLibrary.FUNCTION_DISTANCES, false); viewMenu.add(_distanceItem); // full range details _fullRangeDetailsItem = makeMenuItem(FunctionLibrary.FUNCTION_FULL_RANGE_DETAILS, false); viewMenu.add(_fullRangeDetailsItem); + // estimate time + _estimateTimeItem = makeMenuItem(FunctionLibrary.FUNCTION_ESTIMATE_TIME, false); + viewMenu.add(_estimateTimeItem); + viewMenu.addSeparator(); + // autoplay + _autoplayTrack = makeMenuItem(FunctionLibrary.FUNCTION_AUTOPLAY_TRACK, false); + viewMenu.add(_autoplayTrack); menubar.add(viewMenu); // Add photo menu @@ -570,14 +608,14 @@ public class MenuManager implements DataSubscriber // connect audio _connectAudioItem = makeMenuItem(FunctionLibrary.FUNCTION_CONNECT_TO_POINT, false); audioMenu.add(_connectAudioItem); - // Disconnect current audio file + // Disconnect current audio clip _disconnectAudioItem = makeMenuItem(FunctionLibrary.FUNCTION_DISCONNECT_AUDIO, false); audioMenu.add(_disconnectAudioItem); - // Remove current audio file + // Remove current audio clip _removeAudioItem = makeMenuItem(FunctionLibrary.FUNCTION_REMOVE_AUDIO, false); audioMenu.add(_removeAudioItem); audioMenu.addSeparator(); - // Correlate audio files + // Correlate audio clips _correlateAudiosItem = makeMenuItem(FunctionLibrary.FUNCTION_CORRELATE_AUDIOS, false); audioMenu.add(_correlateAudiosItem); menubar.add(audioMenu); @@ -600,19 +638,31 @@ public class MenuManager implements DataSubscriber settingsMenu.add(_onlineCheckbox); settingsMenu.add(makeMenuItem(FunctionLibrary.FUNCTION_SET_DISK_CACHE)); settingsMenu.addSeparator(); - // Set kmz image size - settingsMenu.add(makeMenuItem(FunctionLibrary.FUNCTION_SET_KMZ_IMAGE_SIZE)); // Set program paths settingsMenu.add(makeMenuItem(FunctionLibrary.FUNCTION_SET_PATHS)); // Set colours settingsMenu.add(makeMenuItem(FunctionLibrary.FUNCTION_SET_COLOURS)); - // Set line width used for drawing - settingsMenu.add(makeMenuItem(FunctionLibrary.FUNCTION_SET_LINE_WIDTH)); + // display settings + JMenuItem setDisplaySettingsItem = makeMenuItem(FunctionLibrary.FUNCTION_SET_DISPLAY_SETTINGS); + settingsMenu.add(setDisplaySettingsItem); // Set language settingsMenu.add(makeMenuItem(FunctionLibrary.FUNCTION_SET_LANGUAGE)); + // Set altitude tolerance + settingsMenu.add(makeMenuItem(new ChooseSingleParameter(_app, FunctionLibrary.FUNCTION_SET_ALTITUDE_TOLERANCE))); + // Set timezone + settingsMenu.add(makeMenuItem(FunctionLibrary.FUNCTION_SET_TIMEZONE)); settingsMenu.addSeparator(); // Save configuration settingsMenu.add(makeMenuItem(FunctionLibrary.FUNCTION_SAVECONFIG)); + _autosaveSettingsCheckbox = new JCheckBoxMenuItem( + I18nManager.getText("menu.settings.autosave"), false); + _autosaveSettingsCheckbox.setSelected(Config.getConfigBoolean(Config.KEY_AUTOSAVE_SETTINGS)); + _autosaveSettingsCheckbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Config.setConfigBoolean(Config.KEY_AUTOSAVE_SETTINGS, _autosaveSettingsCheckbox.isSelected()); + } + }); + settingsMenu.add(_autosaveSettingsCheckbox); menubar.add(settingsMenu); // Help menu @@ -739,10 +789,24 @@ public class MenuManager implements DataSubscriber toolbar.add(_deletePointButton); // Delete range _deleteRangeButton = new JButton(IconManager.getImageIcon(IconManager.DELETE_RANGE)); - _deleteRangeButton.setToolTipText(I18nManager.getText("menu.range.deleterange")); - _deleteRangeButton.addActionListener(_deleteRangeAction); + _deleteRangeButton.setToolTipText(I18nManager.getText("function.deleterange")); + _deleteRangeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + FunctionLibrary.FUNCTION_DELETE_RANGE.begin(); + } + }); _deleteRangeButton.setEnabled(false); toolbar.add(_deleteRangeButton); + // Cut and move + _cutAndMoveButton = new JButton(IconManager.getImageIcon(IconManager.CUT_AND_MOVE)); + _cutAndMoveButton.setToolTipText(I18nManager.getText("menu.range.cutandmove")); + _cutAndMoveButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + _app.cutAndMoveSelection(); + } + }); + _cutAndMoveButton.setEnabled(false); + toolbar.add(_cutAndMoveButton); // Select start, end _selectStartButton = new JButton(IconManager.getImageIcon(IconManager.SET_RANGE_START)); _selectStartButton.setToolTipText(I18nManager.getText("menu.range.start")); @@ -789,37 +853,54 @@ public class MenuManager implements DataSubscriber */ public void dataUpdated(byte inUpdateType) { - boolean hasData = (_track != null && _track.getNumPoints() > 0); + final boolean hasData = _track != null && _track.getNumPoints() > 0; + final boolean hasMultiplePoints = hasData && _track.getNumPoints() > 1; + // set functions which require data _sendGpsItem.setEnabled(hasData); _saveItem.setEnabled(hasData); _saveButton.setEnabled(hasData); _exportKmlItem.setEnabled(hasData); _exportGpxItem.setEnabled(hasData); - _exportPovItem.setEnabled(hasData); - _exportSvgItem.setEnabled(hasData); + _exportPovItem.setEnabled(hasMultiplePoints); + _exportImageItem.setEnabled(hasMultiplePoints); _compressItem.setEnabled(hasData); + _markRectangleItem.setEnabled(hasData); + _markUphillLiftsItem.setEnabled(hasData && _track.hasAltitudeData()); _deleteMarkedPointsItem.setEnabled(hasData && _track.hasMarkedPoints()); - _rearrangeMenu.setEnabled(hasData && _track.hasTrackPoints() && _track.hasWaypoints()); + _rearrangeWaypointsItem.setEnabled(hasData && _track.hasTrackPoints() && _track.hasWaypoints()); + final boolean hasSeveralTrackPoints = hasData && _track.hasTrackPoints() && _track.getNumPoints() > 3; + _splitSegmentsItem.setEnabled(hasSeveralTrackPoints); + _sewSegmentsItem.setEnabled(hasSeveralTrackPoints); + _createMarkerWaypointsItem.setEnabled(hasSeveralTrackPoints); _selectAllItem.setEnabled(hasData); _selectNoneItem.setEnabled(hasData); - _show3dItem.setEnabled(hasData); + _show3dItem.setEnabled(hasMultiplePoints); _chartItem.setEnabled(hasData); _browserMapMenu.setEnabled(hasData); _distanceItem.setEnabled(hasData); + _autoplayTrack.setEnabled(hasData && _track.getNumPoints() > 3); _getGpsiesItem.setEnabled(hasData); _uploadGpsiesItem.setEnabled(hasData && _track.hasTrackPoints()); _lookupSrtmItem.setEnabled(hasData); - _lookupWikipediaItem.setEnabled(hasData); + _nearbyWikipediaItem.setEnabled(hasData); + _nearbyOsmPoiItem.setEnabled(hasData); _downloadOsmItem.setEnabled(hasData); + _getWeatherItem.setEnabled(hasData); _findWaypointItem.setEnabled(hasData && _track.hasWaypoints()); + // have we got a cache? + _downloadSrtmItem.setEnabled(hasData && Config.getConfigString(Config.KEY_DISK_CACHE) != null); + // have we got any timestamps? + _deleteByDateItem.setEnabled(hasData && _track.hasData(Field.TIMESTAMP)); + // is undo available? boolean hasUndo = !_app.getUndoStack().isEmpty(); _undoItem.setEnabled(hasUndo); _undoButton.setEnabled(hasUndo); _clearUndoItem.setEnabled(hasUndo); // is there a current point? - boolean hasPoint = (hasData && _selection.getCurrentPointIndex() >= 0); + DataPoint currPoint = _app.getTrackInfo().getCurrentPoint(); + boolean hasPoint = (currPoint != null); _editPointItem.setEnabled(hasPoint); _editPointButton.setEnabled(hasPoint); _editWaypointNameItem.setEnabled(hasPoint); @@ -830,13 +911,19 @@ public class MenuManager implements DataSubscriber _selectEndItem.setEnabled(hasPoint); _selectEndButton.setEnabled(hasPoint); _duplicatePointItem.setEnabled(hasPoint); + _showPeakfinderItem.setEnabled(hasPoint); + _showGeohackItem.setEnabled(hasPoint); + _searchOpencachingDeItem.setEnabled(hasPoint); + _searchMapillaryItem.setEnabled(hasPoint); + // is it a waypoint? + _selectSegmentItem.setEnabled(hasPoint && !currPoint.isWaypoint()); // are there any photos? boolean anyPhotos = _app.getTrackInfo().getPhotoList().getNumPhotos() > 0; - _saveExifItem.setEnabled(anyPhotos); + _saveExifItem.setEnabled(anyPhotos && _app.getTrackInfo().getPhotoList().hasMediaWithFile()); // is there a current photo, audio? Photo currentPhoto = _app.getTrackInfo().getCurrentPhoto(); boolean hasPhoto = currentPhoto != null; - AudioFile currentAudio = _app.getTrackInfo().getCurrentAudio(); + AudioClip currentAudio = _app.getTrackInfo().getCurrentAudio(); boolean hasAudio = currentAudio != null; // connect is available if (photo/audio) and point selected, and media has no point boolean connectAvailable = (hasPhoto && hasPoint && currentPhoto.getDataPoint() == null) @@ -845,7 +932,7 @@ public class MenuManager implements DataSubscriber _connectButton.setEnabled(connectAvailable); _disconnectPhotoItem.setEnabled(hasPhoto && currentPhoto.getDataPoint() != null); _correlatePhotosItem.setEnabled(anyPhotos && hasData); - _rearrangePhotosItem.setEnabled(anyPhotos && hasData && _track.getNumPoints() > 1); + _rearrangePhotosItem.setEnabled(anyPhotos && hasMultiplePoints); _removePhotoItem.setEnabled(hasPhoto); _rotatePhotoLeft.setEnabled(hasPhoto); _rotatePhotoRight.setEnabled(hasPhoto); @@ -856,14 +943,14 @@ public class MenuManager implements DataSubscriber _selectNoAudioItem.setEnabled(hasAudio); _removeAudioItem.setEnabled(hasAudio); _connectAudioItem.setEnabled(hasAudio && hasPoint && currentAudio.getDataPoint() == null); - _disconnectAudioItem.setEnabled(hasAudio && _app.getTrackInfo().getCurrentAudio().getDataPoint() != null); + _disconnectAudioItem.setEnabled(hasAudio && currentAudio.getDataPoint() != null); _correlateAudiosItem.setEnabled(anyAudios && hasData); // is there a current range? boolean hasRange = (hasData && _selection.hasRangeSelected()); _deleteRangeItem.setEnabled(hasRange); _deleteRangeButton.setEnabled(hasRange); - _interpolateItem.setEnabled(hasRange - && (_selection.getEnd() - _selection.getStart()) == 1); + _cropTrackItem.setEnabled(hasRange); + _interpolateItem.setEnabled(hasRange); _averageItem.setEnabled(hasRange); _mergeSegmentsItem.setEnabled(hasRange); _reverseItem.setEnabled(hasRange); @@ -872,15 +959,58 @@ public class MenuManager implements DataSubscriber _convertNamesToTimesItem.setEnabled(hasRange && _track.hasWaypoints()); _deleteFieldValuesItem.setEnabled(hasRange); _fullRangeDetailsItem.setEnabled(hasRange); + _estimateTimeItem.setEnabled(hasRange); + _learnEstimationParams.setEnabled(hasData && _track.hasTrackPoints() && _track.hasData(Field.TIMESTAMP) + && _track.hasAltitudeData()); // Is the currently selected point outside the current range? - _cutAndMoveItem.setEnabled(hasRange && hasPoint && + boolean canCutAndMove = hasRange && hasPoint && (_selection.getCurrentPointIndex() < _selection.getStart() - || _selection.getCurrentPointIndex() > (_selection.getEnd()+1))); + || _selection.getCurrentPointIndex() > (_selection.getEnd()+1)); + _cutAndMoveItem.setEnabled(canCutAndMove); + _cutAndMoveButton.setEnabled(canCutAndMove); + final boolean isTrackLengthTwo = hasData && _track.getNumPoints() == 2; + _routingGraphHopperItem.setEnabled(isTrackLengthTwo || (hasData && hasRange)); // Has the map been switched on/off? boolean mapsOn = Config.getConfigBoolean(Config.KEY_SHOW_MAP); if (_mapCheckbox.isSelected() != mapsOn) { _mapCheckbox.setSelected(mapsOn); } + // Are there any recently-used files? + RecentFileList rfl = Config.getRecentFileList(); + final int numRecentFiles = rfl.getNumEntries(); + final boolean hasRecentFiles = numRecentFiles > 0; + _recentFileMenu.setEnabled(hasRecentFiles); + if (hasRecentFiles) + { + int numItems = _recentFileMenu.getMenuComponentCount(); + if (numItems == numRecentFiles) + { + // Right number of items, just change texts + for (int i=0; i