using System;
//using System.Drawing;
using Gwen.ControlInternal;
using Gwen.DragDrop;
namespace Gwen.Control
{
///
/// Tab strip - groups TabButtons and allows reordering.
///
public class TabStrip : Base
{
private Base m_TabDragControl;
private bool m_AllowReorder;
///
/// Determines whether it is possible to reorder tabs by mouse dragging.
///
public bool AllowReorder { get { return m_AllowReorder; } set { m_AllowReorder = value; } }
///
/// Determines whether the control should be clipped to its bounds while rendering.
///
protected override bool ShouldClip
{
get { return false; }
}
///
/// Initializes a new instance of the class.
///
/// Parent control.
public TabStrip(Base parent)
: base(parent)
{
m_AllowReorder = false;
}
///
/// Strip position (top/left/right/bottom).
///
public Pos StripPosition
{
get { return Dock; }
set
{
Dock = value;
if (Dock == Pos.Top)
Padding = new Padding(5, 0, 0, 0);
if (Dock == Pos.Left)
Padding = new Padding(0, 5, 0, 0);
if (Dock == Pos.Bottom)
Padding = new Padding(5, 0, 0, 0);
if (Dock == Pos.Right)
Padding = new Padding(0, 5, 0, 0);
}
}
public override bool DragAndDrop_HandleDrop(Package p, int x, int y)
{
Point LocalPos = CanvasPosToLocal(new Point(x, y));
TabButton button = DragAndDrop.SourceControl as TabButton;
TabControl tabControl = Parent as TabControl;
if (tabControl != null && button != null)
{
if (button.TabControl != tabControl)
{
// We've moved tab controls!
tabControl.AddPage(button);
}
}
Base droppedOn = GetControlAt(LocalPos.X, LocalPos.Y);
if (droppedOn != null)
{
Point dropPos = droppedOn.CanvasPosToLocal(new Point(x, y));
DragAndDrop.SourceControl.BringNextToControl(droppedOn, dropPos.X > droppedOn.Width/2);
}
else
{
DragAndDrop.SourceControl.BringToFront();
}
return true;
}
public override bool DragAndDrop_CanAcceptPackage(Package p)
{
if (!m_AllowReorder)
return false;
if (p.Name == "TabButtonMove")
return true;
return false;
}
///
/// Lays out the control's interior according to alignment, padding, dock etc.
///
/// Skin to use.
protected override void Layout(Skin.Base skin)
{
Point largestTab = new Point(5, 5);
int num = 0;
foreach (var child in Children)
{
TabButton button = child as TabButton;
if (null == button) continue;
button.SizeToContents();
Margin m = new Margin();
int notFirst = num > 0 ? -1 : 0;
if (Dock == Pos.Top)
{
m.Left = notFirst;
button.Dock = Pos.Left;
}
if (Dock == Pos.Left)
{
m.Top = notFirst;
button.Dock = Pos.Top;
}
if (Dock == Pos.Right)
{
m.Top = notFirst;
button.Dock = Pos.Top;
}
if (Dock == Pos.Bottom)
{
m.Left = notFirst;
button.Dock = Pos.Left;
}
largestTab.X = Math.Max(largestTab.X, button.Width);
largestTab.Y = Math.Max(largestTab.Y, button.Height);
button.Margin = m;
num++;
}
if (Dock == Pos.Top || Dock == Pos.Bottom)
SetSize(Width, largestTab.Y);
if (Dock == Pos.Left || Dock == Pos.Right)
SetSize(largestTab.X, Height);
base.Layout(skin);
}
public override void DragAndDrop_HoverEnter(Package p, int x, int y)
{
if (m_TabDragControl != null)
{
throw new InvalidOperationException("ERROR! TabStrip::DragAndDrop_HoverEnter");
}
m_TabDragControl = new Highlight(this);
m_TabDragControl.MouseInputEnabled = false;
m_TabDragControl.SetSize(3, Height);
}
public override void DragAndDrop_HoverLeave(Package p)
{
if (m_TabDragControl != null)
{
RemoveChild(m_TabDragControl, false); // [omeg] need to do that explicitely
m_TabDragControl.Dispose();
}
m_TabDragControl = null;
}
public override void DragAndDrop_Hover(Package p, int x, int y)
{
Point localPos = CanvasPosToLocal(new Point(x, y));
Base droppedOn = GetControlAt(localPos.X, localPos.Y);
if (droppedOn != null && droppedOn != this)
{
Point dropPos = droppedOn.CanvasPosToLocal(new Point(x, y));
m_TabDragControl.SetBounds(new Rectangle(0, 0, 3, Height));
m_TabDragControl.BringToFront();
m_TabDragControl.SetPosition(droppedOn.X - 1, 0);
if (dropPos.X > droppedOn.Width/2)
{
m_TabDragControl.MoveBy(droppedOn.Width - 1, 0);
}
m_TabDragControl.Dock = Pos.None;
}
else
{
m_TabDragControl.Dock = Pos.Left;
m_TabDragControl.BringToFront();
}
}
}
}