Merge pull request #268 from pcc/menudeactivate
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ToolStrip.cs
index fd6500af68ce3900d8aa4dc977fa125b3e256e7f..30c0d89f5fb40633ee7a05e3dc555e6408b74e67 100644 (file)
@@ -26,7 +26,6 @@
 //     Jonathan Pobst (monkey@jpobst.com)
 //
 
-#if NET_2_0
 using System;
 using System.Runtime.InteropServices;
 using System.ComponentModel;
@@ -79,6 +78,10 @@ namespace System.Windows.Forms
                private ToolStripItem mouse_currently_over;
                internal bool menu_selected;
                private ToolStripItem tooltip_currently_showing;
+               private ToolTip.TipState tooltip_state;
+
+               const int InitialToolTipDelay = 500;
+               const int ToolTipDelay = 5000;
                #endregion
 
                #region Public Constructors
@@ -723,15 +726,22 @@ namespace System.Windows.Forms
                protected override void Dispose (bool disposing)
                {
                        if (!IsDisposed) {
-                               // ToolStripItem.Dispose modifes the collection,
-                               // so we iterate it in reverse order
-                               for (int i = Items.Count - 1; i >= 0; i--)
-                                       Items [i].Dispose ();
-                                       
-                               if (this.overflow_button != null && this.overflow_button.drop_down != null)
-                                       this.overflow_button.drop_down.Dispose ();
 
-                               ToolStripManager.RemoveToolStrip (this);
+                               if(disposing) {
+                                       // Event Handler must be stopped before disposing Items.
+                                       Events.Dispose();
+
+                                       CloseToolTip (null);
+                                       // ToolStripItem.Dispose modifes the collection,
+                                       // so we iterate it in reverse order
+                                       for (int i = Items.Count - 1; i >= 0; i--)
+                                               Items [i].Dispose ();
+
+                                       if (this.overflow_button != null && this.overflow_button.drop_down != null)
+                                               this.overflow_button.drop_down.Dispose ();
+
+                                       ToolStripManager.RemoveToolStrip (this);
+                               }
                                base.Dispose (disposing);
                        }
                }
@@ -884,7 +894,7 @@ namespace System.Windows.Forms
                                if (this is MenuStrip && mouse_currently_over is ToolStripMenuItem && !(mouse_currently_over as ToolStripMenuItem).HasDropDownItems)
                                        return;
                        } else {
-                               this.HideMenus (true, ToolStripDropDownCloseReason.AppClicked);
+                               this.Dismiss (ToolStripDropDownCloseReason.AppClicked);
                        }
                        
                        if (this is MenuStrip)
@@ -1060,6 +1070,9 @@ namespace System.Windows.Forms
 
                protected override void OnVisibleChanged (EventArgs e)
                {
+                       if (!Visible)
+                               CloseToolTip (null);
+
                        base.OnVisibleChanged (e);
                }
 
