SourceCode/PROMS/DotNetBar Source Code/Ribbon/CaptionItemContainer.cs

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
}
}