2 // ToolStripDropDownMenu.cs
4 // Permission is hereby granted, free of charge, to any person obtaining
5 // a copy of this software and associated documentation files (the
6 // "Software"), to deal in the Software without restriction, including
7 // without limitation the rights to use, copy, modify, merge, publish,
8 // distribute, sublicense, and/or sell copies of the Software, and to
9 // permit persons to whom the Software is furnished to do so, subject to
10 // the following conditions:
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 // Copyright (c) 2006 Jonathan Pobst
26 // Jonathan Pobst (monkey@jpobst.com)
30 using System.ComponentModel;
31 using System.Runtime.InteropServices;
32 using System.Windows.Forms.Layout;
34 namespace System.Windows.Forms
37 [ClassInterface (ClassInterfaceType.AutoDispatch)]
38 [Designer ("System.Windows.Forms.Design.ToolStripDropDownDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
39 public class ToolStripDropDownMenu : ToolStripDropDown
41 private ToolStripLayoutStyle layout_style;
42 private bool show_check_margin;
43 private bool show_image_margin;
45 #region Public Constructors
46 public ToolStripDropDownMenu () : base ()
48 this.layout_style = ToolStripLayoutStyle.Flow;
49 this.show_image_margin = true;
53 #region Public Properties
54 public override Rectangle DisplayRectangle {
55 get { return base.DisplayRectangle; }
58 public override LayoutEngine LayoutEngine {
59 get { return base.LayoutEngine; }
62 [DefaultValue (ToolStripLayoutStyle.Flow)]
63 public new ToolStripLayoutStyle LayoutStyle {
64 get { return this.layout_style; }
65 set { this.layout_style = value; }
68 [DefaultValue (false)]
69 public bool ShowCheckMargin {
70 get { return this.show_check_margin; }
71 set { this.show_check_margin = value; }
75 public bool ShowImageMargin {
76 get { return this.show_image_margin; }
77 set { this.show_image_margin = value; }
81 #region Protected Properties
82 protected override Padding DefaultPadding {
83 get { return base.DefaultPadding; }
86 protected internal override Size MaxItemSize {
91 #region Protected Methods
92 protected internal override ToolStripItem CreateDefaultItem (string text, Image image, EventHandler onClick)
94 return base.CreateDefaultItem (text, image, onClick);
97 protected override void OnFontChanged (EventArgs e)
99 base.OnFontChanged (e);
102 protected override void OnLayout (LayoutEventArgs e)
104 // Find the widest menu item
107 foreach (ToolStripItem tsi in this.Items) {
111 tsi.SetPlacement (ToolStripItemPlacement.Main);
113 if (tsi.GetPreferredSize (Size.Empty).Width > widest)
114 widest = tsi.GetPreferredSize (Size.Empty).Width;
117 int x = this.Padding.Left;
119 if (show_check_margin || show_image_margin)
120 widest += 68 - this.Padding.Horizontal;
122 widest += 47 - this.Padding.Horizontal;
124 int y = this.Padding.Top;
126 foreach (ToolStripItem tsi in this.Items) {
134 if (tsi is ToolStripSeparator)
139 tsi.SetBounds (new Rectangle (x, y, widest, height));
140 y += tsi.Height + tsi.Margin.Bottom;
143 this.Size = new Size (widest + this.Padding.Horizontal, y + this.Padding.Bottom);// + 2);
144 this.SetDisplayedItems ();
145 this.OnLayoutCompleted (EventArgs.Empty);
149 protected override void OnPaintBackground (PaintEventArgs e)
151 Rectangle affected_bounds = new Rectangle (Point.Empty, this.Size);
153 ToolStripRenderEventArgs tsrea = new ToolStripRenderEventArgs (e.Graphics, this, affected_bounds, SystemColors.Control);
154 tsrea.InternalConnectedArea = CalculateConnectedArea ();
156 this.Renderer.DrawToolStripBackground (tsrea);
158 if (this.ShowCheckMargin || this.ShowImageMargin) {
159 tsrea = new ToolStripRenderEventArgs (e.Graphics, this, new Rectangle (tsrea.AffectedBounds.Location, new Size (25, tsrea.AffectedBounds.Height)), SystemColors.Control);
160 this.Renderer.DrawImageMargin (tsrea);
164 protected override void SetDisplayedItems ()
166 base.SetDisplayedItems ();
170 #region Internal Methods
171 internal override Rectangle CalculateConnectedArea ()
173 if (this.OwnerItem != null && !this.OwnerItem.IsOnDropDown && !(this.OwnerItem is MdiControlStrip.SystemMenuItem))
174 return new Rectangle (1, 0, this.OwnerItem.Width - 2, 2);
176 return base.CalculateConnectedArea ();