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

785 lines
20 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: Borders3D.cs
//
// Namespace: System.Web.UI.WebControls[Windows.Forms].Charting
// System.Web.UI.WebControls[Windows.Forms].Charting.Borders3D
//
// Classes: BorderTypeRegistry, IBorderType, BorderSkin
//
// Purpose: 3D borders related classes:
// BorderTypeRegistry - known borders registry.
// IBorderType - border class interface.
// BorderSkin - border visual properties.
//
// Reviewed: AG - August 7, 2002
//
//===================================================================
#region Used namespaces
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Design;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Resources;
using System.Reflection;
using System.IO;
using System.Drawing.Imaging;
#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.Windows.Forms.Design;
#else
using System.Web.UI;
using System.Web.UI.DataVisualization.Charting.Data;
using System.Web.UI.DataVisualization.Charting.ChartTypes;
using System.Web.UI.DataVisualization.Charting;
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
{
#region Border style enumeration
/// <summary>
/// Styles of the border skin.
/// </summary>
public enum BorderSkinStyle
{
/// <summary>
/// Border not used.
/// </summary>
None,
/// <summary>
/// Emboss border.
/// </summary>
Emboss,
/// <summary>
/// Raised border.
/// </summary>
Raised,
/// <summary>
/// Sunken border.
/// </summary>
Sunken,
/// <summary>
/// Thin border with rounded corners.
/// </summary>
FrameThin1,
/// <summary>
/// Thin border with rounded top corners.
/// </summary>
FrameThin2,
/// <summary>
/// Thin border with square corners.
/// </summary>
FrameThin3,
/// <summary>
/// Thin border with square outside corners and rounded inside corners.
/// </summary>
FrameThin4,
/// <summary>
/// Thin border with rounded corners and ----s.
/// </summary>
FrameThin5,
/// <summary>
/// Thin border with square inside corners and rounded outside corners.
/// </summary>
FrameThin6,
/// <summary>
/// Border with rounded corners. Supports title text.
/// </summary>
FrameTitle1,
/// <summary>
/// Border with rounded top corners. Supports title text.
/// </summary>
FrameTitle2,
/// <summary>
/// Border with square corners. Supports title text.
/// </summary>
FrameTitle3,
/// <summary>
/// Border with rounded inside corners and square outside corners. Supports title text.
/// </summary>
FrameTitle4,
/// <summary>
/// Border with rounded corners and ----s. Supports title text.
/// </summary>
FrameTitle5,
/// <summary>
/// Border with rounded outside corners and square inside corners. Supports title text.
/// </summary>
FrameTitle6,
/// <summary>
/// Border with rounded corners. No border on the right side. Supports title text.
/// </summary>
FrameTitle7,
/// <summary>
/// Border with rounded corners on top and bottom sides only. Supports title text.
/// </summary>
FrameTitle8
}
#endregion
/// <summary>
/// Drawing properties of the 3D border skin.
/// </summary>
[
DefaultProperty("SkinStyle"),
SRDescription("DescriptionAttributeBorderSkin_BorderSkin"),
]
#if ASPPERM_35
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
#endif
public class BorderSkin : ChartElement
{
#region Fields
// Private data members, which store properties values
private Color _pageColor = Color.White;
private BorderSkinStyle _skinStyle = BorderSkinStyle.None;
private GradientStyle _backGradientStyle = GradientStyle.None;
private Color _backSecondaryColor = Color.Empty;
private Color _backColor = Color.Gray;
private string _backImage = "";
private ChartImageWrapMode _backImageWrapMode = ChartImageWrapMode.Tile;
private Color _backImageTransparentColor = Color.Empty;
private ChartImageAlignmentStyle _backImageAlignment = ChartImageAlignmentStyle.TopLeft;
private Color _borderColor = Color.Black;
private int _borderWidth = 1;
private ChartDashStyle _borderDashStyle = ChartDashStyle.NotSet;
private ChartHatchStyle _backHatchStyle = ChartHatchStyle.None;
#endregion
#region Constructors
/// <summary>
/// Default public constructor.
/// </summary>
public BorderSkin() : base()
{
}
/// <summary>
/// Constructor.
/// </summary>
/// <param name="parent">The parent chart element.</param>
internal BorderSkin(IChartElement parent) : base (parent)
{
}
#endregion
#region Border skin properties
/// <summary>
/// Gets or sets the page color of a border skin.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(true),
DefaultValue(typeof(Color), "White"),
SRDescription("DescriptionAttributeBorderSkin_PageColor"),
TypeConverter(typeof(ColorConverter)),
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
#if !Microsoft_CONTROL
PersistenceMode(PersistenceMode.Attribute)
#endif
]
public Color PageColor
{
get
{
return _pageColor;
}
set
{
_pageColor = value;
this.Invalidate();
}
}
/// <summary>
/// Gets or sets the style of a border skin.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(true),
DefaultValue(BorderSkinStyle.None),
SRDescription("DescriptionAttributeBorderSkin_SkinStyle"),
#if !Microsoft_CONTROL
PersistenceMode(PersistenceMode.Attribute),
#endif
ParenthesizePropertyNameAttribute(true)
]
public BorderSkinStyle SkinStyle
{
get
{
return _skinStyle;
}
set
{
_skinStyle = value;
this.Invalidate();
}
}
/// <summary>
/// Gets or sets the background color of a skin frame.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(true),
DefaultValue(typeof(Color), "Gray"),
SRDescription("DescriptionAttributeFrameBackColor"),
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 of a skin frame.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(true),
DefaultValue(typeof(Color), "Black"),
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 background hatch style of a skin frame.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(true),
DefaultValue(ChartHatchStyle.None),
SRDescription("DescriptionAttributeFrameBackHatchStyle"),
#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 background image of a skin frame.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(true),
DefaultValue(""),
SRDescription("DescriptionAttributeBackImage"),
Editor(Editors.ImageValueEditor.Editor, Editors.ImageValueEditor.Base),
#if !Microsoft_CONTROL
PersistenceMode(PersistenceMode.Attribute),
#endif
]
public string BackImage
{
get
{
return _backImage;
}
set
{
_backImage = value;
this.Invalidate();
}
}
/// <summary>
/// Gets or sets the drawing mode for the background image of a skin frame.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(true),
DefaultValue(ChartImageWrapMode.Tile),
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 of a skin frame.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(true),
DefaultValue(typeof(Color), ""),
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 of a skin frame.
/// </summary>
/// <remarks>
/// Used by ClampUnscale drawing mode.
/// </remarks>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(true),
DefaultValue(ChartImageAlignmentStyle.TopLeft),
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 of a skin frame.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(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 of a skin frame.
/// </summary>
/// <remarks>
/// This color is used with <see cref="BackColor"/> when <see cref="BackHatchStyle"/> or
/// <see cref="BackGradientStyle"/> are used.
/// </remarks>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(true),
DefaultValue(typeof(Color), ""),
SRDescription("DescriptionAttributeBorderSkin_FrameBackSecondaryColor"),
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 width of the border line of a skin frame.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(true),
DefaultValue(1),
SRDescription("DescriptionAttributeBorderSkin_FrameBorderWidth"),
#if !Microsoft_CONTROL
PersistenceMode(PersistenceMode.Attribute)
#endif
]
public int BorderWidth
{
get
{
return _borderWidth;
}
set
{
if(value < 0)
{
throw(new ArgumentOutOfRangeException("value", SR.ExceptionBorderWidthIsNotPositive));
}
_borderWidth = value;
this.Invalidate();
}
}
/// <summary>
/// Gets or sets the style of the border line of a skin frame.
/// </summary>
[
SRCategory("CategoryAttributeAppearance"),
Bindable(true),
NotifyParentPropertyAttribute(true),
DefaultValue(ChartDashStyle.NotSet),
SRDescription("DescriptionAttributeBorderSkin_FrameBorderDashStyle"),
#if !Microsoft_CONTROL
PersistenceMode(PersistenceMode.Attribute)
#endif
]
public ChartDashStyle BorderDashStyle
{
get
{
return _borderDashStyle;
}
set
{
_borderDashStyle = value;
this.Invalidate();
}
}
#endregion
}
}
#if Microsoft_CONTROL
namespace System.Windows.Forms.DataVisualization.Charting.Borders3D
#else
namespace System.Web.UI.DataVisualization.Charting.Borders3D
#endif
{
/// <summary>
/// Keep track of all registered 3D borders.
/// </summary>
internal class BorderTypeRegistry : IServiceProvider
{
#region Fields
// Border types image resource manager
private ResourceManager _resourceManager = null;
// Storage for all registered border types
internal Hashtable registeredBorderTypes = new Hashtable(StringComparer.OrdinalIgnoreCase);
private Hashtable _createdBorderTypes = new Hashtable(StringComparer.OrdinalIgnoreCase);
#endregion
#region Constructors and services
/// <summary>
/// Border types registry public constructor
/// </summary>
public BorderTypeRegistry()
{
}
/// <summary>
/// Returns border type registry service object
/// </summary>
/// <param name="serviceType">Service type to get.</param>
/// <returns>Border registry service.</returns>
[EditorBrowsableAttribute(EditorBrowsableState.Never)]
object IServiceProvider.GetService(Type serviceType)
{
if(serviceType == typeof(BorderTypeRegistry))
{
return this;
}
throw (new ArgumentException( SR.ExceptionBorderTypeRegistryUnsupportedType( serviceType.ToString()) ));
}
#endregion
#region Methods
/// <summary>
/// Adds 3D border type into the registry.
/// </summary>
/// <param name="name">Border type name.</param>
/// <param name="borderType">Border class type.</param>
public void Register(string name, Type borderType)
{
// First check if border type with specified name already registered
if(registeredBorderTypes.Contains(name))
{
// If same type provided - ignore
if(registeredBorderTypes[name].GetType() == borderType)
{
return;
}
// Error - throw exception
throw (new ArgumentException(SR.ExceptionBorderTypeNameIsNotUnique( name ) ) );
}
// Make sure that specified class support IBorderType interface
bool found = false;
Type[] interfaces = borderType.GetInterfaces();
foreach(Type type in interfaces)
{
if(type == typeof(IBorderType))
{
found = true;
break;
}
}
if(!found)
{
throw (new ArgumentException(SR.ExceptionBorderTypeHasNoInterface ));
}
// Add border type to the hash table
registeredBorderTypes[name] = borderType;
}
/// <summary>
/// Returns border type object by name.
/// </summary>
/// <param name="name">Border type name.</param>
/// <returns>Border type object derived from IBorderType.</returns>
public IBorderType GetBorderType(string name)
{
// First check if border type with specified name registered
if(!registeredBorderTypes.Contains(name))
{
throw( new ArgumentException( SR.ExceptionBorderTypeUnknown( name ) ) );
}
// Check if the border type object is already created
if(!_createdBorderTypes.Contains(name))
{
// Create border type object
_createdBorderTypes[name] =
((Type)registeredBorderTypes[name]).Assembly.
CreateInstance(((Type)registeredBorderTypes[name]).ToString());
}
return (IBorderType)_createdBorderTypes[name];
}
/// <summary>
/// Border images resource manager.
/// </summary>
public ResourceManager ResourceManager
{
get
{
// Create border images resource manager
if(_resourceManager == null)
{
_resourceManager = new ResourceManager("System.Web.UI.DataVisualization.Charting", Assembly.GetExecutingAssembly());
}
return _resourceManager;
}
}
#endregion
}
/// <summary>
/// Interface which defines the set of standard methods and
/// properties for each border type.
/// </summary>
internal interface IBorderType
{
#region Properties and Method
/// <summary>
/// Border type name.
/// </summary>
string Name { get; }
/// <summary>
/// Sets/Gets the resolution to draw with;
/// </summary>
float Resolution
{
set;
}
/// <summary>
/// Draws 3D border.
/// </summary>
/// <param name="graph">Graphics to draw the border on.</param>
/// <param name="borderSkin">Border skin object.</param>
/// <param name="rect">Rectangle of the border.</param>
/// <param name="backColor">Color of rectangle.</param>
/// <param name="backHatchStyle">Hatch style.</param>
/// <param name="backImage">Back Image.</param>
/// <param name="backImageWrapMode">Image mode.</param>
/// <param name="backImageTransparentColor">Image transparent color.</param>
/// <param name="backImageAlign">Image alignment.</param>
/// <param name="backGradientStyle">Gradient type.</param>
/// <param name="backSecondaryColor">Gradient End Color.</param>
/// <param name="borderColor">Border Color.</param>
/// <param name="borderWidth">Border Width.</param>
/// <param name="borderDashStyle">Border Style.</param>
void DrawBorder(
ChartGraphics graph,
BorderSkin borderSkin,
RectangleF rect,
Color backColor,
ChartHatchStyle backHatchStyle,
string backImage,
ChartImageWrapMode backImageWrapMode,
Color backImageTransparentColor,
ChartImageAlignmentStyle backImageAlign,
GradientStyle backGradientStyle,
Color backSecondaryColor,
Color borderColor,
int borderWidth,
ChartDashStyle borderDashStyle);
/// <summary>
/// Adjust areas rectangle coordinate to fit the 3D border.
/// </summary>
/// <param name="graph">Graphics to draw the border on.</param>
/// <param name="areasRect">Position to adjust.</param>
void AdjustAreasPosition(ChartGraphics graph, ref RectangleF areasRect);
/// <summary>
/// Returns the position of the rectangular area in the border where
/// title should be displayed. Returns empty rect if title can't be shown in the border.
/// </summary>
/// <returns>Title position in border.</returns>
RectangleF GetTitlePositionInBorder();
#endregion
}
}