X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=tim%2Fprune%2Ffunction%2Fsew%2FSplitSegmentsFunction.java;fp=tim%2Fprune%2Ffunction%2Fsew%2FSplitSegmentsFunction.java;h=6fec0754155f7cb667466234b19434229506633a;hp=91a7d526d5fd4b0655fa5b9f8144ad12e5f60256;hb=92dad5df664287acb51728e9ea599f150765d34a;hpb=81843c3d8d0771bf00d0f26034a13aa515465c78 diff --git a/tim/prune/function/sew/SplitSegmentsFunction.java b/tim/prune/function/sew/SplitSegmentsFunction.java index 91a7d52..6fec075 100644 --- a/tim/prune/function/sew/SplitSegmentsFunction.java +++ b/tim/prune/function/sew/SplitSegmentsFunction.java @@ -1,77 +1,20 @@ package tim.prune.function.sew; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.FlowLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; - -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.ButtonGroup; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JLabel; import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JRadioButton; import tim.prune.App; -import tim.prune.GenericFunction; import tim.prune.I18nManager; import tim.prune.UpdateMessageBroker; import tim.prune.data.DataPoint; -import tim.prune.data.Distance; -import tim.prune.data.Field; -import tim.prune.data.Unit; -import tim.prune.data.UnitSetLibrary; -import tim.prune.gui.WholeNumberField; +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 GenericFunction +public class SplitSegmentsFunction extends DistanceTimeLimitFunction { - /** Dialog */ - private JDialog _dialog = null; - /** Radio buttons for splitting by distance and time */ - private JRadioButton _distLimitRadio = null, _timeLimitRadio = null; - /** Dropdown for selecting distance units */ - private JComboBox _distUnitsDropdown = null; - /** Text field for entering distance */ - private WholeNumberField _distanceField = null; - /** Text fields for entering distance */ - private WholeNumberField _limitHourField = null, _limitMinField = null; - /** Ok button */ - private JButton _okButton = null; - - - /** - * React to item changes and key presses - */ - private abstract class ChangeListener extends KeyAdapter implements ItemListener - { - /** Method to be implemented */ - public abstract void optionsChanged(); - - /** Item changed in ItemListener */ - public void itemStateChanged(ItemEvent arg0) { - optionsChanged(); - } - - /** Key released in KeyListener */ - public void keyReleased(KeyEvent arg0) { - optionsChanged(); - } - } - /** * Constructor */ @@ -86,161 +29,18 @@ public class SplitSegmentsFunction extends GenericFunction return "function.splitsegments"; } - /** - * Begin the function - */ - public void begin() - { - if (_dialog == null) - { - _dialog = new JDialog(_parentFrame, I18nManager.getText(getNameKey()), true); - _dialog.setLocationRelativeTo(_parentFrame); - _dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); - _dialog.getContentPane().add(makeDialogComponents()); - _dialog.pack(); - } - enableOkButton(); - // TODO: Maybe set distance units according to current Config setting? - final boolean hasTimestamps = _app.getTrackInfo().getTrack().hasData(Field.TIMESTAMP); - _timeLimitRadio.setEnabled(hasTimestamps); - _dialog.setVisible(true); - } - - /** - * Create dialog components - * @return Panel containing all gui elements in dialog - */ - private Component makeDialogComponents() - { - JPanel dialogPanel = new JPanel(); - dialogPanel.setLayout(new BorderLayout(5, 5)); - - // Make radio buttons for three different options - _distLimitRadio = new JRadioButton(I18nManager.getText("dialog.correlate.options.distancelimit") + ": "); - _timeLimitRadio = new JRadioButton(I18nManager.getText("dialog.correlate.options.timelimit") + ": "); - ButtonGroup radioGroup = new ButtonGroup(); - radioGroup.add(_distLimitRadio); - radioGroup.add(_timeLimitRadio); - - // central panel for limits - JPanel limitsPanel = new JPanel(); - limitsPanel.setLayout(new BoxLayout(limitsPanel, BoxLayout.Y_AXIS)); - limitsPanel.add(Box.createVerticalStrut(8)); - ChangeListener optionsChangedListener = new ChangeListener() { - public void optionsChanged() { - enableOkButton(); - } - }; - // distance limits - JPanel distLimitPanel = new JPanel(); - distLimitPanel.setLayout(new FlowLayout()); - _distLimitRadio.setSelected(true); - _distLimitRadio.addItemListener(optionsChangedListener); - distLimitPanel.add(_distLimitRadio); - _distanceField = new WholeNumberField(3); - _distanceField.addKeyListener(optionsChangedListener); - distLimitPanel.add(_distanceField); - String[] distUnitsOptions = {I18nManager.getText("units.kilometres"), I18nManager.getText("units.metres"), - I18nManager.getText("units.miles")}; - _distUnitsDropdown = new JComboBox(distUnitsOptions); - _distUnitsDropdown.addItemListener(optionsChangedListener); - distLimitPanel.add(_distUnitsDropdown); - distLimitPanel.setAlignmentX(Component.LEFT_ALIGNMENT); - limitsPanel.add(distLimitPanel); - - // time limit panel - JPanel timeLimitPanel = new JPanel(); - timeLimitPanel.setLayout(new FlowLayout()); - _timeLimitRadio.addItemListener(optionsChangedListener); - timeLimitPanel.add(_timeLimitRadio); - _limitHourField = new WholeNumberField(2); - _limitHourField.addKeyListener(optionsChangedListener); - timeLimitPanel.add(_limitHourField); - timeLimitPanel.add(new JLabel(I18nManager.getText("dialog.correlate.options.offset.hours"))); - _limitMinField = new WholeNumberField(3); - _limitMinField.addKeyListener(optionsChangedListener); - timeLimitPanel.add(_limitMinField); - timeLimitPanel.add(new JLabel(I18nManager.getText("units.minutes"))); - timeLimitPanel.setAlignmentX(Component.LEFT_ALIGNMENT); - limitsPanel.add(timeLimitPanel); - - dialogPanel.add(limitsPanel, BorderLayout.NORTH); - - // button panel at bottom - JPanel buttonPanel = new JPanel(); - buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); - // OK button - _okButton = new JButton(I18nManager.getText("button.ok")); - _okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - performSplit(); - } - }); - buttonPanel.add(_okButton); - // Cancel button - JButton cancelButton = new JButton(I18nManager.getText("button.cancel")); - cancelButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - _dialog.dispose(); - } - }); - cancelButton.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent inE) { - if (inE.getKeyCode() == KeyEvent.VK_ESCAPE) {_dialog.dispose();} - } - }); - buttonPanel.add(cancelButton); - dialogPanel.add(buttonPanel, BorderLayout.SOUTH); - return dialogPanel; - } - - /** - * Enable or disable the OK button according to the inputs - */ - private void enableOkButton() - { - boolean enabled = false; - if (_distLimitRadio.isSelected()) { - enabled = _distanceField.getValue() > 0; - } - else if (_timeLimitRadio.isSelected()) { - enabled = _limitHourField.getValue() > 0 || _limitMinField.getValue() > 0; - } - _okButton.setEnabled(enabled); - - // Also enable/disable the other fields - _distanceField.setEnabled(_distLimitRadio.isSelected()); - _distUnitsDropdown.setEnabled(_distLimitRadio.isSelected()); - _limitHourField.setEnabled(_timeLimitRadio.isSelected()); - _limitMinField.setEnabled(_timeLimitRadio.isSelected()); - } /** * The dialog has been completed and OK pressed, so do the split */ - private void performSplit() + protected void performFunction() { // Split either by distance or time - boolean checkTimeLimit = _timeLimitRadio.isSelected() - && (_limitHourField.getValue() > 0 || _limitMinField.getValue() > 0); - int timeLimitSeconds = 0; - if (checkTimeLimit) - { - timeLimitSeconds = _limitHourField.getValue() * 60 * 60 - + _limitMinField.getValue() * 60; - if (timeLimitSeconds <= 0) {checkTimeLimit = false;} - } - double distLimitRadians = 0.0; - final boolean checkDistLimit = _distLimitRadio.isSelected() - && _distanceField.getValue() > 0; - if (checkDistLimit) - { - final Unit[] distUnits = {UnitSetLibrary.UNITS_KILOMETRES, - UnitSetLibrary.UNITS_METRES, UnitSetLibrary.UNITS_MILES}; - Unit distUnit = distUnits[_distUnitsDropdown.getSelectedIndex()]; - distLimitRadians = Distance.convertDistanceToRadians(_distanceField.getValue(), distUnit); - } - if (!checkTimeLimit && !checkDistLimit) { + 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 } @@ -257,8 +57,8 @@ public class SplitSegmentsFunction extends GenericFunction if (!currPoint.isWaypoint()) { boolean splitHere = (prevPoint != null) - && ((checkDistLimit && DataPoint.calculateRadiansBetween(prevPoint, currPoint) > distLimitRadians) - || (checkTimeLimit && currPoint.hasTimestamp() && prevPoint.hasTimestamp() + && ((splitByDistance && DataPoint.calculateRadiansBetween(prevPoint, currPoint) > distLimitRadians) + || (splitByTime && currPoint.hasTimestamp() && prevPoint.hasTimestamp() && currPoint.getTimestamp().getSecondsSince(prevPoint.getTimestamp()) > timeLimitSeconds)); if (splitHere && !currPoint.getSegmentStart()) {