2431 lines
65 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using DevComponents.DotNetBar.SuperGrid.Style;
using DevComponents.SuperGrid.TextMarkup;
namespace DevComponents.DotNetBar.SuperGrid
{
/// <summary>
/// Defines the grid GridGroupBy Row
/// </summary>
public class GridGroupByRow : GridTextRow
{
#region Constants
const int MarkerWidth = 13;
const int MarkerHeight = 7;
const int MarkerHPad = 10;
const int MarkerVPad = 12;
const int TextPad = 3;
const int TextHPad = 6;
const int TextVPad = 6;
const int BoxSpacing = 8;
const int DefaultMinRowHeight = 35;
#endregion
#region Private variables
private bool _Visible;
private bool _UseColumnHeaderColors = true;
private bool _AllowUserSort = true;
private bool _RemoveGroupOnDoubleClick = true;
private GroupBoxLayout _GroupBoxLayout = GroupBoxLayout.Hierarchical;
private GroupBoxStyle _GroupBoxStyle = GroupBoxStyle.Rectangular;
private List<GridGroupBox> _GroupBoxes;
private GroupBoxEffects _GroupBoxEffects = GroupBoxEffects.NotSet;
private bool _Dragging;
private Image _InsertMarker;
private GridGroupBox _HitGroupBox;
private GridGroupBox _LastHitGroupBox;
private GridGroupBox _MouseDownHitBox;
private HeaderArea _HitArea;
private HeaderArea _LastHitArea;
private GridColumn _HitColumn;
private FloatWindow _GroupBoxWindow;
private GridGroupBox _AfterGroupBox;
private Rectangle _InsertRect;
private FilterPopup _FilterMenu;
private ImageVisibility _FilterImageVisibility = ImageVisibility.NotSet;
private string _WatermarkText;
private int _MaxGroupBoxWidth = 200;
private int _CornerRadius = 5;
#endregion
#region Constructors
///<summary>
/// GridHeader
///</summary>
public GridGroupByRow()
: this(null)
{
}
///<summary>
/// GridHeader
///</summary>
///<param name="text"></param>
public GridGroupByRow(string text)
: base(text)
{
}
#endregion
#region Public properties
#region AllowUserSort
///<summary>
/// Gets or sets whether the user can change the group
/// sort direction by clicking on the associated GroupBox
///</summary>
[DefaultValue(true), Category("Behavior")]
[Description("Indicates whether the user can change the group sort direction by clicking on the associated GroupBox.")]
public bool AllowUserSort
{
get { return (_AllowUserSort); }
set
{
if (_AllowUserSort != value)
{
_AllowUserSort = value;
OnPropertyChanged("AllowUserSort");
}
}
}
#endregion
#region CornerRadius
///<summary>
/// Gets or sets the corner radius to
/// use when GroupBoxStyle is RoundedRectangular
///</summary>
[DefaultValue(5), Category("Behavior")]
[Description("Indicates the corner radius to use when GroupBoxStyle is RoundedRectangular.")]
public int CornerRadius
{
get { return (_CornerRadius); }
set
{
if (_CornerRadius != value)
{
_CornerRadius = value;
OnPropertyChangedEx("CornerRadius", VisualChangeType.Layout);
}
}
}
#endregion
#region FilterImageVisibility
/// <summary>
/// Gets or sets the visibility of the header filter image
/// </summary>
[DefaultValue(ImageVisibility.NotSet), Category("Appearance")]
[Description("Indicates the visibility of the filter image.")]
public ImageVisibility FilterImageVisibility
{
get { return (_FilterImageVisibility); }
set
{
if (_FilterImageVisibility != value)
{
_FilterImageVisibility = value;
OnPropertyChangedEx("FilterImageVisibility", VisualChangeType.Layout);
}
}
}
#endregion
#region GroupBoxEffects
/// <summary>
/// Gets or sets the default for how columns interact with the GroupBox
/// </summary>
[DefaultValue(GroupBoxEffects.NotSet), Category("Grouping")]
[Description("Indicates the default for how columns interact with the GroupBox.")]
public GroupBoxEffects GroupBoxEffects
{
get { return (_GroupBoxEffects); }
set
{
if (_GroupBoxEffects != value)
{
_GroupBoxEffects = value;
OnPropertyChanged("GroupBoxEffects");
}
}
}
#endregion
#region GroupBoxLayout
/// <summary>
/// Gets or sets the group box layout (Flat, Hierarchical)
/// </summary>
[DefaultValue(GroupBoxLayout.Hierarchical), Category("Appearance")]
[Description("Indicates the group box layout (Flat, Hierarchical)")]
public GroupBoxLayout GroupBoxLayout
{
get { return (_GroupBoxLayout); }
set
{
if (_GroupBoxLayout != value)
{
_GroupBoxLayout = value;
OnPropertyChangedEx("GroupBoxLayout", VisualChangeType.Layout);
}
}
}
#endregion
#region GroupBoxStyle
/// <summary>
/// Gets or sets the group box Style (Rectangular, RoundedRect)
/// </summary>
[DefaultValue(GroupBoxStyle.Rectangular), Category("Appearance")]
[Description("Indicates the group box Style (Rectangular, RoundedRect)")]
public GroupBoxStyle GroupBoxStyle
{
get { return (_GroupBoxStyle); }
set
{
if (_GroupBoxStyle != value)
{
_GroupBoxStyle = value;
OnPropertyChangedEx("GroupBoxStyle", VisualChangeType.Layout);
}
}
}
#endregion
#region IsEmpty
/// <summary>
/// Gets whether the item is empty
/// </summary>
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override bool IsEmpty
{
get { return (false); }
}
#endregion
#region MaxGroupBoxWidth
/// <summary>
/// Gets or sets the maximum GroupBox width, in pixels
/// </summary>
[DefaultValue(200), Category("Appearance")]
[Description("Indicates the maximum GroupBox width, in pixels.")]
public int MaxGroupBoxWidth
{
get { return (_MaxGroupBoxWidth); }
set
{
if (_MaxGroupBoxWidth != value)
{
_MaxGroupBoxWidth = value;
OnPropertyChangedEx("MaxGroupBoxWidth", VisualChangeType.Render);
}
}
}
#endregion
#region RemoveGroupOnDoubleClick
///<summary>
/// Gets or sets whether the grouping column is removed
/// when the user double clicks on the associated GroupBox
///</summary>
[DefaultValue(true), Category("Behavior")]
[Description("Indicates whether the grouping column is removed when the user double clicks on the associated GroupBox.")]
public bool RemoveGroupOnDoubleClick
{
get { return (_RemoveGroupOnDoubleClick); }
set
{
if (_RemoveGroupOnDoubleClick != value)
{
_RemoveGroupOnDoubleClick = value;
OnPropertyChanged("RemoveGroupOnDoubleClick");
}
}
}
#endregion
#region Visible
/// <summary>
/// Visible
/// </summary>
[DefaultValue(false), Category("Appearance")]
[Description("Indicates whether the item is visible")]
public override bool Visible
{
get { return (_Visible); }
set
{
if (_Visible != value)
{
_Visible = value;
OnPropertyChangedEx("Visible", VisualChangeType.Layout);
}
}
}
#endregion
#region UseColumnHeaderColors
///<summary>
/// Gets or sets whether Column Header color definitions are used
///</summary>
[DefaultValue(true), Category("Appearance")]
[Description("Indicates whether Column Header color definitions are used")]
public bool UseColumnHeaderColors
{
get { return (_UseColumnHeaderColors); }
set
{
if (_UseColumnHeaderColors != value)
{
_UseColumnHeaderColors = value;
OnPropertyChangedEx("UseColumnHeaderColors", VisualChangeType.Render);
}
}
}
#endregion
#region WatermarkText
/// <summary>
/// Gets or sets the Watermark text to use when no Grouping is active
/// </summary>
[DefaultValue(null), Category("Appearance")]
[Description("Indicates the Watermark text to use when no Grouping is active")]
public string WatermarkText
{
get { return (_WatermarkText); }
set
{
if (_WatermarkText != value)
{
_WatermarkText = value;
OnPropertyChangedEx("WatermarkText", VisualChangeType.Render);
}
}
}
#region GetWatermarkText
private string GetWatermarkText()
{
return (_WatermarkText ?? SuperGrid.GroupByWaterMarkText);
}
#endregion
#endregion
#endregion
#region Private properties
#region InsertMarker
private Image InsertMarker
{
get
{
if (_InsertMarker == null)
_InsertMarker = CreateInsertMarker();
return (_InsertMarker);
}
set
{
if (_InsertMarker != null)
_InsertMarker.Dispose();
_InsertMarker = value;
}
}
#region CreateInsertMarker
private Image CreateInsertMarker()
{
GroupByVisualStyle style = (GroupByVisualStyle)GetEffectiveStyle();
Image image = new Bitmap(MarkerWidth, MarkerHeight);
using (Graphics g = Graphics.FromImage(image))
{
Point[] pts =
{
new Point(0, 0),
new Point(MarkerWidth - 1, 0),
new Point(MarkerHeight - 1, MarkerHeight - 1),
new Point(0, 0),
};
using (GraphicsPath path = new GraphicsPath())
{
path.AddLines(pts);
Rectangle r = new Rectangle(0, 0, MarkerWidth, MarkerHeight);
using (Brush br = style.InsertMarkerBackground.GetBrush(r))
g.FillPath(br, path);
using (Pen pen = new Pen(style.InsertMarkerBorderColor))
g.DrawPath(pen, path);
}
}
return (image);
}
#endregion
#endregion
#endregion
#region MeasureRow
/// <summary>
/// MeasureRow
/// </summary>
/// <param name="layoutInfo"></param>
/// <param name="stateInfo"></param>
/// <param name="constraintSize"></param>
/// <returns></returns>
protected override Size MeasureRow(
GridLayoutInfo layoutInfo, GridLayoutStateInfo stateInfo, Size constraintSize)
{
Size sizeNeeded = base.MeasureRow(layoutInfo, stateInfo, constraintSize);
GridPanel panel = stateInfo.GridPanel;
int height = GetGroupByHeight(panel);
if (RowHeight == 0)
{
int n = Dpi.Height(DefaultMinRowHeight);
if (height < n)
height = n;
}
if (height > sizeNeeded.Height)
sizeNeeded.Height = height;
return (sizeNeeded);
}
#region GetGroupByHeight
private int GetGroupByHeight(GridPanel panel)
{
if (_GroupBoxes == null)
_GroupBoxes = new List<GridGroupBox>();
else
_GroupBoxes.Clear();
GridGroupBox box = new GridGroupBox(this, null);
_GroupBoxes.Add(box);
int rowHeight = (GroupBoxLayout == GroupBoxLayout.Hierarchical)
? GetHierarchicalHeight(panel)
: GetFlatHeight(panel);
rowHeight += Dpi.Height(MarkerVPad * 2);
TextRowVisualStyle tstyle = GetEffectiveStyle();
rowHeight += Dpi.Height(tstyle.BorderThickness.Vertical +
tstyle.Padding.Vertical + tstyle.Margin.Vertical);
return (rowHeight);
}
#region GetHierarchicalHeight
private int GetHierarchicalHeight(GridPanel panel)
{
int rowHeight = 0;
int lastHeight = 0;
foreach (GridColumn column in panel.GroupColumns)
{
GridGroupBox box = new GridGroupBox(this, column);
box.GroupBoxStyle = GroupBoxStyle;
box.CornerRadius = CornerRadius;
_GroupBoxes.Add(box);
Size size = GetGroupBoxSize(box);
if (rowHeight == 0)
{
rowHeight = size.Height;
}
else
{
if (size.Height > lastHeight)
rowHeight += (size.Height - lastHeight / 2);
else
rowHeight += (size.Height / 2);
}
lastHeight = size.Height;
}
return (rowHeight);
}
#endregion
#region GetFlatHeight
private int GetFlatHeight(GridPanel panel)
{
int rowHeight = 0;
foreach (GridColumn column in panel.GroupColumns)
{
GridGroupBox box = new GridGroupBox(this, column);
box.GroupBoxStyle = GroupBoxStyle;
box.CornerRadius = CornerRadius;
_GroupBoxes.Add(box);
Size size = GetGroupBoxSize(box);
if (size.Height > rowHeight)
rowHeight = size.Height;
}
return (rowHeight);
}
#endregion
#region GetGroupBoxSize
private Size GetGroupBoxSize(GridGroupBox box)
{
Size size = new Size();
size.Width = box.Column.HeaderTextSize.Width + Dpi.Width(TextHPad);
size.Height = box.Column.HeaderTextSize.Height + Dpi.Height(TextVPad);
box.ContentSize = size;
SuperGrid.DoConfigureGroupBoxEvent(this, box);
size = box.ContentSize;
size.Width += Dpi.Width(box.Padding.Horizontal);
size.Height += Dpi.Height(box.Padding.Vertical);
int n = Dpi.Width(_MaxGroupBoxWidth);
if (size.Width > n)
size.Width = n;
size.Width += Dpi.Width(MarkerHPad + TextHPad);
if (size.Width < Dpi.Width20)
size.Width = Dpi.Width20;
if (size.Height < Dpi.Height15)
size.Height = Dpi.Height15;
box.RelativeBounds = new Rectangle(Point.Empty, size);
return (size);
}
#endregion
#endregion
#endregion
#region ArrangeRow
/// <summary>
/// ArrangeRow
/// </summary>
/// <param name="layoutInfo"></param>
/// <param name="stateInfo"></param>
/// <param name="layoutBounds"></param>
/// <returns></returns>
protected override Size ArrangeRow(GridLayoutInfo layoutInfo,
GridLayoutStateInfo stateInfo, Rectangle layoutBounds)
{
UpdateGroupBoxes(stateInfo.GridPanel, layoutBounds);
return (base.ArrangeRow(layoutInfo, stateInfo, layoutBounds));
}
#region UpdateGroupBoxes
private void UpdateGroupBoxes(GridPanel panel, Rectangle r)
{
TextRowVisualStyle tstyle = GetEffectiveStyle();
r = GetAdjustedBounds(tstyle, r);
r.Size = Size.Empty;
if (CanShowRowHeader(panel) == true)
r.X += panel.RowHeaderWidthEx;
r.X += Dpi.Width(MarkerWidth - MarkerHPad);
r.Y += Dpi.Height(MarkerVPad - MarkerHeight + TextPad);
GridGroupBox box = _GroupBoxes[0];
box.RelativeBounds = r;
int lastHeight = Dpi.Width(MarkerHeight);
int midline = Bounds.Y + Bounds.Height / 2 - 1;
for (int i = 1; i < _GroupBoxes.Count; i++)
{
box = _GroupBoxes[i];
r.X += (r.Width + Dpi.Width(BoxSpacing));
r.Size = box.RelativeBounds.Size;
if (GroupBoxLayout == GroupBoxLayout.Hierarchical)
{
r.Y += (r.Height > lastHeight)
? lastHeight / 2 : lastHeight - r.Height / 2;
}
else
{
r.Y = midline - (r.Height / 2);
}
UpdateGroupBoxRects(panel, box, ref r);
lastHeight = r.Height;
}
_AfterGroupBox = null;
}
#region UpdateGroupBoxRects
private void UpdateGroupBoxRects(
GridPanel panel, GridGroupBox box, ref Rectangle r)
{
Rectangle t = r;
Rectangle ts = GetSortImageBounds(panel, box.Column, t);
Rectangle tf = GetFilterImageBounds(panel, box.Column, t);
if (ts.Width > 0)
r.Width += (ts.Width + TextPad);
if (tf.Width > 0)
r.Width += (tf.Width + TextPad);
r.Width += 3;
box.RelativeBounds = r;
if (tf.IsEmpty == false && ts.IsEmpty == false)
{
if (ts.X == tf.X)
{
if (tf.X < r.X + r.Width / 2)
tf.X += ts.Width + TextPad;
else
ts.X += tf.Width + TextPad;
}
else
{
if (tf.X < r.X + r.Width / 2)
ts.X = r.Right - (ts.Width + TextPad);
else
tf.X = r.Right - (tf.Width + TextPad);
}
}
else
{
if (ts.Width > 0 && ts.X > r.X + r.Width / 2)
ts.X = r.Right - (ts.Width + TextPad);
if (tf.Width > 0 && tf.X > r.X + r.Width / 2)
tf.X = r.Right - (tf.Width + TextPad);
}
box.FilterImageRelBounds = tf;
box.SortImageRelBounds = ts;
}
#region GetSortImageBounds
private Rectangle GetSortImageBounds(
GridPanel panel, GridColumn column, Rectangle r)
{
if (AllowUserSort == true)
{
Image sortImage = panel.ColumnHeader.GetColumnSortImage(panel, column);
if (sortImage != null)
{
Alignment alignment = (panel.ColumnHeader.SortImageAlignment == Alignment.NotSet)
? Alignment.MiddleLeft : panel.ColumnHeader.SortImageAlignment;
return (GetImageBoundsEx(sortImage, alignment, r));
}
}
return (Rectangle.Empty);
}
#endregion
#region GetFilterImageBounds
private Rectangle GetFilterImageBounds(
GridPanel panel, GridColumn column, Rectangle r)
{
Image filterImage = null;
switch (_FilterImageVisibility)
{
case ImageVisibility.Auto:
case ImageVisibility.Always:
if (column.IsFilteringEnabled == true)
filterImage = panel.ColumnHeader.GetFilterImage(column);
break;
case ImageVisibility.NotSet:
filterImage = panel.ColumnHeader.GetColumnFilterImage(column);
break;
}
if (filterImage != null)
{
Alignment alignment = panel.ColumnHeader.FilterImageAlignment;
if (alignment == Alignment.NotSet)
alignment = Alignment.MiddleLeft;
return (GetImageBoundsEx(filterImage, alignment, r));
}
return (Rectangle.Empty);
}
#endregion
#region GetImageBoundsEx
private Rectangle GetImageBoundsEx(
Image image, Alignment alignment, Rectangle r)
{
Rectangle t = r;
t.Size = image.Size;
t.X += Dpi.Width6;
t.Y += (r.Height - t.Height) / 2;
switch (alignment)
{
case Alignment.TopLeft:
case Alignment.MiddleLeft:
case Alignment.BottomLeft:
break;
default:
t.X = r.Right + Dpi.Width3;
break;
}
return (t);
}
#endregion
#endregion
#endregion
#endregion
#region RenderRow
/// <summary>
/// RenderRow
/// </summary>
/// <param name="renderInfo"></param>
/// <param name="panel"></param>
/// <param name="r"></param>
protected override void RenderRow(
GridRenderInfo renderInfo, GridPanel panel, Rectangle r)
{
base.RenderRow(renderInfo, panel, r);
Graphics g = renderInfo.Graphics;
if (CanShowRowHeader(panel) == true)
{
r.X += panel.RowHeaderWidthEx;
r.Width -= panel.RowHeaderWidthEx;
}
Region oldClip = g.Clip;
try
{
g.SetClip(r, CombineMode.Intersect);
if (_GroupBoxes.Count > 1)
{
GridPanelVisualStyle pstyle = panel.GetEffectiveStyle();
GridGroupBox lastBox = null;
foreach (GridGroupBox box in _GroupBoxes)
{
if (box.Column != null)
{
RenderGroupBox(panel, box, lastBox, g, pstyle);
lastBox = box;
}
}
}
else
{
RenderWaterMarkText(panel, g);
}
}
finally
{
g.Clip = oldClip;
}
if (_InsertRect.IsEmpty == false)
g.DrawImageUnscaled(InsertMarker, _InsertRect);
}
#region RenderGroupBox
private void RenderGroupBox(GridPanel panel,
GridGroupBox box, GridGroupBox lastBox, Graphics g, GridPanelVisualStyle pstyle)
{
StyleType type = GetGroupByStyleType(box);
ColumnHeaderVisualStyle cstyle = panel.ColumnHeader.GetEffectiveStyle(box.Column, type);
GroupByVisualStyle style = GetGroupByEffectiveStyle(box);
Rectangle r = box.Bounds;
if (r.Width > 0 && r.Height > 0)
{
if (SuperGrid.DoPreRenderGroupBoxEvent(g,
this, box, RenderParts.Background, r) == false)
{
int radius = GetCornerRadius(box);
if (radius > 0 && box.GroupBoxStyle == GroupBoxStyle.RoundedRectangular)
RenderRoundedBox(g, style, cstyle, pstyle, lastBox, box, radius);
else
RenderRectBox(g, style, cstyle, pstyle, lastBox, box);
SuperGrid.DoPostRenderGroupBoxEvent(g,
this, box, RenderParts.Background, r);
}
Rectangle t = r;
RenderSortImage(g, panel, box, ref t);
RenderFilterImage(g, panel, box, ref t);
int n = box.Padding.Left + TextHPad;
t.X += n;
t.Width -= n;
if (t.Width - box.ContentSize.Width > 0)
t.Width = box.ContentSize.Width;
if (SuperGrid.DoPreRenderGroupBoxEvent(g,
this, box, RenderParts.Content, t) == false)
{
Rectangle t2 = t;
t.Y += box.Padding.Top;
t.Height = box.Column.HeaderTextSize.Height + 6;
RenderText(g, box.Column, style, cstyle, t);
SuperGrid.DoPostRenderGroupBoxEvent(g,
this, box, RenderParts.Content, t2);
}
}
}
#region GetCornerRadius
internal int GetCornerRadius(GridGroupBox box)
{
int maxRadius = Math.Min(
box.RelativeBounds.Width, box.RelativeBounds.Height) / 2;
int radius = Math.Min(box.CornerRadius, maxRadius);
return (radius > 0 ? radius : 0);
}
#endregion
#region RenderRoundedBox
private void RenderRoundedBox(Graphics g, GroupByVisualStyle style,
ColumnHeaderVisualStyle cstyle, GridPanelVisualStyle pstyle,
GridGroupBox leftBox, GridGroupBox box, int radius)
{
Rectangle r = box.Bounds;
using (GraphicsPath path = GetRoundedPath(r, radius))
{
SmoothingMode sm = g.SmoothingMode;
g.SmoothingMode = SmoothingMode.AntiAlias;
if (_UseColumnHeaderColors == true)
{
using (Brush br = cstyle.Background.GetBrush(r))
g.FillPath(br, path);
using (Pen pen = new Pen(pstyle.HeaderLineColor))
g.DrawPath(pen, path);
}
else
{
using (Brush br = style.GroupBoxBackground.GetBrush(r))
g.FillPath(br, path);
using (Pen pen = new Pen(style.GroupBoxBorderColor))
g.DrawPath(pen, path);
}
if (leftBox != null)
{
Region oldClip = g.Clip;
Region newClip = new Region(Bounds);
newClip.Exclude(path);
g.SetClip(newClip, CombineMode.Intersect);
try
{
if (SuperGrid.DoPreRenderGroupBoxConnectorEvent(g, this, leftBox, box) == false)
{
RenderBoxConnector(g, style, leftBox.Bounds, box.Bounds, true);
SuperGrid.DoPostRenderGroupBoxConnectorEvent(g, this, leftBox, box);
}
}
finally
{
g.Clip = oldClip;
}
}
g.SmoothingMode = sm;
}
}
#region GetRoundedPath
private GraphicsPath GetRoundedPath(Rectangle r, int radius)
{
int diameter = radius << 1;
Rectangle t = r;
t.Size = new Size(diameter, diameter);
GraphicsPath path = new GraphicsPath();
path.AddArc(t, 180, 90);
t.X = r.Right - diameter;
path.AddArc(t, 270, 90);
t.Y = r.Bottom - diameter;
path.AddArc(t, 0, 90);
t.X = r.X;
path.AddArc(t, 90, 90);
path.CloseAllFigures();
return (path);
}
#endregion
#endregion
#region RenderRectBox
private void RenderRectBox(Graphics g, GroupByVisualStyle style,
ColumnHeaderVisualStyle cstyle, GridPanelVisualStyle pstyle,
GridGroupBox leftBox, GridGroupBox box)
{
Rectangle r = box.Bounds;
if (_UseColumnHeaderColors == true)
{
using (Brush br = cstyle.Background.GetBrush(r))
g.FillRectangle(br, r);
using (Pen pen = new Pen(pstyle.HeaderLineColor))
g.DrawRectangle(pen, r);
}
else
{
using (Brush br = style.GroupBoxBackground.GetBrush(r))
g.FillRectangle(br, r);
using (Pen pen = new Pen(style.GroupBoxBorderColor))
g.DrawRectangle(pen, r);
}
if (leftBox != null)
{
if (SuperGrid.DoPreRenderGroupBoxConnectorEvent(g, this, leftBox, box) == false)
{
RenderBoxConnector(g, style, leftBox.Bounds, r, false);
SuperGrid.DoPostRenderGroupBoxConnectorEvent(g, this, leftBox, box);
}
}
}
#endregion
#region RenderBoxConnector
private void RenderBoxConnector(Graphics g,
GroupByVisualStyle style, Rectangle l, Rectangle r, bool extend)
{
using (Pen pen = new Pen(style.GroupBoxConnectorColor))
{
if (GroupBoxLayout == GroupBoxLayout.Hierarchical)
{
Point pt1 = new Point(l.X + l.Width / 2, l.Bottom + 1);
Point pt2 = new Point(pt1.X, l.Bottom + (r.Bottom - l.Bottom) / 2);
Point pt3 = new Point(r.X + (extend ? 10 : -1), pt2.Y);
g.DrawLines(pen, new Point[] { pt1, pt2, pt3 });
}
else
{
Point pt1 = new Point(l.Right + 1, l.Y + l.Height / 2 + 1);
Point pt2 = new Point(r.X - 1, pt1.Y);
g.DrawLine(pen, pt1, pt2);
}
}
}
#endregion
#endregion
#region Render Filter/Sort Image
#region RenderSortImage
private void RenderSortImage(
Graphics g, GridPanel panel, GridGroupBox box, ref Rectangle t)
{
GridColumn column = box.Column;
Rectangle bounds = box.SortImageBounds;
if (bounds.IsEmpty == false)
{
Image sortImage =
panel.ColumnHeader.GetColumnSortImage(panel, column);
RenderImage(g, sortImage, bounds, ref t);
}
}
#endregion
#region RenderFilterImage
private void RenderFilterImage(
Graphics g, GridPanel panel, GridGroupBox box, ref Rectangle t)
{
GridColumn column = box.Column;
Rectangle bounds = box.FilterImageBounds;
if (bounds.IsEmpty == false)
{
if (CanShowFilterImage(panel, box) == true)
{
bool inFilter;
StyleState state = GetFilterImageState(box, out inFilter);
Image filterImage =
panel.ColumnHeader.GetFilterImage(column, state, inFilter);
RenderImage(g, filterImage, bounds, ref t);
}
}
}
#region CanShowFilterImage
private bool CanShowFilterImage(GridPanel panel, GridGroupBox box)
{
switch (_FilterImageVisibility)
{
case ImageVisibility.Auto:
if (box.Column.IsFilteringEnabled == true)
{
if (string.IsNullOrEmpty(box.Column.FilterExpr) == false)
return (true);
return (_Dragging == false && box.IsEqualTo(_HitGroupBox) == true);
}
break;
case ImageVisibility.Always:
if (box.Column.IsFilteringEnabled == true)
return (true);
break;
case ImageVisibility.NotSet:
switch (panel.ColumnHeader.FilterImageVisibility)
{
case ImageVisibility.Always:
return (true);
case ImageVisibility.Never:
return (false);
case ImageVisibility.Auto:
if (string.IsNullOrEmpty(box.Column.FilterExpr) == false)
return (true);
return (_Dragging == false && box.IsEqualTo(_HitGroupBox) == true);
}
break;
}
return (false);
}
#endregion
#region GetFilterImageState
private StyleState GetFilterImageState(GridGroupBox box, out bool inFilter)
{
inFilter = false;
StyleState state = StyleState.Default;
if (box.IsEqualTo(_HitGroupBox) == true)
{
state = StyleState.MouseOver;
if (_HitArea == HeaderArea.InFilterMenu)
inFilter = true;
}
if (string.IsNullOrEmpty(box.Column.FilterExpr) == false)
state |= StyleState.Selected;
return (state);
}
#endregion
#endregion
#region RenderImage
private void RenderImage(Graphics g,
Image image, Rectangle r, ref Rectangle t)
{
if (image != null)
{
g.DrawImageUnscaledAndClipped(image, r);
if (r.X < t.X + t.Width / 2)
{
int n = t.Right - r.Right;
t.X = r.Right;
t.Width = n;
}
else
{
int n = t.Right - r.Left;
t.Width -= n;
}
}
}
#endregion
#endregion
#region RenderText
private void RenderText(Graphics g, GridColumn column,
GroupByVisualStyle style, ColumnHeaderVisualStyle cstyle, Rectangle bounds)
{
string s = column.GetHeaderText();
if (s != null)
{
if (column.HeaderTextMarkup != null)
{
RenderTextMarkup(g, column.HeaderTextMarkup, cstyle, bounds);
}
else
{
if (_UseColumnHeaderColors == true)
{
eTextFormat tf = cstyle.GetTextFormatFlags();
TextDrawing.DrawString(g, s,
cstyle.Font, cstyle.TextColor, bounds, tf);
}
else
{
eTextFormat tf = style.GetTextFormatFlags();
TextDrawing.DrawString(g, s,
cstyle.Font, style.GroupBoxTextColor, bounds, tf);
}
}
}
}
#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 RenderWaterMarkText
private void RenderWaterMarkText(GridPanel panel, Graphics g)
{
if (AllowSelection == true)
{
string s = GetWatermarkText();
if (string.IsNullOrEmpty(s) == false)
{
GroupByVisualStyle style = (GroupByVisualStyle)GetEffectiveStyle();
Rectangle t = GetAdjustedBounds(style, Bounds);
if (CanShowRowHeader(panel) == true)
{
t.X += panel.RowHeaderWidthEx;
t.Width -= panel.RowHeaderWidthEx;
}
TextDrawing.DrawString(g, s, style.WatermarkFont, style.WatermarkTextColor,
t, eTextFormat.VerticalCenter | eTextFormat.Left);
}
}
}
#endregion
#endregion
#region GroupBoxWindowPaint
void GroupBoxWindowPaint(object sender, PaintEventArgs e)
{
GridPanel panel = GridPanel;
GridPanelVisualStyle pstyle = panel.GetEffectiveStyle();
RenderGroupBox(panel,
(GridGroupBox)_GroupBoxWindow.Tag, null, e.Graphics, pstyle);
}
#endregion
#region Mouse support
#region InternalMouseLeave
internal override void InternalMouseLeave(EventArgs e)
{
base.InternalMouseLeave(e);
if (_LockedColumn == false)
_HitGroupBox = null;
}
#endregion
#region InternalMouseMove
internal override void InternalMouseMove(MouseEventArgs e)
{
base.InternalMouseMove(e);
SuperGrid.GridCursor = Cursors.Default;
if (AllowSelection == true)
{
Point pt = e.Location;
_LastHitArea = _HitArea;
_LastHitGroupBox = _HitGroupBox;
_HitGroupBox = GetGroupBoxAt(pt);
_HitArea = GetHitArea(pt);
if (IsMouseDown == true)
{
if (_Dragging == true)
{
DragContinue(pt);
}
else if (_MouseDownHitBox != null)
{
if (Math.Abs(MouseDownPoint.X - pt.X) > 5 ||
Math.Abs(MouseDownPoint.Y - pt.Y) > 5)
{
DragStart(_MouseDownHitBox.Column);
}
}
}
else
{
switch (_HitArea)
{
case HeaderArea.InFilterMenu:
SuperGrid.GridCursor = Cursors.Hand;
break;
default:
SuperGrid.GridCursor = Cursors.Default;
break;
}
}
if (_HitArea != _LastHitArea || _LastHitGroupBox != _HitGroupBox)
{
if (_LastHitGroupBox != null)
InvalidateRender(_LastHitGroupBox.Bounds);
if (_HitGroupBox != null)
{
if ((_LastHitGroupBox != _HitGroupBox) ||
(_HitArea == HeaderArea.InFilterMenu || _LastHitArea == HeaderArea.InFilterMenu))
{
InvalidateRender(_HitGroupBox.Bounds);
}
}
}
}
}
#endregion
#region InternalMouseDown
internal override void InternalMouseDown(MouseEventArgs e)
{
base.InternalMouseDown(e);
if (e.Button == MouseButtons.Left)
{
_MouseDownHitBox = _HitGroupBox;
if (_MouseDownHitBox != null)
{
Capture = true;
if (_HitGroupBox.FilterImageRelBounds.Contains(e.Location) == true)
ProcessFilterHit(_MouseDownHitBox);
else
ProcessContentHit();
InvalidateRender(_MouseDownHitBox.Bounds);
}
}
}
#region ProcessContentHit
private void ProcessContentHit()
{
_Dragging = false;
}
#endregion
#region ProcessFilterHit
private bool _LockedColumn = true;
private void ProcessFilterHit(GridGroupBox box)
{
if (_FilterMenu != null)
_FilterMenu.Dispose();
_LockedColumn = true;
_FilterMenu = new FilterPopup(GridPanel);
_FilterMenu.ActivatePopup(box.Column, box.FilterImageRelBounds, ResetState);
}
#endregion
#region ResetState
internal void ResetState()
{
_HitGroupBox = null;
_LockedColumn = false;
}
#endregion
#endregion
#region InternalMouseUp
internal override void InternalMouseUp(MouseEventArgs e)
{
base.InternalMouseUp(e);
GridPanel panel = GridPanel;
if (_GroupBoxWindow != null)
{
GridGroupBox box = (GridGroupBox)_GroupBoxWindow.Tag;
if (_AfterGroupBox != null)
{
int index = _GroupBoxes.IndexOf(_AfterGroupBox);
if (box.Column.GroupBoxEffectsEx == GroupBoxEffects.Move)
box.Column.Visible = false;
panel.InsertGroup(box.Column, index);
}
else if (box.Column.GroupBoxEffectsEx != GroupBoxEffects.None)
{
if (_HitColumn != null)
{
box.Column.Visible = true;
if (_HitColumn != box.Column)
ReorderColumn(panel, box.Column);
panel.RemoveGroup(box.Column);
panel.NeedsSorted = true;
}
}
DragEnd();
}
else
{
if (_HitGroupBox != null && _HitGroupBox == _MouseDownHitBox)
{
if (_HitArea == HeaderArea.InContent)
{
if (panel.IsSortable == true && _AllowUserSort == true)
{
if ((Control.ModifierKeys & Keys.Control) != Keys.Control)
{
panel.ColumnHeader.SortColumn(panel, _HitGroupBox.Column);
SuperGrid.PostInternalMouseMove();
}
}
}
}
}
if (_MouseDownHitBox != null)
{
InvalidateRender(_MouseDownHitBox.Bounds);
_MouseDownHitBox = null;
}
}
#region ReorderColumn
private void ReorderColumn(GridPanel panel, GridColumn column)
{
GridColumnCollection columns = panel.Columns;
int[] map = columns.DisplayIndexMap;
int curIndex = columns.GetDisplayIndex(column);
int sepIndex = columns.GetDisplayIndex(_HitColumn);
bool isRight = (_InsertRect.X >
_HitColumn.Bounds.X + _HitColumn.Bounds.Width / 2);
if (curIndex > sepIndex && isRight == true && sepIndex < map.Length - 1)
sepIndex++;
else if (curIndex < sepIndex && isRight == false && sepIndex > 0)
sepIndex--;
if (sepIndex != curIndex)
{
if (sepIndex < curIndex)
{
for (int i = curIndex; i > sepIndex; i--)
map[i] = map[i - 1];
}
else
{
for (int i = curIndex; i < sepIndex; i++)
map[i] = map[i + 1];
}
map[sepIndex] = column.ColumnIndex;
for (int i = 0; i < map.Length; i++)
columns[map[i]].DisplayIndex = i;
SuperGrid.UpdateStyleCount();
SuperGrid.PrimaryGrid.InvalidateRender();
SuperGrid.DoColumnMovedEvent(panel, column);
}
}
#endregion
#endregion
#region InternalMouseDoubleClick
internal override void InternalMouseDoubleClick(MouseEventArgs e)
{
base.InternalMouseDoubleClick(e);
if (_RemoveGroupOnDoubleClick == true)
{
GridGroupBox box = _HitGroupBox;
if (box != null && box == _MouseDownHitBox)
{
GridPanel panel = GridPanel;
if (panel.IsSortable == false || _AllowUserSort == false ||
(Control.ModifierKeys & Keys.Control) == Keys.Control)
{
panel.RemoveGroup(box.Column);
panel.NeedsSorted = true;
box.Column.Visible = true;
}
}
}
}
#endregion
#endregion
#region GetHitArea
/// <summary>
/// GetHitArea
/// </summary>
/// <param name="pt"></param>
/// <returns></returns>
public override HeaderArea GetHitArea(Point pt)
{
if (_HitGroupBox != null)
{
if (_HitGroupBox.FilterImageRelBounds.Contains(pt))
return (HeaderArea.InFilterMenu);
return (HeaderArea.InContent);
}
HeaderArea area = base.GetHitArea(pt);
if (area != HeaderArea.InContent)
return (area);
return (HeaderArea.InWhitespace);
}
#endregion
#region GetAdjustedBounds
private Rectangle GetAdjustedBounds(TextRowVisualStyle style, Rectangle r)
{
r.X += (style.BorderThickness.Left + style.Margin.Left + style.Padding.Left);
r.Width -= (style.BorderThickness.Horizontal + style.Margin.Horizontal + style.Padding.Horizontal);
r.Y += (style.BorderThickness.Top + style.Margin.Top + style.Padding.Top);
r.Height -= (style.BorderThickness.Vertical + style.Margin.Vertical + style.Padding.Vertical);
return (r);
}
#endregion
#region GetScrollBounds
internal Rectangle GetScrollBounds(Rectangle r)
{
if (IsVFrozen == false)
r.Y -= VScrollOffset;
r.X -= HScrollOffset;
return (r);
}
#endregion
#region GetGroupBoxAt
///<summary>
/// Gets the GroupBox containing the given point
///</summary>
///<param name="pt"></param>
///<returns>GroupBox, or null</returns>
public GridGroupBox GetGroupBoxAt(Point pt)
{
foreach (GridGroupBox box in _GroupBoxes)
{
if (box.Bounds.Contains(pt) == true)
return (box);
}
return (null);
}
#endregion
#region FindGroupPartition
private GridGroupBox FindGroupPartition(Point pt)
{
for (int i = _GroupBoxes.Count - 1; i >= 0; i--)
{
GridGroupBox box = _GroupBoxes[i];
if (pt.X > box.Bounds.X + box.Bounds.Width / 2)
return (box);
}
return (_GroupBoxes[0]);
}
#endregion
#region Drag support
#region DragStart
internal bool DragStart(GridColumn column)
{
GridPanel panel = GridPanel;
if (panel.VirtualMode == true)
return (false);
if (AllowSelection == true && panel.ColumnHeader.Visible == true &&
column.GroupBoxEffectsEx != GroupBoxEffects.None)
{
Capture = true;
_Dragging = true;
_GroupBoxWindow = new FloatWindow();
_GroupBoxWindow.Opacity = .5;
_GroupBoxWindow.Owner = SuperGrid.FindForm();
_GroupBoxWindow.Paint += GroupBoxWindowPaint;
GridGroupBox box = new GridGroupBox(this, column);
box.GroupBoxStyle = GroupBoxStyle;
box.CornerRadius = CornerRadius;
Size size = GetGroupBoxSize(box);
Rectangle r = new Rectangle(Point.Empty, size);
UpdateGroupBoxRects(GridPanel, box, ref r);
box.RelativeBounds = r;
box.IsDragBox = true;
_GroupBoxWindow.Size = r.Size;
int radius = GetCornerRadius(box);
if (radius > 0 && box.GroupBoxStyle == GroupBoxStyle.RoundedRectangular)
{
using (GraphicsPath path = GetRoundedPath(r, radius))
{
GraphicsPath cpath = (GraphicsPath)path.Clone();
using (Pen pen = new Pen(Color.Black, 2))
cpath.Widen(pen);
Region rgn = new Region(path);
rgn.Union(cpath);
_GroupBoxWindow.Region = rgn;
}
}
_GroupBoxWindow.Tag = box;
return (true);
}
return (false);
}
#endregion
#region DragContinue
private void DragContinue(Point pt)
{
GridGroupBox box = _GroupBoxWindow.Tag as GridGroupBox;
if (box != null)
{
Point ptStart = pt;
Size size = box.RelativeBounds.Size;
size.Width++;
size.Height++;
pt.X -= (size.Width / 2);
pt.Y -= (size.Height / 2);
pt = SuperGrid.PointToScreen(pt);
Rectangle r = new Rectangle(pt, size);
_GroupBoxWindow.Bounds = r;
if (_GroupBoxWindow.Visible == false)
_GroupBoxWindow.Show();
Rectangle t = GetInsertRect(ptStart);
if (t.Equals(_InsertRect) == false)
{
InvalidateRender(_InsertRect);
_InsertRect = t;
InvalidateRender(_InsertRect);
}
}
}
#region GetInsertRect
private Rectangle GetInsertRect(Point pt)
{
_HitColumn = null;
_AfterGroupBox = null;
if (Bounds.Contains(pt) == true)
return (GetGroupBoxInsertRect(pt));
return (GetColumnInsertRect(pt));
}
#region GetColumnInsertRect
private Rectangle GetColumnInsertRect(Point pt)
{
GridPanel panel = GridPanel;
if (panel.Bounds.Contains(pt) == true)
{
if (pt.Y >= Bounds.Bottom && pt.Y < Bounds.Bottom + 50)
{
_HitColumn = GetHitColumn(panel, pt);
if (_HitColumn == null)
_HitColumn = panel.Columns[0];
Rectangle t = Bounds;
Rectangle s = SViewRect;
if (panel.ShowRowHeaders == true &&
RowHeaderVisibility != RowHeaderVisibility.Never)
{
t.X += panel.RowHeaderWidthEx;
}
t.X += Dpi.Width2;
t.Width = s.Right - t.X - Dpi.Width2;
Rectangle r = _HitColumn.Bounds;
if (pt.X > r.X + r.Width / 2)
r.X = r.Right;
r.X -= (MarkerWidth / 2 + 1);
r.Y = t.Bottom - MarkerHeight - 2;
r.Width = MarkerWidth;
r.Height = MarkerHeight;
if (r.X < t.X)
r.X = t.X;
if (r.X > t.Right - MarkerWidth)
r.X = t.Right - MarkerWidth;
return (r);
}
}
return (Rectangle.Empty);
}
#region GetHitColumn
private GridColumn GetHitColumn(GridPanel panel, Point pt)
{
if (panel.Bounds.Contains(pt) == true)
{
if (pt.Y >= Bounds.Bottom && pt.Y < Bounds.Bottom + 50)
{
if (panel.FirstVisibleColumn != null && pt.X < panel.FirstVisibleColumn.Bounds.X)
return (panel.FirstVisibleColumn);
foreach (GridColumn col in panel.Columns)
{
if (col.Visible == true)
{
if (pt.X >= col.Bounds.X && pt.X <= col.Bounds.Right)
return (col);
}
}
return (panel.LastVisibleColumn);
}
}
return (null);
}
#endregion
#endregion
#region GetGroupBoxInsertRect
private Rectangle GetGroupBoxInsertRect(Point pt)
{
Rectangle t = Bounds;
_AfterGroupBox = FindGroupPartition(pt);
pt = new Point(_AfterGroupBox.Bounds.Right, _AfterGroupBox.Bounds.Y);
if (GroupBoxLayout == GroupBoxLayout.Flat)
{
int index = _GroupBoxes.IndexOf(_AfterGroupBox);
if (index + 1 < _GroupBoxes.Count)
{
GridGroupBox beforeBox = _GroupBoxes[index + 1];
if (index == 0 || beforeBox.Bounds.Y < pt.Y)
pt.Y = beforeBox.Bounds.Y;
}
pt.X -= 2;
pt.Y -= 9;
if (pt.Y < t.Y + 6)
pt.Y = t.Y + 6;
}
else
{
pt.X += 2;
pt.Y -= 6;
if (pt.Y < t.Y + 2)
pt.Y = t.Y + 2;
}
pt.X = Math.Max(pt.X, t.X + 2);
if (pt.X + MarkerWidth + 2 > ViewRect.Right)
pt.X = ViewRect.Right - MarkerWidth - 2;
return (new Rectangle(pt.X, pt.Y, MarkerWidth, MarkerHeight));
}
#endregion
#endregion
#endregion
#region DragEnd
private void DragEnd()
{
_Dragging = false;
if (_GroupBoxWindow != null)
{
_GroupBoxWindow.Close();
_GroupBoxWindow = null;
_MouseDownHitBox = null;
InvalidateRender(_InsertRect);
_InsertRect = Rectangle.Empty;
SuperGrid.PostInternalMouseMove();
}
}
#endregion
#endregion
#region CancelCapture
/// <summary>
/// CancelCapture
/// </summary>
public override void CancelCapture()
{
if (CapturedItem == this)
{
Capture = false;
DragEnd();
}
}
#endregion
#region Style support
#region GetNewVisualStyle
/// <summary>
/// GetNewVisualStyle
/// </summary>
/// <returns></returns>
protected override TextRowVisualStyle GetNewVisualStyle()
{
return (new GroupByVisualStyle());
}
#endregion
#region ApplyStyleEx
/// <summary>
/// ApplyStyleEx
/// </summary>
/// <param name="style"></param>
/// <param name="css"></param>
protected override void ApplyStyleEx(TextRowVisualStyle style, StyleType[] css)
{
GroupByVisualStyle gstyle = style as GroupByVisualStyle;
if (gstyle != null)
{
foreach (StyleType cs in css)
{
gstyle.ApplyStyle(SuperGrid.BaseVisualStyles.GroupByStyles[cs]);
gstyle.ApplyStyle(SuperGrid.DefaultVisualStyles.GroupByStyles[cs]);
gstyle.ApplyStyle(GridPanel.DefaultVisualStyles.GroupByStyles[cs]);
}
if (gstyle.GroupBoxBorderColor == Color.Empty)
gstyle.GroupBoxBorderColor = Color.Blue;
if (gstyle.WatermarkTextColor == Color.Empty)
gstyle.WatermarkTextColor = Color.Gray;
if (gstyle.WatermarkFont == null)
gstyle.WatermarkFont = SystemFonts.DefaultFont;
}
InsertMarker = null;
}
#endregion
#region GetGroupByEffectiveStyle
private GroupByVisualStyle GetGroupByEffectiveStyle(GridGroupBox box)
{
return ((GroupByVisualStyle)
GetEffectiveStyle(GetGroupByStyleType(box)));
}
#endregion
#region GetGroupByStyleType
private StyleType GetGroupByStyleType(GridGroupBox box)
{
if (IsMouseDown == true)
{
Point pt = Control.MousePosition;
pt = SuperGrid.PointToClient(pt);
if (box.FilterImageBounds.Contains(pt) == false)
{
if (box.IsDragBox == true || box.IsEqualTo(_MouseDownHitBox))
{
if (box.IsEqualTo(_HitGroupBox) == true)
return (StyleType.SelectedMouseOver);
return (StyleType.Selected);
}
return (StyleType.Default);
}
}
if (box.IsEqualTo(_HitGroupBox) == true)
return (StyleType.MouseOver);
return (StyleType.Default);
}
#endregion
#endregion
}
#region GridGroupBox
///<summary>
/// GroupBox definition
///</summary>
public class GridGroupBox
{
#region Private properties
private GridGroupByRow _GridGroupBy;
private GridColumn _Column;
private Rectangle _RelativeBounds;
private Rectangle _SortImageRelBounds;
private Rectangle _FilterImageRelBounds;
private Padding _Padding = new Padding(0);
private GroupBoxStyle _GroupBoxStyle = GroupBoxStyle.Rectangular;
private bool _IsDragBox;
private Size _ContentSize;
private int _CornerRadius;
#endregion
#region Public properties
#region Bounds
///<summary>
/// Gets the associated Bounds
///</summary>
public Rectangle Bounds
{
get
{
if (_IsDragBox == true)
return (_RelativeBounds);
return (_GridGroupBy.GetScrollBounds(_RelativeBounds));
}
}
#endregion
#region Column
///<summary>
/// Gets the associated GridColumn
///</summary>
public GridColumn Column
{
get { return (_Column); }
internal set { _Column = value; }
}
#endregion
#region ContentSize
///<summary>
/// Gets the associated Content Size
///</summary>
public Size ContentSize
{
get { return (_ContentSize); }
set { _ContentSize = value; }
}
#endregion
#region CornerRadius
///<summary>
/// Gets or sets the corner radius to
/// use when GroupBoxStyle is RoundedRectangular
///</summary>
public int CornerRadius
{
get { return (_CornerRadius); }
set { _CornerRadius = value; }
}
#endregion
#region GridGroupBy
///<summary>
/// Gets the associated GridGroupBy object
///</summary>
public GridGroupByRow GridGroupBy
{
get { return (_GridGroupBy); }
internal set { _GridGroupBy = value; }
}
#endregion
#region GroupBoxStyle
///<summary>
/// GroupBox Style
///</summary>
public GroupBoxStyle GroupBoxStyle
{
get { return (_GroupBoxStyle); }
set { _GroupBoxStyle = value; }
}
#endregion
#region Padding
///<summary>
/// Content padding
///</summary>
public Padding Padding
{
get { return (_Padding); }
set { _Padding = value; }
}
#endregion
#endregion
#region Internal properties
#region FilterImageBounds
internal Rectangle FilterImageBounds
{
get
{
if (_IsDragBox == true || _FilterImageRelBounds.IsEmpty)
return (_FilterImageRelBounds);
return (_GridGroupBy.GetScrollBounds(_FilterImageRelBounds));
}
}
#endregion
#region FilterImageRelBounds
internal Rectangle FilterImageRelBounds
{
get { return (_FilterImageRelBounds); }
set { _FilterImageRelBounds = value; }
}
#endregion
#region IsDragBox
internal bool IsDragBox
{
get { return (_IsDragBox); }
set { _IsDragBox = value; }
}
#endregion
#region RelativeBounds
internal Rectangle RelativeBounds
{
get { return (_RelativeBounds); }
set { _RelativeBounds = value; }
}
#endregion
#region SortImageBounds
internal Rectangle SortImageBounds
{
get
{
if (_IsDragBox == true || _SortImageRelBounds.IsEmpty)
return (_SortImageRelBounds);
return (_GridGroupBy.GetScrollBounds(_SortImageRelBounds));
}
}
#endregion
#region SortImageRelBounds
internal Rectangle SortImageRelBounds
{
get { return (_SortImageRelBounds); }
set { _SortImageRelBounds = value; }
}
#endregion
#endregion
internal GridGroupBox(GridGroupByRow groupBy, GridColumn column)
{
_GridGroupBy = groupBy;
_Column = column;
_GroupBoxStyle = groupBy.GroupBoxStyle;
}
#region IsEqualTo
internal bool IsEqualTo(GridGroupBox box)
{
return (box != null && box.Column == Column);
}
#endregion
}
#endregion
#region enums
#region GroupBoxEffects
///<summary>
/// GroupBoxEffects
///</summary>
public enum GroupBoxEffects
{
///<summary>
/// Not set.
///</summary>
NotSet = -1,
///<summary>
/// The Column will not interact with the GroupBox.
///</summary>
None,
///<summary>
/// The Column presentation will be copied to and
/// from the grid and associated GroupBox.
///</summary>
Copy,
///<summary>
/// The Column presentation will be moved to and
/// from the grid and associated GroupBox.
///</summary>
Move,
}
#endregion
#region GroupBoxLayout
///<summary>
/// GroupBox Layout
///</summary>
public enum GroupBoxLayout
{
///<summary>
/// Group boxes are Flat, all on the same layout row
///</summary>
Flat,
///<summary>
/// Group boxes are oriented Hierarchically
///</summary>
Hierarchical,
}
#endregion
#region GroupBoxStyle
///<summary>
/// GroupBox Style
///</summary>
public enum GroupBoxStyle
{
///<summary>
/// Group boxes are drawn Rectangular
///</summary>
Rectangular,
///<summary>
/// Group boxes are drawn Rounded Rectangular
///</summary>
RoundedRectangular,
}
#endregion
#endregion
}