/// <summary>
/// Perform a layout of the elements.
/// </summary>
/// <param name="context">Layout context.</param>
public override void Layout(ViewLayoutContext context)
{
Debug.Assert(context != null);
// Sync to represent the current ribbon QAT buttons
SyncChildren(true);
// We take on all the available display area
ClientRectangle = context.DisplayRectangle;
int x = ClientLocation.X;
int right = ClientRectangle.Right;
// If we need to show the extra button
if (_extraButton != null)
{
// Find size of the extra button
Size childSize = _extraButton.GetPreferredSize(context);
// Make sure there is always enough room for it at the right hand side
right -= childSize.Width;
}
int y = ClientLocation.Y;
int height = ClientHeight;
Overflow = false;
// Are there any children to layout?
if (Count > 0)
{
// Position each item from left to right taking up entire height
for (int i = 0; i < Count; i++)
{
ViewBase child = this[i];
// We only position visible items and we always ignore the extra button
if (child != _extraButton)
{
if (child.Visible)
{
// Cache preferred size of the child
Size childSize = this[i].GetPreferredSize(context);
// Is there enough width for this item to be displayed
if ((childSize.Width + x) <= right)
{
// Define display rectangle for the group
context.DisplayRectangle = new Rectangle(x, y, childSize.Width, height);
// Position the element
this[i].Layout(context);
// Move across to next position
x += childSize.Width;
}
else
{
// Hide the child, not enough for it
child.Visible = false;
// Need to use the extra button as an overflow button
Overflow = true;
}
}
else
{
// Cast child to correct type
ViewDrawRibbonQATButton view = (ViewDrawRibbonQATButton)child;
// If the quick access toolbar button wants to be visible
if (view.QATButton.GetVisible() || Ribbon.InDesignHelperMode)
{
Overflow = true;
}
}
}
}
}
// Do we need to position the extra button?
if (_extraButton != null)
{
// Cache preferred size of the child
Size childSize = _extraButton.GetPreferredSize(context);
// Is there enough width for this item to be displayed
if ((childSize.Width + x) <= ClientRectangle.Right)
{
// Define display rectangle for the group
context.DisplayRectangle = new Rectangle(x, y, childSize.Width, height);
// Position the element
_extraButton.Layout(context);
// Move across to next position
x += childSize.Width;
}
// Should button show as overflow or customization
_extraButton.Overflow = Overflow;
}
// Update our own size to reflect how wide we actually need to be for all the children
ClientRectangle = new Rectangle(ClientLocation, new Size(x - ClientLocation.X, ClientHeight));
// Update the display rectangle we allocated for use by parent
context.DisplayRectangle = new Rectangle(ClientLocation, new Size(x - ClientLocation.X, ClientHeight));
}