2006-05-15 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / BindingContext.cs
index b0205d80c6d52e93cc42118ecdc91e244a2655f1..234de4104ce077b4112d14ab041e2942bc97b9a6 100644 (file)
@@ -35,41 +35,40 @@ namespace System.Windows.Forms {
        public class BindingContext : ICollection, IEnumerable {
 
                private Hashtable managers;
+               private object null_data_source = new object ();
 
-               private class ManagerEntry {
+               private class DataSourceEntry {
 
                        private object source;
-                       private WeakReference member_ref;
+                       private Hashtable members;
+                       // private BindingManagerBase default_manager;
                        
-                       private int member_hash;
-
-                       public ManagerEntry (object source, string member)
+                       public DataSourceEntry (object source)
                        {
                                this.source = source;
-                               if (member == null)
-                                       member = String.Empty;
-                               
-                               member_hash = member.ToLower (CultureInfo.InvariantCulture).GetHashCode ();
-                               if (member_hash == 0)
-                                       member_hash = 1;
-                               member_ref = new WeakReference (member, false);
+                               members = new Hashtable ();
                        }
 
-                       public override bool Equals (object b)
+                       public BindingManagerBase AddMember (string member)
                        {
-                               ManagerEntry o = (ManagerEntry) b;
-
-                               return (o.source == source && o.member_ref.Target == member_ref.Target);
+                               if (member == null)
+                                       member = String.Empty;
+                               BindingManagerBase res = members [member] as BindingManagerBase;
+                               if (res != null)
+                                       return res;
+                               res = CreateBindingManager (source, member);
+                               members [member] = res;
+                               return res;
                        }
 
-                       public override int GetHashCode ()
+                       public void AddMember (string member, BindingManagerBase manager)
                        {
-                               return member_hash * source.GetHashCode ();
+                               members [member] = manager;
                        }
 
-                       public override string ToString ()
+                       public bool Contains (string member)
                        {
-                               return source.ToString () + " + " + (member_ref.Target == null ? " -- null --" : member_ref.Target.ToString ());
+                               return members.Contains (member);
                        }
                }
 
@@ -92,31 +91,32 @@ namespace System.Windows.Forms {
 
                public BindingManagerBase this [object data_source, string data_member] {
                        get {
-                               ManagerEntry e = CreateEntry (data_source, data_member);
-                               WeakReference wref = managers [e] as WeakReference;
-
-                               if (wref != null && wref.Target != null)
-                                       return wref.Target as BindingManagerBase;
-                               BindingManagerBase res = AddManager (data_source, data_member);
-                               return res;
+                               DataSourceEntry ds = GetEntry (data_source, data_member, true);
+                               return ds.AddMember (data_member);
                        }
                }
 
-               private BindingManagerBase AddManager (object data_source, string data_member)
+               private DataSourceEntry GetEntry (object data_source, string data_member, bool create)
                {
-                       BindingManagerBase res = CreateBindingManager (data_source, data_member);
-                       managers [CreateEntry (data_source, data_member)] = new WeakReference (res);
+                       if (data_source == null)
+                               data_source = null_data_source;
+                               
+                       DataSourceEntry ds = managers [data_source] as DataSourceEntry;
+                       if (ds == null && create) {
+                               ds = new DataSourceEntry (data_source);
+                               managers [data_source] = ds;
+                       }
 
-                       return res;
+                       return ds;
                }
 
-               private BindingManagerBase CreateBindingManager (object data_source, 
+               private static BindingManagerBase CreateBindingManager (object data_source, 
                        string data_member)
                {
                        if (data_source is IList || 
                                data_source is IListSource ||
                                data_source is IBindingList) {
-                               CurrencyManager res = new CurrencyManager (data_source);
+                               CurrencyManager res = new CurrencyManager (data_source, data_member);
                                return res;
                        }
 
@@ -131,9 +131,11 @@ namespace System.Windows.Forms {
 
                public bool Contains (object dataSource, string dataMember)
                {
-                       ManagerEntry entry = CreateEntry (dataSource, dataMember);
+                       DataSourceEntry ds = GetEntry (dataSource, dataMember, false);
+                       if (ds == null)
+                               return false;
+                       return ds.Contains (dataMember);
 
-                       return managers.ContainsKey (entry);
                }
                #endregion      // Public Instance Methods
 
@@ -151,7 +153,8 @@ namespace System.Windows.Forms {
                                throw new ArgumentNullException ("dataSource");
                        if (listManager == null)
                                throw new ArgumentNullException ("listManager");
-                       managers.Add (CreateEntry (dataSource, String.Empty), new WeakReference (listManager));
+                       DataSourceEntry ds = GetEntry (dataSource, String.Empty, true);
+                       ds.AddMember (String.Empty, listManager);
                }
 
                protected internal void Clear ()
@@ -180,7 +183,7 @@ namespace System.Windows.Forms {
 
                protected virtual void RemoveCore (object dataSource)
                {
-                       managers.Remove (CreateEntry (dataSource, String.Empty));
+                       managers.Remove (dataSource);
                }
                #endregion      // Protected Instance Methods
 
@@ -220,10 +223,5 @@ namespace System.Windows.Forms {
                        throw new NotImplementedException();
                }
                #endregion      // IEnumerable Interfaces
-
-               private ManagerEntry CreateEntry (object dataSource, string dataMember)
-               {
-                       return new ManagerEntry (dataSource, dataMember);
-               }
        }
 }