private void PaintInternal(ConsoleBitmap context)
{
if (this.Height < 5)
{
context.DrawString("Grid can't render in a space this small", 0, 0);
return;
}
if (VisibleColumns.Count == 0)
{
context.DrawString(NoVisibleColumnsMessage.ToConsoleString(Application.Theme.H1Color), 0, 0);
return;
}
List<ConsoleString> headers = new List<ConsoleString>();
List<List<ConsoleString>> rows = new List<List<ConsoleString>>();
List<ColumnOverflowBehavior> overflowBehaviors = new List<ColumnOverflowBehavior>();
if (VisibleColumns.Where(c => c.WidthPercentage != 0).Count() == 0)
{
foreach (var col in VisibleColumns)
{
col.WidthPercentage = 1.0 / VisibleColumns.Count;
}
}
foreach (var header in VisibleColumns)
{
headers.Add(header.ColumnDisplayName);
var colWidth = (int)(header.WidthPercentage * this.Width);
if (header.OverflowBehavior is SmartWrapOverflowBehavior)
{
(header.OverflowBehavior as SmartWrapOverflowBehavior).MaxWidthBeforeWrapping = colWidth;
}
else if (header.OverflowBehavior is TruncateOverflowBehavior)
{
(header.OverflowBehavior as TruncateOverflowBehavior).ColumnWidth = colWidth;
}
overflowBehaviors.Add(header.OverflowBehavior);
}
int viewIndex = visibleRowOffset;
foreach (var item in DataView.Items)
{
List<ConsoleString> row = new List<ConsoleString>();
int columnIndex = 0;
foreach (var col in VisibleColumns)
{
var value = PropertyResolver(item, col.ColumnName.ToString());
var displayValue = value == null ? "<null>".ToConsoleString() : (value is ConsoleString ? (ConsoleString)value : value.ToString().ToConsoleString());
if (viewIndex == SelectedIndex)
{
if (this.SelectionMode == GridSelectionMode.Row || (this.SelectionMode == GridSelectionMode.Cell && columnIndex == selectedColumnIndex))
{
displayValue = new ConsoleString(displayValue.ToString(), this.Background, HasFocus ? Application.Theme.FocusColor : Application.Theme.SelectedUnfocusedColor);
}
}
row.Add(displayValue);
columnIndex++;
}
viewIndex++;
rows.Add(row);
}
ConsoleTableBuilder builder = new ConsoleTableBuilder();
ConsoleString table;
#if PROFILING
using (new TimeProfiler("Grid.FormatAsTable"))
{
#endif
table = builder.FormatAsTable(headers, rows, RowPrefix.ToString(), overflowBehaviors, Gutter);
#if PROFILING
}
#endif
if (FilterText != null)
{
table = table.Highlight(FilterText, Application.Theme.HighlightContrastColor, Application.Theme.HighlightColor, StringComparison.InvariantCultureIgnoreCase);
}
if (DataView.IsViewComplete == false)
{
table += "Loading more rows...".ToConsoleString(Application.Theme.H1Color);
}
else if (DataView.IsViewEndOfData && DataView.Items.Count == 0)
{
table += NoDataMessage.ToConsoleString(Application.Theme.H1Color);
}
else if (DataView.IsViewEndOfData)
{
table += EndOfDataMessage.ToConsoleString(Application.Theme.H1Color);
}
else
{
table += "more data below".ToConsoleString(Application.Theme.H1Color);
}
context.DrawString(table, 0, 0);
if (FilteringEnabled)
{
}
}