[Git][debian-gis-team/gpsprune][upstream] New upstream version 19.2

Bas Couwenberg gitlab at salsa.debian.org
Sat Dec 15 09:12:31 GMT 2018


Bas Couwenberg pushed to branch upstream at Debian GIS Project / gpsprune


Commits:
24d18ba0 by Bas Couwenberg at 2018-12-15T08:55:29Z
New upstream version 19.2
- - - - -


22 changed files:

- build.sh
- tim/prune/GpsPrune.java
- tim/prune/config/Config.java
- tim/prune/data/AltitudeRange.java
- tim/prune/data/FileInfo.java
- tim/prune/data/RangeStats.java
- tim/prune/data/SourceInfo.java
- tim/prune/data/TimestampLocal.java
- tim/prune/data/TrackInfo.java
- tim/prune/gui/map/MapCanvas.java
- tim/prune/gui/map/MapSource.java
- tim/prune/gui/map/MapSourceLibrary.java
- tim/prune/lang/prune-texts_fi.properties
- tim/prune/lang/prune-texts_pl.properties
- tim/prune/lang/prune-texts_sv.properties
- tim/prune/load/xml/GpxHandler.java
- tim/prune/load/xml/XmlFileLoader.java
- tim/prune/load/xml/XmlHandler.java
- tim/prune/readme.txt
- tim/prune/save/GpxExporter.java
- tim/prune/save/PovExporter.java
- tim/prune/threedee/Java3DWindow.java


Changes:

=====================================
build.sh
=====================================
@@ -1,6 +1,6 @@
 # Build script
 # Version number
-PRUNENAME=gpsprune_19.1
+PRUNENAME=gpsprune_19.2
 # remove compile directory
 rm -rf compile
 # remove dist directory


=====================================
tim/prune/GpsPrune.java
=====================================
@@ -1,14 +1,14 @@
 package tim.prune;
 
-import java.awt.event.WindowAdapter;
 import java.awt.BorderLayout;
 import java.awt.Component;
 import java.awt.Image;
+import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.io.File;
 import java.io.FileNotFoundException;
-import java.util.Locale;
 import java.util.ArrayList;
+import java.util.Locale;
 import javax.swing.JFrame;
 import javax.swing.JSplitPane;
 import javax.swing.JToolBar;
@@ -17,10 +17,10 @@ import javax.swing.WindowConstants;
 import tim.prune.config.Config;
 import tim.prune.config.ConfigException;
 import tim.prune.gui.DetailsDisplay;
-import tim.prune.gui.SidebarController;
 import tim.prune.gui.IconManager;
 import tim.prune.gui.MenuManager;
 import tim.prune.gui.SelectorDisplay;
+import tim.prune.gui.SidebarController;
 import tim.prune.gui.StatusBar;
 import tim.prune.gui.Viewport;
 import tim.prune.gui.map.MapCanvas;
@@ -36,9 +36,9 @@ import tim.prune.gui.profile.ProfileChart;
 public class GpsPrune
 {
 	/** Version number of application, used in about screen and for version check */
-	public static final String VERSION_NUMBER = "19.1";
+	public static final String VERSION_NUMBER = "19.2";
 	/** Build number, just used for about screen */
-	public static final String BUILD_NUMBER = "363c";
+	public static final String BUILD_NUMBER = "363d";
 	/** Static reference to App object */
 	private static App APP = null;
 


=====================================
tim/prune/config/Config.java
=====================================
@@ -238,7 +238,9 @@ public abstract class Config
 		return val;
 	}
 
-	/** @return File from which config was loaded (or null) */
+	/**
+	 * @return File from which config was loaded (or null)
+	 */
 	public static File getConfigFile()
 	{
 		return _configFile;


=====================================
tim/prune/data/AltitudeRange.java
=====================================
@@ -126,16 +126,6 @@ public class AltitudeRange
 				_previousValue = altValue;
 				_gotPreviousValue = true;
 			}
-
-//			if (!_empty)
-//			{
-//				if (altValue > _previousValue)
-//					_climb += (altValue - _previousValue);
-//				else
-//					_descent += (_previousValue - altValue);
-//			}
-//			_previousValue = altValue;
-//			_empty = false;
 		}
 	}
 


=====================================
tim/prune/data/FileInfo.java
=====================================
@@ -68,16 +68,18 @@ public class FileInfo
 	 */
 	public String getFilename()
 	{
-		if (getNumFiles() == 1)
+		if (getNumFiles() == 1) {
 			return _sources.get(0).getName();
+		}
 		return "";
 	}
 
 	/**
-	 * @param inIndex index number
+	 * @param inIndex index number, starting from zero
 	 * @return source info object
 	 */
