X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Fload%2Fbabel%2FSimplifyFilter.java;fp=src%2Ftim%2Fprune%2Fload%2Fbabel%2FSimplifyFilter.java;h=1567c883dc1a60bc65f56fa0e273c0bfc48aba49;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/load/babel/SimplifyFilter.java b/src/tim/prune/load/babel/SimplifyFilter.java new file mode 100644 index 0000000..1567c88 --- /dev/null +++ b/src/tim/prune/load/babel/SimplifyFilter.java @@ -0,0 +1,147 @@ +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(); + } +}