* ListView.cs: Add fireEvent argument to ReorderColumn since the
authorGert Driesen <drieseng@users.sourceforge.net>
Thu, 1 Mar 2007 21:53:20 +0000 (21:53 -0000)
committerGert Driesen <drieseng@users.sourceforge.net>
Thu, 1 Mar 2007 21:53:20 +0000 (21:53 -0000)
ColumnReordered event must not be signaled when modifying DisplayIndex
of a ColumnHeader. Added internal ReorderColumns method which takes
care of drawing, and updating the internal DisplayIndex of the
ColumnHeader. Added AddColumn method which is invoked from
ColumnHeaderCollection when adding or inserting columns, and which
ensures that reorder_columns_indices is kept in sync. Avoid redrawing
after adding each ColumnHeader in ColumnHeaderCollection.AddRange.
Recalculated dispay indices after removing a ColumnHeader.
* ColumnHeader.cs: Save DisplayIndex separately from ListView to
match MS. Allows last display index to be returned after ListView
is disposed. Update actual location of ColumnHeader when DisplayIndex
is modified.
* ListViewCollectionsTest.cs: Added ColumnHeader.Index tests.
* ColumnHeaderTest.cs: Added more DisplayIndex tests.

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

mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ColumnHeader.cs
mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListView.cs
mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ChangeLog
mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ColumnHeaderTest.cs
mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ListViewCollectionsTest.cs

index d738f7a123708aeb4b0774321f9e95122295b71d..8e0514fa5dd640ac59b9499453c2168c188211a0 100644 (file)
@@ -1,3 +1,19 @@
+2007-03-01  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * ListView.cs: Add fireEvent argument to ReorderColumn since the
+       ColumnReordered event must not be signaled when modifying DisplayIndex
+       of a ColumnHeader. Added internal ReorderColumns method which takes
+       care of drawing, and updating the internal DisplayIndex of the
+       ColumnHeader. Added AddColumn method which is invoked from
+       ColumnHeaderCollection when adding or inserting columns, and which
+       ensures that reorder_columns_indices is kept in sync. Avoid redrawing
+       after adding each ColumnHeader in ColumnHeaderCollection.AddRange.
+       Recalculated dispay indices after removing a ColumnHeader.
+       * ColumnHeader.cs: Save DisplayIndex separately from ListView to
+       match MS. Allows last display index to be returned after ListView
+       is disposed. Update actual location of ColumnHeader when DisplayIndex
+       is modified.
+
 2007-03-01  Everaldo Canuto  <everaldo@simios.org>
 
        * LinkLabel.cs: Improve CalcTrimRectangle.
index e4970728d51d82df12a4887ba233a06549113dec..b6c3f5c9687b0643ad174e8d0f4663229093da84 100644 (file)
@@ -51,6 +51,7 @@ namespace System.Windows.Forms
                private string name = String.Empty;
                private object tag;
 #endif
+               private int display_index = -1;
 
                // internal variables
                Rectangle column_rect = Rectangle.Empty;
@@ -132,8 +133,13 @@ namespace System.Windows.Forms
                        get { return format; }
                }
 
+               internal int InternalDisplayIndex {
+                       get { return display_index; }
+                       set { display_index = value; }
+               }
+
                internal void CalcColumnHeader ()
-               {                       
+               {
                        if (text_alignment == HorizontalAlignment.Center)
                                format.Alignment = StringAlignment.Center;
                        else if (text_alignment == HorizontalAlignment.Right)
@@ -167,23 +173,26 @@ namespace System.Windows.Forms
                #endregion      // Private Internal Methods Properties
 
                #region Public Instance Properties
+
 #if NET_2_0
                [Localizable (true)]
                [RefreshProperties (RefreshProperties.Repaint)]
                public int DisplayIndex {
                        get {
                                if (owner == null)
-                                       return -1;
+                                       return display_index;
                                        
                                return owner.GetReorderedColumnIndex (this);
-                       }
+                       }
                        set {
-                               if (owner == null)
+                               if (owner == null) {
+                                       display_index = value;
                                        return;
+                               }
                                if (value < 0 || value >= owner.Columns.Count)
-                                       throw new ArgumentOutOfRangeException ("value");
+                                       throw new ArgumentOutOfRangeException ("DisplayIndex");
 
-                               owner.ReorderColumn (this, value);
+                               owner.ReorderColumn (this, value, false);
                        }
                }
 
index a4c7013ded4474421e51c6357ef5f0d006c1f4db..c54f36d129d107ccb366c17510a7d380f4a91636 100644 (file)
@@ -1099,7 +1099,7 @@ namespace System.Windows.Forms
                        return -1;
                }
 #endif
