2002-11-11 Tim Coleman <tim@timcoleman.com>
[mono.git] / mcs / class / System.Data / System.Data.Common / DataColumnMappingCollection.cs
1 //
2 // System.Data.Common.DataColumnMappingCollection
3 //
4 // Authors:
5 //   Rodrigo Moya (rodrigo@ximian.com)
6 //   Tim Coleman (tim@timcoleman.com)
7 //
8 // (C) Ximian, Inc
9 // Copyright (C) Tim Coleman, 2002
10 //
11
12 using System;
13 using System.Collections;
14 using System.ComponentModel;
15 using System.Data;
16
17 namespace System.Data.Common {
18         public sealed class DataColumnMappingCollection : MarshalByRefObject, IColumnMappingCollection , IList, ICollection, IEnumerable
19         {
20                 #region Fields
21
22                 ArrayList list;
23                 Hashtable sourceColumns;
24                 Hashtable dataSetColumns;
25
26                 #endregion // Fields
27
28                 #region Constructors 
29
30                 public DataColumnMappingCollection () 
31                 {
32                         list = new ArrayList ();
33                         sourceColumns = new Hashtable ();
34                         dataSetColumns = new Hashtable ();
35                 }
36
37                 #endregion // Constructors
38
39                 #region Properties
40
41                 [Browsable (false)]
42                 [DataSysDescription ("The number of items in the collection")]
43                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
44                 public int Count {
45                         get { return list.Count; }
46                 }
47
48                 [Browsable (false)]
49                 [DataSysDescription ("The specified DataColumnMapping object.")]
50                 public DataColumnMapping this [int index] {
51                         get { return (DataColumnMapping)(list[index]); }
52                         set { 
53                                 DataColumnMapping mapping = (DataColumnMapping)(list[index]);
54                                 sourceColumns[mapping] = value;
55                                 dataSetColumns[mapping] = value;
56                                 list[index] = value;
57                         }
58                 }
59
60                 public DataColumnMapping this [string sourceColumn] {
61                         get { return (DataColumnMapping) sourceColumns[sourceColumn]; }
62                         set { this [list.IndexOf (sourceColumns[sourceColumn])] = value; }
63                 }
64
65                 object ICollection.SyncRoot {
66                         get { return list.SyncRoot; }
67                 }
68
69                 bool ICollection.IsSynchronized {
70                         get { return list.IsSynchronized; }
71                 }
72
73                 object IColumnMappingCollection.this [string sourceColumn] {
74                         get { return this [sourceColumn]; }
75                         set {
76                                 if (!(value is DataColumnMapping))
77                                         throw new ArgumentException ();
78                                 this [sourceColumn] = (DataColumnMapping) value;
79                         }
80                 }
81
82                 object IList.this [int index] {
83                         get { return this[index]; }
84                         set {
85                                 if (!(value is DataColumnMapping))
86                                         throw new ArgumentException ();
87                                 this [index] = (DataColumnMapping) value;
88                          }
89                 }
90
91                 bool IList.IsReadOnly {
92                         get { return false; }
93                 }
94
95                 bool IList.IsFixedSize {
96                         get { return false; }
97                 }
98                 
99                 #endregion // Properties
100
101                 #region Methods
102
103                 public int Add (object value)
104                 {
105                         if (!(value is DataColumnMapping))
106                                 throw new InvalidCastException ();
107
108                         list.Add (value);
109                         sourceColumns[((DataColumnMapping)value).SourceColumn] = value;
110                         dataSetColumns[((DataColumnMapping)value).DataSetColumn] = value;
111                         return list.IndexOf (value);
112                 }
113
114                 public DataColumnMapping Add (string sourceColumn, string dataSetColumn)
115                 {
116                         DataColumnMapping mapping = new DataColumnMapping (sourceColumn, dataSetColumn);
117                         Add (mapping);
118                         return mapping;
119                 }
120
121                 public void AddRange (DataColumnMapping[] values) 
122                 {
123                         foreach (DataColumnMapping mapping in values)
124                                 Add (mapping);
125                 }
126
127                 public void Clear () 
128                 {
129                         list.Clear ();
130                 }
131
132                 public bool Contains (object value) 
133                 {
134                         return (list.Contains (value));
135                 }
136
137                 public bool Contains (string value)
138                 {
139                         return (sourceColumns.Contains (value));
140                 }
141
142                 public void CopyTo (Array array, int index) 
143                 {
144                         ((DataColumn[])(list.ToArray())).CopyTo (array, index);
145                 }
146
147                 public DataColumnMapping GetByDataSetColumn (string value) 
148                 {
149                         return (DataColumnMapping)(dataSetColumns[value]);
150                 }
151
152                 [EditorBrowsable (EditorBrowsableState.Advanced)]
153                 public static DataColumnMapping GetColumnMappingBySchemaAction (DataColumnMappingCollection columnMappings, string sourceColumn, MissingMappingAction mappingAction) 
154                 {
155                         if (columnMappings.Contains (sourceColumn))
156                                 return columnMappings[sourceColumn];
157                         if (mappingAction == MissingMappingAction.Ignore)
158                                 return null;
159                         if (mappingAction == MissingMappingAction.Error)
160                                 throw new InvalidOperationException (String.Format ("Missing SourceColumn mapping for '{0}'", sourceColumn));
161                         return new DataColumnMapping (sourceColumn, sourceColumn);
162                 }
163
164                 public IEnumerator GetEnumerator ()
165                 {
166                         return list.GetEnumerator ();
167                 }
168
169                 IColumnMapping IColumnMappingCollection.Add (string sourceColumnName, string dataSetColumnName)
170                 {
171                         return Add (sourceColumnName, dataSetColumnName);
172                 }
173
174                 IColumnMapping IColumnMappingCollection.GetByDataSetColumn (string dataSetColumnName)
175                 {
176                         return GetByDataSetColumn (dataSetColumnName);
177                 }
178
179                 public int IndexOf (object value) 
180                 {
181                         return list.IndexOf (value);
182                 }
183
184                 public int IndexOf (string sourceColumn)
185                 {
186                         return list.IndexOf (sourceColumns[sourceColumn]);
187                 }
188
189                 public int IndexOfDataSetColumn (string value) 
190                 {
191                         return list.IndexOf (dataSetColumns[value]);
192                 }
193
194                 public void Insert (int index, object value) 
195                 {
196                         list.Insert (index, value);
197                         sourceColumns[((DataColumnMapping)value).SourceColumn] = value;
198                         dataSetColumns[((DataColumnMapping)value).DataSetColumn] = value;
199                 }
200
201                 public void Remove (object value) 
202                 {
203                         sourceColumns.Remove(((DataColumnMapping)value).SourceColumn);
204                         dataSetColumns.Remove(((DataColumnMapping)value).DataSetColumn);
205                         list.Remove (value);
206                 }
207
208                 public void RemoveAt (int index) 
209                 {
210                         Remove (list[index]);
211                 }
212
213                 public void RemoveAt (string sourceColumn)
214                 {
215                         RemoveAt (list.IndexOf (sourceColumns[sourceColumn]));
216                 }
217
218                 #endregion // Methods
219         }
220 }