Explorar o código

Accept now uses HandledEventARgs vs. Cancel

Tig hai 1 ano
pai
achega
7a712ad96a

+ 4 - 4
Terminal.Gui/View/View.cs

@@ -109,10 +109,10 @@ public partial class View : Responder, ISupportInitializeNotification
 {
     /// <summary>
     ///     Cancelable event fired when the <see cref="Command.Accept"/> command is invoked. Set
-    ///     <see cref="CancelEventArgs.Cancel"/>
+    ///     <see cref="HandledEventArgs.Cancel"/>
     ///     to cancel the event.
     /// </summary>
-    public event EventHandler<CancelEventArgs> Accept;
+    public event EventHandler<HandledEventArgs> Accept;
 
     /// <summary>Gets or sets arbitrary data for the view.</summary>
     /// <remarks>This property is not used internally.</remarks>
@@ -156,10 +156,10 @@ public partial class View : Responder, ISupportInitializeNotification
     /// </returns>
     protected bool? OnAccept ()
     {
-        var args = new CancelEventArgs ();
+        var args = new HandledEventArgs ();
         Accept?.Invoke (this, args);
 
-        return Accept is null ? null : args.Cancel;
+        return Accept is null ? null : args.Handled;
     }
 
     #region Constructors and Initialization

+ 1 - 1
Terminal.Gui/Views/ComboBox.cs

@@ -658,7 +658,7 @@ public class ComboBox : View
     }
 
     // Tell TextField to handle Accept Command (Enter)
-    void Search_Accept (object sender, CancelEventArgs e) { e.Cancel = true; }
+    void Search_Accept (object sender, HandledEventArgs e) { e.Handled = true; }
 
     private void Search_Changed (object sender, StateEventArgs<string> e)
     {

+ 17 - 4
Terminal.Gui/Views/TextView.cs

@@ -2523,10 +2523,21 @@ public class TextView : View
         KeyBindings.Add ((KeyCode)ContextMenu.Key, KeyBindingScope.HotKey, Command.ShowContextMenu);
     }
 
+    // BUGBUG: AllowsReturn is mis-named. It should be EnterKeyAccepts.
     /// <summary>
-    ///     Gets or sets a value indicating whether pressing ENTER in a <see cref="TextView"/> creates a new line of text
-    ///     in the view or activates the default button for the Toplevel.
+    ///     Gets or sets whether pressing ENTER in a <see cref="TextView"/> creates a new line of text
+    ///     in the view or invokes the <see cref="View.Accept"/> event.
     /// </summary>
+    /// <remarks>
+    ///     <para>
+    ///         Setting this property alters <see cref="Multiline"/>.
+    ///         If <see cref="AllowsReturn"/> is set to <see langword="true"/>, then <see cref="Multiline"/> is also set to `true` and
+    ///         vice-versa.
+    ///     </para>
+    ///     <para>
+    ///         If <see cref="AllowsReturn"/> is set to <see langword="false"/>, then <see cref="AllowsTab"/> gets set to <see langword="false"/>.
+    ///     </para>
+    /// </remarks>
     public bool AllowsReturn
     {
         get => _allowsReturn;
@@ -2536,12 +2547,14 @@ public class TextView : View
 
             if (_allowsReturn && !_multiline)
             {
+                // BUGBUG: Seting properties should not have side-effects like this. Multiline and AllowsReturn should be independent.
                 Multiline = true;
             }
 
             if (!_allowsReturn && _multiline)
             {
                 Multiline = false;
+                // BUGBUG: Seting properties should not have side-effects like this. Multiline and AlowsTab should be independent.
                 AllowsTab = false;
             }
 
@@ -6050,13 +6063,13 @@ public class TextView : View
         Paste ();
     }
 
-    private bool ProcessReturn ()
+    private bool? ProcessReturn ()
     {
         ResetColumnTrack ();
 
         if (!AllowsReturn || _isReadOnly)
         {
-            return false;
+            return OnAccept ();
         }
 
         SetWrapModel ();

+ 2 - 2
UICatalog/Scenarios/Bars.cs

@@ -193,7 +193,7 @@ public class Bars : Scenario
                                  {
                                      eventSource.Add ($"Accept: {sh!.SuperView.Id} {sh!.CommandView.Text}");
                                      eventLog.MoveDown ();
-                                     args.Cancel = true;
+                                     args.Handled = true;
                                  };
                 }
             }
