package tim.prune.data;
-import tim.prune.Config;
+import tim.prune.config.Config;
/**
* Class to represent a single data point in the series
private Coordinate _latitude = null, _longitude = null;
private Altitude _altitude;
private Timestamp _timestamp = null;
+ /** Attached photo */
private Photo _photo = null;
+ /** Attached audio clip */
+ private AudioClip _audio = null;
private String _waypointName = null;
private boolean _startOfSegment = false;
private boolean _markedForDeletion = false;
-
+ private int _modifyCount = 0;
/**
* Constructor
if (inField == null || inField == Field.WAYPT_NAME) {
_waypointName = getFieldValue(Field.WAYPT_NAME);
}
- if (inField == null || inField == Field.NEW_SEGMENT) {
+ 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")));
Field[] fields = {Field.LATITUDE, Field.LONGITUDE, Field.ALTITUDE};
_fieldList = new FieldList(fields);
_latitude = inLatitude;
- _fieldValues[0] = inLatitude.output(Coordinate.FORMAT_DEG_MIN_SEC);
+ _fieldValues[0] = inLatitude.output(Coordinate.FORMAT_NONE);
_longitude = inLongitude;
- _fieldValues[1] = inLongitude.output(Coordinate.FORMAT_DEG_MIN_SEC);
+ _fieldValues[1] = inLongitude.output(Coordinate.FORMAT_NONE);
if (inAltitude == null) {
_altitude = Altitude.NONE;
}
else {
_altitude = inAltitude;
- _fieldValues[2] = "" + inAltitude.getValue(Altitude.Format.METRES); // units are ignored
+ _fieldValues[2] = "" + inAltitude.getValue();
}
_timestamp = new Timestamp(null);
}
* 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);
}
// 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 && _altitude.getFormat() != Altitude.Format.NO_FORMAT) {
// Altitude already present so reuse format
}
}
+ /**
+ * 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);
+ setFieldValue(Field.NEW_SEGMENT, inFlag?"1":null, false);
}
/**
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
* 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
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;
+ }
/**
* Interpolate a set of points between this one and the given one
*/
public DataPoint clonePoint()
{
- // Copy all values
+ // Copy all values (note that photo not copied)
String[] valuesCopy = new String[_fieldValues.length];
System.arraycopy(_fieldValues, 0, valuesCopy, 0, _fieldValues.length);
// Make new object to hold cloned data