/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License, version 2 as published by the Free Software * Foundation. * * You should have received a copy of the GNU General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.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 General Public License for more details. * * * Copyright 2006 - 2013 Pentaho Corporation. All rights reserved. */ package org.pentaho.platform.uifoundation.chart; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Node; import org.jfree.chart.plot.DialShape; import org.jfree.chart.plot.MeterInterval; import org.jfree.data.Range; import org.jfree.ui.RectangleEdge; import org.pentaho.commons.connection.DataUtilities; import org.pentaho.commons.connection.IPentahoResultSet; import org.pentaho.commons.connection.PentahoDataTransmuter; import org.pentaho.platform.api.engine.IPentahoSession; import org.pentaho.platform.uifoundation.messages.Messages; import org.pentaho.platform.util.messages.LocaleHelper; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Image; import java.awt.Paint; import java.awt.Stroke; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * This class represents the definition of a dashboard dial. It holds: * <ul> * <li>The value to be displayed on the dial</li> * <li>Minimum value of the dial</li> * <li>Maximum value of the dial</li> * <li>A list of intervals with the dial. Each interval specifies a minimum, maximum and information about how the * interval should be painted.</li> * <li>Painting information * <ul> * <li>Background paint</li> * <li>Dial paint</li> * <li>Needle paint</li> * </ul> * </ul> * * <p/> * This class does not generate an image of the dial, it just defines the properties of the dial. * <p/> * Dial definitions are stored in xml documents in the solution folders with *.dial.xml extensions. These * definition files store XML representations of all the settings here. Typically the value to be displayed is * provided at runtime by a query or business rule, but the value can also read from the definition file. * <p/> * The definitions are read by org.pentaho.core.ui.component.DashboardWidgetComponent objects, which create * instances of this object and set the properties defined here. * <p/> * The DashboardWidgetComponent objects pass this, now populated, object to * * The dial image is generated by {@link org.pentaho.core.ui.component.JFreeChartEngine} * <p/> * * Example Dial <br/> * <img src="doc-files/DialWidgetDefinition-1.png"> */ public class DialWidgetDefinition extends WidgetDefinition implements ChartDefinition { private static final long serialVersionUID = 2232742163326878608L; private final ArrayList intervals = new ArrayList(); private final RectangleEdge titlePosition = RectangleEdge.TOP; private Paint chartBackgroundPaint = Color.WHITE; private Paint plotBackgroundPaint = Color.GRAY; private Paint needlePaint = Color.blue; private DialShape dialShape = DialShape.CHORD; private Font titleFont; private final List subTitles = new ArrayList(); private boolean rangeLimited; private int tickSize = 5; private Paint tickPaint = Color.blue; private Paint valuePaint = Color.BLUE; private Font valueFont; private String units; private Font legendFont = null; private boolean legendBorderVisible = true; private RectangleEdge legendPosition = RectangleEdge.BOTTOM; private Node attributes = null; private Float backgroundAlpha; private Float foregroundAlpha; // private IPentahoSession session; public DialWidgetDefinition( final double value, final double minimum, final double maximum, final boolean rangeLimited ) { super( value, minimum, maximum ); this.rangeLimited = rangeLimited; } /** * TODO PROBLEM HERE! If you use this constructor, the XML schema for the chart attributes is different than if * you use the constructor with the arguments public DialWidgetDefinition( Document document, double value, int * width, int height, IPentahoSession session). This constructor expects the chart attribute nodes to be children * of the <chart-attributes> node, whereas the latter constructor expects the attributes to be children of a * <dial> node. This does not help us with our parity situation, and should be deprecated and reconciled. * * @param data * @param byRow * @param chartAttributes * @param width * @param height * @param session */ public DialWidgetDefinition( final IPentahoResultSet data, final boolean byRow, final Node chartAttributes, final int width, final int height, final IPentahoSession session ) { this( 0.0, Double.MIN_VALUE, Double.MAX_VALUE, false ); attributes = chartAttributes; if ( data != null ) { if ( byRow ) { setDataByRow( data ); } else { setDataByColumn( data ); } } // set legend font setLegendFont( chartAttributes.selectSingleNode( ChartDefinition.LEGEND_FONT_NODE_NAME ) ); // set legend border visible setLegendBorderVisible( chartAttributes.selectSingleNode( ChartDefinition.DISPLAY_LEGEND_BORDER_NODE_NAME ) ); // set the alfa layers Node backgroundAlphaNode = chartAttributes.selectSingleNode( ChartDefinition.BACKGROUND_ALPHA_NODE_NAME ); Node foregroundAlphaNode = chartAttributes.selectSingleNode( ChartDefinition.FOREGROUND_ALPHA_NODE_NAME ); if ( backgroundAlphaNode != null ) { setBackgroundAlpha( chartAttributes.selectSingleNode( ChartDefinition.BACKGROUND_ALPHA_NODE_NAME ) ); } if ( foregroundAlphaNode != null ) { setForegroundAlpha( chartAttributes.selectSingleNode( ChartDefinition.FOREGROUND_ALPHA_NODE_NAME ) ); } DialWidgetDefinition.createDial( this, chartAttributes, width, height, session ); } /** * TODO: PROBLEM HERE! See the note on the constructor above. * * @param document * @param value * @param width * @param height * @param session */ public DialWidgetDefinition( final Document document, final double value, final int width, final int height, final IPentahoSession session ) { this( value, Double.MIN_VALUE, Double.MAX_VALUE, false ); // get the dial node from the document attributes = document.selectSingleNode( "//dial" ); //$NON-NLS-1$ deriveMinMax( value ); // create the dial definition object DialWidgetDefinition.createDial( this, attributes, width, height, session ); } public static Log getLogger() { return LogFactory.getLog( DialWidgetDefinition.class ); } /* * public ThermometerWidgetDefinition createThermometer( Document doc ) { // TODO implement this to return a * ThermometerWidgetDefinition object return null; } */ /** * Create a dial definition object from an XML document * * @param doc * definition XML document * @return Dial definition object */ public static void createDial( final DialWidgetDefinition widgetDefinition, final Node dialNode, final int width, final int height, final IPentahoSession session ) { Node node = dialNode.selectSingleNode( "units" ); //$NON-NLS-1$ if ( node != null ) { String units = node.getText(); widgetDefinition.setUnits( units ); } // set the background Paint Paint paint = JFreeChartEngine.getPaint( dialNode.selectSingleNode( "background-color" ) ); //$NON-NLS-1$ if ( paint == null ) { Element backgroundNode = (Element) dialNode.selectSingleNode( "chart-background" ); //$NON-NLS-1$ if ( backgroundNode != null ) { String backgroundType = backgroundNode.attributeValue( "type" ); //$NON-NLS-1$ if ( "texture".equals( backgroundType ) ) { //$NON-NLS-1$ paint = JFreeChartEngine.getTexturePaint( backgroundNode, width, height, session ); } else if ( "gradient".equals( backgroundType ) ) { //$NON-NLS-1$ paint = JFreeChartEngine.getGradientPaint( backgroundNode, width, height ); } } } else { // log a deprecation warning for background-color ... DialWidgetDefinition.getLogger().warn( Messages.getInstance().getString( "CHART.WARN_DEPRECATED_PROPERTY", "background-color", "chart-background" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ DialWidgetDefinition.getLogger().warn( Messages.getInstance().getString( "CHART.WARN_PROPERTY_WILL_NOT_VALIDATE", "background-color" ) ); //$NON-NLS-1$ //$NON-NLS-2$ } if ( paint != null ) { widgetDefinition.setChartBackgroundPaint( paint ); } // set the dial background Paint paint = JFreeChartEngine.getPaint( dialNode.selectSingleNode( "plot-background-color" ) ); //$NON-NLS-1$ if ( paint == null ) { Element backgroundNode = (Element) dialNode.selectSingleNode( "plot-background" ); //$NON-NLS-1$ if ( backgroundNode != null ) { String backgroundType = backgroundNode.attributeValue( "type" ); //$NON-NLS-1$ if ( "texture".equals( backgroundType ) ) { //$NON-NLS-1$ paint = JFreeChartEngine.getTexturePaint( backgroundNode, width, height, session ); } else if ( "gradient".equals( backgroundType ) ) { //$NON-NLS-1$ paint = JFreeChartEngine.getGradientPaint( backgroundNode, width, height ); } } } else { // log a deprecation warning for plot-background-color ... DialWidgetDefinition.getLogger().warn( Messages.getInstance().getString( "CHART.WARN_DEPRECATED_PROPERTY", "plot-background-color", "plot-background" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ DialWidgetDefinition.getLogger().warn( Messages.getInstance().getString( "CHART.WARN_PROPERTY_WILL_NOT_VALIDATE", "plot-background-color" ) ); //$NON-NLS-1$ //$NON-NLS-2$ } if ( paint != null ) { widgetDefinition.setPlotBackgroundPaint( paint ); } // set the needle Paint paint = JFreeChartEngine.getPaint( dialNode.selectSingleNode( "needle-color" ) ); //$NON-NLS-1$ if ( paint != null ) { widgetDefinition.setNeedlePaint( paint ); } // set the tick Paint paint = JFreeChartEngine.getPaint( dialNode.selectSingleNode( "tick-color" ) ); //$NON-NLS-1$ if ( paint != null ) { widgetDefinition.setTickPaint( paint ); } Node tmpNode = dialNode.selectSingleNode( "tick-interval" ); //$NON-NLS-1$ if ( tmpNode != null ) { widgetDefinition.setTickSize( Integer.parseInt( dialNode.selectSingleNode( "tick-interval" ).getText() ) ); //$NON-NLS-1$ } // set the value Paint paint = JFreeChartEngine.getPaint( dialNode.selectSingleNode( "value-color" ) ); //$NON-NLS-1$ if ( paint != null ) { widgetDefinition.setValuePaint( paint ); } // TODO get this from the XML document widgetDefinition.setDialShape( DialShape.CHORD ); Node titleFontNode = dialNode.selectSingleNode( "title-font" ); //$NON-NLS-1$ if ( titleFontNode != null ) { Node fontNode = titleFontNode.selectSingleNode( "font" ); //$NON-NLS-1$ if ( fontNode != null ) { String titleFontStr = fontNode.getText().trim(); if ( !"".equals( titleFontStr ) ) { //$NON-NLS-1$ Node titleFontSizeNode = titleFontNode.selectSingleNode( "size" ); //$NON-NLS-1$ int size = titleFontSizeNode != null ? Integer.parseInt( titleFontSizeNode.getText() ) : 12; widgetDefinition.setTitleFont( new Font( titleFontStr, Font.BOLD, size ) ); } } else { String titleFontStr = titleFontNode.getText().trim(); if ( !"".equals( titleFontStr ) ) { //$NON-NLS-1$ widgetDefinition.setTitleFont( new Font( titleFontStr, Font.ITALIC, 24 ) ); } } } Node valueFontNode = dialNode.selectSingleNode( "domain-tick-font" ); //$NON-NLS-1$ if ( valueFontNode != null ) { Node fontNode = valueFontNode.selectSingleNode( "font" ); //$NON-NLS-1$ if ( fontNode != null ) { String fontStr = fontNode.getText().trim(); if ( !"".equals( fontStr ) ) { //$NON-NLS-1$ Node valueFontSizeNode = valueFontNode.selectSingleNode( "size" ); //$NON-NLS-1$ int size = valueFontSizeNode != null ? Integer.parseInt( valueFontSizeNode.getText() ) : 12; widgetDefinition.setValueFont( new Font( fontStr, Font.BOLD, size ) ); } } else { String fontStr = valueFontNode.getText().trim(); if ( !"".equals( fontStr ) ) { //$NON-NLS-1$ widgetDefinition.setValueFont( new Font( fontStr, Font.ITALIC, 24 ) ); } } } // set any intervals that are defined in the document // A list of interval nodes should not be allowed to exist as a child of the main XML element (for XML schema // to // be well constructed and validate the XML . // We have deprecated <interval> as a child of the main node , and now require an <intervals> parent node // under which <intervals> can exist. List intervals = dialNode.selectNodes( "interval" ); //$NON-NLS-1$ if ( ( intervals == null ) || ( intervals.isEmpty() ) ) { Node intervalsNode = dialNode.selectSingleNode( "intervals" ); //$NON-NLS-1$ if ( intervalsNode != null ) { intervals = intervalsNode.selectNodes( "interval" ); //$NON-NLS-1$ } } else { // log a deprecation warning for this property... DialWidgetDefinition.getLogger().warn( Messages.getInstance().getString( "CHART.WARN_DEPRECATED_CHILD", "interval", "intervals" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ DialWidgetDefinition.getLogger().warn( Messages.getInstance().getString( "CHART.WARN_PROPERTY_WILL_NOT_VALIDATE", "interval" ) ); //$NON-NLS-1$ //$NON-NLS-2$ } if ( intervals != null ) { Iterator intervalIterator = intervals.iterator(); while ( intervalIterator.hasNext() ) { // get the interval node Node intervalNode = (Node) intervalIterator.next(); // get the interval name String label = intervalNode.selectSingleNode( "label" ).getText(); //$NON-NLS-1$ // get the range of the interval double minimum = Double.parseDouble( intervalNode.selectSingleNode( "minimum" ).getText() ); //$NON-NLS-1$ double maximum = Double.parseDouble( intervalNode.selectSingleNode( "maximum" ).getText() ); //$NON-NLS-1$ Range range = new Range( minimum, maximum ); Paint backgroundPaint = JFreeChartEngine.getPaint( intervalNode.selectSingleNode( "color" ) ); //$NON-NLS-1$ if ( backgroundPaint == null ) { Element backgroundNode = (Element) intervalNode.selectSingleNode( "interval-background" ); //$NON-NLS-1$ if ( backgroundNode != null ) { String backgroundType = backgroundNode.attributeValue( "type" ); //$NON-NLS-1$ if ( "texture".equals( backgroundType ) ) { //$NON-NLS-1$ backgroundPaint = JFreeChartEngine.getTexturePaint( backgroundNode, width, height, session ); } else if ( "gradient".equals( backgroundType ) ) { //$NON-NLS-1$ backgroundPaint = JFreeChartEngine.getGradientPaint( backgroundNode, width, height ); } } } // get the text color of the interval String textColor = intervalNode.selectSingleNode( "text-color" ).getText(); //$NON-NLS-1$ Stroke outlineStroke; if ( intervalNode.selectSingleNode( "stroke-width" ) != null ) { //$NON-NLS-1$ outlineStroke = new BasicStroke( Float.parseFloat( intervalNode.selectSingleNode( "stroke-width" ).getText() ) ); //$NON-NLS-1$ } else { outlineStroke = new BasicStroke(); } Paint outlinePaint = JFreeChartEngine.getPaint( textColor ); // create the interval object MeterInterval interval = new MeterInterval( label, range, outlinePaint, outlineStroke, backgroundPaint ); // add the interval to the widget widgetDefinition.addInterval( interval ); } } // get the chart subtitles // A list of <subtitle> nodes should not be allowed to exist as a child of the main XML element (for XML schema // to // be well constructed and validate the XML . // We have deprecated <subtitle> as a child of the main node , and now require a <subtitles> parent node // under which <subtitle> can exist. List subtitles = dialNode.selectNodes( ChartDefinition.SUBTITLE_NODE_NAME ); if ( ( subtitles == null ) || ( subtitles.isEmpty() ) ) { Node subTitlesNode = dialNode.selectSingleNode( ChartDefinition.SUBTITLES_NODE_NAME ); if ( subTitlesNode != null ) { subtitles = subTitlesNode.selectNodes( ChartDefinition.SUBTITLE_NODE_NAME ); } } else { // log a deprecation warning for this property... DialWidgetDefinition.getLogger().warn( Messages.getInstance().getString( "CHART.WARN_DEPRECATED_CHILD", ChartDefinition.SUBTITLE_NODE_NAME, ChartDefinition.SUBTITLES_NODE_NAME ) ); //$NON-NLS-1$ DialWidgetDefinition.getLogger().warn( Messages.getInstance() .getString( "CHART.WARN_PROPERTY_WILL_NOT_VALIDATE", ChartDefinition.SUBTITLE_NODE_NAME ) ); //$NON-NLS-1$ } if ( subtitles != null ) { widgetDefinition.addSubTitles( subtitles ); } } public void setUnits( final String units ) { this.units = units; } public String getUnits() { return units; } private void setDataByColumn( final IPentahoResultSet data ) { setDataByRow( PentahoDataTransmuter.pivot( data ) ); } private void setDataByRow( final IPentahoResultSet data ) { if ( data == null ) { noDataMessage = Messages.getInstance().getString( "CHART.USER_NO_DATA_AVAILABLE" ); //$NON-NLS-1$ return; } Object[] rowData = data.next(); List<Number> numericRowData = DataUtilities.toNumbers( rowData, LocaleHelper.getNumberFormat(), LocaleHelper.getCurrencyFormat() ); double newValue = numericRowData.get( 0 ).doubleValue(); // Do we have a value, minimum and maximum? if ( rowData.length >= 3 ) { this.setMinimum( numericRowData.get( 1 ).doubleValue() ); this.setMaximum( numericRowData.get( 2 ).doubleValue() ); } else { deriveMinMax( newValue ); } this.setValue( newValue ); } public void deriveMinMax( final double value ) { double min = 0; double max = 100; Node node = attributes.selectSingleNode( "range-limited" ); //$NON-NLS-1$ rangeLimited = ( node == null ) || ( "true".equalsIgnoreCase( node.getText() ) ); //$NON-NLS-1$ max = 0.1; double absValue = Math.abs( value ); // based on the current value, to to select some sensible min and // max values while ( max < absValue ) { max *= 2; if ( max < absValue ) { min *= 2.5; max *= 2.5; } if ( max < absValue ) { min *= 2; max *= 2; } } if ( value > 0 ) { min = 0; } else { min = -max; } setMaximum( max ); setMinimum( min ); } /** * Add an interval (MeterInterval) to the dial definition. The interval defines a range and how it should be * painted. * <p/> * The dial images here have three intervals. The lowest interval has a minimum of 0 and a maximum of 30. * <p/> * Intervals have a color. In this image the lowest interval color is set to red. <br/> * <img src="doc-files/DialWidgetDefinition-5.png"> * <p/> * Intervals have a text color. In this image the lowest interval text color is set to red. This affects the * outer rim, the interval value text <br/> * <img src="doc-files/DialWidgetDefinition-6.png"> * * @param interval * A MeterInterval that defines an interval (range) on the dial */ public void addInterval( final MeterInterval interval ) { intervals.add( interval ); Range range = interval.getRange(); double min = range.getLowerBound(); double max = range.getUpperBound(); if ( rangeLimited && ( intervals.size() == 1 ) ) { setMinimum( min ); setMaximum( max ); } else { if ( min < getMinimum() ) { setMinimum( min ); } if ( max > getMaximum() ) { setMaximum( max ); } } } /** * Sets the value to be displayed on the dial image * * @param value * The value to be displayed */ public void setValue( final double value ) { setValue( new Double( value ) ); if ( rangeLimited ) { if ( value < getMinimum() ) { setValue( getMinimum() ); } else if ( value > getMaximum() ) { setValue( getMaximum() ); } } else { if ( value < getMinimum() ) { setMinimum( value ); } else if ( value > getMaximum() ) { setMaximum( value ); } } } /** * Return the java.awt.Paint object to be used to paint the backound of the dial. * * @return The Paint to be used */ public Paint getPlotBackgroundPaint() { return plotBackgroundPaint; } /** * Return the java.awt.Paint object to be used to paint the backound of the dial. * <p/> * In this image the background paint has been set to red <br/> * <img src="doc-files/DialWidgetDefinition-2.png"> * * @return The Paint to used for the background of the image */ public void setPlotBackgroundPaint( final Paint plotBackgroundPaint ) { this.plotBackgroundPaint = plotBackgroundPaint; } /** * Return the java.awt.Paint used to paint the needle of the dial image * * @return The Paint to use for the needle of this dial */ public Paint getNeedlePaint() { return needlePaint; } /** * Sets the java.awt.Paint object to be used to paint the needle of the dial image. * <p/> * In this image the needle paint has been set to red. <br/> * <img src="doc-files/DialWidgetDefinition-4.png"> * * @param needlePaint * The Paint to use for ths needle of this dial */ public void setNeedlePaint( final Paint needlePaint ) { this.needlePaint = needlePaint; } /** * Return the shape to be used for the dial. * * @return DialShape The DialShape for this dial */ public DialShape getDialShape() { return dialShape; } /** * Return the java.awt.Font to be used to display the dial title * * @return Font The Font for the title of this dial */ public Font getTitleFont() { if ( titleFont != null ) { return titleFont; } else { return new Font( "sans-serif", Font.PLAIN, 14 ); //$NON-NLS-1$ } } public void setTitleFont( final Font tFont ) { titleFont = tFont; } /** * Sets the shape to be used for the dial. This affects the area of dial outside the range that the needle * covers. * <table> * <tr> * <td><center>CIRCLE</center></td> * <td><center>CHORD</center></td> * <td><center>PIE</center></td> * </tr> * <tr> * <td><img src="doc-files/DialWidgetDefinition-3.png"></td> * <td><img src="doc-files/DialWidgetDefinition-8.png"></td> * <td><img src="doc-files/DialWidgetDefinition-9.png"></td> * </tr> * </table> * * @param dialShape * The shape for this dial */ public void setDialShape( final DialShape dialShape ) { this.dialShape = dialShape; } /** * Return a list of the intervals for the dial. Each object in the list is a MeterInterval object. * * @return List The list of MeterInterval objects for this dial */ public List getIntervals() { return intervals; } public Paint[] getPaintSequence() { return null; } public Image getPlotBackgroundImage() { return null; } public List getSubtitles() { return subTitles; } public void addSubTitles( final List subTitleNodes ) { if ( subTitleNodes != null ) { Iterator iter = subTitleNodes.iterator(); while ( iter.hasNext() ) { addSubTitle( ( (Node) iter.next() ).getText() ); } } } public void addSubTitle( final String subTitle ) { subTitles.add( subTitle ); } public Paint getChartBackgroundPaint() { // TODO Auto-generated method stub return chartBackgroundPaint; } public Image getChartBackgroundImage() { // TODO Auto-generated method stub return null; } public boolean isBorderVisible() { // TODO Auto-generated method stub return false; } public Paint getBorderPaint() { // TODO Auto-generated method stub return null; } public RectangleEdge getTitlePosition() { return titlePosition; } public RectangleEdge getLegendPosition() { return legendPosition; } /** * @param chartBackgroundPaint * The chartBackgroundPaint to set. */ public void setChartBackgroundPaint( final Paint chartBackgroundPaint ) { this.chartBackgroundPaint = chartBackgroundPaint; } public int getHeight() { // TODO Auto-generated method stub return 200; } public int getWidth() { // TODO Auto-generated method stub return 200; } public String getTitle() { return null; } public boolean isLegendIncluded() { // TODO Auto-generated method stub return false; } public boolean isThreeD() { // TODO Auto-generated method stub return false; } public Paint getValuePaint() { return valuePaint; } public Paint getTickPaint() { return tickPaint; } public int getTickSize() { return tickSize; } public void setValuePaint( final Paint valuePaint ) { this.valuePaint = valuePaint; } public void setTickPaint( final Paint tickPaint ) { this.tickPaint = tickPaint; } public void setTickSize( final int tickSize ) { this.tickSize = tickSize; } @Override public Font getValueFont() { return valueFont; } public void setValueFont( final Font valueFont ) { this.valueFont = valueFont; } public boolean isDisplayLabels() { // TODO Auto-generated method stub return false; } /** * Return the java.awt.Font to be used to display the legend items * * @return Font The font for the legend items */ public Font getLegendFont() { // TODO Auto-generated method stub return legendFont; } /** * Set java.awt.Font to be used to display the legend items * * @param Font * The java.awt.Font for the legend items */ public void setLegendFont( final Font legendFont ) { this.legendFont = legendFont; } public void setLegendFont( final Node legendFontNode ) { Font font = JFreeChartEngine.getFont( legendFontNode ); if ( font != null ) { setLegendFont( font ); } } public void setLegendBorderVisible( final Node legendBorderVisibleNode ) { if ( legendBorderVisibleNode != null ) { boolean legBorderVisible = ( new Boolean( legendBorderVisibleNode.getText() ) ).booleanValue(); setLegendBorderVisible( legBorderVisible ); } } /** * @param boolean legendBorderVisible Set the visibility of the legend border. */ public void setLegendBorderVisible( final boolean legendBorderVisible ) { this.legendBorderVisible = legendBorderVisible; } /** * Return the boolen that states if the legend border is visible * * @return boolean Is the legend border visible */ public boolean isLegendBorderVisible() { return legendBorderVisible; } public Float getBackgroundAlpha() { return backgroundAlpha; } public void setBackgroundAlpha( Node backgroundAlphaNode ) { if ( backgroundAlphaNode != null ) { Float backgroundAlphaValue = new Float( backgroundAlphaNode.getText() ); this.backgroundAlpha = backgroundAlphaValue; } } public Float getForegroundAlpha() { return foregroundAlpha; } public void setForegroundAlpha( Node foregroundAlphaNode ) { if ( foregroundAlphaNode != null ) { Float foregroundAlphaValue = new Float( foregroundAlphaNode.getText() ); this.foregroundAlpha = foregroundAlphaValue; } } }