@@ -453,7 +453,7 @@ public class Bars : Scenario
                                                     {
                                                         button1.Visible = !button1.Visible;
                                                         button1.Enabled = button1.Visible;
-                                                        e.Cancel = false;
+                                                        e.Handled = false;
                                                     };
 
         bar.Add (new Label

+ 2 - 2
UICatalog/Scenarios/Buttons.cs

@@ -486,12 +486,12 @@ public class Buttons : Scenario
 
             return;
 
-            void OnDownButtonOnAccept (object s, CancelEventArgs e)
+            void OnDownButtonOnAccept (object s, HandledEventArgs e)
             {
                 InvokeCommand (Command.ScrollDown);
             }
 
-            void OnUpButtonOnAccept (object s, CancelEventArgs e)
+            void OnUpButtonOnAccept (object s, HandledEventArgs e)
             {
                 InvokeCommand (Command.ScrollUp);
             }

+ 3 - 3
UICatalog/Scenarios/CharacterMap.cs

@@ -82,12 +82,12 @@ public class CharacterMap : Scenario
 #else
         jumpEdit.Accept += JumpEditOnAccept;
 
-        void JumpEditOnAccept (object sender, CancelEventArgs e)
+        void JumpEditOnAccept (object sender, HandledEventArgs e)
         {
             JumpEdit_TextChanged (sender, new (jumpEdit.Text, jumpEdit.Text));
 
             // Cancel the event to prevent ENTER from being handled elsewhere
-            e.Cancel = true;
+            e.Handled = true;
         }
 #endif
         _categoryList = new () { X = Pos.Right (_charMap), Y = Pos.Bottom (jumpLabel), Height = Dim.Fill () };
@@ -483,7 +483,7 @@ internal class CharMap : View
             WantContinuousButtonPressed = true,
             CanFocus = false
         };
-        up.Accept += (sender, args) => { args.Cancel = ScrollVertical (-1) == true; };
+        up.Accept += (sender, args) => { args.Handled = ScrollVertical (-1) == true; };
 
         var down = new Button
         {

+ 1 - 1
UICatalog/Scenarios/GraphViewExample.cs

@@ -196,7 +196,7 @@ public class GraphViewExample : Scenario
         Application.Shutdown ();
     }
 
-    private void DiagShortcut_Accept (object sender, CancelEventArgs e)
+    private void DiagShortcut_Accept (object sender, HandledEventArgs e)
     {
         ToggleDiagnostics ();
 

+ 2 - 2
UICatalog/Scenarios/Shortcuts.cs

@@ -361,7 +361,7 @@ public class Shortcuts : Scenario
                                    {
                                        eventSource.Add ($"Accept: {shortcut!.CommandView.Text}");
                                        eventLog.MoveDown ();
-                                       args.Cancel = true;
+                                       args.Handled = true;
                                    };
 
                 shortcut.CommandView.Accept += (o, args) =>
@@ -375,7 +375,7 @@ public class Shortcuts : Scenario
         //((CheckBox)vShortcut5.CommandView).OnToggled ();
     }
 
