1 package tim.prune.function.sew;
3 import javax.swing.JOptionPane;
6 import tim.prune.I18nManager;
7 import tim.prune.UpdateMessageBroker;
8 import tim.prune.data.DataPoint;
9 import tim.prune.function.DistanceTimeLimitFunction;
10 import tim.prune.undo.UndoSplitSegments;
13 * Function to split a track into segments using
14 * either a distance limit or a time limit
16 public class SplitSegmentsFunction extends DistanceTimeLimitFunction
21 public SplitSegmentsFunction(App inApp) {
28 public String getNameKey() {
29 return "function.splitsegments";
34 * The dialog has been completed and OK pressed, so do the split
36 protected void performFunction()
38 // Split either by distance or time
39 final int timeLimitSeconds = getTimeLimitInSeconds();
40 final boolean splitByTime = (timeLimitSeconds > 0);
41 final double distLimitRadians = getDistanceLimitRadians();
42 final boolean splitByDistance = (distLimitRadians > 0.0);
43 if (!splitByTime && !splitByDistance) {
44 return; // neither option selected
48 UndoSplitSegments undo = new UndoSplitSegments(_app.getTrackInfo().getTrack());
49 final int numPoints = _app.getTrackInfo().getTrack().getNumPoints();
50 DataPoint currPoint = null, prevPoint = null;
51 int numSplitsMade = 0;
53 // Now actually do it, looping through the points in the track
54 for (int i=0; i<numPoints; i++)
56 currPoint = _app.getTrackInfo().getTrack().getPoint(i);
57 if (!currPoint.isWaypoint())
59 boolean splitHere = (prevPoint != null)
60 && ((splitByDistance && DataPoint.calculateRadiansBetween(prevPoint, currPoint) > distLimitRadians)
61 || (splitByTime && currPoint.hasTimestamp() && prevPoint.hasTimestamp()
62 && currPoint.getTimestamp().getSecondsSince(prevPoint.getTimestamp()) > timeLimitSeconds));
63 if (splitHere && !currPoint.getSegmentStart())
65 currPoint.setSegmentStart(true);
68 prevPoint = currPoint;
72 if (numSplitsMade > 0)
74 _app.completeFunction(undo, I18nManager.getTextWithNumber("confirm.splitsegments", numSplitsMade));
75 UpdateMessageBroker.informSubscribers();
80 // Complain that no split was made
81 JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("error.tracksplit.nosplit"),
82 I18nManager.getText("error.function.noop.title"), JOptionPane.WARNING_MESSAGE);