X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Fundo%2FUndoDeleteOperation.java;fp=src%2Ftim%2Fprune%2Fundo%2FUndoDeleteOperation.java;h=73d9c4f3c50e984662822401b095fcefc94f3438;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/undo/UndoDeleteOperation.java b/src/tim/prune/undo/UndoDeleteOperation.java new file mode 100644 index 0000000..73d9c4f --- /dev/null +++ b/src/tim/prune/undo/UndoDeleteOperation.java @@ -0,0 +1,56 @@ +package tim.prune.undo; + +import tim.prune.data.TrackInfo; + +/** + * Abstract class to hold the selection handling required by all + * Undo operations which have undeleted something + */ +public abstract class UndoDeleteOperation implements UndoOperation +{ + /** Flag to remember whether the deleted point was at the beginning or end of the selected range */ + private boolean _isAtBoundaryOfSelectedRange = false; + + /** + * @param inAtBoundary true if deleted point was at the beginning or end of the selected range + */ + public void setAtBoundaryOfSelectedRange(boolean inAtBoundary) + { + _isAtBoundaryOfSelectedRange = inAtBoundary; + } + + /** + * Modify the current point/range selection after the delete operation is undone + * @param inTrackInfo track info object + * @param inStartIndex start index of reinserted range + * @param inEndIndex end index of reinserted range + */ + protected void modifySelection(TrackInfo inTrackInfo, int inStartIndex, int inEndIndex) + { + final int numPointsInserted = inEndIndex - inStartIndex + 1; + // See if there is a currently selected point, if so does it need to be modified + final int currentPoint = inTrackInfo.getSelection().getCurrentPointIndex(); + if (currentPoint >= inStartIndex) + { + inTrackInfo.selectPoint(currentPoint + numPointsInserted); + } + // Same for currently selected range + int rangeStart = inTrackInfo.getSelection().getStart(); + int rangeEnd = inTrackInfo.getSelection().getEnd(); + // Was the deleted point at the start or end of the selected range? + final boolean wasAtStart = numPointsInserted == 1 && inStartIndex == rangeStart && _isAtBoundaryOfSelectedRange; + final boolean wasAtEnd = numPointsInserted == 1 && inStartIndex == (rangeEnd+1) && _isAtBoundaryOfSelectedRange; + if (rangeEnd >= inStartIndex && rangeEnd > rangeStart || wasAtStart || wasAtEnd) + { + rangeEnd += numPointsInserted; + if (rangeStart >= inStartIndex) { + rangeStart += numPointsInserted; + } + // Extend selection if the deleted point was at the start or end + if (wasAtStart) { + rangeStart--; + } + inTrackInfo.getSelection().selectRange(rangeStart, rangeEnd); + } + } +}