-    private void Button_Clicked (object sender, CancelEventArgs e)
+    private void Button_Clicked (object sender, HandledEventArgs e)
     {
         //e.Cancel = true;
         MessageBox.Query ("Hi", $"You clicked {sender}"); 

+ 1 - 1
UICatalog/Scenarios/Sliders.cs

@@ -599,7 +599,7 @@ public class Sliders : Scenario
                              {
                                  eventSource.Add ($"Accept: {string.Join(",", slider.GetSetOptions ())}");
                                  eventLog.MoveDown ();
-                                 args.Cancel = true;
+                                 args.Handled = true;
                              };
             slider.OptionsChanged += (o, args) =>
                              {

+ 4 - 4
UnitTests/View/ViewTests.cs

@@ -1198,7 +1198,7 @@ At 0,0
 
         return;
 
-        void ViewOnAccept (object sender, CancelEventArgs e) { accepted = true; }
+        void ViewOnAccept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
     [Fact]
@@ -1215,10 +1215,10 @@ At 0,0
 
         return;
 
-        void ViewOnAccept (object sender, CancelEventArgs e)
+        void ViewOnAccept (object sender, HandledEventArgs e)
         {
             acceptInvoked = true;
-            e.Cancel = true;
+            e.Handled = true;
         }
     }
 
@@ -1235,7 +1235,7 @@ At 0,0
 
         return;
 
-        void ViewOnAccept (object sender, CancelEventArgs e) { accepted = true; }
+        void ViewOnAccept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
     [Fact]

+ 3 - 3
UnitTests/Views/ButtonTests.cs

@@ -484,7 +484,7 @@ public class ButtonTests (ITestOutputHelper output)
 
         return;
 
-        void ButtonOnAccept (object sender, CancelEventArgs e) { accepted = true; }
+        void ButtonOnAccept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
     [Fact]
@@ -503,10 +503,10 @@ public class ButtonTests (ITestOutputHelper output)
 
         return;
 
-        void ButtonAccept (object sender, CancelEventArgs e)
+        void ButtonAccept (object sender, HandledEventArgs e)
         {
             acceptInvoked = true;
-            e.Cancel = true;
+            e.Handled = true;
         }
     }
 

+ 3 - 3
UnitTests/Views/CheckBoxTests.cs

@@ -229,10 +229,10 @@ public class CheckBoxTests (ITestOutputHelper output)
 
         return;
 
-        void ViewOnAccept (object sender, CancelEventArgs e)
+        void ViewOnAccept (object sender, HandledEventArgs e)
         {
             acceptInvoked = true;
-            e.Cancel = true;
+            e.Handled = true;
         }
     }
 
@@ -469,7 +469,7 @@ public class CheckBoxTests (ITestOutputHelper output)
 
         return;
 
-        void CheckBoxOnAccept (object sender, CancelEventArgs e) { accepted = true; }
+        void CheckBoxOnAccept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
     [Theory]

+ 1 - 1
UnitTests/Views/LabelTests.cs

@@ -81,7 +81,7 @@ public class LabelTests (ITestOutputHelper output)
 
         return;
 
-        void LabelOnAccept (object sender, CancelEventArgs e) { accepted = true; }
+        void LabelOnAccept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
     [Fact]

+ 4 - 4
UnitTests/Views/ListViewTests.cs

@@ -420,7 +420,7 @@ Item 6",
 
         return;
 
-        void OnAccept (object sender, CancelEventArgs e) { accepted = true; }
+        void OnAccept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
     [Fact]
@@ -451,7 +451,7 @@ Item 6",
             selectedValue = e.Value.ToString ();
         }
 
-        void Accept (object sender, CancelEventArgs e) { accepted = true; }
+        void Accept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
     [Fact]
@@ -482,10 +482,10 @@ Item 6",
             selectedValue = e.Value.ToString ();
         }
 
-        void Accept (object sender, CancelEventArgs e)
+        void Accept (object sender, HandledEventArgs e)
         {
             accepted = true;
-            e.Cancel = true;
+            e.Handled = true;
         }
     }
 

+ 2 - 2
UnitTests/Views/RadioGroupTests.cs

@@ -189,7 +189,7 @@ public class RadioGroupTests (ITestOutputHelper output)
 
         return;
 
-        void OnAccept (object sender, CancelEventArgs e) { accepted = true; }
+        void OnAccept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
     [Fact]
@@ -205,7 +205,7 @@ public class RadioGroupTests (ITestOutputHelper output)
 
         return;
 
-        void OnAccept (object sender, CancelEventArgs e) { accepted = true; }
+        void OnAccept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
     [Fact]

+ 11 - 11
UnitTests/Views/TextFieldTests.cs

@@ -771,7 +771,7 @@ public class TextFieldTests (ITestOutputHelper output)
 
         return;
 
-        void OnAccept (object sender, CancelEventArgs e) { accepted = true; }
+        void OnAccept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
     [Fact]
