2009-02-21 Jb Evain <jbevain@novell.com>
[mcs.git] / class / Managed.Windows.Forms / System.Windows.Forms / ToolStripDropDownMenu.cs
blob482763ffc9486a322674677cdc97fb96faf29ea0
1 //
2 // ToolStripDropDownMenu.cs
3 //
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:
11 //
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
14 //
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
25 // Authors:
26 // Jonathan Pobst (monkey@jpobst.com)
28 #if NET_2_0
29 using System.Drawing;
30 using System.ComponentModel;
31 using System.Runtime.InteropServices;
32 using System.Windows.Forms.Layout;
34 namespace System.Windows.Forms
36 [ComVisible (true)]
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;
51 #endregion
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 {
72 if (this.show_check_margin != value) {
73 this.show_check_margin = value;
74 PerformLayout (this, "ShowCheckMargin");
79 [DefaultValue (true)]
80 public bool ShowImageMargin {
81 get { return this.show_image_margin; }
82 set {
83 if (this.show_image_margin != value) {
84 this.show_image_margin = value;
85 PerformLayout (this, "ShowImageMargin");
89 #endregion
91 #region Protected Properties
92 protected override Padding DefaultPadding {
93 get { return base.DefaultPadding; }
96 protected internal override Size MaxItemSize {
97 get { return Size; }
99 #endregion
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
115 int widest = 0;
117 foreach (ToolStripItem tsi in this.Items) {
118 if (!tsi.Available)
119 continue;
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;
131 else
132 widest += 47 - this.Padding.Horizontal;
134 int y = this.Padding.Top;
136 foreach (ToolStripItem tsi in this.Items) {
137 if (!tsi.Available)
138 continue;
140 y += tsi.Margin.Top;
142 int height = 0;
144 if (tsi is ToolStripSeparator)
145 height = 7;
146 else
147 height = 22;
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);
156 this.Invalidate ();
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 ();
178 #endregion
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 ();
190 #endregion
193 #endif