-	public SourceInfo getSource(int inIndex) {
+	public SourceInfo getSource(int inIndex)
+	{
 		return _sources.get(inIndex);
 	}
 
@@ -88,7 +90,8 @@ public class FileInfo
 	 */
 	public SourceInfo getSourceForPoint(DataPoint inPoint)
 	{
-		for (SourceInfo source : _sources) {
+		for (SourceInfo source : _sources)
+		{
 			if (source.getIndex(inPoint) >= 0) {
 				return source;
 			}
@@ -96,6 +99,43 @@ public class FileInfo
 		return null;
 	}
 
+	/**
+	 * @return the info about the last file loaded, if any
+	 */
+	public SourceInfo getLastFileInfo()
+	{
+		if (getNumFiles() == 0)
+		{
+			return null;
+		}
+		return getSource(getNumFiles()-1);
+	}
+
+	/**
+	 * @return the most recent file title loaded, if any
+	 */
+	public String getLastFileTitle()
+	{
+		final int numFiles = getNumFiles();
+		if (numFiles == 0)
+		{
+			return null;
+		}
+		for (int i=(numFiles-1); i>=0; i--)
+		{
+			SourceInfo info = getSource(i);
+			if (info != null)
+			{
+				String title = info.getFileTitle();
+				if (title != null && !title.equals(""))
+				{
+					return title;
+				}
+			}
+		}
+		return null;
+	}
+
 	/**
 	 * Clone contents of file info
 	 */


=====================================
tim/prune/data/RangeStats.java
=====================================
@@ -21,7 +21,7 @@ public class RangeStats
 	private boolean _timesIncomplete = false;
 	private boolean _timesOutOfSequence = false;
 	private double _totalDistanceRads = 0.0, _movingDistanceRads = 0.0;
-	// Note, maximum speed is not calculated here, use the SpeedData method instead
+	// Note, maximum speed is not calculated here, use the SpeedData class instead
 
 	private static final double STEEP_ANGLE = 0.15; // gradient steeper than 15% counts as steep
 
@@ -50,7 +50,8 @@ public class RangeStats
 	 */
 	private boolean calculateStats(Track inTrack, int inStartIndex, int inEndIndex)
 	{
-		_startIndex = inStartIndex;  _endIndex = inEndIndex;
+		_startIndex = inStartIndex;
+		_endIndex = inEndIndex;
 		_numPoints = inEndIndex - inStartIndex + 1;
 		_totalAltitudeRange  = new AltitudeRange();
 		_movingAltitudeRange = new AltitudeRange();
@@ -70,7 +71,9 @@ public class RangeStats
 			// ignore all waypoints
 			if (p.isWaypoint()) continue;
 
-			if (p.getSegmentStart()) {_numSegments++;}
+			if (p.getSegmentStart()) {
+				_numSegments++;
+			}
 			// Get the distance to the previous track point
 			if (prevPoint != null)
 			{


=====================================
tim/prune/data/SourceInfo.java
=====================================
@@ -17,6 +17,8 @@ public class SourceInfo
 	private String _sourceName = null;
 	/** File type */
 	private FILE_TYPE _fileType = null;
+	/** File title, if any */
+	private String _fileTitle = null;
 
 	/** Array of datapoints */
 	private DataPoint[] _points = null;
@@ -50,6 +52,14 @@ public class SourceInfo
 		_fileType = inType;
 	}
 
+	/**
+	 * @param inTitle title of file, eg from <name> tag in gpx
+	 */
+	public void setFileTitle(String inTitle)
+	{
+		_fileTitle = inTitle;
+	}
+
 	/**
 	 * @return source file
 	 */
@@ -74,6 +84,14 @@ public class SourceInfo
 		return _fileType;
 	}
 
+	/**
+	 * @return title of file
+	 */
+	public String getFileTitle()
+	{
+		return _fileTitle;
+	}
+
 	/**
 	 * @return number of points from this source
 	 */


=====================================
tim/prune/data/TimestampLocal.java
=====================================
@@ -91,14 +91,17 @@ public class TimestampLocal extends Timestamp
 	/**
 	 * Utility method for formatting dates / times
 	 * @param inFormat formatter object
-	 * @param inTimezone timezone to use
+	 * @param inTimezone timezone to use, or null
 	 * @return formatted String
 	 */
 	@Override
 	protected String format(DateFormat inFormat, TimeZone inTimezone)
 	{
 		Calendar cal = getCalendar(inTimezone);
-		inFormat.setTimeZone(inTimezone);
+		if (inTimezone != null)
+		{
+			inFormat.setTimeZone(inTimezone);
+		}
 		return inFormat.format(cal.getTime());
 	}
 }


=====================================
tim/prune/data/TrackInfo.java
=====================================
@@ -306,7 +306,8 @@ public class TrackInfo
 	{
 		boolean firstTrackPoint = true;
 		// Loop between start and end
-		for (int i=inStart; i<=inEnd; i++) {
+		for (int i=inStart; i<=inEnd; i++)
+		{
 			DataPoint point = _track.getPoint(i);
 			// Set all segments to false apart from first track point
 			if (point != null && !point.isWaypoint()) {
@@ -316,7 +317,9 @@ public class TrackInfo
 		}
 		// Find following track point, if any
 		DataPoint nextPoint = _track.getNextTrackPoint(inEnd+1);
-		if (nextPoint != null) {nextPoint.setSegmentStart(true);}
+		if (nextPoint != null) {
+			nextPoint.setSegmentStart(true);
+		}
 		_selection.markInvalid();
 		UpdateMessageBroker.informSubscribers();
 		return true;
@@ -353,8 +356,10 @@ public class TrackInfo
 	public void incrementPointIndex(int inPointIncrement)
 	{
 		int index = _selection.getCurrentPointIndex() + inPointIncrement;
-		if (index < 0) index = 0;
-		else if (index >= _track.getNumPoints()) index = _track.getNumPoints()-1;
+		if (index < 0)
+			index = 0;
+		else if (index >= _track.getNumPoints())
+			index = _track.getNumPoints()-1;
 		selectPoint(index);
 	}
 
@@ -364,7 +369,9 @@ public class TrackInfo
 	 */
 	public void selectPoint(int inPointIndex)
 	{
-		if (_selection.getCurrentPointIndex() == inPointIndex || inPointIndex >= _track.getNumPoints()) {return;}
+		if (_selection.getCurrentPointIndex() == inPointIndex || inPointIndex >= _track.getNumPoints()) {
+			return;
+		}
 		DataPoint selectedPoint = _track.getPoint(inPointIndex);
 		// get the index of the current photo
 		int photoIndex = _selection.getCurrentPhotoIndex();
@@ -397,7 +404,9 @@ public class TrackInfo
 	 */
 	public void selectPhoto(int inPhotoIndex)
 	{
-		if (_selection.getCurrentPhotoIndex() == inPhotoIndex) {return;}
+		if (_selection.getCurrentPhotoIndex() == inPhotoIndex) {
+			return;
+		}
 		// Photo is primary selection here, not as a result of a point selection
 		// Therefore the photo selection takes priority, deselecting point if necessary
 		// Find Photo object
@@ -426,11 +435,13 @@ public class TrackInfo
 		// Has the new point got an audio clip?
 		DataPoint selectedPoint = _track.getPoint(pointIndex);
 		int audioIndex = _selection.getCurrentAudioIndex();
-		if (selectedPoint != null && selectedPoint.getAudio() != null) {
+		if (selectedPoint != null && selectedPoint.getAudio() != null)
+		{
 			// New point has an audio, so select it
 			audioIndex = _audioList.getAudioIndex(selectedPoint.getAudio());
 		}
-		else if (currPoint != null && selectedPoint != currPoint && currPoint.getAudio() != null) {
+		else if (currPoint != null && selectedPoint != currPoint && currPoint.getAudio() != null)
+		{
 			// Old point had an audio, so deselect it
 			audioIndex = -1;
 		}
@@ -444,7 +455,9 @@ public class TrackInfo
 	 */
 	public void selectAudio(int inAudioIndex)
 	{
-		if (_selection.getCurrentAudioIndex() == inAudioIndex) {return;}
+		if (_selection.getCurrentAudioIndex() == inAudioIndex) {
+			return;
+		}
 		// Audio selection takes priority, deselecting point if necessary
 		AudioClip audio = _audioList.getAudio(inAudioIndex);
 		int pointIndex = _selection.getCurrentPointIndex();


=====================================
tim/prune/gui/map/MapCanvas.java
=====================================
@@ -1076,7 +1076,7 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
 	{
 		if (_track != null && _track.getNumPoints() > 0)
 		{
-			 // select point if it's a left-click
+			// select point if it's a left-click
 			if (!inE.isMetaDown())
 			{
 				if (inE.getClickCount() == 1)
@@ -1269,9 +1269,27 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
 	 */
 	public void mouseDragged(MouseEvent inE)
 	{
-		if (!inE.isMetaDown())
+		// Note: One would expect inE.isMetaDown() to give information about whether this is a
+		//       drag with the right mouse button or not - but since java 9 this is buggy,
+		//       so we use the beautifully-named getModifiersEx() instead.
+		//       And logically BUTTON3 refers to the secondary mouse button, not the tertiary one!
+		final boolean isRightDrag = (inE.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) > 0;
+		if (isRightDrag)
+		{
+			// Right-click and drag - update rectangle
+			_drawMode = MODE_ZOOM_RECT;
+			if (_dragFromX == -1) {
+				_dragFromX = inE.getX();
+				_dragFromY = inE.getY();
+			}
+			_dragToX = inE.getX();
+			_dragToY = inE.getY();
+			repaint();
+		}
+		else
 		{
-			// Left mouse drag - either drag the point or pan the map
+			// Left mouse drag - decide whether to drag the point, drag the
+			// marking rectangle or pan the map
 			if (_drawMode == MODE_DRAG_POINT || _drawMode == MODE_CREATE_MIDPOINT)
 			{
 				// move point
@@ -1302,18 +1320,6 @@ public class MapCanvas extends JPanel implements MouseListener, MouseMotionListe
 				_dragFromY = _dragToY = inE.getY();
 			}
 		}
-		else
-		{
-			// Right-click and drag - update rectangle
-			_drawMode = MODE_ZOOM_RECT;
-			if (_dragFromX == -1) {
-				_dragFromX = inE.getX();
-				_dragFromY = inE.getY();
-			}
-			_dragToX = inE.getX();
-			_dragToY = inE.getY();
-			repaint();
-		}
 	}
 
 	/**


=====================================
tim/prune/gui/map/MapSource.java
=====================================
@@ -89,7 +89,7 @@ public abstract class MapSource
 		// check prefix
 		try
 		{
-			urlOk = new URL(urlstr.replace('[', 'w').replace(']', 'w')) != null;
+			urlOk = new URL(urlstr.replace('[', 'w').replace(']', 'w')).toString() != null;
 		}
 		catch (MalformedURLException e)
 		{


=====================================
tim/prune/gui/map/MapSourceLibrary.java
=====================================
@@ -38,14 +38,9 @@ public abstract class MapSourceLibrary
 	 */
 	private static void addFixedSources()
 	{
-		final String THUNDERFOREST_APIKEY = "c32212f10b13496786b98dc6c42e5c3c";
-		_sourceList.add(new OsmMapSource("Mapnik", "http://[abc].tile.openstreetmap.org/"));
-		OsmMapSource cycleSource = new OsmMapSource("OpenCycleMap", "http://[abc].tile.thunderforest.com/cycle/");
-		cycleSource.setApiKey(THUNDERFOREST_APIKEY);
-		_sourceList.add(cycleSource);
-		OsmMapSource outdoorsSource = new OsmMapSource("Outdoors", "http://[abc].tile.thunderforest.com/outdoors/");
-		outdoorsSource.setApiKey(THUNDERFOREST_APIKEY);
-		_sourceList.add(outdoorsSource);
+		_sourceList.add(new OsmMapSource("Mapnik", "https://[abc].tile.openstreetmap.org/"));
+		_sourceList.add(new OsmMapSource("Cycling Trails", "https://[abc].tile.openstreetmap.org/", "png",
+			"https://tile.waymarkedtrails.org/cycling/", "png", 18));
 		_sourceList.add(new OsmMapSource("Reitkarte", "http://topo[234].wanderreitkarte.de/topo/"));
 		_sourceList.add(new MffMapSource("Mapsforfree", "http://maps-for-free.com/layer/relief/", "jpg",
 			"http://maps-for-free.com/layer/water/", "gif", 11));


=====================================
tim/prune/lang/prune-texts_fi.properties
=====================================
@@ -127,7 +127,6 @@ function.rearrangephotos=J\u00e4rjest\u00e4 kuvat...
 function.rotatephotoleft=Kierr\u00e4 kuvaa vasemmalle
 function.rotatephotoright=Kierr\u00e4 kuvaa oikealle
 function.photopopup=N\u00e4yt\u00e4 kuvaikkunassa
-function.ignoreexifthumb=Ignore exif thumbnail
 function.loadaudio=Lis\u00e4\u00e4 \u00e4\u00e4nileikkeet...
 function.removeaudio=Poista \u00e4\u00e4nileike
 function.correlateaudios=Korreloi \u00e4\u00e4net
@@ -205,12 +204,9 @@ dialog.gpsbabel.filter.discard.intro=Hylk\u00e4\u00e4 pisteet, jos
 dialog.gpsbabel.filter.discard.hdop=Hdop >
 dialog.gpsbabel.filter.discard.vdop=Vdop >
 dialog.gpsbabel.filter.discard.numsats=Sateliittien lukum\u00e4\u00e4r\u00e4 <
-dialog.gpsbabel.filter.discard.nofix=Point has no fix
-dialog.gpsbabel.filter.discard.unknownfix=Point has unknown fix
 dialog.gpsbabel.filter.simplify.intro=Poista pisteit\u00e4, kunnes
 dialog.gpsbabel.filter.simplify.maxpoints=Pisteiden m\u00e4\u00e4r\u00e4 <
 dialog.gpsbabel.filter.simplify.maxerror=tai virhev\u00e4limatka <
-dialog.gpsbabel.filter.simplify.crosstrack=cross-track
 dialog.gpsbabel.filter.simplify.length=pituusero
 dialog.gpsbabel.filter.simplify.relative=suhteessa hdop:iin
 dialog.gpsbabel.filter.distance.intro=Poista sellaiset pisteet, jotka l\u00e4hell\u00e4 jotain edellist\u00e4 pistett\u00e4
@@ -275,7 +271,6 @@ dialog.pointtype.track=Reittipisteet
 dialog.pointtype.waypoint=Kohdepisteet
 dialog.pointtype.photo=Kuvien pisteet
 dialog.pointtype.audio=\u00c4\u00e4nien pisteet
-dialog.pointtype.selection=Just selection
 dialog.confirmreversetrack.title=Vahvista k\u00e4\u00e4nteisj\u00e4rjest\u00e4minen
 dialog.confirmreversetrack.text=T\u00e4m\u00e4 reitti sis\u00e4lt\u00e4\u00e4 aikaleimoja, joiden aikaj\u00e4rjestys ei ole oikea pisteiden k\u00e4\u00e4teisj\u00e4rjestelyn j\u00e4lkeen.\nHaluatko varmasti k\u00e4\u00e4nteisj\u00e4rjest\u00e4\u00e4 t\u00e4m\u00e4n alueen?
 dialog.confirmcutandmove.title=Vahvista leikkaa ja siirr\u00e4
@@ -370,7 +365,6 @@ dialog.gpsies.nonefound=Reittej\u00e4 ei l\u00f6ytynyt
 dialog.gpsies.username=Gpsies.com:n k\u00e4ytt\u00e4j\u00e4nimi
 dialog.gpsies.password=Gpsies.com:n salasana
 dialog.gpsies.keepprivate=Pid\u00e4 reitti yksityisen\u00e4
-dialog.gpsies.confirmopenpage=Open the web page for the uploaded track?
 dialog.gpsies.activities=Aktiviteettityypit
 dialog.gpsies.activity.trekking=Patikointi
 dialog.gpsies.activity.walking=K\u00e4vely
@@ -548,12 +542,10 @@ dialog.diskcache.createdir=Luodaanko hakemisto
 dialog.diskcache.nocreate=V\u00e4limuistin hakemistoa ei luotu
 dialog.diskcache.cannotwrite=Karttapaloja ei voida tallentaa valittuun hakemistoon
 dialog.diskcache.table.path=Hakemistoolku
-dialog.diskcache.table.usedby=Used by
 dialog.diskcache.table.zoom=Zoom
 dialog.diskcache.table.tiles=Tiles
 dialog.diskcache.table.megabytes=Megabytes
 dialog.diskcache.tileset=Tileset
-dialog.diskcache.tileset.multiple=multiple
 dialog.diskcache.deleteold=Poista vanhan karttapalat
 dialog.diskcache.maximumage=Enimm\u00e4isik\u00e4 (p\u00e4ivi\u00e4)
 dialog.diskcache.deleteall=Poista kaikki kartapalat
@@ -620,27 +612,9 @@ dialog.3d.altitudefactor=Korkeuden liioittelukerroin
 
 # Confirm messages
 confirm.loadfile=Paikkatieto ladattu tiedostosta
-confirm.save.ok1=Successfully saved
-confirm.save.ok2=points to file
-confirm.deletepoint.single=data point was removed
-confirm.deletepoint.multi=data points were removed
-confirm.point.edit=point edited
-confirm.mergetracksegments=Track segments merged
-confirm.reverserange=Range reversed
-confirm.addtimeoffset=Time offset added
-confirm.addaltitudeoffset=Altitude offset added
 confirm.rearrangewaypoints=Kohdepisteet j\u00e4rjestetty uudelleen
 confirm.rearrangephotos=Kuvat j\u00e4rjestetty uudelleen
-confirm.splitsegments=%d segment splits were made
-confirm.sewsegments=%d segment joins were made
-confirm.cutandmove=Selection moved
-confirm.interpolate=Points added
 confirm.convertnamestotimes=V\u00e4lipisteiden nimet muunnettu
-confirm.saveexif.ok=Saved %d photo files
-confirm.undo.single=operation undone
-confirm.undo.multi=operations undone
-confirm.jpegload.single=photo was added
-confirm.jpegload.multi=photos were added
 confirm.media.connect=media liitetty
 confirm.photo.disconnect=kuva liitt\u00e4m\u00e4t\u00e6n
 confirm.audio.disconnect=\u00e4\u00e4ni liitt\u00e4m\u00e4t\u00e6n
@@ -755,7 +729,6 @@ details.photo.loading=Lataan
 details.photo.bearing=Suunta
 details.media.connected=Liitetty
 details.media.fullpath=Tiedostopolku
-details.audiodetails=Audio details
 details.noaudio=\u00c4\u00e4nileikett\u00e4 ei valittuna
 details.audio.file=\u00c4\u00e4nitiedosto
 details.audio.playing=toistetaan...
@@ -819,9 +792,9 @@ logic.and=ja
 logic.or=tai
 
 # External urls
-url.googlemaps=maps.google.co.uk
-wikipedia.lang=en
-openweathermap.lang=en
+url.googlemaps=maps.google.fi
+wikipedia.lang=fi
+openweathermap.lang=fi
 webservice.peakfinder=Avaa Peakfinder.org
 webservice.geohack=Avaa Geohack-sivu
 
@@ -858,7 +831,6 @@ undo.rearrangephotos=j\u00e4rjest\u00e4 kuvat
 undo.rotatephoto=kierr\u00e4 kuvaa
 undo.createpoint=luo piste
 undo.convertnamestotimes=muunna nimet ajoiksi
-undo.lookupsrtm=lookup altitudes from SRTM
 undo.deletefieldvalues=poista kentt\u00e4arvot
 undo.correlateaudios=korreloi \u00e4\u00e4nileikkeet
 


=====================================
tim/prune/lang/prune-texts_pl.properties
=====================================
@@ -146,6 +146,7 @@ function.diskcache=Zapisz mapy na dysk
 function.managetilecache=Zarz\u0105dzaj keszem p\u0142ytek
 function.getweatherforecast=Pobierz prognoz\u0119 pogody
 function.setaltitudetolerance=Ustaw tolerancj\u0119 wysoko\u015bci
+function.selecttimezone=Ustaw stref\u0119 czasow\u0105
 
 # Dialogs
 dialog.exit.confirm.title=Zako\u0144cz GpsPrune
@@ -383,6 +384,7 @@ dialog.wikipedia.column.name=Tytu\u0142 artyku\u0142u
 dialog.wikipedia.column.distance=Odleg\u0142o\u015b\u0107
 dialog.wikipedia.nonefound=Brak wpis\u00f3w w wikipedii
 dialog.wikipedia.gallery=Galeria
+dialog.osmpois.column.name=Nazwa
 dialog.geocaching.nonefound=Nic nie zosta\u0142o znalezione
 dialog.correlate.notimestamps=Punkty nie maj\u0105 znacznik\u00f3w czasu, nie mo\u017cna ich powi\u0105za\u0107 ze zdj\u0119ciami.
 dialog.correlate.nouncorrelatedphotos=Nie ma nie powi\u0105zanych zdj\u0119\u0107.\nCzy na pewno chcesz kontynuowa\u0107?
@@ -442,7 +444,7 @@ dialog.deletemarked.nonefound=Nie mo\u017cna usun\u0105\u0107 \u017cadnych punkt
 dialog.pastecoordinates.desc=Wprowad\u017a lub wklej wsp\u00f3\u0142rz\u0119dne
 dialog.pastecoordinates.coords=Wsp\u00f3\u0142rz\u0119dne
 dialog.pastecoordinates.nothingfound=Sprawd\u017a wsp\u00f3\u0142rz\u0119dne i spr\u00f3buj jeszcze raz
-dialog.help.help=Na stronie\nhttp://gpsprune.activityworkshop.net/\nznajdziesz wi\u0119cej informacji i porad\noraz mo\u017cliwo\u015b\u0107 kupna podr\u0119cznika u\u017cytkownika w formacie PDF.
+dialog.help.help=Na stronie\nhttps://gpsprune.activityworkshop.net/\nznajdziesz wi\u0119cej informacji i porad\noraz mo\u017cliwo\u015b\u0107 kupna podr\u0119cznika u\u017cytkownika w formacie PDF.
 dialog.about.version=Wersja
 dialog.about.build=Build
 dialog.about.summarytext1=GpsPrune s\u0142u\u017cy do pobierania, wy\u015bwietlania i edycji danych z odbiornik\u00f3w GPS.
@@ -476,7 +478,7 @@ dialog.checkversion.newversion1=Dost\u0119pna jest nowa wersja GpsPrune! Najnows
 dialog.checkversion.newversion2=.
 dialog.checkversion.releasedate1=Nowa wersja zosta\u0142a opublikowana
 dialog.checkversion.releasedate2=.
-dialog.checkversion.download=Aby \u015bci\u0105gn\u0105\u0107 now\u0105 wersj\u0119 przejd\u017a na http://gpsprune.activityworkshop.net/download.html.
+dialog.checkversion.download=Aby \u015bci\u0105gn\u0105\u0107 now\u0105 wersj\u0119 przejd\u017a na https://gpsprune.activityworkshop.net/download.html.
 dialog.keys.intro=U\u017cuwaj nast\u0119puj\u0105cych klawiszy skr\u00f3t\u00f3w zamiast myszki
 dialog.keys.keylist=<table><tr><td>klawisze strza\u0142ek</td><td>Przesuwa map\u0119 w lewo, w prawo, w g\u00f3r\u0119, w d\u00f3\u0142</td></tr><tr><td>Ctrl + lewa, prawa strza\u0142ka</td><td>Wybierz punkt poprzedni lub nast\u0119pny</td></tr><tr><td>Ctrl + strza\u0142ka w g\u00f3r\u0119, w d\u00f3\u0142</td><td>Powi\u0119ksz, pomniejsz</td></tr><tr><td>Del</td><td>Usun bie\u017c\u0105cy punkt</td></tr></table>
 dialog.keys.normalmodifier=Ctrl
@@ -591,6 +593,7 @@ dialog.deletebydate.column.keep=Zostaw
 dialog.deletebydate.column.delete=Usu\u0144
 dialog.setaltitudetolerance.text.metres=Limit (w metrach) poni\u017cej kt\u00f3rego, ma\u0142e spadki wzniosy b\u0119d\u0105 ignorowane
 dialog.setaltitudetolerance.text.feet=Limit (w stopach) poni\u017cej kt\u00f3rego, ma\u0142e spadki wzniosy b\u0119d\u0105 ignorowane
+dialog.settimezone.selectedzone=Wybrana strefa czasowa
 dialog.autoplay.duration=Czas trwania (sek)
 dialog.autoplay.usetimestamps=U\u017Cyj znacznik\u00f3w czasowych
 dialog.autoplay.rewind=Przewin\u0105\u0107


=====================================
tim/prune/lang/prune-texts_sv.properties
=====================================
@@ -7,15 +7,11 @@ menu.file.addphotos=L\u00e4gg till foto
 menu.file.recentfiles=Senaste filer
 menu.file.save=Spara som text
 menu.file.exit=Avsluta
+menu.online=Online
 menu.track=Sp\u00e5r
 menu.track.undo=\u00c5ngra
 menu.track.clearundo=Rensa \u00e5ngra-historik
 menu.track.markrectangle=Markera punkter i rektangel
-function.deletemarked=Radera markerade punkter
-function.rearrangewaypoints=Ordna waypoints
-dialog.rearrange.tostart=Alla till b\u00f6rjan av fil
-dialog.rearrange.toend=Alla till slut av fil
-dialog.rearrange.tonearest=Varje till n\u00e4rmaste sp\u00e5rpunkt
 menu.range=Intervall
 menu.range.all=V\u00e4lj alla
 menu.range.none=V\u00e4lj ingen
@@ -43,6 +39,7 @@ menu.settings=Inst\u00e4llningar
 menu.settings.onlinemode=H\u00e4mta kartor fr\u00e5n Internet
 menu.settings.autosave=Autospara inst\u00e4llningar vid avslut
 menu.help=Hj\u00e4lp
+
 # Popup menu for map
 menu.map.zoomin=Zooma ut
 menu.map.zoomout=Zooma in
@@ -57,6 +54,7 @@ menu.map.editmode=Redigeringsl\u00e4ge
 
 # Alt keys for menus
 altkey.menu.file=A
+altkey.menu.online=N
 altkey.menu.track=S
 altkey.menu.range=I
 altkey.menu.point=P
@@ -71,6 +69,7 @@ shortcut.menu.file.open=O
 shortcut.menu.file.load=L
 shortcut.menu.file.save=S
 shortcut.menu.track.undo=Z
+shortcut.menu.track.compress=K
 shortcut.menu.range.all=A
 shortcut.menu.help.help=H
 
@@ -85,17 +84,334 @@ function.exportpov=Exportera POV
 function.exportimage=Exportera bildfil
 function.editwaypointname=Redigera namn p\u00e5 waypoint
 function.compress=Komprimera sp\u00e5r
+function.deletemarked=Radera markerade punkter
+function.marklifts=Markera liftar
 function.deleterange=Radera intervall
 function.croptrack=Besk\u00e4r sp\u00e5r till intervall
 function.interpolate=Interpolera punkter
+function.deletebydate=Ta bort punkter datumvis
 function.addtimeoffset=Infoga tidsoffset
 function.addaltitudeoffset=Infoga h\u00f6jdoffset
+function.rearrangewaypoints=Ordna waypoints
 function.convertnamestotimes=Omvandla waypointnamn till tidpunkter
+function.deletefieldvalues=Ta bort f\u00e4lt-v\u00e4rden
 function.findwaypoint=S\u00f6k waypoint
 function.pastecoordinates=Infoga koordinater
 function.charts=Diagram
 function.show3d=3D-vy
 function.distances=Avst\u00e5nd
+function.fullrangedetails=Alla intevall-detaljer
 function.estimatetime=Uppskatta tid
+function.learnestimationparams=L\u00e4r upp tidsuppskattningsparametrar
+function.setmapbg=V\u00e4lj bakgrundskarta
+function.setpaths=V\u00e4lj s\u00f6kv\u00e4gar f\u00f6r program
+function.selectsegment=Markera aktuellt segment
+function.splitsegments=Dela upp sp\u00e5ret i segment
+function.sewsegments=Sy ihop sp\u00e5r-segment
+function.createmarkerwaypoints=Skapa markerings-waypoints
+function.getgpsies=H\u00e4mta Gpsies-sp\u00e5r
+function.uploadgpsies=Ladda upp sp\u00e5r till Gpsies
+function.lookupsrtm=H\u00e4mta h\u00f6jddata fr\u00e5n SRTM
+function.downloadsrtm=Ladda ner SRTM-h\u00f6jddata
+function.getwikipedia=H\u00e4mta n\u00e4rliggande Wikipedia-artiklar
+function.searchwikipedianames=S\u00f6k i Wikipedia p\u00e5 namn
+function.searchosmpois=H\u00e4mta n\u00e4rliggande OSM-punkter
+function.searchopencachingde=S\u00f6k p\u00e5 OpenCaching.de
+function.mapillary=S\u00f6k efter foton i Mapillary
+function.downloadosm=Ladda ner OSM-data f\u00f6r omr\u00e5det
+function.duplicatepoint=Duplicera punkt
+function.setcolours=V\u00e4lj f\u00e4rger
+function.setdisplaysettings=V\u00e4lj visningsalternativ
+function.setlanguage=V\u00e4lj spr\u00e5k
+function.connecttopoint=Koppla till punkt
+function.disconnectfrompoint=Ta bort koppling till punkt
+function.removephoto=Ta bort foto
+function.correlatephotos=Korrelera foton
+function.rearrangephotos=Arrangera om foton
+function.rotatephotoleft=Rotera foto moturs
+function.rotatephotoright=Rotera foto medurs
+function.photopopup=Visa foto i eget f\u00f6nster
+function.ignoreexifthumb=Ignorera miniatyrbild i exif
+function.loadaudio=L\u00e4gg till ljudklipp
+function.removeaudio=Ta bort ljudklipp
+function.correlateaudios=Korrelera ljudklipp
+function.playaudio=Spela upp ljudklipp
+function.stopaudio=Stoppa ljudklipp
+function.help=Hj\u00e4lp
+function.showkeys=Visa snabbkommandon
+function.about=Om GpsPrune
+function.checkversion=Kolla efter ny version
+function.saveconfig=Spara inst\u00e4llningar
+function.diskcache=Spara kartor p\u00e5 h\u00e5rddisken
+function.managetilecache=Hantera kart-cache
+function.getweatherforecast=H\u00e4mta v\u00e4derprognos
+function.setaltitudetolerance=S\u00e4tt toleransniv\u00e5 f\u00f6r h\u00f6jd
+function.selecttimezone=V\u00e4lj tidszon
+
+# Dialogs
+dialog.exit.confirm.title=Avsluta GpsPrune
+dialog.exit.confirm.text=Ditt arbete har inte sparats \u00e4n. \u00c4r du s\u00e4ker p\u00e5 att du vill avsluta?
+dialog.openappend.title=L\u00e4gg till datan till existerande data
+dialog.openappend.text=L\u00e4gg till denna datan till datan som redan \u00e4r laddad?
+dialog.deletepoint.title=Ta bort punkt
+dialog.deletepoint.deletephoto=Ta bort fotot som \u00e4r bifogat till denna punkt?
+dialog.deletephoto.title=Ta bort foto
+dialog.deletephoto.deletepoint=Ta bort punkten som \u00e4r bifogad till detta foto?
+dialog.deleteaudio.deletepoint=Ta bort punkten som \u00e4r bifogad till detta ljudklipp?
+dialog.openoptions.title=\u00d6ppna inst\u00e4llningar
+dialog.openoptions.filesnippet=Filextrakt
+dialog.load.table.field=F\u00e4lt
+dialog.load.table.datatype=Datatyp
+dialog.load.table.description=Beskrivning
+dialog.delimiter.comma=Komma ,
+dialog.delimiter.space=Mellanslag
+dialog.delimiter.other=Annat
+dialog.openoptions.altitudeunits=H\u00f6jdenhet
+dialog.openoptions.speedunits=Hastighetsenheter
+dialog.openoptions.vertspeedunits=Enheter f\u00f6r vertikal hastighet
+dialog.openoptions.vspeed.positiveup=Positiv hastighet upp\u00e5t
+dialog.openoptions.vspeed.positivedown=Positiv hastighet ned\u00e5t
+dialog.open.contentsdoubled=Denna filen inneh\u00e5ller tv\u00e5 kopior av varje punkt,\nen g\u00e5ng som waypoint och en g\u00e5ng som punkt i ett sp\u00e5r.
+dialog.selecttracks.intro=V\u00e4lj sp\u00e5r att ladda in
+dialog.selecttracks.noname=Namnl\u00f6s
+dialog.jpegload.subdirectories=Inkludera undermappar
+dialog.jpegload.loadjpegswithoutcoords=Inkludera foton utan koordinater
+dialog.jpegload.loadjpegsoutsidearea=Inkludera foton utanf\u00f6r aktuellt omr\u00e5de
+dialog.jpegload.progress.title=Laddar in foton
+dialog.jpegload.progress=V\u00e4nta medan foton s\u00f6ks
+dialog.gpsload.nogpsbabel=Inget GPSBabel-program kunde hittas. Forts\u00e4tt \u00e4nd\u00e5?
+dialog.gpsload.format=Format
+dialog.gpsload.getwaypoints=Ladda in waypoints
+dialog.gpsload.gettracks=Ladda in sp\u00e5r
+dialog.gpsload.save=Spara till fil
+dialog.gpssend.sendwaypoints=Skicka waypoints
+dialog.gpssend.sendtracks=Skicka sp\u00e5r
+dialog.gpssend.trackname=Namn p\u00e5 sp\u00e5r
+dialog.gpsbabel.filters=Filter
+dialog.addfilter.title=L\u00e4gg till filter
+dialog.gpsbabel.filter.discard=Skippa
+dialog.gpsbabel.filter.simplify=F\u00f6renkla
+dialog.gpsbabel.filter.distance=Avst\u00e5nd
+dialog.gpsbabel.filter.interpolate=Interpolera
+dialog.gpsbabel.filter.discard.intro=Skippa punkter om
+dialog.gpsbabel.filter.discard.numsats=Antal satelliter <
+dialog.gpsbabel.filter.simplify.intro=Ta bort punkter tills
+dialog.gpsbabel.filter.simplify.maxpoints=Antal punkter <
+dialog.gpsbabel.filter.simplify.length=l\u00e4ngdskillnad
+dialog.gpsbabel.filter.distance.intro=Ta bort punkter n\u00e4ra f\u00f6reg\u00e5ende punkter
+dialog.gpsbabel.filter.distance.distance=Om avst\u00e5ndet <
+dialog.gpsbabel.filter.distance.time=och tidsskillnaden <
+dialog.gpsbabel.filter.interpolate.intro=L\u00e4gg till extra punkter inemellan sp\u00e5rets punkter
+dialog.gpsbabel.filter.interpolate.distance=Om avst\u00e5ndet >
+dialog.gpsbabel.filter.interpolate.time=eller tidsskillnaden >
+dialog.saveoptions.title=Spara fil
+dialog.save.fieldstosave=F\u00e4lt att spara
+dialog.save.table.field=F\u00e4lt
+dialog.save.table.hasdata=Har data
+dialog.save.table.save=Spara
+dialog.save.headerrow=Skriv ut titelrad
+dialog.save.coordinateunits=Koordinat-format
+dialog.save.altitudeunits=H\u00f6jdenhet
+dialog.save.timestampformat=Tidsst\u00e4mpel-format
+dialog.save.overwrite.title=Filen existerar redan
+dialog.save.overwrite.text=Denna filen existerar redan. \u00c4r du s\u00e4ker p\u00e5 att du vill skriva \u00f6ver den?
+dialog.save.notypesselected=Inga punkt-typer har valts
+dialog.exportkml.text=Titel f\u00f6r datan
+dialog.exportkml.altitude=Absolut h\u00f6jddata (f\u00f6r flyg)
+dialog.exportkml.kmz=Komprimera till kmz-fil
+dialog.exportkml.imagesize=Bild-storlek
+dialog.exportkml.trackcolour=F\u00e4rg p\u00e5 sp\u00e5r
+dialog.exportkml.standardkml=Standard KML
+dialog.exportkml.extendedkml=KML ut\u00f6kad med tidsst\u00e4mplar
+dialog.exportgpx.name=Namn
+dialog.exportgpx.desc=Beskrivning
+dialog.exportgpx.includetimestamps=Inkludera tidsst\u00e4mplar
+dialog.exportgpx.copysource=Kopiera k\u00e4ll-xml
+dialog.exportgpx.encoding=Teckenkodning
+dialog.exportgpx.encoding.system=System
+dialog.exportgpx.encoding.utf8=UTF-8
+dialog.exportpov.text=Fyll i parametrar f\u00f6r POV-export
+dialog.exportpov.font=Font
+dialog.exportpov.camerax=Kamera X
+dialog.exportpov.cameray=Kamera Y
+dialog.exportpov.cameraz=Kamera Z
+dialog.exportpov.modelstyle=Modell-typ
+dialog.exportpov.ballsandsticks=Kulor och stavar
+dialog.exportpov.tubesandwalls=R\u00f6r och v\u00e4ggar
+dialog.3d.warningtracksize=Detta sp\u00e5r har v\u00e4ldigt m\u00e5nga punkter som Java3D kan ha problem med att visa.\n\u00c4r du s\u00e4ker p\u00e5 att du vill forts\u00e4tta?
+dialog.3d.useterrain=Visa terr\u00e4ng
+dialog.3d.terraingridsize=Storlek p\u00e5 rutn\u00e4t
+dialog.exportpov.baseimage=Bild f\u00f6r basplanet
+dialog.exportpov.cannotmakebaseimage=Kunde inte skriva bild f\u00f6r basplanet
+dialog.baseimage.title=Kart-bild
+dialog.baseimage.useimage=Anv\u00e4nd bild
+dialog.baseimage.mapsource=Kart-k\u00e4lla
+dialog.baseimage.zoom=Zoom-niv\u00e5
+dialog.baseimage.incomplete=Bilden ofullst\u00e4ndig
+dialog.baseimage.tiles=Rutor
+dialog.baseimage.size=Bild-storlek
+dialog.exportimage.noimagepossible=Kart-bilder m\u00e5ste cachas f\u00f6r att kunna anv\u00e4nda dom i en export.
+dialog.exportimage.drawtrack=Rita ut sp\u00e5ret p\u00e5 kartan
+dialog.exportimage.drawtrackpoints=Rita ut sp\u00e5r-punkterna
+dialog.exportimage.textscalepercent=Textstorleksfaktor (%)
+dialog.pointtype.desc=Spara f\u00f6ljande punkt-typer:
+dialog.pointtype.track=Sp\u00e5r-punkter
+dialog.pointtype.waypoint=Waypoints
+dialog.pointtype.photo=Foto-punkter
+dialog.pointtype.audio=Ljud-punkter
+dialog.pointtype.selection=Endast markerat omr\u00e5de
+dialog.confirmreversetrack.title=Bekr\u00e4fta riktningsbyte p\u00e5 sp\u00e5ret
+dialog.confirmreversetrack.text=Detta sp\u00e5r inneh\u00e5ller tidsst\u00e4mplar som kommer hamna i oordning efter en v\u00e4ndning av sp\u00e5r-sektionen.\n\u00c4r du s\u00e4ker p\u00e5 att du vill v\u00e4nda riktning p\u00e5 denna sp\u00e5r-sektion?
+dialog.confirmcutandmove.title=Bekr\u00e4fta urklippning och flytt
+dialog.confirmcutandmove.text=Detta sp\u00e5r inneh\u00e5ller tidsst\u00e4mplar som kommer hamna i oordning efter en flytt av sp\u00e5r-sektionen.\n\u00c4r du s\u00e4ker p\u00e5 att du vill flytta sp\u00e5r-sektionen?
+dialog.interpolate.parameter.text=Antal punkter att infoga mellan varje nuvarande punkt
+dialog.interpolate.betweenwaypoints=Interpolera mellan waypoints?
+dialog.undo.title=\u00c5ngra \u00e4ndring(ar)
+dialog.undo.pretext=V\u00e4lj \u00e4ndring(ar) att \u00e5ngra
+dialog.undo.none.title=Kan inte \u00e5ngra
+dialog.undo.none.text=Inga \u00e4ndringar att \u00e5ngra!
+dialog.clearundo.title=T\u00f6m \u00e5ngringslistan
+dialog.clearundo.text=\u00c4r du s\u00e4ker p\u00e5 att du vill t\u00f6mma \u00e5ngringslistan?\nAll \u00e5ngerinformation kommer att f\u00f6rsvinna!
+dialog.pointedit.title=Redigera punkt
+dialog.pointedit.intro=V\u00e4lj varje f\u00e4lt var f\u00f6r sig f\u00f6r att se och \u00e4ndra v\u00e4rde
+dialog.pointedit.table.field=F\u00e4lt
+dialog.pointedit.nofield=Inget f\u00e4lt valt
+dialog.pointedit.table.value=V\u00e4rde
+dialog.pointnameedit.name=Waypoint-namn
+dialog.pointnameedit.uppercase=STORA BOKST\u00c4VER
+dialog.pointnameedit.lowercase=sm\u00e5 bokst\u00e4ver
+dialog.pointnameedit.titlecase=F\u00f6rsta Stor
+dialog.addtimeoffset.add=L\u00e4gg till tid
+dialog.addtimeoffset.subtract=Dra ifr\u00e5n tid
+dialog.addtimeoffset.days=Dagar
+dialog.addtimeoffset.hours=Timmar
+dialog.addtimeoffset.minutes=Minuter
+dialog.addtimeoffset.notimestamps=Kan inte utf\u00f6ra en tidsoffset eftersom detta intervall inte inneh\u00e5ller n\u00e5gra tidsst\u00e4mplar
+dialog.findwaypoint.intro=Fyll i del av waypoint-namnet
+dialog.findwaypoint.search=S\u00f6k
+dialog.saveexif.title=Spara Exif
+dialog.saveexif.intro=V\u00e4lj foton att spara med kryssrutorna
+dialog.saveexif.nothingtosave=Koordinat-data of\u00f6r\u00e4ndrat, ingen \u00e4ndring att spara
+dialog.saveexif.noexiftool=Inget exiftool-program kunde hittas. Forts\u00e4tt?
+dialog.saveexif.table.photoname=Foto-namn
+dialog.saveexif.table.status=Status
+dialog.saveexif.table.save=Spara
+dialog.saveexif.photostatus.connected=Kopplad
+dialog.saveexif.photostatus.disconnected=Bortkopplad
+dialog.saveexif.photostatus.modified=\u00c4ndrad
+dialog.saveexif.overwrite=Skriv \u00f6ver filer
+dialog.saveexif.force=Tvinga trots mindre fel
+dialog.charts.xaxis=X-axel
+dialog.charts.yaxis=Y-axlar
+dialog.charts.output=Utdata
+dialog.charts.screen=Utdata till bildsk\u00e4rm
+dialog.charts.svg=Utdata till SVG-fil
+dialog.charts.svgwidth=SVG bredd
+dialog.charts.svgheight=SVG h\u00f6jd
+dialog.charts.needaltitudeortimes=Sp\u00e5ret m\u00e5ste ha antingen h\u00f6jd- eller tidsdata f\u00f6r att kunna skapa grafer
+dialog.charts.gnuplotnotfound=Kunde inte hitta gnuplot p\u00e5 angiven s\u00f6kv\u00e4g
+dialog.distances.intro=F\u00e5gelv\u00e4g mellan punkter
+dialog.distances.column.from=Fr\u00e5n punkt
+dialog.distances.column.to=Till punkt
+dialog.distances.currentpoint=Nuvarande punkt
+dialog.distances.toofewpoints=Denna funktion beh\u00f6ver waypoints f\u00f6r att ber\u00e4kna avst\u00e5nden d\u00e4remellan
+dialog.fullrangedetails.intro=H\u00e4r \u00e4r alla detaljer f\u00f6r det markerade intervallet
+dialog.fullrangedetails.coltotal=Inklusive gap
+dialog.fullrangedetails.colsegments=Utan gap
+dialog.estimatetime.details=Detaljer
+dialog.estimatetime.gentle=Flackt
+dialog.estimatetime.steep=Brant
+dialog.estimatetime.climb=Kl\u00e4ttring
+dialog.estimatetime.descent=Nedf\u00f6r
+dialog.estimatetime.parameters=Parametrar
+dialog.estimatetime.parameters.timefor=Tid f\u00f6r
+dialog.estimatetime.results=Resultat
+dialog.estimatetime.results.estimatedtime=Ber\u00e4knad tid
+dialog.estimatetime.results.actualtime=Faktisk tid
+dialog.estimatetime.error.nodistance=Tidsuppskattningen kr\u00e4ver kopplade sp\u00e5rpunkter f\u00f6r att f\u00e5 avst\u00e5nd
+dialog.estimatetime.error.noaltitudes=Intervallet har ingen h\u00f6jd-data
+dialog.learnestimationparams.intro=Detta \u00e4r parametrarna ber\u00e4knade fr\u00e5n detta sp\u00e5ret
+dialog.rearrange.tostart=Alla till b\u00f6rjan av fil
+dialog.rearrange.toend=Alla till slut av fil
+dialog.rearrange.tonearest=Varje till n\u00e4rmaste sp\u00e5rpunkt
+
+# Buttons
+button.ok=OK
+button.back=Bak\u00e5t
+button.next=N\u00e4sta
+button.cancel=Avbryt
+button.overwrite=Skriv \u00f6ver
+button.moveup=Flytta upp
+button.movedown=Flytta ner
+button.edit=Redigera
+button.exit=Avsluta
+button.close=St\u00e4ng
+button.yes=Ja
+button.no=Nej
+button.yestoall=Ja till alla
+button.notoall=Nej till alla
+button.always=Alltid
+button.select=Markera
+button.selectall=Markera alla
+button.selectnone=Markera inget
+button.preview=F\u00f6rhandsvisa
+button.load=Ladda in
+button.upload=Ladda upp
+button.guessfields=Gissa f\u00e4lt
+button.showwebpage=Visa hemsida
+button.resettodefaults=\u00c5terst\u00e4ll till default
+button.browse=Bl\u00e4ddra...
+button.addnew=L\u00e4gg till ny
+button.delete=Ta bort
+button.manage=Hantera
+button.combine=Kombinera
+
+# Display components
+display.nodata=Ingen data laddad
+display.noaltitudes=Sp\u00e5rdatan saknar h\u00f6jddata
+display.notimestamps=Sp\u00e5rdatan saknar tidsst\u00e4mplar
+display.novalues=Sp\u00e5rdatan saknar v\u00e4rden f\u00f6r detta f\u00e4lt
+details.trackdetails=Sp\u00e5r-detaljer
+details.notrack=Inget sp\u00e5r laddat
+details.track.points=Punkter
+details.track.file=Fil
+details.track.numfiles=Antal filer
+details.pointdetails=Punkt-detaljer
+details.index.selected=Index
+details.index.of=av
+details.nopointselection=Ingen punkt markerad
+details.photofile=Foto-fil
+details.norangeselection=Inget intervall markerat
+details.rangedetails=Intervall-detaljer
+details.range.selected=Markerat
+details.range.to=till
+details.altitude.to=till
+details.range.climb=Uppf\u00f6r
+details.range.descent=Nedf\u00f6r
+details.coordformat=Koortinat-format
+details.distanceunits=Distans-enhet
+display.range.time.secs=s
+display.range.time.mins=m
+display.range.time.hours=h
+display.range.time.days=d
+details.range.avespeed=Medelhastighet
+details.range.maxspeed=Maxhastighet
+details.range.numsegments=Antal segment
+details.range.gradient=Gradient
+details.lists.waypoints=Waypoints
+details.lists.photos=Foton
+details.lists.audio=Ljud
+details.photodetails=Foto-detaljer
+details.nophoto=Inget foto valt
+details.photo.loading=Laddar
+details.photo.bearing=B\u00e4ring
+details.media.connected=Kopplad
+details.media.fullpath=Fullst\u00e4ndig s\u00f6kv\u00e4g
+details.audiodetails=Ljud-detaljer
+details.noaudio=Inget ljudklipp valt
+details.audio.file=Ljudfil
+details.audio.playing=spelar...
+map.overzoom=Inga kartor tillg\u00e4ngliga p\u00e5 denna zoom-niv\u00e5
 
+# External urls and services
 openweathermap.lang=se


=====================================
tim/prune/load/xml/GpxHandler.java
=====================================
@@ -19,7 +19,8 @@ public class GpxHandler extends XmlHandler
 	private boolean _startSegment = true;
 	private boolean _isTrackPoint = false;
 	private int _trackNum = -1;
-	private GpxTag _name = new GpxTag(), _trackName = new GpxTag();
+	private GpxTag _fileTitle = new GpxTag();
+	private GpxTag _pointName = new GpxTag(), _trackName = new GpxTag();
 	private String _latitude = null, _longitude = null;
 	private GpxTag _elevation = new GpxTag(), _time = new GpxTag();
 	private GpxTag _type = new GpxTag(), _description = new GpxTag();
@@ -52,7 +53,7 @@ public class GpxHandler extends XmlHandler
 				else if (att.equals("lon")) {_longitude = attributes.getValue(i);}
 			}
 			_elevation.setValue(null);
-			_name.setValue(null);
+			_pointName.setValue(null);
 			_time.setValue(null);
 			_type.setValue(null);
 			_link.setValue(null);
@@ -61,8 +62,18 @@ public class GpxHandler extends XmlHandler
 		else if (tag.equals("ele")) {
 			_currentTag = _elevation;
 		}
-		else if (tag.equals("name")) {
-			_currentTag = (_insidePoint?_name:_trackName);
+		else if (tag.equals("name"))
+		{
+			if (_insidePoint) {
+				_currentTag = _pointName;
+			}
+			else if (_trackNum < 0)
+			{
+				_currentTag = _fileTitle;
+			}
+			else {
+				_currentTag = _trackName;
+			}
 		}
 		else if (tag.equals("time")) {
 			_currentTag = _time;
@@ -146,7 +157,7 @@ public class GpxHandler extends XmlHandler
 		values[0] = _latitude;
 		values[1] = _longitude;
 		values[2] = _elevation.getValue();
-		if (_insideWaypoint) {values[3] = _name.getValue();}
+		if (_insideWaypoint) {values[3] = _pointName.getValue();}
 		values[4] = _time.getValue();
 		if (_startSegment && !_insideWaypoint)
 		{
@@ -212,4 +223,11 @@ public class GpxHandler extends XmlHandler
 	public TrackNameList getTrackNameList() {
 		return _trackNameList;
 	}
+
+	/**
+	 * @return file title
+	 */
+	public String getFileTitle() {
+		return _fileTitle.getValue();
+	}
 }


=====================================
tim/prune/load/xml/XmlFileLoader.java
=====================================
@@ -93,9 +93,11 @@ public class XmlFileLoader extends DefaultHandler implements Runnable
 			}
 			else
 			{
+				SourceInfo.FILE_TYPE sourceType = (_handler instanceof GpxHandler ? SourceInfo.FILE_TYPE.GPX : SourceInfo.FILE_TYPE.KML);
+				SourceInfo sourceInfo = new SourceInfo(_file, sourceType);
+				sourceInfo.setFileTitle(_handler.getFileTitle());
+
 				// Pass information back to app
-				SourceInfo sourceInfo = new SourceInfo(_file,
-					(_handler instanceof GpxHandler?SourceInfo.FILE_TYPE.GPX:SourceInfo.FILE_TYPE.KML));
 				_app.informDataLoaded(_handler.getFieldArray(), _handler.getDataArray(),
 					null, sourceInfo, _handler.getTrackNameList(),
 					new MediaLinkInfo(_handler.getLinkArray()));


=====================================
tim/prune/load/xml/XmlHandler.java
=====================================
@@ -36,4 +36,12 @@ public abstract class XmlHandler extends DefaultHandler
 	public String[] getLinkArray() {
 		return null;
 	}
+
+	/**
+	 * Can be overridden (eg by gpx handler) to provide the title of the file
+	 * @return file title, or null
+	 */
+	public String getFileTitle() {
+		return null;
+	}
 }


=====================================
tim/prune/readme.txt
=====================================
@@ -1,4 +1,4 @@
-GpsPrune version 19.1
+GpsPrune version 19.2
 =====================
 
 GpsPrune is an application for viewing, editing and managing coordinate data from GPS systems,
@@ -17,7 +17,7 @@ Running
 =======
 
 To run GpsPrune from the jar file, simply call it from a command prompt or shell:
-   java -jar gpsprune_19.1.jar
+   java -jar gpsprune_19.2.jar
 
 If the jar file is saved in a different directory, you will need to include the path.
 Depending on your system settings, you may be able to click or double-click on the jar file
@@ -25,9 +25,18 @@ in a file manager window to execute it.  A shortcut, menu item, alias, desktop i
 or other link can of course be made should you wish.
 
 To specify a language other than the default, use an additional parameter, eg:
-   java -jar gpsprune_19.1.jar --lang=DE
+   java -jar gpsprune_19.2.jar --lang=DE
 
 
+New with version 19.2
+=====================
+The following fixes and additions were made since version 19.1:
+  - Fix right-click-and-drag bug for zooming with Java 9 and Java 10 
+  - Fix export of timestamps when photo points don't have timestamps
+  - Lighting of 3d views from the northwest (thanks, PeHar)
+  - Remember the name tag from a loaded gpx file, suggest it again for gpx export
+  - Removal of the Thunderforest tile sources (OpenCycleMap, Outdoors)
+  
 New with version 19.1
 =====================
 The following fixes and additions were made since version 19:


=====================================
tim/prune/save/GpxExporter.java
=====================================
@@ -41,6 +41,7 @@ import tim.prune.data.Field;
 import tim.prune.data.MediaObject;
 import tim.prune.data.Photo;
 import tim.prune.data.RecentFile;
+import tim.prune.data.SourceInfo;
 import tim.prune.data.Timestamp;
 import tim.prune.data.TrackInfo;
 import tim.prune.data.UnitSetLibrary;
@@ -66,6 +67,8 @@ public class GpxExporter extends GenericFunction implements Runnable
 	private JPanel _encodingsPanel = null;
 	private JRadioButton _useSystemRadio = null, _forceUtf8Radio = null;
 	private File _exportFile = null;
+	/** Remember the previous sourceInfo object to tell whether it has changed */
+	private SourceInfo _previousSourceInfo = null;
 
 	/** this program name */
 	private static final String GPX_CREATOR = "GpsPrune v" + GpsPrune.VERSION_NUMBER + " activityworkshop.net";
@@ -108,6 +111,7 @@ public class GpxExporter extends GenericFunction implements Runnable
 			_useSystemRadio.setText(I18nManager.getText("dialog.exportgpx.encoding.system")
 				+ " (" + (systemEncoding == null ? "unknown" : systemEncoding) + ")");
 		}
+		setFileTitle();
 		_dialog.setVisible(true);
 	}
 
@@ -196,6 +200,34 @@ public class GpxExporter extends GenericFunction implements Runnable
 		return dialogPanel;
 	}
 
+	/**
+	 * Set the suggestion for the name with which to export
+	 */
+	private void setFileTitle()
+	{
+		// Get the most recent file info
+		SourceInfo currentSource = _app.getTrackInfo().getFileInfo().getLastFileInfo();
+		if (currentSource != _previousSourceInfo)
+		{
+			String lastTitle = currentSource.getFileTitle();
+			if (lastTitle != null && !lastTitle.equals(""))
+			{
+				// Take the title of the last file loaded
+				_nameField.setText(lastTitle);
+			}
+		}
+		if (_nameField.getText().equals(""))
+		{
+			// no name given in the field already, so try to overwrite it
+			String lastTitle = _app.getTrackInfo().getFileInfo().getLastFileTitle();
+			if (lastTitle != null && !lastTitle.equals(""))
+			{
+				_nameField.setText(lastTitle);
+			}
+		}
+		// Remember this source info so we don't use it again
+		_previousSourceInfo = currentSource;
+	}
 
 	/**
 	 * Start the export process based on the input parameters
@@ -758,16 +790,21 @@ public class GpxExporter extends GenericFunction implements Runnable
 			inWriter.write(inPoint.hasAltitude() ? inPoint.getAltitude().getStringValue(UnitSetLibrary.UNITS_METRES) : "0");
 			inWriter.write("</ele>\n");
 		}
+		// Maybe take timestamp from photo if the point hasn't got one
+		Timestamp pointTimestamp = getPointTimestamp(inPoint, inSettings);
 		// timestamp if available (and selected)
-		if (inPoint.hasTimestamp() && inSettings.getExportTimestamps())
+		if (pointTimestamp != null && inSettings.getExportTimestamps())
 		{
 			inWriter.write("\t\t\t\t<time>");
-			inWriter.write(inPoint.getTimestamp().getText(Timestamp.Format.ISO8601, null));
+			inWriter.write(pointTimestamp.getText(Timestamp.Format.ISO8601, null));
 			inWriter.write("</time>\n");
 		}
 		// photo, audio
-		if (inPoint.getPhoto() != null && inSettings.getExportPhotoPoints()) {
+		if (inPoint.getPhoto() != null && inSettings.getExportPhotoPoints())
+		{
+			inWriter.write("\t\t\t\t");
 			inWriter.write(makeMediaLink(inPoint.getPhoto()));
+			inWriter.write("\n");
 		}
 		if (inPoint.getAudio() != null && inSettings.getExportAudioPoints()) {
 			inWriter.write(makeMediaLink(inPoint.getAudio()));
@@ -825,4 +862,33 @@ public class GpxExporter extends GenericFunction implements Runnable
 	{
 		return inPointSource.replaceAll("[ \t]*<time>.*?</time>", "");
 	}
+
+	/**
+	 * Get the timestamp from the point or its media
+	 * @param inPoint point object
+	 * @param inSettings export settings
+	 * @return Timestamp object if available, or null
+	 */
+	private static Timestamp getPointTimestamp(DataPoint inPoint, SettingsForExport inSettings)
+	{
+		if (inPoint.hasTimestamp())
+		{
+			return inPoint.getTimestamp();
+		}
+		if (inPoint.getPhoto() != null && inSettings.getExportPhotoPoints())
+		{
+			if (inPoint.getPhoto().hasTimestamp())
+			{
+				return inPoint.getPhoto().getTimestamp();
+			}
+		}
+		if (inPoint.getAudio() != null && inSettings.getExportAudioPoints())
+		{
+			if (inPoint.getAudio().hasTimestamp())
+			{
+				return inPoint.getAudio().getTimestamp();
+			}
+		}
+		return null;
+	}
 }


=====================================
tim/prune/save/PovExporter.java
=====================================
@@ -511,6 +511,18 @@ public class PovExporter extends Export3dFunction
 		// Definition of terrain shape if any
 		final String terrainDefinition = makeTerrainString(inTerrainFile, inImageFile, inLineSeparator);
 
+		final String[] pointLights = {
+			"// lights",
+			"light_source { <-1, 9, -4> color rgb <0.5 0.5 0.5>}",
+			"light_source { <1, 6, -14> color rgb <0.6 0.6 0.6>}",
+			"light_source { <11, 12, 8> color rgb <0.3 0.3 0.3>}"
+		};
+		final String[] northwestLight = {
+			"// lights from NW",
+			"light_source { <-10, 10, 10> color rgb <1.5 1.5 1.5> parallel }",
+		};
+		final String[] lightsLines = (inTerrainFile == null ? pointLights : northwestLight);
+
 		// Set up output
 		String[] outputLines = {
 		  "global_settings { ambient_light rgb <4, 4, 4> }", "",
@@ -626,21 +638,30 @@ public class PovExporter extends Export3dFunction
 		  "  ttf \"" + fontPath + "\" \"" + I18nManager.getText("cardinal.w") + "\" 0.3, 0",
 		  "  pigment { color rgb <1 1 1> }",
 		  "  translate <-10.3, 0.2, 0>",
-		  "}", "",
-		  // MAYBE: Light positions should relate to model size
-		  "// lights",
-		  "light_source { <-1, 9, -4> color rgb <0.5 0.5 0.5>}",
-		  "light_source { <1, 6, -14> color rgb <0.6 0.6 0.6>}",
-		  "light_source { <11, 12, 8> color rgb <0.3 0.3 0.3>}",
-		  "",
+		  "}"
 		};
+
 		// write strings to file
-		int numLines = outputLines.length;
-		for (int i=0; i<numLines; i++)
+		writeLinesToFile(inWriter, inLineSeparator, outputLines);
+		writeLinesToFile(inWriter, inLineSeparator, lightsLines);
+	}
+
+	/**
+	 * Write the given lines to the file
+	 * @param inWriter writer object
+	 * @param inLineSeparator line separator string
+	 * @param lines array of lines to write
+	 * @throws IOException
+	 */
+	private void writeLinesToFile(FileWriter inWriter, String inLineSeparator, String[] lines)
+		throws IOException
+	{
+		for (int i=0; i<lines.length; i++)
 		{
-			inWriter.write(outputLines[i]);
+			inWriter.write(lines[i]);
 			inWriter.write(inLineSeparator);
 		}
+		inWriter.write(inLineSeparator);
 	}
 
 	/**


=====================================
tim/prune/threedee/Java3DWindow.java
=====================================
@@ -17,6 +17,7 @@ import javax.media.j3d.Billboard;
 import javax.media.j3d.BoundingSphere;
 import javax.media.j3d.BranchGroup;
 import javax.media.j3d.Canvas3D;
+import javax.media.j3d.DirectionalLight;
 import javax.media.j3d.Font3D;
 import javax.media.j3d.FontExtrusion;
 import javax.media.j3d.GeometryArray;
@@ -41,6 +42,7 @@ import javax.vecmath.Point3d;
 import javax.vecmath.Point3f;
 import javax.vecmath.TexCoord2f;
 import javax.vecmath.Vector3d;
+import javax.vecmath.Vector3f;
 
 import tim.prune.DataStatus;
 import tim.prune.FunctionLibrary;
@@ -374,11 +376,13 @@ public class Java3DWindow implements ThreeDWindow
 		// N, S, E, W
 		GeneralPath bevelPath = new GeneralPath();
 		bevelPath.moveTo(0.0f, 0.0f);
-		for (int i=0; i<91; i+= 5) {
+		for (int i=0; i<91; i+= 5)
+		{
 			bevelPath.lineTo((float) (0.1 - 0.1 * Math.cos(Math.toRadians(i))),
 			  (float) (0.1 * Math.sin(Math.toRadians(i))));
 		}
-		for (int i=90; i>0; i-=5) {
+		for (int i=90; i>0; i-=5)
+		{
 			bevelPath.lineTo((float) (0.3 + 0.1 * Math.cos(Math.toRadians(i))),
 			  (float) (0.1 * Math.sin(Math.toRadians(i))));
 		}
@@ -393,26 +397,40 @@ public class Java3DWindow implements ThreeDWindow
 		// Add points to model
 		objTrans.addChild(createDataPoints(_model));
 
-		// Create lights
-		BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
+		// Create lights - always add ambient light
+		BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
 		AmbientLight aLgt = new AmbientLight(new Color3f(1.0f, 1.0f, 1.0f));
 		aLgt.setInfluencingBounds(bounds);
 		objTrans.addChild(aLgt);
 
-		PointLight pLgt = new PointLight(new Color3f(1.0f, 1.0f, 1.0f),
-			new Point3f(0f, 0f, 2f), new Point3f(0.25f, 0.05f, 0.0f) );
-		pLgt.setInfluencingBounds(bounds);
-		objTrans.addChild(pLgt);
-
-		PointLight pl2 = new PointLight(new Color3f(0.8f, 0.9f, 0.4f),
-			new Point3f(6f, 1f, 6f), new Point3f(0.2f, 0.1f, 0.05f) );
-		pl2.setInfluencingBounds(bounds);
-		objTrans.addChild(pl2);
-
-		PointLight pl3 = new PointLight(new Color3f(0.7f, 0.7f, 0.7f),
-			new Point3f(0.0f, 12f, -2f), new Point3f(0.1f, 0.1f, 0.0f) );
-		pl3.setInfluencingBounds(bounds);
-		objTrans.addChild(pl3);
+		// Additional lights depend on whether there's a terrain or not
+		if (showTerrain)
+		{
+			// If there's a terrain, just have directional light from northwest
+			DirectionalLight dl = new DirectionalLight(true,
+				new Color3f(1.0f, 1.0f, 1.0f),
+				new Vector3f(1.0f, -1.0f, 1.0f));
+			dl.setInfluencingBounds(bounds);
+			objTrans.addChild(dl);
+		}
+		else
+		{
+			// There is no terrain, so use point lights as before
+			PointLight pLgt = new PointLight(new Color3f(1.0f, 1.0f, 1.0f),
+				new Point3f(0f, 0f, 2f), new Point3f(0.25f, 0.05f, 0.0f) );
+			pLgt.setInfluencingBounds(bounds);
+			objTrans.addChild(pLgt);
+	
+			PointLight pl2 = new PointLight(new Color3f(0.8f, 0.9f, 0.4f),
+				new Point3f(6f, 1f, 6f), new Point3f(0.2f, 0.1f, 0.05f) );
+			pl2.setInfluencingBounds(bounds);
+			objTrans.addChild(pl2);
+	
+			PointLight pl3 = new PointLight(new Color3f(0.7f, 0.7f, 0.7f),
+				new Point3f(0.0f, 12f, -2f), new Point3f(0.1f, 0.1f, 0.0f) );
+			pl3.setInfluencingBounds(bounds);
+			objTrans.addChild(pl3);
+		}
 
 		// Have Java 3D perform optimizations on this scene graph.
 		objRoot.compile();



View it on GitLab: https://salsa.debian.org/debian-gis-team/gpsprune/commit/24d18ba0dac4954ed785c8aaa8b7d94216603c07

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/gpsprune/commit/24d18ba0dac4954ed785c8aaa8b7d94216603c07
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20181215/5c50ce6b/attachment-0001.html>


More information about the Pkg-grass-devel mailing list