using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using DevComponents.DotNetBar.Rendering;
namespace DevComponents.DotNetBar
{
	/// 
	/// Represents multi-functional splitter control.
	/// 
    [ToolboxItem(true), Designer("DevComponents.DotNetBar.Design.ExpandableSplitterDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf"), System.Runtime.InteropServices.ComVisible(false), DefaultEvent("ExpandedChanged")]
	public class ExpandableSplitter:Splitter, IMessageHandlerClient
	{
		#region Private Variables
		private int m_AnimationTime=100;
		private Control m_ExpandableControl=null;
		private bool m_Expanded=true;
		private eSplitterStyle m_Style=eSplitterStyle.Office2003;
		private bool m_Expandable=true;
		private eShortcut m_Shortcut=eShortcut.None;
		private bool m_FilterInstalled=false;
		private bool m_MouseOver=false;
		private bool m_MouseDown=false;
		private bool m_Resized=false;
		private Point m_MouseDownPoint=Point.Empty;
		private ColorScheme m_ColorScheme=null;
		private eColorSchemePart m_BackColorSchemePart=eColorSchemePart.None;
		private Color m_BackColor2=Color.Empty;
		private eColorSchemePart m_BackColor2SchemePart=eColorSchemePart.None;
		private int m_BackColorGradientAngle=0;
		private Color m_ExpandFillColor=Color.Empty;
		private eColorSchemePart m_ExpandFillColorSchemePart=eColorSchemePart.None;
		private Color m_ExpandLineColor=Color.Empty;
		private eColorSchemePart m_ExpandLineColorSchemePart=eColorSchemePart.None;
		private Color m_GripDarkColor=Color.Empty;
		private eColorSchemePart m_GripDarkColorSchemePart=eColorSchemePart.None;
		private Color m_GripLightColor=Color.Empty;
		private eColorSchemePart m_GripLightColorSchemePart=eColorSchemePart.None;
		// Hot colors
		private Color m_HotBackColor=Color.Empty;
		private eColorSchemePart m_HotBackColorSchemePart=eColorSchemePart.None;
		private Color m_HotBackColor2=Color.Empty;
		private eColorSchemePart m_HotBackColor2SchemePart=eColorSchemePart.None;
		private int m_HotBackColorGradientAngle=0;
		private Color m_HotExpandFillColor=Color.Empty;
		private eColorSchemePart m_HotExpandFillColorSchemePart=eColorSchemePart.None;
		private Color m_HotExpandLineColor=Color.Empty;
		private eColorSchemePart m_HotExpandLineColorSchemePart=eColorSchemePart.None;
		private Color m_HotGripDarkColor=Color.Empty;
		private eColorSchemePart m_HotGripDarkColorSchemePart=eColorSchemePart.None;
		private Color m_HotGripLightColor=Color.Empty;
		private eColorSchemePart m_HotGripLightColorSchemePart=eColorSchemePart.None;
		private SplitterPainter m_Painter=null;
		private SplitterPaintInfo m_SplitterPaintInfo=new SplitterPaintInfo();
		private bool m_ExpandActionClick=true;
		private bool m_ExpandActionDoubleClick=false;
		#endregion
		#region Events
		public event ExpandChangeEventHandler ExpandedChanging;
		public event ExpandChangeEventHandler ExpandedChanged;
		#endregion
		#region Constructor
		/// 
		/// Creates new instance of the object.
		/// 
		public ExpandableSplitter():base()
		{
			this.SetStyle(ControlStyles.UserPaint,true);
			this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
			this.SetStyle(ControlStyles.Opaque,true);
			this.SetStyle(ControlStyles.ResizeRedraw,true);
			this.SetStyle(DisplayHelp.DoubleBufferFlag,true);
			if(!ColorFunctions.ColorsLoaded)
			{
				NativeFunctions.RefreshSettings();
				NativeFunctions.OnDisplayChange();
				ColorFunctions.LoadColors();
			}
			m_ColorScheme=new ColorScheme(eDotNetBarStyle.Office2003);
			this.ApplyStyle(eSplitterStyle.Office2003);
            StyleManager.Register(this);
		}
        protected override void Dispose(bool disposing)
        {
            if (disposing) StyleManager.Unregister(this);
            base.Dispose(disposing);
        }
		#endregion
		#region Display Support
		private SplitterPainter GetPainter()
		{
			if(m_Painter==null)
			{
				switch(m_Style)
				{
					case eSplitterStyle.Office2003:
                    case eSplitterStyle.Office2007:
					{
						m_Painter=new SplitterOffice2003Painter();
						break;
					}
					case eSplitterStyle.Mozilla:
					{
						m_Painter=new SplitterMozillaPainter();
						break;
					}
				}
			}
			return m_Painter;
		}
		private SplitterPaintInfo GetSplitterPaintInfo(Graphics g)
		{
			m_SplitterPaintInfo.Graphics=g;
			m_SplitterPaintInfo.Colors=this.GetColors();
			m_SplitterPaintInfo.Expandable=m_Expandable;
			m_SplitterPaintInfo.Expanded=m_Expanded;
			m_SplitterPaintInfo.Dock=this.Dock;
			m_SplitterPaintInfo.DisplayRectangle=this.DisplayRectangle;
			return m_SplitterPaintInfo;
		}
		/// 
		/// This member overrides Control.OnPaint.
		/// 
		/// Event arguments.
		protected override void OnPaint(PaintEventArgs e)
		{
//			if(m_AntiAlias)
//			{
//				e.Graphics.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
//				e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
//			}
			this.GetPainter().Paint(this.GetSplitterPaintInfo(e.Graphics));
		}
		
