497 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			497 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using System.ComponentModel;
 | |
| using System.Windows.Forms;
 | |
| using DevComponents.DotNetBar.ScrollBar;
 | |
| using System.Drawing;
 | |
| using System.Runtime.InteropServices;
 | |
| 
 | |
| namespace DevComponents.DotNetBar.Controls
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Represents control which handles scroll-bars.
 | |
|     /// </summary>
 | |
|     [ToolboxItem(false)]
 | |
|     public class ScrollbarControl : ControlWithBackgroundStyle
 | |
|     {
 | |
|         private const int ScrollPositionUpdateDelay = 400;
 | |
|         private HScrollBarAdv _HScrollBar = null;
 | |
|         private VScrollBarAdv _VScrollBar = null;
 | |
|         private Control _Thumb = null;
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the ScrollbarControl class.
 | |
|         /// </summary>
 | |
|         public ScrollbarControl()
 | |
|         {
 | |
|             this.SetStyle(ControlStyles.UserPaint | 
 | |
|                 ControlStyles.AllPaintingInWmPaint |
 | |
|                 ControlStyles.Opaque | 
 | |
|                 ControlStyles.ResizeRedraw |
 | |
|                 DisplayHelp.DoubleBufferFlag, true);
 | |
|             
 | |
|             _HScrollBar = new HScrollBarAdv();
 | |
|             _HScrollBar.Visible = false;
 | |
|             _HScrollBar.Appearance = _ScrollBarAppearance;
 | |
|             _HScrollBar.Scroll += HScrollBarScroll;
 | |
|             _VScrollBar = new VScrollBarAdv();
 | |
|             _VScrollBar.Visible = false;
 | |
|             _VScrollBar.Appearance = _ScrollBarAppearance;
 | |
|             _VScrollBar.Scroll += VScrollBarScroll;
 | |
|             this.Controls.Add(_HScrollBar);
 | |
|             this.Controls.Add(_VScrollBar);
 | |
| 
 | |
|             _Thumb = new Control();
 | |
|             _Thumb.Visible = false;
 | |
|             _Thumb.BackColor = SystemColors.Window;
 | |
|             this.Controls.Add(_Thumb);
 | |
|         }
 | |
| 
 | |
|         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 void UpdateScrollOverrideControlBounds()
 | |
|         {
 | |
|             if (_ScrollOverrideControl != null)
 | |
|                 _ScrollOverrideControl.Bounds = GetScrollOverrideControlBounds();
 | |
|         }
 | |
|         protected override void OnResize(EventArgs e)
 | |
|         {
 | |
|             UpdateScrollOverrideControlBounds();
 | |
|             UpdateScrollBars();
 | |
|             base.OnResize(e);
 | |
|         }
 | |
| 
 | |
|         protected override void OnVisualPropertyChanged()
 | |
|         {
 | |
|             base.OnVisualPropertyChanged();
 | |
|             UpdateScrollOverrideControlBounds();
 | |
|             UpdateScrollBars();
 | |
|         }
 | |
| 
 | |
|         protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
 | |
|         {
 | |
|             base.ScaleControl(factor, specified);
 | |
|             UpdateScrollOverrideControlBounds();
 | |
|         }
 | |
| 
 | |
|         private bool _UpdatingScrollbars = false;
 | |
|         protected virtual void UpdateScrollBarsDelayed()
 | |
|         {
 | |
|             InvokeDelayed(new MethodInvoker(delegate { UpdateScrollBars(); }), ScrollPositionUpdateDelay);
 | |
|         }
 | |
|         protected virtual void UpdateScrollBars()
 | |
|         {
 | |
|             if (!IsHandleCreated || _UpdatingScrollbars) return;
 | |
|             _UpdatingScrollbars = true;
 | |
|             try
 | |
|             {
 | |
|                 Control scrollOverrideControl = _ScrollOverrideControl;
 | |
|                 if (scrollOverrideControl == null)
 | |
|                 {
 | |
|                     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 = this.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.Refresh();
 | |
|                         InvokeDelayed(new MethodInvoker(delegate { UpdateVerticalScrollBarValues(); }), ScrollPositionUpdateDelay);
 | |
|                     }
 | |
| 
 | |
|                     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 = this.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.Refresh();
 | |
|                         InvokeDelayed(new MethodInvoker(delegate { UpdateHorizontalScrollBarValues(); }), ScrollPositionUpdateDelay);
 | |
|                     }
 | |
| 
 | |
|                     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;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     _Thumb.Visible = false;
 | |
|                 }
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 _UpdatingScrollbars = false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private System.Drawing.Rectangle GetScrollOverrideControlBounds()
 | |
|         {
 | |
|             return GetContentRectangle();
 | |
|         }
 | |
|         
 | |
|         private Control _ScrollOverrideControl = null;
 | |
|         internal Control ScrollOverrideControl
 | |
|         {
 | |
|             get { return _ScrollOverrideControl; }
 | |
|             set
 | |
|             {
 | |
|                 if (value != _ScrollOverrideControl)
 | |
|                 {
 | |
|                     if (!(value is IScrollBarOverrideSupport))
 | |
|                         throw new ArgumentException("ScrollOverrideControl must implement IScrollBarOverrideSupport interface.");
 | |
|                     Control oldValue = _ScrollOverrideControl;
 | |
|                     _ScrollOverrideControl = value;
 | |
|                     OnScrollOverrideControlChanged(oldValue, value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Called when ScrollOverrideControl property has changed.
 | |
|         /// </summary>
 | |
|         /// <param name="oldValue">Old property value</param>
 | |
|         /// <param name="newValue">New property value</param>
 | |
|         protected virtual void OnScrollOverrideControlChanged(Control oldValue, Control newValue)
 | |
|         {
 | |
|             if (oldValue != null)
 | |
|             {
 | |
|                 IScrollBarOverrideSupport sbo = (IScrollBarOverrideSupport)newValue;
 | |
|                 sbo.NonClientSizeChanged -= NonClientSizeChanged;
 | |
|                 sbo.ScrollBarValueChanged -= ControlScrollBarValueChanged;
 | |
|                 sbo.ControlMoved -= ScrollControlMoved;
 | |
|                 this.Controls.Remove(oldValue);
 | |
|             }
 | |
|             if (newValue != null)
 | |
|             {
 | |
|                 IScrollBarOverrideSupport sbo = (IScrollBarOverrideSupport)newValue;
 | |
|                 sbo.NonClientSizeChanged += NonClientSizeChanged;
 | |
|                 sbo.ScrollBarValueChanged += ControlScrollBarValueChanged;
 | |
|                 sbo.ControlMoved += ScrollControlMoved;
 | |
|                 this.Controls.Add(newValue);
 | |
|             }
 | |
|             UpdateScrollOverrideControlBounds();
 | |
|  
 | |
|             if (IsHandleCreated)
 | |
|             {
 | |
|                 //InitializeWindowOverride();
 | |
|                 UpdateScrollBars();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         void ScrollControlMoved(object sender, EventArgs e)
 | |
|         {
 | |
|             UpdateScrollOverrideControlBounds();
 | |
|         }
 | |
| 
 | |
|         private bool _InternalVScrollPositionUpdated = false;
 | |
|         private void VScrollBarScroll(object sender, ScrollEventArgs e)
 | |
|         {
 | |
|             if (e.NewValue == e.OldValue && e.Type != ScrollEventType.EndScroll) return;
 | |
|             _InternalVScrollPositionUpdated = true;
 | |
|             WinApi.SendMessage(_ScrollOverrideControl.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);
 | |
|             WinApi.SendMessage(_ScrollOverrideControl.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(_ScrollOverrideControl.Handle, WinApi.SBOrientation.SB_VERT, ref scrollInfo))
 | |
|             {
 | |
|                 //Console.WriteLine("{0}   TRACKPOS={1}", DateTime.Now, scrollInfo.nTrackPos);
 | |
|                 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(_ScrollOverrideControl.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;
 | |
|             }
 | |
|         }
 | |
|         private void ControlScrollBarValueChanged(object sender, ScrollValueChangedEventArgs e)
 | |
|         {
 | |
|             if ((e.ScrollChange & eScrollBarScrollChange.Vertical) == eScrollBarScrollChange.Vertical)
 | |
|             {
 | |
|                 UpdateVerticalScrollBarValues();
 | |
|             }
 | |
|             if ((e.ScrollChange & eScrollBarScrollChange.MouseWheel) == eScrollBarScrollChange.MouseWheel)
 | |
|             {
 | |
|                 UpdateVerticalScrollBarValues();
 | |
|                 InvokeDelayed(new MethodInvoker(delegate { UpdateVerticalScrollBarValues(); }), ScrollPositionUpdateDelay);
 | |
|             }
 | |
|             if ((e.ScrollChange & eScrollBarScrollChange.Horizontal) == eScrollBarScrollChange.Horizontal)
 | |
|             {
 | |
|                 UpdateHorizontalScrollBarValues();
 | |
|             }
 | |
|             UpdateScrollBars();
 | |
|         }
 | |
| 
 | |
|         private void NonClientSizeChanged(object sender, EventArgs e)
 | |
|         {
 | |
|             UpdateScrollBars();
 | |
|         }
 | |
| 
 | |
|         protected override void OnHandleCreated(EventArgs e)
 | |
|         {
 | |
|             UpdateScrollBars();
 | |
|             base.OnHandleCreated(e);
 | |
|         }
 | |
| 
 | |
|         #region Child Control WndProc Override
 | |
|         internal static eScrollBarScrollChange MapMessageToScrollChange(int msg)
 | |
|         {
 | |
|             if (msg == (int)WinApi.WindowsMessages.WM_VSCROLL)
 | |
|                 return eScrollBarScrollChange.Vertical;
 | |
|             else if (msg == (int)WinApi.WindowsMessages.WM_HSCROLL)
 | |
|                 return eScrollBarScrollChange.Horizontal;
 | |
|             else if (msg == (int)WinApi.WindowsMessages.WM_MOUSEWHEEL)
 | |
|                 return eScrollBarScrollChange.MouseWheel;
 | |
|             throw new ArgumentException("Message not recognized msg=" + msg.ToString());
 | |
|         }
 | |
|         #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
 | |
|     }
 | |
| 
 | |
|     public interface IScrollBarOverrideSupport
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// Should be fired when non-client size of the control changes, i.e. when WM_NCCALCSIZE message is received.
 | |
|         /// </summary>
 | |
|         event EventHandler NonClientSizeChanged;
 | |
|         /// <summary>
 | |
|         /// Should be fired when scroll-bar value on child control changes.
 | |
|         /// </summary>
 | |
|         event ScrollValueChangedHandler ScrollBarValueChanged;
 | |
|         /// <summary>
 | |
|         /// Should be fired when control receives WM_MOVE message.
 | |
|         /// </summary>
 | |
|         event EventHandler ControlMoved;
 | |
|         /// <summary>
 | |
|         /// Gets whether control is in design mode.
 | |
|         /// </summary>
 | |
|         bool DesignMode { get;}
 | |
|     }
 | |
|     /// <summary>
 | |
|     /// Defines arguments for IScrollBarOverrideSupport.ScrollBarValueChanged event.
 | |
|     /// </summary>
 | |
|     public class ScrollValueChangedEventArgs : System.EventArgs
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the ScrollValueChangedEventArgs class.
 | |
|         /// </summary>
 | |
|         /// <param name="scrollChange"></param>
 | |
|         public ScrollValueChangedEventArgs(eScrollBarScrollChange scrollChange)
 | |
|         {
 | |
|             ScrollChange = scrollChange;
 | |
|         }
 | |
| 
 | |
|         public readonly eScrollBarScrollChange ScrollChange;
 | |
|     }
 | |
|     /// <summary>
 | |
|     /// Defines information for IScrollBarOverrideSupport.ScrollBarValueChanged event.
 | |
|     /// </summary>
 | |
|     [Flags()]
 | |
|     public enum eScrollBarScrollChange
 | |
|     {
 | |
|         Vertical = 1,
 | |
|         Horizontal = 2,
 | |
|         MouseWheel = 4
 | |
|     }
 | |
|     /// <summary>
 | |
|     /// Defines delegate for IScrollBarOverrideSupport.ScrollBarValueChanged event.
 | |
|     /// </summary>
 | |
|     /// <param name="sender">Sender.</param>
 | |
|     /// <param name="e">Event arguments</param>
 | |
|     public delegate void ScrollValueChangedHandler(object sender, ScrollValueChangedEventArgs e);
 | |
| }
 |