]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/load/babel/InterpolateFilter.java
Version 16, February 2014
[GpsPrune.git] / tim / prune / load / babel / InterpolateFilter.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  * 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
20  */
21 public class InterpolateFilter extends FilterDefinition
22 {
23         /** Constructor */
24         public InterpolateFilter(AddFilterDialog inFilterDialog)
25         {
26                 super(inFilterDialog);
27                 makePanelContents();
28         }
29
30         private DecimalNumberField _distField = null;
31         private JComboBox<String> _distUnitsCombo = null;
32         private WholeNumberField _secondsField = null;
33
34
35         /** @return filter name */
36         protected String getFilterName() {
37                 return "interpolate";
38         }
39
40         /** Make the panel contents */
41         protected void makePanelContents()
42         {
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);
67         }
68
69         /**
70          * @return true if the filters are valid
71          */
72         public boolean isFilterValid()
73         {
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
78                 }
79                 if (distGiven && _distField.getValue() < 0.0001) {
80                         return false; // must have a decent distance
81                 }
82                 if (timeGiven && _secondsField.getValue() <= 1) {
83                         return false; // must have a decent number of seconds
84                 }
85                 // must be ok
86                 return true;
87         }
88
89         /**
90          * @return filter parameters as a string, or null
91          */
92         protected String getParameters()
93         {
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;
98                 if (distGiven)
99                 {
100                         // Get the distance
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");
105                 }
106                 else if (timeGiven) {
107                         // time
108                         builder.append(",time=").append(_secondsField.getValue()); // no s at the end
109                 }
110                 return builder.toString();
111         }
112 }