]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/undo/UndoDeleteRange.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / undo / UndoDeleteRange.java
diff --git a/src/tim/prune/undo/UndoDeleteRange.java b/src/tim/prune/undo/UndoDeleteRange.java
new file mode 100644 (file)
index 0000000..da42bc4
--- /dev/null
@@ -0,0 +1,192 @@
+package tim.prune.undo;\r
+\r
+import tim.prune.I18nManager;\r
+import tim.prune.data.AudioList;\r
+import tim.prune.data.DataPoint;\r
+import tim.prune.data.PhotoList;\r
+import tim.prune.data.TrackInfo;\r
+\r
+/**\r
+ * Operation to undo a delete of a range of points\r
+ */\r
+public class UndoDeleteRange extends UndoDeleteOperation\r
+{\r
+       /**\r
+        * Inner class to hold a single range information set\r
+        */\r
+       static class RangeInfo\r
+       {\r
+               public int _startIndex = -1;\r
+               public DataPoint[] _points = null;\r
+               public DataPoint _nextTrackPoint = null;\r
+               public boolean _segmentStart = false;\r
+\r
+               /**\r
+                * @param inPoint next track point after deleted section, or null\r
+                */\r
+               public void setNextTrackPoint(DataPoint inPoint)\r
+               {\r
+                       _nextTrackPoint = inPoint;\r
+                       if (inPoint != null) {\r
+                               _segmentStart = inPoint.getSegmentStart();\r
+                       }\r
+\r
+               }\r
+\r
+               /**\r
+                * @return true if the range is valid\r
+                */\r
+               public boolean isValid()\r
+               {\r
+                       return _startIndex >= 0 && _points != null && _points.length > 0;\r
+               }\r
+\r
+               /**\r
+                * @return end index of range\r
+                */\r
+               public int getEndIndex()\r
+               {\r
+                       return _startIndex + _points.length - 1;\r
+               }\r
+       }\r
+\r
+\r
+       // Instance variables for UndoDeleteRange\r
+       private RangeInfo _rangeInfo1 = null;\r
+       private RangeInfo _rangeInfo2 = null;\r
+       private PhotoList _photoList = null;\r
+       private AudioList _audioList = null;\r
+       private String _nameKey = null;\r
+       private int _totalDeleted = 0;\r
+\r
+\r
+       /**\r
+        * Constructor\r
+        * @param inTrackInfo track info object\r
+        * @param inNameKey key to use for undo text\r
+        * @param inStartIndex1 start index of first deleted segment\r
+        * @param inDeleteMedias1 flags to delete media for range1\r
+        * @param inStartIndex2 start index of second segment\r
+        * @param inDeleteMedias2 flags to delete media for range2\r
+        */\r
+       public UndoDeleteRange(TrackInfo inTrackInfo, String inNameKey,\r
+               int inStartIndex1, boolean[] inDeleteMedias1,\r
+               int inStartIndex2, boolean[] inDeleteMedias2)\r
+       {\r
+               _nameKey = inNameKey;\r
+               boolean mediaDeleted = false;\r
+               _totalDeleted = 0;\r
+               // Check if there's a valid first range\r
+               if (inStartIndex1 >= 0 && inDeleteMedias1 != null)\r
+               {\r
+                       final int numPoints = inDeleteMedias1.length;\r
+                       if (numPoints > 0)\r
+                       {\r
+                               _totalDeleted += numPoints;\r
+                               _rangeInfo1 = new RangeInfo();\r
+                               _rangeInfo1._startIndex = inStartIndex1;\r
+\r
+                               for (int i=0; i<numPoints && !mediaDeleted; i++) {\r
+                                       if (inDeleteMedias1[i]) mediaDeleted = true;\r
+                               }\r
+                               // Clone points\r
+                               _rangeInfo1._points = inTrackInfo.getTrack().cloneRange(inStartIndex1, inStartIndex1 + numPoints - 1);\r
+                               // Save segment flag of following track point\r
+                               _rangeInfo1.setNextTrackPoint(inTrackInfo.getTrack().getNextTrackPoint(inStartIndex1 + numPoints));\r
+                       }\r
+               }\r
+               // And the same for the second range, if any\r
+               if (inStartIndex2 >= 0 && inDeleteMedias2 != null)\r
+               {\r
+                       final int numPoints = inDeleteMedias2.length;\r
+                       if (numPoints > 0)\r
+                       {\r
+                               _totalDeleted += numPoints;\r
+                               _rangeInfo2 = new RangeInfo();\r
+                               _rangeInfo2._startIndex = inStartIndex2;\r
+                               for (int i=0; i<numPoints && !mediaDeleted; i++) {\r
+                                       if (inDeleteMedias2[i]) mediaDeleted = true;\r
+                               }\r
+\r
+                               // Clone points\r
+                               _rangeInfo2._points = inTrackInfo.getTrack().cloneRange(inStartIndex2, inStartIndex2 + numPoints - 1);\r
+                               // Save segment flag of following track point\r
+                               _rangeInfo2.setNextTrackPoint(inTrackInfo.getTrack().getNextTrackPoint(inStartIndex2 + numPoints));\r
+                       }\r
+               }\r
+               // If any media have been deleted, then the lists must be copied\r
+               if (mediaDeleted)\r
+               {\r
+                       _photoList = inTrackInfo.getPhotoList().cloneList();\r
+                       _audioList = inTrackInfo.getAudioList().cloneList();\r
+               }\r
+       }\r
+\r
+\r
+       /**\r
+        * @return description of operation including number of points deleted\r
+        */\r
+       public String getDescription()\r
+       {\r
+               return I18nManager.getText(_nameKey) + " (" + _totalDeleted + ")";\r
+       }\r
+\r
+\r
+       /**\r
+        * Perform the undo operation on the given Track\r
+        * @param inTrackInfo TrackInfo object on which to perform the operation\r
+        */\r
+       public void performUndo(TrackInfo inTrackInfo)\r
+       {\r
+               // restore photos and audios to how they were before\r
+               if (_photoList != null) {\r
+                       inTrackInfo.getPhotoList().restore(_photoList);\r
+               }\r
+               if (_audioList != null) {\r
+                       inTrackInfo.getAudioList().restore(_audioList);\r
+               }\r
+\r
+               // Undo both the ranges\r
+               performUndo(inTrackInfo, _rangeInfo1);\r
+               performUndo(inTrackInfo, _rangeInfo2);\r
+               // If there's a current point/range selected, maybe need to adjust start and/or end\r
+               if (_rangeInfo1 != null && _rangeInfo1.isValid()) {\r
+                       modifySelection(inTrackInfo, _rangeInfo1._startIndex, _rangeInfo1.getEndIndex());\r
+               }\r
+               if (_rangeInfo2 != null && _rangeInfo2.isValid()) {\r
+                       modifySelection(inTrackInfo, _rangeInfo2._startIndex, _rangeInfo2.getEndIndex());\r
+               }\r
+       }\r
+\r
+       /**\r
+        * Perform the undo on a single deleted range\r
+        * @param inTrackInfo track info object\r
+        * @param inRangeInfo info object describing deleted range\r
+        */\r
+       private void performUndo(TrackInfo inTrackInfo, RangeInfo inRangeInfo)\r
+       {\r
+               if (inRangeInfo == null || !inRangeInfo.isValid()) return;\r
+\r
+               // reconnect photos and audios to points\r
+               final int numPoints = inRangeInfo._points.length;\r
+               for (int i=0; i<numPoints; i++)\r
+               {\r
+                       DataPoint point = inRangeInfo._points[i];\r
+                       if (point != null && point.hasMedia())\r
+                       {\r
+                               if (point.getPhoto() != null) {\r
+                                       point.getPhoto().setDataPoint(point);\r
+                               }\r
+                               if (point.getAudio() != null) {\r
+                                       point.getAudio().setDataPoint(point);\r
+                               }\r
+                       }\r
+               }\r
+               // restore point array into track\r
+               inTrackInfo.getTrack().insertRange(inRangeInfo._points, inRangeInfo._startIndex);\r
+               // Restore segment flag of following track point\r
+               if (inRangeInfo._nextTrackPoint != null) {\r
+                       inRangeInfo._nextTrackPoint.setSegmentStart(inRangeInfo._segmentStart);\r
+               }\r
+       }\r
+}\r