mobac.program.model.Atlas.java Source code

Java tutorial

Introduction

Here is the source code for mobac.program.model.Atlas.java

Source

/*******************************************************************************
 * Copyright (c) MOBAC developers
 * 
 * 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 2 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 mobac.program.model;

import java.io.StringWriter;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.swing.tree.TreeNode;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;

import mobac.program.interfaces.AtlasInterface;
import mobac.program.interfaces.LayerInterface;
import mobac.program.interfaces.ToolTipProvider;
import mobac.utilities.I18nUtils;
import mobac.utilities.Utilities;

import org.apache.commons.lang3.StringEscapeUtils;

@XmlRootElement
public class Atlas implements AtlasInterface, ToolTipProvider, TreeNode {

    public static final int CURRENT_ATLAS_VERSION = 1;

    @XmlAttribute
    private int version = 0;

    private String name = I18nUtils.localizedStringForKey("Unnamed");

    @XmlElements({ @XmlElement(name = "Layer", type = Layer.class) })
    private List<LayerInterface> layers = new LinkedList<LayerInterface>();

    private AtlasOutputFormat outputFormat = AtlasOutputFormat.FORMATS.get(0);

    public static Atlas newInstance() {
        Atlas atlas = new Atlas();
        atlas.version = CURRENT_ATLAS_VERSION;
        return atlas;
    }

    private Atlas() {
        super();
    }

    public void addLayer(LayerInterface l) {
        layers.add(l);
    }

    public void deleteLayer(LayerInterface l) {
        layers.remove(l);
    }

    public LayerInterface getLayer(int index) {
        return layers.get(index);
    }

    public int getLayerCount() {
        return layers.size();
    }

    @XmlAttribute
    public String getName() {
        return name;
    }

    public void setName(String newName) {
        this.name = newName;
    }

    @XmlAttribute
    public AtlasOutputFormat getOutputFormat() {
        return outputFormat;
    }

    public void setOutputFormat(AtlasOutputFormat atlasOutputFormat) {
        if (atlasOutputFormat == null)
            throw new NullPointerException();
        this.outputFormat = atlasOutputFormat;
    }

    @Override
    public String toString() {
        return getName() + " (" + outputFormat + ")";
    }

    public Iterator<LayerInterface> iterator() {
        return layers.iterator();
    }

    public long calculateTilesToDownload() {
        long tiles = 0;
        for (LayerInterface layer : layers)
            tiles += layer.calculateTilesToDownload();
        return tiles;
    }

    public boolean checkData() {
        if (name == null) // name set?
            return true;
        // Check for duplicate layer names
        HashSet<String> names = new HashSet<String>(layers.size());
        for (LayerInterface layer : layers)
            names.add(layer.getName());
        if (names.size() < layers.size())
            return true; // at least one duplicate name found
        return false;
    }

    public double getMinLat() {
        double lat = 90d;
        for (LayerInterface l : layers) {
            lat = Math.min(lat, l.getMinLat());
        }
        return lat;
    }

    public double getMaxLat() {
        double lat = -90d;
        for (LayerInterface l : layers) {
            lat = Math.max(lat, l.getMaxLat());
        }
        return lat;
    }

    public double getMinLon() {
        double lon = 180d;
        for (LayerInterface l : layers) {
            lon = Math.min(lon, l.getMinLon());
        }
        return lon;
    }

    public double getMaxLon() {
        double lon = -180d;
        for (LayerInterface l : layers) {
            lon = Math.max(lon, l.getMaxLon());
        }
        return lon;
    }

    public String getToolTip() {
        StringWriter sw = new StringWriter(1024);
        sw.write("<html>");
        sw.write(I18nUtils.localizedStringForKey("lp_atlas_info_atlas_title"));
        sw.write(I18nUtils.localizedStringForKey("lp_atlas_info_atlas_name", StringEscapeUtils.escapeHtml4(name)));
        sw.write(I18nUtils.localizedStringForKey("lp_atlas_info_atlas_layer", layers.size()));
        sw.write(I18nUtils.localizedStringForKey("lp_atlas_info_atlas_format", outputFormat.toString()));
        sw.write(I18nUtils.localizedStringForKey("lp_atlas_info_max_tile", calculateTilesToDownload()));
        sw.write(I18nUtils.localizedStringForKey("lp_atlas_info_area_start",
                Utilities.prettyPrintLatLon(getMaxLat(), true), Utilities.prettyPrintLatLon(getMinLon(), false)));
        sw.write(I18nUtils.localizedStringForKey("lp_atlas_info_area_end",
                Utilities.prettyPrintLatLon(getMinLat(), true), Utilities.prettyPrintLatLon(getMaxLon(), false)));
        sw.write("</html>");
        return sw.toString();
    }

    public Enumeration<?> children() {
        return Collections.enumeration(layers);
    }

    public boolean getAllowsChildren() {
        return true;
    }

    public TreeNode getChildAt(int childIndex) {
        return (TreeNode) layers.get(childIndex);
    }

    public int getChildCount() {
        return layers.size();
    }

    public int getIndex(TreeNode node) {
        return layers.indexOf(node);
    }

    public TreeNode getParent() {
        return null;
    }

    public boolean isLeaf() {
        return false;
    }

    public int getVersion() {
        return version;
    }

    public AtlasInterface deepClone() {
        Atlas atlas = new Atlas();
        atlas.version = version;
        atlas.name = name;
        atlas.outputFormat = outputFormat;
        for (LayerInterface layer : layers) {
            atlas.layers.add(layer.deepClone(atlas));
        }
        return atlas;
    }

}