X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FManaged.Windows.Forms%2FSystem.Windows.Forms%2FBindingContext.cs;h=234de4104ce077b4112d14ab041e2942bc97b9a6;hb=e4a4fc5f3d514781285d6e4d069e543c8163e2db;hp=b0205d80c6d52e93cc42118ecdc91e244a2655f1;hpb=981978899152306efda9bb51636ec7519c5b81f1;p=mono.git diff --git a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/BindingContext.cs b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/BindingContext.cs index b0205d80c6d..234de4104ce 100644 --- a/mcs/class/Managed.Windows.Forms/System.Windows.Forms/BindingContext.cs +++ b/mcs/class/Managed.Windows.Forms/System.Windows.Forms/BindingContext.cs @@ -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); - } } }