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

731 lines
19 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: ImageAnnotation.cs
//
// Namespace: System.Web.UI.WebControls[Windows.Forms].Charting
//
// Classes: ImageAnnotation
//
// Purpose: Image annotation classes.
//
// 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.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;
using System.Web.UI.DataVisualization.Charting.Borders3D;
#endif
#endregion
#if Microsoft_CONTROL
namespace System.Windows.Forms.DataVisualization.Charting
#else
namespace System.Web.UI.DataVisualization.Charting
#endif
{
/// <summary>
/// <b>ImageAnnotation</b> is a class that represents an image annotation.
/// </summary>
[
SRDescription("DescriptionAttributeImageAnnotation_ImageAnnotation"),
]
#if ASPPERM_35
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
#endif
public class ImageAnnotation : Annotation
{
#region Fields
// Annotation image name
private string _imageName = String.Empty;
// Image wrapping mode
private ChartImageWrapMode _imageWrapMode = ChartImageWrapMode.Scaled;
// Image transparent color
private Color _imageTransparentColor = Color.Empty;
#endregion
#region Construction and Initialization
/// <summary>
/// Default public constructor.
/// </summary>
public ImageAnnotation()
: base()
{
}
#endregion
#region Properties
#region Image properties
/// <summary>
/// Gets or sets the name of an annotation's image.
/// <seealso cref="ImageTransparentColor"/>
/// </summary>
/// <value>
/// A string value representing the name of an annotation's image.
/// </value>
/// <remarks>
/// The name can be a file name, URL for the web control or a name from
/// the <see cref="NamedImagesCollection"/> class.
/// </remarks>
[
SRCategory("CategoryAttributeImage"),
Bindable(true),
DefaultValue(""),
Editor(Editors.ImageValueEditor.Editor, Editors.ImageValueEditor.Base),
SRDescription("DescriptionAttributeImageAnnotation_Image"),
]
public virtual string Image
{
get
{
return _imageName;
}
set
{
_imageName = value;
this.Invalidate();
}
}
/// <summary>
/// Gets or sets the drawing mode of the image.
/// </summary>
/// <value>
/// A <see cref="ChartImageWrapMode"/> value that defines the drawing mode of the image.
/// </value>
[
SRCategory("CategoryAttributeImage"),
Bindable(true),
DefaultValue(ChartImageWrapMode.Scaled),
SRDescription("DescriptionAttributeImageWrapMode"),
]
public ChartImageWrapMode ImageWrapMode
{
get
{
return _imageWrapMode;
}
set
{
_imageWrapMode = value;
this.Invalidate();
}
}
/// <summary>
/// Gets or sets a color which will be replaced with a transparent color while drawing the image.
/// </summary>
/// <value>
/// A <see cref="Color"/> value which will be replaced with a transparent color while drawing the image.
/// </value>
[
SRCategory("CategoryAttributeImage"),
Bindable(true),
DefaultValue(typeof(Color), ""),
SRDescription("DescriptionAttributeImageTransparentColor"),
TypeConverter(typeof(ColorConverter)),
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base)
]
public Color ImageTransparentColor
{
get
{
return _imageTransparentColor;
}
set
{
_imageTransparentColor = value;
this.Invalidate();
}
}
/// <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("CategoryAttributeImage"),
DefaultValue(typeof(ContentAlignment), "MiddleCenter"),
SRDescription("DescriptionAttributeImageAnnotation_Alignment"),
]
override public ContentAlignment Alignment
{
get
{
return base.Alignment;
}
set
{
base.Alignment = value;
Invalidate();
}
}
/// <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;
}
}
#endregion // Image properties
#region Other
/// <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 "Image";
}
}
/// <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 Non Applicable Annotation Appearance Attributes (set as Non-Browsable)
/// <summary>
/// Not applicable to this type of annotation.
/// <seealso cref="Font"/>
/// </summary>
/// <value>
/// A <see cref="Color"/> value.
/// </value>
[
SRCategory("CategoryAttributeAppearance"),
Browsable(false),
DefaultValue(typeof(Color), "Black"),
TypeConverter(typeof(ColorConverter)),
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base)
]
override public Color ForeColor
{
get
{
return base.ForeColor;
}
set
{
base.ForeColor = value;
}
}
/// <summary>
/// Not applicable to this type of annotation.
/// </summary>
/// <value>
/// A <see cref="Font"/> object.
/// </value>
[
SRCategory("CategoryAttributeAppearance"),
Browsable(false),
DefaultValue(typeof(Font), "Microsoft Sans Serif, 8pt"),
]
override public Font Font
{
get
{
return base.Font;
}
set
{
base.Font = value;
}
}
/// <summary>
/// Not applicable to this annotation type.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Browsable(false),
DefaultValue(typeof(Color), ""),
NotifyParentPropertyAttribute(true),
TypeConverter(typeof(ColorConverter)),
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base)
]
override public Color BackColor
{
get
{
return base.BackColor;
}
set
{
base.BackColor = value;
}
}
/// <summary>
/// Not applicable to this annotation type.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Browsable(false),
DefaultValue(ChartHatchStyle.None),
NotifyParentPropertyAttribute(true),
Editor(Editors.HatchStyleEditor.Editor, Editors.HatchStyleEditor.Base)
]
override public ChartHatchStyle BackHatchStyle
{
get
{
return base.BackHatchStyle;
}
set
{
base.BackHatchStyle = value;
}
}
/// <summary>
/// Not applicable to this annotation type.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Browsable(false),
DefaultValue(GradientStyle.None),
NotifyParentPropertyAttribute(true),
Editor(Editors.GradientEditor.Editor, Editors.GradientEditor.Base)
]
override public GradientStyle BackGradientStyle
{
get
{
return base.BackGradientStyle;
}
set
{
base.BackGradientStyle = value;
}
}
/// <summary>
/// Not applicable to this annotation type.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Browsable(false),
DefaultValue(typeof(Color), ""),
NotifyParentPropertyAttribute(true),
TypeConverter(typeof(ColorConverter)),
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base)
]
override public Color BackSecondaryColor
{
get
{
return base.BackSecondaryColor;
}
set
{
base.BackSecondaryColor = value;
}
}
/// <summary>
/// Not applicable to this annotation type.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Browsable(false),
DefaultValue(typeof(Color), "Black"),
TypeConverter(typeof(ColorConverter)),
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base)
]
override public Color LineColor
{
get
{
return base.LineColor;
}
set
{
base.LineColor = value;
}
}
/// <summary>
/// Not applicable to this annotation type.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
DefaultValue(1),
Browsable(false),
SRDescription("DescriptionAttributeLineWidth"),
]
override public int LineWidth
{
get
{
return base.LineWidth;
}
set
{
base.LineWidth = value;
}
}
/// <summary>
/// Not applicable to this annotation type.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Browsable(false),
DefaultValue(ChartDashStyle.Solid),
SRDescription("DescriptionAttributeLineDashStyle"),
]
override public ChartDashStyle LineDashStyle
{
get
{
return base.LineDashStyle;
}
set
{
base.LineDashStyle = value;
}
}
#endregion
#endregion
#region Methods
#region Painting
/// <summary>
/// Paints the annotation object on 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"/> owner control.
/// </param>
override internal void Paint(Chart chart, ChartGraphics graphics)
{
// 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));
// Get position
RectangleF rectanglePosition = new RectangleF(selectionRect.Location, selectionRect.Size);
if(rectanglePosition.Width < 0)
{
rectanglePosition.X = rectanglePosition.Right;
rectanglePosition.Width = -rectanglePosition.Width;
}
if(rectanglePosition.Height < 0)
{
rectanglePosition.Y = rectanglePosition.Bottom;
rectanglePosition.Height = -rectanglePosition.Height;
}
// Check if position is valid
if( float.IsNaN(rectanglePosition.X) ||
float.IsNaN(rectanglePosition.Y) ||
float.IsNaN(rectanglePosition.Right) ||
float.IsNaN(rectanglePosition.Bottom) )
{
return;
}
if(this.Common.ProcessModePaint)
{
// Draw "empty" image at design time
if(this._imageName.Length == 0 && this.Chart.IsDesignMode() )
{
graphics.FillRectangleRel(
rectanglePosition,
this.BackColor,
this.BackHatchStyle,
this._imageName,
this._imageWrapMode,
this._imageTransparentColor,
GetImageAlignment(this.Alignment),
this.BackGradientStyle,
this.BackSecondaryColor,
this.LineColor,
this.LineWidth,
this.LineDashStyle,
this.ShadowColor,
this.ShadowOffset,
PenAlignment.Center);
// Draw text
using( Brush textBrush = new SolidBrush(this.ForeColor) )
{
using (StringFormat format = new StringFormat(StringFormat.GenericTypographic))
{
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
format.FormatFlags = StringFormatFlags.LineLimit;
format.Trimming = StringTrimming.EllipsisCharacter;
graphics.DrawStringRel(
"(no image)",
this.Font,
textBrush,
rectanglePosition,
format);
}
}
}
else
{
// Draw image
graphics.FillRectangleRel(
rectanglePosition,
Color.Transparent,
this.BackHatchStyle,
this._imageName,
this._imageWrapMode,
this._imageTransparentColor,
GetImageAlignment(this.Alignment),
this.BackGradientStyle,
Color.Transparent,
Color.Transparent,
0,
this.LineDashStyle,
this.ShadowColor,
this.ShadowOffset,
PenAlignment.Center);
}
}
if(this.Common.ProcessModeRegions)
{
// Add hot region
this.Common.HotRegionsList.AddHotRegion(
rectanglePosition,
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);
}
/// <summary>
/// Coverts ContentAlignment enumeration to ChartImageAlignmentStyle enumeration.
/// </summary>
/// <param name="alignment">Content alignment.</param>
/// <returns>Image content alignment.</returns>
private ChartImageAlignmentStyle GetImageAlignment(ContentAlignment alignment)
{
if(alignment == ContentAlignment.TopLeft)
{
return ChartImageAlignmentStyle.TopLeft;
}
else if(alignment == ContentAlignment.TopCenter)
{
return ChartImageAlignmentStyle.Top;
}
else if(alignment == ContentAlignment.TopRight)
{
return ChartImageAlignmentStyle.TopRight;
}
else if(alignment == ContentAlignment.MiddleRight)
{
return ChartImageAlignmentStyle.Right;
}
else if(alignment == ContentAlignment.BottomRight)
{
return ChartImageAlignmentStyle.BottomRight;
}
else if(alignment == ContentAlignment.BottomCenter)
{
return ChartImageAlignmentStyle.Bottom;
}
else if(alignment == ContentAlignment.BottomLeft)
{
return ChartImageAlignmentStyle.BottomLeft;
}
else if(alignment == ContentAlignment.MiddleLeft)
{
return ChartImageAlignmentStyle.Left;
}
return ChartImageAlignmentStyle.Center;
}
#endregion // Painting
#region Content Size
/// <summary>
/// Gets text annotation content size based on the text and font.
/// </summary>
/// <returns>Annotation content position.</returns>
override internal RectangleF GetContentPosition()
{
// Check image size
if(this.Image.Length > 0)
{
// Try loading image and getting its size
try
{
if(this.Chart != null)
{
ImageLoader imageLoader = this.Common.ImageLoader;
if(imageLoader != null)
{
ChartGraphics chartGraphics = this.GetGraphics();
if (chartGraphics != null)
{
SizeF absSize = new SizeF();
if (imageLoader.GetAdjustedImageSize(this.Image, chartGraphics.Graphics, ref absSize))
{
SizeF imageSize = chartGraphics.GetRelativeSize(absSize);
return new RectangleF(float.NaN, float.NaN, imageSize.Width, imageSize.Height);
}
}
}
}
}
catch(ArgumentException)
{
// ArgumentException is thrown by LoadImage in certain situations when it can't load the image
}
}
return new RectangleF(float.NaN, float.NaN, float.NaN, float.NaN);
}
#endregion
#endregion
}
}