[NUI] Support markup anchor to TextLabel, TextField, TextEditor (#2813)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / BaseComponents / TextFieldEvent.cs
1 /*
2  * Copyright(c) 2021 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 using System;
19 using System.ComponentModel;
20 using System.Runtime.InteropServices;
21
22 namespace Tizen.NUI.BaseComponents
23 {
24     /// <summary>
25     /// A control which provides a single line editable text field.
26     /// </summary>
27     /// <since_tizen> 3 </since_tizen>
28     public partial class TextField
29     {
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
37         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
38         private delegate void TextChangedCallbackDelegate(IntPtr textField);
39
40         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
41         private delegate void MaxLengthReachedCallbackDelegate(IntPtr textField);
42
43         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
44         private delegate void AnchorClickedCallbackDelegate(IntPtr textField, IntPtr href, uint hrefLength);
45
46         /// <summary>
47         /// The TextChanged event.
48         /// </summary>
49         /// <since_tizen> 3 </since_tizen>
50         public event EventHandler<TextChangedEventArgs> TextChanged
51         {
52             add
53             {
54                 if (textFieldTextChangedEventHandler == null)
55                 {
56                     textFieldTextChangedCallbackDelegate = (OnTextChanged);
57                     TextChangedSignal().Connect(textFieldTextChangedCallbackDelegate);
58                 }
59                 textFieldTextChangedEventHandler += value;
60             }
61             remove
62             {
63                 textFieldTextChangedEventHandler -= value;
64                 if (textFieldTextChangedEventHandler == null && TextChangedSignal().Empty() == false)
65                 {
66                     TextChangedSignal().Disconnect(textFieldTextChangedCallbackDelegate);
67                 }
68             }
69         }
70
71         /// <summary>
72         /// The MaxLengthReached event.
73         /// </summary>
74         /// <since_tizen> 3 </since_tizen>
75         public event EventHandler<MaxLengthReachedEventArgs> MaxLengthReached
76         {
77             add
78             {
79                 if (textFieldMaxLengthReachedEventHandler == null)
80                 {
81                     textFieldMaxLengthReachedCallbackDelegate = (OnMaxLengthReached);
82                     MaxLengthReachedSignal().Connect(textFieldMaxLengthReachedCallbackDelegate);
83                 }
84                 textFieldMaxLengthReachedEventHandler += value;
85             }
86             remove
87             {
88                 if (textFieldMaxLengthReachedEventHandler == null && MaxLengthReachedSignal().Empty() == false)
89                 {
90                     this.MaxLengthReachedSignal().Disconnect(textFieldMaxLengthReachedCallbackDelegate);
91                 }
92                 textFieldMaxLengthReachedEventHandler -= value;
93             }
94         }
95
96         /// <summary>
97         /// The AnchorClicked signal is emitted when the anchor is clicked.
98         /// </summary>
99         /// This will be public opened in tizen_6.5 after ACR done. Before ACR, need to be hidden as inhouse API.
100         [EditorBrowsable(EditorBrowsableState.Never)]
101         public event EventHandler<AnchorClickedEventArgs> AnchorClicked
102         {
103             add
104             {
105                 if (textFieldAnchorClickedEventHandler == null)
106                 {
107                     textFieldAnchorClickedCallbackDelegate = (OnAnchorClicked);
108                     AnchorClickedSignal().Connect(textFieldAnchorClickedCallbackDelegate);
109                 }
110                 textFieldAnchorClickedEventHandler += value;
111             }
112             remove
113             {
114                 textFieldAnchorClickedEventHandler -= value;
115                 if (textFieldAnchorClickedEventHandler == null && AnchorClickedSignal().Empty() == false)
116                 {
117                     AnchorClickedSignal().Disconnect(textFieldAnchorClickedCallbackDelegate);
118                 }
119             }
120         }
121
122         internal TextFieldSignal TextChangedSignal()
123         {
124             TextFieldSignal ret = new TextFieldSignal(Interop.TextField.TextChangedSignal(SwigCPtr), false);
125             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
126             return ret;
127         }
128
129         internal TextFieldSignal MaxLengthReachedSignal()
130         {
131             TextFieldSignal ret = new TextFieldSignal(Interop.TextField.MaxLengthReachedSignal(SwigCPtr), false);
132             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
133             return ret;
134         }
135
136         internal TextFieldSignal AnchorClickedSignal()
137         {
138             TextFieldSignal ret = new TextFieldSignal(Interop.TextField.AnchorClickedSignal(SwigCPtr), false);
139             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
140             return ret;
141         }
142
143         private void OnTextChanged(IntPtr textField)
144         {
145             if (textFieldTextChangedEventHandler != null)
146             {
147                 TextChangedEventArgs e = new TextChangedEventArgs();
148
149                 // Populate all members of "e" (TextChangedEventArgs) with real data
150                 e.TextField = Registry.GetManagedBaseHandleFromNativePtr(textField) as TextField;
151                 //here we send all data to user event handlers
152                 textFieldTextChangedEventHandler(this, e);
153             }
154         }
155
156         private void OnMaxLengthReached(IntPtr textField)
157         {
158             if (textFieldMaxLengthReachedEventHandler != null)
159             {
160                 MaxLengthReachedEventArgs e = new MaxLengthReachedEventArgs();
161
162                 // Populate all members of "e" (MaxLengthReachedEventArgs) with real data
163                 e.TextField = Registry.GetManagedBaseHandleFromNativePtr(textField) as TextField;
164                 //here we send all data to user event handlers
165                 textFieldMaxLengthReachedEventHandler(this, e);
166             }
167         }
168
169         private void OnAnchorClicked(IntPtr textField, IntPtr href, uint hrefLength)
170         {
171             // Note: hrefLength is useful for get the length of a const char* (href) in dali-toolkit.
172             // But NUI can get the length of string (href), so hrefLength is not necessary in NUI.
173             AnchorClickedEventArgs e = new AnchorClickedEventArgs();
174
175             // Populate all members of "e" (AnchorClickedEventArgs) with real data
176             e.Href = Marshal.PtrToStringAnsi(href);
177             //here we send all data to user event handlers
178             textFieldAnchorClickedEventHandler?.Invoke(this, e);
179         }
180
181         /// <summary>
182         /// The TextChanged event arguments.
183         /// </summary>
184         /// <since_tizen> 3 </since_tizen>
185         public class TextChangedEventArgs : EventArgs
186         {
187             private TextField textField;
188
189             /// <summary>
190             /// TextField.
191             /// </summary>
192             /// <since_tizen> 3 </since_tizen>
193             public TextField TextField
194             {
195                 get
196                 {
197                     return textField;
198                 }
199                 set
200                 {
201                     textField = value;
202                 }
203             }
204         }
205
206         /// <summary>
207         /// The MaxLengthReached event arguments.
208         /// </summary>
209         /// <since_tizen> 3 </since_tizen>
210         public class MaxLengthReachedEventArgs : EventArgs
211         {
212             private TextField textField;
213
214             /// <summary>
215             /// TextField.
216             /// </summary>
217             /// <since_tizen> 3 </since_tizen>
218             public TextField TextField
219             {
220                 get
221                 {
222                     return textField;
223                 }
224                 set
225                 {
226                     textField = value;
227                 }
228             }
229         }
230     }
231 }