#region PDFsharp Charting - A .NET charting library based on PDFsharp
//
// Authors:
// Niklas Schneider
//
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
//
// http://www.pdfsharp.com
// http://sourceforge.net/projects/pdfsharp
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
#endregion
using System.Collections.Generic;
using PdfSharp.Drawing;
using PdfSharp.Charting.Renderers;
namespace PdfSharp.Charting
{
///
/// Represents the frame which holds one or more charts.
///
public class ChartFrame
{
///
/// Initializes a new instance of the ChartFrame class.
///
public ChartFrame()
{ }
///
/// Initializes a new instance of the ChartFrame class with the specified rectangle.
///
public ChartFrame(XRect rect)
{
_location = rect.Location;
_size = rect.Size;
}
///
/// Gets or sets the location of the ChartFrame.
///
public XPoint Location
{
get { return _location; }
set { _location = value; }
}
XPoint _location;
///
/// Gets or sets the size of the ChartFrame.
///
public XSize Size
{
get { return _size; }
set { _size = value; }
}
XSize _size;
///
/// Adds a chart to the ChartFrame.
///
public void Add(Chart chart)
{
if (_chartList == null)
_chartList = new List();
_chartList.Add(chart);
}
///
/// Draws all charts inside the ChartFrame.
///
public void Draw(XGraphics gfx)
{
// Draw frame of ChartFrame. First shadow frame.
const int dx = 5;
const int dy = 5;
gfx.DrawRoundedRectangle(XBrushes.Gainsboro,
_location.X + dx, _location.Y + dy,
_size.Width, _size.Height, 20, 20);
XRect chartRect = new XRect(_location.X, _location.Y, _size.Width, _size.Height);
XLinearGradientBrush brush = new XLinearGradientBrush(chartRect, XColor.FromArgb(0xFFD0DEEF), XColors.White,
XLinearGradientMode.Vertical);
XPen penBorder = new XPen(XColors.SteelBlue, 2.5);
gfx.DrawRoundedRectangle(penBorder, brush,
_location.X, _location.Y, _size.Width, _size.Height,
15, 15);
XGraphicsState state = gfx.Save();
gfx.TranslateTransform(_location.X, _location.Y);
// Calculate rectangle for all charts. Y-Position will be moved for each chart.
int charts = _chartList.Count;
const uint dxChart = 20;
const uint dyChart = 20;
const uint dyBetweenCharts = 30;
XRect rect = new XRect(dxChart, dyChart,
_size.Width - 2 * dxChart,
(_size.Height - (charts - 1) * dyBetweenCharts - 2 * dyChart) / charts);
// draw each chart in list
foreach (Chart chart in _chartList)
{
RendererParameters parms = new RendererParameters(gfx, rect);
parms.DrawingItem = chart;
ChartRenderer renderer = GetChartRenderer(chart, parms);
renderer.Init();
renderer.Format();
renderer.Draw();
rect.Y += rect.Height + dyBetweenCharts;
}
gfx.Restore(state);
// // Calculate rectangle for all charts. Y-Position will be moved for each chart.
// int charts = chartList.Count;
// uint dxChart = 0;
// uint dyChart = 0;
// uint dyBetweenCharts = 0;
// XRect rect = new XRect(dxChart, dyChart,
// size.Width - 2 * dxChart,
// (size.Height - (charts - 1) * dyBetweenCharts - 2 * dyChart) / charts);
//
// // draw each chart in list
// foreach (Chart chart in chartList)
// {
// RendererParameters parms = new RendererParameters(gfx, rect);
// parms.DrawingItem = chart;
//
// ChartRenderer renderer = GetChartRenderer(chart, parms);
// renderer.Init();
// renderer.Format();
// renderer.Draw();
//
// rect.Y += rect.Height + dyBetweenCharts;
// }
}
///
/// Draws first chart only.
///
public void DrawChart(XGraphics gfx)
{
XGraphicsState state = gfx.Save();
gfx.TranslateTransform(_location.X, _location.Y);
if (_chartList.Count > 0)
{
XRect chartRect = new XRect(0, 0, _size.Width, _size.Height);
Chart chart = (Chart)_chartList[0];
RendererParameters parms = new RendererParameters(gfx, chartRect);
parms.DrawingItem = chart;
ChartRenderer renderer = GetChartRenderer(chart, parms);
renderer.Init();
renderer.Format();
renderer.Draw();
}
gfx.Restore(state);
}
///
/// Returns the chart renderer appropriate for the chart.
///
private ChartRenderer GetChartRenderer(Chart chart, RendererParameters parms)
{
ChartType chartType = chart.Type;
bool useCombinationRenderer = false;
foreach (Series series in chart._seriesCollection)
{
if (series._chartType != chartType)
{
useCombinationRenderer = true;
break;
}
}
if (useCombinationRenderer)
return new CombinationChartRenderer(parms);
switch (chartType)
{
case ChartType.Line:
return new LineChartRenderer(parms);
case ChartType.Column2D:
case ChartType.ColumnStacked2D:
return new ColumnChartRenderer(parms);
case ChartType.Bar2D:
case ChartType.BarStacked2D:
return new BarChartRenderer(parms);
case ChartType.Area2D:
return new AreaChartRenderer(parms);
case ChartType.Pie2D:
case ChartType.PieExploded2D:
return new PieChartRenderer(parms);
}
return null;
}
///
/// Holds the charts which will be drawn inside the ChartFrame.
///
List _chartList;
}
}