001/*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
019 */
020package org.sonar.server.charts.deprecated;
021
022import org.jfree.chart.JFreeChart;
023import org.jfree.chart.encoders.KeypointPNGEncoderAdapter;
024import org.jfree.chart.title.LegendTitle;
025import org.jfree.chart.title.TextTitle;
026import org.jfree.ui.RectangleEdge;
027
028import java.awt.*;
029import java.awt.image.BufferedImage;
030import java.io.ByteArrayOutputStream;
031import java.io.IOException;
032import java.io.OutputStream;
033
034public abstract class BaseChart {
035
036  public static final Color BASE_COLOR = new Color(51, 51, 51);
037  public static final Color BASE_COLOR_LIGHT = new Color(204, 204, 204);
038  public static final Color SERIE_BORDER_COLOR = new Color(67, 119, 166);
039
040  public static final Color[] COLORS = {
041    new Color(5, 141, 199),
042    new Color(80, 180, 50),
043    new Color(237, 86, 27),
044    new Color(237, 239, 0),
045    new Color(36, 203, 229),
046    new Color(100, 229, 114),
047    new Color(255, 150, 85)
048  };
049
050  public static final int FONT_SIZE = 13;
051
052  private int width;
053  private int height;
054
055  protected BaseChart(int width, int height) {
056    this.width = width;
057    this.height = height;
058  }
059
060  public int getWidth() {
061    return width;
062  }
063
064  public int getHeight() {
065    return height;
066  }
067
068  public void setWidth(int width) {
069    this.width = width;
070  }
071
072  public void setHeight(int height) {
073    this.height = height;
074  }
075
076  protected Font getFont() {
077    return new Font("SansSerif", Font.PLAIN, FONT_SIZE);
078  }
079
080  protected void configureChart(JFreeChart chart, boolean displayLegend) {
081    if (displayLegend) {
082      configureChart(chart, RectangleEdge.BOTTOM);
083    } else {
084      configureChart(chart, null);
085    }
086  }
087
088  protected void configureChart(JFreeChart chart, RectangleEdge legendPosition) {
089    chart.setBackgroundPaint(new Color(255, 255, 255, 0));
090    chart.setBackgroundImageAlpha(0.0f);
091    chart.setBorderVisible(false);
092    chart.setAntiAlias(true);
093    chart.setTextAntiAlias(true);
094
095    chart.removeLegend();
096    if (legendPosition != null) {
097      LegendTitle legend = new LegendTitle(chart.getPlot());
098      legend.setPosition(legendPosition);
099      legend.setItemPaint(BASE_COLOR);
100      chart.addSubtitle(legend);
101    }
102  }
103
104  protected void configureChartTitle(JFreeChart chart, String title) {
105    if (title != null && title.length() > 0) {
106      TextTitle textTitle = new TextTitle(title);
107      chart.setTitle(textTitle);
108    }
109  }
110
111  protected abstract BufferedImage getChartImage() throws IOException;
112
113  protected BufferedImage getBufferedImage(JFreeChart chart) {
114    return chart.createBufferedImage(getWidth(), getHeight(), Transparency.BITMASK, null);
115  }
116
117  public void exportChartAsPNG(OutputStream out) throws IOException {
118    KeypointPNGEncoderAdapter encoder = new KeypointPNGEncoderAdapter();
119    encoder.setEncodingAlpha(true);
120    encoder.encode(getChartImage(), out);
121  }
122
123  public byte[] exportChartAsPNG() throws IOException {
124    ByteArrayOutputStream output = new ByteArrayOutputStream();
125    try {
126      exportChartAsPNG(output);
127    } finally {
128      output.close();
129    }
130    return output.toByteArray();
131  }
132
133  protected BasicStroke getDashedStroke() {
134    return getDashedStroke(1f);
135  }
136
137  protected BasicStroke getDashedStroke(float width) {
138    return new BasicStroke(width,
139        BasicStroke.CAP_BUTT,
140        BasicStroke.JOIN_MITER,
141        10.0f, new float[] { 5.0f }, 0.0f);
142  }
143}