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

404 lines
13 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, victark
using System;
using System.Text;
using System.Globalization;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Diagnostics.CodeAnalysis;
#if Microsoft_CONTROL
namespace System.Windows.Forms.DataVisualization.Charting
#else
namespace System.Web.UI.DataVisualization.Charting
#endif
{
/// <summary>
/// ChartElement is the most basic element of the chart element hierarchy.
/// </summary>
#if ASPPERM_35
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
#endif
public abstract class ChartElement : IChartElement, IDisposable
{
#region Member variables
private IChartElement _parent = null;
private CommonElements _common = null;
private object _tag = null;
#endregion
#region Properties
/// <summary>
/// Gets or sets an object associated with this chart element.
/// </summary>
/// <value>
/// An <see cref="Object"/> associated with this chart element.
/// </value>
/// <remarks>
/// This property may be used to store additional data with this chart element.
/// </remarks>
[
Browsable(false),
DefaultValue(null),
DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden),
Utilities.SerializationVisibilityAttribute(Utilities.SerializationVisibility.Hidden)
]
public object Tag
{
get { return _tag; }
set { _tag = value; }
}
/// <summary>
/// Gets or sets the parent chart element or collection.
/// </summary>
/// <value>The parent chart element or collection.</value>
internal virtual IChartElement Parent
{
get { return _parent; }
set { _parent = value; }
}
/// <summary>
/// Gets a shortcut to Common intance providing access to the various chart related services.
/// </summary>
/// <value>The Common instance.</value>
internal CommonElements Common
{
get
{
if (_common == null && _parent != null)
{
_common = _parent.Common;
}
return _common;
}
set
{
_common = value;
}
}
/// <summary>
/// Gets the chart.
/// </summary>
/// <value>The chart.</value>
internal Chart Chart
{
get
{
if (Common != null)
return Common.Chart;
else
return null;
}
}
#endregion
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="ChartElement"/> class.
/// </summary>
protected ChartElement()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="ChartElement"/> class.
/// </summary>
/// <param name="parent">The parent chart element or collection.</param>
internal ChartElement(IChartElement parent)
{
_parent = parent;
}
#endregion
#region Methods
/// <summary>
/// Invalidates this chart element.
/// </summary>
internal virtual void Invalidate()
{
if (_parent != null)
_parent.Invalidate();
}
#endregion
#region IChartElement Members
IChartElement IChartElement.Parent
{
get { return _parent; }
set { this.Parent = value; }
}
void IChartElement.Invalidate()
{
this.Invalidate();
}
CommonElements IChartElement.Common
{
get{ return this.Common; }
}
#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 virtual void Dispose(bool disposing)
{
}
/// <summary>
/// Performs freeing, releasing, or resetting managed resources.
/// </summary>
[SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
#region Methods
/// <summary>
/// Returns a <see cref="T:System.String"/> that represents the current <see cref="T:System.Object"/>.
/// </summary>
/// <returns>
/// A <see cref="T:System.String"/> that represents the current <see cref="T:System.Object"/>.
/// </returns>
/// <remarks>For internal use.</remarks>
internal virtual string ToStringInternal()
{
return GetType().Name;
}
/// <summary>
/// Returns a <see cref="T:System.String"/> that represents the current <see cref="T:System.Object"/>.
/// </summary>
/// <returns>
/// A <see cref="T:System.String"/> that represents the current <see cref="T:System.Object"/>.
/// </returns>
[SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]
public override string ToString()
{
return this.ToStringInternal();
}
/// <summary>
/// Determines whether the specified <see cref="T:System.Object"/> is equal to the current <see cref="T:System.Object"/>.
/// </summary>
/// <param name="obj">The <see cref="T:System.Object"/> to compare with the current <see cref="T:System.Object"/>.</param>
/// <returns>
/// true if the specified <see cref="T:System.Object"/> is equal to the current <see cref="T:System.Object"/>; otherwise, false.
/// </returns>
/// <exception cref="T:System.NullReferenceException">The <paramref name="obj"/> parameter is null.</exception>
/// <remarks>For internal use.</remarks>
internal virtual bool EqualsInternal(object obj)
{
return base.Equals(obj);
}
/// <summary>
/// Determines whether the specified <see cref="T:System.Object"/> is equal to the current <see cref="T:System.Object"/>.
/// </summary>
/// <param name="obj">The <see cref="T:System.Object"/> to compare with the current <see cref="T:System.Object"/>.</param>
/// <returns>
/// true if the specified <see cref="T:System.Object"/> is equal to the current <see cref="T:System.Object"/>; otherwise, false.
/// </returns>
/// <exception cref="T:System.NullReferenceException">The <paramref name="obj"/> parameter is null.</exception>
[SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]
public override bool Equals(object obj)
{
return this.EqualsInternal(obj);
}
/// <summary>
/// Serves as a hash function for a particular type.
/// </summary>
/// <returns>
/// A hash code for the current <see cref="T:System.Object"/>.
/// </returns>
[SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]
public override int GetHashCode()
{
return base.GetHashCode();
}
#endregion
}
/// <summary>
/// ChartNamedElement is a base class for most chart elements. Series, ChartAreas, Legends and other chart elements have a Name and reuse the unique name generation and validation logic provided by the ChartNamedElementCollection.
/// </summary>
#if ASPPERM_35
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
#endif
public abstract class ChartNamedElement : ChartElement
{
#region Member variables
private string _name = String.Empty;
#endregion
#region Properties
/// <summary>
/// Gets or sets the name of the chart element.
/// </summary>
/// <value>The name.</value>
[DefaultValue("")]
public virtual string Name
{
get { return _name; }
set
{
if (_name != value)
{
if (Parent is INameController)
{
INameController nameController = Parent as INameController;
if (!nameController.IsUniqueName(value))
throw new ArgumentException(SR.ExceptionNameAlreadyExistsInCollection(value, nameController.GetType().Name));
// Fire the name change events in case when the old name is not empty
NameReferenceChangedEventArgs args = new NameReferenceChangedEventArgs(this, _name, value);
nameController.OnNameReferenceChanging(args);
_name = value;
nameController.OnNameReferenceChanged(args);
}
else
{
_name = value;
}
Invalidate();
}
}
}
#endregion
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="ChartNamedElement"/> class.
/// </summary>
protected ChartNamedElement()
: base()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="ChartNamedElement"/> class.
/// </summary>
/// <param name="name">The name of the new chart element.</param>
protected ChartNamedElement(string name)
: base()
{
_name = name;
}
/// <summary>
/// Initializes a new instance of the <see cref="ChartNamedElement"/> class.
/// </summary>
/// <param name="parent">The parent chart element.</param>
/// <param name="name">The name of the new chart element.</param>
internal ChartNamedElement(IChartElement parent, string name) : base(parent)
{
_name = name;
}
#endregion
#region Methods
/// <summary>
/// Returns a <see cref="T:System.String"/> that represents the current <see cref="T:System.Object"/>.
/// </summary>
/// <returns>
/// A <see cref="T:System.String"/> that represents the current <see cref="T:System.Object"/>.
/// </returns>
internal override string ToStringInternal()
{
string typeName = GetType().Name;
return (string.IsNullOrEmpty(_name)) ? typeName : typeName + '-' + _name;
}
#endregion
}
/// <summary>
/// NameReferenceChanged events help chart maintain referencial integrity.
/// </summary>
internal class NameReferenceChangedEventArgs : EventArgs
{
#region MemberValiables
ChartNamedElement _oldElement;
string _oldName;
string _newName;
#endregion
#region Properties
public ChartNamedElement OldElement
{
get { return _oldElement; }
}
public string OldName
{
get { return _oldName; }
}
public string NewName
{
get { return _newName; }
}
#endregion
#region Constructor
public NameReferenceChangedEventArgs(ChartNamedElement oldElement, ChartNamedElement newElement)
{
_oldElement = oldElement;
_oldName = oldElement!=null ? oldElement.Name : string.Empty;
_newName = newElement!=null ? newElement.Name : string.Empty;
}
public NameReferenceChangedEventArgs(ChartNamedElement oldElement, string oldName, string newName)
{
_oldElement = oldElement;
_oldName = oldName;
_newName = newName;
}
#endregion
}
}