--- /dev/null
+package tim.prune.load.babel;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.GridLayout;
+
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+
+import tim.prune.I18nManager;
+import tim.prune.data.UnitSetLibrary;
+import tim.prune.gui.DecimalNumberField;
+import tim.prune.gui.WholeNumberField;
+
+/**
+ * Simplify filter for GPSBabel
+ */
+public class SimplifyFilter extends FilterDefinition
+{
+ /** Constructor */
+ public SimplifyFilter(AddFilterDialog inFilterDialog)
+ {
+ super(inFilterDialog);
+ makePanelContents();
+ }
+
+ private WholeNumberField _maxPointsField = null;
+ private DecimalNumberField _distField = null;
+ private JComboBox<String> _distUnitsCombo = null;
+ private JRadioButton _crossTrackRadio = null;
+ private JRadioButton _lengthRadio = null;
+ private JRadioButton _relativeRadio = null;
+
+
+ /** @return filter name */
+ protected String getFilterName() {
+ return "simplify";
+ }
+
+ /** Make the panel contents */
+ protected void makePanelContents()
+ {
+ setLayout(new BorderLayout());
+ JPanel boxPanel = new JPanel();
+ boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.Y_AXIS));
+ add(boxPanel, BorderLayout.NORTH);
+ JLabel topLabel = new JLabel(I18nManager.getText("dialog.gpsbabel.filter.simplify.intro"));
+ topLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
+ boxPanel.add(topLabel);
+ boxPanel.add(Box.createVerticalStrut(18)); // spacer
+ // Main three-column grid
+ JPanel gridPanel = new JPanel();
+ gridPanel.setLayout(new GridLayout(0, 3, 4, 4));
+ gridPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.simplify.maxpoints")));
+ _maxPointsField = new WholeNumberField(6);
+ _maxPointsField.addKeyListener(_paramChangeListener);
+ gridPanel.add(_maxPointsField);
+ gridPanel.add(new JLabel(" "));
+ gridPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.simplify.maxerror")));
+ _distField = new DecimalNumberField();
+ _distField.addKeyListener(_paramChangeListener);
+ gridPanel.add(_distField);
+ _distUnitsCombo = new JComboBox<String>(new String[] {
+ I18nManager.getText(UnitSetLibrary.UNITS_KILOMETRES.getNameKey()),
+ I18nManager.getText(UnitSetLibrary.UNITS_MILES.getNameKey())
+ });
+ gridPanel.add(_distUnitsCombo);
+ // radio buttons
+ _crossTrackRadio = new JRadioButton(I18nManager.getText("dialog.gpsbabel.filter.simplify.crosstrack"));
+ _crossTrackRadio.setSelected(true);
+ _lengthRadio = new JRadioButton(I18nManager.getText("dialog.gpsbabel.filter.simplify.length"));
+ _relativeRadio = new JRadioButton(I18nManager.getText("dialog.gpsbabel.filter.simplify.relative"));
+ ButtonGroup radioGroup = new ButtonGroup();
+ radioGroup.add(_crossTrackRadio);
+ radioGroup.add(_lengthRadio);
+ radioGroup.add(_relativeRadio);
+ gridPanel.add(_crossTrackRadio);
+ gridPanel.add(_lengthRadio);
+ gridPanel.add(_relativeRadio);
+ gridPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+ boxPanel.add(gridPanel);
+ }
+
+ /**
+ * @return true if the filters are valid
+ */
+ public boolean isFilterValid()
+ {
+ final boolean countGiven = _maxPointsField.getText() != null && _maxPointsField.getText().trim().length() > 0;
+ final boolean distGiven = _distField.getText() != null && _distField.getText().trim().length() > 0;
+ if ((!countGiven && !distGiven) || (countGiven && distGiven)) {
+ return false; // only one or the other allowed
+ }
+ if (countGiven && _maxPointsField.getValue() <= 1) {
+ return false; // must have a decent max points
+ }
+ if (distGiven && _distField.getValue() <= 0.001) {
+ return false; // no zero or negative distances allowed
+ }
+ // must be ok
+ return true;
+ }
+
+ /**
+ * @return filter parameters as a string, or null
+ */
+ protected String getParameters()
+ {
+ if (!isFilterValid()) return null;
+ StringBuilder builder = new StringBuilder();
+ // type
+ final boolean countGiven = _maxPointsField.getText() != null && _maxPointsField.getText().trim().length() > 0;
+ final boolean distGiven = _distField.getText() != null && _distField.getText().trim().length() > 0;
+ if (countGiven) {
+ builder.append(",count=").append(_maxPointsField.getValue());
+ }
+ else if (distGiven)
+ {
+ double dValue = 1.0;
+ try {
+ dValue = Double.parseDouble(_distField.getText());
+ }
+ catch (Exception e) {} // shouldn't happen, otherwise validation would have failed
+ builder.append(",error=").append(dValue);
+ // units of distance (miles by default)
+ if (_distUnitsCombo.getSelectedIndex() == 0) {
+ builder.append("k"); // nothing for miles
+ }
+ }
+ // three options
+ if (_crossTrackRadio.isSelected()) {
+ builder.append(",crosstrack"); // default, could not pass it
+ }
+ else if (_lengthRadio.isSelected()) {
+ builder.append(",length");
+ }
+ else if (_relativeRadio.isSelected()) {
+ builder.append(",relative");
+ }
+ return builder.toString();
+ }
+}