/******************************************************************************* * 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; } }