149 lines
5.1 KiB
C#

using DevComponents.DotNetBar.Rendering;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;
namespace DevComponents.DotNetBar.Controls
{
/// <summary>
/// Represents a panel which hosts controls for the SideNavItem.
/// </summary>
[ToolboxItem(false)]
public class SideNavPanel : Panel, IScrollBarOverrideSupport
{
private ScrollbarSkinner _ScrollSkinner = null;
public SideNavPanel()
{
this.SetStyle(ControlStyles.AllPaintingInWmPaint
| ControlStyles.ResizeRedraw
| DisplayHelp.DoubleBufferFlag
| ControlStyles.UserPaint
| ControlStyles.Opaque
, true);
_ScrollSkinner = new ScrollbarSkinner(this);
}
protected override void Dispose(bool disposing)
{
_ScrollSkinner.Dispose();
base.Dispose(disposing);
}
protected override void OnPaint(PaintEventArgs e)
{
Color backColor = GetBackColor();
if (!backColor.IsEmpty)
{
using (SolidBrush brush = new SolidBrush(backColor))
e.Graphics.FillRectangle(brush, this.ClientRectangle);
}
base.OnPaint(e);
}
private Color _BackColor = Color.Empty;
protected override void OnBackColorChanged(EventArgs e)
{
PropertyInfo prop = typeof (Control).GetProperty("RawBackColor",
BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Instance);
if (prop != null)
{
_BackColor = (Color)prop.GetValue(this, null);
}
base.OnBackColorChanged(e);
}
private Color GetBackColor()
{
if(!_BackColor.IsEmpty)
return _BackColor;
return GetColorTable().PanelBackColor;
}
private SideNavColorTable GetColorTable()
{
return ((Office2007Renderer)GlobalManager.Renderer).ColorTable.SideNav;
}
protected override void WndProc(ref Message m)
{
//Console.WriteLine("{0} Message {1}", DateTime.Now, MapMessage(m.Msg));
if (m.Msg == (int)WinApi.WindowsMessages.WM_VSCROLL || m.Msg == (int)WinApi.WindowsMessages.WM_HSCROLL || m.Msg == (int)WinApi.WindowsMessages.WM_MOUSEWHEEL)
{
base.WndProc(ref m);
OnScrollBarValueChanged(new ScrollValueChangedEventArgs(ScrollbarControl.MapMessageToScrollChange(m.Msg)));
return;
}
else if (m.Msg == (int)WinApi.WindowsMessages.WM_NCCALCSIZE)
{
base.WndProc(ref m);
OnNonClientSizeChanged(EventArgs.Empty);
return;
}
else if (m.Msg == 206 || m.Msg == 8270) // Internal RichTextBox message we use to trigger scroll-bar update
{
base.WndProc(ref m);
OnScrollBarValueChanged(new ScrollValueChangedEventArgs(eScrollBarScrollChange.Horizontal | eScrollBarScrollChange.Vertical));
return;
}
else if (m.Msg == (int)WinApi.WindowsMessages.WM_MOVE) // Internal RichTextBox message we use to trigger scroll-bar update
{
base.WndProc(ref m);
OnControlMoved(EventArgs.Empty);
return;
}
base.WndProc(ref m);
}
#region IScrollBarOverrideSupport Members
[Browsable(false)]
public event EventHandler NonClientSizeChanged;
/// <summary>
/// Raises NonClientSizeChanged event.
/// </summary>
/// <param name="e">Provides event arguments.</param>
protected virtual void OnNonClientSizeChanged(EventArgs e)
{
EventHandler handler = NonClientSizeChanged;
if (handler != null)
handler(this, e);
}
public event ScrollValueChangedHandler ScrollBarValueChanged;
/// <summary>
/// Raises ScrollBarValueChanged event.
/// </summary>
/// <param name="e">Provides event arguments.</param>
protected virtual void OnScrollBarValueChanged(ScrollValueChangedEventArgs e)
{
ScrollValueChangedHandler handler = ScrollBarValueChanged;
if (handler != null)
handler(this, e);
}
[Browsable(false)]
public event EventHandler ControlMoved;
/// <summary>
/// Raises NonClientSizeChanged event.
/// </summary>
/// <param name="e">Provides event arguments.</param>
protected virtual void OnControlMoved(EventArgs e)
{
EventHandler handler = ControlMoved;
if (handler != null)
handler(this, e);
}
bool IScrollBarOverrideSupport.DesignMode
{
get
{
return this.DesignMode;
}
}
#endregion
}
}