diff options
6 files changed, 267 insertions, 62 deletions
diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog index d738f7a1237..8e0514fa5dd 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ChangeLog @@ -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. diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ColumnHeader.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ColumnHeader.cs index e4970728d51..b6c3f5c9687 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ColumnHeader.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ColumnHeader.cs @@ -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); } } diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListView.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListView.cs index a4c7013ded4..c54f36d129d 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListView.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ListView.cs @@ -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 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 1a690407a4c..b29a02c5526 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,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, diff --git a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ColumnHeaderTest.cs b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ColumnHeaderTest.cs index 0fd648c1f47..095201855c8 100644 --- a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ColumnHeaderTest.cs +++ b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ColumnHeaderTest.cs @@ -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 } } diff --git a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ListViewCollectionsTest.cs b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ListViewCollectionsTest.cs index 3dac235e50b..64c1726d8af 100644 --- a/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ListViewCollectionsTest.cs +++ b/mcs/class/Managed.Windows.Forms/Test/System.Windows.Forms/ListViewCollectionsTest.cs @@ -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] |