]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/undo/UndoDeleteRange.java
Version 14, October 2012
[GpsPrune.git] / tim / prune / undo / UndoDeleteRange.java
index e2a76995ebb478ec868c9e4a8c68b8a9d4fcfed8..ba2b31ab5ef89540b8496be4e8908f0a9855ae7e 100644 (file)
@@ -1,6 +1,7 @@
 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
@@ -10,37 +11,116 @@ import tim.prune.data.TrackInfo;
  */\r
 public class UndoDeleteRange implements UndoOperation\r
 {\r
-       private int _startIndex = -1;\r
-       private DataPoint[] _points = null;\r
+       /**\r
+        * Inner class to hold a single range information set\r
+        */\r
+       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
+\r
+       // Instance variables for UndoDeleteRange\r
+       private RangeInfo _rangeInfo1 = null;\r
+       private RangeInfo _rangeInfo2 = null;\r
        private PhotoList _photoList = null;\r
-       private DataPoint _nextTrackPoint = null;\r
-       private boolean _segmentStart = false;\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)\r
+       public UndoDeleteRange(TrackInfo inTrackInfo, String inNameKey,\r
+               int inStartIndex1, boolean[] inDeleteMedias1,\r
+               int inStartIndex2, boolean[] inDeleteMedias2)\r
        {\r
-               _startIndex = inTrackInfo.getSelection().getStart();\r
-               _points = inTrackInfo.cloneSelectedRange();\r
-               _photoList = inTrackInfo.getPhotoList().cloneList();\r
-               // Save segment flag of following track point\r
-               _nextTrackPoint = inTrackInfo.getTrack().getNextTrackPoint(_startIndex + _points.length);\r
-               if (_nextTrackPoint != null) {\r
-                       _segmentStart = _nextTrackPoint.getSegmentStart();\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 range length\r
+        * @return description of operation including number of points deleted\r
         */\r
        public String getDescription()\r
        {\r
-               return I18nManager.getText("undo.deleterange")\r
-                       + " (" + _points.length + ")";\r
+               return I18nManager.getText(_nameKey) + " (" + _totalDeleted + ")";\r
        }\r
 \r
 \r
@@ -50,22 +130,48 @@ public class UndoDeleteRange implements UndoOperation
         */\r
        public void performUndo(TrackInfo inTrackInfo)\r
        {\r
-               // restore photos to how they were before\r
-               inTrackInfo.getPhotoList().restore(_photoList);\r
-               // reconnect photos to points\r
-               for (int i=0; i<_points.length; i++)\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
+       }\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 = _points[i];\r
-                       if (point != null && point.getPhoto() != null)\r
+                       DataPoint point = inRangeInfo._points[i];\r
+                       if (point != null && point.hasMedia())\r
                        {\r
-                               point.getPhoto().setDataPoint(point);\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(_points, _startIndex);\r
+               inTrackInfo.getTrack().insertRange(inRangeInfo._points, inRangeInfo._startIndex);\r
                // Restore segment flag of following track point\r
-               if (_nextTrackPoint != null) {\r
-                       _nextTrackPoint.setSegmentStart(_segmentStart);\r
+               if (inRangeInfo._nextTrackPoint != null) {\r
+                       inRangeInfo._nextTrackPoint.setSegmentStart(inRangeInfo._segmentStart);\r
                }\r
        }\r
-}
\ No newline at end of file
+}\r