1506 lines
39 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using DevComponents.DotNetBar.Charts.Style;
namespace DevComponents.DotNetBar.Charts
{
/// <summary>
/// Represents an item in the chart Legend.
/// </summary>
public class ChartLegendItem : ChartVisualElement
{
#region Private variables
private States _States;
private List<ILegendItem> _ChartItems;
private ChartLegendItem _LikeItem;
private Tbool _ShowCheckBox = Tbool.NotSet;
private Tbool _ShowItemText = Tbool.NotSet;
private Tbool _ShowMarker = Tbool.NotSet;
private Tbool _ShowInParentLegend = Tbool.NotSet;
private ChartLegendItemVisualStyles _ChartLegendItemVisualStyles;
private EffectiveStyles<ChartLegendItemVisualStyle> _EffectiveStyles;
private Size _MarkerSize;
private Size _TextSize;
private Rectangle _MarkerBounds;
private string _ItemText;
private string _FormattedText;
private LegendItemArea _HitArea;
private LegendItemArea _MouseDownHitArea;
private CheckState _CheckState = CheckState.Unchecked;
private bool _InCheckStateUpdate;
#endregion
public ChartLegendItem()
{
InitDefaultStates();
_EffectiveStyles = new EffectiveStyles<ChartLegendItemVisualStyle>(this);
}
#region InitDefaultStates
private void InitDefaultStates()
{
SetState(States.IsEnabled, true);
}
#endregion
#region Public properties
#region ChartItems
/// <summary>
/// Gets or sets the referenced Chart items.
/// </summary>
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List<ILegendItem> ChartItems
{
get
{
if (_ChartItems == null)
_ChartItems = new List<ILegendItem>();
return (_ChartItems);
}
set
{
if (value != ChartItems)
{
_ChartItems = value;
OnPropertyChangedEx("ChartItems", VisualChangeType.Layout);
}
}
}
#endregion
#region ChartLegendItemVisualStyles
/// <summary>
/// Gets or sets the visual styles for the Legend item.
/// </summary>
[Category("Style")]
[Description("Indicates the visual styles for the Legend item.")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ChartLegendItemVisualStyles ChartLegendItemVisualStyles
{
get
{
if (_ChartLegendItemVisualStyles == null)
{
_ChartLegendItemVisualStyles = new ChartLegendItemVisualStyles();
StyleVisualChangeHandler(null, _ChartLegendItemVisualStyles);
}
return (_ChartLegendItemVisualStyles);
}
set
{
if (_ChartLegendItemVisualStyles != value)
{
ChartLegendItemVisualStyles oldValue = _ChartLegendItemVisualStyles;
_ChartLegendItemVisualStyles = value;
OnStyleChanged("ChartLegendItemVisualStyles", oldValue, value);
if (oldValue != null)
oldValue.Dispose();
}
}
}
#endregion
#region CheckState
/// <summary>
/// Gets or sets whether the item's checkbox is checked.
/// </summary>
[DefaultValue(CheckState.Unchecked), Category("Appearance")]
[Description("Indicates whether the item's checkbox is checked.")]
public CheckState CheckState
{
get { return (_CheckState); }
set
{
if (value != _CheckState)
{
_CheckState = value;
UpdateChartItemsCheckState();
OnPropertyChangedEx("CheckState", VisualChangeType.Render);
}
}
}
#endregion
#region EffectiveStyles
/// <summary>
/// Gets a reference to the item's Effective (cached, composite) styles.
/// </summary>
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public EffectiveStyles<ChartLegendItemVisualStyle> EffectiveStyles
{
get { return (_EffectiveStyles); }
}
#endregion
#region ItemText
/// <summary>
/// Gets or sets the item Text.
/// </summary>
[DefaultValue(null), Category("Appearance")]
[Description("Indicates the item Text.")]
public string ItemText
{
get { return (_ItemText); }
set
{
if (value != _ItemText)
{
_ItemText = value;
OnPropertyChangedEx("ItemText", VisualChangeType.Layout);
}
}
}
#endregion
#region ItemTextBounds
/// <summary>
/// Gets the Item's Text bounds
/// </summary>
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Rectangle ItemTextBounds
{
get
{
Rectangle bounds = Bounds;
int n = _MarkerSize.Width + Dpi.Width(Legend.ItemTextOffset);
bounds.X += n;
bounds.Width -= n;
return (bounds);
}
}
#endregion
#region Legend
/// <summary>
/// Gets the associated ChartLegend
/// </summary>
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ChartLegend Legend
{
get { return (Parent as ChartLegend); }
}
#endregion
#region MarkerBounds
/// <summary>
/// Gets the Marker bounds
/// </summary>
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Rectangle MarkerBounds
{
get { return (_MarkerBounds); }
}
#endregion
#region ShowCheckBox
/// <summary>
/// Gets or sets whether the item CheckBox is shown in the Legend.
/// </summary>
[DefaultValue(Tbool.NotSet), Category("Appearance")]
[Description("Indicates whether the item CheckBox is shown in the Legend.")]
public Tbool ShowCheckBox
{
get { return (_ShowCheckBox); }
set
{
if (value != _ShowCheckBox)
{
_ShowCheckBox = value;
OnPropertyChangedEx("ShowCheckBox", VisualChangeType.Layout);
}
}
}
#endregion
#region ShowInParentLegend
/// <summary>
/// Gets or sets whether the item is shown in parent Legend(s).
/// </summary>
[DefaultValue(Tbool.NotSet), Category("Layout")]
[Description("Indicates whether the item is shown in parent Legend(s).")]
public Tbool ShowInParentLegend
{
get { return (_ShowInParentLegend); }
set
{
if (value != _ShowInParentLegend)
{
_ShowInParentLegend = value;
OnPropertyChangedEx("ShowInParentLegend", VisualChangeType.Layout);
}
}
}
#endregion
#region ShowItemText
/// <summary>
/// Gets or sets whether the item text is shown in the Legend.
/// </summary>
[DefaultValue(Tbool.NotSet), Category("Appearance")]
[Description("Indicates whether the item text is shown in the Legend.")]
public Tbool ShowItemText
{
get { return (_ShowItemText); }
set
{
if (value != _ShowItemText)
{
_ShowItemText = value;
OnPropertyChangedEx("ShowItemText", VisualChangeType.Layout);
}
}
}
#endregion
#region ShowMarker
/// <summary>
/// Gets or sets whether the item Marker is shown in the Legend.
/// </summary>
[DefaultValue(Tbool.NotSet), Category("Appearance")]
[Description("Indicates whether the item Marker is shown in the Legend.")]
public Tbool ShowMarker
{
get { return (_ShowMarker); }
set
{
if (value != _ShowMarker)
{
_ShowMarker = value;
OnPropertyChangedEx("ShowMarker", VisualChangeType.Layout);
}
}
}
#endregion
#endregion
#region Internal properties
#region FormattedText
internal string FormattedText
{
get { return (_FormattedText); }
set { _FormattedText = value; }
}
#endregion
#region IsEnabled
internal bool IsEnabled
{
get { return (TestState(States.IsEnabled)); }
set { SetState(States.IsEnabled, value); }
}
#endregion
#region IsHitItem
internal bool IsHitItem
{
get { return (TestState(States.IsHitItem)); }
set { SetState(States.IsHitItem, value); }
}
#endregion
#region IsLegendHitItem
internal bool IsLegendHitItem
{
get { return (TestState(States.IsLegendHitItem)); }
set { SetState(States.IsLegendHitItem, value); }
}
#endregion
#region LikeItem
internal ChartLegendItem LikeItem
{
get { return (_LikeItem ?? this); }
set { _LikeItem = value; }
}
#endregion
#region TextWrapped
internal bool TextWrapped
{
get { return (TestState(States.TextWrapped)); }
set { SetState(States.TextWrapped, value); }
}
#endregion
#endregion
#region MeasureOverride
protected override void MeasureOverride(ChartLayoutInfo layoutInfo)
{
BoundsRelative = layoutInfo.LayoutBounds;
ChartLegend cl = Parent as ChartLegend;
if (cl != null)
{
Size sizeNeeded = Size.Empty;
Rectangle layoutBounds = layoutInfo.LayoutBounds;
ChartLegendItemVisualStyle style = EffectiveStyles[StyleType.Default];
if (cl.ShowMarkers == true || cl.ShowCheckBoxes == true)
{
Size size = MeasureMarker(layoutInfo, cl);
sizeNeeded.Width += (size.Width + Dpi.Width2);
if (cl.ShowItemText == true)
sizeNeeded.Width += Dpi.Width(cl.ItemTextOffset);
sizeNeeded.Height = size.Height;
layoutInfo.LayoutBounds.Width -= sizeNeeded.Width;
}
_TextSize = Size.Empty;
if (cl.ShowItemText == true)
{
Size size = MeasureItemText(layoutInfo, cl, style);
sizeNeeded.Width += size.Width;
if (size.Height > sizeNeeded.Height)
sizeNeeded.Height = size.Height;
}
layoutInfo.LayoutBounds = layoutBounds;
Size = sizeNeeded;
}
}
#region MeasureMarker
private Size MeasureMarker(ChartLayoutInfo layoutInfo, ChartLegend legend)
{
_MarkerSize = Size.Empty;
if (legend.ShowCheckBoxes == true)
_MarkerSize = Dpi.Size(legend.CheckBoxSize);
if (legend.ShowMarkers == true)
{
Size msize = Dpi.Size(legend.MarkerSize);
_MarkerSize.Width = Math.Max(_MarkerSize.Width, msize.Width);
_MarkerSize.Height = Math.Max(_MarkerSize.Height, msize.Height);
}
return (_MarkerSize);
}
#endregion
#region MeasureItemText
private Size MeasureItemText(
ChartLayoutInfo layoutInfo, ChartLegend legend, ChartLegendItemVisualStyle style)
{
if (legend.ShowItemText == true && (ShowItemText != Tbool.False))
{
Graphics g = layoutInfo.Graphics;
string text = GetItemText();
if (string.IsNullOrEmpty(text) == false)
{
using (StringFormat sf = new StringFormat())
{
style.GetStringFormatFlags(sf);
Size size = layoutInfo.LayoutBounds.Size;
_TextSize = g.MeasureString(text, style.Font, size, sf).ToSize();
}
}
_TextSize.Width++;
_TextSize.Height++;
TextWrapped = false;
if (style.MaxLineCount > 1)
{
if (_TextSize.Height > style.Font.Height + 2)
{
if (text.Contains("\n") == false)
TextWrapped = true;
}
int lineHeight = style.Font.Height * style.MaxLineCount;
if (_TextSize.Height > lineHeight)
_TextSize.Height = lineHeight;
}
}
return (_TextSize);
}
#endregion
#endregion
#region ArrangeOverride
protected override void ArrangeOverride(ChartLayoutInfo layoutInfo)
{
BoundsRelative = layoutInfo.LayoutBounds;
Rectangle bounds = Bounds;
_MarkerBounds = bounds;
_MarkerBounds.X += Dpi.Width2;
if (_MarkerSize.IsEmpty == false)
{
_MarkerBounds.Size = _MarkerSize;
ChartLegend legend = Legend;
if (legend != null)
{
if (bounds.Height > _MarkerBounds.Height)
_MarkerBounds.Y += (bounds.Height - _MarkerBounds.Height) / 2;
}
}
else
{
_MarkerBounds.Size = Size.Empty;
}
}
#endregion
#region RenderOverride
protected override void RenderOverride(ChartRenderInfo renderInfo)
{
ChartLegend legend = Parent as ChartLegend;
if (legend != null)
{
Graphics g = renderInfo.Graphics;
Rectangle bounds = Bounds;
bool showCheckBoxes = (CanShowCheckBox(legend) == true);
StyleState state = (IsMouseOver == true || IsHitItem == true)
? StyleState.MouseOver : StyleState.Default;
if (showCheckBoxes == true)
{
if (CheckState != CheckState.Unchecked)
state |= StyleState.Selected;
}
ChartLegendItemVisualStyle istyle = EffectiveStyles[state];
Color dcolor = GetLegendItemColor(legend, istyle);
if (istyle.Background.IsEmpty == false)
{
using (Brush br = istyle.Background.GetBrush(bounds))
g.FillRectangle(br, bounds);
}
if (_MarkerSize.IsEmpty == false)
{
if (CanShowCheckBox(legend) == true)
RenderCheckBox(g, istyle, dcolor);
else if (CanShowMarker(legend) == true)
RenderMarker(g, istyle);
int n = _MarkerSize.Width;
if (_TextSize.IsEmpty == false)
n += Dpi.Width(legend.ItemTextOffset);
bounds.X += n;
bounds.Width -= n;
}
if (_TextSize.IsEmpty == false)
RenderItemText(g, bounds, istyle, dcolor);
}
}
#region RenderCheckBox
private void RenderCheckBox(Graphics g,
ChartLegendItemVisualStyle istyle, Color dcolor)
{
if (_HitArea != LegendItemArea.CheckBox)
istyle = EffectiveStyles[StyleState.Default];
Rectangle r = _MarkerBounds;
r.Inflate(-1, -1);
Background background = istyle.CheckBoxBackground;
if (background.IsEmpty == false)
{
using (Brush br = background.GetBrush(r))
g.FillRectangle(br, r);
}
Color color = GetCheckBoxBorderColor(istyle, dcolor);
using (Pen pen = new Pen(color, Dpi.Width1))
g.DrawRectangle(pen, r);
color = GetCheckBoxCheckColor(istyle, dcolor);
Rectangle t = r;
t.Inflate(-Dpi.Width2, -Dpi.Width2);
float fx = (float)t.Width / Dpi.Width9;
float fy = (float)t.Height / Dpi.Width9;
switch (_CheckState)
{
case CheckState.Checked:
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.AntiAlias;
Point pt1 = new Point(t.X + (int)(fx), t.Y + (int)(fy * Dpi.Width4));
Point pt2 = new Point(t.X + (int)(fx * Dpi.Width3), t.Bottom - Dpi.Width2);
Point pt3 = new Point(t.Right - Dpi.Width1, t.Y + (int)fy);
using (Pen pen = new Pen(color, Dpi.Width2))
g.DrawLines(pen, new Point[] { pt1, pt2, pt3 });
g.SmoothingMode = sm;
break;
case CheckState.Indeterminate:
Rectangle z = t;
z.Inflate(-(int)fx, -(int)fy);
z.Width += Dpi.Width1;
z.Height += Dpi.Width1;
using (Brush br = new SolidBrush(color))
g.FillRectangle(br, z);
break;
}
}
#region GetCheckBoxCheckColor
private Color GetCheckBoxCheckColor(
ChartLegendItemVisualStyle istyle, Color dcolor)
{
Color color = istyle.CheckBoxCheckColor;
if (color.IsEmpty == true)
color = dcolor;
return (color);
}
#endregion
#region GetCheckBoxBorderColor
private Color GetCheckBoxBorderColor(
ChartLegendItemVisualStyle istyle, Color dcolor)
{
Color color = istyle.CheckBoxBorderColor;
if (color.IsEmpty == true)
color = dcolor;
return (color);
}
#endregion
#endregion
#region RenderMarker
private void RenderMarker(Graphics g, ChartLegendItemVisualStyle istyle)
{
if (istyle.MarkerVisualStyle.IsEmpty == false)
{
Color color = GetLegendItemColor(Legend, istyle);
istyle.MarkerVisualStyle.RenderMarker(g, Legend.PointMarker, MarkerBounds, color);
}
else
{
if (ChartItems.Count > 0)
{
ILegendItem item = ChartItems[0];
item.RenderLegendItemMarker(g, this, istyle);
}
}
}
#endregion
#region RenderItemText
private void RenderItemText(Graphics g,
Rectangle bounds, ChartLegendItemVisualStyle istyle, Color dcolor)
{
bounds.Y++;
string text = GetItemText();
using (StringFormat sf = new StringFormat())
{
istyle.GetStringFormatFlags(sf);
Color color = istyle.TextColor;
if (color.IsEmpty == true)
color = dcolor;
using (Brush br = new SolidBrush(color))
g.DrawString(text, istyle.Font, br, bounds, sf);
}
}
#endregion
#region GetLegendItemColor
private Color GetLegendItemColor(ChartLegend legend, ChartLegendItemVisualStyle istyle)
{
if (IsEnabled == true)
{
Color color = istyle.TextColor;
if (color.IsEmpty == false)
return (color);
if (ChartItems.Count > 0)
{
color = ChartItems[0].LegendItem.EffectiveStyles[StyleType.Default].TextColor;
if (color.IsEmpty == true)
color = ChartItems[0].GetLegendItemColor();
}
if (color.IsEmpty == true)
color = Color.DimGray;
else
color = Color.FromArgb(255, color);
return (color);
}
else
{
Color color = istyle.DisabledTextColor;
if (color.IsEmpty == true)
color = Color.Silver;
return (color);
}
}
#endregion
#endregion
#region Mouse handling
#region OnMouseEnter
protected override bool OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
InvalidateRender();
InvalidateChartItems(true);
return (true);
}
#endregion
#region OnMouseLeave
protected override bool OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
InvalidateRender();
InvalidateChartItems(false);
return (true);
}
#endregion
#region InvalidateChartItems
private void InvalidateChartItems(bool isHitItem)
{
IsLegendHitItem = isHitItem;
foreach (ILegendItem item in ChartItems)
{
ILegendItemEx itemEx = item as ILegendItemEx;
if (itemEx != null)
{
if (itemEx.TrackLegendItem == true)
{
if (item is PieRing)
{
PieRing pieRing = (PieRing)item;
foreach (PieSeriesPoint psp in pieRing.Psps)
{
psp.LegendItem.IsLegendHitItem = isHitItem;
psp.InvalidateRender();
}
}
else
{
item.LegendItem.IsLegendHitItem = isHitItem;
itemEx.InvalidateRender();
}
}
}
}
}
#endregion
#region OnMouseMove
protected override bool OnMouseMove(MouseEventArgs e)
{
LegendItemArea area = GetItemAreaAt(e.Location);
if (_HitArea != area)
InvalidateRender();
_HitArea = area;
if (_HitArea == LegendItemArea.CheckBox)
{
ChartCursor = Cursors.Hand;
return (true);
}
return (false);
}
#endregion
#region OnMouseDown
protected override bool OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
_MouseDownHitArea = _HitArea;
if (_HitArea == LegendItemArea.CheckBox)
{
ChartControl.CapturedItem = this;
return (true);
}
return (false);
}
#endregion
#region OnMouseUp
protected override bool OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
if (_HitArea == LegendItemArea.CheckBox &&
_MouseDownHitArea == LegendItemArea.CheckBox)
{
switch (CheckState)
{
case CheckState.Checked:
CheckState = CheckState.Unchecked;
break;
default:
CheckState = CheckState.Checked;
break;
}
ChartControl.CapturedItem = null;
InvalidateDisplay();
}
return (true);
}
#region UpdateChartItemsCheckState
private void UpdateChartItemsCheckState()
{
if (_InCheckStateUpdate == false)
{
_InCheckStateUpdate = true;
if (CheckState != CheckState.Indeterminate)
{
foreach (ILegendItem item in ChartItems)
item.CheckedInLegend = (CheckState == CheckState.Checked);
}
if (ChartControl != null)
ChartControl.DoLegendItemCheckedChangedEvent(Legend, this);
_InCheckStateUpdate = false;
}
}
#endregion
#endregion
#endregion
#region GetItemText
private string GetItemText()
{
string text = GetItemTextEx();
if (string.IsNullOrEmpty(text) == false)
{
if (ChartItems.Count > 0)
{
if (ChartItems[0] is ILegendItemEx)
{
ILegendItemEx itemEx = (ILegendItemEx)ChartItems[0];
text = itemEx.FormatItemText(text);
}
}
}
return (text);
}
#region GetItemTextEx
private string GetItemTextEx()
{
if (String.IsNullOrEmpty(_ItemText) == false)
return (_ItemText);
foreach (ILegendItem item in _ChartItems)
{
if (String.IsNullOrEmpty(item.LegendText) == false)
return (item.LegendText);
}
if (_ChartItems.Count > 0)
{
if (String.IsNullOrEmpty(_ChartItems[0].Name) == false)
return (_ChartItems[0].Name);
}
if (String.IsNullOrEmpty(Name) == false)
return (Name);
return ("");
}
#endregion
#endregion
#region GetItemAreaAt
private LegendItemArea GetItemAreaAt(Point pt)
{
if (Bounds.Contains(pt) == true)
{
if (_MarkerBounds.Contains(pt))
{
ChartLegend legend = Parent as ChartLegend;
if (CanShowCheckBox(legend) == true)
return (LegendItemArea.CheckBox);
return (LegendItemArea.Marker);
}
if (pt.X > _MarkerBounds.Right)
return (LegendItemArea.ItemText);
}
return (LegendItemArea.None);
}
#endregion
#region Style Support
#region ApplyStyles
public override void ApplyStyles(BaseVisualStyle style, StyleType cs)
{
ChartLegendItemVisualStyle lstyle = style as ChartLegendItemVisualStyle;
if (lstyle != null)
{
ApplyParentStyles(lstyle, cs, Parent as ChartVisualElement);
lstyle.ApplyStyle(ChartLegendItemVisualStyles[cs]);
if (ChartItems.Count > 0 && ChartItems[0] != null)
lstyle.ApplyStyle(ChartItems[0].ChartLegendItemVisualStyles[cs]);
}
}
#region ApplyParentStyles
private void ApplyParentStyles(
ChartLegendItemVisualStyle lstyle, StyleType cs, ChartVisualElement item)
{
if (item != null)
{
ApplyParentStyles(lstyle, cs, item.Parent as ChartVisualElement);
if (item is ChartLegend)
lstyle.ApplyStyle(((ChartLegend)item).ChartLegendItemVisualStyles[cs]);
else if (item is ChartPanel)
lstyle.ApplyStyle(((ChartPanel)item).DefaultVisualStyles.ChartLegendItemVisualStyles[cs]);
}
else
{
lstyle.ApplyStyle(ChartControl.BaseVisualStyles.ChartLegendItemVisualStyles[cs]);
lstyle.ApplyStyle(ChartControl.DefaultVisualStyles.ChartLegendItemVisualStyles[cs]);
}
}
#endregion
#endregion
#region ApplyDefaults
public override void ApplyDefaults(BaseVisualStyle style, StyleType cs)
{
ChartLegendItemVisualStyle lstyle = style as ChartLegendItemVisualStyle;
if (lstyle != null)
{
if (lstyle.MaxLineCount <= 0)
lstyle.MaxLineCount = 2;
if (lstyle.Font == null)
lstyle.Font = SystemFonts.DefaultFont;
}
base.ApplyDefaults(style, cs);
}
#endregion
#region InvalidateStyle
///<summary>
///Invalidate the cached Styles
///</summary>
public void InvalidateStyle()
{
ClearEffectiveStyles();
}
#endregion
#region ClearEffectiveStyles
protected override void ClearEffectiveStyles()
{
base.ClearEffectiveStyles();
EffectiveStyles.InvalidateStyles();
}
#endregion
#endregion
#region InvalidateDisplay
private void InvalidateDisplay()
{
ChartContainer cc = ParentChartContainer;
if (cc != null)
{
cc.InvalidateRender(GetScrollBounds(cc.ContentBounds));
cc.InvalidateLayoutBounds(null);
}
while (cc != null)
{
ILegendData ld = cc as ILegendData;
if (ld != null)
{
ChartLegend legend = ld.Legend;
if (legend != null)
{
if (CanShowInParentLegend(legend) == true)
legend.InvalidateItem(this);
}
}
cc = cc.ParentChartContainer;
}
}
#endregion
#region UpdateCheckState
internal void UpdateCheckState()
{
if (_InCheckStateUpdate == false)
{
_InCheckStateUpdate = true;
if (ChartItems.Count > 0)
{
CheckState checkState = CheckState.Unchecked;
for (int i = 0; i < ChartItems.Count; i++)
{
ILegendItem chartItem = ChartItems[i];
CheckState ics = chartItem.CheckedInLegend ? CheckState.Checked : CheckState.Unchecked;
if (i == 0)
{
checkState = ics;
}
else
{
if (checkState != ics)
{
checkState = CheckState.Indeterminate;
break;
}
}
}
if (CheckState != checkState)
{
CheckState = checkState;
InvalidateDisplay();
}
}
_InCheckStateUpdate = false;
}
}
#endregion
#region CanShowCheckBox
private bool CanShowCheckBox(ChartLegend legend)
{
if (legend.ShowCheckBoxes == true)
{
if (ShowCheckBox != Tbool.NotSet)
{
bool show = (ShowCheckBox == Tbool.False ? false : true);
if (ChartItems.Count > 0)
ChartItems[0].ShowCheckBoxInLegend = show;
return (show);
}
if (ChartItems.Count > 0)
return (ChartItems[0].ShowCheckBoxInLegend);
return (true);
}
return (false);
}
#endregion
#region CanShowMarker
private bool CanShowMarker(ChartLegend legend)
{
if (legend.ShowMarkers == true)
{
if (ShowMarker == Tbool.NotSet)
{
if (ChartItems.Count > 0)
return (ChartItems[0].ShowMarkerInLegend);
}
return (ShowMarker == Tbool.False ? false : true);
}
return (false);
}
#endregion
#region CanShowInParentLegend
private bool CanShowInParentLegend(ChartLegend legend)
{
if (ChartItems.Count > 0)
{
if (ShowInParentLegend == Tbool.NotSet)
return (ChartItems[0].ShowInParentLegend);
return (ShowInParentLegend == Tbool.False ? false : true);
}
return (false);
}
#endregion
#region Copy/CopyTo
public override ChartVisualElement Copy()
{
ChartLegendItem copy = new ChartLegendItem();
CopyTo(copy);
return (copy);
}
public override void CopyTo(ChartVisualElement copy)
{
ChartLegendItem c = copy as ChartLegendItem;
if (c != null)
{
base.CopyTo(c);
c.ChartLegendItemVisualStyles =
(_ChartLegendItemVisualStyles != null) ? ChartLegendItemVisualStyles.Copy() : null;
c.CheckState = CheckState;
c.ItemText = ItemText;
c.ShowCheckBox = ShowCheckBox;
c.ShowInParentLegend = ShowInParentLegend;
c.ShowItemText = ShowItemText;
c.ShowMarker = ShowMarker;
}
}
#endregion
#region GetSerialData
internal override SerialElementCollection GetSerialData(string serialName)
{
SerialElementCollection sec = new SerialElementCollection();
if (serialName != null)
{
if (serialName.Equals("") == true)
serialName = "BaseChart";
sec.AddStartElement(serialName);
}
if (_ChartLegendItemVisualStyles != null)
sec.AddElement(_ChartLegendItemVisualStyles.GetSerialData("ChartLegendItemVisualStyles"));
sec.AddValue("CheckState", CheckState, CheckState.Unchecked);
sec.AddValue("ItemText", ItemText, null);
sec.AddValue("ShowCheckBox", ShowCheckBox, Tbool.NotSet);
sec.AddValue("ShowInParentLegend", ShowInParentLegend, Tbool.NotSet);
sec.AddValue("ShowItemText", ShowItemText, Tbool.NotSet);
sec.AddValue("ShowMarker", ShowMarker, Tbool.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 "CheckState":
CheckState = (CheckState)se.GetValueEnum(typeof(CheckState));
break;
case "ItemText":
ItemText = se.StringValue;
break;
case "ShowCheckBox":
ShowCheckBox = (Tbool)se.GetValueEnum(typeof(Tbool));
break;
case "ShowInParentLegend":
ShowInParentLegend = (Tbool)se.GetValueEnum(typeof(Tbool));
break;
case "ShowItemText":
ShowItemText = (Tbool)se.GetValueEnum(typeof(Tbool));
break;
case "ShowMarker":
ShowMarker = (Tbool)se.GetValueEnum(typeof(Tbool));
break;
default:
base.ProcessValue(se);
break;
}
}
#endregion
#region ProcessCollection
internal override void ProcessCollection(SerialElement se)
{
SerialElementCollection sec = se.Sec;
switch (se.Name)
{
case "ChartLegendItemVisualStyles":
sec.PutSerialData(ChartLegendItemVisualStyles);
break;
default:
base.ProcessCollection(se);
break;
}
}
#endregion
#endregion
#region States
[Flags]
private enum States : uint
{
IsEnabled = (1U << 0),
IsHitItem = (1 << 1),
IsLegendHitItem = (1 << 2),
TextWrapped = (1U << 3),
}
#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()
{
ChartLegendItemVisualStyles = null;
base.Dispose();
}
#endregion
}
#region enums
#region LegendItemArea
public enum LegendItemArea
{
None = 0,
CheckBox,
ItemText,
Marker,
}
#endregion
#endregion
#region Interfaces
#region ILegendItem
public interface ILegendItem
{
string Name { get; set; }
string LegendText { get; set; }
ChartLegendItem LegendItem { get; }
ChartLegendItem GetLegendItem();
List<ChartLegendItem> GetLegendItems();
Color GetLegendItemColor();
bool ShowInLegend { get; set; }
bool ShowInParentLegend { get; set; }
bool ShowCheckBoxInLegend { get; set; }
bool ShowMarkerInLegend { get; set; }
bool CheckedInLegend { get; set; }
void RenderLegendItemMarker(Graphics g, ChartLegendItem item, ChartLegendItemVisualStyle style);
ChartLegendItemVisualStyles ChartLegendItemVisualStyles { get; set; }
}
#endregion
#region ILegendItem
internal interface ILegendItemEx
{
bool TrackLegendItem { get; }
void InvalidateRender();
string FormatItemText(string text);
}
#endregion
#endregion
}