X-Git-Url: https://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fdata%2FDataPoint.java;h=4de97ef219bb60f05153dc4f3a4cbbdf72a2e672;hb=7f5ed2be62905bd37717376dc22d09e5ea7edb4d;hp=cd285d66790a83f263b78a44e0ef11ce1b7517cc;hpb=d3679d647d57c2ee7376ddbf6def2d5b23c04307;p=GpsPrune.git diff --git a/tim/prune/data/DataPoint.java b/tim/prune/data/DataPoint.java index cd285d6..4de97ef 100644 --- a/tim/prune/data/DataPoint.java +++ b/tim/prune/data/DataPoint.java @@ -1,5 +1,7 @@ package tim.prune.data; +import tim.prune.config.Config; + /** * Class to represent a single data point in the series * including all its fields @@ -13,41 +15,83 @@ public class DataPoint private FieldList _fieldList = null; /** Special fields for coordinates */ private Coordinate _latitude = null, _longitude = null; - private Altitude _altitude; + private Altitude _altitude = null; + private Speed _hSpeed = null, _vSpeed = null; private Timestamp _timestamp = null; + /** Attached photo */ private Photo _photo = null; + /** Attached audio clip */ + private AudioClip _audio = null; private String _waypointName = null; - private boolean _pointValid = false; + private boolean _startOfSegment = false; + private boolean _markedForDeletion = false; + private int _modifyCount = 0; /** * Constructor * @param inValueArray array of String values * @param inFieldList list of fields - * @param inAltFormat altitude format + * @param inOptions creation options such as units */ - public DataPoint(String[] inValueArray, FieldList inFieldList, int inAltFormat) + public DataPoint(String[] inValueArray, FieldList inFieldList, PointCreateOptions inOptions) { // save data _fieldValues = inValueArray; // save list of fields _fieldList = inFieldList; + // Remove double quotes around values + removeQuotes(_fieldValues); // parse fields into objects - parseFields(inAltFormat); + parseFields(null, inOptions); } /** * Parse the string values into objects eg Coordinates - * @param inAltFormat altitude format + * @param inField field which has changed, or null for all + * @param inOptions creation options such as units */ - private void parseFields(int inAltFormat) + private void parseFields(Field inField, PointCreateOptions inOptions) { - _latitude = new Latitude(getFieldValue(Field.LATITUDE)); - _longitude = new Longitude(getFieldValue(Field.LONGITUDE)); - _altitude = new Altitude(getFieldValue(Field.ALTITUDE), inAltFormat); - _timestamp = new Timestamp(getFieldValue(Field.TIMESTAMP)); - _waypointName = getFieldValue(Field.WAYPT_NAME); + if (inOptions == null) inOptions = new PointCreateOptions(); + if (inField == null || inField == Field.LATITUDE) { + _latitude = new Latitude(getFieldValue(Field.LATITUDE)); + } + if (inField == null || inField == Field.LONGITUDE) { + _longitude = new Longitude(getFieldValue(Field.LONGITUDE)); + } + if (inField == null || inField == Field.ALTITUDE) + { + Unit altUnit = inOptions.getAltitudeUnits(); + if (_altitude != null && _altitude.getUnit() != null) { + altUnit = _altitude.getUnit(); + } + _altitude = new Altitude(getFieldValue(Field.ALTITUDE), altUnit); + } + if (inField == null || inField == Field.SPEED) + { + _hSpeed = new Speed(getFieldValue(Field.SPEED), inOptions.getSpeedUnits()); + } + if (inField == null || inField == Field.VERTICAL_SPEED) + { + _vSpeed = new Speed(getFieldValue(Field.VERTICAL_SPEED), inOptions.getVerticalSpeedUnits()); + if (!inOptions.getVerticalSpeedsUpwards()) { + _vSpeed.invert(); + } + } + if (inField == null || inField == Field.TIMESTAMP) { + _timestamp = new Timestamp(getFieldValue(Field.TIMESTAMP)); + } + if (inField == null || inField == Field.WAYPT_NAME) { + _waypointName = getFieldValue(Field.WAYPT_NAME); + } + if (inField == null || inField == Field.NEW_SEGMENT) + { + String segmentStr = getFieldValue(Field.NEW_SEGMENT); + if (segmentStr != null) {segmentStr = segmentStr.trim();} + _startOfSegment = (segmentStr != null && (segmentStr.equals("1") || segmentStr.toUpperCase().equals("Y"))); + } } @@ -60,11 +104,20 @@ public class DataPoint public DataPoint(Coordinate inLatitude, Coordinate inLongitude, Altitude inAltitude) { // Only these three fields are available - _fieldValues = new String[0]; - _fieldList = new FieldList(); + _fieldValues = new String[3]; + Field[] fields = {Field.LATITUDE, Field.LONGITUDE, Field.ALTITUDE}; + _fieldList = new FieldList(fields); _latitude = inLatitude; + _fieldValues[0] = inLatitude.output(Coordinate.FORMAT_NONE); _longitude = inLongitude; - _altitude = inAltitude; + _fieldValues[1] = inLongitude.output(Coordinate.FORMAT_NONE); + if (inAltitude == null) { + _altitude = Altitude.NONE; + } + else { + _altitude = inAltitude; + _fieldValues[2] = "" + inAltitude.getValue(); + } _timestamp = new Timestamp(null); } @@ -97,8 +150,9 @@ public class DataPoint * Set (or edit) the specified field value * @param inField Field to set * @param inValue value to set + * @param inUndo true if undo operation, false otherwise */ - public void setFieldValue(Field inField, String inValue) + public void setFieldValue(Field inField, String inValue, boolean inUndo) { // See if this data point already has this field int fieldIndex = _fieldList.getFieldIndex(inField); @@ -120,48 +174,125 @@ public class DataPoint } // Set field value in array _fieldValues[fieldIndex] = inValue; + // Increment edit count on all field edits except segment + if (inField != Field.NEW_SEGMENT) { + setModified(inUndo); + } // Change Coordinate, Altitude, Name or Timestamp fields after edit - if (_altitude != null) - { - parseFields(_altitude.getFormat()); + if (_altitude != null && _altitude.getUnit() != null) { + // Altitude already present so reuse format + parseFields(inField, null); // current units will be used } - else - { - // use default altitude format of metres - parseFields(Altitude.FORMAT_METRES); + else { + // use default altitude format from config + parseFields(inField, Config.getUnitSet().getDefaultOptions()); + } + } + + /** + * Either increment or decrement the modify count, depending on whether it's an undo or not + * @param inUndo true for undo, false otherwise + */ + public void setModified(boolean inUndo) + { + if (!inUndo) { + _modifyCount++; + } + else { + _modifyCount--; } } + /** + * @return field list for this point + */ + public FieldList getFieldList() + { + return _fieldList; + } + + /** @param inFlag true for start of track segment */ + public void setSegmentStart(boolean inFlag) + { + setFieldValue(Field.NEW_SEGMENT, inFlag?"1":null, false); + } + + /** + * Mark the point for deletion + * @param inFlag true to delete, false to keep + */ + public void setMarkedForDeletion(boolean inFlag) { + _markedForDeletion = inFlag; + } + /** @return latitude */ public Coordinate getLatitude() { return _latitude; } + /** @return longitude */ public Coordinate getLongitude() { return _longitude; } + /** @return true if point has altitude */ public boolean hasAltitude() { - return _altitude.isValid(); + return _altitude != null && _altitude.isValid(); } + /** @return altitude */ public Altitude getAltitude() { return _altitude; } + /** @return true if point has horizontal speed (loaded as field) */ + public boolean hasHSpeed() + { + return _hSpeed != null && _hSpeed.isValid(); + } + /** @return horizontal speed */ + public Speed getHSpeed() + { + return _hSpeed; + } + /** @return true if point has vertical speed (loaded as field) */ + public boolean hasVSpeed() + { + return _vSpeed != null && _vSpeed.isValid(); + } + /** @return vertical speed */ + public Speed getVSpeed() + { + return _vSpeed; + } + /** @return true if point has timestamp */ public boolean hasTimestamp() { return _timestamp.isValid(); } + /** @return timestamp */ public Timestamp getTimestamp() { return _timestamp; } + /** @return waypoint name, if any */ public String getWaypointName() { return _waypointName; } + /** @return true if start of new track segment */ + public boolean getSegmentStart() + { + return _startOfSegment; + } + + /** @return true if point marked for deletion */ + public boolean getDeleteFlag() + { + return _markedForDeletion; + } + /** * @return true if point has a waypoint name */ @@ -170,6 +301,13 @@ public class DataPoint return (_waypointName != null && !_waypointName.equals("")); } + /** + * @return true if point has been modified since loading + */ + public boolean isModified() + { + return _modifyCount > 0; + } /** * Compare two DataPoint objects to see if they are duplicates @@ -197,10 +335,7 @@ public class DataPoint { return !inOther.isWaypoint(); } - else - { - return (inOther._waypointName != null && inOther._waypointName.equals(_waypointName)); - } + return (inOther._waypointName != null && inOther._waypointName.equals(_waypointName)); } @@ -208,20 +343,51 @@ public class DataPoint * Set the photo for this data point * @param inPhoto Photo object */ - public void setPhoto(Photo inPhoto) - { + public void setPhoto(Photo inPhoto) { _photo = inPhoto; + _modifyCount++; } - /** * @return associated Photo object */ - public Photo getPhoto() - { + public Photo getPhoto() { return _photo; } + /** + * Set the audio clip for this point + * @param inAudio audio object + */ + public void setAudio(AudioClip inAudio) { + _audio = inAudio; + _modifyCount++; + } + + /** + * @return associated audio object + */ + public AudioClip getAudio() { + return _audio; + } + + /** + * Attach the given media object according to type + * @param inMedia either a photo or an audio clip + */ + public void attachMedia(MediaObject inMedia) + { + if (inMedia != null) { + if (inMedia instanceof Photo) { + setPhoto((Photo) inMedia); + inMedia.setDataPoint(this); + } + else if (inMedia instanceof AudioClip) { + setAudio((AudioClip) inMedia); + inMedia.setDataPoint(this); + } + } + } /** * @return true if the point is valid @@ -231,6 +397,31 @@ public class DataPoint return _latitude.isValid() && _longitude.isValid(); } + /** + * @return true if the point has either a photo or audio attached + */ + public boolean hasMedia() { + return _photo != null || _audio != null; + } + + /** + * @return name of attached photo and/or audio + */ + public String getMediaName() + { + String mediaName = null; + if (_photo != null) mediaName = _photo.getName(); + if (_audio != null) + { + if (mediaName == null) { + mediaName = _audio.getName(); + } + else { + mediaName = mediaName + ", " + _audio.getName(); + } + } + return mediaName; + } /** * Interpolate a set of points between this one and the given one @@ -241,21 +432,33 @@ public class DataPoint public DataPoint[] interpolate(DataPoint inEndPoint, int inNumPoints) { DataPoint[] range = new DataPoint[inNumPoints]; - Coordinate endLatitude = inEndPoint.getLatitude(); - Coordinate endLongitude = inEndPoint.getLongitude(); - Altitude endAltitude = inEndPoint.getAltitude(); - // Loop over points for (int i=0; i