From: Jonathan Pobst Date: Thu, 10 May 2007 20:03:53 +0000 (-0000) Subject: 2007-05-10 Jonathan Pobst X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=813cb34f37f9dd34d7acc9a0e53939dba0f5d94d;p=mono.git 2007-05-10 Jonathan Pobst * ToolStrip.cs: Use new internal ToolStripItemCollection constructor. * ToolStripItemCollection.cs: Lots of fixes to when events get called and parent/owner gets changed based on gert's unit tests. 2007-05-10 Jonathan Pobst * ToolStripItemCollectionTest.cs: Enable tests. svn path=/trunk/mcs/; revision=77160 --- diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog index 66f30867fe7..3eb7bb5299a 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog @@ -1,3 +1,9 @@ +2007-05-10 Jonathan Pobst + + * ToolStrip.cs: Use new internal ToolStripItemCollection constructor. + * ToolStripItemCollection.cs: Lots of fixes to when events get called + and parent/owner gets changed based on gert's unit tests. + 2007-05-10 Rolf Bjarne Kvinge * MaskedTextBox.cs: Started implementing parts of it. diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStrip.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStrip.cs index 1e77bfc194d..08089ad6e3d 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStrip.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStrip.cs @@ -92,14 +92,15 @@ namespace System.Windows.Forms SetStyle (ControlStyles.SupportsTransparentBackColor, true); this.SuspendLayout (); - this.items = new ToolStripItemCollection (this, items); + + this.items = new ToolStripItemCollection (this, items, true); this.allow_merge = true; base.AutoSize = true; this.back_color = Control.DefaultBackColor; this.can_overflow = true; base.CausesValidation = false; this.default_drop_down_direction = ToolStripDropDownDirection.BelowRight; - this.displayed_items = new ToolStripItemCollection (this, null); + this.displayed_items = new ToolStripItemCollection (this, null, true); this.Dock = this.DefaultDock; base.Font = new Font ("Tahoma", 8.25f); this.fore_color = Control.DefaultForeColor; @@ -728,7 +729,9 @@ namespace System.Windows.Forms e.Item.Available = true; e.Item.SetPlacement (ToolStripItemPlacement.Main); this.DoAutoSize (); - this.PerformLayout (); + + if (this.Created) + this.PerformLayout (); ToolStripItemEventHandler eh = (ToolStripItemEventHandler)(Events [ItemAddedEvent]); if (eh != null) diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripItemCollection.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripItemCollection.cs index 84d4c777891..f73676ecc2b 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripItemCollection.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ToolStripItemCollection.cs @@ -39,18 +39,34 @@ namespace System.Windows.Forms public class ToolStripItemCollection : ArrangedElementCollection, IList, ICollection, IEnumerable { private ToolStrip owner; - + private bool internal_created; + #region Public Constructor public ToolStripItemCollection (ToolStrip owner, ToolStripItem[] value) : base () { if (owner == null) throw new ArgumentNullException ("owner"); + if (value == null) + throw new ArgumentNullException ("toolStripItems"); + this.owner = owner; + foreach (ToolStripItem tsi in value) + this.AddNoOwnerOrLayout (tsi); + } + + internal ToolStripItemCollection (ToolStrip owner, ToolStripItem[] value, bool internalcreated) : base () + { + if (owner == null) + throw new ArgumentNullException ("owner"); + + this.internal_created = internalcreated; + this.owner = owner; + if (value != null) foreach (ToolStripItem tsi in value) - this.Add (tsi); + this.AddNoOwnerOrLayout (tsi); } #endregion @@ -91,14 +107,15 @@ namespace System.Windows.Forms throw new ArgumentNullException ("value"); value.Owner = owner; - value.Parent = owner; - + if (value is ToolStripMenuItem && (value as ToolStripMenuItem).ShortcutKeys != Keys.None) ToolStripManager.AddToolStripMenuItem ((ToolStripMenuItem)value); int index = base.Add (value); - owner.OnItemAdded (new ToolStripItemEventArgs (value)); + if (this.internal_created) + owner.OnItemAdded (new ToolStripItemEventArgs (value)); + return index; } @@ -211,15 +228,18 @@ namespace System.Windows.Forms if (value == null) throw new ArgumentNullException ("value"); - value.Owner = owner; - value.Parent = owner; - if (value is ToolStripMenuItem && (value as ToolStripMenuItem).ShortcutKeys != Keys.None) ToolStripManager.AddToolStripMenuItem ((ToolStripMenuItem)value); base.Insert (index, value); - owner.OnItemAdded (new ToolStripItemEventArgs (value)); - owner.PerformLayout (); + + if (internal_created) { + value.Owner = owner; + owner.OnItemAdded (new ToolStripItemEventArgs (value)); + } + + if (owner.Created) + owner.PerformLayout (); } public void Remove (ToolStripItem value) @@ -228,8 +248,17 @@ namespace System.Windows.Forms throw new NotSupportedException ("This collection is read-only"); base.Remove (value); - owner.OnItemRemoved (new ToolStripItemEventArgs (value)); - owner.PerformLayout (); + + if (value != null && internal_created) { + value.Owner = null; + value.Parent = null; + } + + if (internal_created) + owner.OnItemRemoved (new ToolStripItemEventArgs (value)); + + if (owner.Created) + owner.PerformLayout (); } public new void RemoveAt (int index) @@ -238,9 +267,7 @@ namespace System.Windows.Forms throw new NotSupportedException ("This collection is read-only"); ToolStripItem tsi = (ToolStripItem)base[index]; - base.RemoveAt (index); - owner.OnItemRemoved (new ToolStripItemEventArgs (tsi)); - owner.PerformLayout (); + this.Remove (tsi); } public virtual void RemoveByKey (string key) diff --git a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ChangeLog b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ChangeLog index 229c62d4ca5..e4bd6741a2c 100644 --- a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ChangeLog +++ b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ChangeLog @@ -1,3 +1,7 @@ +2007-05-10 Jonathan Pobst + + * ToolStripItemCollectionTest.cs: Enable tests. + 2007-05-10 Rolf Bjarne Kvinge * MaskedTextBoxTest.cs: Added more tests. diff --git a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ToolStripItemCollectionTest.cs b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ToolStripItemCollectionTest.cs index 251499dbcfe..c7960d379df 100644 --- a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ToolStripItemCollectionTest.cs +++ b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ToolStripItemCollectionTest.cs @@ -36,7 +36,6 @@ using NUnit.Framework; namespace MonoTests.System.Windows.Forms { [TestFixture] - [Category ("NotWorking")] public class ToolStripItemCollectionTests { private List itemsAdded; @@ -101,6 +100,13 @@ namespace MonoTests.System.Windows.Forms } } + [Test] + [ExpectedException (typeof (ArgumentNullException))] + public void ConstructorANE () + { + new ToolStripItemCollection (new ToolStrip (), (ToolStripItem[])null); + } + [Test] public void Constructor_Items_Null () { @@ -149,6 +155,41 @@ namespace MonoTests.System.Windows.Forms Assert.IsNull (buttonC.ParentToolStrip, "#C7"); } + [Test] + public void Insert_Owned_CreateControl () + { + ToolStrip toolStrip = CreateToolStrip (); + toolStrip.CreateControl (); + ToolStripItemCollection items = toolStrip.Items; + + MockToolStripButton buttonA = new MockToolStripButton ("A"); + items.Insert (0, buttonA); + Assert.AreEqual (1, items.Count, "#A1"); + Assert.AreEqual (1, itemsAdded.Count, "#A2"); + Assert.AreSame (buttonA, items[0], "#A3"); + Assert.AreSame (toolStrip, buttonA.Owner, "#A4"); + Assert.IsNotNull (buttonA.ParentToolStrip, "#A5"); + + MockToolStripButton buttonB = new MockToolStripButton ("B"); + items.Insert (0, buttonB); + Assert.AreEqual (2, items.Count, "#B1"); + Assert.AreEqual (2, itemsAdded.Count, "#B2"); + Assert.AreSame (buttonB, items[0], "#B3"); + Assert.AreSame (buttonA, items[1], "#B4"); + Assert.AreSame (toolStrip, buttonB.Owner, "#B5"); + Assert.IsNotNull (buttonB.ParentToolStrip, "#B6"); + + MockToolStripButton buttonC = new MockToolStripButton ("C"); + items.Insert (1, buttonC); + Assert.AreEqual (3, items.Count, "#C1"); + Assert.AreEqual (3, itemsAdded.Count, "#C2"); + Assert.AreSame (buttonB, items[0], "#C3"); + Assert.AreSame (buttonC, items[1], "#C4"); + Assert.AreSame (buttonA, items[2], "#C5"); + Assert.AreSame (toolStrip, buttonC.Owner, "#C6"); + Assert.IsNotNull (buttonC.ParentToolStrip, "#C7"); + } + [Test] public void Insert_StandAlone () {