/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2014, Geomatys
*
* 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.geotoolkit.display2d.ext.pie;
import java.awt.*;
import java.awt.Font;
import java.awt.geom.Rectangle2D;
import java.util.List;
import org.geotoolkit.display2d.canvas.RenderingContext2D;
import org.geotoolkit.display2d.style.renderer.AbstractSymbolizerRendererService;
import org.geotoolkit.display2d.style.renderer.SymbolizerRenderer;
import org.geotoolkit.map.MapLayer;
/**
* Pie symbolizer service.
*
* @author Johann Sorel (Geomays)
* @author Cédric Briançon (Geomatys)
*/
public class PieSymbolizerRendererService extends AbstractSymbolizerRendererService<PieSymbolizer, CachedPieSymbolizer> {
@Override
public boolean isGroupSymbolizer() {
return true;
}
@Override
public Class<PieSymbolizer> getSymbolizerClass() {
return PieSymbolizer.class;
}
@Override
public Class<CachedPieSymbolizer> getCachedSymbolizerClass() {
return CachedPieSymbolizer.class;
}
@Override
public CachedPieSymbolizer createCachedSymbolizer(PieSymbolizer symbol) {
return new CachedPieSymbolizer(symbol, this);
}
@Override
public SymbolizerRenderer createRenderer(CachedPieSymbolizer symbol, RenderingContext2D context) {
return new PieSymbolizerRenderer(this,symbol, context);
}
@Override
public Rectangle2D glyphPreferredSize(CachedPieSymbolizer symbolizer, MapLayer layer) {
final List<PieSymbolizer.ColorQuarter> colorQuarters = symbolizer.getSource().getColorQuarters();
final int height = (colorQuarters.size() + 1) * 20;
return new Rectangle2D.Double(0, 0, 150, height);
}
@Override
public void glyph(Graphics2D g, Rectangle2D rectangle, CachedPieSymbolizer symbolizer, MapLayer layer) {
//defensive copy
if(symbolizer==null) return;
g.setClip(rectangle);
final List<PieSymbolizer.ColorQuarter> colorQuarters = symbolizer.getSource().getColorQuarters();
final Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
final Font font = new Font("Monospaced", Font.BOLD, 10);
g2d.setFont(font);
final FontMetrics fm = g2d.getFontMetrics(font);
final int fabove = fm.getAscent();
if(colorQuarters.isEmpty()) return;
int line = 1;
for (final PieSymbolizer.ColorQuarter colorQuarter : colorQuarters) {
g.setStroke(new BasicStroke(1));
g.setPaint(Color.BLACK);
final Rectangle2D rect = new Rectangle2D.Double(5, line * (fabove + 5), 30, fabove);
g.draw(rect);
g.setPaint(colorQuarter.getColor().evaluate(null, Color.class));
g.fill(rect);
g.setPaint(Color.BLACK);
g.drawString(colorQuarter.getQuarter().evaluate(null, String.class), 45, line * (fabove + 5) + fabove);
line++;
}
g.setStroke(new BasicStroke(1));
g.setPaint(Color.BLACK);
final Rectangle2D rect = new Rectangle2D.Double(5, line * (fabove + 5), 30, fabove);
g.draw(rect);
g.setPaint(Color.GRAY);
g.fill(rect);
g.setPaint(Color.BLACK);
g.drawString("Others", 45, line * (fabove + 5) + fabove);
}
}