using System; using System.Collections.Generic; using System.Drawing; using DevComponents.DotNetBar.Charts.Style; namespace DevComponents.DotNetBar.Charts { /// /// Provides helpers when working with EffectiveStyles. /// public class EffectiveStyles where T : BaseVisualStyle, new() { #region Private variables private IEffectiveStyle _ChartElement; private VisualStyles _Styles = new VisualStyles(); private ushort[] _StyleUpdateCount; private ushort[] _GlobalStyleUpdateCount; private List[] _StyleList; #endregion public EffectiveStyles(IEffectiveStyle chartElement) { _ChartElement = chartElement; int len = Enum.GetValues(typeof(StyleType)).Length - 1; _StyleUpdateCount = new ushort[len]; _GlobalStyleUpdateCount = new ushort[len]; _StyleList = new List[len]; for (int i = 0; i < len; i++) { _StyleUpdateCount[i] = ushort.MaxValue; _GlobalStyleUpdateCount[i] = ushort.MaxValue; } } #region Public properties #region StyleType Indexer public T this[StyleType type] { get { return (GetEffectiveStyle(type)); } } #endregion #region StyleState Indexer public T this[StyleState state] { get { return (GetEffectiveStyle(state)); } } #endregion #endregion #region GetEffectiveStyle internal T GetEffectiveStyle(StyleType type) { return (GetStyle(type)); } internal T GetEffectiveStyle(StyleState state) { if (_ChartElement.ChartControl.DesignerHosted == true) state &= ~(StyleState.MouseOver | StyleState.Selected); switch (state) { case StyleState.MouseOver: return (GetStyle(StyleType.MouseOver)); case StyleState.Selected: return (GetStyle(StyleType.Selected)); case StyleState.Selected | StyleState.MouseOver: return (GetStyle(StyleType.SelectedMouseOver)); default: return (GetStyle(StyleType.Default)); } } #endregion #region GetStyle internal T GetStyle(StyleType e) { VisualStyles cvs = _Styles; if (cvs == null) cvs = new VisualStyles(); int styleIndex = cvs.StyleIndex(e); ushort styleUpdateCount = _StyleUpdateCount[styleIndex]; ushort globalUpdateCount = _ChartElement.ChartControl.GlobalUpdateCount; T style = cvs.Style(e); if (_GlobalStyleUpdateCount[styleIndex] != globalUpdateCount) { if (style != null) styleUpdateCount = GetStyleUpdateCount(styleIndex); } if (style == null || _StyleUpdateCount[styleIndex] != styleUpdateCount) { style = new T(); if (_StyleList[styleIndex] == null) _StyleList[styleIndex] = new List(); _StyleList[styleIndex].Clear(); style.StyleType = e; style.StyleList = _StyleList[styleIndex]; style.StyleUpdateMode = StyleUpdateMode.UpdateCount; StyleType[] css = style.GetApplyStyleTypes(e); if (css != null) { foreach (StyleType cs in css) _ChartElement.ApplyStyles(style, cs); } style.StyleUpdateMode = StyleUpdateMode.None; _ChartElement.ApplyDefaults(style, e); style.StyleUpdateMode = (StyleUpdateMode.UpdateCount | StyleUpdateMode.Notify); BaseVisualStyle vstyle = (BaseVisualStyle)style; _ChartElement.GetElementStyle(_ChartElement, e, ref vstyle); _StyleUpdateCount[styleIndex] = GetStyleUpdateCount(styleIndex); style.StyleList = null; cvs[e] = style; _Styles = cvs; } _GlobalStyleUpdateCount[styleIndex] = globalUpdateCount; return (cvs[e]); } #region GetStyleUpdateCount private ushort GetStyleUpdateCount(int styleIndex) { ushort styleCount = 0; List slist = _StyleList[styleIndex]; if (slist != null) { foreach (BaseVisualStyle style in slist) styleCount += style.StyleUpdateCount; } return (styleCount); } #endregion #endregion #region InvalidateStyle public bool InvalidateStyle(StyleType type) { if (_Styles != null) { if (_Styles[type] != null) { _Styles[type].Dispose(); _Styles[type] = null; return (true); } } return (false); } #endregion #region InvalidateStyles public void InvalidateStyles() { if (_Styles != null) { _Styles.Dispose(); _Styles = null; } } #endregion } /// /// Provides helpers when working with EffectiveStyle. /// public class EffectiveStyle where T : BaseVisualStyle, new() { #region Private variables private IEffectiveStyle _ChartElement; private T _Style; private ushort _StyleUpdateCount = ushort.MaxValue; private ushort _GlobalStyleUpdateCount = ushort.MaxValue; private List _StyleList = new List(); #endregion public EffectiveStyle(IEffectiveStyle chartElement) { _ChartElement = chartElement; } #region Style internal T Style { get { ushort styleUpdateCount = _StyleUpdateCount; ushort globalUpdateCount = _ChartElement.ChartControl.GlobalUpdateCount; if (_GlobalStyleUpdateCount != globalUpdateCount) { if (_Style != null) styleUpdateCount = GetStyleUpdateCount(); } if (_Style == null || _StyleUpdateCount != styleUpdateCount) { T style = new T(); _StyleList.Clear(); style.StyleList = _StyleList; style.StyleType = StyleType.Default; _ChartElement.ApplyStyles(style); _ChartElement.ApplyDefaults(style, StyleType.Default); BaseVisualStyle vstyle = (BaseVisualStyle)style; _ChartElement.GetElementStyle(_ChartElement, StyleType.Default, ref vstyle); _StyleUpdateCount = GetStyleUpdateCount(); style.StyleList = null; _Style = style; } _GlobalStyleUpdateCount = globalUpdateCount; return (_Style); } } #region GetStyleUpdateCount private ushort GetStyleUpdateCount() { ushort styleCount = 0; List slist = _StyleList; if (slist != null) { foreach (BaseVisualStyle style in slist) styleCount += style.StyleUpdateCount; } return (styleCount); } #endregion #endregion #region InvalidateStyle public bool InvalidateStyle() { if (_Style != null) { _Style.Dispose(); _Style = null; return (true); } return (false); } #endregion } #region IEffectiveStyle public interface IEffectiveStyle { void ApplyStyles(BaseVisualStyle style); void ApplyStyles(BaseVisualStyle style, StyleType styleType); void ApplyDefaults(BaseVisualStyle style, StyleType styleType); void GetElementStyle(IEffectiveStyle chartElement, StyleType styleType, ref BaseVisualStyle style); ChartControl ChartControl { get; } } #endregion }