File: SimplifyFilter.java

package info (click to toggle)
gpsprune 18.6-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 4,224 kB
  • ctags: 5,425
  • sloc: java: 40,897; sh: 25; makefile: 24; python: 15
file content (147 lines) | stat: -rw-r--r-- 4,947 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package tim.prune.load.babel;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

import tim.prune.I18nManager;
import tim.prune.data.UnitSetLibrary;
import tim.prune.gui.DecimalNumberField;
import tim.prune.gui.WholeNumberField;

/**
 * Simplify filter for GPSBabel
 */
public class SimplifyFilter extends FilterDefinition
{
	/** Constructor */
	public SimplifyFilter(AddFilterDialog inFilterDialog)
	{
		super(inFilterDialog);
		makePanelContents();
	}

	private WholeNumberField _maxPointsField = null;
	private DecimalNumberField _distField = null;
	private JComboBox<String> _distUnitsCombo = null;
	private JRadioButton _crossTrackRadio = null;
	private JRadioButton _lengthRadio = null;
	private JRadioButton _relativeRadio = null;


	/** @return filter name */
	protected String getFilterName() {
		return "simplify";
	}

	/** Make the panel contents */
	protected void makePanelContents()
	{
		setLayout(new BorderLayout());
		JPanel boxPanel = new JPanel();
		boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.Y_AXIS));
		add(boxPanel, BorderLayout.NORTH);
		JLabel topLabel = new JLabel(I18nManager.getText("dialog.gpsbabel.filter.simplify.intro"));
		topLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
		boxPanel.add(topLabel);
		boxPanel.add(Box.createVerticalStrut(18)); // spacer
		// Main three-column grid
		JPanel gridPanel = new JPanel();
		gridPanel.setLayout(new GridLayout(0, 3, 4, 4));
		gridPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.simplify.maxpoints")));
		_maxPointsField = new WholeNumberField(6);
		_maxPointsField.addKeyListener(_paramChangeListener);
		gridPanel.add(_maxPointsField);
		gridPanel.add(new JLabel(" "));
		gridPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.simplify.maxerror")));
		_distField = new DecimalNumberField();
		_distField.addKeyListener(_paramChangeListener);
		gridPanel.add(_distField);
		_distUnitsCombo = new JComboBox<String>(new String[] {
			I18nManager.getText(UnitSetLibrary.UNITS_KILOMETRES.getNameKey()),
			I18nManager.getText(UnitSetLibrary.UNITS_MILES.getNameKey())
		});
		gridPanel.add(_distUnitsCombo);
		// radio buttons
		_crossTrackRadio = new JRadioButton(I18nManager.getText("dialog.gpsbabel.filter.simplify.crosstrack"));
		_crossTrackRadio.setSelected(true);
		_lengthRadio     = new JRadioButton(I18nManager.getText("dialog.gpsbabel.filter.simplify.length"));
		_relativeRadio   = new JRadioButton(I18nManager.getText("dialog.gpsbabel.filter.simplify.relative"));
		ButtonGroup radioGroup = new ButtonGroup();
		radioGroup.add(_crossTrackRadio);
		radioGroup.add(_lengthRadio);
		radioGroup.add(_relativeRadio);
		gridPanel.add(_crossTrackRadio);
		gridPanel.add(_lengthRadio);
		gridPanel.add(_relativeRadio);
		gridPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
		boxPanel.add(gridPanel);
	}

	/**
	 * @return true if the filters are valid
	 */
	public boolean isFilterValid()
	{
		final boolean countGiven = _maxPointsField.getText() != null && _maxPointsField.getText().trim().length() > 0;
		final boolean distGiven = _distField.getText() != null && _distField.getText().trim().length() > 0;
		if ((!countGiven && !distGiven) || (countGiven && distGiven)) {
			return false; // only one or the other allowed
		}
		if (countGiven && _maxPointsField.getValue() <= 1) {
			return false; // must have a decent max points
		}
		if (distGiven && _distField.getValue() <= 0.001) {
			return false; // no zero or negative distances allowed
		}
		// must be ok
		return true;
	}

	/**
	 * @return filter parameters as a string, or null
	 */
	protected String getParameters()
	{
		if (!isFilterValid()) return null;
		StringBuilder builder = new StringBuilder();
		// type
		final boolean countGiven = _maxPointsField.getText() != null && _maxPointsField.getText().trim().length() > 0;
		final boolean distGiven = _distField.getText() != null && _distField.getText().trim().length() > 0;
		if (countGiven) {
			builder.append(",count=").append(_maxPointsField.getValue());
		}
		else if (distGiven)
		{
			double dValue = 1.0;
			try {
				dValue = Double.parseDouble(_distField.getText());
			}
			catch (Exception e) {} // shouldn't happen, otherwise validation would have failed
			builder.append(",error=").append(dValue);
			// units of distance (miles by default)
			if (_distUnitsCombo.getSelectedIndex() == 0) {
				builder.append("k"); // nothing for miles
			}
		}
		// three options
		if (_crossTrackRadio.isSelected()) {
			builder.append(",crosstrack"); // default, could not pass it
		}
		else if (_lengthRadio.isSelected()) {
			builder.append(",length");
		}
		else if (_relativeRadio.isSelected()) {
			builder.append(",relative");
		}
		return builder.toString();
	}
}