package org.codehaus.mojo.dashboard.report.plugin.chart.time;
/*
* Copyright 2008 David Vicente
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.geom.Line2D;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.jfree.chart.ChartColor;
import org.jfree.chart.LegendItem;
import org.jfree.chart.block.Block;
import org.jfree.chart.block.BlockContainer;
import org.jfree.chart.block.BorderArrangement;
import org.jfree.chart.block.CenterArrangement;
import org.jfree.chart.block.ColumnArrangement;
import org.jfree.chart.block.EmptyBlock;
import org.jfree.chart.block.FlowArrangement;
import org.jfree.chart.block.LabelBlock;
import org.jfree.chart.block.LineBorder;
import org.jfree.chart.plot.ValueMarker;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.title.CompositeTitle;
import org.jfree.chart.title.LegendGraphic;
import org.jfree.chart.title.LegendItemBlockContainer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.ui.HorizontalAlignment;
import org.jfree.ui.RectangleAnchor;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.VerticalAlignment;
import org.codehaus.mojo.dashboard.report.plugin.chart.AbstractChartDecorator;
import org.codehaus.mojo.dashboard.report.plugin.chart.IChartRenderer;
import org.codehaus.mojo.dashboard.report.plugin.utils.ChartUtils;
/**
*
* @author <a href="dvicente72@gmail.com">David Vicente</a>
*
*/
public class MarkerTimeChartDecorator extends AbstractChartDecorator
{
public MarkerTimeChartDecorator( IChartRenderer chartToDecorate, List markersToPlot )
{
super( chartToDecorate, markersToPlot );
}
public void createChart()
{
XYPlot xyplot = (XYPlot) report.getPlot();
// if (this.decoratedChart instanceof TimeChartRenderer ) {
if ( this.results != null && !this.results.isEmpty() )
{
Iterator iter1 = this.results.iterator();
ValueMarker valuemarker = null;
BlockContainer blockcontainerLabel = new BlockContainer( new ColumnArrangement() );
// blockcontainerLabel.setFrame( new LineBorder() );
int i = 0;
while ( iter1.hasNext() )
{
Object[] item = (Object[]) iter1.next();
Date date = (Date) item[1];
Calendar cal = Calendar.getInstance();
cal.setTime( date );
cal.set( Calendar.HOUR_OF_DAY, 0 );
cal.set( Calendar.MINUTE, 0 );
cal.set( Calendar.SECOND, 0 );
valuemarker =
new ValueMarker( cal.getTimeInMillis(), ChartColor.createDefaultPaintArray()[i],
new BasicStroke( 2.0F ) );
xyplot.addDomainMarker( valuemarker );
LegendItem legendLabel =
new LegendItem( (String) item[0], null, null, null, new Line2D.Double( -7.0, 0.0, 7.0, 0.0 ),
valuemarker.getPaint(), valuemarker.getStroke(), valuemarker.getPaint() );
blockcontainerLabel.add( createLegendItemBlock( legendLabel, i ) );
i++;
}
createLegendBlock( blockcontainerLabel );
}
// }
}
public Color getBackgroundColor()
{
return (Color) ChartUtils.BLUE_STEEL2_LIGHT;
}
/**
* Creates a legend item block.
*
* @param item
* the legend item.
*
* @return The block.
*/
protected void createLegendBlock( BlockContainer blockcontainerLabel )
{
XYPlot xyplot = (XYPlot) report.getPlot();
int nbRenderer = xyplot.getDatasetCount();
BlockContainer blockcontainer = new BlockContainer( new BorderArrangement() );
if ( nbRenderer > 1 )
{
BlockContainer oldLegendBlockContainer =
new BlockContainer( new FlowArrangement( HorizontalAlignment.LEFT, VerticalAlignment.TOP, 2.0D, 2.0D ) );
for ( int i = 0; i < nbRenderer; i++ )
{
LegendTitle legendtitle = new LegendTitle( xyplot.getRenderer( i ) );
legendtitle.setMargin( new RectangleInsets( 1.0, 1.0, 1.0, 1.0 ) );
legendtitle.setFrame( new LineBorder() );
legendtitle.setBackgroundPaint( ChartColor.WHITE );
oldLegendBlockContainer.add( legendtitle );
}
blockcontainer.add( oldLegendBlockContainer, RectangleEdge.LEFT );
}
else
{
LegendTitle legendtitle = new LegendTitle( xyplot.getRenderer( 0 ) );
legendtitle.setMargin( new RectangleInsets( 1.0, 1.0, 1.0, 1.0 ) );
legendtitle.setFrame( new LineBorder() );
legendtitle.setBackgroundPaint( ChartColor.WHITE );
blockcontainer.add( legendtitle, RectangleEdge.LEFT );
}
LegendTitle legendtitle1 = new LegendTitle( xyplot.getRenderer() );
legendtitle1.setMargin( new RectangleInsets( 1.0, 1.0, 1.0, 1.0 ) );
legendtitle1.setFrame( new LineBorder() );
legendtitle1.setBackgroundPaint( ChartColor.WHITE );
legendtitle1.setWrapper( blockcontainerLabel );
blockcontainer.add( legendtitle1, RectangleEdge.RIGHT );
blockcontainer.add( new EmptyBlock( 1000D, 0.0D ) );
CompositeTitle compositetitle = new CompositeTitle( blockcontainer );
compositetitle.setPosition( RectangleEdge.BOTTOM );
report.clearSubtitles();
report.addSubtitle( compositetitle );
}
/**
* Creates a legend item block.
*
* @param item
* the legend item.
*
* @return The block.
*/
protected Block createLegendItemBlock( LegendItem item, int i )
{
BlockContainer result = null;
LegendGraphic lg = new LegendGraphic( item.getShape(), item.getFillPaint() );
lg.setFillPaintTransformer( item.getFillPaintTransformer() );
lg.setShapeFilled( true );
lg.setLine( item.getLine() );
lg.setLineStroke( item.getLineStroke() );
lg.setLinePaint( item.getFillPaint() );
lg.setLineVisible( true );
lg.setShapeVisible( true );
lg.setShapeOutlineVisible( true );
lg.setOutlinePaint( item.getFillPaint() );
lg.setOutlineStroke( item.getOutlineStroke() );
lg.setPadding( new RectangleInsets( 2.0, 2.0, 2.0, 2.0 ) );
LegendItemBlockContainer legendItem = new LegendItemBlockContainer( new BorderArrangement(), 0, i );
lg.setShapeAnchor( RectangleAnchor.CENTER );
lg.setShapeLocation( RectangleAnchor.CENTER );
legendItem.add( lg, RectangleEdge.LEFT );
LabelBlock labelBlock = new LabelBlock( item.getLabel(), new Font( "SansSerif", Font.BOLD, 10 ), Color.black );
labelBlock.setPadding( new RectangleInsets( 2.0, 2.0, 2.0, 2.0 ) );
legendItem.add( labelBlock );
legendItem.setToolTipText( item.getToolTipText() );
legendItem.setURLText( item.getURLText() );
result = new BlockContainer( new CenterArrangement() );
result.add( legendItem );
return result;
}
}