@@ -1165,7 +1178,7 @@ namespace System.Windows.Forms
 
                protected virtual void SetDisplayedItems ()
                {
-                       this.displayed_items.Clear ();
+                       this.displayed_items.ClearInternal ();
                        
                        foreach (ToolStripItem tsi in this.items)
                                if (tsi.Placement == ToolStripItemPlacement.Main && tsi.Available) {
@@ -1418,25 +1431,28 @@ namespace System.Windows.Forms
                                Point currentLocation = Point.Empty;
                                int tallest = 0;
                                
-                               foreach (ToolStripItem tsi in items) {
-                                       if ((DisplayRectangle.Width - currentLocation.X) < (tsi.Width + tsi.Margin.Horizontal)) {
+                               foreach (ToolStripItem tsi in items)
+                                       if (tsi.Available) {
+                                               Size tsi_preferred = tsi.GetPreferredSize (Size.Empty);
+
+                                               if ((DisplayRectangle.Width - currentLocation.X) < (tsi_preferred.Width + tsi.Margin.Horizontal)) {
 
-                                               currentLocation.Y += tallest;
-                                               tallest = 0;
+                                                       currentLocation.Y += tallest;
+                                                       tallest = 0;
+                                                       
+                                                       currentLocation.X = DisplayRectangle.Left;
+                                               }
+
+                                               // Offset the left margin and set the control to our point
+                                               currentLocation.Offset (tsi.Margin.Left, 0);
+                                               tallest = Math.Max (tallest, tsi_preferred.Height + tsi.Margin.Vertical);
                                                
-                                               currentLocation.X = DisplayRectangle.Left;
+                                               // Update our location pointer
+                                               currentLocation.X += tsi_preferred.Width + tsi.Margin.Right;
                                        }
 
-                                       // Offset the left margin and set the control to our point
-                                       currentLocation.Offset (tsi.Margin.Left, 0);
-                                       tallest = Math.Max (tallest, tsi.Height + tsi.Margin.Vertical);
-                                       
-                                       // Update our location pointer
-                                       currentLocation.X += tsi.Width + tsi.Margin.Right;
-                               }
-
                                currentLocation.Y += tallest;
-                               return new Size (currentLocation.X, currentLocation.Y);
+                               return new Size (currentLocation.X + this.Padding.Horizontal, currentLocation.Y + this.Padding.Vertical);
                        }
                                
                        if (this.orientation == Orientation.Vertical) {
@@ -1487,17 +1503,6 @@ namespace System.Windows.Forms
                        this.GetTopLevelToolStrip ().Dismiss (ToolStripDropDownCloseReason.ItemClicked);
                }
                
-               internal void HideMenus (bool release, ToolStripDropDownCloseReason reason)
-               {
-                       if (this is MenuStrip && release && menu_selected)
-                               (this as MenuStrip).FireMenuDeactivate ();
-                               
-                       if (release)
-                               menu_selected = false;
-                               
-                       NotifySelectedChanged (null);
-               }
-
                internal void NotifySelectedChanged (ToolStripItem tsi)
                {
                        foreach (ToolStripItem tsi2 in this.DisplayedItems)
@@ -1597,24 +1602,32 @@ namespace System.Windows.Forms
                private void MouseEnteredItem (ToolStripItem item)
                {
                        if (this.show_item_tool_tips && !(item is ToolStripTextBox)) {
+                               ToolTipTimer.Interval = InitialToolTipDelay;
+                               tooltip_state = ToolTip.TipState.Initial;
                                tooltip_currently_showing = item;
                                ToolTipTimer.Start ();
                        }
                }
-               
-               private void MouseLeftItem (ToolStripItem item)
+       
+               private void CloseToolTip (ToolStripItem item)
                {
                        ToolTipTimer.Stop ();
                        ToolTipWindow.Hide (this);
                        tooltip_currently_showing = null;
+                       tooltip_state = ToolTip.TipState.Down;
                }
-               
+
+               private void MouseLeftItem (ToolStripItem item)
+               {
+                       CloseToolTip (item);
+               }
+
                private Timer ToolTipTimer {
                        get {
                                if (tooltip_timer == null) {
                                        tooltip_timer = new Timer ();
                                        tooltip_timer.Enabled = false;
-                                       tooltip_timer.Interval = 500;
+                                       tooltip_timer.Interval = InitialToolTipDelay;
                                        tooltip_timer.Tick += new EventHandler (ToolTipTimer_Tick);
                                }
                                
@@ -1631,16 +1644,32 @@ namespace System.Windows.Forms
                        }
                }
                
-               private void ToolTipTimer_Tick (object o, EventArgs args)
+               private void ShowToolTip ()
                {
                        string tooltip = tooltip_currently_showing.GetToolTip ();
                        
-                       if (!string.IsNullOrEmpty (tooltip))
+                       if (!string.IsNullOrEmpty (tooltip)) {
                                ToolTipWindow.Present (this, tooltip);
+                               ToolTipTimer.Interval = ToolTipDelay;
+                               ToolTipTimer.Start ();
+                               tooltip_state = ToolTip.TipState.Show;
+                       }
 
                        tooltip_currently_showing.FireEvent (EventArgs.Empty, ToolStripItemEventType.MouseHover);
+               }
 
+               private void ToolTipTimer_Tick (object o, EventArgs args)
+               {
                        ToolTipTimer.Stop ();
+
+                       switch (tooltip_state) {
+                               case ToolTip.TipState.Initial:
+                                       ShowToolTip ();
+                                       break;
+                               case ToolTip.TipState.Show:
+                                       CloseToolTip (null);
+                                       break;
+                       }
                }
                #endregion
 
@@ -1754,4 +1783,3 @@ namespace System.Windows.Forms
                #endregion
        }
 }
-#endif