diff --git a/Terminal.Gui/Views/ListView.cs b/Terminal.Gui/Views/ListView.cs
index 6997ce5ce..67d0e88c4 100644
--- a/Terminal.Gui/Views/ListView.cs
+++ b/Terminal.Gui/Views/ListView.cs
@@ -430,7 +430,7 @@ namespace Terminal.Gui {
var newItem = KeystrokeNavigator?.GetNextMatchingItem (SelectedItem, (char)kb.KeyValue);
if (newItem is int && newItem != -1) {
SelectedItem = (int)newItem;
- EnsuresVisibilitySelectedItem ();
+ EnsureSelectedItemVisible ();
SetNeedsDisplay ();
return true;
}
@@ -727,7 +727,7 @@ namespace Terminal.Gui {
Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
if (lastSelectedItem == -1) {
- EnsuresVisibilitySelectedItem ();
+ EnsureSelectedItemVisible ();
}
return base.OnEnter (view);
@@ -743,7 +743,10 @@ namespace Terminal.Gui {
return base.OnLeave (view);
}
- void EnsuresVisibilitySelectedItem ()
+ ///
+ /// Ensures the selected item is always visible on the screen.
+ ///
+ public void EnsureSelectedItemVisible ()
{
SuperView?.LayoutSubviews ();
if (selected < top) {
@@ -840,7 +843,7 @@ namespace Terminal.Gui {
if (src == null || src?.Count == 0) {
return 0;
}
-
+
int maxLength = 0;
for (int i = 0; i < src.Count; i++) {
var t = src [i];
@@ -924,7 +927,7 @@ namespace Terminal.Gui {
return i;
}
} else if (t is string s) {
- if (s.ToUpperInvariant ().StartsWith (search.ToUpperInvariant ())) {
+ if (s.StartsWith (search, StringComparison.InvariantCultureIgnoreCase)) {
return i;
}
}
diff --git a/UnitTests/Views/ListViewTests.cs b/UnitTests/Views/ListViewTests.cs
index 171e30286..01e784810 100644
--- a/UnitTests/Views/ListViewTests.cs
+++ b/UnitTests/Views/ListViewTests.cs
@@ -203,7 +203,7 @@ namespace Terminal.Gui.ViewTests {
[Fact]
[AutoInitShutdown]
- public void EnsuresVisibilitySelectedItem_Top ()
+ public void EnsureSelectedItemVisible_Top ()
{
var source = new List () { "First", "Second" };
ListView lv = new ListView (source) { Width = Dim.Fill (), Height = 1 };
@@ -451,5 +451,67 @@ namespace Terminal.Gui.ViewTests {
lv.SetSourceAsync (null);
Assert.NotNull (lv.Source);
}
+
+ [Fact]
+ public void ListWrapper_StartsWith ()
+ {
+ var lw = new ListWrapper (new List { "One", "Two", "Three" });
+
+ Assert.Equal (1, lw.StartsWith ("t"));
+ Assert.Equal (1, lw.StartsWith ("tw"));
+ Assert.Equal (2, lw.StartsWith ("th"));
+ Assert.Equal (1, lw.StartsWith ("T"));
+ Assert.Equal (1, lw.StartsWith ("TW"));
+ Assert.Equal (2, lw.StartsWith ("TH"));
+
+ lw = new ListWrapper (new List { "One", "Two", "Three" });
+
+ Assert.Equal (1, lw.StartsWith ("t"));
+ Assert.Equal (1, lw.StartsWith ("tw"));
+ Assert.Equal (2, lw.StartsWith ("th"));
+ Assert.Equal (1, lw.StartsWith ("T"));
+ Assert.Equal (1, lw.StartsWith ("TW"));
+ Assert.Equal (2, lw.StartsWith ("TH"));
+ }
+
+ [Fact, AutoInitShutdown]
+ public void EnsureSelectedItemVisible_SelectedItem ()
+ {
+ var source = new List ();
+ for (int i = 0; i < 10; i++) {
+ source.Add ($"Item {i}");
+ }
+ var lv = new ListView (source) {
+ Width = 10,
+ Height = 5
+ };
+ Application.Top.Add (lv);
+ Application.Begin (Application.Top);
+
+ TestHelpers.AssertDriverContentsWithFrameAre (@"
+Item 0
+Item 1
+Item 2
+Item 3
+Item 4", output);
+
+ lv.SelectedItem = 6;
+ Application.Refresh ();
+ TestHelpers.AssertDriverContentsWithFrameAre (@"
+Item 0
+Item 1
+Item 2
+Item 3
+Item 4", output);
+
+ lv.EnsureSelectedItemVisible ();
+ Application.Refresh ();
+ TestHelpers.AssertDriverContentsWithFrameAre (@"
+Item 2
+Item 3
+Item 4
+Item 5
+Item 6", output);
+ }
}
}