[Schmitzm-commits] r951 - in trunk: src/schmitzm/jfree src/schmitzm/jfree/chart/style src/schmitzm/jfree/feature/style src/schmitzm/jfree/table/style src/schmitzm/lang src_junit/schmitzm/jfree/feature/style
scm-commit@wald.intevation.org
scm-commit at wald.intevation.org
Wed Jul 28 19:45:59 CEST 2010
Author: mojays
Date: 2010-07-28 19:45:56 +0200 (Wed, 28 Jul 2010)
New Revision: 951
Modified:
trunk/src/schmitzm/jfree/JFreeChartUtil.java
trunk/src/schmitzm/jfree/chart/style/AbstractChartStyle.java
trunk/src/schmitzm/jfree/chart/style/BasicChartStyle.java
trunk/src/schmitzm/jfree/chart/style/ChartRendererStyle.java
trunk/src/schmitzm/jfree/chart/style/ChartStyle.java
trunk/src/schmitzm/jfree/chart/style/ChartStyleXMLFactory.java
trunk/src/schmitzm/jfree/chart/style/PieChartStyle.java
trunk/src/schmitzm/jfree/chart/style/ScatterChartStyle.java
trunk/src/schmitzm/jfree/feature/style/FeatureBasicChartStyle.java
trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java
trunk/src/schmitzm/jfree/feature/style/FeatureScatterChartStyle.java
trunk/src/schmitzm/jfree/table/style/TableBasicChartStyle.java
trunk/src/schmitzm/jfree/table/style/TableChartStyle.java
trunk/src/schmitzm/jfree/table/style/TableChartStyleXMLFactory.java
trunk/src/schmitzm/jfree/table/style/TableScatterChartStyle.java
trunk/src/schmitzm/lang/LangUtil.java
trunk/src_junit/schmitzm/jfree/feature/style/FeatureChartStyleTest.java
Log:
Extension of chart styles
- dash attributes for series rendering (ChartRendererStyle)
- support of secondary dataset(s) and secondary axes
Note: XML encoding for the new features NOT YET implemented!!
Modified: trunk/src/schmitzm/jfree/JFreeChartUtil.java
===================================================================
--- trunk/src/schmitzm/jfree/JFreeChartUtil.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/JFreeChartUtil.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -29,7 +29,9 @@
******************************************************************************/
package schmitzm.jfree;
+import java.awt.BasicStroke;
import java.awt.Color;
+import java.awt.Stroke;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Locale;
@@ -394,6 +396,21 @@
/**
+ * Returns dataset count from a plot.
+ * @param plot a plot
+ */
+ public static int getDatasetCountFromPlot(Plot plot) {
+ if ( plot instanceof XYPlot )
+ return ((XYPlot)plot).getDatasetCount();
+ if ( plot instanceof CategoryPlot )
+ return ((CategoryPlot)plot).getDatasetCount();
+ if ( plot instanceof PiePlot )
+ return ((PiePlot)plot).getDataset() != null ? 1 : 0;
+ LOGGER.warn("Could not determine dataset count for plot: "+LangUtil.getSimpleClassName(plot));
+ return 0;
+ }
+
+ /**
* Returns the dataset from a plot.
* @param plot a plot
*/
@@ -949,6 +966,25 @@
// TODO Ich will einen schönen Tooltip für die Regressionslinine in der Legende
}
+ /**
+ * Creates a basic stroke by only some basic attributes
+ * @param lineWidth line width
+ * @param dashAttr defines the dashing
+ * @return
+ */
+ public static Stroke createDefaultStroke(float lineWidth, float[] dashAttr) {
+ //*** Set the stroke parameters ***
+ float width = lineWidth; // Linien Breite
+ int cap = BasicStroke.CAP_ROUND; // Rendering am Ende der Linie
+ int join = BasicStroke.JOIN_ROUND; // Rendering an den Zwischenknoten
+ float miterlimit = 1.0f;
+ float[] dash = dashAttr; // may be null
+ float dash_phase = 1.0f;
+ Stroke stroke = new BasicStroke(width, cap, join, miterlimit, dash, dash_phase);
+
+ return stroke;
+ }
+
// ###################
// BISHER NUR WILDE TESTS
// ###################
Modified: trunk/src/schmitzm/jfree/chart/style/AbstractChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/chart/style/AbstractChartStyle.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/chart/style/AbstractChartStyle.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -47,6 +47,7 @@
import org.apache.log4j.Category;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.Axis;
+import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.CategoryToolTipGenerator;
import org.jfree.chart.labels.PieSectionLabelGenerator;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
@@ -54,6 +55,7 @@
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.labels.XYToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
+import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.AbstractRenderer;
@@ -123,6 +125,8 @@
protected int maxRendererDatasetIdx = 0;
/** Holds the style for the chart's plot. */
protected ChartPlotStyle plotStyle = null;
+ /** Holds the maximum index for which an axis is specified. */
+ protected int maxAxisIdx = 0;
/**
* Creates a line style with default values.
@@ -361,7 +365,9 @@
* Returns the axis count.
*/
public int getAxisCount() {
- return axisStyle.size();
+//MS: map size is not automatically the axis count
+// return axisStyle.size();
+ return maxAxisIdx + 1;
}
/**
@@ -380,6 +386,7 @@
*/
public void setAxisStyle(int axis, ChartAxisStyle style) {
axisStyle.put(axis, style);
+ maxAxisIdx = LangUtil.max( axisStyle.keySet() );
}
/**
@@ -394,6 +401,7 @@
// TODO MArtin! Funktioniert so leider nicht. Warum ist hier
// getAxisCount() immer 0 ????
for (int axisIndex = 0; axisIndex < getAxisCount(); axisIndex++) {
+ if ( getAxisStyle(axisIndex) != null )
getAxisStyle(axisIndex).setUnitVisible(visible);
}
}
@@ -450,12 +458,18 @@
chart.setBackgroundPaint( getBackground() );
if ( chart.getPlot() instanceof XYPlot ) {
XYPlot plot = chart.getXYPlot();
- plot.getRenderer().setBaseToolTipGenerator( hasTooltips() ? TIPGEN_XY : null );
- plot.getRenderer().setURLGenerator( hasURLs() ? URLGEN_XY : null );
+ // The tooltip and URL properties should not be
+ // applied to the special regression line renderer,
+ // so reduce the renderer count for these properties.
+ int rendCount = reducedCountForSpecialStyle(this, plot, plot.getRendererCount());
+ for (int i=0; i<rendCount; i++) {
+ plot.getRenderer(i).setBaseToolTipGenerator( hasTooltips() ? TIPGEN_XY : null );
+ plot.getRenderer(i).setURLGenerator( hasURLs() ? URLGEN_XY : null );
+ }
if ( getOrientation() != null )
plot.setOrientation( getOrientation() );
- // style renderer
+ // style renderers
for (int i=0; i<plot.getRendererCount(); i++) {
XYItemRenderer renderer = plot.getRenderer(i);
ChartRendererStyle rendererStyle = getRendererStyle(i);
@@ -464,8 +478,11 @@
}
} else if ( chart.getPlot() instanceof CategoryPlot ) {
CategoryPlot plot = chart.getCategoryPlot();
- plot.getRenderer().setBaseToolTipGenerator( hasTooltips() ? TIPGEN_CAT : null );
- plot.getRenderer().setBaseItemURLGenerator( hasURLs() ? URLGEN_CAT : null );
+ int rendCount = reducedCountForSpecialStyle(this, plot, plot.getRendererCount());
+ for (int i=0; i<rendCount; i++) {
+ plot.getRenderer(i).setBaseToolTipGenerator( hasTooltips() ? TIPGEN_CAT : null );
+ plot.getRenderer(i).setBaseItemURLGenerator( hasURLs() ? URLGEN_CAT : null );
+ }
if ( getOrientation() != null )
plot.setOrientation( getOrientation() );
@@ -519,7 +536,35 @@
if ( getDescStyle().getPaint() != null )
subTitle.setPaint( getDescStyle().getPaint() );
}
+
+ // If a secondary range axis is defined in the style, but
+ // not yet in the plot, create the secondary range axis.
+ // All datasets (except the primary) are mapped to this
+ // secondary axis
+ if ( getAxisCount() > 2 ) {
+ if ( chart.getPlot() instanceof XYPlot ) {
+ XYPlot plot = chart.getXYPlot();
+ // add the yet missing axis
+ if ( plot.getRangeAxisCount() < 2 )
+ plot.setRangeAxis(1, new NumberAxis());
+ // map datasets to the secondary axis
+ int datasetCount = reducedCountForSpecialStyle(this,plot,plot.getDatasetCount());
+ for (int i=1; i<datasetCount; i++)
+ plot.mapDatasetToRangeAxis(i, 1);
+ } else if ( chart.getPlot() instanceof CategoryPlot ) {
+ CategoryPlot plot = chart.getCategoryPlot();
+ // add the yet missing axis
+ if ( plot.getRangeAxisCount() < 2 )
+ plot.setRangeAxis(1, new NumberAxis());
+ // map datasets to the secondary axis
+ int datasetCount = reducedCountForSpecialStyle(this,plot,plot.getDatasetCount());
+ for (int i=1; i<datasetCount; i++)
+ plot.mapDatasetToRangeAxis(i, 1);
+ } else
+ LOGGER.warn("Plot does not support a secondary range axis: "+LangUtil.getSimpleClassName(chart.getPlot()));
+ }
+
// Style the chart axis
Vector<Axis> chartAxis = new Vector<Axis>();
if ( chart.getPlot() instanceof XYPlot ) {
@@ -536,10 +581,29 @@
for (int i=0; i<plot.getRangeAxisCount(); i++)
chartAxis.add( plot.getRangeAxis(i) );
}
- for (int i=0; i<chartAxis.size(); i++)
- if ( i<getAxisCount() )
- getAxisStyle(i).applyToAxis( chartAxis.elementAt(i) );
+ for (int i=0; i<chartAxis.size(); i++) {
+ ChartAxisStyle axisStyle = getAxisStyle(i);
+ if ( axisStyle != null ) {
+ axisStyle.applyToAxis( chartAxis.elementAt(i) );
+ }
else
LOGGER.warn("Style contains no style definition for axis "+i);
+ }
}
+
+ /**
+ * Reduces a count (of Datasets or Renderer) in some special cases.
+ * @param style the chart style
+ * @param plot the plot
+ * @param count the count (of Datasets or Renderer)
+ */
+ private static int reducedCountForSpecialStyle(ChartStyle style, Plot plot, int count) {
+ // In a ScatterChart with Regression line, there is a additional dataset and
+ // renderer (the last one!) for which the "normal" chart and axis properties should not
+ // be applied
+ if ( style instanceof ScatterChartStyle && ((ScatterChartStyle)style).isRegressionLineVisible() )
+ count--;
+
+ return count;
+ }
}
Modified: trunk/src/schmitzm/jfree/chart/style/BasicChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/chart/style/BasicChartStyle.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/chart/style/BasicChartStyle.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -42,6 +42,7 @@
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
+import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.category.CategoryDataset;
@@ -233,18 +234,32 @@
* @exception UnsupportedOperationException if the style can not be applied
* to the given dataset
*/
- public JFreeChart applyToDataset(Dataset dataset) {
+ public JFreeChart applyToDataset(Dataset... dataset) {
JFreeChart chart = null;
switch ( type ) {
- case LINE: chart = createLineChart(dataset);
+ case LINE: chart = createDefaultLineChart(dataset[0]);
break;
- case AREA: chart = createAreaChart(dataset);
+ case AREA: chart = createDefaultAreaChart(dataset[0]);
break;
- case BAR: chart = createBarChart(dataset);
+ case BAR: chart = createDefaultBarChart(dataset[0]);
break;
// unsupported types
default: throwUnsupportedTypeException();
}
+
+ // Add secondary dataset to chart
+ if ( dataset.length > 1 ) {
+ Plot plot = chart.getPlot();
+ if ( plot instanceof XYPlot )
+ for (int i=1; i<dataset.length; i++)
+ ((XYPlot)plot).setDataset(1, (XYDataset)dataset[1]);
+ else if ( plot instanceof CategoryPlot )
+ for (int i=1; i<dataset.length; i++)
+ ((CategoryPlot)plot).setDataset(1, (CategoryDataset)dataset[1]);
+ else
+ LOGGER.warn("Plot does not support multiple datasets. Secondary dataset ignored: "+LangUtil.getSimpleClassName(plot));
+ }
+
applyToChart(chart);
return chart;
}
@@ -255,12 +270,25 @@
*/
public void applyToChart(JFreeChart chart) {
// apply the stacked and stepped property
- if ( chart.getPlot() instanceof XYPlot )
- chart.getXYPlot().setRenderer( JFreeChartUtil.createXYRenderer(this) );
- else if ( chart.getPlot() instanceof CategoryPlot )
- chart.getCategoryPlot().setRenderer( JFreeChartUtil.createCategoryRenderer(this) );
- else
+ if ( chart.getPlot() instanceof XYPlot ) {
+ XYPlot xyPlot = chart.getXYPlot();
+ // Prepare default renderer
+ xyPlot.setRenderer( JFreeChartUtil.createXYRenderer(this) );
+ // Prepare additional renderer
+ for ( int i=1; i<getRendererCount(); i++)
+ // TODO: Alternative chart type for secondary renderer
+ xyPlot.setRenderer(i, JFreeChartUtil.createXYRenderer(this));
+ } else if ( chart.getPlot() instanceof CategoryPlot ) {
+ CategoryPlot catPlot = chart.getCategoryPlot();
+ // Prepare default renderer
+ catPlot.setRenderer( JFreeChartUtil.createCategoryRenderer(this) );
+ // Prepare additional renderer
+ for ( int i=1; i<getRendererCount(); i++)
+ // TODO: Alternative chart type for secondary renderer
+ catPlot.setRenderer(i, JFreeChartUtil.createCategoryRenderer(this) );
+ } else
LOGGER.warn("Properties of BasicChartStyle can not be applied to plot: "+chart.getPlot());
+
// Note: It is important that the super-apply comes after
// the upper stuff, so that changes on the renderer
// effect the new (special stacked/stepped) renderer!!
@@ -269,10 +297,10 @@
/**
- * Creates a line chart from an {@link XYDataset} or {@link CategoryDataset}
+ * Creates a default line chart from an {@link XYDataset} or {@link CategoryDataset}
* @param dataset Dataset
*/
- private JFreeChart createLineChart(Dataset dataset) {
+ private JFreeChart createDefaultLineChart(Dataset dataset) {
JFreeChart chart = null;
// XYDataset -> XYLineChart
if (dataset instanceof XYDataset) {
@@ -300,10 +328,10 @@
}
/**
- * Creates an area chart from an {@link XYDataset} or {@link CategoryDataset}
+ * Creates an dafault area chart from an {@link XYDataset} or {@link CategoryDataset}
* @param dataset Dataset
*/
- private JFreeChart createAreaChart(Dataset dataset) {
+ private JFreeChart createDefaultAreaChart(Dataset dataset) {
JFreeChart chart = null;
// XYDataset -> XYAreaChart
if (dataset instanceof XYDataset) {
@@ -332,10 +360,10 @@
}
/**
- * Creates a bar chart from an {@link XYDataset} or {@link CategoryDataset}
+ * Creates a default bar chart from an {@link XYDataset} or {@link CategoryDataset}
* @param dataset Dataset
*/
- private JFreeChart createBarChart(Dataset dataset) {
+ private JFreeChart createDefaultBarChart(Dataset dataset) {
JFreeChart chart = null;
// XYDataset -> XYBarChart
if (dataset instanceof XYDataset) {
Modified: trunk/src/schmitzm/jfree/chart/style/ChartRendererStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/chart/style/ChartRendererStyle.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/chart/style/ChartRendererStyle.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -59,6 +59,7 @@
* <ul>
* <li>color of series graphs</li>
* <li>line width of series graphs</li>
+ * <li>dashing attributes for the series graphs</li>
* <li>visibility of series item labels</li>
* <li>visibility of series shapes</li>
* <li>the legend labels of the series</li>
@@ -87,6 +88,10 @@
/** Holds the line width a series graph is painted with (for all series this property
* is not set explicitly). */
protected Integer defaultWidth = null;
+ /** Holds the dash attributes a series graph is painted with (for all series this property
+ * is not set explicitly).
+ * @see BasicStroke */
+ protected float[] defaultDashAttr = null;
/** Holds whether the shape of a series is visible (for all series this property
* is not set explicitly). */
protected Boolean defaultShapesVisible = null;
@@ -109,6 +114,9 @@
protected Map<Integer, Color> seriesPaint = new HashMap<Integer, Color>();
/** Holds the line width a series graph is painted with. */
protected Map<Integer, Integer> seriesWidth = new HashMap<Integer, Integer>();
+ /** Holds the dash attributes a series graph is painted with.
+ * @see BasicStroke */
+ protected Map<Integer,float[]> seriesDashAttr = new HashMap<Integer,float[]>();
/** Holds whether the shape of a series is visible. */
protected Map<Integer, Boolean> seriesShapesVisible = new HashMap<Integer, Boolean>();
/** Holds whether the series is visible in the legend. */
@@ -160,6 +168,7 @@
dest.setDefaultItemLabelsVisible(isDefaultItemLabelsVisible() );
dest.setDefaultPaint(getDefaultPaint() );
dest.setDefaultLineWidth(getDefaultLineWidth() );
+ dest.setDefaultLineDashAttributes(LangUtil.cloneArray(getDefaultLineDashAttibutes()));
dest.setDefaultShapesVisible(isDefaultShapesVisible() );
dest.setDefaultLegendVisible(isDefaultLegendVisible() );
if ( getDefaultLegendLabel() != null )
@@ -179,6 +188,10 @@
for ( int series : seriesWidth.keySet() )
dest.setSeriesLineWidth( series, getSeriesLineWidth(series) );
+ dest.seriesDashAttr.clear();
+ for ( int series : seriesDashAttr.keySet() )
+ dest.setSeriesLineDashAttributes( series, LangUtil.cloneArray(getSeriesLineDashAttibutes(series)) );
+
dest.seriesItemLabelsVisible.clear();
for ( int series : seriesItemLabelsVisible.keySet() )
dest.setSeriesItemLabelsVisible( series, isSeriesItemLabelsVisible(series) );
@@ -291,6 +304,29 @@
}
/**
+ * Returns the dash attributes, a series is painted with.
+ * @param series series index
+ * @return {@code null} if no specific dashing is set for the series
+ * @see BasicStroke
+ */
+ public float[] getSeriesLineDashAttibutes(int series) {
+ return seriesDashAttr.get(series);
+ }
+
+ /**
+ * Sets the dash attributes, a series is painted with.
+ * @param series series index
+ * @param width dash attributes for the series (can be {@code null} to reset
+ * to a continuous line)
+ */
+ public void setSeriesLineDashAttributes(int series, float... dashAttr) {
+ if ( dashAttr.length == 0 )
+ dashAttr = null;
+ seriesDashAttr.put(series,dashAttr);
+ updateSeriesCount();
+ }
+
+ /**
* Returns whether the item labels of a series are visible.
* @param series series index
* @return {@code null} if property is not set for the series
@@ -422,13 +458,35 @@
* Sets the line width, a series is painted with for these
* series this property is not set explicitly.
* @param width line width for the series (can be {@code null} to reset
- * to a non-specific color)
+ * to a non-specific width)
*/
public void setDefaultLineWidth(Integer width) {
defaultWidth = width;
}
/**
+ * Returns the dash attributes, a series is painted with for these
+ * series this property is not set explicitly.
+ * @return {@code null} if no specific dashing is set for the series
+ * @see BasicStroke
+ */
+ public float[] getDefaultLineDashAttibutes() {
+ return defaultDashAttr;
+ }
+
+ /**
+ * Sets the dash attributes, a series is painted with for these
+ * series this property is not set explicitly.
+ * @param width dash attributes for the series (can be {@code null} to reset
+ * to a continuous line)
+ */
+ public void setDefaultLineDashAttributes(float... dashAttr) {
+ if ( dashAttr.length == 0 )
+ dashAttr = null;
+ defaultDashAttr = dashAttr;
+ }
+
+ /**
* Returns whether the item labels of a series are visible for these
* series this property is not set explicitly.
* @return {@code null} if property is not set for the series
@@ -548,6 +606,7 @@
seriesKey.keySet(),
seriesPaint.keySet(),
seriesWidth.keySet(),
+ seriesDashAttr.keySet(),
seriesShapesVisible.keySet(),
seriesItemLabelsVisible.keySet(),
seriesLegendVisible.keySet(),
@@ -624,7 +683,7 @@
// series is applied by the base-properties! why?)
Dataset dataset = JFreeChartUtil.getDatasetFrom(renderer);
int seriesCount = JFreeChartUtil.getSeriesCountFromDataset(dataset);
- for (int series=0; series<seriesCount; series++) {
+ for (int series=0; series<seriesCount; series++) {
if ( isDefaultItemLabelsVisible() != null )
renderer.setSeriesItemLabelsVisible(series, isDefaultItemLabelsVisible(), false);
if ( isDefaultShapesVisible() != null ) {
@@ -633,8 +692,10 @@
}
if ( getDefaultPaint() != null )
renderer.setSeriesPaint(series, getDefaultPaint(), false);
- if ( getDefaultLineWidth() != null ) {
- Stroke stroke = new BasicStroke( getDefaultLineWidth() );
+ if ( getDefaultLineWidth() != null || getDefaultLineDashAttibutes() != null ) {
+ float width = getDefaultLineWidth() == null ? 1.0f : getDefaultLineWidth();
+ float[] dashAttr = getDefaultLineDashAttibutes();
+ Stroke stroke = JFreeChartUtil.createDefaultStroke(width, dashAttr);
renderer.setSeriesStroke(series, stroke, false);
}
if ( isDefaultLegendVisible() != null )
@@ -671,8 +732,14 @@
if ( getSeriesPaint(series) != null )
renderer.setSeriesPaint(series, getSeriesPaint(series), false);
// Apply rendering stroke (line width)
- if ( getSeriesLineWidth(series) != null ) {
- Stroke stroke = new BasicStroke( getSeriesLineWidth(series) );
+ if ( getSeriesLineWidth(series) != null || getSeriesLineDashAttibutes(series) != null ) {
+ float width = getDefaultLineWidth() == null ? 1.0f : getDefaultLineWidth();
+ float[] dashAttr = getDefaultLineDashAttibutes();
+ if ( getSeriesLineWidth(series) != null )
+ width = getSeriesLineWidth(series);
+ if ( getSeriesLineDashAttibutes(series) != null )
+ dashAttr = getSeriesLineDashAttibutes(series);
+ Stroke stroke = JFreeChartUtil.createDefaultStroke(width, dashAttr);
renderer.setSeriesStroke(series, stroke, false);
}
// Apply legend visibility
Modified: trunk/src/schmitzm/jfree/chart/style/ChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/chart/style/ChartStyle.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/chart/style/ChartStyle.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -242,6 +242,6 @@
* @exception UnsupportedOperationException if the style can not be applied
* to the given dataset
*/
- public JFreeChart applyToDataset(Dataset dataset);
+ public JFreeChart applyToDataset(Dataset... dataset);
}
Modified: trunk/src/schmitzm/jfree/chart/style/ChartStyleXMLFactory.java
===================================================================
--- trunk/src/schmitzm/jfree/chart/style/ChartStyleXMLFactory.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/chart/style/ChartStyleXMLFactory.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -498,11 +498,11 @@
addLabelChildToElement(root, "desc", style.getDescStyle() );
// Axis
- if ( style.getAxisCount() > 0 )
+ if ( style.getAxisStyle(0) != null )
addAxisChildToElement(root, "domainAxis", style.getAxisStyle(0) );
- if ( style.getAxisCount() > 1 )
+ if ( style.getAxisStyle(1) != null )
addAxisChildToElement(root, "rangeAxis", style.getAxisStyle(1) );
- if ( style.getAxisCount() > 2 )
+ if ( style.getAxisStyle(2) != null )
addAxisChildToElement(root, "rangeAxis2", style.getAxisStyle(2) );
// Renderers
Modified: trunk/src/schmitzm/jfree/chart/style/PieChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/chart/style/PieChartStyle.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/chart/style/PieChartStyle.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -114,10 +114,12 @@
* @exception UnsupportedOperationException if the style can not be applied
* to the given dataset
*/
- public JFreeChart applyToDataset(Dataset dataset) {
- if ( !(dataset instanceof PieDataset) )
+ public JFreeChart applyToDataset(Dataset... dataset) {
+ if ( dataset.length > 1 )
+ LOGGER.warn("PieChart only supports one dataset. Secondary dataset will be ignored!");
+ if ( !(dataset[0] instanceof PieDataset) )
throw new UnsupportedOperationException(LangUtil.getSimpleClassName(this)+" can only be applied to PieDataset!");
- return applyToDataset((PieDataset)dataset);
+ return applyToDataset((PieDataset)dataset[0]);
}
/**
Modified: trunk/src/schmitzm/jfree/chart/style/ScatterChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/chart/style/ScatterChartStyle.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/chart/style/ScatterChartStyle.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -113,14 +113,16 @@
* to the given dataset
*/
@Override
- public JFreeChart applyToDataset(Dataset dataset) {
-
- if ( !(dataset instanceof XYDataset) )
+ public JFreeChart applyToDataset(Dataset... dataset) {
+ if ( dataset.length > 1 )
+ LOGGER.warn("ScatterChart only supports one dataset. Secondary dataset will be ignored!");
+
+ if ( !(dataset[0] instanceof XYDataset) )
throw new UnsupportedOperationException("ScatterChartStyle can only be applied to XYDataset: "+LangUtil.getSimpleClassName(dataset));
// create default scatter chart
JFreeChart chart = JFreeChartUtil.createRegressionChart(
- (XYDataset)dataset, "", "", "", isRegressionLineVisible()
+ (XYDataset)dataset[0], "", "", "", isRegressionLineVisible()
);
// apply style
Modified: trunk/src/schmitzm/jfree/feature/style/FeatureBasicChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/feature/style/FeatureBasicChartStyle.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/feature/style/FeatureBasicChartStyle.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -112,7 +112,7 @@
*/
@Override
public JFreeChart applyToFeatureCollection(FeatureCollection<SimpleFeatureType, SimpleFeature> fc) {
- Dataset dataset = FeatureChartUtil.createDataset(fc,this);
+ Dataset[] dataset = FeatureChartUtil.createDataset(fc,this);
return applyToDataset(dataset);
}
}
Modified: trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java
===================================================================
--- trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/feature/style/FeatureChartUtil.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -139,7 +139,9 @@
* In case of an non-numeric X attribute a {@link CategoryDataset} is created
* always. Otherwise the default is to create a {@link XYDataset}. The flag
* {@code forceCat} can be used to create {@link CategoryDataset} for numeric
- * X attributes.
+ * X attributes.<br><br>
+ * If the given style defines a secondary range axis for at least one
+ * attribute the method returns 2 datasets.
* @param fc a {@link FeatureCollection}
* @param forceCat forces a {@link CategoryDataset} also for numeric X
* attributes
@@ -149,7 +151,7 @@
* @param yAttr feature attribute(s) used for the Y-value (at least one; for
* each a series is created in the dataset)
*/
- public static Dataset createDataset(
+ public static Dataset[] createDataset(
FeatureCollection<SimpleFeatureType, SimpleFeature> fc,
FeatureChartStyle style) {
String xAttr = style.getAttributeName(0);
@@ -195,14 +197,15 @@
/**
* Creates a {@link XYDataset} for 2 (or more) attributes of a
* {@link FeatureCollection}. XYDateset can only be created for <b>numeric</b>
- * attributes.
+ * attributes. If the given style defines a secondary range axis for at least one
+ * attribute the method returns 2 datasets.
* @param fc a {@link FeatureCollection}
* @param style defines the attributes used to create the dataset from, as
* well as the sorting and normalization properties
* @throws IllegalArgumentException if less then 2 attributes are specified
* @throws UnsupportedOperationException if attributes are not numeric
*/
- public static XYSeriesCollection createXYDataset(
+ public static XYSeriesCollection[] createXYDataset(
FeatureCollection<SimpleFeatureType, SimpleFeature> fc,
FeatureChartStyle chartStyle) {
int attrCount = chartStyle.getAttributeCount();
@@ -232,12 +235,21 @@
HashMap<Comparable<?>, QuantileBin1D>[] statisticsForAggregation = new HashMap[attrCount];
for (int i = 1; i < attrCount; i++)
statisticsForAggregation[i] = new HashMap<Comparable<?>, QuantileBin1D>();
-
+
+ // determine the count of dataset, which must be created (one
+ // for each range axis)
+ int datasetCount = chartStyle.determineRangeAxisCount();
+
// Create a new dataset and insert the series
- XYSeriesCollection dataset = new XYSeriesCollection();
+ XYSeriesCollection[] datasets = new XYSeriesCollection[datasetCount];
+ for (int i=0; i<datasets.length; i++)
+ datasets[i] = new XYSeriesCollection();
+
+ // Initalize mapping between features and dataset
+ // TODO: mapping also necessary for secondary dataset!!
Feature2SeriesDatasetMapping mapping = new Feature2SeriesDatasetMapping(fc,
- dataset);
- dataset.setGroup(new FeatureDatasetMetaData(mapping));
+ datasets[0]);
+ datasets[0].setGroup(new FeatureDatasetMetaData(mapping));
// If dataset should be sorted, the features must be sorted first
// according to the domain attribute. The "autoSort" functionality
@@ -270,7 +282,7 @@
// Iterate the FeatureCollection and fill the dataset
try {
- int datasetIdx = 0;
+ int datasetIdx = 0; // index for the data item in the dataset
for (; fi.hasNext();) {
SimpleFeature f = fi.next();
// Determine X value (NULL not permitted for XYDateset!)
@@ -307,8 +319,11 @@
// Ignore feature if value is invalid
if (yValue == null)
continue;
+
+ // determine the dataset according to the axis
+ // the attribute should deal with
+ XYSeriesCollection dataset = determineDatasetForAttribute(chartStyle,attrIdx,datasets);
-
// Fill series, if no aggregation function is defined.
// Otherwise fill statistic (dataset is filled later!)
if (chartStyle.getAttributeAggregation(attrIdx) == null) {
@@ -332,7 +347,10 @@
}
// Mapping between FID and data index in series
- mapping.setMapping(f.getID(), yAttrName, datasetIdx++);
+ // TODO: currently only for primary dataset! But in the future also
+ // the items in the secondary dataset must be mapped!!
+ if ( dataset == datasets[0] )
+ mapping.setMapping(f.getID(), yAttrName, datasetIdx++);
} else {
QuantileBin1D aggrStat = statisticsForAggregation[attrIdx].get(xValue);
if (aggrStat == null) {
@@ -361,6 +379,7 @@
AggregationFunction aggrFunc = chartStyle.getAttributeAggregation(attrIdx);
if (aggrFunc == null)
continue;
+ XYSeriesCollection dataset = determineDatasetForAttribute(chartStyle,attrIdx,datasets);
for (Comparable<?> xValue : statisticsForAggregation[attrIdx].keySet()) {
QuantileBin1D aggrStat = statisticsForAggregation[attrIdx].get(xValue);
Number yValue = getAggregationResult(aggrFunc, aggrStat);
@@ -381,7 +400,7 @@
// datasetIdx++);
}
}
- return dataset;
+ return datasets;
}
/**
@@ -614,14 +633,15 @@
/**
* Creates a {@link CategoryDataset} for 2 (or more) attributes of a
* {@link FeatureCollection}. CategoryDataset can only be created for
- * <b>numeric</b> range attributes.
+ * <b>numeric</b> range attributes. If the given style defines a
+ * secondary range axis for at least one attribute the method returns 2 datasets.
* @param fc a {@link FeatureCollection}
* @param style defines the attributes used to create the dataset from, as
* well as the sorting and normalization properties
* @throws IllegalArgumentException if less then 2 attributes are specified
* @throws UnsupportedOperationException if attributes are not numeric
*/
- public static DefaultCategoryDataset createCategoryDataset(
+ public static DefaultCategoryDataset[] createCategoryDataset(
FeatureCollection<SimpleFeatureType, SimpleFeature> fc,
FeatureChartStyle chartStyle) {
int attrCount = chartStyle.getAttributeCount();
@@ -652,12 +672,21 @@
HashMap<Comparable<?>, QuantileBin1D>[] statisticsForAggregation = new HashMap[attrCount];
for (int i = 1; i < attrCount; i++)
statisticsForAggregation[i] = new HashMap<Comparable<?>, QuantileBin1D>();
+
+ // determine the count of dataset, which must be created (one
+ // for each range axis)
+ int datasetCount = chartStyle.determineRangeAxisCount();
- // Create a new dataset and insert the series
- DefaultCategoryDataset dataset = new DefaultCategoryDataset();
+ // Create a new dataset
+ DefaultCategoryDataset[] datasets = new DefaultCategoryDataset[datasetCount];
+ for (int i=0; i<datasets.length; i++)
+ datasets[i] = new DefaultCategoryDataset();
+
+ // Initalize mapping between features and dataset
+ // TODO: mapping also necessary for secondary dataset!!
Feature2CategoryDatasetMapping mapping = new Feature2CategoryDatasetMapping(
- fc, dataset);
- dataset.setGroup(new FeatureDatasetMetaData(mapping));
+ fc, datasets[0]);
+ datasets[0].setGroup(new FeatureDatasetMetaData(mapping));
// If dataset should be sorted, the features must be sorted first
// according to the domain attribute. CategoryDataset has no
@@ -715,6 +744,10 @@
if (yValue == null)
continue;
+ // determine the dataset according to the axis
+ // the attribute should deal with
+ DefaultCategoryDataset dataset = determineDatasetForAttribute(chartStyle,attrIdx,datasets);
+
// Fill series, if no aggregation function is defined.
// Otherwise fill statistic (dataset is filled later!)
if (chartStyle.getAttributeAggregation(attrIdx) == null) {
@@ -735,7 +768,10 @@
}
// Mapping between FID and data index in series
- mapping.setMapping(f.getID(), yAttrName, catValue);
+ // TODO: currently only for primary dataset! But in the future also
+ // the items in the secondary dataset must be mapped!!
+ if ( dataset == datasets[0] )
+ mapping.setMapping(f.getID(), yAttrName, catValue);
} else {
QuantileBin1D aggrStat = statisticsForAggregation[attrIdx].get(catValue);
if (aggrStat == null) {
@@ -763,6 +799,7 @@
AggregationFunction aggrFunc = chartStyle.getAttributeAggregation(attrIdx);
if (aggrFunc == null)
continue;
+ DefaultCategoryDataset dataset = determineDatasetForAttribute(chartStyle,attrIdx,datasets);
for (Comparable<?> catValue : statisticsForAggregation[attrIdx].keySet()) {
QuantileBin1D aggrStat = statisticsForAggregation[attrIdx].get(catValue);
Number yValue = getAggregationResult(aggrFunc, aggrStat);
@@ -782,7 +819,7 @@
}
}
- return dataset;
+ return datasets;
}
/**
@@ -1109,6 +1146,29 @@
}
/**
+ * Determines the dataset
+ * @param chartStyle the chart style which defines the attribute
+ * @param attrIdx the attribute for which the dataset should be
+ * determined
+ * @param datasets the available datasets
+ */
+ private static <D extends Dataset> D determineDatasetForAttribute(FeatureChartStyle chartStyle, int attrIdx, D[] datasets) {
+ int axis = chartStyle.getAttributeAxis(attrIdx);
+ int datasetIdx = 0;
+ switch ( axis ) {
+ case ChartStyle.RANGE_AXIS: // primary dataset
+ datasetIdx = 0;
+ break;
+ case ChartStyle.RANGE_AXIS2: // secondary dataset
+ datasetIdx = 1;
+ break;
+ default: // should not occur, but...
+ throw new UnsupportedOperationException("Unknown range axis: "+axis);
+ }
+
+ return datasets[datasetIdx];
+ }
+ /**
* Determines the range attribute value from a feature and transforms it
* according to the (optional) aggregation function or normalization.
* @param feature a feature
Modified: trunk/src/schmitzm/jfree/feature/style/FeatureScatterChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/feature/style/FeatureScatterChartStyle.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/feature/style/FeatureScatterChartStyle.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -118,7 +118,7 @@
*/
@Override
public JFreeChart applyToFeatureCollection(FeatureCollection<SimpleFeatureType, SimpleFeature> fc) {
- Dataset dataset = FeatureChartUtil.createDataset(fc,this);
+ Dataset[] dataset = FeatureChartUtil.createDataset(fc,this);
return applyToDataset(dataset);
}
}
Modified: trunk/src/schmitzm/jfree/table/style/TableBasicChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/table/style/TableBasicChartStyle.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/table/style/TableBasicChartStyle.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -137,7 +137,40 @@
dummyTableChartStyle.setAttributeName(idx,attrName);
}
+ /**
+ * Returns the axis an attribute deals with.
+ * @param idx attribute index (0=domain; 1=1st range series; 2=2nd range
+ * series; ...)
+ * @return always {@link ChartStyle#DOMAIN_AXIS} for domain axis; {@link ChartStyle#RANGE_AXIS}
+ * for all other attribute for which the axis is not set explicitly
+ */
+ @Override
+ public int getAttributeAxis(int idx) {
+ return dummyTableChartStyle.getAttributeAxis(idx);
+ }
+
+ /**
+ * Sets the axis an attribute deals with.<br>
+ * <b>Note:</b> Does nothing for the domain attribute (0), because
+ * the domain attribute always deals with the domain axis automatically!
+ * @param idx attribute index (0=domain; 1=1st range series; 2=2nd range
+ * series; ...)
+ * @param axis axis number ({@link ChartStyle#RANGE_AXIS}, {@link ChartStyle#RANGE_AXIS2})
+ * @exception IllegalArgumentException if an invalid axis is specified
+ */
+ @Override
+ public void setAttributeAxis(int idx, Integer axis) {
+ dummyTableChartStyle.setAttributeAxis(idx, axis);
+ }
+ /**
+ * Checks how many range axis are defined by the attributes.
+ */
+ @Override
+ public int determineRangeAxisCount() {
+ return dummyTableChartStyle.determineRangeAxisCount();
+ }
+
/**
* Sets whether the table rows are sorted according to the
* domain attribute (before creating a {@link Dataset}).
Modified: trunk/src/schmitzm/jfree/table/style/TableChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/table/style/TableChartStyle.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/table/style/TableChartStyle.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -94,6 +94,31 @@
public void setAttributeName(int idx, String attrName);
/**
+ * Returns the axis an attribute deals with.
+ * @param idx attribute index (0=domain; 1=1st range series; 2=2nd range
+ * series; ...)
+ * @return always {@link ChartStyle#DOMAIN_AXIS} for domain axis; {@link ChartStyle#RANGE_AXIS}
+ * for all other attribute for which the axis is not set explicitly
+ */
+ public int getAttributeAxis(int idx);
+
+ /**
+ * Sets the axis an attribute deals with.<br>
+ * <b>Note:</b> Does nothing for the domain attribute (0), because
+ * the domain attribute always deals with the domain axis automatically!
+ * @param idx attribute index (0=domain; 1=1st range series; 2=2nd range
+ * series; ...)
+ * @param axis axis number ({@link ChartStyle#RANGE_AXIS}, {@link ChartStyle#RANGE_AXIS2})
+ * @exception IllegalArgumentException if an invalid axis is specified
+ */
+ public void setAttributeAxis(int idx, Integer axis);
+
+ /**
+ * Checks how many range axis are defined by the attributes.
+ */
+ public int determineRangeAxisCount();
+
+ /**
* Sets whether the table rows are sorted according to the domain attribute
* (before creating a {@link Dataset}).
*/
@@ -400,6 +425,11 @@
protected Map<Integer, String> attrNames = new HashMap<Integer, String>();
/**
+ * Holds the axis the (range) attributes should deal with.
+ */
+ protected Map<Integer, Integer> attrAxis = new HashMap<Integer, Integer>();
+
+ /**
* Indicates for each attribute whether the attribute data is normalized
* (before creating a {@link Dataset}).
*/
@@ -475,6 +505,7 @@
*/
private void updateAttributeCount() {
maxAttrIdx = LangUtil.max(attrNames.keySet(),
+ attrAxis.keySet(),
normalizeAttr.keySet(),
noDataValues.keySet(),
aggrFuncs.keySet(),
@@ -505,6 +536,7 @@
int maxIdx = getAttributeCount() - 1;
for (int i = idx; i < maxIdx; i++) {
this.attrNames.put(i, this.attrNames.get(i + 1));
+ this.attrAxis.put(i, this.attrAxis.get(i + 1));
this.normalizeAttr.put(i, this.normalizeAttr.get(i + 1));
this.noDataValues.put(i, this.noDataValues.get(i + 1));
}
@@ -512,6 +544,7 @@
// delete the last attribute, because now is is stored
// one position forward
this.attrNames.remove(maxIdx);
+ this.attrAxis.remove(maxIdx);
this.normalizeAttr.remove(maxIdx);
this.noDataValues.remove(maxIdx);
@@ -556,6 +589,7 @@
int max = destFCS.getMaxAttributeCount();
for (int i = 0; i < max; i++) {
destFCS.setAttributeName(i, null);
+ destFCS.setAttributeAxis(i, null);
destFCS.setAttributeNormalized(i, null);
destFCS.setAttributeAggregation(i, null);
destFCS.setAttributeAggregationWeightAttributeName(i, null);
@@ -567,6 +601,9 @@
for (Integer idx : attrNames.keySet())
if (getAttributeName(idx) != null)
destFCS.setAttributeName(idx, getAttributeName(idx));
+ for (Integer idx : attrAxis.keySet())
+ if (attrAxis.get(idx) != null)
+ destFCS.setAttributeAxis(idx, getAttributeAxis(idx));
for (Integer idx : normalizeAttr.keySet())
if (isAttributeNormalized(idx))
destFCS.setAttributeNormalized(idx, isAttributeNormalized(idx));
@@ -630,6 +667,60 @@
}
/**
+ * Returns the axis an attribute deals with.
+ * @param idx attribute index (0=domain; 1=1st range series; 2=2nd range
+ * series; ...)
+ * @return always {@link ChartStyle#DOMAIN_AXIS} for domain axis; {@link ChartStyle#RANGE_AXIS}
+ * for all other attribute for which the axis is not set explicitly
+ */
+ @Override
+ public int getAttributeAxis(int idx) {
+ // the domain attribute always deals with the domain axis!
+ if ( idx == 0 )
+ return ChartStyle.DOMAIN_AXIS;
+
+ Integer axis = attrAxis.get(idx);
+ // if axis is not set explicitly, the attribute deals
+ // with the primary range axis
+ if ( axis == null )
+ return ChartStyle.RANGE_AXIS;
+
+ return axis;
+ }
+
+ /**
+ * Sets the axis an attribute deals with.<br>
+ * <b>Note:</b> Does nothing for the domain attribute (0), because
+ * the domain attribute always deals with the domain axis automatically!
+ * @param idx attribute index (0=domain; 1=1st range series; 2=2nd range
+ * series; ...)
+ * @param axis axis number ({@link ChartStyle#RANGE_AXIS}, {@link ChartStyle#RANGE_AXIS2})
+ * @exception IllegalArgumentException if an invalid axis is specified
+ */
+ @Override
+ public void setAttributeAxis(int idx, Integer axis) {
+ if ( idx == 0 )
+ return;
+ if ( axis != null &&
+ axis != ChartStyle.RANGE_AXIS &&
+ axis != ChartStyle.RANGE_AXIS2 )
+ throw new IllegalArgumentException("Only ChartStyle.RANGE_AXIS and ChartStyle.RANGE_AXIS2 allowed for axis: "+axis);
+
+ attrAxis.put(idx, axis);
+ }
+
+ /**
+ * Checks how many range axis are defined by the attributes.
+ */
+ @Override
+ public int determineRangeAxisCount() {
+ int axisCount = 0;
+ for (int i=0; i<getAttributeCount(); i++)
+ axisCount = Math.max(axisCount, getAttributeAxis(i));
+ return axisCount;
+ }
+
+ /**
* Sets whether the table rows are sorted according to the domain attribute
* (before creating a {@link Dataset}).
*/
@@ -1044,7 +1135,7 @@
* because the dummy can not provide this functionality.
*/
@Override
- public JFreeChart applyToDataset(Dataset dataset) {
+ public JFreeChart applyToDataset(Dataset... dataset) {
throw new UnsupportedOperationException(
"TableChartStyle.Dummy does not implement applyToDataset(..)");
}
Modified: trunk/src/schmitzm/jfree/table/style/TableChartStyleXMLFactory.java
===================================================================
--- trunk/src/schmitzm/jfree/table/style/TableChartStyleXMLFactory.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/table/style/TableChartStyleXMLFactory.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -61,7 +61,7 @@
// Apply the normal style properties
super.applyStyleFromXML(chartStyle, element);
- // Convert ChartAxisStyle to ChartAxisStyle
+ // Convert ChartAxisStyle to TableChartAxisStyle
for (int i=0; i<chartStyle.getAxisCount(); i++) {
ChartAxisStyle axisStyle = chartStyle.getAxisStyle(i);
if ( axisStyle != null ) {
Modified: trunk/src/schmitzm/jfree/table/style/TableScatterChartStyle.java
===================================================================
--- trunk/src/schmitzm/jfree/table/style/TableScatterChartStyle.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/jfree/table/style/TableScatterChartStyle.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -152,6 +152,40 @@
}
/**
+ * Returns the axis an attribute deals with.
+ * @param idx attribute index (0=domain; 1=1st range series; 2=2nd range
+ * series; ...)
+ * @return always {@link ChartStyle#DOMAIN_AXIS} for domain axis; {@link ChartStyle#RANGE_AXIS}
+ * for all other attribute for which the axis is not set explicitly
+ */
+ @Override
+ public int getAttributeAxis(int idx) {
+ return dummyTableChartStyle.getAttributeAxis(idx);
+ }
+
+ /**
+ * Sets the axis an attribute deals with.<br>
+ * <b>Note:</b> Does nothing for the domain attribute (0), because
+ * the domain attribute always deals with the domain axis automatically!
+ * @param idx attribute index (0=domain; 1=1st range series; 2=2nd range
+ * series; ...)
+ * @param axis axis number ({@link ChartStyle#RANGE_AXIS}, {@link ChartStyle#RANGE_AXIS2})
+ * @exception IllegalArgumentException if an invalid axis is specified
+ */
+ @Override
+ public void setAttributeAxis(int idx, Integer axis) {
+ dummyTableChartStyle.setAttributeAxis(idx, axis);
+ }
+
+ /**
+ * Checks how many range axis are defined by the attributes.
+ */
+ @Override
+ public int determineRangeAxisCount() {
+ return dummyTableChartStyle.determineRangeAxisCount();
+ }
+
+ /**
* Sets whether the table rows are sorted according to the
* domain attribute (before creating a {@link Dataset}).
*/
Modified: trunk/src/schmitzm/lang/LangUtil.java
===================================================================
--- trunk/src/schmitzm/lang/LangUtil.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src/schmitzm/lang/LangUtil.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -490,6 +490,9 @@
*/
public static <T> T[] cloneArray(T[] source, boolean replNull,
T... replElem) {
+ if ( source == null )
+ return null;
+
T[] newArray = java.util.Arrays.copyOf(source, Math.max(source.length,
replElem.length));
for (int i = 0; i < replElem.length; i++)
@@ -524,6 +527,9 @@
* @return Array von der Groesse {@code max(source.length, replElem.length)}
*/
public static long[] cloneArray(long[] source, long... replElem) {
+ if ( source == null )
+ return null;
+
long[] newArray = java.util.Arrays.copyOf(source, Math.max(
source.length, replElem.length));
for (int i = 0; i < replElem.length; i++)
@@ -542,6 +548,9 @@
* @return Array von der Groesse {@code max(source.length, replElem.length)}
*/
public static int[] cloneArray(int[] source, int... replElem) {
+ if ( source == null )
+ return null;
+
int[] newArray = java.util.Arrays.copyOf(source, Math.max(
source.length, replElem.length));
for (int i = 0; i < replElem.length; i++)
@@ -560,6 +569,9 @@
* @return Array von der Groesse {@code max(source.length, replElem.length)}
*/
public static short[] cloneArray(short[] source, short... replElem) {
+ if ( source == null )
+ return null;
+
short[] newArray = java.util.Arrays.copyOf(source, Math.max(
source.length, replElem.length));
for (int i = 0; i < replElem.length; i++)
@@ -578,11 +590,13 @@
* @return Array von der Groesse {@code max(source.length, replElem.length)}
*/
public static byte[] cloneArray(byte[] source, byte... replElem) {
- byte[] newArray = java.util.Arrays.copyOf(source, Math.max(
- source.length, replElem.length));
- for (int i = 0; i < replElem.length; i++)
- newArray[i] = replElem[i];
- return newArray;
+ if ( source == null )
+ return null;
+ byte[] newArray = java.util.Arrays.copyOf(source, Math.max(
+ source.length, replElem.length));
+ for (int i = 0; i < replElem.length; i++)
+ newArray[i] = replElem[i];
+ return newArray;
}
/**
@@ -596,7 +610,10 @@
* @return Array von der Groesse {@code max(source.length, replElem.length)}
*/
public static double[] cloneArray(double[] source, double... replElem) {
- double[] newArray = java.util.Arrays.copyOf(source, Math.max(
+ if ( source == null )
+ return null;
+
+ double[] newArray = java.util.Arrays.copyOf(source, Math.max(
source.length, replElem.length));
for (int i = 0; i < replElem.length; i++)
newArray[i] = replElem[i];
@@ -614,6 +631,9 @@
* @return Array von der Groesse {@code max(source.length, replElem.length)}
*/
public static float[] cloneArray(float[] source, float... replElem) {
+ if ( source == null )
+ return null;
+
float[] newArray = java.util.Arrays.copyOf(source, Math.max(
source.length, replElem.length));
for (int i = 0; i < replElem.length; i++)
@@ -632,6 +652,8 @@
* @return Array von der Groesse {@code max(source.length, replElem.length)}
*/
public static boolean[] cloneArray(boolean[] source, boolean... replElem) {
+ if ( source == null )
+ return null;
boolean[] newArray = java.util.Arrays.copyOf(source, Math.max(
source.length, replElem.length));
for (int i = 0; i < replElem.length; i++)
@@ -650,6 +672,8 @@
* @return Array von der Groesse {@code max(source.length, replElem.length)}
*/
public static char[] cloneArray(char[] source, char... replElem) {
+ if ( source == null )
+ return null;
char[] newArray = java.util.Arrays.copyOf(source, Math.max(
source.length, replElem.length));
for (int i = 0; i < replElem.length; i++)
Modified: trunk/src_junit/schmitzm/jfree/feature/style/FeatureChartStyleTest.java
===================================================================
--- trunk/src_junit/schmitzm/jfree/feature/style/FeatureChartStyleTest.java 2010-07-28 10:43:46 UTC (rev 950)
+++ trunk/src_junit/schmitzm/jfree/feature/style/FeatureChartStyleTest.java 2010-07-28 17:45:56 UTC (rev 951)
@@ -29,6 +29,7 @@
import org.jfree.chart.axis.ValueTick;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.TextAnchor;
+import org.junit.Ignore;
import org.junit.Test;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
@@ -38,6 +39,7 @@
import schmitzm.jfree.chart.style.ChartAxisStyle;
import schmitzm.jfree.chart.style.ChartLabelStyle;
import schmitzm.jfree.chart.style.ChartRendererStyle;
+import schmitzm.jfree.chart.style.ChartStyle;
import schmitzm.jfree.chart.style.ChartType;
import schmitzm.jfree.table.AggregationFunction;
@@ -93,10 +95,11 @@
lineChartStyle.setAttributeName(0, domainAttribName);
lineChartStyle.setAttributeName(1, variablenAttribName);
lineChartStyle.setAttributeName(2, variablenAttribName2);
+ lineChartStyle.setAttributeAxis(2, ChartStyle.RANGE_AXIS2);
lineChartStyle.setSeriesAttributeName(groupAttribName);
- lineChartStyle.setSeriesLegendTitleAttributeName(labelAttribName);
+ //lineChartStyle.setSeriesLegendTitleAttributeName(labelAttribName);
assertNull("Wenn nicht explizit gesetzt wird null geliefert",
lineChartStyle.getRendererStyle(0));
@@ -112,6 +115,13 @@
assertEquals(3, chartRendererStyle.getSeriesCount());
+ // Renderer style for the series dealing with the
+ // secondary axis.
+ ChartRendererStyle chartRendererStyle2 = new ChartRendererStyle();
+ chartRendererStyle2.setDefaultLineDashAttributes(5.0f,5.0f);
+ lineChartStyle.setRendererStyle(1, chartRendererStyle2);
+
+
JFreeChart lineChart = lineChartStyle
.applyToFeatureCollection(testFeatures);
assertNotNull("applyToFeatureCollection lieferte null!", lineChart);
@@ -171,6 +181,7 @@
boolean INTERACTIVE = !GraphicsEnvironment.isHeadless();
@Test
+ @Ignore
public void testBarChartSortedSeries() throws IOException,
InterruptedException {
@@ -236,6 +247,7 @@
}
@Test
+ @Ignore
public void saveAndLoadWeightedChart() throws IOException {
FeatureBasicChartStyle weightChartStyle = new FeatureBasicChartStyle(
"testLineChart", ChartType.BAR);
@@ -279,6 +291,7 @@
}
@Test
+ @Ignore
public void testBarChartForcedCategories() throws IOException,
InterruptedException {
@@ -357,6 +370,7 @@
}
@Test
+ @Ignore
public void testLineChartAsCategories() throws IOException, CQLException,
InterruptedException {
@@ -482,6 +496,7 @@
}
@Test
+ @Ignore
public void testLineChartNOTCategories() throws IOException, CQLException,
InterruptedException {
More information about the Schmitzm-commits
mailing list