6532 lines
189 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using DevComponents.DotNetBar.SuperGrid.Primitives;
using DevComponents.DotNetBar.SuperGrid.Style;
using DevComponents.SuperGrid.TextMarkup;
namespace DevComponents.DotNetBar.SuperGrid
{
/// <summary>
/// Represents a layout of column headers
/// </summary>
[TypeConverter(typeof(BlankExpandableObjectConverter))]
public class GridColumnHeader : GridElement
{
#region Constants
private const int SeparatorWidth = 2;
private const int ImageCacheSize = 8;
#endregion
#region Static data
private static object _lastSelectedItem;
#endregion
#region Private variables
private GridColumnCollection _Columns;
private ColumnGroupHeaderCollection _GroupHeaders;
private HeaderArea _HitArea;
private object _HitItem;
private HeaderArea _LastHitArea;
private object _LastHitItem;
private GridColumn _ResizeColumn;
private int _MouseDownDelta;
private HeaderArea _MouseDownHitArea;
private object _MouseDownHitItem;
private Point _MouseDownPoint;
private MouseButtons _MouseDownButtons;
private bool _DragSelection;
private bool _DragStarted;
private bool _Reordering;
private bool _Resizing;
private int _ResizeWidth;
private int _MinRowHeight;
private int _RowHeight;
private GridColumn _SeparatorColumn;
private bool _SeparatorIsRight;
private FloatWindow _HeaderFw;
private FloatWindow _SeparatorFw;
private int _OrderTextOffset;
private int _SelectAllCount;
private ColumnHeaderRowVisualStyles _EffectiveRowHeaderStyles;
private int _StyleUpdateCount;
private bool _ShowHeaderImages = true;
private Image _AscendingSortImage;
private int _AscendingSortImageIndex = -1;
private Image[] _AscendingSortCacheImages = new Image[ImageCacheSize];
private Image _DescendingSortImage;
private int _DescendingSortImageIndex = -1;
private Image[] _DescendingSortCacheImages = new Image[ImageCacheSize];
private Alignment _SortImageAlignment = Alignment.NotSet;
private Image _FilterImage;
private int _FilterImageIndex = -1;
private Image[] _FilterCacheImages = new Image[ImageCacheSize * 2];
private ImageVisibility _FilterImageVisibility = ImageVisibility.Auto;
private Alignment _FilterImageAlignment = Alignment.NotSet;
private FilterPopup _FilterMenu;
private bool _LockedColumn;
private bool _ShowFilterToolTips = true;
private bool _ShowToolTips = true;
private bool _ShowGroupColumnHeaders = true;
private bool _AutoApplyGroupColors = true;
private string _RowHeaderText;
#endregion
#region Internal properties
#region Columns
internal GridColumnCollection Columns
{
get { return (_Columns); }
set { _Columns = value; }
}
#endregion
#region RowHeaderBounds
internal Rectangle RowHeaderBounds
{
get
{
GridPanel panel = GridPanel;
if (panel != null)
{
Rectangle r = Bounds;
r.Width = panel.RowHeaderWidthEx;
return (r);
}
return (Rectangle.Empty);
}
}
#endregion
#region SelectAllCount
internal int SelectAllCount
{
get { return (_SelectAllCount); }
set { _SelectAllCount = value; }
}
#endregion
#endregion
#region Public properties
#region AscendingSortImage
/// <summary>
/// Gets or sets the Ascending sort image
/// </summary>
[DefaultValue(null), Category("Appearance")]
[Description("Indicates the Ascending sort image.")]
public Image AscendingSortImage
{
get { return (_AscendingSortImage); }
set
{
if (_AscendingSortImage != value)
{
_AscendingSortImage = value;
OnPropertyChangedEx("AscendingSortImage", VisualChangeType.Render);
}
}
}
#region GetAscendingSortImage
internal Image GetAscendingSortImage(GridColumn column)
{
if (_AscendingSortImage != null)
return (_AscendingSortImage);
if (_AscendingSortImageIndex >= 0)
{
ImageList imageList = GridPanel.ImageList;
if (imageList != null && _AscendingSortImageIndex < imageList.Images.Count)
return (imageList.Images[_AscendingSortImageIndex]);
}
return (GetAscendingSortImageEx(column));
}
#region GetAscendingSortImageEx
internal Image GetAscendingSortImageEx(GridColumn column)
{
StyleState state = GetStyleState(column, column.IsSelected);
Image cacheImage = _AscendingSortCacheImages[(int)state];
if (cacheImage == null)
{
int width = Dpi.Width5;
int height = Dpi.Height3;
if ((width % 2) == 0)
width++;
Rectangle r = new Rectangle(0, 0, width, height);
Image image = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(image))
{
g.SmoothingMode = SmoothingMode.AntiAlias;
using (GraphicsPath path = new GraphicsPath())
{
Point pt = new Point(r.X + r.Width / 2, r.Top);
Point[] pts =
{
pt,
new Point(r.Right - 1, r.Bottom - 1),
new Point(r.Left, r.Bottom - 1),
pt
};
path.AddLines(pts);
ColumnHeaderRowVisualStyle style = GetEffectiveRowHeaderStyleEx(state);
Color color = style.SortIndicatorColor;
if (color.IsEmpty)
color = Color.Black;
using (Brush br = new SolidBrush(color))
g.FillPath(br, path);
using (Pen pen = new Pen(color))
g.DrawPath(pen, path);
}
}
_AscendingSortCacheImages[(int)state] = image;
cacheImage = image;
}
return (cacheImage);
}
#endregion
#endregion
#endregion
#region AscendingSortImageIndex
/// <summary>
/// Gets or sets the Ascending Sort Image index
/// </summary>
[Browsable(true), DefaultValue(-1)]
[Category("Appearance"), Description("Indicates the Ascending Sort Image index.")]
[Editor("DevComponents.SuperGrid.Design.ImageIndexEditor, DevComponents.SuperGrid.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=26d81176cfa2b486", typeof(UITypeEditor))]
[TypeConverter(typeof(ImageIndexConverter))]
public int AscendingSortImageIndex
{
get { return (_AscendingSortImageIndex); }
set
{
if (_AscendingSortImageIndex != value)
{
_AscendingSortImageIndex = value;
OnPropertyChangedEx("AscendingSortImageIndex", VisualChangeType.Layout);
}
}
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
private void ResetAscendingSortImageIndex()
{
_AscendingSortImageIndex = -1;
}
#endregion
#region AutoApplyGroupColors
/// <summary>
/// Gets or sets whether Group Header color properties
/// (ie. Background and TextColor) are automatically
/// applied to group Column Headers.
/// </summary>
[DefaultValue(true), Category("Appearance")]
[Description("Indicates whether Group Header color properties (ie. Background and TextColor) are automatically applied to group Column Headers.")]
public bool AutoApplyGroupColors
{
get { return (_AutoApplyGroupColors); }
set
{
if (_AutoApplyGroupColors != value)
{
_AutoApplyGroupColors = value;
OnPropertyChangedEx("AutoApplyGroupColors", VisualChangeType.Render);
}
}
}
#endregion
#region Bounds
///<summary>
/// Gets the scroll adjusted bounds
///</summary>
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override Rectangle Bounds
{
get
{
GridPanel panel = GridPanel;
if (panel != null)
{
Rectangle r = BoundsRelative;
if (panel.IsSubPanel == true)
{
r.X -= HScrollOffset;
if (IsVFrozen == false)
r.Y -= VScrollOffset;
}
return (r);
}
return (Rectangle.Empty);
}
}
#endregion
#region DescendingSortImage
/// <summary>
/// Gets or sets the Descending sort image
/// </summary>
[DefaultValue(null), Category("Appearance")]
[Description("Indicates the Descending sort image.")]
public Image DescendingSortImage
{
get { return (_DescendingSortImage); }
set
{
if (_DescendingSortImage != value)
{
_DescendingSortImage = value;
OnPropertyChangedEx("DescendingSortImage", VisualChangeType.Render);
}
}
}
#region GetDescendingSortImage
internal Image GetDescendingSortImage(GridColumn column)
{
if (_DescendingSortImage != null)
return (_DescendingSortImage);
if (_DescendingSortImageIndex >= 0)
{
ImageList imageList = GridPanel.ImageList;
if (imageList != null && _DescendingSortImageIndex < imageList.Images.Count)
return (imageList.Images[_DescendingSortImageIndex]);
}
return (GetDescendingSortImageEx(column));
}
#region GetDescendingSortImageEx
internal Image GetDescendingSortImageEx(GridColumn column)
{
StyleState state = GetStyleState(column, column.IsSelected);
Image cacheImage = _DescendingSortCacheImages[(int)state];
if (cacheImage == null)
{
int width = Dpi.Width5;
int height = Dpi.Height3;
if ((width % 2) == 0)
width++;
Rectangle r = new Rectangle(0, 0, width, height);
Image image = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(image))
{
g.SmoothingMode = SmoothingMode.AntiAlias;
using (GraphicsPath path = new GraphicsPath())
{
Point pt = new Point(r.X + width / 2, r.Bottom - 1);
Point[] pts =
{
pt,
new Point(r.Right - 1, r.Top),
new Point(r.Left, r.Top),
pt
};
path.AddLines(pts);
ColumnHeaderRowVisualStyle style = GetEffectiveRowHeaderStyleEx(state);
Color color = style.SortIndicatorColor;
if (color.IsEmpty)
color = Color.Black;
using (Brush br = new SolidBrush(color))
g.FillPath(br, path);
using (Pen pen = new Pen(color))
g.DrawPath(pen, path);
}
}
_DescendingSortCacheImages[(int)state] = image;
cacheImage = image;
}
return (cacheImage);
}
#endregion
#endregion
#endregion
#region DescendingSortImageIndex
/// <summary>
/// Gets or sets the Descending Sort Image index
/// </summary>
[Browsable(true), DefaultValue(-1)]
[Category("Appearance"), Description("Indicates the Descending Sort Image index.")]
[Editor("DevComponents.SuperGrid.Design.ImageIndexEditor, DevComponents.SuperGrid.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=26d81176cfa2b486", typeof(UITypeEditor))]
[TypeConverter(typeof(ImageIndexConverter))]
public int DescendingSortImageIndex
{
get { return (_DescendingSortImageIndex); }
set
{
if (_DescendingSortImageIndex != value)
{
_DescendingSortImageIndex = value;
OnPropertyChangedEx("DescendingSortImageIndex", VisualChangeType.Layout);
}
}
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
private void ResetDescendingSortImageIndex()
{
_DescendingSortImageIndex = -1;
}
#endregion
#region FilterImage
/// <summary>
/// Gets or sets the default
/// image to display in the column header.
/// </summary>
[DefaultValue(null), Category("Filtering")]
[Description("Indicates the default image to display in the column header.")]
public Image FilterImage
{
get { return (_FilterImage); }
set
{
if (_FilterImage != value)
{
_FilterImage = value;
NeedsMeasured = true;
OnPropertyChangedEx("FilterImage", VisualChangeType.Layout);
}
}
}
#region GetFilterImage
internal Image GetFilterImage(GridColumn column)
{
bool inFilter;
StyleState state = GetFilterImageState(column, out inFilter);
return (GetFilterImage(column, state, inFilter));
}
internal Image GetFilterImage(
GridColumn column, StyleState state, bool inFilter)
{
if (_FilterImage != null)
return (_FilterImage);
if (_FilterImageIndex >= 0)
{
ImageList imageList = GridPanel.ImageList;
if (imageList != null && _FilterImageIndex < imageList.Images.Count)
return (imageList.Images[_FilterImageIndex]);
}
return (GetFilterImageEx(state, inFilter));
}
#region GetFilterImageEx
private Image GetFilterImageEx(StyleState state, bool inFilter)
{
int n = (int)state;
if (inFilter == true)
n += ImageCacheSize;
Image cacheImage = _FilterCacheImages[n];
if (cacheImage == null)
{
Image image = new Bitmap(Dpi.Width8, Dpi.Height8);
using (Graphics g = Graphics.FromImage(image))
{
g.SmoothingMode = SmoothingMode.AntiAlias;
using (GraphicsPath path = new GraphicsPath())
{
Point[] pts =
{
new Point(0, 0),
new Point(Dpi.Width7, 0),
new Point(Dpi.Width7, Dpi.Height1),
new Point(Dpi.Width4, Dpi.Height4),
new Point(Dpi.Width4, Dpi.Height7),
new Point(Dpi.Width3, Dpi.Height6),
new Point(Dpi.Width3, Dpi.Height4),
new Point(0, Dpi.Height1),
new Point(0, 0),
};
path.AddLines(pts);
Rectangle r = new Rectangle(Dpi.Width1, Dpi.Height1, Dpi.Width6, Dpi.Height3);
ColumnHeaderRowVisualStyle style = GetEffectiveRowHeaderStyleEx(state);
Color color = style.FilterBorderColor;
if (color.IsEmpty)
color = Color.DimGray;
if (inFilter == false)
style = GetEffectiveRowHeaderStyleEx(state & ~StyleState.MouseOver);
Background back = (style.FilterBackground != null && style.FilterBackground.IsEmpty == false)
? style.FilterBackground : new Background(Color.White);
using (Brush br = back.GetBrush(r))
g.FillPath(br, path);
using (Pen pen = new Pen(color))
g.DrawPath(pen, path);
}
}
_FilterCacheImages[n] = image;
cacheImage = image;
}
return (cacheImage);
}
#region GetFilterImageState
private StyleState GetFilterImageState(GridColumn column, out bool inFilter)
{
inFilter = false;
StyleState state = GetRowHeaderState();
state &= ~(StyleState.MouseOver | StyleState.Selected);
GridColumn hitColumn = _HitItem as GridColumn;
if (column == hitColumn)
{
state |= StyleState.MouseOver;
if (_HitArea == HeaderArea.InFilterMenu)
inFilter = true;
}
if (column != null && string.IsNullOrEmpty(column.FilterExpr) == false)
state |= StyleState.Selected;
return (state);
}
#endregion
#endregion
#endregion
#endregion
#region FilterImageAlignment
/// <summary>
/// Gets or sets the alignment of the filter Image
/// </summary>
[DefaultValue(Alignment.NotSet), Category("Appearance")]
[Description("Indicates the alignment of the filter Image.")]
public Alignment FilterImageAlignment
{
get { return (_FilterImageAlignment); }
set
{
if (_FilterImageAlignment != value)
{
_FilterImageAlignment = value;
OnPropertyChangedEx("FilterImageAlignment", VisualChangeType.Layout);
}
}
}
#endregion
#region FilterImageIndex
/// <summary>
/// Gets or sets the Filter image index
/// </summary>
[Browsable(true), DefaultValue(-1)]
[Category("Appearance"), Description("Indicates the Filter Row image index.")]
[Editor("DevComponents.SuperGrid.Design.ImageIndexEditor, DevComponents.SuperGrid.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=26d81176cfa2b486", typeof(UITypeEditor))]
[TypeConverter(typeof(ImageIndexConverter))]
public int FilterImageIndex
{
get { return (_FilterImageIndex); }
set
{
if (_FilterImageIndex != value)
{
_FilterImageIndex = value;
OnPropertyChangedEx("FilterImageIndex", VisualChangeType.Layout);
}
}
}
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
private void ResetFilterImageIndex()
{
_FilterImageIndex = -1;
}
#endregion
#region FilterImageVisibility
/// <summary>
/// Gets or sets the visibility of the header filter image
/// </summary>
[DefaultValue(ImageVisibility.Auto), Category("Filtering")]
[Description("Indicates the visibility of the header filter image.")]
public ImageVisibility FilterImageVisibility
{
get { return (_FilterImageVisibility); }
set
{
if (_FilterImageVisibility != value)
{
_FilterImageVisibility = value;
OnPropertyChangedEx("FilterImageVisibility", VisualChangeType.Layout);
}
}
}
#endregion
#region GroupHeaders
/// <summary>
/// Gets a reference to the collection of grid columns
/// </summary>
[Category("Appearance")]
[Description("Indicates the collection of grid columns.")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public ColumnGroupHeaderCollection GroupHeaders
{
get
{
if (_GroupHeaders == null)
{
_GroupHeaders = new ColumnGroupHeaderCollection();
_GroupHeaders.Parent = this;
_GroupHeaders.CollectionChanged += GroupHeadersCollectionChanged;
_GroupHeaders.PropertyChanged += GroupHeadersPropertyChanged;
_GroupHeaders.GroupHeaderMarkupLinkClick += GroupHeaderMarkupLinkClick;
}
return (_GroupHeaders);
}
}
#region GroupHeadersCollectionChanged
void GroupHeadersCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
NeedsMeasured = true;
SuperGrid.StyleUpdateCount++;
InvalidateLayout();
}
#endregion
#region GroupHeadersPropertyChanged
void GroupHeadersPropertyChanged(object sender, PropertyChangedEventArgs e)
{
NeedsMeasured = true;
InvalidateStyle();
InvalidateLayout();
}
#endregion
#region GroupHeadersMarkupLinkClick
void GroupHeaderMarkupLinkClick(object sender, GroupHeaderMarkupLinkClickEventArgs e)
{
SuperGrid.DoColumnGroupHeaderMarkupLinkClickEvent(
GridPanel, this, e.GroupHeader, e.HyperLink);
}
#endregion
#endregion
#region MinRowHeight
///<summary>
/// Gets or sets the minimum height of the ColumnHeader row
///</summary>
[DefaultValue(0), Category("Style")]
[Description("Indicates the minimum height of the ColumnHeader row")]
public int MinRowHeight
{
get { return (_MinRowHeight); }
set
{
if (_MinRowHeight != value)
{
if (value < 0)
throw new Exception("MinRowHeight cannot be negative");
_MinRowHeight = value;
NeedsMeasured = true;
OnPropertyChangedEx("MinRowHeight", VisualChangeType.Layout);
}
}
}
#endregion
#region RowHeaderText
///<summary>
/// Gets or sets the associated row header text (only
/// displayed if TopLeftHeaderSelectBehavior is set to NoSelection).
///</summary>
[DefaultValue(null), Category("Appearance")]
[Description("Indicates the associated row header text (only displayed if TopLeftHeaderSelectBehavior is set to NoSelection).")]
public string RowHeaderText
{
get { return (_RowHeaderText); }
set
{
if (_RowHeaderText != value)
{
_RowHeaderText = value;
NeedsMeasured = true;
OnPropertyChangedEx("RowHeaderText", VisualChangeType.Render);
}
}
}
#endregion
#region RowHeight
///<summary>
/// Gets or sets the height of the ColumnHeader row
///</summary>
[DefaultValue(0), Category("Style")]
[Description("Indicates the height of the ColumnHeader row")]
public int RowHeight
{
get { return (_RowHeight); }
set
{
if (_RowHeight != value)
{
if (value < 0)
throw new Exception("RowHeight cannot be negative");
_RowHeight = value;
NeedsMeasured = true;
OnPropertyChangedEx("RowHeight", VisualChangeType.Layout);
}
}
}
#endregion
#region ShowFilterToolTips
/// <summary>
/// Gets or sets whether tooltips are shown when over the filter image
/// </summary>
[DefaultValue(true), Category("Filtering")]
[Description("Indicates whether tooltips are shown when over the filter image.")]
public bool ShowFilterToolTips
{
get { return (_ShowFilterToolTips); }
set
{
if (value != _ShowFilterToolTips)
{
_ShowFilterToolTips = value;
OnPropertyChanged("ShowFilterToolTips");
}
}
}
#endregion
#region ShowHeaderImages
/// <summary>
/// Gets or sets whether Column Header images are displayed
/// </summary>
[DefaultValue(true), Category("Appearance")]
[Description("Indicates whether Column Header images are displayed.")]
public bool ShowHeaderImages
{
get { return (_ShowHeaderImages); }
set
{
if (_ShowHeaderImages != value)
{
_ShowHeaderImages = value;
NeedsMeasured = true;
OnPropertyChangedEx("ShowHeaderImages", VisualChangeType.Layout);
}
}
}
#endregion
#region ShowGroupColumnHeaders
///<summary>
/// Gets or sets whether column headers are shown
/// by default when the columns are within a grouped header
///</summary>
[DefaultValue(true), Category("Appearance")]
[Description("Indicates whether column headers are shown by default when the columns are within a grouped header.")]
public bool ShowGroupColumnHeaders
{
get { return (_ShowGroupColumnHeaders); }
set
{
if (_ShowGroupColumnHeaders != value)
{
_ShowGroupColumnHeaders = value;
OnPropertyChangedEx("ShowGroupColumnHeaders", VisualChangeType.Layout);
}
}
}
#endregion
#region ShowToolTips
/// <summary>
/// Gets or sets whether tooltips are shown for the column header
/// </summary>
[DefaultValue(true), Category("Filtering")]
[Description("Indicates whether tooltips are shown for the column header.")]
public bool ShowToolTips
{
get { return (_ShowToolTips); }
set
{
if (value != _ShowToolTips)
{
_ShowToolTips = value;
OnPropertyChanged("ShowToolTips");
}
}
}
#endregion
#region SortImageAlignment
/// <summary>
/// Gets or sets the alignment of the Sort Images
/// </summary>
[DefaultValue(Alignment.NotSet), Category("Appearance")]
[Description("Indicates the alignment of the Sort Images.")]
public Alignment SortImageAlignment
{
get { return (_SortImageAlignment); }
set
{
if (_SortImageAlignment != value)
{
_SortImageAlignment = value;
OnPropertyChangedEx("SortImageAlignment", VisualChangeType.Layout);
}
}
}
#endregion
#endregion
#region MeasureOverride
/// <summary>
/// Performs the layout of the item and sets
/// the Size property to size that item will take.
/// </summary>
/// <param name="layoutInfo">Layout information.</param>
/// <param name="stateInfo"></param>
/// <param name="constraintSize"></param>
protected override void MeasureOverride(
GridLayoutInfo layoutInfo, GridLayoutStateInfo stateInfo, Size constraintSize)
{
GridPanel panel = stateInfo.GridPanel;
ResetProcessStates(panel);
Size sizeNeeded = MeasureGroupHeaders(layoutInfo, constraintSize, panel);
MeasureColumnHeaders(layoutInfo, constraintSize, panel, ref sizeNeeded);
if (panel.ShowRowHeaders == true)
sizeNeeded.Width += panel.RowHeaderWidthEx;
Size = sizeNeeded;
}
#region MeasureGroupHeaders
private Size MeasureGroupHeaders(
GridLayoutInfo layoutInfo, Size constraintSize, GridPanel panel)
{
Size sizeNeeded = Size.Empty;
if (_GroupHeaders != null)
{
foreach (ColumnGroupHeader cgh in _GroupHeaders)
{
if (cgh.Visible == true)
{
Size size = MeasureGroupHeader(layoutInfo, constraintSize, panel, cgh);
sizeNeeded.Width += size.Width;
sizeNeeded.Height = Math.Max(size.Height, sizeNeeded.Height);
}
}
}
return (sizeNeeded);
}
#region MeasureGroupHeader
private Size MeasureGroupHeader(GridLayoutInfo layoutInfo,
Size constraintSize, GridPanel panel, ColumnGroupHeader cgh)
{
Size sizeNeeded = MeasureGroupHeaderColumn(layoutInfo, constraintSize, panel, cgh);
if (cgh.RowHeight > 0)
{
sizeNeeded.Height = Dpi.Height(cgh.RowHeight);
}
else
{
int mrh = Dpi.Height(cgh.MinRowHeight);
if (sizeNeeded.Height < mrh)
sizeNeeded.Height = mrh;
}
cgh.ContentSize = sizeNeeded;
if (cgh.GroupHeaders.Count > 0)
{
Size subSize = Size.Empty;
foreach (ColumnGroupHeader gh in cgh.GroupHeaders)
{
Size size = MeasureGroupHeader(layoutInfo, constraintSize, panel, gh);
subSize.Height = Math.Max(subSize.Height, size.Height);
subSize.Width += size.Width;
}
sizeNeeded.Height += subSize.Height;
sizeNeeded.Width = Math.Max(sizeNeeded.Width, subSize.Width);
}
else
{
Size baseSize = Size.Empty;
GridColumnCollection columns = _Columns;
bool showColumnHeaders = GetShowRootColumnHeaders(cgh);
int[] map = columns.DisplayIndexMap;
for (int i = cgh.StartDisplayIndex; i <= cgh.EndDisplayIndex; i++)
{
if ((uint)i >= map.Length)
break;
int index = map[i];
GridColumn column = columns[index];
if (column.Visible == true)
{
if (showColumnHeaders == true)
{
Size size = MeasureHeader(layoutInfo, constraintSize, panel, column);
baseSize.Width += size.Width;
baseSize.Height = Math.Max(baseSize.Height, size.Height);
}
}
}
sizeNeeded.Height += baseSize.Height;
if (constraintSize.Width > 0)
sizeNeeded.Width = baseSize.Width;
else
sizeNeeded.Width = Math.Max(sizeNeeded.Width, baseSize.Width);
}
cgh.Size = sizeNeeded;
return (sizeNeeded);
}
#region MeasureGroupHeaderColumn
private Size MeasureGroupHeaderColumn(GridLayoutInfo layoutInfo,
Size constraintSize, GridPanel panel, ColumnGroupHeader cgh)
{
ColumnHeaderVisualStyle style = GetSizingStyle(panel, cgh);
Size sizeNeeded = MeasureGroupHeaderTextAndImage(layoutInfo, constraintSize, panel, cgh, style);
sizeNeeded.Width += Dpi.Width8;
sizeNeeded.Height += Dpi.Height4;
return (sizeNeeded);
}
#region MeasureGroupHeaderTextAndImage
private Size MeasureGroupHeaderTextAndImage(GridLayoutInfo layoutInfo, Size constraintSize,
GridPanel panel, ColumnGroupHeader cgh, ColumnHeaderVisualStyle style)
{
Size sizeNeeded = Size.Empty;
object figure = (_ShowHeaderImages == true) ? style.GetFigure(panel) : null;
Size figureSize = style.GetFigureSize(panel);
Alignment imageAlignment = style.ImageAlignment;
if (style.IsOverlayImage == true)
imageAlignment = Alignment.MiddleCenter;
Size borderSize = style.GetBorderSize(true);
int bwidth = (borderSize.Width * 2);
int bheight = (borderSize.Height * 2);
int width = constraintSize.Width > 0 ? GetDefaultGroupHeaderWidth(panel, cgh) : 0;
if (width > 0)
{
width -= bwidth;
switch (imageAlignment)
{
case Alignment.TopCenter:
case Alignment.MiddleCenter:
case Alignment.BottomCenter:
break;
default:
width -= figureSize.Width;
break;
}
}
Size contentSize =
MeasureGroupHeaderText(layoutInfo.Graphics, cgh, style, new Size(width, 0));
switch (imageAlignment)
{
case Alignment.MiddleCenter:
sizeNeeded.Height = Math.Max(figureSize.Height, contentSize.Height) + bheight;
sizeNeeded.Width = Math.Max(figureSize.Width, contentSize.Width) + bwidth;
break;
case Alignment.TopCenter:
case Alignment.BottomCenter:
sizeNeeded.Width = Math.Max(figureSize.Width, contentSize.Width) + bwidth;
sizeNeeded.Height = contentSize.Height + figureSize.Height + bheight;
break;
default:
sizeNeeded.Width = contentSize.Width + figureSize.Width + bwidth;
sizeNeeded.Height = Math.Max(figureSize.Height, contentSize.Height) + bheight;
break;
}
return (sizeNeeded);
}
#region GetDefaultGroupHeaderWidth
private int GetDefaultGroupHeaderWidth(
GridPanel panel, ColumnGroupHeader cgh)
{
int width = 0;
GridColumnCollection columns = panel.Columns;
int[] map = columns.DisplayIndexMap;
for (int i = cgh.StartDisplayIndex; i <= cgh.EndDisplayIndex; i++)
{
if ((uint)i >= map.Length)
break;
int index = map[i];
GridColumn column = columns[index];
if (column.Visible == true)
width += column.Size.Width;
}
return (width);
}
#endregion
#region MeasureGroupHeaderText
private Size MeasureGroupHeaderText(Graphics g,
ColumnGroupHeader cgh, CellVisualStyle style, Size constraintSize)
{
Size size = Size.Empty;
string s = GetHeaderText(cgh);
if (string.IsNullOrEmpty(s) == false)
{
if (cgh.HeaderTextMarkup != null)
{
size = GetMarkupTextSize(g,
cgh.HeaderTextMarkup, style, constraintSize.Width);
cgh.HeaderTextSize = size;
}
else
{
eTextFormat tf = style.GetTextFormatFlags();
size = (constraintSize.IsEmpty == true)
? TextHelper.MeasureText(g, s, style.Font)
: TextHelper.MeasureText(g, s, style.Font, constraintSize, tf);
}
}
return (size);
}
#endregion
#endregion
#endregion
#endregion
#endregion
#region MeasureColumnHeaders
private void MeasureColumnHeaders(
GridLayoutInfo layoutInfo, Size constraintSize, GridPanel panel, ref Size sizeNeeded)
{
GridColumnCollection columns = _Columns;
for (int i = 0; i < columns.Count; i++)
{
GridColumn column = columns[i];
if (column.Processed == false)
{
Size size = MeasureHeader(layoutInfo, constraintSize, panel, column);
sizeNeeded.Width += size.Width;
sizeNeeded.Height = Math.Max(size.Height, sizeNeeded.Height);
}
}
}
#endregion
#region MeasureHeader
internal Size MeasureHeader(GridLayoutInfo layoutInfo,
Size constraintSize, GridPanel panel, GridColumn column)
{
Size sizeNeeded = Size.Empty;
ColumnHeaderVisualStyle style = GetSizingStyle(panel, column);
MeasureTextAndImage(layoutInfo, constraintSize, panel, column, style, ref sizeNeeded);
MeasureSortAndFilter(panel, column, style, ref sizeNeeded);
sizeNeeded.Width += Dpi.Width8;
sizeNeeded.Height += Dpi.Height4;
if (Dpi.Height(_RowHeight) > 0)
sizeNeeded.Height = Dpi.Height(_RowHeight);
else if (sizeNeeded.Height < Dpi.Height(_MinRowHeight))
sizeNeeded.Height = Dpi.Height(_MinRowHeight);
column.HeaderSize = sizeNeeded;
column.Processed = true;
return (sizeNeeded);
}
#region MeasureTextAndImage
private void MeasureTextAndImage(GridLayoutInfo layoutInfo, Size constraintSize,
GridPanel panel, GridColumn column, ColumnHeaderVisualStyle style, ref Size sizeNeeded)
{
Size figureSize = (_ShowHeaderImages == true)
? style.GetFigureSize(panel) : Size.Empty;
Alignment imageAlignment = style.ImageAlignment;
if (style.IsOverlayImage == true)
imageAlignment = Alignment.MiddleCenter;
Size borderSize = style.GetBorderSize(true);
int bwidth = (borderSize.Width * 2);
int bheight = (borderSize.Height * 2);
int width = constraintSize.Width > 0 ? column.Size.Width : 0;
if (width > 0)
{
width -= bwidth;
switch (imageAlignment)
{
case Alignment.TopCenter:
case Alignment.MiddleCenter:
case Alignment.BottomCenter:
break;
default:
width -= figureSize.Width;
break;
}
}
Size contentSize =
MeasureHeaderText(layoutInfo.Graphics, column, style, new Size(width, 0));
if (width == 0)
column.HeaderTextSize = contentSize;
switch (imageAlignment)
{
case Alignment.MiddleCenter:
sizeNeeded.Height = Math.Max(figureSize.Height, contentSize.Height) + bheight;
sizeNeeded.Width = Math.Max(figureSize.Width, contentSize.Width) + bwidth;
break;
case Alignment.TopCenter:
case Alignment.BottomCenter:
sizeNeeded.Width = Math.Max(figureSize.Width, contentSize.Width) + bwidth;
sizeNeeded.Height = contentSize.Height + figureSize.Height + bheight;
break;
default:
sizeNeeded.Width = contentSize.Width + figureSize.Width + bwidth;
sizeNeeded.Height = Math.Max(figureSize.Height, contentSize.Height) + bheight;
break;
}
}
#region MeasureHeaderText
private Size MeasureHeaderText(Graphics g,
GridColumn column, CellVisualStyle style, Size constraintSize)
{
Size size = Size.Empty;
string s = column.GetHeaderText();
if (string.IsNullOrEmpty(s) == false)
{
if (column.HeaderTextMarkup != null)
{
size = GetMarkupTextSize(g,
column.HeaderTextMarkup, style, constraintSize.Width > 0 ? constraintSize.Width : 10000);
column.HeaderTextSize = size;
}
else
{
eTextFormat tf = style.GetTextFormatFlags();
size = (constraintSize.IsEmpty == true)
? TextHelper.MeasureText(g, s, style.Font)
: TextHelper.MeasureText(g, s, style.Font, constraintSize, tf);
}
}
return (size);
}
#region GetMarkupTextSize
private Size GetMarkupTextSize(Graphics g,
BodyElement textMarkup, CellVisualStyle style, int width)
{
MarkupDrawContext d =
new MarkupDrawContext(g, style.Font, style.TextColor, false);
textMarkup.InvalidateElementsSize();
textMarkup.Measure(new Size(width, 0), d);
return (textMarkup.Bounds.Size);
}
#endregion
#endregion
#endregion
#region MeasureSortAndFilter
private void MeasureSortAndFilter(GridPanel panel,
GridColumn column, ColumnHeaderVisualStyle style, ref Size sizeNeeded)
{
Alignment sortAlignment = (_SortImageAlignment == Alignment.NotSet)
? Alignment.TopCenter : _SortImageAlignment;
Alignment filterAlignment = (_FilterImageAlignment == Alignment.NotSet)
? Alignment.MiddleLeft : _FilterImageAlignment;
int imsHeight = 0;
if (panel.SortLevel != SortLevel.None)
{
imsHeight = GetPartSizeNeeded(
GetAscendingSortImage(column), style, sortAlignment, ref sizeNeeded);
}
int imfHeight = 0;
if (FilterCanBeVisible(panel) == true)
{
imfHeight = GetPartSizeNeeded(
GetFilterImage(column), style, filterAlignment, ref sizeNeeded);
}
if (imsHeight > 0 && imfHeight > 0)
{
if (VAlignment(sortAlignment) == VAlignment(filterAlignment))
{
int n = Math.Max(imsHeight, imfHeight);
sizeNeeded.Height += n;
if (VAlignment(style.Alignment) == 1)
sizeNeeded.Height += n;
}
else
sizeNeeded.Height += (imsHeight + imfHeight);
}
else
{
int n = imsHeight + imfHeight;
sizeNeeded.Height += n;
if (VAlignment(style.Alignment) == 1)
sizeNeeded.Height += n;
}
}
#region GetPartSizeNeeded
private int GetPartSizeNeeded(Image image,
ColumnHeaderVisualStyle style, Alignment alignment, ref Size sizeNeeded)
{
int height = 0;
if (image != null)
{
if (alignment != Alignment.TopCenter &&
alignment != Alignment.MiddleCenter &&
alignment != Alignment.BottomCenter)
{
sizeNeeded.Width += (image.Width + 4);
}
if (alignment == Alignment.MiddleLeft ||
alignment == Alignment.MiddleCenter ||
alignment == Alignment.MiddleRight ||
VAlignment(alignment) == VAlignment(style.Alignment))
{
sizeNeeded.Height = Math.Max(sizeNeeded.Height, image.Height);
}
else
{
height = (image.Height + 2);
}
}
return (height);
}
#endregion
#region FilterCanBeVisible
private bool FilterCanBeVisible(GridPanel panel)
{
if (panel.EnableFiltering == true && panel.EnableColumnFiltering == true)
{
if (FilterImageVisibility != ImageVisibility.Never)
return (true);
}
return (false);
}
#endregion
#endregion
#endregion
#endregion
#region ArrangeOverride
/// <summary>
/// Performs the arrange pass layout of the item
/// when final position and size of the item has been set.
/// </summary>
/// <param name="layoutInfo">Layout information.</param>
/// <param name="stateInfo"></param>
/// <param name="layoutBounds">Layout bounds</param>
protected override void ArrangeOverride(GridLayoutInfo layoutInfo,
GridLayoutStateInfo stateInfo, Rectangle layoutBounds)
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
ArrangeGroupHeader(panel, GroupHeaders, 0);
foreach (GridColumn col in panel.Columns)
{
if (col.Visible == true)
UpdateImageBounds(panel, col);
}
}
}
#region ArrangeGroupHeader
private void ArrangeGroupHeader(
GridPanel panel, IEnumerable<ColumnGroupHeader> csc, int dy)
{
if (csc != null)
{
foreach (ColumnGroupHeader cgh in csc)
{
if (cgh.Visible == true)
{
Size oldSize = cgh.BoundsRelative.Size;
cgh.BoundsRelative = GetGroupHeaderBounds(panel, cgh, dy);
cgh.Size = new Size(cgh.Size.Width, Bounds.Height - dy);
ArrangeGroupHeader(panel, cgh.GroupHeaders, dy + cgh.BoundsRelative.Height);
if (oldSize != cgh.BoundsRelative.Size)
SuperGrid.DoColumnGroupHeaderResizedEvent(panel, cgh, oldSize);
}
}
}
}
#region GetGroupHeaderBounds
private Rectangle GetGroupHeaderBounds(
GridPanel panel, ColumnGroupHeader cgh, int dy)
{
GridColumnCollection columns = panel.Columns;
Rectangle r = Rectangle.Empty;
int[] map = columns.DisplayIndexMap;
bool showColHeaders = GetShowRootColumnHeaders(cgh) && cgh.GroupHeaders.Count == 0;
for (int i = cgh.StartDisplayIndex; i <= cgh.EndDisplayIndex; i++)
{
if ((uint)i < columns.Count)
{
GridColumn column = columns[map[i]];
if (column.Visible == true)
{
Rectangle q = GetRelativeBounds(panel, column);
r = (r.IsEmpty == true) ? q : Rectangle.Union(r, q);
r.Height = (showColHeaders == true) ? column.HeaderSize.Height : 0;
}
}
}
r.Y += dy;
if (cgh.GroupHeaders.Count > 0)
{
r.Height = cgh.ContentSize.Height;
}
else
{
if (showColHeaders == true && cgh.RowHeight > 0)
r.Height = Dpi.Height(cgh.RowHeight);
else
r.Height = (Bounds.Bottom - r.Bottom);
}
return (r);
}
#endregion
#endregion
#endregion
#region RenderOverride
/// <summary>
/// Performs drawing of the item and its children.
/// </summary>
/// <param name="renderInfo">Holds contextual rendering information.</param>
protected override void RenderOverride(GridRenderInfo renderInfo)
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
ResetProcessStates(panel);
Graphics g = renderInfo.Graphics;
Rectangle bounds = Bounds;
ColumnHeaderRowVisualStyle style = GetEffectiveRowHeaderStyle();
GridPanelVisualStyle pstyle = panel.GetEffectiveStyle();
if (SuperGrid.DoPreRenderColumnHeaderEvent(g,
this, null, RenderParts.Background, bounds) == false)
{
RenderRowBackground(g, style, bounds);
SuperGrid.DoPostRenderColumnHeaderEvent(g,
this, null, RenderParts.Background, bounds);
}
RenderColumnBorder(g, panel, bounds);
if (HScrollOffset == 0 || panel.IsSubPanel || panel.FrozenColumnCount <= 0)
{
RenderHeaders(panel, renderInfo, false, false);
}
else
{
RenderHeaders(panel, renderInfo, true, false);
RenderHeaders(panel, renderInfo, true, true);
}
if (panel.FrozenColumnCount > 0)
RenderFrozenColumnMarker(g, panel, pstyle);
RenderRowHeader(g, panel, style, pstyle);
}
}
#region RenderRowBackground
private void RenderRowBackground(
Graphics g, ColumnHeaderRowVisualStyle style, Rectangle bounds)
{
using (Brush br = style.WhiteSpaceBackground.GetBrush(bounds))
g.FillRectangle(br, bounds);
}
#endregion
#region RenderColumnBorder
private void RenderColumnBorder(
Graphics g, GridPanel panel, Rectangle bounds)
{
Rectangle r = bounds;
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.None;
GridPanelVisualStyle pstyle = panel.GetEffectiveStyle();
if (pstyle.HeaderHLinePattern != LinePattern.None &&
pstyle.HeaderHLinePattern != LinePattern.NotSet)
{
using (Pen pen = new Pen(pstyle.HeaderLineColor, Dpi.Height1))
{
pen.DashStyle = (DashStyle)pstyle.HeaderHLinePattern;
g.DrawLine(pen, r.X, r.Bottom - 1, r.Right - 1, r.Bottom - 1);
g.DrawLine(pen, r.X, r.Top - 1, r.Right - 1, r.Top - 1);
}
}
if (pstyle.HeaderVLinePattern != LinePattern.None &&
pstyle.HeaderVLinePattern != LinePattern.NotSet)
{
using (Pen pen = new Pen(pstyle.HeaderLineColor, Dpi.Width1))
{
pen.DashStyle = (DashStyle)pstyle.HeaderVLinePattern;
g.DrawLine(pen, r.Right - 1, r.Top - 1, r.Right - 1, r.Bottom - 1);
}
}
g.SmoothingMode = sm;
}
#endregion
#region RenderHeaders
private void RenderHeaders(GridPanel panel,
GridRenderInfo renderInfo, bool chkFrozen, bool frozen)
{
Graphics g = renderInfo.Graphics;
Rectangle clip = renderInfo.ClipRectangle;
RenderGroupHeaders(g, panel, clip, GroupHeaders, chkFrozen, frozen);
RenderColumnHeaders(g, panel, clip, chkFrozen, frozen);
}
#region RenderGroupHeaders
private void RenderGroupHeaders(Graphics g, GridPanel panel,
Rectangle clip, IEnumerable<ColumnGroupHeader> csc, bool chkFrozen, bool frozen)
{
if (csc != null)
{
foreach (ColumnGroupHeader cgh in csc)
{
if (cgh.Visible == true)
{
if (chkFrozen == false || (IsGroupHeaderHFrozen(panel, cgh) == frozen))
{
Rectangle r = GetSubContScrollBounds(panel, cgh);
if (clip.IsEmpty == true || r.IntersectsWith(clip) == true)
{
Rectangle bounds = GetSubScrollBounds(panel, cgh);
RenderGroupHeader(g, panel, cgh, bounds);
if (cgh.GroupHeaders.Count > 0)
RenderGroupHeaders(g, panel, Rectangle.Empty, cgh.GroupHeaders, chkFrozen, frozen);
RenderBaseHeaders(g, panel, cgh);
}
else
{
if (cgh.GroupHeaders.Count > 0)
RenderGroupHeaders(g, panel, Rectangle.Empty, cgh.GroupHeaders, chkFrozen, frozen);
}
}
}
}
}
}
#region RenderGroupHeader
private void RenderGroupHeader(
Graphics g, GridPanel panel, ColumnGroupHeader cgh, Rectangle bounds)
{
if (bounds.IsEmpty == false)
{
ColumnHeaderVisualStyle style = GetEffectiveStyle(cgh);
if (bounds.Width > 0 && bounds.Height > 0)
{
if (SuperGrid.DoPreRenderColumnGroupHeaderEvent(g,
this, cgh, RenderParts.Background, bounds) == false)
{
RenderBackground(g, style, bounds);
SuperGrid.DoPostRenderColumnGroupHeaderEvent(g,
this, cgh, RenderParts.Background, bounds);
}
RenderColumnBorder(g, panel, bounds);
Rectangle r = bounds;
Rectangle t = GetContentBounds(panel, style, r);
t = GetAdjustedBounds(style, t);
if (style.ImageOverlay == ImageOverlay.None ||
style.ImageOverlay == ImageOverlay.Bottom)
{
RenderHeaderImage(g, panel, style, bounds, t);
}
if (SuperGrid.DoPreRenderColumnGroupHeaderEvent(g,
this, cgh, RenderParts.Content, t) == false)
{
RenderGroupHeaderText(g, style, cgh, t);
SuperGrid.DoPostRenderColumnGroupHeaderEvent(g,
this, cgh, RenderParts.Content, t);
}
if (style.ImageOverlay == ImageOverlay.Top)
RenderHeaderImage(g, panel, style, bounds, t);
r = GetBorderRect(style, r);
if (SuperGrid.DoPreRenderColumnGroupHeaderEvent(g,
this, cgh, RenderParts.Border, r) == false)
{
if (r.Width > 0 && r.Height > 0)
style.RenderBorder(g, r);
SuperGrid.DoPostRenderColumnGroupHeaderEvent(g,
this, cgh, RenderParts.Border, r);
}
}
}
}
#region RenderGroupHeaderText
private void RenderGroupHeaderText(Graphics g,
ColumnHeaderVisualStyle style, ColumnGroupHeader cgh, Rectangle r)
{
if (_MouseDownButtons == MouseButtons.Left)
r = AdjustTextHeaderBounds(cgh, r, GridPanel.ColumnGroupHeaderClickBehavior);
if (cgh.HeaderTextMarkup != null)
{
RenderTextMarkup(g, cgh.HeaderTextMarkup, style, r);
}
else
{
string s = GetHeaderText(cgh);
if (string.IsNullOrEmpty(s) == false)
{
TextDrawing.DrawString(g, s,
style.Font, style.TextColor, r, style.GetTextFormatFlags());
}
}
}
#region GetHeaderText
private string GetHeaderText(ColumnGroupHeader cgh)
{
return (cgh.HeaderText ?? cgh.Name);
}
#endregion
#endregion
#endregion
#region RenderBaseHeaders
private void RenderBaseHeaders(Graphics g, GridPanel panel, ColumnGroupHeader cgh)
{
int[] map = panel.Columns.DisplayIndexMap;
for (int i = cgh.StartDisplayIndex; i <= cgh.EndDisplayIndex; i++)
{
if ((uint)i >= map.Length)
break;
RenderBaseHeader(g, panel, cgh, map[i]);
}
}
#region RenderBaseHeader
private void RenderBaseHeader(Graphics g,
GridPanel panel, ColumnGroupHeader cgh, int i)
{
GridColumn col = panel.Columns[i];
if (col.Visible == true && col.Processed == false)
{
Rectangle r = GetBounds(panel, col);
int n = cgh.Size.Height - cgh.BoundsRelative.Height;
r.Y = r.Bottom - n;
r.Height = n;
if (GetShowRootColumnHeaders(cgh) == true || cgh.GroupHeaders.Count > 0)
{
RenderColumnHeader(g, panel, col, r, true);
}
else
{
RenderColumnBorder(g, panel, r);
col.Processed = true;
}
}
}
#endregion
#endregion
#endregion
#region RenderColumnHeaders
private void RenderColumnHeaders(Graphics g,
GridPanel panel, Rectangle clip, bool chkFrozen, bool frozen)
{
GridColumnCollection columns = _Columns;
int[] map = columns.DisplayIndexMap;
for (int i = 0; i < map.Length; i++)
{
int index = map[i];
GridColumn column = columns[index];
if (column.Visible == true && column.Processed == false)
{
if ((chkFrozen == false) || (frozen == column.IsHFrozen))
{
Rectangle r = GetBounds(panel, column);
if (r.IntersectsWith(clip) == true)
RenderColumnHeader(g, panel, column, r, true);
}
}
}
}
#region RenderColumnHeader
private void RenderColumnHeader(Graphics g,
GridPanel panel, GridColumn column, Rectangle bounds, bool fullRender)
{
ColumnHeaderVisualStyle style = GetEffectiveStyle(column);
if (bounds.Width > 0 && bounds.Height > 0)
{
if (SuperGrid.DoPreRenderColumnHeaderEvent(g,
this, column, RenderParts.Background, bounds) == false)
{
RenderBackground(g, style, bounds);
SuperGrid.DoPostRenderColumnHeaderEvent(g,
this, column, RenderParts.Background, bounds);
}
RenderColumnBorder(g, panel, bounds);
Rectangle r = bounds;
Rectangle t = GetContentBounds(panel, style, r);
t = GetAdjustedBounds(style, t);
if (style.ImageOverlay == ImageOverlay.None ||
style.ImageOverlay == ImageOverlay.Bottom)
{
RenderHeaderImage(g, panel, style, bounds, t);
}
if (fullRender == true)
t = RenderSortAndFilterImage(g, column, style, t);
if (SuperGrid.DoPreRenderColumnHeaderEvent(g,
this, column, RenderParts.Content, t) == false)
{
RenderText(g, panel, column, style, t);
SuperGrid.DoPostRenderColumnHeaderEvent(g,
this, column, RenderParts.Content, t);
}
if (style.ImageOverlay == ImageOverlay.Top)
RenderHeaderImage(g, panel, style, bounds, t);
r = GetBorderRect(style, r);
if (SuperGrid.DoPreRenderColumnHeaderEvent(g,
this, column, RenderParts.Border, r) == false)
{
if (r.Width > 0 && r.Height > 0)
style.RenderBorder(g, r);
SuperGrid.DoPostRenderColumnHeaderEvent(g,
this, column, RenderParts.Border, r);
}
column.Processed = true;
}
}
#region GetBorderRect
private Rectangle GetBorderRect(
ColumnHeaderVisualStyle style, Rectangle r)
{
r.X += style.Margin.Left;
r.Width -= style.Margin.Horizontal;
r.Y += style.Margin.Top;
r.Height -= style.Margin.Vertical;
return (r);
}
#endregion
#region RenderBackground
private void RenderBackground(Graphics g,
VisualStyle style, Rectangle r)
{
using (Brush br = style.Background.GetBrush(r))
g.FillRectangle(br, r);
}
#endregion
#region RenderSortAndFilterImage
private Rectangle RenderSortAndFilterImage(
Graphics g, GridColumn column, ColumnHeaderVisualStyle style, Rectangle t)
{
GridPanel panel = column.Parent as GridPanel;
if (panel != null)
{
Alignment falign = (_FilterImageAlignment == Alignment.NotSet)
? Alignment.MiddleLeft : _FilterImageAlignment;
Alignment salign = (_SortImageAlignment == Alignment.NotSet)
? Alignment.TopCenter : _SortImageAlignment;
Rectangle rf = GetFilterImageBounds(panel, column);
if (rf.IsEmpty == false)
{
Image filterImage = GetColumnFilterImage(column);
if (filterImage != null)
g.DrawImageUnscaledAndClipped(filterImage, rf);
}
Rectangle rs = GetSortImageBounds(panel, column, salign, falign, rf);
if (rs.IsEmpty == false)
{
Image sortImage = GetColumnSortImage(panel, column);
if (sortImage != null)
g.DrawImageUnscaledAndClipped(sortImage, rs);
}
if (rf.IsEmpty == false)
t = UpdateContentRect(rf, t, falign, style, column);
if (rs.IsEmpty == false)
t = UpdateContentRect(rs, t, salign, style, column);
}
t.X += 2;
t.Width -= 4;
return (t);
}
#region GetFilterImageBounds
private Rectangle GetFilterImageBounds(GridPanel panel, GridColumn column)
{
if (column != null)
{
GridColumn hitColumn = _HitItem as GridColumn;
if (_FilterImageVisibility == ImageVisibility.Always ||
(column == hitColumn) || (string.IsNullOrEmpty(column.FilterExpr) == false))
{
return (GetScrollBounds(panel, column, column.FilterImageBounds));
}
}
return (Rectangle.Empty);
}
#endregion
#region GetSortImageBounds
private Rectangle GetSortImageBounds(GridPanel panel,
GridColumn column, Alignment salign, Alignment falign, Rectangle rf)
{
Rectangle r = GetScrollBounds(panel, column, column.SortImageBounds);
if (r.IsEmpty == false)
{
if (falign == salign && r.IsEmpty == false)
{
if (salign == Alignment.TopCenter ||
salign == Alignment.MiddleCenter ||
salign == Alignment.BottomCenter)
{
r.X = rf.X - (r.Width + 1);
}
}
}
return (r);
}
#endregion
#region UpdateContentRect
private Rectangle UpdateContentRect(Rectangle r,
Rectangle t, Alignment alignment, ColumnHeaderVisualStyle style, GridColumn column)
{
switch (GetStringAlignment(alignment))
{
case StringAlignment.Near:
int n1 = r.Right - t.Left;
switch (GetStringAlignment(style.Alignment))
{
case StringAlignment.Center:
if (n1 + 3 > (t.Width - column.HeaderTextSize.Width) / 2)
{
t.X = r.Right;
t.Width -= n1;
}
break;
default:
t.X = r.Right;
t.Width -= n1;
break;
}
break;
case StringAlignment.Far:
int n2 = t.Right - r.Left;
switch (GetStringAlignment(style.Alignment))
{
case StringAlignment.Center:
if (n2 + 3 > (t.Width - column.HeaderTextSize.Width) / 2)
t.Width -= n2;
break;
default:
t.Width -= n2;
break;
}
break;
}
return (t);
}
#region GetStringAlignment
private StringAlignment GetStringAlignment(Alignment alignment)
{
switch (alignment)
{
case Alignment.TopLeft:
case Alignment.MiddleLeft:
case Alignment.BottomLeft:
return (StringAlignment.Near);
case Alignment.TopCenter:
case Alignment.MiddleCenter:
case Alignment.BottomCenter:
return (StringAlignment.Center);
default:
return (StringAlignment.Far);
}
}
#endregion
#endregion
#endregion
#region RenderText
private void RenderText(Graphics g, GridPanel panel,
GridColumn column, CellVisualStyle style, Rectangle r)
{
string s = column.GetHeaderText();
if (s != null)
{
if (_MouseDownButtons == MouseButtons.Left)
r = AdjustTextHeaderBounds(column, r, panel.ColumnHeaderClickBehavior);
if (column.HeaderTextMarkup != null)
{
RenderTextMarkup(g, column.HeaderTextMarkup, style, r);
}
else
{
TextDrawing.DrawString(g, s,
style.Font, style.TextColor, r, style.GetTextFormatFlags());
}
}
}
#region RenderTextMarkup
private void RenderTextMarkup(Graphics g,
BodyElement textMarkup, CellVisualStyle style, Rectangle r)
{
MarkupDrawContext d =
new MarkupDrawContext(g, style.Font, style.TextColor, false);
textMarkup.Arrange(new Rectangle(r.Location, r.Size), d);
Size size = textMarkup.Bounds.Size;
switch (style.Alignment)
{
case Alignment.MiddleLeft:
case Alignment.MiddleCenter:
case Alignment.MiddleRight:
if (r.Height > size.Height)
r.Y += (r.Height - size.Height) / 2;
break;
default:
if (r.Height > size.Height)
r.Y = r.Bottom - size.Height;
break;
}
textMarkup.Bounds = new Rectangle(r.Location, size);
Region oldClip = g.Clip;
try
{
g.SetClip(r, CombineMode.Intersect);
textMarkup.Render(d);
}
finally
{
g.Clip = oldClip;
}
}
#endregion
#endregion
#region VAlignment
private int VAlignment(Alignment alignment)
{
switch (alignment)
{
case Alignment.TopLeft:
case Alignment.TopCenter:
case Alignment.TopRight:
return (0);
case Alignment.MiddleLeft:
case Alignment.MiddleCenter:
case Alignment.MiddleRight:
return (1);
default:
return (2);
}
}
#endregion
#region GetColumnSortImage
internal Image GetColumnSortImage(GridPanel panel, GridColumn column)
{
SortDirection sortDirection = SortDirection.None;
if (panel.GroupColumns != null &&
panel.GroupColumns.Contains(column) == true)
{
sortDirection = column.GroupDirection;
}
else if (panel.SortLevel != SortLevel.None)
{
sortDirection = column.SortDirection;
switch (column.SortIndicator)
{
case SortIndicator.None:
sortDirection = SortDirection.None;
break;
case SortIndicator.Ascending:
sortDirection = SortDirection.Ascending;
break;
case SortIndicator.Descending:
sortDirection = SortDirection.Descending;
break;
}
}
switch (sortDirection)
{
case SortDirection.Ascending:
return (GetAscendingSortImage(column));
case SortDirection.Descending:
return (GetDescendingSortImage(column));
}
return (null);
}
#endregion
#region GetFilterImage
internal Image GetColumnFilterImage(GridColumn column)
{
if (column.IsFilteringEnabled == true)
{
if (_FilterImageVisibility != ImageVisibility.Never)
return (GetFilterImage(column));
}
return (null);
}
#endregion
#region GetImageBounds
private Rectangle GetImageBounds(
Image image1, Alignment alignment, ref Rectangle r)
{
Rectangle u = r;
Rectangle t = r;
t.Size = image1.Size;
switch (alignment)
{
case Alignment.TopLeft:
r.X += t.Width + 2;
r.Width -= (t.Width + 2);
break;
case Alignment.NotSet:
case Alignment.TopCenter:
t.X += (r.Width - t.Width) / 2;
break;
case Alignment.TopRight:
t.X = r.Right - t.Width;
r.Width -= (t.Width + 2);
break;
case Alignment.MiddleLeft:
t.Y += (r.Height - t.Height) / 2;
r.X += t.Width + 2;
r.Width -= (t.Width + 2);
break;
case Alignment.MiddleCenter:
t.X += (r.Width - t.Width) / 2;
t.Y += (r.Height - t.Height) / 2;
break;
case Alignment.MiddleRight:
t.X = r.Right - t.Width;
t.Y += (r.Height - t.Height) / 2;
r.Width -= (t.Width + 2);
break;
case Alignment.BottomLeft:
r.X += t.Width + 2;
r.Width -= (t.Width + 2);
t.Y = r.Bottom - t.Height;
break;
case Alignment.BottomCenter:
t.X += (r.Width - t.Width) / 2;
t.Y = r.Bottom - t.Height;
break;
case Alignment.BottomRight:
t.X = r.Right - t.Width;
t.Y = r.Bottom - t.Height;
r.Width -= (t.Width + 2);
break;
}
t.Intersect(u);
return (t);
}
#endregion
#endregion
#endregion
#region AdjustTextHeaderBounds
private Rectangle AdjustTextHeaderBounds(
object item, Rectangle r, ColumnHeaderClickBehavior cmode)
{
if (_Reordering == false && item == _MouseDownHitItem)
{
if (_MouseDownHitArea == HeaderArea.InMarkup ||
(_MouseDownHitArea == HeaderArea.InContent && cmode == ColumnHeaderClickBehavior.SortAndReorder))
{
r.X++;
r.Y += 2;
r.Height -= 2;
}
}
return (r);
}
#endregion
#region RenderHeaderImage
private void RenderHeaderImage(Graphics g, GridPanel panel,
ColumnHeaderVisualStyle style, Rectangle bounds, Rectangle r)
{
if (_ShowHeaderImages == true)
{
object figure = style.GetFigure(panel);
if (figure != null)
{
Rectangle t = style.GetFigureBounds(panel, r);
bounds.Inflate(-1, -1);
t.Intersect(bounds);
style.RenderFigure(g, panel, t);
}
}
}
#endregion
#endregion
#region RenderFrozenColumnMarker
private void RenderFrozenColumnMarker(
Graphics g, GridPanel panel, GridPanelVisualStyle pstyle)
{
GridColumn col = panel.Columns.GetLastVisibleFrozenColumn();
if (col != null)
{
Rectangle bounds = GetBounds(panel, col);
bounds.Y = Bounds.Y;
bounds.Height = Bounds.Height;
Rectangle r = col.BoundsRelative;
r.Y = bounds.Y + Dpi.Width3;
r.Height = bounds.Height - Dpi.Width5;
if (panel.IsSubPanel == true)
r.X -= HScrollOffset;
if (r.Height > 0 && r.Width > 0)
{
using (Pen pen = new Pen(pstyle.HeaderLineColor, Dpi.Width1))
{
g.DrawLine(pen, r.Right - Dpi.Width3,
r.Top - 1, r.Right - Dpi.Width3, r.Bottom - 1);
}
}
}
}
#endregion
#region RenderRowHeader
private void RenderRowHeader(Graphics g,
GridPanel panel, ColumnHeaderRowVisualStyle style, GridPanelVisualStyle pstyle)
{
Rectangle r = GetRowHeaderBounds(panel);
if (r.Width > 0 && r.Height > 0)
{
if (SuperGrid.DoPreRenderColumnHeaderEvent(g,
this, null, RenderParts.RowHeader, r) == false)
{
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.None;
using (Brush br = style.RowHeader.Background.GetBrush(r))
g.FillRectangle(br, r);
using (Pen pen = new Pen(style.RowHeader.BorderHighlightColor, Dpi.Height1))
g.DrawLine(pen, r.X, r.Top, r.Right - 1, r.Top);
using (Pen pen = new Pen(style.RowHeader.BorderHighlightColor, Dpi.Height1))
g.DrawLine(pen, r.X + 1, r.Top, r.X + 1, r.Bottom - 1);
using (Pen pen = new Pen(pstyle.HeaderLineColor, Dpi.Height1))
{
g.DrawLine(pen, r.X, r.Top - 1, r.Right - 1, r.Top - 1);
g.DrawLine(pen, r.X, r.Bottom - 1, r.Right - 1, r.Bottom - 1);
}
using (Pen pen = new Pen(pstyle.HeaderLineColor, Dpi.Width1))
g.DrawLine(pen, r.Right - 1, r.Top, r.Right - 1, r.Bottom - 1);
if (panel.TopLeftHeaderSelectBehavior != TopLeftHeaderSelectBehavior.NoSelection)
{
RenderRowHeaderIndicator(g, panel, style, r);
}
else
{
if (string.IsNullOrEmpty(_RowHeaderText) == false)
RenderRowHeaderText(g, _RowHeaderText, style, r);
}
SuperGrid.DoPostRenderColumnHeaderEvent(g,
this, null, RenderParts.RowHeader, r);
g.SmoothingMode = sm;
}
}
}
#region RenderRowHeaderIndicator
private void RenderRowHeaderIndicator(Graphics g,
GridPanel panel, ColumnHeaderRowVisualStyle style, Rectangle r)
{
r.Inflate(-Dpi.Width3, -Dpi.Height3);
if (r.Width > 0 && r.Height > 0)
{
using (GraphicsPath path = new GraphicsPath())
{
int n = Math.Min(r.Width, r.Height);
if (n > Dpi.Width10)
n = Dpi.Width10;
Point[] pts = new Point[3];
if (_SelectAllCount != panel.SelectionUpdateCount)
{
r.X--;
r.Y--;
pts[0] = new Point(r.Right, r.Bottom - n);
pts[1] = new Point(r.Right, r.Bottom);
pts[2] = new Point(r.Right - n, r.Bottom);
}
else
{
pts[0] = new Point(r.X, r.Y);
pts[1] = new Point(r.X + n, r.Y);
pts[2] = new Point(r.X, r.Y + n);
r.X++;
r.Y++;
}
path.AddPolygon(pts);
path.CloseFigure();
if (style.IndicatorBackground.GradientAngle % 45 == 0)
n /= 2;
r.Width = n - 1;
r.Height = n - 1;
if (n > 0)
{
g.SmoothingMode = SmoothingMode.AntiAlias;
using (Brush br = style.IndicatorBackground.GetBrush(r))
{
if (br is LinearGradientBrush)
((LinearGradientBrush)br).WrapMode = WrapMode.Tile;
g.FillPath(br, path);
}
using (Pen pen = new Pen(style.IndicatorBorderColor))
g.DrawPath(pen, path);
}
}
}
}
#endregion
#region RenderRowHeaderText
private void RenderRowHeaderText(Graphics g,
string text, ColumnHeaderRowVisualStyle style, Rectangle r)
{
Font font = style.RowHeader.Font ?? SystemFonts.DefaultFont;
Size tSize = TextHelper.MeasureText(g, text, font);
r.Inflate(-Dpi.Width2, -Dpi.Height2);
eTextFormat tf = ((r.Width <= tSize.Width)
? eTextFormat.Left
: eTextFormat.HorizontalCenter) | eTextFormat.NoPadding;
tf |= eTextFormat.WordBreak | eTextFormat.VerticalCenter;
TextDrawing.DrawString(g, text,
font, style.RowHeader.TextColor, r, tf);
}
#endregion
#endregion
#endregion
#region ResetProcessStates
private void ResetProcessStates(GridPanel panel)
{
for (int i = 0; i < panel.Columns.Count; i++)
panel.Columns[i].Processed = false;
}
#endregion
#region Mouse support
#region InternalMouseEnter
internal override void InternalMouseEnter(EventArgs e)
{
SuperGrid.ToolTipText = "";
SuperGrid.DoColumnHeaderMouseEnterEvent(this);
base.InternalMouseEnter(e);
}
#endregion
#region InternalMouseLeave
internal override void InternalMouseLeave(EventArgs e)
{
if (_LockedColumn == false)
{
ResetColumnState();
_HitArea = HeaderArea.NoWhere;
_HitItem = null;
}
SuperGrid.ToolTipText = "";
SuperGrid.DoColumnHeaderMouseLeaveEvent(this);
base.InternalMouseLeave(e);
}
#region ResetColumnState
internal void ResetColumnState()
{
GridPanel panel = GridPanel;
if (panel != null)
{
if (_MouseDownHitItem != null)
InvalidateItem(panel, _MouseDownHitItem);
if (_HitItem != null && (_MouseDownHitItem != _HitItem))
InvalidateItem(panel, _HitItem);
if (_HitArea == HeaderArea.InRowHeader)
InvalidateRowHeader();
if (_HitArea == HeaderArea.InWhitespace)
InvalidateWhitespace();
_MouseDownHitItem = null;
}
_LockedColumn = false;
}
internal void ResetColumnStateEx()
{
ResetColumnState();
_HitItem = null;
_HitArea = HeaderArea.NoWhere;
}
#endregion
#endregion
#region InternalMouseMove
internal override void InternalMouseMove(MouseEventArgs e)
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
if (AllowSelection == true)
{
if (_Resizing == false)
{
_LastHitArea = _HitArea;
_LastHitItem = _HitItem;
_HitArea = GetHitArea(e.Location, ref _HitItem, IsMouseDown);
if (_Reordering == false)
{
if (_HitItem is GridColumn)
ProcessColumnMouseMove(e, panel);
else if (_HitItem is ColumnGroupHeader)
ProcessGroupHeaderMouseMove(e, panel);
else
ProcessRowHeaderMouseMove(panel);
if (_HitArea != _LastHitArea || _LastHitItem != _HitItem)
{
if (_LastHitItem != null)
InvalidateItem(panel, _LastHitItem);
if (_HitItem != null)
InvalidateItem(panel, _HitItem);
if (_HitArea == HeaderArea.InRowHeader || _LastHitArea == HeaderArea.InRowHeader)
InvalidateRowHeader();
if (_HitArea == HeaderArea.InWhitespace || _LastHitArea == HeaderArea.InWhitespace)
InvalidateWhitespace();
}
}
}
if (IsMouseDown == true)
{
if (ProcessMouseDownMove(e) == false)
{
if (_MouseDownHitItem != null)
{
SuperGrid.EnableAutoScrolling(AutoScrollEnable.Horizontal, ViewRect);
StopResize();
StopReorder();
}
}
}
}
SuperGrid.DoColumnHeaderMouseMoveEvent(this, e);
base.InternalMouseMove(e);
}
}
#region ProcessColumnMouseMove
private void ProcessColumnMouseMove(MouseEventArgs e, GridPanel panel)
{
GridColumn hitColumn = (GridColumn) _HitItem;
switch (_HitArea)
{
case HeaderArea.InContent:
SuperGrid.GridCursor = Cursors.Default;
if (hitColumn.HeaderTextMarkup != null)
{
hitColumn.HeaderTextMarkup.MouseMove(SuperGrid, e);
if (hitColumn.HeaderTextMarkup.MouseOverElement != null)
_HitArea = HeaderArea.InMarkup;
}
if (_ShowToolTips == true)
UpdateToolTip(panel, hitColumn.ToolTip);
break;
case HeaderArea.InResize:
SuperGrid.GridCursor = Cursors.VSplit;
SuperGrid.ToolTipText = "";
break;
case HeaderArea.InFilterMenu:
SuperGrid.GridCursor = Cursors.Hand;
if (_ShowFilterToolTips == true && hitColumn.IsFilteringEnabled == true)
UpdateToolTip(panel, hitColumn.FilterExpr);
break;
default:
SuperGrid.GridCursor = Cursors.Default;
SuperGrid.ToolTipText = "";
break;
}
}
#endregion
#region ProcessGroupHeaderMouseMove
private void ProcessGroupHeaderMouseMove(MouseEventArgs e, GridPanel panel)
{
switch (_HitArea)
{
case HeaderArea.InContent:
SuperGrid.GridCursor = Cursors.Default;
ColumnGroupHeader cgh = (ColumnGroupHeader)_HitItem;
if (cgh.HeaderTextMarkup != null)
{
cgh.HeaderTextMarkup.MouseMove(SuperGrid, e);
if (cgh.HeaderTextMarkup.MouseOverElement != null)
_HitArea = HeaderArea.InMarkup;
}
if (_ShowToolTips == true)
UpdateToolTip(panel, cgh.ToolTip);
break;
case HeaderArea.InResize:
SuperGrid.GridCursor = Cursors.VSplit;
SuperGrid.ToolTipText = "";
break;
default:
SuperGrid.GridCursor = Cursors.Default;
SuperGrid.ToolTipText = "";
break;
}
}
#endregion
#region ProcessRowHeaderMouseMove
private void ProcessRowHeaderMouseMove(GridPanel panel)
{
switch (_HitArea)
{
case HeaderArea.InRowHeaderResize:
SuperGrid.GridCursor = Cursors.VSplit;
SuperGrid.ToolTipText = "";
break;
case HeaderArea.InRowHeader:
SuperGrid.GridCursor =
(panel.TopLeftHeaderSelectBehavior != TopLeftHeaderSelectBehavior.NoSelection)
? Cursors.Hand
: Cursors.Default;
UpdateToolTip(panel, "");
break;
default:
SuperGrid.GridCursor = Cursors.Default;
SuperGrid.ToolTipText = "";
break;
}
}
#endregion
#endregion
#region UpdateToolTip
private void UpdateToolTip(GridPanel panel, string toolTip)
{
if (_HitArea != _LastHitArea || _LastHitItem != _HitItem)
panel.SetHeaderTooltip(this, _HitItem, _HitArea, toolTip);
}
#endregion
#region ProcessMouseDownMove
private bool ProcessMouseDownMove(MouseEventArgs e)
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
if (_MouseDownHitArea == HeaderArea.InRowHeaderResize)
return (InRowHeaderResize(e.Location, e));
if (_MouseDownHitItem is GridColumn)
return (ColumnMouseDownMove(e, panel));
if (_MouseDownHitItem is ColumnGroupHeader)
return (GroupHeaderMouseDownMove(e, panel));
}
return (false);
}
#region InRowHeaderResize
private bool InRowHeaderResize(Point pt, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
if (_Resizing == false)
{
_Resizing = true;
_ResizeWidth = panel.RowHeaderWidthEx;
if (panel.ImmediateResize == false)
{
_SeparatorFw = new FloatWindow();
_SeparatorFw.Opacity = .5;
_SeparatorFw.BackColor = Color.Black;
_SeparatorFw.Owner = SuperGrid.FindForm();
}
}
else
{
if (panel.ImmediateResize == false)
ContinueRowHeaderResize(panel, pt);
else
ResizeRowHeader(panel, pt.X - MouseDownPoint.X);
}
}
return (true);
}
return (false);
}
#endregion
#region ColumnMouseDownMove
private bool ColumnMouseDownMove(MouseEventArgs e, GridPanel panel)
{
GridColumn hitColumn = (GridColumn)_MouseDownHitItem;
Rectangle r = ViewRect;
if ((_MouseDownHitArea == HeaderArea.InResize) ||
(_MouseDownHitArea == HeaderArea.InRowHeaderResize) ||
(e.X >= r.X && e.X < r.Right) ||
(hitColumn.IsHFrozen == true && panel.IsSubPanel == false))
{
SuperGrid.DisableAutoScrolling();
switch (_MouseDownHitArea)
{
case HeaderArea.InContent:
hitColumn = _MouseDownHitItem as GridColumn;
if (hitColumn != null)
{
if (_HitArea == HeaderArea.InGroupBox &&
hitColumn.GroupBoxEffectsEx != GroupBoxEffects.None)
{
if (ColumnInGroupBox(panel, e, hitColumn) == true)
return (true);
}
}
if (_HitItem == null)
return (false);
ColumnInContent(e);
break;
case HeaderArea.InResize:
ColumnInResize(e.Location, e);
break;
}
return (true);
}
return (false);
}
#region ColumnInGroupBox
private bool ColumnInGroupBox(
GridPanel panel, MouseEventArgs e, GridColumn hitColumn)
{
if (e.Button == MouseButtons.Left)
{
if (hitColumn != null)
{
if (panel.VisibleColumnCount > 1)
{
if (panel.GroupByRow.DragStart(hitColumn) == true)
{
ResetColumnState();
StopReorder();
_MouseDownHitItem = null;
_HitArea = HeaderArea.NoWhere;
_HitItem = null;
return (true);
}
}
}
}
return (false);
}
#endregion
#region ColumnInContent
private void ColumnInContent(MouseEventArgs e)
{
if (IsDesignerHosted == false)
{
if (e.Button == MouseButtons.Left)
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
if (DragStarted(panel, e) == false)
{
if (panel.ColumnDragBehavior == ColumnDragBehavior.ExtendClickBehavior)
{
switch (panel.ColumnHeaderClickBehavior)
{
case ColumnHeaderClickBehavior.SortAndReorder:
ProcessMove(e.Location);
break;
case ColumnHeaderClickBehavior.Select:
if (_HitItem != _LastHitItem)
ProcessExtendSelection(panel, true);
break;
}
}
}
}
}
}
}
#region DragStarted
private bool DragStarted(GridPanel panel, MouseEventArgs e)
{
if (_HitItem is GridColumn)
{
if (_DragSelection == true)
{
if (_DragStarted == false)
{
if (DragDrop.DragStarted(_MouseDownPoint, e.Location) == true)
{
_DragStarted = true;
if (SuperGrid.DoItemDragEvent((GridColumn)_HitItem, e) == true)
{
_DragSelection = false;
ExtendSelection(panel, true);
}
}
}
return (true);
}
}
return (false);
}
#endregion
#region ProcessMove
private void ProcessMove(Point pt)
{
if (_Reordering == false)
StartReorder(pt);
else
ContinueReorder(pt);
}
#endregion
#region ProcessExtendSelection
private void ProcessExtendSelection(GridPanel panel, bool extend)
{
bool ckey = (panel.MultiSelect == true) ?
((Control.ModifierKeys & Keys.Control) == Keys.Control) : false;
if (ckey == true)
ProcessControlExtend(panel);
else
ProcessNonControlExtend(panel, extend);
_lastSelectedItem = _HitItem;
}
#region ProcessControlExtend
private void ProcessControlExtend(GridPanel panel)
{
int startIndex = 0;
int endIndex = 0;
if (GetSelectionIndicees(panel,
_lastSelectedItem, _HitItem, ref startIndex, ref endIndex, false) == true)
{
int mdStart = 0;
int mdEnd = 0;
GetSelectionIndicees(panel,
_MouseDownHitItem, _MouseDownHitItem, ref mdStart, ref mdEnd, true);
panel.NormalizeIndices(true, mdStart, ref startIndex, ref endIndex);
int[] map = panel.Columns.DisplayIndexMap;
for (int j = startIndex; j <= endIndex; j++)
{
GridColumn column = panel.Columns[map[j]];
if (j < mdStart || j > mdEnd)
column.IsSelected = !column.IsSelected;
}
}
}
#endregion
#region ProcessNonControlExtend
private void ProcessNonControlExtend(GridPanel panel, bool extend)
{
int startIndex = 0;
int endIndex = 0;
if (GetSelectionIndicees(panel,
panel.SelectionColumnAnchor, _HitItem, ref startIndex, ref endIndex, true) == true)
{
int[] map = panel.Columns.DisplayIndexMap;
if (panel.OnlyColumnsSelected(startIndex, endIndex) == false)
{
if (extend == false)
panel.ClearAll();
for (int i = 0; i < map.Length; i++)
{
int index = map[i];
GridColumn column = panel.Columns[index];
if (column.Visible == true)
column.IsSelected = (i >= startIndex && i <= endIndex);
}
}
}
}
#endregion
#region GetSelectionIndicees
private bool GetSelectionIndicees(GridPanel panel,
object start, object end, ref int startIndex, ref int endIndex, bool reorder)
{
if (GetSelectionStartIndex(panel, start, ref startIndex) == false)
return (false);
if (GetSelectionEndIndex(panel, end, ref endIndex) == false)
return (false);
if (startIndex > endIndex)
{
if (start is ColumnGroupHeader)
startIndex = ((ColumnGroupHeader)start).EndDisplayIndex;
if (end is ColumnGroupHeader)
endIndex = ((ColumnGroupHeader)end).StartDisplayIndex;
if (reorder == true)
{
int tempIndex = startIndex;
startIndex = endIndex;
endIndex = tempIndex;
}
}
return (true);
}
#endregion
#region GetSelectionStartIndex
private bool GetSelectionStartIndex(GridPanel panel, object item, ref int startIndex)
{
startIndex = -1;
if (item is ColumnGroupHeader)
startIndex = ((ColumnGroupHeader) item).StartDisplayIndex;
else if (item is GridColumn)
startIndex = panel.Columns.GetDisplayIndex(((GridColumn) item).ColumnIndex);
return (startIndex >= 0);
}
#endregion
#region GetSelectionEndIndex
private bool GetSelectionEndIndex(GridPanel panel, object item, ref int endIndex)
{
endIndex = -1;
if (item is ColumnGroupHeader)
endIndex = ((ColumnGroupHeader)item).EndDisplayIndex;
else if (item is GridColumn)
endIndex = panel.Columns.GetDisplayIndex(((GridColumn) item).ColumnIndex);
return (endIndex >= 0);
}
#endregion
#endregion
#endregion
#region ColumnInResize
private void ColumnInResize(Point pt, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (_Resizing == false)
{
StartResize();
}
else
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
if (panel.ImmediateResize == false)
ContinueResize(panel, pt);
else
ResizeColumn(panel, pt.X - MouseDownPoint.X);
}
}
}
}
#endregion
#endregion
#region GroupHeaderMouseDownMove
private bool GroupHeaderMouseDownMove(MouseEventArgs e, GridPanel panel)
{
ColumnGroupHeader cgh = (ColumnGroupHeader)_MouseDownHitItem;
Rectangle r = ViewRect;
if ((_MouseDownHitArea == HeaderArea.InResize) ||
(_MouseDownHitArea == HeaderArea.InRowHeaderResize) || (e.X >= r.X && e.X < r.Right) ||
(panel.IsSubPanel == false && IsGroupHeaderHFrozen(panel, cgh) == true))
{
SuperGrid.DisableAutoScrolling();
switch (_MouseDownHitArea)
{
case HeaderArea.InContent:
GroupHeaderInContent(e);
break;
}
return (true);
}
return (false);
}
#region GroupHeaderInContent
private void GroupHeaderInContent(MouseEventArgs e)
{
if (IsDesignerHosted == false)
{
if (e.Button == MouseButtons.Left)
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
if (DragStarted(panel, e) == false)
{
if (panel.ColumnDragBehavior == ColumnDragBehavior.ExtendClickBehavior)
{
switch (panel.ColumnGroupHeaderClickBehavior)
{
case ColumnHeaderClickBehavior.SortAndReorder:
ProcessMove(e.Location);
break;
case ColumnHeaderClickBehavior.Select:
if (_HitItem != _LastHitItem)
ProcessExtendSelection(panel, true);
break;
}
}
}
}
}
}
}
#endregion
#endregion
#endregion
#region InternalMouseDown
internal override void InternalMouseDown(MouseEventArgs e)
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
if (EndCurrentOp() == true)
{
_MouseDownPoint = e.Location;
_MouseDownButtons = e.Button;
_MouseDownHitItem = _HitItem;
_MouseDownHitArea = _HitArea;
_DragSelection = false;
_DragStarted = false;
if (_HitItem is GridColumn)
ColumnMouseDown(e, panel);
else if (_HitItem is ColumnGroupHeader)
GroupHeaderMouseDown(e, panel);
else
RowHeaderMouseDown(e, panel);
_lastSelectedItem = _HitItem;
}
SuperGrid.DoColumnHeaderMouseDownEvent(this, e);
base.InternalMouseDown(e);
}
}
#region EndCurrentOp
private bool EndCurrentOp()
{
GridCell ecell = SuperGrid.EditorCell;
if (ecell != null)
{
if (ecell.EndEdit() == false)
{
_MouseDownHitArea = HeaderArea.NoWhere;
return (false);
}
}
if (_Reordering == true || _Resizing == true)
{
StopResize();
StopReorder();
InvalidateRender();
}
return (true);
}
#endregion
#region ColumnMouseDown
private void ColumnMouseDown(MouseEventArgs e, GridPanel panel)
{
GridColumn hitColumn = (GridColumn)_HitItem;
if (_HitArea == HeaderArea.InContent)
{
Capture = true;
ColumnInContentMouseDown(e, panel, hitColumn);
}
else if (_HitArea == HeaderArea.InMarkup)
{
InvalidateHeader(panel, hitColumn);
}
else
{
if (e.Button == MouseButtons.Left)
{
Capture = true;
switch (_HitArea)
{
case HeaderArea.InResize:
ColumnInResizeMouseDown(e, panel);
break;
case HeaderArea.InFilterMenu:
ColumnInFilterMouseDown(panel, hitColumn);
break;
}
}
}
}
#region ColumnInContentMouseDown
private void ColumnInContentMouseDown(
MouseEventArgs e, GridPanel panel, GridColumn hitColumn)
{
_MouseDownDelta = e.X - hitColumn.BoundsRelative.X;
if (panel.IsSubPanel == true || hitColumn.IsHFrozen == false)
_MouseDownDelta += HScrollOffset;
if (hitColumn.AllowSelection == true)
{
_LastHitItem = null;
_Reordering = false;
if (panel.ColumnHeaderClickBehavior == ColumnHeaderClickBehavior.Select)
{
if (hitColumn.IsSelected == false ||
((Control.ModifierKeys & (Keys.Control | Keys.Shift)) != Keys.None))
{
ExtendSelection(panel, true);
}
else
{
_DragSelection = true;
}
}
else
{
InvalidateItem(panel, _MouseDownHitItem);
}
}
}
#region ExtendSelection
private void ExtendSelection(GridPanel panel, bool capture)
{
if (capture == true)
Capture = true;
if (panel.SelectionColumnAnchor == null ||
(Control.ModifierKeys & Keys.Shift) != Keys.Shift)
{
panel.SelectionColumnAnchor = _MouseDownHitItem;
}
if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
{
int startIndex = 0;
int endIndex = 0;
if (GetSelectionIndicees(panel, _MouseDownHitItem,
_MouseDownHitItem, ref startIndex, ref endIndex, true) == true)
{
int[] map = panel.Columns.DisplayIndexMap;
for (int i = startIndex; i <= endIndex; i++)
{
GridColumn column = panel.Columns[map[i]];
column.IsSelected = !column.IsSelected;
}
}
}
else
{
ProcessNonControlExtend(panel, false);
}
}
#endregion
#endregion
#region ColumnInResizeMouseDown
private void ColumnInResizeMouseDown(MouseEventArgs e, GridPanel panel)
{
GridColumn hitColumn = _HitItem as GridColumn;
if (hitColumn != null)
{
Capture = true;
_MouseDownDelta = e.X - hitColumn.BoundsRelative.X;
if (panel.IsSubPanel == true || hitColumn.IsHFrozen == false)
_MouseDownDelta += HScrollOffset;
_Resizing = false;
_LastHitItem = null;
}
}
#endregion
#region ColumnInFilterMouseDown
private void ColumnInFilterMouseDown(GridPanel panel, GridColumn column)
{
ActivateFilterPopup(panel, column);
}
#endregion
#endregion
#region GroupHeaderMouseDown
private void GroupHeaderMouseDown(MouseEventArgs e, GridPanel panel)
{
ColumnGroupHeader cgh = (ColumnGroupHeader)_HitItem;
if (_HitArea == HeaderArea.InContent)
{
Capture = true;
GroupHeaderInContentMouseDown(e, panel, cgh);
}
else if (_HitArea == HeaderArea.InMarkup)
{
InvalidateHeader(panel, cgh);
}
else
{
if (e.Button == MouseButtons.Left)
{
Capture = true;
switch (_HitArea)
{
case HeaderArea.InResize:
ColumnInResizeMouseDown(e, panel);
break;
}
}
}
}
#region GroupHeaderInContentMouseDown
private void GroupHeaderInContentMouseDown(
MouseEventArgs e, GridPanel panel, ColumnGroupHeader cgh)
{
_MouseDownDelta = e.X - cgh.BoundsRelative.X;
if (panel.IsSubPanel == true || IsGroupHeaderHFrozen(panel, cgh) == false)
_MouseDownDelta += HScrollOffset;
if (cgh.AllowSelection == true)
{
_LastHitItem = null;
_Reordering = false;
if (panel.ColumnGroupHeaderClickBehavior == ColumnHeaderClickBehavior.Select)
{
if (IsGroupHeaderSelected(cgh) == false ||
((Control.ModifierKeys & (Keys.Control | Keys.Shift)) != Keys.None))
{
ExtendSelection(panel, true);
}
else
{
_DragSelection = true;
}
}
else
{
InvalidateItem(panel, _MouseDownHitItem);
}
}
}
#endregion
#endregion
#region RowHeaderMouseDown
private void RowHeaderMouseDown(MouseEventArgs e, GridPanel panel)
{
if (e.Button == MouseButtons.Left)
{
Capture = true;
switch (_HitArea)
{
case HeaderArea.InRowHeader:
InRowHeaderMouseDown(panel);
break;
case HeaderArea.InRowHeaderResize:
InRowHeaderResizeMouseDown();
break;
}
}
}
#region InRowHeaderMouseDown
private void InRowHeaderMouseDown(GridPanel panel)
{
if (panel.TopLeftHeaderSelectBehavior != TopLeftHeaderSelectBehavior.NoSelection)
{
bool select = (_SelectAllCount != panel.SelectionUpdateCount);
if (select == true)
{
if (panel.MultiSelect == true)
{
panel.SelectAll();
}
else if (panel.ActiveRow != null)
{
panel.ClearAll();
panel.ActiveRow.IsSelected = true;
}
}
else
{
panel.ClearAll();
}
}
}
#endregion
#region InRowHeaderResizeMouseDown
private void InRowHeaderResizeMouseDown()
{
Capture = true;
_Resizing = false;
}
#endregion
#endregion
#endregion
#region InternalMouseUp
internal override void InternalMouseUp(MouseEventArgs e)
{
SuperGrid.DisableAutoScrolling();
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
if (_Reordering == true)
{
StopReorder();
if (_SeparatorColumn != null && _HitItem != _MouseDownHitItem)
ReorderItem(panel);
}
else if (_Resizing == true && _ResizeColumn != null)
{
StopResize();
if (panel.ImmediateResize == false)
ResizeColumn(panel, e.Location.X - MouseDownPoint.X);
}
else
{
if (_HitItem is GridColumn)
ColumnMouseUp(e, panel);
else if (_HitItem is ColumnGroupHeader)
GroupHeaderMouseUp(e, panel);
else
RowHeaderMouseUp(e, panel);
}
}
_MouseDownHitItem = null;
SuperGrid.DoColumnHeaderMouseUpEvent(this, e);
base.InternalMouseUp(e);
}
#region ColumnMouseUp
private void ColumnMouseUp(MouseEventArgs e, GridPanel panel)
{
GridColumn hitColumn = (GridColumn)_HitItem;
switch (_MouseDownHitArea)
{
case HeaderArea.InContent:
case HeaderArea.InMarkup:
if (hitColumn != null && hitColumn == _MouseDownHitItem)
{
if (SuperGrid.DoColumnHeaderClickEvent(panel, hitColumn, e) == false)
{
if (e.Button == MouseButtons.Left)
{
DoHeaderMouseUp(panel, panel.ColumnHeaderClickBehavior,
hitColumn.HeaderTextMarkup, hitColumn);
InvalidateHeader(panel, hitColumn);
}
}
}
break;
}
}
#endregion
#region GroupHeaderMouseUp
private void GroupHeaderMouseUp(MouseEventArgs e, GridPanel panel)
{
ColumnGroupHeader cgh = (ColumnGroupHeader)_HitItem;
switch (_MouseDownHitArea)
{
case HeaderArea.InContent:
case HeaderArea.InMarkup:
if (_HitItem == _MouseDownHitItem)
{
if (SuperGrid.DoColumnGroupHeaderClickEvent(panel, this, cgh, e) == false)
{
if (e.Button == MouseButtons.Left)
{
DoHeaderMouseUp(panel, panel.ColumnGroupHeaderClickBehavior,
cgh.HeaderTextMarkup,
panel.Columns.ColumnAtDisplayIndex(cgh.StartDisplayIndex));
InvalidateHeader(panel, cgh);
}
}
}
break;
}
}
#endregion
#region DoHeaderMouseUp
private void DoHeaderMouseUp(GridPanel panel,
ColumnHeaderClickBehavior cmode, BodyElement bodyElement, GridColumn hitColumn)
{
if (panel.FlushActiveRow() == true)
{
if (DoMarkupClick(bodyElement) == false)
{
if (_DragSelection == true)
ExtendSelection(panel, false);
if (cmode == ColumnHeaderClickBehavior.SortAndReorder && panel.IsSortable == true)
SortColumn(panel, hitColumn);
}
}
}
#region DoMarkupClick
private bool DoMarkupClick(BodyElement bodyElement)
{
if (bodyElement != null)
{
if (bodyElement.MouseOverElement != null)
{
bodyElement.Click(SuperGrid);
SuperGrid.Cursor = Cursors.Default;
return (true);
}
}
return (false);
}
#endregion
#endregion
#region RowHeaderMouseUp
private void RowHeaderMouseUp(MouseEventArgs e, GridPanel panel)
{
switch (_MouseDownHitArea)
{
case HeaderArea.InRowHeader:
SuperGrid.DoColumnRowHeaderClickEvent(panel);
break;
case HeaderArea.InRowHeaderResize:
if (_Resizing == true)
{
StopResize();
if (panel.ImmediateResize == false)
ResizeRowHeader(panel, e.Location.X - MouseDownPoint.X);
}
break;
}
}
#endregion
#endregion
#region InternalMouseDoubleClick
internal override void InternalMouseDoubleClick(MouseEventArgs e)
{
GridColumn hitColumn = _HitItem as GridColumn;
if (hitColumn != null)
{
if (SuperGrid.DoColumnHeaderDoubleClickEvent(hitColumn, e) == false)
{
switch (_HitArea)
{
case HeaderArea.InResize:
if (hitColumn.GetAutoSizeMode() == ColumnAutoSizeMode.None)
{
RowScope scope = (GridPanel.VirtualMode == true || hitColumn.GridPanel.Rows.Count > 1000)
? RowScope.OnScreenRows
: RowScope.AllRows;
hitColumn.Width = Dpi.DescaleWidth(hitColumn.GetMaximumCellSize(scope, true).Width);
}
break;
}
}
}
else
{
if (_HitArea == HeaderArea.InRowHeader)
SuperGrid.DoColumnRowHeaderDoubleClickEvent(GridPanel);
}
base.InternalMouseDoubleClick(e);
}
#endregion
#endregion
#region Column Reorder
#region StartReorder
private void StartReorder(Point pt)
{
if (_MouseDownHitItem != null && Math.Abs(MouseDownPoint.X - pt.X) > 5)
{
Capture = true;
_Reordering = true;
_SeparatorColumn = null;
_HeaderFw = new FloatWindow();
_HeaderFw.Opacity = .3;
_HeaderFw.Owner = SuperGrid.FindForm();
_HeaderFw.Paint += ColumnHeaderFwPaint;
_SeparatorFw = new FloatWindow();
_SeparatorFw.Opacity = .5;
_SeparatorFw.BackColor = Color.Black;
_SeparatorFw.Owner = SuperGrid.FindForm();
}
}
#endregion
#region StopReorder
private void StopReorder()
{
_Reordering = false;
if (_HeaderFw != null)
{
_HeaderFw.Close();
_HeaderFw.Paint -= ColumnHeaderFwPaint;
_HeaderFw.Dispose();
_HeaderFw = null;
}
if (_SeparatorFw != null)
{
HideSeparator();
_SeparatorFw.Close();
_SeparatorFw.Dispose();
_SeparatorFw = null;
}
if (_MouseDownHitItem != null)
InvalidateItem(GridPanel, _MouseDownHitItem);
if (_HitItem != null)
InvalidateItem(GridPanel, _HitItem);
}
#endregion
#region ContinueReorder
private void ContinueReorder(Point pt)
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
if (_HitItem != null && _MouseDownHitItem != null)
{
ReorderHeader(pt);
if (ValidReorder() == true)
{
ReorderSeparator(pt);
}
else if (_SeparatorFw != null)
{
HideSeparator();
_SeparatorColumn = null;
}
}
}
}
#region ValidReorder
private bool ValidReorder()
{
if (IsItemHFrozen(_HitItem) == IsItemHFrozen(_MouseDownHitItem))
{
object o1 = GetParent(_HitItem);
object o2 = GetParent(_MouseDownHitItem);
if (o1 is GridColumnHeader)
o1 = null;
if (o2 is GridColumnHeader)
o2 = null;
return (o1 == o2);
}
return (false);
}
#endregion
#region ReorderHeader
private void ReorderHeader(Point pt)
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
Rectangle r = GetReorderWindowBounds(panel, pt);
if (r.Width <= 0 || r.Height <= 0)
{
_HeaderFw.Hide();
}
else
{
r.Location = SuperGrid.PointToScreen(r.Location);
Size size = _HeaderFw.Size;
_HeaderFw.Bounds = r;
if (_HeaderFw.Visible == false)
_HeaderFw.Show();
else if (r.Size.Equals(size) == false)
_HeaderFw.Refresh();
}
}
}
#region GetReorderWindowBounds
private Rectangle GetReorderWindowBounds(GridPanel panel, Point pt)
{
Rectangle r = GetReorderBounds(panel, _MouseDownHitItem);
Rectangle t = SViewRect;
r.X = (pt.X - _MouseDownDelta);
int x = Math.Max(r.X, t.X);
if (r.X < x)
{
_OrderTextOffset = r.X - x;
r.X = x;
r.Width += _OrderTextOffset;
}
else
{
_OrderTextOffset = 0;
}
int n = r.Right;
x = Math.Min(n, t.Right);
if (r.Right > x)
r.Width -= (r.Right - x);
if (r.Bottom > t.Bottom)
r.Height -= (r.Bottom - t.Bottom);
return (r);
}
#endregion
#endregion
#region ReorderSeparator
private void ReorderSeparator(Point pt)
{
GridPanel panel = GridPanel;
Rectangle r = GetReorderBounds(panel, _HitItem);
Rectangle t = SViewRect;
if (r.Right > t.Right)
r.Width = t.Right - r.X;
bool isRight = (pt.X > r.X + r.Width / 2);
GridColumn column = GetSeparatorColumn(panel, isRight);
if (_SeparatorColumn != column || _SeparatorIsRight != isRight)
{
_SeparatorColumn = column;
_SeparatorIsRight = isRight;
if (column != null)
{
r = GetReorderSeparatorBounds(panel, r, isRight);
r.Location = SuperGrid.PointToScreen(r.Location);
_SeparatorFw.Show();
_SeparatorFw.Bounds = r;
_SeparatorFw.Size = r.Size;
}
else
{
HideSeparator();
}
}
else
{
if (_SeparatorColumn!= null)
_SeparatorFw.Show();
}
}
#region HideSeparator
private void HideSeparator()
{
if (_SeparatorFw != null)
_SeparatorFw.Hide();
}
#endregion
#region GetSeparatorColumn
private GridColumn GetSeparatorColumn(GridPanel panel, bool isRight)
{
if (_HitItem is GridColumn)
return ((GridColumn) _HitItem);
ColumnGroupHeader cgh = (ColumnGroupHeader)_HitItem;
if (cgh != null)
{
GridColumnCollection columns = panel.Columns;
int index = (isRight == true)
? cgh.EndDisplayIndex : cgh.StartDisplayIndex;
return (columns[columns.DisplayIndexMap[index]]);
}
return (null);
}
#endregion
#region GetReorderSeparatorBounds
private Rectangle GetReorderSeparatorBounds(
GridPanel panel, Rectangle r, bool isRight)
{
if (isRight == true)
r.X = r.Right - (SeparatorWidth >> 1);
else
r.X -= (SeparatorWidth >> 1);
r.Width = SeparatorWidth;
if (r.X >= panel.BoundsRelative.Right - 2)
r.X = panel.BoundsRelative.Right - 3;
Rectangle t = SViewRect;
if (r.Bottom > t.Bottom)
r.Height -= (r.Bottom - t.Bottom);
if (r.X < t.X)
r.X = t.X;
else if (r.Right > t.Right)
r.X = t.Right - SeparatorWidth;
return (r);
}
#endregion
#endregion
#endregion
#region GetReorderBounds
private Rectangle GetReorderBounds(GridPanel panel, object item)
{
Rectangle r = BoundsRelative;
if (item is GridColumn)
{
GridColumn column = (GridColumn)item;
int index = panel.Columns.GetDisplayIndex(column);
ColumnGroupHeader cgh = GetParentHeader(index);
if (cgh != null)
r.Y = r.Bottom - (cgh.Size.Height - cgh.BoundsRelative.Height);
r.Height = (panel.BoundsRelative.Height - (r.Y - panel.BoundsRelative.Y));
r.X = column.BoundsRelative.X;
r.Width = column.BoundsRelative.Width;
if (panel.IsSubPanel == true || column.IsHFrozen == false)
r.X -= HScrollOffset;
if (IsVFrozen == false)
r.Y -= VScrollOffset;
return (r);
}
if (item is ColumnGroupHeader)
{
ColumnGroupHeader cgh = (ColumnGroupHeader)item;
r.Y = r.Bottom - cgh.Size.Height;
r.Height = (panel.BoundsRelative.Height - (r.Y - panel.BoundsRelative.Y));
r.X = cgh.BoundsRelative.X;
r.Width = cgh.BoundsRelative.Width;
if (panel.IsSubPanel == true || IsGroupHeaderHFrozen(panel, cgh) == false)
r.X -= HScrollOffset;
if (IsVFrozen == false)
r.Y -= VScrollOffset;
}
return (r);
}
#endregion
#region ReorderItem
private void ReorderItem(GridPanel panel)
{
if (_MouseDownHitItem is GridColumn)
ReorderColumn(panel);
if (_MouseDownHitItem is ColumnGroupHeader)
ReorderGroupHeader(panel);
}
#region ReorderColumn
private void ReorderColumn(GridPanel panel)
{
GridColumn hitColumn = (GridColumn)_MouseDownHitItem;
GridColumnCollection columns = _Columns;
int[] map = columns.DisplayIndexMap;
int curIndex = columns.GetDisplayIndex(hitColumn);
int sepIndex = columns.GetDisplayIndex(_SeparatorColumn);
if (curIndex > sepIndex && _SeparatorIsRight == true && sepIndex < map.Length - 1)
sepIndex++;
else if (curIndex < sepIndex && _SeparatorIsRight == false && sepIndex > 0)
sepIndex--;
if (sepIndex != curIndex)
{
ColumnGroupHeader parent = GetParent(hitColumn) as ColumnGroupHeader;
int[] dmap = new int[map.Length];
if (sepIndex < curIndex)
{
for (int i = curIndex; i > sepIndex; i--)
{
map[i] = map[i - 1];
dmap[i - 1] = 1;
}
}
else
{
for (int i = curIndex; i < sepIndex; i++)
{
map[i] = map[i + 1];
dmap[i + 1] = -1;
}
}
map[sepIndex] = hitColumn.ColumnIndex;
dmap[curIndex] = sepIndex - curIndex;
for (int i = 0; i < map.Length; i++)
columns[map[i]].DisplayIndex = i;
UpdateGroupHeaderRanges(parent != null ? parent.GroupHeaders : GroupHeaders, dmap);
SuperGrid.UpdateStyleCount();
SuperGrid.PrimaryGrid.InvalidateRender();
SuperGrid.DoColumnMovedEvent(panel, hitColumn);
}
}
#endregion
#region ReorderGroupHeader
private void ReorderGroupHeader(GridPanel panel)
{
ColumnGroupHeader cgh = (ColumnGroupHeader)_MouseDownHitItem;
GridColumnCollection columns = _Columns;
int[] map = columns.DisplayIndexMap;
int curStartIndex = cgh.StartDisplayIndex;
int curEndIndex = cgh.EndDisplayIndex;
int sepIndex = columns.GetDisplayIndex(_SeparatorColumn);
if (curStartIndex > sepIndex && _SeparatorIsRight == true && sepIndex < map.Length - 1)
sepIndex++;
else if (curEndIndex < sepIndex && _SeparatorIsRight == false && sepIndex > 0)
sepIndex--;
if (sepIndex != curStartIndex && sepIndex != curEndIndex)
{
ColumnGroupHeader parent = GetParent(cgh) as ColumnGroupHeader;
int n = curEndIndex - curStartIndex + 1;
int[] temp = new int[n];
int[] dmap = new int[map.Length];
for (int i = 0; i < n; i++)
temp[i] = map[curStartIndex + i];
for (int i = 0; i < dmap.Length; i++)
dmap[i] = 0;
if (sepIndex < curStartIndex)
{
for (int i = curStartIndex - 1; i >= sepIndex; i--)
{
map[i + n] = map[i];
dmap[i] = n;
}
for (int i = 0; i < n; i++)
map[sepIndex + i] = temp[i];
for (int i = curStartIndex; i <= curEndIndex; i++)
dmap[i] = sepIndex - curStartIndex;
}
else
{
for (int i = curEndIndex + 1; i <= sepIndex; i++)
{
map[i - n] = map[i];
dmap[i] = -n;
}
for (int i = 0; i < n; i++)
map[sepIndex - n + i + 1] = temp[i];
for (int i = curStartIndex; i <= curEndIndex; i++)
dmap[i] = sepIndex - curEndIndex;
}
for (int i = 0; i < map.Length; i++)
columns[map[i]].DisplayIndex = i;
UpdateGroupHeaderRanges(parent != null ? parent.GroupHeaders : cgh.Collection, dmap);
SuperGrid.UpdateStyleCount();
SuperGrid.PrimaryGrid.InvalidateRender();
for (int i = curStartIndex; i <= curEndIndex; i++)
SuperGrid.DoColumnMovedEvent(panel, columns[map[i]]);
}
}
#endregion
#region UpdateGroupHeaderRanges
private void UpdateGroupHeaderRanges(ColumnGroupHeaderCollection csc, int[] dmap)
{
foreach (ColumnGroupHeader cgh in csc)
{
if (cgh.Visible == true)
{
UpdateGroupHeaderRanges(cgh.GroupHeaders, dmap);
cgh.StartDisplayIndex += dmap[cgh.StartDisplayIndex];
cgh.EndDisplayIndex += dmap[cgh.EndDisplayIndex];
}
}
}
#endregion
#endregion
#region ColumnHeaderFwPaint
void ColumnHeaderFwPaint(object sender, PaintEventArgs e)
{
GridPanel panel = GridPanel;
if (_MouseDownHitItem is GridColumn)
{
GridColumn mouseDownHitColumn = (GridColumn)_MouseDownHitItem;
Rectangle r = mouseDownHitColumn.BoundsRelative;
r.Y = 0;
r.X = _OrderTextOffset;
r.Height = e.ClipRectangle.Height;
RenderColumnHeader(e.Graphics, panel, mouseDownHitColumn, r, false);
r.Width--;
r.Height--;
e.Graphics.DrawRectangle(Pens.DimGray, r);
}
else if (_MouseDownHitItem is ColumnGroupHeader)
{
ColumnGroupHeader cgh = (ColumnGroupHeader)_MouseDownHitItem;
Rectangle r = cgh.BoundsRelative;
r.Y = 0;
r.X = _OrderTextOffset;
r.Height = e.ClipRectangle.Height;
RenderGroupHeader(e.Graphics, panel, cgh, r);
r.Width--;
r.Height--;
e.Graphics.DrawRectangle(Pens.DimGray, r);
}
}
#endregion
#region SortColumn
internal void SortColumn(GridPanel panel, GridColumn column)
{
if (panel.IsSortable == true)
{
if (column.IsGroupColumn == true)
{
column.GroupDirection =
ToggleSortDirection(panel, column.GroupDirection, column.SortCycle);
SuperGrid.DoSortChangedEvent(panel);
}
else if (column.ColumnSortMode != ColumnSortMode.None)
{
SortDirection sortDirection =
ToggleSortDirection(panel, column.SortDirection, column.SortCycle);
if (column.ColumnSortMode == ColumnSortMode.Multiple &&
((Control.ModifierKeys & Keys.Shift) == Keys.Shift))
{
panel.AddSort(column, sortDirection);
}
else
{
if (panel.SortColumns.Count > 1)
sortDirection = SortDirection.Ascending;
panel.SetSort(column, sortDirection);
}
SuperGrid.DoSortChangedEvent(panel);
}
else
{
InvalidateHeader(panel, column);
}
}
else
{
InvalidateHeader(panel, column);
}
}
#region ToggleSortDirection
private SortDirection ToggleSortDirection(
GridPanel panel, SortDirection dir, SortCycle sortCycle)
{
if (dir == SortDirection.Ascending)
return (SortDirection.Descending);
if (dir == SortDirection.None)
return (SortDirection.Ascending);
if (sortCycle == SortCycle.NotSet)
{
sortCycle = panel.SortCycle;
if (sortCycle == SortCycle.NotSet)
sortCycle = SortCycle.AscDesc;
}
return (sortCycle == SortCycle.AscDescNone ? SortDirection.None : SortDirection.Ascending);
}
#endregion
#endregion
#endregion
#region Column Resize
#region StartResize
private void StartResize()
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
_ResizeColumn = _MouseDownHitItem as GridColumn;
if (_ResizeColumn != null)
{
_Resizing = true;
_ResizeWidth = _ResizeColumn.Size.Width;
_HitItem = _ResizeColumn;
_HitArea = HeaderArea.InResize;
if (panel.ImmediateResize == false)
{
_SeparatorFw = new FloatWindow();
_SeparatorFw.Opacity = .5;
_SeparatorFw.BackColor = Color.Black;
_SeparatorFw.Owner = SuperGrid.FindForm();
}
}
}
}
#endregion
#region StopResize
private void StopResize()
{
_Resizing = false;
if (_SeparatorFw != null)
{
HideSeparator();
_SeparatorFw.Close();
_SeparatorFw.Dispose();
_SeparatorFw = null;
}
}
#endregion
#region ContinueResize
private void ContinueResize(GridPanel panel, Point pt)
{
Rectangle r = panel.BoundsRelative;
r.Y = BoundsRelative.Y;
if (panel.IsSubPanel == true)
r.Y -= VScrollOffset;
r.X -= HScrollOffset;
if (pt.X > r.X)
{
Rectangle t = _ResizeColumn.BoundsRelative;
t.X -= HScrollOffset;
int width = pt.X - t.X;
int n = Dpi.Width(_ResizeColumn.MinimumWidth);
if (width < n)
pt.X = t.X + n;
if (pt.X >= SuperGrid.PrimaryGrid.BoundsRelative.Right - Dpi.Width2)
{
HideSeparator();
}
else
{
if (pt.X == panel.BoundsRelative.Right - 1)
pt.X -= 1;
r.X = pt.X;
r.Width = Dpi.Width(SeparatorWidth);
r.Height -= (BoundsRelative.Y - panel.BoundsRelative.Y);
t = SViewRect;
if (r.Bottom > t.Bottom)
r.Height -= (r.Bottom - t.Bottom);
r.Location = SuperGrid.PointToScreen(r.Location);
_SeparatorFw.Show();
_SeparatorFw.Bounds = r;
_SeparatorFw.Size = r.Size;
}
}
}
#endregion
#region ResizeColumn
#region ResizeColumn
private void ResizeColumn(GridPanel panel, int width)
{
ColumnAutoSizeMode autoSizeMode = _ResizeColumn.GetAutoSizeMode();
if (autoSizeMode == ColumnAutoSizeMode.None)
ResizeNoneColumn(panel, width);
else if (autoSizeMode == ColumnAutoSizeMode.Fill)
ResizeFillColumn(panel, width);
}
#endregion
#region ResizeNoneColumn
private void ResizeNoneColumn(GridPanel panel, int width)
{
int newWidth = _ResizeWidth + width;
int n = Dpi.Width(_ResizeColumn.MinimumWidth);
if (newWidth < n)
newWidth = n;
if (_ResizeColumn.ResizeMode == ColumnResizeMode.MoveFollowingElements)
{
_ResizeColumn.Width = Dpi.DescaleWidth(newWidth);
}
else if (_ResizeColumn.ResizeMode == ColumnResizeMode.MaintainTotalWidth)
{
GridColumn ncolumn = panel.Columns.GetNextVisibleColumn(_ResizeColumn);
if ((ncolumn == null) || (ncolumn.GetAutoSizeMode() != ColumnAutoSizeMode.None))
{
_ResizeColumn.Width = Dpi.DescaleWidth(newWidth);
}
else
{
int twidth = _ResizeColumn.Size.Width + ncolumn.Size.Width;
int nwidth = twidth - newWidth;
int n2 = Dpi.Width(ncolumn.MinimumWidth);
if (nwidth < n2)
nwidth = n2;
newWidth = twidth - nwidth;
_ResizeColumn.Width = Dpi.DescaleWidth(newWidth);
ncolumn.Width = Dpi.DescaleWidth(nwidth);
}
}
}
#endregion
#region ResizeFillColumn
private void ResizeFillColumn(GridPanel panel, int width)
{
int fillWeight = 0;
int fillWidth = 0;
GridColumnCollection columns = _Columns;
int colDisplayIndex = columns.GetDisplayIndex(_ResizeColumn);
int[] map = columns.DisplayIndexMap;
for (int i = 0; i < map.Length; i++)
{
int index = map[i];
GridColumn column = columns[index];
if (column.Visible == true)
{
if (column.GetAutoSizeMode() == ColumnAutoSizeMode.Fill)
{
fillWidth += column.Size.Width;
if (i != colDisplayIndex)
fillWeight += column.FillWeight;
}
}
}
if (fillWidth > 0 && fillWeight > 0)
{
int nw = _ResizeWidth + width;
int newFillWidth = fillWidth - nw;
for (int i = 0; i < map.Length; i++)
{
int index = map[i];
GridColumn column = columns[index];
if (column.Visible == true)
{
if (column.GetAutoSizeMode() == ColumnAutoSizeMode.Fill)
{
float colWidth;
if (i != colDisplayIndex)
colWidth = (int)(newFillWidth * (float)column.FillWeight / fillWeight);
else
colWidth = nw;
int n = Dpi.Width(column.MinimumWidth);
if (colWidth < n)
colWidth = n;
column.FillWeight = (int)((colWidth * 1000) / fillWidth);
}
}
}
panel.SuperGrid.Invalidate();
}
}
#endregion
#endregion
#endregion
#region RowHeader Resize
#region ContinueRowHeaderResize
private void ContinueRowHeaderResize(GridPanel panel, Point pt)
{
Rectangle r = panel.BoundsRelative;
r.Y = BoundsRelative.Y;
if (panel.IsSubPanel == true)
r.Y -= VScrollOffset;
r.X -= HScrollOffset;
if (pt.X > r.X)
{
int width = pt.X - r.X;
if (width < 5)
pt.X = r.X + 5;
if (pt.X >= SuperGrid.PrimaryGrid.BoundsRelative.Right - 2)
{
HideSeparator();
}
else
{
if (pt.X == panel.BoundsRelative.Right - 1)
pt.X--;
r.X = pt.X;
r.Width = SeparatorWidth;
r.Height -= (BoundsRelative.Y - panel.BoundsRelative.Y);
Rectangle t = SViewRect;
if (r.Bottom > t.Bottom)
r.Height -= (r.Bottom - t.Bottom);
r.Location = SuperGrid.PointToScreen(r.Location);
_SeparatorFw.Show();
_SeparatorFw.Bounds = r;
_SeparatorFw.Size = r.Size;
}
}
}
#endregion
#region ResizeRowHeader
private void ResizeRowHeader(GridPanel panel, int width)
{
Rectangle t = panel.ViewRect;
int n = Math.Max(5, _ResizeWidth + width);
if (t.Right - 10 < n)
n = t.Right - 10;
n = Dpi.DescaleWidth(n);
if (panel.RowHeaderWidth != n)
{
panel.RowHeaderWidth = n;
panel.SuperGrid.Invalidate();
SuperGrid.DoRowHeaderResizedEvent(panel);
}
}
#endregion
#endregion
#region ActivateFilterPopup
internal void ActivateFilterPopup(GridPanel panel, GridColumn column)
{
if (_FilterMenu != null)
_FilterMenu.Dispose();
_FilterMenu = new FilterPopup(panel);
_LockedColumn = true;
_HitArea = HeaderArea.NoWhere;
_FilterMenu.ActivatePopup(column, ResetColumnState);
}
#endregion
#region DeactivateFilterPopup
internal void DeactivateFilterPopup(GridPanel panel, GridColumn column)
{
FilterPopup fm = _FilterMenu;
if (fm != null)
fm.DeactivatePopup();
}
#endregion
#region GetHitArea
///<summary>
/// Returns the ColumnHeader hit area
/// and column for the given Point
///</summary>
///<param name="pt"></param>
///<param name="column"></param>
///<returns>HeaderArea</returns>
public HeaderArea GetHitArea(Point pt, ref GridColumn column)
{
object hitItem = null;
HeaderArea area = GetHitArea(pt, ref hitItem, false);
column = hitItem as GridColumn;
return (area);
}
///<summary>
/// Returns the ColumnHeader hit area
/// and hit object for the given Point
///</summary>
///<param name="pt"></param>
///<param name="hitItem"></param>
///<returns></returns>
public HeaderArea GetHitArea(Point pt, ref object hitItem)
{
return (GetHitArea(pt, ref hitItem, false));
}
private HeaderArea GetHitArea(
Point pt, ref object hitItem, bool isMouseDown)
{
GridPanel panel = Parent as GridPanel;
if (panel != null)
{
GridElement hitObject = GetHitObject(panel, pt, isMouseDown);
if (hitObject == this)
return (GetHeaderHitArea(panel, pt, ref hitItem, isMouseDown));
if (hitObject == panel.GroupByRow)
return (HeaderArea.InGroupBox);
}
return (HeaderArea.NoWhere);
}
#region GetHitObject
private GridElement GetHitObject(
GridPanel panel, Point pt, bool isMouseDown)
{
if (isMouseDown == true && panel.GroupByRow.Visible == true)
{
if (panel.GroupByRow.Bounds.Contains(pt) == true)
return (panel.GroupByRow);
}
if (Capture == true || Bounds.Contains(pt) == true)
return (this);
return (null);
}
#endregion
#region GetHeaderHitArea
private HeaderArea GetHeaderHitArea(GridPanel panel,
Point pt, ref object hitItem, bool isMouseDown)
{
hitItem = null;
HeaderArea area = GetRowHeaderArea(panel, pt);
if (area != HeaderArea.NoWhere)
return (area);
area = GetGroupHeaderArea(panel, pt, ref hitItem);
if (area != HeaderArea.NoWhere)
return (area);
GridColumn column = GetHitColumn(panel, pt, isMouseDown, false);
area = GetHeaderArea(panel, pt, ref column);
hitItem = column;
return (area);
}
#region GetGroupHeaderArea
private HeaderArea GetGroupHeaderArea(GridPanel panel, Point pt, ref object hitItem)
{
ColumnGroupHeader cgh = GetHitGroupHeader(panel, pt, _GroupHeaders);
if (cgh != null)
{
if (GetShowRootColumnHeaders(cgh) == false)
{
GridColumn coll = GetHitColumn(panel, pt, false, true);
if (coll != null)
{
HeaderArea area = GetHeaderArea(panel, pt, ref coll);
if (area == HeaderArea.InResize)
{
hitItem = coll;
return (area);
}
}
}
hitItem = cgh;
if (IsMouseDown == false)
{
int[] map = panel.Columns.DisplayIndexMap;
Rectangle r = GetSubScrollBounds(panel, cgh);
if (pt.X < r.Left + 3 && pt.X >= r.Left)
{
if ((uint)cgh.StartDisplayIndex < map.Length)
{
GridColumn column = panel.Columns[map[cgh.StartDisplayIndex]];
if (InLeftResizeArea(ref column, panel) == true)
{
hitItem = column;
return (HeaderArea.InResize);
}
}
}
if ((pt.X > r.Right - 5) && (pt.X < r.Right + 3))
{
if ((uint)cgh.EndDisplayIndex < map.Length)
{
GridColumn column = panel.Columns[map[cgh.EndDisplayIndex]];
if (InRightResizeArea(ref column, panel) == true)
{
hitItem = column;
return (HeaderArea.InResize);
}
}
}
}
if (cgh.AllowSelection == true)
return (HeaderArea.InContent);
return (HeaderArea.NoWhere);
}
return (HeaderArea.NoWhere);
}
#endregion
#region GetHitGroupHeader
private ColumnGroupHeader GetHitGroupHeader(
GridPanel panel, Point pt, ColumnGroupHeaderCollection csc)
{
if (csc != null)
{
foreach (ColumnGroupHeader cgh in csc)
{
if (cgh.Visible == true)
{
Rectangle r = GetSubScrollBounds(panel, cgh);
if (r.Contains(pt) == true)
return (cgh);
ColumnGroupHeader csh2 = GetHitGroupHeader(panel, pt, cgh.GroupHeaders);
if (csh2 != null)
return (csh2);
}
}
}
return (null);
}
#endregion
#region GetRowHeaderArea
private HeaderArea GetRowHeaderArea(GridPanel panel, Point pt)
{
Rectangle r = GetRowHeaderBounds(panel);
r.Width += Dpi.Width2;
if (r.Contains(pt) == true)
{
if (Capture == true)
return (_HitArea);
r.Width -= Dpi.Width2;
if (panel.AllowRowHeaderResize == true)
{
if (pt.X >= r.Right - Dpi.Width5)
return (HeaderArea.InRowHeaderResize);
}
return (HeaderArea.InRowHeader);
}
return (HeaderArea.NoWhere);
}
#endregion
#region GetHitColumn
///<summary>
/// Gets the associated column at the given location
///</summary>
///<param name="x"></param>
///<param name="y"></param>
///<returns></returns>
public GridColumn GetHitColumn(int x, int y)
{
return (GetHitColumn(new Point(x, y)));
}
///<summary>
/// Gets the associated column at the given point
///</summary>
///<param name="pt"></param>
///<returns></returns>
public GridColumn GetHitColumn(Point pt)
{
GridPanel panel = GridPanel;
if (panel != null)
return (GetHitColumn(panel, pt, false, false));
return (null);
}
private GridColumn GetHitColumn(
GridPanel panel, Point pt, bool isMouseDown, bool limit)
{
int dy = (isMouseDown == true) ? 50 : 0;
GridColumnCollection columns = _Columns;
foreach (GridColumn column in columns)
{
if (column.Visible == true)
{
Rectangle r = GetBounds(panel, column);
if (pt.X >= r.Left && pt.X < r.Right)
{
int top = limit ? r.Bottom - 10 : r.Top;
if (pt.Y >= top && pt.Y < r.Bottom + dy)
return (column);
}
}
}
return (null);
}
#endregion
#region GetHeaderArea
private HeaderArea GetHeaderArea(GridPanel panel, Point pt, ref GridColumn column)
{
GridColumn hcolumn = column;
if (column == null)
column = panel.Columns.LastVisibleColumn;
if (column != null)
{
Rectangle r = column.BoundsRelative;
if (IsVFrozen == false)
r.Y -= VScrollOffset;
if (panel.IsSubPanel == true || column.IsHFrozen == false)
r.X -= HScrollOffset;
if (pt.X < r.Left + 3 && pt.X >= r.Left)
{
if (InLeftResizeArea(ref column, panel) == true)
return (HeaderArea.InResize);
}
if ((pt.X > r.Right - 5) && (pt.X < r.Right + 3))
{
if (InRightResizeArea(ref column, panel) == true)
return (HeaderArea.InResize);
}
if (column.FilterImageBounds.IsEmpty == false)
{
Rectangle t = GetScrollBounds(
panel, column, column.FilterImageBounds);
t.Inflate(2, 2);
if (t.Contains(pt) == true)
return (HeaderArea.InFilterMenu);
}
column = hcolumn;
if (hcolumn != null)
{
if (column.AllowSelection == true)
return (HeaderArea.InContent);
return (HeaderArea.NoWhere);
}
}
return (HeaderArea.InWhitespace);
}
#region InLeftResizeArea
private bool InLeftResizeArea(ref GridColumn column, GridPanel panel)
{
GridColumn pcolumn =
panel.Columns.GetPrevVisibleColumn(column);
if (pcolumn != null)
{
if (pcolumn.CanResize == true && pcolumn.ResizeMode != ColumnResizeMode.None)
{
column = pcolumn;
return (true);
}
}
return (false);
}
#endregion
#region InRightResizeArea
private bool InRightResizeArea(ref GridColumn column, GridPanel panel)
{
GridColumn nColumn =
panel.Columns.GetNextVisibleColumn(column);
if (nColumn != null && nColumn.Size.Width < 5)
{
if (nColumn.CanResize == true && nColumn.ResizeMode != ColumnResizeMode.None)
column = nColumn;
}
if (column.CanResize == true && column.ResizeMode != ColumnResizeMode.None)
return (true);
return (false);
}
#endregion
#endregion
#endregion
#endregion
#region GetParent
///<summary>
///Gets the object that is the "parent" of the given item
///(either a GridColumn or ColumnGroupHeader).
///</summary>
///<param name="item"></param>
///<returns>Parent or null</returns>
public object GetParent(object item)
{
if (item is GridColumn)
return (GetParentHeader((GridColumn) item));
ColumnGroupHeader cgh = item as ColumnGroupHeader;
if (cgh != null)
return (cgh.Collection.Parent);
return (null);
}
#endregion
#region GetParentHeader
///<summary>
///Gets the object that is the "parent" of the given column.
///</summary>
///<param name="column"></param>
///<returns>parent or null</returns>
public object GetParentHeader(GridColumn column)
{
int index = GridPanel.Columns.GetDisplayIndex(column);
return (GetParentHeader(index));
}
///<summary>
///Gets the ColumnGroupHeader that is the "parent" of the column at
///the given DISPLAY index.
///</summary>
///<param name="displayIndex">DISPLAY INDEX</param>
///<returns>parent object or null</returns>
public ColumnGroupHeader GetParentHeader(int displayIndex)
{
ColumnGroupHeader tcsh = GetColumnGroupHeader(GroupHeaders, displayIndex);
if (tcsh != null)
{
while (tcsh.GroupHeaders != null)
{
ColumnGroupHeader fcsh = GetColumnGroupHeader(tcsh.GroupHeaders, displayIndex);
if (fcsh == null || fcsh.Visible == false)
break;
tcsh = fcsh;
}
}
return (tcsh);
}
#endregion
#region GetColumnGroupHeader
internal ColumnGroupHeader GetColumnGroupHeader(int index)
{
return (GetColumnGroupHeader(GroupHeaders, index));
}
private ColumnGroupHeader GetColumnGroupHeader(IEnumerable<ColumnGroupHeader> csc, int index)
{
if (csc != null)
{
foreach (ColumnGroupHeader cgh in csc)
{
if (cgh.Contains(index))
return (cgh.Visible == true ? cgh : null);
}
}
return (null);
}
#endregion
#region UpdateImageBounds
internal void UpdateImageBounds(GridPanel panel, GridColumn column)
{
Rectangle r = GetColumnHeaderBounds(panel, column);
if (column.AdjustSortImagePositionByMargin == true)
{
VisualStyle style = GetEffectiveStyle(column);
r.X += (style.BorderThickness.Left + style.Margin.Left);
r.Width -= (style.BorderThickness.Horizontal + style.Margin.Horizontal);
r.Y += (style.BorderThickness.Top + style.Margin.Top);
r.Height -= (style.BorderThickness.Vertical + style.Margin.Vertical);
}
r.Inflate(-3, -3);
r.Width--;
Alignment sortAlignment = (_SortImageAlignment == Alignment.NotSet)
? Alignment.TopCenter : _SortImageAlignment;
Alignment filterAlignment = (_FilterImageAlignment == Alignment.NotSet)
? Alignment.MiddleLeft : _FilterImageAlignment;
Rectangle rt = r;
column.SortImageBounds = Rectangle.Empty;
column.FilterImageBounds = Rectangle.Empty;
Image sortImage = GetColumnSortImage(panel, column);
if (sortImage != null)
{
Rectangle t = GetImageBounds(sortImage, sortAlignment, ref r);
column.SortImageBounds = t;
}
Image filterImage = GetColumnFilterImage(column);
if (filterImage != null)
{
Rectangle t;
if (sortImage != null && filterAlignment == sortAlignment)
{
t = GetImageBounds(filterImage, filterAlignment, ref r);
switch (filterAlignment)
{
case Alignment.TopCenter:
case Alignment.MiddleCenter:
case Alignment.BottomCenter:
t.X = rt.X + (r.Width - (sortImage.Width +
filterImage.Width)) / 2 + sortImage.Width;
break;
case Alignment.TopLeft:
case Alignment.MiddleLeft:
case Alignment.BottomLeft:
break;
}
}
else
{
t = GetImageBounds(filterImage, filterAlignment, ref rt);
r.Intersect(rt);
}
column.FilterImageBounds = t;
}
}
#endregion
#region GetColumnHeaderBounds
private Rectangle GetColumnHeaderBounds(GridPanel panel, GridColumn column)
{
Rectangle r = GetRelativeBounds(panel, column);
r.X = column.BoundsRelative.X;
r.Width = column.BoundsRelative.Width;
ColumnGroupHeader cgh = GetParentHeader(panel.Columns.GetDisplayIndex(column.ColumnIndex));
if (cgh != null)
{
int n = cgh.Size.Height - cgh.BoundsRelative.Height;
r.Y = r.Bottom - n;
r.Height = n;
}
return (r);
}
#endregion
#region GetRelativeSubSize
internal int GetRelativeSubSize(ColumnGroupHeader cgh, int index)
{
int n = cgh.BoundsRelative.Height;
foreach (ColumnGroupHeader sub in cgh.GroupHeaders)
{
if (sub.Contains(index) == true)
n += GetRelativeSubSize(sub, index);
}
return (n);
}
#endregion
#region GetRowHeaderBounds
private Rectangle GetRowHeaderBounds(GridPanel panel)
{
if (panel.ShowRowHeaders == true)
{
Rectangle r = Bounds;
r.Width = panel.RowHeaderWidthEx;
Rectangle p = panel.PanelBounds;
if (r.Y < p.Y)
{
r.Height -= (p.Y - r.Y + 1);
r.Y = p.Y + 1;
}
return (r);
}
return (Rectangle.Empty);
}
#endregion
#region Style support
#region GroupHeader Style support
#region InvalidateStyle
///<summary>
///Invalidates the cached Style
///definition for all defined StyleTypes
///</summary>
public void InvalidateStyle()
{
GridColumnCollection columns = GridPanel.Columns;
foreach (GridColumn column in columns)
column.InvalidateStyle();
InvalidateStyle(GroupHeaders);
}
///<summary>
///Invalidates the cached Style
///definition for all GroupHeader defined StyleTypes
///</summary>
///<param name="cgh"></param>
public void InvalidateStyle(ColumnGroupHeader cgh)
{
if (cgh.EffectiveStyles != null)
{
cgh.EffectiveStyles.Dispose();
cgh.EffectiveStyles = null;
}
InvalidateStyle(cgh.GroupHeaders);
}
private void InvalidateStyle(IEnumerable<ColumnGroupHeader> groups)
{
foreach (ColumnGroupHeader cgh in groups)
InvalidateStyle(cgh);
}
///<summary>
///Invalidate the cached Style
///definition for the given StyleType
///</summary>
///<param name="type"></param>
public void InvalidateStyle(StyleType type)
{
GridColumnCollection columns = GridPanel.Columns;
foreach (GridColumn column in columns)
column.InvalidateStyle(type);
InvalidateStyle(GroupHeaders, type);
}
///<summary>
///Invalidate the cached Style
///definition for the given GroupHeader StyleType
///</summary>
///<param name="cgh"></param>
///<param name="type"></param>
public void InvalidateStyle(ColumnGroupHeader cgh, StyleType type)
{
if (cgh.EffectiveStyles != null)
{
cgh.EffectiveStyles[type].Dispose();
cgh.EffectiveStyles[type] = null;
}
InvalidateStyle(cgh.GroupHeaders, type);
}
private void InvalidateStyle(IEnumerable<ColumnGroupHeader> groups, StyleType type)
{
foreach (ColumnGroupHeader cgh in groups)
InvalidateStyle(cgh, type);
}
#endregion
#region GetSizingStyle
private ColumnHeaderVisualStyle GetSizingStyle(GridPanel panel, ColumnGroupHeader cgh)
{
StyleType style = panel.GetSizingStyle();
if (style == StyleType.NotSet)
style = StyleType.Default;
return (GetEffectiveStyle(cgh, style));
}
#endregion
#region GetGroupHeaderStyleState
private StyleState GetGroupHeaderStyleState(ColumnGroupHeader cgh)
{
StyleState state = StyleState.Default;
if (_Reordering == true)
{
if (cgh == _MouseDownHitItem)
state |= StyleState.MouseOver;
}
else if (_HitItem == cgh)
{
state |= StyleState.MouseOver;
}
if (IsGroupHeaderSelected(cgh) == true)
state |= StyleState.Selected;
if (IsGroupHeaderReadOnly(cgh) == true)
state |= StyleState.ReadOnly;
return (state);
}
#endregion
#region GetEffectiveStyle
///<summary>
/// GetEffectiveStyle
///</summary>
///<param name="cgh"></param>
///<returns></returns>
public ColumnHeaderVisualStyle GetEffectiveStyle(ColumnGroupHeader cgh)
{
StyleState styleState = GetGroupHeaderStyleState(cgh);
ColumnHeaderVisualStyle style = GetEffectiveStyle(cgh, styleState);
return (style);
}
///<summary>
///Gets the EffectiveStyle for the given StyleState
///</summary>
///<param name="cgh"></param>
///<param name="cellState"></param>
///<returns></returns>
public ColumnHeaderVisualStyle
GetEffectiveStyle(ColumnGroupHeader cgh, StyleState cellState)
{
StyleType type = GetStyleType(cellState);
return (GetEffectiveStyle(cgh, type));
}
internal ColumnHeaderVisualStyle
GetEffectiveStyle(ColumnGroupHeader cgh, StyleType sizingStyle)
{
return (GetGroupHeaderStyle(cgh, sizingStyle));
}
#region GetGroupHeaderStyle
internal ColumnHeaderVisualStyle GetGroupHeaderStyle(ColumnGroupHeader cgh, StyleType e)
{
ValidateGroupHeaderStyle(cgh);
if (cgh.EffectiveStyles == null)
cgh.EffectiveStyles = new ColumnHeaderVisualStyles();
if (cgh.EffectiveStyles.IsValid(e) == false)
{
GridPanel panel = GridPanel;
ColumnHeaderVisualStyle style = new ColumnHeaderVisualStyle();
StyleType[] css = style.GetApplyStyleTypes(e);
if (css != null)
{
ColumnGroupHeader pcgh = GetParent(cgh) as ColumnGroupHeader;
if (pcgh != null)
{
if (GetAutoApplyGroupColor(cgh) != true)
pcgh = 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(cgh.HeaderStyles[cs]);
if (pcgh != null)
{
ColumnHeaderVisualStyle gstyle = GetEffectiveStyle(pcgh, cs);
if (gstyle.Background != null)
{
if (cgh.HeaderStyles[cs].Background == null || cgh.HeaderStyles[cs].Background.IsEmpty)
style.Background = gstyle.Background.Copy();
}
if (gstyle.TextColor.IsEmpty == false)
{
if (cgh.HeaderStyles[cs].TextColor.IsEmpty)
style.TextColor = gstyle.TextColor;
}
}
}
}
SuperGrid.DoGetColumnGroupHeaderStyleEvent(panel, cgh, 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;
cgh.EffectiveStyles[e] = style;
}
return (cgh.EffectiveStyles[e]);
}
#region ValidateGroupHeaderStyle
private void ValidateGroupHeaderStyle(ColumnGroupHeader cgh)
{
if (cgh.StyleUpdateCount != SuperGrid.StyleUpdateCount)
{
if (cgh.EffectiveStyles != null)
{
cgh.EffectiveStyles.Dispose();
cgh.EffectiveStyles = null;
}
cgh.StyleUpdateCount = SuperGrid.StyleUpdateCount;
}
}
#endregion
#endregion
#endregion
#endregion
#region ColumnHeader Style support
#region GetSizingStyle
private ColumnHeaderVisualStyle GetSizingStyle(GridPanel panel, GridColumn column)
{
StyleType style = panel.GetSizingStyle();
if (style == StyleType.NotSet)
style = StyleType.Default;
return (GetEffectiveStyle(column, style));
}
#endregion
#region GetStyleState
private StyleState GetStyleState(GridColumn column, bool selected)
{
StyleState state = StyleState.Default;
if (_Reordering == true)
{
if (column == _MouseDownHitItem)
state |= StyleState.MouseOver;
}
else if (_HitItem == column)
{
state |= StyleState.MouseOver;
}
if (selected == true)
state |= StyleState.Selected;
if (column.IsReadOnly == true)
state |= StyleState.ReadOnly;
return (state);
}
#endregion
#region GetStyleType
private StyleType GetStyleType(StyleState state)
{
switch (state)
{
case StyleState.MouseOver:
return (StyleType.MouseOver);
case StyleState.Selected:
return (StyleType.Selected);
case StyleState.Selected | StyleState.MouseOver:
return (StyleType.SelectedMouseOver);
case StyleState.ReadOnly:
return (StyleType.ReadOnly);
case StyleState.ReadOnly | StyleState.MouseOver:
return (StyleType.ReadOnlyMouseOver);
case StyleState.ReadOnly | StyleState.Selected:
return (StyleType.ReadOnlySelected);
case StyleState.ReadOnly | StyleState.MouseOver | StyleState.Selected:
return (StyleType.ReadOnlySelectedMouseOver);
default:
return (StyleType.Default);
}
}
#endregion
#region GetEffectiveStyle
///<summary>
/// GetEffectiveStyle
///</summary>
///<param name="column"></param>
///<returns></returns>
public ColumnHeaderVisualStyle GetEffectiveStyle(GridColumn column)
{
StyleState styleState = GetStyleState(column, column.IsSelected);
ColumnHeaderVisualStyle style = GetEffectiveStyle(column, styleState);
return (style);
}
///<summary>
///Gets the EffectiveStyle for the given StyleState
///</summary>
///<param name="column"></param>
///<param name="cellState"></param>
///<returns></returns>
public ColumnHeaderVisualStyle
GetEffectiveStyle(GridColumn column, StyleState cellState)
{
StyleType type = GetStyleType(cellState);
return (GetEffectiveStyle(column, type));
}
internal ColumnHeaderVisualStyle
GetEffectiveStyle(GridColumn column, StyleType type)
{
return (column.GetHeaderStyle(type));
}
#endregion
#region GetEffectiveRowHeaderStyle
internal ColumnHeaderRowVisualStyle GetEffectiveRowHeaderStyle()
{
return (GetEffectiveRowHeaderStyleEx(GetRowHeaderState()));
}
internal ColumnHeaderRowVisualStyle
GetEffectiveRowHeaderStyleEx(StyleState rowState)
{
ValidateRowHeaderStyle();
StyleType type = GetStyleType(rowState);
return (GetRowHeaderStyle(type));
}
#region ValidateRowHeaderStyle
private void ValidateRowHeaderStyle()
{
if (_StyleUpdateCount != SuperGrid.StyleUpdateCount)
{
_EffectiveRowHeaderStyles = null;
_StyleUpdateCount = SuperGrid.StyleUpdateCount;
}
}
#endregion
#region GetRowHeaderState
private StyleState GetRowHeaderState()
{
StyleState rowState = StyleState.Default;
if (_HitArea == HeaderArea.InRowHeader || _HitArea == HeaderArea.InWhitespace)
rowState |= StyleState.MouseOver;
GridPanel panel = GridPanel;
if (panel != null)
{
if (panel.ReadOnly == true)
rowState |= StyleState.ReadOnly;
if (panel == SuperGrid.ActiveGrid)
rowState |= StyleState.Selected;
}
return (rowState);
}
#endregion
#region GetRowHeaderStyle
private ColumnHeaderRowVisualStyle GetRowHeaderStyle(StyleType e)
{
if (_EffectiveRowHeaderStyles == null)
_EffectiveRowHeaderStyles = new ColumnHeaderRowVisualStyles();
if (_EffectiveRowHeaderStyles.IsValid(e) == false)
{
ColumnHeaderRowVisualStyle style = new ColumnHeaderRowVisualStyle();
StyleType[] css = style.GetApplyStyleTypes(e);
if (css != null)
{
foreach (StyleType cs in css)
{
style.ApplyStyle(SuperGrid.BaseVisualStyles.ColumnHeaderRowStyles[cs]);
style.ApplyStyle(SuperGrid.DefaultVisualStyles.ColumnHeaderRowStyles[cs]);
style.ApplyStyle(GridPanel.DefaultVisualStyles.ColumnHeaderRowStyles[cs]);
}
}
SuperGrid.DoGetColumnHeaderRowHeaderStyleEvent(this, e, ref style);
if (style.RowHeader.Background == null || style.RowHeader.Background.IsEmpty == true)
style.RowHeader.Background = new Background(Color.WhiteSmoke);
_EffectiveRowHeaderStyles[e] = style;
}
return (_EffectiveRowHeaderStyles[e]);
}
#endregion
#endregion
#endregion
#endregion
#region GetShowRootColumnHeaders
private bool GetShowRootColumnHeaders(ColumnGroupHeader cgh)
{
while (cgh != null)
{
if (cgh.ShowColumnHeaders != Tbool.NotSet)
return (cgh.ShowColumnHeaders == Tbool.True);
cgh = cgh.Collection.Parent as ColumnGroupHeader;
}
return (_ShowGroupColumnHeaders);
}
#endregion
#region GetAutoApplyGroupColor
internal bool GetAutoApplyGroupColor(ColumnGroupHeader cgh)
{
if (cgh.AutoApplyGroupColors != Tbool.NotSet)
return (cgh.AutoApplyGroupColors == Tbool.True);
return (AutoApplyGroupColors);
}
#endregion
#region IsGroupHeaderSelected
///<summary>
///Returns whether the given GroupHeader is selected (ie. all
///visible columns/headers it encompasses must be selected)
///</summary>
///<param name="cgh">GroupHeader</param>
///<returns>true, if all selected</returns>
public bool IsGroupHeaderSelected(ColumnGroupHeader cgh)
{
GridPanel panel = GridPanel;
GridColumnCollection columns = panel.Columns;
int[] map = columns.DisplayIndexMap;
bool selected = false;
for (int i = cgh.StartDisplayIndex; i <= cgh.EndDisplayIndex; i++)
{
if ((uint) i < map.Length)
{
GridColumn column = columns[map[i]];
if (column.Visible == true)
{
if (column.IsSelected == false)
return (false);
selected = true;
}
}
}
return (selected);
}
#endregion
#region IsGroupHeaderReadOnly
/// <summary>
///Returns whether the given GroupHeader is ReadOnly (ie. all
///visible columns/headers it encompasses must be ReadOnly)
/// </summary>
/// <param name="cgh"></param>
/// <returns></returns>
public bool IsGroupHeaderReadOnly(ColumnGroupHeader cgh)
{
GridPanel panel = GridPanel;
GridColumnCollection columns = panel.Columns;
int[] map = columns.DisplayIndexMap;
bool readOnly = false;
for (int i = cgh.StartDisplayIndex; i <= cgh.EndDisplayIndex; i++)
{
if ((uint)i >= map.Length)
break;
GridColumn column = columns[map[i]];
if (column.Visible == true)
{
if (column.IsReadOnly == false)
return (false);
readOnly = true;
}
}
return (readOnly);
}
#endregion
#region IsItemHFrozen
internal bool IsItemHFrozen(object item)
{
if (item is GridColumn)
return ((GridColumn)item).IsHFrozenEx;
if (item is ColumnGroupHeader)
return (IsGroupHeaderHFrozen(GridPanel, (ColumnGroupHeader)item));
return (false);
}
#endregion
#region IsGroupHeaderHFrozen
internal bool IsGroupHeaderHFrozen(GridPanel panel, ColumnGroupHeader cgh)
{
if (panel.IsSubPanel == false)
{
if (cgh != null)
return (cgh.StartDisplayIndex < panel.FrozenColumnCount);
}
return (false);
}
#endregion
#region GetBounds
internal Rectangle GetBounds(GridPanel panel, GridColumn column)
{
Rectangle r = GetRelativeBounds(panel, column);
return (GetScrollBounds(panel, column, r));
}
#endregion
#region GetRelativeBounds
internal Rectangle GetRelativeBounds(GridPanel panel, GridColumn column)
{
Rectangle r = BoundsRelative;
r.X = column.BoundsRelative.X;
r.Width = column.BoundsRelative.Width;
return (r);
}
#endregion
#region GetScrollBounds
internal Rectangle GetScrollBounds(
GridPanel panel, GridColumn column, Rectangle r)
{
if (r.IsEmpty == false)
{
if (IsVFrozen == false)
r.Y -= VScrollOffset;
if (panel.IsSubPanel == true || column.IsHFrozen == false)
r.X -= HScrollOffset;
}
return (r);
}
#endregion
#region GetSubScrollBounds
internal Rectangle GetSubScrollBounds(GridPanel panel, ColumnGroupHeader cgh)
{
Rectangle r = cgh.BoundsRelative;
if (r.IsEmpty == false)
{
if (IsVFrozen == false)
r.Y -= VScrollOffset;
if (panel.IsSubPanel == true || IsGroupHeaderHFrozen(panel, cgh) == false)
r.X -= HScrollOffset;
}
return (r);
}
#endregion
#region GetSubContScrollBounds
internal Rectangle GetSubContScrollBounds(GridPanel panel, ColumnGroupHeader cgh)
{
Rectangle r = cgh.BoundsRelative;
r.Height = cgh.Size.Height;
if (r.IsEmpty == false)
{
if (IsVFrozen == false)
r.Y -= VScrollOffset;
if (panel.IsSubPanel == true || IsGroupHeaderHFrozen(panel, cgh) == false)
r.X -= HScrollOffset;
}
return (r);
}
#endregion
#region GetContentBounds
internal Rectangle GetContentBounds(GridPanel panel, ColumnHeaderVisualStyle style, Rectangle r)
{
if (_ShowHeaderImages == true)
{
object figure = style.GetFigure(panel);
if (figure != null)
{
Size size = style.GetFigureSize(panel);
if (style.IsOverlayImage != true)
{
switch (style.ImageAlignment)
{
case Alignment.TopCenter:
r.Y += size.Height;
r.Height -= size.Height;
break;
case Alignment.MiddleCenter:
break;
case Alignment.BottomCenter:
r.Height -= size.Height;
break;
case Alignment.TopRight:
case Alignment.MiddleRight:
case Alignment.BottomRight:
r.Width -= size.Width;
break;
default:
r.X += size.Width;
r.Width -= size.Width;
break;
}
}
}
}
return (r);
}
#endregion
#region GetAdjustedBounds
private Rectangle GetAdjustedBounds(VisualStyle style, Rectangle r)
{
r.X += Dpi.Width(style.BorderThickness.Left + style.Margin.Left + style.Padding.Left);
r.Width -= Dpi.Width(style.BorderThickness.Horizontal + style.Margin.Horizontal + style.Padding.Horizontal);
r.Y += Dpi.Height(style.BorderThickness.Top + style.Margin.Top + style.Padding.Top);
r.Height -= Dpi.Height(style.BorderThickness.Vertical + style.Margin.Vertical + style.Padding.Vertical);
return (r);
}
#endregion
#region GetImageBounds
/// <summary>
/// Gets the bounding rectangle for the
/// given column header image
/// </summary>
/// <param name="column"></param>
/// <returns>Bounding rectangle</returns>
public Rectangle GetImageBounds(GridColumn column)
{
if (_ShowHeaderImages == true)
{
GridPanel panel = GridPanel;
if (panel != null)
{
SuperGridControl sg = panel.SuperGrid;
if (sg != null)
{
ColumnHeaderVisualStyle style = GetEffectiveStyle(column);
object figure = style.GetFigure(panel);
if (figure != null)
{
Rectangle bounds = GetBounds(panel, column);
using (Graphics g = sg.CreateGraphics())
{
Rectangle t = GetAdjustedBounds(style,
GetContentBounds(panel, style, bounds));
return (style.GetFigureBounds(panel, t));
}
}
}
}
}
return (Rectangle.Empty);
}
#endregion
#region InvalidateHeader
internal void InvalidateHeader(GridPanel panel, GridColumn column)
{
Rectangle bounds = BoundsRelative;
if (panel.IsVFrozen == false)
bounds.Y -= VScrollOffset;
bounds.X = column.BoundsRelative.X;
bounds.Width = column.BoundsRelative.Width;
if (panel.IsSubPanel == true || column.IsHFrozen == false)
bounds.X -= HScrollOffset;
InvalidateRender(bounds);
}
private void InvalidateHeader(GridPanel panel, ColumnGroupHeader cgh)
{
Rectangle r = GetSubScrollBounds(panel, cgh);
InvalidateRender(r);
}
#endregion
#region InvalidateRowHeader
internal void InvalidateRowHeader()
{
InvalidateRender(RowHeaderBounds);
}
#endregion
#region InvalidateWhitespace
internal void InvalidateWhitespace()
{
Rectangle bounds = Bounds;
GridColumn col = GridPanel.Columns.LastVisibleColumn;
if (col != null)
{
if (col.Bounds.Right < bounds.Right)
{
int n = bounds.Right - col.Bounds.Right;
bounds.X = col.Bounds.Right;
bounds.Width = n;
}
InvalidateRender(bounds);
}
}
#endregion
#region InvalidateItem
private void InvalidateItem(GridPanel panel, object item)
{
if (item is GridColumn)
InvalidateHeader(panel, (GridColumn)item);
else if (item is ColumnGroupHeader)
InvalidateHeader(panel, (ColumnGroupHeader)item);
}
#endregion
#region CancelCapture
/// <summary>
/// Cancels any in progress operations (resize, reorder)
/// that may have the mouse captured.
/// </summary>
public override void CancelCapture()
{
StopReorder();
StopResize();
_MouseDownHitItem = null;
base.CancelCapture();
}
#endregion
}
#region enums
#region HeaderArea
///<summary>
/// HeaderArea
///</summary>
public enum HeaderArea
{
///<summary>
/// NoWhere
///</summary>
NoWhere,
///<summary>
/// InContent
///</summary>
InContent,
///<summary>
/// InResize
///</summary>
InResize,
///<summary>
/// InRowHeader
///</summary>
InRowHeader,
///<summary>
/// InRowHeaderResize
///</summary>
InRowHeaderResize,
///<summary>
/// InWhitespace
///</summary>
InWhitespace,
///<summary>
/// InMarkup
///</summary>
InMarkup,
///<summary>
/// InFilterMenu
///</summary>
InFilterMenu,
///<summary>
/// InGroupBox
///</summary>
InGroupBox,
}
#endregion
#region ImageVisibility
///<summary>
/// ImageVisibility
///</summary>
public enum ImageVisibility
{
///<summary>
/// NotSet
///</summary>
NotSet = -1,
///<summary>
/// Auto
///</summary>
Auto,
///<summary>
/// Always
///</summary>
Always,
///<summary>
/// Never
///</summary>
Never,
}
#endregion
#endregion
}