package org.esa.snap.opendap.ui; import org.esa.snap.opendap.datamodel.OpendapLeaf; import org.esa.snap.util.StringUtils; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; class DatasetNameFilter implements FilterComponent { final JCheckBox checkBox; final JTextField expressionTextField; final JButton applyButton; List<FilterChangeListener> listeners; public DatasetNameFilter(JCheckBox filterCheckBox) { checkBox = filterCheckBox; checkBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { updateUIState(false); if (StringUtils.isNotNullAndNotEmpty(expressionTextField.getText())) { fireFilterChangedEvent(); } } }); expressionTextField = new JTextField(); expressionTextField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { updateUIState(true); } @Override public void removeUpdate(DocumentEvent e) { updateUIState(true); } @Override public void changedUpdate(DocumentEvent e) { updateUIState(true); } }); listeners = new ArrayList<FilterChangeListener>(); applyButton = new JButton("Apply"); applyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { fireFilterChangedEvent(); updateUIState(false); } }); updateUIState(false); } @Override public JComponent getUI() { final JPanel buttonPanel = new JPanel(new BorderLayout()); buttonPanel.add(applyButton, BorderLayout.EAST); final JPanel filterUI = new JPanel(new BorderLayout(4, 4)); filterUI.add(expressionTextField, BorderLayout.NORTH); filterUI.add(buttonPanel, BorderLayout.SOUTH); return filterUI; } @Override public boolean accept(OpendapLeaf leaf) { String text = expressionTextField.getText(); if (StringUtils.isNullOrEmpty(text)) { return true; } text = text.replace("*", ".*").toLowerCase(); Pattern pattern = Pattern.compile(text); final Matcher matcher = pattern.matcher(leaf.getName().toLowerCase()); return matcher.matches(); } @Override public void addFilterChangeListener(FilterChangeListener listener) { listeners.add(listener); } private void fireFilterChangedEvent() { for (FilterChangeListener listener : listeners) { listener.filterChanged(); } } private void updateUIState(boolean enableApplyButton) { if (!checkBox.isSelected()) { expressionTextField.setEnabled(false); applyButton.setEnabled(false); return; } expressionTextField.setEnabled(true); applyButton.setEnabled(enableApplyButton); } }