1617 lines
47 KiB
C#
1617 lines
47 KiB
C#
|
//-------------------------------------------------------------
|
|||
|
// <copyright company=<3D>Microsoft Corporation<6F>>
|
|||
|
// Copyright <20> Microsoft Corporation. All Rights Reserved.
|
|||
|
// </copyright>
|
|||
|
//-------------------------------------------------------------
|
|||
|
// @owner=alexgor, deliant
|
|||
|
//=================================================================
|
|||
|
// File: StripLine.cs
|
|||
|
//
|
|||
|
// Namespace: DataVisualization.Charting
|
|||
|
//
|
|||
|
// Classes: StripLinesCollection, StripLine
|
|||
|
//
|
|||
|
// Purpose: StripLinesCollection class is used to expose stripes
|
|||
|
// or lines on the plotting area and is exposed through
|
|||
|
// StripLines property of each Axis.
|
|||
|
//
|
|||
|
// Each StripLine class presents one or series of
|
|||
|
// repeated axis horizontal or vertical strips within
|
|||
|
// the plotting are.
|
|||
|
//
|
|||
|
// When multiple strip lines are defined for an axis,
|
|||
|
// there is a possibility of overlap. The z-order of
|
|||
|
// StripLine objects is determined by their order of
|
|||
|
// occurrence in the StripLinesCollection object. The
|
|||
|
// z-order follows this convention, the first occurrence
|
|||
|
// is drawn first, the second occurrence is drawn second,
|
|||
|
// and so on.
|
|||
|
//
|
|||
|
// Highlighting weekends on date axis is a good example
|
|||
|
// of using strip lines with interval.
|
|||
|
//
|
|||
|
// Reviewed: AG - Jul 31, 2002;
|
|||
|
// GS - Aug 7, 2002
|
|||
|
// AG - Microsoft 13, 2007
|
|||
|
//
|
|||
|
//===================================================================
|
|||
|
|
|||
|
|
|||
|
#region Used namespaces
|
|||
|
|
|||
|
using System;
|
|||
|
using System.Collections;
|
|||
|
using System.Collections.Specialized;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.ComponentModel;
|
|||
|
using System.ComponentModel.Design;
|
|||
|
using System.Data;
|
|||
|
using System.Drawing;
|
|||
|
using System.Drawing.Design;
|
|||
|
using System.Drawing.Drawing2D;
|
|||
|
|
|||
|
#if Microsoft_CONTROL
|
|||
|
using System.Windows.Forms.DataVisualization.Charting;
|
|||
|
using System.Windows.Forms.DataVisualization.Charting.Data;
|
|||
|
using System.Windows.Forms.DataVisualization.Charting.ChartTypes;
|
|||
|
using System.Windows.Forms.DataVisualization.Charting.Utilities;
|
|||
|
using System.Windows.Forms.DataVisualization.Charting.Borders3D;
|
|||
|
using System.Globalization;
|
|||
|
using System.ComponentModel.Design.Serialization;
|
|||
|
using System.Reflection;
|
|||
|
using System.Windows.Forms.Design;
|
|||
|
#else
|
|||
|
using System.Web;
|
|||
|
using System.Web.UI;
|
|||
|
using System.Web.UI.DataVisualization.Charting;
|
|||
|
using System.Web.UI.DataVisualization.Charting.Data;
|
|||
|
using System.Web.UI.DataVisualization.Charting.Utilities;
|
|||
|
#endif
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#if Microsoft_CONTROL
|
|||
|
namespace System.Windows.Forms.DataVisualization.Charting
|
|||
|
#else
|
|||
|
namespace System.Web.UI.DataVisualization.Charting
|
|||
|
#endif
|
|||
|
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// The StripLinesCollection class is a strongly typed collection of
|
|||
|
/// StripLine classes.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRDescription("DescriptionAttributeStripLinesCollection_StripLinesCollection"),
|
|||
|
|
|||
|
]
|
|||
|
#if ASPPERM_35
|
|||
|
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
|||
|
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
|||
|
#endif
|
|||
|
public class StripLinesCollection : ChartElementCollection<StripLine>
|
|||
|
{
|
|||
|
|
|||
|
#region Constructor
|
|||
|
/// <summary>
|
|||
|
/// Legend item collection object constructor
|
|||
|
/// </summary>
|
|||
|
/// <param name="axis">Axis object reference.</param>
|
|||
|
internal StripLinesCollection(Axis axis)
|
|||
|
: base(axis)
|
|||
|
{
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// The StripLine class contains properties which define visual appearance
|
|||
|
/// of the stripe or line, its position according to the axis. It
|
|||
|
/// may optionally contain the repeat interval. Text may associate
|
|||
|
/// with a strip or a line. It also contains methods of drawing and hit
|
|||
|
/// testing.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRDescription("DescriptionAttributeStripLine_StripLine"),
|
|||
|
DefaultProperty("IntervalOffset"),
|
|||
|
]
|
|||
|
#if Microsoft_CONTROL
|
|||
|
public class StripLine : ChartElement
|
|||
|
#else
|
|||
|
#if ASPPERM_35
|
|||
|
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
|||
|
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
|||
|
#endif
|
|||
|
public class StripLine : ChartElement, IChartMapArea
|
|||
|
#endif
|
|||
|
{
|
|||
|
|
|||
|
#region Fields
|
|||
|
|
|||
|
// Private data members, which store properties values
|
|||
|
private double _intervalOffset = 0;
|
|||
|
private double _interval = 0;
|
|||
|
private DateTimeIntervalType _intervalType = DateTimeIntervalType.Auto;
|
|||
|
internal DateTimeIntervalType intervalOffsetType = DateTimeIntervalType.Auto;
|
|||
|
internal bool interlaced = false;
|
|||
|
private double _stripWidth = 0;
|
|||
|
private DateTimeIntervalType _stripWidthType = DateTimeIntervalType.Auto;
|
|||
|
private Color _backColor = Color.Empty;
|
|||
|
private ChartHatchStyle _backHatchStyle = ChartHatchStyle.None;
|
|||
|
private string _backImage = "";
|
|||
|
private ChartImageWrapMode _backImageWrapMode = ChartImageWrapMode.Tile;
|
|||
|
private Color _backImageTransparentColor = Color.Empty;
|
|||
|
private ChartImageAlignmentStyle _backImageAlignment = ChartImageAlignmentStyle.TopLeft;
|
|||
|
private GradientStyle _backGradientStyle = GradientStyle.None;
|
|||
|
private Color _backSecondaryColor = Color.Empty;
|
|||
|
private Color _borderColor = Color.Empty;
|
|||
|
private int _borderWidth = 1;
|
|||
|
private ChartDashStyle _borderDashStyle = ChartDashStyle.Solid;
|
|||
|
|
|||
|
// Strip/Line title properties
|
|||
|
private string _text = "";
|
|||
|
private Color _foreColor = Color.Black;
|
|||
|
private FontCache _fontCache = new FontCache();
|
|||
|
private Font _font = null;
|
|||
|
private StringAlignment _textAlignment = StringAlignment.Far;
|
|||
|
private StringAlignment _textLineAlignment = StringAlignment.Near;
|
|||
|
|
|||
|
// Chart image map properties
|
|||
|
private string _toolTip = "";
|
|||
|
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
private string _url = "";
|
|||
|
private string _attributes = "";
|
|||
|
private string _postbackValue = String.Empty;
|
|||
|
#endif
|
|||
|
|
|||
|
// Default text orientation
|
|||
|
private TextOrientation _textOrientation = TextOrientation.Auto;
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Properties
|
|||
|
/// <summary>
|
|||
|
/// Gets axes to which this object attached to.
|
|||
|
/// </summary>
|
|||
|
/// <returns>Axis object reference.</returns>
|
|||
|
internal Axis Axis
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
if (Parent != null)
|
|||
|
return Parent.Parent as Axis;
|
|||
|
else
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Constructors
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Strip line object constructor.
|
|||
|
/// </summary>
|
|||
|
public StripLine()
|
|||
|
: base()
|
|||
|
{
|
|||
|
_font = _fontCache.DefaultFont;
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Painting methods
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Checks if chart title is drawn vertically.
|
|||
|
/// Note: From the drawing perspective stacked text orientation is not vertical.
|
|||
|
/// </summary>
|
|||
|
/// <returns>True if text is vertical.</returns>
|
|||
|
private bool IsTextVertical
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
TextOrientation currentTextOrientation = this.GetTextOrientation();
|
|||
|
return currentTextOrientation == TextOrientation.Rotated90 || currentTextOrientation == TextOrientation.Rotated270;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Returns stripline text orientation. If set to Auto automatically determines the
|
|||
|
/// orientation based on the orientation of the stripline.
|
|||
|
/// </summary>
|
|||
|
/// <returns>Current text orientation.</returns>
|
|||
|
private TextOrientation GetTextOrientation()
|
|||
|
{
|
|||
|
if (this.TextOrientation == TextOrientation.Auto && this.Axis != null)
|
|||
|
{
|
|||
|
if (this.Axis.AxisPosition == AxisPosition.Bottom || this.Axis.AxisPosition == AxisPosition.Top)
|
|||
|
{
|
|||
|
return TextOrientation.Rotated270;
|
|||
|
}
|
|||
|
return TextOrientation.Horizontal;
|
|||
|
}
|
|||
|
return this.TextOrientation;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Draw strip(s) or line(s).
|
|||
|
/// </summary>
|
|||
|
/// <param name="graph">Reference to the Chart Graphics object.</param>
|
|||
|
/// <param name="common">Common objects.</param>
|
|||
|
/// <param name="drawLinesOnly">Indicates if Lines or Stripes should be drawn.</param>
|
|||
|
internal void Paint(
|
|||
|
ChartGraphics graph,
|
|||
|
CommonElements common,
|
|||
|
bool drawLinesOnly)
|
|||
|
{
|
|||
|
// Strip lines are not supported in circular chart area
|
|||
|
if(this.Axis.ChartArea.chartAreaIsCurcular)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// Get plot area position
|
|||
|
RectangleF plotAreaPosition = this.Axis.ChartArea.PlotAreaPosition.ToRectangleF();
|
|||
|
|
|||
|
// Detect if strip/line is horizontal or vertical
|
|||
|
bool horizontal = true;
|
|||
|
if(this.Axis.AxisPosition == AxisPosition.Bottom || this.Axis.AxisPosition == AxisPosition.Top)
|
|||
|
{
|
|||
|
horizontal = false;
|
|||
|
}
|
|||
|
|
|||
|
// Get first series attached to this axis
|
|||
|
Series axisSeries = null;
|
|||
|
if(Axis.axisType == AxisName.X || Axis.axisType == AxisName.X2)
|
|||
|
{
|
|||
|
List<string> seriesArray = Axis.ChartArea.GetXAxesSeries((Axis.axisType == AxisName.X) ? AxisType.Primary : AxisType.Secondary, Axis.SubAxisName);
|
|||
|
if(seriesArray.Count > 0)
|
|||
|
{
|
|||
|
axisSeries = Axis.Common.DataManager.Series[seriesArray[0]];
|
|||
|
if(axisSeries != null && !axisSeries.IsXValueIndexed)
|
|||
|
{
|
|||
|
axisSeries = null;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Get starting position from axis
|
|||
|
// NOTE: Starting position was changed from "this.Axis.minimum" to
|
|||
|
// fix the minimum scaleView location to fix issue #5962 -- AG
|
|||
|
double currentPosition = this.Axis.ViewMinimum;
|
|||
|
|
|||
|
// Adjust start position depending on the interval type
|
|||
|
if(!Axis.ChartArea.chartAreaIsCurcular ||
|
|||
|
Axis.axisType == AxisName.Y ||
|
|||
|
Axis.axisType == AxisName.Y2 )
|
|||
|
{
|
|||
|
double intervalToUse = this.Interval;
|
|||
|
|
|||
|
// NOTE: fix for issue #5962
|
|||
|
// Always use original grid interval for isInterlaced strip lines.
|
|||
|
if (this.interlaced)
|
|||
|
{
|
|||
|
// Automaticly generated isInterlaced strips have interval twice as big as major grids
|
|||
|
intervalToUse /= 2.0;
|
|||
|
}
|
|||
|
currentPosition = ChartHelper.AlignIntervalStart(currentPosition, intervalToUse, this.IntervalType, axisSeries);
|
|||
|
}
|
|||
|
|
|||
|
// Too many tick marks
|
|||
|
if(this.Interval != 0)
|
|||
|
{
|
|||
|
if( ( Axis.ViewMaximum - Axis.ViewMinimum ) / ChartHelper.GetIntervalSize(currentPosition, this._interval, this._intervalType, axisSeries, 0, DateTimeIntervalType.Number, false) > ChartHelper.MaxNumOfGridlines)
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
DateTimeIntervalType offsetType = (IntervalOffsetType == DateTimeIntervalType.Auto) ? IntervalType : IntervalOffsetType;
|
|||
|
if(this.Interval == 0)
|
|||
|
{
|
|||
|
currentPosition = this.IntervalOffset;
|
|||
|
}
|
|||
|
/******************************************************************
|
|||
|
* Removed by AG. Causing issues with interalced strip lines.
|
|||
|
/******************************************************************
|
|||
|
else if(axisSeries != null && axisSeries.IsXValueIndexed)
|
|||
|
{
|
|||
|
// Align first position for indexed series
|
|||
|
currentPosition += this.Axis.AlignIndexedIntervalStart(
|
|||
|
currentPosition,
|
|||
|
this.Interval,
|
|||
|
this.IntervalType,
|
|||
|
axisSeries,
|
|||
|
this.IntervalOffset,
|
|||
|
offsetType,
|
|||
|
false);
|
|||
|
}
|
|||
|
*/
|
|||
|
else
|
|||
|
{
|
|||
|
if(this.IntervalOffset > 0)
|
|||
|
{
|
|||
|
currentPosition += ChartHelper.GetIntervalSize(currentPosition, this.IntervalOffset,
|
|||
|
offsetType, axisSeries, 0, DateTimeIntervalType.Number, false);
|
|||
|
}
|
|||
|
else if(this.IntervalOffset < 0)
|
|||
|
{
|
|||
|
currentPosition -= ChartHelper.GetIntervalSize(currentPosition, -this.IntervalOffset,
|
|||
|
offsetType, axisSeries, 0, DateTimeIntervalType.Number, false);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Draw several lines or strips if Interval property is set
|
|||
|
int counter = 0;
|
|||
|
do
|
|||
|
{
|
|||
|
// Check if we do not exceed max number of elements
|
|||
|
if(counter++ > ChartHelper.MaxNumOfGridlines)
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
// Draw strip
|
|||
|
if(this.StripWidth > 0 && !drawLinesOnly)
|
|||
|
{
|
|||
|
double stripRightPosition = currentPosition + ChartHelper.GetIntervalSize(currentPosition, this.StripWidth, this.StripWidthType, axisSeries, this.IntervalOffset, offsetType, false);
|
|||
|
if (stripRightPosition > this.Axis.ViewMinimum && currentPosition < this.Axis.ViewMaximum)
|
|||
|
{
|
|||
|
// Calculate strip rectangle
|
|||
|
RectangleF rect = RectangleF.Empty;
|
|||
|
double pos1 = (float)this.Axis.GetLinearPosition(currentPosition);
|
|||
|
double pos2 = (float)this.Axis.GetLinearPosition(stripRightPosition);
|
|||
|
if(horizontal)
|
|||
|
{
|
|||
|
rect.X = plotAreaPosition.X;
|
|||
|
rect.Width = plotAreaPosition.Width;
|
|||
|
rect.Y = (float)Math.Min(pos1, pos2);
|
|||
|
rect.Height = (float)Math.Max(pos1, pos2) - rect.Y;
|
|||
|
|
|||
|
// Check rectangle boundaries
|
|||
|
rect.Intersect(plotAreaPosition);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
rect.Y = plotAreaPosition.Y;
|
|||
|
rect.Height = plotAreaPosition.Height;
|
|||
|
rect.X = (float)Math.Min(pos1, pos2);
|
|||
|
rect.Width = (float)Math.Max(pos1, pos2) - rect.X;
|
|||
|
|
|||
|
// Check rectangle boundaries
|
|||
|
rect.Intersect(plotAreaPosition);
|
|||
|
}
|
|||
|
|
|||
|
if(rect.Width > 0 && rect.Height > 0)
|
|||
|
{
|
|||
|
|
|||
|
#if Microsoft_CONTROL
|
|||
|
// Start Svg Selection mode
|
|||
|
graph.StartHotRegion( "", this._toolTip );
|
|||
|
#else
|
|||
|
// Start Svg Selection mode
|
|||
|
graph.StartHotRegion( this._url, this._toolTip );
|
|||
|
#endif
|
|||
|
if(!this.Axis.ChartArea.Area3DStyle.Enable3D)
|
|||
|
{
|
|||
|
// Draw strip
|
|||
|
graph.FillRectangleRel( rect,
|
|||
|
this.BackColor, this.BackHatchStyle, this.BackImage,
|
|||
|
this.BackImageWrapMode, this.BackImageTransparentColor, this.BackImageAlignment,
|
|||
|
this.BackGradientStyle, this.BackSecondaryColor, this.BorderColor,
|
|||
|
this.BorderWidth, this.BorderDashStyle, Color.Empty,
|
|||
|
0, PenAlignment.Inset );
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Draw3DStrip( graph, rect, horizontal );
|
|||
|
}
|
|||
|
|
|||
|
// End Svg Selection mode
|
|||
|
graph.EndHotRegion( );
|
|||
|
|
|||
|
// Draw strip line title
|
|||
|
PaintTitle(graph, rect);
|
|||
|
|
|||
|
if( common.ProcessModeRegions )
|
|||
|
{
|
|||
|
if(!this.Axis.ChartArea.Area3DStyle.Enable3D)
|
|||
|
{
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
common.HotRegionsList.AddHotRegion(rect, this.ToolTip, this.Url, this.MapAreaAttributes, this.PostBackValue, this, ChartElementType.StripLines, string.Empty);
|
|||
|
#else
|
|||
|
common.HotRegionsList.AddHotRegion(rect, this.ToolTip, string.Empty, string.Empty, string.Empty, this, ChartElementType.StripLines, null );
|
|||
|
#endif // !Microsoft_CONTROL
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
// Draw line
|
|||
|
else if(this.StripWidth == 0 && drawLinesOnly)
|
|||
|
{
|
|||
|
if(currentPosition > this.Axis.ViewMinimum && currentPosition < this.Axis.ViewMaximum)
|
|||
|
{
|
|||
|
// Calculate line position
|
|||
|
PointF point1 = PointF.Empty;
|
|||
|
PointF point2 = PointF.Empty;
|
|||
|
if(horizontal)
|
|||
|
{
|
|||
|
point1.X = plotAreaPosition.X;
|
|||
|
point1.Y = (float)this.Axis.GetLinearPosition(currentPosition);
|
|||
|
point2.X = plotAreaPosition.Right;
|
|||
|
point2.Y = point1.Y;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
point1.X = (float)this.Axis.GetLinearPosition(currentPosition);
|
|||
|
point1.Y = plotAreaPosition.Y;
|
|||
|
point2.X = point1.X;
|
|||
|
point2.Y = plotAreaPosition.Bottom;
|
|||
|
}
|
|||
|
|
|||
|
#if Microsoft_CONTROL
|
|||
|
// Start Svg Selection mode
|
|||
|
graph.StartHotRegion( "", this._toolTip );
|
|||
|
#else
|
|||
|
// Start Svg Selection mode
|
|||
|
graph.StartHotRegion( this._url, this._toolTip );
|
|||
|
#endif
|
|||
|
// Draw Line
|
|||
|
if(!this.Axis.ChartArea.Area3DStyle.Enable3D)
|
|||
|
{
|
|||
|
graph.DrawLineRel(this.BorderColor, this.BorderWidth, this.BorderDashStyle, point1, point2);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
graph.Draw3DGridLine(this.Axis.ChartArea, _borderColor, _borderWidth, _borderDashStyle, point1, point2, horizontal, Axis.Common, this );
|
|||
|
}
|
|||
|
|
|||
|
// End Svg Selection mode
|
|||
|
graph.EndHotRegion( );
|
|||
|
|
|||
|
// Draw strip line title
|
|||
|
PaintTitle(graph, point1, point2);
|
|||
|
|
|||
|
if( common.ProcessModeRegions )
|
|||
|
{
|
|||
|
SizeF relBorderWidth = new SizeF(this.BorderWidth + 1, this.BorderWidth + 1);
|
|||
|
relBorderWidth = graph.GetRelativeSize(relBorderWidth);
|
|||
|
RectangleF lineRect = RectangleF.Empty;
|
|||
|
if(horizontal)
|
|||
|
{
|
|||
|
lineRect.X = point1.X;
|
|||
|
lineRect.Y = point1.Y - relBorderWidth.Height / 2f;
|
|||
|
lineRect.Width = point2.X - point1.X;
|
|||
|
lineRect.Height = relBorderWidth.Height;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
lineRect.X = point1.X - relBorderWidth.Width / 2f;
|
|||
|
lineRect.Y = point1.Y;
|
|||
|
lineRect.Width = relBorderWidth.Width;
|
|||
|
lineRect.Height = point2.Y - point1.Y;
|
|||
|
}
|
|||
|
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
common.HotRegionsList.AddHotRegion( lineRect, this.ToolTip, this.Url, this.MapAreaAttributes, this.PostBackValue, this, ChartElementType.StripLines, string.Empty );
|
|||
|
#else
|
|||
|
common.HotRegionsList.AddHotRegion( lineRect, this.ToolTip, null, null, null, this, ChartElementType.StripLines, null );
|
|||
|
#endif // !Microsoft_CONTROL
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Go to the next line/strip
|
|||
|
if(this.Interval > 0)
|
|||
|
{
|
|||
|
currentPosition += ChartHelper.GetIntervalSize(currentPosition, this.Interval, this.IntervalType, axisSeries, this.IntervalOffset, offsetType, false);
|
|||
|
}
|
|||
|
|
|||
|
} while(this.Interval > 0 && currentPosition <= this.Axis.ViewMaximum);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Draws strip line in 3d.
|
|||
|
/// </summary>
|
|||
|
/// <param name="graph">Chart graphics.</param>
|
|||
|
/// <param name="rect">Strip rectangle.</param>
|
|||
|
/// <param name="horizontal">Indicates that strip is horizontal</param>
|
|||
|
private void Draw3DStrip(ChartGraphics graph, RectangleF rect, bool horizontal )
|
|||
|
{
|
|||
|
ChartArea area = this.Axis.ChartArea;
|
|||
|
GraphicsPath path = null;
|
|||
|
DrawingOperationTypes operationType = DrawingOperationTypes.DrawElement;
|
|||
|
|
|||
|
if( this.Axis.Common.ProcessModeRegions )
|
|||
|
{
|
|||
|
operationType |= DrawingOperationTypes.CalcElementPath;
|
|||
|
}
|
|||
|
|
|||
|
// Draw strip on the back/front wall
|
|||
|
path = graph.Fill3DRectangle(
|
|||
|
rect,
|
|||
|
area.IsMainSceneWallOnFront() ? area.areaSceneDepth : 0f,
|
|||
|
0,
|
|||
|
area.matrix3D,
|
|||
|
area.Area3DStyle.LightStyle,
|
|||
|
this.BackColor,
|
|||
|
this.BorderColor,
|
|||
|
this.BorderWidth,
|
|||
|
this.BorderDashStyle,
|
|||
|
operationType );
|
|||
|
|
|||
|
if( this.Axis.Common.ProcessModeRegions )
|
|||
|
{
|
|||
|
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
this.Axis.Common.HotRegionsList.AddHotRegion( graph, path, false, this.ToolTip, this.Url, this.MapAreaAttributes, this.PostBackValue, this, ChartElementType.StripLines );
|
|||
|
#else
|
|||
|
this.Axis.Common.HotRegionsList.AddHotRegion( graph, path, false, this.ToolTip, null, null, null, this, ChartElementType.StripLines );
|
|||
|
#endif // !Microsoft_CONTROL
|
|||
|
}
|
|||
|
|
|||
|
if(horizontal)
|
|||
|
{
|
|||
|
// Draw strip on the side wall (left or right)
|
|||
|
if(!area.IsSideSceneWallOnLeft())
|
|||
|
{
|
|||
|
rect.X = rect.Right;
|
|||
|
}
|
|||
|
rect.Width = 0f;
|
|||
|
|
|||
|
path = graph.Fill3DRectangle(
|
|||
|
rect,
|
|||
|
0f,
|
|||
|
area.areaSceneDepth,
|
|||
|
area.matrix3D,
|
|||
|
area.Area3DStyle.LightStyle,
|
|||
|
this.BackColor,
|
|||
|
this.BorderColor,
|
|||
|
this.BorderWidth,
|
|||
|
this.BorderDashStyle,
|
|||
|
operationType );
|
|||
|
|
|||
|
}
|
|||
|
else if(area.IsBottomSceneWallVisible())
|
|||
|
{
|
|||
|
// Draw strip on the bottom wall (if visible)
|
|||
|
rect.Y = rect.Bottom;
|
|||
|
rect.Height = 0f;
|
|||
|
|
|||
|
path = graph.Fill3DRectangle(
|
|||
|
rect,
|
|||
|
0f,
|
|||
|
area.areaSceneDepth,
|
|||
|
area.matrix3D,
|
|||
|
area.Area3DStyle.LightStyle,
|
|||
|
this.BackColor,
|
|||
|
this.BorderColor,
|
|||
|
this.BorderWidth,
|
|||
|
this.BorderDashStyle,
|
|||
|
operationType );
|
|||
|
|
|||
|
}
|
|||
|
if( this.Axis.Common.ProcessModeRegions )
|
|||
|
{
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
this.Axis.Common.HotRegionsList.AddHotRegion( graph, path, false, this.ToolTip, this.Url, this.MapAreaAttributes, this.PostBackValue, this, ChartElementType.StripLines );
|
|||
|
#else
|
|||
|
this.Axis.Common.HotRegionsList.AddHotRegion( graph, path, false, this.ToolTip, null, null, null, this, ChartElementType.StripLines );
|
|||
|
#endif // !Microsoft_CONTROL
|
|||
|
}
|
|||
|
if (path != null)
|
|||
|
{
|
|||
|
path.Dispose();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Draw strip/line title text
|
|||
|
/// </summary>
|
|||
|
/// <param name="graph">Chart graphics object.</param>
|
|||
|
/// <param name="point1">First line point.</param>
|
|||
|
/// <param name="point2">Second line point.</param>
|
|||
|
private void PaintTitle(ChartGraphics graph, PointF point1, PointF point2)
|
|||
|
{
|
|||
|
if(this.Text.Length > 0)
|
|||
|
{
|
|||
|
// Define a rectangle to draw the title
|
|||
|
RectangleF rect = RectangleF.Empty;
|
|||
|
rect.X = point1.X;
|
|||
|
rect.Y = point1.Y;
|
|||
|
rect.Height = point2.Y - rect.Y;
|
|||
|
rect.Width = point2.X - rect.X;
|
|||
|
|
|||
|
// Paint title using a rect
|
|||
|
PaintTitle(graph, rect);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Draw strip/line title text
|
|||
|
/// </summary>
|
|||
|
/// <param name="graph">Chart graphics object.</param>
|
|||
|
/// <param name="rect">Rectangle to draw in.</param>
|
|||
|
private void PaintTitle(ChartGraphics graph, RectangleF rect)
|
|||
|
{
|
|||
|
if(this.Text.Length > 0)
|
|||
|
{
|
|||
|
// Get title text
|
|||
|
string titleText = this.Text;
|
|||
|
|
|||
|
// Prepare string format
|
|||
|
using (StringFormat format = new StringFormat())
|
|||
|
{
|
|||
|
format.Alignment = this.TextAlignment;
|
|||
|
|
|||
|
if (graph.IsRightToLeft)
|
|||
|
{
|
|||
|
if (format.Alignment == StringAlignment.Far)
|
|||
|
{
|
|||
|
format.Alignment = StringAlignment.Near;
|
|||
|
}
|
|||
|
else if (format.Alignment == StringAlignment.Near)
|
|||
|
{
|
|||
|
format.Alignment = StringAlignment.Far;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
format.LineAlignment = this.TextLineAlignment;
|
|||
|
|
|||
|
// Adjust default title angle for horizontal lines
|
|||
|
int angle = 0;
|
|||
|
switch (this.TextOrientation)
|
|||
|
{
|
|||
|
case (TextOrientation.Rotated90):
|
|||
|
angle = 90;
|
|||
|
break;
|
|||
|
case (TextOrientation.Rotated270):
|
|||
|
angle = 270;
|
|||
|
break;
|
|||
|
case (TextOrientation.Auto):
|
|||
|
if (this.Axis.AxisPosition == AxisPosition.Bottom || this.Axis.AxisPosition == AxisPosition.Top)
|
|||
|
{
|
|||
|
angle = 270;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
// Set vertical text for horizontal lines
|
|||
|
if (angle == 90)
|
|||
|
{
|
|||
|
format.FormatFlags = StringFormatFlags.DirectionVertical;
|
|||
|
angle = 0;
|
|||
|
}
|
|||
|
else if (angle == 270)
|
|||
|
{
|
|||
|
format.FormatFlags = StringFormatFlags.DirectionVertical;
|
|||
|
angle = 180;
|
|||
|
}
|
|||
|
|
|||
|
// Measure string size
|
|||
|
SizeF size = graph.MeasureStringRel(titleText.Replace("\\n", "\n"), this.Font, new SizeF(100, 100), format, this.GetTextOrientation());
|
|||
|
|
|||
|
// Adjust text size
|
|||
|
float zPositon = 0f;
|
|||
|
if (this.Axis.ChartArea.Area3DStyle.Enable3D)
|
|||
|
{
|
|||
|
// Get projection coordinates
|
|||
|
Point3D[] textSizeProjection = new Point3D[3];
|
|||
|
zPositon = this.Axis.ChartArea.IsMainSceneWallOnFront() ? this.Axis.ChartArea.areaSceneDepth : 0f;
|
|||
|
textSizeProjection[0] = new Point3D(0f, 0f, zPositon);
|
|||
|
textSizeProjection[1] = new Point3D(size.Width, 0f, zPositon);
|
|||
|
textSizeProjection[2] = new Point3D(0f, size.Height, zPositon);
|
|||
|
|
|||
|
// Transform coordinates of text size
|
|||
|
this.Axis.ChartArea.matrix3D.TransformPoints(textSizeProjection);
|
|||
|
|
|||
|
// Adjust text size
|
|||
|
int index = this.Axis.ChartArea.IsMainSceneWallOnFront() ? 0 : 1;
|
|||
|
size.Width *= size.Width / (textSizeProjection[index].X - textSizeProjection[(index == 0) ? 1 : 0].X);
|
|||
|
size.Height *= size.Height / (textSizeProjection[2].Y - textSizeProjection[0].Y);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// Get relative size of the border width
|
|||
|
SizeF sizeBorder = graph.GetRelativeSize(new SizeF(this.BorderWidth, this.BorderWidth));
|
|||
|
|
|||
|
// Find the center of rotation
|
|||
|
PointF rotationCenter = PointF.Empty;
|
|||
|
if (format.Alignment == StringAlignment.Near)
|
|||
|
{ // Near
|
|||
|
rotationCenter.X = rect.X + size.Width / 2 + sizeBorder.Width;
|
|||
|
}
|
|||
|
else if (format.Alignment == StringAlignment.Far)
|
|||
|
{ // Far
|
|||
|
rotationCenter.X = rect.Right - size.Width / 2 - sizeBorder.Width;
|
|||
|
}
|
|||
|
else
|
|||
|
{ // Center
|
|||
|
rotationCenter.X = (rect.Left + rect.Right) / 2;
|
|||
|
}
|
|||
|
|
|||
|
if (format.LineAlignment == StringAlignment.Near)
|
|||
|
{ // Near
|
|||
|
rotationCenter.Y = rect.Top + size.Height / 2 + sizeBorder.Height;
|
|||
|
}
|
|||
|
else if (format.LineAlignment == StringAlignment.Far)
|
|||
|
{ // Far
|
|||
|
rotationCenter.Y = rect.Bottom - size.Height / 2 - sizeBorder.Height;
|
|||
|
}
|
|||
|
else
|
|||
|
{ // Center
|
|||
|
rotationCenter.Y = (rect.Bottom + rect.Top) / 2;
|
|||
|
}
|
|||
|
|
|||
|
// Reset string alignment to center point
|
|||
|
format.Alignment = StringAlignment.Center;
|
|||
|
format.LineAlignment = StringAlignment.Center;
|
|||
|
|
|||
|
if (this.Axis.ChartArea.Area3DStyle.Enable3D)
|
|||
|
{
|
|||
|
// Get projection coordinates
|
|||
|
Point3D[] rotationCenterProjection = new Point3D[2];
|
|||
|
rotationCenterProjection[0] = new Point3D(rotationCenter.X, rotationCenter.Y, zPositon);
|
|||
|
if (format.FormatFlags == StringFormatFlags.DirectionVertical)
|
|||
|
{
|
|||
|
rotationCenterProjection[1] = new Point3D(rotationCenter.X, rotationCenter.Y - 20f, zPositon);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
rotationCenterProjection[1] = new Point3D(rotationCenter.X - 20f, rotationCenter.Y, zPositon);
|
|||
|
}
|
|||
|
|
|||
|
// Transform coordinates of text rotation point
|
|||
|
this.Axis.ChartArea.matrix3D.TransformPoints(rotationCenterProjection);
|
|||
|
|
|||
|
// Adjust rotation point
|
|||
|
rotationCenter = rotationCenterProjection[0].PointF;
|
|||
|
|
|||
|
// Adjust angle of the text
|
|||
|
if (angle == 0 || angle == 180 || angle == 90 || angle == 270)
|
|||
|
{
|
|||
|
if (format.FormatFlags == StringFormatFlags.DirectionVertical)
|
|||
|
{
|
|||
|
angle += 90;
|
|||
|
}
|
|||
|
|
|||
|
// Convert coordinates to absolute
|
|||
|
rotationCenterProjection[0].PointF = graph.GetAbsolutePoint(rotationCenterProjection[0].PointF);
|
|||
|
rotationCenterProjection[1].PointF = graph.GetAbsolutePoint(rotationCenterProjection[1].PointF);
|
|||
|
|
|||
|
// Calcuate axis angle
|
|||
|
float angleXAxis = (float)Math.Atan(
|
|||
|
(rotationCenterProjection[1].Y - rotationCenterProjection[0].Y) /
|
|||
|
(rotationCenterProjection[1].X - rotationCenterProjection[0].X));
|
|||
|
angleXAxis = (float)Math.Round(angleXAxis * 180f / (float)Math.PI);
|
|||
|
angle += (int)angleXAxis;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Draw string
|
|||
|
using (Brush brush = new SolidBrush(this.ForeColor))
|
|||
|
{
|
|||
|
graph.DrawStringRel(
|
|||
|
titleText.Replace("\\n", "\n"),
|
|||
|
this.Font,
|
|||
|
brush,
|
|||
|
rotationCenter,
|
|||
|
format,
|
|||
|
angle,
|
|||
|
this.GetTextOrientation());
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Strip line properties
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the text orientation.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(TextOrientation.Auto),
|
|||
|
SRDescription("DescriptionAttribute_TextOrientation"),
|
|||
|
NotifyParentPropertyAttribute(true),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public TextOrientation TextOrientation
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return this._textOrientation;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
this._textOrientation = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the strip or line starting position offset.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeData"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(0.0),
|
|||
|
SRDescription("DescriptionAttributeStripLine_IntervalOffset"),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute),
|
|||
|
#endif
|
|||
|
TypeConverter(typeof(AxisLabelDateValueConverter))
|
|||
|
]
|
|||
|
public double IntervalOffset
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _intervalOffset;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_intervalOffset = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the unit of measurement of the strip or line offset.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeData"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(DateTimeIntervalType.Auto),
|
|||
|
SRDescription("DescriptionAttributeStripLine_IntervalOffsetType"),
|
|||
|
RefreshPropertiesAttribute(RefreshProperties.All),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public DateTimeIntervalType IntervalOffsetType
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return intervalOffsetType;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
intervalOffsetType = (value != DateTimeIntervalType.NotSet) ? value : DateTimeIntervalType.Auto;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the strip or line step size.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeData"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(0.0),
|
|||
|
RefreshPropertiesAttribute(RefreshProperties.All),
|
|||
|
SRDescription("DescriptionAttributeStripLine_Interval"),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public double Interval
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _interval;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_interval = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the unit of measurement of the strip or line step.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeData"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(DateTimeIntervalType.Auto),
|
|||
|
SRDescription("DescriptionAttributeStripLine_IntervalType"),
|
|||
|
RefreshPropertiesAttribute(RefreshProperties.All),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public DateTimeIntervalType IntervalType
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _intervalType;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_intervalType = (value != DateTimeIntervalType.NotSet) ? value : DateTimeIntervalType.Auto;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the strip width.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeData"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(0.0),
|
|||
|
SRDescription("DescriptionAttributeStripLine_StripWidth"),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public double StripWidth
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _stripWidth;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
if(value < 0)
|
|||
|
{
|
|||
|
throw (new ArgumentException(SR.ExceptionStripLineWidthIsNegative, "value"));
|
|||
|
}
|
|||
|
_stripWidth = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the unit of measurement of the strip width.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeData"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(DateTimeIntervalType.Auto),
|
|||
|
SRDescription("DescriptionAttributeStripLine_StripWidthType"),
|
|||
|
RefreshPropertiesAttribute(RefreshProperties.All),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public DateTimeIntervalType StripWidthType
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _stripWidthType;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_stripWidthType = (value != DateTimeIntervalType.NotSet) ? value : DateTimeIntervalType.Auto;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the background color.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(typeof(Color), ""),
|
|||
|
SRDescription("DescriptionAttributeBackColor"),
|
|||
|
TypeConverter(typeof(ColorConverter)),
|
|||
|
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public Color BackColor
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _backColor;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_backColor = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the border color.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(typeof(Color), ""),
|
|||
|
SRDescription("DescriptionAttributeBorderColor"),
|
|||
|
TypeConverter(typeof(ColorConverter)),
|
|||
|
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public Color BorderColor
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _borderColor;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_borderColor = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the border style.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(ChartDashStyle.Solid),
|
|||
|
SRDescription("DescriptionAttributeBorderDashStyle"),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public ChartDashStyle BorderDashStyle
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _borderDashStyle;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_borderDashStyle = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the border width.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(1),
|
|||
|
SRDescription("DescriptionAttributeBorderWidth"),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public int BorderWidth
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _borderWidth;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_borderWidth = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the background image.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(""),
|
|||
|
SRDescription("DescriptionAttributeBackImage"),
|
|||
|
Editor(Editors.ImageValueEditor.Editor, Editors.ImageValueEditor.Base),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute),
|
|||
|
#endif
|
|||
|
NotifyParentPropertyAttribute(true)
|
|||
|
]
|
|||
|
public string BackImage
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _backImage;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_backImage = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the background image drawing mode.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(ChartImageWrapMode.Tile),
|
|||
|
NotifyParentPropertyAttribute(true),
|
|||
|
SRDescription("DescriptionAttributeImageWrapMode"),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public ChartImageWrapMode BackImageWrapMode
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _backImageWrapMode;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_backImageWrapMode = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets a color which will be replaced with a transparent color while drawing the background image.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(typeof(Color), ""),
|
|||
|
NotifyParentPropertyAttribute(true),
|
|||
|
SRDescription("DescriptionAttributeImageTransparentColor"),
|
|||
|
TypeConverter(typeof(ColorConverter)),
|
|||
|
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public Color BackImageTransparentColor
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _backImageTransparentColor;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_backImageTransparentColor = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the background image alignment used by unscale drawing mode.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(ChartImageAlignmentStyle.TopLeft),
|
|||
|
NotifyParentPropertyAttribute(true),
|
|||
|
SRDescription("DescriptionAttributeBackImageAlign"),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public ChartImageAlignmentStyle BackImageAlignment
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _backImageAlignment;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_backImageAlignment = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the background gradient style.
|
|||
|
/// <seealso cref="BackSecondaryColor"/>
|
|||
|
/// <seealso cref="BackColor"/>
|
|||
|
/// <seealso cref="BackHatchStyle"/>
|
|||
|
/// </summary>
|
|||
|
/// <value>
|
|||
|
/// A <see cref="GradientStyle"/> value used for the background.
|
|||
|
/// </value>
|
|||
|
/// <remarks>
|
|||
|
/// Two colors are used to draw the gradient, <see cref="BackColor"/> and <see cref="BackSecondaryColor"/>.
|
|||
|
/// </remarks>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(GradientStyle.None),
|
|||
|
SRDescription("DescriptionAttributeBackGradientStyle"),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute),
|
|||
|
#endif
|
|||
|
Editor(Editors.GradientEditor.Editor, Editors.GradientEditor.Base)
|
|||
|
]
|
|||
|
public GradientStyle BackGradientStyle
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _backGradientStyle;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_backGradientStyle = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the secondary background color.
|
|||
|
/// <seealso cref="BackColor"/>
|
|||
|
/// <seealso cref="BackHatchStyle"/>
|
|||
|
/// <seealso cref="BackGradientStyle"/>
|
|||
|
/// </summary>
|
|||
|
/// <value>
|
|||
|
/// A <see cref="Color"/> value used for the secondary color of a background with
|
|||
|
/// hatching or gradient fill.
|
|||
|
/// </value>
|
|||
|
/// <remarks>
|
|||
|
/// This color is used with <see cref="BackColor"/> when <see cref="BackHatchStyle"/> or
|
|||
|
/// <see cref="BackGradientStyle"/> are used.
|
|||
|
/// </remarks>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(typeof(Color), ""),
|
|||
|
SRDescription("DescriptionAttributeBackSecondaryColor"),
|
|||
|
TypeConverter(typeof(ColorConverter)),
|
|||
|
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public Color BackSecondaryColor
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _backSecondaryColor;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_backSecondaryColor = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the background hatch style.
|
|||
|
/// <seealso cref="BackSecondaryColor"/>
|
|||
|
/// <seealso cref="BackColor"/>
|
|||
|
/// <seealso cref="BackGradientStyle"/>
|
|||
|
/// </summary>
|
|||
|
/// <value>
|
|||
|
/// A <see cref="ChartHatchStyle"/> value used for the background.
|
|||
|
/// </value>
|
|||
|
/// <remarks>
|
|||
|
/// Two colors are used to draw the hatching, <see cref="BackColor"/> and <see cref="BackSecondaryColor"/>.
|
|||
|
/// </remarks>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(ChartHatchStyle.None),
|
|||
|
SRDescription("DescriptionAttributeBackHatchStyle"),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute),
|
|||
|
#endif
|
|||
|
Editor(Editors.HatchStyleEditor.Editor, Editors.HatchStyleEditor.Base)
|
|||
|
]
|
|||
|
public ChartHatchStyle BackHatchStyle
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _backHatchStyle;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_backHatchStyle = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the name of the strip line.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeAppearance"),
|
|||
|
Bindable(false),
|
|||
|
Browsable(false),
|
|||
|
DefaultValue("StripLine"),
|
|||
|
SRDescription("DescriptionAttributeStripLine_Name"),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute),
|
|||
|
#endif
|
|||
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
|||
|
SerializationVisibilityAttribute(SerializationVisibility.Hidden)
|
|||
|
]
|
|||
|
public string Name
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return "StripLine";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the title text of the strip line.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeTitle"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(""),
|
|||
|
SRDescription("DescriptionAttributeStripLine_Title"),
|
|||
|
NotifyParentPropertyAttribute(true),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public string Text
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _text;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_text = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the fore color of the strip line.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeTitle"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(typeof(Color), "Black"),
|
|||
|
SRDescription("DescriptionAttributeStripLine_TitleColor"),
|
|||
|
NotifyParentPropertyAttribute(true),
|
|||
|
TypeConverter(typeof(ColorConverter)),
|
|||
|
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public Color ForeColor
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _foreColor;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_foreColor = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the text alignment of the strip line.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeTitle"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(typeof(StringAlignment), "Far"),
|
|||
|
SRDescription("DescriptionAttributeStripLine_TitleAlignment"),
|
|||
|
NotifyParentPropertyAttribute(true),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public StringAlignment TextAlignment
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _textAlignment;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_textAlignment = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the text line alignment of the strip line.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeTitle"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(typeof(StringAlignment), "Near"),
|
|||
|
SRDescription("DescriptionAttributeStripLine_TitleLineAlignment"),
|
|||
|
NotifyParentPropertyAttribute(true),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public StringAlignment TextLineAlignment
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _textLineAlignment;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_textLineAlignment = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the title font.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeTitle"),
|
|||
|
Bindable(true),
|
|||
|
DefaultValue(typeof(Font), "Microsoft Sans Serif, 8pt"),
|
|||
|
SRDescription("DescriptionAttributeTitleFont"),
|
|||
|
NotifyParentPropertyAttribute(true),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public Font Font
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return _font;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
_font = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the tooltip.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeMapArea"),
|
|||
|
|
|||
|
Bindable(true),
|
|||
|
SRDescription("DescriptionAttributeToolTip"),
|
|||
|
DefaultValue(""),
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
#endif
|
|||
|
]
|
|||
|
public string ToolTip
|
|||
|
{
|
|||
|
set
|
|||
|
{
|
|||
|
this.Invalidate();
|
|||
|
_toolTip = value;
|
|||
|
}
|
|||
|
get
|
|||
|
{
|
|||
|
return _toolTip;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#if !Microsoft_CONTROL
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the URL.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeMapArea"),
|
|||
|
Bindable(true),
|
|||
|
SRDescription("DescriptionAttributeUrl"),
|
|||
|
DefaultValue(""),
|
|||
|
PersistenceMode(PersistenceMode.Attribute),
|
|||
|
Editor(Editors.UrlValueEditor.Editor, Editors.UrlValueEditor.Base)
|
|||
|
|
|||
|
]
|
|||
|
public string Url
|
|||
|
{
|
|||
|
set
|
|||
|
{
|
|||
|
_url = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
get
|
|||
|
{
|
|||
|
return _url;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the other map area attributes.
|
|||
|
/// </summary>
|
|||
|
[
|
|||
|
SRCategory("CategoryAttributeMapArea"),
|
|||
|
Bindable(true),
|
|||
|
SRDescription("DescriptionAttributeMapAreaAttributes"),
|
|||
|
DefaultValue(""),
|
|||
|
PersistenceMode(PersistenceMode.Attribute)
|
|||
|
]
|
|||
|
public string MapAreaAttributes
|
|||
|
{
|
|||
|
set
|
|||
|
{
|
|||
|
_attributes = value;
|
|||
|
this.Invalidate();
|
|||
|
}
|
|||
|
get
|
|||
|
{
|
|||
|
return _attributes;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets or sets the postback value which can be processed on a click event.
|
|||
|
/// </summary>
|
|||
|
/// <value>The value which is passed to a click event as an argument.</value>
|
|||
|
[DefaultValue("")]
|
|||
|
[SRCategory(SR.Keys.CategoryAttributeMapArea)]
|
|||
|
[SRDescription(SR.Keys.DescriptionAttributePostBackValue)]
|
|||
|
public string PostBackValue
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return this._postbackValue;
|
|||
|
}
|
|||
|
set
|
|||
|
{
|
|||
|
this._postbackValue = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#endif //#if !Microsoft_CONTROL
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
|
|||
|
#region Invalidation methods
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Invalidate chart area
|
|||
|
/// </summary>
|
|||
|
private new void Invalidate()
|
|||
|
{
|
|||
|
#if Microsoft_CONTROL
|
|||
|
|
|||
|
if(this.Axis != null)
|
|||
|
{
|
|||
|
Axis.Invalidate();
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region IDisposable Members
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Releases unmanaged and - optionally - managed resources
|
|||
|
/// </summary>
|
|||
|
/// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
|
|||
|
protected override void Dispose(bool disposing)
|
|||
|
{
|
|||
|
if (disposing)
|
|||
|
{
|
|||
|
if (_fontCache != null)
|
|||
|
{
|
|||
|
_fontCache.Dispose();
|
|||
|
_fontCache = null;
|
|||
|
}
|
|||
|
}
|
|||
|
base.Dispose(disposing);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|