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