From: Frédéric Perrin Date: Sat, 30 Nov 2019 22:27:30 +0000 (+0000) Subject: Merge branch 'fp-integration' into debian/sid X-Git-Url: http://gitweb.fperrin.net/?a=commitdiff_plain;h=65d74ee15c07ca8a5a3e3eee468aefe5e871b4e6;hp=6f92fe806b24840696f7f095a3002d8dc11f68fa;p=GpsPrune.git Merge branch 'fp-integration' into debian/sid --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8e9e794 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.class +*.jar diff --git a/buildtools/MANIFEST.MF b/buildtools/MANIFEST.MF new file mode 100644 index 0000000..23d5ed0 --- /dev/null +++ b/buildtools/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: tim.prune.GpsPrune + diff --git a/buildtools/build.sh b/buildtools/build.sh new file mode 100755 index 0000000..c7fcf3d --- /dev/null +++ b/buildtools/build.sh @@ -0,0 +1,26 @@ +set -e +# Build script +# Version number +PRUNENAME=gpsprune_19.2 +# remove compile directory +rm -rf compile +# remove dist directory +rm -rf dist +# create compile directory +mkdir compile +echo "building..." +# compile java +# TODO: If your java3d libraries are not under /usr/share/java, please edit the following line with the correct path +javac -d compile -cp /usr/share/java/vecmath.jar:/usr/share/java/j3dutils.jar:/usr/share/java/j3dcore.jar $( find src -name "*.java" -print ) +# add other required resources +cp -r src/tim/prune/lang compile/tim/prune/ +cp -r src/tim/prune/*.txt compile/tim/prune/ +cp -r src/tim/prune/gui/images compile/tim/prune/gui/ +cp src/tim/prune/function/srtm/srtmtiles.dat compile/tim/prune/function/srtm +# make dist directory +mkdir dist +# build into jar file +jar cfm dist/${PRUNENAME}.jar buildtools/MANIFEST.MF -C compile . +# finished! +echo "build complete" + diff --git a/buildtools/build.xml b/buildtools/build.xml new file mode 100644 index 0000000..50dd138 --- /dev/null +++ b/buildtools/build.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/buildtools/howtobuild.txt b/buildtools/howtobuild.txt new file mode 100644 index 0000000..a8efe96 --- /dev/null +++ b/buildtools/howtobuild.txt @@ -0,0 +1,85 @@ +How to build GpsPrune +===================== + +As with any Java program, there are several different ways to build the GpsPrune application from source, and which method you choose depends a lot on what other Java technologies you're familiar with. + +The most popular methods used to build GpsPrune are probably: + + 1. Using any Java IDE, and linking the project to your installed Java3d jars + 2. Using a build script + 2. Using ant + 3. Using maven + 4. Using gradle + +Note: in order not to pollute the root directory with every configuration file for each and every possible build tool, they have all been collected into the separate "buildtools" subdirectory. For some of these methods (such as ant and maven), the corresponding configuration files should first be selected and moved up to the parent directory before running the tool from there. + + +1. Using an IDE +================ + +There are many IDEs to choose from, including Eclipse, IntelliJ, Netbeans and many others. A list can be found at https://en.wikipedia.org/wiki/Java_IDEs#Java + +Most of these will have the ability to automatically build, run and debug the GpsPrune application, providing that they are told where the Java3d libraries can be found. This can be done by editing the project dependencies to additionally include the external jar files. Where these jar files can be found will vary from system to system, but on most linux systems they are in /usr/share/java/. + + +2. Using a build script +======================== + +Requirements: some kind of linux, unix or osx system; build.sh modified to your own paths + +First it is necessary to manually edit the build.sh script to add the paths to where your java3d libraries are installed. This tells the javac tool where to find them for compilation. An example is shown in build.sh using the -cp parameter to javac with a colon-separated list of jar files. + +To compile the code and build a jar file, run: + sh buildtools/build.sh + +It should be easily possible to modify the script to run on Windows systems, and any contributions in this direction would be gratefully received. + + +3. Using ant +============= + +Requirements: ant already installed (eg apt-get install ant); build.xml and version.properties +Firstly, these two configuration files ("build.xml" and "version.properties") should be moved from the "buildtools" directory to the parent directory. +Secondly, the paths to the java3d jars should be checked and if necessary corrected in the build.xml file. This is shown in the section beginning with . +Thirdly, from this directory where the configuration files (and the src directory) are located, run the ant tool: + ant + +This will firstly compile the java files from "src" into class files under "compile", and then bundle these together (along with the required resources) into a jar file under "dist". + + +4. Using Maven +=============== + +Requirements: Maven already installed (eg apt-get install maven); pom.xml +Also an internet connection is required whenever a target is run for the first time. +Note that as well as downloading a variety of plugins, Maven will also download its own versions of the java3d dependencies and store them in its own "repository" to use for the building step. + +Before you can use Maven, you need to move the file "pom.xml" from the "buildtools" directory into the parent directory. + +Then, to build GpsPrune, execute from this directory: + mvn clean install + +This doesn't actually install anything, but compiles the code and produces a jar file. The resulting jar will be placed in the target/ folder. + +To rebuild, package and run GpsPrune, execute: + mvn clean install exec:java + +The resources in pom.xml are changed (so they are not the maven common ones) because of the backward compatibility with the project. + +4.1. Using Maven to setup Eclipse +================================== + +Requirements: Eclipse already installed (eg apt-get install eclipse-jdt); Maven setup as above +You can import the project in Eclipse either by calling: + mvn eclipse:eclipse + +and then File > Import > Existing Projects into Workspace or using File > Import > Existing Maven Projects. + + +5. Using Gradle +================ + +TODO +Requirements: Gradle already installed (eg apt-get install gradle); build.gradle file +Any contributions to provide a suitable gradle file would be gratefully received. + diff --git a/buildtools/pom.xml b/buildtools/pom.xml new file mode 100644 index 0000000..82b29ac --- /dev/null +++ b/buildtools/pom.xml @@ -0,0 +1,134 @@ + + + + 4.0.0 + + tim.prune + gpsprune + 19.2 + jar + + tim.prune.gpsprune + https://github.com/activityworkshop/GpsPrune + + + UTF-8 + 1.8 + 1.8 + tim.prune.GpsPrune + 1.3.1 + 1.5.2 + + + + talanlabs-releases-repository + http://nexus.talanlabs.com/content/repositories/releases/ + + + + + + java3d + j3d-core + ${java3d.version} + + + java3d + vecmath + ${java3d.version} + + + java3d + j3dutils + ${j3dutils.version} + + + + + ${project.build.directory}/classes + ${project.artifactId}_${project.version} + ${project.basedir}/ + + + ${project.basedir}/src/ + + tim/prune/gui/images/* + tim/prune/lang/* + tim/prune/function/srtm/srtmtiles.dat + tim/prune/*.txt + + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-jar-plugin + 3.0.2 + + + + ${app.mainClass} + + + + + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.10 + + true + true + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + ${app.mainClass} + + + + + + + + diff --git a/buildtools/version.properties b/buildtools/version.properties new file mode 100644 index 0000000..af25926 --- /dev/null +++ b/buildtools/version.properties @@ -0,0 +1 @@ +version=19.2 diff --git a/tim/prune/App.java b/src/tim/prune/App.java similarity index 96% rename from tim/prune/App.java rename to src/tim/prune/App.java index 3a77858..317064d 100644 --- a/tim/prune/App.java +++ b/src/tim/prune/App.java @@ -51,6 +51,7 @@ public class App { // Instance variables private JFrame _frame = null; + private String _titlePrefix = null; private Track _track = null; private TrackInfo _trackInfo = null; private int _lastSavePosition = 0; @@ -79,6 +80,7 @@ public class App public App(JFrame inFrame) { _frame = inFrame; + _titlePrefix = _frame.getTitle(); _undoStack = new UndoStack(); _track = new Track(); _trackInfo = new TrackInfo(_track); @@ -454,6 +456,22 @@ public class App } + /** + * Remove altitudes from selected points + */ + public void removeAltitudes(int selStart, int selEnd) + { + UndoRemoveAltitudes undo = new UndoRemoveAltitudes(_trackInfo, selStart, selEnd); + if (_trackInfo.getTrack().removeAltitudes(selStart, selEnd)) + { + _undoStack.add(undo); + _trackInfo.getSelection().markInvalid(); + UpdateMessageBroker.informSubscribers(DataSubscriber.DATA_EDITED); + UpdateMessageBroker.informSubscribers(I18nManager.getText("confirm.removealtitudes")); + } + } + + /** * Merge the track segments within the current selection */ @@ -759,6 +777,10 @@ public class App + " '" + inSourceInfo.getName() + "'"); // update menu _menuManager.informFileLoaded(); + // recentre viewport on new file data + _viewport.recentreViewport(); + // update main window title + updateTitle(); // Remove busy lock _busyLoading = false; // load next file if there's a queue @@ -1001,4 +1023,16 @@ public class App public void setCurrentMode(AppMode inMode) { _appMode = inMode; } + + /** Update main window title **/ + public void updateTitle() { + ArrayList filenames = _trackInfo.getFileInfo().getFilenames(); + if (filenames.size() > 0) { + _frame.setTitle(_titlePrefix + ": " + String.join(", ", filenames)); + } + else + { + _frame.setTitle(_titlePrefix); + } + } } diff --git a/tim/prune/DataStatus.java b/src/tim/prune/DataStatus.java similarity index 100% rename from tim/prune/DataStatus.java rename to src/tim/prune/DataStatus.java diff --git a/tim/prune/DataSubscriber.java b/src/tim/prune/DataSubscriber.java similarity index 100% rename from tim/prune/DataSubscriber.java rename to src/tim/prune/DataSubscriber.java diff --git a/tim/prune/ExternalTools.java b/src/tim/prune/ExternalTools.java similarity index 100% rename from tim/prune/ExternalTools.java rename to src/tim/prune/ExternalTools.java diff --git a/tim/prune/FileDropHandler.java b/src/tim/prune/FileDropHandler.java similarity index 100% rename from tim/prune/FileDropHandler.java rename to src/tim/prune/FileDropHandler.java diff --git a/tim/prune/FunctionLibrary.java b/src/tim/prune/FunctionLibrary.java similarity index 97% rename from tim/prune/FunctionLibrary.java rename to src/tim/prune/FunctionLibrary.java index 0441826..4be286e 100644 --- a/tim/prune/FunctionLibrary.java +++ b/src/tim/prune/FunctionLibrary.java @@ -28,6 +28,7 @@ import tim.prune.function.PhotoPopupFunction; import tim.prune.function.PlayAudioFunction; import tim.prune.function.RearrangePhotosFunction; import tim.prune.function.RearrangeWaypointsFunction; +import tim.prune.function.RemoveAltitudes; import tim.prune.function.RemoveAudioFunction; import tim.prune.function.RemovePhotoFunction; import tim.prune.function.RotatePhoto; @@ -56,12 +57,12 @@ import tim.prune.function.settings.SaveConfig; import tim.prune.function.settings.SetAltitudeTolerance; import tim.prune.function.settings.SetColours; import tim.prune.function.settings.SetDisplaySettings; +import tim.prune.function.settings.SetEarthdataAuthentication; import tim.prune.function.settings.SetLanguage; import tim.prune.function.settings.SetMapBgFunction; import tim.prune.function.settings.SetPathsFunction; import tim.prune.function.sew.SewTrackSegmentsFunction; import tim.prune.function.sew.SplitSegmentsFunction; -import tim.prune.function.srtm.DownloadSrtmFunction; import tim.prune.function.srtm.LookupSrtmFunction; import tim.prune.function.weather.GetWeatherForecastFunction; import tim.prune.load.AudioLoader; @@ -103,13 +104,13 @@ public abstract class FunctionLibrary public static GenericFunction FUNCTION_DELETE_BY_DATE = null; public static SingleNumericParameterFunction FUNCTION_INTERPOLATE = null; public static GenericFunction FUNCTION_LOOKUP_SRTM = null; - public static GenericFunction FUNCTION_DOWNLOAD_SRTM = null; public static GenericFunction FUNCTION_NEARBY_WIKIPEDIA = null; public static GenericFunction FUNCTION_SEARCH_WIKIPEDIA = null; public static GenericFunction FUNCTION_SEARCH_OSMPOIS = null; public static GenericFunction FUNCTION_DOWNLOAD_OSM = null; public static GenericFunction FUNCTION_ADD_TIME_OFFSET = null; public static GenericFunction FUNCTION_ADD_ALTITUDE_OFFSET = null; + public static GenericFunction FUNCTION_REMOVE_ALTITUDES = null; public static GenericFunction FUNCTION_CONVERT_NAMES_TO_TIMES = null; public static GenericFunction FUNCTION_DELETE_FIELD_VALUES = null; public static GenericFunction FUNCTION_PASTE_COORDINATES = null; @@ -146,6 +147,7 @@ public abstract class FunctionLibrary public static GenericFunction FUNCTION_SET_COLOURS = null; public static GenericFunction FUNCTION_SET_LANGUAGE = null; public static SingleNumericParameterFunction FUNCTION_SET_ALTITUDE_TOLERANCE = null; + public static GenericFunction FUNCTION_SET_EARTHDATA_AUTH = null; public static GenericFunction FUNCTION_SET_TIMEZONE = null; public static GenericFunction FUNCTION_HELP = null; public static GenericFunction FUNCTION_SHOW_KEYS = null; @@ -183,13 +185,13 @@ public abstract class FunctionLibrary FUNCTION_DELETE_BY_DATE = new DeleteByDateFunction(inApp); FUNCTION_INTERPOLATE = new InterpolateFunction(inApp); FUNCTION_LOOKUP_SRTM = new LookupSrtmFunction(inApp); - FUNCTION_DOWNLOAD_SRTM = new DownloadSrtmFunction(inApp); FUNCTION_NEARBY_WIKIPEDIA = new GetWikipediaFunction(inApp); FUNCTION_SEARCH_WIKIPEDIA = new SearchWikipediaNames(inApp); FUNCTION_SEARCH_OSMPOIS = new SearchOsmPoisFunction(inApp); FUNCTION_DOWNLOAD_OSM = new DownloadOsmFunction(inApp); FUNCTION_ADD_TIME_OFFSET = new AddTimeOffset(inApp); FUNCTION_ADD_ALTITUDE_OFFSET = new AddAltitudeOffset(inApp); + FUNCTION_REMOVE_ALTITUDES = new RemoveAltitudes(inApp); FUNCTION_CONVERT_NAMES_TO_TIMES = new ConvertNamesToTimes(inApp); FUNCTION_DELETE_FIELD_VALUES = new DeleteFieldValues(inApp); FUNCTION_PASTE_COORDINATES = new PasteCoordinates(inApp); @@ -227,6 +229,7 @@ public abstract class FunctionLibrary FUNCTION_SET_LANGUAGE = new SetLanguage(inApp); FUNCTION_SET_ALTITUDE_TOLERANCE = new SetAltitudeTolerance(inApp); FUNCTION_SET_TIMEZONE = new SelectTimezoneFunction(inApp); + FUNCTION_SET_EARTHDATA_AUTH = new SetEarthdataAuthentication(inApp); FUNCTION_HELP = new HelpScreen(inApp); FUNCTION_SHOW_KEYS = new ShowKeysScreen(inApp); FUNCTION_ABOUT = new AboutScreen(inApp); diff --git a/tim/prune/GenericFunction.java b/src/tim/prune/GenericFunction.java similarity index 100% rename from tim/prune/GenericFunction.java rename to src/tim/prune/GenericFunction.java diff --git a/tim/prune/GpsPrune.java b/src/tim/prune/GpsPrune.java similarity index 100% rename from tim/prune/GpsPrune.java rename to src/tim/prune/GpsPrune.java diff --git a/tim/prune/I18nManager.java b/src/tim/prune/I18nManager.java similarity index 100% rename from tim/prune/I18nManager.java rename to src/tim/prune/I18nManager.java diff --git a/tim/prune/UpdateMessageBroker.java b/src/tim/prune/UpdateMessageBroker.java similarity index 100% rename from tim/prune/UpdateMessageBroker.java rename to src/tim/prune/UpdateMessageBroker.java diff --git a/tim/prune/config/ColourScheme.java b/src/tim/prune/config/ColourScheme.java similarity index 100% rename from tim/prune/config/ColourScheme.java rename to src/tim/prune/config/ColourScheme.java diff --git a/tim/prune/config/ColourUtils.java b/src/tim/prune/config/ColourUtils.java similarity index 100% rename from tim/prune/config/ColourUtils.java rename to src/tim/prune/config/ColourUtils.java diff --git a/tim/prune/config/Config.java b/src/tim/prune/config/Config.java similarity index 98% rename from tim/prune/config/Config.java rename to src/tim/prune/config/Config.java index 84e5fd7..3939c00 100644 --- a/tim/prune/config/Config.java +++ b/src/tim/prune/config/Config.java @@ -105,6 +105,8 @@ public abstract class Config public static final String KEY_WAYPOINT_ICON_SIZE = "prune.waypointiconsize"; /** Id of selected timezone */ public static final String KEY_TIMEZONE_ID = "prune.timezoneid"; + /** Username/password to the Earthdata server for SRTM 1-arcsecond tiles */ + public static final String KEY_EARTHDATA_AUTH = "prune.earthdataauth"; /** Initialise the default properties */ diff --git a/tim/prune/config/ConfigException.java b/src/tim/prune/config/ConfigException.java similarity index 100% rename from tim/prune/config/ConfigException.java rename to src/tim/prune/config/ConfigException.java diff --git a/tim/prune/config/TimezoneHelper.java b/src/tim/prune/config/TimezoneHelper.java similarity index 100% rename from tim/prune/config/TimezoneHelper.java rename to src/tim/prune/config/TimezoneHelper.java diff --git a/tim/prune/copyright.txt b/src/tim/prune/copyright.txt similarity index 100% rename from tim/prune/copyright.txt rename to src/tim/prune/copyright.txt diff --git a/tim/prune/correlate/AudioCorrelator.java b/src/tim/prune/correlate/AudioCorrelator.java similarity index 100% rename from tim/prune/correlate/AudioCorrelator.java rename to src/tim/prune/correlate/AudioCorrelator.java diff --git a/tim/prune/correlate/AudioTimestampSelector.java b/src/tim/prune/correlate/AudioTimestampSelector.java similarity index 100% rename from tim/prune/correlate/AudioTimestampSelector.java rename to src/tim/prune/correlate/AudioTimestampSelector.java diff --git a/tim/prune/correlate/CardStack.java b/src/tim/prune/correlate/CardStack.java similarity index 100% rename from tim/prune/correlate/CardStack.java rename to src/tim/prune/correlate/CardStack.java diff --git a/tim/prune/correlate/Correlator.java b/src/tim/prune/correlate/Correlator.java similarity index 100% rename from tim/prune/correlate/Correlator.java rename to src/tim/prune/correlate/Correlator.java diff --git a/tim/prune/correlate/MediaPreviewTableModel.java b/src/tim/prune/correlate/MediaPreviewTableModel.java similarity index 100% rename from tim/prune/correlate/MediaPreviewTableModel.java rename to src/tim/prune/correlate/MediaPreviewTableModel.java diff --git a/tim/prune/correlate/MediaPreviewTableRow.java b/src/tim/prune/correlate/MediaPreviewTableRow.java similarity index 100% rename from tim/prune/correlate/MediaPreviewTableRow.java rename to src/tim/prune/correlate/MediaPreviewTableRow.java diff --git a/tim/prune/correlate/MediaSelectionTableModel.java b/src/tim/prune/correlate/MediaSelectionTableModel.java similarity index 100% rename from tim/prune/correlate/MediaSelectionTableModel.java rename to src/tim/prune/correlate/MediaSelectionTableModel.java diff --git a/tim/prune/correlate/MediaSelectionTableRow.java b/src/tim/prune/correlate/MediaSelectionTableRow.java similarity index 100% rename from tim/prune/correlate/MediaSelectionTableRow.java rename to src/tim/prune/correlate/MediaSelectionTableRow.java diff --git a/tim/prune/correlate/OptionsChangedListener.java b/src/tim/prune/correlate/OptionsChangedListener.java similarity index 100% rename from tim/prune/correlate/OptionsChangedListener.java rename to src/tim/prune/correlate/OptionsChangedListener.java diff --git a/tim/prune/correlate/PhotoCorrelator.java b/src/tim/prune/correlate/PhotoCorrelator.java similarity index 100% rename from tim/prune/correlate/PhotoCorrelator.java rename to src/tim/prune/correlate/PhotoCorrelator.java diff --git a/tim/prune/correlate/PointMediaPair.java b/src/tim/prune/correlate/PointMediaPair.java similarity index 100% rename from tim/prune/correlate/PointMediaPair.java rename to src/tim/prune/correlate/PointMediaPair.java diff --git a/tim/prune/correlate/TimeIndexPair.java b/src/tim/prune/correlate/TimeIndexPair.java similarity index 100% rename from tim/prune/correlate/TimeIndexPair.java rename to src/tim/prune/correlate/TimeIndexPair.java diff --git a/tim/prune/data/Altitude.java b/src/tim/prune/data/Altitude.java similarity index 100% rename from tim/prune/data/Altitude.java rename to src/tim/prune/data/Altitude.java diff --git a/tim/prune/data/AltitudeRange.java b/src/tim/prune/data/AltitudeRange.java similarity index 100% rename from tim/prune/data/AltitudeRange.java rename to src/tim/prune/data/AltitudeRange.java diff --git a/tim/prune/data/AudioClip.java b/src/tim/prune/data/AudioClip.java similarity index 100% rename from tim/prune/data/AudioClip.java rename to src/tim/prune/data/AudioClip.java diff --git a/tim/prune/data/AudioList.java b/src/tim/prune/data/AudioList.java similarity index 100% rename from tim/prune/data/AudioList.java rename to src/tim/prune/data/AudioList.java diff --git a/tim/prune/data/Checker.java b/src/tim/prune/data/Checker.java similarity index 100% rename from tim/prune/data/Checker.java rename to src/tim/prune/data/Checker.java diff --git a/tim/prune/data/Coordinate.java b/src/tim/prune/data/Coordinate.java similarity index 100% rename from tim/prune/data/Coordinate.java rename to src/tim/prune/data/Coordinate.java diff --git a/tim/prune/data/DataPoint.java b/src/tim/prune/data/DataPoint.java similarity index 98% rename from tim/prune/data/DataPoint.java rename to src/tim/prune/data/DataPoint.java index 84f4800..01e9975 100644 --- a/tim/prune/data/DataPoint.java +++ b/src/tim/prune/data/DataPoint.java @@ -354,6 +354,16 @@ public class DataPoint } } + /** + * Remove altitude from point + */ + public void removeAltitude() + { + _altitude = Altitude.NONE; + _fieldValues[_fieldList.getFieldIndex(Field.ALTITUDE)] = _altitude.getStringValue(null); + setModified(false); + } + /** * Reset the altitude to the previous value (by an undo) * @param inClone altitude object cloned from earlier diff --git a/tim/prune/data/Distance.java b/src/tim/prune/data/Distance.java similarity index 100% rename from tim/prune/data/Distance.java rename to src/tim/prune/data/Distance.java diff --git a/tim/prune/data/DoubleRange.java b/src/tim/prune/data/DoubleRange.java similarity index 100% rename from tim/prune/data/DoubleRange.java rename to src/tim/prune/data/DoubleRange.java diff --git a/tim/prune/data/Field.java b/src/tim/prune/data/Field.java similarity index 100% rename from tim/prune/data/Field.java rename to src/tim/prune/data/Field.java diff --git a/tim/prune/data/FieldList.java b/src/tim/prune/data/FieldList.java similarity index 100% rename from tim/prune/data/FieldList.java rename to src/tim/prune/data/FieldList.java diff --git a/tim/prune/data/FileInfo.java b/src/tim/prune/data/FileInfo.java similarity index 91% rename from tim/prune/data/FileInfo.java rename to src/tim/prune/data/FileInfo.java index 41900cb..7eaac8f 100644 --- a/tim/prune/data/FileInfo.java +++ b/src/tim/prune/data/FileInfo.java @@ -74,6 +74,19 @@ public class FileInfo return ""; } + /** + * @return The source names + */ + public ArrayList getFilenames() + { + ArrayList filenames = new ArrayList(); + for (SourceInfo source : _sources) + { + filenames.add(source.getName()); + } + return filenames; + } + /** * @param inIndex index number, starting from zero * @return source info object diff --git a/tim/prune/data/GradientCalculator.java b/src/tim/prune/data/GradientCalculator.java similarity index 100% rename from tim/prune/data/GradientCalculator.java rename to src/tim/prune/data/GradientCalculator.java diff --git a/tim/prune/data/IntegerRange.java b/src/tim/prune/data/IntegerRange.java similarity index 100% rename from tim/prune/data/IntegerRange.java rename to src/tim/prune/data/IntegerRange.java diff --git a/tim/prune/data/LatLonRectangle.java b/src/tim/prune/data/LatLonRectangle.java similarity index 100% rename from tim/prune/data/LatLonRectangle.java rename to src/tim/prune/data/LatLonRectangle.java diff --git a/tim/prune/data/Latitude.java b/src/tim/prune/data/Latitude.java similarity index 100% rename from tim/prune/data/Latitude.java rename to src/tim/prune/data/Latitude.java diff --git a/tim/prune/data/Longitude.java b/src/tim/prune/data/Longitude.java similarity index 100% rename from tim/prune/data/Longitude.java rename to src/tim/prune/data/Longitude.java diff --git a/tim/prune/data/MediaList.java b/src/tim/prune/data/MediaList.java similarity index 100% rename from tim/prune/data/MediaList.java rename to src/tim/prune/data/MediaList.java diff --git a/tim/prune/data/MediaObject.java b/src/tim/prune/data/MediaObject.java similarity index 100% rename from tim/prune/data/MediaObject.java rename to src/tim/prune/data/MediaObject.java diff --git a/tim/prune/data/MidpointData.java b/src/tim/prune/data/MidpointData.java similarity index 100% rename from tim/prune/data/MidpointData.java rename to src/tim/prune/data/MidpointData.java diff --git a/tim/prune/data/NumberUtils.java b/src/tim/prune/data/NumberUtils.java similarity index 100% rename from tim/prune/data/NumberUtils.java rename to src/tim/prune/data/NumberUtils.java diff --git a/tim/prune/data/Photo.java b/src/tim/prune/data/Photo.java similarity index 100% rename from tim/prune/data/Photo.java rename to src/tim/prune/data/Photo.java diff --git a/tim/prune/data/PhotoList.java b/src/tim/prune/data/PhotoList.java similarity index 100% rename from tim/prune/data/PhotoList.java rename to src/tim/prune/data/PhotoList.java diff --git a/tim/prune/data/PointCreateOptions.java b/src/tim/prune/data/PointCreateOptions.java similarity index 100% rename from tim/prune/data/PointCreateOptions.java rename to src/tim/prune/data/PointCreateOptions.java diff --git a/tim/prune/data/PointScaler.java b/src/tim/prune/data/PointScaler.java similarity index 100% rename from tim/prune/data/PointScaler.java rename to src/tim/prune/data/PointScaler.java diff --git a/tim/prune/data/RangeStats.java b/src/tim/prune/data/RangeStats.java similarity index 100% rename from tim/prune/data/RangeStats.java rename to src/tim/prune/data/RangeStats.java diff --git a/tim/prune/data/RecentFile.java b/src/tim/prune/data/RecentFile.java similarity index 100% rename from tim/prune/data/RecentFile.java rename to src/tim/prune/data/RecentFile.java diff --git a/tim/prune/data/RecentFileList.java b/src/tim/prune/data/RecentFileList.java similarity index 100% rename from tim/prune/data/RecentFileList.java rename to src/tim/prune/data/RecentFileList.java diff --git a/tim/prune/data/Selection.java b/src/tim/prune/data/Selection.java similarity index 100% rename from tim/prune/data/Selection.java rename to src/tim/prune/data/Selection.java diff --git a/tim/prune/data/SourceInfo.java b/src/tim/prune/data/SourceInfo.java similarity index 100% rename from tim/prune/data/SourceInfo.java rename to src/tim/prune/data/SourceInfo.java diff --git a/tim/prune/data/Speed.java b/src/tim/prune/data/Speed.java similarity index 100% rename from tim/prune/data/Speed.java rename to src/tim/prune/data/Speed.java diff --git a/tim/prune/data/SpeedCalculator.java b/src/tim/prune/data/SpeedCalculator.java similarity index 100% rename from tim/prune/data/SpeedCalculator.java rename to src/tim/prune/data/SpeedCalculator.java diff --git a/tim/prune/data/SpeedValue.java b/src/tim/prune/data/SpeedValue.java similarity index 100% rename from tim/prune/data/SpeedValue.java rename to src/tim/prune/data/SpeedValue.java diff --git a/tim/prune/data/TimeDifference.java b/src/tim/prune/data/TimeDifference.java similarity index 100% rename from tim/prune/data/TimeDifference.java rename to src/tim/prune/data/TimeDifference.java diff --git a/tim/prune/data/Timestamp.java b/src/tim/prune/data/Timestamp.java similarity index 100% rename from tim/prune/data/Timestamp.java rename to src/tim/prune/data/Timestamp.java diff --git a/tim/prune/data/TimestampLocal.java b/src/tim/prune/data/TimestampLocal.java similarity index 100% rename from tim/prune/data/TimestampLocal.java rename to src/tim/prune/data/TimestampLocal.java diff --git a/tim/prune/data/TimestampUtc.java b/src/tim/prune/data/TimestampUtc.java similarity index 100% rename from tim/prune/data/TimestampUtc.java rename to src/tim/prune/data/TimestampUtc.java diff --git a/tim/prune/data/Track.java b/src/tim/prune/data/Track.java similarity index 98% rename from tim/prune/data/Track.java rename to src/tim/prune/data/Track.java index f45854a..ef099d4 100644 --- a/tim/prune/data/Track.java +++ b/src/tim/prune/data/Track.java @@ -377,6 +377,31 @@ public class Track } + /** + * Remove altitudes from the specified range + * @param inStart start of range + * @param inEnd end of range + */ + public boolean removeAltitudes(int inStart, int inEnd) + { + // sanity check + if (inStart < 0 || inEnd < 0 || inStart >= inEnd || inEnd >= _numPoints) { + return false; + } + + boolean anyRemoved = false; + for (int i=inStart; i<=inEnd; i++) + { + DataPoint p = _dataPoints[i]; + if (p != null && p.hasAltitude()) + { + p.removeAltitude(); + anyRemoved = true; + } + } + return anyRemoved; + } + /** * Interleave all waypoints by each nearest track point * @return true if successful, false if no change diff --git a/tim/prune/data/TrackExtents.java b/src/tim/prune/data/TrackExtents.java similarity index 100% rename from tim/prune/data/TrackExtents.java rename to src/tim/prune/data/TrackExtents.java diff --git a/tim/prune/data/TrackInfo.java b/src/tim/prune/data/TrackInfo.java similarity index 100% rename from tim/prune/data/TrackInfo.java rename to src/tim/prune/data/TrackInfo.java diff --git a/tim/prune/data/Unit.java b/src/tim/prune/data/Unit.java similarity index 100% rename from tim/prune/data/Unit.java rename to src/tim/prune/data/Unit.java diff --git a/tim/prune/data/UnitSet.java b/src/tim/prune/data/UnitSet.java similarity index 100% rename from tim/prune/data/UnitSet.java rename to src/tim/prune/data/UnitSet.java diff --git a/tim/prune/data/UnitSetLibrary.java b/src/tim/prune/data/UnitSetLibrary.java similarity index 100% rename from tim/prune/data/UnitSetLibrary.java rename to src/tim/prune/data/UnitSetLibrary.java diff --git a/tim/prune/data/sort/PhotoComparer.java b/src/tim/prune/data/sort/PhotoComparer.java similarity index 100% rename from tim/prune/data/sort/PhotoComparer.java rename to src/tim/prune/data/sort/PhotoComparer.java diff --git a/tim/prune/data/sort/SortMode.java b/src/tim/prune/data/sort/SortMode.java similarity index 100% rename from tim/prune/data/sort/SortMode.java rename to src/tim/prune/data/sort/SortMode.java diff --git a/tim/prune/data/sort/WaypointComparer.java b/src/tim/prune/data/sort/WaypointComparer.java similarity index 100% rename from tim/prune/data/sort/WaypointComparer.java rename to src/tim/prune/data/sort/WaypointComparer.java diff --git a/tim/prune/function/AboutScreen.java b/src/tim/prune/function/AboutScreen.java similarity index 100% rename from tim/prune/function/AboutScreen.java rename to src/tim/prune/function/AboutScreen.java diff --git a/tim/prune/function/AddAltitudeOffset.java b/src/tim/prune/function/AddAltitudeOffset.java similarity index 100% rename from tim/prune/function/AddAltitudeOffset.java rename to src/tim/prune/function/AddAltitudeOffset.java diff --git a/tim/prune/function/AddTimeOffset.java b/src/tim/prune/function/AddTimeOffset.java similarity index 100% rename from tim/prune/function/AddTimeOffset.java rename to src/tim/prune/function/AddTimeOffset.java diff --git a/tim/prune/function/AsyncMediaLoader.java b/src/tim/prune/function/AsyncMediaLoader.java similarity index 100% rename from tim/prune/function/AsyncMediaLoader.java rename to src/tim/prune/function/AsyncMediaLoader.java diff --git a/tim/prune/function/Cancellable.java b/src/tim/prune/function/Cancellable.java similarity index 100% rename from tim/prune/function/Cancellable.java rename to src/tim/prune/function/Cancellable.java diff --git a/tim/prune/function/CheckVersionScreen.java b/src/tim/prune/function/CheckVersionScreen.java similarity index 100% rename from tim/prune/function/CheckVersionScreen.java rename to src/tim/prune/function/CheckVersionScreen.java diff --git a/tim/prune/function/ChooseSingleParameter.java b/src/tim/prune/function/ChooseSingleParameter.java similarity index 100% rename from tim/prune/function/ChooseSingleParameter.java rename to src/tim/prune/function/ChooseSingleParameter.java diff --git a/tim/prune/function/ConnectToPointFunction.java b/src/tim/prune/function/ConnectToPointFunction.java similarity index 100% rename from tim/prune/function/ConnectToPointFunction.java rename to src/tim/prune/function/ConnectToPointFunction.java diff --git a/tim/prune/function/ConvertNamesToTimes.java b/src/tim/prune/function/ConvertNamesToTimes.java similarity index 100% rename from tim/prune/function/ConvertNamesToTimes.java rename to src/tim/prune/function/ConvertNamesToTimes.java diff --git a/tim/prune/function/CreateMarkerWaypointsFunction.java b/src/tim/prune/function/CreateMarkerWaypointsFunction.java similarity index 100% rename from tim/prune/function/CreateMarkerWaypointsFunction.java rename to src/tim/prune/function/CreateMarkerWaypointsFunction.java diff --git a/tim/prune/function/CropToSelection.java b/src/tim/prune/function/CropToSelection.java similarity index 100% rename from tim/prune/function/CropToSelection.java rename to src/tim/prune/function/CropToSelection.java diff --git a/tim/prune/function/DeleteBitOfTrackFunction.java b/src/tim/prune/function/DeleteBitOfTrackFunction.java similarity index 100% rename from tim/prune/function/DeleteBitOfTrackFunction.java rename to src/tim/prune/function/DeleteBitOfTrackFunction.java diff --git a/tim/prune/function/DeleteFieldValues.java b/src/tim/prune/function/DeleteFieldValues.java similarity index 100% rename from tim/prune/function/DeleteFieldValues.java rename to src/tim/prune/function/DeleteFieldValues.java diff --git a/tim/prune/function/DeleteSelectedRangeFunction.java b/src/tim/prune/function/DeleteSelectedRangeFunction.java similarity index 100% rename from tim/prune/function/DeleteSelectedRangeFunction.java rename to src/tim/prune/function/DeleteSelectedRangeFunction.java diff --git a/tim/prune/function/DisconnectAudioFunction.java b/src/tim/prune/function/DisconnectAudioFunction.java similarity index 100% rename from tim/prune/function/DisconnectAudioFunction.java rename to src/tim/prune/function/DisconnectAudioFunction.java diff --git a/tim/prune/function/DisconnectPhotoFunction.java b/src/tim/prune/function/DisconnectPhotoFunction.java similarity index 100% rename from tim/prune/function/DisconnectPhotoFunction.java rename to src/tim/prune/function/DisconnectPhotoFunction.java diff --git a/tim/prune/function/DiskCacheConfig.java b/src/tim/prune/function/DiskCacheConfig.java similarity index 100% rename from tim/prune/function/DiskCacheConfig.java rename to src/tim/prune/function/DiskCacheConfig.java diff --git a/tim/prune/function/DistanceTimeLimitFunction.java b/src/tim/prune/function/DistanceTimeLimitFunction.java similarity index 100% rename from tim/prune/function/DistanceTimeLimitFunction.java rename to src/tim/prune/function/DistanceTimeLimitFunction.java diff --git a/tim/prune/function/DownloadOsmFunction.java b/src/tim/prune/function/DownloadOsmFunction.java similarity index 100% rename from tim/prune/function/DownloadOsmFunction.java rename to src/tim/prune/function/DownloadOsmFunction.java diff --git a/tim/prune/function/DuplicatePoint.java b/src/tim/prune/function/DuplicatePoint.java similarity index 100% rename from tim/prune/function/DuplicatePoint.java rename to src/tim/prune/function/DuplicatePoint.java diff --git a/tim/prune/function/Export3dFunction.java b/src/tim/prune/function/Export3dFunction.java similarity index 100% rename from tim/prune/function/Export3dFunction.java rename to src/tim/prune/function/Export3dFunction.java diff --git a/tim/prune/function/FieldListModel.java b/src/tim/prune/function/FieldListModel.java similarity index 100% rename from tim/prune/function/FieldListModel.java rename to src/tim/prune/function/FieldListModel.java diff --git a/tim/prune/function/FindWaypoint.java b/src/tim/prune/function/FindWaypoint.java similarity index 100% rename from tim/prune/function/FindWaypoint.java rename to src/tim/prune/function/FindWaypoint.java diff --git a/tim/prune/function/FullRangeDetails.java b/src/tim/prune/function/FullRangeDetails.java similarity index 100% rename from tim/prune/function/FullRangeDetails.java rename to src/tim/prune/function/FullRangeDetails.java diff --git a/tim/prune/function/GetWikipediaFunction.java b/src/tim/prune/function/GetWikipediaFunction.java similarity index 100% rename from tim/prune/function/GetWikipediaFunction.java rename to src/tim/prune/function/GetWikipediaFunction.java diff --git a/tim/prune/function/GetWikipediaXmlHandler.java b/src/tim/prune/function/GetWikipediaXmlHandler.java similarity index 100% rename from tim/prune/function/GetWikipediaXmlHandler.java rename to src/tim/prune/function/GetWikipediaXmlHandler.java diff --git a/tim/prune/function/HelpScreen.java b/src/tim/prune/function/HelpScreen.java similarity index 100% rename from tim/prune/function/HelpScreen.java rename to src/tim/prune/function/HelpScreen.java diff --git a/tim/prune/function/IgnoreExifThumb.java b/src/tim/prune/function/IgnoreExifThumb.java similarity index 100% rename from tim/prune/function/IgnoreExifThumb.java rename to src/tim/prune/function/IgnoreExifThumb.java diff --git a/tim/prune/function/InterpolateFunction.java b/src/tim/prune/function/InterpolateFunction.java similarity index 100% rename from tim/prune/function/InterpolateFunction.java rename to src/tim/prune/function/InterpolateFunction.java diff --git a/tim/prune/function/OpenCachingDeXmlHandler.java b/src/tim/prune/function/OpenCachingDeXmlHandler.java similarity index 100% rename from tim/prune/function/OpenCachingDeXmlHandler.java rename to src/tim/prune/function/OpenCachingDeXmlHandler.java diff --git a/tim/prune/function/PasteCoordinates.java b/src/tim/prune/function/PasteCoordinates.java similarity index 100% rename from tim/prune/function/PasteCoordinates.java rename to src/tim/prune/function/PasteCoordinates.java diff --git a/tim/prune/function/PhotoPopupFunction.java b/src/tim/prune/function/PhotoPopupFunction.java similarity index 100% rename from tim/prune/function/PhotoPopupFunction.java rename to src/tim/prune/function/PhotoPopupFunction.java diff --git a/tim/prune/function/PlayAudioFunction.java b/src/tim/prune/function/PlayAudioFunction.java similarity index 100% rename from tim/prune/function/PlayAudioFunction.java rename to src/tim/prune/function/PlayAudioFunction.java diff --git a/tim/prune/function/RearrangeFunction.java b/src/tim/prune/function/RearrangeFunction.java similarity index 100% rename from tim/prune/function/RearrangeFunction.java rename to src/tim/prune/function/RearrangeFunction.java diff --git a/tim/prune/function/RearrangePhotosFunction.java b/src/tim/prune/function/RearrangePhotosFunction.java similarity index 100% rename from tim/prune/function/RearrangePhotosFunction.java rename to src/tim/prune/function/RearrangePhotosFunction.java diff --git a/tim/prune/function/RearrangeWaypointsFunction.java b/src/tim/prune/function/RearrangeWaypointsFunction.java similarity index 100% rename from tim/prune/function/RearrangeWaypointsFunction.java rename to src/tim/prune/function/RearrangeWaypointsFunction.java diff --git a/src/tim/prune/function/RemoveAltitudes.java b/src/tim/prune/function/RemoveAltitudes.java new file mode 100644 index 0000000..1c8b05c --- /dev/null +++ b/src/tim/prune/function/RemoveAltitudes.java @@ -0,0 +1,60 @@ +package tim.prune.function; + +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; + +import tim.prune.App; +import tim.prune.GenericFunction; +import tim.prune.I18nManager; +import tim.prune.config.Config; +import tim.prune.data.Field; +import tim.prune.data.Unit; +import tim.prune.data.UnitSetLibrary; + +/** + * Class to provide the function to add remove the altitude from points in a + * track range + */ +public class RemoveAltitudes extends GenericFunction +{ + /** + * Constructor + * @param inApp application object for callback + */ + public RemoveAltitudes(App inApp) + { + super(inApp); + } + + /** Get the name key */ + public String getNameKey() { + return "function.removealtitudes"; + } + + /** + * Begin the function + */ + public void begin() + { + int selStart = _app.getTrackInfo().getSelection().getStart(); + int selEnd = _app.getTrackInfo().getSelection().getEnd(); + if (!_app.getTrackInfo().getTrack().hasData(Field.ALTITUDE, selStart, selEnd)) + { + _app.showErrorMessage(getNameKey(), "dialog.addaltitude.noaltitudes"); + return; + } + _app.removeAltitudes(selStart, selEnd); + } +} diff --git a/tim/prune/function/RemoveAudioFunction.java b/src/tim/prune/function/RemoveAudioFunction.java similarity index 100% rename from tim/prune/function/RemoveAudioFunction.java rename to src/tim/prune/function/RemoveAudioFunction.java diff --git a/tim/prune/function/RemovePhotoFunction.java b/src/tim/prune/function/RemovePhotoFunction.java similarity index 100% rename from tim/prune/function/RemovePhotoFunction.java rename to src/tim/prune/function/RemovePhotoFunction.java diff --git a/tim/prune/function/RotatePhoto.java b/src/tim/prune/function/RotatePhoto.java similarity index 100% rename from tim/prune/function/RotatePhoto.java rename to src/tim/prune/function/RotatePhoto.java diff --git a/tim/prune/function/SearchOpenCachingDeFunction.java b/src/tim/prune/function/SearchOpenCachingDeFunction.java similarity index 100% rename from tim/prune/function/SearchOpenCachingDeFunction.java rename to src/tim/prune/function/SearchOpenCachingDeFunction.java diff --git a/tim/prune/function/SearchOsmPoisFunction.java b/src/tim/prune/function/SearchOsmPoisFunction.java similarity index 100% rename from tim/prune/function/SearchOsmPoisFunction.java rename to src/tim/prune/function/SearchOsmPoisFunction.java diff --git a/tim/prune/function/SearchOsmPoisXmlHandler.java b/src/tim/prune/function/SearchOsmPoisXmlHandler.java similarity index 100% rename from tim/prune/function/SearchOsmPoisXmlHandler.java rename to src/tim/prune/function/SearchOsmPoisXmlHandler.java diff --git a/tim/prune/function/SearchWikipediaNames.java b/src/tim/prune/function/SearchWikipediaNames.java similarity index 100% rename from tim/prune/function/SearchWikipediaNames.java rename to src/tim/prune/function/SearchWikipediaNames.java diff --git a/tim/prune/function/SelectSegmentFunction.java b/src/tim/prune/function/SelectSegmentFunction.java similarity index 100% rename from tim/prune/function/SelectSegmentFunction.java rename to src/tim/prune/function/SelectSegmentFunction.java diff --git a/tim/prune/function/SelectTimezoneFunction.java b/src/tim/prune/function/SelectTimezoneFunction.java similarity index 100% rename from tim/prune/function/SelectTimezoneFunction.java rename to src/tim/prune/function/SelectTimezoneFunction.java diff --git a/tim/prune/function/SelectTracksFunction.java b/src/tim/prune/function/SelectTracksFunction.java similarity index 100% rename from tim/prune/function/SelectTracksFunction.java rename to src/tim/prune/function/SelectTracksFunction.java diff --git a/tim/prune/function/ShowKeysScreen.java b/src/tim/prune/function/ShowKeysScreen.java similarity index 100% rename from tim/prune/function/ShowKeysScreen.java rename to src/tim/prune/function/ShowKeysScreen.java diff --git a/tim/prune/function/ShowThreeDFunction.java b/src/tim/prune/function/ShowThreeDFunction.java similarity index 100% rename from tim/prune/function/ShowThreeDFunction.java rename to src/tim/prune/function/ShowThreeDFunction.java diff --git a/tim/prune/function/SingleNumericParameterFunction.java b/src/tim/prune/function/SingleNumericParameterFunction.java similarity index 100% rename from tim/prune/function/SingleNumericParameterFunction.java rename to src/tim/prune/function/SingleNumericParameterFunction.java diff --git a/tim/prune/function/StopAudioFunction.java b/src/tim/prune/function/StopAudioFunction.java similarity index 100% rename from tim/prune/function/StopAudioFunction.java rename to src/tim/prune/function/StopAudioFunction.java diff --git a/tim/prune/function/autoplay/AutoplayFunction.java b/src/tim/prune/function/autoplay/AutoplayFunction.java similarity index 100% rename from tim/prune/function/autoplay/AutoplayFunction.java rename to src/tim/prune/function/autoplay/AutoplayFunction.java diff --git a/tim/prune/function/autoplay/PointInfo.java b/src/tim/prune/function/autoplay/PointInfo.java similarity index 100% rename from tim/prune/function/autoplay/PointInfo.java rename to src/tim/prune/function/autoplay/PointInfo.java diff --git a/tim/prune/function/autoplay/PointList.java b/src/tim/prune/function/autoplay/PointList.java similarity index 100% rename from tim/prune/function/autoplay/PointList.java rename to src/tim/prune/function/autoplay/PointList.java diff --git a/tim/prune/function/browser/BrowserLauncher.java b/src/tim/prune/function/browser/BrowserLauncher.java similarity index 100% rename from tim/prune/function/browser/BrowserLauncher.java rename to src/tim/prune/function/browser/BrowserLauncher.java diff --git a/tim/prune/function/browser/UrlGenerator.java b/src/tim/prune/function/browser/UrlGenerator.java similarity index 100% rename from tim/prune/function/browser/UrlGenerator.java rename to src/tim/prune/function/browser/UrlGenerator.java diff --git a/tim/prune/function/browser/WebMapFunction.java b/src/tim/prune/function/browser/WebMapFunction.java similarity index 100% rename from tim/prune/function/browser/WebMapFunction.java rename to src/tim/prune/function/browser/WebMapFunction.java diff --git a/tim/prune/function/cache/ManageCacheFunction.java b/src/tim/prune/function/cache/ManageCacheFunction.java similarity index 100% rename from tim/prune/function/cache/ManageCacheFunction.java rename to src/tim/prune/function/cache/ManageCacheFunction.java diff --git a/tim/prune/function/cache/RowInfo.java b/src/tim/prune/function/cache/RowInfo.java similarity index 100% rename from tim/prune/function/cache/RowInfo.java rename to src/tim/prune/function/cache/RowInfo.java diff --git a/tim/prune/function/cache/TileCacheModel.java b/src/tim/prune/function/cache/TileCacheModel.java similarity index 100% rename from tim/prune/function/cache/TileCacheModel.java rename to src/tim/prune/function/cache/TileCacheModel.java diff --git a/tim/prune/function/cache/TileFilter.java b/src/tim/prune/function/cache/TileFilter.java similarity index 100% rename from tim/prune/function/cache/TileFilter.java rename to src/tim/prune/function/cache/TileFilter.java diff --git a/tim/prune/function/cache/TileSet.java b/src/tim/prune/function/cache/TileSet.java similarity index 100% rename from tim/prune/function/cache/TileSet.java rename to src/tim/prune/function/cache/TileSet.java diff --git a/tim/prune/function/cache/TileSetTableModel.java b/src/tim/prune/function/cache/TileSetTableModel.java similarity index 100% rename from tim/prune/function/cache/TileSetTableModel.java rename to src/tim/prune/function/cache/TileSetTableModel.java diff --git a/tim/prune/function/charts/ChartSeries.java b/src/tim/prune/function/charts/ChartSeries.java similarity index 100% rename from tim/prune/function/charts/ChartSeries.java rename to src/tim/prune/function/charts/ChartSeries.java diff --git a/tim/prune/function/charts/Charter.java b/src/tim/prune/function/charts/Charter.java similarity index 100% rename from tim/prune/function/charts/Charter.java rename to src/tim/prune/function/charts/Charter.java diff --git a/tim/prune/function/compress/ClosePointsAlgorithm.java b/src/tim/prune/function/compress/ClosePointsAlgorithm.java similarity index 100% rename from tim/prune/function/compress/ClosePointsAlgorithm.java rename to src/tim/prune/function/compress/ClosePointsAlgorithm.java diff --git a/tim/prune/function/compress/CompressTrackFunction.java b/src/tim/prune/function/compress/CompressTrackFunction.java similarity index 100% rename from tim/prune/function/compress/CompressTrackFunction.java rename to src/tim/prune/function/compress/CompressTrackFunction.java diff --git a/tim/prune/function/compress/CompressionAlgorithm.java b/src/tim/prune/function/compress/CompressionAlgorithm.java similarity index 100% rename from tim/prune/function/compress/CompressionAlgorithm.java rename to src/tim/prune/function/compress/CompressionAlgorithm.java diff --git a/tim/prune/function/compress/DeleteMarkedPointsFunction.java b/src/tim/prune/function/compress/DeleteMarkedPointsFunction.java similarity index 100% rename from tim/prune/function/compress/DeleteMarkedPointsFunction.java rename to src/tim/prune/function/compress/DeleteMarkedPointsFunction.java diff --git a/tim/prune/function/compress/DouglasPeuckerAlgorithm.java b/src/tim/prune/function/compress/DouglasPeuckerAlgorithm.java similarity index 100% rename from tim/prune/function/compress/DouglasPeuckerAlgorithm.java rename to src/tim/prune/function/compress/DouglasPeuckerAlgorithm.java diff --git a/tim/prune/function/compress/DuplicatePointAlgorithm.java b/src/tim/prune/function/compress/DuplicatePointAlgorithm.java similarity index 100% rename from tim/prune/function/compress/DuplicatePointAlgorithm.java rename to src/tim/prune/function/compress/DuplicatePointAlgorithm.java diff --git a/tim/prune/function/compress/MarkAndDeleteFunction.java b/src/tim/prune/function/compress/MarkAndDeleteFunction.java similarity index 100% rename from tim/prune/function/compress/MarkAndDeleteFunction.java rename to src/tim/prune/function/compress/MarkAndDeleteFunction.java diff --git a/tim/prune/function/compress/MarkLiftsFunction.java b/src/tim/prune/function/compress/MarkLiftsFunction.java similarity index 100% rename from tim/prune/function/compress/MarkLiftsFunction.java rename to src/tim/prune/function/compress/MarkLiftsFunction.java diff --git a/tim/prune/function/compress/MarkPointsInRectangleFunction.java b/src/tim/prune/function/compress/MarkPointsInRectangleFunction.java similarity index 100% rename from tim/prune/function/compress/MarkPointsInRectangleFunction.java rename to src/tim/prune/function/compress/MarkPointsInRectangleFunction.java diff --git a/tim/prune/function/compress/SingleParameterAlgorithm.java b/src/tim/prune/function/compress/SingleParameterAlgorithm.java similarity index 100% rename from tim/prune/function/compress/SingleParameterAlgorithm.java rename to src/tim/prune/function/compress/SingleParameterAlgorithm.java diff --git a/tim/prune/function/compress/SingletonAlgorithm.java b/src/tim/prune/function/compress/SingletonAlgorithm.java similarity index 100% rename from tim/prune/function/compress/SingletonAlgorithm.java rename to src/tim/prune/function/compress/SingletonAlgorithm.java diff --git a/tim/prune/function/compress/SummaryLabel.java b/src/tim/prune/function/compress/SummaryLabel.java similarity index 100% rename from tim/prune/function/compress/SummaryLabel.java rename to src/tim/prune/function/compress/SummaryLabel.java diff --git a/tim/prune/function/compress/TrackDetails.java b/src/tim/prune/function/compress/TrackDetails.java similarity index 100% rename from tim/prune/function/compress/TrackDetails.java rename to src/tim/prune/function/compress/TrackDetails.java diff --git a/tim/prune/function/compress/WackyPointAlgorithm.java b/src/tim/prune/function/compress/WackyPointAlgorithm.java similarity index 100% rename from tim/prune/function/compress/WackyPointAlgorithm.java rename to src/tim/prune/function/compress/WackyPointAlgorithm.java diff --git a/tim/prune/function/compress/XYpoint.java b/src/tim/prune/function/compress/XYpoint.java similarity index 100% rename from tim/prune/function/compress/XYpoint.java rename to src/tim/prune/function/compress/XYpoint.java diff --git a/tim/prune/function/deletebydate/DateInfo.java b/src/tim/prune/function/deletebydate/DateInfo.java similarity index 100% rename from tim/prune/function/deletebydate/DateInfo.java rename to src/tim/prune/function/deletebydate/DateInfo.java diff --git a/tim/prune/function/deletebydate/DateInfoList.java b/src/tim/prune/function/deletebydate/DateInfoList.java similarity index 100% rename from tim/prune/function/deletebydate/DateInfoList.java rename to src/tim/prune/function/deletebydate/DateInfoList.java diff --git a/tim/prune/function/deletebydate/DeleteByDateFunction.java b/src/tim/prune/function/deletebydate/DeleteByDateFunction.java similarity index 100% rename from tim/prune/function/deletebydate/DeleteByDateFunction.java rename to src/tim/prune/function/deletebydate/DeleteByDateFunction.java diff --git a/tim/prune/function/deletebydate/DeletionTableModel.java b/src/tim/prune/function/deletebydate/DeletionTableModel.java similarity index 100% rename from tim/prune/function/deletebydate/DeletionTableModel.java rename to src/tim/prune/function/deletebydate/DeletionTableModel.java diff --git a/tim/prune/function/distance/DistanceFunction.java b/src/tim/prune/function/distance/DistanceFunction.java similarity index 100% rename from tim/prune/function/distance/DistanceFunction.java rename to src/tim/prune/function/distance/DistanceFunction.java diff --git a/tim/prune/function/distance/DistanceTableModel.java b/src/tim/prune/function/distance/DistanceTableModel.java similarity index 100% rename from tim/prune/function/distance/DistanceTableModel.java rename to src/tim/prune/function/distance/DistanceTableModel.java diff --git a/tim/prune/function/distance/FromTableModel.java b/src/tim/prune/function/distance/FromTableModel.java similarity index 100% rename from tim/prune/function/distance/FromTableModel.java rename to src/tim/prune/function/distance/FromTableModel.java diff --git a/tim/prune/function/distance/GenericTableModel.java b/src/tim/prune/function/distance/GenericTableModel.java similarity index 100% rename from tim/prune/function/distance/GenericTableModel.java rename to src/tim/prune/function/distance/GenericTableModel.java diff --git a/tim/prune/function/edit/EditFieldsTableModel.java b/src/tim/prune/function/edit/EditFieldsTableModel.java similarity index 100% rename from tim/prune/function/edit/EditFieldsTableModel.java rename to src/tim/prune/function/edit/EditFieldsTableModel.java diff --git a/tim/prune/function/edit/FieldEdit.java b/src/tim/prune/function/edit/FieldEdit.java similarity index 100% rename from tim/prune/function/edit/FieldEdit.java rename to src/tim/prune/function/edit/FieldEdit.java diff --git a/tim/prune/function/edit/FieldEditList.java b/src/tim/prune/function/edit/FieldEditList.java similarity index 100% rename from tim/prune/function/edit/FieldEditList.java rename to src/tim/prune/function/edit/FieldEditList.java diff --git a/tim/prune/function/edit/PointEditor.java b/src/tim/prune/function/edit/PointEditor.java similarity index 96% rename from tim/prune/function/edit/PointEditor.java rename to src/tim/prune/function/edit/PointEditor.java index c66201b..546a65e 100644 --- a/tim/prune/function/edit/PointEditor.java +++ b/src/tim/prune/function/edit/PointEditor.java @@ -307,10 +307,23 @@ public class PointEditor if (_model.getChanged(i)) { Field field = fieldList.getField(i); + if (field == field.WAYPT_NAME) { + if (wasNameAdded(_model.getValue(i))) { + _app.createPoint(_point.clonePoint()); + } + } editList.addEdit(new FieldEdit(field, _model.getValue(i))); undoList.addEdit(new FieldEdit(field, _point.getFieldValue(field))); } } _app.completePointEdit(editList, undoList); } + + private boolean wasNameAdded(String newName) + { + String prevName = _point.getWaypointName(); + boolean prevNull = (prevName == null || prevName.equals("")); + boolean newNull = (newName == null || newName.equals("")); + return (prevNull && !newNull); + } } diff --git a/tim/prune/function/edit/PointNameEditor.java b/src/tim/prune/function/edit/PointNameEditor.java similarity index 92% rename from tim/prune/function/edit/PointNameEditor.java rename to src/tim/prune/function/edit/PointNameEditor.java index 53e1f83..9e6e343 100644 --- a/tim/prune/function/edit/PointNameEditor.java +++ b/src/tim/prune/function/edit/PointNameEditor.java @@ -206,7 +206,11 @@ public class PointNameEditor extends GenericFunction // Check whether name has really changed if (hasNameChanged()) { - // Make lists for edit and undo, and add the changed field + // If a new name has been added, changing the point + // from trackpoint to waypoint, duplicate it + _app.createPoint(_point.clonePoint()); + + // make lists for edit and undo, and add the changed field FieldEditList editList = new FieldEditList(); FieldEditList undoList = new FieldEditList(); editList.addEdit(new FieldEdit(Field.WAYPT_NAME, _nameField.getText().trim())); @@ -231,4 +235,17 @@ public class PointNameEditor extends GenericFunction || (!prevNull && newNull) || (!prevNull && !newNull && !prevName.equals(newName)); } + + /** + * Check whether a new name has been added + * @return true if it has indeed + */ + private boolean wasNameAdded() + { + String prevName = _point.getWaypointName(); + String newName = _nameField.getText().trim(); + boolean prevNull = (prevName == null || prevName.equals("")); + boolean newNull = (newName == null || newName.equals("")); + return (prevNull && !newNull); + } } diff --git a/tim/prune/function/estimate/EstimateTime.java b/src/tim/prune/function/estimate/EstimateTime.java similarity index 100% rename from tim/prune/function/estimate/EstimateTime.java rename to src/tim/prune/function/estimate/EstimateTime.java diff --git a/tim/prune/function/estimate/EstimationParameters.java b/src/tim/prune/function/estimate/EstimationParameters.java similarity index 100% rename from tim/prune/function/estimate/EstimationParameters.java rename to src/tim/prune/function/estimate/EstimationParameters.java diff --git a/tim/prune/function/estimate/LearnParameters.java b/src/tim/prune/function/estimate/LearnParameters.java similarity index 100% rename from tim/prune/function/estimate/LearnParameters.java rename to src/tim/prune/function/estimate/LearnParameters.java diff --git a/tim/prune/function/estimate/ParametersPanel.java b/src/tim/prune/function/estimate/ParametersPanel.java similarity index 100% rename from tim/prune/function/estimate/ParametersPanel.java rename to src/tim/prune/function/estimate/ParametersPanel.java diff --git a/tim/prune/function/estimate/jama/Maths.java b/src/tim/prune/function/estimate/jama/Maths.java similarity index 100% rename from tim/prune/function/estimate/jama/Maths.java rename to src/tim/prune/function/estimate/jama/Maths.java diff --git a/tim/prune/function/estimate/jama/Matrix.java b/src/tim/prune/function/estimate/jama/Matrix.java similarity index 100% rename from tim/prune/function/estimate/jama/Matrix.java rename to src/tim/prune/function/estimate/jama/Matrix.java diff --git a/tim/prune/function/estimate/jama/QRDecomposition.java b/src/tim/prune/function/estimate/jama/QRDecomposition.java similarity index 100% rename from tim/prune/function/estimate/jama/QRDecomposition.java rename to src/tim/prune/function/estimate/jama/QRDecomposition.java diff --git a/tim/prune/function/gpsies/FormPoster.java b/src/tim/prune/function/gpsies/FormPoster.java similarity index 100% rename from tim/prune/function/gpsies/FormPoster.java rename to src/tim/prune/function/gpsies/FormPoster.java diff --git a/tim/prune/function/gpsies/GetGpsiesFunction.java b/src/tim/prune/function/gpsies/GetGpsiesFunction.java similarity index 100% rename from tim/prune/function/gpsies/GetGpsiesFunction.java rename to src/tim/prune/function/gpsies/GetGpsiesFunction.java diff --git a/tim/prune/function/gpsies/GpsiesXmlHandler.java b/src/tim/prune/function/gpsies/GpsiesXmlHandler.java similarity index 100% rename from tim/prune/function/gpsies/GpsiesXmlHandler.java rename to src/tim/prune/function/gpsies/GpsiesXmlHandler.java diff --git a/tim/prune/function/gpsies/TrackListModel.java b/src/tim/prune/function/gpsies/TrackListModel.java similarity index 100% rename from tim/prune/function/gpsies/TrackListModel.java rename to src/tim/prune/function/gpsies/TrackListModel.java diff --git a/tim/prune/function/gpsies/UploadGpsiesFunction.java b/src/tim/prune/function/gpsies/UploadGpsiesFunction.java similarity index 100% rename from tim/prune/function/gpsies/UploadGpsiesFunction.java rename to src/tim/prune/function/gpsies/UploadGpsiesFunction.java diff --git a/tim/prune/function/search/GenericDownloaderFunction.java b/src/tim/prune/function/search/GenericDownloaderFunction.java similarity index 100% rename from tim/prune/function/search/GenericDownloaderFunction.java rename to src/tim/prune/function/search/GenericDownloaderFunction.java diff --git a/tim/prune/function/search/SearchMapillaryFunction.java b/src/tim/prune/function/search/SearchMapillaryFunction.java similarity index 100% rename from tim/prune/function/search/SearchMapillaryFunction.java rename to src/tim/prune/function/search/SearchMapillaryFunction.java diff --git a/tim/prune/function/search/SearchResult.java b/src/tim/prune/function/search/SearchResult.java similarity index 100% rename from tim/prune/function/search/SearchResult.java rename to src/tim/prune/function/search/SearchResult.java diff --git a/tim/prune/function/search/wikimedia_galleries.txt b/src/tim/prune/function/search/wikimedia_galleries.txt similarity index 100% rename from tim/prune/function/search/wikimedia_galleries.txt rename to src/tim/prune/function/search/wikimedia_galleries.txt diff --git a/tim/prune/function/settings/AddMapSourceDialog.java b/src/tim/prune/function/settings/AddMapSourceDialog.java similarity index 100% rename from tim/prune/function/settings/AddMapSourceDialog.java rename to src/tim/prune/function/settings/AddMapSourceDialog.java diff --git a/tim/prune/function/settings/MapSourceListModel.java b/src/tim/prune/function/settings/MapSourceListModel.java similarity index 100% rename from tim/prune/function/settings/MapSourceListModel.java rename to src/tim/prune/function/settings/MapSourceListModel.java diff --git a/tim/prune/function/settings/SaveConfig.java b/src/tim/prune/function/settings/SaveConfig.java similarity index 100% rename from tim/prune/function/settings/SaveConfig.java rename to src/tim/prune/function/settings/SaveConfig.java diff --git a/tim/prune/function/settings/SetAltitudeTolerance.java b/src/tim/prune/function/settings/SetAltitudeTolerance.java similarity index 100% rename from tim/prune/function/settings/SetAltitudeTolerance.java rename to src/tim/prune/function/settings/SetAltitudeTolerance.java diff --git a/tim/prune/function/settings/SetColours.java b/src/tim/prune/function/settings/SetColours.java similarity index 100% rename from tim/prune/function/settings/SetColours.java rename to src/tim/prune/function/settings/SetColours.java diff --git a/tim/prune/function/settings/SetDisplaySettings.java b/src/tim/prune/function/settings/SetDisplaySettings.java similarity index 100% rename from tim/prune/function/settings/SetDisplaySettings.java rename to src/tim/prune/function/settings/SetDisplaySettings.java diff --git a/src/tim/prune/function/settings/SetEarthdataAuthentication.java b/src/tim/prune/function/settings/SetEarthdataAuthentication.java new file mode 100644 index 0000000..d4a166a --- /dev/null +++ b/src/tim/prune/function/settings/SetEarthdataAuthentication.java @@ -0,0 +1,183 @@ +package tim.prune.function.settings; + +import java.awt.Component; +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Base64; + +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JTextField; + +import tim.prune.App; +import tim.prune.GenericFunction; +import tim.prune.I18nManager; +import tim.prune.config.Config; +import tim.prune.function.srtm.SrtmGl1Source; +import tim.prune.function.srtm.SrtmSourceException; + +/** + * Set authentication data for the NASA Earthdata systems + */ +public class SetEarthdataAuthentication extends GenericFunction +{ + private JDialog _dialog = null; + private JTextField _usernameField = null; + private JPasswordField _passwordField = null; + private JLabel _authAccepted = null; + + /** + * Constructor + * @param inApp App object + */ + public SetEarthdataAuthentication(App inApp) { + super(inApp); + } + + /** @return name key */ + public String getNameKey() { + return "function.setearthdataauthentication"; + } + + public void begin() + { + if (_dialog == null) + { + _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()), true); + _dialog.setLocationRelativeTo(_parentFrame); + // Create Gui and show it + _dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + _dialog.getContentPane().add(makeDialogComponents()); + _dialog.pack(); + } + prefillCurrentAuth(); + _dialog.setVisible(true); + } + + /** + * Make the dialog components + * @return the GUI components for the dialog + */ + private JPanel makeDialogComponents() + { + // Blurb to explain to the user + JPanel dialogPanel = new JPanel(); + dialogPanel.setLayout(new BorderLayout()); + dialogPanel.add(new JLabel(""+I18nManager.getText("dialog.earthdataauth.intro")+""), BorderLayout.NORTH); + + // username and password fields + JPanel mainPanel = new JPanel(); + mainPanel.setLayout(new BorderLayout()); + JPanel usernamePasswordPanel = new JPanel(); + usernamePasswordPanel.setLayout(new GridLayout(2, 2)); + + JLabel usernameLabel = new JLabel(I18nManager.getText("dialog.earthdataauth.user")); + usernamePasswordPanel.add(usernameLabel); + _usernameField = new JTextField(""); + usernamePasswordPanel.add(_usernameField); + + JLabel passwordLabel = new JLabel(I18nManager.getText("dialog.earthdataauth.password")); + usernamePasswordPanel.add(passwordLabel); + _passwordField = new JPasswordField(""); + usernamePasswordPanel.add(_passwordField); + mainPanel.add(usernamePasswordPanel, BorderLayout.CENTER); + + JPanel authStatusPanel = new JPanel(); + authStatusPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); + _authAccepted = new JLabel(" "); + authStatusPanel.add(_authAccepted); + mainPanel.add(authStatusPanel, BorderLayout.SOUTH); + + mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 15)); + dialogPanel.add(mainPanel, BorderLayout.CENTER); + + // ok / cancel buttons at bottom + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); + JButton checkButton = new JButton(I18nManager.getText("button.check")); + checkButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + testUsernameAndPassword(); + } + }); + buttonPanel.add(checkButton); + JButton okButton = new JButton(I18nManager.getText("button.ok")); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + finish(); + } + }); + buttonPanel.add(okButton); + JButton cancelButton = new JButton(I18nManager.getText("button.cancel")); + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + _dialog.dispose(); + } + }); + buttonPanel.add(cancelButton); + dialogPanel.add(buttonPanel, BorderLayout.SOUTH); + dialogPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 15)); + return dialogPanel; + } + + private String getNewAuthString() + { + String username = _usernameField.getText(); + String password = _passwordField.getText(); + return Base64.getEncoder().encodeToString((username + ":" + password).getBytes()); + } + + private void finish() + { + Config.setConfigString(Config.KEY_EARTHDATA_AUTH, getNewAuthString()); + _dialog.dispose(); + } + + private void prefillCurrentAuth() + { + String authString = Config.getConfigString(Config.KEY_EARTHDATA_AUTH); + if (authString == null) + { + _usernameField.setText(""); + _passwordField.setText(""); + } + String decoded = new String(Base64.getDecoder().decode(authString)); + if (decoded.contains(":")) + { + _usernameField.setText(decoded.split(":", 2)[0]); + _passwordField.setText(decoded.split(":", 2)[1]); + } + else + { + _usernameField.setText(""); + _passwordField.setText(""); + } + + _authAccepted.setText(" "); + } + + private void testUsernameAndPassword() + { + String username = _usernameField.getText(); + String password = _passwordField.getText(); + SrtmGl1Source srtmGL1 = new SrtmGl1Source(); + try + { + _authAccepted.setText("..."); + srtmGL1.testAuth(getNewAuthString()); + _authAccepted.setText(I18nManager.getText("dialog.earthdataauth.authaccepted")); + } + catch (SrtmSourceException e) + { + _authAccepted.setText(I18nManager.getText("dialog.earthdataauth.authrejected") + ": " + e.getMessage()); + } + } +} diff --git a/tim/prune/function/settings/SetLanguage.java b/src/tim/prune/function/settings/SetLanguage.java similarity index 100% rename from tim/prune/function/settings/SetLanguage.java rename to src/tim/prune/function/settings/SetLanguage.java diff --git a/tim/prune/function/settings/SetMapBgFunction.java b/src/tim/prune/function/settings/SetMapBgFunction.java similarity index 100% rename from tim/prune/function/settings/SetMapBgFunction.java rename to src/tim/prune/function/settings/SetMapBgFunction.java diff --git a/tim/prune/function/settings/SetPathsFunction.java b/src/tim/prune/function/settings/SetPathsFunction.java similarity index 100% rename from tim/prune/function/settings/SetPathsFunction.java rename to src/tim/prune/function/settings/SetPathsFunction.java diff --git a/tim/prune/function/sew/CandidateSorter.java b/src/tim/prune/function/sew/CandidateSorter.java similarity index 100% rename from tim/prune/function/sew/CandidateSorter.java rename to src/tim/prune/function/sew/CandidateSorter.java diff --git a/tim/prune/function/sew/SegmentEnd.java b/src/tim/prune/function/sew/SegmentEnd.java similarity index 100% rename from tim/prune/function/sew/SegmentEnd.java rename to src/tim/prune/function/sew/SegmentEnd.java diff --git a/tim/prune/function/sew/SewTrackSegmentsFunction.java b/src/tim/prune/function/sew/SewTrackSegmentsFunction.java similarity index 100% rename from tim/prune/function/sew/SewTrackSegmentsFunction.java rename to src/tim/prune/function/sew/SewTrackSegmentsFunction.java diff --git a/tim/prune/function/sew/SplitPoint.java b/src/tim/prune/function/sew/SplitPoint.java similarity index 100% rename from tim/prune/function/sew/SplitPoint.java rename to src/tim/prune/function/sew/SplitPoint.java diff --git a/tim/prune/function/sew/SplitSegmentsFunction.java b/src/tim/prune/function/sew/SplitSegmentsFunction.java similarity index 100% rename from tim/prune/function/sew/SplitSegmentsFunction.java rename to src/tim/prune/function/sew/SplitSegmentsFunction.java diff --git a/tim/prune/function/srtm/DownloadSrtmFunction.java b/src/tim/prune/function/srtm/DownloadSrtmFunction.java similarity index 53% rename from tim/prune/function/srtm/DownloadSrtmFunction.java rename to src/tim/prune/function/srtm/DownloadSrtmFunction.java index 0350ce3..311ff92 100644 --- a/tim/prune/function/srtm/DownloadSrtmFunction.java +++ b/src/tim/prune/function/srtm/DownloadSrtmFunction.java @@ -1,11 +1,5 @@ package tim.prune.function.srtm; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; import java.util.ArrayList; import javax.swing.JOptionPane; @@ -14,7 +8,6 @@ import tim.prune.App; import tim.prune.GenericFunction; import tim.prune.GpsPrune; import tim.prune.I18nManager; -import tim.prune.config.Config; import tim.prune.data.DoubleRange; import tim.prune.gui.ProgressDialog; @@ -28,19 +21,20 @@ public class DownloadSrtmFunction extends GenericFunction implements Runnable private ProgressDialog _progress = null; /** Flag to check whether this function is currently running or not */ private boolean _running = false; - + private SrtmSource _srtmSource = null; /** * Constructor * @param inApp App object */ - public DownloadSrtmFunction(App inApp) { + public DownloadSrtmFunction(App inApp, SrtmSource inSrtmSource) { super(inApp); + _srtmSource = inSrtmSource; } /** @return name key */ public String getNameKey() { - return "function.downloadsrtm"; + return "function.downloadsrtm."+_srtmSource.getName(); } /** @@ -48,6 +42,17 @@ public class DownloadSrtmFunction extends GenericFunction implements Runnable */ public void begin() { + if (! SrtmDiskCache.ensureCacheIsUsable()) + { + _app.showErrorMessage(getNameKey(), "error.downloadsrtm.nocache"); + return; + } + if (! _srtmSource.isReadyToUse()) + { + _app.showErrorMessage(getNameKey(), getNameKey() + ".needsetup"); + return; + } + _running = true; if (_progress == null) { _progress = new ProgressDialog(_parentFrame, getNameKey()); @@ -61,6 +66,14 @@ public class DownloadSrtmFunction extends GenericFunction implements Runnable * Run method using separate thread */ public void run() + { + ArrayList tileList = buildCoveringTiles(); + downloadTiles(tileList); + // Finished + _running = false; + } + + private ArrayList buildCoveringTiles() { // Compile list of tiles to get ArrayList tileList = new ArrayList(); @@ -89,18 +102,16 @@ public class DownloadSrtmFunction extends GenericFunction implements Runnable } } - downloadTiles(tileList); - // Finished - _running = false; + return tileList; } - /** * Download the tiles of SRTM data * @param inTileList list of tiles to get */ private void downloadTiles(ArrayList inTileList) { + String errorMessage = ""; // Update progress bar if (_progress != null) { @@ -108,62 +119,29 @@ public class DownloadSrtmFunction extends GenericFunction implements Runnable _progress.setValue(0); } - String errorMessage = null; - - // Check the cache is ok - final String diskCachePath = Config.getConfigString(Config.KEY_DISK_CACHE); - if (diskCachePath != null) - { - File srtmDir = new File(diskCachePath, "srtm"); - if (!srtmDir.exists() && !srtmDir.mkdir()) { - // can't create the srtm directory - errorMessage = I18nManager.getText("error.downloadsrtm.nocache"); - } - } - else { - // no cache set up - errorMessage = I18nManager.getText("error.downloadsrtm.nocache"); - } - - // Get urls for each tile - URL[] urls = TileFinder.getUrls(inTileList); int numDownloaded = 0; for (int t=0; t 0) { - _app.showErrorMessage(getNameKey(), "confirm.downloadsrtm.none"); + JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("confirm.downloadsrtm.none")); } } - - /** - * See whether the SRTM file is already available locally - * @param inUrl URL for online resource - * @return file object to write to, or null if already there - */ - private static File getFileToWrite(URL inUrl) - { - String diskCachePath = Config.getConfigString(Config.KEY_DISK_CACHE); - if (diskCachePath != null) - { - File srtmDir = new File(diskCachePath, "srtm"); - if (srtmDir.exists() && srtmDir.isDirectory() && srtmDir.canRead()) - { - File srtmFile = new File(srtmDir, new File(inUrl.getFile()).getName()); - if (!srtmFile.exists() || !srtmFile.canRead() || srtmFile.length() <= 400) { - return srtmFile; - } - } - } - return null; - } - - /** - * @return true if a thread is currently running - */ - public boolean isRunning() - { - return _running; - } } diff --git a/tim/prune/function/srtm/LookupSrtmFunction.java b/src/tim/prune/function/srtm/LookupSrtmFunction.java similarity index 58% rename from tim/prune/function/srtm/LookupSrtmFunction.java rename to src/tim/prune/function/srtm/LookupSrtmFunction.java index 1599744..927d2cd 100644 --- a/tim/prune/function/srtm/LookupSrtmFunction.java +++ b/src/tim/prune/function/srtm/LookupSrtmFunction.java @@ -1,12 +1,6 @@ package tim.prune.function.srtm; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; import java.util.ArrayList; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; import javax.swing.JOptionPane; @@ -15,14 +9,12 @@ import tim.prune.DataSubscriber; import tim.prune.GenericFunction; import tim.prune.I18nManager; import tim.prune.UpdateMessageBroker; -import tim.prune.config.Config; import tim.prune.data.Altitude; import tim.prune.data.DataPoint; import tim.prune.data.Field; import tim.prune.data.Track; import tim.prune.data.UnitSetLibrary; import tim.prune.gui.ProgressDialog; -import tim.prune.tips.TipManager; import tim.prune.undo.UndoLookupSrtm; /** @@ -38,13 +30,9 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable private Track _track = null; /** Flag for whether this is a real track or a terrain one */ private boolean _normalTrack = true; - /** Flag set when any tiles had to be downloaded (rather than just loaded locally) */ - private boolean _hadToDownload = false; /** Flag to check whether this function is currently running or not */ private boolean _running = false; - /** Expected size of hgt file in bytes */ - private static final long HGT_SIZE = 2884802L; /** Altitude below which is considered void */ private static final int VOID_VAL = -32768; @@ -84,7 +72,10 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable private void begin(Track inTrack, boolean inNormalTrack) { _running = true; - _hadToDownload = false; + if (! SrtmDiskCache.ensureCacheIsUsable()) + { + _app.showErrorMessage(getNameKey(), "error.cache.notthere"); + } if (_progress == null) { _progress = new ProgressDialog(_parentFrame, getNameKey()); } @@ -131,8 +122,7 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable for (int i = 0; i < _track.getNumPoints(); i++) { // Consider points which don't have altitudes or have zero values - if (!_track.getPoint(i).hasAltitude() - || (overwriteZeros && _track.getPoint(i).getAltitude().getValue() == 0)) + if (needsAltitude(_track.getPoint(i), overwriteZeros)) { SrtmTile tile = new SrtmTile(_track.getPoint(i)); boolean alreadyGot = false; @@ -148,12 +138,23 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable lookupValues(tileList, overwriteZeros); // Finished _running = false; - // Show tip if lots of online lookups were necessary - if (_hadToDownload) { - _app.showTip(TipManager.Tip_DownloadSrtm); - } } + /** + * true if we need to set the altitude of this point + */ + private boolean needsAltitude(DataPoint point, boolean overwriteZeros) + { + if (!point.hasAltitude()) + { + return true; + } + if (overwriteZeros && point.getAltitude().getValue() == 0) + { + return true; + } + return false; + } /** * Lookup the values from SRTM data @@ -170,94 +171,79 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable _progress.setMaximum(inTileList.size()); _progress.setValue(0); } - String errorMessage = null; - // Get urls for each tile - URL[] urls = TileFinder.getUrls(inTileList); + String errorMessage = ""; for (int t=0; t 0) System.out.println(numVoids + " voids found"); + double altitude = 0.0; + switch (numVoids) { - heights[i] = inStream.read() * 256 + inStream.read(); - if (heights[i] >= 32768) {heights[i] -= 65536;} + case 0: altitude = bilinearInterpolate(fouralts, x, y); break; + case 1: altitude = bilinearInterpolate(fixVoid(fouralts), x, y); break; + case 2: + case 3: altitude = averageNonVoid(fouralts); break; + default: altitude = VOID_VAL; } - } - // else { - // System.out.println("length not ok: " + entry.getSize()); - // } - // Close stream from url - inStream.close(); - } - - if (entryOk) - { - // Loop over all points in track, try to apply altitude from array - for (int p = 0; p < _track.getNumPoints(); p++) - { - DataPoint point = _track.getPoint(p); - if (!point.hasAltitude() - || (inOverwriteZeros && point.getAltitude().getValue() == 0)) + // Special case for terrain tracks, don't interpolate voids yet + if (!_normalTrack && numVoids > 0) { + altitude = VOID_VAL; + } + if (altitude != VOID_VAL) { - if (new SrtmTile(point).equals(tile)) - { - double x = (point.getLongitude().getDouble() - tile.getLongitude()) * 1200; - double y = 1201 - (point.getLatitude().getDouble() - tile.getLatitude()) * 1200; - int idx1 = ((int)y)*1201 + (int)x; - try - { - int[] fouralts = {heights[idx1], heights[idx1+1], heights[idx1-1201], heights[idx1-1200]}; - int numVoids = (fouralts[0]==VOID_VAL?1:0) + (fouralts[1]==VOID_VAL?1:0) - + (fouralts[2]==VOID_VAL?1:0) + (fouralts[3]==VOID_VAL?1:0); - // if (numVoids > 0) System.out.println(numVoids + " voids found"); - double altitude = 0.0; - switch (numVoids) - { - case 0: altitude = bilinearInterpolate(fouralts, x, y); break; - case 1: altitude = bilinearInterpolate(fixVoid(fouralts), x, y); break; - case 2: - case 3: altitude = averageNonVoid(fouralts); break; - default: altitude = VOID_VAL; - } - // Special case for terrain tracks, don't interpolate voids yet - if (!_normalTrack && numVoids > 0) { - altitude = VOID_VAL; - } - if (altitude != VOID_VAL) - { - point.setFieldValue(Field.ALTITUDE, ""+altitude, false); - // depending on settings, this value may have been added as feet, we need to force metres - point.getAltitude().reset(new Altitude((int)altitude, UnitSetLibrary.UNITS_METRES)); - numAltitudesFound++; - } - } - catch (ArrayIndexOutOfBoundsException obe) { - // System.err.println("lat=" + point.getLatitude().getDouble() + ", x=" + x + ", y=" + y + ", idx=" + idx1); - } - } + point.setFieldValue(Field.ALTITUDE, ""+altitude, false); + // depending on settings, this value may have been added as feet, we need to force metres + point.getAltitude().reset(new Altitude((int)altitude, UnitSetLibrary.UNITS_METRES)); + numAltitudesFound++; } } + catch (ArrayIndexOutOfBoundsException obe) { + errorMessage += "Point not in tile? lat=" + point.getLatitude().getDouble() + ", x=" + x + ", y=" + y + ", idx=" + idx1+"\n"; + } } } - catch (IOException ioe) {errorMessage = ioe.getClass().getName() + " - " + ioe.getMessage(); - } } } @@ -266,6 +252,10 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable return; } + if (! errorMessage.equals("")) { + _app.showErrorMessageNoLookup(getNameKey(), errorMessage); + return; + } if (numAltitudesFound > 0) { // Inform app including undo information @@ -278,9 +268,6 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable I18nManager.getTextWithNumber("confirm.lookupsrtm", numAltitudesFound)); } } - else if (errorMessage != null) { - _app.showErrorMessageNoLookup(getNameKey(), errorMessage); - } else if (inTileList.size() > 0) { _app.showErrorMessage(getNameKey(), "error.lookupsrtm.nonefound"); } @@ -289,36 +276,6 @@ public class LookupSrtmFunction extends GenericFunction implements Runnable } } - /** - * See whether the SRTM file is already available locally first, then try online - * @param inUrl URL for online resource - * @return ZipInputStream either on the local file or on the downloaded zip file - */ - private ZipInputStream getStreamToHgtFile(URL inUrl) - throws IOException - { - String diskCachePath = Config.getConfigString(Config.KEY_DISK_CACHE); - if (diskCachePath != null) - { - File srtmDir = new File(diskCachePath, "srtm"); - if (srtmDir.exists() && srtmDir.isDirectory() && srtmDir.canRead()) - { - File srtmFile = new File(srtmDir, new File(inUrl.getFile()).getName()); - if (srtmFile.exists() && srtmFile.isFile() && srtmFile.canRead() - && srtmFile.length() > 400) - { - // System.out.println("Lookup: Using file " + srtmFile.getAbsolutePath()); - // File found, use this one - return new ZipInputStream(new FileInputStream(srtmFile)); - } - } - } - // System.out.println("Lookup: Trying online: " + inUrl.toString()); - _hadToDownload = true; - // MAYBE: Only download if we're in online mode? - return new ZipInputStream(inUrl.openStream()); - } - /** * Perform a bilinear interpolation on the given altitude array * @param inAltitudes array of four altitude values on corners of square (bl, br, tl, tr) diff --git a/src/tim/prune/function/srtm/Srtm3Source.java b/src/tim/prune/function/srtm/Srtm3Source.java new file mode 100644 index 0000000..14fad59 --- /dev/null +++ b/src/tim/prune/function/srtm/Srtm3Source.java @@ -0,0 +1,164 @@ +package tim.prune.function.srtm; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.HttpURLConnection; + +import tim.prune.GpsPrune; +import tim.prune.I18nManager; + +public class Srtm3Source extends SrtmSource { + /** URL prefix for all tiles */ + private static final String URL_PREFIX = "https://dds.cr.usgs.gov/srtm/version2_1/SRTM3/"; + /** Directory names for each continent */ + private static final String[] CONTINENTS = {"", "Eurasia", "North_America", "Australia", + "Islands", "South_America", "Africa"}; + private byte[] _continents_lookup; + + + public Srtm3Source() + { + _continents_lookup = populateContinents(); + } + + public String getNameKey() + { + return "function.downloadsrtm." + getName(); + } + + public String getName() + { + return "SRTM3_v21"; + } + + protected String getSourceExtension() + { + return ".hgt.zip"; + } + + /** + * Read the dat file and get the contents + * @return byte array containing file contents + */ + private static byte[] populateContinents() + { + InputStream in = null; + try + { + // Need absolute path to dat file + in = Srtm3Source.class.getResourceAsStream("/tim/prune/function/srtm/srtmtiles.dat"); + if (in != null) + { + byte[] buffer = new byte[in.available()]; + in.read(buffer); + in.close(); + return buffer; + } + } + catch (java.io.IOException e) { + System.err.println("Exception trying to read srtmtiles.dat : " + e.getMessage()); + } + finally + { + try { + in.close(); + } + catch (Exception e) {} // ignore + } + return null; + } + + /** + * Get the Url for the given tile + * @param inTile Tile to get + * @return URL + */ + private URL buildUrl(SrtmTile inTile) + throws SrtmSourceException + { + + // Get byte from lookup array + int idx = (inTile.getLatitude() + 59)*360 + (inTile.getLongitude() + 180); + int dir; + try + { + dir = _continents_lookup[idx]; + } + catch (ArrayIndexOutOfBoundsException e) + { + throw new SrtmSourceException("Could not find continent for tile "+inTile.getTileName()); + } + try + { + return new URL(URL_PREFIX + CONTINENTS[dir] + "/" + inTile.getTileName() + getSourceExtension()); + } + catch (MalformedURLException e) + { + throw new SrtmSourceException("Could not build URL for tile "+inTile.getTileName()); + } + } + + public boolean isReadyToUse() + { + return true; + } + + public boolean downloadTile(SrtmTile inTile) + throws SrtmSourceException + { + int redirects = 5; + URL tileUrl = buildUrl(inTile); + File outputFile = getCacheFileName(inTile); + System.out.println("Download: Need to download: " + tileUrl); + + try + { + HttpURLConnection conn = (HttpURLConnection) tileUrl.openConnection(); + + // Define streams + FileOutputStream outStream = null; + InputStream inStream = null; + + conn.setRequestProperty("User-Agent", "GpsPrune v" + GpsPrune.VERSION_NUMBER); + + int status = conn.getResponseCode(); + if (status == 200) + { + inStream = conn.getInputStream(); + } + else if (status == 404) + { + throw new SrtmSourceException("Tile not found: "+conn.getURL()); + } + else + { + throw new SrtmSourceException("Invalid response from server: " +status+conn.getContent()); + } + + outStream = new FileOutputStream(outputFile); + + int c; + while ((c = inStream.read()) != -1) + { + outStream.write(c); + } + // Make sure streams are closed + try {inStream.close();} catch (Exception e) {} + try {outStream.close();} catch (Exception e) {} + return true; + } + catch (IOException e) + { + throw new SrtmSourceException("Error while downloading tile "+inTile.getTileName()+": "+e.getMessage()); + } + } + + public int getRowSize(SrtmTile inTile) + { + return 1201; + } +} diff --git a/src/tim/prune/function/srtm/SrtmDiskCache.java b/src/tim/prune/function/srtm/SrtmDiskCache.java new file mode 100644 index 0000000..80159e0 --- /dev/null +++ b/src/tim/prune/function/srtm/SrtmDiskCache.java @@ -0,0 +1,49 @@ +package tim.prune.function.srtm; + +import java.io.File; + +import tim.prune.config.Config; +import tim.prune.I18nManager; + +public class SrtmDiskCache { + + private static boolean _cacheIsUsable = false; + private static File _cacheDir = null; + + public static boolean ensureCacheIsUsable() + { + + if (_cacheIsUsable) + { + return true; + } + // Check the cache is ok + String diskCachePath = Config.getConfigString(Config.KEY_DISK_CACHE); + if (diskCachePath == null) + { + return false; + } + File srtmDir = new File(diskCachePath, "srtm"); + if (!srtmDir.exists() && !srtmDir.mkdir()) { + // can't create the srtm directory + return false; + } + _cacheIsUsable = true; + _cacheDir = srtmDir; + return true; + } + + public static File getCacheDir(String inSourceName) + { + if (_cacheDir == null) + { + ensureCacheIsUsable(); + } + File cacheDir = new File(_cacheDir, inSourceName); + if (!cacheDir.exists() && !cacheDir.mkdir()) { + // can't create the srtm directory + return null; + } + return cacheDir; + } +} diff --git a/src/tim/prune/function/srtm/SrtmGl1Source.java b/src/tim/prune/function/srtm/SrtmGl1Source.java new file mode 100644 index 0000000..51e6d77 --- /dev/null +++ b/src/tim/prune/function/srtm/SrtmGl1Source.java @@ -0,0 +1,176 @@ +package tim.prune.function.srtm; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.CookieHandler; +import java.net.CookieManager; +import java.net.CookiePolicy; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.HttpURLConnection; + +import tim.prune.App; +import tim.prune.GpsPrune; +import tim.prune.config.Config; + +/** + * Create an account at: https://urs.earthdata.nasa.gov/users/new + * Data policy: https://lpdaac.usgs.gov/data/data-citation-and-policies/ + * + */ + +public class SrtmGl1Source extends SrtmSource { + /** URL prefix for all tiles */ + private static final String URL_PREFIX = "https://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL1.003/2000.02.11/"; + /** Auth URL */ + private static final String AUTH_URL = "urs.earthdata.nasa.gov"; + + + public SrtmGl1Source() + { + CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); + } + + public String getName() + { + return "SRTMGL1_v003"; + } + + protected String getSourceExtension() + { + return ".SRTMGL1.hgt.zip"; + } + + private URL buildUrl(SrtmTile inTile) + throws SrtmSourceException + { + try { + return new URL(URL_PREFIX + inTile.getTileName() + getSourceExtension()); + } + catch (MalformedURLException e) + { + throw new SrtmSourceException(e.getMessage()); + } + } + + public boolean isReadyToUse() + { + return getAuth() != null; + } + + private String getAuth() + { + String authString = Config.getConfigString(Config.KEY_EARTHDATA_AUTH); + if (authString != null) + { + return "Basic " + authString; + } + else + { + return null; + } + } + + public boolean downloadTile(SrtmTile inTile) + throws SrtmSourceException + { + return downloadTile(inTile, getAuth()); + } + + private boolean downloadTile(SrtmTile inTile, String auth) + throws SrtmSourceException + { + URL tileUrl = buildUrl(inTile); + File outputFile = getCacheFileName(inTile); + System.out.println("Download: Need to download: " + tileUrl); + try + { + HttpURLConnection conn = (HttpURLConnection) tileUrl.openConnection(); + long fileLength = 0L; + + // Define streams + FileOutputStream outStream = null; + InputStream inStream = null; + + // Documentation about HTTP interface at: + // https://wiki.earthdata.nasa.gov/display/EL/How+To+Access+Data+With+Java + int redirects = 0; + + while (redirects < 10) { + redirects++; + + conn.setRequestProperty("User-Agent", "GpsPrune v" + GpsPrune.VERSION_NUMBER); + conn.setInstanceFollowRedirects(false); + conn.setUseCaches(false); + if (conn.getURL().getHost().equals(AUTH_URL)) + { + conn.setRequestProperty("Authorization", auth); + } + + int status = conn.getResponseCode(); + if (status == 200) + { + // Found the tile, we're good + inStream = conn.getInputStream(); + fileLength = conn.getContentLengthLong(); + break; + } + else if (status == 302) + { + // redirected to SSO server then back to original resource + String newUrl = conn.getHeaderField("Location"); + conn = (HttpURLConnection) (new URL(newUrl)).openConnection(); + } + else if (status == 404) + { + throw new SrtmSourceException("Tile " + inTile.getTileName() + " not found at " + conn.getURL()); + } + else + { + throw new SrtmSourceException("Invalid response from server: " + status + conn.getResponseMessage()); + } + } + + // _progress.setValue(t * 10 + 1); + outStream = new FileOutputStream(outputFile); + + // Copy all the bytes to the file + int c; + long written = 0L; + while ((c = inStream.read()) != -1) + { + outStream.write(c); + written++; + // _progress.setValue(t * 10 + 1 + (int) ((10 * written) / fileLength)); + } + // Make sure streams are closed + try {inStream.close();} catch (Exception e) {} + try {outStream.close();} catch (Exception e) {} + return true; + } + catch (IOException e) + { + throw new SrtmSourceException("Error while downloading tile " + inTile.getTileName() + ": "+e.getMessage()); + } + } + + public boolean testAuth(String auth) + throws SrtmSourceException + { + // The only thing special about this tile is that it's the smallest tile + // It covers small islands in Malaysia + SrtmTile testTile = new SrtmTile(7, 117); + if (isCached(testTile)) + { + getCacheFileName(testTile).delete(); + } + return downloadTile(testTile, auth); + } + + public int getRowSize(SrtmTile inTile) + { + return 3601; + } +} diff --git a/src/tim/prune/function/srtm/SrtmSource.java b/src/tim/prune/function/srtm/SrtmSource.java new file mode 100644 index 0000000..5651a3f --- /dev/null +++ b/src/tim/prune/function/srtm/SrtmSource.java @@ -0,0 +1,69 @@ +package tim.prune.function.srtm; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +public abstract class SrtmSource { + public abstract String getName(); + public abstract boolean isReadyToUse(); + public abstract boolean downloadTile(SrtmTile inTile) + throws SrtmSourceException; + public abstract int getRowSize(SrtmTile inTile); + protected abstract String getSourceExtension(); + + public int[] getTileHeights(SrtmTile inTile) + throws SrtmSourceException + { + File cacheFileName = getCacheFileName(inTile); + if (cacheFileName == null) + { + throw new SrtmSourceException("Tile "+inTile.getTileName()+" not in cache"); + } + try + { + ZipInputStream inStream = new ZipInputStream(new FileInputStream(cacheFileName)); + ZipEntry entry = inStream.getNextEntry(); + int rowSize = getRowSize(inTile); + int tileSize = rowSize * rowSize; + if (entry.getSize() != 2 * tileSize) + { + throw new SrtmSourceException("Tile file "+cacheFileName+" does not have the expected size"); + } + int[] heights = new int[tileSize]; + // Read entire file contents into one byte array + for (int i = 0; i < heights.length; i++) + { + heights[i] = inStream.read() * 256 + inStream.read(); + if (heights[i] >= 32768) {heights[i] -= 65536;} + } + // Close stream + inStream.close(); + return heights; + } + catch (IOException e) + { + throw new SrtmSourceException("Failure opening "+cacheFileName+" for reading:"+e.getMessage()); + } + + } + + protected File getCacheDir() + { + return SrtmDiskCache.getCacheDir(getName()); + } + + protected File getCacheFileName(SrtmTile inTile) + { + String fileName = inTile.getTileName() + getSourceExtension(); + return new File(getCacheDir(), fileName); + } + + public boolean isCached(SrtmTile inTile) + { + return getCacheFileName(inTile).exists(); + } +} diff --git a/src/tim/prune/function/srtm/SrtmSourceException.java b/src/tim/prune/function/srtm/SrtmSourceException.java new file mode 100644 index 0000000..37b2db5 --- /dev/null +++ b/src/tim/prune/function/srtm/SrtmSourceException.java @@ -0,0 +1,7 @@ +package tim.prune.function.srtm; + +public class SrtmSourceException extends Exception { + public SrtmSourceException(String message) { + super(message); + } +} diff --git a/tim/prune/function/srtm/SrtmTile.java b/src/tim/prune/function/srtm/SrtmTile.java similarity index 85% rename from tim/prune/function/srtm/SrtmTile.java rename to src/tim/prune/function/srtm/SrtmTile.java index 301bbaf..7bc1d38 100644 --- a/tim/prune/function/srtm/SrtmTile.java +++ b/src/tim/prune/function/srtm/SrtmTile.java @@ -67,7 +67,20 @@ public class SrtmTile + (_longitude >= 0?"E":"W") + (Math.abs(_longitude) < 100?"0":"") + (Math.abs(_longitude) < 10?"0":"") - + Math.abs(_longitude) - + ".hgt.zip"; + + Math.abs(_longitude); + } + + public SrtmSource findBestCachedSource() + { + SrtmSource[] sources = {new SrtmGl1Source(), + new Srtm3Source() }; + for (int i = 0; i < sources.length; i++) + { + if (sources[i].isCached(this)) + { + return sources[i]; + } + } + return null; } } diff --git a/tim/prune/function/srtm/srtmtiles.dat b/src/tim/prune/function/srtm/srtmtiles.dat similarity index 100% rename from tim/prune/function/srtm/srtmtiles.dat rename to src/tim/prune/function/srtm/srtmtiles.dat diff --git a/tim/prune/function/weather/GetWeatherForecastFunction.java b/src/tim/prune/function/weather/GetWeatherForecastFunction.java similarity index 100% rename from tim/prune/function/weather/GetWeatherForecastFunction.java rename to src/tim/prune/function/weather/GetWeatherForecastFunction.java diff --git a/tim/prune/function/weather/IconRenderer.java b/src/tim/prune/function/weather/IconRenderer.java similarity index 100% rename from tim/prune/function/weather/IconRenderer.java rename to src/tim/prune/function/weather/IconRenderer.java diff --git a/tim/prune/function/weather/OWMCurrentHandler.java b/src/tim/prune/function/weather/OWMCurrentHandler.java similarity index 100% rename from tim/prune/function/weather/OWMCurrentHandler.java rename to src/tim/prune/function/weather/OWMCurrentHandler.java diff --git a/tim/prune/function/weather/OWMForecastHandler.java b/src/tim/prune/function/weather/OWMForecastHandler.java similarity index 100% rename from tim/prune/function/weather/OWMForecastHandler.java rename to src/tim/prune/function/weather/OWMForecastHandler.java diff --git a/tim/prune/function/weather/ResultSet.java b/src/tim/prune/function/weather/ResultSet.java similarity index 100% rename from tim/prune/function/weather/ResultSet.java rename to src/tim/prune/function/weather/ResultSet.java diff --git a/tim/prune/function/weather/SingleForecast.java b/src/tim/prune/function/weather/SingleForecast.java similarity index 100% rename from tim/prune/function/weather/SingleForecast.java rename to src/tim/prune/function/weather/SingleForecast.java diff --git a/tim/prune/function/weather/WeatherResults.java b/src/tim/prune/function/weather/WeatherResults.java similarity index 100% rename from tim/prune/function/weather/WeatherResults.java rename to src/tim/prune/function/weather/WeatherResults.java diff --git a/tim/prune/function/weather/WeatherTableModel.java b/src/tim/prune/function/weather/WeatherTableModel.java similarity index 100% rename from tim/prune/function/weather/WeatherTableModel.java rename to src/tim/prune/function/weather/WeatherTableModel.java diff --git a/tim/prune/gui/AudioListener.java b/src/tim/prune/gui/AudioListener.java similarity index 100% rename from tim/prune/gui/AudioListener.java rename to src/tim/prune/gui/AudioListener.java diff --git a/tim/prune/gui/BaseImageDefinitionPanel.java b/src/tim/prune/gui/BaseImageDefinitionPanel.java similarity index 100% rename from tim/prune/gui/BaseImageDefinitionPanel.java rename to src/tim/prune/gui/BaseImageDefinitionPanel.java diff --git a/tim/prune/gui/CombinedListAndModel.java b/src/tim/prune/gui/CombinedListAndModel.java similarity index 100% rename from tim/prune/gui/CombinedListAndModel.java rename to src/tim/prune/gui/CombinedListAndModel.java diff --git a/tim/prune/gui/DecimalNumberField.java b/src/tim/prune/gui/DecimalNumberField.java similarity index 100% rename from tim/prune/gui/DecimalNumberField.java rename to src/tim/prune/gui/DecimalNumberField.java diff --git a/tim/prune/gui/DetailsDisplay.java b/src/tim/prune/gui/DetailsDisplay.java similarity index 100% rename from tim/prune/gui/DetailsDisplay.java rename to src/tim/prune/gui/DetailsDisplay.java diff --git a/tim/prune/gui/DialogCloser.java b/src/tim/prune/gui/DialogCloser.java similarity index 100% rename from tim/prune/gui/DialogCloser.java rename to src/tim/prune/gui/DialogCloser.java diff --git a/tim/prune/gui/DisplayUtils.java b/src/tim/prune/gui/DisplayUtils.java similarity index 96% rename from tim/prune/gui/DisplayUtils.java rename to src/tim/prune/gui/DisplayUtils.java index 25640d8..2300296 100644 --- a/tim/prune/gui/DisplayUtils.java +++ b/src/tim/prune/gui/DisplayUtils.java @@ -36,7 +36,8 @@ public abstract class DisplayUtils if (inNumSecs < 86400L) return "" + (inNumSecs / 60 / 60) + I18nManager.getText("display.range.time.hours") + " " + ((inNumSecs / 60) % 60) + I18nManager.getText("display.range.time.mins"); if (inNumSecs < 432000L) return "" + (inNumSecs / 86400L) + I18nManager.getText("display.range.time.days") - + " " + (inNumSecs / 60 / 60) % 24 + I18nManager.getText("display.range.time.hours"); + + " " + (inNumSecs / 60 / 60) % 24 + I18nManager.getText("display.range.time.hours") + + " " + ((inNumSecs / 60) % 60) + I18nManager.getText("display.range.time.mins"); if (inNumSecs < 86400000L) return "" + (inNumSecs / 86400L) + I18nManager.getText("display.range.time.days"); return "big"; } diff --git a/tim/prune/gui/FunctionLauncher.java b/src/tim/prune/gui/FunctionLauncher.java similarity index 100% rename from tim/prune/gui/FunctionLauncher.java rename to src/tim/prune/gui/FunctionLauncher.java diff --git a/tim/prune/gui/GenericDisplay.java b/src/tim/prune/gui/GenericDisplay.java similarity index 100% rename from tim/prune/gui/GenericDisplay.java rename to src/tim/prune/gui/GenericDisplay.java diff --git a/tim/prune/gui/GenericProgressDialog.java b/src/tim/prune/gui/GenericProgressDialog.java similarity index 100% rename from tim/prune/gui/GenericProgressDialog.java rename to src/tim/prune/gui/GenericProgressDialog.java diff --git a/tim/prune/gui/GuiGridLayout.java b/src/tim/prune/gui/GuiGridLayout.java similarity index 100% rename from tim/prune/gui/GuiGridLayout.java rename to src/tim/prune/gui/GuiGridLayout.java diff --git a/tim/prune/gui/IconManager.java b/src/tim/prune/gui/IconManager.java similarity index 100% rename from tim/prune/gui/IconManager.java rename to src/tim/prune/gui/IconManager.java diff --git a/tim/prune/gui/ImageUtils.java b/src/tim/prune/gui/ImageUtils.java similarity index 100% rename from tim/prune/gui/ImageUtils.java rename to src/tim/prune/gui/ImageUtils.java diff --git a/tim/prune/gui/MediaListModel.java b/src/tim/prune/gui/MediaListModel.java similarity index 100% rename from tim/prune/gui/MediaListModel.java rename to src/tim/prune/gui/MediaListModel.java diff --git a/tim/prune/gui/MenuManager.java b/src/tim/prune/gui/MenuManager.java similarity index 97% rename from tim/prune/gui/MenuManager.java rename to src/tim/prune/gui/MenuManager.java index bce3b4d..bd0d378 100644 --- a/tim/prune/gui/MenuManager.java +++ b/src/tim/prune/gui/MenuManager.java @@ -34,6 +34,9 @@ import tim.prune.function.SearchOpenCachingDeFunction; import tim.prune.function.browser.UrlGenerator; import tim.prune.function.browser.WebMapFunction; import tim.prune.function.search.SearchMapillaryFunction; +import tim.prune.function.srtm.DownloadSrtmFunction; +import tim.prune.function.srtm.SrtmGl1Source; +import tim.prune.function.srtm.Srtm3Source; /** * Class to manage the menu bar and tool bar, @@ -77,6 +80,7 @@ public class MenuManager implements DataSubscriber private JMenuItem _reverseItem = null; private JMenuItem _addTimeOffsetItem = null; private JMenuItem _addAltitudeOffsetItem = null; + private JMenuItem _removeAltitudesItem = null; private JMenuItem _mergeSegmentsItem = null; private JMenuItem _rearrangeWaypointsItem = null; private JMenuItem _splitSegmentsItem = null; @@ -93,7 +97,7 @@ public class MenuManager implements DataSubscriber private JMenuItem _getGpsiesItem = null; private JMenuItem _uploadGpsiesItem = null; private JMenuItem _lookupSrtmItem = null; - private JMenuItem _downloadSrtmItem = null; + private JMenu _downloadSrtmMenu = null; private JMenuItem _nearbyWikipediaItem = null; private JMenuItem _nearbyOsmPoiItem = null; private JMenuItem _showPeakfinderItem = null; @@ -257,8 +261,15 @@ public class MenuManager implements DataSubscriber // SRTM _lookupSrtmItem = makeMenuItem(FunctionLibrary.FUNCTION_LOOKUP_SRTM, false); onlineMenu.add(_lookupSrtmItem); - _downloadSrtmItem = makeMenuItem(FunctionLibrary.FUNCTION_DOWNLOAD_SRTM, false); - onlineMenu.add(_downloadSrtmItem); + // Download SRTM sub-menu + _downloadSrtmMenu = new JMenu(I18nManager.getText("function.downloadsrtm")); + _downloadSrtmMenu.setEnabled(false); + JMenuItem downloadStrmGl1Item = makeMenuItem(new DownloadSrtmFunction(_app, new SrtmGl1Source())); + _downloadSrtmMenu.add(downloadStrmGl1Item); + JMenuItem downloadStrm3Item = makeMenuItem(new DownloadSrtmFunction(_app, new Srtm3Source())); + _downloadSrtmMenu.add(downloadStrm3Item); + onlineMenu.add(_downloadSrtmMenu); + // Get gpsies tracks _getGpsiesItem = makeMenuItem(FunctionLibrary.FUNCTION_GET_GPSIES, false); onlineMenu.add(_getGpsiesItem); @@ -425,6 +436,8 @@ public class MenuManager implements DataSubscriber rangeMenu.add(_addTimeOffsetItem); _addAltitudeOffsetItem = makeMenuItem(FunctionLibrary.FUNCTION_ADD_ALTITUDE_OFFSET, false); rangeMenu.add(_addAltitudeOffsetItem); + _removeAltitudesItem = makeMenuItem(FunctionLibrary.FUNCTION_REMOVE_ALTITUDES, false); + rangeMenu.add(_removeAltitudesItem); _mergeSegmentsItem = new JMenuItem(I18nManager.getText("menu.range.mergetracksegments")); _mergeSegmentsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -651,6 +664,8 @@ public class MenuManager implements DataSubscriber settingsMenu.add(makeMenuItem(new ChooseSingleParameter(_app, FunctionLibrary.FUNCTION_SET_ALTITUDE_TOLERANCE))); // Set timezone settingsMenu.add(makeMenuItem(FunctionLibrary.FUNCTION_SET_TIMEZONE)); + // Set Earthdata authentication + settingsMenu.add(makeMenuItem(FunctionLibrary.FUNCTION_SET_EARTHDATA_AUTH)); settingsMenu.addSeparator(); // Save configuration settingsMenu.add(makeMenuItem(FunctionLibrary.FUNCTION_SAVECONFIG)); @@ -889,7 +904,7 @@ public class MenuManager implements DataSubscriber _getWeatherItem.setEnabled(hasData); _findWaypointItem.setEnabled(hasData && _track.hasWaypoints()); // have we got a cache? - _downloadSrtmItem.setEnabled(hasData && Config.getConfigString(Config.KEY_DISK_CACHE) != null); + _downloadSrtmMenu.setEnabled(hasData && Config.getConfigString(Config.KEY_DISK_CACHE) != null); // have we got any timestamps? _deleteByDateItem.setEnabled(hasData && _track.hasData(Field.TIMESTAMP)); @@ -956,6 +971,7 @@ public class MenuManager implements DataSubscriber _reverseItem.setEnabled(hasRange); _addTimeOffsetItem.setEnabled(hasRange); _addAltitudeOffsetItem.setEnabled(hasRange); + _removeAltitudesItem.setEnabled(hasRange); _convertNamesToTimesItem.setEnabled(hasRange && _track.hasWaypoints()); _deleteFieldValuesItem.setEnabled(hasRange); _fullRangeDetailsItem.setEnabled(hasRange); diff --git a/tim/prune/gui/MultiStateCheckBox.java b/src/tim/prune/gui/MultiStateCheckBox.java similarity index 100% rename from tim/prune/gui/MultiStateCheckBox.java rename to src/tim/prune/gui/MultiStateCheckBox.java diff --git a/tim/prune/gui/PhotoThumbnail.java b/src/tim/prune/gui/PhotoThumbnail.java similarity index 100% rename from tim/prune/gui/PhotoThumbnail.java rename to src/tim/prune/gui/PhotoThumbnail.java diff --git a/tim/prune/gui/ProgressDialog.java b/src/tim/prune/gui/ProgressDialog.java similarity index 100% rename from tim/prune/gui/ProgressDialog.java rename to src/tim/prune/gui/ProgressDialog.java diff --git a/tim/prune/gui/RecentFileTrigger.java b/src/tim/prune/gui/RecentFileTrigger.java similarity index 100% rename from tim/prune/gui/RecentFileTrigger.java rename to src/tim/prune/gui/RecentFileTrigger.java diff --git a/tim/prune/gui/SelectorDisplay.java b/src/tim/prune/gui/SelectorDisplay.java similarity index 98% rename from tim/prune/gui/SelectorDisplay.java rename to src/tim/prune/gui/SelectorDisplay.java index fa6630d..9dfc24f 100644 --- a/tim/prune/gui/SelectorDisplay.java +++ b/src/tim/prune/gui/SelectorDisplay.java @@ -228,8 +228,9 @@ public class SelectorDisplay extends GenericDisplay else if (numFiles > 1) { final String labelText = I18nManager.getText("details.track.numfiles") + ": " + numFiles; + final String filenameString = String.join(", ", _trackInfo.getFileInfo().getFilenames()); _filenameLabel.setText(labelText); - _filenameLabel.setToolTipText(labelText); + _filenameLabel.setToolTipText(filenameString); } else { diff --git a/tim/prune/gui/SidebarController.java b/src/tim/prune/gui/SidebarController.java similarity index 100% rename from tim/prune/gui/SidebarController.java rename to src/tim/prune/gui/SidebarController.java diff --git a/tim/prune/gui/StatusBar.java b/src/tim/prune/gui/StatusBar.java similarity index 100% rename from tim/prune/gui/StatusBar.java rename to src/tim/prune/gui/StatusBar.java diff --git a/tim/prune/gui/StatusIcon.java b/src/tim/prune/gui/StatusIcon.java similarity index 100% rename from tim/prune/gui/StatusIcon.java rename to src/tim/prune/gui/StatusIcon.java diff --git a/tim/prune/gui/TerrainDefinitionPanel.java b/src/tim/prune/gui/TerrainDefinitionPanel.java similarity index 100% rename from tim/prune/gui/TerrainDefinitionPanel.java rename to src/tim/prune/gui/TerrainDefinitionPanel.java diff --git a/tim/prune/gui/UndoManager.java b/src/tim/prune/gui/UndoManager.java similarity index 100% rename from tim/prune/gui/UndoManager.java rename to src/tim/prune/gui/UndoManager.java diff --git a/tim/prune/gui/Viewport.java b/src/tim/prune/gui/Viewport.java similarity index 92% rename from tim/prune/gui/Viewport.java rename to src/tim/prune/gui/Viewport.java index 25eba2f..aec78a6 100644 --- a/tim/prune/gui/Viewport.java +++ b/src/tim/prune/gui/Viewport.java @@ -40,4 +40,12 @@ public class Viewport double maxLon = MapUtils.getLongitudeFromX(mapPosition.getXFromPixels(width, width)); return new double[] {minLat, minLon, maxLat, maxLon}; } + + /** + * Recentre the viewport on the data + */ + public void recentreViewport() + { + _mapCanvas.zoomToFit(); + } } diff --git a/tim/prune/gui/WaypointListModel.java b/src/tim/prune/gui/WaypointListModel.java similarity index 100% rename from tim/prune/gui/WaypointListModel.java rename to src/tim/prune/gui/WaypointListModel.java diff --git a/tim/prune/gui/WaypointNameMatcher.java b/src/tim/prune/gui/WaypointNameMatcher.java similarity index 100% rename from tim/prune/gui/WaypointNameMatcher.java rename to src/tim/prune/gui/WaypointNameMatcher.java diff --git a/tim/prune/gui/WholeNumberField.java b/src/tim/prune/gui/WholeNumberField.java similarity index 100% rename from tim/prune/gui/WholeNumberField.java rename to src/tim/prune/gui/WholeNumberField.java diff --git a/tim/prune/gui/WizardLayout.java b/src/tim/prune/gui/WizardLayout.java similarity index 100% rename from tim/prune/gui/WizardLayout.java rename to src/tim/prune/gui/WizardLayout.java diff --git a/tim/prune/gui/colour/AltitudeColourer.java b/src/tim/prune/gui/colour/AltitudeColourer.java similarity index 100% rename from tim/prune/gui/colour/AltitudeColourer.java rename to src/tim/prune/gui/colour/AltitudeColourer.java diff --git a/tim/prune/gui/colour/ColourChooser.java b/src/tim/prune/gui/colour/ColourChooser.java similarity index 100% rename from tim/prune/gui/colour/ColourChooser.java rename to src/tim/prune/gui/colour/ColourChooser.java diff --git a/tim/prune/gui/colour/ColourPatch.java b/src/tim/prune/gui/colour/ColourPatch.java similarity index 100% rename from tim/prune/gui/colour/ColourPatch.java rename to src/tim/prune/gui/colour/ColourPatch.java diff --git a/tim/prune/gui/colour/ColourerCaretaker.java b/src/tim/prune/gui/colour/ColourerCaretaker.java similarity index 100% rename from tim/prune/gui/colour/ColourerCaretaker.java rename to src/tim/prune/gui/colour/ColourerCaretaker.java diff --git a/tim/prune/gui/colour/ColourerFactory.java b/src/tim/prune/gui/colour/ColourerFactory.java similarity index 100% rename from tim/prune/gui/colour/ColourerFactory.java rename to src/tim/prune/gui/colour/ColourerFactory.java diff --git a/tim/prune/gui/colour/ColourerSelectorPanel.java b/src/tim/prune/gui/colour/ColourerSelectorPanel.java similarity index 100% rename from tim/prune/gui/colour/ColourerSelectorPanel.java rename to src/tim/prune/gui/colour/ColourerSelectorPanel.java diff --git a/tim/prune/gui/colour/ContinuousPointColourer.java b/src/tim/prune/gui/colour/ContinuousPointColourer.java similarity index 100% rename from tim/prune/gui/colour/ContinuousPointColourer.java rename to src/tim/prune/gui/colour/ContinuousPointColourer.java diff --git a/tim/prune/gui/colour/DateColourer.java b/src/tim/prune/gui/colour/DateColourer.java similarity index 100% rename from tim/prune/gui/colour/DateColourer.java rename to src/tim/prune/gui/colour/DateColourer.java diff --git a/tim/prune/gui/colour/DiscretePointColourer.java b/src/tim/prune/gui/colour/DiscretePointColourer.java similarity index 100% rename from tim/prune/gui/colour/DiscretePointColourer.java rename to src/tim/prune/gui/colour/DiscretePointColourer.java diff --git a/tim/prune/gui/colour/FileColourer.java b/src/tim/prune/gui/colour/FileColourer.java similarity index 100% rename from tim/prune/gui/colour/FileColourer.java rename to src/tim/prune/gui/colour/FileColourer.java diff --git a/tim/prune/gui/colour/GradientColourer.java b/src/tim/prune/gui/colour/GradientColourer.java similarity index 100% rename from tim/prune/gui/colour/GradientColourer.java rename to src/tim/prune/gui/colour/GradientColourer.java diff --git a/tim/prune/gui/colour/PatchListener.java b/src/tim/prune/gui/colour/PatchListener.java similarity index 100% rename from tim/prune/gui/colour/PatchListener.java rename to src/tim/prune/gui/colour/PatchListener.java diff --git a/tim/prune/gui/colour/PointColourer.java b/src/tim/prune/gui/colour/PointColourer.java similarity index 100% rename from tim/prune/gui/colour/PointColourer.java rename to src/tim/prune/gui/colour/PointColourer.java diff --git a/tim/prune/gui/colour/ProfileDataColourer.java b/src/tim/prune/gui/colour/ProfileDataColourer.java similarity index 100% rename from tim/prune/gui/colour/ProfileDataColourer.java rename to src/tim/prune/gui/colour/ProfileDataColourer.java diff --git a/tim/prune/gui/colour/SegmentColourer.java b/src/tim/prune/gui/colour/SegmentColourer.java similarity index 100% rename from tim/prune/gui/colour/SegmentColourer.java rename to src/tim/prune/gui/colour/SegmentColourer.java diff --git a/tim/prune/gui/colour/SpeedColourer.java b/src/tim/prune/gui/colour/SpeedColourer.java similarity index 100% rename from tim/prune/gui/colour/SpeedColourer.java rename to src/tim/prune/gui/colour/SpeedColourer.java diff --git a/tim/prune/gui/colour/VertSpeedColourer.java b/src/tim/prune/gui/colour/VertSpeedColourer.java similarity index 100% rename from tim/prune/gui/colour/VertSpeedColourer.java rename to src/tim/prune/gui/colour/VertSpeedColourer.java diff --git a/tim/prune/gui/images/add_photo_icon.png b/src/tim/prune/gui/images/add_photo_icon.png similarity index 100% rename from tim/prune/gui/images/add_photo_icon.png rename to src/tim/prune/gui/images/add_photo_icon.png diff --git a/tim/prune/gui/images/add_textfile_icon.png b/src/tim/prune/gui/images/add_textfile_icon.png similarity index 100% rename from tim/prune/gui/images/add_textfile_icon.png rename to src/tim/prune/gui/images/add_textfile_icon.png diff --git a/tim/prune/gui/images/autopan.gif b/src/tim/prune/gui/images/autopan.gif similarity index 100% rename from tim/prune/gui/images/autopan.gif rename to src/tim/prune/gui/images/autopan.gif diff --git a/tim/prune/gui/images/autopan_on.gif b/src/tim/prune/gui/images/autopan_on.gif similarity index 100% rename from tim/prune/gui/images/autopan_on.gif rename to src/tim/prune/gui/images/autopan_on.gif diff --git a/tim/prune/gui/images/cut_and_move.gif b/src/tim/prune/gui/images/cut_and_move.gif similarity index 100% rename from tim/prune/gui/images/cut_and_move.gif rename to src/tim/prune/gui/images/cut_and_move.gif diff --git a/tim/prune/gui/images/delete_point_icon.gif b/src/tim/prune/gui/images/delete_point_icon.gif similarity index 100% rename from tim/prune/gui/images/delete_point_icon.gif rename to src/tim/prune/gui/images/delete_point_icon.gif diff --git a/tim/prune/gui/images/delete_range_icon.gif b/src/tim/prune/gui/images/delete_range_icon.gif similarity index 100% rename from tim/prune/gui/images/delete_range_icon.gif rename to src/tim/prune/gui/images/delete_range_icon.gif diff --git a/tim/prune/gui/images/drag_points_icon.gif b/src/tim/prune/gui/images/drag_points_icon.gif similarity index 100% rename from tim/prune/gui/images/drag_points_icon.gif rename to src/tim/prune/gui/images/drag_points_icon.gif diff --git a/tim/prune/gui/images/drag_points_icon_on.gif b/src/tim/prune/gui/images/drag_points_icon_on.gif similarity index 100% rename from tim/prune/gui/images/drag_points_icon_on.gif rename to src/tim/prune/gui/images/drag_points_icon_on.gif diff --git a/tim/prune/gui/images/edit_point_icon.gif b/src/tim/prune/gui/images/edit_point_icon.gif similarity index 100% rename from tim/prune/gui/images/edit_point_icon.gif rename to src/tim/prune/gui/images/edit_point_icon.gif diff --git a/tim/prune/gui/images/entry_invalid.gif b/src/tim/prune/gui/images/entry_invalid.gif similarity index 100% rename from tim/prune/gui/images/entry_invalid.gif rename to src/tim/prune/gui/images/entry_invalid.gif diff --git a/tim/prune/gui/images/entry_none.gif b/src/tim/prune/gui/images/entry_none.gif similarity index 100% rename from tim/prune/gui/images/entry_none.gif rename to src/tim/prune/gui/images/entry_none.gif diff --git a/tim/prune/gui/images/entry_valid.gif b/src/tim/prune/gui/images/entry_valid.gif similarity index 100% rename from tim/prune/gui/images/entry_valid.gif rename to src/tim/prune/gui/images/entry_valid.gif diff --git a/tim/prune/gui/images/link.gif b/src/tim/prune/gui/images/link.gif similarity index 100% rename from tim/prune/gui/images/link.gif rename to src/tim/prune/gui/images/link.gif diff --git a/tim/prune/gui/images/map_icon.gif b/src/tim/prune/gui/images/map_icon.gif similarity index 100% rename from tim/prune/gui/images/map_icon.gif rename to src/tim/prune/gui/images/map_icon.gif diff --git a/tim/prune/gui/images/map_icon_on.gif b/src/tim/prune/gui/images/map_icon_on.gif similarity index 100% rename from tim/prune/gui/images/map_icon_on.gif rename to src/tim/prune/gui/images/map_icon_on.gif diff --git a/tim/prune/gui/images/pause.png b/src/tim/prune/gui/images/pause.png similarity index 100% rename from tim/prune/gui/images/pause.png rename to src/tim/prune/gui/images/pause.png diff --git a/tim/prune/gui/images/play.png b/src/tim/prune/gui/images/play.png similarity index 100% rename from tim/prune/gui/images/play.png rename to src/tim/prune/gui/images/play.png diff --git a/tim/prune/gui/images/play_audio.gif b/src/tim/prune/gui/images/play_audio.gif similarity index 100% rename from tim/prune/gui/images/play_audio.gif rename to src/tim/prune/gui/images/play_audio.gif diff --git a/tim/prune/gui/images/points_arrows.png b/src/tim/prune/gui/images/points_arrows.png similarity index 100% rename from tim/prune/gui/images/points_arrows.png rename to src/tim/prune/gui/images/points_arrows.png diff --git a/tim/prune/gui/images/points_connected.png b/src/tim/prune/gui/images/points_connected.png similarity index 100% rename from tim/prune/gui/images/points_connected.png rename to src/tim/prune/gui/images/points_connected.png diff --git a/tim/prune/gui/images/points_disconnected.png b/src/tim/prune/gui/images/points_disconnected.png similarity index 100% rename from tim/prune/gui/images/points_disconnected.png rename to src/tim/prune/gui/images/points_disconnected.png diff --git a/tim/prune/gui/images/points_hidden.png b/src/tim/prune/gui/images/points_hidden.png similarity index 100% rename from tim/prune/gui/images/points_hidden.png rename to src/tim/prune/gui/images/points_hidden.png diff --git a/tim/prune/gui/images/rewind.png b/src/tim/prune/gui/images/rewind.png similarity index 100% rename from tim/prune/gui/images/rewind.png rename to src/tim/prune/gui/images/rewind.png diff --git a/tim/prune/gui/images/rotate_left_icon.png b/src/tim/prune/gui/images/rotate_left_icon.png similarity index 100% rename from tim/prune/gui/images/rotate_left_icon.png rename to src/tim/prune/gui/images/rotate_left_icon.png diff --git a/tim/prune/gui/images/rotate_right_icon.png b/src/tim/prune/gui/images/rotate_right_icon.png similarity index 100% rename from tim/prune/gui/images/rotate_right_icon.png rename to src/tim/prune/gui/images/rotate_right_icon.png diff --git a/tim/prune/gui/images/save_icon.gif b/src/tim/prune/gui/images/save_icon.gif similarity index 100% rename from tim/prune/gui/images/save_icon.gif rename to src/tim/prune/gui/images/save_icon.gif diff --git a/tim/prune/gui/images/scalebar.gif b/src/tim/prune/gui/images/scalebar.gif similarity index 100% rename from tim/prune/gui/images/scalebar.gif rename to src/tim/prune/gui/images/scalebar.gif diff --git a/tim/prune/gui/images/scalebar_on.gif b/src/tim/prune/gui/images/scalebar_on.gif similarity index 100% rename from tim/prune/gui/images/scalebar_on.gif rename to src/tim/prune/gui/images/scalebar_on.gif diff --git a/tim/prune/gui/images/set_end_icon.png b/src/tim/prune/gui/images/set_end_icon.png similarity index 100% rename from tim/prune/gui/images/set_end_icon.png rename to src/tim/prune/gui/images/set_end_icon.png diff --git a/tim/prune/gui/images/set_start_icon.png b/src/tim/prune/gui/images/set_start_icon.png similarity index 100% rename from tim/prune/gui/images/set_start_icon.png rename to src/tim/prune/gui/images/set_start_icon.png diff --git a/tim/prune/gui/images/show_details_icon.gif b/src/tim/prune/gui/images/show_details_icon.gif similarity index 100% rename from tim/prune/gui/images/show_details_icon.gif rename to src/tim/prune/gui/images/show_details_icon.gif diff --git a/tim/prune/gui/images/stop_audio.gif b/src/tim/prune/gui/images/stop_audio.gif similarity index 100% rename from tim/prune/gui/images/stop_audio.gif rename to src/tim/prune/gui/images/stop_audio.gif diff --git a/tim/prune/gui/images/undo_icon.gif b/src/tim/prune/gui/images/undo_icon.gif similarity index 100% rename from tim/prune/gui/images/undo_icon.gif rename to src/tim/prune/gui/images/undo_icon.gif diff --git a/tim/prune/gui/images/weather-clear-day.png b/src/tim/prune/gui/images/weather-clear-day.png similarity index 100% rename from tim/prune/gui/images/weather-clear-day.png rename to src/tim/prune/gui/images/weather-clear-day.png diff --git a/tim/prune/gui/images/weather-clear-night.png b/src/tim/prune/gui/images/weather-clear-night.png similarity index 100% rename from tim/prune/gui/images/weather-clear-night.png rename to src/tim/prune/gui/images/weather-clear-night.png diff --git a/tim/prune/gui/images/weather-clouds-day.png b/src/tim/prune/gui/images/weather-clouds-day.png similarity index 100% rename from tim/prune/gui/images/weather-clouds-day.png rename to src/tim/prune/gui/images/weather-clouds-day.png diff --git a/tim/prune/gui/images/weather-clouds-night.png b/src/tim/prune/gui/images/weather-clouds-night.png similarity index 100% rename from tim/prune/gui/images/weather-clouds-night.png rename to src/tim/prune/gui/images/weather-clouds-night.png diff --git a/tim/prune/gui/images/weather-clouds.png b/src/tim/prune/gui/images/weather-clouds.png similarity index 100% rename from tim/prune/gui/images/weather-clouds.png rename to src/tim/prune/gui/images/weather-clouds.png diff --git a/tim/prune/gui/images/weather-extreme.png b/src/tim/prune/gui/images/weather-extreme.png similarity index 100% rename from tim/prune/gui/images/weather-extreme.png rename to src/tim/prune/gui/images/weather-extreme.png diff --git a/tim/prune/gui/images/weather-fog.png b/src/tim/prune/gui/images/weather-fog.png similarity index 100% rename from tim/prune/gui/images/weather-fog.png rename to src/tim/prune/gui/images/weather-fog.png diff --git a/tim/prune/gui/images/weather-hail.png b/src/tim/prune/gui/images/weather-hail.png similarity index 100% rename from tim/prune/gui/images/weather-hail.png rename to src/tim/prune/gui/images/weather-hail.png diff --git a/tim/prune/gui/images/weather-lightrain.png b/src/tim/prune/gui/images/weather-lightrain.png similarity index 100% rename from tim/prune/gui/images/weather-lightrain.png rename to src/tim/prune/gui/images/weather-lightrain.png diff --git a/tim/prune/gui/images/weather-rain.png b/src/tim/prune/gui/images/weather-rain.png similarity index 100% rename from tim/prune/gui/images/weather-rain.png rename to src/tim/prune/gui/images/weather-rain.png diff --git a/tim/prune/gui/images/weather-snow.png b/src/tim/prune/gui/images/weather-snow.png similarity index 100% rename from tim/prune/gui/images/weather-snow.png rename to src/tim/prune/gui/images/weather-snow.png diff --git a/tim/prune/gui/images/weather-storm.png b/src/tim/prune/gui/images/weather-storm.png similarity index 100% rename from tim/prune/gui/images/weather-storm.png rename to src/tim/prune/gui/images/weather-storm.png diff --git a/tim/prune/gui/images/window_icon_128.png b/src/tim/prune/gui/images/window_icon_128.png similarity index 100% rename from tim/prune/gui/images/window_icon_128.png rename to src/tim/prune/gui/images/window_icon_128.png diff --git a/tim/prune/gui/images/window_icon_16.png b/src/tim/prune/gui/images/window_icon_16.png similarity index 100% rename from tim/prune/gui/images/window_icon_16.png rename to src/tim/prune/gui/images/window_icon_16.png diff --git a/tim/prune/gui/images/window_icon_20.png b/src/tim/prune/gui/images/window_icon_20.png similarity index 100% rename from tim/prune/gui/images/window_icon_20.png rename to src/tim/prune/gui/images/window_icon_20.png diff --git a/tim/prune/gui/images/window_icon_22.png b/src/tim/prune/gui/images/window_icon_22.png similarity index 100% rename from tim/prune/gui/images/window_icon_22.png rename to src/tim/prune/gui/images/window_icon_22.png diff --git a/tim/prune/gui/images/window_icon_24.png b/src/tim/prune/gui/images/window_icon_24.png similarity index 100% rename from tim/prune/gui/images/window_icon_24.png rename to src/tim/prune/gui/images/window_icon_24.png diff --git a/tim/prune/gui/images/window_icon_32.png b/src/tim/prune/gui/images/window_icon_32.png similarity index 100% rename from tim/prune/gui/images/window_icon_32.png rename to src/tim/prune/gui/images/window_icon_32.png diff --git a/tim/prune/gui/images/window_icon_36.png b/src/tim/prune/gui/images/window_icon_36.png similarity index 100% rename from tim/prune/gui/images/window_icon_36.png rename to src/tim/prune/gui/images/window_icon_36.png diff --git a/tim/prune/gui/images/window_icon_48.png b/src/tim/prune/gui/images/window_icon_48.png similarity index 100% rename from tim/prune/gui/images/window_icon_48.png rename to src/tim/prune/gui/images/window_icon_48.png diff --git a/tim/prune/gui/images/window_icon_64.png b/src/tim/prune/gui/images/window_icon_64.png similarity index 100% rename from tim/prune/gui/images/window_icon_64.png rename to src/tim/prune/gui/images/window_icon_64.png diff --git a/tim/prune/gui/images/window_icon_72.png b/src/tim/prune/gui/images/window_icon_72.png similarity index 100% rename from tim/prune/gui/images/window_icon_72.png rename to src/tim/prune/gui/images/window_icon_72.png diff --git a/tim/prune/gui/images/window_icon_96.png b/src/tim/prune/gui/images/window_icon_96.png similarity index 100% rename from tim/prune/gui/images/window_icon_96.png rename to src/tim/prune/gui/images/window_icon_96.png diff --git a/tim/prune/gui/images/wpicon_default_m.png b/src/tim/prune/gui/images/wpicon_default_m.png similarity index 100% rename from tim/prune/gui/images/wpicon_default_m.png rename to src/tim/prune/gui/images/wpicon_default_m.png diff --git a/tim/prune/gui/images/wpicon_pin_l.png b/src/tim/prune/gui/images/wpicon_pin_l.png similarity index 100% rename from tim/prune/gui/images/wpicon_pin_l.png rename to src/tim/prune/gui/images/wpicon_pin_l.png diff --git a/tim/prune/gui/images/wpicon_pin_m.png b/src/tim/prune/gui/images/wpicon_pin_m.png similarity index 100% rename from tim/prune/gui/images/wpicon_pin_m.png rename to src/tim/prune/gui/images/wpicon_pin_m.png diff --git a/tim/prune/gui/images/wpicon_pin_s.png b/src/tim/prune/gui/images/wpicon_pin_s.png similarity index 100% rename from tim/prune/gui/images/wpicon_pin_s.png rename to src/tim/prune/gui/images/wpicon_pin_s.png diff --git a/tim/prune/gui/images/wpicon_plectrum_l.png b/src/tim/prune/gui/images/wpicon_plectrum_l.png similarity index 100% rename from tim/prune/gui/images/wpicon_plectrum_l.png rename to src/tim/prune/gui/images/wpicon_plectrum_l.png diff --git a/tim/prune/gui/images/wpicon_plectrum_m.png b/src/tim/prune/gui/images/wpicon_plectrum_m.png similarity index 100% rename from tim/prune/gui/images/wpicon_plectrum_m.png rename to src/tim/prune/gui/images/wpicon_plectrum_m.png diff --git a/tim/prune/gui/images/wpicon_plectrum_s.png b/src/tim/prune/gui/images/wpicon_plectrum_s.png similarity index 100% rename from tim/prune/gui/images/wpicon_plectrum_s.png rename to src/tim/prune/gui/images/wpicon_plectrum_s.png diff --git a/tim/prune/gui/images/wpicon_ring_l.png b/src/tim/prune/gui/images/wpicon_ring_l.png similarity index 100% rename from tim/prune/gui/images/wpicon_ring_l.png rename to src/tim/prune/gui/images/wpicon_ring_l.png diff --git a/tim/prune/gui/images/wpicon_ring_m.png b/src/tim/prune/gui/images/wpicon_ring_m.png similarity index 100% rename from tim/prune/gui/images/wpicon_ring_m.png rename to src/tim/prune/gui/images/wpicon_ring_m.png diff --git a/tim/prune/gui/images/wpicon_ring_s.png b/src/tim/prune/gui/images/wpicon_ring_s.png similarity index 100% rename from tim/prune/gui/images/wpicon_ring_s.png rename to src/tim/prune/gui/images/wpicon_ring_s.png diff --git a/tim/prune/gui/images/wpicon_ringpt_l.png b/src/tim/prune/gui/images/wpicon_ringpt_l.png similarity index 100% rename from tim/prune/gui/images/wpicon_ringpt_l.png rename to src/tim/prune/gui/images/wpicon_ringpt_l.png diff --git a/tim/prune/gui/images/wpicon_ringpt_m.png b/src/tim/prune/gui/images/wpicon_ringpt_m.png similarity index 100% rename from tim/prune/gui/images/wpicon_ringpt_m.png rename to src/tim/prune/gui/images/wpicon_ringpt_m.png diff --git a/tim/prune/gui/images/wpicon_ringpt_s.png b/src/tim/prune/gui/images/wpicon_ringpt_s.png similarity index 100% rename from tim/prune/gui/images/wpicon_ringpt_s.png rename to src/tim/prune/gui/images/wpicon_ringpt_s.png diff --git a/tim/prune/gui/images/zoom_in.gif b/src/tim/prune/gui/images/zoom_in.gif similarity index 100% rename from tim/prune/gui/images/zoom_in.gif rename to src/tim/prune/gui/images/zoom_in.gif diff --git a/tim/prune/gui/images/zoom_out.gif b/src/tim/prune/gui/images/zoom_out.gif similarity index 100% rename from tim/prune/gui/images/zoom_out.gif rename to src/tim/prune/gui/images/zoom_out.gif diff --git a/tim/prune/gui/map/DiskTileCacher.java b/src/tim/prune/gui/map/DiskTileCacher.java similarity index 100% rename from tim/prune/gui/map/DiskTileCacher.java rename to src/tim/prune/gui/map/DiskTileCacher.java diff --git a/tim/prune/gui/map/MapCanvas.java b/src/tim/prune/gui/map/MapCanvas.java similarity index 91% rename from tim/prune/gui/map/MapCanvas.java rename to src/tim/prune/gui/map/MapCanvas.java index aa25dbc..ad38d81 100644 --- a/tim/prune/gui/map/MapCanvas.java +++ b/src/tim/prune/gui/map/MapCanvas.java @@ -92,7 +92,7 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe WpIconDefinition _waypointIconDefinition = null; /** Constant for click sensitivity when selecting nearest point */ - private static final int CLICK_SENSITIVITY = 10; + private static final int CLICK_SENSITIVITY = 30; /** Constant for pan distance from key presses */ private static final int PAN_DISTANCE = 20; /** Constant for pan distance from autopan */ @@ -259,8 +259,8 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe // add control panels to this one setLayout(new BorderLayout()); - _topPanel.setVisible(false); - _sidePanel.setVisible(false); + _topPanel.setVisible(true); + _sidePanel.setVisible(true); add(_topPanel, BorderLayout.NORTH); add(_sidePanel, BorderLayout.WEST); add(_scaleBar, BorderLayout.SOUTH); @@ -337,16 +337,19 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe /** * Zoom to fit the current data area */ - private void zoomToFit() + public void zoomToFit() { + int maxZoom = (_track.getNumPoints() == 0)?2:_tileManager.getMaxZoomLevel(); _latRange = _track.getLatRange(); _lonRange = _track.getLonRange(); _xRange = new DoubleRange(MapUtils.getXFromLongitude(_lonRange.getMinimum()), MapUtils.getXFromLongitude(_lonRange.getMaximum())); _yRange = new DoubleRange(MapUtils.getYFromLatitude(_latRange.getMinimum()), MapUtils.getYFromLatitude(_latRange.getMaximum())); - _mapPosition.zoomToXY(_xRange.getMinimum(), _xRange.getMaximum(), _yRange.getMinimum(), _yRange.getMaximum(), - getWidth(), getHeight()); + _mapPosition.zoomToXY( + _xRange.getMinimum(), _xRange.getMaximum(), + _yRange.getMinimum(), _yRange.getMaximum(), + getWidth(), getHeight(), maxZoom); } @@ -360,70 +363,59 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe if (_mapImage != null && (_mapImage.getWidth() != getWidth() || _mapImage.getHeight() != getHeight())) { _mapImage = null; } - if (_track.getNumPoints() > 0) + // Check for autopan if enabled / necessary + if (_autopanCheckBox.isSelected()) { - // Check for autopan if enabled / necessary - if (_autopanCheckBox.isSelected()) + int selectedPoint = _selection.getCurrentPointIndex(); + if (selectedPoint >= 0 && _dragFromX == -1 && selectedPoint != _prevSelectedPoint) { - int selectedPoint = _selection.getCurrentPointIndex(); - if (selectedPoint >= 0 && _dragFromX == -1 && selectedPoint != _prevSelectedPoint) - { - autopanToPoint(selectedPoint); - } - _prevSelectedPoint = selectedPoint; + autopanToPoint(selectedPoint); } + _prevSelectedPoint = selectedPoint; + } - // Draw the map contents if necessary - if (_mapImage == null || _recalculate) - { - paintMapContents(); - _scaleBar.updateScale(_mapPosition.getZoom(), _mapPosition.getYFromPixels(0, 0)); - } - // Draw the prepared image onto the panel - if (_mapImage != null) { - inG.drawImage(_mapImage, 0, 0, getWidth(), getHeight(), null); - } + // Draw the map contents if necessary + if (_mapImage == null || _recalculate) + { + paintMapContents(); + _scaleBar.updateScale(_mapPosition.getZoom(), _mapPosition.getYFromPixels(0, 0)); + } + // Draw the prepared image onto the panel + if (_mapImage != null) { + inG.drawImage(_mapImage, 0, 0, getWidth(), getHeight(), null); + } - switch (_drawMode) - { - case MODE_DRAG_POINT: - drawDragLines(inG, _selection.getCurrentPointIndex()-1, _selection.getCurrentPointIndex()+1); - break; + switch (_drawMode) + { + case MODE_DRAG_POINT: + drawDragLines(inG, _selection.getCurrentPointIndex()-1, _selection.getCurrentPointIndex()+1); + break; - case MODE_CREATE_MIDPOINT: - drawDragLines(inG, _clickedPoint-1, _clickedPoint); - break; + case MODE_CREATE_MIDPOINT: + drawDragLines(inG, _clickedPoint-1, _clickedPoint); + break; - case MODE_ZOOM_RECT: - case MODE_MARK_RECTANGLE: - if (_dragFromX != -1 && _dragFromY != -1) - { - // Draw the zoom rectangle if necessary - inG.setColor(Color.RED); - inG.drawLine(_dragFromX, _dragFromY, _dragFromX, _dragToY); - inG.drawLine(_dragFromX, _dragFromY, _dragToX, _dragFromY); - inG.drawLine(_dragToX, _dragFromY, _dragToX, _dragToY); - inG.drawLine(_dragFromX, _dragToY, _dragToX, _dragToY); - } - break; - - case MODE_DRAW_POINTS_CONT: - // draw line to mouse position to show drawing mode - inG.setColor(Config.getColourScheme().getColour(ColourScheme.IDX_POINT)); - int prevIndex = _track.getNumPoints()-1; - int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getX(prevIndex)); - int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getY(prevIndex)); - inG.drawLine(px, py, _dragToX, _dragToY); - break; - } - } - else - { - inG.setColor(Config.getColourScheme().getColour(ColourScheme.IDX_BACKGROUND)); - inG.fillRect(0, 0, getWidth(), getHeight()); - inG.setColor(COLOR_MESSAGES); - inG.drawString(I18nManager.getText("display.nodata"), 50, getHeight()/2); - _scaleBar.updateScale(-1, 0); + case MODE_ZOOM_RECT: + case MODE_MARK_RECTANGLE: + if (_dragFromX != -1 && _dragFromY != -1) + { + // Draw the zoom rectangle if necessary + inG.setColor(Color.RED); + inG.drawLine(_dragFromX, _dragFromY, _dragFromX, _dragToY); + inG.drawLine(_dragFromX, _dragFromY, _dragToX, _dragFromY); + inG.drawLine(_dragToX, _dragFromY, _dragToX, _dragToY); + inG.drawLine(_dragFromX, _dragToY, _dragToX, _dragToY); + } + break; + + case MODE_DRAW_POINTS_CONT: + // draw line to mouse position to show drawing mode + inG.setColor(Config.getColourScheme().getColour(ColourScheme.IDX_POINT)); + int prevIndex = _track.getNumPoints()-1; + int px = getWidth() / 2 + _mapPosition.getXFromCentre(_track.getX(prevIndex)); + int py = getHeight() / 2 + _mapPosition.getYFromCentre(_track.getY(prevIndex)); + inG.drawLine(px, py, _dragToX, _dragToY); + break; } // Draw slider etc on top paintChildren(inG); @@ -1074,66 +1066,63 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe */ public void mouseClicked(MouseEvent inE) { - if (_track != null && _track.getNumPoints() > 0) + // select point if it's a left-click + if (!inE.isMetaDown()) { - // select point if it's a left-click - if (!inE.isMetaDown()) + if (inE.getClickCount() == 1) { - if (inE.getClickCount() == 1) + // single click + if (_drawMode == MODE_DEFAULT) { - // single click - if (_drawMode == MODE_DEFAULT) + int pointIndex = _clickedPoint; + if (pointIndex == INDEX_UNKNOWN) { - int pointIndex = _clickedPoint; - if (pointIndex == INDEX_UNKNOWN) - { - // index hasn't been calculated yet - pointIndex = _track.getNearestPointIndex( - _mapPosition.getXFromPixels(inE.getX(), getWidth()), - _mapPosition.getYFromPixels(inE.getY(), getHeight()), - _mapPosition.getBoundsFromPixels(CLICK_SENSITIVITY), false); - } - // Extend selection for shift-click - if (inE.isShiftDown()) { - _trackInfo.extendSelection(pointIndex); - } - else { - _trackInfo.selectPoint(pointIndex); - } + // index hasn't been calculated yet + pointIndex = _track.getNearestPointIndex( + _mapPosition.getXFromPixels(inE.getX(), getWidth()), + _mapPosition.getYFromPixels(inE.getY(), getHeight()), + _mapPosition.getBoundsFromPixels(CLICK_SENSITIVITY), false); } - else if (_drawMode == MODE_DRAW_POINTS_START) - { - _app.createPoint(createPointFromClick(inE.getX(), inE.getY())); - _dragToX = inE.getX(); - _dragToY = inE.getY(); - _drawMode = MODE_DRAW_POINTS_CONT; + // Extend selection for shift-click + if (inE.isShiftDown()) { + _trackInfo.extendSelection(pointIndex); } - else if (_drawMode == MODE_DRAW_POINTS_CONT) - { - DataPoint point = createPointFromClick(inE.getX(), inE.getY()); - _app.createPoint(point, false); // not a new segment + else { + _trackInfo.selectPoint(pointIndex); } } - else if (inE.getClickCount() == 2) + else if (_drawMode == MODE_DRAW_POINTS_START) { - // double click - if (_drawMode == MODE_DEFAULT) { - panMap(inE.getX() - getWidth()/2, inE.getY() - getHeight()/2); - zoomIn(); - } - else if (_drawMode == MODE_DRAW_POINTS_START || _drawMode == MODE_DRAW_POINTS_CONT) { - _drawMode = MODE_DEFAULT; - } + _app.createPoint(createPointFromClick(inE.getX(), inE.getY())); + _dragToX = inE.getX(); + _dragToY = inE.getY(); + _drawMode = MODE_DRAW_POINTS_CONT; + } + else if (_drawMode == MODE_DRAW_POINTS_CONT) + { + DataPoint point = createPointFromClick(inE.getX(), inE.getY()); + _app.createPoint(point, false); // not a new segment } } - else + else if (inE.getClickCount() == 2) { - // show the popup menu for right-clicks - _popupMenuX = inE.getX(); - _popupMenuY = inE.getY(); - _popup.show(this, _popupMenuX, _popupMenuY); + // double click + if (_drawMode == MODE_DEFAULT) { + panMap(inE.getX() - getWidth()/2, inE.getY() - getHeight()/2); + zoomIn(); + } + else if (_drawMode == MODE_DRAW_POINTS_START || _drawMode == MODE_DRAW_POINTS_CONT) { + _drawMode = MODE_DEFAULT; + } } } + else + { + // show the popup menu for right-clicks + _popupMenuX = inE.getX(); + _popupMenuY = inE.getY(); + _popup.show(this, _popupMenuX, _popupMenuY); + } // Reset app mode _app.setCurrentMode(App.AppMode.NORMAL); if (_drawMode == MODE_MARK_RECTANGLE) _drawMode = MODE_DEFAULT; @@ -1408,10 +1397,6 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe } } repaint(); - // enable or disable components - boolean hasData = _track.getNumPoints() > 0; - _topPanel.setVisible(hasData); - _sidePanel.setVisible(hasData); // grab focus for the key presses this.requestFocus(); } diff --git a/tim/prune/gui/map/MapPosition.java b/src/tim/prune/gui/map/MapPosition.java similarity index 98% rename from tim/prune/gui/map/MapPosition.java rename to src/tim/prune/gui/map/MapPosition.java index 25f05fc..71ab6cd 100644 --- a/tim/prune/gui/map/MapPosition.java +++ b/src/tim/prune/gui/map/MapPosition.java @@ -30,14 +30,14 @@ public class MapPosition * @param inWidth width of display * @param inHeight height of display */ - public void zoomToXY(double inMinX, double inMaxX, double inMinY, double inMaxY, int inWidth, int inHeight) + public void zoomToXY(double inMinX, double inMaxX, double inMinY, double inMaxY, int inWidth, int inHeight, int maxZoom) { // System.out.println("Zooming to " + inMinX + ", " + inMaxX + ", " + inMinY + ", " + inMaxY + "; width=" + inWidth + ", height=" + inHeight); double diffX = Math.abs(inMaxX - inMinX); double diffY = Math.abs(inMaxY - inMinY); // Find out what zoom level to go to int requiredZoom = -1; - for (int currZoom = MAX_ZOOM; currZoom >= 2; currZoom--) + for (int currZoom = maxZoom; currZoom >= 2; currZoom--) { if (transformToPixels(diffX, currZoom) < inWidth && transformToPixels(diffY, currZoom) < inHeight) diff --git a/tim/prune/gui/map/MapSource.java b/src/tim/prune/gui/map/MapSource.java similarity index 98% rename from tim/prune/gui/map/MapSource.java rename to src/tim/prune/gui/map/MapSource.java index c4e2946..177ad67 100644 --- a/tim/prune/gui/map/MapSource.java +++ b/src/tim/prune/gui/map/MapSource.java @@ -104,7 +104,7 @@ public abstract class MapSource urlstr = "http://" + urlstr; } // check trailing / - if (!urlstr.endsWith("/")) { + if (!urlstr.endsWith("/") && !urlstr.contains("?")) { urlstr = urlstr + "/"; } // Validate current url, return null if not ok diff --git a/tim/prune/gui/map/MapSourceLibrary.java b/src/tim/prune/gui/map/MapSourceLibrary.java similarity index 100% rename from tim/prune/gui/map/MapSourceLibrary.java rename to src/tim/prune/gui/map/MapSourceLibrary.java diff --git a/tim/prune/gui/map/MapTile.java b/src/tim/prune/gui/map/MapTile.java similarity index 100% rename from tim/prune/gui/map/MapTile.java rename to src/tim/prune/gui/map/MapTile.java diff --git a/tim/prune/gui/map/MapTileManager.java b/src/tim/prune/gui/map/MapTileManager.java similarity index 98% rename from tim/prune/gui/map/MapTileManager.java rename to src/tim/prune/gui/map/MapTileManager.java index f7370c5..d1e0047 100644 --- a/tim/prune/gui/map/MapTileManager.java +++ b/src/tim/prune/gui/map/MapTileManager.java @@ -70,10 +70,19 @@ public class MapTileManager implements ImageObserver * @return true if zoom is too high for tiles */ public boolean isOverzoomed() + { + return _zoom > getMaxZoomLevel(); + } + + /** + * @return the maximum useable zoom level for tiles + */ + public int getMaxZoomLevel() { // Ask current map source what maximum zoom is int maxZoom = (_mapSource == null?0:_mapSource.getMaxZoomLevel()); - return (_zoom > maxZoom); + return maxZoom; + } /** diff --git a/tim/prune/gui/map/MapUtils.java b/src/tim/prune/gui/map/MapUtils.java similarity index 100% rename from tim/prune/gui/map/MapUtils.java rename to src/tim/prune/gui/map/MapUtils.java diff --git a/tim/prune/gui/map/MemTileCacher.java b/src/tim/prune/gui/map/MemTileCacher.java similarity index 100% rename from tim/prune/gui/map/MemTileCacher.java rename to src/tim/prune/gui/map/MemTileCacher.java diff --git a/tim/prune/gui/map/MffMapSource.java b/src/tim/prune/gui/map/MffMapSource.java similarity index 100% rename from tim/prune/gui/map/MffMapSource.java rename to src/tim/prune/gui/map/MffMapSource.java diff --git a/tim/prune/gui/map/OsmMapSource.java b/src/tim/prune/gui/map/OsmMapSource.java similarity index 81% rename from tim/prune/gui/map/OsmMapSource.java rename to src/tim/prune/gui/map/OsmMapSource.java index 925fcf6..e3fe589 100644 --- a/tim/prune/gui/map/OsmMapSource.java +++ b/src/tim/prune/gui/map/OsmMapSource.java @@ -152,12 +152,31 @@ public class OsmMapSource extends MapSource /** * Make the URL to get the specified tile + * @param inLayerNum layer number + * @param inZoom zoom level + * @param inX x coordinate + * @param inY y coordinate + * @return relative file path as String */ public String makeURL(int inLayerNum, int inZoom, int inX, int inY) { // Check if the base url has a [1234], if so replace at random - StringBuffer url = new StringBuffer(); - url.append(pickServerUrl(_baseUrls[inLayerNum])); + String baseUrl = pickServerUrl(_baseUrls[inLayerNum]); + return makeUrl(baseUrl, inLayerNum, inZoom, inX, inY); + } + + public String makeUrl(String baseUrl, int inLayerNum, int inZoom, int inX, int inY) + { + // If the base URL has {x}/{y} placeholders, use them + if (baseUrl.contains("{x}")) { + baseUrl = baseUrl.replace("{z}", Integer.toString(inZoom)) + .replace("{x}", Integer.toString(inX)) + .replace("{y}", Integer.toString(inY)); + return baseUrl; + } + + // Else simply append the tile indices and file extension + StringBuffer url = new StringBuffer(baseUrl); url.append(inZoom).append('/').append(inX).append('/').append(inY); url.append('.').append(getFileExtension(inLayerNum)); if (_apiKey != null) @@ -167,6 +186,26 @@ public class OsmMapSource extends MapSource return url.toString(); } + /** + * Make a relative file path from the base directory including site name + * @param inLayerNum layer number + * @param inZoom zoom level + * @param inX x coordinate + * @param inY y coordinate + * @return relative file path as String + */ + public String makeFilePath(int inLayerNum, int inZoom, int inX, int inY) + { + String siteName = getSiteName(inLayerNum); + String filePath = makeUrl(siteName, inLayerNum, inZoom, inX, inY); + int indexParam = filePath.indexOf("?"); + if (indexParam > 0) + { + filePath = filePath.substring(0, indexParam); + } + return filePath; + } + /** * @return maximum zoom level */ diff --git a/tim/prune/gui/map/OverlayPanel.java b/src/tim/prune/gui/map/OverlayPanel.java similarity index 100% rename from tim/prune/gui/map/OverlayPanel.java rename to src/tim/prune/gui/map/OverlayPanel.java diff --git a/tim/prune/gui/map/ScaleBar.java b/src/tim/prune/gui/map/ScaleBar.java similarity index 100% rename from tim/prune/gui/map/ScaleBar.java rename to src/tim/prune/gui/map/ScaleBar.java diff --git a/tim/prune/gui/map/TileConsumer.java b/src/tim/prune/gui/map/TileConsumer.java similarity index 100% rename from tim/prune/gui/map/TileConsumer.java rename to src/tim/prune/gui/map/TileConsumer.java diff --git a/tim/prune/gui/map/TileDownloader.java b/src/tim/prune/gui/map/TileDownloader.java similarity index 100% rename from tim/prune/gui/map/TileDownloader.java rename to src/tim/prune/gui/map/TileDownloader.java diff --git a/tim/prune/gui/map/WpIconDefinition.java b/src/tim/prune/gui/map/WpIconDefinition.java similarity index 100% rename from tim/prune/gui/map/WpIconDefinition.java rename to src/tim/prune/gui/map/WpIconDefinition.java diff --git a/tim/prune/gui/map/WpIconLibrary.java b/src/tim/prune/gui/map/WpIconLibrary.java similarity index 100% rename from tim/prune/gui/map/WpIconLibrary.java rename to src/tim/prune/gui/map/WpIconLibrary.java diff --git a/tim/prune/gui/profile/AltitudeData.java b/src/tim/prune/gui/profile/AltitudeData.java similarity index 100% rename from tim/prune/gui/profile/AltitudeData.java rename to src/tim/prune/gui/profile/AltitudeData.java diff --git a/tim/prune/gui/profile/ArbitraryData.java b/src/tim/prune/gui/profile/ArbitraryData.java similarity index 100% rename from tim/prune/gui/profile/ArbitraryData.java rename to src/tim/prune/gui/profile/ArbitraryData.java diff --git a/tim/prune/gui/profile/GradientData.java b/src/tim/prune/gui/profile/GradientData.java similarity index 100% rename from tim/prune/gui/profile/GradientData.java rename to src/tim/prune/gui/profile/GradientData.java diff --git a/tim/prune/gui/profile/ProfileChart.java b/src/tim/prune/gui/profile/ProfileChart.java similarity index 100% rename from tim/prune/gui/profile/ProfileChart.java rename to src/tim/prune/gui/profile/ProfileChart.java diff --git a/tim/prune/gui/profile/ProfileData.java b/src/tim/prune/gui/profile/ProfileData.java similarity index 100% rename from tim/prune/gui/profile/ProfileData.java rename to src/tim/prune/gui/profile/ProfileData.java diff --git a/tim/prune/gui/profile/SpeedData.java b/src/tim/prune/gui/profile/SpeedData.java similarity index 100% rename from tim/prune/gui/profile/SpeedData.java rename to src/tim/prune/gui/profile/SpeedData.java diff --git a/tim/prune/gui/profile/VerticalSpeedData.java b/src/tim/prune/gui/profile/VerticalSpeedData.java similarity index 100% rename from tim/prune/gui/profile/VerticalSpeedData.java rename to src/tim/prune/gui/profile/VerticalSpeedData.java diff --git a/tim/prune/jpeg/InternalExifLibrary.java b/src/tim/prune/jpeg/InternalExifLibrary.java similarity index 100% rename from tim/prune/jpeg/InternalExifLibrary.java rename to src/tim/prune/jpeg/InternalExifLibrary.java diff --git a/tim/prune/jpeg/JpegData.java b/src/tim/prune/jpeg/JpegData.java similarity index 100% rename from tim/prune/jpeg/JpegData.java rename to src/tim/prune/jpeg/JpegData.java diff --git a/tim/prune/jpeg/drew/ByteArrayReader.java b/src/tim/prune/jpeg/drew/ByteArrayReader.java similarity index 100% rename from tim/prune/jpeg/drew/ByteArrayReader.java rename to src/tim/prune/jpeg/drew/ByteArrayReader.java diff --git a/tim/prune/jpeg/drew/ExifException.java b/src/tim/prune/jpeg/drew/ExifException.java similarity index 100% rename from tim/prune/jpeg/drew/ExifException.java rename to src/tim/prune/jpeg/drew/ExifException.java diff --git a/tim/prune/jpeg/drew/ExifReader.java b/src/tim/prune/jpeg/drew/ExifReader.java similarity index 100% rename from tim/prune/jpeg/drew/ExifReader.java rename to src/tim/prune/jpeg/drew/ExifReader.java diff --git a/tim/prune/jpeg/drew/ExifTiffHandler.java b/src/tim/prune/jpeg/drew/ExifTiffHandler.java similarity index 100% rename from tim/prune/jpeg/drew/ExifTiffHandler.java rename to src/tim/prune/jpeg/drew/ExifTiffHandler.java diff --git a/tim/prune/jpeg/drew/Rational.java b/src/tim/prune/jpeg/drew/Rational.java similarity index 100% rename from tim/prune/jpeg/drew/Rational.java rename to src/tim/prune/jpeg/drew/Rational.java diff --git a/tim/prune/jpeg/drew/TiffDataFormat.java b/src/tim/prune/jpeg/drew/TiffDataFormat.java similarity index 100% rename from tim/prune/jpeg/drew/TiffDataFormat.java rename to src/tim/prune/jpeg/drew/TiffDataFormat.java diff --git a/tim/prune/jpeg/drew/TiffProcessor.java b/src/tim/prune/jpeg/drew/TiffProcessor.java similarity index 100% rename from tim/prune/jpeg/drew/TiffProcessor.java rename to src/tim/prune/jpeg/drew/TiffProcessor.java diff --git a/tim/prune/lang/prune-texts_af.properties b/src/tim/prune/lang/prune-texts_af.properties similarity index 100% rename from tim/prune/lang/prune-texts_af.properties rename to src/tim/prune/lang/prune-texts_af.properties diff --git a/tim/prune/lang/prune-texts_cz.properties b/src/tim/prune/lang/prune-texts_cz.properties similarity index 100% rename from tim/prune/lang/prune-texts_cz.properties rename to src/tim/prune/lang/prune-texts_cz.properties diff --git a/tim/prune/lang/prune-texts_da.properties b/src/tim/prune/lang/prune-texts_da.properties similarity index 100% rename from tim/prune/lang/prune-texts_da.properties rename to src/tim/prune/lang/prune-texts_da.properties diff --git a/tim/prune/lang/prune-texts_de.properties b/src/tim/prune/lang/prune-texts_de.properties similarity index 100% rename from tim/prune/lang/prune-texts_de.properties rename to src/tim/prune/lang/prune-texts_de.properties diff --git a/tim/prune/lang/prune-texts_de_CH.properties b/src/tim/prune/lang/prune-texts_de_CH.properties similarity index 100% rename from tim/prune/lang/prune-texts_de_CH.properties rename to src/tim/prune/lang/prune-texts_de_CH.properties diff --git a/tim/prune/lang/prune-texts_en.properties b/src/tim/prune/lang/prune-texts_en.properties similarity index 97% rename from tim/prune/lang/prune-texts_en.properties rename to src/tim/prune/lang/prune-texts_en.properties index 7693926..82219b2 100644 --- a/tim/prune/lang/prune-texts_en.properties +++ b/src/tim/prune/lang/prune-texts_en.properties @@ -94,6 +94,7 @@ function.interpolate=Interpolate points function.deletebydate=Delete points by date function.addtimeoffset=Add time offset function.addaltitudeoffset=Add altitude offset +function.removealtitudes=Remove altitudes function.findwaypoint=Find waypoint function.rearrangewaypoints=Rearrange waypoints function.convertnamestotimes=Convert waypoint names to times @@ -114,6 +115,9 @@ function.getgpsies=Get Gpsies tracks function.uploadgpsies=Upload track to Gpsies function.lookupsrtm=Get altitudes from SRTM function.downloadsrtm=Download SRTM tiles +function.downloadsrtm.SRTMGL1_v003=Download SRTM 1 arc-second tiles +function.downloadsrtm.SRTMGL1_v003.needsetup=An Earthdata account is necessary to download SRTM 1 arc-second tiles +function.downloadsrtm.SRTM3_v21=Download SRTM 3 arc-second tiles function.getwikipedia=Get nearby Wikipedia articles function.searchwikipedianames=Search Wikipedia by name function.searchosmpois=Get nearby OSM points @@ -150,6 +154,7 @@ function.managetilecache=Manage tile cache function.getweatherforecast=Get weather forecast function.setaltitudetolerance=Set altitude tolerance function.selecttimezone=Set timezone +function.setearthdataauthentication=Set Earthdata authentication # Dialogs dialog.exit.confirm.title=Exit GpsPrune @@ -575,6 +580,11 @@ dialog.displaysettings.size.small=Small dialog.displaysettings.size.medium=Medium dialog.displaysettings.size.large=Large dialog.downloadosm.desc=Confirm to download the raw OSM data for the specified area: +dialog.earthdataauth.intro=

