public virtual void RenderFooter(StringBuilderInterlaced stream, IList <ConsoleGridColumn> columnHeader)
 {
     stream.Append(LowerLeftBound);
     DrawHorizontalLineEx(stream, columnHeader, '┴');
     stream.Append(LowerRightBound);
     //DrawHorizontalLine(stream, LowerLeftBound, LowerRightBound);
 }
        public virtual void RenderNextProperty(StringBuilderInterlaced stream, string propertyValue,
                                               IColumnInfo columnData,
                                               object item,
                                               int elementNr, int columnNr, bool isSelected, bool focused)
        {
            //if (columnNr != 0)
            //{
            //	stream.Append(VerticalLineSeperator);
            //	if (DrawSpace)
            //	{
            //		stream.Append(" ");
            //	}
            //}
            if (focused)
            {
                stream.Append(propertyValue, FocusedItemForgroundStyle, FocusedItemBackgroundStyle);
            }
            else if (isSelected)
            {
                stream.Append(propertyValue, SelectedItemForgroundStyle, SelectedItemBackgroundStyle);
            }
            else
            {
                var columnOverwrite =
                    ColumnStyles.FirstOrDefault(e => e.Key.Equals(columnData.ColumnElementInfo.Name.Trim()));

                var targetForeground = columnOverwrite.Value?.ConsoleCellStyle?.GetCellForegroundColor(item);
                var targetBackground = columnOverwrite.Value?.ConsoleCellStyle?.GetCellBackgroundColor(item);

                if (elementNr % 2 != 0)
                {
                    stream.Append(propertyValue, targetForeground ?? AlternatingTextStyle,
                                  targetBackground ?? AlternatingTextBackgroundStyle);
                }
                else
                {
                    stream.Append(propertyValue, targetForeground, targetBackground);
                }
            }

            if (DrawSpace)
            {
                stream.Append(" ");
            }
        }
        public virtual void BeginRenderProperty(StringBuilderInterlaced stream, int elementNr, int maxElements,
                                                bool isSelected, bool focused)
        {
            if (isSelected)
            {
                stream.Append('x');
            }
            else if (focused)
            {
                stream.Append('>');
            }
            else
            {
                stream.Append(VerticalLineSeperator);
            }

            if (DrawSpace)
            {
                stream.Append(" ");
            }
        }
        public virtual void RenderOnBottom(StringBuilderInterlaced stream, string value)
        {
            var rowsOfValue = value.Split(new[] { Environment.NewLine }, StringSplitOptions.None);

            foreach (var s in rowsOfValue)
            {
                if (string.IsNullOrWhiteSpace(s))
                {
                    continue;
                }

                for (var i = 0; i < Math.Max(1, s.Length / _width); i++)
                {
                    var line  = s.Take(_width - 1).Select(e => e.ToString()).Aggregate((e, f) => e + f);
                    var toEnd = _width - line.Length - 1;

                    stream.Append(VerticalLineSeperator);
                    if (DrawSpace)
                    {
                        stream.Append(" ");
                    }

                    stream.Append(line);

                    for (var f = 0; f < toEnd; f++)
                    {
                        stream.Append(" ");
                    }

                    if (DrawSpace)
                    {
                        stream.Append(" ");
                    }

                    stream.AppendLine(VerticalLineSeperator.ToString());
                }
            }

            DrawHorizontalLine(stream, LowerLeftBound, LowerRightBound, DrawSpace, HorizontalLineSeperator, _width);
        }
        protected virtual void DrawHorizontalLineEx(StringBuilderInterlaced stream,
                                                    IList <ConsoleGridColumn> headerInfos, char midChar)
        {
            var localCounter  = 0;
            var elemntCounter = 0;

            if (DrawSpace)
            {
                stream.Append(" ");
            }

            for (var i = 0; i < _width - 1; i++)
            {
                var targetChar = HorizontalLineSeperator;

                if (headerInfos.Count - 1 > elemntCounter)
                {
                    var element = headerInfos[elemntCounter];

                    var lengthWithExt = element.Name.Length;
                    if (localCounter >= lengthWithExt)
                    {
                        elemntCounter++;
                        targetChar   = midChar;
                        localCounter = 0;
                    }
                    else
                    {
                        localCounter++;
                    }
                }

                stream.Append(targetChar);
            }

            if (DrawSpace)
            {
                stream.Append(" ");
            }
        }
        protected virtual void DrawHorizontalLine(StringBuilderInterlaced stream, char start, char end, bool drawSpace,
                                                  char seperator, int width)
        {
            stream.Append(start);

            if (drawSpace)
            {
                stream.Append(" ");
            }

            for (var i = 0; i < width - 1; i++)
            {
                stream.Append(seperator);
            }

            if (drawSpace)
            {
                stream.Append(" ");
            }

            stream.Append(end);
        }
        public virtual int RenderHeader(StringBuilderInterlaced stream, IList <ConsoleGridColumn> columnHeader)
        {
            _width = columnHeader.Sum(s => s.Name.Length) + columnHeader.Count;
            if (DrawSpace)
            {
                _width += columnHeader.Count * 2;
                _width -= 2;
            }

            stream.Append(UpperLeftBound);

            if (DrawSpace)
            {
                stream.Append(" ");
            }

            DrawHorizontalLineEx(stream, columnHeader, '┬');

            if (DrawSpace)
            {
                stream.Append(" ");
            }

            stream.Append(UpperRightBound);
            stream.AppendLine();

            var maxRows = columnHeader.Max(f => f.AlignedProperty.Rows);

            for (var i = 0; i < maxRows; i++)
            {
                stream.Append(VerticalLineSeperator);

                if (DrawSpace)
                {
                    stream.Append(" ");
                }

                for (var index = 0; index < columnHeader.Count; index++)
                {
                    var propName = columnHeader[index];
                    if (DrawSpace && index != 0)
                    {
                        stream.Append(" ");
                    }

                    var columnOverwrite = ColumnStyles.FirstOrDefault(e => e.Key.Equals(propName.Name));
                    stream.Append(propName.Name, columnOverwrite.Value?.ForegroundColorStyle,
                                  columnOverwrite.Value?.BackgroundColorStyle);

                    if (DrawSpace)
                    {
                        stream.Append(" ");
                    }

                    if (index + 1 < columnHeader.Count)
                    {
                        stream.Append(VerticalLineSeperator);
                    }
                }

                stream.Append(VerticalLineSeperator);
                stream.AppendLine();
            }

            stream.Append('├');
            DrawHorizontalLineEx(stream, columnHeader, '┼');
            stream.Append('┤');

            //DrawHorizontalLine(stream, '├', '┤');
            return(_width);
        }
 public virtual void EndRenderProperty(StringBuilderInterlaced stream, int elementNr, bool isSelected,
                                       bool focused)
 {
     stream.Append(VerticalLineSeperator);
 }