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; }
72 if (this.show_check_margin
!= value) {
73 this.show_check_margin
= value;
74 PerformLayout (this, "ShowCheckMargin");
80 public bool ShowImageMargin
{
81 get { return this.show_image_margin; }
83 if (this.show_image_margin
!= value) {
84 this.show_image_margin
= value;
85 PerformLayout (this, "ShowImageMargin");
91 #region Protected Properties
92 protected override Padding DefaultPadding
{
93 get { return base.DefaultPadding; }
96 protected internal override Size MaxItemSize
{
101 #region Protected Methods
102 protected internal override ToolStripItem
CreateDefaultItem (string text
, Image image
, EventHandler onClick
)
104 return base.CreateDefaultItem (text
, image
, onClick
);
107 protected override void OnFontChanged (EventArgs e
)
109 base.OnFontChanged (e
);
112 protected override void OnLayout (LayoutEventArgs e
)
114 // Find the widest menu item
117 foreach (ToolStripItem tsi
in this.Items
) {
121 tsi
.SetPlacement (ToolStripItemPlacement
.Main
);
123 if (tsi
.GetPreferredSize (Size
.Empty
).Width
> widest
)
124 widest
= tsi
.GetPreferredSize (Size
.Empty
).Width
;
127 int x
= this.Padding
.Left
;
129 if (show_check_margin
|| show_image_margin
)
130 widest
+= 68 - this.Padding
.Horizontal
;
132 widest
+= 47 - this.Padding
.Horizontal
;
134 int y
= this.Padding
.Top
;
136 foreach (ToolStripItem tsi
in this.Items
) {
144 if (tsi
is ToolStripSeparator
)
149 tsi
.SetBounds (new Rectangle (x
, y
, widest
, height
));
150 y
+= tsi
.Height
+ tsi
.Margin
.Bottom
;
153 this.Size
= new Size (widest
+ this.Padding
.Horizontal
, y
+ this.Padding
.Bottom
);// + 2);
154 this.SetDisplayedItems ();
155 this.OnLayoutCompleted (EventArgs
.Empty
);
159 protected override void OnPaintBackground (PaintEventArgs e
)
161 Rectangle affected_bounds
= new Rectangle (Point
.Empty
, this.Size
);
163 ToolStripRenderEventArgs tsrea
= new ToolStripRenderEventArgs (e
.Graphics
, this, affected_bounds
, SystemColors
.Control
);
164 tsrea
.InternalConnectedArea
= CalculateConnectedArea ();
166 this.Renderer
.DrawToolStripBackground (tsrea
);
168 if (this.ShowCheckMargin
|| this.ShowImageMargin
) {
169 tsrea
= new ToolStripRenderEventArgs (e
.Graphics
, this, new Rectangle (tsrea
.AffectedBounds
.Location
, new Size (25, tsrea
.AffectedBounds
.Height
)), SystemColors
.Control
);
170 this.Renderer
.DrawImageMargin (tsrea
);
174 protected override void SetDisplayedItems ()
176 base.SetDisplayedItems ();
180 #region Internal Methods
181 internal override Rectangle
CalculateConnectedArea ()
183 if (this.OwnerItem
!= null && !this.OwnerItem
.IsOnDropDown
&& !(this.OwnerItem
is MdiControlStrip
.SystemMenuItem
)) {
184 Point owner_screen_loc
= OwnerItem
.GetCurrentParent ().PointToScreen (OwnerItem
.Location
);
185 return new Rectangle (owner_screen_loc
.X
- Left
, 0, this.OwnerItem
.Width
- 1, 2);
188 return base.CalculateConnectedArea ();