2005-06-17 Jordi Mas i Hernandez <jordi@ximian.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / DataGridTextBoxColumn.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 //      Jordi Mas i Hernandez <jordi@ximian.com>
24 //
25 //
26
27 // NOT COMPLETE
28
29 using System.ComponentModel;
30 using System.Drawing;
31 using System.Runtime.InteropServices;
32 using System.Diagnostics;
33
34 namespace System.Windows.Forms
35 {
36         public class DataGridTextBoxColumn : DataGridColumnStyle
37         {
38                 #region Local Variables
39                 private string format;
40                 private IFormatProvider format_provider;
41                 private StringFormat string_format =  new StringFormat ();
42                 private DataGridTextBox textbox = null;
43                 #endregion      // Local Variables
44
45                 #region Constructors
46                 public DataGridTextBoxColumn ()
47                 {
48                         format = string.Empty;
49                 }
50
51                 public DataGridTextBoxColumn (PropertyDescriptor prop) : base (prop)
52                 {
53                         format = string.Empty;
54                 }
55                 
56                 public DataGridTextBoxColumn (PropertyDescriptor prop,  bool isDefault) : base (prop)
57                 {
58                         format = string.Empty;
59                         is_default = isDefault;
60                 }
61
62                 public DataGridTextBoxColumn (PropertyDescriptor prop,  string format) : base (prop)
63                 {
64                         this.format = format;
65                 }
66                 
67                 public DataGridTextBoxColumn (PropertyDescriptor prop,  string format, bool isDefault) : base (prop)
68                 {
69                         this.format = format;
70                         is_default = isDefault;
71                 }
72
73                 #endregion
74
75                 #region Public Instance Properties
76                 [Editor("System.Windows.Forms.Design.DataGridColumnStyleFormatEditor, " + Consts.AssemblySystem_Design, typeof(System.Drawing.Design.UITypeEditor))]
77                 public string Format {
78                         get {
79                                 return format;
80                         }
81                         set {
82                                 if (value != format) {
83                                         format = value;
84                                 }
85                         }
86                 }
87
88                 [Browsable(false)]
89                 [EditorBrowsable(EditorBrowsableState.Advanced)]
90                 public IFormatProvider FormatInfo {
91                         get {
92                                 return format_provider;
93                         }
94                         set {
95                                 if (value != format_provider) {
96                                         format_provider = value;
97                                 }
98                         }
99                 }
100
101                 [DefaultValue(null)]
102                 public PropertyDescriptor PropertyDescriptor {
103                         set {
104                                 base.PropertyDescriptor = value;
105                         }
106                 }
107
108                 public override bool ReadOnly {
109                         get {
110                                 return base.ReadOnly;
111                         }
112                         set {
113                                 base.ReadOnly = value;
114                         }
115                 }
116                 
117                 [Browsable(false)]
118                 public virtual TextBox TextBox {
119                         get {
120                                 return textbox;
121                         }
122                 }
123                 #endregion      // Public Instance Properties
124
125                 #region Public Instance Methods
126
127
128                 protected internal override void Abort (int rowNum)
129                 {
130                         EndEdit ();                     
131                 }
132                 
133                 protected internal override bool Commit (CurrencyManager dataSource, int rowNum)
134                 {
135                         string text;
136                         
137                         if (textbox.Text == NullText) {
138                                 text = string.Empty;
139                         } else {
140                                 text = textbox.Text;
141                         }
142                         
143                         try {
144                                 SetColumnValueAtRow (dataSource, rowNum, text);
145                         }
146                         
147                         catch (Exception e) {
148                                 string message = "The data entered in column ["+ MappingName +"] has an invalid format.";
149                                 MessageBox.Show( message);
150                         }
151                         
152                         
153                         EndEdit ();                     
154                         return true;
155                 }
156
157                 [MonoTODO]
158                 protected internal override void ConcedeFocus ()
159                 {
160
161                 }
162
163                 protected internal override void Edit (CurrencyManager source, int rowNum,  Rectangle bounds,  bool _ro, string instantText, bool cellIsVisible)
164                 {
165                         object obj;
166                         
167                         if (textbox == null) {
168                                 textbox = new DataGridTextBox ();
169                                 textbox.SetDataGrid (DataGridTableStyle.DataGrid);
170                                 DataGridTableStyle.DataGrid.Controls.Add (textbox);
171                                 textbox.Multiline = true;
172                                 textbox.BorderStyle = BorderStyle.None;
173                         }                       
174                         
175                         textbox.TextAlign = alignment;
176                         textbox.Visible = cellIsVisible;
177                         
178                         if ((ParentReadOnly == false && ReadOnly == true) || 
179                                 (ParentReadOnly == false && _ro == true)) {
180                                 textbox.ReadOnly = true;
181                         } else {
182                                 textbox.ReadOnly = false;
183                         }                       
184
185                         textbox.Location = new Point (bounds.X, bounds.Y);
186                         textbox.Size = new Size (bounds.Width, bounds.Height);
187
188                         obj = GetColumnValueAtRow (source, rowNum);
189                         textbox.Text = GetFormattedString (obj);
190                         textbox.Focus ();
191                         textbox.SelectAll ();
192                 }
193
194                 protected void EndEdit ()
195                 {
196                         ReleaseHostedControl ();
197                         grid.Invalidate (grid.GetCurrentCellBounds ());
198                 }
199
200                 protected internal override void EnterNullValue ()
201                 {
202                         if (textbox != null) {
203                                 textbox.Text = NullText;
204                         }
205                 }
206
207                 protected internal override int GetMinimumHeight ()
208                 {
209                         return FontHeight + 3;
210                 }
211
212                 [MonoTODO]
213                 protected internal override int GetPreferredHeight (Graphics g, object value)
214                 {
215                         throw new NotImplementedException ();
216                 }
217
218                 [MonoTODO]
219                 protected internal override Size GetPreferredSize (Graphics g, object value)
220                 {
221                         throw new NotImplementedException ();
222                 }
223
224                 [MonoTODO]
225                 protected void HideEditBox ()
226                 {
227
228                 }
229
230                 protected internal override void Paint (Graphics g, Rectangle bounds, CurrencyManager source, int rowNum)
231                 {
232                         Paint (g, bounds, source, rowNum, false);
233                 }
234
235                 protected internal override void Paint (Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, bool alignToRight)
236                 {
237                         Paint (g, bounds, source, rowNum, ThemeEngine.Current.ResPool.GetSolidBrush (DataGridTableStyle.BackColor),
238                                 ThemeEngine.Current.ResPool.GetSolidBrush (DataGridTableStyle.ForeColor), alignToRight);
239                 }
240
241                 protected internal override void Paint (Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, Brush backBrush, Brush foreBrush, bool alignToRight)
242                 {
243                         object obj;
244                         obj = GetColumnValueAtRow (source, rowNum);
245
246                         PaintText (g, bounds, GetFormattedString (obj),  backBrush, foreBrush, alignToRight);
247                 }
248
249                 protected void PaintText (Graphics g, Rectangle bounds, string text, bool alignToRight)
250                 {
251                         PaintText (g, bounds, text,  ThemeEngine.Current.ResPool.GetSolidBrush (DataGridTableStyle.BackColor),
252                                 ThemeEngine.Current.ResPool.GetSolidBrush (DataGridTableStyle.ForeColor), alignToRight);
253                 }
254
255                 protected void PaintText (Graphics g, Rectangle textBounds, string text, Brush backBrush, Brush foreBrush, bool alignToRight)
256                 {
257                         if (alignToRight == true) {
258                                 string_format.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
259                         } else {
260                                 string_format.FormatFlags &= ~StringFormatFlags.DirectionRightToLeft;
261                         }
262                         
263                         switch (alignment) {
264                         case HorizontalAlignment.Center:
265                                 string_format.Alignment = StringAlignment.Center;
266                                 break;
267                         case HorizontalAlignment.Right:
268                                 string_format.Alignment = StringAlignment.Far;
269                                 break;                  
270                         default:
271                                 string_format.Alignment = StringAlignment.Near;
272                                 break;
273                         }                       
274                                         
275                         g.FillRectangle (backBrush, textBounds);
276                         
277                         if (table_style.CurrentGridLineStyle == DataGridLineStyle.Solid) {
278                                 g.DrawRectangle (ThemeEngine.Current.ResPool.GetPen (table_style.CurrentGridLineColor), textBounds);
279                         }
280                         
281                         string_format.FormatFlags |= StringFormatFlags.NoWrap;
282                         g.DrawString (text, DataGridTableStyle.DataGrid.Font, foreBrush, textBounds, string_format);
283                 }
284                 
285                 protected internal override void ReleaseHostedControl ()
286                 {                       
287                         if (textbox != null) {
288                                 DataGridTableStyle.DataGrid.Controls.Remove (textbox);
289                                 textbox.Dispose ();
290                                 textbox = null;
291                         }
292                 }
293
294                 protected override void SetDataGridInColumn (DataGrid value)
295                 {
296                         base.SetDataGridInColumn (value);
297                 }
298                 
299                 protected internal override void UpdateUI (CurrencyManager source, int rowNum, string instantText)
300                 {
301
302                 }
303
304                 #endregion      // Public Instance Methods
305
306
307                 #region Private Instance Methods
308
309                 // We use DataGridTextBox to render everything that DataGridBoolColumn does not
310                 internal static bool CanRenderType (Type type)
311                 {
312                         return (type != typeof (Boolean));
313                 }
314
315                 private string GetFormattedString (object obj)
316                 {
317                         if (obj == DBNull.Value) {
318                                 return NullText;
319                         }
320                         
321                         if (format != null && obj as IFormattable != null) {
322                                 return ((IFormattable)obj).ToString (format, format_provider);
323                         }
324
325                         return obj.ToString ();
326
327                 }
328                 #endregion Private Instance Methods
329         }
330 }