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 single line editable text field.
27 /// <since_tizen> 3 </since_tizen>
28 public partial class TextField
30 private EventHandler<TextChangedEventArgs> textFieldTextChangedEventHandler;
31 private TextChangedCallbackDelegate textFieldTextChangedCallbackDelegate;
32 private EventHandler textFieldCursorPositionChangedEventHandler;
33 private CursorPositionChangedCallbackDelegate textFieldCursorPositionChangedCallbackDelegate;
34 private EventHandler<MaxLengthReachedEventArgs> textFieldMaxLengthReachedEventHandler;
35 private MaxLengthReachedCallbackDelegate textFieldMaxLengthReachedCallbackDelegate;
36 private EventHandler<AnchorClickedEventArgs> textFieldAnchorClickedEventHandler;
37 private AnchorClickedCallbackDelegate textFieldAnchorClickedCallbackDelegate;
39 private EventHandler textFieldSelectionChangedEventHandler;
40 private SelectionChangedCallbackDelegate textFieldSelectionChangedCallbackDelegate;
42 private EventHandler<InputFilteredEventArgs> textFieldInputFilteredEventHandler;
43 private InputFilteredCallbackDelegate textFieldInputFilteredCallbackDelegate;
44 private EventHandler textFieldSelectionClearedEventHandler;
45 private SelectionClearedCallbackDelegate textFieldSelectionClearedCallbackDelegate;
47 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
48 private delegate void TextChangedCallbackDelegate(IntPtr textField);
50 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
51 private delegate void CursorPositionChangedCallbackDelegate(IntPtr textField, uint oldPosition);
53 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
54 private delegate void MaxLengthReachedCallbackDelegate(IntPtr textField);
56 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
57 private delegate void AnchorClickedCallbackDelegate(IntPtr textField, IntPtr href, uint hrefLength);
59 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
60 private delegate void SelectionChangedCallbackDelegate(IntPtr textField, uint oldStart, uint oldEnd);
62 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
63 private delegate void InputFilteredCallbackDelegate(IntPtr textField, InputFilterType type);
65 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
66 private delegate void SelectionClearedCallbackDelegate(IntPtr textField);
69 /// The TextChanged event.
71 /// <since_tizen> 3 </since_tizen>
72 public event EventHandler<TextChangedEventArgs> TextChanged
76 if (textFieldTextChangedEventHandler == null)
78 textFieldTextChangedCallbackDelegate = (OnTextChanged);
79 TextChangedSignal().Connect(textFieldTextChangedCallbackDelegate);
81 textFieldTextChangedEventHandler += value;
85 textFieldTextChangedEventHandler -= value;
86 if (textFieldTextChangedEventHandler == null && TextChangedSignal().Empty() == false)
88 TextChangedSignal().Disconnect(textFieldTextChangedCallbackDelegate);
94 /// The CursorPositionChanged event.
96 /// This will be public opened after ACR done. Before ACR, need to be hidden as inhouse API.
97 [EditorBrowsable(EditorBrowsableState.Never)]
98 public event EventHandler CursorPositionChanged
102 if (textFieldCursorPositionChangedEventHandler == null)
104 textFieldCursorPositionChangedCallbackDelegate = (OnCursorPositionChanged);
105 CursorPositionChangedSignal().Connect(textFieldCursorPositionChangedCallbackDelegate);
107 textFieldCursorPositionChangedEventHandler += value;
111 if (textFieldCursorPositionChangedEventHandler == null && CursorPositionChangedSignal().Empty() == false)
113 this.CursorPositionChangedSignal().Disconnect(textFieldCursorPositionChangedCallbackDelegate);
115 textFieldCursorPositionChangedEventHandler -= value;
120 /// The MaxLengthReached event.
122 /// <since_tizen> 3 </since_tizen>
123 public event EventHandler<MaxLengthReachedEventArgs> MaxLengthReached
127 if (textFieldMaxLengthReachedEventHandler == null)
129 textFieldMaxLengthReachedCallbackDelegate = (OnMaxLengthReached);
130 MaxLengthReachedSignal().Connect(textFieldMaxLengthReachedCallbackDelegate);
132 textFieldMaxLengthReachedEventHandler += value;
136 if (textFieldMaxLengthReachedEventHandler == null && MaxLengthReachedSignal().Empty() == false)
138 this.MaxLengthReachedSignal().Disconnect(textFieldMaxLengthReachedCallbackDelegate);
140 textFieldMaxLengthReachedEventHandler -= value;
145 /// The SelectionCleared signal is emitted when selection is cleared.
147 /// This will be public opened after ACR done. Before ACR, need to be hidden as inhouse API.
148 [EditorBrowsable(EditorBrowsableState.Never)]
149 public event EventHandler SelectionCleared
153 if (textFieldSelectionClearedEventHandler == null)
155 textFieldSelectionClearedCallbackDelegate = (OnSelectionCleared);
156 SelectionClearedSignal().Connect(textFieldSelectionClearedCallbackDelegate);
158 textFieldSelectionClearedEventHandler += value;
162 if (textFieldSelectionClearedEventHandler == null && SelectionClearedSignal().Empty() == false)
164 this.SelectionClearedSignal().Disconnect(textFieldSelectionClearedCallbackDelegate);
166 textFieldSelectionClearedEventHandler -= 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 (textFieldAnchorClickedEventHandler == null)
180 textFieldAnchorClickedCallbackDelegate = (OnAnchorClicked);
181 AnchorClickedSignal().Connect(textFieldAnchorClickedCallbackDelegate);
183 textFieldAnchorClickedEventHandler += value;
187 textFieldAnchorClickedEventHandler -= value;
188 if (textFieldAnchorClickedEventHandler == null && AnchorClickedSignal().Empty() == false)
190 AnchorClickedSignal().Disconnect(textFieldAnchorClickedCallbackDelegate);
196 /// The SelectionChanged event.
198 /// This will be public opened after ACR done. Before ACR, need to be hidden as inhouse API.
199 [EditorBrowsable(EditorBrowsableState.Never)]
200 public event EventHandler SelectionChanged
204 if (textFieldSelectionChangedEventHandler == null)
206 textFieldSelectionChangedCallbackDelegate = (OnSelectionChanged);
207 SelectionChangedSignal().Connect(textFieldSelectionChangedCallbackDelegate);
209 textFieldSelectionChangedEventHandler += value;
213 if (textFieldSelectionChangedEventHandler == null && SelectionChangedSignal().Empty() == false)
215 this.SelectionChangedSignal().Disconnect(textFieldSelectionChangedCallbackDelegate);
217 textFieldSelectionChangedEventHandler -= value;
222 /// The InputFiltered signal is emitted when the input is filtered by InputFilter. <br />
225 /// See <see cref="InputFilterType"/> and <see cref="InputFilteredEventArgs"/> for a detailed description. <br />
228 /// The following example demonstrates how to use the InputFiltered event.
230 /// field.InputFiltered += (s, e) =>
232 /// if (e.Type == InputFilterType.Accept)
234 /// // If input is filtered by InputFilter of Accept type.
236 /// else if (e.Type == InputFilterType.Reject)
238 /// // If input is filtered by InputFilter of Reject type.
243 [EditorBrowsable(EditorBrowsableState.Never)]
244 public event EventHandler<InputFilteredEventArgs> InputFiltered
248 if (textFieldInputFilteredEventHandler == null)
250 textFieldInputFilteredCallbackDelegate = (OnInputFiltered);
251 InputFilteredSignal().Connect(textFieldInputFilteredCallbackDelegate);
253 textFieldInputFilteredEventHandler += value;
257 textFieldInputFilteredEventHandler -= value;
258 if (textFieldInputFilteredEventHandler == null && InputFilteredSignal().Empty() == false)
260 InputFilteredSignal().Disconnect(textFieldInputFilteredCallbackDelegate);
265 internal TextFieldSignal SelectionClearedSignal()
267 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.SelectionClearedSignal(SwigCPtr), false);
268 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
272 internal TextFieldSignal TextChangedSignal()
274 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.TextChangedSignal(SwigCPtr), false);
275 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
279 internal TextFieldSignal CursorPositionChangedSignal()
281 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.CursorPositionChangedSignal(SwigCPtr), false);
282 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
286 internal TextFieldSignal MaxLengthReachedSignal()
288 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.MaxLengthReachedSignal(SwigCPtr), false);
289 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
293 internal TextFieldSignal AnchorClickedSignal()
295 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.AnchorClickedSignal(SwigCPtr), false);
296 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
300 internal TextFieldSignal SelectionChangedSignal()
302 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.SelectionChangedSignal(SwigCPtr), false);
303 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
307 internal TextFieldSignal InputFilteredSignal()
309 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.InputFilteredSignal(SwigCPtr), false);
310 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
314 private void OnSelectionCleared(IntPtr textField)
316 //no data to be sent to the user
317 textFieldSelectionClearedEventHandler?.Invoke(this, EventArgs.Empty);
320 private void OnTextChanged(IntPtr textField)
322 if (textFieldTextChangedEventHandler != null)
324 TextChangedEventArgs e = new TextChangedEventArgs();
326 // Populate all members of "e" (TextChangedEventArgs) with real data
327 e.TextField = Registry.GetManagedBaseHandleFromNativePtr(textField) as TextField;
328 //here we send all data to user event handlers
329 textFieldTextChangedEventHandler(this, e);
333 private void OnCursorPositionChanged(IntPtr textField, uint oldPosition)
335 // no data to be sent to the user, as in NUI there is no event provide old values.
336 textFieldCursorPositionChangedEventHandler?.Invoke(this, EventArgs.Empty);
339 private void OnMaxLengthReached(IntPtr textField)
341 if (textFieldMaxLengthReachedEventHandler != null)
343 MaxLengthReachedEventArgs e = new MaxLengthReachedEventArgs();
345 // Populate all members of "e" (MaxLengthReachedEventArgs) with real data
346 e.TextField = Registry.GetManagedBaseHandleFromNativePtr(textField) as TextField;
347 //here we send all data to user event handlers
348 textFieldMaxLengthReachedEventHandler(this, e);
352 private void OnAnchorClicked(IntPtr textField, IntPtr href, uint hrefLength)
354 // Note: hrefLength is useful for get the length of a const char* (href) in dali-toolkit.
355 // But NUI can get the length of string (href), so hrefLength is not necessary in NUI.
356 AnchorClickedEventArgs e = new AnchorClickedEventArgs();
358 // Populate all members of "e" (AnchorClickedEventArgs) with real data
359 e.Href = Marshal.PtrToStringAnsi(href);
360 //here we send all data to user event handlers
361 textFieldAnchorClickedEventHandler?.Invoke(this, e);
364 private void OnSelectionChanged(IntPtr textField, uint oldStart, uint oldEnd)
366 // no data to be sent to the user, as in NUI there is no event provide old values.
367 textFieldSelectionChangedEventHandler?.Invoke(this, EventArgs.Empty);
370 private void OnInputFiltered(IntPtr textField, InputFilterType type)
372 InputFilteredEventArgs e = new InputFilteredEventArgs();
374 // Populate all members of "e" (InputFilteredEventArgs) with real data
376 //here we send all data to user event handlers
377 textFieldInputFilteredEventHandler?.Invoke(this, e);
381 /// The TextChanged event arguments.
383 /// <since_tizen> 3 </since_tizen>
384 public class TextChangedEventArgs : EventArgs
386 private TextField textField;
391 /// <since_tizen> 3 </since_tizen>
392 public TextField TextField
406 /// The MaxLengthReached event arguments.
408 /// <since_tizen> 3 </since_tizen>
409 public class MaxLengthReachedEventArgs : EventArgs
411 private TextField textField;
416 /// <since_tizen> 3 </since_tizen>
417 public TextField TextField