]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/undo/UndoDeleteRange.java
Version 14, October 2012
[GpsPrune.git] / tim / prune / undo / UndoDeleteRange.java
1 package tim.prune.undo;\r
2 \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
8 \r
9 /**\r
10  * Operation to undo a delete of a range of points\r
11  */\r
12 public class UndoDeleteRange implements UndoOperation\r
13 {\r
14         /**\r
15          * Inner class to hold a single range information set\r
16          */\r
17         class RangeInfo\r
18         {\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
23 \r
24                 /**\r
25                  * @param inPoint next track point after deleted section, or null\r
26                  */\r
27                 public void setNextTrackPoint(DataPoint inPoint)\r
28                 {\r
29                         _nextTrackPoint = inPoint;\r
30                         if (inPoint != null) {\r
31                                 _segmentStart = inPoint.getSegmentStart();\r
32                         }\r
33 \r
34                 }\r
35 \r
36                 /**\r
37                  * @return true if the range is valid\r
38                  */\r
39                 public boolean isValid()\r
40                 {\r
41                         return _startIndex >= 0 && _points != null && _points.length > 0;\r
42                 }\r
43         }\r
44 \r
45 \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
53 \r
54 \r
55         /**\r
56          * Constructor\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
63          */\r
64         public UndoDeleteRange(TrackInfo inTrackInfo, String inNameKey,\r
65                 int inStartIndex1, boolean[] inDeleteMedias1,\r
66                 int inStartIndex2, boolean[] inDeleteMedias2)\r
67         {\r
68                 _nameKey = inNameKey;\r
69                 boolean mediaDeleted = false;\r
70                 _totalDeleted = 0;\r
71                 // Check if there's a valid first range\r
72                 if (inStartIndex1 >= 0 && inDeleteMedias1 != null)\r
73                 {\r
74                         final int numPoints = inDeleteMedias1.length;\r
75                         if (numPoints > 0)\r
76                         {\r
77                                 _totalDeleted += numPoints;\r
78                                 _rangeInfo1 = new RangeInfo();\r
79                                 _rangeInfo1._startIndex = inStartIndex1;\r
80 \r
81                                 for (int i=0; i<numPoints && !mediaDeleted; i++) {\r
82                                         if (inDeleteMedias1[i]) mediaDeleted = true;\r
83                                 }\r
84                                 // Clone points\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
88                         }\r
89                 }\r
90                 // And the same for the second range, if any\r
91                 if (inStartIndex2 >= 0 && inDeleteMedias2 != null)\r
92                 {\r
93                         final int numPoints = inDeleteMedias2.length;\r
94                         if (numPoints > 0)\r
95                         {\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
101                                 }\r
102 \r
103                                 // Clone points\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
107                         }\r
108                 }\r
109                 // If any media have been deleted, then the lists must be copied\r
110                 if (mediaDeleted)\r
111                 {\r
112                         _photoList = inTrackInfo.getPhotoList().cloneList();\r
113                         _audioList = inTrackInfo.getAudioList().cloneList();\r
114                 }\r
115         }\r
116 \r
117 \r
118         /**\r
119          * @return description of operation including number of points deleted\r
120          */\r
121         public String getDescription()\r
122         {\r
123                 return I18nManager.getText(_nameKey) + " (" + _totalDeleted + ")";\r
124         }\r
125 \r
126 \r
127         /**\r
128          * Perform the undo operation on the given Track\r
129          * @param inTrackInfo TrackInfo object on which to perform the operation\r
130          */\r
131         public void performUndo(TrackInfo inTrackInfo)\r
132         {\r
133                 // restore photos and audios to how they were before\r
134                 if (_photoList != null) {\r
135                         inTrackInfo.getPhotoList().restore(_photoList);\r
136                 }\r
137                 if (_audioList != null) {\r
138                         inTrackInfo.getAudioList().restore(_audioList);\r
139                 }\r
140 \r
141                 // Undo both the ranges\r
142                 performUndo(inTrackInfo, _rangeInfo1);\r
143                 performUndo(inTrackInfo, _rangeInfo2);\r
144         }\r
145 \r
146         /**\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
150          */\r
151         private void performUndo(TrackInfo inTrackInfo, RangeInfo inRangeInfo)\r
152         {\r
153                 if (inRangeInfo == null || !inRangeInfo.isValid()) return;\r
154 \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
158                 {\r
159                         DataPoint point = inRangeInfo._points[i];\r
160                         if (point != null && point.hasMedia())\r
161                         {\r
162                                 if (point.getPhoto() != null) {\r
163                                         point.getPhoto().setDataPoint(point);\r
164                                 }\r
165                                 if (point.getAudio() != null) {\r
166                                         point.getAudio().setDataPoint(point);\r
167                                 }\r
168                         }\r
169                 }\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
175                 }\r
176         }\r
177 }\r