/******************************************************************************* * 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.gui.mapview.layer; import java.awt.Graphics2D; import java.awt.Point; import java.awt.image.BufferedImage; import java.util.Iterator; import javax.swing.JOptionPane; import mobac.gui.MainGUI; import mobac.gui.dialogs.WorkinprogressDialog; import mobac.gui.mapview.JMapViewer; import mobac.gui.mapview.PreviewMap; import mobac.gui.mapview.interfaces.MapLayer; import mobac.program.interfaces.MapSource; import mobac.program.interfaces.MapSpace; import mobac.program.tilestore.TileStore; import mobac.program.tilestore.berkeleydb.DelayedInterruptThread; import mobac.utilities.GUIExceptionHandler; import mobac.utilities.I18nUtils; public class TileStoreCoverageLayer implements MapLayer { private final MapSource mapSource; private final int zoom; private final Point pixelCoordinateMin; private final Point pixelCoordinateMax; private final Point tileNumMin; private final Point tileNumMax; private BufferedImage coverageImage = null; public static void removeCacheCoverageLayers() { try { PreviewMap previewMap = MainGUI.getMainGUI().previewMap; Iterator<MapLayer> mapLayers = previewMap.mapLayers.iterator(); MapLayer ml; while (mapLayers.hasNext()) { ml = mapLayers.next(); if (ml instanceof TileStoreCoverageLayer) { mapLayers.remove(); } } } catch (Exception e) { } } public TileStoreCoverageLayer(PreviewMap mapViewer, MapSource mapSource, int zoom) { this.mapSource = mapSource; this.zoom = zoom; MapSpace mapSpace = mapSource.getMapSpace(); int tileSize = mapSpace.getTileSize(); int mapViewerZoom = mapViewer.getZoom(); Point min = mapViewer.getTopLeftCoordinate(); Point max = new Point(min.x + mapViewer.getWidth(), min.y + mapViewer.getHeight()); min = mapSpace.changeZoom(min, mapViewerZoom, zoom); max = mapSpace.changeZoom(max, mapViewerZoom, zoom); tileNumMax = new Point(max.x / tileSize, max.y / tileSize); tileNumMin = new Point(min.x / tileSize, min.y / tileSize); pixelCoordinateMax = new Point(tileNumMax.x * tileSize + tileSize - 1, tileNumMax.y * tileSize + tileSize - 1); pixelCoordinateMin = new Point(tileNumMin.x * tileSize, tileNumMin.y * tileSize); updateCoverageImage(); } private void updateCoverageImage() { coverageImage = null; Runnable r = new Runnable() { public void run() { try { coverageImage = TileStore.getInstance().getCacheCoverage(mapSource, zoom, tileNumMin, tileNumMax); if (coverageImage == null) JOptionPane.showMessageDialog(MainGUI.getMainGUI(), I18nUtils.localizedStringForKey("msg_tile_store_failed_retrieve_coverage"), I18nUtils.localizedStringForKey("Error"), JOptionPane.ERROR_MESSAGE); } catch (InterruptedException e) { } catch (Exception e) { GUIExceptionHandler.processException(e); } if (coverageImage == null) removeCacheCoverageLayers(); MainGUI.getMainGUI().previewMap.repaint(); } }; WorkinprogressDialog dialog = new WorkinprogressDialog(MainGUI.getMainGUI(), "Loading coverage data", DelayedInterruptThread.createThreadFactory()); dialog.startWork(r); } public void paint(JMapViewer mapViewer, Graphics2D g, int zoom, int minX, int minY, int maxX, int maxY) { if (coverageImage == null) return; paintCoverage(g, zoom, minX, minY, maxX, maxY); } protected void paintCoverage(Graphics2D g, int zoom, int minX, int minY, int maxX, int maxY) { Point max = pixelCoordinateMax; Point min = pixelCoordinateMin; MapSpace mapSpace = mapSource.getMapSpace(); int mapX = mapSpace.xChangeZoom(min.x, this.zoom, zoom); int mapY = mapSpace.yChangeZoom(min.y, this.zoom, zoom); int mapW = mapSpace.xChangeZoom(max.x - min.x + 1, this.zoom, zoom); int mapH = mapSpace.yChangeZoom(max.y - min.y + 1, this.zoom, zoom); int x = mapX - minX; int y = mapY - minY; int w = mapW; int h = mapH; g.drawImage(coverageImage, x, y, w, h, null); } }