Properly dispose ToolStrip objects and child objects
authorDaniel Knittl-Frank <knittl89+git@googlemail.com>
Wed, 23 May 2012 14:16:01 +0000 (16:16 +0200)
committerDaniel Knittl-Frank <knittl89+git@googlemail.com>
Tue, 14 Aug 2012 07:32:41 +0000 (09:32 +0200)
Check if `dispose' is actually set, and only then call Dispose on
children. This patch was written with the help of alan from #monodev
IRC.

Signed-off-by: Daniel Knittl-Frank <knittl89+git@googlemail.com>
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStrip.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripDropDownItem.cs

index 350fa056b8103e264b7cc6a468b8facf9848468b..45f3ff801f15b4ca883f8ecda72e2c961100258f 100644 (file)
@@ -727,19 +727,21 @@ namespace System.Windows.Forms
                {
                        if (!IsDisposed) {
 
-                               // Event Handler must be stopped before disposing Items.
-                               Events.Dispose();
+                               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 ();
+                                       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 ();
 
-                               ToolStripManager.RemoveToolStrip (this);
+                                       if (this.overflow_button != null && this.overflow_button.drop_down != null)
+                                               this.overflow_button.drop_down.Dispose ();
+
+                                       ToolStripManager.RemoveToolStrip (this);
+                               }
                                base.Dispose (disposing);
                        }
                }
index d7ad8e902530039059fe6c4fb909501884603dde..4b429c9daec234614503fac2a2ea599bd8f1ff23 100644 (file)
@@ -173,14 +173,15 @@ namespace System.Windows.Forms
                protected override void Dispose (bool disposing)
                {
                        if (!IsDisposed) {
-                               if (this.HasDropDownItems)
-                                       foreach (ToolStripItem tsi in this.DropDownItems)
-                                               if (tsi is ToolStripMenuItem)
-                                                       ToolStripManager.RemoveToolStripMenuItem ((ToolStripMenuItem)tsi);
-                                       
-                               if (drop_down != null)
-                                       ToolStripManager.RemoveToolStrip (drop_down);
-                               
+                               if(disposing) {
+                                       if (this.HasDropDownItems)
+                                               foreach (ToolStripItem tsi in this.DropDownItems)
+                                                       if (tsi is ToolStripMenuItem)
+                                                               ToolStripManager.RemoveToolStripMenuItem ((ToolStripMenuItem)tsi);
+
+                                       if (drop_down != null)
+                                               ToolStripManager.RemoveToolStrip (drop_down);
+                               }
                                base.Dispose (disposing);
                        }
                }