package com.opendoorlogistics.core.gis.map.background; import java.awt.Dimension; import java.awt.geom.Point2D; import java.awt.image.BufferedImage; import java.util.HashSet; import com.opendoorlogistics.api.standardcomponents.map.MapTileProvider; import com.opendoorlogistics.codefromweb.jxmapviewer2.fork.swingx.mapviewer.GeoPosition; import com.opendoorlogistics.codefromweb.jxmapviewer2.fork.swingx.mapviewer.Tile; import com.opendoorlogistics.codefromweb.jxmapviewer2.fork.swingx.mapviewer.TileFactory; import com.opendoorlogistics.codefromweb.jxmapviewer2.fork.swingx.mapviewer.TileFactoryInfo; import com.opendoorlogistics.codefromweb.jxmapviewer2.fork.swingx.mapviewer.TileListener; public class TileFactory2ODL implements ODLTileFactory{ private final TileFactory tileFactory; private final boolean disposeFactory; private final FadeConfig fade; private final HashSet<MapTileLoadedListener> listeners = new HashSet<MapTileProvider.MapTileLoadedListener>(); private final TileListener baseListener = new TileListener() { @Override public void tileLoaded(Tile tile) { MapTile myTile = wrapTile(tile,fade); for(MapTileLoadedListener l : listeners){ l.tileLoaded(myTile); } } }; public TileFactory2ODL(TileFactory tileFactory, boolean disposeFactory, FadeConfig fade) { this.tileFactory = tileFactory; this.disposeFactory = disposeFactory; this.fade = fade; } @Override public void dispose() { if(disposeFactory && tileFactory!=null){ tileFactory.dispose(); } tileFactory.removeTileListener(baseListener); } @Override public MapTile getMapTile(int x, int y, int zoom) { Tile tile = tileFactory.getTile(x, y, zoom); if(tile!=null){ return wrapTile(tile,fade); } return null; } public static MapTile wrapTile(Tile tile, FadeConfig fade) { return new MapTile() { @Override public boolean isLoaded() { return tile.isLoaded(); } @Override public int getZoom() { return tile.getZoom(); } @Override public int getY() { return tile.getY(); } @Override public int getX() { return tile.getX(); } @Override public BufferedImage getImage() { BufferedImage ret = tile.getImage(); if(ret!=null && fade!=null){ ret = BackgroundMapUtils.fadeWithGreyscale(ret, fade); } return ret; } }; } @Override public synchronized void addLoadedListener(MapTileLoadedListener listener) { // make sure I'm listening ... but not more than once (as underlying collection is a list not set) tileFactory.removeTileListener(baseListener); tileFactory.addTileListener(baseListener); // now add to my own listeners listeners.add(listener); } @Override public synchronized void removeLoadedListener(MapTileLoadedListener listener) { listeners.remove(listener); // stop listening to the base tile factory if i've got no listeners left if(listeners.size()==0){ tileFactory.removeTileListener(baseListener); } } @Override public int getTileSize(int zoom) { return tileFactory.getTileSize(zoom); } @Override public Dimension getMapSize(int zoom) { return tileFactory.getMapSize(zoom); } @Override public GeoPosition pixelToGeo(Point2D pixelCoordinate, int zoom) { return tileFactory.pixelToGeo(pixelCoordinate, zoom); } @Override public Point2D geoToPixel(GeoPosition c, int zoomLevel) { return tileFactory.geoToPixel(c, zoomLevel); } @Override public TileFactoryInfo getInfo() { return tileFactory.getInfo(); } @Override public boolean isRenderedOffline() { return tileFactory.isRenderedOffline(); } @Override public BufferedImage renderSynchronously(int x, int y, int zoom){ return tileFactory.renderSynchronously(x, y, zoom); } }