/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2011, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package org.geotools.swing;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.geotools.map.Layer;
import org.geotools.map.MapContent;
import org.geotools.renderer.GTRenderer;
import org.geotools.renderer.lite.StreamingRenderer;
import org.geotools.renderer.lite.SynchronizedLabelCache;
/**
* This class is not usable yet !
*
* @source $URL$
*/
public class JLayeredMapPane extends AbstractMapPane {
private static class LayerOperands {
BufferedImage image;
Graphics2D graphics;
GTRenderer renderer;
}
private final Map<Layer, LayerOperands> operandLookup;
private final Map<Object, Object> renderingHints;
public JLayeredMapPane() {
this(null);
}
public JLayeredMapPane(MapContent content) {
this(content, null);
}
public JLayeredMapPane(MapContent content, RenderingExecutor executor) {
super(content, executor);
operandLookup = new HashMap<Layer, LayerOperands>();
labelCache = new SynchronizedLabelCache();
renderingHints = new HashMap<Object, Object>();
renderingHints.put(StreamingRenderer.LABEL_CACHE_KEY, labelCache);
}
@Override
protected void drawLayers(boolean recreate) {
drawingLock.lock();
try {
if (mapContent != null
&& !mapContent.layers().isEmpty()
&& !mapContent.getViewport().isEmpty()
&& acceptRepaintRequests.get()) {
getRenderingExecutor().submit(mapContent, getOperands(recreate), this);
}
} finally {
drawingLock.unlock();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (drawingLock.tryLock()) {
try {
if (mapContent != null) {
Graphics2D g2 = (Graphics2D) g;
for (Layer layer : mapContent.layers()) {
LayerOperands op = operandLookup.get(layer);
if (op != null) {
g2.drawImage(op.image, imageOrigin.x, imageOrigin.y, null);
}
}
}
} finally {
drawingLock.unlock();
}
}
}
private List<RenderingOperands> getOperands(boolean recreate) {
List<RenderingOperands> ops = new ArrayList<RenderingOperands>();
Rectangle r = getVisibleRect();
for (Layer layer : mapContent.layers()) {
ops.add(getRenderingOperands(layer, r, recreate));
}
return ops;
}
private RenderingOperands getRenderingOperands(Layer layer, Rectangle r, boolean recreate) {
LayerOperands op = operandLookup.get(layer);
if (op == null) {
op = new LayerOperands();
operandLookup.put(layer, op);
}
if (op.image == null || recreate) {
op.image = GraphicsEnvironment.getLocalGraphicsEnvironment().
getDefaultScreenDevice().getDefaultConfiguration().
createCompatibleImage(r.width, r.height, Transparency.TRANSLUCENT);
if (op.graphics != null) {
op.graphics.dispose();
}
op.graphics = op.image.createGraphics();
// op.graphics.setBackground(getBackground());
} else {
// op.graphics.setBackground(getBackground());
// op.graphics.clearRect(0, 0, r.width, r.height);
}
if (op.renderer == null) {
op.renderer = new StreamingRenderer();
op.renderer.setRendererHints(renderingHints);
}
return new RenderingOperands(layer, op.graphics, op.renderer);
}
}