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); } } }