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