In .:
[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 = null;
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 == true)  || 
179                                 (ParentReadOnly == false && ReadOnly == true) || 
180                                 (ParentReadOnly == false && _ro == true)) {
181                                 textbox.ReadOnly = true;
182                         } else {
183                                 textbox.ReadOnly = false;
184                         }                       
185
186                         textbox.Location = new Point (bounds.X, bounds.Y);
187                         bounds.X += 2; bounds.Y += 2;
188                         bounds.Width -= 2; bounds.Height -= 2;
189                         textbox.Size = new Size (bounds.Width, bounds.Height);
190
191                         obj = GetColumnValueAtRow (source, rowNum);
192                         textbox.Text = GetFormattedString (obj);
193                         textbox.Focus ();
194                         textbox.SelectAll ();
195                 }
196
197                 protected void EndEdit ()
198                 {
199                         ReleaseHostedControl ();
200                         grid.Invalidate (grid.GetCurrentCellBounds ());
201                 }
202
203                 protected internal override void EnterNullValue ()
204                 {
205                         if (textbox != null) {
206                                 textbox.Text = NullText;
207                         }
208                 }
209
210                 protected internal override int GetMinimumHeight ()
211                 {
212                         return FontHeight + 3;
213                 }
214
215                 [MonoTODO]
216                 protected internal override int GetPreferredHeight (Graphics g, object value)
217                 {
218                         throw new NotImplementedException ();
219                 }
220
221                 [MonoTODO]
222                 protected internal override Size GetPreferredSize (Graphics g, object value)
223                 {
224                         throw new NotImplementedException ();
225                 }
226
227                 [MonoTODO]
228                 protected void HideEditBox ()
229                 {
230
231                 }
232
233                 protected internal override void Paint (Graphics g, Rectangle bounds, CurrencyManager source, int rowNum)
234                 {
235                         Paint (g, bounds, source, rowNum, false);
236                 }
237
238                 protected internal override void Paint (Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, bool alignToRight)
239                 {
240                         Paint (g, bounds, source, rowNum, ThemeEngine.Current.ResPool.GetSolidBrush (DataGridTableStyle.BackColor),
241                                 ThemeEngine.Current.ResPool.GetSolidBrush (DataGridTableStyle.ForeColor), alignToRight);
242                 }
243
244                 protected internal override void Paint (Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, Brush backBrush, Brush foreBrush, bool alignToRight)
245                 {
246                         object obj;
247                         obj = GetColumnValueAtRow (source, rowNum);
248
249                         PaintText (g, bounds, GetFormattedString (obj),  backBrush, foreBrush, alignToRight);
250                 }
251
252                 protected void PaintText (Graphics g, Rectangle bounds, string text, bool alignToRight)
253                 {
254                         PaintText (g, bounds, text,  ThemeEngine.Current.ResPool.GetSolidBrush (DataGridTableStyle.BackColor),
255                                 ThemeEngine.Current.ResPool.GetSolidBrush (DataGridTableStyle.ForeColor), alignToRight);
256                 }
257
258                 protected void PaintText (Graphics g, Rectangle textBounds, string text, Brush backBrush, Brush foreBrush, bool alignToRight)
259                 {
260                         if (alignToRight == true) {
261                                 string_format.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
262                         } else {
263                                 string_format.FormatFlags &= ~StringFormatFlags.DirectionRightToLeft;
264                         }
265                         
266                         switch (alignment) {
267                         case HorizontalAlignment.Center:
268                                 string_format.Alignment = StringAlignment.Center;
269                                 break;
270                         case HorizontalAlignment.Right:
271                                 string_format.Alignment = StringAlignment.Far;
272                                 break;                  
273                         default:
274                                 string_format.Alignment = StringAlignment.Near;
275                                 break;
276                         }                       
277                                         
278                         g.FillRectangle (backBrush, textBounds);                        
279                         
280                         string_format.FormatFlags |= StringFormatFlags.NoWrap;
281                         g.DrawString (text, DataGridTableStyle.DataGrid.Font, foreBrush, textBounds, string_format);
282                         PaintGridLine (g, textBounds);
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 }