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;
45 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
46 private delegate void TextChangedCallbackDelegate(IntPtr textField);
48 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
49 private delegate void CursorPositionChangedCallbackDelegate(IntPtr textField, uint oldPosition);
51 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
52 private delegate void MaxLengthReachedCallbackDelegate(IntPtr textField);
54 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
55 private delegate void AnchorClickedCallbackDelegate(IntPtr textField, IntPtr href, uint hrefLength);
57 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
58 private delegate void SelectionChangedCallbackDelegate(IntPtr textField, uint oldStart, uint oldEnd);
60 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
61 private delegate void InputFilteredCallbackDelegate(IntPtr textField, InputFilterType type);
64 /// The TextChanged event.
66 /// <since_tizen> 3 </since_tizen>
67 public event EventHandler<TextChangedEventArgs> TextChanged
71 if (textFieldTextChangedEventHandler == null)
73 textFieldTextChangedCallbackDelegate = (OnTextChanged);
74 TextChangedSignal().Connect(textFieldTextChangedCallbackDelegate);
76 textFieldTextChangedEventHandler += value;
80 textFieldTextChangedEventHandler -= value;
81 if (textFieldTextChangedEventHandler == null && TextChangedSignal().Empty() == false)
83 TextChangedSignal().Disconnect(textFieldTextChangedCallbackDelegate);
89 /// The CursorPositionChanged event.
91 /// This will be public opened after ACR done. Before ACR, need to be hidden as inhouse API.
92 [EditorBrowsable(EditorBrowsableState.Never)]
93 public event EventHandler CursorPositionChanged
97 if (textFieldCursorPositionChangedEventHandler == null)
99 textFieldCursorPositionChangedCallbackDelegate = (OnCursorPositionChanged);
100 CursorPositionChangedSignal().Connect(textFieldCursorPositionChangedCallbackDelegate);
102 textFieldCursorPositionChangedEventHandler += value;
106 if (textFieldCursorPositionChangedEventHandler == null && CursorPositionChangedSignal().Empty() == false)
108 this.CursorPositionChangedSignal().Disconnect(textFieldCursorPositionChangedCallbackDelegate);
110 textFieldCursorPositionChangedEventHandler -= value;
115 /// The MaxLengthReached event.
117 /// <since_tizen> 3 </since_tizen>
118 public event EventHandler<MaxLengthReachedEventArgs> MaxLengthReached
122 if (textFieldMaxLengthReachedEventHandler == null)
124 textFieldMaxLengthReachedCallbackDelegate = (OnMaxLengthReached);
125 MaxLengthReachedSignal().Connect(textFieldMaxLengthReachedCallbackDelegate);
127 textFieldMaxLengthReachedEventHandler += value;
131 if (textFieldMaxLengthReachedEventHandler == null && MaxLengthReachedSignal().Empty() == false)
133 this.MaxLengthReachedSignal().Disconnect(textFieldMaxLengthReachedCallbackDelegate);
135 textFieldMaxLengthReachedEventHandler -= value;
140 /// The AnchorClicked signal is emitted when the anchor is clicked.
142 /// <since_tizen> 9 </since_tizen>
143 public event EventHandler<AnchorClickedEventArgs> AnchorClicked
147 if (textFieldAnchorClickedEventHandler == null)
149 textFieldAnchorClickedCallbackDelegate = (OnAnchorClicked);
150 AnchorClickedSignal().Connect(textFieldAnchorClickedCallbackDelegate);
152 textFieldAnchorClickedEventHandler += value;
156 textFieldAnchorClickedEventHandler -= value;
157 if (textFieldAnchorClickedEventHandler == null && AnchorClickedSignal().Empty() == false)
159 AnchorClickedSignal().Disconnect(textFieldAnchorClickedCallbackDelegate);
165 /// The SelectionChanged event.
167 /// This will be public opened after ACR done. Before ACR, need to be hidden as inhouse API.
168 [EditorBrowsable(EditorBrowsableState.Never)]
169 public event EventHandler SelectionChanged
173 if (textFieldSelectionChangedEventHandler == null)
175 textFieldSelectionChangedCallbackDelegate = (OnSelectionChanged);
176 SelectionChangedSignal().Connect(textFieldSelectionChangedCallbackDelegate);
178 textFieldSelectionChangedEventHandler += value;
182 if (textFieldSelectionChangedEventHandler == null && SelectionChangedSignal().Empty() == false)
184 this.SelectionChangedSignal().Disconnect(textFieldSelectionChangedCallbackDelegate);
186 textFieldSelectionChangedEventHandler -= value;
191 /// The InputFiltered signal is emitted when the input is filtered by InputFilter. <br />
194 /// See <see cref="InputFilterType"/> and <see cref="InputFilteredEventArgs"/> for a detailed description. <br />
197 /// The following example demonstrates how to use the InputFiltered event.
199 /// field.InputFiltered += (s, e) =>
201 /// if (e.Type == InputFilterType.Accept)
203 /// // If input is filtered by InputFilter of Accept type.
205 /// else if (e.Type == InputFilterType.Reject)
207 /// // If input is filtered by InputFilter of Reject type.
212 [EditorBrowsable(EditorBrowsableState.Never)]
213 public event EventHandler<InputFilteredEventArgs> InputFiltered
217 if (textFieldInputFilteredEventHandler == null)
219 textFieldInputFilteredCallbackDelegate = (OnInputFiltered);
220 InputFilteredSignal().Connect(textFieldInputFilteredCallbackDelegate);
222 textFieldInputFilteredEventHandler += value;
226 textFieldInputFilteredEventHandler -= value;
227 if (textFieldInputFilteredEventHandler == null && InputFilteredSignal().Empty() == false)
229 InputFilteredSignal().Disconnect(textFieldInputFilteredCallbackDelegate);
234 internal TextFieldSignal TextChangedSignal()
236 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.TextChangedSignal(SwigCPtr), false);
237 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
241 internal TextFieldSignal CursorPositionChangedSignal()
243 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.CursorPositionChangedSignal(SwigCPtr), false);
244 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
248 internal TextFieldSignal MaxLengthReachedSignal()
250 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.MaxLengthReachedSignal(SwigCPtr), false);
251 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
255 internal TextFieldSignal AnchorClickedSignal()
257 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.AnchorClickedSignal(SwigCPtr), false);
258 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
262 internal TextFieldSignal SelectionChangedSignal()
264 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.SelectionChangedSignal(SwigCPtr), false);
265 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
269 internal TextFieldSignal InputFilteredSignal()
271 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.InputFilteredSignal(SwigCPtr), false);
272 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
276 private void OnTextChanged(IntPtr textField)
278 if (textFieldTextChangedEventHandler != null)
280 TextChangedEventArgs e = new TextChangedEventArgs();
282 // Populate all members of "e" (TextChangedEventArgs) with real data
283 e.TextField = Registry.GetManagedBaseHandleFromNativePtr(textField) as TextField;
284 //here we send all data to user event handlers
285 textFieldTextChangedEventHandler(this, e);
289 private void OnCursorPositionChanged(IntPtr textField, uint oldPosition)
291 // no data to be sent to the user, as in NUI there is no event provide old values.
292 textFieldCursorPositionChangedEventHandler?.Invoke(this, EventArgs.Empty);
295 private void OnMaxLengthReached(IntPtr textField)
297 if (textFieldMaxLengthReachedEventHandler != null)
299 MaxLengthReachedEventArgs e = new MaxLengthReachedEventArgs();
301 // Populate all members of "e" (MaxLengthReachedEventArgs) with real data
302 e.TextField = Registry.GetManagedBaseHandleFromNativePtr(textField) as TextField;
303 //here we send all data to user event handlers
304 textFieldMaxLengthReachedEventHandler(this, e);
308 private void OnAnchorClicked(IntPtr textField, IntPtr href, uint hrefLength)
310 // Note: hrefLength is useful for get the length of a const char* (href) in dali-toolkit.
311 // But NUI can get the length of string (href), so hrefLength is not necessary in NUI.
312 AnchorClickedEventArgs e = new AnchorClickedEventArgs();
314 // Populate all members of "e" (AnchorClickedEventArgs) with real data
315 e.Href = Marshal.PtrToStringAnsi(href);
316 //here we send all data to user event handlers
317 textFieldAnchorClickedEventHandler?.Invoke(this, e);
320 private void OnSelectionChanged(IntPtr textField, uint oldStart, uint oldEnd)
322 // no data to be sent to the user, as in NUI there is no event provide old values.
323 textFieldSelectionChangedEventHandler?.Invoke(this, EventArgs.Empty);
326 private void OnInputFiltered(IntPtr textField, InputFilterType type)
328 InputFilteredEventArgs e = new InputFilteredEventArgs();
330 // Populate all members of "e" (InputFilteredEventArgs) with real data
332 //here we send all data to user event handlers
333 textFieldInputFilteredEventHandler?.Invoke(this, e);
337 /// The TextChanged event arguments.
339 /// <since_tizen> 3 </since_tizen>
340 public class TextChangedEventArgs : EventArgs
342 private TextField textField;
347 /// <since_tizen> 3 </since_tizen>
348 public TextField TextField
362 /// The MaxLengthReached event arguments.
364 /// <since_tizen> 3 </since_tizen>
365 public class MaxLengthReachedEventArgs : EventArgs
367 private TextField textField;
372 /// <since_tizen> 3 </since_tizen>
373 public TextField TextField