/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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.
*
* Copyright 2009 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.platform.plugin.action.openflashchart.factory;
import java.util.ArrayList;
import java.util.List;
import ofc4j.model.axis.Axis;
import ofc4j.model.axis.YAxis;
import ofc4j.model.elements.Element;
import ofc4j.model.elements.LineChart;
import org.apache.commons.logging.Log;
import org.dom4j.Node;
import org.pentaho.commons.connection.IPentahoResultSet;
public class BarLineChartFactory extends BarChartFactory {
// bar line related elements
private static final String BAR_SERIES_SERIES_NODE_LOC = "bar-series/series"; //$NON-NLS-1$
private static final String LINES_RANGE_STROKE_NODE_LOC = "lines-range-stroke"; //$NON-NLS-1$
private static final String LINES_RANGE_GRID_COLOR_NODE_LOC = "lines-range-grid-color"; //$NON-NLS-1$
private static final String LINES_RANGE_COLOR_NODE_LOC = "lines-range-color"; //$NON-NLS-1$
private static final String LINE_SERIES_SERIES_NODE_LOC = "line-series/series"; //$NON-NLS-1$
private static final String LINES_RANGE_MAXIMUM_NODE_LOC = "lines-range-maximum"; //$NON-NLS-1$
private static final String LINES_RANGE_MINIMUM_NODE_LOC = "lines-range-minimum"; //$NON-NLS-1$
private static final String LINE_RANGE_STEPS_NODE_LOC = "line-range-steps"; //$NON-NLS-1$
LineChartFactory lineChartFactory = new LineChartFactory();
@Override
public void setupStyles() {
super.setupStyles();
lineChartFactory.setupStyles();
}
@Override
public void setData(IPentahoResultSet data) {
super.setData(data);
data.beforeFirst();
lineChartFactory.setData(data);
}
@Override
public void setChartNode(Node chartNode) {
super.setChartNode(chartNode);
lineChartFactory.setChartNode(chartNode);
}
@Override
public void setLog(Log log) {
super.setLog(log);
lineChartFactory.setLog(log);
}
protected void setupColors() {
super.setupColors();
lineChartFactory.setupColors();
}
public Axis setupRange() {
Axis axis = super.setupRange();
setupLineRange();
return axis;
}
@SuppressWarnings("unchecked")
public MinMax getRangeMinMax() {
int rangeMin = 0;
int rangeMax = 0;
if (isstacked) {
rangeMin = 0;
rangeMax = getStackedMaxRange();
} else {
rangeMin = Integer.MAX_VALUE;
rangeMax = Integer.MIN_VALUE;
List nodes = chartNode.selectNodes(BAR_SERIES_SERIES_NODE_LOC);
List<String> bars = new ArrayList<String>();
for (Object node : nodes) {
if (getValue((Node) node) != null) {
bars.add(getValue((Node) node));
}
}
for (int c = 0; c < getColumnCount(); c++) {
String text = getColumnHeader(c);
if (bars.contains(text)) {
for (int r = 0; r < getRowCount(); r++) {
if (rangeMin > ((Number) getValueAt(r, c)).intValue())
rangeMin = ((Number) getValueAt(r, c)).intValue();
if (rangeMax < ((Number) getValueAt(r, c)).intValue())
rangeMax = ((Number) getValueAt(r, c)).intValue();
}
}
}
}
if (rangeMin > 0) {
rangeMin = 0;
}
return new MinMax(rangeMin, rangeMax);
}
@SuppressWarnings("unchecked")
public void setupLineRange() {
int rangeMin = 0;
int rangeMax = 100;
int steps = 9;
String rangeColor = AXIS_COLOR_DEFAULT;
String rangeGridColor = AXIS_GRID_COLOR_DEFAULT;
int rangeStroke = 1;
if (CATEGORY_TYPE.equals(datasetType) || XYZ_TYPE.equals(datasetType)) {
rangeMin = Integer.MAX_VALUE;
rangeMax = Integer.MIN_VALUE;
List nodes = chartNode.selectNodes(LINE_SERIES_SERIES_NODE_LOC);
List<String> bars = new ArrayList<String>();
for (Object node : nodes) {
if (getValue((Node) node) != null) {
bars.add(getValue((Node) node));
}
}
for (int c = 0; c < getColumnCount(); c++) {
String text = getColumnHeader(c);
if (bars.contains(text)) {
for (int r = 0; r < getRowCount(); r++) {
if (rangeMin > ((Number) getValueAt(r, c)).intValue())
rangeMin = ((Number) getValueAt(r, c)).intValue();
if (rangeMax < ((Number) getValueAt(r, c)).intValue())
rangeMax = ((Number) getValueAt(r, c)).intValue();
}
}
}
}
boolean minDefined = false;
boolean maxDefined = false;
Node temp = chartNode.selectSingleNode(LINES_RANGE_MINIMUM_NODE_LOC);
if (getValue(temp) != null) {
rangeMin = new Integer(getValue(temp)).intValue();
minDefined = true;
}
temp = chartNode.selectSingleNode(LINES_RANGE_MAXIMUM_NODE_LOC);
if (getValue(temp) != null) {
rangeMax = new Integer(getValue(temp)).intValue();
maxDefined = true;
}
temp = chartNode.selectSingleNode(LINES_RANGE_COLOR_NODE_LOC);
if (getValue(temp) != null) {
rangeColor = getValue(temp);
}
temp = chartNode.selectSingleNode(LINES_RANGE_GRID_COLOR_NODE_LOC);
if (getValue(temp) != null) {
rangeGridColor = getValue(temp);
}
temp = chartNode.selectSingleNode(LINES_RANGE_STROKE_NODE_LOC);
if (getValue(temp) != null) {
rangeStroke = Integer.parseInt(getValue(temp));
}
temp = chartNode.selectSingleNode(LINE_RANGE_STEPS_NODE_LOC);
if (getValue(temp) != null) {
steps = new Integer(getValue(temp)).intValue();
}
int diff = rangeMax - rangeMin;
int chunksize = diff / steps;
Integer stepforchart = null;
if (chunksize > 0)
stepforchart = new Integer(chunksize);
// Readjust mins/maxs only if they weren't specified
if (!minDefined) {
// If actual min is positive, don't go below ZERO
if (rangeMin >= 0 && rangeMin - chunksize < 0)
rangeMin = 0;
else
rangeMin = rangeMin - chunksize;
}
if (!maxDefined) {
rangeMax = rangeMin + (chunksize * (steps + 2));
}
YAxis yaxis = new YAxis();
yaxis.setRange(rangeMin, rangeMax, stepforchart);
yaxis.setStroke(rangeStroke);
yaxis.setColour(rangeColor);
yaxis.setGridColour(rangeGridColor);
chart.setYAxisRight(yaxis);
}
@Override
public void createElements() {
if (CATEGORY_TYPE.equals(datasetType)) {
int columnCount = getColumnCount();
for (int col = 0; col < columnCount; col++) {
elements.add(getBarLineChartFromColumn(col));
}
} else {
// TOOD: Support XY in the future?
}
}
@SuppressWarnings("unchecked")
public Element getBarLineChartFromColumn(int col) {
String text = getColumnHeader(col);
// determine if this is a line or a bar
List nodes = chartNode.selectNodes(BAR_SERIES_SERIES_NODE_LOC);
List<String> bars = new ArrayList<String>();
for (Object node : nodes) {
if (getValue((Node) node) != null) {
bars.add(getValue((Node) node));
}
}
if (!bars.contains(text)) {
LineChart lc = lineChartFactory.getLineChartFromColumn(col);
lc.setRightYAxis();
return lc;
} else {
return getVerticalBarChartFromColumn(col);
}
}
}