2008-12-08 Carlos Alberto Cortez <calberto.cortez@gmail.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / BindingManagerBase.cs
index 2af00a0c80d948bb141ca9b35f03348b369e33a1..663818fc3e2741d6b23accde03d871039e2f8076 100644 (file)
 using System.ComponentModel;
 using System.Collections;
 
-namespace System.Windows.Forms {
-       public abstract class BindingManagerBase {
+namespace System.Windows.Forms
+{
+       public abstract class BindingManagerBase
+       {
                private BindingsCollection      bindings;
-               private bool pulling_data;
+               internal bool transfering_data; /* true if we're pushing or pulling data */
 
-               private static int count = 0;
-               private int id = count++;
-
-#region Public Constructors
-               public BindingManagerBase() {
+               #region Public Constructors
+               public BindingManagerBase()
+               {
                }
                #endregion      // Public Constructors
 
                #region Protected Instance Fields
                protected EventHandler onCurrentChangedHandler;
                protected EventHandler onPositionChangedHandler;
+#if NET_2_0
+               internal EventHandler onCurrentItemChangedHandler;
+#endif
                #endregion      // Protected Instance Fields
 
                #region Public Instance Properties
@@ -66,6 +69,14 @@ namespace System.Windows.Forms {
                        get;
                }
 
+#if NET_2_0
+               public bool IsBindingSuspended {
+                       get {
+                               return IsSuspended;
+                       }
+               }
+#endif
+
                public abstract int Position {
                        get; set;
                }
@@ -78,7 +89,19 @@ namespace System.Windows.Forms {
 
                public abstract void EndCurrentEdit();
 
+#if NET_2_0
+               public virtual PropertyDescriptorCollection GetItemProperties()
+               {
+                       return GetItemPropertiesInternal ();
+               }
+               
+               internal virtual PropertyDescriptorCollection GetItemPropertiesInternal ()
+               {
+                       throw new NotImplementedException ();
+               }
+#else
                public abstract PropertyDescriptorCollection GetItemProperties();
+#endif
 
                public abstract void RemoveAt(int index);
 
@@ -87,42 +110,75 @@ namespace System.Windows.Forms {
                public abstract void SuspendBinding();
                #endregion      // Public Instance Methods
 
+               internal virtual bool IsSuspended {
+                       get {
+                               return false;
+                       }
+               }
+
                #region Protected Instance Methods
                [MonoTODO]
-               protected internal virtual PropertyDescriptorCollection GetItemProperties(System.Collections.ArrayList dataSources, System.Collections.ArrayList listAccessors) {
+               protected internal virtual PropertyDescriptorCollection GetItemProperties (ArrayList dataSources, ArrayList listAccessors)
+               {
                        throw new NotImplementedException();
                }
 
                [MonoTODO]
-               protected virtual PropertyDescriptorCollection GetItemProperties(Type lisType, int offset, System.Collections.ArrayList dataSources, System.Collections.ArrayList listAccessors) {
+               protected virtual PropertyDescriptorCollection GetItemProperties (Type listType, int offset, ArrayList dataSources, ArrayList listAccessors)
+               {
                        throw new NotImplementedException();
                }
 
-               protected internal abstract string GetListName (System.Collections.ArrayList listAccessors);
+               protected internal abstract string GetListName (ArrayList listAccessors);
 
                protected internal abstract void OnCurrentChanged (EventArgs e);
 
                protected void PullData()
                {
-                       pulling_data = true;
                        try {
-                               UpdateIsBinding ();
-                               foreach (Binding binding in Bindings)
+                               if (!transfering_data) {
+                                       transfering_data = true;
+                                       UpdateIsBinding ();
+                               }
+                               foreach (Binding binding in Bindings) {
                                        binding.PullData ();
+                               }
                        } finally {
-                               pulling_data = false;
+                               transfering_data = false;
                        }
                }
 
                protected void PushData()
                {
-                       if (pulling_data)
-                               return;
+                       try {
+                               if (!transfering_data) {
+                                       transfering_data = true;
+                                       UpdateIsBinding ();
+                               }
+                               foreach (Binding binding in Bindings) {
+                                       binding.PushData ();
+                               }
+                       } finally {
+                               transfering_data = false;
+                       }
+               }
+
+
+#if NET_2_0
+               protected void OnBindingComplete (BindingCompleteEventArgs args)
+               {
+                       if (BindingComplete != null)
+                               BindingComplete (this, args);
+               }
+
+               protected abstract void OnCurrentItemChanged (EventArgs e);
 
-                       UpdateIsBinding ();
-                       foreach (Binding binding in Bindings)
-                               binding.PushData ();
+               protected void OnDataError (Exception e)
+               {
+                       if (DataError != null)
+                               DataError (this, new BindingManagerDataErrorEventArgs (e));
                }
+#endif
 
                protected abstract void UpdateIsBinding();
                #endregion      // Protected Instance Methods
@@ -135,8 +191,25 @@ namespace System.Windows.Forms {
                }
 
                #region Events
-               public event EventHandler CurrentChanged;
-               public event EventHandler PositionChanged;
+               public event EventHandler CurrentChanged {
+                       add { onCurrentChangedHandler += value; }
+                       remove { onCurrentChangedHandler -= value; }
+               }
+
+               public event EventHandler PositionChanged {
+                       add { onPositionChangedHandler += value; }
+                       remove { onPositionChangedHandler -= value; }
+               }
+
+#if NET_2_0
+               public event EventHandler CurrentItemChanged {
+                       add { onCurrentItemChangedHandler += value; }
+                       remove { onCurrentItemChangedHandler -= value; }
+               }
+
+               public event BindingCompleteEventHandler BindingComplete;
+               public event BindingManagerDataErrorEventHandler DataError;
+#endif
                #endregion      // Events
        }
 }