+++ /dev/null
-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