diff --git a/Terminal.Gui/Views/TableView.cs b/Terminal.Gui/Views/TableView.cs index 141816d96..7b3125fd0 100644 --- a/Terminal.Gui/Views/TableView.cs +++ b/Terminal.Gui/Views/TableView.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; -namespace Terminal.Gui.Views { +namespace Terminal.Gui { /// /// Describes how to render a given column in a including and textual representation of cells (e.g. date formats) @@ -148,23 +148,22 @@ namespace Terminal.Gui.Views { public TableStyle Style { get => style; set {style = value; Update(); } } /// - /// Zero indexed offset for the upper left to display in . + /// Horizontal scroll offset. The index of the first column in to display when when rendering the view. /// /// This property allows very wide tables to be rendered with horizontal scrolling public int ColumnOffset { get => columnOffset; //try to prevent this being set to an out of bounds column - set => columnOffset = Table == null ? 0 : Math.Min (Table.Columns.Count - 1, Math.Max (0, value)); + set => columnOffset = Table == null ? 0 :Math.Max (0,Math.Min (Table.Columns.Count - 1, value)); } /// - /// Zero indexed offset for the to display in on line 2 of the control (first line being headers) + /// Vertical scroll offset. The index of the first row in to display in the first non header line of the control when rendering the view. /// - /// This property allows very wide tables to be rendered with horizontal scrolling public int RowOffset { get => rowOffset; - set => rowOffset = Table == null ? 0 : Math.Min (Table.Rows.Count - 1, Math.Max (0, value)); + set => rowOffset = Table == null ? 0 : Math.Max (0,Math.Min (Table.Rows.Count - 1, value)); } /// @@ -666,7 +665,7 @@ namespace Terminal.Gui.Views { /// Changes will not be immediately visible in the display until you call public void EnsureSelectedCellIsVisible () { - if(Table == null){ + if(Table == null || Table.Columns.Count <= 0){ return; } diff --git a/UICatalog/Scenarios/TableEditor.cs b/UICatalog/Scenarios/TableEditor.cs index 1767e8691..cce0349b1 100644 --- a/UICatalog/Scenarios/TableEditor.cs +++ b/UICatalog/Scenarios/TableEditor.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Data; using Terminal.Gui; -using Terminal.Gui.Views; namespace UICatalog.Scenarios { diff --git a/UnitTests/TableViewTests.cs b/UnitTests/TableViewTests.cs new file mode 100644 index 000000000..c4819d251 --- /dev/null +++ b/UnitTests/TableViewTests.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Terminal.Gui; +using Xunit; + +namespace UnitTests { + public class TableViewTests + { + + [Fact] + public void EnsureValidScrollOffsets_WithNoCells() + { + var tableView = new TableView(); + + Assert.Equal(0,tableView.RowOffset); + Assert.Equal(0,tableView.ColumnOffset); + + // Set empty table + tableView.Table = new DataTable(); + + // Since table has no rows or columns scroll offset should default to 0 + tableView.EnsureValidScrollOffsets(); + Assert.Equal(0,tableView.RowOffset); + Assert.Equal(0,tableView.ColumnOffset); + } + + + + [Fact] + public void EnsureValidScrollOffsets_LoadSmallerTable() + { + var tableView = new TableView(); + tableView.Bounds = new Rect(0,0,25,10); + + Assert.Equal(0,tableView.RowOffset); + Assert.Equal(0,tableView.ColumnOffset); + + // Set big table + tableView.Table = BuildTable(25,50); + + // Scroll down and along + tableView.RowOffset = 20; + tableView.ColumnOffset = 10; + + tableView.EnsureValidScrollOffsets(); + + // The scroll should be valid at the moment + Assert.Equal(20,tableView.RowOffset); + Assert.Equal(10,tableView.ColumnOffset); + + // Set small table + tableView.Table = BuildTable(2,2); + + // Setting a small table should automatically trigger fixing the scroll offsets to ensure valid cells + Assert.Equal(0,tableView.RowOffset); + Assert.Equal(0,tableView.ColumnOffset); + + + // Trying to set invalid indexes should not be possible + tableView.RowOffset = 20; + tableView.ColumnOffset = 10; + + Assert.Equal(1,tableView.RowOffset); + Assert.Equal(1,tableView.ColumnOffset); + } + + /// + /// Builds a simple table of string columns with the requested number of columns and rows + /// + /// + /// + /// + public static DataTable BuildTable(int cols, int rows) + { + var dt = new DataTable(); + + for(int c = 0; c < cols; c++) { + dt.Columns.Add("Col"+c); + } + + for(int r = 0; r < rows; r++) { + var newRow = dt.NewRow(); + + for(int c = 0; c < cols; c++) { + newRow[c] = $"R{r}C{c}"; + } + + dt.Rows.Add(newRow); + } + + return dt; + } + } +} \ No newline at end of file