]> gitweb.fperrin.net Git - GpsPrune.git/blob - src/tim/prune/load/babel/DistanceFilter.java
4826bc872e864e2c67580d12c5999ffbd5492331
[GpsPrune.git] / src / tim / prune / load / babel / DistanceFilter.java
1 package tim.prune.load.babel;
2
3 import java.awt.BorderLayout;
4 import java.awt.Component;
5 import java.awt.GridLayout;
6
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;
12
13 import tim.prune.I18nManager;
14 import tim.prune.gui.DecimalNumberField;
15 import tim.prune.gui.WholeNumberField;
16
17 /**
18  * Distance filter for GPSBabel (compress by distance, or nearby points)
19  */
20 public class DistanceFilter extends FilterDefinition
21 {
22         /** Constructor */
23         public DistanceFilter(AddFilterDialog inFilterDialog)
24         {
25                 super(inFilterDialog);
26                 makePanelContents();
27         }
28
29         private DecimalNumberField _distField = null;
30         private JComboBox<String> _distUnitsCombo = null;
31         private WholeNumberField _secondsField = null;
32
33
34         /** @return filter name */
35         protected String getFilterName() {
36                 return "position";
37         }
38
39         /** Make the panel contents */
40         protected void makePanelContents()
41         {
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<String>(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);
66         }
67
68         /**
69          * @return true if the filters are valid
70          */
71         public boolean isFilterValid()
72         {
73                 if (_distField.getText() == null || _distField.getText().trim().equals("")) {
74                         return false; // no distance given
75                 }
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
79                 }
80                 // check the distance
81                 return (_distField.getValue() > 0.001); // no zero or negative distances allowed
82         }
83
84         /**
85          * @return filter parameters as a string, or null
86          */
87         protected String getParameters()
88         {
89                 if (!isFilterValid()) return null;
90                 StringBuilder builder = new StringBuilder();
91                 // Get the distance
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
96
97                 // is there a time as well?
98                 final boolean timeGiven = _secondsField.getText() != null && _secondsField.getText().trim().length() > 0;
99                 if (timeGiven) {
100                         builder.append(",time=").append(_secondsField.getValue()); // no s at the end
101                 }
102                 return builder.toString();
103         }
104 }