diff --git a/Terminal.Gui/Views/TabView/TabRowView.cs b/Terminal.Gui/Views/TabView/TabRow.cs similarity index 97% rename from Terminal.Gui/Views/TabView/TabRowView.cs rename to Terminal.Gui/Views/TabView/TabRow.cs index b1ec596ecc..2ca80a69ae 100644 --- a/Terminal.Gui/Views/TabView/TabRowView.cs +++ b/Terminal.Gui/Views/TabView/TabRow.cs @@ -1,18 +1,19 @@ #nullable enable namespace Terminal.Gui; -internal class TabRowView : View +internal class TabRow : View { private readonly TabView _host; private readonly View _leftScrollIndicator; private readonly View _rightScrollIndicator; - public TabRowView (TabView host) + public TabRow (TabView host) { _host = host; - Id = "tabRowView"; + Id = "tabRow"; CanFocus = true; + TabStop = TabBehavior.TabGroup; Width = Dim.Fill (); _rightScrollIndicator = new View @@ -59,25 +60,25 @@ protected override bool OnMouseEvent (MouseEventArgs me) } } - if (!me.IsSingleDoubleOrTripleClicked) + if (me.IsWheel && !HasFocus && CanFocus) { - return false; + SetFocus (); } - if (!HasFocus && CanFocus) + if (me is { IsSingleDoubleOrTripleClicked: false, IsWheel: false }) { - SetFocus (); + return false; } - if (me.IsSingleDoubleOrTripleClicked) + if (me.IsSingleDoubleOrTripleClicked || me.IsWheel) { var scrollIndicatorHit = 0; - if (me.View is { Id: "rightScrollIndicator" }) + if (me.View is { Id: "rightScrollIndicator" } || me.Flags.HasFlag (MouseFlags.WheeledDown) || me.Flags.HasFlag (MouseFlags.WheeledRight)) { scrollIndicatorHit = 1; } - else if (me.View is { Id: "leftScrollIndicator" }) + else if (me.View is { Id: "leftScrollIndicator" } || me.Flags.HasFlag (MouseFlags.WheeledUp) || me.Flags.HasFlag (MouseFlags.WheeledLeft)) { scrollIndicatorHit = -1; } diff --git a/Terminal.Gui/Views/TabView/TabView.cs b/Terminal.Gui/Views/TabView/TabView.cs index 7916911fcd..73f286b564 100644 --- a/Terminal.Gui/Views/TabView/TabView.cs +++ b/Terminal.Gui/Views/TabView/TabView.cs @@ -16,7 +16,7 @@ public class TabView : View private readonly List _tabs = new (); /// This sub view is the 2 or 3 line control that represents the actual tabs themselves. - private readonly TabRowView _tabsBar; + private readonly TabRow _tabsBar; private Tab? _selectedTab; @@ -28,7 +28,7 @@ public TabView () { CanFocus = true; TabStop = TabBehavior.TabStop; // Because TabView has focusable subviews, it must be a TabGroup - _tabsBar = new TabRowView (this); + _tabsBar = new TabRow (this); _containerView = new (); ApplyStyleChanges (); @@ -518,6 +518,10 @@ internal IEnumerable CalculateViewport (Rectangle bounds) { SelectedTab?.SetFocus (); } + else + { + SelectedTab?.View?.SetFocus (); + } } /// diff --git a/UnitTests/Views/TabViewTests.cs b/UnitTests/Views/TabViewTests.cs index 15896267ea..ac12a55564 100644 --- a/UnitTests/Views/TabViewTests.cs +++ b/UnitTests/Views/TabViewTests.cs @@ -19,16 +19,12 @@ public void AddTab_SameTabMoreThanOnce () tv.AddTab (tab1, false); Assert.Equal (2, tv.Tabs.Count); - - // Shutdown must be called to safely clean up Application if Init has been called - Application.Shutdown (); } [Fact] + [SetupFakeDriver] public void AddTwoTabs_SecondIsSelected () { - InitFakeDriver (); - var tv = new TabView (); Tab tab1; Tab tab2; @@ -37,8 +33,6 @@ public void AddTwoTabs_SecondIsSelected () Assert.Equal (2, tv.Tabs.Count); Assert.Equal (tab2, tv.SelectedTab); - - Application.Shutdown (); } [Fact] @@ -57,9 +51,6 @@ public void EnsureSelectedTabVisible_MustScroll () // Asking to show tab2 should automatically move scroll offset accordingly tv.SelectedTab = tab2; Assert.Equal (1, tv.TabScrollOffset); - - // Shutdown must be called to safely clean up Application if Init has been called - Application.Shutdown (); } [Fact] @@ -76,8 +67,6 @@ public void EnsureSelectedTabVisible_NullSelect () Assert.Null (tv.SelectedTab); Assert.Equal (0, tv.TabScrollOffset); - - Application.Shutdown (); } [Fact] @@ -98,16 +87,13 @@ public void EnsureValidScrollOffsets_TabScrollOffset () tv.TabScrollOffset = -1; tv.SelectedTab = tab1; Assert.Equal (0, tv.TabScrollOffset); - - // Shutdown must be called to safely clean up Application if Init has been called - Application.Shutdown (); } [Fact] [AutoInitShutdown] public void MouseClick_ChangesTab () { - TabView tv = GetTabView (out Tab tab1, out Tab tab2, false); + TabView tv = GetTabView (out Tab tab1, out Tab tab2); tv.Width = 20; tv.Height = 5; @@ -115,7 +101,7 @@ public void MouseClick_ChangesTab () tv.Draw (); View tabRow = tv.Subviews [0]; - Assert.Equal ("TabRowView", tabRow.GetType ().Name); + Assert.Equal ("TabRow", tabRow.GetType ().Name); TestHelpers.AssertDriverContentsAre ( @" @@ -190,7 +176,7 @@ public void MouseClick_ChangesTab () [AutoInitShutdown] public void MouseClick_Right_Left_Arrows_ChangesTab () { - TabView tv = GetTabView (out Tab tab1, out Tab tab2, false); + TabView tv = GetTabView (out Tab tab1, out Tab tab2); tv.Width = 7; tv.Height = 5; @@ -198,7 +184,7 @@ public void MouseClick_Right_Left_Arrows_ChangesTab () tv.Draw (); View tabRow = tv.Subviews [0]; - Assert.Equal ("TabRowView", tabRow.GetType ().Name); + Assert.Equal ("TabRow", tabRow.GetType ().Name); TestHelpers.AssertDriverContentsAre ( @" @@ -274,7 +260,7 @@ public void MouseClick_Right_Left_Arrows_ChangesTab () [AutoInitShutdown] public void MouseClick_Right_Left_Arrows_ChangesTab_With_Border () { - TabView tv = GetTabView (out Tab tab1, out Tab tab2, false); + TabView tv = GetTabView (out Tab tab1, out Tab tab2); tv.Width = 9; tv.Height = 7; @@ -286,7 +272,7 @@ public void MouseClick_Right_Left_Arrows_ChangesTab_With_Border () tv.Draw (); View tabRow = tv.Subviews [0]; - Assert.Equal ("TabRowView", tabRow.GetType ().Name); + Assert.Equal ("TabRow", tabRow.GetType ().Name); TestHelpers.AssertDriverContentsAre ( @" @@ -366,9 +352,9 @@ public void MouseClick_Right_Left_Arrows_ChangesTab_With_Border () [Fact] [AutoInitShutdown] - public void ProcessKey_Down_Up_Right_Left_Home_End_PageDown_PageUp () + public void ProcessKey_Down_Up_Right_Left_Home_End_PageDown_PageUp_F6 () { - TabView tv = GetTabView (out Tab tab1, out Tab tab2, false); + TabView tv = GetTabView (out Tab tab1, out Tab tab2); tv.Width = 7; tv.Height = 5; @@ -393,7 +379,7 @@ public void ProcessKey_Down_Up_Right_Left_Home_End_PageDown_PageUp () Assert.Equal (tv.SelectedTab.View, top.Focused.MostFocused); // Press the cursor up key to focus the selected tab - Application.RaiseKeyDownEvent (Key.CursorUp); + Assert.True (Application.RaiseKeyDownEvent (Key.CursorUp)); Application.LayoutAndDraw (); // Is the selected tab focused @@ -411,7 +397,7 @@ public void ProcessKey_Down_Up_Right_Left_Home_End_PageDown_PageUp () }; // Press the cursor right key to select the next tab - Application.RaiseKeyDownEvent (Key.CursorRight); + Assert.True (Application.RaiseKeyDownEvent (Key.CursorRight)); Application.LayoutAndDraw (); Assert.Equal (tab1, oldChanged); Assert.Equal (tab2, newChanged); @@ -420,7 +406,7 @@ public void ProcessKey_Down_Up_Right_Left_Home_End_PageDown_PageUp () Assert.Equal (tv.MostFocused, top.Focused.MostFocused); // Press the cursor down key. Since the selected tab has no focusable views, the focus should move to the next view in the toplevel - Application.RaiseKeyDownEvent (Key.CursorDown); + Assert.True (Application.RaiseKeyDownEvent (Key.CursorDown)); Assert.Equal (tab2, tv.SelectedTab); Assert.Equal (btn, top.MostFocused); @@ -436,40 +422,55 @@ public void ProcessKey_Down_Up_Right_Left_Home_End_PageDown_PageUp () Assert.False (tv.SelectedTab.View.CanFocus); // Press cursor up. Should focus the subview in the selected tab. - Application.RaiseKeyDownEvent (Key.CursorUp); + Assert.True (Application.RaiseKeyDownEvent (Key.CursorUp)); Assert.Equal (tab2, tv.SelectedTab); Assert.NotEqual (btnSubView, top.MostFocused); Assert.Equal (tab2, top.MostFocused); tv.SelectedTab.View.CanFocus = true; - Application.RaiseKeyDownEvent (Key.CursorDown); + Assert.True (Application.RaiseKeyDownEvent (Key.CursorDown)); Assert.Equal (tab2, tv.SelectedTab); Assert.Equal (btnSubView, top.MostFocused); - Application.RaiseKeyDownEvent (Key.CursorUp); + Assert.True (Application.RaiseKeyDownEvent (Key.CursorUp)); + // TabRow now has TabGroup which only F6 is allowed + Assert.NotEqual (tab2, top.MostFocused); + Assert.Equal (btn, top.MostFocused); + + Assert.True (Application.RaiseKeyDownEvent (Key.CursorUp)); + Assert.Equal (btnSubView, top.MostFocused); + + Assert.True (Application.RaiseKeyDownEvent (Key.F6)); Assert.Equal (tab2, top.MostFocused); // Press the cursor down key twice. - Application.RaiseKeyDownEvent (Key.CursorDown); - Application.RaiseKeyDownEvent (Key.CursorDown); + Assert.True (Application.RaiseKeyDownEvent (Key.CursorDown)); + Assert.True (Application.RaiseKeyDownEvent (Key.CursorDown)); Assert.Equal (btn, top.MostFocused); // Press the cursor down key again will focus next view in the toplevel, which is the TabView - Application.RaiseKeyDownEvent (Key.CursorDown); + Assert.True (Application.RaiseKeyDownEvent (Key.CursorDown)); Assert.Equal (tab2, tv.SelectedTab); Assert.Equal (tv, top.Focused); // Due to the RestoreFocus method prioritize the _previouslyFocused, so btnSubView will be focused again Assert.Equal (btnSubView, tv.MostFocused); // Press the cursor up key to focus the selected tab which it's the only way to do that - Application.RaiseKeyDownEvent (Key.CursorUp); + Assert.True (Application.RaiseKeyDownEvent (Key.CursorUp)); Assert.Equal (tab2, tv.SelectedTab); + Assert.Equal (btn, top.Focused); + + Assert.True (Application.RaiseKeyDownEvent (Key.CursorUp)); + Assert.Equal (tv, top.Focused); + Assert.Equal (btnSubView, top.MostFocused); + + Assert.True (Application.RaiseKeyDownEvent (Key.F6)); Assert.Equal (tv, top.Focused); Assert.Equal (tab2, top.Focused.MostFocused); Assert.Equal (tv.MostFocused, top.Focused.MostFocused); // Press the cursor left key to select the previous tab - Application.RaiseKeyDownEvent (Key.CursorLeft); + Assert.True (Application.RaiseKeyDownEvent (Key.CursorLeft)); Application.LayoutAndDraw (); Assert.Equal (tab2, oldChanged); Assert.Equal (tab1, newChanged); @@ -479,7 +480,7 @@ public void ProcessKey_Down_Up_Right_Left_Home_End_PageDown_PageUp () Assert.Equal (tab1, top.Focused.MostFocused); // Press the end key to select the last tab - Application.RaiseKeyDownEvent (Key.End); + Assert.True (Application.RaiseKeyDownEvent (Key.End)); Application.LayoutAndDraw (); Assert.Equal (tab1, oldChanged); Assert.Equal (tab2, newChanged); @@ -488,7 +489,7 @@ public void ProcessKey_Down_Up_Right_Left_Home_End_PageDown_PageUp () Assert.Equal (tv.MostFocused, top.Focused.MostFocused); // Press the home key to select the first tab - Application.RaiseKeyDownEvent (Key.Home); + Assert.True (Application.RaiseKeyDownEvent (Key.Home)); Application.LayoutAndDraw (); Assert.Equal (tab2, oldChanged); Assert.Equal (tab1, newChanged); @@ -497,7 +498,7 @@ public void ProcessKey_Down_Up_Right_Left_Home_End_PageDown_PageUp () Assert.Equal (tv.MostFocused, top.Focused.MostFocused); // Press the page down key to select the next set of tabs - Application.RaiseKeyDownEvent (Key.PageDown); + Assert.True (Application.RaiseKeyDownEvent (Key.PageDown)); Application.LayoutAndDraw (); Assert.Equal (tab1, oldChanged); Assert.Equal (tab2, newChanged); @@ -506,7 +507,7 @@ public void ProcessKey_Down_Up_Right_Left_Home_End_PageDown_PageUp () Assert.Equal (tv.MostFocused, top.Focused.MostFocused); // Press the page up key to select the previous set of tabs - Application.RaiseKeyDownEvent (Key.PageUp); + Assert.True (Application.RaiseKeyDownEvent (Key.PageUp)); Application.LayoutAndDraw (); Assert.Equal (tab2, oldChanged); Assert.Equal (tab1, newChanged); @@ -526,9 +527,6 @@ public void RemoveAllTabs_ClearsSelection () tv.RemoveTab (tab2); Assert.Null (tv.SelectedTab); - - // Shutdown must be called to safely clean up Application if Init has been called - Application.Shutdown (); } [Fact] @@ -540,9 +538,6 @@ public void RemoveTab_ChangesSelection () tv.RemoveTab (tab1); Assert.Equal (tab2, tv.SelectedTab); - - // Shutdown must be called to safely clean up Application if Init has been called - Application.Shutdown (); } [Fact] @@ -560,9 +555,6 @@ public void RemoveTab_MultipleCalls_NotAnError () tv.RemoveTab (tab1); Assert.Equal (tab2, tv.SelectedTab); - - // Shutdown must be called to safely clean up Application if Init has been called - Application.Shutdown (); } [Fact] @@ -588,16 +580,13 @@ public void SelectedTabChanged_Called () Assert.Equal (1, called); Assert.Equal (tab1, oldTab); Assert.Equal (tab2, newTab); - - // Shutdown must be called to safely clean up Application if Init has been called - Application.Shutdown (); } [Fact] [SetupFakeDriver] public void ShowTopLine_False_TabsOnBottom_False_TestTabView_Width3 () { - TabView tv = GetTabView (out _, out _, false); + TabView tv = GetTabView (out _, out _); tv.Width = 3; tv.Height = 5; tv.Style = new () { ShowTopLine = false }; @@ -621,7 +610,7 @@ public void ShowTopLine_False_TabsOnBottom_False_TestTabView_Width3 () [SetupFakeDriver] public void ShowTopLine_False_TabsOnBottom_False_TestTabView_Width4 () { - TabView tv = GetTabView (out _, out _, false); + TabView tv = GetTabView (out _, out _); tv.Width = 4; tv.Height = 5; tv.Style = new () { ShowTopLine = false }; @@ -645,7 +634,7 @@ public void ShowTopLine_False_TabsOnBottom_False_TestTabView_Width4 () [SetupFakeDriver] public void ShowTopLine_False_TabsOnBottom_False_TestThinTabView_WithLongNames () { - TabView tv = GetTabView (out Tab tab1, out Tab tab2, false); + TabView tv = GetTabView (out Tab tab1, out Tab tab2); tv.Width = 10; tv.Height = 5; tv.Style = new () { ShowTopLine = false }; @@ -671,7 +660,7 @@ public void ShowTopLine_False_TabsOnBottom_False_TestThinTabView_WithLongNames ( ); tv.SelectedTab = tab2; - Assert.Equal (tab2, tv.Subviews.First (v => v.Id.Contains ("tabRowView")).MostFocused); + Assert.Equal (tab2, tv.Subviews.First (v => v.Id.Contains ("tabRow")).MostFocused); tv.Layout (); View.SetClipToScreen (); @@ -744,7 +733,7 @@ public void ShowTopLine_False_TabsOnBottom_False_TestThinTabView_WithLongNames ( [SetupFakeDriver] public void ShowTopLine_False_TabsOnBottom_True_TestTabView_Width3 () { - TabView tv = GetTabView (out _, out _, false); + TabView tv = GetTabView (out _, out _); tv.Width = 3; tv.Height = 5; tv.Style = new () { ShowTopLine = false, TabsOnBottom = true }; @@ -768,7 +757,7 @@ public void ShowTopLine_False_TabsOnBottom_True_TestTabView_Width3 () [SetupFakeDriver] public void ShowTopLine_False_TabsOnBottom_True_TestTabView_Width4 () { - TabView tv = GetTabView (out _, out _, false); + TabView tv = GetTabView (out _, out _); tv.Width = 4; tv.Height = 5; tv.Style = new () { ShowTopLine = false, TabsOnBottom = true }; @@ -792,7 +781,7 @@ public void ShowTopLine_False_TabsOnBottom_True_TestTabView_Width4 () [SetupFakeDriver] public void ShowTopLine_False_TabsOnBottom_True_TestThinTabView_WithLongNames () { - TabView tv = GetTabView (out Tab tab1, out Tab tab2, false); + TabView tv = GetTabView (out Tab tab1, out Tab tab2); tv.Width = 10; tv.Height = 5; tv.Style = new () { ShowTopLine = false, TabsOnBottom = true }; @@ -817,7 +806,7 @@ public void ShowTopLine_False_TabsOnBottom_True_TestThinTabView_WithLongNames () ); tv.SelectedTab = tab2; - Assert.Equal (tab2, tv.Subviews.First (v => v.Id.Contains ("tabRowView")).MostFocused); + Assert.Equal (tab2, tv.Subviews.First (v => v.Id.Contains ("tabRow")).MostFocused); tv.Layout (); View.SetClipToScreen (); @@ -893,7 +882,7 @@ public void ShowTopLine_False_TabsOnBottom_True_TestThinTabView_WithLongNames () [SetupFakeDriver] public void ShowTopLine_True_TabsOnBottom_False_TestTabView_Width3 () { - TabView tv = GetTabView (out _, out _, false); + TabView tv = GetTabView (out _, out _); tv.Width = 3; tv.Height = 5; tv.Layout (); @@ -915,7 +904,7 @@ public void ShowTopLine_True_TabsOnBottom_False_TestTabView_Width3 () [SetupFakeDriver] public void ShowTopLine_True_TabsOnBottom_False_TestTabView_Width4 () { - TabView tv = GetTabView (out _, out _, false); + TabView tv = GetTabView (out _, out _); tv.Width = 4; tv.Height = 5; tv.Layout (); @@ -938,7 +927,7 @@ public void ShowTopLine_True_TabsOnBottom_False_TestTabView_Width4 () [SetupFakeDriver] public void ShowTopLine_True_TabsOnBottom_False_TestThinTabView_WithLongNames () { - TabView tv = GetTabView (out Tab tab1, out Tab tab2, false); + TabView tv = GetTabView (out Tab tab1, out Tab tab2); tv.Width = 10; tv.Height = 5; @@ -1035,7 +1024,7 @@ public void ShowTopLine_True_TabsOnBottom_False_TestThinTabView_WithLongNames () [SetupFakeDriver] public void ShowTopLine_True_TabsOnBottom_False_With_Unicode () { - TabView tv = GetTabView (out Tab tab1, out Tab tab2, false); + TabView tv = GetTabView (out Tab tab1, out Tab tab2); tv.Width = 20; tv.Height = 5; @@ -1077,7 +1066,7 @@ public void ShowTopLine_True_TabsOnBottom_False_With_Unicode () [SetupFakeDriver] public void ShowTopLine_True_TabsOnBottom_True_TestTabView_Width3 () { - TabView tv = GetTabView (out _, out _, false); + TabView tv = GetTabView (out _, out _); tv.Width = 3; tv.Height = 5; tv.Style = new () { TabsOnBottom = true }; @@ -1101,7 +1090,7 @@ public void ShowTopLine_True_TabsOnBottom_True_TestTabView_Width3 () [SetupFakeDriver] public void ShowTopLine_True_TabsOnBottom_True_TestTabView_Width4 () { - TabView tv = GetTabView (out _, out _, false); + TabView tv = GetTabView (out _, out _); tv.Width = 4; tv.Height = 5; tv.Style = new () { TabsOnBottom = true }; @@ -1125,7 +1114,7 @@ public void ShowTopLine_True_TabsOnBottom_True_TestTabView_Width4 () [SetupFakeDriver] public void ShowTopLine_True_TabsOnBottom_True_TestThinTabView_WithLongNames () { - TabView tv = GetTabView (out Tab tab1, out Tab tab2, false); + TabView tv = GetTabView (out Tab tab1, out Tab tab2); tv.Width = 10; tv.Height = 5; tv.Style = new () { TabsOnBottom = true }; @@ -1207,7 +1196,7 @@ public void ShowTopLine_True_TabsOnBottom_True_TestThinTabView_WithLongNames () [SetupFakeDriver] public void ShowTopLine_True_TabsOnBottom_True_With_Unicode () { - TabView tv = GetTabView (out Tab tab1, out Tab tab2, false); + TabView tv = GetTabView (out Tab tab1, out Tab tab2); tv.Width = 20; tv.Height = 5; tv.Style = new () { TabsOnBottom = true }; @@ -1279,9 +1268,6 @@ public void SwitchTabBy_NormalUsage () // even though we go right 2 indexes the event should only be called once Assert.Equal (1, called); Assert.Equal (tab4, tv.SelectedTab); - - // Shutdown must be called to safely clean up Application if Init has been called - Application.Shutdown (); } [Fact] @@ -1297,9 +1283,6 @@ public void SwitchTabBy_OutOfTabsRange () tv.SwitchTabBy (-500); Assert.Equal (tab1, tv.SelectedTab); - - // Shutdown must be called to safely clean up Application if Init has been called - Application.Shutdown (); } [Fact] @@ -1318,16 +1301,13 @@ public void RemoveTab_ThatHasFocus () } Assert.Empty (tv.Tabs); - - // Shutdown must be called to safely clean up Application if Init has been called - Application.Shutdown (); } [Fact] [SetupFakeDriver] public void Add_Three_TabsOnTop_ChangesTab () { - TabView tv = GetTabView (out Tab tab1, out Tab tab2, false); + TabView tv = GetTabView (out Tab tab1, out Tab tab2); Tab tab3; tv.AddTab ( @@ -1392,7 +1372,7 @@ public void Add_Three_TabsOnTop_ChangesTab () [SetupFakeDriver] public void Add_Three_TabsOnBottom_ChangesTab () { - TabView tv = GetTabView (out Tab tab1, out Tab tab2, false); + TabView tv = GetTabView (out Tab tab1, out Tab tab2); Tab tab3; tv.AddTab ( @@ -1455,15 +1435,59 @@ public void Add_Three_TabsOnBottom_ChangesTab () ); } - private TabView GetTabView () { return GetTabView (out _, out _); } + [Fact] + [AutoInitShutdown] + public void Tab_Get_Focus_By_Press_F6 () + { + TabView tv = GetTabView (out Tab tab1, out Tab tab2); + + tv.Width = 20; + tv.Height = 5; + + Toplevel top = new (); + top.Add (tv); + Application.Begin (top); - private TabView GetTabView (out Tab tab1, out Tab tab2, bool initFakeDriver = true) + Assert.False (tab1.HasFocus); + + Assert.True (Application.RaiseKeyDownEvent (Key.F6)); + Assert.True (tab1.HasFocus); + top.Dispose (); + } + + [Fact] + [SetupFakeDriver] + public void Mouse_Wheel_Changes_Tab () { - if (initFakeDriver) - { - InitFakeDriver (); - } + TabView tv = GetTabView (out Tab tab1, out Tab tab2); + + tv.Width = 20; + tv.Height = 5; + + Toplevel top = new (); + top.Add (tv); + Application.Begin (top); + Assert.False (tab1.HasFocus); + + Application.RaiseMouseEvent (new () { Position = new (1, 1), Flags = MouseFlags.WheeledDown }); + Assert.True (tab2.HasFocus); + + Application.RaiseMouseEvent (new () { Position = new (1, 1), Flags = MouseFlags.WheeledUp }); + Assert.True (tab1.HasFocus); + + Application.RaiseMouseEvent (new () { Position = new (1, 1), Flags = MouseFlags.WheeledRight }); + Assert.True (tab2.HasFocus); + + Application.RaiseMouseEvent (new () { Position = new (1, 1), Flags = MouseFlags.WheeledLeft }); + Assert.True (tab1.HasFocus); + top.Dispose (); + } + + private TabView GetTabView () { return GetTabView (out _, out _); } + + private TabView GetTabView (out Tab tab1, out Tab tab2) + { var tv = new TabView () { Id = "tv " }; tv.BeginInit (); tv.EndInit (); @@ -1477,14 +1501,4 @@ private TabView GetTabView (out Tab tab1, out Tab tab2, bool initFakeDriver = tr return tv; } - - private void InitFakeDriver () - { - ConfigurationManager.Locations = ConfigLocations.Default; - ConfigurationManager.Reset (); - - var driver = new FakeDriver (); - Application.Init (driver); - driver.Init (); - } }