/* * 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.core.gpf.ui; import com.bc.ceres.binding.PropertyDescriptor; import com.bc.ceres.swing.TableLayout; import org.esa.snap.core.datamodel.Product; import org.esa.snap.core.datamodel.ProductFilter; import org.esa.snap.core.gpf.OperatorSpi; import org.esa.snap.core.gpf.descriptor.OperatorDescriptor; import org.esa.snap.core.gpf.descriptor.SourceProductDescriptor; import org.esa.snap.ui.AppContext; import javax.swing.BorderFactory; import javax.swing.JPanel; import java.util.ArrayList; import java.util.HashMap; /** * WARNING: This class belongs to a preliminary API and may change in future releases. */ public class DefaultIOParametersPanel extends JPanel { private ArrayList<SourceProductSelector> sourceProductSelectorList; private HashMap<SourceProductDescriptor, SourceProductSelector> sourceProductSelectorMap; private AppContext appContext; public DefaultIOParametersPanel(AppContext appContext, OperatorDescriptor descriptor, TargetProductSelector targetProductSelector, boolean targetProductSelectorDisplay) { this.appContext = appContext; sourceProductSelectorList = new ArrayList<>(3); sourceProductSelectorMap = new HashMap<>(3); // Fetch source products createSourceProductSelectors(descriptor); if (!sourceProductSelectorList.isEmpty()) { setSourceProductSelectorLabels(); setSourceProductSelectorToolTipTexts(); } final TableLayout tableLayout = new TableLayout(1); tableLayout.setTableAnchor(TableLayout.Anchor.WEST); tableLayout.setTableWeightX(1.0); tableLayout.setTableFill(TableLayout.Fill.HORIZONTAL); tableLayout.setTablePadding(3, 3); setLayout(tableLayout); int countSPS = sourceProductSelectorList.size(); if (countSPS == 1) { for (SourceProductSelector selector : sourceProductSelectorList) { add(selector.createDefaultPanel()); } } else { final TableLayout tableLayoutSPS = new TableLayout(1); tableLayoutSPS.setTableAnchor(TableLayout.Anchor.WEST); tableLayoutSPS.setTableWeightX(1.0); tableLayoutSPS.setTableFill(TableLayout.Fill.HORIZONTAL); JPanel panel = new JPanel(tableLayoutSPS); panel.setBorder(BorderFactory.createTitledBorder("Source Products")); for (SourceProductSelector selector : sourceProductSelectorList) { panel.add(selector.createDefaultPanel("")); } add(panel); } if (targetProductSelectorDisplay) { add(targetProductSelector.createDefaultPanel()); } add(tableLayout.createVerticalSpacer()); } public DefaultIOParametersPanel(AppContext appContext, OperatorDescriptor descriptor, TargetProductSelector targetProductSelector) { this(appContext, descriptor, targetProductSelector, true); } /** * @deprecated since BEAM 5, use {@link #DefaultIOParametersPanel(AppContext, OperatorDescriptor, TargetProductSelector)} */ @Deprecated public DefaultIOParametersPanel(AppContext appContext, OperatorSpi operatorSpi, TargetProductSelector targetProductSelector) { this(appContext, operatorSpi.getOperatorDescriptor(), targetProductSelector); } public ArrayList<SourceProductSelector> getSourceProductSelectorList() { return sourceProductSelectorList; } public void initSourceProductSelectors() { for (SourceProductSelector sourceProductSelector : sourceProductSelectorList) { sourceProductSelector.initProducts(); } } public void releaseSourceProductSelectors() { for (SourceProductSelector sourceProductSelector : sourceProductSelectorList) { sourceProductSelector.releaseProducts(); } } public HashMap<String, Product> createSourceProductsMap() { final HashMap<String, Product> sourceProducts = new HashMap<>(8); for (SourceProductDescriptor descriptor : sourceProductSelectorMap.keySet()) { final SourceProductSelector selector = sourceProductSelectorMap.get(descriptor); String alias = descriptor.getAlias(); String key = alias != null ? alias : descriptor.getName(); sourceProducts.put(key, selector.getSelectedProduct()); } return sourceProducts; } private void createSourceProductSelectors(OperatorDescriptor operatorDescriptor) { for (SourceProductDescriptor descriptor : operatorDescriptor.getSourceProductDescriptors()) { final ProductFilter productFilter = new AnnotatedSourceProductFilter(descriptor); SourceProductSelector sourceProductSelector = new SourceProductSelector(appContext, descriptor.isOptional()); sourceProductSelector.setProductFilter(productFilter); sourceProductSelectorList.add(sourceProductSelector); sourceProductSelectorMap.put(descriptor, sourceProductSelector); } } private void setSourceProductSelectorLabels() { for (SourceProductDescriptor descriptor : sourceProductSelectorMap.keySet()) { final SourceProductSelector selector = sourceProductSelectorMap.get(descriptor); String label = descriptor.getLabel(); String alias = descriptor.getAlias(); if (label == null && alias != null) { label = alias; } if (label == null) { label = PropertyDescriptor.createDisplayName(descriptor.getName()); } if (!label.endsWith(":")) { label += ":"; } if (descriptor.isOptional()) { label += " (optional)"; } selector.getProductNameLabel().setText(label); } } private void setSourceProductSelectorToolTipTexts() { for (SourceProductDescriptor descriptor : sourceProductSelectorMap.keySet()) { final String description = descriptor.getDescription(); if (description != null) { final SourceProductSelector selector = sourceProductSelectorMap.get(descriptor); selector.getProductNameComboBox().setToolTipText(description); } } } private static class AnnotatedSourceProductFilter implements ProductFilter { private final SourceProductDescriptor productDescriptor; private AnnotatedSourceProductFilter(SourceProductDescriptor productDescriptor) { this.productDescriptor = productDescriptor; } @Override public boolean accept(Product product) { String productType = productDescriptor.getProductType(); if (productType != null && !product.getProductType().matches(productType)) { return false; } for (String bandName : productDescriptor.getBands()) { if (!product.containsBand(bandName)) { return false; } } return true; } } }