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