2008-12-08 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / PropertyManager.cs
index d8a7c99983802b1d3dbcac3465d81248c8207575..fdd6297cfdfead5232a728f8c6818a79dc2b29ce 100644 (file)
@@ -30,14 +30,20 @@ namespace System.Windows.Forms {
 
        public class PropertyManager : BindingManagerBase {
 
-               private object data_source;
-               private string property_name;
+               internal string property_name;
                private PropertyDescriptor prop_desc;
-               private bool binding_suspended;
+               private object data_source;
+               private EventDescriptor changed_event;
+               private EventHandler property_value_changed_handler;
 
                public PropertyManager() {
                }
 
+               internal PropertyManager (object data_source)
+               {
+                       SetDataSource (data_source);
+               }
+
                internal PropertyManager (object data_source, string property_name)
                {
                        this.property_name = property_name;
@@ -47,21 +53,32 @@ namespace System.Windows.Forms {
 
                internal void SetDataSource (object new_data_source)
                {
-                       if (prop_desc != null)
-                               prop_desc.RemoveValueChanged (data_source, new EventHandler (PropertyChangedHandler));
+                       if (changed_event != null)
+                               changed_event.RemoveEventHandler (data_source, property_value_changed_handler);
 
                        data_source = new_data_source;
 
-                       prop_desc = TypeDescriptor.GetProperties (data_source).Find (property_name, true);
+                       if (property_name != null) {
+                               prop_desc = TypeDescriptor.GetProperties (data_source).Find (property_name, true);
 
-                       if (prop_desc == null)
-                               return;
+                               if (prop_desc == null)
+                                       return;
+
+                               changed_event = TypeDescriptor.GetEvents (data_source).Find (property_name + "Changed", false);
+                               if (changed_event != null) {
+                                       property_value_changed_handler = new EventHandler (PropertyValueChanged);
+                                       changed_event.AddEventHandler (data_source, property_value_changed_handler);
+                               }
+                       }
+               }
 
-                       prop_desc.AddValueChanged (data_source, new EventHandler (PropertyChangedHandler));
+               void PropertyValueChanged (object sender, EventArgs args)
+               {
+                       OnCurrentChanged (args);
                }
 
                public override object Current {
-                       get { return prop_desc == null ? null : prop_desc.GetValue (data_source); }
+                       get { return prop_desc == null ? data_source : prop_desc.GetValue (data_source); }
                }
 
                public override int Position {
@@ -98,31 +115,37 @@ namespace System.Windows.Forms {
                        editable.EndEdit ();
                }
 
+#if NET_2_0
+               // Hide this method from the 2.0 public API
+               internal override PropertyDescriptorCollection GetItemPropertiesInternal ()
+               {
+                       return TypeDescriptor.GetProperties (data_source);
+               }
+#else
                public override PropertyDescriptorCollection GetItemProperties ()
                {
                        return TypeDescriptor.GetProperties (data_source);
                }
+#endif
 
-               public override void RemoveAt (int idx)
+               public override void RemoveAt (int index)
                {
                        throw new NotSupportedException ("RemoveAt is not supported for property to property binding");
                }
 
                public override void ResumeBinding ()
                {
-                       binding_suspended = false;
                }
 
                public override void SuspendBinding ()
                {
-                       binding_suspended = true;
                }
 
                 internal override bool IsSuspended {
-                        get { return binding_suspended; }
+                        get { return data_source == null; }
                 }
 
-               protected internal override string GetListName (ArrayList list)
+               protected internal override string GetListName (ArrayList listAccessors)
                {
                        return String.Empty;
                }
@@ -132,19 +155,21 @@ namespace System.Windows.Forms {
                {
                }
 
-               protected internal override void OnCurrentChanged (EventArgs e)
+               protected internal override void OnCurrentChanged (EventArgs ea)
                {
-                       PullData ();
+                       PushData ();
 
                        if (onCurrentChangedHandler != null) {
-                               onCurrentChangedHandler (this, e);
+                               onCurrentChangedHandler (this, ea);
                        }
                }
 
-               private void PropertyChangedHandler (object sender, EventArgs e)
+#if NET_2_0
+               protected override void OnCurrentItemChanged (EventArgs ea)
                {
-                       OnCurrentChanged (EventArgs.Empty);
+                       throw new NotImplementedException ();
                }
+#endif
        }
 }