diff options
Diffstat (limited to 'source/ShiftUI/ToolStrip/ToolStripOverflow.cs')
| -rw-r--r-- | source/ShiftUI/ToolStrip/ToolStripOverflow.cs | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/source/ShiftUI/ToolStrip/ToolStripOverflow.cs b/source/ShiftUI/ToolStrip/ToolStripOverflow.cs new file mode 100644 index 0000000..3e8fd92 --- /dev/null +++ b/source/ShiftUI/ToolStrip/ToolStripOverflow.cs @@ -0,0 +1,151 @@ +// +// ToolStripOverflow.cs +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +// Copyright (c) 2007 Novell +// +// Authors: +// Jonathan Pobst ([email protected]) +// + +using System; +using System.Runtime.InteropServices; +using System.ComponentModel; +using System.Drawing; +using ShiftUI.Layout; + +namespace ShiftUI +{ + [ComVisible (true)] + [ClassInterface (ClassInterfaceType.AutoDispatch)] + public class ToolStripOverflow : ToolStripDropDown, IComponent, IDisposable + { + private LayoutEngine layout_engine; + + #region Public Constructors + public ToolStripOverflow (ToolStripItem parentItem) + { + this.OwnerItem = parentItem; + } + #endregion + + #region Public Properties + // XXX - This probably adds ToolStripOverflowButton to the returned collection + public override ToolStripItemCollection Items { + get { return base.Items; } + } + + public override LayoutEngine LayoutEngine { + get { + if (this.layout_engine == null) + this.layout_engine = new FlowLayout (); + + return base.LayoutEngine; + } + } + #endregion + + #region Protected Properties + protected internal override ToolStripItemCollection DisplayedItems { + get { return base.DisplayedItems; } + } + #endregion + + #region Public Methods + public override Size GetPreferredSize (Size constrainingSize) + { + return base.GetToolStripPreferredSize (constrainingSize); + } + #endregion + + #region Protected Methods + protected override AccessibleObject CreateAccessibilityInstance () + { + return new ToolStripOverflowAccessibleObject (); + } + + [MonoInternalNote ("This should stack in rows of ~3, but for now 1 column will work.")] + protected override void OnLayout (LayoutEventArgs e) + { + SetDisplayedItems (); + + // Find the widest menu item + int widest = 0; + + foreach (ToolStripItem tsi in this.DisplayedItems) { + if (!tsi.Available) + continue; + if (tsi.GetPreferredSize (Size.Empty).Width > widest) + widest = tsi.GetPreferredSize (Size.Empty).Width; + } + + int x = this.Padding.Left; + widest += this.Padding.Horizontal; + int y = this.Padding.Top; + + foreach (ToolStripItem tsi in this.DisplayedItems) { + if (!tsi.Available) + continue; + + y += tsi.Margin.Top; + + int height = 0; + + if (tsi is ToolStripSeparator) + height = 7; + else + height = tsi.GetPreferredSize (Size.Empty).Height; + + tsi.SetBounds (new Rectangle (x, y, widest, height)); + y += tsi.Height + tsi.Margin.Bottom; + } + + this.Size = new Size (widest + this.Padding.Horizontal, y + this.Padding.Bottom);// + 2); + } + + protected override void SetDisplayedItems () + { + this.displayed_items.ClearInternal (); + + if (this.OwnerItem != null && this.OwnerItem.Parent != null) + foreach (ToolStripItem tsi in this.OwnerItem.Parent.Items) + if (tsi.Placement == ToolStripItemPlacement.Overflow && tsi.Available && !(tsi is ToolStripSeparator)) { + this.displayed_items.AddNoOwnerOrLayout (tsi); + //tsi.Parent = this; + } + + this.PerformLayout (); + } + #endregion + + #region Internal Methods + internal ToolStrip ParentToolStrip { + get { return (ToolStrip)this.OwnerItem.Parent; } + } + #endregion + + #region ToolStripOverflowAccessibleObject Class + private class ToolStripOverflowAccessibleObject : AccessibleObject + { + } + #endregion + } +} |
