1548 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1548 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.ComponentModel;
 | 
						|
using System.Drawing;
 | 
						|
using System.Windows.Forms;
 | 
						|
using DevComponents.DotNetBar.Charts.Style;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar.Charts
 | 
						|
{
 | 
						|
    [ToolboxItem(false)]
 | 
						|
    [TypeConverter(typeof(BlankExpandableObjectConverter))]
 | 
						|
    public class HScrollBarLite : ScrollBarLite
 | 
						|
    {
 | 
						|
        public HScrollBarLite()
 | 
						|
        {
 | 
						|
            Orientation = Orientation.Horizontal;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    [ToolboxItem(false)]
 | 
						|
    [TypeConverter(typeof(BlankExpandableObjectConverter))]
 | 
						|
    public class VScrollBarLite : ScrollBarLite
 | 
						|
    {
 | 
						|
        public VScrollBarLite()
 | 
						|
        {
 | 
						|
            Orientation = Orientation.Vertical;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    [ToolboxItem(false)]
 | 
						|
    [TypeConverter(typeof(BlankExpandableObjectConverter))]
 | 
						|
    public class ScrollBarLite : ChartVisualElement
 | 
						|
    {
 | 
						|
        #region Events
 | 
						|
 | 
						|
        #region Scroll
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when the Horizontal or Vertical scrollbar has been scrolled
 | 
						|
        /// </summary>
 | 
						|
        [Description("Occurs when the Horizontal or Vertical scrollbar has been scrolled.")]
 | 
						|
        public event EventHandler<ScrollEventArgs> Scroll;
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ValueChanged
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Occurs when the Value property is changed.
 | 
						|
        /// </summary>
 | 
						|
        public event EventHandler<ValueChangedEventArgs> ValueChanged;
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Private Variables
 | 
						|
 | 
						|
        private Orientation _Orientation = Orientation.Horizontal;
 | 
						|
 | 
						|
        private int _LargeChange = 10;
 | 
						|
        private int _Maximum = 100;
 | 
						|
        private int _Minimum;
 | 
						|
        private int _SmallChange = 1;
 | 
						|
        private int _Value;
 | 
						|
 | 
						|
        private bool _Enabled = true;
 | 
						|
 | 
						|
        private Rectangle _ArrowIncreaseBounds;
 | 
						|
        private Rectangle _ArrowDecreaseBounds;
 | 
						|
        private Rectangle _ThumbBounds;
 | 
						|
 | 
						|
        private Size _MinArrowSize = new Size(5, 7);
 | 
						|
        private Size _MaxArrowSize = new Size(50, 50);
 | 
						|
        private Size _MinThumbSize = new Size(10, 12);
 | 
						|
 | 
						|
        private ScrollBarVisualStyles _ScrollBarVisualStyles;
 | 
						|
        private EffectiveStyles<ScrollBarVisualStyle> _EffectiveStyles;
 | 
						|
 | 
						|
        private ItemHitArea _HitArea;
 | 
						|
        private ItemHitArea _LastHitArea;
 | 
						|
        private ItemHitArea _MouseDownHitArea;
 | 
						|
        private int _ThumbOffset;
 | 
						|
 | 
						|
        private Timer _ClickTimer;
 | 
						|
        private int _ClickCount;
 | 
						|
        private bool _RaiseEndScroll;
 | 
						|
 | 
						|
        private bool _Inverted;
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Constructor
 | 
						|
 | 
						|
        public ScrollBarLite()
 | 
						|
        {
 | 
						|
            Size = new Size(10, 10);
 | 
						|
 | 
						|
            _EffectiveStyles = new EffectiveStyles<ScrollBarVisualStyle>(this);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Public properties
 | 
						|
 | 
						|
        #region Enabled
 | 
						|
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public bool Enabled
 | 
						|
        {
 | 
						|
            get { return (_Enabled); }
 | 
						|
 | 
						|
            internal set
 | 
						|
            {
 | 
						|
                if (value != _Enabled)
 | 
						|
                {
 | 
						|
                    _Enabled = value;
 | 
						|
 | 
						|
                    InvalidateRender();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Orientation
 | 
						|
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public Orientation Orientation
 | 
						|
        {
 | 
						|
            get { return (_Orientation); }
 | 
						|
 | 
						|
            internal set
 | 
						|
            {
 | 
						|
                if (value != _Orientation)
 | 
						|
                {
 | 
						|
                    _Orientation = value;
 | 
						|
 | 
						|
                    InvalidateLayout();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ScrollBarVisualStyles
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the visual styles for the ScrollBar.
 | 
						|
        /// </summary>
 | 
						|
        [Category("Style")]
 | 
						|
        [Description("Indicates the visual styles for the ScrollBar.")]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
 | 
						|
        public ScrollBarVisualStyles ScrollBarVisualStyles
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (_ScrollBarVisualStyles == null)
 | 
						|
                {
 | 
						|
                    _ScrollBarVisualStyles = new ScrollBarVisualStyles();
 | 
						|
 | 
						|
                    StyleVisualChangeHandler(null, _ScrollBarVisualStyles);
 | 
						|
                }
 | 
						|
 | 
						|
                return (_ScrollBarVisualStyles);
 | 
						|
            }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (_ScrollBarVisualStyles != value)
 | 
						|
                {
 | 
						|
                    ScrollBarVisualStyles oldValue = _ScrollBarVisualStyles;
 | 
						|
 | 
						|
                    _ScrollBarVisualStyles = value;
 | 
						|
 | 
						|
                    OnStyleChanged("ScrollBarVisualStyles", oldValue, value);
 | 
						|
 | 
						|
                    if (oldValue != null)
 | 
						|
                        oldValue.Dispose();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Value
 | 
						|
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public int Value
 | 
						|
        {
 | 
						|
            get { return (_Value); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value < Minimum)
 | 
						|
                    throw new ArgumentOutOfRangeException("Value must be >= to Minimum property value.");
 | 
						|
 | 
						|
                if (value > Maximum)
 | 
						|
                    throw new ArgumentOutOfRangeException("Value must be <= to Maximum property value.");
 | 
						|
 | 
						|
                value = NormalizeValue(value);
 | 
						|
 | 
						|
                if (value != _Value)
 | 
						|
                {
 | 
						|
                    int oldValue = _Value;
 | 
						|
                    _Value = value;
 | 
						|
 | 
						|
                    OnValueChanged(oldValue, value);
 | 
						|
 | 
						|
                    InvalidateLayoutBounds(this);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #region OnValueChanged
 | 
						|
 | 
						|
        private void OnValueChanged(int oldValue, int newValue)
 | 
						|
        {
 | 
						|
            if (ValueChanged != null)
 | 
						|
            {
 | 
						|
                ValueChangedEventArgs args
 | 
						|
                    = new ValueChangedEventArgs(oldValue, newValue);
 | 
						|
 | 
						|
                ValueChanged(this, args);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Visible
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Get or sets whether the item is visible
 | 
						|
        /// </summary>
 | 
						|
        [Browsable(false)]
 | 
						|
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 | 
						|
        public new bool Visible
 | 
						|
        {
 | 
						|
            get { return (base.Visible); }
 | 
						|
            set { base.Visible = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal properties
 | 
						|
 | 
						|
        #region Height
 | 
						|
 | 
						|
        internal int Height
 | 
						|
        {
 | 
						|
            get { return (BoundsRelative.Height); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != BoundsRelative.Height)
 | 
						|
                {
 | 
						|
                    Rectangle r = BoundsRelative;
 | 
						|
 | 
						|
                    _ThumbOffset -= (value - r.Height);
 | 
						|
 | 
						|
                    r.Height = value;
 | 
						|
 | 
						|
                    BoundsRelative = r;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Inverted
 | 
						|
 | 
						|
        internal bool Inverted
 | 
						|
        {
 | 
						|
            get { return (_Inverted); }
 | 
						|
            set { _Inverted = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IsAtMaxumum
 | 
						|
 | 
						|
        internal bool IsAtMaxumum
 | 
						|
        {
 | 
						|
            get { return (_Value + _LargeChange >= _Maximum); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IsAtMinumum
 | 
						|
 | 
						|
        internal bool IsAtMinumum
 | 
						|
        {
 | 
						|
            get { return (_Value == _Minimum); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IsVertical
 | 
						|
 | 
						|
        internal bool IsVertical
 | 
						|
        {
 | 
						|
            get { return (Orientation == Orientation.Vertical); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region LargeChange
 | 
						|
 | 
						|
        internal int LargeChange
 | 
						|
        {
 | 
						|
            get { return (_LargeChange); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _LargeChange)
 | 
						|
                {
 | 
						|
                    if (value < 0)
 | 
						|
                        throw new ArgumentOutOfRangeException();
 | 
						|
 | 
						|
                    _LargeChange = value;
 | 
						|
 | 
						|
                    InvalidateRender();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Location
 | 
						|
 | 
						|
        internal Point Location
 | 
						|
        {
 | 
						|
            get { return (BoundsRelative.Location); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                Rectangle r = BoundsRelative;
 | 
						|
                r.Location = value;
 | 
						|
 | 
						|
                BoundsRelative = r;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Maximum
 | 
						|
 | 
						|
        internal int Maximum
 | 
						|
        {
 | 
						|
            get { return (_Maximum); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _Maximum)
 | 
						|
                {
 | 
						|
                    _Maximum = value;
 | 
						|
 | 
						|
                    InvalidateRender();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Minimum
 | 
						|
 | 
						|
        internal int Minimum
 | 
						|
        {
 | 
						|
            get { return (_Minimum); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _Minimum)
 | 
						|
                {
 | 
						|
                    _Minimum = value;
 | 
						|
 | 
						|
                    InvalidateRender();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region SmallChange
 | 
						|
 | 
						|
        internal int SmallChange
 | 
						|
        {
 | 
						|
            get { return (_SmallChange); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != _SmallChange)
 | 
						|
                {
 | 
						|
                    if (value < 0)
 | 
						|
                        throw new ArgumentOutOfRangeException();
 | 
						|
 | 
						|
                    _SmallChange = value;
 | 
						|
 | 
						|
                    InvalidateRender();
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Width
 | 
						|
 | 
						|
        internal int Width
 | 
						|
        {
 | 
						|
            get { return (BoundsRelative.Width); }
 | 
						|
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (value != BoundsRelative.Width)
 | 
						|
                {
 | 
						|
                    Rectangle r = BoundsRelative;
 | 
						|
 | 
						|
                    _ThumbOffset -= (value - r.Width);
 | 
						|
 | 
						|
                    r.Width = value;
 | 
						|
 | 
						|
                    BoundsRelative = r;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region MeasureOverride
 | 
						|
 | 
						|
        protected override void MeasureOverride(ChartLayoutInfo layoutInfo)
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ArrangeOverride
 | 
						|
 | 
						|
        protected override void ArrangeOverride(ChartLayoutInfo layoutInfo)
 | 
						|
        {
 | 
						|
            UpdateBarBounds();
 | 
						|
        }
 | 
						|
 | 
						|
        #region UpdateBarBounds
 | 
						|
 | 
						|
        private void UpdateBarBounds()
 | 
						|
        {
 | 
						|
            Rectangle bounds = Bounds;
 | 
						|
 | 
						|
            _ThumbBounds = Rectangle.Empty;
 | 
						|
 | 
						|
            if (Orientation == Orientation.Horizontal)
 | 
						|
            {
 | 
						|
                int arrowWidth = Height;
 | 
						|
                arrowWidth = Math.Max(arrowWidth, _MinArrowSize.Width);
 | 
						|
                arrowWidth = Math.Min(arrowWidth, _MaxArrowSize.Width);
 | 
						|
 | 
						|
                _ArrowDecreaseBounds = bounds;
 | 
						|
                _ArrowDecreaseBounds.Width = arrowWidth;
 | 
						|
 | 
						|
                _ArrowIncreaseBounds = bounds;
 | 
						|
                _ArrowIncreaseBounds.X = _ArrowIncreaseBounds.Right - arrowWidth;
 | 
						|
                _ArrowIncreaseBounds.Width = arrowWidth;
 | 
						|
 | 
						|
                if (bounds.Width > (_ArrowDecreaseBounds.Width +
 | 
						|
                    _ArrowIncreaseBounds.Width + _MinThumbSize.Width))
 | 
						|
                {
 | 
						|
                    int tv = Maximum - Minimum;
 | 
						|
                    int width = Width - (2 * arrowWidth);
 | 
						|
                    int x = (width * Value) / tv;
 | 
						|
 | 
						|
                    _ThumbBounds = bounds;
 | 
						|
                    _ThumbBounds.X += (x + arrowWidth);
 | 
						|
                    _ThumbBounds.Width = GetThumbSize();
 | 
						|
                    _ThumbBounds.Y += 1;
 | 
						|
                    _ThumbBounds.Height -= 2;
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                int arrowHeight = Width;
 | 
						|
                arrowHeight = Math.Max(arrowHeight, _MinArrowSize.Height);
 | 
						|
                arrowHeight = Math.Min(arrowHeight, _MaxArrowSize.Height);
 | 
						|
 | 
						|
                _ArrowDecreaseBounds = bounds;
 | 
						|
                _ArrowDecreaseBounds.Height = arrowHeight;
 | 
						|
 | 
						|
                _ArrowIncreaseBounds = bounds;
 | 
						|
                _ArrowIncreaseBounds.Y = bounds.Bottom - arrowHeight;
 | 
						|
                _ArrowIncreaseBounds.Height = arrowHeight;
 | 
						|
 | 
						|
                if (bounds.Height > (_ArrowDecreaseBounds.Height +
 | 
						|
                    _ArrowIncreaseBounds.Height + _MinThumbSize.Height))
 | 
						|
                {
 | 
						|
                    int tv = Maximum - Minimum;
 | 
						|
                    int height = Height - (2 * arrowHeight);
 | 
						|
                    int y = (height * Value) / tv;
 | 
						|
 | 
						|
                    _ThumbBounds = bounds;
 | 
						|
                    _ThumbBounds.Height = GetThumbSize();
 | 
						|
 | 
						|
                    if (Inverted == true)
 | 
						|
                        _ThumbBounds.Y = (bounds.Bottom - _ThumbBounds.Height) - (y + arrowHeight);
 | 
						|
                    else
 | 
						|
                        _ThumbBounds.Y += (y + arrowHeight);
 | 
						|
 | 
						|
                    _ThumbBounds.X += 1;
 | 
						|
                    _ThumbBounds.Width -= 2;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #region GetThumbSize
 | 
						|
 | 
						|
        private int GetThumbSize()
 | 
						|
        {
 | 
						|
            int size = GetAvailableTrackArea();
 | 
						|
 | 
						|
            int i = (int)(size * ((float)LargeChange / (float)(Maximum - Minimum))) + 1;
 | 
						|
 | 
						|
            if (Orientation == Orientation.Horizontal)
 | 
						|
                i = Math.Max(_MinThumbSize.Width, i);
 | 
						|
            else
 | 
						|
                i = Math.Max(_MinThumbSize.Height, i);
 | 
						|
 | 
						|
            i = Math.Min(i, size);
 | 
						|
 | 
						|
            return i;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetAvailableTrackArea
 | 
						|
 | 
						|
        private int GetAvailableTrackArea()
 | 
						|
        {
 | 
						|
            Rectangle r = BoundsRelative;
 | 
						|
 | 
						|
            int size;
 | 
						|
 | 
						|
            if (Orientation == Orientation.Horizontal)
 | 
						|
                size = r.Width - (_ArrowDecreaseBounds.Width + _ArrowIncreaseBounds.Width);
 | 
						|
            else
 | 
						|
                size = r.Height - (_ArrowDecreaseBounds.Height + _ArrowIncreaseBounds.Height);
 | 
						|
 | 
						|
            return Math.Max(size, 8);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RenderOverride
 | 
						|
 | 
						|
        protected override void RenderOverride(ChartRenderInfo renderInfo)
 | 
						|
        {
 | 
						|
            Graphics g = renderInfo.Graphics;
 | 
						|
 | 
						|
            if (CanDrawScrollBar())
 | 
						|
            {
 | 
						|
                Rectangle bounds = Bounds;
 | 
						|
 | 
						|
                RenderBackground(g, bounds);
 | 
						|
 | 
						|
                RenderArrowDecrease(g, bounds);
 | 
						|
                RenderArrowIncrease(g, bounds);
 | 
						|
 | 
						|
                RenderThumb(g, bounds);
 | 
						|
 | 
						|
                RenderBorder(g, bounds);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #region CanDrawScrollBar
 | 
						|
 | 
						|
        private bool CanDrawScrollBar()
 | 
						|
        {
 | 
						|
            Rectangle bounds = Bounds;
 | 
						|
 | 
						|
            if (Orientation == Orientation.Horizontal)
 | 
						|
            {
 | 
						|
                if (bounds.Height < _MinArrowSize.Height)
 | 
						|
                    return (false);
 | 
						|
 | 
						|
                int widthNeeded = (_ArrowIncreaseBounds.Width + _ArrowDecreaseBounds.Width);
 | 
						|
 | 
						|
                return (bounds.Width >= widthNeeded);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (bounds.Width < _MinArrowSize.Width)
 | 
						|
                    return (false);
 | 
						|
 | 
						|
                int heightNeeded = (_ArrowIncreaseBounds.Height + _ArrowDecreaseBounds.Height);
 | 
						|
 | 
						|
                return (bounds.Height >= heightNeeded);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RenderBackground
 | 
						|
 | 
						|
        private void RenderBackground(Graphics g, Rectangle bounds)
 | 
						|
        {
 | 
						|
            ScrollBarVisualStyle style = GetEffectiveStyle();
 | 
						|
 | 
						|
            bool noAlpha = (style.NoAlphaOnMouseOver == Tbool.True) ? IsMouseOver : false;
 | 
						|
 | 
						|
            using (Brush br = style.TrackBackground.GetBrush(bounds, noAlpha))
 | 
						|
                g.FillRectangle(br, bounds);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RenderArrowDecrease
 | 
						|
 | 
						|
        private void RenderArrowDecrease(Graphics g, Rectangle bounds)
 | 
						|
        {
 | 
						|
            ScrollBarVisualStyle style = GetAreaStyle(Inverted == true ? ItemHitArea.ArrowIncrease : ItemHitArea.ArrowDecrease);
 | 
						|
            Rectangle r = _ArrowDecreaseBounds;
 | 
						|
 | 
						|
            bool noAlpha = (style.NoAlphaOnMouseOver == Tbool.True) ? IsMouseOver : false;
 | 
						|
 | 
						|
            using (Brush br = style.ArrowBackground.GetBrush(r, noAlpha))
 | 
						|
                g.FillRectangle(br, r);
 | 
						|
 | 
						|
            if (style.ArrowColor.IsEmpty == false)
 | 
						|
            {
 | 
						|
                Color color = style.GetColor(style.ArrowColor, noAlpha);
 | 
						|
 | 
						|
                using (Pen pen = new Pen(color))
 | 
						|
                {
 | 
						|
                    int n = Math.Min(r.Width, r.Height) / 4 + 1;
 | 
						|
 | 
						|
                    if (Orientation == Orientation.Horizontal)
 | 
						|
                    {
 | 
						|
                        int x = r.X + (n * 5 / 4);
 | 
						|
                        int y = r.Y + (r.Height / 2);
 | 
						|
 | 
						|
                        for (int i = 0; i < n; i++)
 | 
						|
                        {
 | 
						|
                            g.DrawLine(pen, x + i, y - i, x + i + 1, y - i);
 | 
						|
                            g.DrawLine(pen, x + i, y + i, x + i + 1, y + i);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        int x = r.X + (r.Width / 2);
 | 
						|
                        int y = r.Y + (n * 5 / 4);
 | 
						|
 | 
						|
                        for (int i = 0; i < n; i++)
 | 
						|
                        {
 | 
						|
                            g.DrawLine(pen, x - i, y + i, x - i, y + i + 1);
 | 
						|
                            g.DrawLine(pen, x + i, y + i, x + i, y + i + 1);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (style.ArrowBorderColor.IsEmpty == false)
 | 
						|
            {
 | 
						|
                Color color = style.GetColor(style.ArrowBorderColor, noAlpha);
 | 
						|
 | 
						|
                using (Pen pen = new Pen(color))
 | 
						|
                    g.DrawRectangle(pen, r);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RenderArrowIncrease
 | 
						|
 | 
						|
        private void RenderArrowIncrease(Graphics g, Rectangle bounds)
 | 
						|
        {
 | 
						|
            ScrollBarVisualStyle style = GetAreaStyle(Inverted == true ? ItemHitArea.ArrowDecrease : ItemHitArea.ArrowIncrease);
 | 
						|
            Rectangle r = _ArrowIncreaseBounds;
 | 
						|
 | 
						|
            bool noAlpha = (style.NoAlphaOnMouseOver == Tbool.True) ? IsMouseOver : false;
 | 
						|
 | 
						|
            using (Brush br = style.ArrowBackground.GetBrush(r, noAlpha))
 | 
						|
                g.FillRectangle(br, r);
 | 
						|
 | 
						|
            if (style.ArrowColor.IsEmpty == false)
 | 
						|
            {
 | 
						|
                Color color = style.GetColor(style.ArrowColor, noAlpha);
 | 
						|
 | 
						|
                using (Pen pen = new Pen(color))
 | 
						|
                {
 | 
						|
                    int n = Math.Min(r.Width, r.Height) / 4 + 1;
 | 
						|
 | 
						|
                    if (Orientation == Orientation.Horizontal)
 | 
						|
                    {
 | 
						|
                        int x = r.Right - (n * 5 / 4);
 | 
						|
                        int y = r.Y + (r.Height / 2);
 | 
						|
 | 
						|
                        for (int i = 0; i < n; i++)
 | 
						|
                        {
 | 
						|
                            g.DrawLine(pen, x - i, y - i, x - i - 1, y - i);
 | 
						|
                            g.DrawLine(pen, x - i, y + i, x - i - 1, y + i);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        int x = r.X + (r.Width / 2);
 | 
						|
                        int y = r.Bottom - (n * 5 / 4);
 | 
						|
 | 
						|
                        for (int i = 0; i < n; i++)
 | 
						|
                        {
 | 
						|
                            g.DrawLine(pen, x - i, y - i, x - i, y - i - 1);
 | 
						|
                            g.DrawLine(pen, x + i, y - i, x + i, y - i - 1);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (style.ArrowBorderColor.IsEmpty == false)
 | 
						|
            {
 | 
						|
                Color color = style.GetColor(style.ArrowBorderColor, noAlpha);
 | 
						|
 | 
						|
                using (Pen pen = new Pen(color))
 | 
						|
                    g.DrawRectangle(pen, r);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RenderThumb
 | 
						|
 | 
						|
        private void RenderThumb(Graphics g, Rectangle bounds)
 | 
						|
        {
 | 
						|
            if (_ThumbBounds.IsEmpty == false)
 | 
						|
            {
 | 
						|
                ScrollBarVisualStyle style = GetAreaStyle(ItemHitArea.Thumb);
 | 
						|
 | 
						|
                bool noAlpha = (style.NoAlphaOnMouseOver == Tbool.True) ? IsMouseOver : false;
 | 
						|
 | 
						|
                using (Brush br = style.ThumbBackground.GetBrush(_ThumbBounds, noAlpha))
 | 
						|
                    g.FillRectangle(br, _ThumbBounds);
 | 
						|
 | 
						|
                if (style.ThumbColor.IsEmpty == false)
 | 
						|
                {
 | 
						|
                    Color color = style.GetColor(style.ThumbColor, noAlpha);
 | 
						|
 | 
						|
                    if (Orientation == Orientation.Horizontal)
 | 
						|
                        RenderHThumbHashMarks(g, bounds, color);
 | 
						|
                    else
 | 
						|
                        RenderVThumbHashMarks(g, bounds, color);
 | 
						|
                }
 | 
						|
 | 
						|
                if (style.ThumbBorderColor.IsEmpty == false)
 | 
						|
                {
 | 
						|
                    Color color = style.GetColor(style.ThumbBorderColor, noAlpha);
 | 
						|
 | 
						|
                    using (Pen pen = new Pen(color))
 | 
						|
                        g.DrawRectangle(pen, _ThumbBounds);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #region RenderHThumbHashMarks
 | 
						|
 | 
						|
        private void RenderHThumbHashMarks(
 | 
						|
            Graphics g, Rectangle bounds, Color color)
 | 
						|
        {
 | 
						|
            Rectangle r = _ThumbBounds;
 | 
						|
 | 
						|
            if (_ThumbBounds.Width > 20)
 | 
						|
            {
 | 
						|
                int n = r.Height / 6 + 1;
 | 
						|
                int m = r.Height / 10 + 1;
 | 
						|
 | 
						|
                r.X += (r.Width / 2 - 1 - m);
 | 
						|
                r.Y += n;
 | 
						|
 | 
						|
                r.Width = m * 2 + 3;
 | 
						|
                r.Height -= (n * 2);
 | 
						|
 | 
						|
                Point pt1 = new Point(r.X, r.Y);
 | 
						|
                Point pt2 = new Point(r.X, r.Bottom);
 | 
						|
 | 
						|
                using (Pen pen = new Pen(color))
 | 
						|
                {
 | 
						|
                    for (int i = 0; i < 3; i++)
 | 
						|
                    {
 | 
						|
                        g.DrawLine(pen, pt1, pt2);
 | 
						|
 | 
						|
                        pt1.X += (m + 1);
 | 
						|
                        pt2.X += (m + 1);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RenderVThumbHashMarks
 | 
						|
 | 
						|
        private void RenderVThumbHashMarks(
 | 
						|
            Graphics g, Rectangle bounds, Color color)
 | 
						|
        {
 | 
						|
            Rectangle r = _ThumbBounds;
 | 
						|
 | 
						|
            if (_ThumbBounds.Height > 20)
 | 
						|
            {
 | 
						|
                int n = r.Width / 6 + 1;
 | 
						|
                int m = r.Width / 10 + 1;
 | 
						|
 | 
						|
                r.Y += (r.Height / 2 - 1 - m);
 | 
						|
                r.X += n;
 | 
						|
 | 
						|
                r.Height = m * 2 + 3;
 | 
						|
                r.Width -= (n * 2);
 | 
						|
 | 
						|
                Point pt1 = new Point(r.Left, r.Y);
 | 
						|
                Point pt2 = new Point(r.Right, r.Y);
 | 
						|
 | 
						|
                using (Pen pen = new Pen(color))
 | 
						|
                {
 | 
						|
                    for (int i = 0; i < 3; i++)
 | 
						|
                    {
 | 
						|
                        g.DrawLine(pen, pt1, pt2);
 | 
						|
 | 
						|
                        pt1.Y += (m + 1);
 | 
						|
                        pt2.Y += (m + 1);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region RenderBorder
 | 
						|
 | 
						|
        private void RenderBorder(Graphics g, Rectangle bounds)
 | 
						|
        {
 | 
						|
            ScrollBarVisualStyle style = GetEffectiveStyle();
 | 
						|
 | 
						|
            if (style.BorderColor.IsEmpty == false)
 | 
						|
            {
 | 
						|
                bool noAlpha = (style.NoAlphaOnMouseOver == Tbool.True) ? IsMouseOver : false;
 | 
						|
 | 
						|
                Color color = style.GetColor(style.BorderColor, noAlpha);
 | 
						|
 | 
						|
                using (Pen pen = new Pen(color))
 | 
						|
                    g.DrawRectangle(pen, bounds);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetAreaStyle
 | 
						|
 | 
						|
        private ScrollBarVisualStyle GetAreaStyle(ItemHitArea scrollBarArea)
 | 
						|
        {
 | 
						|
            StyleState state = StyleState.Default;
 | 
						|
 | 
						|
            if (_HitArea == scrollBarArea)
 | 
						|
                state |= StyleState.MouseOver;
 | 
						|
 | 
						|
            if (_MouseDownHitArea == scrollBarArea)
 | 
						|
                state |= StyleState.Selected;
 | 
						|
 | 
						|
            return (GetEffectiveStyle(state));
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Mouse handling
 | 
						|
 | 
						|
        #region OnMouseEnter
 | 
						|
 | 
						|
        protected override bool OnMouseEnter(EventArgs e)
 | 
						|
        {
 | 
						|
            ChartCursor = Cursors.Default;
 | 
						|
 | 
						|
            InvalidateRender();
 | 
						|
 | 
						|
            return (true);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region OnMouseLeave
 | 
						|
 | 
						|
        protected override bool OnMouseLeave(EventArgs e)
 | 
						|
        {
 | 
						|
            _HitArea = ItemHitArea.None;
 | 
						|
 | 
						|
            InvalidateRender();
 | 
						|
 | 
						|
            return (true);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region OnMouseMove
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// InternalMouseMove
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="e"></param>
 | 
						|
        protected override bool OnMouseMove(MouseEventArgs e)
 | 
						|
        {
 | 
						|
            _HitArea = GetHitArea(e.Location);
 | 
						|
 | 
						|
            if (_HitArea != _LastHitArea)
 | 
						|
            {
 | 
						|
                _LastHitArea = _HitArea;
 | 
						|
 | 
						|
                InvalidateRender();
 | 
						|
            }
 | 
						|
 | 
						|
            if (IsMouseDown == false)
 | 
						|
                _MouseDownHitArea = ItemHitArea.None;
 | 
						|
 | 
						|
            if (_MouseDownHitArea == ItemHitArea.Thumb)
 | 
						|
                ProcessThumbMove(e);
 | 
						|
 | 
						|
            ChartCursor = Cursors.Default;
 | 
						|
 | 
						|
            return (true);
 | 
						|
        }
 | 
						|
 | 
						|
        #region ProcessThumbMove
 | 
						|
 | 
						|
        private void ProcessThumbMove(MouseEventArgs e)
 | 
						|
        {
 | 
						|
            int track;
 | 
						|
            int tc;
 | 
						|
            int tv = Maximum - Minimum - _LargeChange;
 | 
						|
 | 
						|
            if (Orientation == Orientation.Horizontal)
 | 
						|
            {
 | 
						|
                track = e.Location.X - _ThumbOffset;
 | 
						|
                track -= _ArrowDecreaseBounds.Right;
 | 
						|
 | 
						|
                tc = Width - (_ArrowDecreaseBounds.Width + _ArrowIncreaseBounds.Width + _ThumbBounds.Width);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                track = e.Location.Y - _ThumbOffset;
 | 
						|
                track -= _ArrowDecreaseBounds.Bottom;
 | 
						|
 | 
						|
                tc = Height - (_ArrowDecreaseBounds.Height + _ArrowIncreaseBounds.Height + _ThumbBounds.Height);
 | 
						|
            }
 | 
						|
 | 
						|
            if (tc > 0)
 | 
						|
            {
 | 
						|
                int value = (tv * track) / tc;
 | 
						|
 | 
						|
                if (Inverted == true)
 | 
						|
                    value = tv - value;
 | 
						|
 | 
						|
                SetScrollValue(value, ScrollEventType.ThumbPosition);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region OnMouseDown
 | 
						|
 | 
						|
        protected override bool OnMouseDown(MouseEventArgs e)
 | 
						|
        {
 | 
						|
            _MouseDownHitArea = _HitArea;
 | 
						|
 | 
						|
            if (_HitArea != ItemHitArea.None)
 | 
						|
            {
 | 
						|
                ChartControl.CapturedItem = this;
 | 
						|
 | 
						|
                switch (_HitArea)
 | 
						|
                {
 | 
						|
                    case ItemHitArea.Thumb:
 | 
						|
                        if (Orientation == Orientation.Horizontal)
 | 
						|
                            _ThumbOffset = MouseDownPoint.X - _ThumbBounds.X;
 | 
						|
                        else
 | 
						|
                            _ThumbOffset = MouseDownPoint.Y - _ThumbBounds.Y;
 | 
						|
                        break;
 | 
						|
 | 
						|
                    case ItemHitArea.TrackDecrease:
 | 
						|
                        SetScrollValue(Value - _LargeChange, ScrollEventType.LargeDecrement);
 | 
						|
                        break;
 | 
						|
 | 
						|
                    case ItemHitArea.TrackIncrease:
 | 
						|
                        SetScrollValue(Value + _LargeChange, ScrollEventType.LargeIncrement);
 | 
						|
                        break;
 | 
						|
 | 
						|
                    case ItemHitArea.ArrowDecrease:
 | 
						|
                        SetScrollValue(Value - _SmallChange, ScrollEventType.SmallDecrement);
 | 
						|
                        break;
 | 
						|
 | 
						|
                    case ItemHitArea.ArrowIncrease:
 | 
						|
                        SetScrollValue(Value + _SmallChange, ScrollEventType.SmallIncrement);
 | 
						|
                        break;
 | 
						|
                }
 | 
						|
 | 
						|
                if (_HitArea != ItemHitArea.Thumb)
 | 
						|
                    SetupClickTimer();
 | 
						|
            }
 | 
						|
 | 
						|
            InvalidateRender();
 | 
						|
 | 
						|
            return (true);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region OnMouseUp
 | 
						|
 | 
						|
        protected override bool OnMouseUp(MouseEventArgs e)
 | 
						|
        {
 | 
						|
            ChartControl.CapturedItem = null;
 | 
						|
 | 
						|
            if (_MouseDownHitArea != ItemHitArea.None)
 | 
						|
            {
 | 
						|
                if (_RaiseEndScroll == true)
 | 
						|
                {
 | 
						|
                    OnScroll(ScrollEventType.EndScroll, Value, Value);
 | 
						|
 | 
						|
                    _RaiseEndScroll = false;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            DisposeTimer();
 | 
						|
 | 
						|
            _MouseDownHitArea = ItemHitArea.None;
 | 
						|
 | 
						|
            InvalidateRender();
 | 
						|
 | 
						|
            return (true);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region NormalizeValue
 | 
						|
 | 
						|
        private int NormalizeValue(int value)
 | 
						|
        {
 | 
						|
            value = Math.Max(Minimum, value);
 | 
						|
 | 
						|
            if (value + _LargeChange > _Maximum)
 | 
						|
                value = _Maximum - _LargeChange;
 | 
						|
 | 
						|
            return (value);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Timer support
 | 
						|
 | 
						|
        #region SetupClickTimer
 | 
						|
 | 
						|
        private void SetupClickTimer()
 | 
						|
        {
 | 
						|
            if (_ClickTimer == null)
 | 
						|
            {
 | 
						|
                _ClickCount = 0;
 | 
						|
 | 
						|
                _ClickTimer = new Timer();
 | 
						|
                _ClickTimer.Interval = 100;
 | 
						|
                _ClickTimer.Tick += new EventHandler(ClickTimerTick);
 | 
						|
 | 
						|
                _ClickTimer.Enabled = true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region DisposeTimer
 | 
						|
 | 
						|
        private void DisposeTimer()
 | 
						|
        {
 | 
						|
            Timer clickTimer = _ClickTimer;
 | 
						|
 | 
						|
            if (clickTimer != null)
 | 
						|
            {
 | 
						|
                _ClickTimer = null;
 | 
						|
 | 
						|
                clickTimer.Enabled = false;
 | 
						|
                clickTimer.Tick -= new EventHandler(ClickTimerTick);
 | 
						|
 | 
						|
                clickTimer.Dispose();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ClickTimerTick
 | 
						|
 | 
						|
        private void ClickTimerTick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            if (IsMouseDown == true)
 | 
						|
            {
 | 
						|
                if (_MouseDownHitArea == ItemHitArea.TrackDecrease || _MouseDownHitArea == ItemHitArea.TrackIncrease)
 | 
						|
                {
 | 
						|
                    Point pt = ChartControl.PointToClient(Control.MousePosition);
 | 
						|
 | 
						|
                    if (_ThumbBounds.Contains(pt))
 | 
						|
                    {
 | 
						|
                        DisposeTimer();
 | 
						|
                    }
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        if (_MouseDownHitArea == ItemHitArea.TrackDecrease)
 | 
						|
                            SetScrollValue(Value - _LargeChange, ScrollEventType.LargeDecrement);
 | 
						|
                        else
 | 
						|
                            SetScrollValue(Value + _LargeChange, ScrollEventType.LargeIncrement);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    if (_HitArea == ItemHitArea.ArrowDecrease)
 | 
						|
                        SetScrollValue(Value - _SmallChange, ScrollEventType.SmallDecrement);
 | 
						|
 | 
						|
                    else if (_HitArea == ItemHitArea.ArrowIncrease)
 | 
						|
                        SetScrollValue(Value + _SmallChange, ScrollEventType.SmallIncrement);
 | 
						|
 | 
						|
                    else
 | 
						|
                    {
 | 
						|
                        _ClickCount = 0;
 | 
						|
                        _ClickTimer.Interval = 100;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                Timer clickTimer = _ClickTimer;
 | 
						|
 | 
						|
                if (clickTimer != null)
 | 
						|
                {
 | 
						|
                    _ClickCount++;
 | 
						|
 | 
						|
                    if (_ClickCount > 4 && clickTimer.Interval > 20)
 | 
						|
                        clickTimer.Interval -= 10;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region SetScrollValue
 | 
						|
 | 
						|
        private void SetScrollValue(int value, ScrollEventType type)
 | 
						|
        {
 | 
						|
            value = NormalizeValue(value);
 | 
						|
            int oldValue = _Value;
 | 
						|
 | 
						|
            Value = value;
 | 
						|
 | 
						|
            OnScroll(type, _Value, oldValue);
 | 
						|
 | 
						|
            _RaiseEndScroll = true;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region OnScroll
 | 
						|
 | 
						|
        private void OnScroll(ScrollEventType type, int oldValue, int newValue)
 | 
						|
        {
 | 
						|
            ScrollEventArgs args = null;
 | 
						|
 | 
						|
            if (Scroll != null)
 | 
						|
            {
 | 
						|
                ScrollOrientation so = (Orientation == Orientation.Horizontal)
 | 
						|
                    ? ScrollOrientation.HorizontalScroll : ScrollOrientation.VerticalScroll;
 | 
						|
 | 
						|
                args = new ScrollEventArgs(type, oldValue, newValue, so);
 | 
						|
 | 
						|
                Scroll(this, args);
 | 
						|
            }
 | 
						|
 | 
						|
            if (ChartControl.IsScrollHooked == true)
 | 
						|
            {
 | 
						|
                if (args == null)
 | 
						|
                {
 | 
						|
                    ScrollOrientation so = (Orientation == Orientation.Horizontal)
 | 
						|
                        ? ScrollOrientation.HorizontalScroll : ScrollOrientation.VerticalScroll;
 | 
						|
 | 
						|
                    args = new ScrollEventArgs(type, oldValue, newValue, so);
 | 
						|
                }
 | 
						|
 | 
						|
                ChartControl.DoScrollEvent((ChartContainer)Parent, args, this);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetBarAreaAt
 | 
						|
 | 
						|
        public override ItemHitArea GetHitArea(Point pt)
 | 
						|
        {
 | 
						|
            if ((Bounds.Contains(pt) == false) ||
 | 
						|
                (Visible == false || Enabled == false))
 | 
						|
            {
 | 
						|
                return (ItemHitArea.None);
 | 
						|
            }
 | 
						|
 | 
						|
            if (_ArrowDecreaseBounds.Contains(pt))
 | 
						|
                return (Inverted ? ItemHitArea.ArrowIncrease : ItemHitArea.ArrowDecrease);
 | 
						|
 | 
						|
            if (_ArrowIncreaseBounds.Contains(pt))
 | 
						|
                return (Inverted ? ItemHitArea.ArrowDecrease : ItemHitArea.ArrowIncrease);
 | 
						|
 | 
						|
            if (_ThumbBounds.Contains(pt))
 | 
						|
                return (ItemHitArea.Thumb);
 | 
						|
 | 
						|
            if (Orientation == Orientation.Horizontal)
 | 
						|
            {
 | 
						|
                if (pt.X < _ThumbBounds.Left)
 | 
						|
                {
 | 
						|
                    if (Inverted == false)
 | 
						|
                        return (ItemHitArea.TrackDecrease);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (pt.Y < _ThumbBounds.Top)
 | 
						|
                {
 | 
						|
                    if (Inverted == false)
 | 
						|
                        return (ItemHitArea.TrackDecrease);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return (ItemHitArea.TrackIncrease);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Style handling
 | 
						|
 | 
						|
        #region GetEffectiveStyle
 | 
						|
 | 
						|
        ///<summary>
 | 
						|
        /// Gets the EffectiveStyle for the ScrollBar. The effective
 | 
						|
        /// style is a composite, cached style definition.
 | 
						|
        ///</summary>
 | 
						|
        /// <param name="state"></param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public ScrollBarVisualStyle GetEffectiveStyle(StyleState state)
 | 
						|
        {
 | 
						|
            return (_EffectiveStyles[state]);
 | 
						|
        }
 | 
						|
 | 
						|
        ///<summary>
 | 
						|
        /// Gets the EffectiveStyle for the ScrollBar. The effective
 | 
						|
        /// style is a composite, cached style definition.
 | 
						|
        ///</summary>
 | 
						|
        ///<returns></returns>
 | 
						|
        public ScrollBarVisualStyle GetEffectiveStyle()
 | 
						|
        {
 | 
						|
            StyleState state = GetStyleState();
 | 
						|
 | 
						|
            return (_EffectiveStyles[state]);
 | 
						|
        }
 | 
						|
 | 
						|
        #region GetStyleState
 | 
						|
 | 
						|
        private StyleState GetStyleState()
 | 
						|
        {
 | 
						|
            StyleState state = StyleState.Default;
 | 
						|
 | 
						|
            Point pt = ChartControl.PointToClient(Control.MousePosition);
 | 
						|
 | 
						|
            if (Bounds.Contains(pt))
 | 
						|
                state |= StyleState.MouseOver;
 | 
						|
 | 
						|
            if (_MouseDownHitArea != ItemHitArea.None)
 | 
						|
                state |= StyleState.Selected;
 | 
						|
 | 
						|
            return (state);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ApplyStyles
 | 
						|
 | 
						|
        public override void ApplyStyles(BaseVisualStyle style, StyleType cs)
 | 
						|
        {
 | 
						|
            ScrollBarVisualStyle pstyle = style as ScrollBarVisualStyle;
 | 
						|
 | 
						|
            if (pstyle != null)
 | 
						|
            {
 | 
						|
                ApplyParentStyles(pstyle, cs, Parent as ChartContainer);
 | 
						|
 | 
						|
                pstyle.ApplyStyle(ScrollBarVisualStyles[cs]);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #region ApplyParentStyles
 | 
						|
 | 
						|
        private void ApplyParentStyles(
 | 
						|
            ScrollBarVisualStyle pstyle, StyleType cs, ChartContainer item)
 | 
						|
        {
 | 
						|
            if (item != null)
 | 
						|
            {
 | 
						|
                ApplyParentStyles(pstyle, cs, item.Parent as ChartContainer);
 | 
						|
 | 
						|
                if (item is ChartXy)
 | 
						|
                {
 | 
						|
                    if (Orientation == Orientation.Horizontal)
 | 
						|
                        pstyle.ApplyStyle(((ChartXy)item).ChartVisualStyle.HScrollBarVisualStyles[cs]);
 | 
						|
                    else
 | 
						|
                        pstyle.ApplyStyle(((ChartXy)item).ChartVisualStyle.VScrollBarVisualStyles[cs]);
 | 
						|
                }
 | 
						|
                else if (item is ChartPanel)
 | 
						|
                {
 | 
						|
                    if (Orientation == Orientation.Horizontal)
 | 
						|
                        pstyle.ApplyStyle(((ChartPanel)item).DefaultVisualStyles.HScrollBarVisualStyles[cs]);
 | 
						|
                    else
 | 
						|
                        pstyle.ApplyStyle(((ChartPanel)item).DefaultVisualStyles.VScrollBarVisualStyles[cs]);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (Orientation == Orientation.Horizontal)
 | 
						|
                {
 | 
						|
                    pstyle.ApplyStyle(ChartControl.BaseVisualStyles.HScrollBarVisualStyles[cs]);
 | 
						|
                    pstyle.ApplyStyle(ChartControl.DefaultVisualStyles.HScrollBarVisualStyles[cs]);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    pstyle.ApplyStyle(ChartControl.BaseVisualStyles.VScrollBarVisualStyles[cs]);
 | 
						|
                    pstyle.ApplyStyle(ChartControl.DefaultVisualStyles.VScrollBarVisualStyles[cs]);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ApplyDefaults
 | 
						|
 | 
						|
        public override void ApplyDefaults(BaseVisualStyle style, StyleType cs)
 | 
						|
        {
 | 
						|
            ScrollBarVisualStyle pstyle = style as ScrollBarVisualStyle;
 | 
						|
 | 
						|
            if (pstyle != null)
 | 
						|
                pstyle.ApplyDefaults();
 | 
						|
 | 
						|
            base.ApplyDefaults(style, cs);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region InvalidateStyle
 | 
						|
 | 
						|
        ///<summary>
 | 
						|
        ///Invalidate the cached Styles
 | 
						|
        ///</summary>
 | 
						|
        public void InvalidateStyle()
 | 
						|
        {
 | 
						|
            ClearEffectiveStyles();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region ClearEffectiveStyles
 | 
						|
 | 
						|
        protected override void ClearEffectiveStyles()
 | 
						|
        {
 | 
						|
            _EffectiveStyles.InvalidateStyles();
 | 
						|
 | 
						|
            base.ClearEffectiveStyles();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region InvalidateLayoutBounds
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Invalidates the layout bounds for the item container
 | 
						|
        /// </summary>
 | 
						|
        public override void InvalidateLayoutBounds(ScrollBarLite sbar)
 | 
						|
        {
 | 
						|
            ChartVisualElement parent = Parent as ChartVisualElement;
 | 
						|
 | 
						|
            if (parent is IScrollable)
 | 
						|
            {
 | 
						|
                IScrollable isc = (IScrollable)parent;
 | 
						|
 | 
						|
                isc.InvalidateLayoutBounds(sbar);
 | 
						|
 | 
						|
                Rectangle scrollBounds = GetScrollBounds(isc.ScrollBounds);
 | 
						|
 | 
						|
                parent.InvalidateRender(scrollBounds);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region GetSerialData
 | 
						|
 | 
						|
        internal override SerialElementCollection GetSerialData(string serialName)
 | 
						|
        {
 | 
						|
            SerialElementCollection sec = new SerialElementCollection();
 | 
						|
 | 
						|
            if (serialName != null)
 | 
						|
            {
 | 
						|
                if (serialName.Equals("") == true)
 | 
						|
                    serialName = "ChartXy";
 | 
						|
 | 
						|
                sec.AddStartElement(serialName);
 | 
						|
            }
 | 
						|
 | 
						|
            if (_ScrollBarVisualStyles != null && _ScrollBarVisualStyles.IsEmpty == false)
 | 
						|
                sec.AddElement(_ScrollBarVisualStyles.GetSerialData("ScrollBarVisualStyles"));
 | 
						|
 | 
						|
            sec.AddElement(base.GetSerialData(null));
 | 
						|
 | 
						|
            if (serialName != null)
 | 
						|
                sec.AddEndElement(serialName);
 | 
						|
 | 
						|
            return (sec);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region PutSerialData
 | 
						|
 | 
						|
        #region ProcessCollection
 | 
						|
 | 
						|
        internal override void ProcessCollection(SerialElement se)
 | 
						|
        {
 | 
						|
            SerialElementCollection sec = se.Sec;
 | 
						|
 | 
						|
            switch (se.Name)
 | 
						|
            {
 | 
						|
                case "ScrollBarVisualStyles":
 | 
						|
                    sec.PutSerialData(ScrollBarVisualStyles);
 | 
						|
                    break;
 | 
						|
 | 
						|
                default:
 | 
						|
                    base.ProcessCollection(se);
 | 
						|
                    break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IDisposable
 | 
						|
 | 
						|
        public override void Dispose()
 | 
						|
        {
 | 
						|
            ScrollBarVisualStyles = null;
 | 
						|
 | 
						|
            base.Dispose();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
 | 
						|
    #region EventArgs
 | 
						|
 | 
						|
    #region ValueChangedEventArgs
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// ValueChangedEventArgs
 | 
						|
    /// </summary>
 | 
						|
    public class ValueChangedEventArgs : EventArgs
 | 
						|
    {
 | 
						|
        #region Private variables
 | 
						|
 | 
						|
        private int _OldValue;
 | 
						|
        private int _NewValue;
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        ///<summary>
 | 
						|
        /// ValueChangedEventArgs
 | 
						|
        ///</summary>
 | 
						|
        ///<param name="oldValue"></param>
 | 
						|
        ///<param name="newValue"></param>
 | 
						|
        public ValueChangedEventArgs(int oldValue, int newValue)
 | 
						|
        {
 | 
						|
            _OldValue = oldValue;
 | 
						|
            _NewValue = newValue;
 | 
						|
        }
 | 
						|
 | 
						|
        #region Public properties
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the old scroll Value
 | 
						|
        /// </summary>
 | 
						|
        public int OldValue
 | 
						|
        {
 | 
						|
            get { return (_OldValue); }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets the new scroll Value
 | 
						|
        /// </summary>
 | 
						|
        public int NewValue
 | 
						|
        {
 | 
						|
            get { return (_NewValue); }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
 | 
						|
    #endregion
 | 
						|
 | 
						|
    #endregion
 | 
						|
 | 
						|
    #region Interfaces
 | 
						|
 | 
						|
    #region IScrollable
 | 
						|
 | 
						|
    internal interface IScrollable
 | 
						|
    {
 | 
						|
        Rectangle ScrollBounds { get; }
 | 
						|
        Rectangle ScrollBoundsEx { get; }
 | 
						|
 | 
						|
        Point ScrollBoundsOffset { get; }
 | 
						|
 | 
						|
        void InvalidateLayoutBounds(ScrollBarLite sbar);
 | 
						|
    }
 | 
						|
 | 
						|
    #endregion
 | 
						|
 | 
						|
    #endregion
 | 
						|
} |