Просмотр исходного кода

* ListViewCollectionsTest.cs: Added and improved tests for removing
columns and items, and clearing the collections.
* ListViewTest.cs: Improved ClearTest to also verify whether removed
columns and items are unlinked from owning ListView.
* ListView.cs: Initialize LabelEditEventArgs after setting Text of
edit box since otherwise the Label would immediately be set (even if
the user did not modify the label). In OnKeyDown set Handled to true
if Return or Escape was pressed. In ColumnHeaderCollection unlink
columns that are to be removed. In ListViewItemCollection unlink items
that are to be removed.

svn path=/trunk/mcs/; revision=73449

Gert Driesen 19 лет назад
Родитель
Сommit
30a3087667

+ 9 - 0
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog

@@ -1,3 +1,12 @@
+2007-02-26  Gert Driesen  <[email protected]>
+
+	* ListView.cs: Initialize LabelEditEventArgs after setting Text of
+	edit box since otherwise the Label would immediately be set (even if
+	the user did not modify the label). In OnKeyDown set Handled to true
+	if Return or Escape was pressed. In ColumnHeaderCollection unlink
+	columns that are to be removed. In ListViewItemCollection unlink items
+	that are to be removed.
+
 2007-02-24  Jonathan Pobst  <[email protected]>
 
 	* TextRenderer.cs: If we set a GDI clip region, we need to clear

+ 14 - 6
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListView.cs

@@ -1941,8 +1941,6 @@ namespace System.Windows.Forms
 				}
 
 				edit_item = item;
-				edit_args = new LabelEditEventArgs (owner.Items.IndexOf (edit_item));
-				owner.OnBeforeLabelEdit (edit_args);
 
 				edit_text_box.Text = item.Text;
 				edit_text_box.Font = item.Font;
@@ -1950,6 +1948,9 @@ namespace System.Windows.Forms
 				edit_text_box.Focus ();
 				edit_text_box.SelectAll ();
 
+				edit_args = new LabelEditEventArgs (owner.Items.IndexOf (edit_item));
+				owner.OnBeforeLabelEdit (edit_args);
+
 				if (edit_args.CancelEdit)
 					EndEdit (item);
 			}
@@ -2112,10 +2113,12 @@ namespace System.Windows.Forms
 				switch (e.KeyCode) {
 				case Keys.Return:
 					Visible = false;
+					e.Handled = true;
 					OnEditingFinished (e);
 					break;
 				case Keys.Escape:
 					Visible = false;
+					e.Handled = true;
 					OnEditingCancelled (e);
 					break;
 				}
@@ -3307,6 +3310,8 @@ namespace System.Windows.Forms
 
 			public virtual void Clear ()
 			{
+				foreach (ColumnHeader col in list)
+					col.SetListView (null);
 				list.Clear ();
 				owner.Redraw (true);
 			}
@@ -3461,6 +3466,7 @@ namespace System.Windows.Forms
 			{
 				// TODO: Update Column internal index ?
 				list.Remove (column);
+				column.SetListView (null);
 				owner.Redraw (true);
 			}
 
@@ -3478,9 +3484,8 @@ namespace System.Windows.Forms
 				if (index < 0 || index >= list.Count)
 					throw new ArgumentOutOfRangeException ("index");
 
-				// TODO: Update Column internal index ?
-				list.RemoveAt (index);
-				owner.Redraw (true);
+				ColumnHeader col = (ColumnHeader) list [index];
+				Remove (col);
 			}
 			#endregion	// Public Methods
 			
