*/
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 static void modifySelection(TrackInfo inTrackInfo, int inStartIndex, int inEndIndex)
+ 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
// Same for currently selected range
int rangeStart = inTrackInfo.getSelection().getStart();
int rangeEnd = inTrackInfo.getSelection().getEnd();
- if (rangeEnd >= inStartIndex && rangeEnd > rangeStart)
+ // 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);
}
}