2 * Copyright(c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 using System.ComponentModel;
20 using System.Runtime.InteropServices;
22 namespace Tizen.NUI.BaseComponents
25 /// A control which provides a multi-line editable text editor.
27 /// <since_tizen> 3 </since_tizen>
28 public partial class TextEditor
30 private EventHandler<TextChangedEventArgs> textEditorTextChangedEventHandler;
31 private TextChangedCallbackDelegate textEditorTextChangedCallbackDelegate;
33 private EventHandler<ScrollStateChangedEventArgs> textEditorScrollStateChangedEventHandler;
34 private ScrollStateChangedCallbackDelegate textEditorScrollStateChangedCallbackDelegate;
36 private EventHandler textEditorCursorPositionChangedEventHandler;
37 private CursorPositionChangedCallbackDelegate textEditorCursorPositionChangedCallbackDelegate;
39 private EventHandler<MaxLengthReachedEventArgs> textEditorMaxLengthReachedEventHandler;
40 private MaxLengthReachedCallbackDelegate textEditorMaxLengthReachedCallbackDelegate;
42 private EventHandler<AnchorClickedEventArgs> textEditorAnchorClickedEventHandler;
43 private AnchorClickedCallbackDelegate textEditorAnchorClickedCallbackDelegate;
45 private EventHandler textEditorSelectionClearedEventHandler;
46 private SelectionClearedCallbackDelegate textEditorSelectionClearedCallbackDelegate;
48 private EventHandler textEditorSelectionChangedEventHandler;
49 private SelectionChangedCallbackDelegate textEditorSelectionChangedCallbackDelegate;
51 private EventHandler<InputFilteredEventArgs> textEditorInputFilteredEventHandler;
52 private InputFilteredCallbackDelegate textEditorInputFilteredCallbackDelegate;
54 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
55 private delegate void TextChangedCallbackDelegate(IntPtr textEditor);
57 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
58 private delegate void ScrollStateChangedCallbackDelegate(IntPtr textEditor, ScrollState state);
60 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
61 private delegate void CursorPositionChangedCallbackDelegate(IntPtr textEditor, uint oldPosition);
63 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
64 private delegate void MaxLengthReachedCallbackDelegate(IntPtr textEditor);
66 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
67 private delegate void SelectionClearedCallbackDelegate(IntPtr textEditor);
69 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
70 private delegate void AnchorClickedCallbackDelegate(IntPtr textEditor, IntPtr href, uint hrefLength);
72 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
73 private delegate void SelectionChangedCallbackDelegate(IntPtr textEditor, uint oldStart, uint oldEnd);
75 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
76 private delegate void InputFilteredCallbackDelegate(IntPtr textEditor, InputFilterType type);
79 /// An event for the TextChanged signal which can be used to subscribe or unsubscribe the event handler
80 /// provided by the user. The TextChanged signal is emitted when the text changes.<br />
82 /// <since_tizen> 3 </since_tizen>
83 public event EventHandler<TextChangedEventArgs> TextChanged
87 if (textEditorTextChangedEventHandler == null)
89 textEditorTextChangedCallbackDelegate = (OnTextChanged);
90 TextChangedSignal().Connect(textEditorTextChangedCallbackDelegate);
92 textEditorTextChangedEventHandler += value;
96 textEditorTextChangedEventHandler -= value;
97 if (textEditorTextChangedEventHandler == null && TextChangedSignal().Empty() == false)
99 TextChangedSignal().Disconnect(textEditorTextChangedCallbackDelegate);
105 /// Event for the ScrollStateChanged signal which can be used to subscribe or unsubscribe the event handler
106 /// provided by the user. The ScrollStateChanged signal is emitted when the scroll state changes.<br />
108 /// <since_tizen> 3 </since_tizen>
109 public event EventHandler<ScrollStateChangedEventArgs> ScrollStateChanged
113 if (textEditorScrollStateChangedEventHandler == null)
115 textEditorScrollStateChangedCallbackDelegate = OnScrollStateChanged;
116 ScrollStateChangedSignal(this).Connect(textEditorScrollStateChangedCallbackDelegate);
118 textEditorScrollStateChangedEventHandler += value;
122 textEditorScrollStateChangedEventHandler -= value;
123 if (textEditorScrollStateChangedEventHandler == null && ScrollStateChangedSignal(this).Empty() == false)
125 ScrollStateChangedSignal(this).Disconnect(textEditorScrollStateChangedCallbackDelegate);
131 /// The CursorPositionChanged event is emitted whenever the primary cursor position changed.
133 /// <since_tizen> 9 </since_tizen>
134 public event EventHandler CursorPositionChanged
138 if (textEditorCursorPositionChangedEventHandler == null)
140 textEditorCursorPositionChangedCallbackDelegate = (OnCursorPositionChanged);
141 CursorPositionChangedSignal().Connect(textEditorCursorPositionChangedCallbackDelegate);
143 textEditorCursorPositionChangedEventHandler += value;
147 if (textEditorCursorPositionChangedEventHandler == null && CursorPositionChangedSignal().Empty() == false)
149 this.CursorPositionChangedSignal().Disconnect(textEditorCursorPositionChangedCallbackDelegate);
151 textEditorCursorPositionChangedEventHandler -= value;
156 /// The MaxLengthReached event.
158 /// This will be public opened in tizen_6.5 after ACR done. Before ACR, need to be hidden as inhouse API.
159 [EditorBrowsable(EditorBrowsableState.Never)]
160 public event EventHandler<MaxLengthReachedEventArgs> MaxLengthReached
164 if (textEditorMaxLengthReachedEventHandler == null)
166 textEditorMaxLengthReachedCallbackDelegate = (OnMaxLengthReached);
167 MaxLengthReachedSignal().Connect(textEditorMaxLengthReachedCallbackDelegate);
169 textEditorMaxLengthReachedEventHandler += value;
173 if (textEditorMaxLengthReachedEventHandler == null && MaxLengthReachedSignal().Empty() == false)
175 this.MaxLengthReachedSignal().Disconnect(textEditorMaxLengthReachedCallbackDelegate);
177 textEditorMaxLengthReachedEventHandler -= value;
182 /// The AnchorClicked signal is emitted when the anchor is clicked.
184 /// <since_tizen> 9 </since_tizen>
185 public event EventHandler<AnchorClickedEventArgs> AnchorClicked
189 if (textEditorAnchorClickedEventHandler == null)
191 textEditorAnchorClickedCallbackDelegate = (OnAnchorClicked);
192 AnchorClickedSignal().Connect(textEditorAnchorClickedCallbackDelegate);
194 textEditorAnchorClickedEventHandler += value;
198 textEditorAnchorClickedEventHandler -= value;
199 if (textEditorAnchorClickedEventHandler == null && AnchorClickedSignal().Empty() == false)
201 AnchorClickedSignal().Disconnect(textEditorAnchorClickedCallbackDelegate);
207 /// The SelectionCleared signal is emitted when selection is cleared.
209 /// <since_tizen> 9 </since_tizen>
210 public event EventHandler SelectionCleared
214 if (textEditorSelectionClearedEventHandler == null)
216 textEditorSelectionClearedCallbackDelegate = (OnSelectionCleared);
217 SelectionClearedSignal().Connect(textEditorSelectionClearedCallbackDelegate);
219 textEditorSelectionClearedEventHandler += value;
223 if (textEditorSelectionClearedEventHandler == null && SelectionClearedSignal().Empty() == false)
225 this.SelectionClearedSignal().Disconnect(textEditorSelectionClearedCallbackDelegate);
227 textEditorSelectionClearedEventHandler -= value;
232 /// The SelectionChanged signal is emitted whenever the selected text changed.
234 /// <since_tizen> 9 </since_tizen>
235 public event EventHandler SelectionChanged
239 if (textEditorSelectionChangedEventHandler == null)
241 textEditorSelectionChangedCallbackDelegate = (OnSelectionChanged);
242 SelectionChangedSignal().Connect(textEditorSelectionChangedCallbackDelegate);
244 textEditorSelectionChangedEventHandler += value;
248 if (textEditorSelectionChangedEventHandler == null && SelectionChangedSignal().Empty() == false)
250 this.SelectionChangedSignal().Disconnect(textEditorSelectionChangedCallbackDelegate);
252 textEditorSelectionChangedEventHandler -= value;
257 /// The InputFiltered signal is emitted when the input is filtered by InputFilter. <br />
260 /// See <see cref="InputFilterType"/> and <see cref="InputFilteredEventArgs"/> for a detailed description. <br />
263 /// The following example demonstrates how to use the InputFiltered event.
265 /// editor.InputFiltered += (s, e) =>
267 /// if (e.Type == InputFilterType.Accept)
269 /// // If input is filtered by InputFilter of Accept type.
271 /// else if (e.Type == InputFilterType.Reject)
273 /// // If input is filtered by InputFilter of Reject type.
278 /// <since_tizen> 9 </since_tizen>
279 public event EventHandler<InputFilteredEventArgs> InputFiltered
283 if (textEditorInputFilteredEventHandler == null)
285 textEditorInputFilteredCallbackDelegate = (OnInputFiltered);
286 InputFilteredSignal().Connect(textEditorInputFilteredCallbackDelegate);
288 textEditorInputFilteredEventHandler += value;
292 textEditorInputFilteredEventHandler -= value;
293 if (textEditorInputFilteredEventHandler == null && InputFilteredSignal().Empty() == false)
295 InputFilteredSignal().Disconnect(textEditorInputFilteredCallbackDelegate);
300 internal TextEditorSignal SelectionClearedSignal()
302 TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.SelectionClearedSignal(SwigCPtr), false);
303 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
307 internal TextEditorSignal TextChangedSignal()
309 TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.TextChangedSignal(SwigCPtr), false);
310 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
314 internal ScrollStateChangedSignal ScrollStateChangedSignal(TextEditor textEditor)
316 ScrollStateChangedSignal ret = new ScrollStateChangedSignal(Interop.TextEditor.ScrollStateChangedSignal(TextEditor.getCPtr(textEditor)), false);
317 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
321 internal TextEditorSignal CursorPositionChangedSignal()
323 TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.CursorPositionChangedSignal(SwigCPtr), false);
324 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
328 internal TextEditorSignal MaxLengthReachedSignal()
330 TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.MaxLengthReachedSignal(SwigCPtr), false);
331 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
335 internal TextEditorSignal AnchorClickedSignal()
337 TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.AnchorClickedSignal(SwigCPtr), false);
338 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
342 internal TextEditorSignal SelectionChangedSignal()
344 TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.SelectionChangedSignal(SwigCPtr), false);
345 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
349 internal TextEditorSignal InputFilteredSignal()
351 TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.InputFilteredSignal(SwigCPtr), false);
352 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
356 private void OnTextChanged(IntPtr textEditor)
358 if (textEditorTextChangedEventHandler != null)
360 TextChangedEventArgs e = new TextChangedEventArgs();
362 // Populate all members of "e" (TextChangedEventArgs) with real data
363 e.TextEditor = Registry.GetManagedBaseHandleFromNativePtr(textEditor) as TextEditor;
364 //here we send all data to user event handlers
365 textEditorTextChangedEventHandler(this, e);
369 private void OnSelectionCleared(IntPtr textEditor)
371 //no data to be sent to the user
372 textEditorSelectionClearedEventHandler?.Invoke(this, EventArgs.Empty);
375 private void OnScrollStateChanged(IntPtr textEditor, ScrollState state)
377 if (textEditorScrollStateChangedEventHandler != null)
379 ScrollStateChangedEventArgs e = new ScrollStateChangedEventArgs();
381 if (textEditor != global::System.IntPtr.Zero)
383 // Populate all members of "e" (ScrollStateChangedEventArgs) with real data
384 e.TextEditor = Registry.GetManagedBaseHandleFromNativePtr(textEditor) as TextEditor;
385 e.ScrollState = state;
387 //here we send all data to user event handlers
388 textEditorScrollStateChangedEventHandler(this, e);
392 private void OnCursorPositionChanged(IntPtr textEditor, uint oldPosition)
394 // no data to be sent to the user, as in NUI there is no event provide old values.
395 textEditorCursorPositionChangedEventHandler?.Invoke(this, EventArgs.Empty);
398 private void OnMaxLengthReached(IntPtr textEditor)
400 if (textEditorMaxLengthReachedEventHandler != null)
402 MaxLengthReachedEventArgs e = new MaxLengthReachedEventArgs();
404 // Populate all members of "e" (MaxLengthReachedEventArgs) with real data
405 e.TextEditor = Registry.GetManagedBaseHandleFromNativePtr(textEditor) as TextEditor;
406 //here we send all data to user event handlers
407 textEditorMaxLengthReachedEventHandler(this, e);
411 private void OnAnchorClicked(IntPtr textEditor, IntPtr href, uint hrefLength)
413 // Note: hrefLength is useful for get the length of a const char* (href) in dali-toolkit.
414 // But NUI can get the length of string (href), so hrefLength is not necessary in NUI.
415 AnchorClickedEventArgs e = new AnchorClickedEventArgs();
417 // Populate all members of "e" (AnchorClickedEventArgs) with real data
418 e.Href = Marshal.PtrToStringAnsi(href);
419 //here we send all data to user event handlers
420 textEditorAnchorClickedEventHandler?.Invoke(this, e);
423 private void OnSelectionChanged(IntPtr textEditor, uint oldStart, uint oldEnd)
425 // no data to be sent to the user, as in NUI there is no event provide old values.
426 textEditorSelectionChangedEventHandler?.Invoke(this, EventArgs.Empty);
429 private void OnInputFiltered(IntPtr textEditor, InputFilterType type)
431 InputFilteredEventArgs e = new InputFilteredEventArgs();
433 // Populate all members of "e" (InputFilteredEventArgs) with real data
435 //here we send all data to user event handlers
436 textEditorInputFilteredEventHandler?.Invoke(this, e);
440 /// Event arguments that passed via the TextChanged signal.
442 /// <since_tizen> 3 </since_tizen>
443 public class TextChangedEventArgs : EventArgs
445 private TextEditor textEditor;
448 /// TextEditor - is the texteditor control which has the text contents changed.
450 /// <since_tizen> 3 </since_tizen>
451 public TextEditor TextEditor
465 /// Event arguments that passed via the ScrollStateChanged signal.
467 /// <since_tizen> 3 </since_tizen>
468 public class ScrollStateChangedEventArgs : EventArgs
470 private TextEditor textEditor;
471 private ScrollState scrollState;
474 /// TextEditor - is the texteditor control which has the scroll state changed.
476 /// <since_tizen> 3 </since_tizen>
477 public TextEditor TextEditor
490 /// ScrollState - is the texteditor control scroll state.
492 /// <since_tizen> 3 </since_tizen>
493 public ScrollState ScrollState
507 /// The MaxLengthReached event arguments.
509 /// This will be public opened in tizen_6.5 after ACR done. Before ACR, need to be hidden as inhouse API.
510 [EditorBrowsable(EditorBrowsableState.Never)]
511 public class MaxLengthReachedEventArgs : EventArgs
513 private TextEditor textEditor;
518 /// This will be public opened in tizen_6.5 after ACR done. Before ACR, need to be hidden as inhouse API.
519 [EditorBrowsable(EditorBrowsableState.Never)]
520 public TextEditor TextEditor