package org.esa.snap.opendap.ui;
import com.bc.ceres.binding.Property;
import com.bc.ceres.binding.PropertySet;
import org.esa.snap.core.ui.RegionBoundsInputUI;
import org.esa.snap.opendap.datamodel.OpendapLeaf;
import thredds.catalog.ThreddsMetadata;
import ucar.unidata.geoloc.LatLonPointImpl;
import ucar.unidata.geoloc.LatLonRect;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
public class RegionFilter implements FilterComponent {
private final JButton applyButton;
private final List<FilterChangeListener> filterChangeListeners;
private RegionBoundsInputUI regionBoundsInputUI;
Property eastBoundProperty;
Property westBoundProperty;
Property northBoundProperty;
Property southBoundProperty;
private final JCheckBox useRegionFilter;
public RegionFilter(final JCheckBox useRegionFilter) {
this.useRegionFilter = useRegionFilter;
filterChangeListeners = new ArrayList<FilterChangeListener>();
useRegionFilter.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireFilterChanged();
updateUI(useRegionFilter.isSelected(), useRegionFilter.isSelected());
}
});
applyButton = new JButton("Apply");
applyButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireFilterChanged();
updateUI(false, true);
}
});
}
@Override
public JComponent getUI() {
final JPanel regionPanel = new JPanel(new BorderLayout());
regionBoundsInputUI = new RegionBoundsInputUI();
regionBoundsInputUI.getUI().setBorder(new EmptyBorder(0, 0, 8, 0));
regionPanel.add(regionBoundsInputUI.getUI(), BorderLayout.NORTH);
regionPanel.add(applyButton, BorderLayout.EAST);
PropertySet propertySet = regionBoundsInputUI.getBindingContext().getPropertySet();
eastBoundProperty = propertySet.getProperty(RegionBoundsInputUI.PROPERTY_EAST_BOUND);
westBoundProperty = propertySet.getProperty(RegionBoundsInputUI.PROPERTY_WEST_BOUND);
northBoundProperty = propertySet.getProperty(RegionBoundsInputUI.PROPERTY_NORTH_BOUND);
southBoundProperty = propertySet.getProperty(RegionBoundsInputUI.PROPERTY_SOUTH_BOUND);
BoundsChangeListener boundsChangeListener = new BoundsChangeListener();
eastBoundProperty.addPropertyChangeListener(boundsChangeListener);
westBoundProperty.addPropertyChangeListener(boundsChangeListener);
northBoundProperty.addPropertyChangeListener(boundsChangeListener);
southBoundProperty.addPropertyChangeListener(boundsChangeListener);
updateUI(false, false);
return regionPanel;
}
@Override
public boolean accept(OpendapLeaf leaf) {
ThreddsMetadata.GeospatialCoverage geospatialCoverage = leaf.getDataset().getGeospatialCoverage();
if (geospatialCoverage == null) {
return true;
}
Double eastBound = eastBoundProperty.getValue();
Double westBound = westBoundProperty.getValue();
Double northBound = northBoundProperty.getValue();
Double southBound = southBoundProperty.getValue();
LatLonPointImpl northWest = new LatLonPointImpl(northBound, westBound);
LatLonPointImpl southEast = new LatLonPointImpl(southBound, eastBound);
LatLonRect latLonRect = new LatLonRect(northWest, southEast);
return latLonRect.intersect(geospatialCoverage.getBoundingBox()) != null;
}
@Override
public void addFilterChangeListener(FilterChangeListener listener) {
filterChangeListeners.add(listener);
}
private void fireFilterChanged() {
for (FilterChangeListener filterChangeListener : filterChangeListeners) {
filterChangeListener.filterChanged();
}
}
private class BoundsChangeListener implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent evt) {
updateUI(true, true);
}
}
private void updateUI(boolean enableApplyButton, boolean enableRegionBoundsInputUI) {
if (useRegionFilter.isSelected()) {
applyButton.setEnabled(enableApplyButton);
regionBoundsInputUI.setEnabled(enableRegionBoundsInputUI);
} else {
applyButton.setEnabled(false);
regionBoundsInputUI.setEnabled(false);
}
}
}