/*******************************************************************************
* Copyright (c) 2006, 2009 University of Edinburgh.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the BSD Licence, which
* accompanies this feature and can be downloaded from
* http://groups.inf.ed.ac.uk/pepa/update/licence.txt
*******************************************************************************/
/* LineChartBuilder.java
*
* created by mtribast on 21 Feb 2008
*
*/
package uk.ac.ed.inf.common.ui.plotting.internal;
import java.util.ArrayList;
import java.util.Formatter;
import org.eclipse.birt.chart.extension.datafeed.StockEntry;
import org.eclipse.birt.chart.model.attribute.ColorDefinition;
import org.eclipse.birt.chart.model.attribute.LegendItemType;
import org.eclipse.birt.chart.model.attribute.LineAttributes;
import org.eclipse.birt.chart.model.attribute.LineStyle;
import org.eclipse.birt.chart.model.attribute.Marker;
import org.eclipse.birt.chart.model.attribute.impl.ColorDefinitionImpl;
import org.eclipse.birt.chart.model.component.Series;
import org.eclipse.birt.chart.model.component.impl.SeriesImpl;
import org.eclipse.birt.chart.model.data.NumberDataSet;
import org.eclipse.birt.chart.model.data.SeriesDefinition;
import org.eclipse.birt.chart.model.data.StockDataSet;
import org.eclipse.birt.chart.model.data.impl.NumberDataSetImpl;
import org.eclipse.birt.chart.model.data.impl.SeriesDefinitionImpl;
import org.eclipse.birt.chart.model.data.impl.StockDataSetImpl;
import org.eclipse.birt.chart.model.layout.Legend;
import org.eclipse.birt.chart.model.type.LineSeries;
import org.eclipse.birt.chart.model.type.StockSeries;
import org.eclipse.birt.chart.model.type.impl.LineSeriesImpl;
import org.eclipse.birt.chart.model.type.impl.StockSeriesImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import uk.ac.ed.inf.common.ui.plotting.data.ConfidenceSeries;
import uk.ac.ed.inf.common.ui.plotting.data.InfoWithAxes;
/**
* @author mtribast
* @author ajduguid
*
*/
public class LineChartBuilder extends ChartWithAxesBuilder {
private static ColorDefinition[] COLORS;
private static LineStyle[] LINES;
// Set to mimic JFreeChart
static {
ArrayList<ColorDefinition> colors = new ArrayList<ColorDefinition>();
colors.add(ColorDefinitionImpl.create(255, 0, 0));
colors.add(ColorDefinitionImpl.create(0, 0, 255));
colors.add(ColorDefinitionImpl.create(0, 255, 0));
colors.add(ColorDefinitionImpl.create(255, 255, 0));
colors.add(ColorDefinitionImpl.create(255, 200, 0));
colors.add(ColorDefinitionImpl.create(255, 0, 255));
colors.add(ColorDefinitionImpl.create(0, 255, 255));
colors.add(ColorDefinitionImpl.create(255, 175, 175));
colors.add(ColorDefinitionImpl.create(128, 128, 128));
colors.add(ColorDefinitionImpl.create(0, 0, 0));
colors.add(ColorDefinitionImpl.create(192, 0, 0));
colors.add(ColorDefinitionImpl.create(0, 0, 192));
colors.add(ColorDefinitionImpl.create(0, 192, 0));
colors.add(ColorDefinitionImpl.create(192, 192, 0));
colors.add(ColorDefinitionImpl.create(192, 0, 192));
colors.add(ColorDefinitionImpl.create(0, 192, 192));
colors.add(ColorDefinitionImpl.create(64, 64, 64));
colors.add(ColorDefinitionImpl.create(255, 64, 64));
colors.add(ColorDefinitionImpl.create(64, 64, 255));
colors.add(ColorDefinitionImpl.create(64, 255, 64));
COLORS = colors.toArray(new ColorDefinition[colors.size()]);
LINES = new LineStyle[] { LineStyle.SOLID_LITERAL,
LineStyle.DASHED_LITERAL, LineStyle.DOTTED_LITERAL };
}
public LineChartBuilder(InfoWithAxes info) {
super(info, false);
}
@Override
protected void buildXSeries() {
double[] xDoubles = ((InfoWithAxes) info).getXSeries().getValues();
NumberDataSet xValues = NumberDataSetImpl.create(xDoubles);
Series xSeries = SeriesImpl.create();
xSeries.setDataSet(xValues);
// String key = "xValues";
// provider.provide(key, convert(xDoubles));
// Test for data definitions
// xSeries.getDataDefinition().add(QueryImpl.create(key));
// Apply the color palette
SeriesDefinition sdX = SeriesDefinitionImpl.create();
// sdX.getSeriesPalette().shift(0);
xAxis.getSeriesDefinitions().add(sdX);
// System.err.println("Added x:" + sdX);
// sdX.getQuery().setDefinition("xaxis");
sdX.getSeries().add(xSeries);
}
@Override
protected void buildYSeries() {
// String keyPrefix = "YSeries_";
SeriesDefinition sdY = SeriesDefinitionImpl.create();
yAxis.getSeriesDefinitions().add(sdY);
int i = 0, j = 0;
for (uk.ac.ed.inf.common.ui.plotting.data.Series series : ((InfoWithAxes) info)
.getYSeries()) {
double[] values = series.getValues();
LineSeries ls = createLineSeries(values);
ls.setSeriesIdentifier(series.getLabel());
setAttibutes(ls, i, j);
sdY.getSeries().add(ls);
if (series instanceof ConfidenceSeries) {
this.chart.setType("Stock Chart");
this.chart.setSubType("Standard Stock Chart");
double[] radii = ((ConfidenceSeries) series).getRadii();
StockSeries ss = createStockSeries(values, radii);
String id = new Formatter().format("%2.1f%% c.i.",
((ConfidenceSeries) series).getConfidenceLevel() * 100)
.toString();
ss.setSeriesIdentifier(id);
setAttibutes(ss, i, j);
sdY.getSeries().add(ss);
}
i++;
j++;
}
}
private void setAttibutes(LineSeries series, int colorIndex, int lineIndex) {
LineAttributes la = series.getLineAttributes();
la.setColor((ColorDefinition) EcoreUtil.copy(COLORS[colorIndex
% COLORS.length]));
la.setStyle(LINES[lineIndex % LINES.length]);
la.setThickness(2);
}
private void setAttibutes(StockSeries series, int colorIndex, int lineIndex) {
LineAttributes la = series.getLineAttributes();
la.setColor((ColorDefinition) EcoreUtil.copy(COLORS[colorIndex
% COLORS.length]));
la.setStyle(LINES[lineIndex % LINES.length]);
la.setThickness(2);
}
private StockSeries createStockSeries(double[] averages, double[] radii) {
StockEntry[] entries = new StockEntry[averages.length];
for (int i = 0; i < entries.length; i++) {
double down = averages[i] - radii[i];
double up = averages[i] + radii[i];
entries[i] = new StockEntry(down, down, up, up);
}
StockDataSet stockValues = StockDataSetImpl.create(entries);
StockSeries ss = (StockSeries) StockSeriesImpl.create();
ss.setDataSet(stockValues);
ss.getLabel().setVisible(false);
ss.setStickLength(1);
ss.setShowAsBarStick(true);
return ss;
}
private LineSeries createLineSeries(double[] values) {
NumberDataSet orthohonalValuesDataSet = NumberDataSetImpl
.create(values);
LineSeries ls = (LineSeries) LineSeriesImpl.create();
ls.setDataSet(orthohonalValuesDataSet);
for (Object o : ls.getMarkers()) {
((Marker) o).setVisible(info.isShowMarkers());
}
ls.getLabel().setVisible(false);
return ls;
}
@Override
protected void handleLegend(Legend legend) {
super.handleLegend(legend);
legend.setItemType(LegendItemType.SERIES_LITERAL);
}
}