package tim.prune.undo;
import tim.prune.I18nManager;
import tim.prune.UpdateMessageBroker;
import tim.prune.data.DataPoint;
import tim.prune.data.Field;
import tim.prune.data.Track;
import tim.prune.data.TrackInfo;
/**
* Undo lookup of altitudes from SRTM data
*/
public class UndoLookupSrtm implements UndoOperation
{
/** DataPoint objects which didn't have altitudes before */
private DataPoint[] _points;
/** Altitude strings if present */
private String[] _altitudes;
/**
* Constructor
* @param inTrackInfo track info object
*/
public UndoLookupSrtm(TrackInfo inTrackInfo)
{
Track track = inTrackInfo.getTrack();
int numPoints = track.getNumPoints();
// Make arrays of points and altitudes
_points = new DataPoint[numPoints];
_altitudes = new String[numPoints];
for (int i=0; i<numPoints; i++)
{
DataPoint point = track.getPoint(i);
if (!point.hasAltitude() || point.getAltitude().getValue() == 0)
{
_points[i] = point;
if (point.hasAltitude()) {
_altitudes[i] = point.getFieldValue(Field.ALTITUDE);
}
}
}
}
/**
* @return description of operation
*/
public String getDescription()
{
return I18nManager.getText("undo.lookupsrtm");
}
/**
* Perform the undo operation on the given Track
* @param inTrackInfo TrackInfo object on which to perform the operation
*/
public void performUndo(TrackInfo inTrackInfo) throws UndoException
{
// Loop through points again, and reset altitudes if they have one
final int numPoints = _points.length;
for (int i=0; i<numPoints; i++) {
DataPoint point = _points[i];
if (point != null && point.hasAltitude()) {
if (_altitudes[i] == null) {
point.setFieldValue(Field.ALTITUDE, null, true);
}
else {
point.setFieldValue(Field.ALTITUDE, _altitudes[i], true);
}
}
}
_points = null;
UpdateMessageBroker.informSubscribers();
}
}