11using System ;
22using Avalonia . Controls . Presenters ;
33using Avalonia . Input . TextInput ;
4- using Avalonia . Media . TextFormatting ;
54using Avalonia . Reactive ;
6- using Avalonia . Utilities ;
75
86namespace Avalonia . Controls
97{
@@ -13,35 +11,30 @@ internal class TextBoxTextInputMethodClient : TextInputMethodClient
1311 private TextPresenter ? _presenter ;
1412 private bool _selectionChanged ;
1513 private bool _isInChange ;
14+ private EventHandler ? _caretBoundsChangedHandler ;
1615
1716 public override Visual TextViewVisual => _presenter ! ;
1817
1918 public override string SurroundingText
2019 {
2120 get
2221 {
23- if ( _presenter is null || _parent is null )
22+ if ( _parent is null )
2423 {
2524 return "" ;
2625 }
2726
28- if ( _parent . CaretIndex != _presenter . CaretIndex )
27+ if ( _presenter is not null && _parent . CaretIndex != _presenter . CaretIndex )
2928 {
3029 _presenter . SetCurrentValue ( TextPresenter . CaretIndexProperty , _parent . CaretIndex ) ;
3130 }
3231
33- if ( _parent . Text != _presenter . Text )
32+ if ( _presenter is not null && _parent . Text != _presenter . Text )
3433 {
3534 _presenter . SetCurrentValue ( TextPresenter . TextProperty , _parent . Text ) ;
3635 }
3736
38- var lineIndex = _presenter . TextLayout . GetLineIndexFromCharacterIndex ( _presenter . CaretIndex , false ) ;
39-
40- var textLine = _presenter . TextLayout . TextLines [ lineIndex ] ;
41-
42- var lineText = GetTextLineText ( textLine ) ;
43-
44- return lineText ;
37+ return _parent . Text ?? string . Empty ;
4538 }
4639 }
4740
@@ -69,41 +62,22 @@ public override TextSelection Selection
6962 {
7063 get
7164 {
72- if ( _presenter is null || _parent is null )
65+ if ( _parent is null )
7366 {
7467 return default ;
7568 }
7669
77- var lineIndex = _presenter . TextLayout . GetLineIndexFromCharacterIndex ( _parent . CaretIndex , false ) ;
78-
79- var textLine = _presenter . TextLayout . TextLines [ lineIndex ] ;
80-
81- var lineStart = textLine . FirstTextSourceIndex ;
82-
83- var selectionStart = Math . Max ( 0 , _parent . SelectionStart - lineStart ) ;
84-
85- var selectionEnd = Math . Max ( 0 , _parent . SelectionEnd - lineStart ) ;
86-
87- return new TextSelection ( selectionStart , selectionEnd ) ;
70+ return new TextSelection ( _parent . SelectionStart , _parent . SelectionEnd ) ;
8871 }
8972 set
9073 {
91- if ( _parent is null || _presenter is null )
74+ if ( _parent is null )
9275 {
9376 return ;
9477 }
9578
96- var lineIndex = _presenter . TextLayout . GetLineIndexFromCharacterIndex ( _parent . CaretIndex , false ) ;
97-
98- var textLine = _presenter . TextLayout . TextLines [ lineIndex ] ;
99-
100- var lineStart = textLine . FirstTextSourceIndex ;
101-
102- var selectionStart = lineStart + value . Start ;
103- var selectionEnd = lineStart + value . End ;
104-
105- _parent . SelectionStart = selectionStart ;
106- _parent . SelectionEnd = selectionEnd ;
79+ _parent . SelectionStart = value . Start ;
80+ _parent . SelectionEnd = value . End ;
10781
10882 RaiseSelectionChanged ( ) ;
10983 }
@@ -136,7 +110,10 @@ public void SetPresenter(TextPresenter? presenter, TextBox? parent)
136110 oldPresenter . CurrentImClient = null ;
137111 oldPresenter . ClearValue ( TextPresenter . PreeditTextProperty ) ;
138112
139- oldPresenter . CaretBoundsChanged -= ( s , e ) => RaiseCursorRectangleChanged ( ) ;
113+ if ( _caretBoundsChangedHandler is not null )
114+ {
115+ oldPresenter . CaretBoundsChanged -= _caretBoundsChangedHandler ;
116+ }
140117 }
141118
142119 _presenter = presenter ;
@@ -145,14 +122,20 @@ public void SetPresenter(TextPresenter? presenter, TextBox? parent)
145122 {
146123
147124 _presenter . CurrentImClient = this ;
148- _presenter . CaretBoundsChanged += ( s , e ) => RaiseCursorRectangleChanged ( ) ;
125+ _caretBoundsChangedHandler ??= OnPresenterCaretBoundsChanged ;
126+ _presenter . CaretBoundsChanged += _caretBoundsChangedHandler ;
149127 }
150128
151129 RaiseTextViewVisualChanged ( ) ;
152130
153131 RaiseCursorRectangleChanged ( ) ;
154132 }
155133
134+ private void OnPresenterCaretBoundsChanged ( object ? sender , EventArgs e )
135+ {
136+ RaiseCursorRectangleChanged ( ) ;
137+ }
138+
156139 private void OnParentTapped ( object ? sender , Input . TappedEventArgs e )
157140 {
158141 RaiseInputPaneActivationRequested ( ) ;
@@ -171,30 +154,6 @@ public override void SetPreeditText(string? preeditText, int? cursorPos)
171154 _presenter . SetCurrentValue ( TextPresenter . PreeditTextCursorPositionProperty , cursorPos ) ;
172155 }
173156
174- private static string GetTextLineText ( TextLine textLine )
175- {
176- if ( textLine . Length == 0 )
177- {
178- return string . Empty ;
179- }
180-
181- var builder = StringBuilderCache . Acquire ( textLine . Length ) ;
182-
183- foreach ( var run in textLine . TextRuns )
184- {
185- if ( run . Length > 0 )
186- {
187- builder . Append ( run . Text . Span ) ;
188- }
189- }
190-
191- var lineText = builder . ToString ( ) ;
192-
193- StringBuilderCache . Release ( builder ) ;
194-
195- return lineText ;
196- }
197-
198157 public override void ExecuteContextMenuAction ( ContextMenuAction action )
199158 {
200159 base . ExecuteContextMenuAction ( action ) ;
0 commit comments