]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/load/babel/SimplifyFilter.java
Version 16, February 2014
[GpsPrune.git] / tim / prune / load / babel / SimplifyFilter.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.ButtonGroup;
10 import javax.swing.JComboBox;
11 import javax.swing.JLabel;
12 import javax.swing.JPanel;
13 import javax.swing.JRadioButton;
14
15 import tim.prune.I18nManager;
16 import tim.prune.data.UnitSetLibrary;
17 import tim.prune.gui.DecimalNumberField;
18 import tim.prune.gui.WholeNumberField;
19
20 /**
21  * Simplify filter for GPSBabel
22  */
23 public class SimplifyFilter extends FilterDefinition
24 {
25         /** Constructor */
26         public SimplifyFilter(AddFilterDialog inFilterDialog)
27         {
28                 super(inFilterDialog);
29                 makePanelContents();
30         }
31
32         private WholeNumberField _maxPointsField = null;
33         private DecimalNumberField _distField = null;
34         private JComboBox<String> _distUnitsCombo = null;
35         private JRadioButton _crossTrackRadio = null;
36         private JRadioButton _lengthRadio = null;
37         private JRadioButton _relativeRadio = null;
38
39
40         /** @return filter name */
41         protected String getFilterName() {
42                 return "simplify";
43         }
44
45         /** Make the panel contents */
46         protected void makePanelContents()
47         {
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<String>(new String[] {
69                         I18nManager.getText(UnitSetLibrary.UNITS_KILOMETRES.getNameKey()),
70                         I18nManager.getText(UnitSetLibrary.UNITS_MILES.getNameKey())
71                 });
72                 gridPanel.add(_distUnitsCombo);
73                 // radio buttons
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);
87         }
88
89         /**
90          * @return true if the filters are valid
91          */
92         public boolean isFilterValid()
93         {
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
98                 }
99                 if (countGiven && _maxPointsField.getValue() <= 1) {
100                         return false; // must have a decent max points
101                 }
102                 if (distGiven && _distField.getValue() <= 0.001) {
103                         return false; // no zero or negative distances allowed
104                 }
105                 // must be ok
106                 return true;
107         }
108
109         /**
110          * @return filter parameters as a string, or null
111          */
112         protected String getParameters()
113         {
114                 if (!isFilterValid()) return null;
115                 StringBuilder builder = new StringBuilder();
116                 // type
117                 final boolean countGiven = _maxPointsField.getText() != null && _maxPointsField.getText().trim().length() > 0;
118                 final boolean distGiven = _distField.getText() != null && _distField.getText().trim().length() > 0;
119                 if (countGiven) {
120                         builder.append(",count=").append(_maxPointsField.getValue());
121                 }
122                 else if (distGiven)
123                 {
124                         double dValue = 1.0;
125                         try {
126                                 dValue = Double.parseDouble(_distField.getText());
127                         }
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
133                         }
134                 }
135                 // three options
136                 if (_crossTrackRadio.isSelected()) {
137                         builder.append(",crosstrack"); // default, could not pass it
138                 }
139                 else if (_lengthRadio.isSelected()) {
140                         builder.append(",length");
141                 }
142                 else if (_relativeRadio.isSelected()) {
143                         builder.append(",relative");
144                 }
145                 return builder.toString();
146         }
147 }