666 lines
16 KiB
C#

#if FRAMEWORK20
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace DevComponents.DotNetBar
{
public class SuperTabControlBox : BaseItem
{
#region Private variables
private SuperTabStripItem _TabStripItem;
private SuperTabCloseBox _CloseBox;
private SuperTabMenuBox _MenuBox;
private BaseItem _HotItem;
private BaseItem _MouseDownItem;
private bool _IsMouseOver;
private bool _IsMouseDown;
#endregion
/// <summary>
/// Constructor
/// </summary>
/// <param name="tabStripItem">Associated SuperTabStripItem</param>
public SuperTabControlBox(SuperTabStripItem tabStripItem)
{
_TabStripItem = tabStripItem;
MouseDownCapture = true;
MouseUpNotification = true;
Style = eDotNetBarStyle.Office2007;
_MenuBox = new SuperTabMenuBox(this);
_CloseBox = new SuperTabCloseBox(this);
_MenuBox.Visible = true;
_CloseBox.Visible = false;
SetParent(tabStripItem);
SetIsContainer(true);
SubItems.Add(_MenuBox);
SubItems.Add(_CloseBox);
}
#region Public override designer hiding
[Browsable(false)]
public override bool BeginGroup
{
get { return base.BeginGroup; }
set { base.BeginGroup = value; }
}
[Browsable(false)]
public override bool AutoCollapseOnClick
{
get { return base.AutoCollapseOnClick; }
set { base.AutoCollapseOnClick = value; }
}
[Browsable(false)]
public override bool CanCustomize
{
get { return base.CanCustomize; }
set { base.CanCustomize = value; }
}
[Browsable(false)]
public override string Category
{
get { return base.Category; }
set { base.Category = value; }
}
[Browsable(false)]
public override bool ClickAutoRepeat
{
get { return base.ClickAutoRepeat; }
set { base.ClickAutoRepeat = value; }
}
[Browsable(false)]
public override int ClickRepeatInterval
{
get { return base.ClickRepeatInterval; }
set { base.ClickRepeatInterval = value; }
}
[Browsable(false)]
public override Cursor Cursor
{
get { return base.Cursor; }
set { base.Cursor = value; }
}
[Browsable(false)]
public override bool Enabled
{
get { return base.Enabled; }
set { base.Enabled = value; }
}
[Browsable(false)]
public override bool Stretch
{
get { return base.Stretch; }
set { base.Stretch = value; }
}
[Browsable(false)]
public override string Text
{
get { return base.Text; }
set { base.Text = value; }
}
[Browsable(false)]
public override bool ThemeAware
{
get { return base.ThemeAware; }
set { base.ThemeAware = value; }
}
[Browsable(false)]
public override string Tooltip
{
get { return base.Tooltip; }
set { base.Tooltip = value; }
}
[Browsable(false)]
public override eItemAlignment ItemAlignment
{
get { return base.ItemAlignment; }
set { base.ItemAlignment = value; }
}
[Browsable(false)]
public override string KeyTips
{
get { return base.KeyTips; }
set { base.KeyTips = value; }
}
[Browsable(false)]
public override ShortcutsCollection Shortcuts
{
get { return base.Shortcuts; }
set { base.Shortcuts = value; }
}
[Browsable(false)]
public override string Description
{
get { return base.Description; }
set { base.Description = value; }
}
[Browsable(false)]
public override bool GlobalItem
{
get { return base.GlobalItem; }
set { base.GlobalItem = value; }
}
[Browsable(false)]
public override bool ShowSubItems
{
get { return base.ShowSubItems; }
set { base.ShowSubItems = value; }
}
[Browsable(false)]
public override string GlobalName
{
get { return base.GlobalName; }
set { base.GlobalName = value; }
}
[Browsable(false)]
public override Command Command
{
get { return base.Command; }
set { base.Command = value; }
}
[Browsable(false)]
public override object CommandParameter
{
get { return base.CommandParameter; }
set { base.CommandParameter = value; }
}
#endregion
#region Public properties
#region Bounds
/// <summary>
/// Gets or sets the ControlBox Bounds
/// </summary>
[Browsable(false)]
public override Rectangle Bounds
{
get { return (base.Bounds); }
set
{
if (base.Bounds.Equals(value) == false)
{
base.Bounds = value;
RecalcLayout();
}
}
}
#endregion
#region CloseBox
/// <summary>
/// Gets the CloseBox
/// </summary>
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public SuperTabCloseBox CloseBox
{
get { return (_CloseBox); }
}
#endregion
#region MenuBox
/// <summary>
/// Gets the MenuBox
/// </summary>
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public SuperTabMenuBox MenuBox
{
get { return (_MenuBox); }
}
#endregion
#region Visible
/// <summary>
/// Gets or sets the ControlBox Visible state
/// </summary>
public override bool Visible
{
get { return base.Visible; }
set
{
if (base.Visible != value)
{
base.Visible = value;
MyRefresh();
}
}
}
#endregion
#endregion
#region Internal properties
#region IsMouseDown
/// <summary>
/// Gets the MouseDown state
/// </summary>
internal bool IsMouseDown
{
get { return (_IsMouseDown); }
}
#endregion
#region IsMouseOver
/// <summary>
/// Gets the MouseOver state
/// </summary>
internal bool IsMouseOver
{
get { return (_IsMouseOver); }
}
#endregion
#region TabDisplay
/// <summary>
/// Gets the TabStrip TabDisplay
/// </summary>
internal SuperTabStripBaseDisplay TabDisplay
{
get { return (_TabStripItem.TabDisplay); }
}
#endregion
#endregion
#region RecalcSize
/// <summary>
/// Performs RecalcSize processing
/// </summary>
public override void RecalcSize()
{
Size size = Size.Empty;
foreach (BaseItem item in SubItems)
size = LayoutItem(item, size, true);
WidthInternal = size.Width;
HeightInternal = size.Height;
}
#endregion
#region RecalcLayout
/// <summary>
/// Performs RecalcLayout processing
/// </summary>
private void RecalcLayout()
{
Size size = Size.Empty;
if (_TabStripItem.IsRightToLeft)
{
int closeIndex = SubItems.IndexOf(_CloseBox);
int menuIndex = SubItems.IndexOf(_MenuBox);
if (menuIndex >= 0 && closeIndex > menuIndex)
{
SubItems.Remove(_CloseBox);
SubItems.Insert(menuIndex, _CloseBox);
}
}
foreach (BaseItem item in SubItems)
size = LayoutItem(item, size, false);
Refresh();
}
#endregion
#region LayoutItem
/// <summary>
/// Performs individual running layout processing for the given BaseItem
/// </summary>
/// <param name="item">Item to Layout</param>
/// <param name="size">Running Layout Size</param>
/// <param name="recalc">Whether a recalcSize is needed</param>
/// <returns>New running Size</returns>
private Size LayoutItem(BaseItem item, Size size, bool recalc)
{
if (item.Visible == true)
{
// Recalc if requested
if (recalc == true)
item.RecalcSize();
// If this is the first item, then give
// us a little padding around the ControlBox
if (size.IsEmpty == true)
{
if (Orientation == eOrientation.Horizontal)
size.Width += Dpi.Width5;
else
size.Height += Dpi.Height5;
}
// Get the item Bounds
Rectangle r = new Rectangle(Bounds.X, Bounds.Y, item.WidthInternal, item.HeightInternal);
// Set the item location
if (_TabStripItem.IsVertical == true)
{
r.Y += size.Height;
r.X += (Bounds.Width - r.Width) / 2;
}
else
{
r.X += size.Width;
r.Y += (Bounds.Height - r.Height) / 2;
}
// Set the Bounds
item.Bounds = r;
// Set the item Size
if (_TabStripItem.IsVertical == true)
{
size.Height += item.HeightInternal + Dpi.Height2;
if (item.WidthInternal > size.Width)
size.Width = item.WidthInternal;
}
else
{
size.Width += item.WidthInternal + Dpi.Width2;
if (item.HeightInternal > size.Height)
size.Height = item.HeightInternal;
}
// Set its display status
if (DesignMode == false)
item.Displayed = true;
}
return (size);
}
#endregion
#region MyRefresh
/// <summary>
/// Refresh code
/// </summary>
private void MyRefresh()
{
if (TabDisplay != null)
{
SuperTabStripItem tsi = TabDisplay.TabStripItem;
if (tsi != null)
{
tsi.NeedRecalcSize = true;
tsi.Refresh();
}
}
}
#endregion
#region Paint
/// <summary>
/// Paint processing
/// </summary>
/// <param name="p"></param>
public override void Paint(ItemPaintArgs p)
{
foreach (BaseItem item in SubItems)
{
if (item.Visible == true)
item.Paint(p);
}
}
#endregion
#region Mouse support
#region InternalMouseEnter
/// <summary>
/// InternalMouseEnter
/// </summary>
public override void InternalMouseEnter()
{
base.InternalMouseEnter();
_IsMouseOver = true;
}
#endregion
#region InternalMouseLeave
/// <summary>
/// InternalMouseLeave
/// </summary>
public override void InternalMouseLeave()
{
base.InternalMouseLeave();
_IsMouseOver = false;
if (_HotItem != null)
{
_HotItem.InternalMouseLeave();
_HotItem = null;
}
}
#endregion
#region InternalMouseMove
/// <summary>
/// InternalMouseMove
/// </summary>
/// <param name="objArg"></param>
public override void InternalMouseMove(MouseEventArgs objArg)
{
base.InternalMouseMove(objArg);
_HotItem = GetBoxItemFromPoint(objArg.Location);
}
#endregion
#region InternalMouseDown
/// <summary>
/// InternalMouseDown
/// </summary>
/// <param name="objArg"></param>
public override void InternalMouseDown(MouseEventArgs objArg)
{
base.InternalMouseDown(objArg);
_IsMouseDown = true;
_MouseDownItem = _HotItem;
}
#endregion
#region InternalMouseUp
/// <summary>
/// InternalMouseUp
/// </summary>
/// <param name="objArg"></param>
public override void InternalMouseUp(MouseEventArgs objArg)
{
base.InternalMouseUp(objArg);
_IsMouseDown = false;
if (_MouseDownItem != null)
{
if (_MouseDownItem != _HotItem)
_MouseDownItem.InternalMouseUp(objArg);
_MouseDownItem = null;
}
}
#endregion
#endregion
#region GetBoxItemFromPoint
/// <summary>
/// Gets the ControlBoxItem from the given Point
/// </summary>
/// <param name="pt"></param>
/// <returns></returns>
private BaseItem GetBoxItemFromPoint(Point pt)
{
foreach (BaseItem item in SubItems)
{
if (item.Visible == true)
{
if (item.Bounds.Contains(pt))
return (item);
}
}
return (null);
}
#endregion
#region OnItemAdded
/// <summary>
/// OnItemAdded
/// </summary>
/// <param name="item"></param>
protected internal override void OnItemAdded(BaseItem item)
{
base.OnItemAdded(item);
MyRefresh();
}
#endregion
#region OnAfterItemRemoved
/// <summary>
/// OnAfterItemRemoved
/// </summary>
/// <param name="item"></param>
protected internal override void OnAfterItemRemoved(BaseItem item, int itemIndex)
{
base.OnAfterItemRemoved(item, itemIndex);
MyRefresh();
}
#endregion
#region RemoveUserItems
/// <summary>
/// Removes all user added items from the ControlBox
/// </summary>
public void RemoveUserItems()
{
for (int i = SubItems.Count - 1; i >= 0; i--)
{
if (SubItems[i] != _MenuBox && SubItems[i] != _CloseBox)
SubItems._RemoveAt(i);
}
MyRefresh();
}
#endregion
#region Copy object support
/// <summary>
/// Returns copy of the item.
/// </summary>
public override BaseItem Copy()
{
SuperTabControlBox objCopy = new SuperTabControlBox(_TabStripItem);
CopyToItem(objCopy);
return (objCopy);
}
protected override void CopyToItem(BaseItem copy)
{
SuperTabControlBox objCopy = copy as SuperTabControlBox;
base.CopyToItem(objCopy);
}
#endregion
}
}
#endif