@@ -3653,8 +3658,10 @@ namespace System.Windows.Forms
 			{
 				owner.SetFocusedItem (null);
 				owner.h_scroll.Value = owner.v_scroll.Value = 0;
-				foreach (ListViewItem item in list)
+				foreach (ListViewItem item in list) {
 					owner.item_control.CancelEdit (item);
+					item.Owner = null;
+				}
 				list.Clear ();
 				OnChange ();
 				owner.Redraw (true);
@@ -3817,6 +3824,7 @@ namespace System.Windows.Forms
 				list.Remove (item);
 				OnChange ();
 				owner.item_control.CancelEdit (item);
+				item.Owner = null;
 				owner.Redraw (true);
 				if (selection_changed)
 					owner.OnSelectedIndexChanged (EventArgs.Empty);

+ 7 - 0
mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ChangeLog

@@ -1,3 +1,10 @@
+2007-02-26  Gert Driesen  <[email protected]>
+
+	* ListViewCollectionsTest.cs: Added and improved tests for removing
+	columns and items, and clearing the collections.
+	* ListViewTest.cs: Improved ClearTest to also verify whether removed
+	columns and items are unlinked from owning ListView.
+
 2007-02-23  Raja R Harinath  <[email protected]>
 
 	Fix compilation error

+ 116 - 20
mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ListViewCollectionsTest.cs

@@ -56,33 +56,96 @@ namespace MonoTests.System.Windows.Forms
 		public void ColumnHeaderCollectionTest_AddTest ()
 		{
 			ListView listview = new ListView ();
+			ColumnHeader colA = new ColumnHeader ();
+			ColumnHeader colB = new ColumnHeader ();
 
 			// Duplicated elements with same text added
-			listview.Columns.Add (new ColumnHeader ());
-			listview.Columns.Add (new ColumnHeader ());
-			Assert.AreEqual (2, listview.Columns.Count, "ColumnHeaderCollectionTest_AddTest#1");
-			Assert.AreEqual ("ColumnHeader", listview.Columns[0].Text, "ColumnHeaderCollectionTest_AddTest#2");
+			listview.Columns.Add (colA);
+			listview.Columns.Add (colB);
+			Assert.AreEqual (2, listview.Columns.Count, "#1");
+			Assert.AreEqual ("ColumnHeader", listview.Columns[0].Text, "#2");
+			Assert.AreSame (listview, colA.ListView, "#3");
+			Assert.AreSame (listview, colB.ListView, "#4");
 		}
 
 		[Test]
 		public void ColumnHeaderCollectionTest_ClearTest ()
 		{
 			ListView listview = new ListView ();
-
-			// Duplicated elements with same text added
-			listview.Columns.Add (new ColumnHeader ());
+			ColumnHeader colA = new ColumnHeader ();
+			ColumnHeader colB = new ColumnHeader ();
+			listview.Columns.Add (colA);
+			listview.Columns.Add (colB);
 			listview.Columns.Clear ();
-			Assert.AreEqual (0, listview.Columns.Count, "ColumnHeaderCollectionTest_ClearTest#1");
+			Assert.AreEqual (0, listview.Columns.Count, "#1");
+			Assert.IsNull (colA.ListView, "#2");
+			Assert.IsNull (colB.ListView, "#3");
 		}
 
-		// Exceptions
-		[Test, ExpectedException (typeof (ArgumentOutOfRangeException))]
-		public void ColumnHeaderCollectionTest_GetItem_ExceptionTest ()
+		[Test]
+		public void ColumnHeaderCollectionTest_Remove ()
 		{
-			// Duplicated elements not added
 			ListView listview = new ListView ();
-			ColumnHeader item = listview.Columns[5];
-			Assert.Fail ("#1: " + item.Text); // avoid CS0219 warning
+			ColumnHeader colA = new ColumnHeader ();
+			ColumnHeader colB = new ColumnHeader ();
+			ColumnHeader colC = new ColumnHeader ();
+			listview.Columns.Add (colA);
+			listview.Columns.Add (colB);
+			listview.Columns.Add (colC);
+
+			listview.Columns.Remove (colB);
+			Assert.AreEqual (2, listview.Columns.Count, "#A1");
+			Assert.AreSame (colA, listview.Columns [0], "#A2");
+			Assert.AreSame (colC, listview.Columns [1], "#A3");
+			Assert.AreSame (listview, colA.ListView, "#A4");
+			Assert.IsNull (colB.ListView, "#A5");
+			Assert.AreSame (listview, colC.ListView, "#A6");
+
+			listview.Columns.Remove (colC);
+			Assert.AreEqual (1, listview.Columns.Count, "#B1");
+			Assert.AreSame (colA, listview.Columns [0], "#B2");
+			Assert.AreSame (listview, colA.ListView, "#B3");
+			Assert.IsNull (colB.ListView, "#B4");
+			Assert.IsNull (colC.ListView, "#B5");
+
+			listview.Columns.Remove (colA);
+			Assert.AreEqual (0, listview.Columns.Count, "#C1");
+			Assert.IsNull (colA.ListView, "#C2");
+			Assert.IsNull (colB.ListView, "#C3");
+			Assert.IsNull (colC.ListView, "#C4");
+		}
+
+		[Test]
+		public void ColumnHeaderCollectionTest_RemoveAt ()
+		{
+			ListView listview = new ListView ();
+			ColumnHeader colA = new ColumnHeader ();
+			ColumnHeader colB = new ColumnHeader ();
+			ColumnHeader colC = new ColumnHeader ();
+			listview.Columns.Add (colA);
+			listview.Columns.Add (colB);
+			listview.Columns.Add (colC);
+
+			listview.Columns.RemoveAt (1);
+			Assert.AreEqual (2, listview.Columns.Count, "#A1");
+			Assert.AreSame (colA, listview.Columns [0], "#A2");
+			Assert.AreSame (colC, listview.Columns [1], "#A3");
+			Assert.AreSame (listview, colA.ListView, "#A4");
+			Assert.IsNull (colB.ListView, "#A5");
+			Assert.AreSame (listview, colC.ListView, "#A6");
+
+			listview.Columns.RemoveAt (0);
+			Assert.AreEqual (1, listview.Columns.Count, "#B1");
+			Assert.AreSame (colC, listview.Columns [0], "#B2");
+			Assert.IsNull (colA.ListView, "#B3");
+			Assert.IsNull (colB.ListView, "#B4");
+			Assert.AreSame (listview, colC.ListView, "#B5");
+
+			listview.Columns.RemoveAt (0);
+			Assert.AreEqual (0, listview.Columns.Count, "#C1");
+			Assert.IsNull (colA.ListView, "#C2");
+			Assert.IsNull (colB.ListView, "#C3");
+			Assert.IsNull (colC.ListView, "#C4");
 		}
 
 		/*
@@ -838,9 +901,8 @@ namespace MonoTests.System.Windows.Forms
 			ListViewItem item1 = new ListViewItem ("Item1");
 			ListViewItem item2 = new ListViewItem ("Item2");
 			ListViewItem item3 = new ListViewItem ("Item3");
-
 			lv1.Items.AddRange (new ListViewItem[] { item1, item2, item3 });
-            
+
 			Assert.AreSame (item1, lv1.Items[0], "#A1");
 			Assert.AreEqual (0, item1.Index, "#A2");
 			Assert.AreSame (lv1, item1.ListView, "#A3");
@@ -899,6 +961,24 @@ namespace MonoTests.System.Windows.Forms
 			lv1.Items.Add (item1);
 		}
 
+		[Test]
+		public void ListViewItemCollectionTest_Clear ()
+		{
+			ListView lvw = new ListView ();
+			ListViewItem itemA = lvw.Items.Add ("A");
+			ListViewItem itemB = lvw.Items.Add ("B");
+
+			Assert.AreEqual (2, lvw.Items.Count, "#A1");
+			Assert.AreSame (lvw, itemA.ListView, "#A2");
+			Assert.AreSame (lvw, itemB.ListView, "#A3");
+
+			lvw.Items.Clear ();
+
+			Assert.AreEqual (0, lvw.Items.Count, "#B1");
+			Assert.IsNull (itemA.ListView, "#B2");
+			Assert.IsNull (itemB.ListView, "#B3");
+		}
+
 		[Test]
 		public void ListViewItemCollectionTest_Insert ()
 		{
@@ -1033,6 +1113,10 @@ namespace MonoTests.System.Windows.Forms
 			Assert.AreEqual (1, lvw.CheckedItems.Count, "#E4");
 			Assert.AreEqual (itemD, lvw.CheckedItems [0], "#E5");
 
+			Assert.IsNull (itemA.ListView, "#F1");
+			Assert.IsNull (itemB.ListView, "#F2");
+			Assert.AreSame (lvw, itemD.ListView, "#F3");
+
 			form.Dispose ();
 		}
 
@@ -1045,10 +1129,11 @@ namespace MonoTests.System.Windows.Forms
 			form.Controls.Add (lvw);
 			lvw.MultiSelect = true;
 			lvw.CheckBoxes = true;
-			lvw.Items.Add ("A");
-			lvw.Items.Add ("B");
-			lvw.Items.Add ("C");
-			lvw.Items.Add ("D");
+
+			ListViewItem itemA = lvw.Items.Add ("A");
+			ListViewItem itemB = lvw.Items.Add ("B");
+			ListViewItem itemC = lvw.Items.Add ("C");
+			ListViewItem itemD = lvw.Items.Add ("D");
 
 			form.Show ();
 
@@ -1090,6 +1175,11 @@ namespace MonoTests.System.Windows.Forms
 			Assert.AreEqual (1, lvw.CheckedItems.Count, "#E4");
 			Assert.AreEqual ("D", lvw.CheckedItems [0].Text, "#E5");
 
+			Assert.IsNull (itemA.ListView, "#F1");
+			Assert.IsNull (itemB.ListView, "#F2");
+			Assert.AreSame (lvw, itemC.ListView, "#F3");
+			Assert.AreSame (lvw, itemD.ListView, "#F4");
+
 			form.Dispose ();
 		}
 
@@ -1134,6 +1224,12 @@ namespace MonoTests.System.Windows.Forms
 			Assert.AreEqual (2, lvw.Items.Count, "#E1");
 			Assert.AreSame (lvi4, lvw.Items [0], "#E2");
 			Assert.AreSame (lvi5, lvw.Items [1], "#E3");
+
+			Assert.IsNull (lvi1.ListView, "#F1");
+			Assert.IsNull (lvi2.ListView, "#F2");
+			Assert.IsNull (lvi3.ListView, "#F3");
+			Assert.AreSame (lvw, lvi4.ListView, "#F4");
+			Assert.AreSame (lvw, lvi5.ListView, "#F5");
 		}
 
 		[Test]

+ 10 - 6
mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ListViewTest.cs

@@ -141,15 +141,19 @@ namespace MonoTests.System.Windows.Forms
 			myform.ShowInTaskbar = false;
 			myform.Visible = true;
 			ListView mylistview = new ListView ();
-			mylistview.Items.Add ("A");
-			mylistview.Columns.Add ("Item Column", -2, HorizontalAlignment.Left);
+			ListViewItem itemA = mylistview.Items.Add ("A");
+			ColumnHeader colA = mylistview.Columns.Add ("Item Column", -2, HorizontalAlignment.Left);
+			Assert.AreSame (mylistview, itemA.ListView, "#1");
+			Assert.AreSame (mylistview, colA.ListView, "#2");
 			mylistview.Visible = true;
 			myform.Controls.Add (mylistview);
-			Assert.AreEqual (1, mylistview.Columns.Count, "#31");
-			Assert.AreEqual (1, mylistview.Items.Count, "#32");
+			Assert.AreEqual (1, mylistview.Columns.Count, "#3");
+			Assert.AreEqual (1, mylistview.Items.Count, "#4");
 			mylistview.Clear ();
-			Assert.AreEqual (0, mylistview.Columns.Count, "#33");
-			Assert.AreEqual (0, mylistview.Items.Count, "#34");
+			Assert.AreEqual (0, mylistview.Columns.Count, "#5");
+			Assert.AreEqual (0, mylistview.Items.Count, "#6");
+			Assert.IsNull (itemA.ListView, "#7");
+			Assert.IsNull (colA.ListView, "#8");
 			myform.Dispose ();
 		}