495 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			495 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.ComponentModel;
 | |
| using System.Text;
 | |
| using System.Windows.Forms;
 | |
| using DevComponents.DotNetBar.ScrollBar;
 | |
| using System.Drawing;
 | |
| using System.Runtime.InteropServices;
 | |
| 
 | |
| namespace DevComponents.DotNetBar.Controls
 | |
| {
 | |
|     internal class ScrollbarSkinner : IDisposable
 | |
|     {
 | |
|         #region Constructor
 | |
|         private const int ScrollPositionUpdateDelay = 400;
 | |
|         private HScrollBarAdv _HScrollBar = null;
 | |
|         private VScrollBarAdv _VScrollBar = null;
 | |
|         private Control _Thumb = null;
 | |
|         private Control _Parent = null;
 | |
|         public ScrollbarSkinner(Control parent)
 | |
|         {
 | |
|             if(parent == null)
 | |
|                 throw new ArgumentNullException("Parent cannot be null");
 | |
|             if (!(parent is IScrollBarOverrideSupport))
 | |
|                 throw new ArgumentException("parent must implement IScrollBarOverrideSupport interface.");
 | |
| 
 | |
|             _Parent = parent;
 | |
| 
 | |
|             _HScrollBar = new HScrollBarAdv();
 | |
|             _HScrollBar.Visible = false;
 | |
|             _HScrollBar.Appearance = _ScrollBarAppearance;
 | |
|             _HScrollBar.Scroll += HScrollBarScroll;
 | |
|             _VScrollBar = new VScrollBarAdv();
 | |
|             _VScrollBar.Visible = false;
 | |
|             _VScrollBar.Appearance = _ScrollBarAppearance;
 | |
|             _VScrollBar.Scroll += VScrollBarScroll;
 | |
|             _Thumb = new Control();
 | |
|             _Thumb.Visible = false;
 | |
|             _Thumb.BackColor = SystemColors.Window;
 | |
| 
 | |
|             if (_Parent.Parent != null)
 | |
|             {
 | |
|                 AttachScrollbars();
 | |
|             }
 | |
|             WireParent();
 | |
| 
 | |
|             if(_Parent.IsHandleCreated)
 | |
|                 UpdateScrollBars();
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region Implementation
 | |
| 
 | |
|         private void WireParent()
 | |
|         {
 | |
|             _Parent.ParentChanged += ParentParentChanged;
 | |
|             _Parent.HandleCreated += ParentHandleCreated;
 | |
|             _Parent.Resize += ParentResize;
 | |
|             IScrollBarOverrideSupport sbo = (IScrollBarOverrideSupport)_Parent;
 | |
|             sbo.NonClientSizeChanged += NonClientSizeChanged;
 | |
|             sbo.ScrollBarValueChanged += ControlScrollBarValueChanged;
 | |
|         }
 | |
| 
 | |
|         void ParentResize(object sender, EventArgs e)
 | |
|         {
 | |
|             UpdateScrollBars();
 | |
|         }
 | |
| 
 | |
|         void ParentHandleCreated(object sender, EventArgs e)
 | |
|         {
 | |
|             UpdateScrollBars();
 | |
|         }
 | |
|         private void NonClientSizeChanged(object sender, EventArgs e)
 | |
|         {
 | |
|             UpdateScrollBars();
 | |
|         }
 | |
|         private void ControlScrollBarValueChanged(object sender, ScrollValueChangedEventArgs e)
 | |
|         {
 | |
|             if ((e.ScrollChange & eScrollBarScrollChange.Vertical) == eScrollBarScrollChange.Vertical)
 | |
|             {
 | |
|                 UpdateVerticalScrollBarValues();
 | |
|             }
 | |
|             if ((e.ScrollChange & eScrollBarScrollChange.MouseWheel) == eScrollBarScrollChange.MouseWheel)
 | |
|             {
 | |
|                 if (_VScrollBar.Visible)
 | |
|                 {
 | |
|                     UpdateVerticalScrollBarValues();
 | |
|                     InvokeDelayed(new MethodInvoker(delegate { UpdateVerticalScrollBarValues(); }), ScrollPositionUpdateDelay);
 | |
|                 }
 | |
|                 else if (_HScrollBar.Visible)
 | |
|                 {
 | |
|                     UpdateHorizontalScrollBarValues();
 | |
|                     InvokeDelayed(new MethodInvoker(delegate { UpdateHorizontalScrollBarValues(); }), ScrollPositionUpdateDelay);
 | |
|                 }
 | |
|             }
 | |
|             if ((e.ScrollChange & eScrollBarScrollChange.Horizontal) == eScrollBarScrollChange.Horizontal)
 | |
|             {
 | |
|                 UpdateHorizontalScrollBarValues();
 | |
|             }
 | |
|             UpdateScrollBars();
 | |
|         }
 | |
|         private void UnwireParent()
 | |
|         {
 | |
|             _Parent.ParentChanged -= ParentParentChanged;
 | |
|             _Parent.HandleCreated -= ParentHandleCreated;
 | |
|             _Parent.Resize -= ParentResize;
 | |
|             IScrollBarOverrideSupport sbo = (IScrollBarOverrideSupport)_Parent;
 | |
|             sbo.NonClientSizeChanged -= NonClientSizeChanged;
 | |
|             sbo.ScrollBarValueChanged -= ControlScrollBarValueChanged;
 | |
|         }
 | |
| 
 | |
|         void ParentParentChanged(object sender, EventArgs e)
 | |
|         {
 | |
|             AttachScrollbars();
 | |
|             UpdateScrollBars();
 | |
|         }
 | |
| 
 | |
|         private bool _UpdatingScrollbars = false;
 | |
|         protected virtual void UpdateScrollBarsDelayed()
 | |
|         {
 | |
|             InvokeDelayed(new MethodInvoker(delegate { UpdateScrollBars(); }), ScrollPositionUpdateDelay);
 | |
|         }
 | |
|         protected virtual void UpdateScrollBars()
 | |
|         {
 | |
|             if (_Parent == null || _Parent.Parent == null || !_Parent.IsHandleCreated || _UpdatingScrollbars) return;
 | |
|             _UpdatingScrollbars = true;
 | |
|             try
 | |
|             {
 | |
|                 Control scrollOverrideControl = _Parent;
 | |
|                 if (scrollOverrideControl == null || ((IScrollBarOverrideSupport)scrollOverrideControl).DesignMode)
 | |
|                 {
 | |
|                     if (_HScrollBar.Visible) _HScrollBar.Visible = false;
 | |
|                     if (_VScrollBar.Visible) _VScrollBar.Visible = false;
 | |
|                     return;
 | |
|                 }
 | |
|                 WinApi.SCROLLBARINFO psbi = new WinApi.SCROLLBARINFO();
 | |
|                 psbi.cbSize = Marshal.SizeOf(psbi);
 | |
|                 WinApi.GetScrollBarInfo(scrollOverrideControl.Handle, (uint)WinApi.eObjectId.OBJID_VSCROLL, ref psbi);
 | |
|                 if (psbi.rgstate[0] != (int)WinApi.eStateFlags.STATE_SYSTEM_INVISIBLE)
 | |
|                 {
 | |
|                     Rectangle vsBounds = psbi.rcScrollBar.ToRectangle();
 | |
|                     vsBounds.Location = scrollOverrideControl.Parent.PointToClient(vsBounds.Location);
 | |
|                     Rectangle scrollCountrolBounds = scrollOverrideControl.Bounds;
 | |
|                     if (!scrollCountrolBounds.Contains(vsBounds))
 | |
|                     {
 | |
|                         // We need to guess bounds for best performance and appearance
 | |
|                         if (vsBounds.Right > scrollCountrolBounds.Right)
 | |
|                         {
 | |
|                             vsBounds.X = scrollCountrolBounds.Right - vsBounds.Width;
 | |
|                         }
 | |
|                         else if (vsBounds.X < scrollCountrolBounds.X)
 | |
|                         {
 | |
|                             vsBounds.X = 0;
 | |
|                         }
 | |
|                     }
 | |
|                     if (_VScrollBar.Bounds != vsBounds)
 | |
|                     {
 | |
|                         _VScrollBar.Bounds = vsBounds;
 | |
|                         UpdateVerticalScrollBarValues();
 | |
|                     }
 | |
|                     if (!_VScrollBar.Visible)
 | |
|                     {
 | |
|                         _VScrollBar.Visible = true;
 | |
|                         _VScrollBar.BringToFront();
 | |
|                         _VScrollBar.Refresh();
 | |
|                         InvokeDelayed(new MethodInvoker(delegate { UpdateVerticalScrollBarValues(); }), ScrollPositionUpdateDelay);
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         _VScrollBar.BringToFront();
 | |
|                     }
 | |
| 
 | |
|                     if (psbi.rgstate[0] == (int)WinApi.eStateFlags.STATE_SYSTEM_UNAVAILABLE)
 | |
|                         _VScrollBar.Enabled = false;
 | |
|                     else if (!_VScrollBar.Enabled)
 | |
|                         _VScrollBar.Enabled = true;
 | |
|                     //Console.WriteLine("VscrollBar Bounds detection {0}", vsBounds);
 | |
|                 }
 | |
|                 else if (_VScrollBar.Visible)
 | |
|                     _VScrollBar.Visible = false;
 | |
| 
 | |
|                 psbi = new WinApi.SCROLLBARINFO();
 | |
|                 psbi.cbSize = Marshal.SizeOf(psbi);
 | |
|                 WinApi.GetScrollBarInfo(scrollOverrideControl.Handle, (uint)WinApi.eObjectId.OBJID_HSCROLL, ref psbi);
 | |
|                 if (psbi.rgstate[0] != (int)WinApi.eStateFlags.STATE_SYSTEM_INVISIBLE)
 | |
|                 {
 | |
|                     Rectangle hsBounds = psbi.rcScrollBar.ToRectangle();
 | |
|                     hsBounds.Location = scrollOverrideControl.Parent.PointToClient(hsBounds.Location);
 | |
|                     Rectangle scrollCountrolBounds = scrollOverrideControl.Bounds;
 | |
|                     if (!scrollCountrolBounds.Contains(hsBounds))
 | |
|                     {
 | |
|                         // We need to guess bounds for best performance and appearance
 | |
|                         if (hsBounds.Bottom > scrollCountrolBounds.Bottom)
 | |
|                         {
 | |
|                             hsBounds.Y = scrollCountrolBounds.Bottom - hsBounds.Height;
 | |
|                         }
 | |
|                     }
 | |
|                     if (_VScrollBar.Visible && hsBounds.Width == scrollCountrolBounds.Width)
 | |
|                         hsBounds.Width -= _VScrollBar.Width;
 | |
|                     if (_HScrollBar.Bounds != hsBounds)
 | |
|                     {
 | |
|                         _HScrollBar.Bounds = hsBounds;
 | |
|                         UpdateHorizontalScrollBarValues();
 | |
|                     }
 | |
|                     if (!_HScrollBar.Visible)
 | |
|                     {
 | |
|                         _HScrollBar.Visible = true;
 | |
|                         _HScrollBar.BringToFront();
 | |
|                         _HScrollBar.Refresh();
 | |
|                         InvokeDelayed(new MethodInvoker(delegate { UpdateHorizontalScrollBarValues(); }), ScrollPositionUpdateDelay);
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         _HScrollBar.BringToFront();
 | |
|                     }
 | |
| 
 | |
|                     if (psbi.rgstate[0] == (int)WinApi.eStateFlags.STATE_SYSTEM_UNAVAILABLE)
 | |
|                         _HScrollBar.Enabled = false;
 | |
|                     else if (!_HScrollBar.Enabled)
 | |
|                         _HScrollBar.Enabled = true;
 | |
|                 }
 | |
|                 else if (_HScrollBar.Visible)
 | |
|                     _HScrollBar.Visible = false;
 | |
| 
 | |
|                 if (_HScrollBar.Visible && _VScrollBar.Visible)
 | |
|                 {
 | |
|                     _Thumb.Bounds = new Rectangle(_VScrollBar.Left, _VScrollBar.Bounds.Bottom, _VScrollBar.Width, _HScrollBar.Height);
 | |
|                     _Thumb.Visible = true;
 | |
|                     _Thumb.BringToFront();
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     _Thumb.Visible = false;
 | |
|                 }
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 _UpdatingScrollbars = false;
 | |
|             }
 | |
|         }
 | |
|         private void AttachScrollbars()
 | |
|         {
 | |
|             DetachScrollbars();
 | |
| 
 | |
|             Control host = _Parent.Parent;
 | |
|             if (host != null)
 | |
|             {
 | |
|                 if (host is TableLayoutPanel)
 | |
|                 {
 | |
|                     while (host is TableLayoutPanel)
 | |
|                     {
 | |
|                         host = host.Parent;
 | |
|                     }
 | |
|                 }
 | |
|                 if (host != null)
 | |
|                 {
 | |
|                     host.Controls.Add(_VScrollBar);
 | |
|                     host.Controls.Add(_HScrollBar);
 | |
|                     host.Controls.Add(_Thumb);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void DetachScrollbars()
 | |
|         {
 | |
|             if (_VScrollBar.Parent != null)
 | |
|                 _VScrollBar.Parent.Controls.Remove(_VScrollBar);
 | |
|             if (_HScrollBar.Parent != null)
 | |
|                 _HScrollBar.Parent.Controls.Remove(_HScrollBar);
 | |
|             if (_Thumb.Parent != null)
 | |
|                 _Thumb.Parent.Controls.Remove(_Thumb);
 | |
| 
 | |
|             _VScrollBar.Visible = false;
 | |
|             _HScrollBar.Visible = false;
 | |
|             _Thumb.Visible = false;
 | |
|         }
 | |
| 
 | |
|         private eScrollBarAppearance _ScrollBarAppearance = eScrollBarAppearance.Default;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the scroll-bar visual style.
 | |
|         /// </summary>
 | |
|         [DefaultValue(eScrollBarAppearance.Default), Category("Appearance"), Description("Gets or sets the scroll-bar visual style.")]
 | |
|         public eScrollBarAppearance ScrollBarAppearance
 | |
|         {
 | |
|             get { return _ScrollBarAppearance; }
 | |
|             set
 | |
|             {
 | |
|                 _ScrollBarAppearance = value;
 | |
|                 OnScrollBarAppearanceChanged();
 | |
|             }
 | |
|         }
 | |
|         private void OnScrollBarAppearanceChanged()
 | |
|         {
 | |
|             if (_VScrollBar != null) _VScrollBar.Appearance = _ScrollBarAppearance;
 | |
|             if (_HScrollBar != null) _HScrollBar.Appearance = _ScrollBarAppearance;
 | |
|         }
 | |
| 
 | |
|         private bool _InternalVScrollPositionUpdated = false;
 | |
|         private void VScrollBarScroll(object sender, ScrollEventArgs e)
 | |
|         {
 | |
|             if (e.NewValue == e.OldValue && e.Type != ScrollEventType.EndScroll) return;
 | |
|             _InternalVScrollPositionUpdated = true;
 | |
|             //Console.WriteLine("{0} Setting Sys_VScrollBar value {1}, {2}", DateTime.Now, e.NewValue, e.Type);
 | |
|             if (e.Type == ScrollEventType.ThumbTrack) // We need to send this becouse ScrollableControl internally will get the current scroll position using GetScrollInfo instead from window message LParam
 | |
|             {
 | |
|                 WinApi.SCROLLINFO si = new WinApi.SCROLLINFO();
 | |
|                 si.nTrackPos = e.NewValue;
 | |
|                 si.nPos = e.NewValue;
 | |
|                 si.fMask = WinApi.ScrollInfoMask.SIF_POS;
 | |
|                 si.cbSize = Marshal.SizeOf(si);
 | |
|                 WinApi.SetScrollInfo(_Parent.Handle, WinApi.SBOrientation.SB_VERT, ref si, false);
 | |
|             }
 | |
|             WinApi.SendMessage(_Parent.Handle, (int)WinApi.WindowsMessages.WM_VSCROLL, WinApi.CreateLParam(MapVScrollType(e.Type), e.NewValue), IntPtr.Zero);
 | |
|             _InternalVScrollPositionUpdated = false;
 | |
|             
 | |
|             if (e.Type == ScrollEventType.EndScroll)
 | |
|                 UpdateVerticalScrollBarValues();
 | |
|         }
 | |
|         private bool _InternalHScrollPositionUpdated = false;
 | |
|         private void HScrollBarScroll(object sender, ScrollEventArgs e)
 | |
|         {
 | |
|             if (e.NewValue == e.OldValue && e.Type != ScrollEventType.EndScroll) return;
 | |
|             _InternalHScrollPositionUpdated = true;
 | |
|             //Console.WriteLine("{0} Setting Sys_HScrollBar value {1}, {2}", DateTime.Now, e.NewValue, e.Type);
 | |
|             if (e.Type == ScrollEventType.ThumbTrack) // We need to send this becouse ScrollableControl internally will get the current scroll position using GetScrollInfo instead from window message LParam
 | |
|             {
 | |
|                 WinApi.SCROLLINFO si = new WinApi.SCROLLINFO();
 | |
|                 si.nTrackPos = e.NewValue;
 | |
|                 si.nPos = e.NewValue;
 | |
|                 si.fMask = WinApi.ScrollInfoMask.SIF_POS;
 | |
|                 si.cbSize = Marshal.SizeOf(si);
 | |
|                 WinApi.SetScrollInfo(_Parent.Handle, WinApi.SBOrientation.SB_HORZ, ref si, false);
 | |
|             }
 | |
|             WinApi.SendMessage(_Parent.Handle, (int)WinApi.WindowsMessages.WM_HSCROLL, WinApi.CreateLParam(MapHScrollType(e.Type), e.NewValue), IntPtr.Zero);
 | |
|             _InternalHScrollPositionUpdated = false;
 | |
| 
 | |
|             if (e.Type == ScrollEventType.EndScroll)
 | |
|                 UpdateHorizontalScrollBarValues();
 | |
|         }
 | |
|         private static int MapVScrollType(ScrollEventType type)
 | |
|         {
 | |
|             if (type == ScrollEventType.EndScroll)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_ENDSCROLL;
 | |
|             else if (type == ScrollEventType.First)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_TOP;
 | |
|             else if (type == ScrollEventType.LargeDecrement)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_PAGEUP;
 | |
|             else if (type == ScrollEventType.LargeIncrement)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_PAGEDOWN;
 | |
|             else if (type == ScrollEventType.Last)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_BOTTOM;
 | |
|             else if (type == ScrollEventType.SmallDecrement)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_LINEUP;
 | |
|             else if (type == ScrollEventType.SmallIncrement)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_LINEDOWN;
 | |
|             else if (type == ScrollEventType.ThumbPosition)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_THUMBPOSITION;
 | |
|             else if (type == ScrollEventType.ThumbTrack)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_THUMBTRACK;
 | |
| 
 | |
|             return 0;
 | |
|         }
 | |
|         private static int MapHScrollType(ScrollEventType type)
 | |
|         {
 | |
|             if (type == ScrollEventType.EndScroll)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_ENDSCROLL;
 | |
|             else if (type == ScrollEventType.First)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_LEFT;
 | |
|             else if (type == ScrollEventType.LargeDecrement)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_PAGELEFT;
 | |
|             else if (type == ScrollEventType.LargeIncrement)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_PAGERIGHT;
 | |
|             else if (type == ScrollEventType.Last)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_RIGHT;
 | |
|             else if (type == ScrollEventType.SmallDecrement)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_LINELEFT;
 | |
|             else if (type == ScrollEventType.SmallIncrement)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_LINERIGHT;
 | |
|             else if (type == ScrollEventType.ThumbPosition)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_THUMBPOSITION;
 | |
|             else if (type == ScrollEventType.ThumbTrack)
 | |
|                 return (int)WinApi.ScrollBarCommands.SB_THUMBTRACK;
 | |
| 
 | |
|             return 0;
 | |
|         }
 | |
| 
 | |
| 
 | |
|         private void UpdateVerticalScrollBarValues()
 | |
|         {
 | |
|             if (_InternalVScrollPositionUpdated) return;
 | |
|             WinApi.SCROLLINFO scrollInfo = new WinApi.SCROLLINFO();
 | |
|             scrollInfo.cbSize = Marshal.SizeOf(scrollInfo);
 | |
|             scrollInfo.fMask = WinApi.ScrollInfoMask.SIF_POS | WinApi.ScrollInfoMask.SIF_RANGE | WinApi.ScrollInfoMask.SIF_PAGE;
 | |
|             if (WinApi.GetScrollInfo(_Parent.Handle, WinApi.SBOrientation.SB_VERT, ref scrollInfo))
 | |
|             {
 | |
|                 //Console.WriteLine("{0}   scrollInfo={1}", DateTime.Now, scrollInfo.ToString());
 | |
|                 if (_VScrollBar.Minimum != scrollInfo.nMin)
 | |
|                     _VScrollBar.Minimum = scrollInfo.nMin;
 | |
|                 if (_VScrollBar.Maximum != scrollInfo.nMax)
 | |
|                     _VScrollBar.Maximum = scrollInfo.nMax;
 | |
|                 if (_VScrollBar.Value != scrollInfo.nPos)
 | |
|                     _VScrollBar.Value = scrollInfo.nPos;
 | |
|                 if (_VScrollBar.LargeChange != scrollInfo.nPage)
 | |
|                     _VScrollBar.LargeChange = scrollInfo.nPage;
 | |
|             }
 | |
|         }
 | |
|         private void UpdateHorizontalScrollBarValues()
 | |
|         {
 | |
|             if (_InternalHScrollPositionUpdated) return;
 | |
|             WinApi.SCROLLINFO scrollInfo = new WinApi.SCROLLINFO();
 | |
|             scrollInfo.cbSize = Marshal.SizeOf(scrollInfo);
 | |
|             scrollInfo.fMask = WinApi.ScrollInfoMask.SIF_POS | WinApi.ScrollInfoMask.SIF_RANGE | WinApi.ScrollInfoMask.SIF_PAGE | WinApi.ScrollInfoMask.SIF_TRACKPOS;
 | |
|             if (WinApi.GetScrollInfo(_Parent.Handle, WinApi.SBOrientation.SB_HORZ, ref scrollInfo))
 | |
|             {
 | |
|                 //Console.WriteLine("{0}   TRACKPOS={1}", DateTime.Now, scrollInfo);
 | |
|                 if (_HScrollBar.Minimum != scrollInfo.nMin)
 | |
|                     _HScrollBar.Minimum = scrollInfo.nMin;
 | |
|                 if (_HScrollBar.Maximum != scrollInfo.nMax)
 | |
|                     _HScrollBar.Maximum = scrollInfo.nMax;
 | |
|                 if (_HScrollBar.Value != scrollInfo.nPos)
 | |
|                     _HScrollBar.Value = scrollInfo.nPos;
 | |
|                 if (_HScrollBar.LargeChange != scrollInfo.nPage)
 | |
|                     _HScrollBar.LargeChange = scrollInfo.nPage;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public VScrollBarAdv VScrollBar
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return _VScrollBar;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public HScrollBarAdv HScrollBar
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return _HScrollBar;
 | |
|             }
 | |
|         }
 | |
|         
 | |
|         #endregion
 | |
| 
 | |
|         #region Invoke Delayed
 | |
|         protected void InvokeDelayed(MethodInvoker method)
 | |
|         {
 | |
|             InvokeDelayed(method, 10);
 | |
|         }
 | |
|         protected void InvokeDelayed(MethodInvoker method, int delayInterval)
 | |
|         {
 | |
|             if (delayInterval <= 0) { method.Invoke(); return; }
 | |
| 
 | |
|             Timer delayedInvokeTimer = new Timer();
 | |
|             delayedInvokeTimer = new Timer();
 | |
|             delayedInvokeTimer.Tag = method;
 | |
|             delayedInvokeTimer.Interval = delayInterval;
 | |
|             delayedInvokeTimer.Tick += new EventHandler(DelayedInvokeTimerTick);
 | |
|             delayedInvokeTimer.Start();
 | |
|         }
 | |
|         void DelayedInvokeTimerTick(object sender, EventArgs e)
 | |
|         {
 | |
|             Timer timer = (Timer)sender;
 | |
|             MethodInvoker method = (MethodInvoker)timer.Tag;
 | |
|             timer.Stop();
 | |
|             timer.Dispose();
 | |
|             if (!this.IsDisposed)
 | |
|                 method.Invoke();
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         private bool _IsDisposed = false;
 | |
| 
 | |
|         public bool IsDisposed
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return _IsDisposed;
 | |
|             }
 | |
|         }
 | |
|         public void Dispose()
 | |
|         {
 | |
|             UnwireParent();
 | |
|             if(_VScrollBar.Parent == null)
 | |
|                 _VScrollBar.Dispose();
 | |
|             if (_HScrollBar.Parent == null)
 | |
|                 _HScrollBar.Dispose();
 | |
|             if (_Thumb.Parent == null)
 | |
|                 _Thumb.Dispose();
 | |
|             _IsDisposed = true;
 | |
|         }
 | |
|     }
 | |
| }
 |