]> gitweb.fperrin.net Git - GpsPrune.git/blob - src/tim/prune/undo/UndoMergeTrackSegments.java
edd0aefa1be13a85521b76b02286278572f32eb4
[GpsPrune.git] / src / tim / prune / undo / UndoMergeTrackSegments.java
1 package tim.prune.undo;
2
3 import tim.prune.I18nManager;
4 import tim.prune.UpdateMessageBroker;
5 import tim.prune.data.DataPoint;
6 import tim.prune.data.Track;
7 import tim.prune.data.TrackInfo;
8
9 /**
10  * Undo merging of track segments
11  */
12 public class UndoMergeTrackSegments implements UndoOperation
13 {
14         /** Start index */
15         private int _startIndex;
16         /** array of segment flags */
17         private boolean[] _segmentFlags = null;
18         /** Following point, if any */
19         private DataPoint _nextTrackPoint = null;
20         /** Segment flag of next point */
21         private boolean _nextSegmentFlag = false;
22
23
24         /**
25          * Constructor
26          * @param inTrack track object for copying segment flags
27          * @param inStart start index of section
28          * @param inEnd end index of section
29          */
30         public UndoMergeTrackSegments(Track inTrack, int inStart, int inEnd)
31         {
32                 _startIndex = inStart;
33                 // Store booleans for all points within selection
34                 int numPoints = inEnd - inStart + 1;
35                 _segmentFlags = new boolean[numPoints];
36                 for (int i=inStart; i<=inEnd; i++) {
37                         _segmentFlags[i-inStart] = inTrack.getPoint(i).getSegmentStart();
38                 }
39                 // Look for following track point, store flag
40                 _nextTrackPoint = inTrack.getNextTrackPoint(inEnd + 1);
41                 if (_nextTrackPoint != null) {
42                         _nextSegmentFlag = _nextTrackPoint.getSegmentStart();
43                 }
44         }
45
46
47         /**
48          * @return description of operation
49          */
50         public String getDescription()
51         {
52                 return I18nManager.getText("undo.mergetracksegments");
53         }
54
55
56         /**
57          * Perform the undo operation on the given Track
58          * @param inTrackInfo TrackInfo object on which to perform the operation
59          */
60         public void performUndo(TrackInfo inTrackInfo) throws UndoException
61         {
62                 // Loop through points replacing segment start flags
63                 for (int i=0; i<_segmentFlags.length; i++) {
64                         DataPoint point = inTrackInfo.getTrack().getPoint(_startIndex + i);
65                         if (!point.isWaypoint()) {
66                                 point.setSegmentStart(_segmentFlags[i]);
67                         }
68                 }
69                 // Restore segment start flag for following point
70                 if (_nextTrackPoint != null) {
71                         _nextTrackPoint.setSegmentStart(_nextSegmentFlag);
72                 }
73                 UpdateMessageBroker.informSubscribers();
74         }
75 }