615 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			615 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Windows.Forms;
 | 
						|
using System.Text;
 | 
						|
using DevComponents.DotNetBar.ScrollBar;
 | 
						|
using System.Drawing;
 | 
						|
using DevComponents.DotNetBar.Rendering;
 | 
						|
using System.Runtime.InteropServices;
 | 
						|
 | 
						|
namespace DevComponents.DotNetBar.Controls
 | 
						|
{
 | 
						|
    internal class ScrollBarImplementation: IDisposable
 | 
						|
    {
 | 
						|
        #region Private Variables
 | 
						|
        private System.Windows.Forms.ScrollBar m_ParentScrollBar = null;
 | 
						|
        private ScrollBarCore m_ScrollBarCore = null;
 | 
						|
        private bool m_FirstPaint = true;
 | 
						|
        private int m_MouseDownTrackOffset = 0;
 | 
						|
        private Timer m_PaintTimer = null;
 | 
						|
        private bool m_IsVScrollBar = false;
 | 
						|
        private IScrollBarExtender m_ParentScrollBarWndProc = null;
 | 
						|
        private bool m_UseLockWindowUpdate = false;
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Constructor
 | 
						|
        public ScrollBarImplementation(System.Windows.Forms.ScrollBar sb)
 | 
						|
        {
 | 
						|
            m_ParentScrollBar = sb;
 | 
						|
            m_ParentScrollBarWndProc = (IScrollBarExtender)m_ParentScrollBar;
 | 
						|
            m_IsVScrollBar = m_ParentScrollBar is VScrollBar;
 | 
						|
 | 
						|
            m_PaintTimer = new Timer();
 | 
						|
            m_PaintTimer.Interval = 50;
 | 
						|
            m_PaintTimer.Tick += new EventHandler(PaintTimerTick);
 | 
						|
 | 
						|
            m_ScrollBarCore = new ScrollBarCore(m_ParentScrollBar, true);
 | 
						|
            //m_ScrollBarCore.IsAppScrollBarStyle = false;
 | 
						|
            if (m_ParentScrollBar is HScrollBar)
 | 
						|
                m_ScrollBarCore.Orientation = eOrientation.Horizontal;
 | 
						|
            else
 | 
						|
                m_ScrollBarCore.Orientation = eOrientation.Vertical;
 | 
						|
            m_ScrollBarCore.Minimum = m_ParentScrollBar.Minimum;
 | 
						|
            m_ScrollBarCore.Maximum = m_ParentScrollBar.Maximum;
 | 
						|
            m_ScrollBarCore.Value = m_ParentScrollBar.Value;
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Internal Implementation
 | 
						|
        internal void OnHandleCreated()
 | 
						|
        {
 | 
						|
            Themes.SetWindowTheme(m_ParentScrollBar.Handle, "", "");
 | 
						|
            UpdateScrollValues();
 | 
						|
        }
 | 
						|
 | 
						|
        internal bool WndProc(ref Message m)
 | 
						|
        {
 | 
						|
            if (m.Msg == (int)WinApi.WindowsMessages.SBM_SETSCROLLINFO || m.Msg == 0x2114 || m.Msg == 0x2115 || m.Msg == (int)WinApi.WindowsMessages.WM_MOUSEMOVE)
 | 
						|
            {
 | 
						|
                CallBaseWndProc(ref m);
 | 
						|
                SendDelayPaintMessage();
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
            else if (m.Msg == (int)WinApi.WindowsMessages.WM_SIZE)
 | 
						|
            {
 | 
						|
                CallBaseWndProc(ref m);
 | 
						|
                m_FirstPaint = true;
 | 
						|
                SendDelayPaintMessage();
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
            else if (m.Msg == (int)WinApi.WindowsMessages.WM_ERASEBKGND)
 | 
						|
            {
 | 
						|
                //PaintUsingDC();
 | 
						|
                //m.Result = new IntPtr(1);
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
            else if (m.Msg == (int)WinApi.WindowsMessages.WM_LBUTTONDOWN)
 | 
						|
            {
 | 
						|
                Point p = new Point(WinApi.LOWORD(m.LParam), WinApi.HIWORD(m.LParam));
 | 
						|
                InternalMouseDown(new MouseEventArgs(GetMouseButton(m.WParam.ToInt32()), 0, p.X, p.Y, 0));
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
            else if (m.Msg == (int)WinApi.WindowsMessages.WM_LBUTTONUP)
 | 
						|
            {
 | 
						|
                Point p = new Point(WinApi.LOWORD(m.LParam), WinApi.HIWORD(m.LParam));
 | 
						|
                InternalMouseUp(new MouseEventArgs(GetMouseButton(m.WParam.ToInt32()), 0, p.X, p.Y, 0));
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
            else if (m.Msg == (int)WinApi.WindowsMessages.WM_LBUTTONDBLCLK)
 | 
						|
            {
 | 
						|
                Point p = new Point(WinApi.LOWORD(m.LParam), WinApi.HIWORD(m.LParam));
 | 
						|
                InternalMouseDoubleClick(new MouseEventArgs(GetMouseButton(m.WParam.ToInt32()), 0, p.X, p.Y, 0));
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
            else if (m.Msg == NativeFunctions.WM_USER + 7)
 | 
						|
            {
 | 
						|
                PaintUsingDC();
 | 
						|
            }
 | 
						|
            else if (m.Msg == (int)WinApi.WindowsMessages.WM_SYSTIMER)
 | 
						|
            {
 | 
						|
                if (m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.Track && Control.MouseButtons == MouseButtons.Left)
 | 
						|
                {
 | 
						|
                    Point p = m_ParentScrollBar.PointToClient(Control.MousePosition);
 | 
						|
                    OnMouseMove(new MouseEventArgs(Control.MouseButtons, 0, p.X, p.Y, 0));
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else if (m.Msg == (int)WinApi.WindowsMessages.WM_CAPTURECHANGED)
 | 
						|
            {
 | 
						|
                // Recapture the mouse...
 | 
						|
                if (m.LParam == IntPtr.Zero && Control.MouseButtons == MouseButtons.Left && m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.Track)
 | 
						|
                {
 | 
						|
                    m_ParentScrollBar.Capture = true;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (m.Msg == (int)WinApi.WindowsMessages.WM_PAINT)
 | 
						|
            {
 | 
						|
                if (m_FirstPaint)
 | 
						|
                {
 | 
						|
                    // Call to base actually updates values returned by GetScrollBarInfo
 | 
						|
                    CallBaseWndProc(ref m);
 | 
						|
                    // Repaint the control once that is done
 | 
						|
                    SendDelayPaintMessage();
 | 
						|
                    m_FirstPaint = false;
 | 
						|
                }
 | 
						|
                WinApi.PAINTSTRUCT ps = new WinApi.PAINTSTRUCT();
 | 
						|
                IntPtr hdc = WinApi.BeginPaint(m.HWnd, ref ps);
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    Graphics g = Graphics.FromHdc(hdc);
 | 
						|
                    try
 | 
						|
                    {
 | 
						|
                        PaintInternal(g, hdc);
 | 
						|
                    }
 | 
						|
                    finally
 | 
						|
                    {
 | 
						|
                        g.Dispose();
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                finally
 | 
						|
                {
 | 
						|
                    WinApi.EndPaint(m.HWnd, ref ps);
 | 
						|
                }
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
 | 
						|
        private void CallBaseWndProc(ref Message m)
 | 
						|
        {
 | 
						|
            m_ParentScrollBarWndProc.CallBaseWndProc(ref m);
 | 
						|
        }
 | 
						|
 | 
						|
        private void SendDelayPaintMessage()
 | 
						|
        {
 | 
						|
            m_PaintTimer.Start();
 | 
						|
        }
 | 
						|
 | 
						|
        void PaintTimerTick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            m_PaintTimer.Stop();
 | 
						|
            PaintUsingDC();
 | 
						|
        }
 | 
						|
 | 
						|
        private void InternalMouseDoubleClick(MouseEventArgs me)
 | 
						|
        {
 | 
						|
            PerformThumbClick(me.X, me.Y);
 | 
						|
        }
 | 
						|
 | 
						|
        private void PerformThumbClick(int mouseX, int mouseY)
 | 
						|
        {
 | 
						|
            if (m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.ThumbDecrease)
 | 
						|
                this.SetValue(Math.Max(m_ParentScrollBar.Value - m_ParentScrollBar.SmallChange, m_ParentScrollBar.Minimum), ScrollEventType.SmallDecrement);
 | 
						|
            else if (m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.ThumbIncrease)
 | 
						|
                this.SetValue(Math.Min(m_ParentScrollBar.Value + m_ParentScrollBar.SmallChange, m_ParentScrollBar.Maximum), ScrollEventType.SmallIncrement);
 | 
						|
            else if (m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.Control)
 | 
						|
            {
 | 
						|
                if (this.IsVScroll)
 | 
						|
                {
 | 
						|
                    if (mouseY < m_ScrollBarCore.TrackRectangle.Y)
 | 
						|
                        this.SetValue(Math.Max(m_ParentScrollBar.Value - m_ParentScrollBar.LargeChange, m_ParentScrollBar.Minimum), ScrollEventType.LargeDecrement);
 | 
						|
                    else if (mouseY > m_ScrollBarCore.TrackRectangle.Bottom)
 | 
						|
                        this.SetValue(Math.Min(m_ParentScrollBar.Value + m_ParentScrollBar.LargeChange, m_ParentScrollBar.Maximum), ScrollEventType.LargeIncrement);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    if (mouseX < m_ScrollBarCore.TrackRectangle.X)
 | 
						|
                        this.SetValue(Math.Max(m_ParentScrollBar.Value - m_ParentScrollBar.LargeChange, m_ParentScrollBar.Minimum), ScrollEventType.LargeDecrement);
 | 
						|
                    else if (mouseX > m_ScrollBarCore.TrackRectangle.Right)
 | 
						|
                        this.SetValue(Math.Min(m_ParentScrollBar.Value + m_ParentScrollBar.LargeChange, m_ParentScrollBar.Maximum), ScrollEventType.LargeIncrement);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void SetValue(int newValue, ScrollEventType type)
 | 
						|
        {
 | 
						|
            //FieldInfo fi = typeof(System.Windows.Forms.ScrollBar).GetField("value", BindingFlags.NonPublic | BindingFlags.Instance);
 | 
						|
            //if (fi != null)
 | 
						|
            //{
 | 
						|
            //    fi.SetValue(this, newValue);
 | 
						|
            //    UpdateSystemScrollInfo();
 | 
						|
            //}
 | 
						|
            //else
 | 
						|
 | 
						|
            if (m_ParentScrollBar.Value == newValue) return;
 | 
						|
 | 
						|
            if (m_UseLockWindowUpdate && m_ParentScrollBar.Parent != null)
 | 
						|
                NativeFunctions.LockWindowUpdate(m_ParentScrollBar.Parent.Handle);
 | 
						|
            else
 | 
						|
                NativeFunctions.SendMessage(m_ParentScrollBar.Handle, NativeFunctions.WM_SETREDRAW, 0, 0);
 | 
						|
 | 
						|
            m_ParentScrollBarWndProc.SetValue(newValue, type);
 | 
						|
            if (m_UseLockWindowUpdate && m_ParentScrollBar.Parent != null)
 | 
						|
                NativeFunctions.LockWindowUpdate(IntPtr.Zero);
 | 
						|
            else
 | 
						|
                NativeFunctions.SendMessage(m_ParentScrollBar.Handle, NativeFunctions.WM_SETREDRAW, 1, 0);
 | 
						|
 | 
						|
            if (m_ParentScrollBar.Parent is DataGridView && type == ScrollEventType.ThumbTrack)
 | 
						|
            {
 | 
						|
                if (m_UseLockWindowUpdate)
 | 
						|
                    m_ParentScrollBar.Parent.Refresh();
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    Point p = m_ParentScrollBar.PointToClient(Control.MousePosition);
 | 
						|
                    if (!m_ParentScrollBar.ClientRectangle.Contains(p)) 
 | 
						|
                        m_ParentScrollBar.Parent.Refresh();
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            PaintUsingDC();
 | 
						|
        }
 | 
						|
 | 
						|
        //private void UpdateSystemScrollInfo()
 | 
						|
        //{
 | 
						|
        //    if (this.IsHandleCreated && this.Enabled)
 | 
						|
        //    {
 | 
						|
        //        WinApi.SCROLLINFO si = new WinApi.SCROLLINFO();
 | 
						|
        //        si.cbSize = Marshal.SizeOf(typeof(WinApi.SCROLLINFO));
 | 
						|
        //        si.fMask = 0x17;
 | 
						|
        //        si.nMin = this.Minimum;
 | 
						|
        //        si.nMax = this.Maximum;
 | 
						|
        //        si.nPage = this.LargeChange;
 | 
						|
        //        if (this.RightToLeft == RightToLeft.Yes)
 | 
						|
        //        {
 | 
						|
        //            MethodInfo mi = typeof(System.Windows.Forms.ScrollBar).GetMethod("ReflectPosition", BindingFlags.NonPublic | BindingFlags.Instance);
 | 
						|
        //            if(mi!=null)
 | 
						|
        //                si.nPos = (int)mi.Invoke(this, new object[]{this.Value});
 | 
						|
        //            //= this.ReflectPosition(this.value);
 | 
						|
        //        }
 | 
						|
        //        else
 | 
						|
        //        {
 | 
						|
        //            si.nPos = this.Value;
 | 
						|
        //        }
 | 
						|
        //        si.nTrackPos = 0;
 | 
						|
        //        WinApi.SetScrollInfo(new HandleRef(this, this.Handle), 2, ref si, false);
 | 
						|
        //    }
 | 
						|
        //}
 | 
						|
 | 
						|
        private void InternalMouseUp(MouseEventArgs mouseEventArgs)
 | 
						|
        {
 | 
						|
            StopAutoScrollTimer();
 | 
						|
            m_ScrollBarCore.MouseUp(mouseEventArgs);
 | 
						|
            m_ParentScrollBar.Invalidate();
 | 
						|
            m_MouseDownTrackOffset = 0;
 | 
						|
 | 
						|
            if (m_ParentScrollBar.Capture)
 | 
						|
                m_ParentScrollBar.Capture = false;
 | 
						|
        }
 | 
						|
 | 
						|
        private void InternalMouseDown(MouseEventArgs me)
 | 
						|
        {
 | 
						|
            m_MouseDownTrackOffset = 0;
 | 
						|
            m_ScrollBarCore.MouseDown(me);
 | 
						|
            if (m_ScrollBarCore.MouseOverPart != ScrollBarCore.eScrollPart.Track && m_ScrollBarCore.MouseOverPart != ScrollBarCore.eScrollPart.None)
 | 
						|
            {
 | 
						|
                PerformThumbClick(me.X, me.Y);
 | 
						|
                StartAutoScrollTimer();
 | 
						|
            }
 | 
						|
            else if (m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.Track)
 | 
						|
            {
 | 
						|
                if (IsVScroll)
 | 
						|
                    m_MouseDownTrackOffset = me.Y - m_ScrollBarCore.TrackRectangle.Y;
 | 
						|
                else
 | 
						|
                    m_MouseDownTrackOffset = me.X - m_ScrollBarCore.TrackRectangle.X;
 | 
						|
            }
 | 
						|
            PaintUsingDC();
 | 
						|
        }
 | 
						|
 | 
						|
        private Timer m_Timer = null;
 | 
						|
        private void StartAutoScrollTimer()
 | 
						|
        {
 | 
						|
            if (m_Timer == null)
 | 
						|
            {
 | 
						|
                m_Timer = new Timer();
 | 
						|
                m_Timer.Interval = 150;
 | 
						|
                m_Timer.Tick += new EventHandler(TimerScrollTick);
 | 
						|
            }
 | 
						|
            m_Timer.Start();
 | 
						|
        }
 | 
						|
 | 
						|
        private void TimerScrollTick(object sender, EventArgs e)
 | 
						|
        {
 | 
						|
            Point p = m_ParentScrollBar.PointToClient(Control.MousePosition);
 | 
						|
            PerformThumbClick(p.X, p.Y);
 | 
						|
        }
 | 
						|
 | 
						|
        private void StopAutoScrollTimer()
 | 
						|
        {
 | 
						|
            if (m_Timer != null)
 | 
						|
            {
 | 
						|
                m_Timer.Stop();
 | 
						|
                m_Timer.Dispose();
 | 
						|
                m_Timer = null;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private MouseButtons GetMouseButton(int wParam)
 | 
						|
        {
 | 
						|
            MouseButtons mb = MouseButtons.None;
 | 
						|
            if ((wParam & (int)WinApi.MouseKeyState.MK_LBUTTON) != 0)
 | 
						|
                mb |= MouseButtons.Left;
 | 
						|
            if ((wParam & (int)WinApi.MouseKeyState.MK_MBUTTON) != 0)
 | 
						|
                mb |= MouseButtons.Middle;
 | 
						|
            if ((wParam & (int)WinApi.MouseKeyState.MK_RBUTTON) != 0)
 | 
						|
                mb |= MouseButtons.Right;
 | 
						|
            if ((wParam & (int)WinApi.MouseKeyState.MK_XBUTTON1) != 0)
 | 
						|
                mb |= MouseButtons.XButton1;
 | 
						|
            if ((wParam & (int)WinApi.MouseKeyState.MK_XBUTTON2) != 0)
 | 
						|
                mb |= MouseButtons.XButton2;
 | 
						|
 | 
						|
            return mb;
 | 
						|
        }
 | 
						|
 | 
						|
        private void PaintUsingDC()
 | 
						|
        {
 | 
						|
            IntPtr hdc = WinApi.GetWindowDC(m_ParentScrollBar.Handle);
 | 
						|
            try
 | 
						|
            {
 | 
						|
                Graphics g = Graphics.FromHdc(hdc);
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    PaintInternal(g, hdc);
 | 
						|
                }
 | 
						|
                finally
 | 
						|
                {
 | 
						|
                    g.Dispose();
 | 
						|
                }
 | 
						|
            }
 | 
						|
            finally
 | 
						|
            {
 | 
						|
                WinApi.ReleaseDC(m_ParentScrollBar.Handle, hdc);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void PaintInternal(Graphics g, IntPtr hdc)
 | 
						|
        {
 | 
						|
            UpdateScrollValues();
 | 
						|
            using (BufferedBitmap bmp = new BufferedBitmap(g, new Rectangle(0, 0, m_ParentScrollBar.Width, m_ParentScrollBar.Height)))
 | 
						|
            {
 | 
						|
                m_ScrollBarCore.Paint(GetItemPaintArgs(bmp.Graphics));
 | 
						|
                bmp.Render(g);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private ItemPaintArgs GetItemPaintArgs(Graphics g)
 | 
						|
        {
 | 
						|
            ItemPaintArgs pa = new ItemPaintArgs(m_ParentScrollBar as IOwner, m_ParentScrollBar, g, GetColorScheme());
 | 
						|
            pa.Renderer = this.GetRenderer();
 | 
						|
            pa.DesignerSelection = false;
 | 
						|
            pa.GlassEnabled = false;
 | 
						|
            return pa;
 | 
						|
        }
 | 
						|
 | 
						|
        private ColorScheme m_ColorScheme = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Returns the color scheme used by control. Color scheme for Office2007 style will be retrived from the current renderer instead of
 | 
						|
        /// local color scheme referenced by ColorScheme property.
 | 
						|
        /// </summary>
 | 
						|
        /// <returns>An instance of ColorScheme object.</returns>
 | 
						|
        protected virtual ColorScheme GetColorScheme()
 | 
						|
        {
 | 
						|
            BaseRenderer r = GetRenderer();
 | 
						|
            if (r is Office2007Renderer)
 | 
						|
                return ((Office2007Renderer)r).ColorTable.LegacyColors;
 | 
						|
            if (m_ColorScheme == null)
 | 
						|
                m_ColorScheme = new ColorScheme(eDotNetBarStyle.Office2007);
 | 
						|
            return m_ColorScheme;
 | 
						|
        }
 | 
						|
 | 
						|
        private Rendering.BaseRenderer m_DefaultRenderer = null;
 | 
						|
        private Rendering.BaseRenderer m_Renderer = null;
 | 
						|
        private eRenderMode m_RenderMode = eRenderMode.Global;
 | 
						|
        /// <summary>
 | 
						|
        /// Returns the renderer control will be rendered with.
 | 
						|
        /// </summary>
 | 
						|
        /// <returns>The current renderer.</returns>
 | 
						|
        public virtual Rendering.BaseRenderer GetRenderer()
 | 
						|
        {
 | 
						|
            if (m_RenderMode == eRenderMode.Global && Rendering.GlobalManager.Renderer != null)
 | 
						|
                return Rendering.GlobalManager.Renderer;
 | 
						|
            else if (m_RenderMode == eRenderMode.Custom && m_Renderer != null)
 | 
						|
                return m_Renderer;
 | 
						|
 | 
						|
            if (m_DefaultRenderer == null)
 | 
						|
                m_DefaultRenderer = new Rendering.Office2007Renderer();
 | 
						|
 | 
						|
            return m_DefaultRenderer;
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the redering mode used by control. Default value is eRenderMode.Global which means that static GlobalManager.Renderer is used. If set to Custom then Renderer property must
 | 
						|
        /// also be set to the custom renderer that will be used.
 | 
						|
        /// </summary>
 | 
						|
        public eRenderMode RenderMode
 | 
						|
        {
 | 
						|
            get { return m_RenderMode; }
 | 
						|
            set
 | 
						|
            {
 | 
						|
                if (m_RenderMode != value)
 | 
						|
                {
 | 
						|
                    m_RenderMode = value;
 | 
						|
                    m_ParentScrollBar.Invalidate(true);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the custom renderer used by the items on this control. RenderMode property must also be set to eRenderMode.Custom in order renderer
 | 
						|
        /// specified here to be used.
 | 
						|
        /// </summary>
 | 
						|
        public DevComponents.DotNetBar.Rendering.BaseRenderer Renderer
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return m_Renderer;
 | 
						|
            }
 | 
						|
            set { m_Renderer = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        internal void OnMouseEnter(EventArgs e)
 | 
						|
        {
 | 
						|
            if (m_ParentScrollBar.Capture)
 | 
						|
                m_ParentScrollBar.Capture = false;
 | 
						|
        }
 | 
						|
 | 
						|
        internal void OnMouseLeave(EventArgs e)
 | 
						|
        {
 | 
						|
            StopAutoScrollTimer();
 | 
						|
            if (m_ScrollBarCore.MouseOverPart != ScrollBarCore.eScrollPart.None && Control.MouseButtons == MouseButtons.Left)
 | 
						|
                m_ParentScrollBar.Capture = true;
 | 
						|
            if (m_ScrollBarCore.IsMouseDown && Control.MouseButtons == MouseButtons.None)
 | 
						|
            {
 | 
						|
                m_ScrollBarCore.MouseUp(new MouseEventArgs(MouseButtons.Left, 0, -10, -10, 0));
 | 
						|
                SendDelayPaintMessage();
 | 
						|
            }
 | 
						|
            else
 | 
						|
                m_ScrollBarCore.MouseLeave();
 | 
						|
        }
 | 
						|
 | 
						|
        internal void OnMouseMove(MouseEventArgs e)
 | 
						|
        {
 | 
						|
            m_ScrollBarCore.MouseMove(e);
 | 
						|
            if (m_ScrollBarCore.MouseOverPart == ScrollBarCore.eScrollPart.Track && e.Button == MouseButtons.Left)
 | 
						|
            {
 | 
						|
                Point p = m_ParentScrollBar.PointToClient(Control.MousePosition);
 | 
						|
                SetValue(ValueFromMouseCoordinates(p), ScrollEventType.ThumbTrack);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private int ValueFromMouseCoordinates(Point p)
 | 
						|
        {
 | 
						|
            if (IsVScroll)
 | 
						|
            {
 | 
						|
                int trackY = p.Y - m_MouseDownTrackOffset;
 | 
						|
                trackY = Math.Max(trackY, m_ScrollBarCore.ThumbDecreaseRectangle.Bottom);
 | 
						|
                trackY = Math.Min(trackY, m_ScrollBarCore.ThumbIncreaseRectangle.Y - GetTrackSize());
 | 
						|
                trackY -= m_ScrollBarCore.ThumbDecreaseRectangle.Bottom;
 | 
						|
 | 
						|
                int totalSize = GetAvailableTrackArea() - GetTrackSize();
 | 
						|
                return (int)((m_ParentScrollBar.Maximum - m_ParentScrollBar.Minimum) * ((float)trackY / (float)totalSize));
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                int trackX = p.X - m_MouseDownTrackOffset;
 | 
						|
                trackX = Math.Max(trackX, m_ScrollBarCore.ThumbDecreaseRectangle.Right);
 | 
						|
                trackX = Math.Min(trackX, m_ScrollBarCore.ThumbIncreaseRectangle.X - GetTrackSize());
 | 
						|
                trackX -= m_ScrollBarCore.ThumbDecreaseRectangle.Right;
 | 
						|
 | 
						|
                int totalSize = GetAvailableTrackArea() - GetTrackSize();
 | 
						|
                return (int)((m_ParentScrollBar.Maximum - m_ParentScrollBar.Minimum) * ((float)trackX / (float)totalSize));
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private int GetTrackSize()
 | 
						|
        {
 | 
						|
            if (IsVScroll)
 | 
						|
                return m_ScrollBarCore.TrackRectangle.Height;
 | 
						|
            else
 | 
						|
                return m_ScrollBarCore.TrackRectangle.Width;
 | 
						|
        }
 | 
						|
 | 
						|
        private int GetAvailableTrackArea()
 | 
						|
        {
 | 
						|
            if (IsVScroll)
 | 
						|
                return m_ScrollBarCore.DisplayRectangle.Height - m_ScrollBarCore.ThumbDecreaseRectangle.Height - m_ScrollBarCore.ThumbIncreaseRectangle.Height;
 | 
						|
            else
 | 
						|
                return m_ScrollBarCore.DisplayRectangle.Width - m_ScrollBarCore.ThumbDecreaseRectangle.Width - m_ScrollBarCore.ThumbIncreaseRectangle.Width;
 | 
						|
        }
 | 
						|
 | 
						|
        private bool IsVScroll
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return m_IsVScrollBar;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private void UpdateScrollValues()
 | 
						|
        {
 | 
						|
            WinApi.SCROLLBARINFO psbi = new WinApi.SCROLLBARINFO();
 | 
						|
            psbi.cbSize = Marshal.SizeOf(psbi);
 | 
						|
 | 
						|
            WinApi.GetScrollBarInfo(m_ParentScrollBar.Handle, (uint)WinApi.eObjectId.OBJID_CLIENT, ref psbi);
 | 
						|
 | 
						|
            Rectangle displayRect = new Rectangle(0, 0, m_ParentScrollBar.Width, m_ParentScrollBar.Height);
 | 
						|
 | 
						|
            if (IsVScroll)
 | 
						|
            {
 | 
						|
                if (m_ScrollBarCore.DisplayRectangle != displayRect)
 | 
						|
                    m_ScrollBarCore.DisplayRectangle = displayRect;
 | 
						|
 | 
						|
                Rectangle thumbRect = new Rectangle(displayRect.X, displayRect.Y, displayRect.Width, psbi.dxyLineButton);
 | 
						|
                if (m_ScrollBarCore.ThumbDecreaseRectangle != thumbRect)
 | 
						|
                    m_ScrollBarCore.ThumbDecreaseRectangle = thumbRect;
 | 
						|
 | 
						|
                thumbRect = new Rectangle(displayRect.X, displayRect.Bottom - psbi.dxyLineButton, displayRect.Width, psbi.dxyLineButton);
 | 
						|
                if (m_ScrollBarCore.ThumbIncreaseRectangle != thumbRect)
 | 
						|
                    m_ScrollBarCore.ThumbIncreaseRectangle = thumbRect;
 | 
						|
 | 
						|
                thumbRect = new Rectangle(displayRect.X, displayRect.Y + psbi.xyThumbTop, displayRect.Width, psbi.xyThumbBottom - psbi.xyThumbTop);
 | 
						|
                if (m_ScrollBarCore.TrackRectangle != thumbRect)
 | 
						|
                    m_ScrollBarCore.TrackRectangle = thumbRect;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                if (m_ScrollBarCore.DisplayRectangle != displayRect)
 | 
						|
                    m_ScrollBarCore.DisplayRectangle = displayRect;
 | 
						|
 | 
						|
                Rectangle thumbRect = new Rectangle(displayRect.X, displayRect.Y, psbi.dxyLineButton, displayRect.Height);
 | 
						|
                if (m_ScrollBarCore.ThumbDecreaseRectangle != thumbRect)
 | 
						|
                    m_ScrollBarCore.ThumbDecreaseRectangle = thumbRect;
 | 
						|
 | 
						|
                thumbRect = new Rectangle(displayRect.Right - psbi.dxyLineButton, displayRect.Y, psbi.dxyLineButton, displayRect.Height);
 | 
						|
                if (m_ScrollBarCore.ThumbIncreaseRectangle != thumbRect)
 | 
						|
                    m_ScrollBarCore.ThumbIncreaseRectangle = thumbRect;
 | 
						|
 | 
						|
                thumbRect = new Rectangle(displayRect.X + psbi.xyThumbTop, displayRect.Y, psbi.xyThumbBottom - psbi.xyThumbTop, displayRect.Height);
 | 
						|
                if (m_ScrollBarCore.TrackRectangle != thumbRect)
 | 
						|
                    m_ScrollBarCore.TrackRectangle = thumbRect;
 | 
						|
            }
 | 
						|
 | 
						|
            if (m_ScrollBarCore.Minimum != m_ParentScrollBar.Minimum)
 | 
						|
                m_ScrollBarCore.Minimum = m_ParentScrollBar.Minimum;
 | 
						|
            if (m_ScrollBarCore.Maximum != m_ParentScrollBar.Maximum)
 | 
						|
                m_ScrollBarCore.Maximum = m_ParentScrollBar.Maximum;
 | 
						|
            if (m_ScrollBarCore.SmallChange != m_ParentScrollBar.SmallChange)
 | 
						|
                m_ScrollBarCore.SmallChange = m_ParentScrollBar.SmallChange;
 | 
						|
            if (m_ScrollBarCore.LargeChange != m_ParentScrollBar.LargeChange)
 | 
						|
                m_ScrollBarCore.LargeChange = m_ParentScrollBar.LargeChange;
 | 
						|
            if (m_ScrollBarCore.Value != m_ParentScrollBar.Value)
 | 
						|
                m_ScrollBarCore.Value = m_ParentScrollBar.Value;
 | 
						|
        }
 | 
						|
 | 
						|
        internal void NotifyInvalidate(Rectangle invalidatedArea)
 | 
						|
        {
 | 
						|
 | 
						|
        }
 | 
						|
 | 
						|
        //public bool IsAppScrollBarStyle
 | 
						|
        //{
 | 
						|
        //    get { return m_ScrollBarCore.IsAppScrollBarStyle; }
 | 
						|
        //    set
 | 
						|
        //    {
 | 
						|
        //        m_ScrollBarCore.IsAppScrollBarStyle = value;
 | 
						|
        //        m_ParentScrollBar.Invalidate();
 | 
						|
        //    }
 | 
						|
        //}
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region IDisposable Members
 | 
						|
 | 
						|
        public void Dispose()
 | 
						|
        {
 | 
						|
            if (m_ScrollBarCore != null)
 | 
						|
            {
 | 
						|
                m_ScrollBarCore.Dispose();
 | 
						|
                m_ScrollBarCore = null;
 | 
						|
            }
 | 
						|
            if (m_PaintTimer != null)
 | 
						|
            {
 | 
						|
                m_PaintTimer.Stop();
 | 
						|
                m_PaintTimer.Dispose();
 | 
						|
                m_PaintTimer = null;
 | 
						|
            }
 | 
						|
            StopAutoScrollTimer();
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        internal interface IScrollBarExtender
 | 
						|
        {
 | 
						|
            void CallBaseWndProc(ref Message m);
 | 
						|
            void SetValue(int newValue, ScrollEventType type);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |