/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package org.esa.snap.ui.crs;
import com.bc.ceres.swing.TableLayout;
import org.esa.snap.core.datamodel.GeoPos;
import org.esa.snap.core.datamodel.Product;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
/**
* @author Marco Peters
* @author Marco Zühlke
* @since BEAM 4.7
*/
public class CrsSelectionPanel extends JPanel {
private CrsChangeListener crsChangeListener;
private final CrsForm[] crsForms;
public CrsSelectionPanel(CrsForm... crsForms) {
this.crsForms = crsForms;
createUI();
crsChangeListener = new CrsChangeListener();
addPropertyChangeListener("enabled", new EnabledChangeListener());
}
public void setReferenceProduct(Product product) {
for (CrsForm crsForm : crsForms) {
crsForm.setReferenceProduct(product);
}
}
public CoordinateReferenceSystem getCrs(GeoPos referencePos) throws FactoryException {
for (CrsForm crsForm : crsForms) {
if (crsForm.getRadioButton().isSelected()) {
return crsForm.getCRS(referencePos);
}
}
return null;
}
public void prepareShow() {
for (CrsForm crsForm : crsForms) {
crsForm.prepareShow();
crsForm.addCrsChangeListener(crsChangeListener);
}
updateUIState();
}
public void prepareHide() {
for (CrsForm crsForm : crsForms) {
crsForm.prepareHide();
crsForm.removeCrsChangeListener(crsChangeListener);
}
}
private void updateUIState() {
for (CrsForm crsForm : crsForms) {
crsForm.getCrsUI().setEnabled(crsForm.getRadioButton().isSelected());
}
}
private void createUI() {
ButtonGroup buttonGroup = new ButtonGroup();
final TableLayout tableLayout = new TableLayout(2);
tableLayout.setTablePadding(4, 4);
tableLayout.setTableFill(TableLayout.Fill.BOTH);
tableLayout.setTableAnchor(TableLayout.Anchor.WEST);
tableLayout.setTableWeightX(1.0);
tableLayout.setTableWeightY(0.0);
setLayout(tableLayout);
setBorder(BorderFactory.createTitledBorder("Coordinate Reference System (CRS)"));
final UpdateStateListener updateStateListener = new UpdateStateListener();
int rowCount = 0;
for (int i = 0, crsFormsLength = crsForms.length; i < crsFormsLength; i++) {
CrsForm crsForm = crsForms[i];
JRadioButton crsRadioButton = crsForm.getRadioButton();
crsRadioButton.setSelected(i == 0);
crsRadioButton.addActionListener(updateStateListener);
JComponent crsComponent = crsForm.getCrsUI();
crsComponent.setEnabled(i == 0);
buttonGroup.add(crsRadioButton);
if (crsForm.wrapAfterButton()) {
tableLayout.setCellColspan(rowCount, 0, 2);
rowCount++;
tableLayout.setCellColspan(rowCount, 0, 2);
tableLayout.setCellPadding(rowCount, 0, new Insets(4, 24, 4, 4));
rowCount++;
} else {
tableLayout.setCellWeightX(rowCount, 0, 0.0);
rowCount++;
}
add(crsRadioButton);
add(crsComponent);
}
}
private class UpdateStateListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
updateUIState();
fireCrsChanged();
}
}
private class CrsChangeListener implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent evt) {
fireCrsChanged();
}
}
private void fireCrsChanged() {
firePropertyChange("crs", null, null);
}
private class EnabledChangeListener implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent evt) {
final Boolean enabled = (Boolean) evt.getNewValue();
for (CrsForm crsForm : crsForms) {
final JRadioButton button = crsForm.getRadioButton();
button.setEnabled(enabled);
final boolean selected = button.isSelected();
crsForm.getCrsUI().setEnabled(selected && enabled);
}
}
}
}