/* * Tile.java * * Created on March 14, 2006, 4:53 PM * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package org.jdesktop.swingx.mapviewer; import java.awt.image.BufferedImage; import java.lang.ref.SoftReference; import org.jdesktop.beans.AbstractBean; /** * The Tile class represents a particular square image piece of the world bitmap at a particular zoom level. * @author joshy */ public class Tile extends AbstractBean { /** * The loading priority */ @SuppressWarnings("javadoc") public enum Priority { High, Low } private Priority priority = Priority.High; private TileFactory dtf; private boolean isLoading = false; // Most Recently Accessed Tiles. These are strong references, to prevent reloading // of most recently used tiles. // private static final Map<URI, BufferedImage> recentlyAccessed = new HashMap<URI, BufferedImage>(); // private static final TileCache cache = new TileCache(); /** * The url of the image to load for this tile */ private String url; /** * Indicates that loading has succeeded. A PropertyChangeEvent will be fired when the loading is completed */ private boolean loaded = false; /** * The zoom level this tile is for */ private int zoom, x, y; /** * The image loaded for this Tile */ SoftReference<BufferedImage> image = new SoftReference<BufferedImage>(null); /** * Create a new Tile at the specified tile point and zoom level * @param x the x value * @param y the y value * @param zoom the zoom level */ public Tile(int x, int y, int zoom) { loaded = false; this.zoom = zoom; this.x = x; this.y = y; } /** * Create a new Tile that loads its data from the given URL. The URL must resolve to an image * @param x the x value * @param y the y value * @param zoom the zoom level * @param url the URL * @param priority the priority * @param dtf the tile factory */ Tile(int x, int y, int zoom, String url, Priority priority, TileFactory dtf) { this.url = url; loaded = false; this.zoom = zoom; this.x = x; this.y = y; this.priority = priority; this.dtf = dtf; // startLoading(); } /** * Indicates if this tile's underlying image has been successfully loaded yet. * @return true if the Tile has been loaded */ public synchronized boolean isLoaded() { return loaded; } /** * Toggles the loaded state, and fires the appropriate property change notification * @param loaded the loaded flag */ synchronized void setLoaded(boolean loaded) { boolean old = isLoaded(); this.loaded = loaded; firePropertyChange("loaded", old, isLoaded()); } /** * @return the Image associated with this Tile. This is a read only property This may return null at any time, * however if this returns null, a load operation will automatically be started for it. */ public BufferedImage getImage() { BufferedImage img = image.get(); if (img == null) { setLoaded(false); // tile factory can be null if the tile has invalid coords or zoom if (dtf != null) { dtf.startLoading(this); } } return img; } /** * @return the location in the world at this zoom level that this tile should be placed */ /* * public TilePoint getLocation() { return location; } */ /** * @return the zoom level that this tile belongs in */ public int getZoom() { return zoom; } /** * @return the isLoading */ public boolean isLoading() { return isLoading; } /** * @param isLoading the isLoading to set */ public void setLoading(boolean isLoading) { this.isLoading = isLoading; } /** * Gets the loading priority of this tile. * @return the priority */ public Priority getPriority() { return priority; } /** * Set the loading priority of this tile. * @param priority the priority to set */ public void setPriority(Priority priority) { this.priority = priority; } /** * Gets the URL of this tile. * @return the url */ public String getURL() { return url; } /** * @return the x value */ public int getX() { return x; } /** * @return the y value */ public int getY() { return y; } }