Xamarin Public Jenkins (auto-signing) 536cd135cc Imported Upstream version 5.4.0.167
Former-commit-id: 5624ac747d633e885131e8349322922b6a59baaa
2017-08-21 15:34:15 +00:00

996 lines
27 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//-------------------------------------------------------------
// <copyright company=Microsoft Corporation>
// Copyright © Microsoft Corporation. All Rights Reserved.
// </copyright>
//-------------------------------------------------------------
// @owner=alexgor, deliant
//=================================================================
// File: GroupAnnotation.cs
//
// Namespace: System.Web.UI.WebControls[Windows.Forms].Charting
//
// Classes: AnnotationGroup
//
// Purpose: Annotation group class.
//
// Reviewed:
//
//===================================================================
#region Used namespace
using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Data;
using System.Drawing;
using System.Drawing.Design;
using System.Drawing.Text;
using System.Drawing.Drawing2D;
#if Microsoft_CONTROL
using System.Windows.Forms;
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;
#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>
/// <b>AnnotationGroup</b> is a class that represents an annotation group.
/// </summary>
/// <remarks>
/// This class is a collection of annotations, and can be used
/// to manipulate annotations relative to each other.
/// </remarks>
[
SRDescription("DescriptionAttributeAnnotationGroup_AnnotationGroup"),
]
#if ASPPERM_35
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
#endif
public class AnnotationGroup : Annotation
{
#region Fields
// Collection of annotations in the group
internal AnnotationCollection annotations = null;
#endregion
#region Construction and Initialization
/// <summary>
/// Default public constructor.
/// </summary>
public AnnotationGroup()
: base()
{
annotations = new AnnotationCollection(this);
annotations.AnnotationGroup = this;
}
#endregion
#region Miscellaneous Properties
/// <summary>
/// Gets or sets the name of the chart area which an annotation is clipped to.
/// </summary>
/// <value>
/// A string which represents the name of an existing chart area.
/// </value>
/// <remarks>
/// If the chart area name is specified, an annotation will only be drawn inside the
/// plotting area of the chart area specified. All parts of the annotation
/// outside of the plotting area will be clipped.
/// <para>
/// To disable chart area clipping, set the property to "NotSet" or an empty string.
/// </para>
/// </remarks>
[
SRCategory("CategoryAttributeMisc"),
DefaultValue(Constants.NotSetValue),
SRDescription("DescriptionAttributeAnnotationGroup_ClipToChartArea"),
TypeConverter(typeof(LegendAreaNameConverter)),
Browsable(false),
]
override public string ClipToChartArea
{
get
{
return base.ClipToChartArea;
}
set
{
base.ClipToChartArea = value;
foreach(Annotation annotation in this.annotations)
{
annotation.ClipToChartArea = value;
}
}
}
#endregion
#region Position Properties
/// <summary>
/// Gets or sets a flag that specifies whether the size of an annotation is always
/// defined in relative chart coordinates.
/// <seealso cref="Annotation.Width"/>
/// <seealso cref="Annotation.Height"/>
/// </summary>
/// <value>
/// <b>True</b> if an annotation's <see cref="Annotation.Width"/> and <see cref="Annotation.Height"/> are always
/// in chart relative coordinates, <b>false</b> otherwise.
/// </value>
/// <remarks>
/// An annotation's width and height may be set in relative chart or axes coordinates.
/// By default, relative chart coordinates are used.
/// <para>
/// To use axes coordinates for size set the <b>IsSizeAlwaysRelative</b> property to
/// <b>false</b> and either anchor the annotation to a data point or set the
/// <see cref="Annotation.AxisX"/> or <see cref="Annotation.AxisY"/> properties.
/// </para>
/// </remarks>
[
SRCategory("CategoryAttributePosition"),
DefaultValue(true),
SRDescription("DescriptionAttributeAnnotationGroup_SizeAlwaysRelative"),
]
override public bool IsSizeAlwaysRelative
{
get
{
return base.IsSizeAlwaysRelative;
}
set
{
base.IsSizeAlwaysRelative = value;
}
}
#endregion
#region Visual Properties
#if Microsoft_CONTROL
/// <summary>
/// Gets or sets a flag that determines if an annotation is selected.
/// <seealso cref="Annotation.AllowSelecting"/>
/// </summary>
/// <value>
/// <b>True</b> if the annotation is selected, <b>false</b> otherwise.
/// </value>
#else
/// <summary>
/// Gets or sets a flag that determines if an annotation is selected.
/// </summary>
/// <value>
/// <b>True</b> if the annotation is selected, <b>false</b> otherwise.
/// </value>
#endif // Microsoft_CONTROL
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(false),
Browsable(false),
SRDescription("DescriptionAttributeAnnotationGroup_Selected"),
]
override public bool IsSelected
{
get
{
return base.IsSelected;
}
set
{
base.IsSelected = value;
// Clear selection for all annotations in the group
foreach(Annotation annotation in this.annotations)
{
annotation.IsSelected = false;
}
}
}
/// <summary>
/// Gets or sets a flag that specifies whether an annotation is visible.
/// </summary>
/// <value>
/// <b>True</b> if the annotation is visible, <b>false</b> otherwise.
/// </value>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(true),
SRDescription("DescriptionAttributeAnnotationGroup_Visible"),
ParenthesizePropertyNameAttribute(true),
]
override public bool Visible
{
get
{
return base.Visible;
}
set
{
base.Visible = value;
}
}
/// <summary>
/// Gets or sets an annotation's content alignment.
/// </summary>
/// <value>
/// A <see cref="ContentAlignment"/> value that represents the content alignment.
/// </value>
/// <remarks>
/// This property is used to align text for <see cref="TextAnnotation"/>, <see cref="RectangleAnnotation"/>,
/// <see cref="EllipseAnnotation"/> and <see cref="CalloutAnnotation"/> objects, and to align
/// a non-scaled image inside an <see cref="ImageAnnotation"/> object.
/// </remarks>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(typeof(ContentAlignment), "MiddleCenter"),
SRDescription("DescriptionAttributeAlignment"),
Browsable(false),
]
override public ContentAlignment Alignment
{
get
{
return base.Alignment;
}
set
{
base.Alignment = value;
foreach(Annotation annotation in this.annotations)
{
annotation.Alignment = value;
}
}
}
/// <summary>
/// Gets or sets an annotation's text style.
/// <seealso cref="Font"/>
/// <seealso cref="ForeColor"/>
/// </summary>
/// <value>
/// A <see cref="TextStyle"/> value used to draw an annotation's text.
/// </value>
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
public override TextStyle TextStyle
{
get
{
return base.TextStyle;
}
set
{
base.TextStyle = value;
}
}
/// <summary>
/// Gets or sets the text color of an annotation.
/// <seealso cref="Font"/>
/// </summary>
/// <value>
/// A <see cref="Color"/> value used for the text color of an annotation.
/// </value>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(typeof(Color), "Black"),
SRDescription("DescriptionAttributeForeColor"),
TypeConverter(typeof(ColorConverter)),
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
Browsable(false),
]
override public Color ForeColor
{
get
{
return base.ForeColor;
}
set
{
base.ForeColor = value;
foreach(Annotation annotation in this.annotations)
{
annotation.ForeColor = value;
}
}
}
/// <summary>
/// Gets or sets the font of an annotation's text.
/// <seealso cref="ForeColor"/>
/// </summary>
/// <value>
/// A <see cref="Font"/> object used for an annotation's text.
/// </value>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(typeof(Font), "Microsoft Sans Serif, 8pt"),
SRDescription("DescriptionAttributeTextFont"),
Browsable(false),
]
override public Font Font
{
get
{
return base.Font;
}
set
{
base.Font = value;
foreach(Annotation annotation in this.annotations)
{
annotation.Font = value;
}
}
}
/// <summary>
/// Gets or sets the color of an annotation line.
/// <seealso cref="LineWidth"/>
/// <seealso cref="LineDashStyle"/>
/// </summary>
/// <value>
/// A <see cref="Color"/> value used to draw an annotation line.
/// </value>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(typeof(Color), "Black"),
SRDescription("DescriptionAttributeLineColor"),
TypeConverter(typeof(ColorConverter)),
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
Browsable(false),
]
override public Color LineColor
{
get
{
return base.LineColor;
}
set
{
base.LineColor = value;
foreach(Annotation annotation in this.annotations)
{
annotation.LineColor = value;
}
}
}
/// <summary>
/// Gets or sets the width of an annotation line.
/// <seealso cref="LineColor"/>
/// <seealso cref="LineDashStyle"/>
/// </summary>
/// <value>
/// An integer value defining the width of an annotation line in pixels.
/// </value>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(1),
SRDescription("DescriptionAttributeLineWidth"),
Browsable(false),
]
override public int LineWidth
{
get
{
return base.LineWidth;
}
set
{
base.LineWidth = value;
foreach(Annotation annotation in this.annotations)
{
annotation.LineWidth = value;
}
}
}
/// <summary>
/// Gets or sets the style of an annotation line.
/// <seealso cref="LineWidth"/>
/// <seealso cref="LineColor"/>
/// </summary>
/// <value>
/// A <see cref="ChartDashStyle"/> value used to draw an annotation line.
/// </value>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(ChartDashStyle.Solid),
SRDescription("DescriptionAttributeLineDashStyle"),
Browsable(false),
]
override public ChartDashStyle LineDashStyle
{
get
{
return base.LineDashStyle;
}
set
{
base.LineDashStyle = value;
foreach(Annotation annotation in this.annotations)
{
annotation.LineDashStyle = value;
}
}
}
/// <summary>
/// Gets or sets the background color of an annotation.
/// <seealso cref="BackSecondaryColor"/>
/// <seealso cref="BackHatchStyle"/>
/// <seealso cref="BackGradientStyle"/>
/// </summary>
/// <value>
/// A <see cref="Color"/> value used for the background of an annotation.
/// </value>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(typeof(Color), ""),
SRDescription("DescriptionAttributeBackColor"),
NotifyParentPropertyAttribute(true),
TypeConverter(typeof(ColorConverter)),
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
Browsable(false),
]
override public Color BackColor
{
get
{
return base.BackColor;
}
set
{
base.BackColor = value;
foreach(Annotation annotation in this.annotations)
{
annotation.BackColor = value;
}
}
}
/// <summary>
/// Gets or sets the background hatch style of an annotation.
/// <seealso cref="BackSecondaryColor"/>
/// <seealso cref="BackColor"/>
/// <seealso cref="BackGradientStyle"/>
/// </summary>
/// <value>
/// A <see cref="ChartHatchStyle"/> value used for the background of an annotation.
/// </value>
/// <remarks>
/// Two colors are used to draw the hatching, <see cref="BackColor"/> and <see cref="BackSecondaryColor"/>.
/// </remarks>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(ChartHatchStyle.None),
NotifyParentPropertyAttribute(true),
SRDescription("DescriptionAttributeBackHatchStyle"),
Editor(Editors.HatchStyleEditor.Editor, Editors.HatchStyleEditor.Base),
Browsable(false),
]
override public ChartHatchStyle BackHatchStyle
{
get
{
return base.BackHatchStyle;
}
set
{
base.BackHatchStyle = value;
foreach(Annotation annotation in this.annotations)
{
annotation.BackHatchStyle = value;
}
}
}
/// <summary>
/// Gets or sets the background gradient style of an annotation.
/// <seealso cref="BackSecondaryColor"/>
/// <seealso cref="BackColor"/>
/// <seealso cref="BackHatchStyle"/>
/// </summary>
/// <value>
/// A <see cref="GradientStyle"/> value used for the background of an annotation.
/// </value>
/// <remarks>
/// Two colors are used to draw the gradient, <see cref="BackColor"/> and <see cref="BackSecondaryColor"/>.
/// </remarks>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(GradientStyle.None),
NotifyParentPropertyAttribute(true),
SRDescription("DescriptionAttributeBackGradientStyle"),
Editor(Editors.GradientEditor.Editor, Editors.GradientEditor.Base),
Browsable(false),
]
override public GradientStyle BackGradientStyle
{
get
{
return base.BackGradientStyle;
}
set
{
base.BackGradientStyle = value;
foreach(Annotation annotation in this.annotations)
{
annotation.BackGradientStyle = value;
}
}
}
/// <summary>
/// Gets or sets the secondary background color of an annotation.
/// <seealso cref="BackColor"/>
/// <seealso cref="BackHatchStyle"/>
/// <seealso cref="BackGradientStyle"/>
/// </summary>
/// <value>
/// A <see cref="Color"/> value used for the secondary color of an annotation 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"),
DefaultValue(typeof(Color), ""),
NotifyParentPropertyAttribute(true),
SRDescription("DescriptionAttributeBackSecondaryColor"),
TypeConverter(typeof(ColorConverter)),
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
Browsable(false),
]
override public Color BackSecondaryColor
{
get
{
return base.BackSecondaryColor;
}
set
{
base.BackSecondaryColor = value;
foreach(Annotation annotation in this.annotations)
{
annotation.BackSecondaryColor = value;
}
}
}
/// <summary>
/// Gets or sets the color of an annotation's shadow.
/// <seealso cref="ShadowOffset"/>
/// </summary>
/// <value>
/// A <see cref="Color"/> value used to draw an annotation's shadow.
/// </value>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(typeof(Color), "128,0,0,0"),
SRDescription("DescriptionAttributeShadowColor"),
TypeConverter(typeof(ColorConverter)),
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
Browsable(false),
]
override public Color ShadowColor
{
get
{
return base.ShadowColor;
}
set
{
base.ShadowColor = value;
foreach(Annotation annotation in this.annotations)
{
annotation.ShadowColor = value;
}
}
}
/// <summary>
/// Gets or sets the offset between an annotation and its shadow.
/// <seealso cref="ShadowColor"/>
/// </summary>
/// <value>
/// An integer value that represents the offset between an annotation and its shadow.
/// </value>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(0),
SRDescription("DescriptionAttributeShadowOffset"),
Browsable(false),
]
override public int ShadowOffset
{
get
{
return base.ShadowOffset;
}
set
{
base.ShadowOffset = value;
foreach(Annotation annotation in this.annotations)
{
annotation.ShadowOffset = value;
}
}
}
#endregion
#region Editing Permissions Properties
#if Microsoft_CONTROL
/// <summary>
/// Gets or sets a flag that specifies whether an annotation may be selected
/// with a mouse by the end user.
/// </summary>
/// <value>
/// <b>True</b> if the annotation may be selected, <b>false</b> otherwise.
/// </value>
[
SRCategory("CategoryAttributeEditing"),
DefaultValue(false),
SRDescription("DescriptionAttributeAllowSelecting"),
]
override public bool AllowSelecting
{
get
{
return base.AllowSelecting;
}
set
{
base.AllowSelecting = value;
}
}
/// <summary>
/// Gets or sets a flag that specifies whether an annotation may be moved
/// with a mouse by the end user.
/// </summary>
/// <value>
/// <b>True</b> if the annotation may be moved, <b>false</b> otherwise.
/// </value>
[
SRCategory("CategoryAttributeEditing"),
DefaultValue(false),
SRDescription("DescriptionAttributeAllowMoving"),
]
override public bool AllowMoving
{
get
{
return base.AllowMoving;
}
set
{
base.AllowMoving = value;
}
}
/// <summary>
/// Gets or sets a flag that specifies whether an annotation anchor may be moved
/// with a mouse by the end user.
/// </summary>
/// <value>
/// <b>True</b> if the annotation anchor may be moved, <b>false</b> otherwise.
/// </value>
[
SRCategory("CategoryAttributeEditing"),
DefaultValue(false),
SRDescription("DescriptionAttributeAnnotationGroup_AllowAnchorMoving"),
]
override public bool AllowAnchorMoving
{
get
{
return base.AllowAnchorMoving;
}
set
{
base.AllowAnchorMoving = value;
}
}
/// <summary>
/// Gets or sets a flag that specifies whether an annotation may be resized
/// with a mouse by the end user.
/// </summary>
/// <value>
/// <b>True</b> if the annotation may be resized, <b>false</b> otherwise.
/// </value>
[
SRCategory("CategoryAttributeEditing"),
DefaultValue(false),
SRDescription("DescriptionAttributeAllowResizing"),
]
override public bool AllowResizing
{
get
{
return base.AllowResizing;
}
set
{
base.AllowResizing = value;
}
}
/// <summary>
/// Gets or sets a flag that specifies whether an annotation's text may be edited
/// when the end user double clicks on the text.
/// </summary>
/// <value>
/// <b>True</b> if the annotation text may be edited, <b>false</b> otherwise.
/// </value>
[
SRCategory("CategoryAttributeEditing"),
DefaultValue(false),
SRDescription("DescriptionAttributeAllowTextEditing"),
]
override public bool AllowTextEditing
{
get
{
return base.AllowTextEditing;
}
set
{
base.AllowTextEditing = value;
}
}
/// <summary>
/// Gets or sets a flag that specifies whether a polygon annotation's points
/// may be moved with a mouse by the end user.
/// </summary>
/// <value>
/// <b>True</b> if the polygon annotation's points may be moved, <b>false</b> otherwise.
/// </value>
[
SRCategory("CategoryAttributeEditing"),
DefaultValue(false),
SRDescription("DescriptionAttributeAnnotationGroup_AllowPathEditing"),
]
override public bool AllowPathEditing
{
get
{
return base.AllowPathEditing;
}
set
{
base.AllowPathEditing = value;
}
}
#endif // Microsoft_CONTROL
#endregion
#region Other Properties
/// <summary>
/// Gets the collection of annotations in the group.
/// </summary>
/// <value>
/// An <see cref="AnnotationCollection"/> object.
/// </value>
/// <remarks>
/// Note that the coordinates of all annotations in the group are relative to the
/// group annotation.
/// </remarks>
[
SRCategory("CategoryAttributeAnnotations"),
SRDescription("DescriptionAttributeAnnotationGroup_Annotations"),
Editor(Editors.AnnotationCollectionEditor.Editor, Editors.AnnotationCollectionEditor.Base),
#if Microsoft_CONTROL
DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
#else // Microsoft_CONTROL
PersistenceMode(PersistenceMode.InnerProperty),
#endif // Microsoft_CONTROL
]
public AnnotationCollection Annotations
{
get
{
return annotations;
}
}
/// <summary>
/// Gets or sets an annotation's type name.
/// </summary>
/// <remarks>
/// This property is used to get the name of each annotation type
/// (e.g. Line, Rectangle, Ellipse).
/// <para>
/// This property is for internal use and is hidden at design and run time.
/// </para>
/// </remarks>
[
SRCategory("CategoryAttributeMisc"),
Bindable(true),
Browsable(false),
EditorBrowsableAttribute(EditorBrowsableState.Never),
DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden),
SerializationVisibilityAttribute(SerializationVisibility.Hidden),
SRDescription("DescriptionAttributeAnnotationType"),
]
public override string AnnotationType
{
get
{
return "Group";
}
}
/// <summary>
/// Gets or sets annotation selection points style.
/// </summary>
/// <value>
/// A <see cref="SelectionPointsStyle"/> value that represents annotation
/// selection style.
/// </value>
/// <remarks>
/// This property is for internal use and is hidden at design and run time.
/// </remarks>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(SelectionPointsStyle.Rectangle),
ParenthesizePropertyNameAttribute(true),
Browsable(false),
EditorBrowsableAttribute(EditorBrowsableState.Never),
DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden),
SerializationVisibilityAttribute(SerializationVisibility.Hidden),
SRDescription("DescriptionAttributeSelectionPointsStyle"),
]
override internal SelectionPointsStyle SelectionPointsStyle
{
get
{
return SelectionPointsStyle.Rectangle;
}
}
#endregion
#region Methods
/// <summary>
/// Paints an annotation object using the specified graphics.
/// </summary>
/// <param name="graphics">
/// A <see cref="ChartGraphics"/> object, used to paint the annotation object.
/// </param>
/// <param name="chart">
/// Reference to the <see cref="Chart"/> control.
/// </param>
override internal void Paint(Chart chart, ChartGraphics graphics)
{
// Paint all annotations in the group
foreach(Annotation annotation in this.annotations)
{
annotation.Paint(chart, graphics);
}
if( (this.Common.ProcessModePaint && this.IsSelected) ||
this.Common.ProcessModeRegions )
{
// Get annotation position in relative coordinates
PointF firstPoint = PointF.Empty;
PointF anchorPoint = PointF.Empty;
SizeF size = SizeF.Empty;
GetRelativePosition(out firstPoint, out size, out anchorPoint);
PointF secondPoint = new PointF(firstPoint.X + size.Width, firstPoint.Y + size.Height);
// Create selection rectangle
RectangleF selectionRect = new RectangleF(firstPoint, new SizeF(secondPoint.X - firstPoint.X, secondPoint.Y - firstPoint.Y));
// Check rectangle orientation
if(selectionRect.Width < 0)
{
selectionRect.X = selectionRect.Right;
selectionRect.Width = -selectionRect.Width;
}
if(selectionRect.Height < 0)
{
selectionRect.Y = selectionRect.Bottom;
selectionRect.Height = -selectionRect.Height;
}
// Check if text position is valid
if( selectionRect.IsEmpty ||
float.IsNaN(selectionRect.X) ||
float.IsNaN(selectionRect.Y) ||
float.IsNaN(selectionRect.Right) ||
float.IsNaN(selectionRect.Bottom) )
{
return;
}
if(this.Common.ProcessModeRegions)
{
// Add hot region
this.Common.HotRegionsList.AddHotRegion(
selectionRect,
ReplaceKeywords(this.ToolTip),
#if Microsoft_CONTROL
String.Empty,
String.Empty,
String.Empty,
#else // Microsoft_CONTROL
ReplaceKeywords(this.Url),
ReplaceKeywords(this.MapAreaAttributes),
ReplaceKeywords(this.PostBackValue),
#endif // Microsoft_CONTROL
this,
ChartElementType.Annotation,
String.Empty);
}
// Paint selection handles
PaintSelectionHandles(graphics, selectionRect, null);
}
}
#endregion // Methods
#region IDisposable override
/// <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)
{
//Clean up managed resources
if (this.annotations != null)
{
this.annotations.Dispose();
this.annotations = null;
}
}
base.Dispose(disposing);
}
#endregion
}
}