/* * 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.collocation.visat; import com.bc.ceres.binding.PropertySet; import com.bc.ceres.swing.TableLayout; import com.bc.ceres.swing.binding.BindingContext; import org.esa.snap.collocation.ResamplingType; import org.esa.snap.core.datamodel.Band; import org.esa.snap.core.datamodel.Product; import org.esa.snap.core.gpf.ui.SourceProductSelector; import org.esa.snap.core.gpf.ui.TargetProductSelector; import org.esa.snap.ui.AppContext; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.DefaultComboBoxModel; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import java.awt.BorderLayout; import java.awt.Insets; /** * Form for geographic collocation dialog. * * @author Ralf Quast * @version $Revision$ $Date$ */ class CollocationForm extends JPanel { private SourceProductSelector masterProductSelector; private SourceProductSelector slaveProductSelector; private JCheckBox renameMasterComponentsCheckBox; private JCheckBox renameSlaveComponentsCheckBox; private JTextField masterComponentPatternField; private JTextField slaveComponentPatternField; private JComboBox<ResamplingType> resamplingComboBox; private DefaultComboBoxModel<ResamplingType> resamplingComboBoxModel; private TargetProductSelector targetProductSelector; public CollocationForm(PropertySet propertySet, TargetProductSelector targetProductSelector, AppContext appContext) { this.targetProductSelector = targetProductSelector; masterProductSelector = new SourceProductSelector(appContext, "Master (pixel values are conserved):"); slaveProductSelector = new SourceProductSelector(appContext, "Slave (pixel values are resampled onto the master grid):"); renameMasterComponentsCheckBox = new JCheckBox("Rename master components:"); renameSlaveComponentsCheckBox = new JCheckBox("Rename slave components:"); masterComponentPatternField = new JTextField(); slaveComponentPatternField = new JTextField(); resamplingComboBoxModel = new DefaultComboBoxModel<>(ResamplingType.values()); resamplingComboBox = new JComboBox<>(resamplingComboBoxModel); slaveProductSelector.getProductNameComboBox().addActionListener(e -> { Product slaveProduct = slaveProductSelector.getSelectedProduct(); boolean validPixelExpressionUsed = isValidPixelExpressionUsed(slaveProduct); adaptResamplingComboBoxModel(resamplingComboBoxModel, validPixelExpressionUsed); }); createComponents(); bindComponents(propertySet); } public void prepareShow() { masterProductSelector.initProducts(); if (masterProductSelector.getProductCount() > 0) { masterProductSelector.setSelectedIndex(0); } slaveProductSelector.initProducts(); if (slaveProductSelector.getProductCount() > 1) { slaveProductSelector.setSelectedIndex(1); } } public void prepareHide() { masterProductSelector.releaseProducts(); slaveProductSelector.releaseProducts(); } Product getMasterProduct() { return masterProductSelector.getSelectedProduct(); } Product getSlaveProduct() { return slaveProductSelector.getSelectedProduct(); } private void createComponents() { setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); add(createSourceProductPanel()); add(createTargetProductPanel()); add(createRenamingPanel()); add(createResamplingPanel()); } private void bindComponents(PropertySet propertySet) { final BindingContext sbc = new BindingContext(propertySet); sbc.bind("renameMasterComponents", renameMasterComponentsCheckBox); sbc.bind("renameSlaveComponents", renameSlaveComponentsCheckBox); sbc.bind("masterComponentPattern", masterComponentPatternField); sbc.bind("slaveComponentPattern", slaveComponentPatternField); sbc.bind("resamplingType", resamplingComboBox); sbc.bindEnabledState("masterComponentPattern", true, "renameMasterComponents", true); sbc.bindEnabledState("slaveComponentPattern", true, "renameSlaveComponents", true); } private JPanel createSourceProductPanel() { final JPanel masterPanel = new JPanel(new BorderLayout(3, 3)); masterPanel.add(masterProductSelector.getProductNameLabel(), BorderLayout.NORTH); masterProductSelector.getProductNameComboBox().setPrototypeDisplayValue( "MER_RR__1PPBCM20030730_071000_000003972018_00321_07389_0000.N1"); masterPanel.add(masterProductSelector.getProductNameComboBox(), BorderLayout.CENTER); masterPanel.add(masterProductSelector.getProductFileChooserButton(), BorderLayout.EAST); final JPanel slavePanel = new JPanel(new BorderLayout(3, 3)); slavePanel.add(slaveProductSelector.getProductNameLabel(), BorderLayout.NORTH); slavePanel.add(slaveProductSelector.getProductNameComboBox(), BorderLayout.CENTER); slavePanel.add(slaveProductSelector.getProductFileChooserButton(), BorderLayout.EAST); final TableLayout layout = new TableLayout(1); layout.setTableAnchor(TableLayout.Anchor.WEST); layout.setTableFill(TableLayout.Fill.HORIZONTAL); layout.setTableWeightX(1.0); layout.setCellPadding(0, 0, new Insets(3, 3, 3, 3)); layout.setCellPadding(1, 0, new Insets(3, 3, 3, 3)); final JPanel panel = new JPanel(layout); panel.setBorder(BorderFactory.createTitledBorder("Source Products")); panel.add(masterPanel); panel.add(slavePanel); return panel; } private JPanel createTargetProductPanel() { return targetProductSelector.createDefaultPanel(); } private JPanel createRenamingPanel() { final TableLayout layout = new TableLayout(2); layout.setTableAnchor(TableLayout.Anchor.WEST); layout.setTableFill(TableLayout.Fill.HORIZONTAL); layout.setColumnWeightX(0, 0.0); layout.setColumnWeightX(1, 1.0); layout.setCellPadding(0, 0, new Insets(3, 3, 3, 3)); layout.setCellPadding(1, 0, new Insets(3, 3, 3, 3)); final JPanel panel = new JPanel(layout); panel.setBorder(BorderFactory.createTitledBorder("Renaming of Source Product Components")); panel.add(renameMasterComponentsCheckBox); panel.add(masterComponentPatternField); panel.add(renameSlaveComponentsCheckBox); panel.add(slaveComponentPatternField); return panel; } private JPanel createResamplingPanel() { final TableLayout layout = new TableLayout(3); layout.setTableAnchor(TableLayout.Anchor.LINE_START); layout.setTableFill(TableLayout.Fill.HORIZONTAL); layout.setColumnWeightX(0, 0.0); layout.setColumnWeightX(1, 0.0); layout.setColumnWeightX(2, 1.0); layout.setCellPadding(0, 0, new Insets(3, 3, 3, 3)); final JPanel panel = new JPanel(layout); panel.setBorder(BorderFactory.createTitledBorder("Resampling")); panel.add(new JLabel("Method:")); panel.add(resamplingComboBox); panel.add(new JLabel()); return panel; } static void adaptResamplingComboBoxModel(DefaultComboBoxModel<ResamplingType> comboBoxModel, boolean isValidPixelExpressionUsed) { if (isValidPixelExpressionUsed) { if (comboBoxModel.getSize() == 5) { comboBoxModel.removeElement(ResamplingType.BICUBIC_CONVOLUTION); comboBoxModel.removeElement(ResamplingType.BISINC_CONVOLUTION); comboBoxModel.removeElement(ResamplingType.CUBIC_CONVOLUTION); comboBoxModel.removeElement(ResamplingType.BILINEAR_INTERPOLATION); comboBoxModel.setSelectedItem(ResamplingType.NEAREST_NEIGHBOUR); } } else { if (comboBoxModel.getSize() == 1) { comboBoxModel.addElement(ResamplingType.BILINEAR_INTERPOLATION); comboBoxModel.addElement(ResamplingType.CUBIC_CONVOLUTION); comboBoxModel.addElement(ResamplingType.BICUBIC_CONVOLUTION); comboBoxModel.addElement(ResamplingType.BISINC_CONVOLUTION); } } } static boolean isValidPixelExpressionUsed(Product product) { if (product != null) { for (final Band band : product.getBands()) { final String expression = band.getValidPixelExpression(); if (expression != null && !expression.trim().isEmpty()) { return true; } } } return false; } }