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.JComboBox;
10 import javax.swing.JLabel;
11 import javax.swing.JPanel;
13 import tim.prune.I18nManager;
14 import tim.prune.gui.DecimalNumberField;
15 import tim.prune.gui.WholeNumberField;
18 * Distance filter for GPSBabel (compress by distance, or nearby points)
20 public class DistanceFilter extends FilterDefinition
23 public DistanceFilter(AddFilterDialog inFilterDialog)
25 super(inFilterDialog);
29 private DecimalNumberField _distField = null;
30 private JComboBox _distUnitsCombo = null;
31 private WholeNumberField _secondsField = null;
34 /** @return filter name */
35 protected String getFilterName() {
39 /** Make the panel contents */
40 protected void makePanelContents()
42 setLayout(new BorderLayout());
43 JPanel boxPanel = new JPanel();
44 boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.Y_AXIS));
45 add(boxPanel, BorderLayout.NORTH);
46 JLabel topLabel = new JLabel(I18nManager.getText("dialog.gpsbabel.filter.distance.intro"));
47 topLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
48 boxPanel.add(topLabel);
49 boxPanel.add(Box.createVerticalStrut(18)); // spacer
50 // Main three-column grid
51 JPanel gridPanel = new JPanel();
52 gridPanel.setLayout(new GridLayout(0, 3, 4, 4));
53 gridPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.distance.distance")));
54 _distField = new DecimalNumberField();
55 _distField.addKeyListener(_paramChangeListener);
56 gridPanel.add(_distField);
57 _distUnitsCombo = new JComboBox(new String[] {I18nManager.getText("units.metres"), I18nManager.getText("units.feet")});
58 gridPanel.add(_distUnitsCombo);
59 gridPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.distance.time")));
60 _secondsField = new WholeNumberField(4);
61 _secondsField.addKeyListener(_paramChangeListener);
62 gridPanel.add(_secondsField);
63 gridPanel.add(new JLabel(I18nManager.getText("units.seconds")));
64 gridPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
65 boxPanel.add(gridPanel);
69 * @return true if the filters are valid
71 public boolean isFilterValid()
73 if (_distField.getText() == null || _distField.getText().trim().equals("")) {
74 return false; // no distance given
76 final boolean timeGiven = _secondsField.getText() != null && _secondsField.getText().trim().length() > 0;
77 if (timeGiven && _secondsField.getValue() <= 1) {
78 return false; // must have a decent number of seconds
81 return (_distField.getValue() > 0.001); // no zero or negative distances allowed
85 * @return filter parameters as a string, or null
87 protected String getParameters()
89 if (!isFilterValid()) return null;
90 StringBuilder builder = new StringBuilder();
92 double dValue = _distField.getValue();
93 builder.append(",distance=").append(dValue);
94 // units of distance (miles by default)
95 builder.append(_distUnitsCombo.getSelectedIndex() == 0 ? "m" : "f"); // metres or feet
97 // is there a time as well?
98 final boolean timeGiven = _secondsField.getText() != null && _secondsField.getText().trim().length() > 0;
100 builder.append(",time=").append(_secondsField.getValue()); // no s at the end
102 return builder.toString();