using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Drawing.Design; using System.Drawing.Drawing2D; using System.Globalization; using System.IO; using System.Reflection; using System.Windows.Forms; using DevComponents.DotNetBar.SuperGrid.Style; using DevComponents.SuperGrid.TextMarkup; namespace DevComponents.DotNetBar.SuperGrid { /// /// Defines the grid column header /// public class GridColumn : GridElement, IDisposable { #region Events /// /// Occurs after column header DisplayIndex has changed. /// public event EventHandler DisplayIndexChanged; #endregion #region Static variables static Image _InfoImageCache; #endregion #region Private variables private ColumnAutoSizeMode _AutoSizeMode = ColumnAutoSizeMode.NotSet; private ColumnSortMode _ColumnSortMode = ColumnSortMode.Single; private ColumnResizeMode _ResizeMode = ColumnResizeMode.MoveFollowingElements; private CellHighlightMode _CellHighlightMode = CellHighlightMode.Full; private CellMergeMode _CellMergeMode = CellMergeMode.NotSet; private SortDirection _SortDirection = SortDirection.None; private SortDirection _GroupDirection = SortDirection.None; private SortIndicator _SortIndicator = SortIndicator.Auto; private SortCycle _SortCycle = SortCycle.NotSet; private int _ColumnIndex; private int _DisplayIndex = -1; private int _MinimumWidth = 5; private int _FillWeight = 100; private string _NullString; private string _HeaderText; private Size _HeaderSize; private Size _HeaderTextSize; private Cs _States; private BodyElement _HeaderTextMarkup; private string _Name; private int _Width = 100; private ushort _SelectionUpdateCount; private SelectedElements _SelectedCells; private Type _EditorType = typeof(GridTextBoxXEditControl); private Type _RenderType; private IGridCellEditControl _EditControl; private IGridCellEditControl _RenderControl; private object[] _EditorParams; private object[] _RenderParams; private ushort _MeasureCount; private Image _InfoImage; private Alignment _InfoImageAlignment = Alignment.MiddleRight; private string _DataPropertyName; private object _DefaultNewRowCellValue; private Type _DataType; private CellVisualStyles _CellStyles; private ColumnHeaderVisualStyles _HeaderStyles; private FilterColumnHeaderVisualStyles _FilterRowStyles; private ColumnHeaderVisualStyles _EffectiveStyles; private FilterColumnHeaderVisualStyles _EffectiveFilterStyles; private CellVisualStyles _EffectiveCellStyles; private StyleState _LastStyleState; private int _StyleUpdateCount; private Rectangle _SortImageBounds; private string _FilterExpr; private FilterEval _FilterEval; private object _FilterValue; private object _FilterDisplayValue; private Tbool _EnableFiltering = Tbool.NotSet; private Tbool _ShowPanelFilterExpr = Tbool.NotSet; private Tbool _AllowNullCellMerge = Tbool.NotSet; private Rectangle _FilterImageBounds; private Size _FilterPopupSize = Size.Empty; private int _FilterPopupMaxItems = 100; private FilterScan _FilterScan; private FilterEditType _FilterEditType = FilterEditType.Auto; private FilterMatchType _FilterMatchType = FilterMatchType.NotSet; private GroupBoxEffects _GroupBoxEffects = GroupBoxEffects.NotSet; private string _ToolTip; #endregion #region Constructors /// /// GridColumn /// public GridColumn() { SetState(Cs.AllowEdit, true); SetState(Cs.InfoImageOverlay, true); SetState(Cs.MarkRowDirtyOnCellValueChange, true); _SelectedCells = new SelectedElements(SelectedElementType.SelectedCells); } /// /// GridColumn /// public GridColumn(string name) : this() { Name = name; } #endregion #region Internal properties #region CanResize internal bool CanResize { get { ColumnAutoSizeMode mode = GetAutoSizeMode(); switch (mode) { case ColumnAutoSizeMode.None: case ColumnAutoSizeMode.Fill: return (true); default: return (false); } } } #endregion #region CanShowFilterExpr internal bool CanShowFilterExpr { get { if (_ShowPanelFilterExpr != Tbool.NotSet) return (_ShowPanelFilterExpr == Tbool.True); if (GridPanel != null) return (GridPanel.Filter.ShowPanelFilterExpr); return (false); } } #endregion #region EffectiveCellStyles internal CellVisualStyles EffectiveCellStyles { get { return (_EffectiveCellStyles); } set { _EffectiveCellStyles = value; } } #endregion #region EffectiveFilterStyles internal FilterColumnHeaderVisualStyles EffectiveFilterStyles { get { return (_EffectiveFilterStyles); } set { _EffectiveFilterStyles = value; } } #endregion #region EffectiveStyles internal ColumnHeaderVisualStyles EffectiveStyles { get { return (_EffectiveStyles); } set { _EffectiveStyles = value; } } #endregion #region FilterError internal bool FilterError { get { return (TestState(Cs.FilterError)); } set { SetState(Cs.FilterError, value); } } #endregion #region FilterExprUsesName internal bool FilterExprUsesName { get { return (TestState(Cs.FilterExprUsesName)); } set { SetState(Cs.FilterExprUsesName, value); } } #endregion #region FilterEval internal FilterEval FilterEval { get { return (_FilterEval); } set { _FilterEval = value; } } #endregion #region FilterImageBounds internal Rectangle FilterImageBounds { get { return (_FilterImageBounds); } set { _FilterImageBounds = value; } } #endregion #region FilterScan internal FilterScan FilterScan { get { if (_FilterScan == null) FilterScan = new FilterScan(this); return (_FilterScan); } set { if (_FilterScan != value) { if (_FilterScan != null) _FilterScan.EndScan(); _FilterScan = value; } } } #endregion #region GroupBoxEffectsEx internal GroupBoxEffects GroupBoxEffectsEx { get { if (_GroupBoxEffects != GroupBoxEffects.NotSet) return (_GroupBoxEffects); GridPanel panel = GridPanel; if (panel != null && panel.GroupByRow != null) { if (panel.GroupByRow.GroupBoxEffects != GroupBoxEffects.NotSet) return (panel.GroupByRow.GroupBoxEffects); } return (GroupBoxEffects.Move); } } #endregion #region HeaderSize internal Size HeaderSize { get { return (_HeaderSize); } set { _HeaderSize = value; } } #endregion #region HeaderTextMarkup internal BodyElement HeaderTextMarkup { get { return (_HeaderTextMarkup); } } #endregion #region HeaderTextSize internal Size HeaderTextSize { get { return (_HeaderTextSize); } set { _HeaderTextSize = value; } } #endregion #region IsFiltered internal bool IsFiltered { get { return (IsFilteringEnabled == true && String.IsNullOrEmpty(FilterExpr) == false); } } #endregion #region IsHFrozenEx internal bool IsHFrozenEx { get { GridPanel panel = Parent as GridPanel; if (panel != null && panel.IsSubPanel == false) { if (panel.FrozenColumnCount > 0) { int n = panel.Columns.GetDisplayIndex(this); if (n < panel.FrozenColumnCount) return (true); } } return (false); } } #endregion #region IsReadOnly internal bool IsReadOnly { get { GridPanel panel = GridPanel; if (panel != null) { if (panel.ReadOnly || ReadOnly) return (true); } return (TestState(Cs.ReadOnly)); } } #endregion #region LastStyleState internal StyleState LastStyleState { get { return (_LastStyleState); } set { _LastStyleState = value; } } #endregion #region MeasureCount internal ushort MeasureCount { get { return (_MeasureCount); } } #endregion #region NeedsFilterScan internal bool NeedsFilterScan { get { return (TestState(Cs.NeedsFilterScan)); } set { SetState(Cs.NeedsFilterScan, value); } } #endregion #region NeedsMeasured internal override bool NeedsMeasured { get { return (base.NeedsMeasured); } set { if (value == true) _MeasureCount++; base.NeedsMeasured = value; } } #endregion #region NeedsResized internal bool NeedsResized { get { return (TestState(Cs.NeedsResized)); } set { SetState(Cs.NeedsResized, value); } } #endregion #region Processed internal bool Processed { get { return (TestState(Cs.Processed)); } set { SetState(Cs.Processed, value); } } #endregion #region ScanItems internal List ScanItems { get { if (_FilterScan != null) return (_FilterScan.ScanItems); return (null); } } #endregion #region SelectedCells internal SelectedElements SelectedCells { get { return (_SelectedCells); } set { _SelectedCells = value; } } #endregion #region SortImageBounds internal Rectangle SortImageBounds { get { return (_SortImageBounds); } set { _SortImageBounds = value; } } #endregion #region StyleUpdateCount internal int StyleUpdateCount { get { return (_StyleUpdateCount); } set { _StyleUpdateCount = value; } } #endregion #endregion #region Public properties #region AdjustSortImagePositionByMargin /// /// Gets or sets whether the Column Header sort image /// position is adjusted by the header margin /// [DefaultValue(false), Category("Appearance")] [Description("Indicates whether the Column Header sort image position is adjusted by the header margin.")] public bool AdjustSortImagePositionByMargin { get { return (TestState(Cs.AdjustSortImagePositionByMargin)); } set { if (AdjustSortImagePositionByMargin != value) { SetState(Cs.AdjustSortImagePositionByMargin, value); OnPropertyChangedEx("AdjustSortImagePositionByMargin", VisualChangeType.Render); } } } #endregion #region AllowEdit /// /// Gets or sets whether column cells can be edited by the user. /// [DefaultValue(true), Category("Behavior")] [Description("Indicates whether column cells can be edited by the user.")] public bool AllowEdit { get { return (TestState(Cs.AllowEdit)); } set { if (value != AllowEdit) { SetState(Cs.AllowEdit, value); OnPropertyChanged("AllowEdit"); } } } #endregion #region AllowNullCellMerge /// /// Gets or sets whether cells with null/empty values are allowed to be merged. /// [DefaultValue(Tbool.NotSet), Category("Behavior")] [Description("Indicates whether cells with null/empty values are allowed to be merged.")] public Tbool AllowNullCellMerge { get { return (_AllowNullCellMerge); } set { if (value != _AllowNullCellMerge) { _AllowNullCellMerge = value; OnPropertyChangedEx("AllowNullCellMerge", VisualChangeType.Layout); } } } #endregion #region AutoSizeMode /// /// Gets or sets how column auto-sizing is performed /// [DefaultValue(ColumnAutoSizeMode.NotSet), Category("Sizing")] [Description("Indicates how column auto-sizing is performed.")] public ColumnAutoSizeMode AutoSizeMode { get { return (_AutoSizeMode); } set { if (value != _AutoSizeMode) { _AutoSizeMode = value; NeedsMeasured = true; OnPropertyChangedEx("AutoSizeMode", VisualChangeType.Layout); } } } #endregion #region Bounds /// /// Gets the scroll adjusted bounds of the Column /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public override Rectangle Bounds { get { GridPanel panel = GridPanel; if (panel != null) { Rectangle r = BoundsRelative; if (IsHFrozen == false) r.X -= HScrollOffset; if (panel.IsSubPanel == true) r.Y -= VScrollOffset; return (r); } return (Rectangle.Empty); } } #endregion #region CellHighlightMode /// /// Gets or sets the type of highlighting /// to perform when a cell is selected /// [DefaultValue(CellHighlightMode.Full), Category("Behavior")] [Description("Indicates the type of highlighting to perform when a cell is selected.")] public CellHighlightMode CellHighlightMode { get { return (_CellHighlightMode); } set { if (value != _CellHighlightMode) { _CellHighlightMode = value; OnPropertyChanged("CellHighlightType"); } } } #endregion #region CellMergeMode /// /// Gets or sets the type of cell merging /// that is supported by each cell in the column /// [DefaultValue(CellMergeMode.NotSet), Category("Behavior")] [Description("Indicates the type of cell merging supported by each cell in the column.")] public CellMergeMode CellMergeMode { get { return (_CellMergeMode); } set { if (value != _CellMergeMode) { _CellMergeMode = value; GridPanel panel = GridPanel; if (panel != null) panel.InvalidateMerge(); OnPropertyChangedEx("CellMergeMode", VisualChangeType.Layout); } } } #endregion #region CellStyles /// /// Gets or sets the default visual styles assigned to the column cells /// [Category("Style")] [Description("Indicates default visual style assigned to the column cells.")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public CellVisualStyles CellStyles { get { if (_CellStyles == null) { _CellStyles = new CellVisualStyles(); StyleVisualChangeHandler(null, _CellStyles); } return (_CellStyles); } set { if (_CellStyles != value) { StyleVisualChangeHandler(_CellStyles, value); _CellStyles = value; OnPropertyChangedEx("CellStyles", VisualChangeType.Layout); } } } #endregion #region ColumnIndex /// /// Gets the panel level, Columns collection index of the column /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public int ColumnIndex { get { return (_ColumnIndex); } internal set { _ColumnIndex = value; } } #endregion #region ColumnSortMode /// /// Gets or sets how column sorting is performed /// [DefaultValue(ColumnSortMode.Single), Category("Sorting")] [Description("Indicates how column sorting is performed.")] public ColumnSortMode ColumnSortMode { get { return (_ColumnSortMode); } set { if (value != _ColumnSortMode) { _ColumnSortMode = value; OnPropertyChanged("ColumnSortMode"); } } } #endregion #region DataPropertyName /// /// Gets or sets the name of the data source property /// or database column to which the column is bound /// [DefaultValue(null), Category("Data")] [Description("Indicates the name of the data source property or database column to which the column is bound.")] public string DataPropertyName { get { return (_DataPropertyName); } set { if (value != _DataPropertyName) { _DataPropertyName = value; if (GridPanel != null) GridPanel.NeedToUpdateBindings = true; OnPropertyChangedEx("DataPropertyName", VisualChangeType.Layout); } } } #endregion #region DataType /// ///Gets or sets the underlying data type /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public Type DataType { get { return (_DataType); } set { _DataType = value; } } #endregion #region DefaultNewRowCellValue /// /// Gets or sets the default cell value used when a new row is added /// [DefaultValue(null), Category("Data")] [Description("Indicates the default cell value used when a new row is added.")] [TypeConverter(typeof(ValueTypeConverter))] [Editor("DevComponents.SuperGrid.Design.ValueTypeEditor, DevComponents.SuperGrid.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=26d81176cfa2b486", typeof(UITypeEditor))] public object DefaultNewRowCellValue { get { if (_DefaultNewRowCellValue is DBNull) return null; return (_DefaultNewRowCellValue); } set { if (value != _DefaultNewRowCellValue) { _DefaultNewRowCellValue = value; OnPropertyChanged("DefaultNewRowCellValue"); } } } #endregion #region DisplayIndex /// /// Gets or sets display index of the column. /// /// /// A lower display index means a column will appear first (to the left) of columns with a higher display index. /// Allowable values are from 0 to num columns - 1. (-1 is legal only as the default value). SuperGrid enforces /// that no two columns have the same display index, ie. changing the display index of a column will cause the index /// of other columns to adjust as well. /// [DefaultValue(-1), Category("Appearance")] [Description("Indicates the display index of the column. -1 indicates default value.")] public int DisplayIndex { get { return (_DisplayIndex); } set { if (value != _DisplayIndex) { _DisplayIndex = value; OnPropertyChangedEx("DisplayIndex", VisualChangeType.Layout); OnDisplayIndexChanged(EventArgs.Empty); } } } #endregion #region EditControl /// /// Gets the default Edit Control used for each cell in the column. /// The column level edit control is a shared control, created and /// based upon the column level EditorType and EditorParams properties. /// Each cell in the column, that does not define its own EditorType, /// will utilize the column level EditorControl. /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public IGridCellEditControl EditControl { get { if (_EditControl == null) EditControl = GetEditControl(_EditorType, _EditorParams); if (_EditControl != null) { if (_EditControl.EditorPanel.Parent == null && SuperGrid != null) SuperGrid.Controls.Add(_EditControl.EditorPanel); } return (_EditControl); } internal set { if (_EditControl != value) { if (_EditControl != null) { if (_EditControl.EditorPanel != null) { if (_EditControl.EditorPanel.Parent != null) SuperGrid.Controls.Remove(_EditControl.EditorPanel); _EditControl.EditorPanel.Visible = false; if (_EditControl.EditorPanel.Controls.Count > 0) _EditControl.EditorPanel.Controls[0].Visible = false; _EditControl.EditorPanel.Dispose(); } _EditControl.EditorCellBitmap = null; ((Control)_EditControl).Dispose(); InvalidateLayout(); } _EditControl = value; } } } #endregion #region EditorParams /// /// Gets or sets an array of arguments that match in number, /// order, and type the parameters of the EditControl constructor /// to invoke. If empty or null, the default constructor is invoked. /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public object[] EditorParams { get { return (_EditorParams); } set { if (_EditorParams != value) { _EditorParams = value; EditControl = null; RenderControl = null; NeedsMeasured = true; OnPropertyChangedEx("EditorParams", VisualChangeType.Layout); } } } #endregion #region EditorType /// /// Gets or sets the default cell editor type. This is the default /// control type used to perform the actual modification of the cell value /// [DefaultValue(typeof(GridTextBoxXEditControl)), Category("Data")] [Description("Indicates the default cell editor type. This is the default control type used to perform the actual modification of the cell value.")] [TypeConverter(typeof(EditTypeConverter))] [Editor("DevComponents.SuperGrid.Design.EditTypeEditor, DevComponents.SuperGrid.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=26d81176cfa2b486", typeof(UITypeEditor))] public Type EditorType { get { return (_EditorType); } set { if (value != _EditorType) { _EditorType = value; EditControl = null; RenderControl = null; NeedsMeasured = true; OnPropertyChangedEx("EditorType", VisualChangeType.Layout); } } } #endregion #region EffectiveCellMergeMode /// ///Gets the "effective" CellMergeMode for the column (ie. returns ///the GridPanel CellMergeMode if column CellMergeMode is NotSet) /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public CellMergeMode EffectiveCellMergeMode { get { if (_CellMergeMode != CellMergeMode.NotSet) return (_CellMergeMode); GridPanel panel = GridPanel; return ((panel != null) ? panel.CellMergeMode : CellMergeMode.None); } } #endregion #region EnableFiltering /// /// Gets or sets whether filtering is enabled for the column /// [DefaultValue(Tbool.NotSet), Category("Filtering")] [Description("Indicates whether filtering is enabled for the column.")] public Tbool EnableFiltering { get { return (_EnableFiltering); } set { if (_EnableFiltering != value) { _EnableFiltering = value; OnPropertyChangedEx("EnableFiltering", VisualChangeType.Layout); } } } #endregion #region EnableGroupHeaderMarkup /// /// Gets or sets whether text-markup support is enabled for the Group Header Text /// [DefaultValue(false), Category("Grouping")] [Description("Indicates whether text-markup support is enabled for the Group Header Text.")] public bool EnableGroupHeaderMarkup { get { return (TestState(Cs.EnableGroupHeaderMarkup)); } set { if (EnableGroupHeaderMarkup != value) { SetState(Cs.EnableGroupHeaderMarkup, value); if (GridPanel != null) GridPanel.NeedsGrouped = true; OnPropertyChangedEx("EnableGroupHeaderMarkup", VisualChangeType.Layout); } } } #endregion #region EnableHeaderMarkup /// /// Gets or sets whether text-markup support is enabled for the HeaderText /// [DefaultValue(false), Category("Appearance")] [Description("Indicates whether text-markup support is enabled for the HeaderText.")] public bool EnableHeaderMarkup { get { return (TestState(Cs.EnableHeaderMarkup)); } set { if (EnableHeaderMarkup != value) { SetState(Cs.EnableHeaderMarkup, value); MarkupHeaderTextChanged(); OnPropertyChangedEx("EnableHeaderMarkup", VisualChangeType.Layout); } } } #endregion #region FilterAutoScan /// /// Gets or sets whether the column's FilterPopup /// is filled by auto-scanning the column contents. /// [DefaultValue(false), Category("Filtering")] [Description("Indicates whether the column's FilterPopup is filled by auto-scanning the column contents.")] public bool FilterAutoScan { get { return (TestState(Cs.FilterAutoScan)); } set { if (FilterAutoScan != value) { SetState(Cs.FilterAutoScan, value); SetState(Cs.NeedsFilterScan, true); if (value == false) FilterScan = null; OnPropertyChangedEx("FilterAutoScan", VisualChangeType.Layout); } } } #endregion #region FilterDisplayValue /// /// Gets or sets the value used to filter grid rows. /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public object FilterDisplayValue { get { return (_FilterDisplayValue); } set { if (_FilterDisplayValue != value) { _FilterDisplayValue = value; OnPropertyChanged("FilterDisplayValue"); if (GridPanel != null) { if (GridPanel.ColumnHeader.Visible == true) GridPanel.ColumnHeader.InvalidateRender(); } } } } #endregion #region FilterEditType /// /// Gets or sets the filter edit type /// [DefaultValue(FilterEditType.Auto), Category("Filtering")] [Description("Indicates the filter edit type).")] public FilterEditType FilterEditType { get { return (_FilterEditType); } set { if (_FilterEditType != value) { _FilterEditType = value; OnPropertyChangedEx("FilterEditType", VisualChangeType.Layout); } } } #endregion #region FilterExpr /// /// Gets or sets the value used to filter grid rows. /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public string FilterExpr { get { return (_FilterExpr); } set { if ("".Equals(value)) value = null; if ((_FilterExpr == null && _FilterExpr != value) || (_FilterExpr != null && _FilterExpr.Equals(value) == false)) { _FilterExpr = value; _FilterEval = null; if (_FilterExpr == null) { _FilterValue = null; _FilterDisplayValue = null; } if (GridPanel != null) { GridPanel.NeedToUpdateDataFilter = true; GridPanel.NeedsGrouped = true; } OnPropertyChangedEx("FilterExpr", VisualChangeType.Layout); } } } #endregion #region FilterMatchType /// /// Gets or sets the filter data match type (how data elements are matched) /// [DefaultValue(FilterMatchType.NotSet), Category("Filtering")] [Description("Indicates the filter data match style (how data elements are matched).")] public FilterMatchType FilterMatchType { get { return (_FilterMatchType); } set { if (_FilterMatchType != value) { _FilterMatchType = value; FilterEval = null; if (GridPanel != null) GridPanel.NeedToUpdateDataFilter = true; OnPropertyChangedEx("FilterMatchType", VisualChangeType.Layout); } } } #region GetFilterMatchType internal FilterMatchType GetFilterMatchType() { if (_FilterMatchType != FilterMatchType.NotSet) return (_FilterMatchType); if (GridPanel != null) return (GridPanel.GetFilterMatchType()); return (FilterMatchType.None); } #endregion #endregion #region FilterPopupMaxItems /// /// Gets or sets the filter popup maximum number of drop-down items /// [DefaultValue(100), Category("Filtering")] [Description("Indicates the filter popup maximum number of drop-down items.")] public int FilterPopupMaxItems { get { return (_FilterPopupMaxItems); } set { _FilterPopupMaxItems = value; } } #endregion #region FilterPopupSize /// /// Gets or sets the filter popup size /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public Size FilterPopupSize { get { return (_FilterPopupSize); } set { _FilterPopupSize = value; } } #endregion #region FilterRowStyles /// /// Gets or sets the visual styles assigned to the Filter Row /// [DefaultValue(null), Category("Style")] [Description("Indicates visual style assigned to the Filter Row.")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public FilterColumnHeaderVisualStyles FilterRowStyles { get { if (_FilterRowStyles == null) { _FilterRowStyles = new FilterColumnHeaderVisualStyles(); StyleVisualChangeHandler(null, _FilterRowStyles); } return (_FilterRowStyles); } set { if (_FilterRowStyles != value) { StyleVisualChangeHandler(_FilterRowStyles, value); _FilterRowStyles = value; OnPropertyChangedEx("FilterRowStyles", VisualChangeType.Layout); } } } #endregion #region FilterValue /// /// Gets or sets the current filter value (the value that is /// loaded into, or retrieved from, the editing filter control /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public object FilterValue { get { return (_FilterValue); } set { _FilterValue = value; } } #endregion #region FillWeight /// /// Gets or sets a value which, when AutoSizeMode is Fill, /// represents the width of the column relative to the widths /// of other fill-mode columns (default value is 100). /// [DefaultValue(100), Category("Sizing")] [Description("Indicates a value which, when AutoSizeMode is Fill, represents the width of the column relative to the widths of other fill-mode columns (default value is 100).")] public int FillWeight { get { return (_FillWeight); } set { if (value != _FillWeight) { _FillWeight = value; GridPanel panel = GridPanel; if (panel != null) panel.NeedsMeasured = true; OnPropertyChangedEx("FillWeight", VisualChangeType.Layout); } } } #endregion #region GroupBoxEffects /// /// Gets or sets how the column interacts with the GroupBox /// [DefaultValue(GroupBoxEffects.NotSet), Category("Grouping")] [Description("Indicates how the column interacts with the GroupBox.")] public GroupBoxEffects GroupBoxEffects { get { return (_GroupBoxEffects); } set { if (_GroupBoxEffects != value) { _GroupBoxEffects = value; OnPropertyChanged("GroupBoxEffects"); } } } #endregion #region GroupDirection /// /// Gets or sets the grouping sort direction (ie. ascending or descending). /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public SortDirection GroupDirection { get { return (_GroupDirection); } set { if (_GroupDirection != value) { _GroupDirection = value; OnGroupDirectionChanged(); } } } #region OnGroupDirectionChanged private void OnGroupDirectionChanged() { GridPanel panel = GridPanel; if (panel != null) { panel.NeedsGroupSorted = true; if (panel.VirtualMode == true) panel.VirtualRows.Clear(); OnPropertyChangedEx("GroupDirection", VisualChangeType.Layout); } } #endregion #endregion #region HeaderText /// /// Gets or sets the column header text. If the HeaderText is null /// then the Name of the columns is used in its place. /// [Localizable(true), DefaultValue(null), Category("Appearance")] [Description("Indicates the column header text. If the HeaderText is null then the Name of the columns is used in its place.")] public string HeaderText { get { return (_HeaderText); } set { if (_HeaderText != value) { _HeaderText = value; MarkupHeaderTextChanged(); NeedsMeasured = true; OnPropertyChangedEx("HeaderText", VisualChangeType.Layout); } } } #endregion #region HeaderStyles /// /// Gets or sets the visual styles assigned to the Column Header /// [DefaultValue(null), Category("Style")] [Description("Indicates visual style assigned to the Column Header.")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public ColumnHeaderVisualStyles HeaderStyles { get { if (_HeaderStyles == null) { _HeaderStyles = new ColumnHeaderVisualStyles(); StyleVisualChangeHandler(null, _HeaderStyles); } return (_HeaderStyles); } set { if (_HeaderStyles != value) { StyleVisualChangeHandler(_HeaderStyles, value); _HeaderStyles = value; OnPropertyChangedEx("HeaderStyles", VisualChangeType.Layout); } } } #endregion #region InfoImage /// /// Gets or sets the default cell informational Image /// (the image to display when InfoText is non-empty). /// [DefaultValue(null), Category("Appearance")] [Description("Indicates the default cell informational Image (the image to display when InfoText is non-empty).")] public Image InfoImage { get { return (_InfoImage); } set { if (_InfoImage != value) { if (_InfoImageCache != null) { _InfoImageCache.Dispose(); _InfoImageCache = null; } _InfoImage = value; OnPropertyChangedEx("InfoImage", VisualChangeType.Layout); } } } #region GetInfoImage internal Image GetInfoImage() { if (_InfoImage != null) return (_InfoImage); if (_InfoImageCache == null) _InfoImageCache = GridPanel.GetResourceImage("InfoImage"); return (_InfoImageCache); } #endregion #endregion #region InfoImageAlignment /// /// Gets or sets how the InfoImage is aligned within the cell /// [DefaultValue(Alignment.MiddleRight), Category("Appearance")] [Description("Indicates how the InfoImage is aligned within the cell.")] public Alignment InfoImageAlignment { get { return (_InfoImageAlignment); } set { if (_InfoImageAlignment != value) { _InfoImageAlignment = value; OnPropertyChanged("InfoImageAlignment"); } } } #endregion #region InfoImageOverlay /// /// Gets or sets how the InfoImage is overlayed with respect to the cell edit control. /// [DefaultValue(true), Category("Appearance")] [Description("Indicates how the InfoImage is overlayed with respect to the cell edit control.")] public bool InfoImageOverlay { get { return (TestState(Cs.InfoImageOverlay)); } set { if (value != InfoImageOverlay) { SetState(Cs.InfoImageOverlay, value); OnPropertyChanged("InfoImageOverlay"); } } } #endregion #region IsDataBound /// /// Gets whether the column is data bound. /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool IsDataBound { get { GridPanel panel = GridPanel; if (panel != null) return (panel.DataBinder.IsColumnDataBound(this)); return (false); } } #endregion #region IsFilteringEnabled /// /// Gets whether filtering is enabled for the column /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool IsFilteringEnabled { get { GridPanel panel = GridPanel; if (panel != null) { if (panel.EnableFiltering == false) return (false); if (_EnableFiltering != Tbool.NotSet) return (_EnableFiltering == Tbool.True); return (panel.EnableColumnFiltering == true); } return (false); } } #endregion #region IsGroupColumn /// /// Gets whether the column is a Grouping column /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool IsGroupColumn { get { GridPanel panel = GridPanel; if (panel != null) return (panel.GroupColumns.Contains(this)); return (false); } } #endregion #region IsHFrozen /// /// Gets whether the column is horizontally frozen /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool IsHFrozen { get { GridPanel panel = Parent as GridPanel; if (panel != null && panel.IsSubPanel == false) { if (panel.FrozenColumnCount > 0) { int n = panel.Columns.GetDisplayIndex(this); if (n < panel.FrozenColumnCount) return (true); ColumnGroupHeader cgh = panel.ColumnHeader.GetColumnGroupHeader(n); if (cgh != null) return (panel.ColumnHeader.IsGroupHeaderHFrozen(panel, cgh)); } } return (false); } } #endregion #region IsOnScreen /// /// Gets whether the column is visibly on screen. /// [Browsable (false)] [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)] public bool IsOnScreen { get { if (Visible == true) { GridPanel panel = Parent as GridPanel; if (panel != null) { Rectangle t = SViewRect; Rectangle bounds = BoundsRelative; if (IsHFrozen == false) { bounds.X -= HScrollOffset; GridColumn fcol = panel.Columns.GetLastVisibleFrozenColumn(); if (fcol != null) { int n = fcol.BoundsRelative.Right - t.X; t.X = fcol.BoundsRelative.Right; t.Width -= n; } } if (panel.IsVFrozen == false) bounds.Y -= VScrollOffset; return (t.IntersectsWith(bounds)); } } return (false); } } #endregion #region IsPrimaryColumn /// /// Gets whether the column is the Primary column /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool IsPrimaryColumn { get { GridPanel panel = Parent as GridPanel; if (panel != null) return (panel.PrimaryColumn == this); return (false); } } #endregion #region IsSelectable /// /// Gets whether the column can be selected. /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool IsSelectable { get { return (AllowSelection == true); } } #endregion #region IsSelected /// /// Gets or sets whether the column is selected /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool IsSelected { get { GridPanel panel = GridPanel; if (panel != null) { if (_SelectionUpdateCount != panel.SelectionUpdateCount) { SetState(Cs.Selected, panel.IsItemSelected(this)); _SelectionUpdateCount = panel.SelectionUpdateCount; } return (TestState(Cs.Selected)); } return (false); } set { GridPanel panel = GridPanel; if (panel != null) { if (panel.SetSelected(this, value) == true) { SetState(Cs.Selected, value); _SelectionUpdateCount = panel.SelectionUpdateCount; InvalidateRender(); panel.ColumnHeader.InvalidateRender(); } } } } #endregion #region IsSortColumn /// /// Gets whether the column is a Sort column /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool IsSortColumn { get { GridPanel panel = GridPanel; if (panel != null) return (panel.SortColumns.Contains(this)); return (false); } } #endregion #region MarkRowDirtyOnCellValueChange /// /// Gets or sets whether cell Value changes within this column /// will result in the associated Row being marked as 'dirty' /// [DefaultValue(true), Category("Data")] [Description("Indicates whether cell Value changes within this column will result in the associated Row being marked as 'dirty'.")] public bool MarkRowDirtyOnCellValueChange { get { return (TestState(Cs.MarkRowDirtyOnCellValueChange)); } set { if (value != MarkRowDirtyOnCellValueChange) { SetState(Cs.MarkRowDirtyOnCellValueChange, value); OnPropertyChanged("MarkRowDirtyOnCellValueChange"); } } } #endregion #region MinimumWidth /// /// Gets or sets the minimum column width (default value is 5) /// [DefaultValue(5), Category("Sizing")] [Description("Indicates the minimum column width (default value is 5).")] public int MinimumWidth { get { return _MinimumWidth; } set { if (_MinimumWidth != value) { if (value < 0) throw new ArgumentException("Value must be 0 or greater."); _MinimumWidth = value; NeedsMeasured = true; OnPropertyChangedEx("MinimumWidth", VisualChangeType.Layout); } } } #endregion #region Name /// /// Gets or sets the Column name. /// [DefaultValue(null)] [Description("Indicates the Column name.")] public string Name { get { return (_Name); } set { if (_Name != value) { _Name = value; if (String.IsNullOrEmpty(_HeaderText) == true) OnPropertyChangedEx("Name", VisualChangeType.Layout); else OnPropertyChanged("Name"); } } } #endregion #region NextVisibleColumn /// /// Gets the next visible column /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public GridColumn NextVisibleColumn { get { GridPanel panel = GridPanel; if (panel != null) return (panel.Columns.GetNextVisibleColumn(this)); return (null); } } #endregion #region NullString /// /// Gets or sets the default text to display for null values. /// [DefaultValue(null), Category("Data")] [Description("Indicates the default text to display for null values.")] public string NullString { get { return (_NullString); } set { if (_NullString != value) { _NullString = value; NeedsMeasured = true; OnPropertyChangedEx("NullString", VisualChangeType.Layout); } } } #endregion #region PrevVisibleColumn /// /// Gets the previous visible column /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public GridColumn PrevVisibleColumn { get { GridPanel panel = GridPanel; if (panel != null) return (panel.Columns.GetPrevVisibleColumn(this)); return (null); } } #endregion #region ReadOnly /// /// Gets or sets whether the user can change column cell contents /// [DefaultValue(false), Category("Behavior")] [Description("Indicates whether the user can change column cell contents.")] public bool ReadOnly { get { return (TestState(Cs.ReadOnly)); } set { if (ReadOnly != value) { SetState(Cs.ReadOnly, value); NeedsMeasured = true; OnPropertyChangedEx("ReadOnly", VisualChangeType.Render); } } } #endregion #region RenderControl /// /// Gets the default render control for the column cells /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public IGridCellEditControl RenderControl { get { if (_RenderControl == null) { RenderControl = (_RenderType != null) ? GetEditControl(_RenderType, _RenderParams) : GetEditControl(_EditorType, _EditorParams); if (_RenderControl != null) { if (_RenderControl.EditorPanel.Parent == null && SuperGrid != null) SuperGrid.Controls.Add(_RenderControl.EditorPanel); } } return (_RenderControl); } internal set { if (_RenderControl != value) { if (_RenderControl != null) { if (_RenderControl.EditorPanel.Parent != null) { SuperGrid.Controls.Remove(_RenderControl.EditorPanel); _RenderControl.EditorPanel.Visible = false; if (_RenderControl.EditorPanel.Controls.Count > 0) _RenderControl.EditorPanel.Controls[0].Visible = false; _RenderControl.EditorPanel.Dispose(); } _RenderControl.EditorCellBitmap = null; ((Control)_RenderControl).Dispose(); InvalidateLayout(); } _RenderControl = value; } } } #endregion #region RenderParams /// /// Gets or sets an array of arguments that match in number, /// order, and type the parameters of the RenderControl constructor /// to invoke. If empty or null, the default constructor is invoked. /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public object[] RenderParams { get { return (_RenderParams); } set { if (_RenderParams != value) { _RenderParams = value; RenderControl = null; NeedsMeasured = true; OnPropertyChangedEx("RenderParams", VisualChangeType.Layout); } } } #endregion #region RenderType /// /// Gets or sets the cell render control type (defaults to EditorType, when not set) /// [DefaultValue(null), Category("Data")] [Description("Indicates cell render control type (defaults to EditorType, when not set)")] [TypeConverter(typeof(EditTypeConverter))] [Editor("DevComponents.SuperGrid.Design.EditTypeEditor, DevComponents.SuperGrid.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=26d81176cfa2b486", typeof(UITypeEditor))] public Type RenderType { get { return (_RenderType); } set { if (value != _RenderType) { _RenderType = value; RenderControl = null; NeedsMeasured = true; OnPropertyChangedEx("RenderType", VisualChangeType.Layout); } } } #endregion #region ResizeMode /// /// Gets or sets how the column is resized by the user /// [DefaultValue(ColumnResizeMode.MoveFollowingElements), Category("Sizing")] [Description("Indicates how the column is resized by the user.")] public ColumnResizeMode ResizeMode { get { return (_ResizeMode); } set { if (_ResizeMode != value) { _ResizeMode = value; OnPropertyChanged("ResizeMode"); } } } #endregion #region SelectedCellCount /// /// Gets the current count of selected cells in the column. /// [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public int SelectedCellCount { get { int n = 0; GridPanel panel = GridPanel; if (panel != null) { if (panel.VirtualMode == true) { foreach (SelectedRange range in _SelectedCells.Ranges) n += range.Count; } else { foreach (SelectedRange range in _SelectedCells.Ranges) { for (int i = range.StartIndex; i <= range.EndIndex; i++) { GridRow row = panel.GetRowFromIndex(i) as GridRow; if (row != null) { if (row.Cells.Count > _ColumnIndex) { if (row.Cells[_ColumnIndex].AllowSelection == true) n++; } else { n++; } } } } } } return (n); } } #endregion #region ShowCustomFilterExpr /// /// Gets or sets whether the filter expression is displayed in the panel area /// [DefaultValue(Tbool.NotSet), Category("Filtering")] [Description("Indicates whether the filter expression is displayed in the panel area.")] public Tbool ShowPanelFilterExpr { get { return (_ShowPanelFilterExpr); } set { if (_ShowPanelFilterExpr != value) { _ShowPanelFilterExpr = value; OnPropertyChangedEx("ShowPanelFilterExpr", VisualChangeType.Render); } } } #endregion #region SortCycle /// /// Gets or sets how the sort direction cycles /// when the column header is clicked to sort. /// [Browsable(true)] [DefaultValue(SortCycle.NotSet), Category("Sorting")] [Description("Indicates how the sort direction cycles when the column header is clicked to sort.")] public SortCycle SortCycle { get { return (_SortCycle); } set { if (_SortCycle != value) { _SortCycle = value; OnPropertyChanged("SortCycle"); } } } #endregion #region SortDirection /// /// Gets or sets the Sorting direction (ascending or descending) /// [Browsable(false)] [DefaultValue(SortDirection.None), Category("Sorting")] [Description("Indicates the Sorting direction (ascending or descending).")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public SortDirection SortDirection { get { return (_SortDirection); } set { if (_SortDirection != value) { _SortDirection = value; OnSortDirectionChanged(); OnPropertyChangedEx("SortDirection", VisualChangeType.Render); } } } #region OnSortDirectionChanged private void OnSortDirectionChanged() { GridPanel panel = GridPanel; if (panel != null) { panel.NeedsSorted = true; panel.ColumnHeader.InvalidateHeader(panel, this); if (panel.VirtualMode == true) panel.VirtualRows.Clear(); } } #endregion #endregion #region SortIndicator /// /// Gets or sets the sort indicator /// [DefaultValue(SortIndicator.Auto), Category("Sorting")] [Description("Indicates the Sorting indicator.")] public SortIndicator SortIndicator { get { return (_SortIndicator); } set { if (_SortIndicator != value) { _SortIndicator = value; NeedsMeasured = true; OnSortIndicatorChanged(); } } } #region OnSortIndicatorChanged private void OnSortIndicatorChanged() { GridPanel panel = GridPanel; if (panel != null) panel.ColumnHeader.InvalidateRender(); OnPropertyChanged("SortIndicator"); } #endregion #endregion #region ToolTip /// /// Gets or sets the ToolTip text for the column header. /// [Localizable(true), DefaultValue(null), Category("Appearance")] [Description("Indicates ththe ToolTip text for the column header.")] public string ToolTip { get { return (_ToolTip); } set { if (_ToolTip != value) { _ToolTip = value; OnPropertyChanged("ToolTip"); } } } #endregion #region Width /// /// Gets or sets the column width. /// [DefaultValue(100), Category("Sizing")] [Description("Indicates the column width.")] public int Width { get { return _Width; } set { if (_Width != value) { _Width = value; OnWidthChanged(); } } } #region OnWidthChanged private void OnWidthChanged() { GridPanel panel = GridPanel; if (panel != null) SuperGrid.DoColumnResizedEvent(panel, this); NeedsMeasured = true; OnPropertyChangedEx("Width", VisualChangeType.Layout); } #endregion #endregion #endregion #region TestState private bool TestState(Cs state) { return ((_States & state) == state); } #endregion #region SetState private void SetState(Cs state, bool value) { if (value == true) _States |= state; else _States &= ~state; } #endregion #region OnEvent processing #region OnDisplayIndexChanged /// /// Raises DisplayIndexChanged event. /// /// Provides event arguments. protected virtual void OnDisplayIndexChanged(EventArgs e) { EventHandler handler = DisplayIndexChanged; if (handler != null) handler(this, e); } #endregion #endregion #region MeasureOverride /// /// Performs the layout of the item and sets the Size property to size that item will take. /// /// Layout information. /// /// protected override void MeasureOverride( GridLayoutInfo layoutInfo, GridLayoutStateInfo stateInfo, Size constraintSize) { if (NeedsResized == true || NeedsMeasured == true || stateInfo.GridPanel.NeedsMeasured == true) { Size sizeNeeded = Size.Empty; ColumnAutoSizeMode autoSizeMode = GetAutoSizeMode(); int baseWidth = Dpi.Width(MinimumWidth); switch (autoSizeMode) { case ColumnAutoSizeMode.AllCells: case ColumnAutoSizeMode.DisplayedCells: case ColumnAutoSizeMode.ColumnHeader: baseWidth = Math.Max(baseWidth, _HeaderSize.Width); break; } int height = 0; switch (autoSizeMode) { case ColumnAutoSizeMode.None: sizeNeeded.Width = Math.Max(baseWidth, Dpi.Width(Width)); break; case ColumnAutoSizeMode.AllCells: case ColumnAutoSizeMode.AllCellsExceptHeader: sizeNeeded.Width = GetColumnWidth(layoutInfo, stateInfo, autoSizeMode, stateInfo.GridPanel.Rows, baseWidth, 0, ref height); break; case ColumnAutoSizeMode.ColumnHeader: sizeNeeded = new Size(baseWidth, 0); MarkRowsToMeasure(stateInfo.GridPanel.Rows); break; default: sizeNeeded.Width = GetColumnWidth(layoutInfo, stateInfo, autoSizeMode, stateInfo.GridPanel.Rows, baseWidth, layoutInfo.ClientBounds.Height, ref height); break; } Size = sizeNeeded; NeedsResized = false; } } #region GetColumnWidth private int GetColumnWidth(GridLayoutInfo layoutInfo, GridLayoutStateInfo stateInfo, ColumnAutoSizeMode autoSizeMode, IEnumerable items, int width, int maxHeight, ref int height) { GridPanel panel = GridPanel; if (panel != null) { if (panel.VirtualMode == true) { if (panel.VirtualRowCount > 0) { //panel.VirtualRows.Clear(); int n = GetVirtualColumnWidthEx(layoutInfo, stateInfo, autoSizeMode, ref height); width = Math.Max(width, n); } } else { int n = GetColumnWidthEx(layoutInfo, stateInfo, autoSizeMode, items, maxHeight, ref height); width = Math.Max(width, n); } } return (width); } #region GetVirtualColumnWidthEx private int GetVirtualColumnWidthEx(GridLayoutInfo layoutInfo, GridLayoutStateInfo stateInfo, ColumnAutoSizeMode autoSizeMode, ref int height) { GridPanel panel = GridPanel; int start = panel.FirstOnScreenRowIndex; int end = panel.LastOnScreenRowIndex; int width = 0; for (int i = start; i <= end; i++) { GridRow row = panel.VirtualRows[i]; if (ColumnIndex < row.GridPanel.Columns.Count) { if (ColumnIndex < row.Cells.Count) { GridCell cell = row.Cells[ColumnIndex]; MeasureCell(layoutInfo, stateInfo, autoSizeMode, row, cell); width = Math.Max(width, cell.CellSize.Width); height += cell.Size.Height; } else { width = Math.Max(width, Width); } } } return (width); } #endregion #region GetColumnWidthEx private int GetColumnWidthEx(GridLayoutInfo layoutInfo, GridLayoutStateInfo stateInfo, ColumnAutoSizeMode autoSizeMode, IEnumerable items, int maxHeight, ref int height) { int width = 0; foreach (GridElement item in items) { GridRow row = item as GridRow; if (row != null && row.Visible == true) { if (ColumnIndex < row.GridPanel.Columns.Count) { if (ColumnIndex < row.Cells.Count) { GridCell cell = row.Cells[ColumnIndex]; if (maxHeight <= 0 || height < maxHeight) { MeasureCell(layoutInfo, stateInfo, autoSizeMode, row, cell); width = Math.Max(width, cell.CellSize.Width); height += cell.Size.Height; } else { cell.NeedsMeasured = true; } } else { width = Math.Max(width, Width); } } if (row.Rows != null && row.Expanded == true) { GridLayoutStateInfo itemStateInfo = new GridLayoutStateInfo(stateInfo.GridPanel, stateInfo.IndentLevel + 1); width = GetColumnWidth(layoutInfo, itemStateInfo, autoSizeMode, row.Rows, width, maxHeight, ref height); } } else { GridGroup group = item as GridGroup; if (group != null) { GridPanel panel = group.GridPanel; int n = GetColumnWidthEx(layoutInfo, stateInfo, autoSizeMode, group.Rows, maxHeight, ref height); n += panel.TreeButtonIndent + Dpi.Width(stateInfo.IndentLevel * panel.LevelIndentSize.Width); width = Math.Max(width, n); } } } return (width); } #endregion #endregion #region MeasureCell private void MeasureCell(GridLayoutInfo layoutInfo, GridLayoutStateInfo stateInfo, ColumnAutoSizeMode autoSizeMode, GridRow row, GridCell cell) { if (cell.NeedsMeasured || NeedsMeasured || row.NeedsMeasured || stateInfo.GridPanel.NeedsMeasured) { int rowHeight = row.GetRowHeight(); if (rowHeight > 0) { Size size = new Size(Width, rowHeight); if (autoSizeMode != ColumnAutoSizeMode.None) { cell.Measure(layoutInfo, stateInfo, Size.Empty); size.Width = cell.Size.Width; size.Width += GetColumnIndent(stateInfo.IndentLevel); } else { cell.Measure(layoutInfo, stateInfo, size); } cell.Size = size; } else { Size size = Size.Empty; if (autoSizeMode == ColumnAutoSizeMode.None) { size.Width = Width; size.Width -= GetColumnIndent(stateInfo.IndentLevel); size.Width = Math.Max(1, size.Width); } cell.Measure(layoutInfo, stateInfo, new Size(size.Width, 0)); if (autoSizeMode != ColumnAutoSizeMode.None) { size = cell.Size; size.Width += GetColumnIndent(stateInfo.IndentLevel); cell.Size = size; } else { size = cell.Size; size.Width = Width; cell.Size = size; } } cell.CellSize = cell.Size; } } #endregion #region MarkRowsToMeasure private void MarkRowsToMeasure(IEnumerable items) { foreach (GridElement item in items) { GridRow row = item as GridRow; if (row != null && row.Visible == true) { if (row.GetRowHeight() <= 0) row.NeedsMeasured = true; if (row.Rows != null && row.Expanded == true) MarkRowsToMeasure(row.Rows); } } } #endregion #endregion #region ArrangeOverride /// /// Performs the arrange pass layout of the item when final position and size of the item has been set. /// /// Layout information. /// /// Layout bounds protected override void ArrangeOverride(GridLayoutInfo layoutInfo, GridLayoutStateInfo stateInfo, Rectangle layoutBounds) { GridPanel panel = stateInfo.GridPanel; if (NeedsFilterScan == true || panel.NeedsFilterScan == true) { if (FilterAutoScan == true && (panel.Filter.Visible == true || panel.ColumnHeader.FilterImageVisibility != ImageVisibility.Never)) { NeedsFilterScan = false; FilterScan.BeginScan(); } } } #endregion #region RenderOverride /// /// Performs drawing of the item and its children. /// /// Holds contextual rendering information. protected override void RenderOverride(GridRenderInfo renderInfo) { RenderDesignerElement(renderInfo, Bounds); } #region RenderDesignerElement private void RenderDesignerElement( GridRenderInfo renderInfo, Rectangle r) { if (SuperGrid.DesignerElement == this) { int n = r.Y - (GridPanel.ColumnHeader.Bounds.Y + 4); r.X += Dpi.Width2; r.Y = GridPanel.ColumnHeader.Bounds.Y - Dpi.Width4; r.Width -= Dpi.Width6; r.Height += n + Dpi.Width4; if (r.Width > 0 && r.Height > 0) { using (Pen pen = new Pen(Color.Purple, Dpi.Width1)) { pen.DashStyle = DashStyle.Dash; renderInfo.Graphics.DrawRectangle(pen, r); } } } } #endregion #endregion #region GetHeaderText internal string GetHeaderText() { return (_HeaderText ?? _Name); } #endregion #region GetColumnIndent internal int GetColumnIndent(int indentLevel) { int n = 0; GridPanel panel = GridPanel; if (panel != null) { if (panel.PrimaryColumn == this) { if (panel.ShowTreeButtons == true || panel.ShowTreeLines == true) n += panel.TreeButtonIndent; if (panel.CheckBoxes == true) { if (panel.ShowTreeButtons == true || panel.ShowTreeLines == true) n += Dpi.Width3; n += Dpi.Width(panel.CheckBoxSize.Width + 2); } n += Dpi.Width(panel.LevelIndentSize.Width * indentLevel); } } return (n); } #endregion #region GetAutoSizeMode internal ColumnAutoSizeMode GetAutoSizeMode() { GridPanel panel = Parent as GridPanel; if (panel != null) { ColumnAutoSizeMode mode = AutoSizeMode; if (mode == ColumnAutoSizeMode.NotSet) { mode = panel.ColumnAutoSizeMode; if (mode != ColumnAutoSizeMode.NotSet) return (mode); } return (mode); } return (ColumnAutoSizeMode.None); } #endregion #region GetMaximumCellSize /// /// This routine calculates and returns the maximum cell /// size from each cell in the column, as limited by the /// given row scope ('AllRows' or 'OnScreenRows'). /// If 'includeHeader' is true, then the width of the header /// is included in the max calculation. /// ///Maximum cell size. public Size GetMaximumCellSize(RowScope scope, bool includeHeader) { Size size = Size.Empty; GridPanel panel = GridPanel; if (panel != null) { using (Graphics g = SuperGrid.CreateGraphics()) { GridLayoutInfo layoutInfo = new GridLayoutInfo(g, panel.BoundsRelative); GridLayoutStateInfo layoutState = new GridLayoutStateInfo(panel, 0); if (includeHeader == true) { Size oldSize = panel.ColumnHeader.Size; panel.ColumnHeader.MeasureHeader(layoutInfo, Size.Empty, panel, this); size.Width = _HeaderSize.Width; panel.ColumnHeader.Size = oldSize; } if (panel.VirtualMode == true) { int firstRow = 0; int lastRow = panel.VirtualRowCountEx; if (scope == RowScope.OnScreenRows) { firstRow = panel.FirstOnScreenRowIndex; lastRow = panel.LastOnScreenRowIndex + 1; } for (int i = firstRow; i < lastRow; i++) { GridRow row = panel.VirtualRows[i]; GridCell cell = row.Cells[ColumnIndex]; Size oldSize = cell.Size; cell.Measure(layoutInfo, layoutState, Size.Empty); int n = GetColumnIndent(cell.IndentLevel); size.Width = Math.Max(size.Width, cell.Size.Width + n); size.Height = Math.Max(size.Height, cell.Size.Height); cell.Size = oldSize; } } else { if (panel.Rows.Count > 0) { int firstRow = 0; int lastRow = panel.Rows.Count; if (scope == RowScope.OnScreenRows) { firstRow = panel.FirstOnScreenRowIndex; lastRow = firstRow + 100; } Size cellSize = GetMaximumCellSize( panel.Rows, firstRow, lastRow, layoutInfo, layoutState); size.Width = Math.Max(size.Width, cellSize.Width); size.Height = Math.Max(size.Height, cellSize.Height); } } } } return (size); } private Size GetMaximumCellSize(GridItemsCollection rows, int firstRow, int lastRow, GridLayoutInfo layoutInfo, GridLayoutStateInfo layoutState) { Size size = Size.Empty; for (int i = firstRow; i < lastRow; i++) { if (i >= rows.Count) break; GridContainer item = rows[i] as GridContainer; if (item != null) { Size cellSize = Size.Empty; if (item is GridRow) { cellSize = GetMaxRowCellSize( (GridRow) item, layoutInfo, layoutState); } else if (item is GridGroup) { cellSize = GetMaximumCellSize( item.Rows, 0, lastRow - i, layoutInfo, layoutState); } size.Width = Math.Max(size.Width, cellSize.Width); size.Height = Math.Max(size.Height, cellSize.Height); } } return (size); } #region GetMaxRowCellSize private Size GetMaxRowCellSize(GridRow row, GridLayoutInfo layoutInfo, GridLayoutStateInfo layoutState) { if (row.Cells.Count <= ColumnIndex) return (Size.Empty); GridCell cell = row.Cells[ColumnIndex]; Size oldSize = cell.Size; cell.Measure(layoutInfo, layoutState, Size.Empty); Size size = cell.Size; size.Width += GetColumnIndent(cell.IndentLevel); cell.Size = oldSize; if (row.Rows.Count > 0 && row.Expanded == true) { layoutState.IndentLevel++; foreach (GridContainer item in row.Rows) { if (item is GridRow) { Size cellSize = GetMaxRowCellSize((GridRow)item, layoutInfo, layoutState); size.Width = Math.Max(size.Width, cellSize.Width); size.Height = Math.Max(size.Height, cellSize.Height); } } layoutState.IndentLevel--; } return (size); } #endregion #endregion #region GetSelectedCells /// /// GetSelectedCells /// public SelectedElementCollection GetSelectedCells() { GridPanel panel = GridPanel; if (panel != null) { SelectedElementCollection cells = new SelectedElementCollection(SelectedCells.Count); panel.GetSelectedCells(cells, this); return (cells); } return (null); } #endregion #region EnsureVisible /// /// EnsureVisible /// /// public override void EnsureVisible(bool center) { if (Visible == true) { GridPanel panel = GridPanel; if (panel != null) { if (IsHFrozen == false) { Rectangle t = SViewRect; GridColumn pcol = panel.Columns.GetLastVisibleFrozenColumn(); if (pcol != null) { t.Width -= (pcol.BoundsRelative.Right - t.X); t.X = pcol.BoundsRelative.Right; } Rectangle bounds = BoundsRelative; if (bounds.Width >= t.Width || bounds.X - HScrollOffset < t.X) { int n = bounds.X - t.X; if (center == false || bounds.Width >= t.Width) SuperGrid.SetHScrollValue(n - 1); else SuperGrid.SetHScrollValue(n - (t.Width - bounds.Width)/2); } else if (bounds.X - HScrollOffset > t.Right - bounds.Width) { int n = bounds.X - (t.Right - bounds.Width); if (center == false) SuperGrid.SetHScrollValue(n + 1); else SuperGrid.SetHScrollValue(n + (t.Width - bounds.Width)/2); } } } } } #endregion #region ToggleSort /// /// ToggleSort /// public void ToggleSort() { GridPanel panel = GridPanel; if (panel != null) { SortDirection sortDirection; switch (_SortDirection) { case SortDirection.None: case SortDirection.Descending: sortDirection = SortDirection.Ascending; break; default: sortDirection = SortDirection.Descending; break; } panel.AddSort(this, sortDirection); SuperGrid.DoSortChangedEvent(panel); } } #endregion #region Edit support #region GetEditControl internal IGridCellEditControl GetEditControl(Type type, object[] args) { if (type != null) { IGridCellEditControl editor = Activator.CreateInstance(type, args) as IGridCellEditControl; if (editor != null) { if (editor is Control == false) throw new Exception("Edit/Render Type must be based on 'Control'."); editor.EditorPanel = new EditorPanel(); editor.EditorPanel.Visible = false; editor.EditorPanel.Controls.Add((Control) editor); } return (editor); } return (null); } #endregion #endregion #region Style support routines #region StyleVisualChangeHandler private void StyleVisualChangeHandler( INotifyPropertyChanged oldValue, INotifyPropertyChanged newValue) { NeedsMeasured = true; if (oldValue != null) oldValue.PropertyChanged -= StyleChanged; if (newValue != null) newValue.PropertyChanged += StyleChanged; } #endregion #region StyleChanged /// /// Occurs when one of element visual styles has property changes. /// Default implementation invalidates visual appearance of element. /// /// VisualStyle that changed. /// Event arguments. protected virtual void StyleChanged(object sender, PropertyChangedEventArgs e) { if (SuperGrid != null) { SuperGrid.UpdateStyleCount(); VisualChangeType changeType = ((VisualPropertyChangedEventArgs) e).ChangeType; if (changeType == VisualChangeType.Layout) { NeedsMeasured = true; InvalidateLayout(); } else { GridPanel.InvalidateRender(); } } } #endregion #region GetFilterStyle internal FilterColumnHeaderVisualStyle GetFilterStyle(StyleType e) { ValidateStyle(); if (EffectiveFilterStyles == null) EffectiveFilterStyles = new FilterColumnHeaderVisualStyles(); if (EffectiveFilterStyles.IsValid(e) == false) { FilterColumnHeaderVisualStyle style = new FilterColumnHeaderVisualStyle(); StyleType[] css = style.GetApplyStyleTypes(e); if (css != null) { foreach (StyleType cs in css) { style.ApplyStyle(SuperGrid.BaseVisualStyles.FilterColumnHeaderStyles[cs]); style.ApplyStyle(SuperGrid.DefaultVisualStyles.FilterColumnHeaderStyles[cs]); style.ApplyStyle(GridPanel.DefaultVisualStyles.FilterColumnHeaderStyles[cs]); style.ApplyStyle(FilterRowStyles[cs]); } } SuperGrid.DoGetFilterColumnHeaderStyleEvent(this, e, ref style); if (style.Background == null || style.Background.IsEmpty == true) style.Background = new Background(Color.White); if (style.Font == null) { Font font = SystemFonts.DefaultFont; style.Font = font; } EffectiveFilterStyles[e] = style; } return (EffectiveFilterStyles[e]); } #endregion #region GetHeaderStyle /// ///Gets the effective header style for the given StyleType. /// ///StyleType /// public ColumnHeaderVisualStyle GetHeaderStyle(StyleType e) { ValidateStyle(); if (EffectiveStyles == null) EffectiveStyles = new ColumnHeaderVisualStyles(); if (EffectiveStyles.IsValid(e) == false) { ColumnHeaderVisualStyle style = new ColumnHeaderVisualStyle(); StyleType[] css = style.GetApplyStyleTypes(e); if (css != null) { GridColumnHeader colHeader = GridPanel.ColumnHeader; ColumnGroupHeader cgh = colHeader.GetParentHeader(this) as ColumnGroupHeader; if (cgh != null) { if (colHeader.GetAutoApplyGroupColor(cgh) != true) cgh = null; } foreach (StyleType cs in css) { style.ApplyStyle(SuperGrid.BaseVisualStyles.ColumnHeaderStyles[cs]); style.ApplyStyle(SuperGrid.DefaultVisualStyles.ColumnHeaderStyles[cs]); style.ApplyStyle(GridPanel.DefaultVisualStyles.ColumnHeaderStyles[cs]); style.ApplyStyle(HeaderStyles[cs]); if (cgh != null) { ColumnHeaderVisualStyle gstyle = colHeader.GetEffectiveStyle(cgh, cs); if (gstyle.Background != null) { if (HeaderStyles[cs].Background == null || HeaderStyles[cs].Background.IsEmpty) style.Background = gstyle.Background.Copy(); } if (gstyle.TextColor.IsEmpty == false) { if (HeaderStyles[cs].TextColor.IsEmpty) style.TextColor = gstyle.TextColor; } } } style.ApplyDefaults(); } SuperGrid.DoGetColumnHeaderStyleEvent(this, e, ref style); if (style.Background == null || style.Background.IsEmpty == true) style.Background = new Background(Color.White); if (style.Font == null) style.Font = SystemFonts.DefaultFont; EffectiveStyles[e] = style; } return (EffectiveStyles[e]); } #endregion #region ApplyCellStyle internal void ApplyCellStyle(CellVisualStyle style, StyleType cs) { CellVisualStyle cstyle = GetEffectiveCellStyle(cs); style.ApplyStyle(cstyle); } #endregion #region GetEffectiveCellStyle /// ///Get the default Effective CellStyle for the given StyleType. /// /// /// public CellVisualStyle GetEffectiveCellStyle(StyleType type) { ValidateStyle(); if (_EffectiveCellStyles == null) _EffectiveCellStyles = new CellVisualStyles(); if (_EffectiveCellStyles.IsValid(type) == false) { GridPanel panel = GridPanel; int colIndex = panel.UseAlternateColumnStyle ? panel.Columns.GetDisplayIndex(this) : -1; CellVisualStyle cstyle = new CellVisualStyle(); panel.ApplyCellStyle(cstyle, type); if ((colIndex % 2) > 0) { cstyle.ApplyStyle(SuperGrid.BaseVisualStyles.AlternateColumnCellStyles[type]); cstyle.ApplyStyle(SuperGrid.DefaultVisualStyles.AlternateColumnCellStyles[type]); cstyle.ApplyStyle(GridPanel.DefaultVisualStyles.AlternateColumnCellStyles[type]); } cstyle.ApplyStyle(CellStyles[type]); _EffectiveCellStyles[type] = cstyle; } return (_EffectiveCellStyles[type]); } #endregion #region InvalidateStyle /// ///Invalidates the cached Style ///definition for all defined StyleTypes /// public void InvalidateStyle() { if (EffectiveStyles != null) { EffectiveStyles.Dispose(); EffectiveStyles = null; } if (EffectiveFilterStyles != null) { EffectiveFilterStyles.Dispose(); EffectiveFilterStyles = null; } InvalidateLayout(); } /// ///Invalidate the cached Style ///definition for the given StyleType /// /// public void InvalidateStyle(StyleType type) { if (_EffectiveStyles != null) { _EffectiveStyles[type] = null; _EffectiveFilterStyles[type] = null; InvalidateLayout(); } } #endregion #region ValidateStyle private void ValidateStyle() { if (_StyleUpdateCount != SuperGrid.StyleUpdateCount) { ClearEffectiveStyles(); _StyleUpdateCount = SuperGrid.StyleUpdateCount; } } #endregion #region ClearEffectiveStyles internal void ClearEffectiveStyles() { if (_EffectiveStyles != null) { _EffectiveStyles.Dispose(); _EffectiveStyles = null; } if (_EffectiveFilterStyles != null) { _EffectiveFilterStyles.Dispose(); _EffectiveFilterStyles = null; } if (_EffectiveCellStyles != null) { _EffectiveCellStyles.Dispose(); _EffectiveCellStyles = null; } } #endregion #endregion #region GetFilterPanelType internal FilterEditType GetFilterPanelType() { FilterEditType filterType = FilterEditType; if (filterType == FilterEditType.Auto) { IGridCellEditControl editor = EditControl; if (editor != null) { if (editor is ComboBox) { filterType = FilterEditType.ComboBox; } else { if (editor.EditorValueType == typeof(bool)) filterType = FilterEditType.CheckBox; else if (editor.EditorValueType == typeof(DateTime)) filterType = FilterEditType.DateTime; else filterType = FilterEditType.TextBox; } } else { filterType = FilterEditType.TextBox; } } SuperGrid.DoGetFilterEditTypeEvent(this, ref filterType); return (filterType); } #endregion #region Markup support private void MarkupHeaderTextChanged() { if (_HeaderTextMarkup != null) _HeaderTextMarkup.HyperLinkClick -= HeaderTextMarkupLinkClick; _HeaderTextMarkup = null; if (EnableHeaderMarkup == true) { if (MarkupParser.IsMarkup(_HeaderText) == true) { _HeaderTextMarkup = MarkupParser.Parse(_HeaderText); if (_HeaderTextMarkup != null) _HeaderTextMarkup.HyperLinkClick += HeaderTextMarkupLinkClick; } } } /// /// Occurs when a header text markup link is clicked /// protected virtual void HeaderTextMarkupLinkClick(object sender, EventArgs e) { HyperLink link = sender as HyperLink; SuperGrid.DoColumnHeaderMarkupLinkClickEvent(this, link); GridPanel.ColumnHeader.InvalidateHeader(GridPanel, this); } /// /// Gets plain Header text without text-markup (if text-markup is used in Text) /// [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public string PlainHeaderText { get { return (_HeaderTextMarkup != null ? _HeaderTextMarkup.PlainText : _HeaderText); } } #endregion #region ActivateFilterPopup /// ///Activates the column's FilterPopup /// public void ActivateFilterPopup() { GridPanel panel = GridPanel; if (panel != null) panel.ColumnHeader.ActivateFilterPopup(panel, this); } #endregion #region DeactivateFilterPopup /// ///Deactivates the column's FilterPopup /// public void DeactivateFilterPopup() { GridPanel panel = GridPanel; if (panel != null) panel.ColumnHeader.DeactivateFilterPopup(panel, this); } #endregion #region ToString /// /// ToString /// /// public override string ToString() { string s = base.ToString(); string t = GetHeaderText(); if (String.IsNullOrEmpty(t) == false) s += ": (\"" + t + "\")"; return (s); } #endregion #region ColumnStates [Flags] private enum Cs { AdjustSortImagePositionByMargin = (1 << 0), AllowEdit = (1 << 1), EnableGroupHeaderMarkup = (1 << 2), EnableHeaderMarkup = (1 << 3), FilterAutoScan = (1 << 4), FilterError = (1 << 5), FilterExprUsesName = (1 << 6), MarkRowDirtyOnCellValueChange = (1 << 7), NeedsFilterScan = (1 << 8), NeedsResized = (1 << 9), Processed = (1 << 10), ReadOnly = (1 << 11), Selected = (1 << 12), InfoImageOverlay = (1 << 13), } #endregion #region IDisposable /// /// Dispose /// public void Dispose() { CellStyles = null; HeaderStyles = null; FilterRowStyles = null; if (_HeaderTextMarkup != null) _HeaderTextMarkup.HyperLinkClick -= HeaderTextMarkupLinkClick; ClearEffectiveStyles(); } #endregion } #region enums #region ColumnAutoSizeMode /// /// Defines columns auto-sizing mode. /// public enum ColumnAutoSizeMode { /// /// The sizing behavior of the column is inherited /// from the GridPanel.AutoSizeColumnsMode property. /// NotSet, /// /// Auto-sizing does not take place. /// None, /// /// The column width adjusts so that the widths of all columns /// exactly fills the display area of the control, requiring /// horizontal scrolling only to keep column widths above the /// ColumnHeader.MinimumWidth property values. Relative column widths /// are determined by the relative Column.FillWeight property values. /// Fill, /// /// The column width adjusts to fit the contents of all cells in the column /// that are in rows currently displayed on screen, excluding the header cell. /// DisplayedCellsExceptHeader, /// /// The column width adjusts to fit the contents of all cells in the column /// that are in rows currently displayed on screen, including the header cell. /// DisplayedCells, /// /// The column width adjusts to fit the contents of the column header cell. /// ColumnHeader, /// /// The column width adjusts to fit the contents of all /// cells in the column, excluding the header cell. /// AllCellsExceptHeader, /// /// The column width adjusts to fit the contents of all /// cells in the column, including the header cell. /// AllCells } #endregion #region ColumnAutoMode /// /// Indicates the column sorting mode /// public enum ColumnSortMode { /// /// No sorting permitted /// None, /// /// Can participate in Single column sorts only /// Single, /// /// Can participate in Single and Multiple column sorts /// Multiple, } #endregion #region ColumnResizeMode /// /// ColumnResizeMode /// public enum ColumnResizeMode { /// /// The element cannot be resized by the user /// None, /// /// The size of the element plus that of its adjacent element /// is changed so that the total size of the elements is maintained /// MaintainTotalWidth, /// /// When the element size is changed, all following /// elements are offset accordingly /// MoveFollowingElements, } #endregion #region SortIndicator /// /// SortIndicator /// public enum SortIndicator { /// /// No indicator is displayed /// None, /// /// Ascending indicator is displayed /// Ascending, /// /// Descending indicator is displayed /// Descending, /// /// Set automatically based on current /// column sort criteria /// Auto, } #endregion #region RowScope /// /// RowScope /// public enum RowScope { /// /// All Rows /// AllRows, /// /// Only On Screen rows /// OnScreenRows, } #endregion #endregion #region EditTypeConverter /// /// EditTypeConverter /// public class EditTypeConverter : TypeConverter { /// /// ConvertTo /// /// /// /// /// /// public override object ConvertTo( ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string)) { Type type = value as Type; if (type != null) return (type.Name); } return (base.ConvertTo(context, culture, value, destinationType)); } } #endregion }