diff --git a/Terminal.Gui/Views/TableView.cs b/Terminal.Gui/Views/TableView.cs index c7ed425d1..23bf89b99 100644 --- a/Terminal.Gui/Views/TableView.cs +++ b/Terminal.Gui/Views/TableView.cs @@ -330,6 +330,15 @@ namespace Terminal.Gui { Driver.AddStr (new string (' ', width)); } + /// + /// Returns the amount of vertical space currently occupied by the header or 0 if it is not visible. + /// + /// + private int GetHeaderHeightIfAny() + { + return ShouldRenderHeaders()? GetHeaderHeight():0; + } + /// /// Returns the amount of vertical space required to display the header /// @@ -589,12 +598,12 @@ namespace Terminal.Gui { break; case Key.PageUp: case Key.PageUp | Key.ShiftMask: - ChangeSelectionByOffset(0,-Frame.Height,keyEvent.Key.HasFlag(Key.ShiftMask)); + ChangeSelectionByOffset(0,-(Bounds.Height - GetHeaderHeightIfAny()),keyEvent.Key.HasFlag(Key.ShiftMask)); Update (); break; case Key.PageDown: case Key.PageDown | Key.ShiftMask: - ChangeSelectionByOffset(0,Frame.Height,keyEvent.Key.HasFlag(Key.ShiftMask)); + ChangeSelectionByOffset(0,Bounds.Height - GetHeaderHeightIfAny(),keyEvent.Key.HasFlag(Key.ShiftMask)); Update (); break; case Key.Home | Key.CtrlMask: @@ -778,8 +787,8 @@ namespace Terminal.Gui { var hit = ScreenToCell(me.OfX,me.OfY); if(hit != null) { - // TODO : if shift is held down extend selection - SetSelection(hit.Value.X,hit.Value.Y,false ); + + SetSelection(hit.Value.X,hit.Value.Y,me.Flags.HasFlag(MouseFlags.ButtonShift)); Update(); } } @@ -808,7 +817,7 @@ namespace Terminal.Gui { var viewPort = CalculateViewport(Bounds); - var headerHeight = ShouldRenderHeaders()? GetHeaderHeight():0; + var headerHeight = GetHeaderHeightIfAny(); var col = viewPort.LastOrDefault(c=>c.X <= clientX); @@ -839,7 +848,7 @@ namespace Terminal.Gui { var viewPort = CalculateViewport(Bounds); - var headerHeight = ShouldRenderHeaders()? GetHeaderHeight():0; + var headerHeight = GetHeaderHeightIfAny(); var colHit = viewPort.FirstOrDefault(c=>c.Column.Ordinal == tableColumn); @@ -916,7 +925,7 @@ namespace Terminal.Gui { } var columnsToRender = CalculateViewport (Bounds).ToArray(); - var headerHeight = ShouldRenderHeaders()? GetHeaderHeight() : 0; + var headerHeight = GetHeaderHeightIfAny(); //if we have scrolled too far to the left if (SelectedColumn < columnsToRender.Min (r => r.Column.Ordinal)) { diff --git a/UnitTests/TableViewTests.cs b/UnitTests/TableViewTests.cs index 9a2d0a791..143397908 100644 --- a/UnitTests/TableViewTests.cs +++ b/UnitTests/TableViewTests.cs @@ -224,6 +224,39 @@ namespace UnitTests { Assert.False(tableView.IsSelected(1,2)); Assert.False(tableView.IsSelected(2,2)); } + + [Fact] + public void PageDown_ExcludesHeaders() + { + + var driver = new FakeDriver (); + Application.Init (driver, new FakeMainLoop (() => FakeConsole.ReadKey (true))); + driver.Init (() => { }); + + + var tableView = new TableView(){ + Table = BuildTable(25,50), + MultiSelect = true, + Bounds = new Rect(0,0,10,5) + }; + + // Header should take up 2 lines + tableView.Style.ShowHorizontalHeaderOverline = false; + tableView.Style.ShowHorizontalHeaderUnderline = true; + tableView.Style.AlwaysShowHeaders = false; + + Assert.Equal(0,tableView.RowOffset); + + tableView.ProcessKey(new KeyEvent(Key.PageDown,new KeyModifiers())); + + // window height is 5 rows 2 are header so page down should give 3 new rows + Assert.Equal(3,tableView.RowOffset); + + // header is no longer visible so page down should give 5 new rows + tableView.ProcessKey(new KeyEvent(Key.PageDown,new KeyModifiers())); + + Assert.Equal(8,tableView.RowOffset); + } /// /// Builds a simple table of string columns with the requested number of columns and rows