/*
* Copyright (C) 2014 by Array Systems Computing Inc. http://www.array.ca
*
* 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.graphbuilder.gpf.ui.worldmap;
import com.bc.ceres.binding.PropertyContainer;
import com.bc.ceres.glayer.Layer;
import com.bc.ceres.glayer.LayerContext;
import com.bc.ceres.glayer.LayerType;
import com.bc.ceres.glayer.LayerTypeRegistry;
import org.esa.snap.core.datamodel.GeoPos;
import org.esa.snap.core.datamodel.Product;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class NestWorldMapPaneDataModel {
public static final String PROPERTY_LAYER = "layer";
public static final String PROPERTY_SELECTED_PRODUCT = "selectedProduct";
public static final String PROPERTY_PRODUCTS = "products";
public static final String PROPERTY_ADDITIONAL_GEO_BOUNDARIES = "additionalGeoBoundaries";
public static final String PROPERTY_SELECTED_GEO_BOUNDARIES = "selectedGeoBoundaries";
public static final String PROPERTY_AUTO_ZOOM_ENABLED = "autoZoomEnabled";
private PropertyChangeSupport changeSupport;
private static final LayerType layerType = LayerTypeRegistry.getLayerType("org.esa.snap.worldmap.BlueMarbleLayerType");
private Layer worldMapLayer;
private Product selectedProduct;
private boolean autoZoomEnabled;
private final List<Product> productList = new ArrayList<>();
private final List<GeoPos[]> additionalGeoBoundaryList = new ArrayList<>();
private final List<GeoPos[]> selectedGeoBoundaryList = new ArrayList<>();
private final GeoPos selectionBoxStart = new GeoPos();
private final GeoPos selectionBoxEnd = new GeoPos();
public NestWorldMapPaneDataModel() {
autoZoomEnabled = false;
}
public Layer getWorldMapLayer(LayerContext context) {
if (worldMapLayer == null) {
worldMapLayer = layerType.createLayer(context, new PropertyContainer());
}
return worldMapLayer;
}
public Product getSelectedProduct() {
return selectedProduct;
}
public void setSelectedProduct(Product product) {
Product oldSelectedProduct = selectedProduct;
if (oldSelectedProduct != product) {
selectedProduct = product;
firePropertyChange(PROPERTY_SELECTED_PRODUCT, oldSelectedProduct, selectedProduct);
}
}
public void setSelectionBoxStart(final double lat, final double lon) {
selectionBoxStart.setLocation(lat, lon);
}
public void setSelectionBoxEnd(final double lat, final double lon) {
selectionBoxEnd.setLocation(lat, lon);
}
public GeoPos[] getSelectionBox() {
final GeoPos[] selectionBox = new GeoPos[4];
selectionBox[0] = selectionBoxStart;
selectionBox[1] = new GeoPos(selectionBoxStart.getLat(), selectionBoxEnd.getLon());
selectionBox[2] = selectionBoxEnd;
selectionBox[3] = new GeoPos(selectionBoxEnd.getLat(), selectionBoxStart.getLon());
return selectionBox;
}
public Product[] getProducts() {
return productList.toArray(new Product[productList.size()]);
}
public void setProducts(Product[] products) {
final Product[] oldProducts = getProducts();
productList.clear();
if (products != null) {
productList.addAll(Arrays.asList(products));
}
firePropertyChange(PROPERTY_PRODUCTS, oldProducts, getProducts());
}
public GeoPos[][] getAdditionalGeoBoundaries() {
return additionalGeoBoundaryList.toArray(new GeoPos[additionalGeoBoundaryList.size()][]);
}
public void setAdditionalGeoBoundaries(GeoPos[][] geoBoundarys) {
final GeoPos[][] oldGeoBoundarys = getAdditionalGeoBoundaries();
additionalGeoBoundaryList.clear();
if (geoBoundarys != null) {
additionalGeoBoundaryList.addAll(Arrays.asList(geoBoundarys));
}
firePropertyChange(PROPERTY_ADDITIONAL_GEO_BOUNDARIES, oldGeoBoundarys, additionalGeoBoundaryList);
}
public GeoPos[][] getSelectedGeoBoundaries() {
return selectedGeoBoundaryList.toArray(new GeoPos[selectedGeoBoundaryList.size()][]);
}
public void setSelectedGeoBoundaries(GeoPos[][] geoBoundarys) {
final GeoPos[][] oldGeoBoundarys = getSelectedGeoBoundaries();
selectedGeoBoundaryList.clear();
if (geoBoundarys != null) {
selectedGeoBoundaryList.addAll(Arrays.asList(geoBoundarys));
}
firePropertyChange(PROPERTY_SELECTED_GEO_BOUNDARIES, oldGeoBoundarys, selectedGeoBoundaryList);
}
public void addModelChangeListener(PropertyChangeListener listener) {
if (changeSupport == null) {
changeSupport = new PropertyChangeSupport(this);
}
changeSupport.addPropertyChangeListener(listener);
}
public void removeModelChangeListener(PropertyChangeListener listener) {
if (changeSupport != null) {
changeSupport.removePropertyChangeListener(listener);
}
}
public void addProduct(Product product) {
if (!productList.contains(product)) {
final Product[] oldProducts = getProducts();
if (productList.add(product)) {
firePropertyChange(PROPERTY_PRODUCTS, oldProducts, getProducts());
}
}
}
public void removeProduct(Product product) {
if (productList.contains(product)) {
final Product[] oldProducts = getProducts();
if (productList.remove(product)) {
firePropertyChange(PROPERTY_PRODUCTS, oldProducts, getProducts());
}
}
}
public boolean isAutoZommEnabled() {
return autoZoomEnabled;
}
public void setAutoZoomEnabled(boolean autoZoomEnabled) {
final boolean oldAutoZommEnabled = isAutoZommEnabled();
if (oldAutoZommEnabled != autoZoomEnabled) {
this.autoZoomEnabled = autoZoomEnabled;
firePropertyChange(PROPERTY_AUTO_ZOOM_ENABLED, oldAutoZommEnabled, autoZoomEnabled);
}
}
private void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
if (changeSupport != null) {
changeSupport.firePropertyChange(propertyName, oldValue, newValue);
}
}
}