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<MaxLengthReachedEventArgs> textFieldMaxLengthReachedEventHandler;
33 private MaxLengthReachedCallbackDelegate textFieldMaxLengthReachedCallbackDelegate;
34 private EventHandler<AnchorClickedEventArgs> textFieldAnchorClickedEventHandler;
35 private AnchorClickedCallbackDelegate textFieldAnchorClickedCallbackDelegate;
37 private EventHandler<SelectionChangedEventArgs> textFieldSelectionChangedEventHandler;
38 private SelectionChangedCallbackDelegate textFieldSelectionChangedCallbackDelegate;
40 private EventHandler<InputFilteredEventArgs> textFieldInputFilteredEventHandler;
41 private InputFilteredCallbackDelegate textFieldInputFilteredCallbackDelegate;
43 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
44 private delegate void TextChangedCallbackDelegate(IntPtr textField);
46 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
47 private delegate void MaxLengthReachedCallbackDelegate(IntPtr textField);
49 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
50 private delegate void AnchorClickedCallbackDelegate(IntPtr textField, IntPtr href, uint hrefLength);
52 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
53 private delegate void SelectionChangedCallbackDelegate(IntPtr textField, uint oldStart, uint oldEnd);
55 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
56 private delegate void InputFilteredCallbackDelegate(IntPtr textField, InputFilterType type);
59 /// The TextChanged event.
61 /// <since_tizen> 3 </since_tizen>
62 public event EventHandler<TextChangedEventArgs> TextChanged
66 if (textFieldTextChangedEventHandler == null)
68 textFieldTextChangedCallbackDelegate = (OnTextChanged);
69 TextChangedSignal().Connect(textFieldTextChangedCallbackDelegate);
71 textFieldTextChangedEventHandler += value;
75 textFieldTextChangedEventHandler -= value;
76 if (textFieldTextChangedEventHandler == null && TextChangedSignal().Empty() == false)
78 TextChangedSignal().Disconnect(textFieldTextChangedCallbackDelegate);
84 /// The MaxLengthReached event.
86 /// <since_tizen> 3 </since_tizen>
87 public event EventHandler<MaxLengthReachedEventArgs> MaxLengthReached
91 if (textFieldMaxLengthReachedEventHandler == null)
93 textFieldMaxLengthReachedCallbackDelegate = (OnMaxLengthReached);
94 MaxLengthReachedSignal().Connect(textFieldMaxLengthReachedCallbackDelegate);
96 textFieldMaxLengthReachedEventHandler += value;
100 if (textFieldMaxLengthReachedEventHandler == null && MaxLengthReachedSignal().Empty() == false)
102 this.MaxLengthReachedSignal().Disconnect(textFieldMaxLengthReachedCallbackDelegate);
104 textFieldMaxLengthReachedEventHandler -= value;
109 /// The AnchorClicked signal is emitted when the anchor is clicked.
111 /// <since_tizen> 9 </since_tizen>
112 public event EventHandler<AnchorClickedEventArgs> AnchorClicked
116 if (textFieldAnchorClickedEventHandler == null)
118 textFieldAnchorClickedCallbackDelegate = (OnAnchorClicked);
119 AnchorClickedSignal().Connect(textFieldAnchorClickedCallbackDelegate);
121 textFieldAnchorClickedEventHandler += value;
125 textFieldAnchorClickedEventHandler -= value;
126 if (textFieldAnchorClickedEventHandler == null && AnchorClickedSignal().Empty() == false)
128 AnchorClickedSignal().Disconnect(textFieldAnchorClickedCallbackDelegate);
134 /// The SelectionChanged event.
136 /// This will be public opened after ACR done. Before ACR, need to be hidden as inhouse API.
137 [EditorBrowsable(EditorBrowsableState.Never)]
138 public event EventHandler<SelectionChangedEventArgs> SelectionChanged
142 if (textFieldSelectionChangedEventHandler == null)
144 textFieldSelectionChangedCallbackDelegate = (OnSelectionChanged);
145 SelectionChangedSignal().Connect(textFieldSelectionChangedCallbackDelegate);
147 textFieldSelectionChangedEventHandler += value;
151 if (textFieldSelectionChangedEventHandler == null && SelectionChangedSignal().Empty() == false)
153 this.SelectionChangedSignal().Disconnect(textFieldSelectionChangedCallbackDelegate);
155 textFieldSelectionChangedEventHandler -= value;
160 /// The InputFiltered signal is emitted when the input is filtered by InputFilter. <br />
163 /// See <see cref="InputFilterType"/> and <see cref="InputFilteredEventArgs"/> for a detailed description. <br />
166 /// The following example demonstrates how to use the InputFiltered event.
168 /// field.InputFiltered += (s, e) =>
170 /// if (e.Type == InputFilterType.Accept)
172 /// // If input is filtered by InputFilter of Accept type.
174 /// else if (e.Type == InputFilterType.Reject)
176 /// // If input is filtered by InputFilter of Reject type.
181 [EditorBrowsable(EditorBrowsableState.Never)]
182 public event EventHandler<InputFilteredEventArgs> InputFiltered
186 if (textFieldInputFilteredEventHandler == null)
188 textFieldInputFilteredCallbackDelegate = (OnInputFiltered);
189 InputFilteredSignal().Connect(textFieldInputFilteredCallbackDelegate);
191 textFieldInputFilteredEventHandler += value;
195 textFieldInputFilteredEventHandler -= value;
196 if (textFieldInputFilteredEventHandler == null && InputFilteredSignal().Empty() == false)
198 InputFilteredSignal().Disconnect(textFieldInputFilteredCallbackDelegate);
203 internal TextFieldSignal TextChangedSignal()
205 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.TextChangedSignal(SwigCPtr), false);
206 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
210 internal TextFieldSignal MaxLengthReachedSignal()
212 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.MaxLengthReachedSignal(SwigCPtr), false);
213 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
217 internal TextFieldSignal AnchorClickedSignal()
219 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.AnchorClickedSignal(SwigCPtr), false);
220 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
224 internal TextFieldSignal SelectionChangedSignal()
226 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.SelectionChangedSignal(SwigCPtr), false);
227 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
231 internal TextFieldSignal InputFilteredSignal()
233 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.InputFilteredSignal(SwigCPtr), false);
234 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
238 private void OnTextChanged(IntPtr textField)
240 if (textFieldTextChangedEventHandler != null)
242 TextChangedEventArgs e = new TextChangedEventArgs();
244 // Populate all members of "e" (TextChangedEventArgs) with real data
245 e.TextField = Registry.GetManagedBaseHandleFromNativePtr(textField) as TextField;
246 //here we send all data to user event handlers
247 textFieldTextChangedEventHandler(this, e);
251 private void OnMaxLengthReached(IntPtr textField)
253 if (textFieldMaxLengthReachedEventHandler != null)
255 MaxLengthReachedEventArgs e = new MaxLengthReachedEventArgs();
257 // Populate all members of "e" (MaxLengthReachedEventArgs) with real data
258 e.TextField = Registry.GetManagedBaseHandleFromNativePtr(textField) as TextField;
259 //here we send all data to user event handlers
260 textFieldMaxLengthReachedEventHandler(this, e);
264 private void OnAnchorClicked(IntPtr textField, IntPtr href, uint hrefLength)
266 // Note: hrefLength is useful for get the length of a const char* (href) in dali-toolkit.
267 // But NUI can get the length of string (href), so hrefLength is not necessary in NUI.
268 AnchorClickedEventArgs e = new AnchorClickedEventArgs();
270 // Populate all members of "e" (AnchorClickedEventArgs) with real data
271 e.Href = Marshal.PtrToStringAnsi(href);
272 //here we send all data to user event handlers
273 textFieldAnchorClickedEventHandler?.Invoke(this, e);
276 private void OnSelectionChanged(IntPtr textField, uint oldStart, uint oldEnd)
278 if (textFieldSelectionChangedEventHandler != null)
280 SelectionChangedEventArgs e = new SelectionChangedEventArgs();
282 // Populate all members of "e" (SelectionChangedEventArgs) with real data
283 e.OldSelectionStart = oldStart;
284 e.OldSelectionEnd = oldEnd;
286 //here we send all data to user event handlers
287 textFieldSelectionChangedEventHandler?.Invoke(this, e);
291 private void OnInputFiltered(IntPtr textField, InputFilterType type)
293 InputFilteredEventArgs e = new InputFilteredEventArgs();
295 // Populate all members of "e" (InputFilteredEventArgs) with real data
297 //here we send all data to user event handlers
298 textFieldInputFilteredEventHandler?.Invoke(this, e);
302 /// The TextChanged event arguments.
304 /// <since_tizen> 3 </since_tizen>
305 public class TextChangedEventArgs : EventArgs
307 private TextField textField;
312 /// <since_tizen> 3 </since_tizen>
313 public TextField TextField
327 /// The MaxLengthReached event arguments.
329 /// <since_tizen> 3 </since_tizen>
330 public class MaxLengthReachedEventArgs : EventArgs
332 private TextField textField;
337 /// <since_tizen> 3 </since_tizen>
338 public TextField TextField