X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2Fsew%2FSplitSegmentsFunction.java;fp=src%2Ftim%2Fprune%2Ffunction%2Fsew%2FSplitSegmentsFunction.java;h=6fec0754155f7cb667466234b19434229506633a;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/function/sew/SplitSegmentsFunction.java b/src/tim/prune/function/sew/SplitSegmentsFunction.java new file mode 100644 index 0000000..6fec075 --- /dev/null +++ b/src/tim/prune/function/sew/SplitSegmentsFunction.java @@ -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 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); + } + } +}