536cd135cc
Former-commit-id: 5624ac747d633e885131e8349322922b6a59baaa
1103 lines
31 KiB
C#
1103 lines
31 KiB
C#
//-------------------------------------------------------------
|
||
// <copyright company=<3D>Microsoft Corporation<6F>>
|
||
// Copyright <20> Microsoft Corporation. All Rights Reserved.
|
||
// </copyright>
|
||
//-------------------------------------------------------------
|
||
// @owner=alexgor, deliant
|
||
//=================================================================
|
||
// File: EmbedBorder.cs
|
||
//
|
||
// Namespace: System.Web.UI.WebControls[Windows.Forms].Charting.Borders3D
|
||
//
|
||
// Classes: EmbedBorder, FrameTitle1Border, FrameTitle2Border,
|
||
// FrameTitle3Border, FrameTitle4Border, FrameTitle5Border,
|
||
// FrameTitle6Border, FrameTitle7Border, FrameTitle8Border,
|
||
// FrameThin2Border, FrameThin3Border, FrameThin4Border,
|
||
// FrameThin5Border, FrameThin6Border, FrameThin1Border,
|
||
// RaisedBorder, SunkenBorder
|
||
//
|
||
// Purpose: Classes that implement different 3D border styles.
|
||
//
|
||
// Reviewed: AG - August 7, 2002
|
||
//
|
||
//===================================================================
|
||
|
||
#region Used namespaces
|
||
|
||
using System;
|
||
using System.Resources;
|
||
using System.Reflection;
|
||
using System.Collections;
|
||
using System.Drawing;
|
||
using System.Drawing.Drawing2D;
|
||
using System.ComponentModel.Design;
|
||
|
||
#if WINFORMS_CONTROL
|
||
using System.Windows.Forms.DataVisualization.Charting;
|
||
using System.Windows.Forms.DataVisualization.Charting.Data;
|
||
using System.Windows.Forms.DataVisualization.Charting.ChartTypes;
|
||
using System.Windows.Forms.DataVisualization.Charting.Utilities;
|
||
using System.Windows.Forms.DataVisualization.Charting.Borders3D;
|
||
|
||
#else
|
||
using System.Web.UI.DataVisualization.Charting; using System.Web.UI.DataVisualization.Charting.Data;
|
||
using System.Web.UI.DataVisualization.Charting.Utilities;
|
||
#endif
|
||
|
||
#endregion
|
||
|
||
#if WINFORMS_CONTROL
|
||
namespace System.Windows.Forms.DataVisualization.Charting.Borders3D
|
||
#else
|
||
namespace System.Web.UI.DataVisualization.Charting.Borders3D
|
||
#endif
|
||
{
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameTitle1Border : FrameThin1Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameTitle1Border()
|
||
{
|
||
sizeLeftTop = new SizeF(sizeLeftTop.Width, defaultRadiusSize*2f);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameTitle1";}}
|
||
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
sizeLeftTop = new SizeF(sizeLeftTop.Width, defaultRadiusSize * 2f);
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// Returns the position of the rectangular area in the border where
|
||
/// title should be displayed. Returns empty rect if title can't be shown in the border.
|
||
/// </summary>
|
||
/// <returns>Title position in border.</returns>
|
||
public override RectangleF GetTitlePositionInBorder()
|
||
{
|
||
return new RectangleF(
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 1.6f);
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameTitle2Border : FrameThin2Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameTitle2Border()
|
||
{
|
||
sizeLeftTop = new SizeF(sizeLeftTop.Width, defaultRadiusSize*2f);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameTitle2";}}
|
||
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
sizeLeftTop = new SizeF(sizeLeftTop.Width, defaultRadiusSize * 2f);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns the position of the rectangular area in the border where
|
||
/// title should be displayed. Returns empty rect if title can't be shown in the border.
|
||
/// </summary>
|
||
/// <returns>Title position in border.</returns>
|
||
public override RectangleF GetTitlePositionInBorder()
|
||
{
|
||
return new RectangleF(
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 1.6f);
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameTitle3Border : FrameThin3Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameTitle3Border()
|
||
{
|
||
sizeLeftTop = new SizeF(sizeLeftTop.Width, defaultRadiusSize*2f);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameTitle3";}}
|
||
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
sizeLeftTop = new SizeF(sizeLeftTop.Width, defaultRadiusSize * 2f);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns the position of the rectangular area in the border where
|
||
/// title should be displayed. Returns empty rect if title can't be shown in the border.
|
||
/// </summary>
|
||
/// <returns>Title position in border.</returns>
|
||
public override RectangleF GetTitlePositionInBorder()
|
||
{
|
||
return new RectangleF(
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 1.6f);
|
||
}
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameTitle4Border : FrameThin4Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameTitle4Border()
|
||
{
|
||
sizeLeftTop = new SizeF(sizeLeftTop.Width, defaultRadiusSize*2f);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameTitle4";}}
|
||
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
sizeLeftTop = new SizeF(sizeLeftTop.Width, defaultRadiusSize * 2f);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns the position of the rectangular area in the border where
|
||
/// title should be displayed. Returns empty rect if title can't be shown in the border.
|
||
/// </summary>
|
||
/// <returns>Title position in border.</returns>
|
||
public override RectangleF GetTitlePositionInBorder()
|
||
{
|
||
return new RectangleF(
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 1.6f);
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameTitle5Border : FrameThin5Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameTitle5Border()
|
||
{
|
||
sizeLeftTop = new SizeF(sizeLeftTop.Width, defaultRadiusSize*2f);
|
||
this.drawScrews = true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameTitle5";}}
|
||
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
sizeLeftTop = new SizeF(sizeLeftTop.Width, defaultRadiusSize * 2f);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns the position of the rectangular area in the border where
|
||
/// title should be displayed. Returns empty rect if title can't be shown in the border.
|
||
/// </summary>
|
||
/// <returns>Title position in border.</returns>
|
||
public override RectangleF GetTitlePositionInBorder()
|
||
{
|
||
return new RectangleF(
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 1.6f);
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameTitle6Border : FrameThin6Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameTitle6Border()
|
||
{
|
||
sizeLeftTop = new SizeF(sizeLeftTop.Width, defaultRadiusSize*2f);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameTitle6";}}
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
sizeLeftTop = new SizeF(sizeLeftTop.Width, defaultRadiusSize * 2f);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns the position of the rectangular area in the border where
|
||
/// title should be displayed. Returns empty rect if title can't be shown in the border.
|
||
/// </summary>
|
||
/// <returns>Title position in border.</returns>
|
||
public override RectangleF GetTitlePositionInBorder()
|
||
{
|
||
return new RectangleF(
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 0.25f,
|
||
defaultRadiusSize * 1.6f);
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameTitle7Border : FrameTitle1Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameTitle7Border()
|
||
{
|
||
this.sizeRightBottom = new SizeF(0, sizeRightBottom.Height);
|
||
float[] corners = {15f, 1f, 1f, 1f, 1f, 15f, 15f, 15f};
|
||
innerCorners = corners;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameTitle7";}}
|
||
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
this.sizeRightBottom = new SizeF(0, sizeRightBottom.Height);
|
||
float largeRadius = 15f * resolution / 96.0f;
|
||
float smallRadius = 1 * resolution / 96.0f;
|
||
float[] corners = { largeRadius, smallRadius, smallRadius, smallRadius, smallRadius, largeRadius, largeRadius, largeRadius };
|
||
innerCorners = corners;
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameTitle8Border : FrameTitle1Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameTitle8Border()
|
||
{
|
||
this.sizeLeftTop = new SizeF(0, sizeLeftTop.Height);
|
||
this.sizeRightBottom = new SizeF(0, sizeRightBottom.Height);
|
||
float[] corners = {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f};
|
||
innerCorners = corners;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameTitle8";}}
|
||
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
|
||
this.sizeLeftTop = new SizeF(0, sizeLeftTop.Height);
|
||
this.sizeRightBottom = new SizeF(0, sizeRightBottom.Height);
|
||
float radius = 1 * resolution / 96.0f;
|
||
float[] corners = { radius, radius, radius, radius, radius, radius, radius, radius };
|
||
innerCorners = corners;
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameThin2Border : FrameThin1Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameThin2Border()
|
||
{
|
||
float[] corners = {15f, 15f, 15f, 1f, 1f, 1f, 1f, 15f};
|
||
cornerRadius = corners;
|
||
innerCorners = corners;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameThin2";}}
|
||
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
|
||
float largeRadius = 15f * resolution / 96.0f;
|
||
float smallRadius = 1 * resolution / 96.0f;
|
||
float[] corners = { largeRadius, largeRadius, largeRadius, smallRadius, smallRadius, smallRadius, smallRadius, largeRadius };
|
||
cornerRadius = corners;
|
||
innerCorners = corners;
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameThin3Border : FrameThin1Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameThin3Border()
|
||
{
|
||
float[] corners = {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f};
|
||
cornerRadius = corners;
|
||
innerCorners = corners;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameThin3";}}
|
||
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
float radius = resolution / 96.0f;
|
||
float[] corners = { radius, radius, radius, radius, radius, radius, radius, radius };
|
||
cornerRadius = corners;
|
||
innerCorners = corners;
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameThin4Border : FrameThin1Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameThin4Border()
|
||
{
|
||
float[] corners = {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f};
|
||
cornerRadius = corners;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameThin4";}}
|
||
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
float radius = 1f * resolution / 96.0f;
|
||
cornerRadius = new float[] { radius, radius, radius, radius, radius, radius, radius, radius };
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameThin5Border : FrameThin1Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameThin5Border()
|
||
{
|
||
drawScrews = true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameThin5";}}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameThin6Border : FrameThin1Border
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameThin6Border()
|
||
{
|
||
float[] corners = {1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f};
|
||
innerCorners = corners;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameThin6";}}
|
||
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
float radius = resolution / 96.0f;
|
||
float[] corners = { radius, radius, radius, radius, radius, radius, radius, radius };
|
||
innerCorners = corners;
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements frame border.
|
||
/// </summary>
|
||
internal class FrameThin1Border : RaisedBorder
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Inner corners radius array
|
||
/// </summary>
|
||
internal float[] innerCorners = { 15f, 15f, 15f, 15f, 15f, 15f, 15f, 15f };
|
||
|
||
/// <summary>
|
||
/// Default constructor
|
||
/// </summary>
|
||
public FrameThin1Border()
|
||
{
|
||
sizeLeftTop = new SizeF(defaultRadiusSize * .8f, defaultRadiusSize * .8f);
|
||
sizeRightBottom = new SizeF(defaultRadiusSize * .8f, defaultRadiusSize * .8f);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "FrameThin1";}}
|
||
|
||
|
||
public override float Resolution
|
||
{
|
||
set
|
||
{
|
||
base.Resolution = value;
|
||
float radius = 15.0f * resolution / 96.0f;
|
||
innerCorners = new float[] { radius, radius, radius, radius, radius, radius, radius, radius };
|
||
sizeLeftTop = new SizeF(defaultRadiusSize * .8f, defaultRadiusSize * .8f);
|
||
sizeRightBottom = new SizeF(defaultRadiusSize * .8f, defaultRadiusSize * .8f);
|
||
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Draws 3D border.
|
||
/// </summary>
|
||
/// <param name="graph">Graphics to draw the border on.</param>
|
||
/// <param name="borderSkin">Border skin object.</param>
|
||
/// <param name="rect">Rectangle of the border.</param>
|
||
/// <param name="backColor">Color of rectangle</param>
|
||
/// <param name="backHatchStyle">Hatch style</param>
|
||
/// <param name="backImage">Back Image</param>
|
||
/// <param name="backImageWrapMode">Image mode</param>
|
||
/// <param name="backImageTransparentColor">Image transparent color.</param>
|
||
/// <param name="backImageAlign">Image alignment</param>
|
||
/// <param name="backGradientStyle">Gradient type</param>
|
||
/// <param name="backSecondaryColor">Gradient End Color</param>
|
||
/// <param name="borderColor">Border Color</param>
|
||
/// <param name="borderWidth">Border Width</param>
|
||
/// <param name="borderDashStyle">Border Style</param>
|
||
public override void DrawBorder(
|
||
ChartGraphics graph,
|
||
BorderSkin borderSkin,
|
||
RectangleF rect,
|
||
Color backColor,
|
||
ChartHatchStyle backHatchStyle,
|
||
string backImage,
|
||
ChartImageWrapMode backImageWrapMode,
|
||
Color backImageTransparentColor,
|
||
ChartImageAlignmentStyle backImageAlign,
|
||
GradientStyle backGradientStyle,
|
||
Color backSecondaryColor,
|
||
Color borderColor,
|
||
int borderWidth,
|
||
ChartDashStyle borderDashStyle)
|
||
{
|
||
drawBottomShadow = true;
|
||
sunken = false;
|
||
outsideShadowRate = .9f;
|
||
drawOutsideTopLeftShadow = false;
|
||
bool oldScrewsFlag = this.drawScrews;
|
||
this.drawScrews = false;
|
||
base.DrawBorder(
|
||
graph,
|
||
borderSkin,
|
||
rect,
|
||
borderSkin.BackColor,
|
||
borderSkin.BackHatchStyle,
|
||
borderSkin.BackImage,
|
||
borderSkin.BackImageWrapMode,
|
||
borderSkin.BackImageTransparentColor,
|
||
borderSkin.BackImageAlignment,
|
||
borderSkin.BackGradientStyle,
|
||
borderSkin.BackSecondaryColor,
|
||
borderSkin.BorderColor,
|
||
borderSkin.BorderWidth,
|
||
borderSkin.BorderDashStyle);
|
||
|
||
this.drawScrews = oldScrewsFlag;
|
||
rect.X += sizeLeftTop.Width;
|
||
rect.Y += sizeLeftTop.Height;
|
||
rect.Width -= sizeRightBottom.Width + sizeLeftTop.Width;
|
||
rect.Height -= sizeRightBottom.Height + sizeLeftTop.Height;
|
||
if(rect.Width > 0 && rect.Height > 0 )
|
||
{
|
||
float[] oldCorners = new float[8];
|
||
oldCorners = (float[])cornerRadius.Clone();
|
||
cornerRadius = innerCorners;
|
||
drawBottomShadow = false;
|
||
sunken = true;
|
||
drawOutsideTopLeftShadow = true;
|
||
outsideShadowRate = 1.4f;
|
||
Color oldPageColor = borderSkin.PageColor;
|
||
borderSkin.PageColor = Color.Transparent;
|
||
base.DrawBorder(
|
||
graph,
|
||
borderSkin,
|
||
rect,
|
||
backColor,
|
||
backHatchStyle,
|
||
backImage,
|
||
backImageWrapMode,
|
||
backImageTransparentColor,
|
||
backImageAlign,
|
||
backGradientStyle,
|
||
backSecondaryColor,
|
||
borderColor,
|
||
borderWidth,
|
||
borderDashStyle );
|
||
borderSkin.PageColor = oldPageColor;
|
||
cornerRadius = oldCorners;
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// Implements raised border.
|
||
/// </summary>
|
||
internal class RaisedBorder : SunkenBorder
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Public constructor
|
||
/// </summary>
|
||
public RaisedBorder()
|
||
{
|
||
sunken = false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public override string Name { get{ return "Raised";}}
|
||
|
||
#endregion
|
||
}
|
||
|
||
/// <summary>
|
||
/// Implements embed 3D border.
|
||
/// </summary>
|
||
internal class SunkenBorder : IBorderType
|
||
{
|
||
#region Border properties and methods
|
||
|
||
/// <summary>
|
||
/// Radius for rounded rectangle
|
||
/// </summary>
|
||
internal float defaultRadiusSize = 15f;
|
||
|
||
/// <summary>
|
||
/// Outside shadow rate
|
||
/// </summary>
|
||
internal float outsideShadowRate = .9f;
|
||
|
||
/// <summary>
|
||
/// Indicates that sunken shadows should be drawn
|
||
/// </summary>
|
||
internal bool sunken = true;
|
||
|
||
/// <summary>
|
||
/// Indicates that bottom shadow should be drawn
|
||
/// </summary>
|
||
internal bool drawBottomShadow = true;
|
||
|
||
/// <summary>
|
||
/// Indicates that top left outside dark shadow must be drawn
|
||
/// </summary>
|
||
internal bool drawOutsideTopLeftShadow = false;
|
||
|
||
/// <summary>
|
||
/// Array of corner radius
|
||
/// </summary>
|
||
internal float[] cornerRadius = { 15f, 15f, 15f, 15f, 15f, 15f, 15f, 15f };
|
||
|
||
/// <summary>
|
||
/// Border top/left size
|
||
/// </summary>
|
||
internal SizeF sizeLeftTop = SizeF.Empty;
|
||
|
||
/// <summary>
|
||
/// Border right/bottom size
|
||
/// </summary>
|
||
internal SizeF sizeRightBottom = SizeF.Empty;
|
||
|
||
/// <summary>
|
||
/// Indicates that ----s should be drawn in the corners of the frame
|
||
/// </summary>
|
||
internal bool drawScrews = false;
|
||
|
||
|
||
internal float resolution = 96f;
|
||
|
||
|
||
/// <summary>
|
||
/// Public constructor
|
||
/// </summary>
|
||
public SunkenBorder()
|
||
{
|
||
}
|
||
|
||
/// <summary>
|
||
/// Chart type name
|
||
/// </summary>
|
||
public virtual string Name { get{ return "Sunken";}}
|
||
|
||
|
||
public virtual float Resolution
|
||
{
|
||
set
|
||
{
|
||
resolution = value;
|
||
defaultRadiusSize = 15 * resolution / 96;
|
||
//X = defaultRadiusSize;
|
||
//Y = defaultRadiusSize;
|
||
cornerRadius = new float[] { defaultRadiusSize, defaultRadiusSize, defaultRadiusSize, defaultRadiusSize, defaultRadiusSize, defaultRadiusSize, defaultRadiusSize, defaultRadiusSize };
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Returns the position of the rectangular area in the border where
|
||
/// title should be displayed. Returns empty rect if title can't be shown in the border.
|
||
/// </summary>
|
||
/// <returns>Title position in border.</returns>
|
||
public virtual RectangleF GetTitlePositionInBorder()
|
||
{
|
||
return RectangleF.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Adjust areas rectangle coordinate to fit the 3D border
|
||
/// </summary>
|
||
/// <param name="graph">Graphics to draw the border on.</param>
|
||
/// <param name="areasRect">Position to adjust.</param>
|
||
public virtual void AdjustAreasPosition(ChartGraphics graph, ref RectangleF areasRect)
|
||
{
|
||
SizeF relSizeLeftTop = new SizeF(sizeLeftTop);
|
||
SizeF relSizeRightBottom = new SizeF(sizeRightBottom);
|
||
relSizeLeftTop.Width += defaultRadiusSize * 0.7f;
|
||
relSizeLeftTop.Height += defaultRadiusSize * 0.85f;
|
||
relSizeRightBottom.Width += defaultRadiusSize * 0.7f;
|
||
relSizeRightBottom.Height += defaultRadiusSize * 0.7f;
|
||
relSizeLeftTop = graph.GetRelativeSize(relSizeLeftTop);
|
||
relSizeRightBottom = graph.GetRelativeSize(relSizeRightBottom);
|
||
|
||
if(relSizeLeftTop.Width > 30f)
|
||
relSizeLeftTop.Width = 0;
|
||
if(relSizeLeftTop.Height > 30f)
|
||
relSizeLeftTop.Height = 0;
|
||
if(relSizeRightBottom.Width > 30f)
|
||
relSizeRightBottom.Width = 0;
|
||
if(relSizeRightBottom.Height > 30f)
|
||
relSizeRightBottom.Height = 0;
|
||
|
||
|
||
areasRect.X += relSizeLeftTop.Width;
|
||
areasRect.Width -= (float)Math.Min(areasRect.Width, relSizeLeftTop.Width + relSizeRightBottom.Width);
|
||
areasRect.Y += relSizeLeftTop.Height;
|
||
areasRect.Height -= (float)Math.Min(areasRect.Height, relSizeLeftTop.Height + relSizeRightBottom.Height);
|
||
|
||
if(areasRect.Right > 100f)
|
||
{
|
||
if(areasRect.Width > 100f - areasRect.Right)
|
||
areasRect.Width -= 100f - areasRect.Right;
|
||
else
|
||
areasRect.X -= 100f - areasRect.Right;
|
||
}
|
||
if(areasRect.Bottom > 100f)
|
||
{
|
||
if(areasRect.Height > 100f - areasRect.Bottom)
|
||
areasRect.Height -= 100f - areasRect.Bottom;
|
||
else
|
||
areasRect.Y -= 100f - areasRect.Bottom;
|
||
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Draws 3D border
|
||
/// </summary>
|
||
/// <param name="graph">Graphics to draw the border on.</param>
|
||
/// <param name="borderSkin">Border skin object.</param>
|
||
/// <param name="rect">Rectangle of the border.</param>
|
||
/// <param name="backColor">Color of rectangle</param>
|
||
/// <param name="backHatchStyle">Hatch style</param>
|
||
/// <param name="backImage">Back Image</param>
|
||
/// <param name="backImageWrapMode">Image mode</param>
|
||
/// <param name="backImageTransparentColor">Image transparent color.</param>
|
||
/// <param name="backImageAlign">Image alignment</param>
|
||
/// <param name="backGradientStyle">Gradient type</param>
|
||
/// <param name="backSecondaryColor">Gradient End Color</param>
|
||
/// <param name="borderColor">Border Color</param>
|
||
/// <param name="borderWidth">Border Width</param>
|
||
/// <param name="borderDashStyle">Border Style</param>
|
||
public virtual void DrawBorder(
|
||
ChartGraphics graph,
|
||
BorderSkin borderSkin,
|
||
RectangleF rect,
|
||
Color backColor,
|
||
ChartHatchStyle backHatchStyle,
|
||
string backImage,
|
||
ChartImageWrapMode backImageWrapMode,
|
||
Color backImageTransparentColor,
|
||
ChartImageAlignmentStyle backImageAlign,
|
||
GradientStyle backGradientStyle,
|
||
Color backSecondaryColor,
|
||
Color borderColor,
|
||
int borderWidth,
|
||
ChartDashStyle borderDashStyle)
|
||
{
|
||
RectangleF absolute = graph.Round( rect );
|
||
RectangleF shadowRect = absolute;
|
||
|
||
// Calculate shadow colors (0.2 - 0.6)
|
||
float colorDarkeningIndex = 0.3f + (0.4f * (borderSkin.PageColor.R + borderSkin.PageColor.G + borderSkin.PageColor.B) / 765f);
|
||
Color shadowColor = Color.FromArgb(
|
||
(int)(backColor.R*colorDarkeningIndex),
|
||
(int)(backColor.G*colorDarkeningIndex),
|
||
(int)(backColor.B*colorDarkeningIndex));
|
||
|
||
colorDarkeningIndex += 0.2f;
|
||
Color shadowLightColor = Color.FromArgb(
|
||
(int)(borderSkin.PageColor.R*colorDarkeningIndex),
|
||
(int)(borderSkin.PageColor.G*colorDarkeningIndex),
|
||
(int)(borderSkin.PageColor.B*colorDarkeningIndex));
|
||
if(borderSkin.PageColor == Color.Transparent)
|
||
{
|
||
shadowLightColor = Color.FromArgb(60, 0, 0, 0);
|
||
}
|
||
|
||
// Calculate rounded rect radius
|
||
float radius = defaultRadiusSize;
|
||
radius = (float)Math.Max(radius, 2f * resolution / 96.0f);
|
||
radius = (float)Math.Min(radius, rect.Width/2f);
|
||
radius = (float)Math.Min(radius, rect.Height/2f);
|
||
radius = (float)Math.Ceiling(radius);
|
||
|
||
// Fill page background color
|
||
using (Brush brush = new SolidBrush(borderSkin.PageColor))
|
||
{
|
||
graph.FillRectangle(brush, rect);
|
||
}
|
||
|
||
if(drawOutsideTopLeftShadow)
|
||
{
|
||
// Top/Left outside shadow
|
||
shadowRect = absolute;
|
||
shadowRect.X -= radius * 0.3f;
|
||
shadowRect.Y -= radius * 0.3f;
|
||
shadowRect.Width -= radius * .3f;
|
||
shadowRect.Height -= radius * .3f;
|
||
graph.DrawRoundedRectShadowAbs(shadowRect, cornerRadius, radius, Color.FromArgb(128, Color.Black), borderSkin.PageColor, outsideShadowRate);
|
||
}
|
||
|
||
// Bottom/Right outside shadow
|
||
shadowRect = absolute;
|
||
shadowRect.X += radius * 0.3f;
|
||
shadowRect.Y += radius * 0.3f;
|
||
shadowRect.Width -= radius * .3f;
|
||
shadowRect.Height -= radius * .3f;
|
||
graph.DrawRoundedRectShadowAbs(shadowRect, cornerRadius, radius, shadowLightColor, borderSkin.PageColor, outsideShadowRate);
|
||
|
||
// Background
|
||
shadowRect = absolute;
|
||
shadowRect.Width -= radius * .3f;
|
||
shadowRect.Height -= radius * .3f;
|
||
GraphicsPath path = graph.CreateRoundedRectPath(shadowRect, cornerRadius);
|
||
graph.DrawPathAbs(
|
||
path,
|
||
backColor,
|
||
backHatchStyle,
|
||
backImage,
|
||
backImageWrapMode,
|
||
backImageTransparentColor,
|
||
backImageAlign,
|
||
backGradientStyle,
|
||
backSecondaryColor,
|
||
borderColor,
|
||
borderWidth,
|
||
borderDashStyle,
|
||
PenAlignment.Inset );
|
||
|
||
// Dispose Graphic path
|
||
if( path != null )
|
||
path.Dispose();
|
||
|
||
// Draw ----s imitation in the corners of the farame
|
||
if(drawScrews)
|
||
{
|
||
// Left/Top ----
|
||
RectangleF screwRect = RectangleF.Empty;
|
||
float offset = radius * 0.4f;
|
||
screwRect.X = shadowRect.X + offset;
|
||
screwRect.Y = shadowRect.Y + offset;
|
||
screwRect.Width = radius * 0.55f;
|
||
screwRect.Height = screwRect.Width;
|
||
DrawScrew(graph, screwRect);
|
||
|
||
// Right/Top ----
|
||
screwRect.X = shadowRect.Right - offset - screwRect.Width;
|
||
DrawScrew(graph, screwRect);
|
||
|
||
// Right/Bottom ----
|
||
screwRect.X = shadowRect.Right - offset - screwRect.Width;
|
||
screwRect.Y = shadowRect.Bottom - offset - screwRect.Height;
|
||
DrawScrew(graph, screwRect);
|
||
|
||
// Left/Bottom ----
|
||
screwRect.X = shadowRect.X + offset;
|
||
screwRect.Y = shadowRect.Bottom - offset - screwRect.Height;
|
||
DrawScrew(graph, screwRect);
|
||
}
|
||
|
||
// Bottom/Right inner shadow
|
||
Region innerShadowRegion = null;
|
||
if(drawBottomShadow)
|
||
{
|
||
shadowRect = absolute;
|
||
shadowRect.Width -= radius * .3f;
|
||
shadowRect.Height -= radius * .3f;
|
||
innerShadowRegion = new Region(
|
||
graph.CreateRoundedRectPath(
|
||
new RectangleF(
|
||
shadowRect.X - radius,
|
||
shadowRect.Y - radius,
|
||
shadowRect.Width + 0.5f*radius,
|
||
shadowRect.Height + 0.5f*radius),
|
||
cornerRadius));
|
||
innerShadowRegion.Complement(graph.CreateRoundedRectPath(shadowRect, cornerRadius));
|
||
graph.Clip = innerShadowRegion;
|
||
|
||
shadowRect.X -= 0.5f*radius;
|
||
shadowRect.Width += 0.5f*radius;
|
||
shadowRect.Y -= 0.5f*radius;
|
||
shadowRect.Height += 0.5f*radius;
|
||
|
||
graph.DrawRoundedRectShadowAbs(
|
||
shadowRect,
|
||
cornerRadius,
|
||
radius,
|
||
Color.Transparent,
|
||
Color.FromArgb(175, (sunken) ? Color.White : shadowColor),
|
||
1.0f);
|
||
graph.Clip = new Region();
|
||
}
|
||
|
||
// Top/Left inner shadow
|
||
shadowRect = absolute;
|
||
shadowRect.Width -= radius * .3f;
|
||
shadowRect.Height -= radius * .3f;
|
||
innerShadowRegion = new Region(
|
||
graph.CreateRoundedRectPath(
|
||
new RectangleF(
|
||
shadowRect.X + radius*.5f,
|
||
shadowRect.Y + radius*.5f,
|
||
shadowRect.Width - .2f*radius,
|
||
shadowRect.Height - .2f*radius),
|
||
cornerRadius));
|
||
|
||
RectangleF shadowWithOffset = shadowRect;
|
||
shadowWithOffset.Width += radius;
|
||
shadowWithOffset.Height += radius;
|
||
innerShadowRegion.Complement(graph.CreateRoundedRectPath(shadowWithOffset, cornerRadius));
|
||
|
||
innerShadowRegion.Intersect(graph.CreateRoundedRectPath(shadowRect, cornerRadius));
|
||
graph.Clip = innerShadowRegion;
|
||
graph.DrawRoundedRectShadowAbs(
|
||
shadowWithOffset,
|
||
cornerRadius,
|
||
radius,
|
||
Color.Transparent,
|
||
Color.FromArgb(175, (sunken) ? shadowColor : Color.White),
|
||
1.0f);
|
||
graph.Clip = new Region();
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// Helper function, which draws a ---- on the frame
|
||
/// </summary>
|
||
/// <param name="graph">Chart graphics to use.</param>
|
||
/// <param name="rect">---- position.</param>
|
||
private void DrawScrew(ChartGraphics graph, RectangleF rect)
|
||
{
|
||
// Draw ----
|
||
Pen screwPen = new Pen(Color.FromArgb(128,255,255,255), 1);
|
||
graph.DrawEllipse(screwPen, rect.X, rect.Y, rect.Width, rect.Height);
|
||
graph.DrawLine(screwPen, rect.X + 2 * resolution / 96.0f, rect.Y + rect.Height - 2 * resolution / 96.0f, rect.Right - 2 * resolution / 96.0f, rect.Y + 2 * resolution / 96.0f);
|
||
screwPen = new Pen(Color.FromArgb(128, Color.Black), 1);
|
||
graph.DrawEllipse(screwPen, rect.X + 1 * resolution / 96.0f, rect.Y + 1 * resolution / 96.0f, rect.Width, rect.Height);
|
||
graph.DrawLine(screwPen, rect.X + 3 * resolution / 96.0f, rect.Y + rect.Height - 1 * resolution / 96.0f, rect.Right - 1 * resolution / 96.0f, rect.Y + 3 * resolution / 96.0f);
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
}
|