/****************************************************************
* Copyright (c) 2006-2013 IBM Corp.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - initial API and implementation
*
****************************************************************
*/
package org.eclipse.linuxtools.internal.systemtap.graphing.ui.charts;
import org.eclipse.linuxtools.dataviewers.piechart.PieChart;
import org.eclipse.linuxtools.internal.systemtap.graphing.ui.charts.listeners.PieChartMouseMoveListener;
import org.eclipse.linuxtools.systemtap.graphing.core.adapters.IAdapter;
import org.eclipse.swt.widgets.Composite;
import org.swtchart.IAxis;
import org.swtchart.Range;
/**
* Builds Pie chart.
*/
public class PieChartBuilder extends AbstractChartWithoutAxisBuilder {
public static final String ID = "org.eclipse.linuxtools.systemtap.graphing.ui.charts.piechartbuilder"; //$NON-NLS-1$
public PieChartBuilder(Composite parent, int style, String title, IAdapter adapter) {
super(adapter, parent, style, title);
}
@Override
protected void createChart() {
this.chart = new PieChart(this, getStyle());
((PieChart) chart).setCustomColors(COLORS);
chartMouseMoveListener = new PieChartMouseMoveListener((PieChart) chart, chart);
}
@Override
protected void buildXAxis() {
String[] labels = adapter.getLabels();
String[] seriesLabels = new String[labels.length - 1];
for (int i = 0; i < seriesLabels.length; i++) {
seriesLabels[i] = labels[i+1];
}
IAxis xAxis = this.chart.getAxisSet().getXAxis(0);
xAxis.getTitle().setText(labels[0]);
xAxis.setCategorySeries(seriesLabels);
}
@Override
protected void buildXSeries() {
Object data[][] = adapter.getData();
if (data == null || data.length == 0) {
return;
}
int start = 0, len = Math.min(this.maxItems, data.length), leny = data[0].length-1;
if (this.maxItems < data.length) {
start = data.length - this.maxItems;
}
Double[][] all_values = new Double[len][leny];
String[] all_labels = new String[len];
for (int i = 0; i < all_labels.length; i++) {
Object label = data[start + i][0];
if (label != null) {
all_labels[i] = label.toString();
for (int j = 1; j < data[start + i].length; j++) {
// Ignore all null or negative slice values.
Double val = getDoubleOrNullValue(data[start + i][j]);
if (val != null && val >= 0) {
all_values[i][j-1] = val;
} else {
all_values[i][j-1] = 0.0;
}
}
}
}
double[][] values = new double[len][leny];
String[] labels = new String[len];
int len_trim = 0;
for (int i = 0; i < len; i++) {
if (all_labels[i] != null) {
labels[len_trim] = all_labels[i];
for (int j = 0; j < leny; j++) {
values[len_trim][j] = all_values[i][j].doubleValue();
}
len_trim++;
}
}
double[][] values_trim = new double[len_trim][leny];
String[] labels_trim = new String[len_trim];
for (int i = 0; i < len_trim; i++) {
labels_trim[i] = labels[i];
for (int j = 0; j < leny; j++) {
values_trim[i][j] = values[i][j];
}
}
((PieChart)this.chart).addPieChartSeries(getUniqueNames(labels_trim), values_trim);
applyCategoryRange(values_trim[0].length);
chart.redraw();
}
/**
* This updates the visible range of the chart's x-axis.
*/
private void applyCategoryRange(int numItems) {
int itemRange = Math.max(1, (int) Math.ceil(numItems * scale)); // The number of items to display
int lower = (int) Math.round((numItems - itemRange) * scroll);
chart.getAxisSet().getXAxis(0).setRange(new Range(lower, lower + itemRange - 1));
}
@Override
public void updateDataSet() {
buildXSeries();
chartMouseMoveListener.update();
}
@Override
protected void buildYAxis() {
}
@Override
protected void buildYSeries() {
}
}