]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/function/sew/SplitSegmentsFunction.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / function / sew / SplitSegmentsFunction.java
diff --git a/src/tim/prune/function/sew/SplitSegmentsFunction.java b/src/tim/prune/function/sew/SplitSegmentsFunction.java
new file mode 100644 (file)
index 0000000..6fec075
--- /dev/null
@@ -0,0 +1,85 @@
+package tim.prune.function.sew;
+
+import javax.swing.JOptionPane;
+
+import tim.prune.App;
+import tim.prune.I18nManager;
+import tim.prune.UpdateMessageBroker;
+import tim.prune.data.DataPoint;
+import tim.prune.function.DistanceTimeLimitFunction;
+import tim.prune.undo.UndoSplitSegments;
+
+/**
+ * Function to split a track into segments using
+ * either a distance limit or a time limit
+ */
+public class SplitSegmentsFunction extends DistanceTimeLimitFunction
+{
+       /**
+        * Constructor
+        */
+       public SplitSegmentsFunction(App inApp) {
+               super(inApp);
+       }
+
+       /**
+        * @return name key
+        */
+       public String getNameKey() {
+               return "function.splitsegments";
+       }
+
+
+       /**
+        * The dialog has been completed and OK pressed, so do the split
+        */
+       protected void performFunction()
+       {
+               // Split either by distance or time
+               final int timeLimitSeconds = getTimeLimitInSeconds();
+               final boolean splitByTime = (timeLimitSeconds > 0);
+               final double distLimitRadians = getDistanceLimitRadians();
+               final boolean splitByDistance = (distLimitRadians > 0.0);
+               if (!splitByTime && !splitByDistance) {
+                       return; // neither option selected
+               }
+
+               // Make undo object
+               UndoSplitSegments undo = new UndoSplitSegments(_app.getTrackInfo().getTrack());
+               final int numPoints = _app.getTrackInfo().getTrack().getNumPoints();
+               DataPoint currPoint = null, prevPoint = null;
+               int numSplitsMade = 0;
+
+               // Now actually do it, looping through the points in the track
+               for (int i=0; i<numPoints; i++)
+               {
+                       currPoint = _app.getTrackInfo().getTrack().getPoint(i);
+                       if (!currPoint.isWaypoint())
+                       {
+                               boolean splitHere = (prevPoint != null)
+                                       && ((splitByDistance && DataPoint.calculateRadiansBetween(prevPoint, currPoint) > distLimitRadians)
+                                               || (splitByTime && currPoint.hasTimestamp() && prevPoint.hasTimestamp()
+                                                       && currPoint.getTimestamp().getSecondsSince(prevPoint.getTimestamp()) > timeLimitSeconds));
+                               if (splitHere && !currPoint.getSegmentStart())
+                               {
+                                       currPoint.setSegmentStart(true);
+                                       numSplitsMade++;
+                               }
+                               prevPoint = currPoint;
+                       }
+               }
+
+               if (numSplitsMade > 0)
+               {
+                       _app.completeFunction(undo, I18nManager.getTextWithNumber("confirm.splitsegments", numSplitsMade));
+                       UpdateMessageBroker.informSubscribers();
+                       _dialog.dispose();
+               }
+               else
+               {
+                       // Complain that no split was made
+                       JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("error.tracksplit.nosplit"),
+                               I18nManager.getText("error.function.noop.title"), JOptionPane.WARNING_MESSAGE);
+               }
+       }
+}