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