--- /dev/null
+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();
+ }
+}