-               
+
                internal ColumnHeader GetReorderedColumn (int index)
                {
                        if (reordered_column_indices == null)
@@ -1108,24 +1108,28 @@ namespace System.Windows.Forms
                                return Columns [reordered_column_indices [index]];
                }
 
-               internal void ReorderColumn (ColumnHeader col, int index)
+               internal void ReorderColumn (ColumnHeader col, int index, bool fireEvent)
                {
 #if NET_2_0
-                       ColumnReorderedEventHandler eh = (ColumnReorderedEventHandler) (Events [ColumnReorderedEvent]);
-                       if (eh != null){
-                               ColumnReorderedEventArgs args = new ColumnReorderedEventArgs (col.Index, index, col);
-
-                               eh (this, args);
-                               if (args.Cancel){
-                                       header_control.Invalidate ();
-                                       item_control.Invalidate ();
-                                       return;
+                       if (fireEvent) {
+                               ColumnReorderedEventHandler eh = (ColumnReorderedEventHandler) (Events [ColumnReorderedEvent]);
+                               if (eh != null){
+                                       ColumnReorderedEventArgs args = new ColumnReorderedEventArgs (col.Index, index, col);
+
+                                       eh (this, args);
+                                       if (args.Cancel) {
+                                               header_control.Invalidate ();
+                                               item_control.Invalidate ();
+                                               return;
+                                       }
                                }
                        }
 #endif
+                       int column_count = Columns.Count;
+
                        if (reordered_column_indices == null) {
-                               reordered_column_indices = new int [Columns.Count];
-                               for (int i = 0; i < Columns.Count; i++)
+                               reordered_column_indices = new int [column_count];
+                               for (int i = 0; i < column_count; i++)
                                        reordered_column_indices [i] = i;
                        }
 
@@ -1133,10 +1137,10 @@ namespace System.Windows.Forms
                                return;
 
                        int[] curr = reordered_column_indices;
-                       int[] result = new int [Columns.Count];
+                       int [] result = new int [column_count];
                        int curr_idx = 0;
-                       for (int i = 0; i < Columns.Count; i++) {
-                               if (curr_idx < Columns.Count && curr [curr_idx] == col.Index)
+                       for (int i = 0; i < column_count; i++) {
+                               if (curr_idx < column_count && curr [curr_idx] == col.Index)
                                        curr_idx++;
 
                                if (i == index)
@@ -1145,13 +1149,49 @@ namespace System.Windows.Forms
                                        result [i] = curr [curr_idx++];
                        }
 
-                       reordered_column_indices = result;
-                       LayoutDetails ();
-                       header_control.Invalidate ();
-                       item_control.Invalidate ();
+                       ReorderColumns (result, true);
+               }
+
+               internal void ReorderColumns (int [] display_indices, bool redraw)
+               {
+                       reordered_column_indices = display_indices;
+                       for (int i = 0; i < Columns.Count; i++) {
+                               ColumnHeader col = Columns [i];
+                               col.InternalDisplayIndex = reordered_column_indices [i];
+                       }
+                       if (redraw && view == View.Details && IsHandleCreated) {
+                               LayoutDetails ();
+                               header_control.Invalidate ();
+                               item_control.Invalidate ();
+                       }
                }
 
-               Size LargeIconItemSize {
+               internal void AddColumn (ColumnHeader newCol, int index, bool redraw)
+               {
+                       int column_count = Columns.Count;
+                       newCol.SetListView (this);
+
+                       int [] display_indices = new int [column_count];
+                       for (int i = 0; i < column_count; i++) {
+                               ColumnHeader col = Columns [i];
+                               if (i == index) {
+                                       display_indices [i] = index;
+                               } else {
+                                       int display_index = col.InternalDisplayIndex;
+                                       if (display_index < index) {
+                                               display_indices [i] = display_index;
+                                       } else {
+                                               display_indices [i] = (display_index + 1);
+                                       }
+                               }
+                       }
+
+                       ReorderColumns (display_indices, redraw);
+                       Invalidate ();
+               }
+
+               Size LargeIconItemSize
+               {
                        get {
                                int image_w = LargeImageList == null ? 12 : LargeImageList.ImageSize.Width;
                                int image_h = LargeImageList == null ? 2 : LargeImageList.ImageSize.Height;
@@ -2913,7 +2953,7 @@ namespace System.Windows.Forms
                                        if (drag_to_index > GetReorderedIndex (clicked_column))
                                                drag_to_index--;
                                        if (owner.GetReorderedColumn (drag_to_index) != clicked_column)
-                                               owner.ReorderColumn (clicked_column, drag_to_index);
+                                               owner.ReorderColumn (clicked_column, drag_to_index, true);
                                        drag_to_index = -1;
                                        Invalidate ();
                                }
@@ -3351,12 +3391,8 @@ namespace System.Windows.Forms
                        #region Public Methods
                        public virtual int Add (ColumnHeader value)
                        {
-                               int idx;
-                               value.SetListView (this.owner);
-                               idx = list.Add (value);
-                               if (owner.IsHandleCreated) {
-                                       owner.Redraw (true); 
-                               }
+                               int idx = list.Add (value);
+                               owner.AddColumn (value, idx, true);
                                return idx;
                        }
 
@@ -3412,11 +3448,11 @@ namespace System.Windows.Forms
                        public virtual void AddRange (ColumnHeader [] values)
                        {
                                foreach (ColumnHeader colHeader in values) {
-                                       colHeader.SetListView (this.owner);
-                                       Add (colHeader);
+                                       int idx = list.Add (colHeader);
+                                       owner.AddColumn (colHeader, idx, false);
                                }
                                
-                               owner.Redraw (true); 
+                               owner.Redraw (true);
                        }
 
                        public virtual void Clear ()
@@ -3424,7 +3460,7 @@ namespace System.Windows.Forms
                                foreach (ColumnHeader col in list)
                                        col.SetListView (null);
                                list.Clear ();
-                               owner.Redraw (true);
+                               owner.ReorderColumns (new int [0], true);
                        }
 
                        public bool Contains (ColumnHeader value)
@@ -3522,9 +3558,8 @@ namespace System.Windows.Forms
                                if (index < 0 || index > list.Count)
                                        throw new ArgumentOutOfRangeException ("index");
 
-                               value.SetListView (owner);
                                list.Insert (index, value);
-                               owner.Redraw (true);
+                               owner.AddColumn (value, index, true);
                        }
 
 #if NET_2_0
@@ -3575,10 +3610,26 @@ namespace System.Windows.Forms
 
                        public virtual void Remove (ColumnHeader column)
                        {
-                               // TODO: Update Column internal index ?
+                               if (!Contains (column))
+                                       return;
+
                                list.Remove (column);
                                column.SetListView (null);
-                               owner.Redraw (true);
+
+                               int rem_display_index = column.InternalDisplayIndex;
+                               int [] display_indices = new int [list.Count];
+                               for (int i = 0; i < display_indices.Length; i++) {
+                                       ColumnHeader col = (ColumnHeader) list [i];
+                                       int display_index = col.InternalDisplayIndex;
+                                       if (display_index < rem_display_index) {
+                                               display_indices [i] = display_index;
+                                       } else {
+                                               display_indices [i] = (display_index - 1);
+                                       }
+                               }
+
+                               column.InternalDisplayIndex = -1;
+                               owner.ReorderColumns (display_indices, true);
                        }
 
 #if NET_2_0
index 1a690407a4ce60e4ee6472641f8df7911f41566d..b29a02c55269efd699c2ab24d734b2bea880e52c 100644 (file)
@@ -1,3 +1,8 @@
+2007-03-01  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * ListViewCollectionsTest.cs: Added ColumnHeader.Index tests.
+       * ColumnHeaderTest.cs: Added more DisplayIndex tests.
+
 2007-02-29  Carlos Alberto Cortez <calberto.cortez@gmail.com>
 
        * ListViewTest.cs: Add test for VirtualMode and VirtualSize,
index 0fd648c1f470e5663b31664f3f72ad0de3116f41..095201855c8ae604f0b8b3dfd526a69f84c2c08c 100644 (file)
@@ -33,6 +33,14 @@ namespace MonoTests.System.Windows.Forms
        [TestFixture]
        public class ColumnHeaderTest
        {
+#if NET_2_0
+               [SetUp]
+               public void SetUp ()
+               {
+                       columnReordered = 0;
+               }
+#endif
+
                [Test]
                public void DefaultValuesTest ()
                {
@@ -54,31 +62,66 @@ namespace MonoTests.System.Windows.Forms
 
 #if NET_2_0
                [Test]
-               public void DisplayIndexTest ()
+               public void DisplayIndex_ListView_Created ()
                {
-                       ColumnHeader col = new ColumnHeader ();
-                       col.DisplayIndex = -66;
-                       col.DisplayIndex = 66;
+                       ColumnHeader colA = new ColumnHeader ();
+                       ColumnHeader colB = new ColumnHeader ();
+                       ColumnHeader colC = new ColumnHeader ();
+                       ColumnHeader colD = new ColumnHeader ();
+                       colA.DisplayIndex = 2;
+                       colD.DisplayIndex = 0;
+                       colB.DisplayIndex = 3;
+                       colC.DisplayIndex = 1;
 
+                       Form form = new Form ();
+                       form.ShowInTaskbar = false;
                        ListView lv = new ListView ();
-                       lv.Columns.Add (col);
+                       lv.ColumnReordered += new ColumnReorderedEventHandler (ColumnReordered);
+                       lv.View = View.Details;
+                       lv.Columns.Add (colA);
+                       lv.Columns.Add (colB);
+                       lv.Columns.Add (colC);
+                       form.Controls.Add (lv);
+                       form.Show ();
 
-                       try {
-                               col.DisplayIndex = -1;
-                               Assert.Fail ("1");
-                       } catch (ArgumentOutOfRangeException) {
-                       }
+                       Assert.AreEqual (0, colA.DisplayIndex, "#A1");
+                       Assert.AreEqual (1, colB.DisplayIndex, "#A2");
+                       Assert.AreEqual (2, colC.DisplayIndex, "#A3");
+                       Assert.AreEqual (0, colD.DisplayIndex, "#A4");
+                       Assert.AreEqual (0, columnReordered, "#A5");
 
-                       try {
-                               col.DisplayIndex = lv.Columns.Count;
-                               Assert.Fail ("2");
-                       } catch (ArgumentOutOfRangeException) {
-                       }
+                       colC.DisplayIndex = 0;
+                       Assert.AreEqual (1, colA.DisplayIndex, "#B1");
+                       Assert.AreEqual (2, colB.DisplayIndex, "#B2");
+                       Assert.AreEqual (0, colC.DisplayIndex, "#B3");
+                       Assert.AreEqual (0, colD.DisplayIndex, "#B4");
+                       Assert.AreEqual (0, columnReordered, "#B5");
+
+                       colC.DisplayIndex = 2;
+                       Assert.AreEqual (0, colA.DisplayIndex, "#C1");
+                       Assert.AreEqual (1, colB.DisplayIndex, "#C2");
+                       Assert.AreEqual (2, colC.DisplayIndex, "#C3");
+                       Assert.AreEqual (0, colD.DisplayIndex, "#C4");
+                       Assert.AreEqual (0, columnReordered, "#C5");
+
+                       colB.DisplayIndex = 2;
+                       Assert.AreEqual (0, colA.DisplayIndex, "#D1");
+                       Assert.AreEqual (2, colB.DisplayIndex, "#D2");
+                       Assert.AreEqual (1, colC.DisplayIndex, "#D3");
+                       Assert.AreEqual (0, colD.DisplayIndex, "#D4");
+                       Assert.AreEqual (0, columnReordered, "#D5");
 
-                       Assert.AreEqual (0, col.DisplayIndex, "3");
+                       colD.DisplayIndex = 1;
+                       lv.Columns.Add (colD);
+
+                       Assert.AreEqual (0, colA.DisplayIndex, "#E1");
+                       Assert.AreEqual (2, colB.DisplayIndex, "#E2");
+                       Assert.AreEqual (1, colC.DisplayIndex, "#E3");
+                       Assert.AreEqual (3, colD.DisplayIndex, "#E4");
+                       Assert.AreEqual (0, columnReordered, "#E5");
                }
 
-               [Test] 
+               [Test]
                public void DisplayIndex_ListView_Disposed ()
                {
                        ListView lv = new ListView ();
@@ -87,10 +130,73 @@ namespace MonoTests.System.Windows.Forms
                        lv.Columns.Add (colA);
                        ColumnHeader colB = new ColumnHeader ();
                        lv.Columns.Add (colB);
+                       ColumnHeader colC = new ColumnHeader ();
+                       lv.Columns.Add (colC);
+                       Assert.AreEqual (0, colA.DisplayIndex, "#A1");
+                       Assert.AreEqual (1, colB.DisplayIndex, "#A2");
+                       Assert.AreEqual (2, colC.DisplayIndex, "#A3");
+                       colA.DisplayIndex = 2;
+                       lv.Columns.Remove (colB);
                        lv.Dispose ();
-                       colA.DisplayIndex = 1;
-                       Assert.AreEqual (1, colA.DisplayIndex, "#1");
-                       Assert.AreEqual (1, colB.DisplayIndex, "#2");
+                       Assert.AreEqual (1, colA.DisplayIndex, "#B1");
+                       Assert.AreEqual (-1, colB.DisplayIndex, "#B2");
+                       Assert.AreEqual (0, colC.DisplayIndex, "#B3");
+                       colA.DisplayIndex = 255;
+                       Assert.AreEqual (255, colA.DisplayIndex, "#C1");
+                       Assert.AreEqual (-1, colB.DisplayIndex, "#C2");
+                       Assert.AreEqual (0, colC.DisplayIndex, "#C3");
+               }
+
+               [Test]
+               public void DisplayIndex_ListView_NotCreated ()
+               {
+                       ColumnHeader colA = new ColumnHeader ();
+                       colA.DisplayIndex = -66;
+                       Assert.AreEqual (-66, colA.DisplayIndex, "#A1");
+                       colA.DisplayIndex = 66;
+                       Assert.AreEqual (66, colA.DisplayIndex, "#A2");
+
+                       ColumnHeader colB = new ColumnHeader ();
+                       colB.DisplayIndex = 0;
+                       Assert.AreEqual (0, colB.DisplayIndex, "#A3");
+
+                       ColumnHeader colC = new ColumnHeader ();
+                       colC.DisplayIndex = 1;
+                       Assert.AreEqual (1, colC.DisplayIndex, "#A4");
+
+                       ListView lv = new ListView ();
+                       lv.ColumnReordered += new ColumnReorderedEventHandler (ColumnReordered);
+                       lv.View = View.Details;
+                       lv.Columns.Add (colA);
+                       lv.Columns.Add (colB);
+                       lv.Columns.Add (colC);
+
+                       try {
+                               colA.DisplayIndex = -1;
+                               Assert.Fail ("#B1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
+                               Assert.IsNull (ex.InnerException, "#B3");
+                               Assert.IsNotNull (ex.Message, "#B4");
+                               Assert.IsNotNull (ex.ParamName, "#B5");
+                               Assert.AreEqual ("DisplayIndex", ex.ParamName, "#B6");
+                       }
+
+                       try {
+                               colA.DisplayIndex = lv.Columns.Count;
+                               Assert.Fail ("#C1");
+                       } catch (ArgumentOutOfRangeException ex) {
+                               Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2");
+                               Assert.IsNull (ex.InnerException, "#C3");
+                               Assert.IsNotNull (ex.Message, "#C4");
+                               Assert.IsNotNull (ex.ParamName, "#C5");
+                               Assert.AreEqual ("DisplayIndex", ex.ParamName, "#C6");
+                       }
+
+                       Assert.AreEqual (0, colA.DisplayIndex, "#D1");
+                       Assert.AreEqual (1, colB.DisplayIndex, "#D2");
+                       Assert.AreEqual (2, colC.DisplayIndex, "#D3");
+                       Assert.AreEqual (0, columnReordered, "#D4");
                }
 
                [Test]
@@ -292,5 +398,14 @@ namespace MonoTests.System.Windows.Forms
                        col.Width = 10;
                        Assert.AreEqual (10, col.Width);
                }
+
+#if NET_2_0
+               public void ColumnReordered (object sender, ColumnReorderedEventArgs  e)
+               {
+                       columnReordered++;
+               }
+
+               private int columnReordered;
+#endif
        }
 }
index 3dac235e50b3cf8884b721d1882e5346738b2c89..64c1726d8afbbf47e3e175d6c5b34cafacb5d8f1 100644 (file)
@@ -100,6 +100,9 @@ namespace MonoTests.System.Windows.Forms
                        Assert.AreSame (listview, colA.ListView, "#A4");
                        Assert.IsNull (colB.ListView, "#A5");
                        Assert.AreSame (listview, colC.ListView, "#A6");
+                       Assert.AreEqual (0, colA.Index, "#A7");
+                       Assert.AreEqual (-1, colB.Index, "#A8");
+                       Assert.AreEqual (1, colC.Index, "#A9");
 
                        listview.Columns.Remove (colC);
                        Assert.AreEqual (1, listview.Columns.Count, "#B1");
@@ -107,12 +110,18 @@ namespace MonoTests.System.Windows.Forms
                        Assert.AreSame (listview, colA.ListView, "#B3");
                        Assert.IsNull (colB.ListView, "#B4");
                        Assert.IsNull (colC.ListView, "#B5");
+                       Assert.AreEqual (0, colA.Index, "#B6");
+                       Assert.AreEqual (-1, colB.Index, "#B7");
+                       Assert.AreEqual (-1, colC.Index, "#B8");
 
                        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");
+                       Assert.AreEqual (-1, colA.Index, "#C5");
+                       Assert.AreEqual (-1, colB.Index, "#C6");
+                       Assert.AreEqual (-1, colC.Index, "#C7");
                }
 
                [Test]