339 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			339 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Drawing;
 | 
						|
using DevComponents.DotNetBar.Charts.Style;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar.Charts
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// Provides helpers when working with EffectiveStyles.
 | 
						|
    /// </summary>
 | 
						|
    public class EffectiveStyles<T> where T : BaseVisualStyle, new()
 | 
						|
    {
 | 
						|
        #region Private variables
 | 
						|
 | 
						|
        private IEffectiveStyle _ChartElement;
 | 
						|
        private VisualStyles<T> _Styles = new VisualStyles<T>();
 | 
						|
 | 
						|
        private ushort[] _StyleUpdateCount;
 | 
						|
        private ushort[] _GlobalStyleUpdateCount;
 | 
						|
 | 
						|
        private List<BaseVisualStyle>[] _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<BaseVisualStyle>[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<T> cvs = _Styles;
 | 
						|
 | 
						|
            if (cvs == null)
 | 
						|
                cvs = new VisualStyles<T>();
 | 
						|
 | 
						|
            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<BaseVisualStyle>();
 | 
						|
 | 
						|
                _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<BaseVisualStyle> 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
 | 
						|
    }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Provides helpers when working with EffectiveStyle.
 | 
						|
    /// </summary>
 | 
						|
    public class EffectiveStyle<T> 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<BaseVisualStyle> _StyleList = new List<BaseVisualStyle>();
 | 
						|
 | 
						|
        #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<BaseVisualStyle> 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
 | 
						|
}
 |