[Tizen][ATSPI] Accessibility initial implementation
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / public-api / controls / control-impl.h
1 #ifndef DALI_TOOLKIT_CONTROL_IMPL_H
2 #define DALI_TOOLKIT_CONTROL_IMPL_H
3
4 /*
5  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <dali/devel-api/adaptor-framework/accessibility.h>
23 #include <dali/integration-api/debug.h>
24 #include <dali/public-api/adaptor-framework/style-change.h>
25 #include <dali/public-api/events/long-press-gesture.h>
26 #include <dali/public-api/events/pan-gesture.h>
27 #include <dali/public-api/events/pinch-gesture.h>
28 #include <dali/public-api/events/tap-gesture.h>
29 #include <dali/public-api/object/property-index-ranges.h>
30 #include <dali/public-api/object/type-info.h>
31
32 // INTERNAL INCLUDES
33 #include <dali-toolkit/public-api/controls/control.h>
34
35 #include <functional>
36 #include <memory>
37 #include <string>
38
39 namespace Dali
40 {
41 namespace Toolkit
42 {
43
44 /**
45  * @addtogroup dali_toolkit_controls
46  * @{
47  */
48
49 class StyleManager;
50
51 namespace Internal
52 {
53
54 /**
55  * @brief This is the internal base class for all controls.
56  *
57  * It will provide some common functionality required by all controls.
58  * Implements ConnectionTrackerInterface so that signals (typically connected to member functions) will
59  * be disconnected automatically when the control is destroyed.
60  * @SINCE_1_0.0
61  */
62 class DALI_IMPORT_API Control : public CustomActorImpl, public ConnectionTrackerInterface
63 {
64 public:
65
66   class Extension; ///< Forward declare future extension interface
67
68   // Creation & Destruction
69
70   /**
71    * @brief Creates a new ControlImpl instance that does not require touch by default.
72    *
73    * If touch is required, then the user can connect to this class' touch signal.
74    * @SINCE_1_0.0
75    * @return A handle to the ControlImpl instance
76    */
77   static Toolkit::Control New();
78
79 protected:
80   /**
81    * @brief Virtual destructor.
82    * @SINCE_1_0.0
83    */
84   virtual ~Control();
85
86 public:
87   // Styling
88
89   /**
90    * @copydoc Dali::Toolkit::Control::SetStyleName
91    */
92   void SetStyleName( const std::string& styleName );
93
94   /**
95    * @copydoc Dali::Toolkit::Control::GetStyleName
96    */
97   const std::string& GetStyleName() const;
98
99   // Background
100
101   /**
102    * @copydoc Dali::Toolkit::Control::SetBackgroundColor
103    */
104   void SetBackgroundColor( const Vector4& color );
105
106   /**
107    * @copydoc Dali::Toolkit::Control::GetBackgroundColor
108    */
109   Vector4 GetBackgroundColor() const;
110
111   /**
112    * @copydoc Dali::Toolkit::Control::SetBackgroundImage
113    */
114   void SetBackgroundImage( Image image );
115
116   /**
117    * @brief Sets the background with a property map.
118    *
119    * @SINCE_1_0.0
120    * @param[in] map The background property map
121    */
122   void SetBackground(const Property::Map& map);
123
124   /**
125    * @copydoc Dali::Toolkit::Control::ClearBackground
126    */
127   void ClearBackground();
128
129   // Gesture Detection
130
131   /**
132    * @brief Allows deriving classes to enable any of the gesture detectors that are available.
133    *
134    * Gesture detection can be enabled one at a time or in bitwise format as shown:
135    * @code
136    * EnableGestureDetection(Gesture::Type(Gesture::Pinch | Gesture::Tap | Gesture::Pan));
137    * @endcode
138    * @SINCE_1_0.0
139    * @param[in] type The gesture type(s) to enable
140    */
141   void EnableGestureDetection( Gesture::Type type );
142
143   /**
144    * @brief Allows deriving classes to disable any of the gesture detectors.
145    *
146    * Like EnableGestureDetection, this can also be called using bitwise or.
147    * @SINCE_1_0.0
148    * @param[in] type The gesture type(s) to disable
149    * @see EnableGetureDetection
150    */
151   void DisableGestureDetection( Gesture::Type type );
152
153   /**
154    * @brief If deriving classes wish to fine tune pinch gesture
155    * detection, then they can access the gesture detector through this
156    * API and modify the detection.
157    *
158    * @SINCE_1_0.0
159    * @return The pinch gesture detector
160    * @pre Pinch detection should have been enabled via EnableGestureDetection().
161    * @see EnableGestureDetection
162    */
163   PinchGestureDetector GetPinchGestureDetector() const;
164
165   /**
166    * @brief If deriving classes wish to fine tune pan gesture
167    * detection, then they can access the gesture detector through this
168    * API and modify the detection.
169    *
170    * @SINCE_1_0.0
171    * @return The pan gesture detector
172    * @pre Pan detection should have been enabled via EnableGestureDetection().
173    * @see EnableGestureDetection
174    */
175   PanGestureDetector GetPanGestureDetector() const;
176
177   /**
178    * @brief If deriving classes wish to fine tune tap gesture
179    * detection, then they can access the gesture detector through this
180    * API and modify the detection.
181    *
182    * @SINCE_1_0.0
183    * @return The tap gesture detector
184    * @pre Tap detection should have been enabled via EnableGestureDetection().
185    * @see EnableGestureDetection
186    */
187   TapGestureDetector GetTapGestureDetector() const;
188
189   /**
190    * @brief If deriving classes wish to fine tune long press gesture
191    * detection, then they can access the gesture detector through this
192    * API and modify the detection.
193    *
194    * @SINCE_1_0.0
195    * @return The long press gesture detector
196    * @pre Long press detection should have been enabled via EnableGestureDetection().
197    * @see EnableGestureDetection
198    */
199   LongPressGestureDetector GetLongPressGestureDetector() const;
200
201   // Keyboard Navigation
202
203   /**
204    * @brief Sets whether this control supports two dimensional
205    * keyboard navigation (i.e. whether it knows how to handle the
206    * keyboard focus movement between its child actors).
207    *
208    * The control doesn't support it by default.
209    * @SINCE_1_0.0
210    * @param[in] isSupported Whether this control supports two dimensional keyboard navigation
211    */
212   void SetKeyboardNavigationSupport( bool isSupported );
213
214   /**
215    * @brief Gets whether this control supports two dimensional keyboard navigation.
216    *
217    * @SINCE_1_0.0
218    * @return true if this control supports two dimensional keyboard navigation
219    */
220   bool IsKeyboardNavigationSupported();
221
222   // Key Input
223
224   /**
225    * @copydoc Toolkit::Control::SetKeyInputFocus()
226    */
227   void SetKeyInputFocus();
228
229   /**
230    * @copydoc Toolkit::Control::HasKeyInputFocus()
231    */
232   bool HasKeyInputFocus();
233
234   /**
235    * @copydoc Toolkit::Control::ClearKeyInputFocus()
236    */
237   void ClearKeyInputFocus();
238
239   // Keyboard Focus
240
241   /**
242    * @brief Sets whether this control is a focus group for keyboard navigation.
243    *
244    * (i.e. the scope of keyboard focus movement
245    * can be limited to its child actors). The control is not a focus group by default.
246    * @SINCE_1_0.0
247    * @param[in] isFocusGroup Whether this control is set as a focus group for keyboard navigation
248    */
249   void SetAsKeyboardFocusGroup( bool isFocusGroup );
250
251   /**
252    * @brief Gets whether this control is a focus group for keyboard navigation.
253    *
254    * @SINCE_1_0.0
255    * @return true if this control is set as a focus group for keyboard navigation
256    */
257   bool IsKeyboardFocusGroup();
258
259   /// @cond internal
260   /**
261    * @brief Called by the AccessibilityManager to activate the Control.
262    * @SINCE_1_0.0
263    */
264   DALI_INTERNAL void AccessibilityActivate();
265
266   /**
267    * @brief Called by the KeyboardFocusManager.
268    * @SINCE_1_0.0
269    */
270   DALI_INTERNAL void KeyboardEnter();
271   /// @endcond
272
273   // Signals
274
275   /**
276    * @copydoc Dali::Toolkit::Control::KeyEventSignal()
277    */
278   Toolkit::Control::KeyEventSignalType& KeyEventSignal();
279
280   /**
281    * @copydoc Dali::Toolkit::Control::KeyInputFocusGainedSignal()
282    */
283   Toolkit::Control::KeyInputFocusSignalType& KeyInputFocusGainedSignal();
284
285   /**
286    * @copydoc Dali::Toolkit::Control::KeyInputFocusLostSignal()
287    */
288   Toolkit::Control::KeyInputFocusSignalType& KeyInputFocusLostSignal();
289
290   /// @cond internal
291   /**
292    * @brief Called by the KeyInputFocusManager to emit key event signals.
293    *
294    * @SINCE_1_0.0
295    * @param[in] event The key event
296    * @return True if the event was consumed
297    */
298   DALI_INTERNAL bool EmitKeyEventSignal( const KeyEvent& event );
299   /// @endcond
300
301 protected: // For derived classes to call
302
303   /**
304    * @brief Emits KeyInputFocusGained signal if true else emits KeyInputFocusLost signal.
305    *
306    * Should be called last by the control after it acts on the Input Focus change.
307    *
308    * @SINCE_1_0.0
309    * @param[in] focusGained True if gained, False if lost
310    */
311   void EmitKeyInputFocusSignal( bool focusGained );
312
313 protected: // From CustomActorImpl, not to be used by application developers
314
315   /**
316    * @copydoc CustomActorImpl::OnStageConnection()
317    * @note If overridden, then an up-call to Control::OnStageConnection MUST be made at the end.
318    */
319   virtual void OnStageConnection( int depth );
320
321   /**
322    * @copydoc CustomActorImpl::OnStageDisconnection()
323    * @note If overridden, then an up-call to Control::OnStageDisconnection MUST be made at the end.
324    */
325   virtual void OnStageDisconnection();
326
327   /**
328    * @copydoc CustomActorImpl::OnChildAdd()
329    * @note If overridden, then an up-call to Control::OnChildAdd MUST be made at the end.
330    */
331   virtual void OnChildAdd( Actor& child );
332
333   /**
334    * @copydoc CustomActorImpl::OnChildRemove()
335    * @note If overridden, then an up-call to Control::OnChildRemove MUST be made at the end.
336    */
337   virtual void OnChildRemove( Actor& child );
338
339   /**
340    * @copydoc CustomActorImpl::OnPropertySet()
341    * @note If overridden, then an up-call to Control::OnChildRemove MUST be made at the end.
342    */
343   virtual void OnPropertySet( Property::Index index, Property::Value propertyValue );
344
345   /**
346    * @copydoc CustomActorImpl::OnSizeSet()
347    * @note If overridden, then an up-call to Control::OnSizeSet MUST be made at the end.
348    */
349   virtual void OnSizeSet( const Vector3& targetSize );
350
351   /**
352    * @copydoc CustomActorImpl::OnSizeAnimation()
353    * @note If overridden, then an up-call to Control::OnSizeAnimation MUST be made at the end.
354    */
355   virtual void OnSizeAnimation( Animation& animation, const Vector3& targetSize );
356
357   /**
358    * @copydoc CustomActorImpl::OnTouchEvent()
359    */
360   virtual bool OnTouchEvent( const TouchEvent& event );
361
362   /**
363    * @copydoc CustomActorImpl::OnHoverEvent()
364    */
365   virtual bool OnHoverEvent( const HoverEvent& event );
366
367   /**
368    * @copydoc CustomActorImpl::OnKeyEvent()
369    */
370   virtual bool OnKeyEvent( const KeyEvent& event );
371
372   /**
373    * @copydoc CustomActorImpl::OnWheelEvent()
374    */
375   virtual bool OnWheelEvent( const WheelEvent& event );
376
377   /**
378    * @copydoc CustomActorImpl::OnRelayout()
379    */
380   virtual void OnRelayout( const Vector2& size, RelayoutContainer& container );
381
382   /**
383    * @copydoc CustomActorImpl::OnSetResizePolicy()
384    */
385   virtual void OnSetResizePolicy( ResizePolicy::Type policy, Dimension::Type dimension );
386
387   /**
388    * @copydoc CustomActorImpl::GetNaturalSize()
389    */
390   virtual Vector3 GetNaturalSize();
391
392   /**
393    * @copydoc CustomActorImpl::CalculateChildSize()
394    */
395   virtual float CalculateChildSize( const Dali::Actor& child, Dimension::Type dimension );
396
397   /**
398    * @copydoc CustomActorImpl::GetHeightForWidth()
399    */
400   virtual float GetHeightForWidth( float width );
401
402   /**
403    * @copydoc CustomActorImpl::GetWidthForHeight()
404    */
405   virtual float GetWidthForHeight( float height );
406
407   /**
408    * @copydoc CustomActorImpl::RelayoutDependentOnChildren()
409    */
410   virtual bool RelayoutDependentOnChildren( Dimension::Type dimension = Dimension::ALL_DIMENSIONS );
411
412   /**
413    * @copydoc CustomActorImpl::OnCalculateRelayoutSize()
414    */
415   virtual void OnCalculateRelayoutSize( Dimension::Type dimension );
416
417   /**
418    * @copydoc CustomActorImpl::OnLayoutNegotiated()
419    */
420   virtual void OnLayoutNegotiated( float size, Dimension::Type dimension );
421
422 protected: // Helpers for deriving classes
423
424   // Construction
425
426   /**
427    * @brief Flags for the constructor.
428    * @SINCE_1_0.0
429    */
430   enum ControlBehaviour
431   {
432     CONTROL_BEHAVIOUR_DEFAULT            = 0, ///< Default behaviour: Size negotiation is enabled & listens to Style Change signal, but doesn't receive event callbacks. @SINCE_1_2_10
433     REQUIRES_STYLE_CHANGE_SIGNALS        = 1 << ( CustomActorImpl::ACTOR_FLAG_COUNT + 0 ),     ///< True if needs to monitor style change signals such as theme/font change @SINCE_1_0.0 @DEPRECATED_1_2_10
434     REQUIRES_KEYBOARD_NAVIGATION_SUPPORT = 1 << ( CustomActorImpl::ACTOR_FLAG_COUNT + 1 ),     ///< True if needs to support keyboard navigation @SINCE_1_0.0
435
436     DISABLE_STYLE_CHANGE_SIGNALS         = 1 << ( CustomActorImpl::ACTOR_FLAG_COUNT + 2 ),     ///< True if control should not monitor style change signals @SINCE_1_2_10
437
438     LAST_CONTROL_BEHAVIOUR_FLAG
439   };
440
441   static const int CONTROL_BEHAVIOUR_FLAG_COUNT = Log< LAST_CONTROL_BEHAVIOUR_FLAG - 1 >::value + 1;      ///< Total count of flags
442
443   /**
444    * @brief Control constructor.
445    *
446    * @SINCE_1_0.0
447    * @param[in] behaviourFlags Behavioural flags from ControlBehaviour enum
448    */
449   Control( ControlBehaviour behaviourFlags );
450
451   /**
452    * @brief Second phase initialization.
453    * @SINCE_1_0.0
454    */
455   void Initialize();
456
457 public: // API for derived classes to override
458
459   // Lifecycle
460
461   /**
462    * @brief This method is called after the Control has been initialized.
463    *
464    * Derived classes should do any second phase initialization by overriding this method.
465    * @SINCE_1_0.0
466    */
467   virtual void OnInitialize();
468
469   /**
470    * @DEPRECATED_1_1.30. Override OnChildAdd instead.
471    *
472    * @brief Called whenever an Actor is added to the control.
473    *
474    * Could be overridden by derived classes.
475    *
476    * @SINCE_1_0.0
477    * @param[in] child The added actor
478    */
479   virtual void OnControlChildAdd( Actor& child ) DALI_DEPRECATED_API;
480
481   /**
482    * @DEPRECATED_1_1.30. Override OnChildRemove instead.
483    *
484    * @brief Called whenever an Actor is removed from the control.
485    *
486    * Could be overridden by derived classes.
487    *
488    * @SINCE_1_0.0
489    * @param[in] child The removed actor
490    */
491   virtual void OnControlChildRemove( Actor& child ) DALI_DEPRECATED_API;
492
493   // Styling
494
495   /**
496    * @brief This method should be overridden by deriving classes requiring notifications when the style changes.
497    *
498    * @SINCE_1_0.0
499    * @param[in] styleManager The StyleManager object
500    * @param[in] change Information denoting what has changed
501    */
502   virtual void OnStyleChange( Toolkit::StyleManager styleManager, StyleChange::Type change );
503
504   // Accessibility
505
506   /**
507    * @brief This method is called when the control is accessibility activated.
508    *
509    * Derived classes should override this to perform custom accessibility activation.
510    * @SINCE_1_0.0
511    * @return true if this control can perform accessibility activation
512    */
513   virtual bool OnAccessibilityActivated();
514
515   /**
516    * @brief This method should be overridden by deriving classes when they wish to respond the accessibility
517    * pan gesture.
518    *
519    * @SINCE_1_0.0
520    * @param[in] gesture The pan gesture
521    * @return true if the pan gesture has been consumed by this control
522    */
523   virtual bool OnAccessibilityPan( PanGesture gesture );
524
525   /**
526    * @brief This method should be overridden by deriving classes when they wish to respond the accessibility
527    * touch event.
528    *
529    * @SINCE_1_0.0
530    * @param[in] touchEvent The touch event
531    * @return true if the touch event has been consumed by this control
532    */
533   virtual bool OnAccessibilityTouch( const TouchEvent& touchEvent );
534
535   /**
536    * @brief This method should be overridden by deriving classes when they wish to respond
537    * the accessibility up and down action (i.e. value change of slider control).
538    *
539    * @SINCE_1_0.0
540    * @param[in] isIncrease Whether the value should be increased or decreased
541    * @return true if the value changed action has been consumed by this control
542    */
543   virtual bool OnAccessibilityValueChange( bool isIncrease );
544
545   /**
546    * @brief This method should be overridden by deriving classes when they wish to respond
547    * the accessibility zoom action.
548    *
549    * @SINCE_1_0.0
550    * @return true if the zoom action has been consumed by this control
551    */
552   virtual bool OnAccessibilityZoom();
553
554   // Keyboard focus
555
556   /**
557    * @brief Called when the control gains key input focus.
558    *
559    * Should be overridden by derived classes if they need to customize what happens when focus is gained.
560    * @SINCE_1_0.0
561    */
562   virtual void OnKeyInputFocusGained();
563
564   /**
565    * @brief Called when the control loses key input focus.
566    *
567    * Should be overridden by derived classes if they need to customize what happens when focus is lost.
568    * @SINCE_1_0.0
569    */
570   virtual void OnKeyInputFocusLost();
571
572   /**
573    * @brief Gets the next keyboard focusable actor in this control towards the given direction.
574    *
575    * A control needs to override this function in order to support two dimensional keyboard navigation.
576    * @SINCE_1_0.0
577    * @param[in] currentFocusedActor The current focused actor
578    * @param[in] direction The direction to move the focus towards
579    * @param[in] loopEnabled Whether the focus movement should be looped within the control
580    * @return The next keyboard focusable actor in this control or an empty handle if no actor can be focused
581    */
582   virtual Actor GetNextKeyboardFocusableActor( Actor currentFocusedActor, Toolkit::Control::KeyboardFocus::Direction direction, bool loopEnabled );
583
584   /**
585    * @brief Informs this control that its chosen focusable actor will be focused.
586    *
587    * This allows the application to perform any actions if wishes
588    * before the focus is actually moved to the chosen actor.
589    *
590    * @SINCE_1_0.0
591    * @param[in] commitedFocusableActor The commited focusable actor
592    */
593   virtual void OnKeyboardFocusChangeCommitted( Actor commitedFocusableActor );
594
595   /**
596    * @brief This method is called when the control has enter pressed on it.
597    *
598    * Derived classes should override this to perform custom actions.
599    * @SINCE_1_0.0
600    * @return true if this control supported this action
601    */
602   virtual bool OnKeyboardEnter();
603
604   // Gestures
605
606   /**
607    * @brief Called whenever a pinch gesture is detected on this control.
608    *
609    * This can be overridden by deriving classes when pinch detection
610    * is enabled.  The default behaviour is to scale the control by the
611    * pinch scale.
612    *
613    * @SINCE_1_0.0
614    * @param[in] pinch The pinch gesture
615    * @note If overridden, then the default behavior will not occur.
616    * @note Pinch detection should be enabled via EnableGestureDetection().
617    * @see EnableGestureDetection
618    */
619   virtual void OnPinch( const PinchGesture& pinch );
620
621   /**
622    * @brief Called whenever a pan gesture is detected on this control.
623    *
624    * This should be overridden by deriving classes when pan detection
625    * is enabled.
626    *
627    * @SINCE_1_0.0
628    * @param[in] pan The pan gesture
629    * @note There is no default behavior with panning.
630    * @note Pan detection should be enabled via EnableGestureDetection().
631    * @see EnableGestureDetection
632    */
633   virtual void OnPan( const PanGesture& pan );
634
635   /**
636    * @brief Called whenever a tap gesture is detected on this control.
637    *
638    * This should be overridden by deriving classes when tap detection
639    * is enabled.
640    *
641    * @SINCE_1_0.0
642    * @param[in] tap The tap gesture
643    * @note There is no default behavior with a tap.
644    * @note Tap detection should be enabled via EnableGestureDetection().
645    * @see EnableGestureDetection
646    */
647   virtual void OnTap( const TapGesture& tap );
648
649   /**
650    * @brief Called whenever a long press gesture is detected on this control.
651    *
652    * This should be overridden by deriving classes when long press
653    * detection is enabled.
654    *
655    * @SINCE_1_0.0
656    * @param[in] longPress The long press gesture
657    * @note There is no default behaviour associated with a long press.
658    * @note Long press detection should be enabled via EnableGestureDetection().
659    * @see EnableGestureDetection
660    */
661   virtual void OnLongPress( const LongPressGesture& longPress );
662
663   // From ConnectionTrackerInterface
664
665   /**
666    * @copydoc ConnectionTrackerInterface::SignalConnected
667    */
668   virtual void SignalConnected( SlotObserver* slotObserver, CallbackBase* callback );
669
670   /**
671    * @copydoc ConnectionTrackerInterface::SignalDisconnected
672    */
673   virtual void SignalDisconnected( SlotObserver* slotObserver, CallbackBase* callback );
674
675   /**
676    * @brief Retrieves the extension for this control.
677    *
678    * @SINCE_1_0.0
679    * @return The extension if available, NULL otherwise
680    */
681   virtual Extension* GetControlExtension()
682   {
683     return NULL;
684   }
685
686 private:
687
688   /// @cond internal
689   // Undefined
690   DALI_INTERNAL Control( const Control& );
691   DALI_INTERNAL Control& operator=( const Control& );
692
693 public:
694   class Impl; // Class declaration is public so we can internally add devel API's to the Controls Impl
695
696 private:
697   Impl* mImpl;
698   /// @endcond
699 public:
700   void SetAccessibilityConstructor(std::function<std::unique_ptr<Dali::Accessibility::Accessible>(Dali::Actor)> constructor);
701   static Dali::Accessibility::Accessible *GetAccessibilityObject(Dali::Actor actor);
702   Toolkit::Control::AccessibilityActivateSignalType &AccessibilityActivateSignal();
703   void AccessibilitySetAttribute( const std::string& key, const std::string value );
704   std::string AccessibilityGetAttribute( const std::string& key );
705   void AccessibilityEraseAttribute( std::string& key );
706
707   struct AccessibleImpl : public virtual Dali::Accessibility::Accessible, public virtual Dali::Accessibility::Component, public virtual Dali::Accessibility::Collection,
708             public virtual Dali::Accessibility::Action {
709     Dali::Actor self;
710     Dali::Accessibility::Role role;
711     bool modal = false, root = false;
712
713     AccessibleImpl( Dali::Actor self, Dali::Accessibility::Role role,
714                     bool modal = false )
715         : self( self ), role( role ), modal( modal ) {}
716
717     std::string GetName() override;
718     std::string GetDescription() override;
719     Dali::Accessibility::Accessible* GetParent() override;
720     size_t GetChildCount() override;
721     Dali::Accessibility::Accessible* GetChildAtIndex( size_t index ) override;
722     size_t GetIndexInParent() override;
723     Dali::Accessibility::Role GetRole() override;
724     Dali::Accessibility::States GetStates() override;
725     Dali::Accessibility::Attributes GetAttributes() override;
726     Dali::Accessibility::Rectangle
727     GetExtents( Dali::Accessibility::CoordType ctype ) override;
728     Dali::Accessibility::ComponentLayer GetLayer() override;
729     int GetMdiZOrder() override;
730     bool GrabFocus() override;
731     double GetAlpha() override;
732     bool SetExtents( Dali::Accessibility::Rectangle rect,
733                      Dali::Accessibility::CoordType ctype ) override;
734     bool GrabHighlight() override;
735     bool ClearHighlight() override;
736     int GetHighlightIndex() override;
737
738     std::string GetActionName( size_t index ) override;
739     std::string GetLocalizedActionName( size_t index ) override;
740     std::string GetActionDescription( size_t index ) override;
741     size_t GetActionCount() override;
742     std::string GetActionKeyBinding( size_t index ) override;
743     bool DoAction( size_t index ) override;
744
745     virtual Dali::Accessibility::States CalculateStates();
746     virtual bool CalculateIsVisible() const;
747   };
748 };
749
750 /**
751  * @brief Gets implementation from the handle.
752  *
753  * @SINCE_1_0.0
754  * @param handle
755  * @return Implementation
756  * @pre handle is initialized and points to a control
757  */
758 DALI_IMPORT_API Internal::Control& GetImplementation( Dali::Toolkit::Control& handle );
759
760 /**
761  * @brief Gets implementation from the handle.
762  *
763  * @SINCE_1_0.0
764  * @param handle
765  * @return Implementation
766  * @pre Handle is initialized and points to a control.
767  */
768 DALI_IMPORT_API const Internal::Control& GetImplementation( const Dali::Toolkit::Control& handle );
769
770 } // namespace Internal
771
772 /**
773  * @}
774  */
775 } // namespace Toolkit
776
777 } // namespace Dali
778
779 #endif // DALI_TOOLKIT_CONTROL_IMPL_H