package tim.prune.load.babel; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.regex.Pattern; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; import tim.prune.I18nManager; import tim.prune.gui.StatusIcon; /** * Gui element to allow the specification of filters for GPSBabel. * Used for loading from GPS and loading from file */ public class BabelFilterPanel extends JPanel { /** Text field for entering filters manually */ private JTextField _filterField = null; /** Icon for showing whether the value is valid for GPSBabel or not */ private StatusIcon _validIcon = null; /** Dialog for adding a new filter */ private AddFilterDialog _addDialog = null; /** Regular expression for detecting valid filter strings */ private static final Pattern FILTER_PATTERN = Pattern.compile("(-x [a-z,\\.0-9=]+ *)+"); /** * Constructor * @param inParentFrame parent frame for launching popup dialog */ public BabelFilterPanel(JFrame inParentFrame) { setBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder(I18nManager.getText("dialog.gpsbabel.filters")), BorderFactory.createEmptyBorder(2, 2, 2, 2))); initPanel(); _addDialog = new AddFilterDialog(this, inParentFrame); } /** * Set up the panel with all the components inside */ private void initPanel() { setLayout(new BorderLayout(4, 4)); // text field for the filter text _filterField = new JTextField(20); _filterField.addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent arg0) { SwingUtilities.invokeLater(new Runnable() { public void run() { checkFilter(); } }); } }); JPanel filterFieldPanel = new JPanel(); filterFieldPanel.setLayout(new BorderLayout(3, 3)); JPanel filterIconPanel = new JPanel(); filterIconPanel.setLayout(new BorderLayout(3, 3)); filterIconPanel.add(_filterField, BorderLayout.CENTER); _validIcon = new StatusIcon(); filterIconPanel.add(_validIcon, BorderLayout.EAST); filterFieldPanel.add(filterIconPanel, BorderLayout.NORTH); add(filterFieldPanel, BorderLayout.CENTER); // Add and clear buttons JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS)); JButton addButton = new JButton(I18nManager.getText("button.addnew")); addButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { // System.out.println("Filter exists: " + hasFilter() + ", valid: " + isFilterValid()); _addDialog.showDialog(); } }); buttonPanel.add(addButton); buttonPanel.add(Box.createVerticalStrut(2)); JButton clearButton = new JButton(I18nManager.getText("button.delete")); clearButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { _filterField.setText(""); checkFilter(); } }); buttonPanel.add(clearButton); add(buttonPanel, BorderLayout.EAST); } /** * @param inFilter filter string to set (normally from config) */ public void setFilterString(String inFilter) { if (inFilter != null && _filterField != null) { _filterField.setText(inFilter.trim()); } checkFilter(); } /** * @return trimmed filter string, or null */ public String getFilterString() { String filter = _filterField.getText(); if (filter != null) filter = filter.trim(); return filter; } /** * @return true if a filter has been given (which may or may not be valid) */ public boolean hasFilter() { String str = getFilterString(); return str != null && str.length() > 0; } /** * @return true if the given filter string is valid */ public boolean isFilterValid() { String str = getFilterString(); if (str == null) return false; return FILTER_PATTERN.matcher(str).matches(); } /** * Called from the add filter dialog to indicate completion * @param inFilter filter to add */ public void addFilter(String inFilter) { if (inFilter != null) { String newFilter = inFilter.trim(); String currFilter = getFilterString(); if (!newFilter.equals("")) { if (currFilter == null || currFilter.equals("")) { currFilter = newFilter; } else { // append currFilter = currFilter + " " + newFilter; } } _filterField.setText(currFilter); } checkFilter(); } /** * See if the current filter is valid or not, and update the icon accordingly */ private void checkFilter() { if (hasFilter()) { if (isFilterValid()) { _validIcon.setStatusValid(); } else { _validIcon.setStatusInvalid(); } } else { _validIcon.setStatusBlank(); } } }