Make a copy of the old ZipLib
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / CurrencyManager.cs
index ff27c3bdc336e2a6fdd5b43a9acf2f073d9e1e9a..23a214175fd57e569c280a09ed0d1f9dc2ef3995 100644 (file)
@@ -24,6 +24,7 @@
 //
 
 using System;
+using System.Data;
 using System.Reflection;
 using System.Collections;
 using System.ComponentModel;
@@ -36,13 +37,10 @@ namespace System.Windows.Forms {
                protected int listposition;
 
                private IList list;
-               private IBindingList binding_list;
-
                private bool binding_suspended;
 
                internal CurrencyManager (object data_source)
-               {
-                       binding_list = data_source as IBindingList;
+               {                       
                        if (data_source is IListSource) {
                                list = ((IListSource) data_source).GetList ();
                        } else if (data_source is IList) {
@@ -61,7 +59,18 @@ namespace System.Windows.Forms {
                                        finalType = null;
                                }
                        }
-               }               
+
+                       DataTable table = data_source as DataTable;
+                       if (table == null && data_source is DataView)
+                               table = ((DataView) data_source).Table;
+
+                       if (table != null) {
+                               table.Columns.CollectionChanged  += new CollectionChangeEventHandler (MetaDataChangedHandler);
+                               table.ChildRelations.CollectionChanged  += new CollectionChangeEventHandler (MetaDataChangedHandler);
+                               table.ParentRelations.CollectionChanged  += new CollectionChangeEventHandler (MetaDataChangedHandler);
+                               table.Constraints.CollectionChanged += new CollectionChangeEventHandler (MetaDataChangedHandler);
+                       }
+               }
 
                public IList List {
                        get { return list; }
@@ -154,12 +163,23 @@ namespace System.Windows.Forms {
                 internal override bool IsSuspended {
                         get { return binding_suspended; }
                 }
+                
+                internal bool CanAddRows {
+                       get {
+                               if (list as IBindingList == null) {
+                                       return false;
+                               }
+                               
+                               return true;
+                       }
+               }
 
                public override void AddNew ()
                {
-                       if (binding_list == null)
+                       if (list as IBindingList == null)
                                throw new NotSupportedException ();
-                       binding_list.AddNew ();
+                               
+                       (list as IBindingList).AddNew ();
                }
 
                public override void CancelCurrentEdit ()
@@ -181,6 +201,19 @@ namespace System.Windows.Forms {
                        editable.EndEdit ();
                }
 
+               public void Refresh ()
+               {
+                       PullData ();
+               }
+
+               [MonoTODO ("This is just a guess, as I can't figure out how to test this method")]
+               protected void CheckEmpty ()
+               {
+                       if (list == null || list.Count < 1)
+                               throw new Exception ("List is empty.");
+                               
+               }
+
                protected internal override void OnCurrentChanged (EventArgs e)
                {
                        PullData ();
@@ -234,8 +267,8 @@ namespace System.Windows.Forms {
                internal object GetItem (int index)
                {
                        return list [index];
-               }
-
+               }               
+               
                private PropertyDescriptorCollection GetBrowsableProperties (Type t)
                {
                        Attribute [] att = new System.Attribute [1];
@@ -243,7 +276,14 @@ namespace System.Windows.Forms {
                        return TypeDescriptor.GetProperties (t, att);
                }
 
+               private void MetaDataChangedHandler (object sender, CollectionChangeEventArgs e)
+               {
+                       if (MetaDataChanged != null)
+                               MetaDataChanged (this, EventArgs.Empty);
+               }
+
                public event ItemChangedEventHandler ItemChanged;
+               public event EventHandler MetaDataChanged;
        }
 }