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();
}
}
|