1207 lines
36 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Drawing.Drawing2D;
using DevComponents.Charts.TextMarkup;
using DevComponents.DotNetBar.Charts.Style;
namespace DevComponents.DotNetBar.Charts
{
/// <summary>
/// Represents the collection of ChartTitles.
/// </summary>
[Editor("DevComponents.Charts.Design.ChartTitleCollectionEditor, DevComponents.Charts.Design, " +
"Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(UITypeEditor))]
public class ChartTitleCollection : CustomNamedCollection<ChartTitle>
{
public ChartTitleCollection()
{
}
#region GetUniqueName
public string GetUniqueName()
{
return (GetUniqueName("Title"));
}
#endregion
}
/// <summary>
/// ChartTitle
/// </summary>
public class ChartTitle : ChartNote
{
#region Private variables
private States _States;
private XyAlignment _XyAlignment = XyAlignment.NotSet;
private RotateDegrees _RotateDegrees = RotateDegrees.NotSet;
private ChartTitleVisualStyle _ChartTitleVisualStyle;
private EffectiveStyle<ChartTitleVisualStyle> _EffectiveTitleStyle;
private Rectangle _FrameBounds;
private Rectangle _ContentBounds;
private int _TextHeight;
#endregion
#region Constructors
/// <summary>
/// Creates a new ChartTitle
/// </summary>
public ChartTitle()
: this(null, null)
{
}
/// <summary>
/// Creates a new ChartTitle
/// </summary>
/// <param name="name">Title name</param>
public ChartTitle(string name)
: this(name, null)
{
}
/// <summary>
/// Creates a new ChartTitle
/// </summary>
/// <param name="name">Title Name</param>
/// <param name="text">Title Text</param>
public ChartTitle(string name, string text)
{
InitDefaultStates();
Name = name;
Text = text;
_EffectiveTitleStyle = new EffectiveStyle<ChartTitleVisualStyle>(this);
}
#endregion
#region InitDefaultStates
private void InitDefaultStates()
{
}
#endregion
#region Public properties
#region ChartTitleVisualStyle
/// <summary>
/// Gets or sets the visual style for the Title.
/// </summary>
[Category("Style")]
[Description("Indicates the visual style for the Title.")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ChartTitleVisualStyle ChartTitleVisualStyle
{
get
{
if (_ChartTitleVisualStyle == null)
{
_ChartTitleVisualStyle = new ChartTitleVisualStyle();
StyleVisualChangeHandler(null, _ChartTitleVisualStyle);
}
return (_ChartTitleVisualStyle);
}
set
{
if (_ChartTitleVisualStyle != value)
{
ChartTitleVisualStyle oldValue = _ChartTitleVisualStyle;
_ChartTitleVisualStyle = value;
OnStyleChanged("ChartTitleVisualStyle", oldValue, value);
if (oldValue != null)
oldValue.Dispose();
}
}
}
#endregion
#region EffectiveTitleStyle
/// <summary>
/// Gets a reference to the title's effective (cached, composite) style.
/// </summary>
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ChartTitleVisualStyle EffectiveTitleStyle
{
get { return (_EffectiveTitleStyle.Style); }
}
#endregion
#region RotateDegrees
/// <summary>
/// Gets or sets the title's display rotation.
/// </summary>
[DefaultValue(RotateDegrees.NotSet), Category("Layout")]
[Description("Indicates the title's display rotation.")]
public RotateDegrees RotateDegrees
{
get { return (_RotateDegrees); }
set
{
if (value != _RotateDegrees)
{
_RotateDegrees = value;
OnPropertyChangedEx("RotateDegrees", VisualChangeType.Layout);
}
}
}
#endregion
#region XyAlignment
/// <summary>
/// Gets or sets the X/Y Alignment for the title.
/// </summary>
[DefaultValue(XyAlignment.NotSet), Category("Layout")]
[Description("Indicates the X/Y Alignment for the title.")]
public XyAlignment XyAlignment
{
get { return (_XyAlignment); }
set
{
if (value != _XyAlignment)
{
_XyAlignment = value;
OnPropertyChangedEx("XyAlignment", VisualChangeType.Layout);
}
}
}
#endregion
#endregion
#region MeasureOverride
protected override void MeasureOverride(ChartLayoutInfo layoutInfo)
{
Graphics g = layoutInfo.Graphics;
ChartTitleVisualStyle style = EffectiveTitleStyle;
Size size = Size.Empty;
Rectangle layoutBounds = layoutInfo.LayoutBounds;
RotateDegrees rotDegrees = GetRotateDegrees(style);
if (rotDegrees == RotateDegrees.Rotate90 || rotDegrees == RotateDegrees.Rotate270)
layoutBounds.Size = new Size(layoutBounds.Height, layoutBounds.Width);
Thickness brdThickness = style.BorderThickness;
Size ncSize = GetNonContentSize(style, brdThickness);
layoutBounds.Width -= ncSize.Width;
layoutBounds.Height -= ncSize.Height;
Alignment imageAlignment = style.ImageAlignment;
Size imageSize = style.GetFigureSize(g);
if (layoutBounds.Width > 0 && layoutBounds.Height > 0)
{
if (imageSize.IsEmpty == false)
{
if (style.IsOverlayImage == true)
imageAlignment = Alignment.MiddleCenter;
else if (imageAlignment == Alignment.NotSet)
imageAlignment = Alignment.MiddleLeft;
switch (imageAlignment)
{
case Alignment.TopLeft:
case Alignment.TopRight:
case Alignment.BottomLeft:
case Alignment.BottomRight:
case Alignment.MiddleLeft:
case Alignment.MiddleRight:
if (rotDegrees == RotateDegrees.Rotate90 || rotDegrees == RotateDegrees.Rotate270)
layoutBounds.Height -= imageSize.Width;
else
layoutBounds.Width -= imageSize.Width;
break;
case Alignment.TopCenter:
case Alignment.BottomCenter:
layoutBounds.Height -= imageSize.Height;
break;
}
if (layoutBounds.Size.Width > 0 && layoutBounds.Size.Height > 0)
size = MeasureText(g, style, layoutBounds.Size);
switch (imageAlignment)
{
case Alignment.TopLeft:
case Alignment.TopRight:
case Alignment.MiddleLeft:
case Alignment.MiddleRight:
case Alignment.BottomLeft:
case Alignment.BottomRight:
size.Width += imageSize.Width;
size.Height = Math.Max(imageSize.Height, size.Height);
break;
case Alignment.TopCenter:
case Alignment.BottomCenter:
size.Height += imageSize.Height;
size.Width = Math.Max(imageSize.Width, size.Width);
break;
case Alignment.MiddleCenter:
size.Height = Math.Max(imageSize.Height, size.Height);
size.Width = Math.Max(imageSize.Width, size.Width);
break;
}
}
else
{
size = MeasureText(g, style, layoutBounds.Size);
}
size.Width += ncSize.Width;
size.Height += ncSize.Height;
}
if (FixedHeight > 0)
size.Height = Dpi.Height(FixedHeight);
Rectangle bounds = layoutBounds;
if (style.Stretch == Tbool.True)
{
switch (XyAlignment)
{
case XyAlignment.Left:
case XyAlignment.Right:
if (rotDegrees == RotateDegrees.Rotate90 || rotDegrees == RotateDegrees.Rotate270)
size.Width = layoutInfo.LayoutBounds.Height;
break;
default:
if (rotDegrees != RotateDegrees.Rotate90 && rotDegrees != RotateDegrees.Rotate270)
size.Width = layoutInfo.LayoutBounds.Width;
break;
}
}
Rectangle rb = bounds;
if (rotDegrees == RotateDegrees.Rotate90 || rotDegrees == RotateDegrees.Rotate270)
bounds.Size = new Size(size.Height, size.Width);
else
bounds.Size = size;
if (bounds.Width > layoutInfo.LayoutBounds.Width)
bounds.Width = layoutInfo.LayoutBounds.Width;
if (bounds.Height > layoutInfo.LayoutBounds.Height)
bounds.Height = layoutInfo.LayoutBounds.Height;
Size = bounds.Size;
bounds = AlignTitle(layoutInfo, bounds, style);
_FrameBounds = GetAdjustedBoundsRot(bounds, style.Margin);
if (style.DropShadow.Enabled == Tbool.True)
{
_FrameBounds.Width -= 3;
_FrameBounds.Height -= 3;
}
_ContentBounds = _FrameBounds;
if (brdThickness.IsEmpty == false)
{
_ContentBounds.X += brdThickness.Left;
_ContentBounds.Width -= brdThickness.Horizontal;
_ContentBounds.Y += brdThickness.Top;
_ContentBounds.Height -= brdThickness.Vertical;
}
if (rotDegrees == RotateDegrees.Rotate90 || rotDegrees == RotateDegrees.Rotate270)
_ContentBounds = GetAdjustedBoundsRot(_ContentBounds, style.Padding);
else
_ContentBounds = GetAdjustedBounds(_ContentBounds, style.Padding);
if (imageSize.IsEmpty == false)
{
if (rotDegrees == RotateDegrees.Rotate90 || rotDegrees == RotateDegrees.Rotate270)
AdjustVerticalContent(rotDegrees, imageAlignment, imageSize);
else
AdjustHorizontalContent(imageAlignment, imageSize);
}
BoundsRelative = bounds;
}
#region GetAdjustedBoundsRot
internal Rectangle GetAdjustedBoundsRot(Rectangle bounds, Thickness thickness)
{
if (thickness.IsEmpty == false)
{
if (bounds.Width > Dpi.Height(thickness.Vertical))
{
bounds.X += Dpi.Height(thickness.Top);
bounds.Width -= Dpi.Height(thickness.Vertical);
}
if (bounds.Height > Dpi.Width(thickness.Horizontal))
{
bounds.Y += Dpi.Width(thickness.Left);
bounds.Height -= Dpi.Width(thickness.Horizontal);
}
}
return (bounds);
}
#endregion
#region GetNonContentSize
private Size GetNonContentSize(ChartTitleVisualStyle style, Thickness brdThickness)
{
Size size = Size.Empty;
size.Width = Dpi.Width(style.Margin.Horizontal + brdThickness.Horizontal + style.Padding.Horizontal);
size.Height = Dpi.Height(style.Margin.Vertical + brdThickness.Vertical + style.Padding.Vertical);
if (style.DropShadow.Enabled == Tbool.True)
{
size.Width += 3;
size.Height += 3;
}
return (size);
}
#endregion
#region AdjustVerticalContent
private void AdjustVerticalContent(
RotateDegrees rotDegrees, Alignment imageAlignment, Size imageSize)
{
switch (imageAlignment)
{
case Alignment.TopLeft:
case Alignment.MiddleLeft:
case Alignment.BottomLeft:
if (rotDegrees == RotateDegrees.Rotate90)
_ContentBounds.Y += imageSize.Width;
else if (rotDegrees == RotateDegrees.Rotate270)
_ContentBounds.Y += imageSize.Width;
else
_ContentBounds.X += imageSize.Height;
_ContentBounds.Height -= imageSize.Width;
break;
case Alignment.TopCenter:
if (rotDegrees == RotateDegrees.Rotate90)
_ContentBounds.X += imageSize.Height;
else if (rotDegrees == RotateDegrees.Rotate270)
_ContentBounds.X += imageSize.Height;
else
_ContentBounds.Y += imageSize.Width;
_ContentBounds.Width -= imageSize.Height;
break;
case Alignment.BottomCenter:
_ContentBounds.Width -= imageSize.Height;
break;
case Alignment.TopRight:
case Alignment.MiddleRight:
case Alignment.BottomRight:
_ContentBounds.Height -= imageSize.Width;
break;
}
}
#endregion
#region AdjustHorizontalContent
private void AdjustHorizontalContent(
Alignment imageAlignment, Size imageSize)
{
switch (imageAlignment)
{
case Alignment.TopLeft:
case Alignment.MiddleLeft:
case Alignment.BottomLeft:
_ContentBounds.X += imageSize.Width;
_ContentBounds.Width -= imageSize.Width;
break;
case Alignment.TopCenter:
_ContentBounds.Y += imageSize.Height;
_ContentBounds.Height -= imageSize.Height;
break;
case Alignment.BottomCenter:
_ContentBounds.Height -= imageSize.Height;
break;
case Alignment.TopRight:
case Alignment.MiddleRight:
case Alignment.BottomRight:
_ContentBounds.Width -= imageSize.Width;
break;
}
}
#endregion
#region MeasureText
private Size MeasureText(Graphics g, ChartTitleVisualStyle style, Size vsize)
{
Size size = Size.Empty;
string s = Text;
if (string.IsNullOrEmpty(s) == false)
{
if (TextMarkup != null)
{
size = GetMarkupTextSize(g,
TextMarkup, style, (vsize.Width > 0 ? vsize.Width : 10000));
}
else
{
using (StringFormat sf = new StringFormat())
{
style.GetStringFormatFlags(sf);
if (style.MaxLineCount <= 1)
sf.FormatFlags |= StringFormatFlags.NoWrap;
size = g.MeasureString(Text, style.Font, vsize, sf).ToSize();
}
}
size.Width++;
size.Height++;
if (style.MaxLineCount > 1)
{
int lineHeight = (int)(Math.Ceiling(style.Font.GetHeight())) * style.MaxLineCount;
if (size.Height > lineHeight)
size.Height = lineHeight;
}
}
_TextHeight = size.Height;
return (size);
}
#region GetMarkupTextSize
private Size GetMarkupTextSize(Graphics g,
BodyElement textMarkup, ChartTitleVisualStyle style, int width)
{
MarkupDrawContext d =
new MarkupDrawContext(g, style.Font, style.TextColor, false);
textMarkup.InvalidateElementsSize();
textMarkup.Measure(new Size(width, 0), d);
return (textMarkup.Bounds.Size);
}
#endregion
#endregion
#region AlignTitle
private Rectangle AlignTitle(
ChartLayoutInfo layoutInfo, Rectangle bounds, ChartTitleVisualStyle style)
{
Rectangle layoutBounds = layoutInfo.LayoutBounds;
switch (XyAlignment)
{
case XyAlignment.Left:
layoutInfo.LayoutBounds.X += Size.Width;
layoutInfo.LayoutBounds.Width -= Size.Width;
break;
case XyAlignment.Bottom:
bounds.Y = layoutBounds.Bottom - Size.Height;
layoutInfo.LayoutBounds.Height -= Size.Height;
break;
case XyAlignment.Right:
bounds.X = layoutBounds.Right - Size.Width;
layoutInfo.LayoutBounds.Width -= Size.Width;
break;
default:
layoutInfo.LayoutBounds.Y += Size.Height;
layoutInfo.LayoutBounds.Height -= Size.Height;
break;
}
if (XyAlignment == XyAlignment.Left || XyAlignment == XyAlignment.Right)
{
if (bounds.Height < layoutBounds.Height)
{
switch (style.Alignment)
{
case Alignment.TopCenter:
case Alignment.MiddleCenter:
case Alignment.BottomCenter:
bounds.Y += (layoutBounds.Height - bounds.Height) / 2;
break;
case Alignment.TopLeft:
case Alignment.MiddleLeft:
case Alignment.BottomLeft:
bounds.Y = layoutBounds.Bottom - bounds.Height;
break;
}
}
}
else
{
if (bounds.Width < layoutBounds.Width)
{
switch (style.Alignment)
{
case Alignment.TopCenter:
case Alignment.MiddleCenter:
case Alignment.BottomCenter:
bounds.X += (layoutBounds.Width - bounds.Width) / 2;
break;
case Alignment.TopRight:
case Alignment.MiddleRight:
case Alignment.BottomRight:
bounds.X = layoutBounds.Right - bounds.Width;
break;
}
}
}
return (bounds);
}
#endregion
#endregion
#region ArrangeOverride
protected override void ArrangeOverride(ChartLayoutInfo layoutInfo)
{
}
#endregion
#region RenderOverride
protected override void RenderOverride(ChartRenderInfo renderInfo)
{
Graphics g = renderInfo.Graphics;
Rectangle scFrameBounds = GetScrollBounds(_FrameBounds);
Rectangle scContentBounds = GetScrollBounds(_ContentBounds);
if (scFrameBounds.Height > 0 && scFrameBounds.Width > 0)
{
ChartTitleVisualStyle tstyle = EffectiveTitleStyle;
Rectangle rfb = scFrameBounds;
Rectangle rcb = scContentBounds;
RotateDegrees rotDegrees = GetRotateDegrees(tstyle);
if (rotDegrees != RotateDegrees.None)
{
TransformBounds(g, scFrameBounds, rotDegrees);
rfb = TranslateFrameBounds(scFrameBounds, rotDegrees);
rcb = TranslateContentBounds(scFrameBounds, scContentBounds, rotDegrees);
}
RenderBackground(g, rfb, tstyle);
RenderTextAndFigure(g, rfb, rcb, rotDegrees, tstyle);
if (rotDegrees != RotateDegrees.None)
g.ResetTransform();
tstyle.RenderBorder(g, scFrameBounds);
if (tstyle.DropShadow.Enabled == Tbool.True)
tstyle.DropShadow.RenderDropShadow(g, scFrameBounds, true, true);
}
}
#region TransformBounds
private void TransformBounds(Graphics g, Rectangle rfb, RotateDegrees rotDegrees)
{
switch (rotDegrees)
{
case RotateDegrees.Rotate90:
g.TranslateTransform(rfb.Right, rfb.Y);
g.RotateTransform(90);
break;
case RotateDegrees.Rotate180:
g.TranslateTransform(rfb.Right, rfb.Bottom);
g.RotateTransform(-180);
break;
case RotateDegrees.Rotate270:
g.TranslateTransform(rfb.X, rfb.Bottom);
g.RotateTransform(-90);
break;
}
}
#endregion
#region TranslateFrameBounds
private Rectangle TranslateFrameBounds(Rectangle rfb, RotateDegrees rotDegrees)
{
Rectangle tfb = new Rectangle(0, 0, rfb.Width, rfb.Height);
switch (rotDegrees)
{
case RotateDegrees.Rotate90:
case RotateDegrees.Rotate270:
tfb.Width = rfb.Height;
tfb.Height = rfb.Width;
break;
}
return (tfb);
}
#endregion
#region TranslateContentBounds
private Rectangle TranslateContentBounds(Rectangle rfb, Rectangle rcb, RotateDegrees rotDegrees)
{
Rectangle tcb = new Rectangle(rcb.X - rfb.X, rcb.Y - rfb.Y, rcb.Width, rcb.Height);
switch (rotDegrees)
{
case RotateDegrees.Rotate90:
int X = tcb.X;
tcb.X = tcb.Y;
tcb.Y = X;
tcb.Width = rcb.Height;
tcb.Height = rcb.Width;
break;
case RotateDegrees.Rotate270:
int X1 = tcb.X;
tcb.X = tcb.Y;
tcb.Y = X1;
tcb.Width = rcb.Height;
tcb.Height = rcb.Width;
break;
}
return (tcb);
}
#endregion
#region CalcImageBounds
private Rectangle CalcImageBounds(
Rectangle rfb, RotateDegrees rotDegrees, ChartTitleVisualStyle style)
{
if (style.BorderThickness.IsEmpty == false)
{
switch (rotDegrees)
{
case RotateDegrees.Rotate90:
rfb.X += Dpi.Height(style.BorderThickness.Top);
rfb.Width -= Dpi.Height(style.BorderThickness.Vertical);
rfb.Y += Dpi.Width(style.BorderThickness.Right);
rfb.Height -= Dpi.Width(style.BorderThickness.Horizontal);
break;
case RotateDegrees.Rotate270:
rfb.X += Dpi.Height(style.BorderThickness.Bottom);
rfb.Width -= Dpi.Height(style.BorderThickness.Vertical);
rfb.Y += Dpi.Width(style.BorderThickness.Left);
rfb.Height -= Dpi.Width(style.BorderThickness.Horizontal);
break;
case RotateDegrees.Rotate180:
rfb.X += Dpi.Width(style.BorderThickness.Right);
rfb.Width -= Dpi.Width(style.BorderThickness.Horizontal);
rfb.Y += Dpi.Height(style.BorderThickness.Bottom);
rfb.Height -= Dpi.Height(style.BorderThickness.Vertical);
break;
default:
rfb.X += Dpi.Width(style.BorderThickness.Left);
rfb.Width -= Dpi.Width(style.BorderThickness.Horizontal);
rfb.Y += Dpi.Height(style.BorderThickness.Top);
rfb.Height -= Dpi.Height(style.BorderThickness.Vertical);
break;
}
}
return (rfb);
}
#endregion
#region RenderBackground
private void RenderBackground(
Graphics g, Rectangle r, ChartTitleVisualStyle style)
{
if (r.Width > 2 && r.Height > 2)
{
using (Brush br = style.Background.GetBrush(r))
g.FillRectangle(br, r);
}
}
#endregion
#region RenderTextAndFigure
private void RenderTextAndFigure(Graphics g, Rectangle rfb,
Rectangle rcb, RotateDegrees rotDegrees, ChartTitleVisualStyle tstyle)
{
Rectangle rib = Rectangle.Empty;
object figure = tstyle.GetFigure();
if (figure != null)
{
rib = CalcImageBounds(rfb, rotDegrees, tstyle);
if (tstyle.ImageOverlay != ImageOverlay.Top)
RenderFigure(g, figure, rib, tstyle);
}
RenderText(g, rcb, tstyle);
if (figure != null)
{
if (tstyle.ImageOverlay == ImageOverlay.Top)
RenderFigure(g, figure, rib, tstyle);
}
}
#region RenderFigure
private void RenderFigure(Graphics g,
object figure, Rectangle r, ChartTitleVisualStyle tstyle)
{
Rectangle t = tstyle.GetFigureBounds(g, r);
t.Intersect(r);
if (t.Width > 0 && t.Height > 0)
{
SymbolDef sd = figure as SymbolDef;
if (sd != null && sd.IsValidSymbol == true)
{
using (Brush br = new SolidBrush(sd.SymbolColor))
g.DrawString(sd.SymbolRealized, sd.SymbolFont, br, t);
}
else
{
Image image = figure as Image;
if (image != null)
g.DrawImage(image, t);
}
}
}
#endregion
#region RenderText
private void RenderText(
Graphics g, Rectangle r, ChartTitleVisualStyle style)
{
if (r.Width > 0 && r.Height > 0)
{
string s = Text;
if (string.IsNullOrEmpty(s) == false)
{
if (TextMarkup != null)
{
RenderTextMarkup(g, r, style);
}
else
{
using (SolidBrush br = new SolidBrush(style.TextColor))
{
using (StringFormat sf = new StringFormat())
{
style.GetStringFormatFlags(sf);
if (style.MaxLineCount <= 1)
sf.FormatFlags |= StringFormatFlags.NoWrap;
if (r.Height > _TextHeight)
{
if (sf.LineAlignment == StringAlignment.Center)
{
r.Y += (r.Height - _TextHeight) / 2;
r.Height = _TextHeight;
}
}
g.DrawString(Text, style.Font, br, r, sf);
}
}
}
}
}
}
#region RenderTextMarkup
private void RenderTextMarkup(
Graphics g, Rectangle r, ChartTitleVisualStyle style)
{
MarkupDrawContext d =
new MarkupDrawContext(g, style.Font, style.TextColor, false);
TextMarkup.Arrange(r, d);
Size size = TextMarkup.Bounds.Size;
switch (style.Alignment)
{
case Alignment.MiddleLeft:
case Alignment.MiddleCenter:
case Alignment.MiddleRight:
if (r.Height > size.Height)
r.Y += (r.Height - size.Height) / 2;
break;
default:
if (r.Height > size.Height)
r.Y = r.Bottom - size.Height;
break;
}
TextMarkup.Bounds = new Rectangle(r.Location, size);
Region oldClip = g.Clip;
try
{
g.SetClip(r, CombineMode.Intersect);
TextMarkup.Render(d);
}
finally
{
g.Clip = oldClip;
}
}
#endregion
#endregion
#endregion
#endregion
#region GetRotateDegrees
private RotateDegrees GetRotateDegrees(ChartTitleVisualStyle style)
{
switch (RotateDegrees)
{
case RotateDegrees.Auto:
case RotateDegrees.NotSet:
switch (XyAlignment)
{
case XyAlignment.Left:
return (RotateDegrees.Rotate270);
case XyAlignment.Right:
return (RotateDegrees.Rotate90);
default:
return (RotateDegrees.None);
}
}
return (RotateDegrees);
}
#endregion
#region Style Support
#region ApplyStyles
public override void ApplyStyles(BaseVisualStyle style)
{
ChartTitleVisualStyle tstyle = style as ChartTitleVisualStyle;
if (tstyle != null)
{
ApplyParentStyles(tstyle, Parent as ChartContainer);
tstyle.ApplyStyle(ChartTitleVisualStyle);
tstyle.ApplyDefaults();
}
}
#endregion
#region ApplyParentStyles
private void ApplyParentStyles(ChartTitleVisualStyle tstyle, ChartContainer item)
{
if (item != null)
{
ApplyParentStyles(tstyle, item.Parent as ChartContainer);
if (item is ChartPanel)
tstyle.ApplyStyle(((ChartPanel)item).DefaultVisualStyles.ChartTitleVisualStyle);
}
else
{
tstyle.ApplyStyle(ChartControl.BaseVisualStyles.ChartTitleVisualStyle);
tstyle.ApplyStyle(ChartControl.DefaultVisualStyles.ChartTitleVisualStyle);
}
}
#endregion
#region InvalidateStyle
///<summary>
///Invalidate the cached Styles
///</summary>
public void InvalidateStyle()
{
ClearEffectiveStyles();
}
#endregion
#region ClearEffectiveStyles
protected override void ClearEffectiveStyles()
{
base.ClearEffectiveStyles();
_EffectiveTitleStyle.InvalidateStyle();
}
#endregion
#endregion
#region Copy/CopyTo
public override ChartVisualElement Copy()
{
ChartTitle copy = new ChartTitle();
CopyTo(copy);
return (copy);
}
public override void CopyTo(ChartVisualElement copy)
{
ChartTitle c = copy as ChartTitle;
if (c != null)
{
base.CopyTo(c);
c.ChartTitleVisualStyle =
(_ChartTitleVisualStyle != null) ? ChartTitleVisualStyle.Copy() : null;
c.RotateDegrees = RotateDegrees;
c.XyAlignment = XyAlignment;
}
}
#endregion
#region GetSerialData
internal override SerialElementCollection GetSerialData(string serialName)
{
SerialElementCollection sec = new SerialElementCollection();
if (serialName != null)
{
if (serialName.Equals("") == true)
serialName = "ChartTitle";
sec.AddStartElement(serialName);
}
if (_ChartTitleVisualStyle != null && _ChartTitleVisualStyle.IsEmpty == false)
sec.AddElement(_ChartTitleVisualStyle.GetSerialData("ChartTitleVisualStyle"));
sec.AddValue("RotateDegrees", RotateDegrees, RotateDegrees.NotSet);
sec.AddValue("XyAlignment", XyAlignment, XyAlignment.NotSet);
sec.AddElement(base.GetSerialData(null));
if (serialName != null)
sec.AddEndElement(serialName);
return (sec);
}
#endregion
#region PutSerialData
#region ProcessValue
internal override void ProcessValue(SerialElement se)
{
switch (se.Name)
{
case "RotateDegrees":
RotateDegrees = (RotateDegrees)se.GetValueEnum(typeof(RotateDegrees));
break;
case "XyAlignment":
XyAlignment = (XyAlignment)se.GetValueEnum(typeof(XyAlignment));
break;
default:
base.ProcessValue(se);
break;
}
}
#endregion
#region ProcessCollection
internal override void ProcessCollection(SerialElement se)
{
SerialElementCollection sec = se.Sec;
switch (se.Name)
{
case "ChartTitleVisualStyle":
sec.PutSerialData(ChartTitleVisualStyle);
break;
default:
base.ProcessCollection(se);
break;
}
}
#endregion
#endregion
#region States
[Flags]
private enum States : uint
{
}
#region TestState
private bool TestState(States state)
{
return ((_States & state) == state);
}
#endregion
#region SetState
private void SetState(States state, bool value)
{
if (value == true)
_States |= state;
else
_States &= ~state;
}
#endregion
#endregion
#region IDisposable
public override void Dispose()
{
ChartTitleVisualStyle = null;
base.Dispose();
}
#endregion
}
}