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<CursorPositionChangedEventArgs> 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<InputFilteredEventArgs> textEditorInputFilteredEventHandler;
46 private InputFilteredCallbackDelegate textEditorInputFilteredCallbackDelegate;
48 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
49 private delegate void TextChangedCallbackDelegate(IntPtr textEditor);
51 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
52 private delegate void ScrollStateChangedCallbackDelegate(IntPtr textEditor, ScrollState state);
54 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
55 private delegate void CursorPositionChangedCallbackDelegate(IntPtr textEditor, uint oldPosition);
57 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
58 private delegate void MaxLengthReachedCallbackDelegate(IntPtr textEditor);
60 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
61 private delegate void AnchorClickedCallbackDelegate(IntPtr textEditor, IntPtr href, uint hrefLength);
63 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
64 private delegate void InputFilteredCallbackDelegate(IntPtr textEditor, InputFilterType type);
67 /// An event for the TextChanged signal which can be used to subscribe or unsubscribe the event handler
68 /// provided by the user. The TextChanged signal is emitted when the text changes.<br />
70 /// <since_tizen> 3 </since_tizen>
71 public event EventHandler<TextChangedEventArgs> TextChanged
75 if (textEditorTextChangedEventHandler == null)
77 textEditorTextChangedCallbackDelegate = (OnTextChanged);
78 TextChangedSignal().Connect(textEditorTextChangedCallbackDelegate);
80 textEditorTextChangedEventHandler += value;
84 textEditorTextChangedEventHandler -= value;
85 if (textEditorTextChangedEventHandler == null && TextChangedSignal().Empty() == false)
87 TextChangedSignal().Disconnect(textEditorTextChangedCallbackDelegate);
93 /// Event for the ScrollStateChanged signal which can be used to subscribe or unsubscribe the event handler
94 /// provided by the user. The ScrollStateChanged signal is emitted when the scroll state changes.<br />
96 /// <since_tizen> 3 </since_tizen>
97 public event EventHandler<ScrollStateChangedEventArgs> ScrollStateChanged
101 if (textEditorScrollStateChangedEventHandler == null)
103 textEditorScrollStateChangedCallbackDelegate = OnScrollStateChanged;
104 ScrollStateChangedSignal(this).Connect(textEditorScrollStateChangedCallbackDelegate);
106 textEditorScrollStateChangedEventHandler += value;
110 textEditorScrollStateChangedEventHandler -= value;
111 if (textEditorScrollStateChangedEventHandler == null && ScrollStateChangedSignal(this).Empty() == false)
113 ScrollStateChangedSignal(this).Disconnect(textEditorScrollStateChangedCallbackDelegate);
119 /// The CursorPositionChanged event.
121 /// This will be public opened after ACR done. Before ACR, need to be hidden as inhouse API.
122 [EditorBrowsable(EditorBrowsableState.Never)]
123 public event EventHandler<CursorPositionChangedEventArgs> CursorPositionChanged
127 if (textEditorCursorPositionChangedEventHandler == null)
129 textEditorCursorPositionChangedCallbackDelegate = (OnCursorPositionChanged);
130 CursorPositionChangedSignal().Connect(textEditorCursorPositionChangedCallbackDelegate);
132 textEditorCursorPositionChangedEventHandler += value;
136 if (textEditorCursorPositionChangedEventHandler == null && CursorPositionChangedSignal().Empty() == false)
138 this.CursorPositionChangedSignal().Disconnect(textEditorCursorPositionChangedCallbackDelegate);
140 textEditorCursorPositionChangedEventHandler -= value;
145 /// The MaxLengthReached event.
147 /// This will be public opened in tizen_6.5 after ACR done. Before ACR, need to be hidden as inhouse API.
148 [EditorBrowsable(EditorBrowsableState.Never)]
149 public event EventHandler<MaxLengthReachedEventArgs> MaxLengthReached
153 if (textEditorMaxLengthReachedEventHandler == null)
155 textEditorMaxLengthReachedCallbackDelegate = (OnMaxLengthReached);
156 MaxLengthReachedSignal().Connect(textEditorMaxLengthReachedCallbackDelegate);
158 textEditorMaxLengthReachedEventHandler += value;
162 if (textEditorMaxLengthReachedEventHandler == null && MaxLengthReachedSignal().Empty() == false)
164 this.MaxLengthReachedSignal().Disconnect(textEditorMaxLengthReachedCallbackDelegate);
166 textEditorMaxLengthReachedEventHandler -= value;
171 /// The AnchorClicked signal is emitted when the anchor is clicked.
173 /// <since_tizen> 9 </since_tizen>
174 public event EventHandler<AnchorClickedEventArgs> AnchorClicked
178 if (textEditorAnchorClickedEventHandler == null)
180 textEditorAnchorClickedCallbackDelegate = (OnAnchorClicked);
181 AnchorClickedSignal().Connect(textEditorAnchorClickedCallbackDelegate);
183 textEditorAnchorClickedEventHandler += value;
187 textEditorAnchorClickedEventHandler -= value;
188 if (textEditorAnchorClickedEventHandler == null && AnchorClickedSignal().Empty() == false)
190 AnchorClickedSignal().Disconnect(textEditorAnchorClickedCallbackDelegate);
196 /// The InputFiltered signal is emitted when the input is filtered by InputFilter. <br />
199 /// See <see cref="InputFilterType"/> and <see cref="InputFilteredEventArgs"/> for a detailed description. <br />
202 /// The following example demonstrates how to use the InputFiltered event.
204 /// editor.InputFiltered += (s, e) =>
206 /// if (e.Type == InputFilterType.Accept)
208 /// // If input is filtered by InputFilter of Accept type.
210 /// else if (e.Type == InputFilterType.Reject)
212 /// // If input is filtered by InputFilter of Reject type.
217 [EditorBrowsable(EditorBrowsableState.Never)]
218 public event EventHandler<InputFilteredEventArgs> InputFiltered
222 if (textEditorInputFilteredEventHandler == null)
224 textEditorInputFilteredCallbackDelegate = (OnInputFiltered);
225 InputFilteredSignal().Connect(textEditorInputFilteredCallbackDelegate);
227 textEditorInputFilteredEventHandler += value;
231 textEditorInputFilteredEventHandler -= value;
232 if (textEditorInputFilteredEventHandler == null && InputFilteredSignal().Empty() == false)
234 InputFilteredSignal().Disconnect(textEditorInputFilteredCallbackDelegate);
239 internal TextEditorSignal TextChangedSignal()
241 TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.TextChangedSignal(SwigCPtr), false);
242 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
246 internal ScrollStateChangedSignal ScrollStateChangedSignal(TextEditor textEditor)
248 ScrollStateChangedSignal ret = new ScrollStateChangedSignal(Interop.TextEditor.ScrollStateChangedSignal(TextEditor.getCPtr(textEditor)), false);
249 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
253 internal TextEditorSignal CursorPositionChangedSignal()
255 TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.CursorPositionChangedSignal(SwigCPtr), false);
256 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
260 internal TextEditorSignal MaxLengthReachedSignal()
262 TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.MaxLengthReachedSignal(SwigCPtr), false);
263 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
267 internal TextEditorSignal AnchorClickedSignal()
269 TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.AnchorClickedSignal(SwigCPtr), false);
270 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
274 internal TextEditorSignal InputFilteredSignal()
276 TextEditorSignal ret = new TextEditorSignal(Interop.TextEditor.InputFilteredSignal(SwigCPtr), false);
277 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
281 private void OnTextChanged(IntPtr textEditor)
283 if (textEditorTextChangedEventHandler != null)
285 TextChangedEventArgs e = new TextChangedEventArgs();
287 // Populate all members of "e" (TextChangedEventArgs) with real data
288 e.TextEditor = Registry.GetManagedBaseHandleFromNativePtr(textEditor) as TextEditor;
289 //here we send all data to user event handlers
290 textEditorTextChangedEventHandler(this, e);
294 private void OnScrollStateChanged(IntPtr textEditor, ScrollState state)
296 if (textEditorScrollStateChangedEventHandler != null)
298 ScrollStateChangedEventArgs e = new ScrollStateChangedEventArgs();
300 if (textEditor != global::System.IntPtr.Zero)
302 // Populate all members of "e" (ScrollStateChangedEventArgs) with real data
303 e.TextEditor = Registry.GetManagedBaseHandleFromNativePtr(textEditor) as TextEditor;
304 e.ScrollState = state;
306 //here we send all data to user event handlers
307 textEditorScrollStateChangedEventHandler(this, e);
311 private void OnCursorPositionChanged(IntPtr textEditor, uint oldPosition)
313 if (textEditorCursorPositionChangedEventHandler != null)
315 CursorPositionChangedEventArgs e = new CursorPositionChangedEventArgs();
317 // Populate all members of "e" (CursorPositionChangedEventArgs) with real data
318 e.OldCursorPosition = oldPosition;
320 //here we send all data to user event handlers
321 textEditorCursorPositionChangedEventHandler?.Invoke(this, e);
325 private void OnMaxLengthReached(IntPtr textEditor)
327 if (textEditorMaxLengthReachedEventHandler != null)
329 MaxLengthReachedEventArgs e = new MaxLengthReachedEventArgs();
331 // Populate all members of "e" (MaxLengthReachedEventArgs) with real data
332 e.TextEditor = Registry.GetManagedBaseHandleFromNativePtr(textEditor) as TextEditor;
333 //here we send all data to user event handlers
334 textEditorMaxLengthReachedEventHandler(this, e);
338 private void OnAnchorClicked(IntPtr textEditor, IntPtr href, uint hrefLength)
340 // Note: hrefLength is useful for get the length of a const char* (href) in dali-toolkit.
341 // But NUI can get the length of string (href), so hrefLength is not necessary in NUI.
342 AnchorClickedEventArgs e = new AnchorClickedEventArgs();
344 // Populate all members of "e" (AnchorClickedEventArgs) with real data
345 e.Href = Marshal.PtrToStringAnsi(href);
346 //here we send all data to user event handlers
347 textEditorAnchorClickedEventHandler?.Invoke(this, e);
350 private void OnInputFiltered(IntPtr textEditor, InputFilterType type)
352 InputFilteredEventArgs e = new InputFilteredEventArgs();
354 // Populate all members of "e" (InputFilteredEventArgs) with real data
356 //here we send all data to user event handlers
357 textEditorInputFilteredEventHandler?.Invoke(this, e);
361 /// Event arguments that passed via the TextChanged signal.
363 /// <since_tizen> 3 </since_tizen>
364 public class TextChangedEventArgs : EventArgs
366 private TextEditor textEditor;
369 /// TextEditor - is the texteditor control which has the text contents changed.
371 /// <since_tizen> 3 </since_tizen>
372 public TextEditor TextEditor
386 /// Event arguments that passed via the ScrollStateChanged signal.
388 /// <since_tizen> 3 </since_tizen>
389 public class ScrollStateChangedEventArgs : EventArgs
391 private TextEditor textEditor;
392 private ScrollState scrollState;
395 /// TextEditor - is the texteditor control which has the scroll state changed.
397 /// <since_tizen> 3 </since_tizen>
398 public TextEditor TextEditor
411 /// ScrollState - is the texteditor control scroll state.
413 /// <since_tizen> 3 </since_tizen>
414 public ScrollState ScrollState
428 /// The MaxLengthReached event arguments.
430 /// This will be public opened in tizen_6.5 after ACR done. Before ACR, need to be hidden as inhouse API.
431 [EditorBrowsable(EditorBrowsableState.Never)]
432 public class MaxLengthReachedEventArgs : EventArgs
434 private TextEditor textEditor;
439 /// This will be public opened in tizen_6.5 after ACR done. Before ACR, need to be hidden as inhouse API.
440 [EditorBrowsable(EditorBrowsableState.Never)]
441 public TextEditor TextEditor