Merge pull request #409 from Alkarex/patch-1
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / DataGridViewColumn.cs
index 59f4669d6fe7949d292a4da5c455b2b4144d8dce..8b9e69b6c157849873fa8d90a0ddad4ae2e2cae7 100644 (file)
 //
 
 
-#if NET_2_0
-
 using System;
 using System.ComponentModel;
 
 namespace System.Windows.Forms {
 
+       [Designer ("System.Windows.Forms.Design.DataGridViewColumnDesigner, " + Consts.AssemblySystem_Design,
+                  "System.ComponentModel.Design.IDesigner")]
+       [TypeConverter (typeof (DataGridViewColumnConverter))]
+       [ToolboxItem ("")]
+       [DesignTimeVisible (false)]
        public class DataGridViewColumn : DataGridViewBand, IComponent, IDisposable {
-
+               private bool auto_generated;
                private DataGridViewAutoSizeColumnMode autoSizeMode;
                private DataGridViewCell cellTemplate;
-               //private ContextMenuStrip contextMenuStrip;
+               private ContextMenuStrip contextMenuStrip;
                private string dataPropertyName;
                private int displayIndex;
                private int dividerWidth;
                private float fillWeight;
                private bool frozen;
                private DataGridViewColumnHeaderCell headerCell;
-               private string headerText = "";
-               private DataGridViewAutoSizeColumnMode inheritedAutoSizeMode;
                private bool isDataBound;
                private int minimumWidth = 5;
                private string name = "";
                private bool readOnly;
-               private DataGridViewTriState resizable = DataGridViewTriState.True;
                private ISite site;
                private DataGridViewColumnSortMode sortMode;
                private string toolTipText;
                private Type valueType;
                private bool visible = true;
                private int width = 100;
+               private int dataColumnIndex;
+
+               private bool headerTextSet = false;
 
                public DataGridViewColumn () {
                        cellTemplate = null;
@@ -62,28 +65,46 @@ namespace System.Windows.Forms {
                        readOnly = false;
                        headerCell = new DataGridViewColumnHeaderCell();
                        headerCell.SetColumnIndex(Index);
+                       headerCell.Value = string.Empty;
                        displayIndex = -1;
+                       dataColumnIndex = -1;
+                       dataPropertyName = string.Empty;
+                       fillWeight = 100.0F;
+                       sortMode = DataGridViewColumnSortMode.NotSortable;
+                       SetState (DataGridViewElementStates.Visible);
                }
 
                public DataGridViewColumn (DataGridViewCell cellTemplate) : this () {
                        this.cellTemplate = (DataGridViewCell) cellTemplate.Clone();
                }
 
+               [DefaultValue (DataGridViewAutoSizeColumnMode.NotSet)]
+               [RefreshProperties (RefreshProperties.Repaint)]
                public DataGridViewAutoSizeColumnMode AutoSizeMode {
                        get { return autoSizeMode; }
-                       set { autoSizeMode = value; }
+                       set {
+                               if (autoSizeMode != value) {
+                                       DataGridViewAutoSizeColumnMode old_value = autoSizeMode;
+                                       autoSizeMode = value;
+                                       
+                                       if (DataGridView != null) {
+                                               DataGridView.OnAutoSizeColumnModeChanged (new DataGridViewAutoSizeColumnModeEventArgs (this, old_value));
+                                               DataGridView.AutoResizeColumnsInternal ();
+                                       }
+                               }
+                       }
                }
 
+               [Browsable (false)]
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public virtual DataGridViewCell CellTemplate {
                        get { return cellTemplate; }
-                       set {
-                               cellTemplate = value;
-                               if (DataGridView != null) {
-                                       cellTemplate.SetDataGridView(DataGridView);
-                               }
-                       }
+                       set { cellTemplate = value; }
                }
 
+               [Browsable (false)]
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
                public Type CellType {
                        get {
                                if (cellTemplate == null) {
@@ -93,7 +114,7 @@ namespace System.Windows.Forms {
                        }
                }
 
-               /*
+               [DefaultValue (null)]
                public override ContextMenuStrip ContextMenuStrip {
                        get { return contextMenuStrip; }
                        set {
@@ -105,8 +126,12 @@ namespace System.Windows.Forms {
                                }
                        }
                }
-               */
 
+               [Browsable (true)]
+               [DefaultValue ("")]
+               [Editor ("System.Windows.Forms.Design.DataGridViewColumnDataPropertyNameEditor, " + Consts.AssemblySystem_Design,
+                        typeof (System.Drawing.Design.UITypeEditor))]
+               [TypeConverter ("System.Windows.Forms.Design.DataMemberFieldConverter, " + Consts.AssemblySystem_Design)]
                public string DataPropertyName {
                        get { return dataPropertyName; }
                        set {
@@ -119,6 +144,7 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [Browsable (true)]
                public override DataGridViewCellStyle DefaultCellStyle {
                        get {
                                return base.DefaultCellStyle;
@@ -133,6 +159,8 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [Browsable (false)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public int DisplayIndex {
                        get {
                                if (displayIndex < 0) {
@@ -147,12 +175,28 @@ namespace System.Windows.Forms {
                                        }
                                        displayIndex = value;
                                        if (DataGridView != null) {
+                                               DataGridView.Columns.RegenerateSortedList ();
                                                DataGridView.OnColumnDisplayIndexChanged(new DataGridViewColumnEventArgs(this));
                                        }
                                }
                        }
                }
 
+               internal int DisplayIndexInternal {
+                       get { return DisplayIndex; }
+                       set { displayIndex = value; }
+               }
+
+               internal int DataColumnIndex {
+                       get { return dataColumnIndex; }
+                       set { 
+                               dataColumnIndex = value;
+                               if (dataColumnIndex >= 0)
+                                       isDataBound = true;
+                       }
+               }
+
+               [DefaultValue (0)]
                public int DividerWidth {
                        get { return dividerWidth; }
                        set {
@@ -165,6 +209,7 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [DefaultValue (100)]
                public float FillWeight {
                        get { return fillWeight; }
                        set {
@@ -176,6 +221,8 @@ The maximum sum of System.Windows.Forms.DataGridViewColumn.FillWeight values for
                        }
                }
 
+               [DefaultValue (false)]
+               [RefreshProperties (RefreshProperties.All)]
                public override bool Frozen {
                        get { return frozen; }
                        set { frozen = value; }
@@ -183,8 +230,12 @@ The maximum sum of System.Windows.Forms.DataGridViewColumn.FillWeight values for
                /* When a column is frozen, all the columns to its left (or to its right in right-to-left languages) are frozen as well. The frozen and unfrozen columns form two groups. If column repositioning is enabled by setting the System.Windows.Forms.DataGridView.AllowUserToOrderColumns property to true, the user cannot drag a column from one group to the other.
 Example */
 
+               [Browsable (false)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public DataGridViewColumnHeaderCell HeaderCell {
-                       get { return headerCell; }
+                       get {
+                               return headerCell;
+                       }
                        set {
                                if (headerCell != value) {
                                        headerCell = value;
@@ -195,15 +246,54 @@ Example */
                        }
                }
 
+               [Localizable (true)]
                public string HeaderText {
-                       get { return headerText; }
-                       set { headerText = value; }
+                       get {
+                               if (headerCell.Value == null) {
+                                       return String.Empty;
+                               }
+                               return (string) headerCell.Value;
+                       }
+                       set {
+                               headerCell.Value = value;
+                               headerTextSet = true;
+                       }
                }
 
+               internal bool AutoGenerated { get { return auto_generated; } set { auto_generated = value; } }
+               internal bool HeaderTextSet { get { return headerTextSet; } }
+               
+               [Browsable (false)]
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public DataGridViewAutoSizeColumnMode InheritedAutoSizeMode {
-                       get { return inheritedAutoSizeMode; }
+                       get {
+                               if (this.DataGridView == null)
+                                       return this.autoSizeMode;
+                               
+                               if (this.autoSizeMode != DataGridViewAutoSizeColumnMode.NotSet)
+                                       return this.autoSizeMode;
+                               
+                               switch (this.DataGridView.AutoSizeColumnsMode) {
+                               case DataGridViewAutoSizeColumnsMode.AllCells:
+                                       return DataGridViewAutoSizeColumnMode.AllCells;
+                               case DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader:
+                                       return DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
+                               case DataGridViewAutoSizeColumnsMode.ColumnHeader:
+                                       return DataGridViewAutoSizeColumnMode.ColumnHeader;
+                               case DataGridViewAutoSizeColumnsMode.DisplayedCells:
+                                       return DataGridViewAutoSizeColumnMode.DisplayedCells;
+                               case DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader:
+                                       return DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader;
+                               case DataGridViewAutoSizeColumnsMode.Fill:
+                                       return DataGridViewAutoSizeColumnMode.Fill;
+                               default:
+                                       return DataGridViewAutoSizeColumnMode.None;
+                               }                               
+                       }
                }
 
+               [Browsable (false)]
                public override DataGridViewCellStyle InheritedStyle {
                        get {
                                if (DataGridView == null) {
@@ -222,10 +312,15 @@ Example */
                        }
                }
 
+               [Browsable (false)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public bool IsDataBound {
                        get { return isDataBound; }
                }
 
+               [DefaultValue (5)]
+               [RefreshProperties (RefreshProperties.Repaint)]
+               [Localizable (true)]
                public int MinimumWidth {
                        get { return minimumWidth; }
                        set {
@@ -241,12 +336,18 @@ Example */
                        }
                }
 
+               [Browsable (false)]
                public string Name {
                        get { return name; }
                        set {
                                if (name != value) {
-                                       name = value;
-                                       headerCell.Value = value;
+                                       if (value == null)
+                                               name = string.Empty;
+                                       else
+                                               name = value;
+                                       if (!headerTextSet) {
+                                               headerCell.Value = name;
+                                       }
                                        if (DataGridView != null) {
                                                DataGridView.OnColumnNameChanged(new DataGridViewColumnEventArgs(this));
                                        }
@@ -255,24 +356,40 @@ Example */
                }
 
                public override bool ReadOnly {
-                       get { return readOnly; }
+                       get {
+
+                               if (DataGridView != null && DataGridView.ReadOnly)
+                                       return true;
+
+                               return readOnly;
+                       }
                        set { readOnly = value; }
                }
 
                public override DataGridViewTriState Resizable {
-                       get { return resizable; }
-                       set { resizable = value; }
+                       get { return base.Resizable; }
+                       set { base.Resizable = value; }
                }
 
-               public virtual ISite Site {
+               [Browsable (false)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
+               public ISite Site {
                        get { return site; }
                        set { site = value; }
                }
 
+               [DefaultValue (DataGridViewColumnSortMode.NotSortable)]
                public DataGridViewColumnSortMode SortMode {
                        get { return sortMode; }
                        set {
-                               // System.InvalidOperationException: The value assigned to the property conflicts with System.Windows.Forms.DataGridView.SelectionMode.
+                               if (DataGridView != null && value == DataGridViewColumnSortMode.Automatic) {
+                                       if (DataGridView.SelectionMode == DataGridViewSelectionMode.FullColumnSelect ||
+                                           DataGridView.SelectionMode == DataGridViewSelectionMode.ColumnHeaderSelect)
+                                               throw new InvalidOperationException ("Column's SortMode cannot be set to Automatic "+
+                                                                                    "while the DataGridView control's SelectionMode "+
+                                                                                    "is set to FullColumnSelect or ColumnHeaderSelect.");
+                               }
+
                                if (sortMode != value) {
                                        sortMode = value;
                                        if (DataGridView != null) {
@@ -282,8 +399,13 @@ Example */
                        }
                }
 
+               [DefaultValue ("")]
+               [Localizable (true)]
                public string ToolTipText {
-                       get { return toolTipText; }
+                       get {
+                               if (toolTipText == null)
+                                       return string.Empty;
+                               return toolTipText; }
                        set {
                                if (toolTipText != value) {
                                        toolTipText = value;
@@ -294,16 +416,27 @@ Example */
                        }
                }
 
+               [Browsable (false)]
+               [DefaultValue (null)]
+               [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public Type ValueType {
                        get { return valueType; }
                        set { valueType = value; }
                }
 
+               [DefaultValue (true)]
+               [Localizable (true)]
                public override bool Visible {
                        get { return visible; }
-                       set { visible = value; }
+                       set {
+                               visible = value;
+                               if (DataGridView != null)
+                                       DataGridView.Invalidate ();
+                       }
                }
 
+               [Localizable (true)]
+               [RefreshProperties (RefreshProperties.Repaint)]
                public int Width {
                        get { return width; }
                        set {
@@ -312,7 +445,8 @@ Example */
                                                throw new ArgumentOutOfRangeException("Width is less than MinimumWidth");
                                        }
                                        width = value;
-                                       if (DataGridView != null) {
+                                       if (DataGridView != null)  {
+                                               DataGridView.Invalidate ();
                                                DataGridView.OnColumnWidthChanged(new DataGridViewColumnEventArgs(this));
                                        }
 
@@ -320,7 +454,9 @@ Example */
                        }
                }
 
-               //public sealed event EventHandler Disposed;
+               // XXX should we do something like Component.Events?
+               [Browsable (false)]
+               [EditorBrowsable (EditorBrowsableState.Advanced)]
                public event EventHandler Disposed;
 
                public override object Clone () {
@@ -331,21 +467,19 @@ Example */
                        */
                }
 
-               //public sealed void Dispose () {
-               //}
-
+               [MonoTODO("Actually calculate width")]
                public virtual int GetPreferredWidth (DataGridViewAutoSizeColumnMode autoSizeColumnMode, bool fixedHeight) {
                        switch (autoSizeColumnMode) {
-                               case DataGridViewAutoSizeColumnMode.NotSet:
-                               case DataGridViewAutoSizeColumnMode.None:
-                               case DataGridViewAutoSizeColumnMode.Fill:
-                                       throw new ArgumentException("AutoSizeColumnMode is invalid");
+                       case DataGridViewAutoSizeColumnMode.NotSet:
+                       case DataGridViewAutoSizeColumnMode.None:
+                       case DataGridViewAutoSizeColumnMode.Fill:
+                               throw new ArgumentException("AutoSizeColumnMode is invalid");
                        }
                        if (fixedHeight) {
-                               return 0;
+                               return MinimumWidth;
                        }
                        else {
-                               return 0;
+                               return MinimumWidth;
                        }
                }
 
@@ -359,10 +493,11 @@ Example */
                }
 
                internal override void SetDataGridView (DataGridView dataGridView) {
-                       base.SetDataGridView(dataGridView);
-                       if (cellTemplate != null) {
-                               cellTemplate.SetDataGridView(dataGridView);
+                       if (sortMode == DataGridViewColumnSortMode.Automatic && dataGridView != null && dataGridView.SelectionMode == DataGridViewSelectionMode.FullColumnSelect) {
+                               throw new InvalidOperationException ("Column's SortMode cannot be set to Automatic while the DataGridView control's SelectionMode is set to FullColumnSelect.");
                        }
+                       
+                       base.SetDataGridView (dataGridView);
                        headerCell.SetDataGridView(dataGridView);
                }
 
@@ -381,7 +516,9 @@ Example */
                }
 
        }
-
+       
+       internal class DataGridViewColumnConverter : TypeConverter
+       {
+       }
 }
 
-#endif