1 package tim.prune.undo;
\r
3 import tim.prune.I18nManager;
\r
4 import tim.prune.data.AudioList;
\r
5 import tim.prune.data.DataPoint;
\r
6 import tim.prune.data.PhotoList;
\r
7 import tim.prune.data.TrackInfo;
\r
10 * Operation to undo a delete of a range of points
\r
12 public class UndoDeleteRange implements UndoOperation
\r
15 * Inner class to hold a single range information set
\r
17 static class RangeInfo
\r
19 public int _startIndex = -1;
\r
20 public DataPoint[] _points = null;
\r
21 public DataPoint _nextTrackPoint = null;
\r
22 public boolean _segmentStart = false;
\r
25 * @param inPoint next track point after deleted section, or null
\r
27 public void setNextTrackPoint(DataPoint inPoint)
\r
29 _nextTrackPoint = inPoint;
\r
30 if (inPoint != null) {
\r
31 _segmentStart = inPoint.getSegmentStart();
\r
37 * @return true if the range is valid
\r
39 public boolean isValid()
\r
41 return _startIndex >= 0 && _points != null && _points.length > 0;
\r
46 // Instance variables for UndoDeleteRange
\r
47 private RangeInfo _rangeInfo1 = null;
\r
48 private RangeInfo _rangeInfo2 = null;
\r
49 private PhotoList _photoList = null;
\r
50 private AudioList _audioList = null;
\r
51 private String _nameKey = null;
\r
52 private int _totalDeleted = 0;
\r
57 * @param inTrackInfo track info object
\r
58 * @param inNameKey key to use for undo text
\r
59 * @param inStartIndex1 start index of first deleted segment
\r
60 * @param inDeleteMedias1 flags to delete media for range1
\r
61 * @param inStartIndex2 start index of second segment
\r
62 * @param inDeleteMedias2 flags to delete media for range2
\r
64 public UndoDeleteRange(TrackInfo inTrackInfo, String inNameKey,
\r
65 int inStartIndex1, boolean[] inDeleteMedias1,
\r
66 int inStartIndex2, boolean[] inDeleteMedias2)
\r
68 _nameKey = inNameKey;
\r
69 boolean mediaDeleted = false;
\r
71 // Check if there's a valid first range
\r
72 if (inStartIndex1 >= 0 && inDeleteMedias1 != null)
\r
74 final int numPoints = inDeleteMedias1.length;
\r
77 _totalDeleted += numPoints;
\r
78 _rangeInfo1 = new RangeInfo();
\r
79 _rangeInfo1._startIndex = inStartIndex1;
\r
81 for (int i=0; i<numPoints && !mediaDeleted; i++) {
\r
82 if (inDeleteMedias1[i]) mediaDeleted = true;
\r
85 _rangeInfo1._points = inTrackInfo.getTrack().cloneRange(inStartIndex1, inStartIndex1 + numPoints - 1);
\r
86 // Save segment flag of following track point
\r
87 _rangeInfo1.setNextTrackPoint(inTrackInfo.getTrack().getNextTrackPoint(inStartIndex1 + numPoints));
\r
90 // And the same for the second range, if any
\r
91 if (inStartIndex2 >= 0 && inDeleteMedias2 != null)
\r
93 final int numPoints = inDeleteMedias2.length;
\r
96 _totalDeleted += numPoints;
\r
97 _rangeInfo2 = new RangeInfo();
\r
98 _rangeInfo2._startIndex = inStartIndex2;
\r
99 for (int i=0; i<numPoints && !mediaDeleted; i++) {
\r
100 if (inDeleteMedias2[i]) mediaDeleted = true;
\r
104 _rangeInfo2._points = inTrackInfo.getTrack().cloneRange(inStartIndex2, inStartIndex2 + numPoints - 1);
\r
105 // Save segment flag of following track point
\r
106 _rangeInfo2.setNextTrackPoint(inTrackInfo.getTrack().getNextTrackPoint(inStartIndex2 + numPoints));
\r
109 // If any media have been deleted, then the lists must be copied
\r
112 _photoList = inTrackInfo.getPhotoList().cloneList();
\r
113 _audioList = inTrackInfo.getAudioList().cloneList();
\r
119 * @return description of operation including number of points deleted
\r
121 public String getDescription()
\r
123 return I18nManager.getText(_nameKey) + " (" + _totalDeleted + ")";
\r
128 * Perform the undo operation on the given Track
\r
129 * @param inTrackInfo TrackInfo object on which to perform the operation
\r
131 public void performUndo(TrackInfo inTrackInfo)
\r
133 // restore photos and audios to how they were before
\r
134 if (_photoList != null) {
\r
135 inTrackInfo.getPhotoList().restore(_photoList);
\r
137 if (_audioList != null) {
\r
138 inTrackInfo.getAudioList().restore(_audioList);
\r
141 // Undo both the ranges
\r
142 performUndo(inTrackInfo, _rangeInfo1);
\r
143 performUndo(inTrackInfo, _rangeInfo2);
\r
147 * Perform the undo on a single deleted range
\r
148 * @param inTrackInfo track info object
\r
149 * @param inRangeInfo info object describing deleted range
\r
151 private void performUndo(TrackInfo inTrackInfo, RangeInfo inRangeInfo)
\r
153 if (inRangeInfo == null || !inRangeInfo.isValid()) return;
\r
155 // reconnect photos and audios to points
\r
156 final int numPoints = inRangeInfo._points.length;
\r
157 for (int i=0; i<numPoints; i++)
\r
159 DataPoint point = inRangeInfo._points[i];
\r
160 if (point != null && point.hasMedia())
\r
162 if (point.getPhoto() != null) {
\r
163 point.getPhoto().setDataPoint(point);
\r
165 if (point.getAudio() != null) {
\r
166 point.getAudio().setDataPoint(point);
\r
170 // restore point array into track
\r
171 inTrackInfo.getTrack().insertRange(inRangeInfo._points, inRangeInfo._startIndex);
\r
172 // Restore segment flag of following track point
\r
173 if (inRangeInfo._nextTrackPoint != null) {
\r
174 inRangeInfo._nextTrackPoint.setSegmentStart(inRangeInfo._segmentStart);
\r