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); } } }