/* * 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.ui; 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; public class WorldMapPaneDataModel { 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_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 ArrayList<Product> productList; private ArrayList<GeoPos[]> additionalGeoBoundaryList; public WorldMapPaneDataModel() { productList = new ArrayList<Product>(); additionalGeoBoundaryList = new ArrayList<GeoPos[]>(); 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 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 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 isAutoZoomEnabled() { return autoZoomEnabled; } public void setAutoZoomEnabled(boolean autoZoomEnabled) { final boolean oldAutoZommEnabled = isAutoZoomEnabled(); 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); } } }