/* * 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.actions.interactors; import com.bc.ceres.glayer.Layer; import com.bc.ceres.glayer.LayerFilter; import com.bc.ceres.glayer.support.LayerUtils; import com.bc.ceres.swing.figure.AbstractInteractorInterceptor; import com.bc.ceres.swing.figure.Interactor; import org.esa.snap.core.datamodel.VectorDataNode; import org.esa.snap.rcp.actions.vector.CreateVectorDataNodeAction; import org.esa.snap.ui.ModalDialog; import org.esa.snap.ui.product.ProductSceneView; import org.esa.snap.ui.product.VectorDataLayer; import org.esa.snap.ui.product.VectorDataLayerFilterFactory; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.InputEvent; import java.util.List; public class InsertFigureInteractorInterceptor extends AbstractInteractorInterceptor { @Override public boolean interactionAboutToStart(Interactor interactor, InputEvent inputEvent) { final ProductSceneView productSceneView = getProductSceneView(inputEvent); return getActiveVectorDataLayer(productSceneView) != null; } public static VectorDataLayer getActiveVectorDataLayer(ProductSceneView productSceneView) { if (productSceneView == null) { return null; } final LayerFilter geometryFilter = VectorDataLayerFilterFactory.createGeometryFilter(); Layer layer = productSceneView.getSelectedLayer(); if (geometryFilter.accept(layer)) { layer.setVisible(true); return (VectorDataLayer) layer; } List<Layer> layers = LayerUtils.getChildLayers(productSceneView.getRootLayer(), LayerUtils.SEARCH_DEEP, geometryFilter); VectorDataLayer vectorDataLayer; if (layers.isEmpty()) { VectorDataNode vectorDataNode = CreateVectorDataNodeAction.createDefaultVectorDataNode(productSceneView.getProduct()); LayerFilter nodeFilter = VectorDataLayerFilterFactory.createNodeFilter(vectorDataNode); productSceneView.getVectorDataCollectionLayer(true); vectorDataLayer = (VectorDataLayer) LayerUtils.getChildLayer(productSceneView.getRootLayer(), LayerUtils.SEARCH_DEEP, nodeFilter); } else if (layers.size() == 1) { vectorDataLayer = (VectorDataLayer) layers.get(0); } else { vectorDataLayer = showSelectLayerDialog(productSceneView, layers); } if (vectorDataLayer == null) { // = Cancel return null; } productSceneView.setSelectedLayer(vectorDataLayer); if (productSceneView.getSelectedLayer() == vectorDataLayer) { vectorDataLayer.setVisible(true); return vectorDataLayer; } return null; } static private VectorDataLayer showSelectLayerDialog(ProductSceneView productSceneView, List<Layer> layers) { String[] layerNames = new String[layers.size()]; for (int i = 0; i < layerNames.length; i++) { layerNames[i] = layers.get(i).getName(); } JList<String> listBox = new JList<>(layerNames); JPanel panel = new JPanel(new BorderLayout(4, 4)); panel.add(new JLabel("Please select a vector data container:"), BorderLayout.NORTH); panel.add(new JScrollPane(listBox), BorderLayout.CENTER); ModalDialog dialog = new ModalDialog(SwingUtilities.getWindowAncestor(productSceneView), "Select Vector Data Container", ModalDialog.ID_OK_CANCEL_HELP, ""); dialog.setContent(panel); int i = dialog.show(); if (i == ModalDialog.ID_OK) { final int index = listBox.getSelectedIndex(); if (index >= 0) { return (VectorDataLayer) layers.get(index); } } return null; } private ProductSceneView getProductSceneView(InputEvent event) { ProductSceneView productSceneView = null; Component component = event.getComponent(); while (component != null) { if (component instanceof ProductSceneView) { productSceneView = (ProductSceneView) component; break; } component = component.getParent(); } return productSceneView; } }