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:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
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.
20 // Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
23 // Jordi Mas i Hernandez <jordi@ximian.com>
30 using System.ComponentModel;
31 using System.Runtime.InteropServices;
32 using System.Diagnostics;
34 namespace System.Windows.Forms
36 [DesignTimeVisible(false)]
37 [DefaultProperty("Header")]
39 public abstract class DataGridColumnStyle : Component, IDataGridColumnStyleEditingNotificationService
42 protected class DataGridColumnHeaderAccessibleObject : AccessibleObject
44 #region Local Variables
45 private new DataGridColumnStyle owner;
49 public DataGridColumnHeaderAccessibleObject (DataGridColumnStyle columnstyle)
53 #endregion //Constructors
55 #region Public Instance Properties
57 public override Rectangle Bounds {
59 throw new NotImplementedException ();
63 public override string Name {
65 throw new NotImplementedException ();
69 protected DataGridColumnStyle Owner {
73 public override AccessibleObject Parent {
75 throw new NotImplementedException ();
79 public override AccessibleRole Role {
81 throw new NotImplementedException ();
86 #region Public Instance Methods
88 public override AccessibleObject Navigate (AccessibleNavigation navdir)
90 throw new NotImplementedException ();
92 #endregion Public Instance Methods
95 protected class CompModSwitches
97 public CompModSwitches ()
101 #region Public Instance Methods
103 public static TraceSwitch DGEditColumnEditing {
105 throw new NotImplementedException ();
108 #endregion Public Instance Methods
111 internal enum ArrowDrawing
118 #region Local Variables
119 internal HorizontalAlignment alignment;
120 private int fontheight;
121 internal DataGridTableStyle table_style;
122 private string header_text;
123 private string mapping_name;
124 private string null_text;
125 private PropertyDescriptor property_descriptor;
126 private bool _readonly;
128 internal bool is_default;
129 internal DataGrid grid;
130 private DataGridColumnHeaderAccessibleObject accesible_object;
131 private StringFormat string_format_hdr;
132 static string def_null_text = "(null)";
133 private ArrowDrawing arrow_drawing = ArrowDrawing.No;
135 #endregion // Local Variables
138 public DataGridColumnStyle () : this (null)
142 public DataGridColumnStyle (PropertyDescriptor prop)
144 property_descriptor = prop;
148 header_text = string.Empty;
149 mapping_name = string.Empty;
150 null_text = def_null_text;
151 accesible_object = new DataGridColumnHeaderAccessibleObject (this);
152 _readonly = prop == null ? false : prop.IsReadOnly;
156 alignment = HorizontalAlignment.Left;
157 string_format_hdr = new StringFormat ();
158 string_format_hdr.FormatFlags |= StringFormatFlags.NoWrap;
159 string_format_hdr.LineAlignment = StringAlignment.Center;
164 #region Public Instance Properties
166 [DefaultValue(HorizontalAlignment.Left)]
167 public virtual HorizontalAlignment Alignment {
172 if (value != alignment) {
175 if (table_style != null && table_style.DataGrid != null) {
176 table_style.DataGrid.Invalidate ();
179 EventHandler eh = (EventHandler)(Events [AlignmentChangedEvent]);
181 eh (this, EventArgs.Empty);
187 public virtual DataGridTableStyle DataGridTableStyle {
188 get { return table_style; }
191 protected int FontHeight {
193 if (fontheight != -1) {
197 if (table_style != null) {
198 //return table_style.DataGrid.FontHeight
202 // TODO: Default Datagrid font height
208 public AccessibleObject HeaderAccessibleObject {
210 return accesible_object;
215 public virtual string HeaderText {
220 if (value != header_text) {
225 EventHandler eh = (EventHandler)(Events [HeaderTextChangedEvent]);
227 eh (this, EventArgs.Empty);
232 [Editor("System.Windows.Forms.Design.DataGridColumnStyleMappingNameEditor, " + Consts.AssemblySystem_Design, typeof(System.Drawing.Design.UITypeEditor))]
237 public string MappingName {
242 if (value != mapping_name) {
243 mapping_name = value;
245 EventHandler eh = (EventHandler)(Events [MappingNameChangedEvent]);
247 eh (this, EventArgs.Empty);
253 public virtual string NullText {
258 if (value != null_text) {
261 if (table_style != null && table_style.DataGrid != null) {
262 table_style.DataGrid.Invalidate ();
265 EventHandler eh = (EventHandler)(Events [NullTextChangedEvent]);
267 eh (this, EventArgs.Empty);
274 [EditorBrowsable(EditorBrowsableState.Advanced)]
275 public virtual PropertyDescriptor PropertyDescriptor {
277 return property_descriptor;
280 if (value != property_descriptor) {
281 property_descriptor = value;
283 EventHandler eh = (EventHandler)(Events [PropertyDescriptorChangedEvent]);
285 eh (this, EventArgs.Empty);
290 [DefaultValue(false)]
291 public virtual bool ReadOnly {
296 if (value != _readonly) {
299 if (table_style != null && table_style.DataGrid != null) {
300 table_style.DataGrid.CalcAreasAndInvalidate ();
303 EventHandler eh = (EventHandler)(Events [ReadOnlyChangedEvent]);
305 eh (this, EventArgs.Empty);
312 public virtual int Width {
317 if (value != width) {
320 if (table_style != null && table_style.DataGrid != null) {
321 table_style.DataGrid.CalcAreasAndInvalidate ();
324 EventHandler eh = (EventHandler)(Events [WidthChangedEvent]);
326 eh (this, EventArgs.Empty);
331 #endregion // Public Instance Properties
333 #region Private Instance Properties
335 internal ArrowDrawing ArrowDrawingMode {
336 get { return arrow_drawing; }
337 set { arrow_drawing = value; }
340 internal bool TableStyleReadOnly {
342 return table_style != null && table_style.ReadOnly;
346 internal DataGridTableStyle TableStyle {
347 set { table_style = value; }
350 internal bool IsDefault {
351 get { return is_default; }
353 #endregion Private Instance Properties
355 #region Public Instance Methods
356 protected internal abstract void Abort (int rowNum);
359 protected void BeginUpdate ()
364 protected void CheckValidDataSource (CurrencyManager value)
367 throw new ArgumentNullException ("CurrencyManager cannot be null");
370 if (property_descriptor == null) {
371 PropertyDescriptorCollection propcol = value.GetItemProperties ();
373 for (int i = 0; i < propcol.Count ; i++) {
374 if (propcol[i].Name == mapping_name) {
375 property_descriptor = propcol[i];
380 if (property_descriptor == null)
381 throw new InvalidOperationException ("The PropertyDescriptor for this column is a null reference");
386 protected internal virtual void ColumnStartedEditing (Control editingControl)
391 protected internal abstract bool Commit (CurrencyManager dataSource, int rowNum);
394 protected internal virtual void ConcedeFocus ()
399 protected virtual AccessibleObject CreateHeaderAccessibleObject ()
401 return new DataGridColumnHeaderAccessibleObject (this);
404 protected internal virtual void Edit (CurrencyManager source, int rowNum, Rectangle bounds, bool readOnly)
406 Edit (source, rowNum, bounds, readOnly, string.Empty);
409 protected internal virtual void Edit (CurrencyManager source, int rowNum, Rectangle bounds, bool readOnly, string instantText)
411 Edit (source, rowNum, bounds, readOnly, instantText, true);
414 protected internal abstract void Edit (CurrencyManager source, int rowNum, Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible);
418 protected void EndUpdate ()
423 protected internal virtual void EnterNullValue () {}
425 protected internal virtual object GetColumnValueAtRow (CurrencyManager source, int rowNum)
427 CheckValidDataSource (source);
428 if (rowNum >= source.Count)
430 return property_descriptor.GetValue (source [rowNum]);
433 protected internal abstract int GetMinimumHeight ();
435 protected internal abstract int GetPreferredHeight (Graphics g, object value);
437 protected internal abstract Size GetPreferredSize (Graphics g, object value);
439 void IDataGridColumnStyleEditingNotificationService.ColumnStartedEditing (Control editingControl)
441 ColumnStartedEditing (editingControl);
444 protected virtual void Invalidate ()
447 grid.InvalidateColumn (this);
450 protected internal abstract void Paint (Graphics g, Rectangle bounds, CurrencyManager source, int rowNum);
451 protected internal abstract void Paint (Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, bool alignToRight);
453 protected internal virtual void Paint (Graphics g, Rectangle bounds, CurrencyManager source, int rowNum,
454 Brush backBrush, Brush foreBrush, bool alignToRight) {}
456 protected internal virtual void ReleaseHostedControl () {}
458 public void ResetHeaderText ()
460 HeaderText = string.Empty;
463 protected internal virtual void SetColumnValueAtRow (CurrencyManager source, int rowNum, object value)
465 CheckValidDataSource (source);
467 IEditableObject editable = source [rowNum] as IEditableObject;
469 if (editable != null)
470 editable.BeginEdit ();
472 property_descriptor.SetValue (source [rowNum], value);
474 if (editable != null)
478 protected virtual void SetDataGrid (DataGrid value)
482 property_descriptor = null;
484 if (value != null && value.ListManager != null)
485 CheckValidDataSource (value.ListManager);
488 protected virtual void SetDataGridInColumn (DataGrid value)
493 internal void SetDataGridInternal (DataGrid value)
495 SetDataGridInColumn (value);
498 protected internal virtual void UpdateUI (CurrencyManager source, int rowNum, string instantText)
502 #endregion // Public Instance Methods
504 #region Private Instance Methods
505 virtual internal void OnMouseDown (MouseEventArgs e, int row, int column) {}
506 virtual internal void OnKeyDown (KeyEventArgs ke, int row, int column) {}
508 internal void PaintHeader (Graphics g, Rectangle bounds, int colNum)
511 g.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (DataGridTableStyle.CurrentHeaderBackColor),
514 if (grid.FlatMode == false) {
517 g.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlLight),
518 bounds.X, bounds.Y, bounds.X + bounds.Width, bounds.Y);
521 g.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlLight),
522 bounds.X, bounds.Y, bounds.X, bounds.Y + bounds.Height);
524 g.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlLight),
525 bounds.X, bounds.Y + 2, bounds.X, bounds.Y + bounds.Height - 2);
528 g.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlDark),
529 bounds.X + bounds.Width - 1, bounds.Y + 2 , bounds.X + bounds.Width - 1, bounds.Y + bounds.Height - 2);
534 g.DrawString (HeaderText, DataGridTableStyle.HeaderFont, ThemeEngine.Current.ResPool.GetSolidBrush (DataGridTableStyle.CurrentHeaderForeColor),
535 bounds, string_format_hdr);
537 if (arrow_drawing != ArrowDrawing.No) {
539 Point pnt = new Point (bounds.X + bounds.Width - 12, bounds.Y + ((bounds.Height - 6)/2));
541 if (arrow_drawing == ArrowDrawing.Ascending) {
542 g.DrawLine (SystemPens.ControlLightLight, pnt.X + 6, pnt.Y + 6, pnt.X + 3, pnt.Y);
543 g.DrawLine (SystemPens.ControlDark, pnt.X, pnt.Y + 6, pnt.X + 6, pnt.Y + 6);
544 g.DrawLine (SystemPens.ControlDark, pnt.X, pnt.Y + 6, pnt.X + 3, pnt.Y);
546 g.DrawLine (SystemPens.ControlLightLight, pnt.X + 6, pnt.Y, pnt.X + 3, pnt.Y + 6);
547 g.DrawLine (SystemPens.ControlDark, pnt.X, pnt.Y, pnt.X + 6, pnt.Y);
548 g.DrawLine (SystemPens.ControlDark, pnt.X, pnt.Y, pnt.X + 3, pnt.Y + 6);
554 internal void PaintNewRow (Graphics g, Rectangle bounds, Brush backBrush, Brush foreBrush)
556 g.FillRectangle (backBrush, bounds);
557 PaintGridLine (g, bounds);
560 internal void PaintGridLine (Graphics g, Rectangle bounds)
562 if (table_style.CurrentGridLineStyle != DataGridLineStyle.Solid) {
566 g.DrawLine (ThemeEngine.Current.ResPool.GetPen (table_style.CurrentGridLineColor),
567 bounds.X, bounds.Y + bounds.Height - 1, bounds.X + bounds.Width - 1, bounds.Y + bounds.Height - 1);
569 g.DrawLine (ThemeEngine.Current.ResPool.GetPen (table_style.CurrentGridLineColor),
570 bounds.X + bounds.Width - 1, bounds.Y , bounds.X + bounds.Width - 1, bounds.Y + bounds.Height);
573 #endregion Private Instance Methods
577 static object AlignmentChangedEvent = new object ();
578 static object FontChangedEvent = new object ();
579 static object HeaderTextChangedEvent = new object ();
580 static object MappingNameChangedEvent = new object ();
581 static object NullTextChangedEvent = new object ();
582 static object PropertyDescriptorChangedEvent = new object ();
583 static object ReadOnlyChangedEvent = new object ();
584 static object WidthChangedEvent = new object ();
586 public event EventHandler AlignmentChanged {
587 add { Events.AddHandler (AlignmentChangedEvent, value); }
588 remove { Events.RemoveHandler (AlignmentChangedEvent, value); }
591 public event EventHandler FontChanged {
592 add { Events.AddHandler (FontChangedEvent, value); }
593 remove { Events.RemoveHandler (FontChangedEvent, value); }
596 public event EventHandler HeaderTextChanged {
597 add { Events.AddHandler (HeaderTextChangedEvent, value); }
598 remove { Events.RemoveHandler (HeaderTextChangedEvent, value); }
601 public event EventHandler MappingNameChanged {
602 add { Events.AddHandler (MappingNameChangedEvent, value); }
603 remove { Events.RemoveHandler (MappingNameChangedEvent, value); }
606 public event EventHandler NullTextChanged {
607 add { Events.AddHandler (NullTextChangedEvent, value); }
608 remove { Events.RemoveHandler (NullTextChangedEvent, value); }
612 [EditorBrowsable(EditorBrowsableState.Advanced)]
613 public event EventHandler PropertyDescriptorChanged {
614 add { Events.AddHandler (PropertyDescriptorChangedEvent, value); }
615 remove { Events.RemoveHandler (PropertyDescriptorChangedEvent, value); }
618 public event EventHandler ReadOnlyChanged {
619 add { Events.AddHandler (ReadOnlyChangedEvent, value); }
620 remove { Events.RemoveHandler (ReadOnlyChangedEvent, value); }
623 public event EventHandler WidthChanged {
624 add { Events.AddHandler (WidthChangedEvent, value); }
625 remove { Events.RemoveHandler (WidthChangedEvent, value); }