Fix bug #395
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / DataGridViewComboBoxColumn.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) 2005 Novell, Inc. (http://www.novell.com)
21 //
22 // Author:
23 //      Pedro Martínez Juliá <pedromj@gmail.com>
24 //
25
26 using System.Collections;
27 using System.ComponentModel;
28 using System.Drawing.Design;
29 using System.Drawing;
30
31 namespace System.Windows.Forms {
32
33         [ToolboxBitmap ("")]
34         [Designer ("System.Windows.Forms.Design.DataGridViewComboBoxColumnDesigner, " + Consts.AssemblySystem_Design,
35                    "System.ComponentModel.Design.IDesigner")]
36         public class DataGridViewComboBoxColumn : DataGridViewColumn
37         {
38                 private bool autoComplete;
39                 private DataGridViewComboBoxDisplayStyle displayStyle;
40                 private bool displayStyleForCurrentCellOnly;
41                 private FlatStyle flatStyle;
42
43                 public DataGridViewComboBoxColumn ()
44                 {
45                         CellTemplate = new DataGridViewComboBoxCell();
46                         ((DataGridViewComboBoxCell) CellTemplate).OwningColumnTemplate = this;
47                         SortMode = DataGridViewColumnSortMode.NotSortable;
48                         autoComplete = true;
49                         displayStyle = DataGridViewComboBoxDisplayStyle.DropDownButton;
50                         displayStyleForCurrentCellOnly = false;
51                 }
52
53                 [Browsable (true)]
54                 [DefaultValue (true)]
55                 public bool AutoComplete {
56                         get { return autoComplete; }
57                         set { autoComplete = value; }
58                 }
59
60                 [Browsable (false)]
61                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
62                 public override DataGridViewCell CellTemplate {
63                         get { return base.CellTemplate; }
64                         set {
65
66                                 DataGridViewComboBoxCell cellTemplate = value as DataGridViewComboBoxCell;
67                                 if (cellTemplate == null)
68                                         throw new InvalidCastException ("Invalid cell tempalte type.");
69
70                                 cellTemplate.OwningColumnTemplate = this;
71                                 base.CellTemplate = cellTemplate;
72                         }
73                 }
74
75                 [AttributeProvider (typeof (IListSource))]
76                 [DefaultValue (null)]
77                 [RefreshProperties (RefreshProperties.Repaint)]
78                 public object DataSource {
79                         get {
80                                 if (base.CellTemplate == null) {
81                                         throw new InvalidOperationException("CellTemplate is null.");
82                                 }
83                                 return (base.CellTemplate as DataGridViewComboBoxCell).DataSource; }
84                         set {
85                                 if (base.CellTemplate == null) {
86                                         throw new InvalidOperationException("CellTemplate is null.");
87                                 }
88                                 (base.CellTemplate as DataGridViewComboBoxCell).DataSource = value;
89                         }
90                 }
91
92                 [Editor ("System.Windows.Forms.Design.DataMemberFieldEditor, " + Consts.AssemblySystem_Design,
93                          "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
94                 [DefaultValue ("")]
95                 [TypeConverter ("System.Windows.Forms.Design.DataMemberFieldConverter, " + Consts.AssemblySystem_Design)]
96                 public string DisplayMember {
97                         get {
98                                 if (base.CellTemplate == null) {
99                                         throw new InvalidOperationException("CellTemplate is null.");
100                                 }
101                                 return (base.CellTemplate as DataGridViewComboBoxCell).DisplayMember;
102                         }
103                         set {
104                                 if (base.CellTemplate == null) {
105                                         throw new InvalidOperationException("CellTemplate is null.");
106                                 }
107                                 (base.CellTemplate as DataGridViewComboBoxCell).DisplayMember = value;
108                         }
109                 }
110
111                 [DefaultValue (DataGridViewComboBoxDisplayStyle.DropDownButton)]
112                 public DataGridViewComboBoxDisplayStyle DisplayStyle {
113                         get { return displayStyle; }
114                         set { displayStyle = value; }
115                 }
116
117                 [DefaultValue (false)]
118                 public bool DisplayStyleForCurrentCellOnly {
119                         get { return displayStyleForCurrentCellOnly; }
120                         set { displayStyleForCurrentCellOnly = value; }
121                 }
122
123                 [DefaultValue (1)]
124                 public int DropDownWidth {
125                         get {
126                                 if (base.CellTemplate == null) {
127                                         throw new InvalidOperationException("CellTemplate is null.");
128                                 }
129                                 return (base.CellTemplate as DataGridViewComboBoxCell).DropDownWidth;
130                         }
131                         set {
132                                 if (value < 1) {
133                                         throw new ArgumentException("Value is less than 1.");
134                                 }
135                                 if (base.CellTemplate == null) {
136                                         throw new InvalidOperationException("CellTemplate is null.");
137                                 }
138                                 (base.CellTemplate as DataGridViewComboBoxCell).DropDownWidth = value;
139                         }
140                 }
141
142                 [DefaultValue (FlatStyle.Standard)]
143                 public FlatStyle FlatStyle {
144                         get { return flatStyle; }
145                         set { flatStyle = value; }
146                 }
147
148                 [Editor ("System.Windows.Forms.Design.StringCollectionEditor, " + Consts.AssemblySystem_Design,
149                          "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
150                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
151                 public DataGridViewComboBoxCell.ObjectCollection Items {
152                         get {
153                                 if (base.CellTemplate == null) {
154                                         throw new InvalidOperationException("CellTemplate is null.");
155                                 }
156                                 return (base.CellTemplate as DataGridViewComboBoxCell).Items;
157                         }
158                 }
159
160                 [DefaultValue (8)]
161                 public int MaxDropDownItems {
162                         get {
163                                 if (base.CellTemplate == null) {
164                                         throw new InvalidOperationException("CellTemplate is null.");
165                                 }
166                                 return (base.CellTemplate as DataGridViewComboBoxCell).MaxDropDownItems;
167                         }
168                         set {
169                                 if (base.CellTemplate == null) {
170                                         throw new InvalidOperationException("CellTemplate is null.");
171                                 }
172                                 (base.CellTemplate as DataGridViewComboBoxCell).MaxDropDownItems = value;
173                         }
174                 }
175
176                 [DefaultValue (false)]
177                 public bool Sorted {
178                         get {
179                                 if (base.CellTemplate == null) {
180                                         throw new InvalidOperationException("CellTemplate is null.");
181                                 }
182                                 return (base.CellTemplate as DataGridViewComboBoxCell).Sorted;
183                         }
184                         set {
185                                 if (base.CellTemplate == null) {
186                                         throw new InvalidOperationException("CellTemplate is null.");
187                                 }
188                                 (base.CellTemplate as DataGridViewComboBoxCell).Sorted = value;
189                         }
190                 }
191
192                 [DefaultValue ("")]
193                 [Editor ("System.Windows.Forms.Design.DataMemberFieldEditor, " + Consts.AssemblySystem_Design,
194                          "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
195                 [TypeConverter ("System.Windows.Forms.Design.DataMemberFieldConverter, " + Consts.AssemblySystem_Design)]
196                 public string ValueMember {
197                         get {
198                                 if (base.CellTemplate == null) {
199                                         throw new InvalidOperationException("CellTemplate is null.");
200                                 }
201                                 return (base.CellTemplate as DataGridViewComboBoxCell).ValueMember;
202                         }
203                         set {
204                                 if (base.CellTemplate == null) {
205                                         throw new InvalidOperationException("CellTemplate is null.");
206                                 }
207                                 (base.CellTemplate as DataGridViewComboBoxCell).ValueMember = value;
208                         }
209                 }
210
211                 internal void SyncItems (IList items)
212                 {
213                         if (DataSource != null || DataGridView == null)
214                                 return;
215
216                         for (int i = 0; i < DataGridView.RowCount; i++) {
217                                 DataGridViewComboBoxCell comboCell = DataGridView.Rows[i].Cells[base.Index] as DataGridViewComboBoxCell;
218                                 if (comboCell != null) {
219                                         comboCell.Items.ClearInternal ();
220                                         comboCell.Items.AddRangeInternal (this.Items);
221                                 }
222                         }
223                 }
224
225                 public override object Clone ()
226                 {
227                         DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn) base.Clone();
228                         col.autoComplete = this.autoComplete;
229                         col.displayStyle = this.displayStyle;
230                         col.displayStyleForCurrentCellOnly = this.displayStyleForCurrentCellOnly;
231                         col.flatStyle = this.flatStyle;
232                         col.CellTemplate = (DataGridViewComboBoxCell) this.CellTemplate.Clone();
233                         return col;
234                 }
235
236                 public override string ToString ()
237                 {
238                         return GetType().Name;
239                 }
240
241         }
242
243 }