content: package tim.prune.load.babel;
  
  import java.awt.BorderLayout;
  import java.awt.Component;
  import java.awt.GridLayout;
  
  import javax.swing.BorderFactory;
  import javax.swing.Box;
  import javax.swing.BoxLayout;
  import javax.swing.JCheckBox;
  import javax.swing.JComboBox;
  import javax.swing.JLabel;
  import javax.swing.JPanel;
  import javax.swing.SwingConstants;
  import javax.swing.border.EtchedBorder;
  
  import tim.prune.I18nManager;
  import tim.prune.gui.WholeNumberField;
  
  /**
   * Discard filter for GPSBabel
   */
  public final class DiscardFilter extends FilterDefinition
  {
  	/** Constructor */
  	public DiscardFilter(AddFilterDialog inFilterDialog)
  	{
  		super(inFilterDialog);
  		makePanelContents();
  	}
  
  	private WholeNumberField _hdopField = null;
  	private WholeNumberField _vdopField = null;
  	private JComboBox<String> _combineDopsCombo = null;
  	private WholeNumberField _numSatsField = null;
  	private JCheckBox _noFixCheckbox = null;
  	private JCheckBox _unknownFixCheckbox = null;
  
  
  	/** @return filter name */
  	protected String getFilterName() {
  		return "discard";
  	}
  
  	/** Make the panel contents */
  	protected void makePanelContents()
  	{
  		setLayout(new BorderLayout());
  		JPanel boxPanel = new JPanel();
  		boxPanel.setLayout(new BoxLayout(boxPanel, BoxLayout.Y_AXIS));
  		JLabel topLabel = new JLabel(I18nManager.getText("dialog.gpsbabel.filter.discard.intro"));
  		topLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
  		boxPanel.add(topLabel);
  		boxPanel.add(Box.createVerticalStrut(9)); // spacer
  
  		JPanel boxPanel2 = new JPanel();
  		boxPanel2.setLayout(new BoxLayout(boxPanel2, BoxLayout.Y_AXIS));
  		// Panel for dops
  		JPanel dopPanel = new JPanel();
  		dopPanel.setBorder(BorderFactory.createCompoundBorder(
  			BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), BorderFactory.createEmptyBorder(4, 4, 4, 4))
  		);
  		dopPanel.setLayout(new GridLayout(0, 3, 4, 2));
  		dopPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.discard.hdop"), SwingConstants.RIGHT));
  		_hdopField = new WholeNumberField(2);
  		_hdopField.addKeyListener(_paramChangeListener);
  		dopPanel.add(_hdopField);
  		_combineDopsCombo = new JComboBox<String>(new String[] {I18nManager.getText("logic.and"), I18nManager.getText("logic.or")});
  		dopPanel.add(_combineDopsCombo);
  		dopPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.discard.vdop"), SwingConstants.RIGHT));
  		_vdopField = new WholeNumberField(2);
  		_vdopField.addKeyListener(_paramChangeListener);
  		dopPanel.add(_vdopField);
  		boxPanel2.add(dopPanel);
  
  		// Number of satellites
  		JPanel satPanel = new JPanel();
  		satPanel.add(new JLabel(I18nManager.getText("dialog.gpsbabel.filter.discard.numsats")));
  		_numSatsField = new WholeNumberField(2);
  		_numSatsField.addKeyListener(_paramChangeListener);
  		satPanel.add(_numSatsField);
  		boxPanel2.add(satPanel);
  
  		// Checkboxes for no fix and unknown fix
  		_noFixCheckbox = new JCheckBox(I18nManager.getText("dialog.gpsbabel.filter.discard.nofix"));
  		boxPanel2.add(_noFixCheckbox);
  		_unknownFixCheckbox = new JCheckBox(I18nManager.getText("dialog.gpsbabel.filter.discard.unknownfix"));
  		boxPanel2.add(_unknownFixCheckbox);
  		boxPanel2.add(Box.createVerticalStrut(9)); // spacer
  
  		boxPanel2.setAlignmentX(Component.LEFT_ALIGNMENT);
  		boxPanel.add(boxPanel2);
  		add(boxPanel, BorderLayout.NORTH);
  }
  
  	/**
  	 * @return true if the filters are valid
  	 */
  	public boolean isFilterValid()
  	{
  		// If values are entered, insist that they're positive (0 not valid)
  		if (_hdopField.getText() != null && _hdopField.getText().length() > 0 && _hdopField.getValue() <= 0) {return false;}
  		if (_vdopField.getText() != null && _vdopField.getText().length() > 0 && _vdopField.getValue() <= 0) {return false;}
  		if (_numSatsField.getText() != null && _numSatsField.getText().length() > 0 && _numSatsField.getValue() <= 0) {return false;}
  		// Insist that at least one value has been entered
  		return _hdopField.getValue() > 0 || _vdopField.getValue() > 0 || _numSatsField.getValue() > 0;
  	}
  
  	/**
  	 * @return filter parameters as a string, or null
  	 */
  	protected String getParameters()
  	{
  		if (!isFilterValid()) return null;
  		StringBuilder builder = new StringBuilder();
  		// hdop and vdop
  		final int hdop = _hdopField.getValue();
  		if (hdop > 0) {
  			builder.append(",hdop=").append(hdop);
  		}
  		final int vdop = _vdopField.getValue();
  		if (vdop > 0)
  		{
  			builder.append(",vdop=").append(vdop);
  			if (hdop > 0 && _combineDopsCombo.getSelectedIndex() == 0) {
  				builder.append(",hdopandvdop");
  			}
  		}
  		// number of satellites
  		final int numSats = _numSatsField.getValue();
  		if (numSats > 0)
  		{
  			builder.append(",sat=").append(numSats);
  		}
  		// checkboxes
  		if (_noFixCheckbox.isSelected()) {
  			builder.append(",fixnone");
  		}
  		if (_unknownFixCheckbox.isSelected()) {
  			builder.append(",fixunknown");
  		}
  		return builder.toString();
  	}
  }
  