Mercurial > dive4elements > gnv-client
diff gnv-artifacts/src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java @ 540:80630520e25a
merged gnv-artifacts/0.4
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:13:49 +0200 |
parents | 92d7a8cd1ef1 |
children | 79401c871da4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java Fri Sep 28 12:13:49 2012 +0200 @@ -0,0 +1,223 @@ +package de.intevation.gnv.chart; + +import de.intevation.gnv.jfreechart.PolygonDataset; +import de.intevation.gnv.jfreechart.PolygonPlot; +import de.intevation.gnv.jfreechart.PolygonRenderer; +import de.intevation.gnv.jfreechart.PolygonSeries; + +import de.intevation.gnv.math.AttributedXYColumns; + +import de.intevation.gnv.raster.Palette; + +import java.awt.Color; +import java.awt.Paint; + +import java.text.NumberFormat; + +import java.util.HashSet; +import java.util.Locale; +import java.util.Map; + +import org.jfree.chart.JFreeChart; + +import org.jfree.chart.axis.NumberAxis; +import org.jfree.chart.axis.SymbolAxis; +import org.jfree.chart.axis.ValueAxis; + +import org.jfree.chart.plot.PlotOrientation; + +import org.jfree.chart.renderer.LookupPaintScale; + +import org.jfree.chart.title.PaintScaleLegend; +import org.jfree.chart.title.TextTitle; + +import org.jfree.ui.RectangleEdge; +import org.jfree.ui.RectangleInsets; + +/** + * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) + * @author Sascha L. Teichmann (sascha.teichmann@intevation.de) + */ +public class VerticalCrossSectionChart +implements Chart +{ + public static final class PalettePaintLookup + implements PolygonRenderer.PaintLookup + { + private Palette palette; + private Map<Integer, Paint> special; + + public PalettePaintLookup(Palette palette) { + this(palette, null); + } + + public PalettePaintLookup( + Palette palette, + Map<Integer, Paint> special + ) { + this.palette = palette; + this.special = special; + } + + public Paint getPaint(int index) { + if (special != null) { + Paint paint = special.get(index); + if (paint != null) { + return paint; + } + } + return index < 0 + ? Color.black + : palette.getColor(index); + } + } // class PalettePaintLookup + + public static class LocalizedLabelGenerator + extends PolygonRenderer.DefaultLabelGenerator + { + protected NumberFormat format; + + public LocalizedLabelGenerator() { + } + + public LocalizedLabelGenerator(NumberFormat format) { + this.format = format; + } + + protected String toString(Object label) { + return label instanceof Number + ? format.format(((Number)label).doubleValue()) + : super.toString(label); + } + } // class LocalizedLabelGenerator + + protected JFreeChart chart; + + protected AttributedXYColumns columns; + protected Map<Integer, Paint> special; + protected Palette palette; + protected Locale locale; + protected ChartLabels labels; + + public VerticalCrossSectionChart() { + } + + public VerticalCrossSectionChart( + AttributedXYColumns columns, + Palette palette, + Locale locale, + ChartLabels labels + ) { + this(columns, palette, null, locale, labels); + } + + public VerticalCrossSectionChart( + AttributedXYColumns columns, + Palette palette, + Map<Integer, Paint> special, + Locale locale, + ChartLabels labels + ) { + this.columns = columns; + this.palette = palette; + this.special = special; + this.locale = locale; + this.labels = labels; + } + + protected JFreeChart createChart() { + + boolean legendB = false; + boolean tooltips = false; + boolean urls = false; + + PlotOrientation po = PlotOrientation.HORIZONTAL; + PolygonDataset data = columns.getPolygonDataset(); + + HashSet<Integer> usedColors = new HashSet<Integer>(); + + for (int i = data.getSeriesCount()-1; i >= 0; --i) { + PolygonSeries ps = data.getSeries(i); + Integer fill = (Integer)ps.getAttribute("fill"); + if (fill != null + && (special != null && !special.containsKey(fill))) { + usedColors.add(fill); + } + } + + NumberFormat format = NumberFormat.getInstance(locale); + format.setMinimumFractionDigits(0); + format.setMaximumFractionDigits(2); + + PolygonRenderer renderer = new PolygonRenderer( + new PalettePaintLookup(palette, special), + new LocalizedLabelGenerator(format)); + + ValueAxis domainAxis = new NumberAxis(this.labels.getDomainAxisLabel()); + ValueAxis rangeAxis = new NumberAxis(this.labels.getRangeAxisLabel()); + + PolygonPlot plot = new PolygonPlot( + data, + renderer, + domainAxis, + rangeAxis, + null); + + plot.setOutlinePaint(Color.WHITE); + + String [] labels = new String[usedColors.size()]; + + int colors = palette.getSize(); + LookupPaintScale lookupPaint = + new LookupPaintScale(-0.5d, labels.length-0.5d, Color.white); + + Color color = null; + + for (int i = 0, j = labels.length-1; i < colors && j >= 0; i++) { + if (usedColors.contains(i)) { + Palette.Entry entry = palette.getEntryByIndex(i); + color = entry.getColor(); + labels[j] = entry.getDescription(); + lookupPaint.add(j-0.5d, color); + --j; + } + } + + JFreeChart chart = new JFreeChart( + this.labels.getTitle(), + JFreeChart.DEFAULT_TITLE_FONT, + plot, + legendB); + + chart.removeLegend(); + chart.addSubtitle(new TextTitle(this.labels.getSubtitle())); + + SymbolAxis scale = new SymbolAxis(this.labels.getParameterName(), labels); + scale.setRange(-1.5d, labels.length+0.5d); + scale.setGridBandsVisible(false); + scale.setPlot(plot); + + PaintScaleLegend legend = new PaintScaleLegend( + lookupPaint, scale); + legend.setMargin(new RectangleInsets(3d, 10d, 3d, 10d)); + legend.setPosition(RectangleEdge.LEFT); + legend.setAxisOffset(5d); + + chart.addSubtitle(legend); + + return chart; + } + + public JFreeChart generateChart() { + if (chart == null) { + chart = createChart(); + } + + return chart; + } + + public void setBackgroundPaint(Paint paint) { + chart.setBackgroundPaint(paint); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :