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 * Interpolate filter for GPSBabel (adding extra points, does that make it still a filter?)
19 * Very similar to the distance filter in terms of gui
21 public class InterpolateFilter extends FilterDefinition
24 public InterpolateFilter(AddFilterDialog inFilterDialog)
26 super(inFilterDialog);
30 private DecimalNumberField _distField = null;
31 private JComboBox<String> _distUnitsCombo = null;
32 private WholeNumberField _secondsField = null;
35 /** @return filter name */
36 protected String getFilterName() {
40 /** Make the panel contents */
41 protected void makePanelContents()
43 setLayout(new BorderLayout());
44 JPanel boxPanel = new JPanel();
45 boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.Y_AXIS));
46 add(boxPanel, BorderLayout.NORTH);
47 JLabel topLabel = new JLabel(I18nManager.getText("dialog.gpsbabel.filter.interpolate.intro"));
48 topLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
49 boxPanel.add(topLabel);
50 boxPanel.add(Box.createVerticalStrut(18)); // spacer
51 // Main three-column grid
52 JPanel gridPanel = new JPanel();
53 gridPanel.setLayout(new GridLayout(0, 3, 4, 4));
54 gridPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.interpolate.distance")));
55 _distField = new DecimalNumberField();
56 _distField.addKeyListener(_paramChangeListener);
57 gridPanel.add(_distField);
58 _distUnitsCombo = new JComboBox<String>(new String[] {I18nManager.getText("units.kilometres"), I18nManager.getText("units.miles")});
59 gridPanel.add(_distUnitsCombo);
60 gridPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.interpolate.time")));
61 _secondsField = new WholeNumberField(4);
62 _secondsField.addKeyListener(_paramChangeListener);
63 gridPanel.add(_secondsField);
64 gridPanel.add(new JLabel(I18nManager.getText("units.seconds")));
65 gridPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
66 boxPanel.add(gridPanel);
70 * @return true if the filters are valid
72 public boolean isFilterValid()
74 final boolean distGiven = _distField.getText() != null && _distField.getText().trim().length() > 0;
75 final boolean timeGiven = _secondsField.getText() != null && _secondsField.getText().trim().length() > 0;
76 if ((!distGiven && !timeGiven) || (distGiven && timeGiven)) {
77 return false; // either one or the other, not both
79 if (distGiven && _distField.getValue() < 0.0001) {
80 return false; // must have a decent distance
82 if (timeGiven && _secondsField.getValue() <= 1) {
83 return false; // must have a decent number of seconds
90 * @return filter parameters as a string, or null
92 protected String getParameters()
94 if (!isFilterValid()) return null;
95 StringBuilder builder = new StringBuilder();
96 final boolean distGiven = _distField.getText() != null && _distField.getText().trim().length() > 0;
97 final boolean timeGiven = _secondsField.getText() != null && _secondsField.getText().trim().length() > 0;
101 double dValue = _distField.getValue();
102 builder.append(",distance=").append(dValue);
103 // units of distance (km or miles)
104 builder.append(_distUnitsCombo.getSelectedIndex() == 0 ? "k" : "m");
106 else if (timeGiven) {
108 builder.append(",time=").append(_secondsField.getValue()); // no s at the end
110 return builder.toString();