package tim.prune.data;
-import tim.prune.Config;
+import tim.prune.config.Config;
/**
* Class to represent a single data point in the series
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
}
else {
// use default altitude format from config
- parseFields(inField, Config.getUseMetricUnits()?Altitude.Format.METRES:Altitude.Format.FEET);
+ parseFields(inField, Config.getConfigBoolean(Config.KEY_METRIC_UNITS)?Altitude.Format.METRES:Altitude.Format.FEET);
+ }
+ }
+
+ /**
+ * 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
return _latitude.isValid() && _longitude.isValid();
}
-
/**
* Interpolate a set of points between this one and the given one
* @param inEndPoint end point of interpolation
*/
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