756 lines
24 KiB
C#
756 lines
24 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Data;
|
|
using System.Windows.Forms;
|
|
using System.Xml;
|
|
using System.Drawing.Drawing2D;
|
|
|
|
namespace DevComponents.DotNetBar
|
|
{
|
|
/// <summary>
|
|
/// Represents Outlook 2003 like Navigation Bar.
|
|
/// </summary>
|
|
[ToolboxItem(true), System.Runtime.InteropServices.ComVisible(false), Designer("DevComponents.DotNetBar.Design.NavigationBarDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")]
|
|
public class NavigationBar: BarBaseControl,ISupportInitialize
|
|
{
|
|
private NavigationBarContainer m_ItemContainer;
|
|
private bool m_SplitterVisible=false;
|
|
const int SPLITTER_SIZE=6;
|
|
private Cursor m_SavedSplitterCursor=null;
|
|
private bool m_SplitterMouseDown=false;
|
|
/// <summary>
|
|
/// Occurs after Options dialog which is used to customize control's content has closed by user using OK button.
|
|
/// </summary>
|
|
public event EventHandler OptionsDialogClosed;
|
|
/// <summary>
|
|
/// Default constructor.
|
|
/// </summary>
|
|
public NavigationBar():base()
|
|
{
|
|
m_ItemContainer=new NavigationBarContainer();
|
|
m_ItemContainer.GlobalItem=false;
|
|
m_ItemContainer.ContainerControl=this;
|
|
m_ItemContainer.Stretch=false;
|
|
m_ItemContainer.Displayed=true;
|
|
m_ItemContainer.Style=eDotNetBarStyle.Office2003;
|
|
m_ItemContainer.SetOwner(this);
|
|
this.SetBaseItemContainer(m_ItemContainer);
|
|
|
|
SetDesignTimeDefaults();
|
|
}
|
|
|
|
internal void InvokeOptionsDialogClosed()
|
|
{
|
|
OnOptionsDialogClosed(new EventArgs());
|
|
}
|
|
protected virtual void OnOptionsDialogClosed(EventArgs e)
|
|
{
|
|
EventHandler handler = OptionsDialogClosed;
|
|
if (handler != null) handler(this, e);
|
|
}
|
|
protected override void OnResize(EventArgs e)
|
|
{
|
|
base.OnResize(e);
|
|
if (this.Width == 0 || this.Height == 0)
|
|
return;
|
|
this.RecalcSize();
|
|
}
|
|
|
|
protected override void OnHandleCreated(EventArgs e)
|
|
{
|
|
base.OnHandleCreated(e);
|
|
this.RecalcSize();
|
|
}
|
|
|
|
protected override void RecalcSize()
|
|
{
|
|
if(m_Initializing || !BarFunctions.IsHandleValid(this))
|
|
return;
|
|
|
|
base.RecalcSize();
|
|
|
|
if(m_ItemContainer.IsRecalculatingSize)
|
|
return;
|
|
|
|
Rectangle r=this.GetItemContainerRectangle();
|
|
if(m_ItemContainer.HeightInternal>0)
|
|
{
|
|
this.Height = m_ItemContainer.HeightInternal + r.Top + Math.Max(0,this.ClientRectangle.Bottom - r.Bottom);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns collection of items on a bar.
|
|
/// </summary>
|
|
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content), Browsable(false)]
|
|
public SubItemsCollection Items
|
|
{
|
|
get
|
|
{
|
|
return m_ItemContainer.SubItems;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Applies design-time defaults to control.
|
|
/// </summary>
|
|
public override void SetDesignTimeDefaults()
|
|
{
|
|
base.SetDesignTimeDefaults();
|
|
|
|
ApplyColorSchemeDefaults();
|
|
|
|
this.BackgroundStyle.BorderColor.ColorSchemePart=eColorSchemePart.PanelBorder;
|
|
this.BackgroundStyle.Border=eBorderType.SingleLine;
|
|
}
|
|
|
|
private void ApplyColorSchemeDefaults()
|
|
{
|
|
// ColorScheme Defaults
|
|
this.ColorScheme.ItemHotBorder = Color.Empty;
|
|
this.ColorScheme.ItemBackground = this.ColorScheme.BarBackground;
|
|
this.ColorScheme.ItemBackground2 = this.ColorScheme.BarBackground2;
|
|
this.ColorScheme.ItemHotBorder = Color.Empty;
|
|
this.ColorScheme.ItemPressedBorder = Color.Empty;
|
|
this.ColorScheme.ItemCheckedBorder = Color.Empty;
|
|
this.ColorScheme.ItemExpandedBackground = this.ColorScheme.ItemHotBackground;
|
|
this.ColorScheme.ItemExpandedBackground2 = this.ColorScheme.ItemHotBackground2;
|
|
this.ColorScheme.ItemExpandedShadow = Color.Empty;
|
|
this.ColorScheme.ItemExpandedBorder = Color.Empty;
|
|
this.ColorScheme.ResetChangedFlag();
|
|
|
|
this.BackgroundStyle.ApplyColorScheme(this.ColorScheme);
|
|
}
|
|
|
|
protected override void OnSystemColorsChanged(EventArgs e)
|
|
{
|
|
base.OnSystemColorsChanged(e);
|
|
Application.DoEvents();
|
|
this.ColorScheme.Refresh();
|
|
ApplyColorSchemeDefaults();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether Configure Buttons button is visible.
|
|
/// </summary>
|
|
[Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Indicates Configure Buttons button is visible."),System.ComponentModel.DefaultValue(true)]
|
|
public bool ConfigureItemVisible
|
|
{
|
|
get {return m_ItemContainer.ConfigureItemVisible;}
|
|
set
|
|
{
|
|
m_ItemContainer.ConfigureItemVisible=value;
|
|
this.RecalcLayout();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether Show More Buttons and Show Fewer Buttons menu items are visible on Configure buttons menu.
|
|
/// </summary>
|
|
[Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Indicates whether Show More Buttons and Show Fewer Buttons menu items are visible on Configure buttons menu."),System.ComponentModel.DefaultValue(true)]
|
|
public bool ConfigureShowHideVisible
|
|
{
|
|
get {return m_ItemContainer.ConfigureShowHideVisible;}
|
|
set
|
|
{
|
|
m_ItemContainer.ConfigureShowHideVisible=value;
|
|
this.RecalcLayout();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether Navigation Pane Options menu item is visible on Configure buttons menu.
|
|
/// </summary>
|
|
[Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Gets or sets whether Navigation Pane Options menu item is visible on Configure buttons menu."),System.ComponentModel.DefaultValue(true)]
|
|
public bool ConfigureNavOptionsVisible
|
|
{
|
|
get {return m_ItemContainer.ConfigureNavOptionsVisible;}
|
|
set
|
|
{
|
|
m_ItemContainer.ConfigureNavOptionsVisible=value;
|
|
this.RecalcLayout();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether Navigation Pane Add/Remove Buttons menu item is visible on Configure buttons menu.
|
|
/// </summary>
|
|
[Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Indicates whether Navigation Pane Add/Remove Buttons menu item is visible on Configure buttons menu."),System.ComponentModel.DefaultValue(true)]
|
|
public bool ConfigureAddRemoveVisible
|
|
{
|
|
get {return m_ItemContainer.ConfigureAddRemoveVisible;}
|
|
set
|
|
{
|
|
m_ItemContainer.ConfigureAddRemoveVisible=value;
|
|
this.RecalcLayout();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether summary line is visible.
|
|
/// </summary>
|
|
[Browsable(true),DevCoBrowsable(true),Category("Behavior"),Description("Indicates whether summary line is visible."),System.ComponentModel.DefaultValue(true)]
|
|
public bool SummaryLineVisible
|
|
{
|
|
get {return m_ItemContainer.SummaryLineVisible;}
|
|
set
|
|
{
|
|
m_ItemContainer.SummaryLineVisible=value;
|
|
this.RecalcLayout();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the padding in pixels at the top portion of the item. Height of each item will be increased by padding amount.
|
|
/// </summary>
|
|
[Browsable(true),DevCoBrowsable(true),Category("Layout"),Description("Indicates the padding in pixels at the top portion of the item."),DefaultValue(4)]
|
|
public int ItemPaddingTop
|
|
{
|
|
get {return m_ItemContainer.ItemPaddingTop;}
|
|
set
|
|
{
|
|
m_ItemContainer.ItemPaddingTop=value;
|
|
if(this.DesignMode)
|
|
this.RecalcLayout();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the padding in pixels for bottom portion of the item. Height of each item will be increased by padding amount.
|
|
/// </summary>
|
|
[Browsable(true),DevCoBrowsable(true),Category("Layout"),Description("Indicates the padding in pixels at the bottom of the item."),DefaultValue(4)]
|
|
public int ItemPaddingBottom
|
|
{
|
|
get {return m_ItemContainer.ItemPaddingBottom;}
|
|
set
|
|
{
|
|
m_ItemContainer.ItemPaddingBottom=value;
|
|
if(this.DesignMode)
|
|
this.RecalcLayout();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Increases the size of the navigation bar if possible by showing more buttons on the top.
|
|
/// </summary>
|
|
public void ShowMoreButtons()
|
|
{
|
|
m_ItemContainer.ShowMoreButtons();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reduces the size of the navigation bar if possible by showing fewer buttons on the top.
|
|
/// </summary>
|
|
public void ShowFewerButtons()
|
|
{
|
|
m_ItemContainer.ShowFewerButtons();
|
|
}
|
|
|
|
protected override Rectangle GetItemContainerRectangle()
|
|
{
|
|
Rectangle r=base.GetItemContainerRectangle();
|
|
if(m_SplitterVisible)
|
|
{
|
|
r.Y+=SPLITTER_SIZE;
|
|
r.Height-=SPLITTER_SIZE;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
protected override void PaintContentOnTop(ItemPaintArgs pa)
|
|
{
|
|
base.PaintContentOnTop(pa);
|
|
PaintSplitter(pa);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns items container.
|
|
/// </summary>
|
|
[Browsable(false)]
|
|
public NavigationBarContainer ItemsContainer
|
|
{
|
|
get {return m_ItemContainer;}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns reference to currently checked button.
|
|
/// </summary>
|
|
[Browsable(false)]
|
|
public ButtonItem CheckedButton
|
|
{
|
|
get
|
|
{
|
|
foreach(BaseItem item in m_ItemContainer.SubItems)
|
|
{
|
|
if(item is ButtonItem && ((ButtonItem)item).Checked)
|
|
return item as ButtonItem;
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets whether images are automatically resized to size specified in ImageSizeSummaryLine when button is on the bottom summary line of navigation bar.
|
|
/// </summary>
|
|
[Browsable(true),DevCoBrowsable(true),Category("Appearance"),Description("Indicates whether images are automatically resized to size specified in ImageSizeSummaryLine when button is on the bottom summary line of navigation bar."),DefaultValue(true)]
|
|
public bool AutoSizeButtonImage
|
|
{
|
|
get {return m_ItemContainer.AutoSizeButtonImage;}
|
|
set {m_ItemContainer.AutoSizeButtonImage=value;}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets size of the image that will be use to resize images to when button button is on the bottom summary line of navigation bar and AutoSizeButtonImage=true.
|
|
/// </summary>
|
|
[Browsable(true),DevCoBrowsable(true),Category("Appearance"),Description("Indicates size of the image that will be use to resize images to when button button is on the bottom summary line of navigation bar and AutoSizeButtonImage=true.")]
|
|
public Size ImageSizeSummaryLine
|
|
{
|
|
get {return m_ItemContainer.ImageSizeSummaryLine;}
|
|
set {m_ItemContainer.ImageSizeSummaryLine=value;}
|
|
}
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public bool ShouldSerializeImageSizeSummaryLine()
|
|
{
|
|
return (m_ItemContainer.ImageSizeSummaryLine.Width!=16 || m_ItemContainer.ImageSizeSummaryLine.Height!=16);
|
|
}
|
|
|
|
private bool m_Initializing=false;
|
|
void ISupportInitialize.BeginInit()
|
|
{
|
|
m_Initializing=true;
|
|
}
|
|
void ISupportInitialize.EndInit()
|
|
{
|
|
m_Initializing=false;
|
|
this.RecalcLayout();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Saves current visual layout of navigation bar control to XML based file.
|
|
/// </summary>
|
|
/// <param name="fileName">File name to save layout to.</param>
|
|
public void SaveLayout(string fileName)
|
|
{
|
|
System.Xml.XmlDocument xmlDoc=new System.Xml.XmlDocument();
|
|
XmlElement parent=xmlDoc.CreateElement("navbarlayout");
|
|
xmlDoc.AppendChild(parent);
|
|
|
|
this.SaveLayout(parent);
|
|
|
|
xmlDoc.Save(fileName);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Saves current visual layout of navigation bar control to XmlElement.
|
|
/// </summary>
|
|
/// <param name="xmlParent">XmlElement object that will act as a parent for the layout definition. Exact same element should be passed into the LoadLayout method to load the layout.</param>
|
|
public void SaveLayout(XmlElement xmlParent)
|
|
{
|
|
if(this.Items.Count==0)
|
|
return;
|
|
XmlElement root=xmlParent.OwnerDocument.CreateElement("navigationbar");
|
|
xmlParent.AppendChild(root);
|
|
root.SetAttribute("height",this.Height.ToString());
|
|
foreach(BaseItem item in this.Items)
|
|
{
|
|
if(item is ButtonItem && item.Name!="")
|
|
{
|
|
XmlElement xmlItem=xmlParent.OwnerDocument.CreateElement("item");
|
|
root.AppendChild(xmlItem);
|
|
xmlItem.SetAttribute("index",this.Items.IndexOf(item).ToString());
|
|
xmlItem.SetAttribute("name",item.Name);
|
|
xmlItem.SetAttribute("visible",XmlConvert.ToString(item.Visible));
|
|
xmlItem.SetAttribute("checked",XmlConvert.ToString(((ButtonItem)item).Checked));
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets or sets the navigation bar definition string.
|
|
/// </summary>
|
|
[Browsable(false),DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
public string LayoutDefinition
|
|
{
|
|
get
|
|
{
|
|
System.Xml.XmlDocument xmlDoc=new System.Xml.XmlDocument();
|
|
XmlElement parent=xmlDoc.CreateElement("navbarlayout");
|
|
xmlDoc.AppendChild(parent);
|
|
this.SaveLayout(parent);
|
|
return xmlDoc.OuterXml;
|
|
}
|
|
set
|
|
{
|
|
System.Xml.XmlDocument xmlDoc=new System.Xml.XmlDocument();
|
|
xmlDoc.LoadXml(value);
|
|
LoadLayout(xmlDoc.FirstChild as XmlElement);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Loads navigation bar layout that was saved using SaveLayout method. Note that this method must be called after all items are created and added to the control.
|
|
/// </summary>
|
|
/// <param name="fileName">File to load layout from.</param>
|
|
public void LoadLayout(string fileName)
|
|
{
|
|
System.Xml.XmlDocument xmlDoc=new System.Xml.XmlDocument();
|
|
xmlDoc.Load(fileName);
|
|
this.LoadLayout(xmlDoc.FirstChild as XmlElement);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Loads navigation bar layout that was saved using SaveLayout method. Note that this method must be called after all items are created and added to the control.
|
|
/// </summary>
|
|
/// <param name="xmlParent">Parent XML element that is used to load layout from. Note that this must be the same element that was passed into the SaveLayout method.</param>
|
|
public void LoadLayout(XmlElement xmlParent)
|
|
{
|
|
if(this.Items.Count==0)
|
|
return;
|
|
|
|
XmlElement root=xmlParent.FirstChild as XmlElement;
|
|
if(root==null || root.Name!="navigationbar")
|
|
throw new InvalidOperationException("xmlParent parameter in LoadLayout does not contain expected XML child note with name navigationbar. Invalid XML layout file.");
|
|
|
|
try
|
|
{
|
|
((ISupportInitialize)this).BeginInit();
|
|
this.Height=XmlConvert.ToInt32(root.GetAttribute("height"));
|
|
foreach(XmlElement xmlItem in root.ChildNodes)
|
|
{
|
|
if(!this.Items.Contains(xmlItem.GetAttribute("name")))
|
|
continue;
|
|
BaseItem item=this.Items[xmlItem.GetAttribute("name")];
|
|
if(item is ButtonItem)
|
|
{
|
|
ButtonItem button=item as ButtonItem;
|
|
button.Checked=XmlConvert.ToBoolean(xmlItem.GetAttribute("checked"));
|
|
button.Visible=XmlConvert.ToBoolean(xmlItem.GetAttribute("visible"));
|
|
int i=XmlConvert.ToInt32(xmlItem.GetAttribute("index"));
|
|
if(this.Items.IndexOf(item)!=i)
|
|
{
|
|
this.Items.RemoveAt(this.Items.IndexOf(item));
|
|
this.Items.Insert(i,item);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
((ISupportInitialize)this).EndInit();
|
|
}
|
|
}
|
|
|
|
protected override bool ProcessMnemonic(char charCode)
|
|
{
|
|
string s="&"+charCode.ToString();
|
|
s=s.ToLower();
|
|
foreach(BaseItem item in this.Items)
|
|
{
|
|
string text=item.Text.ToLower();
|
|
if(text.IndexOf(s)>=0)
|
|
{
|
|
if(item is ButtonItem)
|
|
{
|
|
((ButtonItem)item).Checked=true;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets/Sets the visual style for items and color scheme.
|
|
/// </summary>
|
|
[Browsable(true), DevCoBrowsable(true), Category("Appearance"), Description("Specifies the visual style of the control."), DefaultValue(eDotNetBarStyle.Office2003)]
|
|
public eDotNetBarStyle Style
|
|
{
|
|
get
|
|
{
|
|
return m_ItemContainer.Style;
|
|
}
|
|
set
|
|
{
|
|
this.ColorScheme.Style = value;
|
|
m_ItemContainer.Style = value;
|
|
ApplyColorSchemeDefaults();
|
|
this.RecalcLayout();
|
|
}
|
|
}
|
|
|
|
private static RoundRectangleShapeDescriptor _ButtonShape = new RoundRectangleShapeDescriptor();
|
|
internal IShapeDescriptor ButtonShape
|
|
{
|
|
get
|
|
{
|
|
return _ButtonShape;
|
|
}
|
|
}
|
|
|
|
#region Splitter Support
|
|
protected virtual void PaintSplitter(ItemPaintArgs pa)
|
|
{
|
|
if (m_SplitterVisible)
|
|
{
|
|
Rectangle r = this.GetSplitterRectangle();
|
|
eDotNetBarStyle effectiveStyle = m_ItemContainer.EffectiveStyle;
|
|
|
|
if (effectiveStyle == eDotNetBarStyle.Office2010)
|
|
{
|
|
r.Height--;
|
|
r.Inflate(0, 0);
|
|
r.Width -= 2;
|
|
}
|
|
|
|
if (effectiveStyle != eDotNetBarStyle.Office2010)
|
|
{
|
|
using (System.Drawing.Drawing2D.LinearGradientBrush brush = BarFunctions.CreateLinearGradientBrush(r, pa.Colors.SplitterBackground, pa.Colors.SplitterBackground2, 90))
|
|
pa.Graphics.FillRectangle(brush, r);
|
|
|
|
using (SolidBrush brush = new SolidBrush(Color.White))
|
|
{
|
|
int x = r.X + (r.Width - 34) / 2;
|
|
int y = r.Y + 2;
|
|
for (int i = 0; i < 9; i++)
|
|
{
|
|
pa.Graphics.FillRectangle(brush, x, y, 2, 2);
|
|
x += 4;
|
|
}
|
|
}
|
|
|
|
using (SolidBrush brush = new SolidBrush(Color.FromArgb(128, ControlPaint.Dark(pa.Colors.SplitterBackground))))
|
|
{
|
|
int x = r.X + (r.Width - 34) / 2 - 1;
|
|
int y = r.Y + 1;
|
|
for (int i = 0; i < 9; i++)
|
|
{
|
|
pa.Graphics.FillRectangle(brush, x, y, 2, 2);
|
|
x += 4;
|
|
}
|
|
}
|
|
DisplayHelp.DrawLine(pa.Graphics, r.X, r.Bottom - 1, r.Right, r.Bottom - 1, pa.Colors.SplitterBorder, 1);
|
|
}
|
|
else
|
|
{
|
|
Rectangle fillRect = r;
|
|
fillRect.Height -= 1;
|
|
SmoothingMode sm = pa.Graphics.SmoothingMode;
|
|
pa.Graphics.SmoothingMode = SmoothingMode.None;
|
|
using (System.Drawing.Drawing2D.LinearGradientBrush brush = new LinearGradientBrush(fillRect, pa.Colors.SplitterBackground, pa.Colors.SplitterBackground2, 90))
|
|
pa.Graphics.FillRectangle(brush, fillRect);
|
|
pa.Graphics.SmoothingMode = sm;
|
|
DisplayHelp.DrawRectangle(pa.Graphics, pa.Colors.SplitterBorder, r);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual Rectangle GetSplitterRectangle()
|
|
{
|
|
Rectangle r=new Rectangle(this.ClientRectangle.X,this.ClientRectangle.Y,this.Width,SPLITTER_SIZE);
|
|
if(this.BackgroundStyle.Border==eBorderType.SingleLine)
|
|
{
|
|
if((this.BackgroundStyle.BorderSide & eBorderSide.Top)==eBorderSide.Top)
|
|
r.Y++;
|
|
if((this.BackgroundStyle.BorderSide & eBorderSide.Right)==eBorderSide.Right)
|
|
r.Width--;
|
|
if((this.BackgroundStyle.BorderSide & eBorderSide.Left)==eBorderSide.Left)
|
|
{
|
|
r.X++;
|
|
r.Width--;
|
|
}
|
|
}
|
|
else if(this.BackgroundStyle.Border!=eBorderType.None)
|
|
{
|
|
if((this.BackgroundStyle.BorderSide & eBorderSide.Top)==eBorderSide.Top)
|
|
r.Y+=2;
|
|
if((this.BackgroundStyle.BorderSide & eBorderSide.Right)==eBorderSide.Right)
|
|
r.Width-=2;
|
|
if((this.BackgroundStyle.BorderSide & eBorderSide.Left)==eBorderSide.Left)
|
|
{
|
|
r.X+=2;
|
|
r.Width-=2;
|
|
}
|
|
}
|
|
return r;
|
|
}
|
|
|
|
protected override void OnMouseMove(MouseEventArgs e)
|
|
{
|
|
SplitterMouseMove(e);
|
|
if(!m_SplitterMouseDown)
|
|
base.OnMouseMove(e);
|
|
}
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public void SplitterMouseMove(MouseEventArgs e)
|
|
{
|
|
if(m_SplitterVisible && !m_SplitterMouseDown)
|
|
{
|
|
if(HitTestSplitter(e.X,e.Y))
|
|
{
|
|
if(m_SavedSplitterCursor==null || this.GetDesignMode())
|
|
{
|
|
if(m_SavedSplitterCursor==null)
|
|
{
|
|
if(this.GetDesignMode())
|
|
m_SavedSplitterCursor=Cursor.Current;
|
|
else
|
|
m_SavedSplitterCursor=this.Cursor;
|
|
}
|
|
|
|
if(this.GetDesignMode())
|
|
Cursor.Current=Cursors.SizeNS;
|
|
else
|
|
this.Cursor=Cursors.SizeNS;
|
|
}
|
|
}
|
|
else if(m_SavedSplitterCursor!=null)
|
|
{
|
|
if(this.GetDesignMode())
|
|
Cursor.Current=m_SavedSplitterCursor;
|
|
else
|
|
this.Cursor=m_SavedSplitterCursor;
|
|
m_SavedSplitterCursor=null;
|
|
}
|
|
}
|
|
|
|
if(m_SplitterMouseDown)
|
|
{
|
|
bool reduceSize=false;
|
|
BaseItem firstDisplayed=m_ItemContainer.GetFirstVisibleItem();
|
|
if(firstDisplayed==null)
|
|
reduceSize=false;
|
|
else if(e.Y>=firstDisplayed.DisplayRectangle.Bottom-SPLITTER_SIZE)
|
|
reduceSize=true;
|
|
|
|
// BaseItem referenceItem=m_ItemContainer.GetResizeReferenceItem(reduceSize);
|
|
// if(referenceItem==null)
|
|
// return;
|
|
// int itemHeight=referenceItem.HeightInternal;
|
|
// if(referenceItem is ButtonItem && m_ItemContainer.AutoSizeButtonImage && !m_ItemContainer.ImageSizeSummaryLine.IsEmpty && !((ButtonItem)referenceItem).ImageFixedSize.IsEmpty)
|
|
// {
|
|
// Size size=((ButtonItem)referenceItem).ImageFixedSize;
|
|
// ((ButtonItem)referenceItem).ImageFixedSize=Size.Empty;
|
|
// referenceItem.RecalcSize();
|
|
// itemHeight=referenceItem.HeightInternal;
|
|
// itemHeight+=(m_ItemContainer.ItemPaddingBottom+m_ItemContainer.ItemPaddingTop);
|
|
// ((ButtonItem)referenceItem).ImageFixedSize=size;
|
|
// referenceItem.RecalcSize();
|
|
// }
|
|
|
|
int itemHeight=m_ItemContainer.GetChangeSizeHeight(reduceSize);
|
|
|
|
if(firstDisplayed!=null && e.Y>=firstDisplayed.DisplayRectangle.Bottom-SPLITTER_SIZE && this.GetItemContainerRectangle().Height>itemHeight+SPLITTER_SIZE)
|
|
{
|
|
//this.Height-=itemHeight;
|
|
m_ItemContainer.ShowFewerButtons();
|
|
}
|
|
else if(e.Y<0 && Math.Abs(e.Y)>=itemHeight+SPLITTER_SIZE)
|
|
{
|
|
// itemHeight+=SPLITTER_SIZE;
|
|
// this.Height+=itemHeight+1;
|
|
m_ItemContainer.ShowMoreButtons();
|
|
}
|
|
else
|
|
this.RecalcLayout();
|
|
}
|
|
}
|
|
|
|
protected override void OnMouseLeave(EventArgs e)
|
|
{
|
|
SplitterMouseLeave();
|
|
base.OnMouseLeave(e);
|
|
}
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public void SplitterMouseLeave()
|
|
{
|
|
if(m_SavedSplitterCursor!=null)
|
|
{
|
|
if(this.GetDesignMode())
|
|
Cursor.Current=m_SavedSplitterCursor;
|
|
else
|
|
this.Cursor=m_SavedSplitterCursor;
|
|
m_SavedSplitterCursor=null;
|
|
}
|
|
}
|
|
|
|
protected override void OnMouseDown(MouseEventArgs e)
|
|
{
|
|
SplitterMouseDown(e);
|
|
|
|
if(!m_SplitterMouseDown)
|
|
base.OnMouseDown(e);
|
|
}
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public void SplitterMouseDown(MouseEventArgs e)
|
|
{
|
|
if(this.Dock==DockStyle.Bottom && HitTestSplitter(e.X,e.Y))
|
|
{
|
|
this.Capture=true;
|
|
m_SplitterMouseDown=true;
|
|
}
|
|
}
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public bool HitTestSplitter(int x, int y)
|
|
{
|
|
if(m_SplitterVisible)
|
|
{
|
|
Rectangle r=this.GetSplitterRectangle();
|
|
if(r.Contains(x,y))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
protected override void OnMouseUp(MouseEventArgs e)
|
|
{
|
|
SplitterMouseUp(e);
|
|
base.OnMouseUp(e);
|
|
}
|
|
[EditorBrowsable(EditorBrowsableState.Never), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
public bool IsSplitterMouseDown
|
|
{
|
|
get {return m_SplitterMouseDown;}
|
|
}
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public void SplitterMouseUp(MouseEventArgs e)
|
|
{
|
|
if(m_SplitterMouseDown)
|
|
{
|
|
m_SplitterMouseDown=false;
|
|
this.Capture=false;
|
|
|
|
if(m_SavedSplitterCursor!=null)
|
|
{
|
|
this.Cursor=m_SavedSplitterCursor;
|
|
m_SavedSplitterCursor=null;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Internal Splitter sizing logic assumes that control is docked to bottom and it will
|
|
// change height ONLY. It is not capable of handling the generic splitter case!!!!!
|
|
// OnMouseDown is hard-coded to check for Dock=Bottom to prevent any problems
|
|
/// <summary>
|
|
/// Indicates whether splitter on top of the navigation bar is visible. When activated splitter will let user change the height of the
|
|
/// control to show fewer or more buttons. It is recommended to have navigation bar docked to bottom (Dock=Bottom) to maintain
|
|
/// proper layout.
|
|
/// </summary>
|
|
[Browsable(true),DevCoBrowsable(true),Category("Layout"),Description("Indicates whether splitter on top of the navigation bar is visible."),DefaultValue(false)]
|
|
public bool SplitterVisible
|
|
{
|
|
get{return m_SplitterVisible;}
|
|
set
|
|
{
|
|
m_SplitterVisible=value;
|
|
if(this.DesignMode)
|
|
this.RecalcLayout();
|
|
}
|
|
}
|
|
#endregion
|
|
}
|
|
}
|