* TabControl.cs: Show the tooltip depending on the value
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ToolStripOverflow.cs
1 //
2 // ToolStripOverflow.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.
22 //
23 // Copyright (c) 2007 Novell
24 //
25 // Authors:
26 //      Jonathan Pobst (monkey@jpobst.com)
27 //
28
29 #if NET_2_0
30 using System;
31 using System.Runtime.InteropServices;
32 using System.ComponentModel;
33 using System.Drawing;
34 using System.Windows.Forms.Layout;
35
36 namespace System.Windows.Forms
37 {
38         [ComVisible (true)]
39         [ClassInterface (ClassInterfaceType.AutoDispatch)]
40         public class ToolStripOverflow : ToolStripDropDown, IComponent, IDisposable
41         {
42                 private LayoutEngine layout_engine;
43                 
44                 #region Public Constructors
45                 public ToolStripOverflow (ToolStripItem parentItem)
46                 {
47                         this.OwnerItem = parentItem;
48                 }
49                 #endregion
50                 
51                 #region Public Properties
52                 // XXX - This probably adds ToolStripOverflowButton to the returned collection
53                 public override ToolStripItemCollection Items {
54                         get { return base.Items; }
55                 }
56                 
57                 public override LayoutEngine LayoutEngine {
58                         get {
59                                 if (this.layout_engine == null)
60                                         this.layout_engine = new FlowLayout ();
61                                         
62                                 return base.LayoutEngine;
63                         }
64                 }
65                 #endregion
66
67                 #region Protected Properties
68                 protected internal override ToolStripItemCollection DisplayedItems {
69                         get { return base.DisplayedItems; }
70                 }
71                 #endregion
72
73                 #region Public Methods
74                 public override Size GetPreferredSize (Size constrainingSize)
75                 {
76                         return base.GetToolStripPreferredSize (constrainingSize);
77                 }
78                 #endregion
79
80                 #region Protected Methods
81                 protected override AccessibleObject CreateAccessibilityInstance ()
82                 {
83                         return new ToolStripOverflowAccessibleObject ();
84                 }
85                 
86                 [MonoInternalNote ("This should stack in rows of ~3, but for now 1 column will work.")]
87                 protected override void OnLayout (LayoutEventArgs e)
88                 {
89                         SetDisplayedItems ();
90                         
91                         // Find the widest menu item
92                         int widest = 0;
93
94                         foreach (ToolStripItem tsi in this.DisplayedItems) {
95                                 if (!tsi.Available)
96                                         continue;
97                                 if (tsi.GetPreferredSize (Size.Empty).Width > widest)
98                                         widest = tsi.GetPreferredSize (Size.Empty).Width;
99                         }
100
101                         int x = this.Padding.Left;
102                         widest += this.Padding.Horizontal;
103                         int y = this.Padding.Top;
104
105                         foreach (ToolStripItem tsi in this.DisplayedItems) {
106                                 if (!tsi.Available)
107                                         continue;
108
109                                 y += tsi.Margin.Top;
110
111                                 int height = 0;
112
113                                 if (tsi is ToolStripSeparator)
114                                         height = 7;
115                                 else
116                                         height = tsi.GetPreferredSize (Size.Empty).Height;
117
118                                 tsi.SetBounds (new Rectangle (x, y, widest, height));
119                                 y += tsi.Height + tsi.Margin.Bottom;
120                         }
121
122                         this.Size = new Size (widest + this.Padding.Horizontal, y + this.Padding.Bottom);// + 2);
123                 }
124
125                 protected override void SetDisplayedItems ()
126                 {
127                         this.displayed_items.ClearInternal ();
128
129                         if (this.OwnerItem != null && this.OwnerItem.Parent != null)
130                                 foreach (ToolStripItem tsi in this.OwnerItem.Parent.Items)
131                                         if (tsi.Placement == ToolStripItemPlacement.Overflow && tsi.Available && !(tsi is ToolStripSeparator)) {
132                                                 this.displayed_items.AddNoOwnerOrLayout (tsi);
133                                                 //tsi.Parent = this;
134                                         }
135
136                         this.PerformLayout ();
137                 }
138                 #endregion
139
140                 #region Internal Methods
141                 internal ToolStrip ParentToolStrip {
142                         get { return (ToolStrip)this.OwnerItem.Parent; }
143                 }
144                 #endregion
145
146                 #region ToolStripOverflowAccessibleObject Class
147                 private class ToolStripOverflowAccessibleObject : AccessibleObject
148                 {
149                 }
150                 #endregion
151         }
152 }
153 #endif