using System; using System.Collections.Generic; using System.Linq; namespace ZeroLevel.Services.PlainTextTables { public class TextTableData { #region Classes internal class TextTableCell { private readonly string _text; private readonly TextTableColumn _parent_column; public string Text { get { return _text; } } public TextTableCell(TextTableColumn column, string text) { this._parent_column = column; this._text = text; column.UpdateWidth(this); } } internal class TextTableRow { private readonly TextTableCell[] _cells; public TextTableCell[] Cells { get { return _cells; } } public TextTableRow(TextTableCell[] cells) { this._cells = cells; } } internal class TextTableColumn { private int _width; public int Width { get { return _width; } } public TextTableColumn(string title) { this._width = title.Length; } public void UpdateWidth(TextTableCell cell) { if (cell.Text!=null && cell.Text.Length > _width) { _width = cell.Text.Length; } } } #endregion #region Fields private readonly TextTableColumn[] _columns; private readonly List _rows; #endregion #region Ctor public TextTableData(int column_count) { _columns = new TextTableColumn[column_count]; _rows = new List(); } #endregion #region Properties internal TextTableColumn[] Columns { get { return _columns; } } internal IEnumerable Rows { get { return _rows; } } #endregion #region API /// /// Setting column headers /// public void SetColumnsHeaders(string[] headers) { if (headers == null) { throw new ArgumentNullException(nameof(headers)); } if (headers.Length != _columns.Length) { throw new InvalidOperationException($"The number of columns ({headers.Length}) does not correspond to the expected ({_columns.Length})"); } for (int i = 0; i < _columns.Length; i++) { _columns[i] = new TextTableColumn(headers[i]); } _rows.Insert(0, new TextTableRow(headers.Select((h, i) => new TextTableCell(_columns[i], h)).ToArray())); } /// /// Adding a value row /// public void AppendRow(string[] cells) { if (cells == null) { throw new ArgumentNullException(nameof(cells)); } if (cells.Length != _columns.Length) { throw new InvalidOperationException($"The number of cells ({cells.Length}) does not correspond to the expected ({_columns.Length})"); } _rows.Add(new TextTableRow(cells.Select((c, i) => new TextTableCell(_columns[i], c)).ToArray())); } #endregion } }