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 extends UndoDeleteOperation
\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
45 * @return end index of range
\r
47 public int getEndIndex()
\r
49 return _startIndex + _points.length - 1;
\r
54 // Instance variables for UndoDeleteRange
\r
55 private RangeInfo _rangeInfo1 = null;
\r
56 private RangeInfo _rangeInfo2 = null;
\r
57 private PhotoList _photoList = null;
\r
58 private AudioList _audioList = null;
\r
59 private String _nameKey = null;
\r
60 private int _totalDeleted = 0;
\r
65 * @param inTrackInfo track info object
\r
66 * @param inNameKey key to use for undo text
\r
67 * @param inStartIndex1 start index of first deleted segment
\r
68 * @param inDeleteMedias1 flags to delete media for range1
\r
69 * @param inStartIndex2 start index of second segment
\r
70 * @param inDeleteMedias2 flags to delete media for range2
\r
72 public UndoDeleteRange(TrackInfo inTrackInfo, String inNameKey,
\r
73 int inStartIndex1, boolean[] inDeleteMedias1,
\r
74 int inStartIndex2, boolean[] inDeleteMedias2)
\r
76 _nameKey = inNameKey;
\r
77 boolean mediaDeleted = false;
\r
79 // Check if there's a valid first range
\r
80 if (inStartIndex1 >= 0 && inDeleteMedias1 != null)
\r
82 final int numPoints = inDeleteMedias1.length;
\r
85 _totalDeleted += numPoints;
\r
86 _rangeInfo1 = new RangeInfo();
\r
87 _rangeInfo1._startIndex = inStartIndex1;
\r
89 for (int i=0; i<numPoints && !mediaDeleted; i++) {
\r
90 if (inDeleteMedias1[i]) mediaDeleted = true;
\r
93 _rangeInfo1._points = inTrackInfo.getTrack().cloneRange(inStartIndex1, inStartIndex1 + numPoints - 1);
\r
94 // Save segment flag of following track point
\r
95 _rangeInfo1.setNextTrackPoint(inTrackInfo.getTrack().getNextTrackPoint(inStartIndex1 + numPoints));
\r
98 // And the same for the second range, if any
\r
99 if (inStartIndex2 >= 0 && inDeleteMedias2 != null)
\r
101 final int numPoints = inDeleteMedias2.length;
\r
104 _totalDeleted += numPoints;
\r
105 _rangeInfo2 = new RangeInfo();
\r
106 _rangeInfo2._startIndex = inStartIndex2;
\r
107 for (int i=0; i<numPoints && !mediaDeleted; i++) {
\r
108 if (inDeleteMedias2[i]) mediaDeleted = true;
\r
112 _rangeInfo2._points = inTrackInfo.getTrack().cloneRange(inStartIndex2, inStartIndex2 + numPoints - 1);
\r
113 // Save segment flag of following track point
\r
114 _rangeInfo2.setNextTrackPoint(inTrackInfo.getTrack().getNextTrackPoint(inStartIndex2 + numPoints));
\r
117 // If any media have been deleted, then the lists must be copied
\r
120 _photoList = inTrackInfo.getPhotoList().cloneList();
\r
121 _audioList = inTrackInfo.getAudioList().cloneList();
\r
127 * @return description of operation including number of points deleted
\r
129 public String getDescription()
\r
131 return I18nManager.getText(_nameKey) + " (" + _totalDeleted + ")";
\r
136 * Perform the undo operation on the given Track
\r
137 * @param inTrackInfo TrackInfo object on which to perform the operation
\r
139 public void performUndo(TrackInfo inTrackInfo)
\r
141 // restore photos and audios to how they were before
\r
142 if (_photoList != null) {
\r
143 inTrackInfo.getPhotoList().restore(_photoList);
\r
145 if (_audioList != null) {
\r
146 inTrackInfo.getAudioList().restore(_audioList);
\r
149 // Undo both the ranges
\r
150 performUndo(inTrackInfo, _rangeInfo1);
\r
151 performUndo(inTrackInfo, _rangeInfo2);
\r
152 // If there's a current point/range selected, maybe need to adjust start and/or end
\r
153 if (_rangeInfo1 != null && _rangeInfo1.isValid()) {
\r
154 modifySelection(inTrackInfo, _rangeInfo1._startIndex, _rangeInfo1.getEndIndex());
\r
156 if (_rangeInfo2 != null && _rangeInfo2.isValid()) {
\r
157 modifySelection(inTrackInfo, _rangeInfo2._startIndex, _rangeInfo2.getEndIndex());
\r
162 * Perform the undo on a single deleted range
\r
163 * @param inTrackInfo track info object
\r
164 * @param inRangeInfo info object describing deleted range
\r
166 private void performUndo(TrackInfo inTrackInfo, RangeInfo inRangeInfo)
\r
168 if (inRangeInfo == null || !inRangeInfo.isValid()) return;
\r
170 // reconnect photos and audios to points
\r
171 final int numPoints = inRangeInfo._points.length;
\r
172 for (int i=0; i<numPoints; i++)
\r
174 DataPoint point = inRangeInfo._points[i];
\r
175 if (point != null && point.hasMedia())
\r
177 if (point.getPhoto() != null) {
\r
178 point.getPhoto().setDataPoint(point);
\r
180 if (point.getAudio() != null) {
\r
181 point.getAudio().setDataPoint(point);
\r
185 // restore point array into track
\r
186 inTrackInfo.getTrack().insertRange(inRangeInfo._points, inRangeInfo._startIndex);
\r
187 // Restore segment flag of following track point
\r
188 if (inRangeInfo._nextTrackPoint != null) {
\r
189 inRangeInfo._nextTrackPoint.setSegmentStart(inRangeInfo._segmentStart);
\r