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;
36 private EventHandler<InputFilteredEventArgs> textFieldInputFilteredEventHandler;
37 private InputFilteredCallbackDelegate textFieldInputFilteredCallbackDelegate;
39 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
40 private delegate void TextChangedCallbackDelegate(IntPtr textField);
42 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
43 private delegate void MaxLengthReachedCallbackDelegate(IntPtr textField);
45 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
46 private delegate void AnchorClickedCallbackDelegate(IntPtr textField, IntPtr href, uint hrefLength);
48 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
49 private delegate void InputFilteredCallbackDelegate(IntPtr textField, InputFilterType type);
52 /// The TextChanged event.
54 /// <since_tizen> 3 </since_tizen>
55 public event EventHandler<TextChangedEventArgs> TextChanged
59 if (textFieldTextChangedEventHandler == null)
61 textFieldTextChangedCallbackDelegate = (OnTextChanged);
62 TextChangedSignal().Connect(textFieldTextChangedCallbackDelegate);
64 textFieldTextChangedEventHandler += value;
68 textFieldTextChangedEventHandler -= value;
69 if (textFieldTextChangedEventHandler == null && TextChangedSignal().Empty() == false)
71 TextChangedSignal().Disconnect(textFieldTextChangedCallbackDelegate);
77 /// The MaxLengthReached event.
79 /// <since_tizen> 3 </since_tizen>
80 public event EventHandler<MaxLengthReachedEventArgs> MaxLengthReached
84 if (textFieldMaxLengthReachedEventHandler == null)
86 textFieldMaxLengthReachedCallbackDelegate = (OnMaxLengthReached);
87 MaxLengthReachedSignal().Connect(textFieldMaxLengthReachedCallbackDelegate);
89 textFieldMaxLengthReachedEventHandler += value;
93 if (textFieldMaxLengthReachedEventHandler == null && MaxLengthReachedSignal().Empty() == false)
95 this.MaxLengthReachedSignal().Disconnect(textFieldMaxLengthReachedCallbackDelegate);
97 textFieldMaxLengthReachedEventHandler -= value;
102 /// The AnchorClicked signal is emitted when the anchor is clicked.
104 /// <since_tizen> 9 </since_tizen>
105 public event EventHandler<AnchorClickedEventArgs> AnchorClicked
109 if (textFieldAnchorClickedEventHandler == null)
111 textFieldAnchorClickedCallbackDelegate = (OnAnchorClicked);
112 AnchorClickedSignal().Connect(textFieldAnchorClickedCallbackDelegate);
114 textFieldAnchorClickedEventHandler += value;
118 textFieldAnchorClickedEventHandler -= value;
119 if (textFieldAnchorClickedEventHandler == null && AnchorClickedSignal().Empty() == false)
121 AnchorClickedSignal().Disconnect(textFieldAnchorClickedCallbackDelegate);
127 /// The InputFiltered signal is emitted when the input is filtered by InputFilter. <br />
130 /// See <see cref="InputFilterType"/> and <see cref="InputFilteredEventArgs"/> for a detailed description. <br />
133 /// The following example demonstrates how to use the InputFiltered event.
135 /// field.InputFiltered += (s, e) =>
137 /// if (e.Type == InputFilterType.Accept)
139 /// // If input is filtered by InputFilter of Accept type.
141 /// else if (e.Type == InputFilterType.Reject)
143 /// // If input is filtered by InputFilter of Reject type.
148 [EditorBrowsable(EditorBrowsableState.Never)]
149 public event EventHandler<InputFilteredEventArgs> InputFiltered
153 if (textFieldInputFilteredEventHandler == null)
155 textFieldInputFilteredCallbackDelegate = (OnInputFiltered);
156 InputFilteredSignal().Connect(textFieldInputFilteredCallbackDelegate);
158 textFieldInputFilteredEventHandler += value;
162 textFieldInputFilteredEventHandler -= value;
163 if (textFieldInputFilteredEventHandler == null && InputFilteredSignal().Empty() == false)
165 InputFilteredSignal().Disconnect(textFieldInputFilteredCallbackDelegate);
170 internal TextFieldSignal TextChangedSignal()
172 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.TextChangedSignal(SwigCPtr), false);
173 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
177 internal TextFieldSignal MaxLengthReachedSignal()
179 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.MaxLengthReachedSignal(SwigCPtr), false);
180 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
184 internal TextFieldSignal AnchorClickedSignal()
186 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.AnchorClickedSignal(SwigCPtr), false);
187 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
191 internal TextFieldSignal InputFilteredSignal()
193 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.InputFilteredSignal(SwigCPtr), false);
194 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
198 private void OnTextChanged(IntPtr textField)
200 if (textFieldTextChangedEventHandler != null)
202 TextChangedEventArgs e = new TextChangedEventArgs();
204 // Populate all members of "e" (TextChangedEventArgs) with real data
205 e.TextField = Registry.GetManagedBaseHandleFromNativePtr(textField) as TextField;
206 //here we send all data to user event handlers
207 textFieldTextChangedEventHandler(this, e);
211 private void OnMaxLengthReached(IntPtr textField)
213 if (textFieldMaxLengthReachedEventHandler != null)
215 MaxLengthReachedEventArgs e = new MaxLengthReachedEventArgs();
217 // Populate all members of "e" (MaxLengthReachedEventArgs) with real data
218 e.TextField = Registry.GetManagedBaseHandleFromNativePtr(textField) as TextField;
219 //here we send all data to user event handlers
220 textFieldMaxLengthReachedEventHandler(this, e);
224 private void OnAnchorClicked(IntPtr textField, IntPtr href, uint hrefLength)
226 // Note: hrefLength is useful for get the length of a const char* (href) in dali-toolkit.
227 // But NUI can get the length of string (href), so hrefLength is not necessary in NUI.
228 AnchorClickedEventArgs e = new AnchorClickedEventArgs();
230 // Populate all members of "e" (AnchorClickedEventArgs) with real data
231 e.Href = Marshal.PtrToStringAnsi(href);
232 //here we send all data to user event handlers
233 textFieldAnchorClickedEventHandler?.Invoke(this, e);
236 private void OnInputFiltered(IntPtr textField, InputFilterType type)
238 InputFilteredEventArgs e = new InputFilteredEventArgs();
240 // Populate all members of "e" (InputFilteredEventArgs) with real data
242 //here we send all data to user event handlers
243 textFieldInputFilteredEventHandler?.Invoke(this, e);
247 /// The TextChanged event arguments.
249 /// <since_tizen> 3 </since_tizen>
250 public class TextChangedEventArgs : EventArgs
252 private TextField textField;
257 /// <since_tizen> 3 </since_tizen>
258 public TextField TextField
272 /// The MaxLengthReached event arguments.
274 /// <since_tizen> 3 </since_tizen>
275 public class MaxLengthReachedEventArgs : EventArgs
277 private TextField textField;
282 /// <since_tizen> 3 </since_tizen>
283 public TextField TextField