@@ -786,13 +786,13 @@ public class TextFieldTests (ITestOutputHelper output)
 
         return;
 
-        void Accept (object sender, CancelEventArgs e) { accepted = true; }
+        void Accept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
     [Theory]
     [InlineData (false, 0)]
     [InlineData (true, 1)]
-    public void Accept_Handler_Cancel_Prevents_Default_Button_Accept (bool cancelAccept, int expectedButtonAccepts)
+    public void Accept_Handler_Handled_Prevents_Default_Button_Accept (bool handleAccept, int expectedButtonAccepts)
     {
         var superView = new Window ();
         var tf = new TextField ();
@@ -823,13 +823,13 @@ public class TextFieldTests (ITestOutputHelper output)
 
         return;
 
-        void TextFieldAccept (object sender, CancelEventArgs e)
+        void TextFieldAccept (object sender, HandledEventArgs e)
         {
             textFieldAccept++;
-            e.Cancel = cancelAccept;
+            e.Handled = handleAccept;
         }
 
-        void ButtonAccept (object sender, CancelEventArgs e)
+        void ButtonAccept (object sender, HandledEventArgs e)
         {
             buttonAccept++;
         }
@@ -862,7 +862,7 @@ public class TextFieldTests (ITestOutputHelper output)
 
         return;
 
-        void ButtonAccept (object sender, CancelEventArgs e)
+        void ButtonAccept (object sender, HandledEventArgs e)
         {
             buttonAccept++;
         }
@@ -879,23 +879,23 @@ public class TextFieldTests (ITestOutputHelper output)
         //var superAcceptedInvoked = false;
 
         var tfAcceptedInvoked = false;
-        var cancel = false;
+        var handle = false;
         view.Accept += TextViewAccept;
         Assert.True (view.InvokeCommand (Command.Accept));
         Assert.True (tfAcceptedInvoked);
 
         tfAcceptedInvoked = false;
-        cancel = true;
+        handle = true;
         view.Accept += TextViewAccept;
         Assert.False (view.InvokeCommand (Command.Accept));
         Assert.True (tfAcceptedInvoked);
 
         return;
 
-        void TextViewAccept (object sender, CancelEventArgs e)
+        void TextViewAccept (object sender, HandledEventArgs e)
         {
             tfAcceptedInvoked = true;
-            e.Cancel = cancel;
+            e.Handled = handle;
         }
     }
 

+ 150 - 0
UnitTests/Views/TextViewTests.cs

@@ -1,3 +1,4 @@
+using System.ComponentModel;
 using System.Reflection;
 using System.Text;
 using System.Text.RegularExpressions;
@@ -9130,4 +9131,153 @@ line.
             _textView.Text = Encoding.Unicode.GetString (ms);
         }
     }
