/*
* 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.rcp.mask;
import org.esa.snap.core.datamodel.Mask;
import org.esa.snap.core.datamodel.Product;
import org.esa.snap.core.datamodel.ProductManager;
import org.esa.snap.core.datamodel.ProductNode;
import org.esa.snap.core.datamodel.RasterDataNode;
import org.esa.snap.core.datamodel.VectorDataNode;
import org.esa.snap.rcp.SnapApp;
import org.esa.snap.rcp.windows.ToolTopComponent;
import org.esa.snap.ui.product.ProductSceneView;
import org.netbeans.api.annotations.common.NonNull;
import org.openide.util.HelpCtx;
import javax.swing.AbstractButton;
import javax.swing.event.ListSelectionListener;
import java.awt.BorderLayout;
import static org.esa.snap.rcp.SnapApp.SelectionSourceHint.*;
public abstract class MaskToolTopComponent extends ToolTopComponent implements HelpCtx.Provider {
private MaskForm maskForm;
public void initUI() {
setLayout(new BorderLayout());
maskForm = createMaskForm(this, e -> {
final ProductSceneView sceneView = getSelectedProductSceneView();
if (sceneView != null) {
Mask selectedMask = maskForm.getSelectedMask();
if (selectedMask != null) {
VectorDataNode vectorDataNode = Mask.VectorDataType.getVectorData(selectedMask);
if (vectorDataNode != null) {
sceneView.selectVectorDataLayer(vectorDataNode);
}
}
}
});
AbstractButton helpButton = maskForm.getHelpButton();
if (helpButton != null) {
helpButton.addActionListener(e -> getHelpCtx().display());
helpButton.setName("helpButton");
}
updateMaskForm(getSelectedProductSceneView());
SnapApp.getDefault().getProductManager().addListener(new MaskPTL());
SnapApp.getDefault().getSelectionSupport(Product.class).addHandler((oldValue, newValue) -> updateMaskForm(getSelectedProductSceneView()));
maskForm.updateState();
setDisplayName(getTitle());
add(maskForm.createContentPanel(), BorderLayout.CENTER);
}
private void updateMaskForm(ProductSceneView view) {
if (view == null) {
final ProductNode selectedProductNode = SnapApp.getDefault().getSelectedProductNode(EXPLORER);
if (selectedProductNode instanceof RasterDataNode) {
final RasterDataNode rdn = (RasterDataNode) selectedProductNode;
maskForm.reconfigureMaskTable(rdn.getProduct(), rdn);
} else if (selectedProductNode instanceof Product) {
final Product product = (Product) selectedProductNode;
maskForm.reconfigureMaskTable(product, null);
} else if (selectedProductNode != null && selectedProductNode.getProduct() != null) {
maskForm.reconfigureMaskTable(selectedProductNode.getProduct(), null);
} else {
maskForm.clearMaskTable();
}
} else {
maskForm.reconfigureMaskTable(view.getProduct(), view.getRaster());
}
}
private class MaskPTL implements ProductManager.Listener {
@Override
public void productAdded(ProductManager.Event event) {
//do nothing
}
@Override
public void productRemoved(ProductManager.Event event) {
if (maskForm.getProduct() == event.getProduct()) {
updateMaskForm(getSelectedProductSceneView());
}
}
}
@Override
protected void productSceneViewSelected(@NonNull ProductSceneView view) {
updateMaskForm(view);
}
@Override
protected void productSceneViewDeselected(@NonNull ProductSceneView view) {
updateMaskForm(getSelectedProductSceneView());
}
protected abstract MaskForm createMaskForm(ToolTopComponent topComponent, ListSelectionListener selectionListener);
protected abstract String getTitle();
}