/* * Copyright (C) 2012 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.statistics; import org.esa.snap.core.datamodel.Mask; import org.esa.snap.core.datamodel.Product; import org.esa.snap.core.datamodel.ProductNodeGroup; import org.esa.snap.core.datamodel.RasterDataNode; import org.esa.snap.core.util.ProductUtils; import org.jfree.chart.ChartPanel; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenuItem; import java.awt.Color; import java.awt.Shape; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * @author Norman Fomferra */ public abstract class MaskSelectionToolSupport implements PlotAreaSelectionTool.Action { private final PagePanel pagePanel; private final ChartPanel chartPanel; private final String maskName; private final String maskDescription; private final Color maskColor; private final PlotAreaSelectionTool.AreaType areaType; private PlotAreaSelectionTool plotAreaSelectionTool; protected MaskSelectionToolSupport(PagePanel pagePanel, ChartPanel chartPanel, String maskName, String maskDescription, Color maskColor, PlotAreaSelectionTool.AreaType areaType) { this.pagePanel = pagePanel; this.chartPanel = chartPanel; this.maskName = maskName; this.maskDescription = maskDescription; this.maskColor = maskColor; this.areaType = areaType; } public JCheckBoxMenuItem createMaskSelectionModeMenuItem() { final JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(String.format("Select Mask '%s'", maskName)); menuItem.setName("maskSelectionMode"); menuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (menuItem.isSelected()) { if (plotAreaSelectionTool == null) { plotAreaSelectionTool = new PlotAreaSelectionTool(chartPanel, MaskSelectionToolSupport.this); plotAreaSelectionTool.setAreaType(areaType); plotAreaSelectionTool.setFillPaint(createAlphaColor(maskColor, 50)); } plotAreaSelectionTool.install(); } else { if (plotAreaSelectionTool != null) { plotAreaSelectionTool.uninstall(); } } } }); return menuItem; } public JMenuItem createDeleteMaskMenuItem() { final JMenuItem menuItem = new JMenuItem(String.format("Delete Mask '%s' ", maskName)); menuItem.setName("deleteMask"); menuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (plotAreaSelectionTool != null) { plotAreaSelectionTool.removeAnnotation(); } Product product = pagePanel.getProduct(); if (product != null) { Mask mask = product.getMaskGroup().get(maskName); if (mask != null) { product.getMaskGroup().remove(mask); } } } }); return menuItem; } @Override public void areaSelected(PlotAreaSelectionTool.AreaType areaType, Shape shape) { Product product = pagePanel.getProduct(); final RasterDataNode raster = pagePanel.getRaster(); if (product == null || raster == null) { return; } String expression = createMaskExpression(areaType, shape); Mask mask = product.getMaskGroup().get(maskName); if (mask != null) { if (!mask.getRasterSize().equals(raster.getRasterSize())) { // if sizes are different we need to remove the mask first and add it as new one product.getMaskGroup().remove(mask); mask = addMask(product, raster, expression); } else { mask.getImageConfig().setValue("expression", expression); } } else { mask = addMask(product, raster, expression); } ProductNodeGroup<Mask> overlayMaskGroup = raster.getOverlayMaskGroup(); if (!overlayMaskGroup.contains(mask)) { overlayMaskGroup.add(mask); } } private Mask addMask(Product product, RasterDataNode raster, String expression) { Mask mask = Mask.BandMathsType.create(maskName, maskDescription, raster.getRasterWidth(), raster.getRasterHeight(), expression, maskColor, 0.5); product.addMask(mask); ProductUtils.copyImageGeometry(raster, mask, false); return mask; } protected abstract String createMaskExpression(PlotAreaSelectionTool.AreaType areaType, Shape shape); private static Color createAlphaColor(Color color, int alpha) { return new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); } }