1 package tim.prune.load.babel;
3 import java.awt.BorderLayout;
4 import java.awt.Component;
5 import java.awt.GridLayout;
7 import javax.swing.Box;
8 import javax.swing.BoxLayout;
9 import javax.swing.ButtonGroup;
10 import javax.swing.JComboBox;
11 import javax.swing.JLabel;
12 import javax.swing.JPanel;
13 import javax.swing.JRadioButton;
15 import tim.prune.I18nManager;
16 import tim.prune.data.UnitSetLibrary;
17 import tim.prune.gui.DecimalNumberField;
18 import tim.prune.gui.WholeNumberField;
21 * Simplify filter for GPSBabel
23 public class SimplifyFilter extends FilterDefinition
26 public SimplifyFilter(AddFilterDialog inFilterDialog)
28 super(inFilterDialog);
32 private WholeNumberField _maxPointsField = null;
33 private DecimalNumberField _distField = null;
34 private JComboBox _distUnitsCombo = null;
35 private JRadioButton _crossTrackRadio = null;
36 private JRadioButton _lengthRadio = null;
37 private JRadioButton _relativeRadio = null;
40 /** @return filter name */
41 protected String getFilterName() {
45 /** Make the panel contents */
46 protected void makePanelContents()
48 setLayout(new BorderLayout());
49 JPanel boxPanel = new JPanel();
50 boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.Y_AXIS));
51 add(boxPanel, BorderLayout.NORTH);
52 JLabel topLabel = new JLabel(I18nManager.getText("dialog.gpsbabel.filter.simplify.intro"));
53 topLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
54 boxPanel.add(topLabel);
55 boxPanel.add(Box.createVerticalStrut(18)); // spacer
56 // Main three-column grid
57 JPanel gridPanel = new JPanel();
58 gridPanel.setLayout(new GridLayout(0, 3, 4, 4));
59 gridPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.simplify.maxpoints")));
60 _maxPointsField = new WholeNumberField(6);
61 _maxPointsField.addKeyListener(_paramChangeListener);
62 gridPanel.add(_maxPointsField);
63 gridPanel.add(new JLabel(" "));
64 gridPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.simplify.maxerror")));
65 _distField = new DecimalNumberField();
66 _distField.addKeyListener(_paramChangeListener);
67 gridPanel.add(_distField);
68 _distUnitsCombo = new JComboBox(new String[] {
69 I18nManager.getText(UnitSetLibrary.UNITS_KILOMETRES.getNameKey()),
70 I18nManager.getText(UnitSetLibrary.UNITS_MILES.getNameKey())
72 gridPanel.add(_distUnitsCombo);
74 _crossTrackRadio = new JRadioButton(I18nManager.getText("dialog.gpsbabel.filter.simplify.crosstrack"));
75 _crossTrackRadio.setSelected(true);
76 _lengthRadio = new JRadioButton(I18nManager.getText("dialog.gpsbabel.filter.simplify.length"));
77 _relativeRadio = new JRadioButton(I18nManager.getText("dialog.gpsbabel.filter.simplify.relative"));
78 ButtonGroup radioGroup = new ButtonGroup();
79 radioGroup.add(_crossTrackRadio);
80 radioGroup.add(_lengthRadio);
81 radioGroup.add(_relativeRadio);
82 gridPanel.add(_crossTrackRadio);
83 gridPanel.add(_lengthRadio);
84 gridPanel.add(_relativeRadio);
85 gridPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
86 boxPanel.add(gridPanel);
90 * @return true if the filters are valid
92 public boolean isFilterValid()
94 final boolean countGiven = _maxPointsField.getText() != null && _maxPointsField.getText().trim().length() > 0;
95 final boolean distGiven = _distField.getText() != null && _distField.getText().trim().length() > 0;
96 if ((!countGiven && !distGiven) || (countGiven && distGiven)) {
97 return false; // only one or the other allowed
99 if (countGiven && _maxPointsField.getValue() <= 1) {
100 return false; // must have a decent max points
102 if (distGiven && _distField.getValue() <= 0.001) {
103 return false; // no zero or negative distances allowed
110 * @return filter parameters as a string, or null
112 protected String getParameters()
114 if (!isFilterValid()) return null;
115 StringBuilder builder = new StringBuilder();
117 final boolean countGiven = _maxPointsField.getText() != null && _maxPointsField.getText().trim().length() > 0;
118 final boolean distGiven = _distField.getText() != null && _distField.getText().trim().length() > 0;
120 builder.append(",count=").append(_maxPointsField.getValue());
126 dValue = Double.parseDouble(_distField.getText());
128 catch (Exception e) {} // shouldn't happen, otherwise validation would have failed
129 builder.append(",error=").append(dValue);
130 // units of distance (miles by default)
131 if (_distUnitsCombo.getSelectedIndex() == 0) {
132 builder.append("k"); // nothing for miles
136 if (_crossTrackRadio.isSelected()) {
137 builder.append(",crosstrack"); // default, could not pass it
139 else if (_lengthRadio.isSelected()) {
140 builder.append(",length");
142 else if (_relativeRadio.isSelected()) {
143 builder.append(",relative");
145 return builder.toString();