Skip to content
Commits on Source (6)
# Build script using external exif library
# Build script
# Version number
PRUNENAME=gpsprune_18.6
PRUNENAME=gpsprune_19
# remove compile directory
rm -rf compile
# remove dist directory
......@@ -8,7 +8,7 @@ rm -rf dist
# create compile directory
mkdir compile
# compile java
javac -cp /usr/share/java/metadata-extractor.jar -d compile $( find tim -name "*.java" -print )
javac -d compile $( find tim -name "*.java" -print )
# add other required resources
cp -r tim/prune/lang compile/tim/prune/
cp -r tim/prune/*.txt compile/tim/prune/
......
gpsprune (18.6-3) UNRELEASED; urgency=medium
gpsprune (19-1) unstable; urgency=medium
* New upstream release.
* Strip trailing whitespace from changelog & rules files.
* Bump Standards-Version to 4.1.4, no changes.
* Update Vcs-* URLs for Salsa.
* Add license & copyright for metadata-extractor sources.
* Drop metadata-extractor dependencies & patches.
-- Bas Couwenberg <sebastic@debian.org> Wed, 15 Nov 2017 21:53:26 +0100
-- Bas Couwenberg <sebastic@debian.org> Sun, 13 May 2018 08:14:05 +0200
gpsprune (18.6-2) unstable; urgency=medium
......
......@@ -11,8 +11,7 @@ Build-Depends: ant,
default-jdk,
fastjar,
libjava3d-java,
libvecmath-java,
libmetadata-extractor-java (>= 2.10.1)
libvecmath-java
Standards-Version: 4.1.4
Vcs-Browser: https://salsa.debian.org/debian-gis-team/gpsprune
Vcs-Git: https://salsa.debian.org/debian-gis-team/gpsprune.git
......
......@@ -4,12 +4,12 @@ Upstream-Contact: activityworkshop.net <mail@activityworkshop.net>
Source: https://activityworkshop.net/software/gpsprune/download.html
Files: *
Copyright: 2006-2016, activityworkshop.net <mail@activityworkshop.net>
Copyright: 2006-2018, activityworkshop.net <mail@activityworkshop.net>
License: GPL-2
Files: debian/*
Copyright: 2010-2014, David Paleino <dapal@debian.org>
License: GPL-2
Files: tim/prune/jpeg/drew/*
Copyright: 2002-2015, Drew Noakes
License: Apache-2.0
Files: tim/prune/function/srtm/gen/tiles*.txt
tim/prune/function/srtm/srtmtiles.dat
......@@ -27,6 +27,10 @@ License: public-domain
The tiles*.txt files can be re-generated with the debian/scripts/get-tiles.py
script.
Files: debian/*
Copyright: 2010-2014, David Paleino <dapal@debian.org>
License: GPL-2
License: GPL-2
This package is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as
......@@ -44,3 +48,19 @@ License: GPL-2
On Debian systems, the complete text of the GNU General Public License
version 2 can be found in `/usr/share/common-licenses/GPL-2'.
License: Apache-2.0
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
.
http://www.apache.org/licenses/LICENSE-2.0
.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
.
On Debian systems, the complete text of the Apache License can be found
in `/usr/share/common-licenses/Apache-2.0'.
usr/share/gpsprune/gpsprune.jar:
Main-Class: tim.prune.GpsPrune
Debian-Java-Home: /usr/lib/jvm/default-java
Class-Path: /usr/share/java/j3dcore.jar /usr/share/java/j3dutils.jar /usr/share/java/vecmath.jar /usr/share/gpsprune/gpsprune.jar /usr/share/java/metadata-extractor.jar
Class-Path: /usr/share/java/j3dcore.jar /usr/share/java/j3dutils.jar /usr/share/java/vecmath.jar /usr/share/gpsprune/gpsprune.jar
Description: Disable hasThumbnailData() call.
metadata extractor 2.10.1 no longer provides this method.
Author: Bas Couwenberg <sebastic@debian.org>
Bug-Debian: https://bugs.debian.org/866762
--- a/tim/prune/jpeg/ExternalExifLibrary.java
+++ b/tim/prune/jpeg/ExternalExifLibrary.java
@@ -110,6 +110,7 @@ public class ExternalExifLibrary impleme
}
}
+ /* hasThumbnailData() is no longer support in metadata extractor 2.10.1
if (metadata.containsDirectoryOfType(ExifThumbnailDirectory.class))
{
ExifThumbnailDirectory exifdir = metadata.getFirstDirectoryOfType(ExifThumbnailDirectory.class);
@@ -124,6 +125,7 @@ public class ExternalExifLibrary impleme
data.setThumbnailImage(thumb);
}
}
+ */
}
catch (Exception e) {
--- a/tim/prune/load/JpegLoader.java
+++ b/tim/prune/load/JpegLoader.java
@@ -245,7 +245,7 @@ public class JpegLoader implements Runna
if (timestamp == null && jpegData.getDigitizedTimestamp() != null) {
timestamp = createTimestamp(jpegData.getDigitizedTimestamp());
}
- photo.setExifThumbnail(jpegData.getThumbnailImage());
+ //photo.setExifThumbnail(jpegData.getThumbnailImage());
// Also extract orientation tag for setting rotation state of photo
photo.setRotation(jpegData.getRequiredRotation());
// Set bearing, if any
Description: metadata extractor 2.10.1 support.
Author: Markus Koschany <apo@debian.org>
Bug-Debian: https://bugs.debian.org/866762
Bug: https://github.com/activityworkshop/GpsPrune/issues/13
--- a/tim/prune/jpeg/ExternalExifLibrary.java
+++ b/tim/prune/jpeg/ExternalExifLibrary.java
@@ -34,9 +34,9 @@ public class ExternalExifLibrary impleme
try
{
Metadata metadata = ImageMetadataReader.readMetadata(inFile);
- if (metadata.containsDirectory(GpsDirectory.class))
+ if (metadata.containsDirectoryOfType(GpsDirectory.class))
{
- Directory gpsdir = metadata.getDirectory(GpsDirectory.class);
+ Directory gpsdir = metadata.getFirstDirectoryOfType(GpsDirectory.class);
if (gpsdir.containsTag(GpsDirectory.TAG_LATITUDE)
&& gpsdir.containsTag(GpsDirectory.TAG_LONGITUDE)
&& gpsdir.containsTag(GpsDirectory.TAG_LATITUDE_REF)
@@ -86,9 +86,9 @@ public class ExternalExifLibrary impleme
}
// Tags from Exif directory
- if (metadata.containsDirectory(ExifSubIFDDirectory.class))
+ if (metadata.containsDirectoryOfType(ExifSubIFDDirectory.class))
{
- Directory exifdir = metadata.getDirectory(ExifSubIFDDirectory.class);
+ Directory exifdir = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class);
// Take time and date from exif tags
if (exifdir.containsTag(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL)) {
@@ -99,9 +99,9 @@ public class ExternalExifLibrary impleme
data.setDigitizedTimestamp(exifdir.getString(ExifSubIFDDirectory.TAG_DATETIME_DIGITIZED));
}
}
- if (metadata.containsDirectory(ExifIFD0Directory.class))
+ if (metadata.containsDirectoryOfType(ExifIFD0Directory.class))
{
- Directory exifdir = metadata.getDirectory(ExifIFD0Directory.class);
+ Directory exifdir = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
// Photo rotation code
if (exifdir.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
@@ -110,9 +110,9 @@ public class ExternalExifLibrary impleme
}
}
- if (metadata.containsDirectory(ExifThumbnailDirectory.class))
+ if (metadata.containsDirectoryOfType(ExifThumbnailDirectory.class))
{
- ExifThumbnailDirectory exifdir = metadata.getDirectory(ExifThumbnailDirectory.class);
+ ExifThumbnailDirectory exifdir = metadata.getFirstDirectoryOfType(ExifThumbnailDirectory.class);
// TODO: Check this thumbnail stuff
if (exifdir.hasThumbnailData())
metadata-extractor-2.10.1.patch
metadata-extractor-2.10.1-disable-hasThumbnail.patch
......@@ -5,7 +5,7 @@
#export DH_VERBOSE=1
export JAVA_HOME=/usr/lib/jvm/default-java
export CLASSPATH=/usr/share/java/j3dcore.jar:/usr/share/java/j3dutils.jar:/usr/share/java/vecmath.jar:/usr/share/java/metadata-extractor.jar
export CLASSPATH=/usr/share/java/j3dcore.jar:/usr/share/java/j3dutils.jar:/usr/share/java/vecmath.jar
export JH_JAR_EXTRA=$(shell find tim/prune/lang/ tim/prune/gui/images -type f) tim/prune/function/srtm/srtmtiles.dat
......
......@@ -24,10 +24,10 @@ import tim.prune.data.TrackInfo;
import tim.prune.data.SourceInfo.FILE_TYPE;
import tim.prune.data.Unit;
import tim.prune.function.AsyncMediaLoader;
import tim.prune.function.SaveConfig;
import tim.prune.function.SelectTracksFunction;
import tim.prune.function.edit.FieldEditList;
import tim.prune.function.edit.PointEditor;
import tim.prune.function.settings.SaveConfig;
import tim.prune.gui.MenuManager;
import tim.prune.gui.SidebarController;
import tim.prune.gui.UndoManager;
......@@ -402,16 +402,16 @@ public class App
}
/**
* Complete the add time offset function with the specified offset
* Complete the add time offset function with the specified offset in seconds
* @param inTimeOffset time offset to add (+ve for add, -ve for subtract)
*/
public void finishAddTimeOffset(long inTimeOffset)
public void finishAddTimeOffsetSeconds(long inTimeOffset)
{
// Construct undo information
int selStart = _trackInfo.getSelection().getStart();
int selEnd = _trackInfo.getSelection().getEnd();
UndoAddTimeOffset undo = new UndoAddTimeOffset(selStart, selEnd, inTimeOffset);
if (_trackInfo.getTrack().addTimeOffset(selStart, selEnd, inTimeOffset, false))
if (_trackInfo.getTrack().addTimeOffsetSeconds(selStart, selEnd, inTimeOffset, false))
{
_undoStack.add(undo);
UpdateMessageBroker.informSubscribers(DataSubscriber.DATA_EDITED);
......
......@@ -2,7 +2,43 @@ package tim.prune;
import tim.prune.correlate.AudioCorrelator;
import tim.prune.correlate.PhotoCorrelator;
import tim.prune.function.*;
import tim.prune.function.AboutScreen;
import tim.prune.function.AddAltitudeOffset;
import tim.prune.function.AddTimeOffset;
import tim.prune.function.CheckVersionScreen;
import tim.prune.function.ConnectToPointFunction;
import tim.prune.function.ConvertNamesToTimes;
import tim.prune.function.CreateMarkerWaypointsFunction;
import tim.prune.function.CropToSelection;
import tim.prune.function.DeleteFieldValues;
import tim.prune.function.DeleteSelectedRangeFunction;
import tim.prune.function.DisconnectAudioFunction;
import tim.prune.function.DisconnectPhotoFunction;
import tim.prune.function.DiskCacheConfig;
import tim.prune.function.DownloadOsmFunction;
import tim.prune.function.DuplicatePoint;
import tim.prune.function.FindWaypoint;
import tim.prune.function.FullRangeDetails;
import tim.prune.function.GetWikipediaFunction;
import tim.prune.function.HelpScreen;
import tim.prune.function.IgnoreExifThumb;
import tim.prune.function.InterpolateFunction;
import tim.prune.function.PasteCoordinates;
import tim.prune.function.PhotoPopupFunction;
import tim.prune.function.PlayAudioFunction;
import tim.prune.function.RearrangePhotosFunction;
import tim.prune.function.RearrangeWaypointsFunction;
import tim.prune.function.RemoveAudioFunction;
import tim.prune.function.RemovePhotoFunction;
import tim.prune.function.RotatePhoto;
import tim.prune.function.SearchOsmPoisFunction;
import tim.prune.function.SearchWikipediaNames;
import tim.prune.function.SelectSegmentFunction;
import tim.prune.function.SelectTimezoneFunction;
import tim.prune.function.ShowKeysScreen;
import tim.prune.function.ShowThreeDFunction;
import tim.prune.function.SingleNumericParameterFunction;
import tim.prune.function.StopAudioFunction;
import tim.prune.function.autoplay.AutoplayFunction;
import tim.prune.function.charts.Charter;
import tim.prune.function.compress.CompressTrackFunction;
......@@ -16,6 +52,13 @@ import tim.prune.function.estimate.EstimateTime;
import tim.prune.function.estimate.LearnParameters;
import tim.prune.function.gpsies.GetGpsiesFunction;
import tim.prune.function.gpsies.UploadGpsiesFunction;
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.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;
......@@ -29,7 +72,7 @@ import tim.prune.save.GpxExporter;
import tim.prune.save.ImageExporter;
import tim.prune.save.KmlExporter;
import tim.prune.save.PovExporter;
import tim.prune.save.SvgExporter;
/**
* Class to provide access to functions
......@@ -39,7 +82,6 @@ public abstract class FunctionLibrary
public static GenericFunction FUNCTION_GPXEXPORT = null;
public static GenericFunction FUNCTION_KMLEXPORT = null;
public static PovExporter FUNCTION_POVEXPORT = null;
public static SvgExporter FUNCTION_SVGEXPORT = null;
public static GenericFunction FUNCTION_IMAGEEXPORT = null;
public static GenericFunction FUNCTION_GPSLOAD = null;
public static GenericFunction FUNCTION_GPSSAVE = null;
......@@ -50,6 +92,7 @@ public abstract class FunctionLibrary
public static GenericFunction FUNCTION_SELECT_SEGMENT = null;
public static GenericFunction FUNCTION_SPLIT_SEGMENTS = null;
public static GenericFunction FUNCTION_SEW_SEGMENTS = null;
public static GenericFunction FUNCTION_CREATE_MARKER_WAYPOINTS = null;
public static GenericFunction FUNCTION_REARRANGE_PHOTOS = null;
public static GenericFunction FUNCTION_COMPRESS = null;
public static GenericFunction FUNCTION_MARK_LIFTS = null;
......@@ -63,6 +106,7 @@ public abstract class FunctionLibrary
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;
......@@ -95,13 +139,14 @@ public abstract class FunctionLibrary
public static GenericFunction FUNCTION_CORRELATE_AUDIOS = null;
public static GenericFunction FUNCTION_PLAY_AUDIO = null;
public static GenericFunction FUNCTION_STOP_AUDIO = null;
public static GenericFunction FUNCTION_SET_DISPLAY_SETTINGS = null;
public static GenericFunction FUNCTION_SET_MAP_BG = null;
public static GenericFunction FUNCTION_SET_DISK_CACHE = null;
public static GenericFunction FUNCTION_SET_PATHS = null;
public static GenericFunction FUNCTION_SET_COLOURS = null;
public static SingleNumericParameterFunction FUNCTION_SET_LINE_WIDTH = null;
public static GenericFunction FUNCTION_SET_LANGUAGE = null;
public static SingleNumericParameterFunction FUNCTION_SET_ALTITUDE_TOLERANCE = null;
public static GenericFunction FUNCTION_SET_TIMEZONE = null;
public static GenericFunction FUNCTION_HELP = null;
public static GenericFunction FUNCTION_SHOW_KEYS = null;
public static GenericFunction FUNCTION_ABOUT = null;
......@@ -117,7 +162,6 @@ public abstract class FunctionLibrary
FUNCTION_GPXEXPORT = new GpxExporter(inApp);
FUNCTION_KMLEXPORT = new KmlExporter(inApp);
FUNCTION_POVEXPORT = new PovExporter(inApp);
FUNCTION_SVGEXPORT = new SvgExporter(inApp);
FUNCTION_IMAGEEXPORT = new ImageExporter(inApp);
FUNCTION_GPSLOAD = new BabelLoadFromGps(inApp);
FUNCTION_GPSSAVE = new GpsSaver(inApp);
......@@ -128,6 +172,7 @@ public abstract class FunctionLibrary
FUNCTION_SELECT_SEGMENT = new SelectSegmentFunction(inApp);
FUNCTION_SPLIT_SEGMENTS = new SplitSegmentsFunction(inApp);
FUNCTION_SEW_SEGMENTS = new SewTrackSegmentsFunction(inApp);
FUNCTION_CREATE_MARKER_WAYPOINTS = new CreateMarkerWaypointsFunction(inApp);
FUNCTION_REARRANGE_PHOTOS = new RearrangePhotosFunction(inApp);
FUNCTION_COMPRESS = new CompressTrackFunction(inApp);
FUNCTION_MARK_LIFTS = new MarkLiftsFunction(inApp);
......@@ -141,6 +186,7 @@ public abstract class FunctionLibrary
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);
......@@ -173,13 +219,14 @@ public abstract class FunctionLibrary
FUNCTION_PLAY_AUDIO = new PlayAudioFunction(inApp);
FUNCTION_STOP_AUDIO = new StopAudioFunction(inApp);
FUNCTION_DISCONNECT_AUDIO = new DisconnectAudioFunction(inApp);
FUNCTION_SET_DISPLAY_SETTINGS = new SetDisplaySettings(inApp);
FUNCTION_SET_MAP_BG = new SetMapBgFunction(inApp);
FUNCTION_SET_DISK_CACHE = new DiskCacheConfig(inApp);
FUNCTION_SET_PATHS = new SetPathsFunction(inApp);
FUNCTION_SET_COLOURS = new SetColours(inApp);
FUNCTION_SET_LINE_WIDTH = new SetLineWidth(inApp);
FUNCTION_SET_LANGUAGE = new SetLanguage(inApp);
FUNCTION_SET_ALTITUDE_TOLERANCE = new SetAltitudeTolerance(inApp);
FUNCTION_SET_TIMEZONE = new SelectTimezoneFunction(inApp);
FUNCTION_HELP = new HelpScreen(inApp);
FUNCTION_SHOW_KEYS = new ShowKeysScreen(inApp);
FUNCTION_ABOUT = new AboutScreen(inApp);
......
......@@ -28,17 +28,17 @@ import tim.prune.gui.profile.ProfileChart;
/**
* GpsPrune is a tool to visualize, edit, convert and prune GPS data
* Please see the included readme.txt or http://activityworkshop.net
* This software is copyright activityworkshop.net 2006-2016 and made available through the Gnu GPL version 2.
* Please see the included readme.txt or https://activityworkshop.net
* This software is copyright activityworkshop.net 2006-2018 and made available through the Gnu GPL version 2.
* For license details please see the included license.txt.
* GpsPrune is the main entry point to the application, including initialisation and launch
*/
public class GpsPrune
{
/** Version number of application, used in about screen and for version check */
public static final String VERSION_NUMBER = "18.6";
public static final String VERSION_NUMBER = "19";
/** Build number, just used for about screen */
public static final String BUILD_NUMBER = "343";
public static final String BUILD_NUMBER = "362";
/** Static reference to App object */
private static App APP = null;
......
......@@ -99,6 +99,12 @@ public abstract class Config
public static final String KEY_TERRAIN_GRID_SIZE = "prune.terraingridsize";
/** Key for altitude tolerance */
public static final String KEY_ALTITUDE_TOLERANCE = "prune.altitudetolerance";
/** Key for waypoint icons to use */
public static final String KEY_WAYPOINT_ICONS = "prune.waypointicons";
/** Size of waypoint icons to use */
public static final String KEY_WAYPOINT_ICON_SIZE = "prune.waypointiconsize";
/** Id of selected timezone */
public static final String KEY_TIMEZONE_ID = "prune.timezoneid";
/** Initialise the default properties */
......@@ -194,6 +200,7 @@ public abstract class Config
props.put(KEY_HEIGHT_EXAGGERATION, "100"); // 100%, no exaggeration
props.put(KEY_TERRAIN_GRID_SIZE, "50");
props.put(KEY_ALTITUDE_TOLERANCE, "0"); // 0, all exact as before
props.put(KEY_WAYPOINT_ICON_SIZE, "1"); // medium size
return props;
}
......
package tim.prune.config;
import java.util.TimeZone;
public abstract class TimezoneHelper
{
/**
* @return the timezone selected in the Config
*/
public static TimeZone getSelectedTimezone()
{
final String zoneId = Config.getConfigString(Config.KEY_TIMEZONE_ID);
if (zoneId == null || zoneId.equals("")) {
return TimeZone.getDefault();
}
else {
return TimeZone.getTimeZone(zoneId);
}
}
}
The source code of GpsPrune is copyright 2006-2016 activityworkshop.net
The source code of GpsPrune is copyright 2006-2018 activityworkshop.net
and is distributed under the terms of the Gnu GPL version 2.
Portions of the package jpeg.drew (if included in this package) were taken
from Drew Noakes' "Metadata extractor" v2.3.1 which is
copyright Drew Noakes 2002-2006 and was placed in the public domain.
Portions of the package jpeg.drew were taken
from Drew Noakes' "Metadata extractor" v2.7.2 which is
copyright Drew Noakes 2002-2015 and released under Apache 2.0.
Translations are copyright various contributors, some of whom are named
in the source code and some preferred to remain anonymous.
\ No newline at end of file
......@@ -11,6 +11,7 @@ import tim.prune.App;
import tim.prune.DataSubscriber;
import tim.prune.I18nManager;
import tim.prune.UpdateMessageBroker;
import tim.prune.config.TimezoneHelper;
import tim.prune.data.AudioClip;
import tim.prune.data.AudioList;
import tim.prune.data.DataPoint;
......@@ -18,6 +19,7 @@ import tim.prune.data.MediaObject;
import tim.prune.data.MediaList;
import tim.prune.data.TimeDifference;
import tim.prune.data.Timestamp;
import tim.prune.data.TimestampUtc;
import tim.prune.undo.UndoCorrelateAudios;
/**
......@@ -164,14 +166,19 @@ public class AudioCorrelator extends Correlator
protected Timestamp getMediaTimestamp(MediaObject inMedia)
{
Timestamp tstamp = super.getMediaTimestamp(inMedia);
long mediaMillis = tstamp.getMilliseconds(TimezoneHelper.getSelectedTimezone());
try {
AudioClip audio = (AudioClip) inMedia;
int audioLength = audio.getLengthInSeconds();
// Each option is worth half the length of the audio clip, so need to divide by 2
int secsToAdd = audioLength *
(_correlTimesSelector.getSelectedOption() - _fileTimesSelector.getSelectedOption()) / 2;
if (audioLength > 0 && secsToAdd != 0) {
tstamp = tstamp.createPlusOffset(secsToAdd);
if (audioLength > 0 && secsToAdd != 0)
{
mediaMillis += (secsToAdd * 1000L);
tstamp = new TimestampUtc(mediaMillis);
// Here we create a Utc timestamp but it's only temporary for the correlation
// so it will never have to react to timezone changes
}
}
catch (ClassCastException cce) {}
......
......@@ -6,8 +6,8 @@ import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.Iterator;
import java.util.TimeZone;
import java.util.TreeSet;
import javax.swing.BorderFactory;
......@@ -27,6 +27,7 @@ import javax.swing.JTextField;
import tim.prune.App;
import tim.prune.GenericFunction;
import tim.prune.I18nManager;
import tim.prune.config.TimezoneHelper;
import tim.prune.data.DataPoint;
import tim.prune.data.Distance;
import tim.prune.data.Field;
......@@ -50,6 +51,7 @@ public abstract class Correlator extends GenericFunction
protected JTable _previewTable = null;
private boolean _previewEnabled = false; // flag required to enable preview function on final panel
private boolean[] _cardEnabled = null; // flag for each card
private TimeZone _timezone = null;
private JTextField _offsetHourBox = null, _offsetMinBox = null, _offsetSecBox = null;
private JRadioButton _mediaLaterOption = null, _pointLaterOption = null;
private JRadioButton _timeLimitRadio = null, _distLimitRadio = null;
......@@ -59,6 +61,7 @@ public abstract class Correlator extends GenericFunction
private JButton _nextButton = null, _backButton = null;
protected JButton _okButton = null;
/**
* Constructor
* @param inApp App object to report actions to
......@@ -110,13 +113,17 @@ public abstract class Correlator extends GenericFunction
_dialog.getContentPane().add(makeDialogContents());
_dialog.pack();
}
_okButton.setEnabled(false);
// Init timezone to the currently selected one
_timezone = TimezoneHelper.getSelectedTimezone();
// Go to first available card
int card = 0;
_cardEnabled = null;
while (!isCardEnabled(card)) {card++;}
while (!isCardEnabled(card)) {
card++;
}
_cards.showCard(card);
showCard(0); // does set up and next/prev enabling
_okButton.setEnabled(false);
if (!isCardEnabled(1)) {
_app.showTip(TipManager.Tip_ManuallyCorrelateOne);
}
......@@ -205,7 +212,7 @@ public abstract class Correlator extends GenericFunction
&& media.getOriginalStatus() == MediaObject.Status.NOT_CONNECTED)
{
// Calculate time difference, add to table model
long timeDiff = getMediaTimestamp(media).getSecondsSince(media.getDataPoint().getTimestamp());
long timeDiff = getMediaTimestamp(media).getSecondsSince(media.getDataPoint().getTimestamp(), _timezone);
model.addMedia(media, timeDiff);
}
}
......@@ -242,27 +249,6 @@ public abstract class Correlator extends GenericFunction
}
/**
* @param inFirstTimestamp timestamp of first photo / audio object, or null if not available
* @return time difference of local time zone from UTC when the first photo was taken
*/
private static TimeDifference getTimezoneOffset(Timestamp inFirstTimestamp)
{
Calendar cal = null;
// Use first timestamp if available
if (inFirstTimestamp != null) {
cal = inFirstTimestamp.getCalendar();
}
else {
// No photo or no timestamp, just use current time
cal = Calendar.getInstance();
}
// Both time zone offset and dst offset are based on milliseconds, so convert to seconds
TimeDifference timeDiff = new TimeDifference((cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) / 1000);
return timeDiff;
}
/**
* Calculate the median index to select from the table
* @param inModel table model
......@@ -478,7 +464,9 @@ public abstract class Correlator extends GenericFunction
*/
private boolean isCardEnabled(int inCardNum)
{
if (_cardEnabled == null) {_cardEnabled = getCardEnabledFlags();}
if (_cardEnabled == null) {
_cardEnabled = getCardEnabledFlags();
}
return (inCardNum >= 0 && inCardNum < _cardEnabled.length && _cardEnabled[inCardNum]);
}
......@@ -595,7 +583,9 @@ public abstract class Correlator extends GenericFunction
public void createPreview(boolean inFromButton)
{
// Exit if still on first panel
if (!_previewEnabled) {return;}
if (!_previewEnabled) {
return;
}
// Create a TimeDifference based on the edit boxes
int numHours = getValue(_offsetHourBox.getText());
int numMins = getValue(_offsetMinBox.getText());
......@@ -615,12 +605,8 @@ public abstract class Correlator extends GenericFunction
TimeDifference timeDiff = inTimeDiff;
if (timeDiff == null)
{
// No time difference available, so calculate based on computer's time zone
Timestamp tstamp = null;
if (inFirstMedia != null) {
tstamp = inFirstMedia.getTimestamp();
}
timeDiff = getTimezoneOffset(tstamp);
// No time difference available, so try with zero
timeDiff = new TimeDifference(0L);
}
// Use time difference to set edit boxes
_offsetHourBox.setText("" + timeDiff.getNumHours());
......@@ -664,7 +650,7 @@ public abstract class Correlator extends GenericFunction
if (inMedia.hasTimestamp())
{
// Add/subtract offset to media timestamp
Timestamp mediaStamp = getMediaTimestamp(inMedia).createMinusOffset(inOffset);
Timestamp mediaStamp = getMediaTimestamp(inMedia);
int numPoints = inTrack.getNumPoints();
for (int i=0; i<numPoints; i++)
{
......@@ -674,7 +660,8 @@ public abstract class Correlator extends GenericFunction
Timestamp pointStamp = point.getTimestamp();
if (pointStamp != null && pointStamp.isValid())
{
long numSeconds = pointStamp.getSecondsSince(mediaStamp);
long numSeconds = pointStamp.getSecondsSince(mediaStamp, _timezone)
+ inOffset.getTotalSeconds();
pair.addPoint(point, numSeconds);
}
}
......
package tim.prune.correlate;
import java.util.ArrayList;
import java.util.TimeZone;
import javax.swing.table.AbstractTableModel;
import tim.prune.I18nManager;
import tim.prune.config.TimezoneHelper;
import tim.prune.data.Unit;
import tim.prune.data.UnitSetLibrary;
import tim.prune.gui.DisplayUtils;
......@@ -19,14 +22,18 @@ public class MediaPreviewTableModel extends AbstractTableModel
private ArrayList<MediaPreviewTableRow> _list = new ArrayList<MediaPreviewTableRow>();
/** Distance units */
private Unit _distanceUnits = UnitSetLibrary.UNITS_KILOMETRES;
/** Current timezone */
private TimeZone _timezone = null;
/**
* Constructor
* @param inFirstColumnKey key for first column heading
*/
public MediaPreviewTableModel(String inFirstColumnKey) {
public MediaPreviewTableModel(String inFirstColumnKey)
{
_firstColumnHeading = I18nManager.getText(inFirstColumnKey);
_timezone = TimezoneHelper.getSelectedTimezone();
}
/**
......@@ -83,7 +90,7 @@ public class MediaPreviewTableModel extends AbstractTableModel
if (inColumnIndex == 0) return row.getMedia().getName();
else if (inColumnIndex == 1) {
if (row.getMedia().hasTimestamp()) {
return row.getMedia().getTimestamp().getText();
return row.getMedia().getTimestamp().getText(_timezone);
}
return ""; // media doesn't have a timestamp
}
......
package tim.prune.correlate;
import java.util.ArrayList;
import java.util.TimeZone;
import javax.swing.table.AbstractTableModel;
import tim.prune.I18nManager;
import tim.prune.config.TimezoneHelper;
import tim.prune.data.MediaObject;
......@@ -18,6 +21,8 @@ public class MediaSelectionTableModel extends AbstractTableModel
private String _lastColumnHeading = null;
/** List of rows */
private ArrayList<MediaSelectionTableRow> _list = new ArrayList<MediaSelectionTableRow>();
/** Current timezone */
private TimeZone _timezone = null;
/**
......@@ -29,6 +34,7 @@ public class MediaSelectionTableModel extends AbstractTableModel
{
_firstColumnHeading = I18nManager.getText(inFirstColumnKey);
_lastColumnHeading = I18nManager.getText(inLastColumnKey);
_timezone = TimezoneHelper.getSelectedTimezone();
}
/**
......@@ -84,7 +90,8 @@ public class MediaSelectionTableModel extends AbstractTableModel
MediaSelectionTableRow row = _list.get(inRowIndex);
if (inColumnIndex == 0) return row.getMedia().getName();
else if (inColumnIndex == 1) {
return (row.getMedia().hasTimestamp() ? row.getMedia().getTimestamp().getText() : "");
return (row.getMedia().hasTimestamp() ?
row.getMedia().getTimestamp().getText(_timezone) : "");
}
else if (inColumnIndex == 2) return row.getTimeDiff().getDescription();
return (row.getTimeDiff().getIsPositive() ? I18nManager.getText("dialog.about.yes") :
......
......@@ -170,27 +170,25 @@ public class AltitudeRange
*/
public boolean hasRange()
{
return _range.getMaximum() > _range.getMinimum();
return _range.hasValues();
}
/**
* @param inUnit altitude units to use
* @return minimum value, or -1 if none found
* @return minimum value
*/
public int getMinimum(Unit inUnit)
{
if (_range.getMinimum() <= 0) return _range.getMinimum();
return (int) (_range.getMinimum() * inUnit.getMultFactorFromStd());
}
/**
* @param inUnit altitude units to use
* @return maximum value, or -1 if none found
* @return maximum value
*/
public int getMaximum(Unit inUnit)
{
if (_range.getMaximum() <= 0) return _range.getMaximum();
return (int) (_range.getMaximum() * inUnit.getMultFactorFromStd());
}
......