@@ -84,6 +84,7 @@ public void ScrollWheel(NSEvent theEvent)
84
84
if ( h == null ) return ;
85
85
h . Callback . OnMouseWheel ( h . Widget , MacConversions . GetMouseEvent ( h , theEvent , true ) ) ;
86
86
}
87
+
87
88
}
88
89
89
90
public interface IMacViewHandler : IMacControlHandler
@@ -109,6 +110,8 @@ public interface IMacViewHandler : IMacControlHandler
109
110
bool ? ShouldHaveFocus { get ; set ; }
110
111
int SuppressMouseEvents { get ; set ; }
111
112
bool SuppressMouseTriggerCallback { get ; set ; }
113
+ bool TextInputCancelled { get ; set ; }
114
+ bool TextInputImplemented { get ; }
112
115
113
116
DragEventArgs GetDragEventArgs ( NSDraggingInfo info , object customControl ) ;
114
117
@@ -126,7 +129,7 @@ public interface IMacViewHandler : IMacControlHandler
126
129
MouseEventArgs TriggerMouseUp ( NSObject obj , IntPtr sel , NSEvent theEvent ) ;
127
130
}
128
131
129
- static class MacView
132
+ static partial class MacView
130
133
{
131
134
public static readonly object AutoSize_Key = new object ( ) ;
132
135
public static readonly object MinimumSize_Key = new object ( ) ;
@@ -138,6 +141,8 @@ static class MacView
138
141
public static readonly object Enabled_Key = new object ( ) ;
139
142
public static readonly object ActualEnabled_Key = new object ( ) ;
140
143
public static readonly object AcceptsFirstMouse_Key = new object ( ) ;
144
+ public static readonly object TextInputCancelled_Key = new object ( ) ;
145
+ public static readonly object TextInputImplemented_Key = new object ( ) ;
141
146
public static readonly IntPtr selMouseDown = Selector . GetHandle ( "mouseDown:" ) ;
142
147
public static readonly IntPtr selMouseUp = Selector . GetHandle ( "mouseUp:" ) ;
143
148
public static readonly IntPtr selMouseDragged = Selector . GetHandle ( "mouseDragged:" ) ;
@@ -154,7 +159,7 @@ static class MacView
154
159
public static readonly IntPtr selBecomeFirstResponder = Selector . GetHandle ( "becomeFirstResponder" ) ;
155
160
public static readonly IntPtr selSetFrameSize = Selector . GetHandle ( "setFrameSize:" ) ;
156
161
public static readonly IntPtr selResignFirstResponder = Selector . GetHandle ( "resignFirstResponder" ) ;
157
- public static readonly IntPtr selInsertText = Selector . GetHandle ( "insertText:" ) ;
162
+ public static readonly IntPtr selInsertTextReplacementRange = Selector . GetHandle ( "insertText:replacementRange :" ) ;
158
163
public static readonly IntPtr selDraggingEntered = Selector . GetHandle ( "draggingEntered:" ) ;
159
164
public static readonly IntPtr selDraggingExited = Selector . GetHandle ( "draggingExited:" ) ;
160
165
public static readonly IntPtr selDraggingUpdated = Selector . GetHandle ( "draggingUpdated:" ) ;
@@ -284,6 +289,7 @@ static void TriggerMouseWheel(IntPtr sender, IntPtr sel, IntPtr e)
284
289
Messaging . void_objc_msgSendSuper_IntPtr ( obj . SuperHandle , sel , e ) ;
285
290
}
286
291
292
+ static int _interpretingKeyEvents ;
287
293
internal static MarshalDelegates . Action_IntPtr_IntPtr_IntPtr TriggerKeyDown_Delegate = TriggerKeyDown ;
288
294
static void TriggerKeyDown ( IntPtr sender , IntPtr sel , IntPtr e )
289
295
{
@@ -293,7 +299,21 @@ static void TriggerKeyDown(IntPtr sender, IntPtr sel, IntPtr e)
293
299
var theEvent = Messaging . GetNSObject < NSEvent > ( e ) ;
294
300
if ( ! MacEventView . KeyDown ( handler . Widget , theEvent ) )
295
301
{
296
- Messaging . void_objc_msgSendSuper_IntPtr ( obj . SuperHandle , sel , e ) ;
302
+ if ( handler . TextInputImplemented && _interpretingKeyEvents == 0 )
303
+ {
304
+ _interpretingKeyEvents ++ ;
305
+ // sending this twice for the same event actually makes it go to the same control..
306
+ handler . TextInputControl . InterpretKeyEvents ( new [ ] { theEvent } ) ;
307
+
308
+ if ( ! handler . TextInputCancelled )
309
+ Messaging . void_objc_msgSendSuper_IntPtr ( obj . SuperHandle , sel , e ) ;
310
+
311
+ _interpretingKeyEvents -- ;
312
+ }
313
+ else
314
+ {
315
+ Messaging . void_objc_msgSendSuper_IntPtr ( obj . SuperHandle , sel , e ) ;
316
+ }
297
317
}
298
318
}
299
319
}
@@ -389,21 +409,28 @@ static void TriggerDraggingExited(IntPtr sender, IntPtr sel, IntPtr draggingInfo
389
409
}
390
410
Messaging . void_objc_msgSendSuper_IntPtr ( obj . SuperHandle , sel , draggingInfoPtr ) ;
391
411
}
412
+
392
413
393
- internal static MarshalDelegates . Action_IntPtr_IntPtr_IntPtr TriggerTextInput_Delegate = TriggerTextInput ;
394
- static void TriggerTextInput ( IntPtr sender , IntPtr sel , IntPtr textPtr )
414
+ internal static MarshalDelegates . Action_IntPtr_IntPtr_IntPtr_NSRange TriggerTextInput_Delegate = TriggerTextInput ;
415
+ static void TriggerTextInput ( IntPtr sender , IntPtr sel , IntPtr textPtr , NSRange range )
395
416
{
396
417
var obj = Runtime . GetNSObject ( sender ) ;
397
418
398
419
if ( MacBase . GetHandler ( obj ) is IMacViewHandler handler )
399
420
{
421
+ handler . TextInputCancelled = false ;
400
422
var text = ( string ) Messaging . GetNSObject < NSString > ( textPtr ) ;
401
423
var args = new TextInputEventArgs ( text ) ;
402
424
handler . Callback . OnTextInput ( handler . Widget , args ) ;
403
425
if ( args . Cancel )
426
+ {
427
+ handler . TextInputCancelled = true ;
404
428
return ;
429
+ }
405
430
}
406
- Messaging . void_objc_msgSendSuper_IntPtr ( obj . SuperHandle , sel , textPtr ) ;
431
+
432
+ if ( ObjCExtensions . SuperClassInstancesRespondsToSelector ( obj , sel ) )
433
+ Messaging . void_objc_msgSendSuper_IntPtr_NSRange ( obj . SuperHandle , sel , textPtr , range ) ;
407
434
}
408
435
409
436
@@ -499,6 +526,7 @@ static void TriggerSystemAction(IntPtr sender, IntPtr sel, IntPtr e)
499
526
}
500
527
501
528
internal static MarshalDelegates . Func_IntPtr_IntPtr_IntPtr_bool ValidateSystemUserInterfaceItem_Delegate = ValidateSystemUserInterfaceItem ;
529
+
502
530
static bool ValidateSystemUserInterfaceItem ( IntPtr sender , IntPtr sel , IntPtr item )
503
531
{
504
532
var actionHandle = Messaging . IntPtr_objc_msgSend ( item , MacView . selGetAction ) ;
@@ -514,22 +542,15 @@ static bool ValidateSystemUserInterfaceItem(IntPtr sender, IntPtr sel, IntPtr it
514
542
return command . Enabled ;
515
543
}
516
544
}
517
-
518
- var objClass = Messaging . IntPtr_objc_msgSend ( sender , MacView . selClass_Handle ) ;
519
-
520
- if ( objClass == IntPtr . Zero )
521
- return false ;
522
-
523
- var superClass = ObjCExtensions . class_getSuperclass ( objClass ) ;
545
+
524
546
return
525
- superClass != IntPtr . Zero
526
- && ObjCExtensions . ClassInstancesRespondToSelector ( superClass , sel )
547
+ ObjCExtensions . SuperClassInstancesRespondsToSelector ( sender , sel )
527
548
&& Messaging . bool_objc_msgSendSuper_IntPtr ( control . SuperHandle , sel , item ) ;
528
549
}
529
550
530
551
}
531
552
532
- public abstract class MacView < TControl , TWidget , TCallback > : MacObject < TControl , TWidget , TCallback > , Control . IHandler , IMacViewHandler
553
+ public abstract partial class MacView < TControl , TWidget , TCallback > : MacObject < TControl , TWidget , TCallback > , Control . IHandler , IMacViewHandler
533
554
where TControl : NSObject
534
555
where TWidget : Control
535
556
where TCallback : Control . ICallback
@@ -545,13 +566,13 @@ public abstract class MacView<TControl, TWidget, TCallback> : MacObject<TControl
545
566
546
567
public abstract NSView ContainerControl { get ; }
547
568
548
- public virtual NSView ContentControl { get { return ContainerControl ; } }
569
+ public virtual NSView ContentControl => ContainerControl ;
549
570
550
571
public virtual NSView DragControl => ContainerControl ;
551
572
552
- public virtual NSView EventControl { get { return ContainerControl ; } }
573
+ public virtual NSView EventControl => ContainerControl ;
553
574
554
- public virtual NSView FocusControl { get { return EventControl ; } }
575
+ public virtual NSView FocusControl => EventControl ;
555
576
556
577
public virtual IEnumerable < Control > VisualControls => Enumerable . Empty < Control > ( ) ;
557
578
@@ -800,7 +821,10 @@ public override void AttachEvent(string id)
800
821
// TODO
801
822
break ;
802
823
case Eto . Forms . Control . TextInputEvent :
803
- AddMethod ( MacView . selInsertText , MacView . TriggerTextInput_Delegate , "v@:@" ) ;
824
+ if ( EnsureTextInputImplemented ( ) )
825
+ {
826
+ HandleEvent ( Eto . Forms . Control . KeyDownEvent ) ;
827
+ }
804
828
break ;
805
829
806
830
case Eto . Forms . Control . DragDropEvent :
@@ -1456,6 +1480,18 @@ public virtual MouseEventArgs TriggerMouseUp(NSObject obj, IntPtr sel, NSEvent t
1456
1480
}
1457
1481
return args ;
1458
1482
}
1483
+
1484
+ bool IMacViewHandler . TextInputCancelled
1485
+ {
1486
+ get => Widget . Properties . Get < bool > ( MacView . TextInputCancelled_Key ) ;
1487
+ set => Widget . Properties . Set ( MacView . TextInputCancelled_Key , value ) ;
1488
+ }
1489
+
1490
+ public bool TextInputImplemented
1491
+ {
1492
+ get => Widget . Properties . Get < bool > ( MacView . TextInputImplemented_Key ) ;
1493
+ private set => Widget . Properties . Set ( MacView . TextInputImplemented_Key , value ) ;
1494
+ }
1459
1495
}
1460
1496
}
1461
1497
0 commit comments