268 lines
9.5 KiB
C#
268 lines
9.5 KiB
C#
using System;
|
|
using System.Text;
|
|
using System.Drawing;
|
|
|
|
namespace DevComponents.DotNetBar
|
|
{
|
|
/// <summary>
|
|
/// Defines container for ribbon caption layout and quick access toolbar customization and overflow.
|
|
/// </summary>
|
|
internal class CaptionItemContainer : GenericItemContainer
|
|
{
|
|
#region Private Variables
|
|
private int m_MinTitleSize = 40;
|
|
private int m_MoreItemsLeft = 0;
|
|
private CustomizeItem m_CustomizeItem = null;
|
|
private int m_MaxItemHeight = 0;
|
|
#endregion
|
|
|
|
#region Constructor
|
|
public CaptionItemContainer():base()
|
|
{
|
|
this.FirstItemSpacing = 3;
|
|
this.ToolbarItemsAlign = eContainerVerticalAlignment.Top;
|
|
}
|
|
#endregion
|
|
|
|
#region Layout
|
|
public override void RecalcSize()
|
|
{
|
|
if (m_MoreItems != null && m_MoreItems.Expanded)
|
|
m_MoreItems.Expanded = false;
|
|
|
|
m_RecalculatingSize = true;
|
|
int width = m_MinTitleSize;
|
|
if (this.ContainerControl is Ribbon.QatToolbar)
|
|
width = 0;
|
|
int count = this.SubItems.Count;
|
|
int firstFarIndex = -1;
|
|
int maxHeight = 0;
|
|
int maxItemHeight = 0;
|
|
int moreItemsHeight = Dpi.Height22;
|
|
bool hasQatCustomizeItem = false;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
BaseItem item = this.SubItems[i];
|
|
if (!item.Visible)
|
|
continue;
|
|
item.RecalcSize();
|
|
item.Displayed = true;
|
|
width += (item.WidthInternal + (i==0?this.FirstItemSpacing:m_ItemSpacing));
|
|
|
|
if (item.ItemAlignment == eItemAlignment.Far && firstFarIndex == -1)
|
|
firstFarIndex = i;
|
|
if (firstFarIndex == -1)
|
|
moreItemsHeight = item.HeightInternal;
|
|
|
|
if (item.HeightInternal > maxHeight)
|
|
maxHeight = item.HeightInternal;
|
|
if (item.HeightInternal > maxItemHeight && !(item is ApplicationButton || item is SystemCaptionItem))
|
|
maxItemHeight = item.HeightInternal;
|
|
|
|
if (item is QatCustomizeItem || item is QatOverflowItem)
|
|
hasQatCustomizeItem = true;
|
|
}
|
|
|
|
if (hasQatCustomizeItem)
|
|
width += maxHeight / 2;
|
|
|
|
m_MaxItemHeight = maxItemHeight;
|
|
if (width < this.WidthInternal)
|
|
{
|
|
m_RecalculatingSize = false;
|
|
base.RecalcSize();
|
|
return;
|
|
}
|
|
if (firstFarIndex == -1)
|
|
firstFarIndex = this.SubItems.Count;
|
|
for (int i = firstFarIndex - 1; i >= 0; i--)
|
|
{
|
|
BaseItem item = this.SubItems[i];
|
|
if (!item.Visible)
|
|
continue;
|
|
width -= item.WidthInternal;
|
|
item.Displayed = false;
|
|
if (width + DisplayMoreItem.FixedSize + maxHeight/2 < this.WidthInternal)
|
|
break;
|
|
}
|
|
|
|
int x = this.LeftInternal + m_PaddingLeft;
|
|
int y = this.TopInternal + m_PaddingTop;
|
|
int loopTo = count;
|
|
if (firstFarIndex >= 0)
|
|
loopTo = firstFarIndex - 1;
|
|
bool oneNearVisible = false;
|
|
for (int i = 0; i < loopTo; i++)
|
|
{
|
|
BaseItem item = this.SubItems[i];
|
|
if (!item.Visible || !item.Displayed)
|
|
continue;
|
|
oneNearVisible = true;
|
|
Rectangle rb = new Rectangle(x, y, item.WidthInternal, item.HeightInternal);
|
|
if (!(item is ApplicationButton || item is SystemCaptionItem))
|
|
rb.Y += (maxItemHeight - item.HeightInternal) / 2;
|
|
item.Bounds = rb;
|
|
x += (item.WidthInternal + (i == 0 ? this.FirstItemSpacing : m_ItemSpacing));
|
|
}
|
|
m_MoreItemsLeft = x + maxHeight/2;
|
|
|
|
if (firstFarIndex >= 0)
|
|
{
|
|
x = this.DisplayRectangle.Right - m_PaddingRight;
|
|
for (int i = count - 1; i >= firstFarIndex; i--)
|
|
{
|
|
BaseItem item = this.SubItems[i];
|
|
if (!item.Visible || !item.Displayed)
|
|
continue;
|
|
x -= item.WidthInternal;
|
|
item.Bounds = new Rectangle(x, y, item.WidthInternal, item.HeightInternal);
|
|
x -= m_ItemSpacing;
|
|
}
|
|
}
|
|
|
|
m_Rect.Height = maxHeight + m_PaddingTop + m_PaddingBottom;
|
|
if (oneNearVisible)
|
|
{
|
|
// Add Display More item...
|
|
CreateMoreItemsButton(this.IsRightToLeft);
|
|
|
|
m_MoreItems.HeightInternal = moreItemsHeight;
|
|
m_MoreItems.RecalcSize();
|
|
}
|
|
else if(m_MoreItems!=null)
|
|
{
|
|
// Clean up, we don't need this anymore
|
|
m_MoreItems.Dispose();
|
|
m_MoreItems = null;
|
|
}
|
|
|
|
m_NeedRecalcSize = false;
|
|
m_RecalculatingSize = false;
|
|
}
|
|
|
|
protected override int GetItemLayoutWidth(BaseItem objItem)
|
|
{
|
|
if (objItem is QatCustomizeItem || objItem is QatOverflowItem)
|
|
return objItem.WidthInternal + this.HeightInternal / 2;
|
|
return base.GetItemLayoutWidth(objItem);
|
|
}
|
|
|
|
protected override int GetItemLayoutX(BaseItem objItem, int iX)
|
|
{
|
|
if (objItem is QatCustomizeItem || objItem is QatOverflowItem)
|
|
return iX + this.HeightInternal / 2;
|
|
return base.GetItemLayoutX(objItem, iX);
|
|
}
|
|
|
|
protected override int GetItemLayoutY(BaseItem objItem, int iY)
|
|
{
|
|
if (!(objItem is ApplicationButton || objItem is SystemCaptionItem || objItem is DevComponents.DotNetBar.Metro.MetroAppButton))
|
|
return iY + (m_MaxItemHeight - objItem.HeightInternal) / 2;
|
|
return base.GetItemLayoutY(objItem, iY);
|
|
}
|
|
|
|
internal int MaxItemHeight
|
|
{
|
|
get
|
|
{
|
|
return m_MaxItemHeight;
|
|
}
|
|
}
|
|
|
|
protected override Point GetMoreItemsLocation(bool isRightToLeft)
|
|
{
|
|
if (m_MoreItems == null)
|
|
return Point.Empty;
|
|
Point p = Point.Empty;
|
|
if (m_Orientation == eOrientation.Vertical)
|
|
{
|
|
p.X = m_Rect.Left + m_PaddingLeft;
|
|
p.Y = m_MoreItemsLeft;
|
|
}
|
|
else
|
|
{
|
|
if (isRightToLeft)
|
|
p.X = m_Rect.X + m_PaddingLeft;
|
|
else
|
|
p.X = m_MoreItemsLeft;
|
|
p.Y = m_Rect.Top + m_PaddingTop;
|
|
}
|
|
|
|
return p;
|
|
}
|
|
|
|
protected override void CreateMoreItemsButton(bool isRightToLeft)
|
|
{
|
|
if (m_MoreItems == null)
|
|
{
|
|
m_MoreItems = new QatOverflowItem();
|
|
m_MoreItems.Style = m_Style;
|
|
m_MoreItems.SetParent(this);
|
|
m_MoreItems.ThemeAware = this.ThemeAware;
|
|
}
|
|
if (this.MoreItemsOnMenu)
|
|
m_MoreItems.PopupType = ePopupType.Menu;
|
|
else
|
|
m_MoreItems.PopupType = ePopupType.ToolBar;
|
|
m_MoreItems.Orientation = m_Orientation;
|
|
m_MoreItems.Displayed = true;
|
|
|
|
if (m_Orientation == eOrientation.Vertical)
|
|
{
|
|
m_MoreItems.WidthInternal = m_Rect.Width - (m_PaddingLeft + m_PaddingRight);
|
|
m_MoreItems.RecalcSize();
|
|
}
|
|
else
|
|
{
|
|
m_MoreItems.HeightInternal = m_Rect.Height - (m_PaddingTop + m_PaddingBottom);
|
|
m_MoreItems.RecalcSize();
|
|
}
|
|
|
|
Point loc = GetMoreItemsLocation(isRightToLeft);
|
|
m_MoreItems.LeftInternal = loc.X;
|
|
m_MoreItems.TopInternal = loc.Y;
|
|
}
|
|
#endregion
|
|
|
|
#region Internal Implementation
|
|
protected internal override void OnItemAdded(BaseItem objItem)
|
|
{
|
|
base.OnItemAdded(objItem);
|
|
|
|
BaseItem item = objItem;
|
|
if (item is CustomizeItem)
|
|
m_CustomizeItem = (CustomizeItem)item;
|
|
else if (m_CustomizeItem != null)
|
|
{
|
|
bool added = false;
|
|
if(this.SubItems.Contains(m_CustomizeItem))
|
|
this.SubItems._Remove(m_CustomizeItem);
|
|
for (int i = this.SubItems.Count - 1; i > 0; i--)
|
|
{
|
|
if (this.SubItems[i].ItemAlignment == eItemAlignment.Near && !(this.SubItems[i] is SystemCaptionItem))
|
|
{
|
|
this.SubItems._Add(m_CustomizeItem, i+1);
|
|
added = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!added)
|
|
{
|
|
if (this.SubItems.Count > 0 && this.SubItems[this.SubItems.Count - 1] is SystemCaptionItem)
|
|
this.SubItems._Add(m_CustomizeItem, this.SubItems.Count - 2);
|
|
else
|
|
this.SubItems._Add(m_CustomizeItem);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected internal override void OnAfterItemRemoved(BaseItem objItem, int itemIndex)
|
|
{
|
|
if (objItem == m_CustomizeItem)
|
|
m_CustomizeItem = null;
|
|
base.OnAfterItemRemoved(objItem, itemIndex);
|
|
}
|
|
#endregion
|
|
}
|
|
}
|