]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/undo/UndoDeleteRange.java
Version 16, February 2014
[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 extends UndoDeleteOperation\r
13 {\r
14         /**\r
15          * Inner class to hold a single range information set\r
16          */\r
17         static 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                  * @return end index of range\r
46                  */\r
47                 public int getEndIndex()\r
48                 {\r
49                         return _startIndex + _points.length - 1;\r
50                 }\r
51         }\r
52 \r
53 \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
61 \r
62 \r
63         /**\r
64          * Constructor\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
71          */\r
72         public UndoDeleteRange(TrackInfo inTrackInfo, String inNameKey,\r
73                 int inStartIndex1, boolean[] inDeleteMedias1,\r
74                 int inStartIndex2, boolean[] inDeleteMedias2)\r
75         {\r
76                 _nameKey = inNameKey;\r
77                 boolean mediaDeleted = false;\r
78                 _totalDeleted = 0;\r
79                 // Check if there's a valid first range\r
80                 if (inStartIndex1 >= 0 && inDeleteMedias1 != null)\r
81                 {\r
82                         final int numPoints = inDeleteMedias1.length;\r
83                         if (numPoints > 0)\r
84                         {\r
85                                 _totalDeleted += numPoints;\r
86                                 _rangeInfo1 = new RangeInfo();\r
87                                 _rangeInfo1._startIndex = inStartIndex1;\r
88 \r
89                                 for (int i=0; i<numPoints && !mediaDeleted; i++) {\r
90                                         if (inDeleteMedias1[i]) mediaDeleted = true;\r
91                                 }\r
92                                 // Clone points\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
96                         }\r
97                 }\r
98                 // And the same for the second range, if any\r
99                 if (inStartIndex2 >= 0 && inDeleteMedias2 != null)\r
100                 {\r
101                         final int numPoints = inDeleteMedias2.length;\r
102                         if (numPoints > 0)\r
103                         {\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
109                                 }\r
110 \r
111                                 // Clone points\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
115                         }\r
116                 }\r
117                 // If any media have been deleted, then the lists must be copied\r
118                 if (mediaDeleted)\r
119                 {\r
120                         _photoList = inTrackInfo.getPhotoList().cloneList();\r
121                         _audioList = inTrackInfo.getAudioList().cloneList();\r
122                 }\r
123         }\r
124 \r
125 \r
126         /**\r
127          * @return description of operation including number of points deleted\r
128          */\r
129         public String getDescription()\r
130         {\r
131                 return I18nManager.getText(_nameKey) + " (" + _totalDeleted + ")";\r
132         }\r
133 \r
134 \r
135         /**\r
136          * Perform the undo operation on the given Track\r
137          * @param inTrackInfo TrackInfo object on which to perform the operation\r
138          */\r
139         public void performUndo(TrackInfo inTrackInfo)\r
140         {\r
141                 // restore photos and audios to how they were before\r
142                 if (_photoList != null) {\r
143                         inTrackInfo.getPhotoList().restore(_photoList);\r
144                 }\r
145                 if (_audioList != null) {\r
146                         inTrackInfo.getAudioList().restore(_audioList);\r
147                 }\r
148 \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
155                 }\r
156                 if (_rangeInfo2 != null && _rangeInfo2.isValid()) {\r
157                         modifySelection(inTrackInfo, _rangeInfo2._startIndex, _rangeInfo2.getEndIndex());\r
158                 }\r
159         }\r
160 \r
161         /**\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
165          */\r
166         private void performUndo(TrackInfo inTrackInfo, RangeInfo inRangeInfo)\r
167         {\r
168                 if (inRangeInfo == null || !inRangeInfo.isValid()) return;\r
169 \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
173                 {\r
174                         DataPoint point = inRangeInfo._points[i];\r
175                         if (point != null && point.hasMedia())\r
176                         {\r
177                                 if (point.getPhoto() != null) {\r
178                                         point.getPhoto().setDataPoint(point);\r
179                                 }\r
180                                 if (point.getAudio() != null) {\r
181                                         point.getAudio().setDataPoint(point);\r
182                                 }\r
183                         }\r
184                 }\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
190                 }\r
191         }\r
192 }\r