using System; using System.Text; using System.Drawing; namespace DevComponents.DotNetBar { /// /// Defines container for ribbon caption layout and quick access toolbar customization and overflow. /// 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 } }