You've already forked linux-packaging-mono
Rewrite with hard-coded offsets into the PE file format to discern if a binary is PE32 or PE32+, and then to determine if it contains a "CLR Data Directory" entry that looks valid. Tested with PE32 and PE32+ compiled Mono binaries, PE32 and PE32+ native binaries, and a random assortment of garbage files. Former-commit-id: 9e7ac86ec84f653a2f79b87183efd5b0ebda001b
7045 lines
196 KiB
C#
7045 lines
196 KiB
C#
//-------------------------------------------------------------
|
||
// <copyright company=’Microsoft Corporation’>
|
||
// Copyright © Microsoft Corporation. All Rights Reserved.
|
||
// </copyright>
|
||
//-------------------------------------------------------------
|
||
// @owner=alexgor, deliant
|
||
//=================================================================
|
||
// File: DataPoint.cs
|
||
//
|
||
// Namespace: System.Web.UI.WebControls[Windows.Forms].Charting.Data
|
||
//
|
||
// Classes: DataPoint, DataPointCustomProperties, DataPointCollection,
|
||
// DataPointComparer, DataPoint3D, CustomProperties
|
||
//
|
||
// Purpose: Classes related to the Data Points:
|
||
// DataPointCollection - data points collection class
|
||
// DataPoint - data point properties and methods
|
||
// DataPointCustomProperties - data point & series properties
|
||
// DataPointComparer - used for sorting data points in series
|
||
//
|
||
// Reviewed: AG - Aug 1, 2002, GS - Aug 7, 2002
|
||
//
|
||
//===================================================================
|
||
|
||
|
||
#region Used namespaces
|
||
|
||
using System;
|
||
using System.Collections;
|
||
using System.Collections.Specialized;
|
||
using System.ComponentModel;
|
||
using System.ComponentModel.Design;
|
||
using System.Data;
|
||
using System.Data.Common;
|
||
using System.Drawing;
|
||
using System.Drawing.Design;
|
||
using System.Drawing.Drawing2D;
|
||
using System.Globalization;
|
||
using System.Diagnostics.CodeAnalysis;
|
||
using System.Collections.Generic;
|
||
using System.Collections.ObjectModel;
|
||
using System.Text;
|
||
|
||
#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.ComponentModel.Design.Serialization;
|
||
using System.Reflection;
|
||
using System.CodeDom;
|
||
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.Utilities;
|
||
using System.IO;
|
||
|
||
#endif
|
||
|
||
|
||
#endregion
|
||
|
||
#if Microsoft_CONTROL
|
||
namespace System.Windows.Forms.DataVisualization.Charting
|
||
#else
|
||
namespace System.Web.UI.DataVisualization.Charting
|
||
#endif
|
||
{
|
||
#region CustomProperties enumeration
|
||
|
||
/// <summary>
|
||
/// Enumeration of common properties names.
|
||
/// </summary>
|
||
internal enum CommonCustomProperties
|
||
{
|
||
PointName,
|
||
Label,
|
||
AxisLabel,
|
||
LabelFormat,
|
||
IsValueShownAsLabel,
|
||
Color,
|
||
BorderColor,
|
||
BorderDashStyle,
|
||
BorderWidth,
|
||
BackImage,
|
||
BackImageWrapMode,
|
||
BackImageAlignment,
|
||
BackImageTransparentColor,
|
||
BackGradientStyle,
|
||
BackSecondaryColor,
|
||
BackHatchStyle,
|
||
Font,
|
||
LabelForeColor,
|
||
LabelAngle,
|
||
MarkerStyle,
|
||
MarkerSize,
|
||
MarkerImage,
|
||
MarkerImageTransparentColor,
|
||
MarkerColor,
|
||
MarkerBorderColor,
|
||
MarkerBorderWidth,
|
||
MapAreaAttributes,
|
||
PostBackValue,
|
||
MapAreaType,
|
||
LegendMapAreaType,
|
||
LabelMapAreaType,
|
||
Url,
|
||
ToolTip,
|
||
Tag,
|
||
LegendUrl,
|
||
LegendToolTip,
|
||
LegendText,
|
||
LegendMapAreaAttributes,
|
||
LegendPostBackValue,
|
||
IsVisibleInLegend,
|
||
LabelUrl,
|
||
LabelToolTip,
|
||
LabelMapAreaAttributes,
|
||
LabelPostBackValue,
|
||
LabelBorderColor,
|
||
LabelBorderDashStyle,
|
||
LabelBorderWidth,
|
||
LabelBackColor,
|
||
};
|
||
|
||
#endregion
|
||
|
||
/// <summary>
|
||
/// Data points comparer class
|
||
/// </summary>
|
||
[
|
||
SRDescription("DescriptionAttributeDataPointComparer_DataPointComparer")
|
||
]
|
||
public class DataPointComparer : IComparer<DataPoint>
|
||
{
|
||
#region Fields
|
||
|
||
// Sorting order
|
||
private PointSortOrder _sortingOrder = PointSortOrder.Ascending;
|
||
|
||
// Sorting value index
|
||
private int _sortingValueIndex = 1;
|
||
|
||
#endregion
|
||
|
||
#region Constructors
|
||
|
||
/// <summary>
|
||
/// Private default constructor.
|
||
/// </summary>
|
||
private DataPointComparer()
|
||
{
|
||
}
|
||
|
||
/// <summary>
|
||
/// Data points comparer class constructor.
|
||
/// </summary>
|
||
/// <param name="series">Data series.</param>
|
||
/// <param name="sortOrder">Sorting order.</param>
|
||
/// <param name="sortBy">Value used for sorting ("X", "Y or Y1", "Y2", ...).</param>
|
||
#if ASPPERM_35
|
||
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
||
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
||
#endif
|
||
public DataPointComparer(Series series, PointSortOrder sortOrder, string sortBy)
|
||
{
|
||
// Check if sorting value is valid
|
||
sortBy = sortBy.ToUpper(System.Globalization.CultureInfo.InvariantCulture);
|
||
if(String.Compare(sortBy, "X", StringComparison.Ordinal) == 0)
|
||
{
|
||
_sortingValueIndex = -1;
|
||
}
|
||
else if (String.Compare(sortBy, "Y", StringComparison.Ordinal) == 0)
|
||
{
|
||
_sortingValueIndex = 0;
|
||
}
|
||
else if (String.Compare(sortBy, "AXISLABEL", StringComparison.Ordinal) == 0)
|
||
{
|
||
_sortingValueIndex = -2;
|
||
}
|
||
else if(sortBy.Length == 2 &&
|
||
sortBy.StartsWith("Y", StringComparison.Ordinal) &&
|
||
Char.IsDigit(sortBy[1]))
|
||
{
|
||
_sortingValueIndex = Int32.Parse(sortBy.Substring(1), System.Globalization.CultureInfo.InvariantCulture) - 1;
|
||
}
|
||
else
|
||
{
|
||
throw(new ArgumentException( SR.ExceptionDataPointConverterInvalidSorting, "sortBy"));
|
||
}
|
||
|
||
// Check if data series support as many Y values as required
|
||
if(_sortingValueIndex > 0 && _sortingValueIndex >= series.YValuesPerPoint)
|
||
{
|
||
throw(new ArgumentException( SR.ExceptionDataPointConverterUnavailableSorting(sortBy, series.YValuesPerPoint.ToString(System.Globalization.CultureInfo.InvariantCulture) ), "sortBy"));
|
||
}
|
||
|
||
this._sortingOrder = sortOrder;
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region Comparing method
|
||
|
||
/// <summary>
|
||
/// Compares two data points.
|
||
/// </summary>
|
||
/// <param name="x">First data point.</param>
|
||
/// <param name="y">Second data point.</param>
|
||
/// <returns>If the two values are equal, it returns zero. If point 1 is greater than point 2,
|
||
/// it returns a positive integer; otherwise, it returns a negative integer.
|
||
/// </returns>
|
||
public int Compare(DataPoint x, DataPoint y)
|
||
{
|
||
int result = -1;
|
||
|
||
// Compare X value
|
||
if(_sortingValueIndex == -1)
|
||
{
|
||
result = x.XValue.CompareTo(y.XValue);
|
||
}
|
||
// Compare Axis Label value
|
||
else if(_sortingValueIndex == -2)
|
||
{
|
||
result = string.Compare(x.AxisLabel, y.AxisLabel, StringComparison.CurrentCulture);
|
||
}
|
||
// Compare one of the Y value(s)
|
||
else
|
||
{
|
||
result = x.YValues[_sortingValueIndex].CompareTo(y.YValues[_sortingValueIndex]);
|
||
}
|
||
|
||
// Invert result depending on the sorting order
|
||
if(this._sortingOrder == PointSortOrder.Descending)
|
||
{
|
||
result = -result;
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// A collection of data points.
|
||
/// </summary>
|
||
[
|
||
SRDescription("DescriptionAttributeDataPointCollection_DataPointCollection"),
|
||
]
|
||
#if ASPPERM_35
|
||
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
||
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
||
#endif
|
||
#if !Microsoft_CONTROL
|
||
[Themeable(false)]
|
||
#endif
|
||
public class DataPointCollection : ChartElementCollection<DataPoint>
|
||
{
|
||
#region Fields
|
||
|
||
// Reference to the sereies of data points
|
||
internal Series series = null;
|
||
|
||
#endregion
|
||
|
||
#region Constructors and Initialization
|
||
|
||
/// <summary>
|
||
/// Data Point Collection object constructor.
|
||
/// </summary>
|
||
/// <param name="series">Series object, which the Data Point Collection belongs to.</param>
|
||
internal DataPointCollection(Series series) : base(series)
|
||
{
|
||
this.series = series;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Initialize data point series and name.
|
||
/// </summary>
|
||
/// <param name="dataPoint">Reference to the data point object to initialize.</param>
|
||
internal void DataPointInit(ref DataPoint dataPoint)
|
||
{
|
||
DataPointInit(this.series, ref dataPoint);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Initialize data point series and name.
|
||
/// </summary>
|
||
/// <param name="series">Series the data point belongs to.</param>
|
||
/// <param name="dataPoint">Reference to the data point object to initialize.</param>
|
||
internal static void DataPointInit(Series series, ref DataPoint dataPoint)
|
||
{
|
||
dataPoint.series = series;
|
||
|
||
if(dataPoint.AxisLabel.Length > 0 && series != null)
|
||
{
|
||
series.noLabelsInPoints = false;
|
||
}
|
||
|
||
#if Microsoft_CONTROL
|
||
// Set flag that tooltips flags should be recalculated
|
||
if(dataPoint.ToolTip.Length > 0 &&
|
||
dataPoint.LegendToolTip.Length > 0 &&
|
||
dataPoint.LabelToolTip.Length > 0 &&
|
||
series != null && series.Chart != null && series.Chart.selection != null)
|
||
{
|
||
series.Chart.selection.enabledChecked = false;
|
||
}
|
||
#endif
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region Data point binding, adding and inserting methods
|
||
|
||
/// <summary>
|
||
/// Adds the new DataPoint to a collection and sets its Y values.
|
||
/// </summary>
|
||
/// <param name="y">The y.</param>
|
||
/// <returns></returns>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "X and Y are cartesian coordinates and well understood")]
|
||
public DataPoint Add(params double[] y)
|
||
{
|
||
DataPoint point = new DataPoint(0, y);
|
||
this.Add(point);
|
||
return point;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Parse the input parameter with other point attribute binding rule
|
||
/// in format: PointProperty=Field[{Format}] [,PointProperty=Field[{Format}]].
|
||
/// For example: "Tooltip=Price{C1},Url=WebSiteName".
|
||
/// </summary>
|
||
/// <param name="otherFields">Other fields parameter.</param>
|
||
/// <param name="otherAttributeNames">Returns array of attribute names.</param>
|
||
/// <param name="otherFieldNames">Returns array of field names.</param>
|
||
/// <param name="otherValueFormat">Returns array of format strings.</param>
|
||
internal static void ParsePointFieldsParameter(
|
||
string otherFields,
|
||
ref string[] otherAttributeNames,
|
||
ref string[] otherFieldNames,
|
||
ref string[] otherValueFormat)
|
||
{
|
||
if(otherFields != null && otherFields.Length > 0)
|
||
{
|
||
// Split string by comma
|
||
otherAttributeNames = otherFields.Replace(",,", "\n").Split(',');
|
||
otherFieldNames = new string[otherAttributeNames.Length];
|
||
otherValueFormat = new string[otherAttributeNames.Length];
|
||
|
||
// Loop through all strings
|
||
for(int index = 0; index < otherAttributeNames.Length; index++)
|
||
{
|
||
// Split string by equal sign
|
||
int equalSignIndex = otherAttributeNames[index].IndexOf('=');
|
||
if(equalSignIndex > 0)
|
||
{
|
||
otherFieldNames[index] = otherAttributeNames[index].Substring(equalSignIndex + 1);
|
||
otherAttributeNames[index] = otherAttributeNames[index].Substring(0, equalSignIndex);
|
||
}
|
||
else
|
||
{
|
||
throw (new ArgumentException(SR.ExceptionParameterFormatInvalid, "otherFields"));
|
||
}
|
||
|
||
// Check if format string was specified
|
||
int bracketIndex = otherFieldNames[index].IndexOf('{');
|
||
if(bracketIndex > 0 && otherFieldNames[index][otherFieldNames[index].Length - 1] == '}')
|
||
{
|
||
otherValueFormat[index] = otherFieldNames[index].Substring(bracketIndex + 1);
|
||
otherValueFormat[index] = otherValueFormat[index].Trim('{', '}');
|
||
otherFieldNames[index] = otherFieldNames[index].Substring(0, bracketIndex);
|
||
}
|
||
|
||
// Trim and replace new line character
|
||
otherAttributeNames[index] = otherAttributeNames[index].Trim().Replace("\n", ",");
|
||
otherFieldNames[index] = otherFieldNames[index].Trim().Replace("\n", ",");
|
||
if ( otherValueFormat[index] != null )
|
||
otherValueFormat[index] = otherValueFormat[index].Trim().Replace("\n", ",");
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Data bind X, Y and other values (like Tooltip, LabelStyle,...) of the data points to the data source.
|
||
/// Data source can be the Ole(SQL)DataReader, DataView, DataSet, DataTable or DataRow.
|
||
/// </summary>
|
||
/// <param name="dataSource">Data source.</param>
|
||
/// <param name="xField">Name of the field for X values.</param>
|
||
/// <param name="yFields">Comma separated names of the fields for Y values.</param>
|
||
/// <param name="otherFields">Other point properties binding rule in format: PointProperty=Field[{Format}] [,PointProperty=Field[{Format}]]. For example: "Tooltip=Price{C1},Url=WebSiteName".</param>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "X and Y are cartesian coordinates and well understood")]
|
||
public void DataBind(IEnumerable dataSource, string xField, string yFields, string otherFields)
|
||
{
|
||
// Check arguments
|
||
if (dataSource == null)
|
||
throw new ArgumentNullException("dataSource", SR.ExceptionDataPointInsertionNoDataSource);
|
||
if (dataSource is string)
|
||
throw (new ArgumentException(SR.ExceptionDataBindSeriesToString, "dataSource"));
|
||
if (yFields == null)
|
||
throw new ArgumentNullException("yFields");
|
||
|
||
// Convert comma separated Y values field names string to array of names
|
||
string[] yFieldNames = yFields.Replace(",,", "\n").Split(',');
|
||
for(int index = 0; index < yFieldNames.Length; index++)
|
||
{
|
||
yFieldNames[index] = yFieldNames[index].Replace("\n", ",");
|
||
}
|
||
|
||
if (yFieldNames.GetLength(0) > series.YValuesPerPoint)
|
||
throw (new ArgumentOutOfRangeException("yFields", SR.ExceptionDataPointYValuesCountMismatch(series.YValuesPerPoint.ToString(System.Globalization.CultureInfo.InvariantCulture))));
|
||
|
||
// Convert other fields/properties names to two arrays of names
|
||
string[] otherAttributeNames = null;
|
||
string[] otherFieldNames = null;
|
||
string[] otherValueFormat = null;
|
||
ParsePointFieldsParameter(
|
||
otherFields,
|
||
ref otherAttributeNames,
|
||
ref otherFieldNames,
|
||
ref otherValueFormat);
|
||
|
||
// Remove all existing data points
|
||
this.Clear();
|
||
|
||
// Get and reset enumerator
|
||
IEnumerator enumerator = GetDataSourceEnumerator(dataSource);
|
||
if (enumerator.GetType() != typeof(System.Data.Common.DbEnumerator))
|
||
{
|
||
try
|
||
{
|
||
enumerator.Reset();
|
||
}
|
||
// Some enumerators may not support Resetting
|
||
catch (InvalidOperationException)
|
||
{
|
||
}
|
||
catch (NotImplementedException)
|
||
{
|
||
}
|
||
catch (NotSupportedException)
|
||
{
|
||
}
|
||
}
|
||
|
||
// Add data points
|
||
bool valueExsist = true;
|
||
object[] yValuesObj = new object[yFieldNames.Length];
|
||
object xValueObj = null;
|
||
bool autoDetectType = true;
|
||
|
||
this.SuspendUpdates();
|
||
try
|
||
{
|
||
do
|
||
{
|
||
// Move to the next objects in the enumerations
|
||
if (valueExsist)
|
||
{
|
||
valueExsist = enumerator.MoveNext();
|
||
}
|
||
|
||
// Auto detect valu(s) type
|
||
if (autoDetectType)
|
||
{
|
||
autoDetectType = false;
|
||
AutoDetectValuesType(this.series, enumerator, xField, enumerator, yFieldNames[0]);
|
||
}
|
||
|
||
// Create and initialize data point
|
||
if (valueExsist)
|
||
{
|
||
DataPoint newDataPoint = new DataPoint(series);
|
||
bool emptyValues = false;
|
||
|
||
// Set X to the value provided
|
||
if (xField.Length > 0)
|
||
{
|
||
xValueObj = ConvertEnumerationItem(enumerator.Current, xField);
|
||
if (IsEmptyValue(xValueObj))
|
||
{
|
||
emptyValues = true;
|
||
xValueObj = 0.0;
|
||
}
|
||
}
|
||
|
||
// Set Y values
|
||
if (yFieldNames.Length == 0)
|
||
{
|
||
yValuesObj[0] = ConvertEnumerationItem(enumerator.Current, null);
|
||
if (IsEmptyValue(yValuesObj[0]))
|
||
{
|
||
emptyValues = true;
|
||
yValuesObj[0] = 0.0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for (int i = 0; i < yFieldNames.Length; i++)
|
||
{
|
||
yValuesObj[i] = ConvertEnumerationItem(enumerator.Current, yFieldNames[i]);
|
||
if (IsEmptyValue(yValuesObj[i]))
|
||
{
|
||
emptyValues = true;
|
||
yValuesObj[i] = 0.0;
|
||
}
|
||
}
|
||
}
|
||
|
||
// Set other values
|
||
if (otherAttributeNames != null &&
|
||
otherAttributeNames.Length > 0)
|
||
{
|
||
for (int i = 0; i < otherFieldNames.Length; i++)
|
||
{
|
||
// Get object by field name
|
||
object obj = ConvertEnumerationItem(enumerator.Current, otherFieldNames[i]);
|
||
if (!IsEmptyValue(obj))
|
||
{
|
||
newDataPoint.SetPointCustomProperty(
|
||
obj,
|
||
otherAttributeNames[i],
|
||
otherValueFormat[i]);
|
||
}
|
||
}
|
||
}
|
||
|
||
// IsEmpty value was detected
|
||
if (emptyValues)
|
||
{
|
||
if (xValueObj != null)
|
||
{
|
||
newDataPoint.SetValueXY(xValueObj, yValuesObj);
|
||
}
|
||
else
|
||
{
|
||
newDataPoint.SetValueXY(0, yValuesObj);
|
||
}
|
||
DataPointInit(ref newDataPoint);
|
||
newDataPoint.IsEmpty = true;
|
||
this.Add(newDataPoint);
|
||
}
|
||
else
|
||
{
|
||
if (xValueObj != null)
|
||
{
|
||
newDataPoint.SetValueXY(xValueObj, yValuesObj);
|
||
}
|
||
else
|
||
{
|
||
newDataPoint.SetValueXY(0, yValuesObj);
|
||
}
|
||
DataPointInit(ref newDataPoint);
|
||
this.Add(newDataPoint);
|
||
}
|
||
}
|
||
|
||
} while (valueExsist);
|
||
|
||
}
|
||
finally
|
||
{
|
||
this.ResumeUpdates();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Data bind Y values of the data points to the data source.
|
||
/// Data source can be the Array, Collection, Ole(SQL)DataReader, DataView, DataSet, DataTable or DataRow.
|
||
/// </summary>
|
||
/// <param name="yValue">One or more enumerable objects with Y values.</param>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "Y is a cartesian coordinate and well understood")]
|
||
public void DataBindY(params IEnumerable[] yValue)
|
||
{
|
||
DataBindXY(null, yValue);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Data bind X and Y values of the data points to the data source.
|
||
/// Data source can be the Array, Collection, Ole(SQL)DataReader, DataView, DataSet, DataTable or DataRow.
|
||
/// </summary>
|
||
/// <param name="xValue">Enumerable objects with X values.</param>
|
||
/// <param name="yValues">One or more enumerable objects with Y values.</param>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "X and Y are cartesian coordinates and well understood")]
|
||
public void DataBindXY(IEnumerable xValue, params IEnumerable[] yValues)
|
||
{
|
||
// Y value must be provided
|
||
if (yValues == null ||
|
||
yValues.Length==1 && yValues[0]==null)
|
||
throw new ArgumentNullException("yValues");
|
||
if (yValues.GetLength(0) == 0)
|
||
throw new ArgumentException(SR.ExceptionDataPointBindingYValueNotSpecified, "yValues");
|
||
|
||
// Double check that a string object is not provided for data binding
|
||
for(int i = 0; i < yValues.Length; i++)
|
||
{
|
||
if(yValues[i] is string)
|
||
{
|
||
throw (new ArgumentException(SR.ExceptionDataBindYValuesToString, "yValues"));
|
||
}
|
||
}
|
||
|
||
// Check if number of Y values do not out of range
|
||
if(yValues.GetLength(0) > series.YValuesPerPoint)
|
||
{
|
||
throw(new ArgumentOutOfRangeException("yValues", SR.ExceptionDataPointYValuesBindingCountMismatch( series.YValuesPerPoint.ToString(System.Globalization.CultureInfo.InvariantCulture) ) ) );
|
||
}
|
||
|
||
// Remove all existing data points
|
||
this.Clear();
|
||
|
||
// Reset X, Y enumerators
|
||
IEnumerator xEnumerator = null;
|
||
IEnumerator[] yEnumerator = new IEnumerator[yValues.GetLength(0)];
|
||
if(xValue != null)
|
||
{
|
||
// Double check that a string object is not provided for data binding
|
||
if(xValue is string)
|
||
{
|
||
throw (new ArgumentException(SR.ExceptionDataBindXValuesToString, "xValue"));
|
||
}
|
||
|
||
// Get and reset Y values enumerators
|
||
xEnumerator = GetDataSourceEnumerator(xValue);
|
||
if(xEnumerator.GetType() != typeof(System.Data.Common.DbEnumerator))
|
||
{
|
||
xEnumerator.Reset();
|
||
}
|
||
}
|
||
for(int i = 0; i < yValues.Length; i++)
|
||
{
|
||
// Get and reset Y values enumerators
|
||
yEnumerator[i] = GetDataSourceEnumerator(yValues[i]);
|
||
if(yEnumerator[i].GetType() != typeof(System.Data.Common.DbEnumerator))
|
||
{
|
||
yEnumerator[i].Reset();
|
||
}
|
||
}
|
||
|
||
// Add data points
|
||
bool xValueExsist = false;
|
||
bool yValueExsist = true;
|
||
object[] yValuesObj = new object[series.YValuesPerPoint];
|
||
object xValueObj = null;
|
||
bool autoDetectType = true;
|
||
|
||
SuspendUpdates();
|
||
try
|
||
{
|
||
do
|
||
{
|
||
// Move to the next objects in the enumerations
|
||
yValueExsist = true;
|
||
for (int i = 0; i < yValues.Length; i++)
|
||
{
|
||
if (yValueExsist)
|
||
{
|
||
yValueExsist = yEnumerator[i].MoveNext();
|
||
}
|
||
}
|
||
if (xValue != null)
|
||
{
|
||
xValueExsist = xEnumerator.MoveNext();
|
||
if (yValueExsist && !xValueExsist)
|
||
{
|
||
throw (new ArgumentOutOfRangeException("xValue", SR.ExceptionDataPointInsertionXValuesQtyIsLessYValues));
|
||
}
|
||
}
|
||
|
||
// Auto detect value(s) type
|
||
if (autoDetectType)
|
||
{
|
||
autoDetectType = false;
|
||
AutoDetectValuesType(this.series, xEnumerator, null, yEnumerator[0], null);
|
||
}
|
||
|
||
// Create and initialize data point
|
||
if (xValueExsist || yValueExsist)
|
||
{
|
||
DataPoint newDataPoint = new DataPoint(series);
|
||
bool emptyValues = false;
|
||
|
||
// Set X to the value provided
|
||
if (xValueExsist)
|
||
{
|
||
xValueObj = ConvertEnumerationItem(xEnumerator.Current, null);
|
||
if (xValueObj is System.DBNull || xValueObj == null)
|
||
{
|
||
emptyValues = true;
|
||
xValueObj = 0.0;
|
||
}
|
||
}
|
||
|
||
// Set Y values
|
||
for (int i = 0; i < yValues.Length; i++)
|
||
{
|
||
yValuesObj[i] = ConvertEnumerationItem(yEnumerator[i].Current, null);
|
||
if (yValuesObj[i] is System.DBNull || yValuesObj[i] == null)
|
||
{
|
||
emptyValues = true;
|
||
yValuesObj[i] = 0.0;
|
||
}
|
||
}
|
||
|
||
// IsEmpty value was detected
|
||
if (emptyValues)
|
||
{
|
||
if (xValueObj != null)
|
||
{
|
||
newDataPoint.SetValueXY(xValueObj, yValuesObj);
|
||
}
|
||
else
|
||
{
|
||
newDataPoint.SetValueXY(0, yValuesObj);
|
||
}
|
||
DataPointInit(ref newDataPoint);
|
||
newDataPoint.IsEmpty = true;
|
||
this.Add(newDataPoint);
|
||
}
|
||
else
|
||
{
|
||
if (xValueObj != null)
|
||
{
|
||
newDataPoint.SetValueXY(xValueObj, yValuesObj);
|
||
}
|
||
else
|
||
{
|
||
newDataPoint.SetValueXY(0, yValuesObj);
|
||
}
|
||
DataPointInit(ref newDataPoint);
|
||
this.Add(newDataPoint);
|
||
}
|
||
|
||
}
|
||
|
||
} while (xValueExsist || yValueExsist);
|
||
|
||
}
|
||
finally
|
||
{
|
||
this.ResumeUpdates();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Data bind Y values of the data points to the data source.
|
||
/// Data source can be the Array, Collection, Ole(SQL)DataReader, DataView, DataSet, DataTable or DataRow.
|
||
/// </summary>
|
||
/// <param name="yValue">Enumerable objects with Y values.</param>
|
||
/// <param name="yFields">Name of the fields for Y values.</param>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "X and Y are cartesian coordinates and well understood")]
|
||
public void DataBindY(IEnumerable yValue, string yFields)
|
||
{
|
||
DataBindXY(null, null, yValue, yFields);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Data bind X and Y values of the data points to the data source.
|
||
/// Data source can be the Array, Collection, Ole(SQL)DataReader, DataView, DataSet, DataTable or DataRow.
|
||
/// </summary>
|
||
/// <param name="xValue">Enumerable object with X values.</param>
|
||
/// <param name="xField">Name of the field for X values.</param>
|
||
/// <param name="yValue">Enumerable objects with Y values.</param>
|
||
/// <param name="yFields">Comma separated names of the fields for Y values.</param>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "X and Y are cartesian coordinates and well understood")]
|
||
public void DataBindXY(IEnumerable xValue, string xField, IEnumerable yValue, string yFields)
|
||
{
|
||
// Check arguments
|
||
if (xValue is string)
|
||
throw new ArgumentException(SR.ExceptionDataBindXValuesToString, "xValue");
|
||
if (yValue == null)
|
||
throw new ArgumentNullException("yValue", SR.ExceptionDataPointInsertionYValueNotSpecified);
|
||
if (yValue is string)
|
||
throw new ArgumentException(SR.ExceptionDataBindYValuesToString, "yValue");
|
||
if (yFields == null)
|
||
throw new ArgumentOutOfRangeException("yFields", SR.ExceptionDataPointYValuesCountMismatch(series.YValuesPerPoint.ToString(System.Globalization.CultureInfo.InvariantCulture)));
|
||
|
||
// Convert comma separated field names string to array of names
|
||
string[] yFieldNames = yFields.Replace(",,", "\n").Split(',');;
|
||
for(int index = 0; index < yFieldNames.Length; index++)
|
||
{
|
||
yFieldNames[index] = yFieldNames[index].Replace("\n", ",");
|
||
}
|
||
if (yFieldNames.GetLength(0) > series.YValuesPerPoint)
|
||
throw new ArgumentOutOfRangeException("yFields", SR.ExceptionDataPointYValuesCountMismatch(series.YValuesPerPoint.ToString(System.Globalization.CultureInfo.InvariantCulture)));
|
||
|
||
// Remove all existing data points
|
||
this.Clear();
|
||
|
||
// Reset X, Y enumerators
|
||
IEnumerator xEnumerator = null;
|
||
IEnumerator yEnumerator = GetDataSourceEnumerator(yValue);
|
||
|
||
if(yEnumerator.GetType() != typeof(System.Data.Common.DbEnumerator))
|
||
{
|
||
yEnumerator.Reset();
|
||
}
|
||
|
||
if(xValue != null)
|
||
{
|
||
if(xValue != yValue)
|
||
{
|
||
xEnumerator = GetDataSourceEnumerator(xValue);
|
||
if(xEnumerator.GetType() != typeof(System.Data.Common.DbEnumerator))
|
||
{
|
||
xEnumerator.Reset();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
xEnumerator = yEnumerator;
|
||
}
|
||
}
|
||
|
||
// Add data points
|
||
bool xValueExsist = false;
|
||
bool yValueExsist = true;
|
||
object[] yValuesObj = new object[yFieldNames.Length];
|
||
object xValueObj = null;
|
||
bool autoDetectType = true;
|
||
|
||
this.SuspendUpdates();
|
||
try
|
||
{
|
||
do
|
||
{
|
||
// Move to the next objects in the enumerations
|
||
if (yValueExsist)
|
||
{
|
||
yValueExsist = yEnumerator.MoveNext();
|
||
}
|
||
if (xValue != null)
|
||
{
|
||
if (xValue != yValue)
|
||
{
|
||
xValueExsist = xEnumerator.MoveNext();
|
||
if (yValueExsist && !xValueExsist)
|
||
{
|
||
throw (new ArgumentOutOfRangeException("xValue", SR.ExceptionDataPointInsertionXValuesQtyIsLessYValues));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
xValueExsist = yValueExsist;
|
||
}
|
||
}
|
||
|
||
// Auto detect valu(s) type
|
||
if (autoDetectType)
|
||
{
|
||
autoDetectType = false;
|
||
AutoDetectValuesType(this.series, xEnumerator, xField, yEnumerator, yFieldNames[0]);
|
||
}
|
||
|
||
// Create and initialize data point
|
||
if (xValueExsist || yValueExsist)
|
||
{
|
||
DataPoint newDataPoint = new DataPoint(series);
|
||
bool emptyValues = false;
|
||
|
||
// Set X to the value provided or use sequence numbers starting with 1
|
||
if (xValueExsist)
|
||
{
|
||
xValueObj = ConvertEnumerationItem(xEnumerator.Current, xField);
|
||
if (IsEmptyValue(xValueObj))
|
||
{
|
||
emptyValues = true;
|
||
xValueObj = 0.0;
|
||
}
|
||
|
||
}
|
||
|
||
if (yFieldNames.Length == 0)
|
||
{
|
||
yValuesObj[0] = ConvertEnumerationItem(yEnumerator.Current, null);
|
||
if (IsEmptyValue(yValuesObj[0]))
|
||
{
|
||
emptyValues = true;
|
||
yValuesObj[0] = 0.0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for (int i = 0; i < yFieldNames.Length; i++)
|
||
{
|
||
yValuesObj[i] = ConvertEnumerationItem(yEnumerator.Current, yFieldNames[i]);
|
||
if (IsEmptyValue(yValuesObj[i]))
|
||
{
|
||
emptyValues = true;
|
||
yValuesObj[i] = 0.0;
|
||
}
|
||
}
|
||
}
|
||
|
||
// IsEmpty value was detected
|
||
if (emptyValues)
|
||
{
|
||
if (xValueObj != null)
|
||
{
|
||
newDataPoint.SetValueXY(xValueObj, yValuesObj);
|
||
}
|
||
else
|
||
{
|
||
newDataPoint.SetValueXY(0, yValuesObj);
|
||
}
|
||
DataPointInit(ref newDataPoint);
|
||
newDataPoint.IsEmpty = true;
|
||
this.Add(newDataPoint);
|
||
}
|
||
else
|
||
{
|
||
if (xValueObj != null)
|
||
{
|
||
newDataPoint.SetValueXY(xValueObj, yValuesObj);
|
||
}
|
||
else
|
||
{
|
||
newDataPoint.SetValueXY(0, yValuesObj);
|
||
}
|
||
DataPointInit(ref newDataPoint);
|
||
this.Add(newDataPoint);
|
||
}
|
||
}
|
||
|
||
} while (xValueExsist || yValueExsist);
|
||
|
||
}
|
||
finally
|
||
{
|
||
this.ResumeUpdates();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if objet represents an empty value.
|
||
/// </summary>
|
||
/// <param name="val">Value to test.</param>
|
||
/// <returns>True if empty.</returns>
|
||
internal static bool IsEmptyValue(object val)
|
||
{
|
||
if(val is System.DBNull || val == null)
|
||
{
|
||
return true;
|
||
}
|
||
if(val is double && double.IsNaN((double)val))
|
||
{
|
||
return true;
|
||
}
|
||
if(val is Single && Single.IsNaN((Single)val))
|
||
{
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Adds one data point with one Y value.
|
||
/// </summary>
|
||
/// <param name="yValue">Y value of the data point.</param>
|
||
/// <returns>Index of newly added data point.</returns>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "Y is a cartesian coordinate and well understood")]
|
||
public int AddY(double yValue)
|
||
{
|
||
// Create new point object
|
||
DataPoint newDataPoint = new DataPoint(series);
|
||
newDataPoint.SetValueY(yValue);
|
||
DataPointInit(ref newDataPoint);
|
||
Add(newDataPoint);
|
||
return Count - 1;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Adds one data point with one or more Y values.
|
||
/// </summary>
|
||
/// <param name="yValue">List of Y values of the data point.</param>
|
||
/// <returns>Index of newly added data point.</returns>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "Y is a cartesian coordinate and well understood")]
|
||
public int AddY(params object[] yValue)
|
||
{
|
||
//Check arguments
|
||
if (yValue == null ||
|
||
yValue.Length==1 && yValue[0]==null)
|
||
throw new ArgumentNullException("yValue");
|
||
|
||
// Auto detect DateTime values type
|
||
if(this.series.YValueType == ChartValueType.Auto &&
|
||
yValue.Length > 0 &&
|
||
yValue[0] != null)
|
||
{
|
||
if (yValue[0] is DateTime)
|
||
{
|
||
this.series.YValueType = ChartValueType.DateTime;
|
||
this.series.autoYValueType = true;
|
||
}
|
||
else if (yValue[0] is DateTimeOffset)
|
||
{
|
||
this.series.YValueType = ChartValueType.DateTimeOffset;
|
||
this.series.autoYValueType = true;
|
||
}
|
||
}
|
||
|
||
// Create new point object
|
||
DataPoint newDataPoint = new DataPoint(series);
|
||
newDataPoint.SetValueY(yValue);
|
||
DataPointInit(ref newDataPoint);
|
||
Add(newDataPoint);
|
||
return Count - 1;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Adds one data point with X value and one Y value.
|
||
/// </summary>
|
||
/// <param name="yValue">Y value of the data point.</param>
|
||
/// <param name="xValue">X value of the data point.</param>
|
||
/// <returns>Index of newly added data poit.</returns>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "X and Y are cartesian coordinates and well understood")]
|
||
public int AddXY(double xValue, double yValue)
|
||
{
|
||
// Create new point object
|
||
DataPoint newDataPoint = new DataPoint(series);
|
||
newDataPoint.SetValueXY(xValue, yValue);
|
||
DataPointInit(ref newDataPoint);
|
||
Add(newDataPoint);
|
||
return Count - 1;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Adds one data point with X value and one or more Y values.
|
||
/// </summary>
|
||
/// <param name="yValue">List of Y values of the data point.</param>
|
||
/// <param name="xValue">X value of the data point.</param>
|
||
/// <returns>Index of newly added data poit.</returns>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "X and Y are cartesian coordinates and well understood")]
|
||
public int AddXY(object xValue, params object[] yValue)
|
||
{
|
||
|
||
// Auto detect DateTime and String values type
|
||
if(this.series.XValueType == ChartValueType.Auto)
|
||
{
|
||
if(xValue is DateTime)
|
||
{
|
||
this.series.XValueType = ChartValueType.DateTime;
|
||
}
|
||
if(xValue is DateTimeOffset)
|
||
{
|
||
this.series.XValueType = ChartValueType.DateTimeOffset;
|
||
}
|
||
if(xValue is string)
|
||
{
|
||
this.series.XValueType = ChartValueType.String;
|
||
}
|
||
|
||
this.series.autoXValueType = true;
|
||
}
|
||
|
||
if(this.series.YValueType == ChartValueType.Auto &&
|
||
yValue.Length > 0 &&
|
||
yValue[0] != null)
|
||
{
|
||
if (yValue[0] is DateTime)
|
||
{
|
||
this.series.YValueType = ChartValueType.DateTime;
|
||
this.series.autoYValueType = true;
|
||
}
|
||
else if (yValue[0] is DateTimeOffset)
|
||
{
|
||
this.series.YValueType = ChartValueType.DateTimeOffset;
|
||
this.series.autoYValueType = true;
|
||
}
|
||
}
|
||
|
||
// Create new point object
|
||
DataPoint newDataPoint = new DataPoint(series);
|
||
newDataPoint.SetValueXY(xValue, yValue);
|
||
DataPointInit(ref newDataPoint);
|
||
Add(newDataPoint);
|
||
return Count - 1;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Insert one data point with X value and one or more Y values.
|
||
/// </summary>
|
||
/// <param name="index">Index after which to insert the data point.</param>
|
||
/// <param name="xValue">X value of the data point.</param>
|
||
/// <param name="yValue">List of Y values of the data point.</param>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "X and Y are cartesian coordinates and well understood")]
|
||
public void InsertXY(int index, object xValue, params object[] yValue)
|
||
{
|
||
DataPoint newDataPoint = new DataPoint(series);
|
||
newDataPoint.SetValueXY(xValue, yValue);
|
||
DataPointInit(ref newDataPoint);
|
||
this.Insert(index, newDataPoint);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Insert one data point with one or more Y values.
|
||
/// </summary>
|
||
/// <param name="index">Index after which to insert the data point.</param>
|
||
/// <param name="yValue">List of Y values of the data point.</param>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "Y is a cartesian coordinate and well understood")]
|
||
public void InsertY(int index, params object[] yValue)
|
||
{
|
||
DataPoint newDataPoint = new DataPoint(series);
|
||
newDataPoint.SetValueY(yValue);
|
||
DataPointInit(ref newDataPoint);
|
||
this.Insert(index, newDataPoint);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Get data source enumerator object helper function.
|
||
/// </summary>
|
||
/// <param name="dataSource">Data source.</param>
|
||
/// <returns>Returns data source enumerator.</returns>
|
||
internal static IEnumerator GetDataSourceEnumerator(IEnumerable dataSource)
|
||
{
|
||
DataView dataView = dataSource as DataView;
|
||
if(dataView != null)
|
||
{
|
||
return dataView.GetEnumerator();
|
||
}
|
||
DataSet dataSet = dataSource as DataSet;
|
||
if(dataSet != null)
|
||
{
|
||
if(dataSet.Tables.Count > 0)
|
||
{
|
||
return dataSet.Tables[0].Rows.GetEnumerator();
|
||
}
|
||
}
|
||
|
||
return dataSource.GetEnumerator();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Convert enumeration item object from DataRow and DataRowView
|
||
/// to the actual value of specified column in row
|
||
/// </summary>
|
||
/// <param name="item">Enumeration item.</param>
|
||
/// <param name="fieldName">Converted item.</param>
|
||
/// <returns></returns>
|
||
internal static object ConvertEnumerationItem(object item, string fieldName)
|
||
{
|
||
object result = item;
|
||
|
||
// If original object is DataRow
|
||
DataRow dataRow = item as DataRow;
|
||
if(dataRow != null)
|
||
{
|
||
if(fieldName != null && fieldName.Length > 0)
|
||
{
|
||
// Check if specified column exist
|
||
bool failed = true;
|
||
if (dataRow.Table.Columns.Contains(fieldName))
|
||
{
|
||
result = dataRow[fieldName];
|
||
failed = false;
|
||
}
|
||
else
|
||
{
|
||
// Try to treat field name as column index number
|
||
int columnIndex;
|
||
failed = !int.TryParse(fieldName, NumberStyles.Any, CultureInfo.InvariantCulture, out columnIndex);
|
||
|
||
if (!failed && columnIndex < dataRow.Table.Columns.Count && columnIndex >= 0)
|
||
{
|
||
result = dataRow[columnIndex];
|
||
}
|
||
}
|
||
|
||
if(failed)
|
||
{
|
||
throw(new ArgumentException( SR.ExceptionColumnNameNotFound( fieldName) ) );
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// Get first column value if name not specified
|
||
result = dataRow[0];
|
||
}
|
||
}
|
||
|
||
// If original object is DataRowView
|
||
|
||
DataRowView dataRowView = item as DataRowView;
|
||
if(dataRowView != null)
|
||
{
|
||
if(fieldName != null && fieldName.Length > 0)
|
||
{
|
||
// Check if specified column exist
|
||
bool failed = true;
|
||
if (dataRowView.DataView.Table.Columns.Contains(fieldName))
|
||
{
|
||
result = dataRowView[fieldName];
|
||
failed = false;
|
||
}
|
||
else
|
||
{
|
||
// Try to treat field name as column index number
|
||
int columnIndex;
|
||
failed = !int.TryParse(fieldName, NumberStyles.Any, CultureInfo.InvariantCulture, out columnIndex);
|
||
if (!failed && columnIndex < dataRowView.DataView.Table.Columns.Count && columnIndex >= 0)
|
||
{
|
||
result = dataRowView[columnIndex];
|
||
}
|
||
}
|
||
|
||
if(failed)
|
||
{
|
||
throw(new ArgumentException( SR.ExceptionColumnNameNotFound(fieldName)));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// Get first column value if name not specified
|
||
result = dataRowView[0];
|
||
}
|
||
}
|
||
|
||
// If original object is DbDataRecord
|
||
DbDataRecord dbDataRecord = item as DbDataRecord;
|
||
if(dbDataRecord != null)
|
||
{
|
||
if(fieldName != null && fieldName.Length > 0)
|
||
{
|
||
// Check if specified column exist
|
||
bool failed = true;
|
||
if(!Char.IsNumber(fieldName, 0))
|
||
{
|
||
try
|
||
{
|
||
result = dbDataRecord[fieldName];
|
||
failed = false;
|
||
}
|
||
catch (IndexOutOfRangeException)
|
||
{
|
||
failed = true;
|
||
}
|
||
}
|
||
|
||
if(failed)
|
||
{
|
||
// Try to treat field name as column index number
|
||
try
|
||
{
|
||
int columnIndex;
|
||
bool parseSucceed = int.TryParse(fieldName, NumberStyles.Any, CultureInfo.InvariantCulture, out columnIndex);
|
||
|
||
if (parseSucceed)
|
||
{
|
||
result = dbDataRecord[columnIndex];
|
||
failed = false;
|
||
}
|
||
else
|
||
{
|
||
failed = true;
|
||
}
|
||
}
|
||
catch (IndexOutOfRangeException)
|
||
{
|
||
failed = true;
|
||
}
|
||
}
|
||
|
||
if(failed)
|
||
{
|
||
throw(new ArgumentException( SR.ExceptionColumnNameNotFound(fieldName)));
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
// Get first column value if name not specified
|
||
result = dbDataRecord[0];
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (fieldName != null && fieldName.Length > 0)
|
||
{
|
||
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(item).Find(fieldName, true);
|
||
if (descriptor != null)
|
||
{
|
||
result = descriptor.GetValue(item);
|
||
return result ?? null;
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
/// <summary>
|
||
/// Auto detects the X and Y(s) values type
|
||
/// </summary>
|
||
/// <param name="series">Series the values type is detected for.</param>
|
||
/// <param name="xEnumerator">X values enumerator.</param>
|
||
/// <param name="xField">X value field.</param>
|
||
/// <param name="yEnumerator">Y values enumerator.</param>
|
||
/// <param name="yField">Y value field.</param>
|
||
internal static void AutoDetectValuesType(
|
||
Series series,
|
||
IEnumerator xEnumerator,
|
||
string xField,
|
||
IEnumerator yEnumerator,
|
||
string yField)
|
||
{
|
||
if(series.XValueType == ChartValueType.Auto)
|
||
{
|
||
series.XValueType = GetValueType(xEnumerator, xField);
|
||
if(series.XValueType != ChartValueType.Auto)
|
||
{
|
||
series.autoXValueType = true;
|
||
}
|
||
}
|
||
if(series.YValueType == ChartValueType.Auto)
|
||
{
|
||
series.YValueType = GetValueType(yEnumerator, yField);
|
||
if(series.YValueType != ChartValueType.Auto)
|
||
{
|
||
series.autoYValueType = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Return value type.
|
||
/// </summary>
|
||
/// <param name="enumerator">Values enumerator.</param>
|
||
/// <param name="field">Value field.</param>
|
||
private static ChartValueType GetValueType(IEnumerator enumerator, string field)
|
||
{
|
||
ChartValueType type = ChartValueType.Auto;
|
||
Type columnDataType = null;
|
||
|
||
// Check parameters
|
||
if(enumerator == null)
|
||
{
|
||
return type;
|
||
}
|
||
|
||
// Check if current enumeration element is available
|
||
try
|
||
{
|
||
if(enumerator.Current == null)
|
||
{
|
||
return type;
|
||
}
|
||
}
|
||
catch(InvalidOperationException)
|
||
{
|
||
return type;
|
||
}
|
||
|
||
|
||
// If original object is DataRow
|
||
if(enumerator.Current is DataRow)
|
||
{
|
||
if(field != null && field.Length > 0)
|
||
{
|
||
// Check if specified column exist
|
||
bool failed = true;
|
||
if(((DataRow)enumerator.Current).Table.Columns.Contains(field))
|
||
{
|
||
columnDataType = ((DataRow)enumerator.Current).Table.Columns[field].DataType;
|
||
failed = false;
|
||
}
|
||
|
||
// Try to treat field as column number
|
||
if (failed)
|
||
{
|
||
int columnIndex;
|
||
bool parseSucceed = int.TryParse(field, NumberStyles.Any, CultureInfo.InvariantCulture, out columnIndex);
|
||
|
||
if (parseSucceed)
|
||
{
|
||
columnDataType = ((DataRow)enumerator.Current).Table.Columns[columnIndex].DataType;
|
||
failed = false;
|
||
}
|
||
else
|
||
{
|
||
failed = true;
|
||
}
|
||
}
|
||
|
||
if(failed)
|
||
{
|
||
throw(new ArgumentException( SR.ExceptionColumnNameNotFound(field)));
|
||
}
|
||
|
||
}
|
||
else if(((DataRow)enumerator.Current).Table.Columns.Count > 0)
|
||
{
|
||
columnDataType = ((DataRow)enumerator.Current).Table.Columns[0].DataType;
|
||
}
|
||
}
|
||
|
||
// If original object is DataRowView
|
||
else if(enumerator.Current is DataRowView)
|
||
{
|
||
if(field != null && field.Length > 0)
|
||
{
|
||
// Check if specified column exist
|
||
bool failed = true;
|
||
if(((DataRowView)enumerator.Current).DataView.Table.Columns.Contains(field))
|
||
{
|
||
columnDataType = ((DataRowView)enumerator.Current).DataView.Table.Columns[field].DataType;
|
||
failed = false;
|
||
}
|
||
|
||
// Try to treat field as column number
|
||
if (failed)
|
||
{
|
||
int columnIndex;
|
||
bool parseSucceed = int.TryParse(field, NumberStyles.Any, CultureInfo.InvariantCulture, out columnIndex);
|
||
if (parseSucceed)
|
||
{
|
||
columnDataType = ((DataRowView)enumerator.Current).DataView.Table.Columns[columnIndex].DataType;
|
||
failed = false;
|
||
}
|
||
else
|
||
{
|
||
failed = true;
|
||
}
|
||
}
|
||
|
||
if(failed)
|
||
{
|
||
throw(new ArgumentException(SR.ExceptionColumnNameNotFound(field)));
|
||
}
|
||
|
||
}
|
||
else if(((DataRowView)enumerator.Current).DataView.Table.Columns.Count > 0)
|
||
{
|
||
columnDataType = ((DataRowView)enumerator.Current).DataView.Table.Columns[0].DataType;
|
||
}
|
||
}
|
||
|
||
// If original object is DbDataRecord
|
||
else if(enumerator.Current is DbDataRecord)
|
||
{
|
||
if(field != null && field.Length > 0)
|
||
{
|
||
bool failed = true;
|
||
int columnIndex = 0;
|
||
if(!Char.IsNumber(field, 0))
|
||
{
|
||
columnIndex = ((DbDataRecord)enumerator.Current).GetOrdinal(field);
|
||
columnDataType = ((DbDataRecord)enumerator.Current).GetFieldType(columnIndex);
|
||
failed = false;
|
||
}
|
||
|
||
// Try to treat field as column number
|
||
if (failed)
|
||
{
|
||
failed = !int.TryParse(field, NumberStyles.Any, CultureInfo.InvariantCulture, out columnIndex);
|
||
|
||
if (!failed)
|
||
{
|
||
columnDataType = ((DbDataRecord)enumerator.Current).GetFieldType(columnIndex);
|
||
}
|
||
}
|
||
|
||
if(failed)
|
||
{
|
||
throw(new ArgumentException(SR.ExceptionColumnNameNotFound(field)));
|
||
}
|
||
|
||
}
|
||
else if(((DbDataRecord)enumerator.Current).FieldCount > 0)
|
||
{
|
||
columnDataType = ((DbDataRecord)enumerator.Current).GetFieldType(0);
|
||
}
|
||
}
|
||
// Try detecting simple data types
|
||
else
|
||
{
|
||
if (field != null && field.Length > 0)
|
||
{
|
||
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(enumerator.Current).Find(field, true);
|
||
if (descriptor != null)
|
||
{
|
||
columnDataType = descriptor.PropertyType;
|
||
}
|
||
}
|
||
if ( columnDataType == null )
|
||
{
|
||
columnDataType = enumerator.Current.GetType();
|
||
}
|
||
}
|
||
|
||
// Use data type
|
||
if(columnDataType != null)
|
||
{
|
||
if(columnDataType == typeof(DateTime))
|
||
type = ChartValueType.DateTime;
|
||
else if (columnDataType == typeof(DateTimeOffset))
|
||
type = ChartValueType.DateTimeOffset;
|
||
else if (columnDataType == typeof(TimeSpan))
|
||
type = ChartValueType.Time;
|
||
else if (columnDataType == typeof(Double))
|
||
type = ChartValueType.Double;
|
||
else if (columnDataType == typeof(Int32))
|
||
type = ChartValueType.Int32;
|
||
else if(columnDataType == typeof(Int64))
|
||
type = ChartValueType.Int64;
|
||
else if(columnDataType == typeof(Single))
|
||
type = ChartValueType.Single;
|
||
else if(columnDataType == typeof(String))
|
||
type = ChartValueType.String;
|
||
else if(columnDataType == typeof(UInt32))
|
||
type = ChartValueType.UInt32;
|
||
else if(columnDataType == typeof(UInt64))
|
||
type = ChartValueType.UInt64;
|
||
}
|
||
|
||
return type;
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region DataPoint finding functions
|
||
|
||
/// <summary>
|
||
/// Find all the points that equal to the specified value starting from the specified index.
|
||
/// </summary>
|
||
/// <param name="valueToFind">Point value to find.</param>
|
||
/// <param name="useValue">Which point value to use (X, Y1, Y2,...).</param>
|
||
/// <param name="startIndex">Index of the point to start looking from.</param>
|
||
/// <returns>Enumerator of datapoints.</returns>
|
||
public IEnumerable<DataPoint> FindAllByValue(double valueToFind, string useValue, int startIndex)
|
||
{
|
||
// Loop through all points from specified index
|
||
for (int i = startIndex; i < this.Count; i++)
|
||
{
|
||
DataPoint point = this[i];
|
||
if (point.GetValueByName(useValue) == valueToFind)
|
||
{
|
||
yield return point;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Find all the points that equal to the specified value.
|
||
/// </summary>
|
||
/// <param name="valueToFind">Point value to find.</param>
|
||
/// <param name="useValue">Which point value to use (X, Y1, Y2,...).</param>
|
||
/// <returns>Enumerator of datapoints.</returns>
|
||
public IEnumerable<DataPoint> FindAllByValue(double valueToFind, string useValue)
|
||
{
|
||
// Loop through all points from specified index
|
||
for (int i = 0; i < this.Count; i++)
|
||
{
|
||
DataPoint point = this[i];
|
||
if (point.GetValueByName(useValue) == valueToFind)
|
||
{
|
||
yield return point;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Find all the points that equal to the specified value.
|
||
/// </summary>
|
||
/// <param name="valueToFind">Point value to find.</param>
|
||
/// <returns>Enumerator of datapoints.</returns>
|
||
public IEnumerable<DataPoint> FindAllByValue(double valueToFind)
|
||
{
|
||
return FindAllByValue(valueToFind, "Y");
|
||
}
|
||
|
||
/// <summary>
|
||
/// Find the first point that equals to the specified value starting from the specified index.
|
||
/// </summary>
|
||
/// <param name="valueToFind">Point value to find.</param>
|
||
/// <param name="useValue">Which point value to use (X, Y1, Y2,...).</param>
|
||
/// <param name="startIndex">Index of the point to start looking from.</param>
|
||
/// <returns>Datapoint which matches the value. Null if there is no match.</returns>
|
||
public DataPoint FindByValue(double valueToFind, string useValue, int startIndex)
|
||
{
|
||
//Check arguments
|
||
if (useValue == null)
|
||
throw new ArgumentNullException("useValue");
|
||
if (startIndex < 0 || startIndex >= this.Count)
|
||
throw new ArgumentOutOfRangeException("startIndex");
|
||
|
||
// Loop through all points from specified index
|
||
for (int i = startIndex; i < this.Count; i++)
|
||
{
|
||
DataPoint point = this[i];
|
||
if (point.GetValueByName(useValue) == valueToFind)
|
||
{
|
||
return point;
|
||
}
|
||
}
|
||
|
||
// Nothing was found
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Find the first point that equals to the specified value.
|
||
/// </summary>
|
||
/// <param name="valueToFind">Point value to find.</param>
|
||
/// <param name="useValue">Which point value to use (X, Y1, Y2,...).</param>
|
||
/// <returns>Datapoint which matches the value. Null if there is no match.</returns>
|
||
public DataPoint FindByValue(double valueToFind, string useValue)
|
||
{
|
||
return FindByValue(valueToFind, useValue, 0);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Find the first point that equals to the specified value.
|
||
/// </summary>
|
||
/// <param name="valueToFind">Point value to find.</param>
|
||
/// <returns>Datapoint which matches the value. Null if there is no match.</returns>
|
||
public DataPoint FindByValue(double valueToFind)
|
||
{
|
||
return FindByValue(valueToFind, "Y");
|
||
}
|
||
|
||
/// <summary>
|
||
/// Find point with the maximum value starting from specified index.
|
||
/// </summary>
|
||
/// <param name="useValue">Which point value to use (X, Y1, Y2,...).</param>
|
||
/// <param name="startIndex">Index of the point to start looking from.</param>
|
||
/// <returns>Datapoint with the maximum value.</returns>
|
||
public DataPoint FindMaxByValue(string useValue, int startIndex)
|
||
{
|
||
//Check arguments
|
||
if (useValue == null)
|
||
throw new ArgumentNullException("useValue");
|
||
if (startIndex < 0 || startIndex >= this.Count)
|
||
throw new ArgumentOutOfRangeException("startIndex");
|
||
|
||
bool isYValue = useValue.StartsWith("Y", StringComparison.OrdinalIgnoreCase);
|
||
double maxValue = double.MinValue;
|
||
DataPoint maxPoint = null;
|
||
|
||
for (int i = startIndex; i < this.Count; i++)
|
||
{
|
||
DataPoint point = this[i];
|
||
|
||
// Skip empty points when searching for the Y values
|
||
if (point.IsEmpty && isYValue)
|
||
continue;
|
||
|
||
double pointValue = point.GetValueByName(useValue);
|
||
|
||
if (maxValue < pointValue)
|
||
{
|
||
maxValue = pointValue;
|
||
maxPoint = point;
|
||
}
|
||
}
|
||
|
||
return maxPoint;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Find point with the maximum value.
|
||
/// </summary>
|
||
/// <param name="useValue">Which point value to use (X, Y1, Y2,...).</param>
|
||
/// <returns>Datapoint with the maximum value.</returns>
|
||
public DataPoint FindMaxByValue(string useValue)
|
||
{
|
||
return FindMaxByValue(useValue, 0);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Find data point with the maximum value.
|
||
/// </summary>
|
||
/// <returns>Datapoint with the maximum value.</returns>
|
||
public DataPoint FindMaxByValue()
|
||
{
|
||
return FindMaxByValue("Y");
|
||
}
|
||
|
||
/// <summary>
|
||
/// Find point with the Min value starting from specified index.
|
||
/// </summary>
|
||
/// <param name="useValue">Which point value to use (X, Y1, Y2,...).</param>
|
||
/// <param name="startIndex">Index of the point to start looking from.</param>
|
||
/// <returns>Datapoint with the Min value.</returns>
|
||
public DataPoint FindMinByValue(string useValue, int startIndex)
|
||
{
|
||
if (useValue == null)
|
||
throw new ArgumentNullException("useValue");
|
||
if (startIndex < 0 || startIndex >= this.Count)
|
||
throw new ArgumentOutOfRangeException("startIndex");
|
||
|
||
bool isYValue = useValue.StartsWith("Y", StringComparison.OrdinalIgnoreCase);
|
||
double minValue = double.MaxValue;
|
||
DataPoint minPoint = null;
|
||
|
||
for (int i = startIndex; i < this.Count; i++)
|
||
{
|
||
DataPoint point = this[i];
|
||
|
||
// Skip empty points when searching for the Y values
|
||
if (point.IsEmpty && isYValue)
|
||
continue;
|
||
|
||
double pointValue = point.GetValueByName(useValue);
|
||
|
||
if (minValue > pointValue)
|
||
{
|
||
minValue = pointValue;
|
||
minPoint = point;
|
||
}
|
||
}
|
||
|
||
return minPoint;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Find point with the Min value.
|
||
/// </summary>
|
||
/// <param name="useValue">Which point value to use (X, Y1, Y2,...).</param>
|
||
/// <returns>Datapoint with the Min value.</returns>
|
||
public DataPoint FindMinByValue(string useValue)
|
||
{
|
||
return FindMinByValue(useValue, 0);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Find point with the Min value
|
||
/// </summary>
|
||
/// <returns>Datapoint with the Min value.</returns>
|
||
public DataPoint FindMinByValue()
|
||
{
|
||
return FindMinByValue("Y");
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region Collection<T> overrides
|
||
|
||
/// <summary>
|
||
/// Initializes the specified item.
|
||
/// </summary>
|
||
/// <param name="item">The item.</param>
|
||
internal override void Initialize(DataPoint item)
|
||
{
|
||
DataPointInit(ref item);
|
||
base.Initialize(item);
|
||
}
|
||
|
||
#if Microsoft_CONTROL
|
||
/// <summary>
|
||
/// Removes all elements from the <see cref="T:System.Collections.ObjectModel.Collection`1"/>.
|
||
/// </summary>
|
||
protected override void ClearItems()
|
||
{
|
||
|
||
// Refresh Minimum and Maximum from data
|
||
// after recalc and set data
|
||
if (Common != null && Common.ChartPicture != null)
|
||
{
|
||
Common.ChartPicture.ResetMinMaxFromData();
|
||
}
|
||
|
||
base.ClearItems();
|
||
}
|
||
#endif
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Stores values and properties of a DataPoint of a Series.
|
||
/// </summary>
|
||
[
|
||
SRDescription("DescriptionAttributeDataPoint_DataPoint"),
|
||
DefaultProperty("YValues"),
|
||
TypeConverter(Editors.DataPointConverter.Convertor)
|
||
]
|
||
#if ASPPERM_35
|
||
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
||
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
||
#endif
|
||
#if !Microsoft_CONTROL
|
||
[Themeable(false)]
|
||
#endif
|
||
public class DataPoint : DataPointCustomProperties
|
||
{
|
||
#region Fields
|
||
|
||
// Point X value
|
||
private double _xValue;
|
||
|
||
// Point Y values
|
||
private double[] _yValue = new double[1];
|
||
|
||
// Pre calculated (during painting) relative position of data point
|
||
internal PointF positionRel = PointF.Empty;
|
||
|
||
// VSTS:199794 - Accessibility needs the last rendered label content to be exposed.
|
||
// The current label content evaluation is scattered over different chart types and cannot be isolated without risk of regression.
|
||
// This variable will cache the label content taken just before drawing.
|
||
internal string _lastLabelText = String.Empty;
|
||
|
||
#endregion
|
||
|
||
#region Constructors
|
||
|
||
/// <summary>
|
||
/// DataPoint object constructor.
|
||
/// </summary>
|
||
public DataPoint() : base(null, true)
|
||
{
|
||
_yValue = new double[1];
|
||
}
|
||
|
||
/// <summary>
|
||
/// DataPoint object constructor.
|
||
/// </summary>
|
||
/// <param name="series">series object, which the DataPoint belongs to.</param>
|
||
public DataPoint(Series series) : base(series, true)
|
||
{
|
||
// Create Y value(s) array
|
||
_yValue = new double[series.YValuesPerPoint];
|
||
_xValue = 0;
|
||
}
|
||
|
||
/// <summary>
|
||
/// DataPoint object constructor.
|
||
/// </summary>
|
||
/// <param name="xValue">X value.</param>
|
||
/// <param name="yValue">Y value.</param>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "X and Y are cartesian coordinates and well understood")]
|
||
public DataPoint(double xValue, double yValue)
|
||
: base(null, true)
|
||
{
|
||
// Set Y value
|
||
this._yValue = new double[1];
|
||
this._yValue[0] = yValue;
|
||
|
||
// Set X value
|
||
this._xValue = xValue;
|
||
}
|
||
|
||
/// <summary>
|
||
/// DataPoint object constructor.
|
||
/// </summary>
|
||
/// <param name="xValue">X value.</param>
|
||
/// <param name="yValues">Array of Y values.</param>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "X and Y are cartesian coordinates and well understood")]
|
||
public DataPoint(double xValue, double[] yValues)
|
||
: base(null, true)
|
||
{
|
||
// Set Y value
|
||
this._yValue = yValues;
|
||
|
||
// Set X value
|
||
this._xValue = xValue;
|
||
}
|
||
|
||
/// <summary>
|
||
/// DataPoint object constructor.
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// This method is only used during the Windows Forms serialization of the chart.
|
||
/// </remarks>
|
||
/// <param name="xValue">X value.</param>
|
||
/// <param name="yValues">String of comma separated Y values.</param>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "X and Y are cartesian coordinates and well understood")]
|
||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||
public DataPoint(double xValue, string yValues)
|
||
: base(null, true)
|
||
{
|
||
string[] values = yValues.Split(',');
|
||
|
||
// Create Y value(s) array
|
||
_yValue = new double[values.Length];
|
||
|
||
for (int index = 0; index < values.Length; index++)
|
||
{
|
||
_yValue[index] = CommonElements.ParseDouble(values[index], true);
|
||
}
|
||
|
||
// Set X value
|
||
this._xValue = xValue;
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region Data point methods
|
||
|
||
/// <summary>
|
||
/// Sets the specified data point attribute to the specified value.
|
||
/// </summary>
|
||
/// <param name="obj">Attribute value.</param>
|
||
/// <param name="propertyName">Attribute name.</param>
|
||
/// <param name="format">Value format.</param>
|
||
internal void SetPointCustomProperty(
|
||
object obj,
|
||
string propertyName,
|
||
string format)
|
||
{
|
||
// Convert value to string
|
||
string stringValue = obj as string;
|
||
if(stringValue == null)
|
||
{
|
||
double doubleObj = double.NaN;
|
||
ChartValueType valueType = ChartValueType.Auto;
|
||
if(obj is DateTime)
|
||
{
|
||
doubleObj = ((DateTime)obj).ToOADate();
|
||
valueType = ChartValueType.Date;
|
||
}
|
||
else
|
||
{
|
||
doubleObj = this.ConvertValue(obj);
|
||
}
|
||
|
||
// Try converting to string
|
||
if( !double.IsNaN(doubleObj) )
|
||
{
|
||
try
|
||
{
|
||
stringValue = ValueConverter.FormatValue(
|
||
this.Chart,
|
||
this,
|
||
this.Tag,
|
||
doubleObj,
|
||
format,
|
||
valueType,
|
||
ChartElementType.DataPoint);
|
||
}
|
||
catch(FormatException)
|
||
{
|
||
// Use basic string converter
|
||
stringValue = obj.ToString();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// Use basic string converter
|
||
stringValue = obj.ToString();
|
||
}
|
||
}
|
||
|
||
// Assign data point attribute by name
|
||
if(stringValue.Length > 0)
|
||
{
|
||
if(String.Compare(propertyName, "AxisLabel", StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
this.AxisLabel = stringValue;
|
||
}
|
||
else if (String.Compare(propertyName, "Tooltip", StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
this.ToolTip = stringValue;
|
||
}
|
||
#if !Microsoft_CONTROL
|
||
else if(String.Compare(propertyName, "Url", StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
this.Url = stringValue;
|
||
}
|
||
else if (String.Compare(propertyName, "PostBackValue", StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
this.PostBackValue = stringValue;
|
||
}
|
||
else if (String.Compare(propertyName, "LabelUrl", StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
this.LabelUrl = stringValue;
|
||
}
|
||
else if (String.Compare(propertyName, "LabelPostBackValue", StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
this.LabelPostBackValue = stringValue;
|
||
}
|
||
else if (String.Compare(propertyName, "LegendUrl", StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
this.LegendUrl = stringValue;
|
||
}
|
||
else if (String.Compare(propertyName, "LegendPostBackValue", StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
this.LegendPostBackValue = stringValue;
|
||
}
|
||
#endif // !Microsoft_CONTROL
|
||
else if (String.Compare(propertyName, "Label", StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
this.Label = stringValue;
|
||
}
|
||
else if (String.Compare(propertyName, "LegendTooltip", StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
this.LegendToolTip = stringValue;
|
||
}
|
||
else if (String.Compare(propertyName, "LegendText", StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
this.LegendText = stringValue;
|
||
}
|
||
else if (String.Compare(propertyName, "LabelToolTip", StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
this.LabelToolTip = stringValue;
|
||
}
|
||
else
|
||
{
|
||
this[propertyName] = stringValue;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// Converts object to double.
|
||
/// </summary>
|
||
/// <param name="value">Object to convert.</param>
|
||
/// <returns>Double value.</returns>
|
||
private double ConvertValue(object value)
|
||
{
|
||
if(value == null)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
if(value is Double)
|
||
{
|
||
return (double)value;
|
||
}
|
||
else if(value is Single)
|
||
{
|
||
return (double)((float)value);
|
||
}
|
||
else if(value is Decimal)
|
||
{
|
||
return (double)((Decimal)value);
|
||
}
|
||
else if(value is Int32)
|
||
{
|
||
return (double)((Int32)value);
|
||
}
|
||
else if(value is UInt32)
|
||
{
|
||
return (double)((UInt32)value);
|
||
}
|
||
else if(value is Int64)
|
||
{
|
||
return (double)((Int64)value);
|
||
}
|
||
else if(value is UInt64)
|
||
{
|
||
return (double)((UInt64)value);
|
||
}
|
||
else if(value is Byte)
|
||
{
|
||
return (double)((Byte)value);
|
||
}
|
||
else if(value is SByte)
|
||
{
|
||
return (double)((SByte)value);
|
||
}
|
||
else if(value is Boolean)
|
||
{
|
||
return ((Boolean)value) ? 1.0 : 0.0;
|
||
}
|
||
else
|
||
{
|
||
string stringValue = "";
|
||
stringValue = value.ToString();
|
||
return CommonElements.ParseDouble(stringValue);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Set X value and one or more Y values of the data point.
|
||
/// </summary>
|
||
/// <param name="xValue">X value of the data point.</param>
|
||
/// <param name="yValue">List of Y values of the data point.</param>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "X and Y are cartesian coordinates and well understood")]
|
||
public void SetValueXY(object xValue, params object[] yValue)
|
||
{
|
||
// Check arguments
|
||
if (xValue == null)
|
||
throw new ArgumentNullException("xValue");
|
||
|
||
// Set Y value first
|
||
SetValueY(yValue);
|
||
|
||
// Check if parameters type matches with series type
|
||
Type paramType = xValue.GetType();
|
||
if(base.series != null)
|
||
{
|
||
base.series.CheckSupportedTypes(paramType);
|
||
}
|
||
|
||
// Save value in the array
|
||
if(paramType == typeof(String))
|
||
{
|
||
AxisLabel = (string)xValue;
|
||
}
|
||
else if(paramType == typeof(DateTime))
|
||
{
|
||
this._xValue = ((DateTime)xValue).ToOADate();
|
||
}
|
||
else
|
||
{
|
||
this._xValue = ConvertValue(xValue);
|
||
}
|
||
|
||
// Get Date or Time if required
|
||
if(base.series != null && xValue is DateTime)
|
||
{
|
||
if(base.series.XValueType == ChartValueType.Date)
|
||
{
|
||
DateTime time = new DateTime(
|
||
((DateTime)xValue).Year,
|
||
((DateTime)xValue).Month,
|
||
((DateTime)xValue).Day,
|
||
0,
|
||
0,
|
||
0,
|
||
0);
|
||
this._xValue = time.ToOADate();
|
||
}
|
||
else if(base.series.XValueType == ChartValueType.Time)
|
||
{
|
||
DateTime time = new DateTime(
|
||
1899,
|
||
12,
|
||
30,
|
||
((DateTime)xValue).Hour,
|
||
((DateTime)xValue).Minute,
|
||
((DateTime)xValue).Second,
|
||
((DateTime)xValue).Millisecond);
|
||
this._xValue = time.ToOADate();
|
||
}
|
||
}
|
||
|
||
// Check if one of Y values are not avilable
|
||
bool empty = false;
|
||
foreach(double d in this._yValue)
|
||
{
|
||
if(double.IsNaN(d))
|
||
{
|
||
empty = true;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// Set point empty flag and values to zero
|
||
if(empty)
|
||
{
|
||
this.IsEmpty = true;
|
||
for(int valueIndex = 0; valueIndex < this._yValue.Length; valueIndex++)
|
||
{
|
||
this._yValue[valueIndex] = 0.0;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Set one or more Y values of the data point.
|
||
/// </summary>
|
||
/// <param name="yValue">List of Y values of the data point.</param>
|
||
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly",
|
||
Justification = "Y is a cartesian coordinate and well understood")]
|
||
public void SetValueY(params object[] yValue)
|
||
{
|
||
// Check arguments
|
||
if (yValue == null)
|
||
throw new ArgumentNullException("yValue");
|
||
|
||
// Check number of parameters. Should be more than 0 and
|
||
if(yValue.Length == 0 || (base.series != null && yValue.Length > base.series.YValuesPerPoint))
|
||
throw(new ArgumentOutOfRangeException("yValue", SR.ExceptionDataPointYValuesSettingCountMismatch(base.series.YValuesPerPoint.ToString(System.Globalization.CultureInfo.InvariantCulture))));
|
||
|
||
// Check if there is a Null Y value
|
||
for( int i = 0 ; i < yValue.Length ; i++ )
|
||
{
|
||
if(yValue[i] == null || yValue[i] is System.DBNull)
|
||
{
|
||
yValue[i] = 0.0;
|
||
if(i == 0)
|
||
{
|
||
this.IsEmpty = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
// Check if parameters type matches with series type
|
||
Type paramType = yValue[0].GetType();
|
||
if(base.series != null)
|
||
{
|
||
base.series.CheckSupportedTypes(paramType);
|
||
}
|
||
|
||
// Make sure the Y values array is big enough
|
||
if (this._yValue.Length < yValue.Length)
|
||
{
|
||
this._yValue = new double[yValue.Length];
|
||
}
|
||
|
||
// Save value in the array
|
||
if(paramType == typeof(String))
|
||
{
|
||
try
|
||
{
|
||
for (int i = 0; i < yValue.Length; i++)
|
||
{
|
||
this._yValue[i] = CommonElements.ParseDouble((string)yValue[i]);
|
||
}
|
||
}
|
||
catch
|
||
{
|
||
// Get reference to the chart object
|
||
if (Common!=null && Common.ChartPicture!=null && Common.ChartPicture.SuppressExceptions)
|
||
{
|
||
this.IsEmpty = true;
|
||
for (int i = 0; i < yValue.Length; i++)
|
||
{
|
||
yValue[i] = 0.0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
throw (new ArgumentException( SR.ExceptionDataPointYValueStringFormat));
|
||
}
|
||
}
|
||
|
||
}
|
||
else if(paramType == typeof(DateTime))
|
||
{
|
||
for( int i = 0 ; i < yValue.Length ; i++ )
|
||
{
|
||
if(yValue[i] == null ||
|
||
(yValue[i] is double && ((double)yValue[i]) == 0.0) )
|
||
{
|
||
this._yValue[i] = DateTime.Now.ToOADate();
|
||
}
|
||
else
|
||
{
|
||
this._yValue[i] = ((DateTime)yValue[i]).ToOADate();
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for( int i = 0 ; i < yValue.Length ; i++ )
|
||
{
|
||
this._yValue[i] = ConvertValue(yValue[i]);
|
||
}
|
||
}
|
||
|
||
// Get Date or Time if required
|
||
if(base.series != null)
|
||
{
|
||
for( int i = 0 ; i < yValue.Length ; i++ )
|
||
{
|
||
if(yValue[i] == null ||
|
||
(yValue[i] is double && ((double)yValue[i]) == 0.0) )
|
||
{
|
||
if(base.series.YValueType == ChartValueType.Date)
|
||
{
|
||
this._yValue[i] = Math.Floor(this._yValue[i]);
|
||
}
|
||
else if(base.series.YValueType == ChartValueType.Time)
|
||
{
|
||
this._yValue[i] = this._xValue - Math.Floor(this._yValue[i]);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(base.series.YValueType == ChartValueType.Date)
|
||
{
|
||
DateTime yDate;
|
||
if (yValue[i] is DateTime)
|
||
yDate = (DateTime)yValue[i];
|
||
else if (yValue[i] is Double)
|
||
yDate = DateTime.FromOADate((Double)yValue[i]);
|
||
else
|
||
yDate = Convert.ToDateTime(yValue[i], CultureInfo.InvariantCulture); //This will throw an exception in case when the yValue type is not compatible with the DateTime
|
||
|
||
DateTime date = new DateTime(
|
||
yDate.Year,
|
||
yDate.Month,
|
||
yDate.Day,
|
||
0,
|
||
0,
|
||
0,
|
||
0);
|
||
|
||
this._yValue[i] = date.ToOADate();
|
||
}
|
||
else if (base.series.YValueType == ChartValueType.Time)
|
||
{
|
||
DateTime yTime;
|
||
if (yValue[i] is DateTime)
|
||
yTime = (DateTime)yValue[i];
|
||
if (yValue[i] is Double)
|
||
yTime = DateTime.FromOADate((Double)yValue[i]);
|
||
else
|
||
yTime = Convert.ToDateTime(yValue[i], CultureInfo.InvariantCulture); //This will throw an exception in case when the yValue type is not compatible with the DateTime
|
||
|
||
DateTime time = new DateTime(
|
||
1899,
|
||
12,
|
||
30,
|
||
yTime.Hour,
|
||
yTime.Minute,
|
||
yTime.Second,
|
||
yTime.Millisecond);
|
||
|
||
this._yValue[i] = time.ToOADate();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// Creates an exact copy of this DataPoint object.
|
||
/// </summary>
|
||
/// <returns>An exact copy of this DataPoint object.</returns>
|
||
public DataPoint Clone()
|
||
{
|
||
// Create new data point
|
||
DataPoint clonePoint = new DataPoint();
|
||
|
||
// Reset series pointer
|
||
clonePoint.series = null;
|
||
clonePoint.pointCustomProperties = this.pointCustomProperties;
|
||
|
||
// Copy values
|
||
clonePoint._xValue = this.XValue;
|
||
clonePoint._yValue = new double[this._yValue.Length];
|
||
this._yValue.CopyTo(clonePoint._yValue, 0);
|
||
clonePoint.tempColorIsSet = this.tempColorIsSet;
|
||
clonePoint.isEmptyPoint = this.isEmptyPoint;
|
||
|
||
// Copy properties
|
||
foreach(object key in this.properties.Keys)
|
||
{
|
||
clonePoint.properties.Add(key, this.properties[key]);
|
||
}
|
||
|
||
return clonePoint;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resize Y values array.
|
||
/// </summary>
|
||
/// <param name="newSize">New number of Y values in array.</param>
|
||
internal void ResizeYValueArray(int newSize)
|
||
{
|
||
// Create new array
|
||
double[] newArray = new Double[newSize];
|
||
|
||
// Copy elements
|
||
if(_yValue != null)
|
||
{
|
||
for(int i = 0; i < ((_yValue.Length < newSize) ? _yValue.Length : newSize); i++)
|
||
{
|
||
newArray[i] = _yValue[i];
|
||
}
|
||
}
|
||
|
||
_yValue = newArray;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Helper function, which returns point value by it's name.
|
||
/// </summary>
|
||
/// <param name="valueName">Point value names. X, Y, Y2,...</param>
|
||
/// <returns>Point value.</returns>
|
||
public double GetValueByName(string valueName)
|
||
{
|
||
// Check arguments
|
||
if (valueName == null)
|
||
throw new ArgumentNullException("valueName");
|
||
|
||
valueName = valueName.ToUpper(System.Globalization.CultureInfo.InvariantCulture);
|
||
if(String.Compare(valueName, "X", StringComparison.Ordinal) == 0)
|
||
{
|
||
return this.XValue;
|
||
}
|
||
else if (valueName.StartsWith("Y", StringComparison.Ordinal))
|
||
|
||
{
|
||
if(valueName.Length == 1)
|
||
{
|
||
return this.YValues[0];
|
||
}
|
||
else
|
||
{
|
||
int yIndex = 0;
|
||
try
|
||
{
|
||
yIndex = Int32.Parse(valueName.Substring(1), System.Globalization.CultureInfo.InvariantCulture) - 1;
|
||
}
|
||
catch(System.Exception)
|
||
{
|
||
throw(new ArgumentException( SR.ExceptionDataPointValueNameInvalid, "valueName"));
|
||
}
|
||
|
||
if(yIndex < 0)
|
||
{
|
||
throw(new ArgumentException( SR.ExceptionDataPointValueNameYIndexIsNotPositive, "valueName"));
|
||
}
|
||
|
||
if(yIndex >= this.YValues.Length)
|
||
{
|
||
throw(new ArgumentException( SR.ExceptionDataPointValueNameYIndexOutOfRange, "valueName"));
|
||
}
|
||
|
||
return this.YValues[yIndex];
|
||
}
|
||
}
|
||
else
|
||
{
|
||
throw(new ArgumentException( SR.ExceptionDataPointValueNameInvalid, "valueName"));
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Replaces predefined keyword inside the string with their values.
|
||
/// </summary>
|
||
/// <param name="strOriginal">Original string with keywords.</param>
|
||
/// <returns>Modified string.</returns>
|
||
internal override string ReplaceKeywords(string strOriginal)
|
||
{
|
||
// Nothing to process
|
||
if(strOriginal == null || strOriginal.Length == 0)
|
||
return strOriginal;
|
||
|
||
// Replace all "\n" strings with '\n' character
|
||
string result = strOriginal;
|
||
result = result.Replace("\\n", "\n");
|
||
|
||
// #LABEL - point label
|
||
result = result.Replace(KeywordName.Label, this.Label);
|
||
|
||
// #LEGENDTEXT - series name
|
||
result = result.Replace(KeywordName.LegendText, this.LegendText);
|
||
|
||
// #AXISLABEL - series name
|
||
result = result.Replace(KeywordName.AxisLabel, this.AxisLabel);
|
||
|
||
// #CUSTOMPROPERTY - one of the custom properties by name
|
||
result = DataPoint.ReplaceCustomPropertyKeyword(result, this);
|
||
|
||
if(this.series != null)
|
||
{
|
||
// #INDEX - point index
|
||
result = result.Replace(KeywordName.Index, this.series.Points.IndexOf(this).ToString(System.Globalization.CultureInfo.InvariantCulture));
|
||
|
||
// Replace series keywords
|
||
result = this.series.ReplaceKeywords(result);
|
||
|
||
// #PERCENT - percentage of Y value from total
|
||
result = this.series.ReplaceOneKeyword(
|
||
this.Chart,
|
||
this,
|
||
this.Tag,
|
||
ChartElementType.DataPoint,
|
||
result,
|
||
KeywordName.Percent,
|
||
(this.YValues[0]/(this.series.GetTotalYValue())),
|
||
ChartValueType.Double,
|
||
"P");
|
||
|
||
// #VAL[X] - point value X, Y, Y2, ...
|
||
if(this.series.XValueType == ChartValueType.String)
|
||
{
|
||
result = result.Replace(KeywordName.ValX, this.AxisLabel);
|
||
}
|
||
else
|
||
{
|
||
result = this.series.ReplaceOneKeyword(
|
||
this.Chart,
|
||
this,
|
||
this.Tag,
|
||
ChartElementType.DataPoint,
|
||
result,
|
||
KeywordName.ValX,
|
||
this.XValue,
|
||
this.series.XValueType,
|
||
"");
|
||
}
|
||
|
||
// remove keywords #VAL? for unexisted Y value indices
|
||
for (int index = this.YValues.Length; index <= 7; index++)
|
||
{
|
||
result = this.RemoveOneKeyword(result, KeywordName.ValY + index + 1, SR.FormatErrorString);
|
||
}
|
||
|
||
for(int index = 1; index <= this.YValues.Length; index++)
|
||
{
|
||
result = this.series.ReplaceOneKeyword(
|
||
this.Chart,
|
||
this,
|
||
this.Tag,
|
||
ChartElementType.DataPoint,
|
||
result,
|
||
KeywordName.ValY + index,
|
||
this.YValues[index - 1],
|
||
this.series.YValueType,
|
||
"");
|
||
}
|
||
|
||
result = this.series.ReplaceOneKeyword(
|
||
Chart,
|
||
this,
|
||
this.Tag,
|
||
ChartElementType.DataPoint,
|
||
result,
|
||
KeywordName.ValY,
|
||
this.YValues[0],
|
||
this.series.YValueType,
|
||
"");
|
||
|
||
result = this.series.ReplaceOneKeyword(
|
||
Chart,
|
||
this,
|
||
this.Tag,
|
||
ChartElementType.DataPoint,
|
||
result,
|
||
KeywordName.Val,
|
||
this.YValues[0],
|
||
this.series.YValueType,
|
||
"");
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Removes one keyword from format string.
|
||
/// </summary>
|
||
/// <param name="strOriginal">Original format string</param>
|
||
/// <param name="keyword">The keyword</param>
|
||
/// <param name="strToReplace">String to replace the keyword.</param>
|
||
/// <returns>Modified format string</returns>
|
||
private string RemoveOneKeyword(string strOriginal, string keyword, string strToReplace)
|
||
{
|
||
string result = strOriginal;
|
||
int keyIndex = -1;
|
||
while ((keyIndex = result.IndexOf(keyword, StringComparison.Ordinal)) != -1)
|
||
{
|
||
// Get optional format
|
||
int keyEndIndex = keyIndex + keyword.Length;
|
||
if (result.Length > keyEndIndex && result[keyEndIndex] == '{')
|
||
{
|
||
int formatEnd = result.IndexOf('}', keyEndIndex);
|
||
if (formatEnd == -1)
|
||
{
|
||
throw (new InvalidOperationException(SR.ExceptionDataSeriesKeywordFormatInvalid(result)));
|
||
}
|
||
|
||
keyEndIndex = formatEnd + 1;
|
||
}
|
||
// Remove keyword string (with optional format)
|
||
result = result.Remove(keyIndex, keyEndIndex - keyIndex);
|
||
if (!String.IsNullOrEmpty(strToReplace))
|
||
{
|
||
result = result.Insert(keyIndex, strToReplace);
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// Replaces all "#CUSTOMPROPERTY(XXX)" (where XXX is the custom attribute name)
|
||
/// keywords in the string provided.
|
||
/// </summary>
|
||
/// <param name="originalString">String where the keyword need to be replaced.</param>
|
||
/// <param name="properties">DataPoint or Series properties class.</param>
|
||
/// <returns>Converted string.</returns>
|
||
internal static string ReplaceCustomPropertyKeyword(string originalString, DataPointCustomProperties properties)
|
||
{
|
||
string result = originalString;
|
||
int keyStartIndex = -1;
|
||
while ((keyStartIndex = result.IndexOf(KeywordName.CustomProperty, StringComparison.Ordinal)) >= 0)
|
||
{
|
||
string attributeValue = string.Empty;
|
||
string attributeName = string.Empty;
|
||
|
||
// Forward to the end of the keyword
|
||
int keyEndIndex = keyStartIndex + KeywordName.CustomProperty.Length;
|
||
|
||
// An opening bracket '(' must follow
|
||
if (result.Length > keyEndIndex && result[keyEndIndex] == '(')
|
||
{
|
||
++keyEndIndex;
|
||
int attributeNameStartIndex = keyEndIndex;
|
||
|
||
// Search for the closing bracket
|
||
int closingBracketIndex = result.IndexOf(')', keyEndIndex);
|
||
if (closingBracketIndex >= keyEndIndex)
|
||
{
|
||
keyEndIndex = closingBracketIndex + 1;
|
||
attributeName = result.Substring(attributeNameStartIndex, keyEndIndex - attributeNameStartIndex - 1);
|
||
|
||
// Get attribute value
|
||
if (properties.IsCustomPropertySet(attributeName))
|
||
{
|
||
attributeValue = properties.GetCustomProperty(attributeName);
|
||
}
|
||
else
|
||
{
|
||
// In case of the DataPoint check if the attribute is set in the parent series
|
||
DataPoint dataPoint = properties as DataPoint;
|
||
if (dataPoint != null && dataPoint.series != null)
|
||
{
|
||
if (dataPoint.series.IsCustomPropertySet(attributeName))
|
||
{
|
||
attributeValue = dataPoint.series.GetCustomProperty(attributeName);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// Remove keyword string with attribute name
|
||
result = result.Remove(keyStartIndex, keyEndIndex - keyStartIndex);
|
||
|
||
// Insert value of the custom attribute
|
||
result = result.Insert(keyStartIndex, attributeValue);
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
/// <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()
|
||
{
|
||
StringBuilder sb = new StringBuilder();
|
||
sb.AppendFormat(CultureInfo.CurrentCulture, "{{X={0}, ", XValue);
|
||
if (YValues.Length == 1)
|
||
{
|
||
sb.AppendFormat(CultureInfo.CurrentCulture, "Y={0}", YValues[0]);
|
||
}
|
||
else
|
||
{
|
||
sb.Append("Y={");
|
||
for (int i = 0; i < YValues.Length; i++)
|
||
if (i == 0)
|
||
sb.AppendFormat(CultureInfo.CurrentCulture, "{0}", YValues[i]);
|
||
else
|
||
sb.AppendFormat(CultureInfo.CurrentCulture, ", {0}", YValues[i]);
|
||
sb.Append("}");
|
||
}
|
||
sb.Append("}");
|
||
return sb.ToString();
|
||
}
|
||
#endregion
|
||
|
||
#region DataPoint Properties
|
||
|
||
|
||
/// <summary>
|
||
/// X value of the data point.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeData"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeDataPoint_XValue"),
|
||
TypeConverter(typeof(DataPointValueConverter)),
|
||
DefaultValue(typeof(double), "0.0"),
|
||
|
||
|
||
#if Microsoft_CONTROL
|
||
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
||
#else
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public double XValue
|
||
{
|
||
get
|
||
{
|
||
return _xValue;
|
||
}
|
||
set
|
||
{
|
||
_xValue = value;
|
||
this.Invalidate(false);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// List of Y values of the data point.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeData"),
|
||
SRDescription("DescriptionAttributeDataPoint_YValues"),
|
||
Bindable(true),
|
||
|
||
#if Microsoft_CONTROL
|
||
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
||
#else
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
TypeConverter(typeof(DoubleArrayConverter)),
|
||
Editor(typeof(UITypeEditor), typeof(UITypeEditor)),
|
||
RefreshProperties(RefreshProperties.All),
|
||
SerializationVisibilityAttribute(SerializationVisibility.Attribute)
|
||
]
|
||
[SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays")]
|
||
public double[] YValues
|
||
{
|
||
get
|
||
{
|
||
return _yValue;
|
||
}
|
||
set
|
||
{
|
||
if(value == null)
|
||
{
|
||
// Clear array data
|
||
for(int i=0; i < _yValue.Length; i++)
|
||
{
|
||
_yValue[i] = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
_yValue = value;
|
||
}
|
||
this.Invalidate(false);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// A flag which indicates whether the data point is empty.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeData"),
|
||
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeDataPoint_Empty"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
DefaultValue(false)
|
||
]
|
||
public bool IsEmpty
|
||
{
|
||
get
|
||
{
|
||
return base.isEmptyPoint;
|
||
}
|
||
set
|
||
{
|
||
base.isEmptyPoint = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Name of the data point. This field is reserved for internal use only.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeData"),
|
||
Bindable(true),
|
||
Browsable(false),
|
||
SRDescription("DescriptionAttributeDataPoint_Name"),
|
||
DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Hidden),
|
||
SerializationVisibilityAttribute(SerializationVisibility.Hidden)
|
||
]
|
||
public override string Name
|
||
{
|
||
get
|
||
{
|
||
return "DataPoint";
|
||
}
|
||
set
|
||
{
|
||
//Dont call the base method - the names don't need to be unique
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// Stores properties of one Data Point and Data series.
|
||
/// </summary>
|
||
[
|
||
SRDescription("DescriptionAttributeDataPointCustomProperties_DataPointCustomProperties"),
|
||
DefaultProperty("LabelStyle"),
|
||
TypeConverter(Editors.DataPointCustomPropertiesConverter.Convertor)
|
||
]
|
||
#if Microsoft_CONTROL
|
||
public class DataPointCustomProperties : ChartNamedElement
|
||
#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 DataPointCustomProperties : ChartNamedElement, IChartMapArea
|
||
#endif
|
||
{
|
||
#region Fields and enumerations
|
||
|
||
// True indicates data point properties. Otherwise - series.
|
||
internal bool pointCustomProperties = true;
|
||
|
||
// Reference to the data point series
|
||
internal Series series = null;
|
||
|
||
// Storage for the custom properties names/values
|
||
internal Hashtable properties = new Hashtable();
|
||
|
||
// Flag indicating that temp. color was set
|
||
internal bool tempColorIsSet = false;
|
||
|
||
// Design time custom properties data
|
||
internal CustomProperties customProperties = null;
|
||
|
||
// IsEmpty point indicator
|
||
internal bool isEmptyPoint = false;
|
||
|
||
#endregion
|
||
|
||
#region Constructors
|
||
|
||
/// <summary>
|
||
/// DataPointCustomProperties constructor.
|
||
/// </summary>
|
||
public DataPointCustomProperties()
|
||
{
|
||
// Initialize the data series
|
||
this.series = null;
|
||
this.customProperties = new CustomProperties(this);
|
||
}
|
||
|
||
/// <summary>
|
||
/// DataPointCustomProperties constructor.
|
||
/// </summary>
|
||
/// <param name="series">The series which the data point belongs to.</param>
|
||
/// <param name="pointProperties">Indicates whether this is a data point custom properties.</param>
|
||
public DataPointCustomProperties(Series series, bool pointProperties): base( series, String.Empty)
|
||
{
|
||
// Initialize the data series
|
||
this.series = series;
|
||
this.pointCustomProperties = pointProperties;
|
||
this.customProperties = new CustomProperties(this);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region Custom Properties methods
|
||
|
||
/// <summary>
|
||
/// Checks if custom property with specified name was set.
|
||
/// </summary>
|
||
/// <param name="name">Name of the custom property to check.</param>
|
||
/// <returns>True if custom property was set.</returns>
|
||
virtual public bool IsCustomPropertySet(string name)
|
||
{
|
||
return properties.ContainsKey(name);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Checks if the custom property with specified name was set.
|
||
/// </summary>
|
||
/// <param name="property">The CommonCustomProperties object to check for.</param>
|
||
/// <returns>True if attribute was set.</returns>
|
||
internal bool IsCustomPropertySet(CommonCustomProperties property)
|
||
{
|
||
return properties.ContainsKey((int)property);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Delete the data point custom property with the specified name.
|
||
/// </summary>
|
||
/// <param name="name">Name of the property to delete.</param>
|
||
virtual public void DeleteCustomProperty(string name)
|
||
{
|
||
if(name == null)
|
||
{
|
||
throw (new ArgumentNullException(SR.ExceptionAttributeNameIsEmpty));
|
||
}
|
||
|
||
// Check if trying to delete the common attribute
|
||
string[] AttributesNames = CommonCustomProperties.GetNames(typeof(CommonCustomProperties));
|
||
foreach(string commonName in AttributesNames)
|
||
{
|
||
if(name == commonName)
|
||
{
|
||
DeleteCustomProperty((CommonCustomProperties)Enum.Parse(typeof(CommonCustomProperties), commonName));
|
||
}
|
||
}
|
||
|
||
// Remove attribute
|
||
properties.Remove(name);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Delete Data Point attribute with specified name.
|
||
/// </summary>
|
||
/// <param name="property">ID of the attribute to delete.</param>
|
||
internal void DeleteCustomProperty(CommonCustomProperties property)
|
||
{
|
||
// Check if trying to delete the common attribute from the series
|
||
if(!this.pointCustomProperties)
|
||
{
|
||
throw(new ArgumentException( SR.ExceptionAttributeUnableToDelete));
|
||
}
|
||
|
||
// Remove attribute
|
||
properties.Remove((int)property);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets the data point custom property with the specified name.
|
||
/// </summary>
|
||
/// <param name="name">Name of the property to get.</param>
|
||
/// <returns>Returns the data point custom property with the specified name. If the requested one is not set,
|
||
/// the default custom property of the data series will be returned.</returns>
|
||
virtual public string GetCustomProperty(string name)
|
||
{
|
||
if(!IsCustomPropertySet(name) && this.pointCustomProperties)
|
||
{
|
||
// Check if we are in serialization mode
|
||
bool serializing = false;
|
||
|
||
if(Chart != null && Chart.serializing)
|
||
{
|
||
serializing = true;
|
||
}
|
||
|
||
if(!serializing)
|
||
{
|
||
|
||
if(this.isEmptyPoint)
|
||
{
|
||
// Return empty point properties from series
|
||
return (string)series.EmptyPointStyle.properties[name];
|
||
}
|
||
|
||
// Return properties from series
|
||
return (string)series.properties[name];
|
||
}
|
||
else
|
||
{
|
||
// Return default properties
|
||
return (string)Series.defaultCustomProperties[name];
|
||
}
|
||
}
|
||
|
||
return (string)properties[name];
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// Checks if data is currently serialized.
|
||
/// </summary>
|
||
/// <returns>True if serialized.</returns>
|
||
internal bool IsSerializing()
|
||
{
|
||
// Check if series object is provided
|
||
if(series == null)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
// Check if we are in serialization mode
|
||
if(Chart != null)
|
||
{
|
||
return Chart.serializing;
|
||
}
|
||
else
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns an attribute object of the Data Point. If required attribute is not set
|
||
/// in the Data Point the default attribute of the Data series is returned.
|
||
/// </summary>
|
||
/// <param name="attrib">Attribute name ID.</param>
|
||
/// <returns>Attribute value.</returns>
|
||
internal object GetAttributeObject(CommonCustomProperties attrib)
|
||
{
|
||
// Get series properties
|
||
if(!this.pointCustomProperties || series == null)
|
||
{
|
||
return properties[(int)attrib];
|
||
}
|
||
|
||
// Get data point properties
|
||
if(properties.Count == 0 || !IsCustomPropertySet(attrib))
|
||
{
|
||
// Check if we are in serialization mode
|
||
bool serializing = false;
|
||
if(Chart != null)
|
||
{
|
||
serializing = Chart.serializing;
|
||
}
|
||
|
||
if(!serializing)
|
||
{
|
||
if(this.isEmptyPoint)
|
||
{
|
||
// Return empty point properties from series
|
||
return series.EmptyPointStyle.properties[(int)attrib];
|
||
}
|
||
|
||
// Return properties from series
|
||
return series.properties[(int)attrib];
|
||
}
|
||
else
|
||
{
|
||
// Return default properties
|
||
return Series.defaultCustomProperties.properties[(int)attrib];
|
||
}
|
||
}
|
||
return properties[(int)attrib];
|
||
}
|
||
|
||
/// <summary>
|
||
/// Sets a custom property of the data point.
|
||
/// </summary>
|
||
/// <param name="name">Property name.</param>
|
||
/// <param name="propertyValue">Property value.</param>
|
||
virtual public void SetCustomProperty(string name, string propertyValue)
|
||
{
|
||
properties[name] = propertyValue;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Sets an attribute of the Data Point as an object.
|
||
/// </summary>
|
||
/// <param name="attrib">Attribute name ID.</param>
|
||
/// <param name="attributeValue">Attribute new value.</param>
|
||
internal void SetAttributeObject(CommonCustomProperties attrib, object attributeValue)
|
||
{
|
||
properties[(int)attrib] = attributeValue;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Set the default properties of the data point.
|
||
/// <param name="clearAll">Indicates that previous properties must be cleared.</param>
|
||
/// </summary>
|
||
virtual public void SetDefault(bool clearAll)
|
||
{
|
||
// If setting defaults for the data series - clear all properties and initialize common one
|
||
if(!this.pointCustomProperties)
|
||
{
|
||
if(clearAll)
|
||
{
|
||
properties.Clear();
|
||
}
|
||
|
||
// !!! IMPORTANT !!!
|
||
// After changing the default value of the common attribute you must also
|
||
// change the DefaultAttribute of the property representing this attribute.
|
||
if(!IsCustomPropertySet(CommonCustomProperties.ToolTip))
|
||
SetAttributeObject(CommonCustomProperties.ToolTip, "");
|
||
if(!IsCustomPropertySet(CommonCustomProperties.LegendToolTip))
|
||
SetAttributeObject(CommonCustomProperties.LegendToolTip, "");
|
||
if(!IsCustomPropertySet(CommonCustomProperties.Color))
|
||
SetAttributeObject(CommonCustomProperties.Color, Color.Empty);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.IsValueShownAsLabel))
|
||
SetAttributeObject(CommonCustomProperties.IsValueShownAsLabel, false);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.MarkerStyle))
|
||
SetAttributeObject(CommonCustomProperties.MarkerStyle, MarkerStyle.None);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.MarkerSize))
|
||
SetAttributeObject(CommonCustomProperties.MarkerSize, 5);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.MarkerImage))
|
||
SetAttributeObject(CommonCustomProperties.MarkerImage, "");
|
||
if(!IsCustomPropertySet(CommonCustomProperties.Label))
|
||
SetAttributeObject(CommonCustomProperties.Label, "");
|
||
if(!IsCustomPropertySet(CommonCustomProperties.BorderWidth))
|
||
SetAttributeObject(CommonCustomProperties.BorderWidth, 1);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.BorderDashStyle))
|
||
SetAttributeObject(CommonCustomProperties.BorderDashStyle, ChartDashStyle.Solid);
|
||
|
||
|
||
if(!IsCustomPropertySet(CommonCustomProperties.AxisLabel))
|
||
SetAttributeObject(CommonCustomProperties.AxisLabel, "");
|
||
if(!IsCustomPropertySet(CommonCustomProperties.LabelFormat))
|
||
SetAttributeObject(CommonCustomProperties.LabelFormat, "");
|
||
if(!IsCustomPropertySet(CommonCustomProperties.BorderColor))
|
||
SetAttributeObject(CommonCustomProperties.BorderColor, Color.Empty);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.BackImage))
|
||
SetAttributeObject(CommonCustomProperties.BackImage, "");
|
||
if(!IsCustomPropertySet(CommonCustomProperties.BackImageWrapMode))
|
||
SetAttributeObject(CommonCustomProperties.BackImageWrapMode, ChartImageWrapMode.Tile);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.BackImageAlignment))
|
||
SetAttributeObject(CommonCustomProperties.BackImageAlignment, ChartImageAlignmentStyle.TopLeft);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.BackImageTransparentColor))
|
||
SetAttributeObject(CommonCustomProperties.BackImageTransparentColor, Color.Empty);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.BackGradientStyle))
|
||
SetAttributeObject(CommonCustomProperties.BackGradientStyle, GradientStyle.None);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.BackSecondaryColor))
|
||
SetAttributeObject(CommonCustomProperties.BackSecondaryColor, Color.Empty);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.BackHatchStyle))
|
||
SetAttributeObject(CommonCustomProperties.BackHatchStyle, ChartHatchStyle.None);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.Font))
|
||
SetAttributeObject(CommonCustomProperties.Font, null);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.MarkerImageTransparentColor))
|
||
SetAttributeObject(CommonCustomProperties.MarkerImageTransparentColor, Color.Empty);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.MarkerColor))
|
||
SetAttributeObject(CommonCustomProperties.MarkerColor, Color.Empty);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.MarkerBorderColor))
|
||
SetAttributeObject(CommonCustomProperties.MarkerBorderColor, Color.Empty);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.MarkerBorderWidth))
|
||
SetAttributeObject(CommonCustomProperties.MarkerBorderWidth, 1);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.MapAreaAttributes))
|
||
SetAttributeObject(CommonCustomProperties.MapAreaAttributes, "");
|
||
if (!IsCustomPropertySet(CommonCustomProperties.PostBackValue))
|
||
SetAttributeObject(CommonCustomProperties.PostBackValue, "");
|
||
|
||
if (!IsCustomPropertySet(CommonCustomProperties.LabelForeColor))
|
||
SetAttributeObject(CommonCustomProperties.LabelForeColor, Color.Black);
|
||
if (!IsCustomPropertySet(CommonCustomProperties.LabelAngle))
|
||
SetAttributeObject(CommonCustomProperties.LabelAngle, 0);
|
||
if (!IsCustomPropertySet(CommonCustomProperties.LabelToolTip))
|
||
SetAttributeObject(CommonCustomProperties.LabelToolTip, "");
|
||
if(!IsCustomPropertySet(CommonCustomProperties.LabelUrl))
|
||
SetAttributeObject(CommonCustomProperties.LabelUrl, "");
|
||
if (!IsCustomPropertySet(CommonCustomProperties.LabelPostBackValue))
|
||
SetAttributeObject(CommonCustomProperties.LabelPostBackValue, "");
|
||
if (!IsCustomPropertySet(CommonCustomProperties.LabelMapAreaAttributes))
|
||
SetAttributeObject(CommonCustomProperties.LabelMapAreaAttributes, "");
|
||
if(!IsCustomPropertySet(CommonCustomProperties.LabelBackColor))
|
||
SetAttributeObject(CommonCustomProperties.LabelBackColor, Color.Empty);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.LabelBorderWidth))
|
||
SetAttributeObject(CommonCustomProperties.LabelBorderWidth, 1);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.LabelBorderDashStyle))
|
||
SetAttributeObject(CommonCustomProperties.LabelBorderDashStyle, ChartDashStyle.Solid);
|
||
if(!IsCustomPropertySet(CommonCustomProperties.LabelBorderColor))
|
||
SetAttributeObject(CommonCustomProperties.LabelBorderColor, Color.Empty);
|
||
|
||
if(!IsCustomPropertySet(CommonCustomProperties.Url))
|
||
SetAttributeObject(CommonCustomProperties.Url, "");
|
||
if(!IsCustomPropertySet(CommonCustomProperties.LegendUrl))
|
||
SetAttributeObject(CommonCustomProperties.LegendUrl, "");
|
||
if (!IsCustomPropertySet(CommonCustomProperties.LegendPostBackValue))
|
||
SetAttributeObject(CommonCustomProperties.LegendPostBackValue, "");
|
||
if (!IsCustomPropertySet(CommonCustomProperties.LegendText))
|
||
SetAttributeObject(CommonCustomProperties.LegendText, "");
|
||
if(!IsCustomPropertySet(CommonCustomProperties.LegendMapAreaAttributes))
|
||
SetAttributeObject(CommonCustomProperties.LegendMapAreaAttributes, "");
|
||
if(!IsCustomPropertySet(CommonCustomProperties.IsVisibleInLegend))
|
||
SetAttributeObject(CommonCustomProperties.IsVisibleInLegend, true);
|
||
}
|
||
|
||
// If setting defaults for the data point - clear all properties
|
||
else
|
||
{
|
||
properties.Clear();
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region DataPointCustomProperties Properties
|
||
|
||
/// <summary>
|
||
/// Indexer of the custom properties. Returns the DataPointCustomProperties object by index.
|
||
/// </summary>
|
||
/// <param name="index">Index of the custom property.</param>
|
||
public string this[int index]
|
||
{
|
||
get
|
||
{
|
||
int currentIndex = 0;
|
||
foreach(object key in properties.Keys)
|
||
{
|
||
if(currentIndex == index)
|
||
{
|
||
string keyStr = key as string;
|
||
if (keyStr != null)
|
||
{
|
||
return keyStr;
|
||
}
|
||
else if (key is int)
|
||
{
|
||
return Enum.GetName(typeof(CommonCustomProperties), key);
|
||
}
|
||
return key.ToString();
|
||
}
|
||
++currentIndex;
|
||
}
|
||
// we can't throw IndexOutOfRangeException here, it is reserved
|
||
// by the CLR.
|
||
throw (new InvalidOperationException());
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Indexer of the custom properties. Returns the DataPointCustomProperties object by name.
|
||
/// </summary>
|
||
/// <param name="name">Name of the custom property.</param>
|
||
public string this[string name]
|
||
{
|
||
get
|
||
{
|
||
// If attribute is not set in data point - try getting it from the series
|
||
if(!IsCustomPropertySet(name) && this.pointCustomProperties)
|
||
{
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.properties[name];
|
||
}
|
||
|
||
return (string)series.properties[name];
|
||
}
|
||
return (string)properties[name];
|
||
}
|
||
set
|
||
{
|
||
properties[name] = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// The text of the data point label.
|
||
/// </summary>
|
||
[
|
||
Editor(Editors.KeywordsStringEditor.Editor, Editors.KeywordsStringEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
SRCategory("CategoryAttributeLabel"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeLabel"),
|
||
]
|
||
virtual public string Label
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.Label))
|
||
{
|
||
return (string)GetAttributeObject(CommonCustomProperties.Label);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.Label);
|
||
}
|
||
|
||
return series.label;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.label;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
// Replace NULL with empty string
|
||
if(value == null)
|
||
{
|
||
value = string.Empty;
|
||
}
|
||
|
||
if (this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.Label, value);
|
||
else
|
||
series.label = value;
|
||
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// The text of X axis label for the data point.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMisc"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeAxisLabel"),
|
||
Editor(Editors.KeywordsStringEditor.Editor, Editors.KeywordsStringEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
virtual public string AxisLabel
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.AxisLabel))
|
||
{
|
||
return (string)GetAttributeObject(CommonCustomProperties.AxisLabel);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.AxisLabel);
|
||
}
|
||
|
||
return series.axisLabel;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.axisLabel;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
// Replace NULL with empty string
|
||
if(value == null)
|
||
{
|
||
value = string.Empty;
|
||
}
|
||
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.AxisLabel, value);
|
||
else
|
||
series.axisLabel = value;
|
||
|
||
// Set flag that there are non-empy axis labels in series or points
|
||
if(value.Length > 0 && series != null)
|
||
{
|
||
series.noLabelsInPoints = false;
|
||
}
|
||
|
||
this.Invalidate(false);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Format string of the data point label.
|
||
/// </summary>
|
||
[
|
||
|
||
SRCategory("CategoryAttributeLabel"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeLabelFormat"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
]
|
||
public string LabelFormat
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LabelFormat))
|
||
{
|
||
return (string)GetAttributeObject(CommonCustomProperties.LabelFormat);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LabelFormat);
|
||
}
|
||
|
||
return series.labelFormat;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.labelFormat;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
// Replace NULL with empty string
|
||
if(value == null)
|
||
{
|
||
value = string.Empty;
|
||
}
|
||
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LabelFormat, value);
|
||
else
|
||
series.labelFormat = value;
|
||
this.Invalidate(false);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// A flag which indicates whether to show the data point's value on the label.
|
||
/// </summary>
|
||
[
|
||
|
||
SRCategory("CategoryAttributeLabel"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeShowLabelAsValue"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public bool IsValueShownAsLabel
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.IsValueShownAsLabel))
|
||
{
|
||
return (bool)GetAttributeObject(CommonCustomProperties.IsValueShownAsLabel);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return false;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (bool)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.IsValueShownAsLabel);
|
||
}
|
||
|
||
return series.showLabelAsValue;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.showLabelAsValue;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.IsValueShownAsLabel, value);
|
||
else
|
||
series.showLabelAsValue = value;
|
||
this.Invalidate(false);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Color of the data point.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeColor4"),
|
||
TypeConverter(typeof(ColorConverter)),
|
||
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public Color Color
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.Color))
|
||
{
|
||
return (Color)GetAttributeObject(CommonCustomProperties.Color);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return Color.Empty;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (Color)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.Color);
|
||
}
|
||
|
||
return series.color;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.color;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
// Remove the temp color flag
|
||
this.tempColorIsSet = false;
|
||
|
||
if(value == Color.Empty && this.pointCustomProperties)
|
||
{
|
||
DeleteCustomProperty(CommonCustomProperties.Color);
|
||
}
|
||
else
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.Color, value);
|
||
else
|
||
series.color = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Border color of the data point.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeBorderColor"),
|
||
TypeConverter(typeof(ColorConverter)),
|
||
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public Color BorderColor
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.BorderColor))
|
||
{
|
||
return (Color)GetAttributeObject(CommonCustomProperties.BorderColor);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return Color.Empty;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (Color)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.BorderColor);
|
||
}
|
||
|
||
return series.borderColor;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.borderColor;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.BorderColor, value);
|
||
else
|
||
series.borderColor = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Border style of the data point.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeBorderDashStyle"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public ChartDashStyle BorderDashStyle
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.BorderDashStyle))
|
||
{
|
||
return (ChartDashStyle)GetAttributeObject(CommonCustomProperties.BorderDashStyle);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return ChartDashStyle.Solid;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (ChartDashStyle)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.BorderDashStyle);
|
||
}
|
||
|
||
return series.borderDashStyle;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.borderDashStyle;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.BorderDashStyle, value);
|
||
else
|
||
series.borderDashStyle = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Border width of the data point.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeBorderWidth"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public int BorderWidth
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.BorderWidth))
|
||
{
|
||
return (int)GetAttributeObject(CommonCustomProperties.BorderWidth);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return 1;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (int)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.BorderWidth);
|
||
}
|
||
|
||
return series.borderWidth;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.borderWidth;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(value < 0)
|
||
{
|
||
throw (new ArgumentOutOfRangeException("value", SR.ExceptionBorderWidthIsNotPositive));
|
||
}
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.BorderWidth, value);
|
||
else
|
||
series.borderWidth = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Background image of the data point.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeBackImage"),
|
||
Editor(Editors.ImageValueEditor.Editor, Editors.ImageValueEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
]
|
||
public string BackImage
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.BackImage))
|
||
{
|
||
return (string)GetAttributeObject(CommonCustomProperties.BackImage);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.BackImage);
|
||
}
|
||
|
||
return series.backImage;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.backImage;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
// Replace NULL with empty string
|
||
if(value == null)
|
||
{
|
||
value = string.Empty;
|
||
}
|
||
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.BackImage, value);
|
||
else
|
||
series.backImage = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the drawing mode of the background image.
|
||
/// </summary>
|
||
/// <value>
|
||
/// A <see cref="ChartImageWrapMode"/> value that defines the drawing mode of the image.
|
||
/// </value>
|
||
[
|
||
SRCategory("CategoryAttributeAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeImageWrapMode"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public ChartImageWrapMode BackImageWrapMode
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.BackImageWrapMode))
|
||
{
|
||
return (ChartImageWrapMode)GetAttributeObject(CommonCustomProperties.BackImageWrapMode);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return ChartImageWrapMode.Tile;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (ChartImageWrapMode)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.BackImageWrapMode);
|
||
}
|
||
|
||
return series.backImageWrapMode;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.backImageWrapMode;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.BackImageWrapMode, value);
|
||
else
|
||
series.backImageWrapMode = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets a color which will be replaced with a transparent color while drawing the background image.
|
||
/// </summary>
|
||
/// <value>
|
||
/// A <see cref="Color"/> value which will be replaced with a transparent color while drawing the image.
|
||
/// </value>
|
||
[
|
||
SRCategory("CategoryAttributeAppearance"),
|
||
Bindable(true),
|
||
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
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.BackImageTransparentColor))
|
||
{
|
||
return (Color)GetAttributeObject(CommonCustomProperties.BackImageTransparentColor);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return Color.Empty;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (Color)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.BackImageTransparentColor);
|
||
}
|
||
|
||
return series.backImageTransparentColor;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.backImageTransparentColor;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.BackImageTransparentColor, value);
|
||
else
|
||
series.backImageTransparentColor = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the alignment of the background image which is used by ClampUnscale drawing mode.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeAppearance"),
|
||
Bindable(true),
|
||
NotifyParentPropertyAttribute(true),
|
||
SRDescription("DescriptionAttributeBackImageAlign"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public ChartImageAlignmentStyle BackImageAlignment
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.BackImageAlignment))
|
||
{
|
||
return (ChartImageAlignmentStyle)GetAttributeObject(CommonCustomProperties.BackImageAlignment);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return ChartImageAlignmentStyle.TopLeft;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (ChartImageAlignmentStyle)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.BackImageAlignment);
|
||
}
|
||
|
||
return series.backImageAlignment;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.backImageAlignment;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.BackImageAlignment, value);
|
||
else
|
||
series.backImageAlignment = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the background gradient style.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeBackGradientStyle"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
Editor(Editors.GradientEditor.Editor, Editors.GradientEditor.Base)
|
||
]
|
||
public GradientStyle BackGradientStyle
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.BackGradientStyle))
|
||
{
|
||
return (GradientStyle)GetAttributeObject(CommonCustomProperties.BackGradientStyle);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return GradientStyle.None;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (GradientStyle)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.BackGradientStyle);
|
||
}
|
||
|
||
return series.backGradientStyle;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.backGradientStyle;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.BackGradientStyle, value);
|
||
else
|
||
series.backGradientStyle = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the secondary background color.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeBackSecondaryColor"),
|
||
TypeConverter(typeof(ColorConverter)),
|
||
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public Color BackSecondaryColor
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.BackSecondaryColor))
|
||
{
|
||
return (Color)GetAttributeObject(CommonCustomProperties.BackSecondaryColor);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return Color.Empty;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (Color)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.BackSecondaryColor);
|
||
}
|
||
|
||
return series.backSecondaryColor;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.backSecondaryColor;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.BackSecondaryColor, value);
|
||
else
|
||
series.backSecondaryColor = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the background hatch style.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeBackHatchStyle"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
Editor(Editors.HatchStyleEditor.Editor, Editors.HatchStyleEditor.Base)
|
||
]
|
||
public ChartHatchStyle BackHatchStyle
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.BackHatchStyle))
|
||
{
|
||
return (ChartHatchStyle)GetAttributeObject(CommonCustomProperties.BackHatchStyle);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return ChartHatchStyle.None;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (ChartHatchStyle)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.BackHatchStyle);
|
||
}
|
||
|
||
return series.backHatchStyle;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.backHatchStyle;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.BackHatchStyle, value);
|
||
else
|
||
series.backHatchStyle = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the font of the data point.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLabelAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeFont"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public Font Font
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.Font))
|
||
{
|
||
Font font = GetAttributeObject(CommonCustomProperties.Font) as Font;
|
||
if (font != null)
|
||
return font;
|
||
}
|
||
|
||
if(IsSerializing())
|
||
{
|
||
return series.FontCache.DefaultFont;
|
||
}
|
||
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return series.EmptyPointStyle.Font;
|
||
}
|
||
|
||
return series.font;
|
||
}
|
||
else
|
||
{
|
||
return series.font;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.Font, value);
|
||
else
|
||
series.font = value;
|
||
this.Invalidate(false);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the label color.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLabelAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeFontColor"),
|
||
TypeConverter(typeof(ColorConverter)),
|
||
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public Color LabelForeColor
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LabelForeColor))
|
||
{
|
||
Color color = (Color)GetAttributeObject(CommonCustomProperties.LabelForeColor);
|
||
return color;
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return Color.Black;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (Color)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LabelForeColor);
|
||
}
|
||
|
||
return series.fontColor;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.fontColor;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LabelForeColor, value);
|
||
else
|
||
series.fontColor = value;
|
||
this.Invalidate(false);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the angle of the label.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLabelAppearance"),
|
||
Bindable(true),
|
||
SRDescription(SR.Keys.DescriptionAttributeLabel_FontAngle),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
]
|
||
public int LabelAngle
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LabelAngle))
|
||
{
|
||
return (int)GetAttributeObject(CommonCustomProperties.LabelAngle);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return 0;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (int)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LabelAngle);
|
||
}
|
||
|
||
return series.fontAngle;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.fontAngle;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(value < -90 || value > 90)
|
||
{
|
||
throw (new ArgumentOutOfRangeException("value", SR.ExceptionAngleRangeInvalid));
|
||
}
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LabelAngle, value);
|
||
else
|
||
series.fontAngle = value;
|
||
this.Invalidate(false);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the marker style.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMarker"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeMarkerStyle4"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
Editor(Editors.MarkerStyleEditor.Editor, Editors.MarkerStyleEditor.Base),
|
||
RefreshProperties(RefreshProperties.All)
|
||
]
|
||
public MarkerStyle MarkerStyle
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.MarkerStyle))
|
||
{
|
||
return (MarkerStyle)GetAttributeObject(CommonCustomProperties.MarkerStyle);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return MarkerStyle.None;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (MarkerStyle)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.MarkerStyle);
|
||
}
|
||
|
||
return series.markerStyle;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.markerStyle;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.MarkerStyle, value);
|
||
else
|
||
series.markerStyle = value;
|
||
|
||
Series thisSeries = this as Series;
|
||
if(thisSeries != null)
|
||
{
|
||
thisSeries.tempMarkerStyleIsSet = false;
|
||
}
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the size of the marker.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMarker"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeMarkerSize"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
RefreshProperties(RefreshProperties.All)
|
||
]
|
||
public int MarkerSize
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.MarkerSize))
|
||
{
|
||
return (int)GetAttributeObject(CommonCustomProperties.MarkerSize);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return 5;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (int)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.MarkerSize);
|
||
}
|
||
|
||
return series.markerSize;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.markerSize;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.MarkerSize, value);
|
||
else
|
||
series.markerSize = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the marker image.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMarker"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeMarkerImage"),
|
||
Editor(Editors.ImageValueEditor.Editor, Editors.ImageValueEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
RefreshProperties(RefreshProperties.All)
|
||
]
|
||
public string MarkerImage
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.MarkerImage))
|
||
{
|
||
return (string)GetAttributeObject(CommonCustomProperties.MarkerImage);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.MarkerImage);
|
||
}
|
||
|
||
return series.markerImage;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.markerImage;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
// Replace NULL with empty string
|
||
if(value == null)
|
||
{
|
||
value = string.Empty;
|
||
}
|
||
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.MarkerImage, value);
|
||
else
|
||
series.markerImage = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the color which will be replaced with a transparent color while drawing the marker image.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMarker"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeImageTransparentColor"),
|
||
TypeConverter(typeof(ColorConverter)),
|
||
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
RefreshProperties(RefreshProperties.All)
|
||
]
|
||
public Color MarkerImageTransparentColor
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.MarkerImageTransparentColor))
|
||
{
|
||
return (Color)GetAttributeObject(CommonCustomProperties.MarkerImageTransparentColor);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return Color.Empty;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (Color)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.MarkerImageTransparentColor);
|
||
}
|
||
|
||
return series.markerImageTransparentColor;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.markerImageTransparentColor;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.MarkerImageTransparentColor, value);
|
||
else
|
||
series.markerImageTransparentColor = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the marker color.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMarker"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeMarkerColor3"),
|
||
TypeConverter(typeof(ColorConverter)),
|
||
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
RefreshProperties(RefreshProperties.All)
|
||
]
|
||
public Color MarkerColor
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.MarkerColor))
|
||
{
|
||
return (Color)GetAttributeObject(CommonCustomProperties.MarkerColor);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return Color.Empty;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (Color)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.MarkerColor);
|
||
}
|
||
|
||
return series.markerColor;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.markerColor;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.MarkerColor, value);
|
||
else
|
||
series.markerColor = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the border color of the marker.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMarker"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeMarkerBorderColor"),
|
||
TypeConverter(typeof(ColorConverter)),
|
||
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
#endif
|
||
RefreshProperties(RefreshProperties.All)
|
||
]
|
||
public Color MarkerBorderColor
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.MarkerBorderColor))
|
||
{
|
||
return (Color)GetAttributeObject(CommonCustomProperties.MarkerBorderColor);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return Color.Empty;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (Color)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.MarkerBorderColor);
|
||
}
|
||
|
||
return series.markerBorderColor;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.markerBorderColor;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.MarkerBorderColor, value);
|
||
else
|
||
series.markerBorderColor = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// Gets or sets the border width of the marker.
|
||
/// </summary>
|
||
[
|
||
|
||
SRCategory("CategoryAttributeMarker"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeMarkerBorderWidth"),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public int MarkerBorderWidth
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.MarkerBorderWidth))
|
||
{
|
||
return (int)GetAttributeObject(CommonCustomProperties.MarkerBorderWidth);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return 1;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (int)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.MarkerBorderWidth);
|
||
}
|
||
|
||
return series.markerBorderWidth;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.markerBorderWidth;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(value < 0)
|
||
{
|
||
throw (new ArgumentOutOfRangeException("value", SR.ExceptionBorderWidthIsNotPositive));
|
||
}
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.MarkerBorderWidth, value);
|
||
else
|
||
series.markerBorderWidth = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// Gets or sets the extended custom properties of the data point.
|
||
/// Extended custom properties can be specified in the following format:
|
||
/// AttrName1=Value1, AttrName2=Value2, ...
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMisc"),
|
||
Bindable(false),
|
||
SRDescription("DescriptionAttributeCustomAttributesExtended"),
|
||
DefaultValue(null),
|
||
RefreshProperties(RefreshProperties.All),
|
||
NotifyParentPropertyAttribute(true),
|
||
DesignOnlyAttribute(true),
|
||
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
||
SerializationVisibilityAttribute(SerializationVisibility.Hidden),
|
||
EditorBrowsableAttribute(EditorBrowsableState.Never),
|
||
DisplayName("CustomProperties")
|
||
]
|
||
public CustomProperties CustomPropertiesExtended
|
||
{
|
||
set
|
||
{
|
||
customProperties = value;
|
||
}
|
||
get
|
||
{
|
||
return customProperties;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the custom properties of the data point.
|
||
/// Custom properties can be specified in the following format:
|
||
/// AttrName1=Value1, AttrName2=Value2, ...
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMisc"),
|
||
Bindable(true),
|
||
Browsable(false),
|
||
SRDescription("DescriptionAttributeCustomAttributesExtended"),
|
||
DefaultValue(""),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public string CustomProperties
|
||
{
|
||
get
|
||
{
|
||
// Save all custom properties in a string
|
||
string result = "";
|
||
string[] attributesNames = CommonCustomProperties.GetNames(typeof(CommonCustomProperties));
|
||
for(int i = properties.Count - 1; i >= 0; i--)
|
||
{
|
||
if(this[i] != null)
|
||
{
|
||
string attributeName = this[i];
|
||
|
||
// Check if attribute is custom
|
||
bool customAttribute = true;
|
||
foreach(string name in attributesNames)
|
||
{
|
||
if(String.Compare(attributeName, name, StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
customAttribute = false;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// Add custom attribute to the string
|
||
if(customAttribute && properties[attributeName] != null)
|
||
{
|
||
if(result.Length > 0)
|
||
{
|
||
result += ", ";
|
||
}
|
||
string attributeValue = properties[attributeName].ToString().Replace(",", "\\,");
|
||
attributeValue = attributeValue.Replace("=", "\\=");
|
||
|
||
result += attributeName + "=" + attributeValue;
|
||
}
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
set
|
||
{
|
||
// Replace NULL with empty string
|
||
if(value == null)
|
||
{
|
||
value = string.Empty;
|
||
}
|
||
|
||
// Copy all common properties to the new collection
|
||
Hashtable newAttributes = new Hashtable();
|
||
Array enumValues = Enum.GetValues(typeof(CommonCustomProperties));
|
||
foreach(object val in enumValues)
|
||
{
|
||
if(IsCustomPropertySet((CommonCustomProperties)val))
|
||
{
|
||
newAttributes[(int)val] = properties[(int)val];
|
||
}
|
||
}
|
||
|
||
if(value.Length > 0)
|
||
{
|
||
// Replace commas in value string
|
||
value = value.Replace("\\,", "\\x45");
|
||
value = value.Replace("\\=", "\\x46");
|
||
|
||
// Add new custom properties
|
||
string[] nameValueStrings = value.Split(',');
|
||
foreach(string nameValue in nameValueStrings)
|
||
{
|
||
string[] values = nameValue.Split('=');
|
||
|
||
// Check format
|
||
if(values.Length != 2)
|
||
{
|
||
throw(new FormatException( SR.ExceptionAttributeInvalidFormat));
|
||
}
|
||
|
||
// Check for empty name or value
|
||
values[0] = values[0].Trim();
|
||
values[1] = values[1].Trim();
|
||
if(values[0].Length == 0)
|
||
{
|
||
throw(new FormatException( SR.ExceptionAttributeInvalidFormat));
|
||
}
|
||
|
||
// Check if value already defined
|
||
foreach(object existingAttributeName in newAttributes.Keys)
|
||
{
|
||
string existingAttributeNameStr = existingAttributeName as string;
|
||
if (existingAttributeNameStr != null)
|
||
{
|
||
if (String.Compare(existingAttributeNameStr, values[0], StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
throw(new FormatException( SR.ExceptionAttributeNameIsNotUnique(values[0] ) ) );
|
||
}
|
||
}
|
||
}
|
||
|
||
string newValue = values[1].Replace("\\x45", ",");
|
||
newAttributes[values[0]] = newValue.Replace("\\x46", "=");
|
||
|
||
}
|
||
}
|
||
properties = newAttributes;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region IMapAreaAttributesutes Properties implementation
|
||
|
||
/// <summary>
|
||
/// Tooltip.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMapArea"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeToolTip"),
|
||
Editor(Editors.KeywordsStringEditor.Editor, Editors.KeywordsStringEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
DefaultValue(""),
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public string ToolTip
|
||
{
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.ToolTip, value);
|
||
else
|
||
series.toolTip = value;
|
||
|
||
#if Microsoft_CONTROL
|
||
if(Chart != null && Chart.selection != null)
|
||
{
|
||
Chart.selection.enabledChecked = false;
|
||
}
|
||
#endif
|
||
}
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.ToolTip))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.ToolTip);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.ToolTip);
|
||
}
|
||
|
||
return series.toolTip;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.toolTip;
|
||
}
|
||
}
|
||
}
|
||
|
||
#if !Microsoft_CONTROL
|
||
|
||
/// <summary>
|
||
/// URL target of the area.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMapArea"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeUrl"),
|
||
DefaultValue(""),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
Editor(Editors.UrlValueEditor.Editor, Editors.UrlValueEditor.Base)
|
||
#endif
|
||
]
|
||
public string Url
|
||
{
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.Url, value);
|
||
else
|
||
series.url = value;
|
||
}
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.Url))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.Url);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.Url);
|
||
}
|
||
|
||
return series.url;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.url;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Other attributes of the area.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMapArea"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeMapAreaAttributes"),
|
||
DefaultValue(""),
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
Editor(Editors.KeywordsStringEditor.Editor, Editors.KeywordsStringEditor.Base)
|
||
]
|
||
public string MapAreaAttributes
|
||
{
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.MapAreaAttributes, value);
|
||
else
|
||
series.mapAreaAttributes = value;
|
||
}
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.MapAreaAttributes))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.MapAreaAttributes);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.MapAreaAttributes);
|
||
}
|
||
|
||
return series.mapAreaAttributes;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.mapAreaAttributes;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the postback value which can be processed on click event.
|
||
/// </summary>
|
||
/// <value>The value which is passed to click event as argument.</value>
|
||
[DefaultValue("")]
|
||
[SRCategory(SR.Keys.CategoryAttributeMapArea)]
|
||
[SRDescription(SR.Keys.DescriptionAttributePostBackValue)]
|
||
[Editor(Editors.KeywordsStringEditor.Editor, Editors.KeywordsStringEditor.Base)]
|
||
public string PostBackValue
|
||
{
|
||
get
|
||
{
|
||
if (this.pointCustomProperties)
|
||
{
|
||
if (properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.PostBackValue))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.PostBackValue);
|
||
}
|
||
else
|
||
{
|
||
if (IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if (this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.PostBackValue);
|
||
}
|
||
|
||
return series.postbackValue;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.postbackValue;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if (this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.PostBackValue, value);
|
||
else
|
||
series.postbackValue = value;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
#endif
|
||
/// <summary>
|
||
/// Replaces predefined keyword inside the string with their values.
|
||
/// </summary>
|
||
/// <param name="strOriginal">Original string with keywords.</param>
|
||
/// <returns>Modified string.</returns>
|
||
internal virtual string ReplaceKeywords(string strOriginal)
|
||
{
|
||
return strOriginal;
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region Legend properties
|
||
|
||
/// <summary>
|
||
/// Indicates whether the item is shown in the legend.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLegend"),
|
||
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeShowInLegend"),
|
||
#if !Microsoft_CONTROL
|
||
DefaultValue(true),
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public bool IsVisibleInLegend
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.IsVisibleInLegend))
|
||
{
|
||
return (bool)GetAttributeObject(CommonCustomProperties.IsVisibleInLegend);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return true;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (bool)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.IsVisibleInLegend);
|
||
}
|
||
|
||
return series.showInLegend;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.showInLegend;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.IsVisibleInLegend, value);
|
||
else
|
||
series.showInLegend = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Text of the item in the legend
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLegend"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeLegendText"),
|
||
Editor(Editors.KeywordsStringEditor.Editor, Editors.KeywordsStringEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
DefaultValue(""),
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public string LegendText
|
||
{
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LegendText, value);
|
||
else
|
||
series.legendText = value;
|
||
this.Invalidate(true);
|
||
}
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LegendText))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.LegendText);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LegendText);
|
||
}
|
||
|
||
return series.legendText;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.legendText;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Tooltip of the item in the legend
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLegend"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeLegendToolTip"),
|
||
Editor(Editors.KeywordsStringEditor.Editor, Editors.KeywordsStringEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
DefaultValue(""),
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public string LegendToolTip
|
||
{
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LegendToolTip, value);
|
||
else
|
||
series.legendToolTip = value;
|
||
|
||
#if Microsoft_CONTROL
|
||
if(Chart != null && Chart.selection != null)
|
||
{
|
||
Chart.selection.enabledChecked = false;
|
||
}
|
||
#endif
|
||
}
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LegendToolTip))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.LegendToolTip);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LegendToolTip);
|
||
}
|
||
|
||
return series.legendToolTip;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.legendToolTip;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// Background color of the data point label.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLabelAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeLabelBackColor"),
|
||
TypeConverter(typeof(ColorConverter)),
|
||
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
||
DefaultValue(typeof(Color), ""),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public Color LabelBackColor
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LabelBackColor))
|
||
{
|
||
return (Color)GetAttributeObject(CommonCustomProperties.LabelBackColor);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return Color.Empty;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (Color)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LabelBackColor);
|
||
}
|
||
|
||
return series.labelBackColor;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.labelBackColor;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LabelBackColor, value);
|
||
else
|
||
series.labelBackColor = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Border color of the data point label.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLabelAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeBorderColor"),
|
||
TypeConverter(typeof(ColorConverter)),
|
||
Editor(Editors.ChartColorEditor.Editor, Editors.ChartColorEditor.Base),
|
||
DefaultValue(typeof(Color), ""),
|
||
#if !Microsoft_CONTROL
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public Color LabelBorderColor
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LabelBorderColor))
|
||
{
|
||
return (Color)GetAttributeObject(CommonCustomProperties.LabelBorderColor);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return Color.Empty;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (Color)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LabelBorderColor);
|
||
}
|
||
|
||
return series.labelBorderColor;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.labelBorderColor;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LabelBorderColor, value);
|
||
else
|
||
series.labelBorderColor = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Border style of the label.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLabelAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeLabelBorderDashStyle"),
|
||
#if !Microsoft_CONTROL
|
||
DefaultValue(ChartDashStyle.Solid),
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public ChartDashStyle LabelBorderDashStyle
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LabelBorderDashStyle))
|
||
{
|
||
return (ChartDashStyle)GetAttributeObject(CommonCustomProperties.LabelBorderDashStyle);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return ChartDashStyle.Solid;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (ChartDashStyle)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LabelBorderDashStyle);
|
||
}
|
||
|
||
return series.labelBorderDashStyle;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.labelBorderDashStyle;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LabelBorderDashStyle, value);
|
||
else
|
||
series.labelBorderDashStyle = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Border width of the label.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLabelAppearance"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeBorderWidth"),
|
||
#if !Microsoft_CONTROL
|
||
DefaultValue(1),
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public int LabelBorderWidth
|
||
{
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LabelBorderWidth))
|
||
{
|
||
return (int)GetAttributeObject(CommonCustomProperties.LabelBorderWidth);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return 1;
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (int)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LabelBorderWidth);
|
||
}
|
||
|
||
return series.labelBorderWidth;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.labelBorderWidth;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if(value < 0)
|
||
{
|
||
throw(new ArgumentOutOfRangeException("value", SR.ExceptionLabelBorderIsNotPositive));
|
||
}
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LabelBorderWidth, value);
|
||
else
|
||
series.labelBorderWidth = value;
|
||
this.Invalidate(true);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Tooltip of the data point label.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLabel"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeLabelToolTip"),
|
||
Editor(Editors.KeywordsStringEditor.Editor, Editors.KeywordsStringEditor.Base),
|
||
#if !Microsoft_CONTROL
|
||
DefaultValue(""),
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
#endif
|
||
]
|
||
public string LabelToolTip
|
||
{
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LabelToolTip, value);
|
||
else
|
||
series.labelToolTip = value;
|
||
|
||
#if Microsoft_CONTROL
|
||
if(Chart != null && Chart.selection != null)
|
||
{
|
||
Chart.selection.enabledChecked = false;
|
||
}
|
||
#endif
|
||
}
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LabelToolTip))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.LabelToolTip);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LabelToolTip);
|
||
}
|
||
|
||
return series.labelToolTip;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.labelToolTip;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
#if !Microsoft_CONTROL
|
||
|
||
/// <summary>
|
||
/// URL target of the item in the legend.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLegend"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeLegendUrl"),
|
||
DefaultValue(""),
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
Editor(Editors.UrlValueEditor.Editor, Editors.UrlValueEditor.Base),
|
||
SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings")
|
||
]
|
||
public string LegendUrl
|
||
{
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LegendUrl, value);
|
||
else
|
||
series.legendUrl = value;
|
||
}
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LegendUrl))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.LegendUrl);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LegendUrl);
|
||
}
|
||
|
||
return series.legendUrl;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.legendUrl;
|
||
}
|
||
}
|
||
}
|
||
|
||
#endif
|
||
|
||
#if !Microsoft_CONTROL
|
||
|
||
/// <summary>
|
||
/// Other attributes of the legend map area.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLegend"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeMapAreaAttributes"),
|
||
DefaultValue(""),
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
Editor(Editors.KeywordsStringEditor.Editor, Editors.KeywordsStringEditor.Base)
|
||
]
|
||
public string LegendMapAreaAttributes
|
||
{
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LegendMapAreaAttributes, value);
|
||
else
|
||
series.legendMapAreaAttributes = value;
|
||
}
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LegendMapAreaAttributes))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.LegendMapAreaAttributes);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LegendMapAreaAttributes);
|
||
}
|
||
|
||
return series.legendMapAreaAttributes;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.legendMapAreaAttributes;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the postback value which can be processed on click event.
|
||
/// </summary>
|
||
/// <value>The value which is passed to click event as argument.</value>
|
||
[DefaultValue("")]
|
||
[SRCategory("CategoryAttributeLegend")]
|
||
[SRDescription(SR.Keys.DescriptionAttributePostBackValue)]
|
||
[Editor(Editors.KeywordsStringEditor.Editor, Editors.KeywordsStringEditor.Base)]
|
||
public string LegendPostBackValue
|
||
{
|
||
get
|
||
{
|
||
if (this.pointCustomProperties)
|
||
{
|
||
if (properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LegendPostBackValue))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.LegendPostBackValue);
|
||
}
|
||
else
|
||
{
|
||
if (IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if (this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LegendPostBackValue);
|
||
}
|
||
|
||
return series.legendPostbackValue;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.legendPostbackValue;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if (this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LegendPostBackValue, value);
|
||
else
|
||
series.legendPostbackValue = value;
|
||
}
|
||
}
|
||
|
||
#endif // !Microsoft_CONTROL
|
||
|
||
|
||
|
||
#if !Microsoft_CONTROL
|
||
|
||
/// <summary>
|
||
/// URL target of the data point label.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeMapArea"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeUrl"),
|
||
DefaultValue(""),
|
||
PersistenceMode(PersistenceMode.Attribute),
|
||
Editor(Editors.UrlValueEditor.Editor, Editors.UrlValueEditor.Base),
|
||
SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings")
|
||
]
|
||
public string LabelUrl
|
||
{
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LabelUrl, value);
|
||
else
|
||
series.labelUrl = value;
|
||
}
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LabelUrl))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.LabelUrl);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LabelUrl);
|
||
}
|
||
|
||
return series.labelUrl;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.labelUrl;
|
||
}
|
||
}
|
||
}
|
||
|
||
#endif //if !Microsoft_CONTROL
|
||
|
||
#if !Microsoft_CONTROL
|
||
|
||
/// <summary>
|
||
/// Other attributes of the data point label.
|
||
/// </summary>
|
||
[
|
||
SRCategory("CategoryAttributeLabel"),
|
||
Bindable(true),
|
||
SRDescription("DescriptionAttributeMapAreaAttributes"),
|
||
DefaultValue(""),
|
||
PersistenceMode(PersistenceMode.Attribute)
|
||
]
|
||
public string LabelMapAreaAttributes
|
||
{
|
||
set
|
||
{
|
||
if(this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LabelMapAreaAttributes, value);
|
||
else
|
||
series.labelMapAreaAttributes = value;
|
||
}
|
||
get
|
||
{
|
||
if(this.pointCustomProperties)
|
||
{
|
||
if(properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LabelMapAreaAttributes))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.LabelMapAreaAttributes);
|
||
}
|
||
else
|
||
{
|
||
if(IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if(this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LabelMapAreaAttributes);
|
||
}
|
||
|
||
return series.labelMapAreaAttributes;
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.labelMapAreaAttributes;
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets or sets the postback value which can be processed on click event.
|
||
/// </summary>
|
||
/// <value>The value which is passed to click event as argument.</value>
|
||
[DefaultValue("")]
|
||
[SRCategory("CategoryAttributeLabel")]
|
||
[SRDescription(SR.Keys.DescriptionAttributePostBackValue)]
|
||
[Editor(Editors.KeywordsStringEditor.Editor, Editors.KeywordsStringEditor.Base)]
|
||
public string LabelPostBackValue
|
||
{
|
||
get
|
||
{
|
||
if (this.pointCustomProperties)
|
||
{
|
||
if (properties.Count != 0 && IsCustomPropertySet(CommonCustomProperties.LabelPostBackValue))
|
||
{
|
||
return (String)GetAttributeObject(CommonCustomProperties.LabelPostBackValue);
|
||
}
|
||
else
|
||
{
|
||
if (IsSerializing())
|
||
{
|
||
return "";
|
||
}
|
||
if (this.isEmptyPoint)
|
||
{
|
||
return (string)series.EmptyPointStyle.GetAttributeObject(CommonCustomProperties.LabelPostBackValue);
|
||
}
|
||
|
||
return series.labelPostbackValue;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return series.labelPostbackValue;
|
||
}
|
||
}
|
||
set
|
||
{
|
||
if (this.pointCustomProperties)
|
||
SetAttributeObject(CommonCustomProperties.LabelPostBackValue, value);
|
||
else
|
||
series.labelPostbackValue = value;
|
||
}
|
||
}
|
||
|
||
|
||
#endif // !Microsoft_CONTROL
|
||
|
||
|
||
|
||
#endregion
|
||
|
||
#region Serialization control
|
||
|
||
|
||
|
||
private bool CheckIfSerializationRequired(CommonCustomProperties attribute)
|
||
{
|
||
if(this is DataPoint)
|
||
{
|
||
return IsCustomPropertySet(attribute);
|
||
}
|
||
else
|
||
{
|
||
object attr1 = this.GetAttributeObject(attribute);
|
||
object attr2 = Series.defaultCustomProperties.GetAttributeObject(attribute);
|
||
if(attr1 == null || attr2 == null)
|
||
{
|
||
return false;
|
||
}
|
||
return ! attr1.Equals(attr2);
|
||
}
|
||
}
|
||
|
||
private void ResetProperty(CommonCustomProperties attribute)
|
||
{
|
||
if(this is DataPoint)
|
||
{
|
||
DeleteCustomProperty(attribute);
|
||
}
|
||
else
|
||
{
|
||
this.SetAttributeObject(attribute, Series.defaultCustomProperties.GetAttributeObject(attribute));
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLabel()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.Label);
|
||
else
|
||
return !String.IsNullOrEmpty(series.label);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeAxisLabel()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.AxisLabel);
|
||
else
|
||
return !String.IsNullOrEmpty(series.axisLabel);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLabelFormat()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LabelFormat);
|
||
else
|
||
return !String.IsNullOrEmpty(series.labelFormat);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeIsValueShownAsLabel()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.IsValueShownAsLabel);
|
||
else
|
||
return series.showLabelAsValue != false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.Color);
|
||
else
|
||
return series.color != Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeBorderColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.BorderColor);
|
||
else
|
||
return series.borderColor != Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeBorderDashStyle()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.BorderDashStyle);
|
||
else
|
||
return series.borderDashStyle != ChartDashStyle.Solid;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeBorderWidth()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.BorderWidth);
|
||
else
|
||
return series.borderWidth != 1;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeMarkerBorderWidth()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.MarkerBorderWidth);
|
||
else
|
||
return series.markerBorderWidth != 1;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeBackImage()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.BackImage);
|
||
else
|
||
return !String.IsNullOrEmpty(series.backImage);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeBackImageWrapMode()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.BackImageWrapMode);
|
||
else
|
||
return series.backImageWrapMode != ChartImageWrapMode.Tile;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeBackImageTransparentColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.BackImageTransparentColor);
|
||
else
|
||
return series.backImageTransparentColor != Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeBackImageAlignment()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.BackImageAlignment);
|
||
else
|
||
return series.backImageAlignment != ChartImageAlignmentStyle.TopLeft;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeBackGradientStyle()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.BackGradientStyle);
|
||
else
|
||
return series.backGradientStyle != GradientStyle.None;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeBackSecondaryColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.BackSecondaryColor);
|
||
else
|
||
return series.backSecondaryColor != Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeBackHatchStyle()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.BackHatchStyle);
|
||
else
|
||
return series.backHatchStyle != ChartHatchStyle.None;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeFont()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.Font);
|
||
else
|
||
{
|
||
return series.font != series.FontCache.DefaultFont;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
internal bool ShouldSerializeLabelForeColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LabelForeColor);
|
||
else
|
||
return series.fontColor != Color.Black;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLabelAngle()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LabelAngle);
|
||
else
|
||
return series.fontAngle != 0f;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeMarkerStyle()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.MarkerStyle);
|
||
else
|
||
return series.markerStyle != MarkerStyle.None;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeMarkerSize()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.MarkerSize);
|
||
else
|
||
return series.markerSize != 5;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeMarkerImage()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.MarkerImage);
|
||
else
|
||
return !String.IsNullOrEmpty(series.markerImage);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeMarkerImageTransparentColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.MarkerImageTransparentColor);
|
||
else
|
||
return series.markerImageTransparentColor != Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeMarkerColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.MarkerColor);
|
||
else
|
||
return series.markerColor != Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeMarkerBorderColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.MarkerBorderColor);
|
||
else
|
||
return series.markerBorderColor != Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeToolTip()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.ToolTip);
|
||
else
|
||
return !String.IsNullOrEmpty(series.toolTip);
|
||
}
|
||
|
||
#if !Microsoft_CONTROL
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeUrl()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.Url);
|
||
else
|
||
return !String.IsNullOrEmpty(series.url);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeMapAreaAttributes()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.MapAreaAttributes);
|
||
else
|
||
return !String.IsNullOrEmpty(series.mapAreaAttributes);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
internal bool ShouldSerializePostBackValue()
|
||
{
|
||
if (this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.PostBackValue);
|
||
else
|
||
return !String.IsNullOrEmpty(series.postbackValue);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLegendUrl()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LegendUrl);
|
||
else
|
||
return !String.IsNullOrEmpty(series.legendUrl);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLegendMapAreaAttributes()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LegendMapAreaAttributes);
|
||
else
|
||
return !String.IsNullOrEmpty(series.legendMapAreaAttributes);
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLabelUrl()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LabelUrl);
|
||
else
|
||
return !String.IsNullOrEmpty(series.labelUrl);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLabelMapAreaAttributes()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LabelMapAreaAttributes);
|
||
else
|
||
return !String.IsNullOrEmpty(series.labelMapAreaAttributes);
|
||
}
|
||
|
||
|
||
|
||
#endif // !Microsoft_CONTROL
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeIsVisibleInLegend()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.IsVisibleInLegend);
|
||
else
|
||
return series.showInLegend != true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLegendText()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LegendText);
|
||
else
|
||
return !String.IsNullOrEmpty(series.legendText);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLegendToolTip()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LegendToolTip);
|
||
else
|
||
return !String.IsNullOrEmpty(series.legendToolTip);
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLabelToolTip()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LabelToolTip);
|
||
else
|
||
return !String.IsNullOrEmpty(series.labelToolTip);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLabelBackColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LabelBackColor);
|
||
else
|
||
return series.labelBackColor != Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLabelBorderColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LabelBorderColor);
|
||
else
|
||
return series.labelBorderColor != Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLabelBorderDashStyle()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LabelBorderDashStyle);
|
||
else
|
||
return series.labelBorderDashStyle != ChartDashStyle.Solid;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns true if property should be serialized.
|
||
/// </summary>
|
||
|
||
internal bool ShouldSerializeLabelBorderWidth()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
return CheckIfSerializationRequired(CommonCustomProperties.LabelBorderWidth);
|
||
else
|
||
return series.labelBorderWidth != 1;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLabel()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.Label);
|
||
else
|
||
series.label = "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetAxisLabel()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.AxisLabel);
|
||
else
|
||
series.axisLabel = "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLabelFormat()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LabelFormat);
|
||
else
|
||
series.labelFormat = "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
public void ResetIsValueShownAsLabel()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.IsValueShownAsLabel);
|
||
else
|
||
series.IsValueShownAsLabel = false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.Color);
|
||
else
|
||
series.color = Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetBorderColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.BorderColor);
|
||
else
|
||
series.borderColor = Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetBorderDashStyle()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.BorderDashStyle);
|
||
else
|
||
series.borderDashStyle = ChartDashStyle.Solid;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetBorderWidth()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.BorderWidth);
|
||
else
|
||
series.borderWidth = 1;
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetMarkerBorderWidth()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.MarkerBorderWidth);
|
||
else
|
||
series.markerBorderWidth = 1;
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetBackImage()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.BackImage);
|
||
else
|
||
series.backImage = "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetBackImageWrapMode()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.BackImageWrapMode);
|
||
else
|
||
series.backImageWrapMode = ChartImageWrapMode.Tile;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetBackImageTransparentColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.BackImageTransparentColor);
|
||
else
|
||
series.backImageTransparentColor = Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetBackSecondaryColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.BackSecondaryColor);
|
||
else
|
||
series.backSecondaryColor = Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetBackHatchStyle()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.BackHatchStyle);
|
||
else
|
||
series.backHatchStyle = ChartHatchStyle.None;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetFont()
|
||
{
|
||
if (this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.Font);
|
||
else
|
||
{
|
||
series.font = series.FontCache.DefaultFont;
|
||
}
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLabelAngle()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LabelAngle);
|
||
else
|
||
series.fontAngle = 0;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetMarkerStyle()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.MarkerStyle);
|
||
else
|
||
series.markerStyle = MarkerStyle.None;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetMarkerSize()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.MarkerSize);
|
||
else
|
||
series.markerSize = 5;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetMarkerImage()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.MarkerImage);
|
||
else
|
||
series.markerImage = "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetMarkerImageTransparentColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.MarkerImageTransparentColor);
|
||
else
|
||
series.markerImageTransparentColor = Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetMarkerColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.MarkerColor);
|
||
else
|
||
series.markerColor = Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetMarkerBorderColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.MarkerBorderColor);
|
||
else
|
||
series.markerBorderColor = Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetToolTip()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.ToolTip);
|
||
else
|
||
series.toolTip = "";
|
||
|
||
#if Microsoft_CONTROL
|
||
if(Chart != null && Chart.selection != null)
|
||
{
|
||
Chart.selection.enabledChecked = false;
|
||
}
|
||
#endif
|
||
}
|
||
|
||
#if !Microsoft_CONTROL
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetUrl()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.Url);
|
||
else
|
||
series.url = "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetMapAreaAttributes()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.MapAreaAttributes);
|
||
else
|
||
series.mapAreaAttributes = "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
internal void ResetPostBackValue()
|
||
{
|
||
if (this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.PostBackValue);
|
||
else
|
||
series.postbackValue = "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLegendUrl()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LegendUrl);
|
||
else
|
||
series.legendUrl = "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLegendMapAreaAttributes()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LegendMapAreaAttributes);
|
||
else
|
||
series.legendMapAreaAttributes = "";
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLabelUrl()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LabelUrl);
|
||
else
|
||
series.labelUrl = "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLabelMapAreaAttributes()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LabelMapAreaAttributes);
|
||
else
|
||
series.labelMapAreaAttributes = "";
|
||
}
|
||
|
||
|
||
#endif // !Microsoft_CONTROL
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
public void ResetIsVisibleInLegend()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.IsVisibleInLegend);
|
||
else
|
||
series.showInLegend = true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLegendText()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LegendText);
|
||
else
|
||
series.legendText = "";
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLegendToolTip()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LegendToolTip);
|
||
else
|
||
series.legendToolTip = "";
|
||
|
||
#if Microsoft_CONTROL
|
||
if(Chart != null && Chart.selection != null)
|
||
{
|
||
Chart.selection.enabledChecked = false;
|
||
}
|
||
#endif
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLabelBackColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LabelBackColor);
|
||
else
|
||
series.labelBackColor = Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLabelBorderColor()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LabelBorderColor);
|
||
else
|
||
series.labelBorderColor = Color.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLabelBorderDashStyle()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LabelBorderDashStyle);
|
||
else
|
||
series.labelBorderDashStyle = ChartDashStyle.Solid;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLabelBorderWidth()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LabelBorderWidth);
|
||
else
|
||
series.labelBorderWidth = 1;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Resets property to its default value.
|
||
/// </summary>
|
||
|
||
internal void ResetLabelToolTip()
|
||
{
|
||
if(this.pointCustomProperties)
|
||
ResetProperty(CommonCustomProperties.LabelToolTip);
|
||
else
|
||
series.labelToolTip = "";
|
||
|
||
#if Microsoft_CONTROL
|
||
if(Chart != null && Chart.selection != null)
|
||
{
|
||
Chart.selection.enabledChecked = false;
|
||
}
|
||
#endif
|
||
}
|
||
|
||
|
||
|
||
#endregion
|
||
|
||
#region Invalidating method
|
||
|
||
/// <summary>
|
||
/// Invalidate chart area.
|
||
/// </summary>
|
||
/// <param name="invalidateLegend">Invalidate legend area only.</param>
|
||
[SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", Justification = "This parameter is used when compiling for the Microsoft version of Chart")]
|
||
internal void Invalidate(bool invalidateLegend)
|
||
{
|
||
#if Microsoft_CONTROL
|
||
if(this.series != null)
|
||
{
|
||
series.Invalidate(true, invalidateLegend);
|
||
}
|
||
else
|
||
{
|
||
Series thisSeries = this as Series;
|
||
if (thisSeries != null)
|
||
{
|
||
thisSeries.Invalidate(true, invalidateLegend);
|
||
}
|
||
}
|
||
#endif
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Class stores additional information about the data point in 3D space.
|
||
/// </summary>
|
||
internal class DataPoint3D
|
||
{
|
||
#region Fields
|
||
|
||
/// <summary>
|
||
/// Reference to the 2D data point object
|
||
/// </summary>
|
||
internal DataPoint dataPoint = null;
|
||
|
||
/// <summary>
|
||
/// Data point index.
|
||
/// </summary>
|
||
internal int index = 0;
|
||
|
||
/// <summary>
|
||
/// Point X position in relative coordinates.
|
||
/// </summary>
|
||
internal double xPosition = 0.0;
|
||
|
||
/// <summary>
|
||
/// Point Y position in relative coordinates.
|
||
/// </summary>
|
||
internal double yPosition = 0.0;
|
||
|
||
/// <summary>
|
||
/// Point X center position in relative coordinates. Used for side-by-side charts.
|
||
/// </summary>
|
||
internal double xCenterVal = 0.0;
|
||
|
||
/// <summary>
|
||
/// Point Z position in relative coordinates.
|
||
/// </summary>
|
||
internal float zPosition = 0f;
|
||
|
||
/// <summary>
|
||
/// Point width.
|
||
/// </summary>
|
||
internal double width = 0.0;
|
||
|
||
/// <summary>
|
||
/// Point height.
|
||
/// </summary>
|
||
internal double height = 0.0;
|
||
|
||
/// <summary>
|
||
/// Point depth.
|
||
/// </summary>
|
||
internal float depth = 0f;
|
||
|
||
/// <summary>
|
||
/// Indicates that point belongs to indexed series.
|
||
/// </summary>
|
||
internal bool indexedSeries = false;
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Design-time representation of the CustomProperties.
|
||
/// This class is used instead of the string "CustomProperties"
|
||
/// property at design time and supports expandable list
|
||
/// of custom properties.
|
||
/// </summary>
|
||
[ TypeConverter(typeof(CustomPropertiesTypeConverter)) ]
|
||
[EditorBrowsable(EditorBrowsableState.Never)]
|
||
#if ASPPERM_35
|
||
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
||
[AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
|
||
#endif
|
||
public class CustomProperties
|
||
{
|
||
#region Fields
|
||
|
||
// Reference to the properties class
|
||
internal DataPointCustomProperties m_DataPointCustomProperties = null;
|
||
|
||
#endregion // Fields
|
||
|
||
#region Constructor
|
||
|
||
/// <summary>
|
||
/// Constructor
|
||
/// </summary>
|
||
/// <param name="properties">Attributes object.</param>
|
||
internal CustomProperties(DataPointCustomProperties properties)
|
||
{
|
||
this.m_DataPointCustomProperties = properties;
|
||
}
|
||
|
||
#endregion // Constructor
|
||
|
||
#region Properties
|
||
|
||
internal virtual DataPointCustomProperties DataPointCustomProperties
|
||
{
|
||
get
|
||
{
|
||
return this.m_DataPointCustomProperties;
|
||
}
|
||
set
|
||
{
|
||
this.m_DataPointCustomProperties = value;
|
||
}
|
||
|
||
}
|
||
|
||
#endregion //Properties
|
||
|
||
#region Methods
|
||
|
||
/// <summary>
|
||
/// Gets a comma separated string of user defined custom properties.
|
||
/// </summary>
|
||
/// <returns>Comma separated string of user defined custom properties.</returns>
|
||
internal virtual string GetUserDefinedCustomProperties()
|
||
{
|
||
return GetUserDefinedCustomProperties(true);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Gets a comma separated string of user defined or non-user defined custom properties.
|
||
/// </summary>
|
||
/// <param name="userDefined">True if user defined properties must be returned.</param>
|
||
/// <returns>Comma separated string of user defined custom properties.</returns>
|
||
internal virtual string GetUserDefinedCustomProperties(bool userDefined)
|
||
{
|
||
// Get comma separated string of custom properties
|
||
string customAttribute = this.DataPointCustomProperties.CustomProperties;
|
||
string userDefinedCustomAttribute = string.Empty;
|
||
|
||
// Get custom attribute registry
|
||
CustomPropertyRegistry registry = (CustomPropertyRegistry)this.DataPointCustomProperties.Common.container.GetService(typeof(CustomPropertyRegistry));
|
||
|
||
// Replace commas in value string
|
||
customAttribute = customAttribute.Replace("\\,", "\\x45");
|
||
customAttribute = customAttribute.Replace("\\=", "\\x46");
|
||
|
||
// Split custom properties by commas into individual properties
|
||
if(customAttribute.Length > 0)
|
||
{
|
||
string[] nameValueStrings = customAttribute.Split(',');
|
||
foreach(string nameValue in nameValueStrings)
|
||
{
|
||
string[] values = nameValue.Split('=');
|
||
|
||
// Check format
|
||
if(values.Length != 2)
|
||
{
|
||
throw(new FormatException(SR.ExceptionAttributeInvalidFormat));
|
||
}
|
||
|
||
// Check for empty name or value
|
||
values[0] = values[0].Trim();
|
||
values[1] = values[1].Trim();
|
||
if(values[0].Length == 0)
|
||
{
|
||
throw(new FormatException(SR.ExceptionAttributeInvalidFormat));
|
||
}
|
||
|
||
// Check if attribute is registered or user defined
|
||
bool userDefinedAttribute = true;
|
||
foreach(CustomPropertyInfo info in registry.registeredCustomProperties)
|
||
{
|
||
if(string.Compare(info.Name, values[0], StringComparison.OrdinalIgnoreCase) == 0)
|
||
{
|
||
userDefinedAttribute = false;
|
||
}
|
||
}
|
||
|
||
// Copy attribute into the output string
|
||
if(userDefinedAttribute == userDefined)
|
||
{
|
||
if(userDefinedCustomAttribute.Length > 0)
|
||
{
|
||
userDefinedCustomAttribute += ", ";
|
||
}
|
||
|
||
string val = values[1].Replace("\\x45", ",");
|
||
val = val.Replace("\\x46", "=");
|
||
userDefinedCustomAttribute += values[0] + "=" + val;
|
||
}
|
||
}
|
||
}
|
||
|
||
return userDefinedCustomAttribute;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Sets user defined custom properties without cleaning registered properties.
|
||
/// </summary>
|
||
/// <param name="val">New user defined properties.</param>
|
||
internal virtual void SetUserDefinedAttributes(string val)
|
||
{
|
||
// Get non-user defined custom properties
|
||
string properties = GetUserDefinedCustomProperties(false);
|
||
|
||
// Check if new string is empty
|
||
if(val.Length > 0)
|
||
{
|
||
// Add comma at the end
|
||
if(properties.Length > 0)
|
||
{
|
||
properties += ", ";
|
||
}
|
||
|
||
// Add new user defined properties
|
||
properties += val;
|
||
}
|
||
|
||
// Set new custom attribute string
|
||
this.DataPointCustomProperties.CustomProperties = properties;
|
||
}
|
||
|
||
|
||
#endregion // Methods
|
||
}
|
||
}
|
||
|
||
|