New tests.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / DataGridViewColumnCollection.cs
index c6cfed37b9757ffca223b381c0a05fdce883e906..29bc09dd61e6b10435045430b548972cc9ee85b7 100644 (file)
 
 using System.ComponentModel;
 using System.Collections;
+using System.Collections.Generic;
 
-namespace System.Windows.Forms {
-
+namespace System.Windows.Forms
+{
        [ListBindable (false)]
-       public class DataGridViewColumnCollection : BaseCollection, IList, ICollection, IEnumerable {
-
+       public class DataGridViewColumnCollection : BaseCollection, IList, ICollection, IEnumerable
+       {
                private DataGridView dataGridView;
-
-               public DataGridViewColumnCollection (DataGridView dataGridView) {
+               private List<DataGridViewColumn> display_index_sorted;
+               
+               public DataGridViewColumnCollection (DataGridView dataGridView)
+               {
                        this.dataGridView = dataGridView;
+                       RegenerateSortedList ();
                }
 
                bool IList.IsFixedSize {
@@ -45,7 +49,7 @@ namespace System.Windows.Forms {
                }
 
                object IList.this [int index] {
-                       get { return this[index]; }
+                       get { return this [index]; }
                        set { throw new NotSupportedException(); }
                }
 
@@ -66,110 +70,143 @@ namespace System.Windows.Forms {
 
                public event CollectionChangeEventHandler CollectionChanged;
 
-               int IList.Add (object o) {
-                       return Add(o as DataGridViewColumn);
+               int IList.Add (object value)
+               {
+                       return Add(value as DataGridViewColumn);
                }
 
-               public virtual int Add (DataGridViewColumn dataGridViewColumn) {
-                       dataGridViewColumn.SetIndex(base.List.Count);
-                       dataGridViewColumn.SetDataGridView(dataGridView);
+               public virtual int Add (DataGridViewColumn dataGridViewColumn)
+               {
                        int result = base.List.Add(dataGridViewColumn);
+                       if (dataGridViewColumn.DisplayIndex == -1)
+                               dataGridViewColumn.DisplayIndexInternal = result;
+                       dataGridViewColumn.SetIndex(result);
+                       dataGridViewColumn.SetDataGridView(dataGridView);
                        OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, dataGridViewColumn));
                        return result;
                }
 
                [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
-               public virtual int Add (string columnName, string headerText) {
-                       DataGridViewColumn col = new DataGridViewColumn();
+               public virtual int Add (string columnName, string headerText)
+               {
+                       DataGridViewColumn col = new DataGridViewTextBoxColumn ();
                        col.Name = columnName;
                        col.HeaderText = headerText;
-                       return Add(col);
+                       return Add (col);
                }
 
-               public virtual void AddRange (params DataGridViewColumn[] dataGridViewColumns) {
-                       foreach (DataGridViewColumn col in dataGridViewColumns) {
-                               Add(col);
-                       }
+               public virtual void AddRange (params DataGridViewColumn[] dataGridViewColumns)
+               {
+                       foreach (DataGridViewColumn col in dataGridViewColumns)
+                               Add (col);
                }
 
-               public virtual void Clear () {
-                       base.List.Clear();
+               public virtual void Clear ()
+               {
+                       base.List.Clear ();
+                       
+                       // When we clear the column collection, all rows get deleted
+                       dataGridView.Rows.Clear ();
+                       dataGridView.RemoveEditingRow ();
+                       
+                       RegenerateSortedList ();
+
+                       OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Refresh, null));
                }
 
-               bool IList.Contains (object o) {
-                       return Contains(o as DataGridViewColumn);
+               bool IList.Contains (object value)
+               {
+                       return Contains (value as DataGridViewColumn);
                }
 
-               public virtual bool Contains (DataGridViewColumn dataGridViewColumn) {
-                       return base.List.Contains(dataGridViewColumn);
+               public virtual bool Contains (DataGridViewColumn dataGridViewColumn)
+               {
+                       return base.List.Contains (dataGridViewColumn);
                }
 
-               public virtual bool Contains (string columnName) {
-                       foreach (DataGridViewColumn col in base.List) {
-                               if (col.Name == columnName) {
+               public virtual bool Contains (string columnName)
+               {
+                       foreach (DataGridViewColumn col in base.List)
+                               if (col.Name == columnName)
                                        return true;
-                               }
-                       }
                        return false;
                }
 
-               public void CopyTo (DataGridViewColumn[] array, int index) {
-                       base.List.CopyTo(array, index);
+               public void CopyTo (DataGridViewColumn [] array, int index)
+               {
+                       base.List.CopyTo (array, index);
                }
 
-               public int GetColumnCount (DataGridViewElementStates includeFilter) {
+               public int GetColumnCount (DataGridViewElementStates includeFilter)
+               {
                        return 0;
                }
 
-               public int GetColumnsWidth (DataGridViewElementStates includeFilter) {
+               public int GetColumnsWidth (DataGridViewElementStates includeFilter)
+               {
                        return 0;
                }
 
-               public DataGridViewColumn GetFirstColumn (DataGridViewElementStates includeFilter) {
+               public DataGridViewColumn GetFirstColumn (DataGridViewElementStates includeFilter)
+               {
                        return null;
                }
 
-               public DataGridViewColumn GetFirstColumn (DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter) {
+               public DataGridViewColumn GetFirstColumn (DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
+               {
                        return null;
                }
 
-               public DataGridViewColumn GetLastColumn (DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter) {
+               public DataGridViewColumn GetLastColumn (DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
+               {
                        return null;
                }
 
-               public DataGridViewColumn GetNextColumn (DataGridViewColumn dataGridViewColumnStart, DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter) {
+               public DataGridViewColumn GetNextColumn (DataGridViewColumn dataGridViewColumnStart, DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
+               {
                        return null;
                }
 
-               public DataGridViewColumn GetPreviousColumn (DataGridViewColumn dataGridViewColumnStart, DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter) {
+               public DataGridViewColumn GetPreviousColumn (DataGridViewColumn dataGridViewColumnStart, DataGridViewElementStates includeFilter, DataGridViewElementStates excludeFilter)
+               {
                        return null;
                }
 
-               int IList.IndexOf (object o) {
-                       return IndexOf(o as DataGridViewColumn);
+               int IList.IndexOf (object value)
+               {
+                       return IndexOf (value as DataGridViewColumn);
                }
 
-               public int IndexOf (DataGridViewColumn dataGridViewColumn) {
-                       return base.List.IndexOf(dataGridViewColumn);
+               public int IndexOf (DataGridViewColumn dataGridViewColumn)
+               {
+                       return base.List.IndexOf (dataGridViewColumn);
                }
 
-               void IList.Insert (int columnIndex, object o) {
-                       Insert(columnIndex, o as DataGridViewColumn);
+               void IList.Insert (int index, object value)
+               {
+                       Insert (index, value as DataGridViewColumn);
                }
 
-               public virtual void Insert (int columnIndex, DataGridViewColumn dataGridViewColumn) {
-                       dataGridViewColumn.SetIndex(columnIndex);
-                       base.List.Insert(columnIndex, dataGridViewColumn);
-                       OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, dataGridViewColumn));
+               public virtual void Insert (int columnIndex, DataGridViewColumn dataGridViewColumn)
+               {
+                       base.List.Insert (columnIndex, dataGridViewColumn);
+                       if (dataGridViewColumn.DisplayIndex == -1)
+                               dataGridViewColumn.DisplayIndexInternal = columnIndex;
+                       dataGridViewColumn.SetIndex (columnIndex);
+                       dataGridViewColumn.SetDataGridView (dataGridView);
+                       OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Add, dataGridViewColumn));
                }
 
-               void IList.Remove (object o) {
-                       Remove(o as DataGridViewColumn);
+               void IList.Remove (object value)
+               {
+                       Remove (value as DataGridViewColumn);
                }
 
-               public virtual void Remove (DataGridViewColumn dataGridViewColumn) {
-                       base.List.Remove(dataGridViewColumn);
-                       OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Remove, dataGridViewColumn));
+               public virtual void Remove (DataGridViewColumn dataGridViewColumn)
+               {
+                       DataGridView.OnColumnPreRemovedInternal (new DataGridViewColumnEventArgs (dataGridViewColumn));
+                       base.List.Remove (dataGridViewColumn);
+                       OnCollectionChanged (new CollectionChangeEventArgs (CollectionChangeAction.Remove, dataGridViewColumn));
                }
 
                public virtual void Remove (string columnName) {
@@ -181,59 +218,71 @@ namespace System.Windows.Forms {
                        }
                }
 
-               public virtual void RemoveAt (int index) {
-                       DataGridViewColumn col = this[index];
-                       base.List.RemoveAt(index);
-                       OnCollectionChanged(new CollectionChangeEventArgs(CollectionChangeAction.Add, col));
+               public virtual void RemoveAt (int index)
+               {
+                       DataGridViewColumn col = this [index];
+                       Remove (col);
                }
 
                protected DataGridView DataGridView {
                        get { return dataGridView; }
                }
 
-               protected virtual void OnCollectionChanged (CollectionChangeEventArgs e) {
-                       if (CollectionChanged != null) {
+               protected virtual void OnCollectionChanged (CollectionChangeEventArgs e)
+               {
+                       RegenerateIndexes ();
+                       RegenerateSortedList ();
+
+                       if (CollectionChanged != null)
                                CollectionChanged(this, e);
-                       }
                }
 
                protected override ArrayList List {
                        get { return base.List; }
                }
 
-               /************************/
-
-               internal ArrayList ColumnDisplayIndexSortedArrayList {
-                       get {
-                               ArrayList result = (ArrayList) base.List.Clone();
-                               result.Sort(new ColumnDisplayIndexComparator());
-                               return result;
-                       }
-               }
-
-               private class ColumnDisplayIndexComparator : IComparer {
-
-                       public int Compare (object o1, object o2) {
-                               DataGridViewColumn col1 = (DataGridViewColumn) o1;
-                               DataGridViewColumn col2 = (DataGridViewColumn) o2;
-                               if (col1.DisplayIndex < col2.DisplayIndex) {
-                                       return -1;
-                               }
-                               else if (col1.DisplayIndex > col2.DisplayIndex) {
+               internal List<DataGridViewColumn> ColumnDisplayIndexSortedArrayList {
+                       get { return display_index_sorted; }
+               }
+
+               private void RegenerateIndexes ()
+               {
+                       for (int i = 0; i < Count; i++)
+                               this[i].SetIndex (i);
+               }
+               
+               internal void RegenerateSortedList ()
+               {
+                       DataGridViewColumn[] array = (DataGridViewColumn[])base.List.ToArray (typeof (DataGridViewColumn));
+                       List<DataGridViewColumn> result = new List<DataGridViewColumn> (array);
+
+                       result.Sort (new ColumnDisplayIndexComparator ());
+                       for (int i = 0; i < result.Count; i++)
+                               result[i].DisplayIndexInternal = i;
+                       
+                       display_index_sorted = result;
+               }
+               
+               internal void ClearAutoGeneratedColumns ()
+               {
+                       for (int i = list.Count - 1; i >= 0; i--)
+                               if ((list[i] as DataGridViewColumn).AutoGenerated)
+                                       RemoveAt (i);
+               }
+               
+               private class ColumnDisplayIndexComparator : IComparer<DataGridViewColumn>
+               {
+                       public int Compare (DataGridViewColumn o1, DataGridViewColumn o2)
+                       {
+                               if (o1.DisplayIndex == o2.DisplayIndex)
+                                       // Here we avoid the equal value swapping that both Array.Sort and ArrayList.Sort 
+                                       // do occasionally and preserve the user column insertation order.
                                        return 1;
-                               }
-                               else {
-                                       return 0;
-                               }
+                               else
+                                       return o1.DisplayIndex - o2.DisplayIndex;
                        }
-
                }
-
-               /************************/
-
-
        }
-
 }
 
 #endif