56dd608fa363b622a1a22f3e24f69d4f18c6589f
[platform/core/uifw/dali-csharp-binder.git] / dali-csharp-binder / src / control-devel-wrap.cpp
1 /*
2  * Copyright (c) 2020 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 // EXTERNAL INCLUDES
19 #include <vector>
20 #include <dali/devel-api/adaptor-framework/accessibility.h>
21 #include <dali/devel-api/adaptor-framework/accessibility-bridge.h>
22
23 // INTERNAL INCLUDES
24 #include "control-devel-wrap.h"
25
26 using namespace Dali::Toolkit::DevelControl;
27
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31
32 // property
33 SWIGEXPORT int SWIGSTDCALL CSharp_Dali_View_Property_DISPATCH_KEY_EVENTS_get() {
34   return (int)Dali::Toolkit::DevelControl::Property::DISPATCH_KEY_EVENTS;
35 }
36
37
38 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_AccessibilityActivateSignal(void *arg1) {
39     Dali::Toolkit::DevelControl::AccessibilityActivateSignalType *result = nullptr;
40     GUARD_ON_NULL_RET0(arg1);
41     try_catch(([&]() {
42         Dali::Toolkit::Control* control = (Dali::Toolkit::Control*) arg1;
43         result = &(AccessibilityActivateSignal(*control));
44     }));
45     return (void*)result;
46 }
47
48 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_AccessibilityReadingSkippedSignal(void* arg1) {
49     Dali::Toolkit::DevelControl::AccessibilityReadingSkippedSignalType *result = nullptr;
50     GUARD_ON_NULL_RET0(arg1);
51     try_catch(([&]() {
52         Dali::Toolkit::Control* control = (Dali::Toolkit::Control*) arg1;
53         result = &(AccessibilityReadingSkippedSignal(*control));
54     }));
55     return (void*)result;
56 }
57
58 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_AccessibilityReadingPausedSignal(void *arg1) {
59     Dali::Toolkit::DevelControl::AccessibilityReadingPausedSignalType *result = nullptr;
60     GUARD_ON_NULL_RET0(arg1);
61     try_catch(([&]() {
62         Dali::Toolkit::Control* control = (Dali::Toolkit::Control*) arg1;
63         result = &(AccessibilityReadingPausedSignal(*control));
64     }));
65     return (void*)result;
66 }
67
68 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_AccessibilityReadingResumedSignal(void *arg1) {
69     Dali::Toolkit::DevelControl::AccessibilityReadingResumedSignalType *result = nullptr;
70     GUARD_ON_NULL_RET0(arg1);
71     try_catch(([&]() {
72         Dali::Toolkit::Control* control = (Dali::Toolkit::Control*) arg1;
73         result = &(AccessibilityReadingResumedSignal(*control));
74     }));
75     return (void*)result;
76 }
77
78 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_AccessibilityReadingCancelledSignal(void *arg1) {
79     Dali::Toolkit::DevelControl::AccessibilityReadingCancelledSignalType *result = nullptr;
80     GUARD_ON_NULL_RET0(arg1);
81     try_catch(([&]() {
82         Dali::Toolkit::Control* control = (Dali::Toolkit::Control*) arg1;
83         result = &(AccessibilityReadingCancelledSignal(*control));
84     }));
85     return (void*)result;
86 }
87
88 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_AccessibilityReadingStoppedSignal(void *arg1) {
89     Dali::Toolkit::DevelControl::AccessibilityReadingStoppedSignalType *result = nullptr;
90     GUARD_ON_NULL_RET0(arg1);
91     try_catch(([&]() {
92         Dali::Toolkit::Control* control = (Dali::Toolkit::Control*) arg1;
93         result = &(AccessibilityReadingStoppedSignal(*control));
94     }));
95     return (void*)result;
96 }
97
98 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_AccessibilityGetNameSignal(void *arg1) {
99     Dali::Toolkit::DevelControl::AccessibilityGetNameSignalType *result = nullptr;
100     GUARD_ON_NULL_RET0(arg1);
101     try_catch(([&]() {
102         Dali::Toolkit::Control* control = (Dali::Toolkit::Control*) arg1;
103         result = &(AccessibilityGetNameSignal(*control));
104     }));
105     return (void*)result;
106 }
107
108 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_AccessibilityGetDescriptionSignal(void *arg1) {
109     Dali::Toolkit::DevelControl::AccessibilityGetDescriptionSignalType *result = nullptr;
110     GUARD_ON_NULL_RET0(arg1);
111     try_catch(([&]() {
112         Dali::Toolkit::Control* control = (Dali::Toolkit::Control*) arg1;
113         result = &(AccessibilityGetDescriptionSignal(*control));
114     }));
115     return (void*)result;
116 }
117
118 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_AccessibilityDoGestureSignal(void *arg1) {
119     Dali::Toolkit::DevelControl::AccessibilityDoGestureSignalType *result = nullptr;
120     GUARD_ON_NULL_RET0(arg1);
121     try_catch(([&]() {
122         Dali::Toolkit::Control* control = (Dali::Toolkit::Control*) arg1;
123         result = &(AccessibilityDoGestureSignal(*control));
124     }));
125     return (void*)result;
126 }
127
128 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_AppendAccessibilityRelation(void *arg1, void *arg2, int arg3) {
129     GUARD_ON_NULL_RET(arg1);
130     GUARD_ON_NULL_RET(arg2);
131     try_catch(([&]() {
132         auto *control = (Dali::Toolkit::Control*)arg1;
133         auto *destination = (Dali::Actor*)arg2;
134         auto relation = (Dali::Accessibility::RelationType)arg3;
135         AppendAccessibilityRelation(*control, *destination, relation);
136     }));
137 }
138
139 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_RemoveAccessibilityRelation(void *arg1, void *arg2, int arg3) {
140     GUARD_ON_NULL_RET(arg1);
141     GUARD_ON_NULL_RET(arg2);
142     try_catch(([&]() {
143         auto *control = (Dali::Toolkit::Control*)arg1;
144         auto *destination = (Dali::Actor*)arg2;
145         auto relation = (Dali::Accessibility::RelationType)arg3;
146         RemoveAccessibilityRelation(*control, *destination, relation);
147     }));
148 }
149
150 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_GetAccessibilityRelations(void* arg1_control, void (*arg2_callback)(int, void*, void*), void* arg3_userData) {
151     using namespace Dali::Accessibility;
152
153     GUARD_ON_NULL_RET(arg1_control);
154     GUARD_ON_NULL_RET(arg2_callback);
155
156     try_catch(([&]() {
157         auto*                 control   = static_cast<Dali::Toolkit::Control*>(arg1_control);
158         std::vector<Relation> relations = GetAccessibilityRelations(*control);
159
160         for(Relation& relation : relations) {
161             for(Accessible* target : relation.mTargets) {
162                 // NUI is unaware of Accessible objects, so we only report those convertible to Control.
163                 // Note that it is currently impossible to make a relation with anything other than Control (View)
164                 // using NUI API, so there should not be any loss of information for typical NUI applications.
165                 auto targetControl = Dali::Toolkit::Control::DownCast(target->GetInternalActor());
166
167                 if(targetControl) {
168                     arg2_callback(static_cast<int>(relation.mRelationType), static_cast<void*>(new Dali::Actor(targetControl)), arg3_userData);
169                 }
170             }
171         }
172     }));
173 }
174
175 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_ClearAccessibilityRelations(void *arg1) {
176     GUARD_ON_NULL_RET(arg1);
177     try_catch(([&]() {
178         auto *control = (Dali::Toolkit::Control*)arg1;
179         ClearAccessibilityRelations(*control);
180     }));
181 }
182
183 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_AppendAccessibilityAttribute(void *arg1, char *arg2, char *arg3) {
184     GUARD_ON_NULL_RET(arg1);
185     GUARD_ON_NULL_RET(arg2);
186     GUARD_ON_NULL_RET(arg3);
187     try_catch(([&]() {
188         auto *control = (Dali::Toolkit::Control*)arg1;
189         const std::string key(arg2);
190         const std::string value(arg3);
191         AppendAccessibilityAttribute(*control, key, value);
192     }));
193 }
194
195 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_RemoveAccessibilityAttribute(void *arg1, char *arg2) {
196     GUARD_ON_NULL_RET(arg1);
197     GUARD_ON_NULL_RET(arg2);
198     try_catch(([&]() {
199         auto *control = (Dali::Toolkit::Control*)arg1;
200         const std::string key(arg2);
201         RemoveAccessibilityAttribute(*control, key);
202     }));
203 }
204
205 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_ClearAccessibilityAttributes(void *arg1) {
206     GUARD_ON_NULL_RET(arg1);
207     try_catch(([&]() {
208         auto *control = (Dali::Toolkit::Control*)arg1;
209         ClearAccessibilityAttributes(*control);
210     }));
211 }
212
213 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_SetAccessibilityReadingInfoType2(void *arg1, int arg2) {
214     using namespace Dali::Accessibility;
215     static_assert(static_cast<int>(ReadingInfoType::NAME) == 0
216         && static_cast<int>(ReadingInfoType::ROLE) == 1
217         && static_cast<int>(ReadingInfoType::DESCRIPTION) == 2
218         && static_cast<int>(ReadingInfoType::STATE) == 3, "C++ and C# bindings does not match");
219
220     GUARD_ON_NULL_RET(arg1);
221     try_catch(([&]() {
222         auto *control = (Dali::Toolkit::Control*)arg1;
223         SetAccessibilityReadingInfoType(*control, ReadingInfoTypes{static_cast<std::uint32_t>(arg2)});
224     }));
225 }
226
227 SWIGEXPORT int SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_GetAccessibilityReadingInfoType2(void *arg1) {
228     int result = 0;
229     GUARD_ON_NULL_RET0(arg1);
230     try_catch(([&]() {
231         auto *control = (Dali::Toolkit::Control*)arg1;
232         auto readingInfo = GetAccessibilityReadingInfoType(*control);
233         result = readingInfo.GetRawData()[0];
234     }));
235     return result;
236 }
237
238 SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_ClearAccessibilityHighlight(void *arg1) {
239     bool result = false;
240     GUARD_ON_NULL_RET0(arg1);
241     try_catch(([&]() {
242         auto *control = (Dali::Toolkit::Control*)arg1;
243         result = ClearAccessibilityHighlight(*control);
244     }));
245     return result;
246 }
247
248 SWIGEXPORT unsigned int SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_GrabAccessibilityHighlight(void *arg1) {
249     bool result = false;
250     GUARD_ON_NULL_RET0(arg1);
251     try_catch(([&]() {
252         auto *control = (Dali::Toolkit::Control*)arg1;
253         result = GrabAccessibilityHighlight(*control);
254     }));
255     return result;
256 }
257
258 SWIGEXPORT uint64_t SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_GetAccessibilityStates(void *arg1) {
259     uint64_t result = 0;
260     GUARD_ON_NULL_RET0(arg1);
261     try_catch(([&]() {
262         auto *control = (Dali::Toolkit::Control*)arg1;
263         auto states = GetAccessibilityStates(*control);
264         result = states.GetRawData64();
265     }));
266     return result;
267 }
268
269 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Toolkit_DevelControl_NotifyAccessibilityStateChange(void *arg1, uint64_t arg2, int arg3) {
270     GUARD_ON_NULL_RET(arg1);
271     try_catch(([&]() {
272         Dali::Accessibility::States states(arg2);
273         auto *control = (Dali::Toolkit::Control*)arg1;
274         NotifyAccessibilityStateChange(*control, states, static_cast<bool>(arg3));
275     }));
276 }
277
278 /***********************************************
279  **************** Accessibility ****************
280  ***********************************************/
281
282 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Accessibility_EmitAccessibilityEvent(void *arg1, int arg2_event) {
283     GUARD_ON_NULL_RET(arg1);
284     try_catch(([&]() {
285         Dali::Actor *control = (Dali::Actor*) arg1;
286         auto accessible = Dali::Accessibility::Accessible::Get(*control);
287         if (accessible)
288             accessible->Emit((Dali::Accessibility::ObjectPropertyChangeEvent)arg2_event);
289         else
290             SWIG_CSharpException(SWIG_RuntimeError, "Actor does not have accessible object.");
291     }));
292 }
293
294 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Accessibility_EmitAccessibilityStateChangedEvent(void *arg1, int arg2_state, int arg3) {
295     GUARD_ON_NULL_RET(arg1);
296     try_catch(([&]() {
297         auto state = static_cast<Dali::Accessibility::State>(arg2_state);
298
299         Dali::Actor *control = (Dali::Actor*) arg1;
300         auto accessible = Dali::Accessibility::Accessible::Get(*control);
301         if (accessible)
302             accessible->EmitStateChanged(state, arg3);
303         else
304             SWIG_CSharpException(SWIG_RuntimeError, "Actor does not have accessible object.");
305     }));
306 }
307
308 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Accessibility_EmitTextInsertedEvent(void *arg1, int arg2_position, int arg3_length, char *arg4_content) {
309     GUARD_ON_NULL_RET(arg1);
310     try_catch(([&]() {
311         Dali::Actor *control = (Dali::Actor*) arg1;
312         auto accessible = Dali::Accessibility::Accessible::Get(*control);
313         std::string content(arg4_content ? arg4_content : "");
314         if (accessible)
315             accessible->EmitTextInserted(arg2_position, arg3_length, content);
316         else
317             SWIG_CSharpException(SWIG_RuntimeError, "Actor does not have accessible object.");
318     }));
319 }
320
321 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Accessibility_EmitTextDeletedEvent(void *arg1, int arg2_position, int arg3_length, char *arg4_content) {
322     GUARD_ON_NULL_RET(arg1);
323     try_catch(([&]() {
324         Dali::Actor *control = (Dali::Actor*) arg1;
325         auto accessible = Dali::Accessibility::Accessible::Get(*control);
326         std::string content(arg4_content ? arg4_content : "");
327         if (accessible)
328             accessible->EmitTextDeleted(arg2_position, arg3_length, content);
329         else
330             SWIG_CSharpException(SWIG_RuntimeError, "Actor does not have accessible object.");
331     }));
332 }
333
334 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Accessibility_EmitTextCursorMovedEvent(void *arg1, int arg2_position) {
335     GUARD_ON_NULL_RET(arg1);
336     try_catch(([&]() {
337         Dali::Actor *control = (Dali::Actor*) arg1;
338         auto accessible = Dali::Accessibility::Accessible::Get(*control);
339         if (accessible)
340             accessible->EmitTextCursorMoved(arg2_position);
341         else
342             SWIG_CSharpException(SWIG_RuntimeError, "Actor does not have accessible object.");
343     }));
344 }
345
346 SWIGEXPORT bool SWIGSTDCALL CSharp_Dali_Accessibility_IsSuppressedEvent(void *arg1, int32_t atspiEvent) {
347     bool result = false;
348     GUARD_ON_NULL_RET0(arg1);
349     try_catch(([&]() {
350         Dali::Actor *control = (Dali::Actor*) arg1;
351         auto accessible = Dali::Accessibility::Accessible::Get(*control);
352         if (accessible) {
353             result = accessible->GetSuppressedEvents()[static_cast<Dali::Accessibility::AtspiEvent>(atspiEvent)];
354         }
355     }));
356     return result;
357 }
358
359 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Accessibility_SetSuppressedEvent(void *arg1, int32_t atspiEvent, bool isSuppressed) {
360     GUARD_ON_NULL_RET(arg1);
361     try_catch(([&]() {
362         Dali::Actor *control = (Dali::Actor*) arg1;
363         auto accessible = Dali::Accessibility::Accessible::Get(*control);
364         if (accessible) {
365             accessible->GetSuppressedEvents()[static_cast<Dali::Accessibility::AtspiEvent>(atspiEvent)] = isSuppressed;
366         }
367     }));
368 }
369
370 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Accessibility_new_Range(int arg1_start, int arg2_end, char *arg3_content) {
371     Dali::Accessibility::Range *result = nullptr;
372     try_catch(([&]() {
373         result = new Dali::Accessibility::Range(arg1_start, arg2_end, arg3_content);
374     }));
375     return (void*)result;
376 }
377
378 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Accessibility_delete_Range(void *arg1_range) {
379     try_catch(([&]() {
380         delete static_cast<Dali::Accessibility::Range*>(arg1_range);
381     }));
382 }
383
384 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Accessibility_Bridge_RegisterDefaultLabel(void *arg1_actor) {
385     GUARD_ON_NULL_RET(arg1_actor);
386     try_catch(([&]() {
387         Dali::Actor *actor = (Dali::Actor*) arg1_actor;
388         auto accessible = Dali::Accessibility::Accessible::Get(*actor);
389         auto bridge = Dali::Accessibility::Bridge::GetCurrentBridge();
390
391         if (!accessible) {
392             SWIG_CSharpException(SWIG_RuntimeError, "No accessible object bind with actor.");
393             return;
394         }
395
396         bridge->RegisterDefaultLabel(accessible);
397     }));
398 }
399
400 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Accessibility_Bridge_UnregisterDefaultLabel(void *arg1_actor) {
401     GUARD_ON_NULL_RET(arg1_actor);
402     try_catch(([&]() {
403         Dali::Actor *actor = (Dali::Actor*) arg1_actor;
404         auto accessible = Dali::Accessibility::Accessible::Get(*actor);
405         auto bridge = Dali::Accessibility::Bridge::GetCurrentBridge();
406
407         if (!accessible) {
408             SWIG_CSharpException(SWIG_RuntimeError, "No accessible object bind with actor.");
409             return;
410         }
411
412         bridge->UnregisterDefaultLabel(accessible);
413     }));
414 }
415
416 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Accessibility_Accessible_GetCurrentlyHighlightedActor() {
417     Dali::Actor *result = NULL;
418     try_catch(([&]() {
419         Dali::Actor actor = Dali::Accessibility::Accessible::GetCurrentlyHighlightedActor();
420         if (actor)
421             result = new Dali::Actor(actor);
422     }));
423     return result;
424 }
425
426 SWIGEXPORT void* SWIGSTDCALL CSharp_Dali_Accessibility_Accessible_GetHighlightActor() {
427     Dali::Actor *result = NULL;
428     try_catch(([&]() {
429         Dali::Actor actor = Dali::Accessibility::Accessible::GetHighlightActor();
430         if (actor)
431             result = new Dali::Actor(actor);
432     }));
433     return result;
434 }
435
436 SWIGEXPORT void SWIGSTDCALL CSharp_Dali_Accessibility_Accessible_SetHighlightActor(void *arg1_actor) {
437     // Passing nullptr as actor is used to remove custom highlight,
438     // what leads to the restoration of default highlight starting
439     // from next call to GrabHighlight()
440     try_catch(([&]() {
441         Dali::Actor actor = arg1_actor ? *((Dali::Actor*) arg1_actor) : Dali::Actor();
442         Dali::Accessibility::Accessible::SetHighlightActor(actor);
443     }));
444 }
445
446 #ifdef __cplusplus
447 } // extern "C"
448 #endif