+
+
+    [Fact]
+    public void HotKey_Command_SetsFocus ()
+    {
+        var view = new TextView ();
+
+        view.CanFocus = true;
+        Assert.False (view.HasFocus);
+        view.InvokeCommand (Command.HotKey);
+        Assert.True (view.HasFocus);
+    }
+
+    [Fact]
+    public void HotKey_Command_Does_Not_Accept ()
+    {
+        var view = new TextView ();
+        var accepted = false;
+        view.Accept += OnAccept;
+        view.InvokeCommand (Command.HotKey);
+
+        Assert.False (accepted);
+
+        return;
+
+        void OnAccept (object sender, HandledEventArgs e) { accepted = true; }
+    }
+
+    [Fact]
+    public void Accept_Command_Fires_Accept ()
+    {
+        var view = new TextView ();
+
+        var accepted = false;
+        view.Accept += Accept;
+        view.InvokeCommand (Command.Accept);
+        Assert.True (accepted);
+
+        return;
+
+        void Accept (object sender, HandledEventArgs e) { accepted = true; }
+    }
+
+
+    [Theory]
+    [InlineData(false, 1)]
+    [InlineData (true, 0)]
+    public void Enter_Key_Fires_Accept (bool multiline, int expectedAccepts)
+    {
+        var view = new TextView ()
+        {
+            Multiline = multiline,
+        };
+
+        int accepted = 0;
+        view.Accept += Accept;
+        view.NewKeyDownEvent (Key.Enter);
+        Assert.Equal (expectedAccepts, accepted);
+
+        return;
+
+        void Accept (object sender, HandledEventArgs e) { accepted++;}
+    }
+
+    [Theory, InlineData (false, false, 0), InlineData (false, true, 1), InlineData (true, false, 0), InlineData (true, true, 0)]
+    public void Accept_Handler_Handled_Prevents_Default_Button_Accept (bool multiline, bool handleAccept, int expectedButtonAccepts)
+    {
+        var superView = new Window ();
+        var tv = new TextView ()
+        {
+            Multiline = multiline
+        };
+        var button = new Button ()
+        {
+            IsDefault = true,
+        };
+
+        superView.Add (tv, button);
+
+        var buttonAccept = 0;
+        button.Accept += ButtonAccept;
+
+        var textViewAccept = 0;
+        tv.Accept += TextViewAccept;
+
+        tv.SetFocus ();
+        Assert.True (tv.HasFocus);
+
+        superView.NewKeyDownEvent (Key.Enter);
+        Assert.Equal (1, textViewAccept);
+        Assert.Equal (expectedButtonAccepts, buttonAccept);
+
+        button.SetFocus ();
+        superView.NewKeyDownEvent (Key.Enter);
+        Assert.Equal (1, textViewAccept);
+        Assert.Equal (expectedButtonAccepts + 1, buttonAccept);
+
+        return;
+
+        void TextViewAccept (object sender, HandledEventArgs e)
+        {
+            textViewAccept++;
+            e.Handled = handleAccept;
+        }
+
+        void ButtonAccept (object sender, HandledEventArgs e)
+        {
+            buttonAccept++;
+        }
+    }
+    
+    [Theory]
+    [InlineData (true, 0)]
+    [InlineData (false, 1)]
+    public void Accept_No_Handler_Enables_Default_Button_Accept (bool multiline, int expectedButtonAccept)
+    {
+        var superView = new Window ();
+        var tv = new TextView ()
+        {
+            Multiline = multiline
+        };
+        var button = new Button ()
+        {
+            IsDefault = true,
+        };
+
+        superView.Add (tv, button);
+
+        var buttonAccept = 0;
+        button.Accept += ButtonAccept;
+
+        tv.SetFocus ();
+        Assert.True (tv.HasFocus);
+
+        superView.NewKeyDownEvent (Key.Enter);
+        Assert.Equal (expectedButtonAccept, buttonAccept);
+
+        button.SetFocus ();
+        superView.NewKeyDownEvent (Key.Enter);
+        Assert.Equal (expectedButtonAccept + 1, buttonAccept);
+
+        return;
+
+        void ButtonAccept (object sender, HandledEventArgs e)
+        {
+            buttonAccept++;
+        }
+    }
+
 }

+ 8 - 8
UnitTests/Views/TreeViewTests.cs

@@ -1338,13 +1338,13 @@ oot two
         var treeView = new TreeView ();
         var accepted = false;
 
-        treeView.Accept += OnAccept;
-        treeView.InvokeCommand (Command.HotKey);
+treeView.Accept += OnAccept;
+treeView.InvokeCommand (Command.HotKey);
 
-        Assert.False (accepted);
+Assert.False (accepted);
 
-        return;
-        void OnAccept (object sender, CancelEventArgs e) { accepted = true; }
+return;
+void OnAccept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
 
@@ -1375,7 +1375,7 @@ oot two
             activated = true;
             selectedObject = e.ActivatedObject;
         }
-        void Accept (object sender, CancelEventArgs e) { accepted = true; }
+        void Accept (object sender, HandledEventArgs e) { accepted = true; }
     }
 
     [Fact]
@@ -1404,10 +1404,10 @@ oot two
             selectedObject = e.ActivatedObject;
         }
 
-        void Accept (object sender, CancelEventArgs e)
+        void Accept (object sender, HandledEventArgs e)
         {
             accepted = true;
-            e.Cancel = true;
+            e.Handled = true;
         }
     }
 }