001    package org.openstreetmap.gui.jmapviewer;
002    
003    import org.openstreetmap.gui.jmapviewer.JobDispatcher.JobThread;
004    import org.openstreetmap.gui.jmapviewer.interfaces.TileCache;
005    import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
006    import org.openstreetmap.gui.jmapviewer.interfaces.TileLoaderListener;
007    import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
008    import org.openstreetmap.gui.jmapviewer.tilesources.OsmTileSource;
009    
010    public class TileController {
011        protected TileLoader tileLoader;
012        protected TileCache tileCache;
013        protected TileSource tileSource;
014    
015        JobDispatcher jobDispatcher;
016    
017        public TileController(TileSource source, TileCache tileCache, TileLoaderListener listener) {
018            tileSource = new OsmTileSource.Mapnik();
019            tileLoader = new OsmTileLoader(listener);
020            this.tileCache = tileCache;
021            jobDispatcher = JobDispatcher.getInstance();
022        }
023    
024        /**
025         * retrieves a tile from the cache. If the tile is not present in the cache
026         * a load job is added to the working queue of {@link JobThread}.
027         *
028         * @param tilex the X position of the tile
029         * @param tiley the Y position of the tile
030         * @param zoom the zoom level of the tile
031         * @return specified tile from the cache or <code>null</code> if the tile
032         *         was not found in the cache.
033         */
034        public Tile getTile(int tilex, int tiley, int zoom) {
035            int max = (1 << zoom);
036            if (tilex < 0 || tilex >= max || tiley < 0 || tiley >= max)
037                return null;
038            Tile tile = tileCache.getTile(tileSource, tilex, tiley, zoom);
039            if (tile == null) {
040                tile = new Tile(tileSource, tilex, tiley, zoom);
041                tileCache.addTile(tile);
042                tile.loadPlaceholderFromCache(tileCache);
043            }
044            if (!tile.isLoaded()) {
045                jobDispatcher.addJob(tileLoader.createTileLoaderJob(tile));
046            }
047            return tile;
048        }
049    
050        public TileCache getTileCache() {
051            return tileCache;
052        }
053    
054        public void setTileCache(TileCache tileCache) {
055            this.tileCache = tileCache;
056        }
057    
058        public TileLoader getTileLoader() {
059            return tileLoader;
060        }
061    
062        public void setTileLoader(TileLoader tileLoader) {
063            this.tileLoader = tileLoader;
064        }
065    
066        public TileSource getTileLayerSource() {
067            return tileSource;
068        }
069    
070        public TileSource getTileSource() {
071            return tileSource;
072        }
073    
074        public void setTileSource(TileSource tileSource) {
075            this.tileSource = tileSource;
076        }
077    
078        /**
079         *
080         */
081        public void cancelOutstandingJobs() {
082            jobDispatcher.cancelOutstandingJobs();
083        }
084    }