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
}