Configure username and password to access your NASA Earthdata login account.

Create an account at https://urs.earthdata.nasa.gov/users/new.

+dialog.earthdataauth.user=Username +dialog.earthdataauth.password=Password +dialog.earthdataauth.authaccepted=Username and password accepted +dialog.earthdataauth.authrejected=Username and password rejected dialog.searchwikipedianames.search=Search for: dialog.weather.location=Location dialog.weather.update=Forecast updated @@ -632,6 +642,7 @@ confirm.mergetracksegments=Track segments merged confirm.reverserange=Range reversed confirm.addtimeoffset=Time offset added confirm.addaltitudeoffset=Altitude offset added +confirm.removealtitudes=Altitudes removed confirm.rearrangewaypoints=Waypoints rearranged confirm.rearrangephotos=Photos rearranged confirm.splitsegments=%d segment splits were made @@ -852,6 +863,7 @@ undo.splitsegments=split track segments undo.sewsegments=sew track segments undo.addtimeoffset=add time offset undo.addaltitudeoffset=add altitude offset +undo.removealtitudes=remove altitudes undo.rearrangewaypoints=rearrange waypoints undo.cutandmove=move section undo.connect=connect diff --git a/tim/prune/lang/prune-texts_en_US.properties b/src/tim/prune/lang/prune-texts_en_US.properties similarity index 100% rename from tim/prune/lang/prune-texts_en_US.properties rename to src/tim/prune/lang/prune-texts_en_US.properties diff --git a/tim/prune/lang/prune-texts_es.properties b/src/tim/prune/lang/prune-texts_es.properties similarity index 100% rename from tim/prune/lang/prune-texts_es.properties rename to src/tim/prune/lang/prune-texts_es.properties diff --git a/tim/prune/lang/prune-texts_fa.properties b/src/tim/prune/lang/prune-texts_fa.properties similarity index 100% rename from tim/prune/lang/prune-texts_fa.properties rename to src/tim/prune/lang/prune-texts_fa.properties diff --git a/tim/prune/lang/prune-texts_fi.properties b/src/tim/prune/lang/prune-texts_fi.properties similarity index 100% rename from tim/prune/lang/prune-texts_fi.properties rename to src/tim/prune/lang/prune-texts_fi.properties diff --git a/tim/prune/lang/prune-texts_fr.properties b/src/tim/prune/lang/prune-texts_fr.properties similarity index 100% rename from tim/prune/lang/prune-texts_fr.properties rename to src/tim/prune/lang/prune-texts_fr.properties diff --git a/tim/prune/lang/prune-texts_hu.properties b/src/tim/prune/lang/prune-texts_hu.properties similarity index 100% rename from tim/prune/lang/prune-texts_hu.properties rename to src/tim/prune/lang/prune-texts_hu.properties diff --git a/tim/prune/lang/prune-texts_in.properties b/src/tim/prune/lang/prune-texts_in.properties similarity index 100% rename from tim/prune/lang/prune-texts_in.properties rename to src/tim/prune/lang/prune-texts_in.properties diff --git a/tim/prune/lang/prune-texts_it.properties b/src/tim/prune/lang/prune-texts_it.properties similarity index 100% rename from tim/prune/lang/prune-texts_it.properties rename to src/tim/prune/lang/prune-texts_it.properties diff --git a/tim/prune/lang/prune-texts_ja.properties b/src/tim/prune/lang/prune-texts_ja.properties similarity index 100% rename from tim/prune/lang/prune-texts_ja.properties rename to src/tim/prune/lang/prune-texts_ja.properties diff --git a/tim/prune/lang/prune-texts_ko.properties b/src/tim/prune/lang/prune-texts_ko.properties similarity index 100% rename from tim/prune/lang/prune-texts_ko.properties rename to src/tim/prune/lang/prune-texts_ko.properties diff --git a/tim/prune/lang/prune-texts_nl.properties b/src/tim/prune/lang/prune-texts_nl.properties similarity index 100% rename from tim/prune/lang/prune-texts_nl.properties rename to src/tim/prune/lang/prune-texts_nl.properties diff --git a/tim/prune/lang/prune-texts_no.properties b/src/tim/prune/lang/prune-texts_no.properties similarity index 100% rename from tim/prune/lang/prune-texts_no.properties rename to src/tim/prune/lang/prune-texts_no.properties diff --git a/tim/prune/lang/prune-texts_pl.properties b/src/tim/prune/lang/prune-texts_pl.properties similarity index 100% rename from tim/prune/lang/prune-texts_pl.properties rename to src/tim/prune/lang/prune-texts_pl.properties diff --git a/tim/prune/lang/prune-texts_pt.properties b/src/tim/prune/lang/prune-texts_pt.properties similarity index 100% rename from tim/prune/lang/prune-texts_pt.properties rename to src/tim/prune/lang/prune-texts_pt.properties diff --git a/tim/prune/lang/prune-texts_ro.properties b/src/tim/prune/lang/prune-texts_ro.properties similarity index 100% rename from tim/prune/lang/prune-texts_ro.properties rename to src/tim/prune/lang/prune-texts_ro.properties diff --git a/tim/prune/lang/prune-texts_ru.properties b/src/tim/prune/lang/prune-texts_ru.properties similarity index 100% rename from tim/prune/lang/prune-texts_ru.properties rename to src/tim/prune/lang/prune-texts_ru.properties diff --git a/tim/prune/lang/prune-texts_sv.properties b/src/tim/prune/lang/prune-texts_sv.properties similarity index 100% rename from tim/prune/lang/prune-texts_sv.properties rename to src/tim/prune/lang/prune-texts_sv.properties diff --git a/tim/prune/lang/prune-texts_tr.properties b/src/tim/prune/lang/prune-texts_tr.properties similarity index 100% rename from tim/prune/lang/prune-texts_tr.properties rename to src/tim/prune/lang/prune-texts_tr.properties diff --git a/tim/prune/lang/prune-texts_uk.properties b/src/tim/prune/lang/prune-texts_uk.properties similarity index 100% rename from tim/prune/lang/prune-texts_uk.properties rename to src/tim/prune/lang/prune-texts_uk.properties diff --git a/tim/prune/lang/prune-texts_zh.properties b/src/tim/prune/lang/prune-texts_zh.properties similarity index 100% rename from tim/prune/lang/prune-texts_zh.properties rename to src/tim/prune/lang/prune-texts_zh.properties diff --git a/tim/prune/license.txt b/src/tim/prune/license.txt similarity index 100% rename from tim/prune/license.txt rename to src/tim/prune/license.txt diff --git a/tim/prune/load/AudioFileFilter.java b/src/tim/prune/load/AudioFileFilter.java similarity index 100% rename from tim/prune/load/AudioFileFilter.java rename to src/tim/prune/load/AudioFileFilter.java diff --git a/tim/prune/load/AudioLoader.java b/src/tim/prune/load/AudioLoader.java similarity index 100% rename from tim/prune/load/AudioLoader.java rename to src/tim/prune/load/AudioLoader.java diff --git a/tim/prune/load/BabelFileFormats.java b/src/tim/prune/load/BabelFileFormats.java similarity index 100% rename from tim/prune/load/BabelFileFormats.java rename to src/tim/prune/load/BabelFileFormats.java diff --git a/tim/prune/load/BabelLoadFromFile.java b/src/tim/prune/load/BabelLoadFromFile.java similarity index 100% rename from tim/prune/load/BabelLoadFromFile.java rename to src/tim/prune/load/BabelLoadFromFile.java diff --git a/tim/prune/load/BabelLoadFromGps.java b/src/tim/prune/load/BabelLoadFromGps.java similarity index 100% rename from tim/prune/load/BabelLoadFromGps.java rename to src/tim/prune/load/BabelLoadFromGps.java diff --git a/tim/prune/load/BabelLoader.java b/src/tim/prune/load/BabelLoader.java similarity index 100% rename from tim/prune/load/BabelLoader.java rename to src/tim/prune/load/BabelLoader.java diff --git a/tim/prune/load/ByteScooper.java b/src/tim/prune/load/ByteScooper.java similarity index 100% rename from tim/prune/load/ByteScooper.java rename to src/tim/prune/load/ByteScooper.java diff --git a/tim/prune/load/ComponentHider.java b/src/tim/prune/load/ComponentHider.java similarity index 100% rename from tim/prune/load/ComponentHider.java rename to src/tim/prune/load/ComponentHider.java diff --git a/tim/prune/load/DelimiterInfo.java b/src/tim/prune/load/DelimiterInfo.java similarity index 100% rename from tim/prune/load/DelimiterInfo.java rename to src/tim/prune/load/DelimiterInfo.java diff --git a/tim/prune/load/FieldGuesser.java b/src/tim/prune/load/FieldGuesser.java similarity index 100% rename from tim/prune/load/FieldGuesser.java rename to src/tim/prune/load/FieldGuesser.java diff --git a/tim/prune/load/FieldSelectionTableModel.java b/src/tim/prune/load/FieldSelectionTableModel.java similarity index 100% rename from tim/prune/load/FieldSelectionTableModel.java rename to src/tim/prune/load/FieldSelectionTableModel.java diff --git a/tim/prune/load/FileCacher.java b/src/tim/prune/load/FileCacher.java similarity index 100% rename from tim/prune/load/FileCacher.java rename to src/tim/prune/load/FileCacher.java diff --git a/tim/prune/load/FileExtractTableModel.java b/src/tim/prune/load/FileExtractTableModel.java similarity index 100% rename from tim/prune/load/FileExtractTableModel.java rename to src/tim/prune/load/FileExtractTableModel.java diff --git a/tim/prune/load/FileLoader.java b/src/tim/prune/load/FileLoader.java similarity index 100% rename from tim/prune/load/FileLoader.java rename to src/tim/prune/load/FileLoader.java diff --git a/tim/prune/load/FileSplitter.java b/src/tim/prune/load/FileSplitter.java similarity index 100% rename from tim/prune/load/FileSplitter.java rename to src/tim/prune/load/FileSplitter.java diff --git a/tim/prune/load/GenericFileFilter.java b/src/tim/prune/load/GenericFileFilter.java similarity index 100% rename from tim/prune/load/GenericFileFilter.java rename to src/tim/prune/load/GenericFileFilter.java diff --git a/tim/prune/load/JpegFileFilter.java b/src/tim/prune/load/JpegFileFilter.java similarity index 100% rename from tim/prune/load/JpegFileFilter.java rename to src/tim/prune/load/JpegFileFilter.java diff --git a/tim/prune/load/JpegLoader.java b/src/tim/prune/load/JpegLoader.java similarity index 100% rename from tim/prune/load/JpegLoader.java rename to src/tim/prune/load/JpegLoader.java diff --git a/tim/prune/load/MediaHelper.java b/src/tim/prune/load/MediaHelper.java similarity index 100% rename from tim/prune/load/MediaHelper.java rename to src/tim/prune/load/MediaHelper.java diff --git a/tim/prune/load/MediaLinkInfo.java b/src/tim/prune/load/MediaLinkInfo.java similarity index 100% rename from tim/prune/load/MediaLinkInfo.java rename to src/tim/prune/load/MediaLinkInfo.java diff --git a/tim/prune/load/MediaLoadProgressDialog.java b/src/tim/prune/load/MediaLoadProgressDialog.java similarity index 100% rename from tim/prune/load/MediaLoadProgressDialog.java rename to src/tim/prune/load/MediaLoadProgressDialog.java diff --git a/tim/prune/load/MediaSorter.java b/src/tim/prune/load/MediaSorter.java similarity index 100% rename from tim/prune/load/MediaSorter.java rename to src/tim/prune/load/MediaSorter.java diff --git a/tim/prune/load/NmeaFileLoader.java b/src/tim/prune/load/NmeaFileLoader.java similarity index 100% rename from tim/prune/load/NmeaFileLoader.java rename to src/tim/prune/load/NmeaFileLoader.java diff --git a/tim/prune/load/NmeaMessage.java b/src/tim/prune/load/NmeaMessage.java similarity index 100% rename from tim/prune/load/NmeaMessage.java rename to src/tim/prune/load/NmeaMessage.java diff --git a/tim/prune/load/OneCharDocument.java b/src/tim/prune/load/OneCharDocument.java similarity index 100% rename from tim/prune/load/OneCharDocument.java rename to src/tim/prune/load/OneCharDocument.java diff --git a/tim/prune/load/TextFileLoader.java b/src/tim/prune/load/TextFileLoader.java similarity index 100% rename from tim/prune/load/TextFileLoader.java rename to src/tim/prune/load/TextFileLoader.java diff --git a/tim/prune/load/TrackNameList.java b/src/tim/prune/load/TrackNameList.java similarity index 100% rename from tim/prune/load/TrackNameList.java rename to src/tim/prune/load/TrackNameList.java diff --git a/tim/prune/load/babel/AddFilterDialog.java b/src/tim/prune/load/babel/AddFilterDialog.java similarity index 100% rename from tim/prune/load/babel/AddFilterDialog.java rename to src/tim/prune/load/babel/AddFilterDialog.java diff --git a/tim/prune/load/babel/BabelFilterPanel.java b/src/tim/prune/load/babel/BabelFilterPanel.java similarity index 100% rename from tim/prune/load/babel/BabelFilterPanel.java rename to src/tim/prune/load/babel/BabelFilterPanel.java diff --git a/tim/prune/load/babel/DiscardFilter.java b/src/tim/prune/load/babel/DiscardFilter.java similarity index 100% rename from tim/prune/load/babel/DiscardFilter.java rename to src/tim/prune/load/babel/DiscardFilter.java diff --git a/tim/prune/load/babel/DistanceFilter.java b/src/tim/prune/load/babel/DistanceFilter.java similarity index 100% rename from tim/prune/load/babel/DistanceFilter.java rename to src/tim/prune/load/babel/DistanceFilter.java diff --git a/tim/prune/load/babel/FilterDefinition.java b/src/tim/prune/load/babel/FilterDefinition.java similarity index 100% rename from tim/prune/load/babel/FilterDefinition.java rename to src/tim/prune/load/babel/FilterDefinition.java diff --git a/tim/prune/load/babel/InterpolateFilter.java b/src/tim/prune/load/babel/InterpolateFilter.java similarity index 100% rename from tim/prune/load/babel/InterpolateFilter.java rename to src/tim/prune/load/babel/InterpolateFilter.java diff --git a/tim/prune/load/babel/SimplifyFilter.java b/src/tim/prune/load/babel/SimplifyFilter.java similarity index 100% rename from tim/prune/load/babel/SimplifyFilter.java rename to src/tim/prune/load/babel/SimplifyFilter.java diff --git a/tim/prune/load/xml/GpxHandler.java b/src/tim/prune/load/xml/GpxHandler.java similarity index 100% rename from tim/prune/load/xml/GpxHandler.java rename to src/tim/prune/load/xml/GpxHandler.java diff --git a/tim/prune/load/xml/GpxTag.java b/src/tim/prune/load/xml/GpxTag.java similarity index 100% rename from tim/prune/load/xml/GpxTag.java rename to src/tim/prune/load/xml/GpxTag.java diff --git a/tim/prune/load/xml/GzipFileLoader.java b/src/tim/prune/load/xml/GzipFileLoader.java similarity index 100% rename from tim/prune/load/xml/GzipFileLoader.java rename to src/tim/prune/load/xml/GzipFileLoader.java diff --git a/tim/prune/load/xml/KmlHandler.java b/src/tim/prune/load/xml/KmlHandler.java similarity index 100% rename from tim/prune/load/xml/KmlHandler.java rename to src/tim/prune/load/xml/KmlHandler.java diff --git a/tim/prune/load/xml/XmlFileLoader.java b/src/tim/prune/load/xml/XmlFileLoader.java similarity index 100% rename from tim/prune/load/xml/XmlFileLoader.java rename to src/tim/prune/load/xml/XmlFileLoader.java diff --git a/tim/prune/load/xml/XmlHandler.java b/src/tim/prune/load/xml/XmlHandler.java similarity index 100% rename from tim/prune/load/xml/XmlHandler.java rename to src/tim/prune/load/xml/XmlHandler.java diff --git a/tim/prune/load/xml/ZipFileLoader.java b/src/tim/prune/load/xml/ZipFileLoader.java similarity index 100% rename from tim/prune/load/xml/ZipFileLoader.java rename to src/tim/prune/load/xml/ZipFileLoader.java diff --git a/tim/prune/readme.txt b/src/tim/prune/readme.txt similarity index 100% rename from tim/prune/readme.txt rename to src/tim/prune/readme.txt diff --git a/tim/prune/save/BaseImageConfigDialog.java b/src/tim/prune/save/BaseImageConfigDialog.java similarity index 100% rename from tim/prune/save/BaseImageConfigDialog.java rename to src/tim/prune/save/BaseImageConfigDialog.java diff --git a/tim/prune/save/BaseImageConsumer.java b/src/tim/prune/save/BaseImageConsumer.java similarity index 100% rename from tim/prune/save/BaseImageConsumer.java rename to src/tim/prune/save/BaseImageConsumer.java diff --git a/tim/prune/save/ExifSaver.java b/src/tim/prune/save/ExifSaver.java similarity index 100% rename from tim/prune/save/ExifSaver.java rename to src/tim/prune/save/ExifSaver.java diff --git a/tim/prune/save/FieldInfo.java b/src/tim/prune/save/FieldInfo.java similarity index 100% rename from tim/prune/save/FieldInfo.java rename to src/tim/prune/save/FieldInfo.java diff --git a/tim/prune/save/FieldSelectionTableModel.java b/src/tim/prune/save/FieldSelectionTableModel.java similarity index 100% rename from tim/prune/save/FieldSelectionTableModel.java rename to src/tim/prune/save/FieldSelectionTableModel.java diff --git a/tim/prune/save/FileSaver.java b/src/tim/prune/save/FileSaver.java similarity index 100% rename from tim/prune/save/FileSaver.java rename to src/tim/prune/save/FileSaver.java diff --git a/tim/prune/save/GpsSaver.java b/src/tim/prune/save/GpsSaver.java similarity index 100% rename from tim/prune/save/GpsSaver.java rename to src/tim/prune/save/GpsSaver.java diff --git a/tim/prune/save/GpxExporter.java b/src/tim/prune/save/GpxExporter.java similarity index 100% rename from tim/prune/save/GpxExporter.java rename to src/tim/prune/save/GpxExporter.java diff --git a/tim/prune/save/GroutedImage.java b/src/tim/prune/save/GroutedImage.java similarity index 100% rename from tim/prune/save/GroutedImage.java rename to src/tim/prune/save/GroutedImage.java diff --git a/tim/prune/save/ImageExporter.java b/src/tim/prune/save/ImageExporter.java similarity index 100% rename from tim/prune/save/ImageExporter.java rename to src/tim/prune/save/ImageExporter.java diff --git a/tim/prune/save/ImagePreviewPanel.java b/src/tim/prune/save/ImagePreviewPanel.java similarity index 100% rename from tim/prune/save/ImagePreviewPanel.java rename to src/tim/prune/save/ImagePreviewPanel.java diff --git a/tim/prune/save/KmlExporter.java b/src/tim/prune/save/KmlExporter.java similarity index 100% rename from tim/prune/save/KmlExporter.java rename to src/tim/prune/save/KmlExporter.java diff --git a/tim/prune/save/MapGrouter.java b/src/tim/prune/save/MapGrouter.java similarity index 100% rename from tim/prune/save/MapGrouter.java rename to src/tim/prune/save/MapGrouter.java diff --git a/tim/prune/save/ModelSegment.java b/src/tim/prune/save/ModelSegment.java similarity index 100% rename from tim/prune/save/ModelSegment.java rename to src/tim/prune/save/ModelSegment.java diff --git a/tim/prune/save/PhotoTableEntry.java b/src/tim/prune/save/PhotoTableEntry.java similarity index 100% rename from tim/prune/save/PhotoTableEntry.java rename to src/tim/prune/save/PhotoTableEntry.java diff --git a/tim/prune/save/PhotoTableModel.java b/src/tim/prune/save/PhotoTableModel.java similarity index 100% rename from tim/prune/save/PhotoTableModel.java rename to src/tim/prune/save/PhotoTableModel.java diff --git a/tim/prune/save/PointTypeSelector.java b/src/tim/prune/save/PointTypeSelector.java similarity index 100% rename from tim/prune/save/PointTypeSelector.java rename to src/tim/prune/save/PointTypeSelector.java diff --git a/tim/prune/save/PovExporter.java b/src/tim/prune/save/PovExporter.java similarity index 100% rename from tim/prune/save/PovExporter.java rename to src/tim/prune/save/PovExporter.java diff --git a/tim/prune/save/SettingsForExport.java b/src/tim/prune/save/SettingsForExport.java similarity index 100% rename from tim/prune/save/SettingsForExport.java rename to src/tim/prune/save/SettingsForExport.java diff --git a/tim/prune/save/UpDownToggler.java b/src/tim/prune/save/UpDownToggler.java similarity index 100% rename from tim/prune/save/UpDownToggler.java rename to src/tim/prune/save/UpDownToggler.java diff --git a/tim/prune/save/xml/ByteBuffer.java b/src/tim/prune/save/xml/ByteBuffer.java similarity index 100% rename from tim/prune/save/xml/ByteBuffer.java rename to src/tim/prune/save/xml/ByteBuffer.java diff --git a/tim/prune/save/xml/GpxCacher.java b/src/tim/prune/save/xml/GpxCacher.java similarity index 100% rename from tim/prune/save/xml/GpxCacher.java rename to src/tim/prune/save/xml/GpxCacher.java diff --git a/tim/prune/save/xml/GpxCacherList.java b/src/tim/prune/save/xml/GpxCacherList.java similarity index 100% rename from tim/prune/save/xml/GpxCacherList.java rename to src/tim/prune/save/xml/GpxCacherList.java diff --git a/tim/prune/save/xml/GpxSlicer.java b/src/tim/prune/save/xml/GpxSlicer.java similarity index 100% rename from tim/prune/save/xml/GpxSlicer.java rename to src/tim/prune/save/xml/GpxSlicer.java diff --git a/tim/prune/save/xml/TagReceiver.java b/src/tim/prune/save/xml/TagReceiver.java similarity index 100% rename from tim/prune/save/xml/TagReceiver.java rename to src/tim/prune/save/xml/TagReceiver.java diff --git a/tim/prune/save/xml/XmlUtils.java b/src/tim/prune/save/xml/XmlUtils.java similarity index 100% rename from tim/prune/save/xml/XmlUtils.java rename to src/tim/prune/save/xml/XmlUtils.java diff --git a/tim/prune/threedee/ImageDefinition.java b/src/tim/prune/threedee/ImageDefinition.java similarity index 100% rename from tim/prune/threedee/ImageDefinition.java rename to src/tim/prune/threedee/ImageDefinition.java diff --git a/tim/prune/threedee/Java3DWindow.java b/src/tim/prune/threedee/Java3DWindow.java similarity index 100% rename from tim/prune/threedee/Java3DWindow.java rename to src/tim/prune/threedee/Java3DWindow.java diff --git a/tim/prune/threedee/TerrainCache.java b/src/tim/prune/threedee/TerrainCache.java similarity index 100% rename from tim/prune/threedee/TerrainCache.java rename to src/tim/prune/threedee/TerrainCache.java diff --git a/tim/prune/threedee/TerrainDefinition.java b/src/tim/prune/threedee/TerrainDefinition.java similarity index 100% rename from tim/prune/threedee/TerrainDefinition.java rename to src/tim/prune/threedee/TerrainDefinition.java diff --git a/tim/prune/threedee/TerrainHelper.java b/src/tim/prune/threedee/TerrainHelper.java similarity index 100% rename from tim/prune/threedee/TerrainHelper.java rename to src/tim/prune/threedee/TerrainHelper.java diff --git a/tim/prune/threedee/TerrainPatch.java b/src/tim/prune/threedee/TerrainPatch.java similarity index 100% rename from tim/prune/threedee/TerrainPatch.java rename to src/tim/prune/threedee/TerrainPatch.java diff --git a/tim/prune/threedee/ThreeDException.java b/src/tim/prune/threedee/ThreeDException.java similarity index 100% rename from tim/prune/threedee/ThreeDException.java rename to src/tim/prune/threedee/ThreeDException.java diff --git a/tim/prune/threedee/ThreeDModel.java b/src/tim/prune/threedee/ThreeDModel.java similarity index 100% rename from tim/prune/threedee/ThreeDModel.java rename to src/tim/prune/threedee/ThreeDModel.java diff --git a/tim/prune/threedee/ThreeDWindow.java b/src/tim/prune/threedee/ThreeDWindow.java similarity index 100% rename from tim/prune/threedee/ThreeDWindow.java rename to src/tim/prune/threedee/ThreeDWindow.java diff --git a/tim/prune/threedee/WindowFactory.java b/src/tim/prune/threedee/WindowFactory.java similarity index 100% rename from tim/prune/threedee/WindowFactory.java rename to src/tim/prune/threedee/WindowFactory.java diff --git a/tim/prune/tips/TipDefinition.java b/src/tim/prune/tips/TipDefinition.java similarity index 100% rename from tim/prune/tips/TipDefinition.java rename to src/tim/prune/tips/TipDefinition.java diff --git a/tim/prune/tips/TipManager.java b/src/tim/prune/tips/TipManager.java similarity index 100% rename from tim/prune/tips/TipManager.java rename to src/tim/prune/tips/TipManager.java diff --git a/tim/prune/undo/UndoAddAltitudeOffset.java b/src/tim/prune/undo/UndoAddAltitudeOffset.java similarity index 100% rename from tim/prune/undo/UndoAddAltitudeOffset.java rename to src/tim/prune/undo/UndoAddAltitudeOffset.java diff --git a/tim/prune/undo/UndoAddTimeOffset.java b/src/tim/prune/undo/UndoAddTimeOffset.java similarity index 100% rename from tim/prune/undo/UndoAddTimeOffset.java rename to src/tim/prune/undo/UndoAddTimeOffset.java diff --git a/tim/prune/undo/UndoAppendPoints.java b/src/tim/prune/undo/UndoAppendPoints.java similarity index 100% rename from tim/prune/undo/UndoAppendPoints.java rename to src/tim/prune/undo/UndoAppendPoints.java diff --git a/tim/prune/undo/UndoConnectMedia.java b/src/tim/prune/undo/UndoConnectMedia.java similarity index 100% rename from tim/prune/undo/UndoConnectMedia.java rename to src/tim/prune/undo/UndoConnectMedia.java diff --git a/tim/prune/undo/UndoConvertNamesToTimes.java b/src/tim/prune/undo/UndoConvertNamesToTimes.java similarity index 100% rename from tim/prune/undo/UndoConvertNamesToTimes.java rename to src/tim/prune/undo/UndoConvertNamesToTimes.java diff --git a/tim/prune/undo/UndoCorrelateAudios.java b/src/tim/prune/undo/UndoCorrelateAudios.java similarity index 100% rename from tim/prune/undo/UndoCorrelateAudios.java rename to src/tim/prune/undo/UndoCorrelateAudios.java diff --git a/tim/prune/undo/UndoCorrelatePhotos.java b/src/tim/prune/undo/UndoCorrelatePhotos.java similarity index 100% rename from tim/prune/undo/UndoCorrelatePhotos.java rename to src/tim/prune/undo/UndoCorrelatePhotos.java diff --git a/tim/prune/undo/UndoCreatePoint.java b/src/tim/prune/undo/UndoCreatePoint.java similarity index 100% rename from tim/prune/undo/UndoCreatePoint.java rename to src/tim/prune/undo/UndoCreatePoint.java diff --git a/tim/prune/undo/UndoCutAndMove.java b/src/tim/prune/undo/UndoCutAndMove.java similarity index 100% rename from tim/prune/undo/UndoCutAndMove.java rename to src/tim/prune/undo/UndoCutAndMove.java diff --git a/tim/prune/undo/UndoDeleteAudio.java b/src/tim/prune/undo/UndoDeleteAudio.java similarity index 100% rename from tim/prune/undo/UndoDeleteAudio.java rename to src/tim/prune/undo/UndoDeleteAudio.java diff --git a/tim/prune/undo/UndoDeleteFieldValues.java b/src/tim/prune/undo/UndoDeleteFieldValues.java similarity index 100% rename from tim/prune/undo/UndoDeleteFieldValues.java rename to src/tim/prune/undo/UndoDeleteFieldValues.java diff --git a/tim/prune/undo/UndoDeleteMarked.java b/src/tim/prune/undo/UndoDeleteMarked.java similarity index 100% rename from tim/prune/undo/UndoDeleteMarked.java rename to src/tim/prune/undo/UndoDeleteMarked.java diff --git a/tim/prune/undo/UndoDeleteOperation.java b/src/tim/prune/undo/UndoDeleteOperation.java similarity index 100% rename from tim/prune/undo/UndoDeleteOperation.java rename to src/tim/prune/undo/UndoDeleteOperation.java diff --git a/tim/prune/undo/UndoDeletePhoto.java b/src/tim/prune/undo/UndoDeletePhoto.java similarity index 100% rename from tim/prune/undo/UndoDeletePhoto.java rename to src/tim/prune/undo/UndoDeletePhoto.java diff --git a/tim/prune/undo/UndoDeletePoint.java b/src/tim/prune/undo/UndoDeletePoint.java similarity index 100% rename from tim/prune/undo/UndoDeletePoint.java rename to src/tim/prune/undo/UndoDeletePoint.java diff --git a/tim/prune/undo/UndoDeleteRange.java b/src/tim/prune/undo/UndoDeleteRange.java similarity index 100% rename from tim/prune/undo/UndoDeleteRange.java rename to src/tim/prune/undo/UndoDeleteRange.java diff --git a/tim/prune/undo/UndoDisconnectMedia.java b/src/tim/prune/undo/UndoDisconnectMedia.java similarity index 100% rename from tim/prune/undo/UndoDisconnectMedia.java rename to src/tim/prune/undo/UndoDisconnectMedia.java diff --git a/tim/prune/undo/UndoEditPoint.java b/src/tim/prune/undo/UndoEditPoint.java similarity index 100% rename from tim/prune/undo/UndoEditPoint.java rename to src/tim/prune/undo/UndoEditPoint.java diff --git a/tim/prune/undo/UndoException.java b/src/tim/prune/undo/UndoException.java similarity index 100% rename from tim/prune/undo/UndoException.java rename to src/tim/prune/undo/UndoException.java diff --git a/tim/prune/undo/UndoInsert.java b/src/tim/prune/undo/UndoInsert.java similarity index 100% rename from tim/prune/undo/UndoInsert.java rename to src/tim/prune/undo/UndoInsert.java diff --git a/tim/prune/undo/UndoInterpolate.java b/src/tim/prune/undo/UndoInterpolate.java similarity index 100% rename from tim/prune/undo/UndoInterpolate.java rename to src/tim/prune/undo/UndoInterpolate.java diff --git a/tim/prune/undo/UndoLoad.java b/src/tim/prune/undo/UndoLoad.java similarity index 100% rename from tim/prune/undo/UndoLoad.java rename to src/tim/prune/undo/UndoLoad.java diff --git a/tim/prune/undo/UndoLoadAudios.java b/src/tim/prune/undo/UndoLoadAudios.java similarity index 100% rename from tim/prune/undo/UndoLoadAudios.java rename to src/tim/prune/undo/UndoLoadAudios.java diff --git a/tim/prune/undo/UndoLoadPhotos.java b/src/tim/prune/undo/UndoLoadPhotos.java similarity index 100% rename from tim/prune/undo/UndoLoadPhotos.java rename to src/tim/prune/undo/UndoLoadPhotos.java diff --git a/tim/prune/undo/UndoLookupSrtm.java b/src/tim/prune/undo/UndoLookupSrtm.java similarity index 100% rename from tim/prune/undo/UndoLookupSrtm.java rename to src/tim/prune/undo/UndoLookupSrtm.java diff --git a/tim/prune/undo/UndoMergeTrackSegments.java b/src/tim/prune/undo/UndoMergeTrackSegments.java similarity index 100% rename from tim/prune/undo/UndoMergeTrackSegments.java rename to src/tim/prune/undo/UndoMergeTrackSegments.java diff --git a/tim/prune/undo/UndoOperation.java b/src/tim/prune/undo/UndoOperation.java similarity index 100% rename from tim/prune/undo/UndoOperation.java rename to src/tim/prune/undo/UndoOperation.java diff --git a/tim/prune/undo/UndoRearrangePhotos.java b/src/tim/prune/undo/UndoRearrangePhotos.java similarity index 100% rename from tim/prune/undo/UndoRearrangePhotos.java rename to src/tim/prune/undo/UndoRearrangePhotos.java diff --git a/tim/prune/undo/UndoRearrangeWaypoints.java b/src/tim/prune/undo/UndoRearrangeWaypoints.java similarity index 100% rename from tim/prune/undo/UndoRearrangeWaypoints.java rename to src/tim/prune/undo/UndoRearrangeWaypoints.java diff --git a/src/tim/prune/undo/UndoRemoveAltitudes.java b/src/tim/prune/undo/UndoRemoveAltitudes.java new file mode 100644 index 0000000..becf2d7 --- /dev/null +++ b/src/tim/prune/undo/UndoRemoveAltitudes.java @@ -0,0 +1,65 @@ +package tim.prune.undo; + +import tim.prune.I18nManager; +import tim.prune.UpdateMessageBroker; +import tim.prune.data.Altitude; +import tim.prune.data.DataPoint; +import tim.prune.data.TrackInfo; + +/** + * Undo removing (ie: restore the original) altitude from points + */ +public class UndoRemoveAltitudes implements UndoOperation +{ + /** Start index of section */ + private int _startIndex; + /** altitude values before operation */ + private Altitude[] _altitudes; + + + /** + * Constructor + * @param inTrackInfo track info object + */ + public UndoRemoveAltitudes(TrackInfo inTrackInfo, int inStart, int inEnd) + { + _startIndex = inStart; + final int numPoints = inEnd - inStart + 1; + // Make array of cloned altitude objects + _altitudes = new Altitude[numPoints]; + for (int i=0; i inTiles) - { - if (inTiles == null || inTiles.size() < 1) {return null;} - URL[] urls = new URL[inTiles.size()]; - // Read dat file into array - byte[] lookup = readDatFile(); - for (int t=0; t 0) { - try { - urls[t] = new URL(URL_PREFIX + CONTINENTS[dir] + "/" + tile.getTileName()); - } catch (MalformedURLException e) {} // ignore error, url stays null - } - } catch (ArrayIndexOutOfBoundsException e) {} // ignore error, url stays null - } - return urls; - } - - /** - * Read the dat file and get the contents - * @return byte array containing file contents - */ - private static byte[] readDatFile() - { - InputStream in = null; - try - { - // Need absolute path to dat file - in = TileFinder.class.getResourceAsStream("/tim/prune/function/srtm/srtmtiles.dat"); - if (in != null) - { - byte[] buffer = new byte[in.available()]; - in.read(buffer); - in.close(); - return buffer; - } - } - catch (java.io.IOException e) { - System.err.println("Exception trying to read srtmtiles.dat : " + e.getMessage()); - } - finally - { - try { - in.close(); - } - catch (Exception e) {} // ignore - } - return null; - } -}