2008-12-08 Carlos Alberto Cortez <calberto.cortez@gmail.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / BindingManagerBase.cs
index 34dd1c1d134fd72af048956a8131ceb0e9d234cd..663818fc3e2741d6b23accde03d871039e2f8076 100644 (file)
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-// Copyright (c) 2004 Novell, Inc.
+// Copyright (c) 2004-2005 Novell, Inc.
 //
 // Authors:
 //     Peter Bartok    pbartok@novell.com
+//     Jackson Harper  jackson@ximian.com
 //
 
 
 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;
+               internal bool transfering_data; /* true if we're pushing or pulling data */
 
                #region Public Constructors
-               public BindingManagerBase() {
+               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
                public BindingsCollection Bindings {
                        get {
-                               if (this.bindings==null) {
-                                       this.bindings=new BindingsCollection();
+                               if (bindings == null) {
+                                       bindings = new BindingsCollection ();
                                }
-                               return this.bindings;
+                               return bindings;
                        }
                }
 
@@ -61,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;
                }
@@ -73,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);
 
@@ -82,37 +110,106 @@ 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 internal abstract void OnCurrentChanged (EventArgs e);
 
-               [MonoTODO]
-               protected void PullData() {
-                       throw new NotImplementedException();
+               protected void PullData()
+               {
+                       try {
+                               if (!transfering_data) {
+                                       transfering_data = true;
+                                       UpdateIsBinding ();
+                               }
+                               foreach (Binding binding in Bindings) {
+                                       binding.PullData ();
+                               }
+                       } finally {
+                               transfering_data = false;
+                       }
                }
 
-               [MonoTODO]
-               protected void PushData() {
-                       throw new NotImplementedException();
+               protected void PushData()
+               {
+                       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);
+
+               protected void OnDataError (Exception e)
+               {
+                       if (DataError != null)
+                               DataError (this, new BindingManagerDataErrorEventArgs (e));
                }
+#endif
 
                protected abstract void UpdateIsBinding();
                #endregion      // Protected Instance Methods
 
+               internal void AddBinding (Binding binding)
+               {
+                       if (Bindings.Contains (binding))
+                               return;
+                       Bindings.Add (binding);
+               }
+
                #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
        }
 }