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
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 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
+ _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
*/\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 (inRangeInfo._nextTrackPoint != null) {\r
+ inRangeInfo._nextTrackPoint.setSegmentStart(inRangeInfo._segmentStart);\r
+ }\r
}\r
-}
\ No newline at end of file
+}\r