/// <summary>
/// Paints the Table's Column headers
/// </summary>
/// <param name="e">A PaintEventArgs that contains the event data</param>
protected void OnPaintHeader(PaintEventArgs e)
{
// only bother if we actually get to paint something
if (!this.HeaderRectangle.IntersectsWith(e.ClipRectangle))
{
return;
}
int xPos = this.DisplayRectangle.Left;
bool needDummyHeader = true;
//
PaintHeaderEventArgs phea = new PaintHeaderEventArgs(e.Graphics, e.ClipRectangle);
for (int i = 0; i < this.ColumnModel.Columns.Count; i++)
{
// check that the column isn't hidden
if (this.ColumnModel.Columns[i].Visible)
{
Rectangle colHeaderRect = new Rectangle(xPos, this.BorderWidth, this.ColumnModel.Columns[i].Width, this.HeaderHeight);
// check that the column intersects with the clipping rect
if (e.ClipRectangle.IntersectsWith(colHeaderRect))
{
// move and resize the headerRenderer
this.headerRenderer.Bounds = new Rectangle(xPos, this.BorderWidth, this.ColumnModel.Columns[i].Width, this.HeaderHeight);
// set the clipping area to the header renderers bounds
phea.Graphics.SetClip(Rectangle.Intersect(e.ClipRectangle, this.headerRenderer.Bounds));
// draw the column header
phea.SetColumn(this.ColumnModel.Columns[i]);
phea.SetColumnIndex(i);
phea.SetTable(this);
phea.SetHeaderStyle(this.HeaderStyle);
phea.SetHeaderRect(this.headerRenderer.Bounds);
// let the user get the first crack at painting the header
this.OnBeforePaintHeader(phea);
// only send to the renderer if the user hasn't
// set the handled property
if (!phea.Handled)
{
this.headerRenderer.OnPaintHeader(phea);
}
// let the user have another go
this.OnAfterPaintHeader(phea);
}
// set the next column start position
xPos += this.ColumnModel.Columns[i].Width;
// if the next start poition is past the right edge
// of the clipping rectangle then we don't need to
// draw anymore
if (xPos >= e.ClipRectangle.Right)
{
return;
}
// check is the next column position is past the
// right edge of the table. if it is, get out of
// here as we don't need to draw anymore columns
if (xPos >= this.ClientRectangle.Width)
{
needDummyHeader = false;
break;
}
}
}
if (needDummyHeader)
{
// move and resize the headerRenderer
this.headerRenderer.Bounds = new Rectangle(xPos, this.BorderWidth, this.ClientRectangle.Width - xPos + 2, this.HeaderHeight);
phea.Graphics.SetClip(Rectangle.Intersect(e.ClipRectangle, this.headerRenderer.Bounds));
phea.SetColumn(null);
phea.SetColumnIndex(-1);
phea.SetTable(this);
phea.SetHeaderStyle(this.HeaderStyle);
phea.SetHeaderRect(this.headerRenderer.Bounds);
// let the user get the first crack at painting the header
this.OnBeforePaintHeader(phea);
// only send to the renderer if the user hasn't
// set the handled property
if (!phea.Handled)
{
this.headerRenderer.OnPaintHeader(phea);
}
// let the user have another go
this.OnAfterPaintHeader(phea);
}
}