private void RenderCell(IFastGridCell cell, IntRect rect, Color?selectedTextColor, Color bgColor, FastGridCellAddress cellAddr) { var isHoverCell = !cellAddr.IsEmpty && cellAddr == _mouseOverCell; if (isHoverCell) { _mouseOverCellIsTrimmed = false; CurrentCellActiveRegions.Clear(); CurrentHoverRegion = null; } if (cell == null) { return; } var rectContent = GetContentRect(rect); _drawBuffer.DrawRectangle(rect, GridLineColor); _drawBuffer.FillRectangle(rect.GrowSymmetrical(-1, -1), bgColor); var count = cell.BlockCount; var rightCount = cell.RightAlignBlockCount; var leftCount = count - rightCount; var leftPos = rectContent.Left; var rightPos = rectContent.Right; for (var i = count - 1; i >= count - rightCount; i--) { var block = cell.GetBlock(i); if (block == null) { continue; } if (i < count - 1) { rightPos -= BlockPadding; } var blockWi = RenderBlock(leftPos, rightPos, selectedTextColor, bgColor, rectContent, block, cellAddr, false, isHoverCell); rightPos -= blockWi; } for (var i = 0; i < leftCount && leftPos < rightPos; i++) { var block = cell.GetBlock(i); if (block == null) { continue; } if (i > 0) { leftPos += BlockPadding; } var blockWi = RenderBlock(leftPos, rightPos, selectedTextColor, bgColor, rectContent, block, cellAddr, true, isHoverCell); leftPos += blockWi; } switch (cell.Decoration) { case CellDecoration.StrikeOutHorizontal: _drawBuffer.DrawLine(rect.Left, rect.Top + rect.Height / 2, rect.Right, rect.Top + rect.Height / 2, cell.DecorationColor ?? Colors.Black); break; } if (isHoverCell) { _mouseOverCellIsTrimmed = leftPos > rightPos; } }
private int RenderBlock(int leftPos, int rightPos, Color?selectedTextColor, Color bgColor, IntRect rectContent, IFastGridCellBlock block, FastGridCellAddress cellAddr, bool leftAlign, bool isHoverCell) { var renderBlock = true; if (block.MouseHoverBehaviour == MouseHoverBehaviours.HideWhenMouseOut && !isHoverCell) { renderBlock = false; } int width = 0, top = 0, height = 0; switch (block.BlockType) { case FastGridBlockType.Text: var font = GetFont(block.IsBold, block.IsItalic); var textHeight = font.GetTextHeight(block.TextData); width = font.GetTextWidth(block.TextData, _columnSizes.MaxSize); height = textHeight; top = rectContent.Top + (int)Math.Round(rectContent.Height / 2.0 - textHeight / 2.0); break; case FastGridBlockType.Image: top = rectContent.Top + (int)Math.Round(rectContent.Height / 2.0 - block.ImageHeight / 2.0); height = block.ImageHeight; width = block.ImageWidth; break; } if (renderBlock && block.CommandParameter != null) { var activeRect = new IntRect(new IntPoint(leftAlign ? leftPos : rightPos - width, top), new IntSize(width, height)).GrowSymmetrical(1, 1); var region = new ActiveRegion { CommandParameter = block.CommandParameter, Rect = activeRect, Tooltip = block.ToolTip, }; CurrentCellActiveRegions.Add(region); if (_mouseCursorPoint.HasValue && activeRect.Contains(_mouseCursorPoint.Value)) { _drawBuffer.FillRectangle(activeRect, ActiveRegionHoverFillColor); CurrentHoverRegion = region; } var renderRectangle = true; if (block.MouseHoverBehaviour == MouseHoverBehaviours.HideButtonWhenMouseOut && !isHoverCell) { renderRectangle = false; } if (renderRectangle) { _drawBuffer.DrawRectangle(activeRect, ActiveRegionFrameColor); } } switch (block.BlockType) { case FastGridBlockType.Text: if (renderBlock) { var textOrigin = new IntPoint(leftAlign ? leftPos : rightPos - width, top); var font = GetFont(block.IsBold, block.IsItalic); _drawBuffer.DrawString(textOrigin.X, textOrigin.Y, rectContent, selectedTextColor ?? block.FontColor ?? CellFontColor, UseClearType ? bgColor : (Color?)null, font, block.TextData); } break; case FastGridBlockType.Image: if (renderBlock) { var imgOrigin = new IntPoint(leftAlign ? leftPos : rightPos - block.ImageWidth, top); var image = GetImage(block.ImageSource); _drawBuffer.Blit(new Point(imgOrigin.X, imgOrigin.Y), image.Bitmap, new Rect(0, 0, block.ImageWidth, block.ImageHeight), image.KeyColor, image.BlendMode); } break; } return(width); }