// License: GPL. For details, see Readme.txt file.
package org.openstreetmap.gui.jmapviewer;
import org.openstreetmap.gui.jmapviewer.interfaces.TileCache;
import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
import org.openstreetmap.gui.jmapviewer.interfaces.TileLoaderListener;
import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
public class TileController {
protected TileLoader tileLoader;
protected TileCache tileCache;
protected TileSource tileSource;
public TileController(TileSource source, TileCache tileCache, TileLoaderListener listener) {
this.tileSource = source;
this.tileLoader = new OsmTileLoader(listener);
this.tileCache = tileCache;
}
/**
* retrieves a tile from the cache. If the tile is not present in the cache
* a load job is added to the working queue of {@link TileLoader}.
*
* @param tilex the X position of the tile
* @param tiley the Y position of the tile
* @param zoom the zoom level of the tile
* @return specified tile from the cache or <code>null</code> if the tile
* was not found in the cache.
*/
public Tile getTile(int tilex, int tiley, int zoom) {
int max = 1 << zoom;
if (tilex < 0 || tilex >= max || tiley < 0 || tiley >= max)
return null;
Tile tile = tileCache.getTile(tileSource, tilex, tiley, zoom);
if (tile == null) {
tile = new Tile(tileSource, tilex, tiley, zoom);
tileCache.addTile(tile);
tile.loadPlaceholderFromCache(tileCache);
}
if (tile.error) {
tile.loadPlaceholderFromCache(tileCache);
}
if (!tile.isLoaded()) {
tileLoader.createTileLoaderJob(tile).submit();
}
return tile;
}
public TileCache getTileCache() {
return tileCache;
}
public void setTileCache(TileCache tileCache) {
this.tileCache = tileCache;
}
public TileLoader getTileLoader() {
return tileLoader;
}
public void setTileLoader(TileLoader tileLoader) {
this.tileLoader = tileLoader;
}
public TileSource getTileLayerSource() {
return tileSource;
}
public TileSource getTileSource() {
return tileSource;
}
public void setTileSource(TileSource tileSource) {
this.tileSource = tileSource;
}
/**
* Removes all jobs from the queue that are currently not being processed.
*
*/
public void cancelOutstandingJobs() {
tileLoader.cancelOutstandingTasks();
}
}