		#endregion
		#region Properties
//		/// 
//		/// Gets or sets whether anti-alias smoothing is used while painting.
//		/// 
//		[DefaultValue(false),Browsable(true),Category("Appearance"),Description("Gets or sets whether anti-aliasing is used while painting.")]
//		public bool AntiAlias
//		{
//			get {return m_AntiAlias;}
//			set
//			{
//				if(m_AntiAlias!=value)
//				{
//					m_AntiAlias=value;
//					this.Refresh();
//				}
//			}
//		}
		/// 
		/// Gets or sets whether expandable control ExpandableControl assigned to this splitter is expaned or not. Default value is true.
		/// 
		[Browsable(true),Category("Expand"),DefaultValue(true),Description("Indicates whether expandable control ExpandableControl assigned to this splitter is expaned or not. Default value is true.")]
		public bool Expanded
		{
			get {return m_Expanded;}
			set
			{
				if(m_Expanded!=value)
					SetExpanded(value,eEventSource.Code);
			}
		}
		/// 
		/// Gets or sets whether Click event is triggering expand/collapse of the splitter. Default value is true.
		/// 
		[Browsable(true),Category("Expand"),DefaultValue(true),Description("Indicates whether Click event is triggering expand/collapse of the splitter. Default value is true.")]
		public bool ExpandActionClick
		{
			get {return m_ExpandActionClick;}
			set {m_ExpandActionClick=value;}
		}
		/// 
		/// Gets or sets whether DoubleClick event is triggering expand/collapse of the splitter. Default value is false.
		/// 
		[Browsable(true),Category("Expand"),DefaultValue(false),Description("Indicates whether DoubleClick event is triggering expand/collapse of the splitter. Default value is false.")]
		public bool ExpandActionDoubleClick
		{
			get {return m_ExpandActionDoubleClick;}
			set {m_ExpandActionDoubleClick=value;}
		}
		/// 
		/// Gets or sets whether splitter will act as expandable splitter. Default value is true. When set to true ExpandableControl property should be set to the control that should be expanded/collapsed.
		/// 
		[Browsable(true),Category("Expand"),DefaultValue(true),Description("Indicates whether splitter will act as expandable splitter. Default value is true.")]
		public bool Expandable
		{
			get {return m_Expandable;}
			set
			{
				m_Expandable=value;
				this.Refresh();
			}
		}
		/// 
		/// Gets or sets the control that will be expanded/collapsed by the splitter. Default value is null. Expandable property should be also set to true (default) to enable expand/collapse functionality.
		/// 
		[Browsable(true),Category("Expand"),DefaultValue(null),Description("Indicates control that will be expanded/collapsed by the splitter.")]
		public Control ExpandableControl
		{
			get {return m_ExpandableControl;}
			set
			{
				if(value==this)
					return;
				m_ExpandableControl=value;
				this.OnExpandableControlChanged();
			}
		}
		/// 
		/// Gets or sets visual style of the control. Default value is eSplitterStyle.Office2003.
		/// 
		[Browsable(true),Category("Appearance"),DefaultValue(eSplitterStyle.Office2003),Description("Indicates visual style of the control.")]
		public eSplitterStyle Style
		{
			get {return m_Style;}
			set
			{
				m_Style=value;
				OnStyleChanged();
			}
		}
		/// 
		/// Gets or sets animation time in milliseconds. Default value is 100 miliseconds. You can set this to 0 (zero) to disable animation.
		/// 
		[Browsable(true),DefaultValue(100),Category("Expand"),Description("Indicates animation time in milliseconds, default value is 100.")]
		public int AnimationTime
		{
			get {return m_AnimationTime;}
			set
			{
				if(m_AnimationTime>=0)
					m_AnimationTime=value;
			}
		}
		/// 
		/// Gets or sets the shortcut key to expand/collapse splitter.
		/// 
		[Browsable(true),Category("Expand"),DefaultValue(eShortcut.None),Description("Indicates shortcut key to expand/collapse splitter."),]
		public eShortcut Shortcut
		{
			get {return m_Shortcut;}
			set
			{
				m_Shortcut=value;
				if(m_Shortcut!=eShortcut.None && this.IsHandleCreated)
					InstallIMessageHandlerClient();
			}
		}
		#endregion
		#region Private Implementation
		private void OnExpandedChanged()
		{
			if(this.ExpandableControl==null)
				return;
			
			if(this.Expanded)
			{
				if(!this.ExpandableControl.Visible)
				{
					if(this.AnimationTime==0 || this.DesignMode)
					{
						if(this.DesignMode)
							TypeDescriptor.GetProperties(this.ExpandableControl)["Visible"].SetValue(this.ExpandableControl,true);
						this.ExpandableControl.Visible=true;
					}
					else
					{
						Rectangle controlRect=GetAnimationTarget(this.ExpandableControl,false);
						Rectangle targetRect=this.ExpandableControl.Bounds;
						BarFunctions.AnimateControl(this.ExpandableControl,true,m_AnimationTime,controlRect,targetRect);
					}
				}
			}
			else
			{
				if(this.ExpandableControl.Visible || !this.IsHandleCreated)
				{
					if(this.AnimationTime==0 || this.DesignMode || !this.IsHandleCreated)
					{
						if(this.DesignMode)
							TypeDescriptor.GetProperties(this.ExpandableControl)["Visible"].SetValue(this.ExpandableControl,false);
						this.ExpandableControl.Visible=false;
					}
					else
					{
						Rectangle controlRect=this.ExpandableControl.Bounds;
						Rectangle targetRect=GetAnimationTarget(this.ExpandableControl,false);
						BarFunctions.AnimateControl(this.ExpandableControl,false,m_AnimationTime,controlRect,targetRect);
						this.ExpandableControl.Visible=false;
						this.ExpandableControl.Bounds=controlRect;
					}
				}
			}
			this.Refresh();
		}
		private Rectangle GetAnimationTarget(Control c, bool showControl)
		{
			Rectangle r=Rectangle.Empty;
			DockStyle dock=GetControlDock(c);
			if(!showControl)
			{
				if(dock==DockStyle.Left)
				{
					r=new Rectangle(c.Left,c.Top,0,c.Height);
				}
				else if(dock==DockStyle.Right)
				{
					r=new Rectangle(c.Right,c.Top,0,c.Height);
				}
				else if(dock==DockStyle.Top)
				{
					r=new Rectangle(c.Left,c.Top,c.Width,0);
				}
				else if(dock==DockStyle.Bottom)
				{
					r=new Rectangle(c.Left,c.Bottom,c.Width,0);
				}
			}
			else
			{
				if(dock==DockStyle.Left)
				{
					r=new Rectangle(c.Left,c.Top,c.Width,c.Height);
				}
				else if(dock==DockStyle.Right)
				{
					r=new Rectangle(c.Left-c.Width,c.Top,c.Width,c.Height);
				}
				else if(dock==DockStyle.Top)
				{
					r=new Rectangle(c.Left,c.Top,c.Width,c.Height);
				}
				else if(dock==DockStyle.Bottom)
				{
					r=new Rectangle(c.Left,c.Top-c.Height,c.Width,c.Height);
				}
			}
			return r;
		}
		private DockStyle GetControlDock(Control c)
		{
			if(c.Dock==DockStyle.None)
			{
				if(c.Rightthis.Right)
					return DockStyle.Right;
				else if(c.Bottomthis.Bottom)
					return DockStyle.Bottom;
				return DockStyle.Left;
			}
			else if(c.Dock==DockStyle.Fill)
				return DockStyle.Left;
			return c.Dock;
		}
		private void OnExpandableControlChanged()
		{
			
		}
		protected override void OnHandleCreated(EventArgs e)
		{
			base.OnHandleCreated(e);
			InstallIMessageHandlerClient();
		}
		protected override void OnHandleDestroyed(EventArgs e)
		{
			base.OnHandleDestroyed(e);
			UninstallIMessageHandlerClient();			
		}
		protected override void OnClick(EventArgs e)
		{
			base.OnClick(e);
			if(this.Expandable && m_MouseOver && !m_Resized && m_ExpandActionClick)
			{
				SetExpanded(!this.Expanded,eEventSource.Mouse);
			}
			m_Resized=false;
		}
		protected override void OnDoubleClick(EventArgs e)
		{
			base.OnDoubleClick(e);
			if(this.Expandable && m_MouseOver && m_ExpandActionDoubleClick)
			{
				SetExpanded(!this.Expanded,eEventSource.Mouse);
			}
		}
		protected override void OnMouseDown(MouseEventArgs e)
		{
			if(m_MouseDown)
			{
				base.OnMouseDown(e);
			}
			else
			{
				m_Resized=false;
				m_MouseDownPoint=new Point(e.X,e.Y);
			}
		}
		protected override void OnMouseUp(MouseEventArgs e)
		{
			m_MouseDown=false;
			base.OnMouseUp(e);
		}
		protected override void OnMouseEnter(EventArgs e)
		{
			base.OnMouseEnter(e);
			m_MouseOver=true;
			this.Refresh();
		}
		protected override void OnMouseLeave(EventArgs e)
		{
			base.OnMouseLeave(e);
			m_MouseOver=false;
			this.Refresh();
		}
		protected override void OnMouseMove(MouseEventArgs e)
		{
			base.OnMouseMove(e);
			if(!this.DisplayRectangle.Contains(e.X,e.Y) && !m_MouseDown && e.Button==MouseButtons.Left)
			{
				m_MouseDown=true;
				m_Resized=true;
				this.OnMouseDown(new MouseEventArgs(e.Button,1,m_MouseDownPoint.X,m_MouseDownPoint.Y,e.Delta));
			}
		}
		private void InvokeExpandedChanging(ExpandedChangeEventArgs e)
		{
			if(ExpandedChanging!=null)
				ExpandedChanging(this,e);
		}
		private void InvokeExpandedChanged(ExpandedChangeEventArgs e)
		{
			if(ExpandedChanged!=null)
				ExpandedChanged(this,e);
		}
		private void SetExpanded(bool expanded, eEventSource action)
		{
			ExpandedChangeEventArgs e=new ExpandedChangeEventArgs(action,expanded);
			InvokeExpandedChanging(e);
			if(e.Cancel)
				return;
			m_Expanded=expanded;
			OnExpandedChanged();
			InvokeExpandedChanged(e);
		}
		private void OnStyleChanged()
		{
			m_Painter=null;
			this.Invalidate();
		}
		#endregion
		#region Color Support
		/// 
		/// Gets or sets the background color for UI element. If used in combination with
		/// BackgroundColor2 is specifies starting gradient color.
		/// 
		[Browsable(true),Category("Colors"),Description("Gets or sets the background color for UI element."),Editor(typeof(ColorTypeEditor), typeof(System.Drawing.Design.UITypeEditor))]
		public new Color BackColor
		{
			get
			{
				return GetColor(base.BackColor,m_BackColorSchemePart);
			}
			set
			{
				if(m_BackColorSchemePart!=eColorSchemePart.None && !value.IsEmpty)
					this.BackColorSchemePart=eColorSchemePart.None;
				base.BackColor=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Resets BackgroundColor to it's default value. Used by windows forms designer design-time support.
		/// 
		[EditorBrowsable(EditorBrowsableState.Never)]
		public new void ResetBackColor()
		{
			base.BackColor=Color.Empty;
		}
		/// 
		/// Gets or sets the color scheme color that is used as background color. Setting
		/// this property overrides the setting of the corresponding BackColor property.
		/// Color scheme colors are automatically managed and are based on current system colors.
		/// That means if colors on the system change the color scheme will ensure that it's colors
		/// are changed as well to fit in the color scheme of target system. Set this property to
		/// eColorSchemePart.None to
		/// specify explicit color to use through BackColor property.
		/// 
		[Browsable(false)]
		public eColorSchemePart BackColorSchemePart
		{
			get {return m_BackColorSchemePart;}
			set
			{
				m_BackColorSchemePart=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Gets or sets the target gradient background color for UI element.
		/// 
		[Browsable(true),Category("Colors"),Description("Gets or sets the target gradient background color for UI element.")]
		public Color BackColor2
		{
			get {return GetColor(m_BackColor2,m_BackColor2SchemePart);}
			set
			{
				if(m_BackColor2SchemePart!=eColorSchemePart.None && !value.IsEmpty)
					this.BackColor2SchemePart=eColorSchemePart.None;
				m_BackColor2=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Resets BackgroundColor2 to it's default value. Used by windows forms designer design-time support.
		/// 
		[EditorBrowsable(EditorBrowsableState.Never)]
		public void ResetBackColor2()
		{
			m_BackColor2=Color.Empty;
		}
		/// 
		/// Gets or sets the color scheme color that is used as target gradient background color. Setting
		/// this property overrides the setting of the corresponding BackColor2 property.
		/// Color scheme colors are automatically managed and are based on current system colors.
		/// That means if colors on the system change the color scheme will ensure that it's colors
		/// are changed as well to fit in the color scheme of target system. Set this property to
		/// eColorSchemePart.None to
		/// specify explicit color to use through BackColor2 property.
		/// 
		[Browsable(false)]
		public eColorSchemePart BackColor2SchemePart
		{
			get {return m_BackColor2SchemePart;}
			set
			{
				m_BackColor2SchemePart=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Gets or sets the background gradient angle.
		/// 
		[Browsable(true),Category("Background"),DefaultValue(0),Description("Gets or sets the background gradient angle.")]
		public int BackColorGradientAngle
		{
			get
			{
				return m_BackColorGradientAngle;
			}
			set
			{
				if(m_BackColorGradientAngle!=value)
				{
					m_BackColorGradientAngle=value;
					this.OnStyleChanged();
				}
			}
		}
		/// 
		/// Gets or sets the expand part fill color.
		/// 
		[Browsable(true),Category("Colors"),Description("Indicates expand part fill color.")]
		public Color ExpandFillColor
		{
			get {return GetColor(m_ExpandFillColor,m_ExpandFillColorSchemePart);}
			set
			{
				if(m_ExpandFillColorSchemePart!=eColorSchemePart.None && !value.IsEmpty)
					this.ExpandFillColorSchemePart=eColorSchemePart.None;
				m_ExpandFillColor=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Resets BackgroundColor2 to it's default value. Used by windows forms designer design-time support.
		/// 
		[EditorBrowsable(EditorBrowsableState.Never)]
		public void ResetExpandFillColor()
		{
			m_ExpandFillColor=Color.Empty;
		}
		/// 
		/// Gets or sets the color scheme color that is used expand part fill color. Setting
		/// this property overrides the setting of the corresponding ExpandFillColor property.
		/// Color scheme colors are automatically managed and are based on current system colors.
		/// That means if colors on the system change the color scheme will ensure that it's colors
		/// are changed as well to fit in the color scheme of target system. Set this property to
		/// eColorSchemePart.None to
		/// specify explicit color to use through ExpandFillColor property.
		/// 
		[Browsable(false)]
		public eColorSchemePart ExpandFillColorSchemePart
		{
			get {return m_ExpandFillColorSchemePart;}
			set
			{
				m_ExpandFillColorSchemePart=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Gets or sets the expand part line color.
		/// 
		[Browsable(true),Category("Colors"),Description("Indicates expand part line color.")]
		public Color ExpandLineColor
		{
			get {return GetColor(m_ExpandLineColor,m_ExpandLineColorSchemePart);}
			set
			{
				if(m_ExpandLineColorSchemePart!=eColorSchemePart.None && !value.IsEmpty)
					this.ExpandLineColorSchemePart=eColorSchemePart.None;
				m_ExpandLineColor=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Resets BackgroundColor2 to it's default value. Used by windows forms designer design-time support.
		/// 
		[EditorBrowsable(EditorBrowsableState.Never)]
		public void ResetExpandLineColor()
		{
			m_ExpandLineColor=Color.Empty;
		}
		/// 
		/// Gets or sets the color scheme color that is used expand part line color. Setting
		/// this property overrides the setting of the corresponding ExpandLineColor property.
		/// Color scheme colors are automatically managed and are based on current system colors.
		/// That means if colors on the system change the color scheme will ensure that it's colors
		/// are changed as well to fit in the color scheme of target system. Set this property to
		/// eColorSchemePart.None to
		/// specify explicit color to use through ExpandLineColor property.
		/// 
		[Browsable(false)]
		public eColorSchemePart ExpandLineColorSchemePart
		{
			get {return m_ExpandLineColorSchemePart;}
			set
			{
				m_ExpandLineColorSchemePart=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Gets or sets the grip part dark color.
		/// 
		[Browsable(true),Category("Colors"),Description("Indicates expand part line color.")]
		public Color GripDarkColor
		{
			get {return GetColor(m_GripDarkColor,m_GripDarkColorSchemePart);}
			set
			{
				if(m_GripDarkColorSchemePart!=eColorSchemePart.None && !value.IsEmpty)
					this.GripDarkColorSchemePart=eColorSchemePart.None;
				m_GripDarkColor=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Resets BackgroundColor2 to it's default value. Used by windows forms designer design-time support.
		/// 
		[EditorBrowsable(EditorBrowsableState.Never)]
		public void ResetGripDarkColor()
		{
			m_GripDarkColor=Color.Empty;
		}
		/// 
		/// Gets or sets the color scheme color that is used grip part dark color. Setting
		/// this property overrides the setting of the corresponding GripDarkColor property.
		/// Color scheme colors are automatically managed and are based on current system colors.
		/// That means if colors on the system change the color scheme will ensure that it's colors
		/// are changed as well to fit in the color scheme of target system. Set this property to
		/// eColorSchemePart.None to
		/// specify explicit color to use through GripDarkColor property.
		/// 
		[Browsable(false)]
		public eColorSchemePart GripDarkColorSchemePart
		{
			get {return m_GripDarkColorSchemePart;}
			set
			{
				m_GripDarkColorSchemePart=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Gets or sets the expand part line color.
		/// 
		[Browsable(true),Category("Colors"),Description("Indicates expand part line color.")]
		public Color GripLightColor
		{
			get {return GetColor(m_GripLightColor,m_GripLightColorSchemePart);}
			set
			{
				if(m_GripLightColorSchemePart!=eColorSchemePart.None && !value.IsEmpty)
					this.GripLightColorSchemePart=eColorSchemePart.None;
				m_GripLightColor=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Resets BackgroundColor2 to it's default value. Used by windows forms designer design-time support.
		/// 
		[EditorBrowsable(EditorBrowsableState.Never)]
		public void ResetGripLightColor()
		{
			m_GripLightColor=Color.Empty;
		}
		/// 
		/// Gets or sets the color scheme color that is used expand part line color. Setting
		/// this property overrides the setting of the corresponding GripLightColor property.
		/// Color scheme colors are automatically managed and are based on current system colors.
		/// That means if colors on the system change the color scheme will ensure that it's colors
		/// are changed as well to fit in the color scheme of target system. Set this property to
		/// eColorSchemePart.None to
		/// specify explicit color to use through GripLightColor property.
		/// 
		[Browsable(false)]
		public eColorSchemePart GripLightColorSchemePart
		{
			get {return m_GripLightColorSchemePart;}
			set
			{
				m_GripLightColorSchemePart=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Gets or sets the background color for UI element when mouse is over the element. If used in combination with
		/// BackgroundColor2 is specifies starting gradient color.
		/// 
		[Browsable(true),Category("Colors"),Description("Gets or sets the background color for UI element when mouse is over the element."),Editor(typeof(ColorTypeEditor), typeof(System.Drawing.Design.UITypeEditor))]
		public Color HotBackColor
		{
			get
			{
				return GetColor(m_HotBackColor,m_HotBackColorSchemePart);
			}
			set
			{
				if(m_HotBackColorSchemePart!=eColorSchemePart.None && !value.IsEmpty)
					this.HotBackColorSchemePart=eColorSchemePart.None;
				m_HotBackColor=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Resets BackgroundColor to it's default value. Used by windows forms designer design-time support.
		/// 
		[EditorBrowsable(EditorBrowsableState.Never)]
		public void ResetHotBackColor()
		{
			m_HotBackColor=Color.Empty;
		}
		/// 
		/// Gets or sets the color scheme color that is used as background color when mouse is over the element. Setting
		/// this property overrides the setting of the corresponding HotBackColor property.
		/// Color scheme colors are automatically managed and are based on current system colors.
		/// That means if colors on the system change the color scheme will ensure that it's colors
		/// are changed as well to fit in the color scheme of target system. Set this property to
		/// eColorSchemePart.None to
		/// specify explicit color to use through HotBackColor property.
		/// 
		[Browsable(false)]
		public eColorSchemePart HotBackColorSchemePart
		{
			get {return m_HotBackColorSchemePart;}
			set
			{
				m_HotBackColorSchemePart=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Gets or sets the target gradient background color for UI element when mouse is over the element.
		/// 
		[Browsable(true),Category("Colors"),Description("Gets or sets the target gradient background color for UI element when mouse is over the element.")]
		public Color HotBackColor2
		{
			get {return GetColor(m_HotBackColor2,m_HotBackColor2SchemePart);}
			set
			{
				if(m_HotBackColor2SchemePart!=eColorSchemePart.None && !value.IsEmpty)
					this.HotBackColor2SchemePart=eColorSchemePart.None;
				m_HotBackColor2=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Resets BackgroundColor2 to it's default value. Used by windows forms designer design-time support.
		/// 
		[EditorBrowsable(EditorBrowsableState.Never)]
		public void ResetHotBackColor2()
		{
			m_HotBackColor2=Color.Empty;
		}
		/// 
		/// Gets or sets the color scheme color that is used as target gradient background color when mouse is over the element. Setting
		/// this property overrides the setting of the corresponding HotBackColor2 property.
		/// Color scheme colors are automatically managed and are based on current system colors.
		/// That means if colors on the system change the color scheme will ensure that it's colors
		/// are changed as well to fit in the color scheme of target system. Set this property to
		/// eColorSchemePart.None to
		/// specify explicit color to use through HotBackColor2 property.
		/// 
		[Browsable(false)]
		public eColorSchemePart HotBackColor2SchemePart
		{
			get {return m_HotBackColor2SchemePart;}
			set
			{
				m_HotBackColor2SchemePart=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Gets or sets the background gradient angle when mouse is over the element.
		/// 
		[Browsable(true),Category("Background"),DefaultValue(0),Description("Gets or sets the background gradient angle when mouse is over the element.")]
		public int HotBackColorGradientAngle
		{
			get
			{
				return m_HotBackColorGradientAngle;
			}
			set
			{
				if(m_HotBackColorGradientAngle!=value)
				{
					m_HotBackColorGradientAngle=value;
					this.OnStyleChanged();
				}
			}
		}
		/// 
		/// Gets or sets the expand part fill color when mouse is over the element.
		/// 
		[Browsable(true),Category("Colors"),Description("Indicates expand part fill color when mouse is over the element.")]
		public Color HotExpandFillColor
		{
			get {return GetColor(m_HotExpandFillColor,m_HotExpandFillColorSchemePart);}
			set
			{
				if(m_HotExpandFillColorSchemePart!=eColorSchemePart.None && !value.IsEmpty)
					this.HotExpandFillColorSchemePart=eColorSchemePart.None;
				m_HotExpandFillColor=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Resets BackgroundColor2 to it's default value. Used by windows forms designer design-time support.
		/// 
		[EditorBrowsable(EditorBrowsableState.Never)]
		public void ResetHotExpandFillColor()
		{
			m_HotExpandFillColor=Color.Empty;
		}
		/// 
		/// Gets or sets the color scheme color that is used expand part fill color when mouse is over the element. Setting
		/// this property overrides the setting of the corresponding HotExpandFillColor property.
		/// Color scheme colors are automatically managed and are based on current system colors.
		/// That means if colors on the system change the color scheme will ensure that it's colors
		/// are changed as well to fit in the color scheme of target system. Set this property to
		/// eColorSchemePart.None to
		/// specify explicit color to use through HotExpandFillColor property.
		/// 
		[Browsable(false)]
		public eColorSchemePart HotExpandFillColorSchemePart
		{
			get {return m_HotExpandFillColorSchemePart;}
			set
			{
				m_HotExpandFillColorSchemePart=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Gets or sets the expand part line color when mouse is over the element.
		/// 
		[Browsable(true),Category("Colors"),Description("Indicates expand part line color when mouse is over the element.")]
		public Color HotExpandLineColor
		{
			get {return GetColor(m_HotExpandLineColor,m_HotExpandLineColorSchemePart);}
			set
			{
				if(m_HotExpandLineColorSchemePart!=eColorSchemePart.None && !value.IsEmpty)
					this.HotExpandLineColorSchemePart=eColorSchemePart.None;
				m_HotExpandLineColor=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Resets BackgroundColor2 to it's default value. Used by windows forms designer design-time support.
		/// 
		[EditorBrowsable(EditorBrowsableState.Never)]
		public void ResetHotExpandLineColor()
		{
			m_HotExpandLineColor=Color.Empty;
		}
		/// 
		/// Gets or sets the color scheme color that is used expand part line color when mouse is over the element. Setting
		/// this property overrides the setting of the corresponding HotExpandLineColor property.
		/// Color scheme colors are automatically managed and are based on current system colors.
		/// That means if colors on the system change the color scheme will ensure that it's colors
		/// are changed as well to fit in the color scheme of target system. Set this property to
		/// eColorSchemePart.None to
		/// specify explicit color to use through HotExpandLineColor property.
		/// 
		[Browsable(false)]
		public eColorSchemePart HotExpandLineColorSchemePart
		{
			get {return m_HotExpandLineColorSchemePart;}
			set
			{
				m_HotExpandLineColorSchemePart=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Gets or sets the grip part dark color when mouse is over the element.
		/// 
		[Browsable(true),Category("Colors"),Description("Indicates expand part line color when mouse is over the element.")]
		public Color HotGripDarkColor
		{
			get {return GetColor(m_HotGripDarkColor,m_HotGripDarkColorSchemePart);}
			set
			{
				if(m_HotGripDarkColorSchemePart!=eColorSchemePart.None && !value.IsEmpty)
					this.HotGripDarkColorSchemePart=eColorSchemePart.None;
				m_HotGripDarkColor=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Resets BackgroundColor2 to it's default value. Used by windows forms designer design-time support.
		/// 
		[EditorBrowsable(EditorBrowsableState.Never)]
		public void ResetHotGripDarkColor()
		{
			m_HotGripDarkColor=Color.Empty;
		}
		/// 
		/// Gets or sets the color scheme color that is used grip part dark color when mouse is over the element. Setting
		/// this property overrides the setting of the corresponding HotGripDarkColor property.
		/// Color scheme colors are automatically managed and are based on current system colors.
		/// That means if colors on the system change the color scheme will ensure that it's colors
		/// are changed as well to fit in the color scheme of target system. Set this property to
		/// eColorSchemePart.None to
		/// specify explicit color to use through HotGripDarkColor property.
		/// 
		[Browsable(false)]
		public eColorSchemePart HotGripDarkColorSchemePart
		{
			get {return m_HotGripDarkColorSchemePart;}
			set
			{
				m_HotGripDarkColorSchemePart=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Gets or sets the grip part light color when mouse is over the element.
		/// 
		[Browsable(true),Category("Colors"),Description("Indicates grip part light color when mouse is over the element.")]
		public Color HotGripLightColor
		{
			get {return GetColor(m_HotGripLightColor,m_HotGripLightColorSchemePart);}
			set
			{
				if(m_HotGripLightColorSchemePart!=eColorSchemePart.None && !value.IsEmpty)
					this.HotGripLightColorSchemePart=eColorSchemePart.None;
				m_HotGripLightColor=value;
				this.OnStyleChanged();
			}
		}
		/// 
		/// Resets BackgroundColor2 to it's default value. Used by windows forms designer design-time support.
		/// 
		[EditorBrowsable(EditorBrowsableState.Never)]
		public void ResetHotGripLightColor()
		{
			m_HotGripLightColor=Color.Empty;
		}
		/// 
		/// Gets or sets the color scheme color that is used grip part light color when mouse is over the element. Setting
		/// this property overrides the setting of the corresponding HotGripLightColor property.
		/// Color scheme colors are automatically managed and are based on current system colors.
		/// That means if colors on the system change the color scheme will ensure that it's colors
		/// are changed as well to fit in the color scheme of target system. Set this property to
		/// eColorSchemePart.None to
		/// specify explicit color to use through HotGripLightColor property.
		/// 
		[Browsable(false)]
		public eColorSchemePart HotGripLightColorSchemePart
		{
			get {return m_HotGripLightColorSchemePart;}
			set
			{
				m_HotGripLightColorSchemePart=value;
				this.OnStyleChanged();
			}
		}
		private Color GetColor(Color color, eColorSchemePart p)
		{
			if(p==eColorSchemePart.None || p==eColorSchemePart.Custom)
				return color;
			ColorScheme cs=this.GetColorScheme();
			if(cs==null)
				return color;
			return (Color)cs.GetType().GetProperty(p.ToString()).GetValue(cs,null);
		}
		private ColorScheme GetColorScheme()
		{
            if (this.Style == eSplitterStyle.Office2007 && GlobalManager.Renderer is Office2007Renderer)
            {
                return ((Office2007Renderer)GlobalManager.Renderer).ColorTable.LegacyColors;
            }
			return m_ColorScheme;
		}
		private SplitterColors GetColors()
		{
			SplitterColors colors=new SplitterColors();
			if(m_MouseOver && !this.HotBackColor.IsEmpty)
			{
				colors.BackColor=this.HotBackColor;
				colors.BackColor2=this.HotBackColor2;
				colors.BackColorGradientAngle=this.HotBackColorGradientAngle;
				colors.ExpandFillColor=this.HotExpandFillColor;
				colors.ExpandLineColor=this.HotExpandLineColor;
				colors.GripDarkColor=this.HotGripDarkColor;
				colors.GripLightColor=this.HotGripLightColor;
			}
			else
			{
				colors.BackColor=this.BackColor;
				colors.BackColor2=this.BackColor2;
				colors.BackColorGradientAngle=this.BackColorGradientAngle;
				colors.ExpandFillColor=this.ExpandFillColor;
				colors.ExpandLineColor=this.ExpandLineColor;
				colors.GripDarkColor=this.GripDarkColor;
				colors.GripLightColor=this.GripLightColor;
			}
			return colors;
		}
		/// 
		/// Apply default splitter style colors.
		/// 
		/// Style colors to apply.
		public void ApplyStyle(eSplitterStyle style)
		{
			if(style==eSplitterStyle.Office2003)
			{
				m_ColorScheme=new ColorScheme(eDotNetBarStyle.Office2003);
				this.BackColorSchemePart=eColorSchemePart.PanelBackground;
				this.BackColor2SchemePart=eColorSchemePart.PanelBorder;
				this.GripLightColorSchemePart=eColorSchemePart.BarBackground;
				this.GripDarkColorSchemePart=eColorSchemePart.ItemText;
				this.ExpandFillColorSchemePart=eColorSchemePart.PanelBorder;
				this.ExpandLineColorSchemePart=eColorSchemePart.ItemText;
				
				this.HotBackColorSchemePart=eColorSchemePart.ItemPressedBackground;
				this.HotBackColor2SchemePart=eColorSchemePart.ItemPressedBackground2;
				this.HotGripLightColorSchemePart=eColorSchemePart.BarBackground;
				this.HotGripDarkColorSchemePart=eColorSchemePart.PanelBorder;
				this.HotExpandFillColorSchemePart=eColorSchemePart.PanelBorder;
				this.HotExpandLineColorSchemePart=eColorSchemePart.ItemText;
			}
            else if (style == eSplitterStyle.Office2007)
            {
                m_ColorScheme = new ColorScheme(eDotNetBarStyle.Office2007);
                this.BackColorSchemePart = eColorSchemePart.PanelBackground;
                this.BackColor2SchemePart = eColorSchemePart.PanelBorder;
                this.GripLightColorSchemePart = eColorSchemePart.BarBackground;
                this.GripDarkColorSchemePart = eColorSchemePart.ItemText;
                this.ExpandFillColorSchemePart = eColorSchemePart.PanelBorder;
                this.ExpandLineColorSchemePart = eColorSchemePart.ItemText;
                this.HotBackColorSchemePart = eColorSchemePart.ItemPressedBackground;
                this.HotBackColor2SchemePart = eColorSchemePart.ItemPressedBackground2;
                this.HotGripLightColorSchemePart = eColorSchemePart.BarBackground;
                this.HotGripDarkColorSchemePart = eColorSchemePart.PanelBorder;
                this.HotExpandFillColorSchemePart = eColorSchemePart.PanelBorder;
                this.HotExpandLineColorSchemePart = eColorSchemePart.ItemText;
            }
			else if(style==eSplitterStyle.Mozilla)
			{
				m_ColorScheme=new ColorScheme(eDotNetBarStyle.VS2005);
				this.BackColorSchemePart=eColorSchemePart.None;
				this.BackColor=SystemColors.ControlLight;
				this.BackColor2SchemePart=eColorSchemePart.None;
				this.BackColor2=Color.Empty;
				this.GripLightColorSchemePart=eColorSchemePart.MenuBackground;
				this.GripDarkColorSchemePart=eColorSchemePart.ItemPressedBorder;
				this.ExpandFillColorSchemePart=eColorSchemePart.ItemPressedBackground;
				this.ExpandLineColorSchemePart=eColorSchemePart.ItemPressedBorder;
				
				this.HotBackColorSchemePart=eColorSchemePart.ItemCheckedBackground;
				this.HotBackColor2=Color.Empty;
				this.HotBackColor2SchemePart=eColorSchemePart.None;
				this.HotGripLightColorSchemePart=eColorSchemePart.MenuBackground;
				this.HotGripDarkColorSchemePart=eColorSchemePart.ItemPressedBorder;
				this.HotExpandFillColorSchemePart=eColorSchemePart.ItemPressedBackground;
				this.HotExpandLineColorSchemePart=eColorSchemePart.ItemPressedBorder;
			}
		}
		#endregion
		#region IMessageHandlerClient Implementation
        
		bool IMessageHandlerClient.IsModal
		{
			get
			{
				Form form=this.FindForm();
				if(form!=null)
					return form.Modal;
				return false;
			}
		}
        bool IMessageHandlerClient.OnMouseWheel(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
        {
            return false;
        }
        bool IMessageHandlerClient.OnKeyDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
        {
            // Check Shortcuts
            int wParamInt = WinApi.ToInt(wParam);
            if (System.Windows.Forms.Control.ModifierKeys != Keys.None || wParamInt>= (int)eShortcut.F1 && wParamInt<= (int)eShortcut.F12)
            {
                int i = (int)System.Windows.Forms.Control.ModifierKeys | wParamInt;
                if (ProcessShortcut((eShortcut)i))
                    return true;
            }
            return false;
        }
		private bool ProcessShortcut(eShortcut key)
		{
			if(key==m_Shortcut && this.Expandable)
			{
				SetExpanded(!this.Expanded,eEventSource.Keyboard);
			}
			return false;
		}
		bool IMessageHandlerClient.OnMouseDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
		{
			return false;
		}
		bool IMessageHandlerClient.OnMouseMove(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
		{
			return false;
		}
        bool IMessageHandlerClient.OnSysKeyDown(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
        {
            if (!this.DesignMode)
            {
                // Check Shortcuts
                int wParamInt = WinApi.ToInt(wParam);
                if (System.Windows.Forms.Control.ModifierKeys != Keys.None || wParamInt>= (int)eShortcut.F1 && wParamInt<= (int)eShortcut.F12)
                {
                    int i = (int)System.Windows.Forms.Control.ModifierKeys | wParamInt;
                    if (ProcessShortcut((eShortcut)i))
                        return true;
                }
            }
            return false;
        }
		bool IMessageHandlerClient.OnSysKeyUp(IntPtr hWnd, IntPtr wParam, IntPtr lParam)
		{
			return false;
		}
		private void InstallIMessageHandlerClient()
		{
			if(!m_FilterInstalled && !this.DesignMode && m_Shortcut!=eShortcut.None)
			{
				MessageHandler.RegisterMessageClient(this);
				m_FilterInstalled=true;
			}
		}
		private void UninstallIMessageHandlerClient()
		{
			if(m_FilterInstalled)
			{
				MessageHandler.UnregisterMessageClient(this);
				m_FilterInstalled=false;
			}
		}
		#endregion
	}
	#region Enums
	/// 
	/// Indicates the style of mutli-functional splitter control.
	/// 
	public enum eSplitterStyle
	{
		/// 
		/// Specifies Office 2003 like splitter style and color scheme.
		/// 
		Office2003,
		/// 
		/// Specifies Mozilla like splitter style and color scheme.
		/// 
		Mozilla,
        /// 
        /// Specifies Office 2007 like splitter style and color scheme.
        /// 
        Office2007
	}
	#endregion
	#region Event Arguments and delegates
	public delegate void ExpandChangeEventHandler(object sender, ExpandedChangeEventArgs e);
	/// 
	/// Represents event arguments for ExpandedChanging and ExpandedChanged events.
	/// 
	public class ExpandedChangeEventArgs:EventArgs
	{
		/// 
		/// Gets the action that caused the event, event source.
		/// 
		public readonly eEventSource EventSource=eEventSource.Code;
		/// 
		/// Gets or sets whether execution Expand event should be canceled. Applies only to ExpandedChanging event. Default is false.
		/// 
		public bool Cancel=false;
		/// 
		/// Indicates new value for the Expanded property.
		/// 
		public readonly bool NewExpandedValue=false;
		public ExpandedChangeEventArgs(eEventSource action, bool newExpandedValue)
		{
			this.EventSource=action;
			this.NewExpandedValue=newExpandedValue;
		}
	}
	#endregion
}