]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/undo/UndoDeleteOperation.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / undo / UndoDeleteOperation.java
diff --git a/src/tim/prune/undo/UndoDeleteOperation.java b/src/tim/prune/undo/UndoDeleteOperation.java
new file mode 100644 (file)
index 0000000..73d9c4f
--- /dev/null
@@ -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);
+               }
+       }
+}