In Test/System.Windows.Forms:
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / BindingManagerBase.cs
1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 // 
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 // 
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2004-2005 Novell, Inc.
21 //
22 // Authors:
23 //      Peter Bartok    pbartok@novell.com
24 //      Jackson Harper  jackson@ximian.com
25 //
26
27
28 // NOT COMPLETE
29
30 using System.ComponentModel;
31 using System.Collections;
32
33 namespace System.Windows.Forms {
34         public abstract class BindingManagerBase {
35                 private BindingsCollection      bindings;
36                 internal bool transfering_data; /* true if we're pushing or pulling data */
37
38                 #region Public Constructors
39                 public BindingManagerBase()
40                 {
41                 }
42                 #endregion      // Public Constructors
43
44                 #region Protected Instance Fields
45                 protected EventHandler onCurrentChangedHandler;
46                 protected EventHandler onPositionChangedHandler;
47 #if NET_2_0
48                 internal EventHandler onCurrentItemChangedHandler;
49 #endif
50                 #endregion      // Protected Instance Fields
51
52                 #region Public Instance Properties
53                 public BindingsCollection Bindings {
54                         get {
55                                 if (bindings == null) {
56                                         bindings = new BindingsCollection ();
57                                 }
58                                 return bindings;
59                         }
60                 }
61
62                 public abstract int Count {
63                         get;
64                 }
65
66                 public abstract object Current {
67                         get;
68                 }
69
70                 public abstract int Position {
71                         get; set;
72                 }
73                 #endregion      // Public Instance Properties
74
75                 #region Public Instance Methods
76                 public abstract void AddNew();
77
78                 public abstract void CancelCurrentEdit();
79
80                 public abstract void EndCurrentEdit();
81
82 #if NET_2_0
83                 public virtual PropertyDescriptorCollection GetItemProperties()
84                 {
85                         throw new NotImplementedException ();
86                 }
87 #else
88                 public abstract PropertyDescriptorCollection GetItemProperties();
89 #endif
90
91                 public abstract void RemoveAt(int index);
92
93                 public abstract void ResumeBinding();
94
95                 public abstract void SuspendBinding();
96                 #endregion      // Public Instance Methods
97
98                 internal abstract bool IsSuspended {
99                         get;
100                 }
101
102                 #region Protected Instance Methods
103                 [MonoTODO]
104                 protected internal virtual PropertyDescriptorCollection GetItemProperties(ArrayList dataSources, ArrayList listAccessors)
105                 {
106                         throw new NotImplementedException();
107                 }
108
109                 [MonoTODO]
110                 protected virtual PropertyDescriptorCollection GetItemProperties(Type lisType, int offset, ArrayList dataSources, ArrayList listAccessors)
111                 {
112                         throw new NotImplementedException();
113                 }
114
115                 protected internal abstract string GetListName (ArrayList listAccessors);
116
117                 protected internal abstract void OnCurrentChanged (EventArgs e);
118
119                 protected void PullData()
120                 {
121                         try {
122                                 if (!transfering_data) {
123                                         transfering_data = true;
124                                         UpdateIsBinding ();
125                                 }
126                                 foreach (Binding binding in Bindings) {
127                                         binding.PullData ();
128                                 }
129                         } finally {
130                                 transfering_data = false;
131                         }
132                 }
133
134                 protected void PushData()
135                 {
136                         try {
137                                 if (!transfering_data) {
138                                         transfering_data = true;
139                                         UpdateIsBinding ();
140                                 }
141                                 foreach (Binding binding in Bindings) {
142                                         binding.PushData ();
143                                 }
144                         } finally {
145                                 transfering_data = false;
146                         }
147                 }
148
149
150 #if NET_2_0
151                 protected void OnBindingComplete (BindingCompleteEventArgs e)
152                 {
153                         if (BindingComplete != null)
154                                 BindingComplete (this, e);
155                 }
156
157                 protected abstract void OnCurrentItemChanged (EventArgs e);
158
159                 protected void OnDataError (Exception e)
160                 {
161                         if (DataError != null)
162                                 DataError (this, new BindingManagerDataErrorEventArgs (e));
163                 }
164 #endif         
165
166                 protected abstract void UpdateIsBinding();
167                 #endregion      // Protected Instance Methods
168
169                 internal void AddBinding (Binding binding)
170                 {
171                         if (Bindings.Contains (binding))
172                                 return;
173                         Bindings.Add (binding);
174                 }
175
176                 #region Events
177                 public event EventHandler CurrentChanged {
178                         add { onCurrentChangedHandler += value; }
179                         remove { onCurrentChangedHandler -= value; }
180                 }
181
182                 public event EventHandler PositionChanged {
183                         add { onPositionChangedHandler += value; }
184                         remove { onPositionChangedHandler -= value; }
185                 }
186
187 #if NET_2_0
188                 public event EventHandler CurrentItemChanged {
189                         add { onCurrentItemChangedHandler += value; }
190                         remove { onCurrentItemChangedHandler -= value; }
191                 }
192
193                 public event BindingCompleteEventHandler BindingComplete;
194                 public event BindingManagerDataErrorEventHandler DataError;
195 #endif
196                 #endregion      // Events
197         }
198 }