[Tizen](ATSPI) squashed implementation
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / devel-api / controls / control-devel.cpp
1 /*
2  * Copyright (c) 2019 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 // CLASS HEADER
19 #include "control-devel.h"
20
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/animation/animation.h>
23
24 // INTERNAL INCLUDES
25 #include <dali/public-api/actors/actor.h>
26 #include <dali-toolkit/internal/controls/control/control-data-impl.h>
27 #include <dali-toolkit/public-api/controls/control.h>
28 #include <dali-toolkit/public-api/controls/control-impl.h>
29 #include <dali-toolkit/devel-api/visual-factory/transition-data.h>
30
31 namespace Dali
32 {
33
34 namespace Toolkit
35 {
36
37 namespace DevelControl
38 {
39
40 void RegisterVisual( Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual )
41 {
42   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
43   controlDataImpl.RegisterVisual( index, visual );
44 }
45
46 void RegisterVisual( Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual, int depthIndex )
47 {
48   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
49   controlDataImpl.RegisterVisual( index, visual, depthIndex );
50 }
51
52 void RegisterVisual( Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual, bool enabled )
53 {
54   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
55   controlDataImpl.RegisterVisual( index, visual, enabled );
56 }
57
58 void RegisterVisual( Internal::Control& control, Dali::Property::Index index, Toolkit::Visual::Base& visual, bool enabled, int depthIndex )
59 {
60   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
61   controlDataImpl.RegisterVisual( index, visual, enabled, depthIndex );
62 }
63
64 void UnregisterVisual( Internal::Control& control, Dali::Property::Index index )
65 {
66   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
67   controlDataImpl.UnregisterVisual( index );
68 }
69
70 Toolkit::Visual::Base GetVisual( const Internal::Control& control, Dali::Property::Index index )
71 {
72   const Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
73   return controlDataImpl.GetVisual( index );
74 }
75
76 void EnableVisual( Internal::Control& control, Dali::Property::Index index, bool enable )
77 {
78   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
79   controlDataImpl.EnableVisual( index, enable );
80 }
81
82 bool IsVisualEnabled( const Internal::Control& control, Dali::Property::Index index )
83 {
84   const Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
85   return controlDataImpl.IsVisualEnabled( index );
86 }
87
88 Dali::Animation CreateTransition( Internal::Control& control, const Toolkit::TransitionData& handle )
89 {
90   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
91   return controlDataImpl.CreateTransition( handle );
92 }
93
94
95 void AddTransitions( Internal::Control& control,
96                      Dali::Animation animation,
97                      const Toolkit::TransitionData& transitionData )
98 {
99   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( control );
100   controlDataImpl.AddTransitions( animation, transitionData );
101 }
102
103 void DoAction( Control& control, Dali::Property::Index visualIndex, Dali::Property::Index actionId, const Dali::Property::Value attributes )
104 {
105   Internal::Control& controlInternal = Toolkit::Internal::GetImplementation( control );
106   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( controlInternal );
107   controlDataImpl.DoAction( visualIndex, actionId, attributes );
108 }
109
110 void SetInputMethodContext( Internal::Control& control, InputMethodContext& inputMethodContext )
111 {
112   Internal::Control::Impl::Get( control ).SetInputMethodContext( inputMethodContext );
113 }
114
115 VisualEventSignalType& VisualEventSignal( Control control )
116 {
117   Internal::Control& internalControl = Toolkit::Internal::GetImplementation( control );
118   Internal::Control::Impl& controlDataImpl = Internal::Control::Impl::Get( internalControl );
119   return controlDataImpl.VisualEventSignal();
120 }
121
122 static Toolkit::Internal::Control::Impl *GetControlImplementationIfAny( Dali::Actor actor)
123 {
124   Dali::Toolkit::Control c = Toolkit::Control::DownCast( actor );
125   if ( c )
126   {
127     auto &impl1 = Toolkit::Internal::GetImplementation( c );
128     auto &impl2 = Toolkit::Internal::Control::Impl::Get( impl1 );
129     return &impl2;
130   }
131   return nullptr;
132 }
133
134 Toolkit::Control::AccessibilityActivateSignalType &AccessibilityActivateSignal( Toolkit::Control control )
135 {
136   auto ac = GetControlImplementationIfAny ( control );
137   return ac->mAccessibilityActivateSignal;
138 }
139
140 Toolkit::Control::AccessibilityReadingSkippedSignalType &AccessibilityReadingSkippedSignal( Toolkit::Control control )
141 {
142   auto ac = GetControlImplementationIfAny ( control );
143   return ac->mAccessibilityReadingSkippedSignal;
144 }
145
146 Toolkit::Control::AccessibilityReadingCancelledSignalType &AccessibilityReadingCancelledSignal( Toolkit::Control control )
147 {
148   auto ac = GetControlImplementationIfAny ( control );
149   return ac->mAccessibilityReadingCancelledSignal;
150 }
151
152 Toolkit::Control::AccessibilityReadingStoppedSignalType &AccessibilityReadingStoppedSignal( Toolkit::Control control )
153 {
154   auto ac = GetControlImplementationIfAny ( control );
155   return ac->mAccessibilityReadingStoppedSignal;
156 }
157
158 Toolkit::Control::AccessibilityGetNameSignalType &AccessibilityGetNameSignal( Toolkit::Control control )
159 {
160   auto ac = GetControlImplementationIfAny ( control );
161   return ac->mAccessibilityGetNameSignal;
162 }
163
164 Toolkit::Control::AccessibilityGetDescriptionSignalType &AccessibilityGetDescriptionSignal( Toolkit::Control control )
165 {
166   auto ac = GetControlImplementationIfAny ( control );
167   return ac->mAccessibilityGetDescriptionSignal;
168 }
169
170 Toolkit::Control::AccessibilityDoGestureSignalType &AccessibilityDoGestureSignal( Toolkit::Control control )
171 {
172   auto ac = GetControlImplementationIfAny ( control );
173   return ac->mAccessibilityDoGestureSignal;
174 }
175
176 void AppendAccessibilityRelation( Dali::Actor control, Actor destination, Dali::Accessibility::RelationType relation)
177 {
178   if ( auto ac = GetControlImplementationIfAny ( control ) )
179   {
180     auto index = static_cast<Dali::Property::Array::SizeType>(relation);
181     if (index >= ac->mAccessibilityRelations.size())
182     {
183         DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Relation index exceeds vector size." );
184         return;
185     }
186
187     auto obj = ac->GetAccessibilityObject(destination);
188     ac->mAccessibilityRelations[index].push_back(obj->GetAddress());
189   }
190 }
191
192 void RemoveAccessibilityRelation( Dali::Actor control, Actor destination, Dali::Accessibility::RelationType relation)
193 {
194   if ( auto ac = GetControlImplementationIfAny ( control ) )
195   {
196     auto index = static_cast<Dali::Property::Array::SizeType>(relation);
197     if (index >= ac->mAccessibilityRelations.size())
198     {
199         DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Relation index exceeds vector size." );
200         return;
201     }
202
203     auto obj = ac->GetAccessibilityObject(destination);
204     auto address = obj->GetAddress();
205
206     auto &targets = ac->mAccessibilityRelations[index];
207     for (auto i = 0u; i < targets.size(); ++i) {
208         if (targets[i].ToString() == address.ToString())
209         {
210             targets[i] = targets.back();
211             targets.erase(targets.end() - 1);
212         }
213     }
214   }
215 }
216
217 std::vector<std::vector<Accessibility::Address>> GetAccessibilityRelations( Dali::Actor control )
218 {
219   if ( auto ac = GetControlImplementationIfAny ( control ) )
220   {
221     return ac->mAccessibilityRelations;
222   }
223   return {};
224 }
225
226 void ClearAccessibilityRelations( Dali::Actor control )
227 {
228   if ( auto ac = GetControlImplementationIfAny ( control ) )
229   {
230     for (auto &it : ac->mAccessibilityRelations)
231       it.clear();
232   }
233 }
234
235 void SetAccessibilityConstructor( Dali::Actor control,
236         std::function< std::unique_ptr< Dali::Accessibility::Accessible >( Dali::Actor ) > constructor )
237 {
238   if ( auto ac = GetControlImplementationIfAny ( control ) )
239   {
240     ac->accessibilityConstructor = constructor;
241   }
242 }
243
244 void AppendAccessibilityAttribute( Dali::Actor control, const std::string& key,
245                                          const std::string value )
246 {
247   if ( auto ac = GetControlImplementationIfAny ( control ) )
248   {
249     ac->AppendAccessibilityAttribute( key, value );
250   }
251 }
252
253 void RemoveAccessibilityAttribute( Dali::Actor control, const std::string& key )
254 {
255   if ( auto ac = GetControlImplementationIfAny ( control ) )
256   {
257     ac->RemoveAccessibilityAttribute( key );
258   }
259 }
260
261 void ClearAccessibilityAttributes( Dali::Actor control )
262 {
263   if ( auto ac = GetControlImplementationIfAny ( control ) )
264   {
265     ac->ClearAccessibilityAttributes();
266   }
267 }
268
269 void SetAccessibilityReadingInfoType( Dali::Actor control, const Dali::Accessibility::ReadingInfoTypes types )
270 {
271   if ( auto ac = GetControlImplementationIfAny ( control ) )
272   {
273     ac->SetAccessibilityReadingInfoType( types );
274   }
275 }
276
277 Dali::Accessibility::ReadingInfoTypes GetAccessibilityReadingInfoType(Dali::Actor control )
278 {
279   if ( auto ac = GetControlImplementationIfAny ( control ) )
280   {
281     return ac->GetAccessibilityReadingInfoType();
282   }
283   return {};
284 }
285
286 bool ClearAccessibilityHighlight( Dali::Actor control )
287 {
288   if ( auto ac = GetControlImplementationIfAny ( control ) )
289   {
290     auto ptr = dynamic_cast<Dali::Accessibility::Component*>( ac );
291     if( ptr )
292       return ptr->ClearHighlight();
293   }
294   return false;
295 }
296
297 bool GrabAccessibilityHighlight( Dali::Actor control )
298 {
299   if ( auto ac = GetControlImplementationIfAny ( control ) )
300   {
301     auto ptr = dynamic_cast<Dali::Accessibility::Component*>( ac );
302     if( ptr )
303       return ptr->GrabHighlight();
304   }
305   return false;
306 }
307
308 Dali::Accessibility::States GetAccessibilityStates( Dali::Actor control )
309 {
310   if ( auto ac = GetControlImplementationIfAny ( control ) )
311   {
312     auto ptr = dynamic_cast<Dali::Accessibility::Component*>( ac );
313     if(ptr)
314       return ptr->GetStates();
315   }
316   return {};
317 }
318
319 void NotifyAccessibilityStateChange( Dali::Actor control, Dali::Accessibility::States states, bool doRecursive )
320 {
321   if ( auto ac = GetControlImplementationIfAny ( control ) )
322   {
323     ac->GetAccessibilityObject()->NotifyAccessibilityStateChange( states, doRecursive );
324   }
325 }
326
327 Dali::Accessibility::Accessible *GetBoundAccessibilityObject( Dali::Actor control )
328 {
329   return Dali::Accessibility::Accessible::Get( control );
330 }
331
332 } // namespace DevelControl
333
334 } // namespace Toolkit
335
336 } // namespace Dali