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<CursorPositionChangedEventArgs> textFieldCursorPositionChangedEventHandler;
33 private CursorPositionChangedCallbackDelegate textFieldCursorPositionChangedCallbackDelegate;
34 private EventHandler<MaxLengthReachedEventArgs> textFieldMaxLengthReachedEventHandler;
35 private MaxLengthReachedCallbackDelegate textFieldMaxLengthReachedCallbackDelegate;
36 private EventHandler<AnchorClickedEventArgs> textFieldAnchorClickedEventHandler;
37 private AnchorClickedCallbackDelegate textFieldAnchorClickedCallbackDelegate;
38 private EventHandler<InputFilteredEventArgs> textFieldInputFilteredEventHandler;
39 private InputFilteredCallbackDelegate textFieldInputFilteredCallbackDelegate;
41 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
42 private delegate void TextChangedCallbackDelegate(IntPtr textField);
44 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
45 private delegate void CursorPositionChangedCallbackDelegate(IntPtr textField, uint oldPosition);
47 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
48 private delegate void MaxLengthReachedCallbackDelegate(IntPtr textField);
50 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
51 private delegate void AnchorClickedCallbackDelegate(IntPtr textField, IntPtr href, uint hrefLength);
53 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
54 private delegate void InputFilteredCallbackDelegate(IntPtr textField, InputFilterType type);
57 /// The TextChanged event.
59 /// <since_tizen> 3 </since_tizen>
60 public event EventHandler<TextChangedEventArgs> TextChanged
64 if (textFieldTextChangedEventHandler == null)
66 textFieldTextChangedCallbackDelegate = (OnTextChanged);
67 TextChangedSignal().Connect(textFieldTextChangedCallbackDelegate);
69 textFieldTextChangedEventHandler += value;
73 textFieldTextChangedEventHandler -= value;
74 if (textFieldTextChangedEventHandler == null && TextChangedSignal().Empty() == false)
76 TextChangedSignal().Disconnect(textFieldTextChangedCallbackDelegate);
82 /// The CursorPositionChanged event.
84 /// This will be public opened after ACR done. Before ACR, need to be hidden as inhouse API.
85 [EditorBrowsable(EditorBrowsableState.Never)]
86 public event EventHandler<CursorPositionChangedEventArgs> CursorPositionChanged
90 if (textFieldCursorPositionChangedEventHandler == null)
92 textFieldCursorPositionChangedCallbackDelegate = (OnCursorPositionChanged);
93 CursorPositionChangedSignal().Connect(textFieldCursorPositionChangedCallbackDelegate);
95 textFieldCursorPositionChangedEventHandler += value;
99 if (textFieldCursorPositionChangedEventHandler == null && CursorPositionChangedSignal().Empty() == false)
101 this.CursorPositionChangedSignal().Disconnect(textFieldCursorPositionChangedCallbackDelegate);
103 textFieldCursorPositionChangedEventHandler -= value;
108 /// The MaxLengthReached event.
110 /// <since_tizen> 3 </since_tizen>
111 public event EventHandler<MaxLengthReachedEventArgs> MaxLengthReached
115 if (textFieldMaxLengthReachedEventHandler == null)
117 textFieldMaxLengthReachedCallbackDelegate = (OnMaxLengthReached);
118 MaxLengthReachedSignal().Connect(textFieldMaxLengthReachedCallbackDelegate);
120 textFieldMaxLengthReachedEventHandler += value;
124 if (textFieldMaxLengthReachedEventHandler == null && MaxLengthReachedSignal().Empty() == false)
126 this.MaxLengthReachedSignal().Disconnect(textFieldMaxLengthReachedCallbackDelegate);
128 textFieldMaxLengthReachedEventHandler -= value;
133 /// The AnchorClicked signal is emitted when the anchor is clicked.
135 /// <since_tizen> 9 </since_tizen>
136 public event EventHandler<AnchorClickedEventArgs> AnchorClicked
140 if (textFieldAnchorClickedEventHandler == null)
142 textFieldAnchorClickedCallbackDelegate = (OnAnchorClicked);
143 AnchorClickedSignal().Connect(textFieldAnchorClickedCallbackDelegate);
145 textFieldAnchorClickedEventHandler += value;
149 textFieldAnchorClickedEventHandler -= value;
150 if (textFieldAnchorClickedEventHandler == null && AnchorClickedSignal().Empty() == false)
152 AnchorClickedSignal().Disconnect(textFieldAnchorClickedCallbackDelegate);
158 /// The InputFiltered signal is emitted when the input is filtered by InputFilter. <br />
161 /// See <see cref="InputFilterType"/> and <see cref="InputFilteredEventArgs"/> for a detailed description. <br />
164 /// The following example demonstrates how to use the InputFiltered event.
166 /// field.InputFiltered += (s, e) =>
168 /// if (e.Type == InputFilterType.Accept)
170 /// // If input is filtered by InputFilter of Accept type.
172 /// else if (e.Type == InputFilterType.Reject)
174 /// // If input is filtered by InputFilter of Reject type.
179 [EditorBrowsable(EditorBrowsableState.Never)]
180 public event EventHandler<InputFilteredEventArgs> InputFiltered
184 if (textFieldInputFilteredEventHandler == null)
186 textFieldInputFilteredCallbackDelegate = (OnInputFiltered);
187 InputFilteredSignal().Connect(textFieldInputFilteredCallbackDelegate);
189 textFieldInputFilteredEventHandler += value;
193 textFieldInputFilteredEventHandler -= value;
194 if (textFieldInputFilteredEventHandler == null && InputFilteredSignal().Empty() == false)
196 InputFilteredSignal().Disconnect(textFieldInputFilteredCallbackDelegate);
201 internal TextFieldSignal TextChangedSignal()
203 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.TextChangedSignal(SwigCPtr), false);
204 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
208 internal TextFieldSignal CursorPositionChangedSignal()
210 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.CursorPositionChangedSignal(SwigCPtr), false);
211 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
215 internal TextFieldSignal MaxLengthReachedSignal()
217 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.MaxLengthReachedSignal(SwigCPtr), false);
218 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
222 internal TextFieldSignal AnchorClickedSignal()
224 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.AnchorClickedSignal(SwigCPtr), false);
225 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
229 internal TextFieldSignal InputFilteredSignal()
231 TextFieldSignal ret = new TextFieldSignal(Interop.TextField.InputFilteredSignal(SwigCPtr), false);
232 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
236 private void OnTextChanged(IntPtr textField)
238 if (textFieldTextChangedEventHandler != null)
240 TextChangedEventArgs e = new TextChangedEventArgs();
242 // Populate all members of "e" (TextChangedEventArgs) with real data
243 e.TextField = Registry.GetManagedBaseHandleFromNativePtr(textField) as TextField;
244 //here we send all data to user event handlers
245 textFieldTextChangedEventHandler(this, e);
249 private void OnCursorPositionChanged(IntPtr textField, uint oldPosition)
251 if (textFieldCursorPositionChangedEventHandler != null)
253 CursorPositionChangedEventArgs e = new CursorPositionChangedEventArgs();
255 // Populate all members of "e" (CursorPositionChangedEventArgs) with real data
256 e.OldCursorPosition = oldPosition;
258 //here we send all data to user event handlers
259 textFieldCursorPositionChangedEventHandler?.Invoke(this, e);
263 private void OnMaxLengthReached(IntPtr textField)
265 if (textFieldMaxLengthReachedEventHandler != null)
267 MaxLengthReachedEventArgs e = new MaxLengthReachedEventArgs();
269 // Populate all members of "e" (MaxLengthReachedEventArgs) with real data
270 e.TextField = Registry.GetManagedBaseHandleFromNativePtr(textField) as TextField;
271 //here we send all data to user event handlers
272 textFieldMaxLengthReachedEventHandler(this, e);
276 private void OnAnchorClicked(IntPtr textField, IntPtr href, uint hrefLength)
278 // Note: hrefLength is useful for get the length of a const char* (href) in dali-toolkit.
279 // But NUI can get the length of string (href), so hrefLength is not necessary in NUI.
280 AnchorClickedEventArgs e = new AnchorClickedEventArgs();
282 // Populate all members of "e" (AnchorClickedEventArgs) with real data
283 e.Href = Marshal.PtrToStringAnsi(href);
284 //here we send all data to user event handlers
285 textFieldAnchorClickedEventHandler?.Invoke(this, e);
288 private void OnInputFiltered(IntPtr textField, InputFilterType type)
290 InputFilteredEventArgs e = new InputFilteredEventArgs();
292 // Populate all members of "e" (InputFilteredEventArgs) with real data
294 //here we send all data to user event handlers
295 textFieldInputFilteredEventHandler?.Invoke(this, e);
299 /// The TextChanged event arguments.
301 /// <since_tizen> 3 </since_tizen>
302 public class TextChangedEventArgs : EventArgs
304 private TextField textField;
309 /// <since_tizen> 3 </since_tizen>
310 public TextField TextField
324 /// The MaxLengthReached event arguments.
326 /// <since_tizen> 3 </since_tizen>
327 public class MaxLengthReachedEventArgs : EventArgs
329 private TextField textField;
334 /// <since_tizen> 3 </since_tizen>
335 public TextField TextField