Basic support for style names
[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) 2014 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/public-api/adaptor-framework/style-change.h>
23 #include <dali/public-api/common/vector-wrapper.h>
24 #include <dali/public-api/events/long-press-gesture.h>
25 #include <dali/public-api/events/pan-gesture.h>
26 #include <dali/public-api/events/pinch-gesture.h>
27 #include <dali/public-api/events/tap-gesture.h>
28 #include <dali/public-api/object/property-index-ranges.h>
29 #include <dali/public-api/object/type-info.h>
30
31 // INTERNAL INCLUDES
32 #include <dali-toolkit/public-api/controls/control.h>
33
34 namespace Dali
35 {
36
37 namespace Toolkit
38 {
39
40 class StyleManager;
41
42 namespace Internal DALI_INTERNAL
43 {
44 class RelayoutControllerImpl;
45 class KeyInputFocusManager;
46 }
47
48 typedef std::pair< Actor, Vector2 > ActorSizePair;       ///< Pair of actor and size
49 typedef std::vector< ActorSizePair > ActorSizeContainer; ///< Container of actors and their sizes
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  */
61 class DALI_IMPORT_API Control : public CustomActorImpl, public ConnectionTrackerInterface
62 {
63 public:
64
65   // Creation & Destruction
66
67   /**
68    * @brief Create a new ControlImpl instance that does not require touch by default.
69    *
70    * If touch is required then the user can connect to this class' touch signal.
71    * @return A handle to the ControlImpl instance.
72    */
73   static Toolkit::Control New();
74
75   /**
76    * @brief Virtual destructor.
77    */
78   virtual ~Control();
79
80   // Size negotiation
81
82   /**
83    * @copydoc Toolkit::Control::SetSizePolicy()
84    */
85   void SetSizePolicy( Toolkit::Control::SizePolicy widthPolicy, Toolkit::Control::SizePolicy heightPolicy );
86
87   /**
88    * @copydoc Toolkit::Control::GetSizePolicy()
89    */
90   void GetSizePolicy( Toolkit::Control::SizePolicy& widthPolicy, Toolkit::Control::SizePolicy& heightPolicy ) const;
91
92   /**
93    * @copydoc Toolkit::Control::SetMinimumSize()
94    */
95   void SetMinimumSize( const Vector3& size );
96
97   /**
98    * @copydoc Toolkit::Control::GetMinimumSize()
99    */
100   const Vector3& GetMinimumSize() const;
101
102   /**
103    * @copydoc Toolkit::Control::SetMaximumSize()
104    */
105   void SetMaximumSize( const Vector3& size );
106
107   /**
108    * @copydoc Toolkit::Control::GetMaximumSize()
109    */
110   const Vector3& GetMaximumSize() const;
111
112   /**
113    * @copydoc Toolkit::Control::GetNaturalSize()
114    */
115   virtual Vector3 GetNaturalSize();
116
117   /**
118    * @brief This method is called during size negotiation when a height is required for a given width.
119    *
120    * Derived classes should override this if they wish to customize the height returned.
121    *
122    * @param width to use.
123    * @return the height based on the width.
124    */
125   virtual float GetHeightForWidth( float width );
126
127   /**
128    * @brief This method is called during size negotiation when a width is required for a given height.
129    *
130    * Derived classes should override this if they wish to customize the width returned.
131    *
132    * @param height to use.
133    * @return the width based on the width.
134    */
135   virtual float GetWidthForHeight( float height );
136
137   /**
138    * @brief Retrieves the current Control's size.
139    *
140    * @return The control's size.
141    */
142   const Vector3& GetControlSize() const;
143
144   /**
145    * @brief Retrieves the Control's size set by the Application / Control.
146    *
147    * @return The control's size.
148    */
149   const Vector3& GetSizeSet() const;
150
151   // Key Input
152
153   /**
154    * @copydoc Toolkit::Control::SetKeyInputFocus()
155    */
156   void SetKeyInputFocus();
157
158   /**
159    * @copydoc Toolkit::Control::HasKeyInputFocus()
160    */
161   bool HasKeyInputFocus();
162
163   /**
164    * @copydoc Toolkit::Control::ClearKeyInputFocus()
165    */
166   void ClearKeyInputFocus();
167
168   // Gesture Detection
169
170   /**
171    * @brief If deriving classes wish to fine tune pinch gesture
172    * detection then they can access the gesture detector through this
173    * API and modify the detection.
174    *
175    * @return The pinch gesture detector.
176    * @pre Pinch detection should have been enabled via EnableGestureDetection().
177    * @see EnableGestureDetection
178    */
179   PinchGestureDetector GetPinchGestureDetector() const;
180
181   /**
182    * @brief If deriving classes wish to fine tune pan gesture
183    * detection then they can access the gesture detector through this
184    * API and modify the detection.
185    *
186    * @return The pan gesture detector.
187    * @pre Pan detection should have been enabled via EnableGestureDetection().
188    * @see EnableGestureDetection
189    */
190   PanGestureDetector GetPanGestureDetector() const;
191
192   /**
193    * @brief If deriving classes wish to fine tune tap gesture
194    * detection then they can access the gesture detector through this
195    * API and modify the detection.
196    *
197    * @return The tap gesture detector.
198    * @pre Tap detection should have been enabled via EnableGestureDetection().
199    * @see EnableGestureDetection
200    */
201   TapGestureDetector GetTapGestureDetector() const;
202
203   /**
204    * @brief If deriving classes wish to fine tune long press gesture
205    * detection then they can access the gesture detector through this
206    * API and modify the detection.
207    *
208    * @return The long press gesture detector.
209    * @pre Long press detection should have been enabled via EnableGestureDetection().
210    * @see EnableGestureDetection
211    */
212   LongPressGestureDetector GetLongPressGestureDetector() const;
213
214   // Background
215
216   /**
217    * @copydoc Dali::Toolkit::Control::SetStyleName
218    */
219   void SetStyleName( const std::string& styleName );
220
221   /**
222    * @copydoc Dali::Toolkit::Control::GetStyleName
223    */
224   const std::string& GetStyleName() const;
225
226   /**
227    * @copydoc Dali::Toolkit::Control::SetBackgroundColor
228    */
229   void SetBackgroundColor( const Vector4& color );
230
231   /**
232    * @copydoc Dali::Toolkit::Control::GetBackgroundColor
233    */
234   Vector4 GetBackgroundColor() const;
235
236   /**
237    * @copydoc Dali::Toolkit::Control::SetBackground
238    */
239   void SetBackground( Image image );
240
241   /**
242    * @copydoc Dali::Toolkit::Control::ClearBackground
243    */
244   void ClearBackground();
245
246   /**
247    * @copydoc Dali::Toolkit::Control::GetBackgroundActor
248    */
249   Actor GetBackgroundActor() const;
250
251   // Keyboard Navigation
252
253   /**
254    * @brief Sets whether this control supports two dimensional
255    * keyboard navigation (i.e. whether it knows how to handle the
256    * keyboardn focus movement between its child actors).
257    *
258    * The control doesn't support it by default.
259    * @param[in] isSupported Whether this control supports two dimensional keyboard navigation.
260    */
261   void SetKeyboardNavigationSupport(bool isSupported);
262
263   /**
264    * @brief Gets whether this control supports two dimensional keyboard navigation.
265    *
266    * @return true if this control supports two dimensional keyboard navigation.
267    */
268   bool IsKeyboardNavigationSupported();
269
270   // Called by Focus Managers
271
272   /**
273    * @brief Called by the focus manager and keyboard focus manager to Activate the Control
274    */
275   DALI_INTERNAL void Activate();
276
277   /**
278    * @brief This method should be overridden by deriving classes when they wish to respond the accessibility
279    * pan gesture.
280    *
281    * @param[in] gesture The pan gesture.
282    * @return true if the pan gesture has been consumed by this control
283    */
284   virtual bool OnAccessibilityPan(PanGesture gesture);
285
286   /**
287    * @brief This method should be overridden by deriving classes when they wish to respond the accessibility
288    * touch event.
289    *
290    * @param[in] touchEvent The touch event.
291    * @return true if the touch event has been consumed by this control
292    */
293   virtual bool OnAccessibilityTouch(const TouchEvent& touchEvent);
294
295   /**
296    * @brief This method should be overridden by deriving classes when they wish to respond
297    * the accessibility up and down action (i.e. value change of slider control).
298    *
299    * @param[in] isIncrease Whether the value should be increased or decreased
300    * @return true if the value changed action has been consumed by this control
301    */
302   virtual bool OnAccessibilityValueChange(bool isIncrease);
303
304   // Called by the RelayoutController
305
306   /**
307    * @brief Called by the RelayoutController to negotiate the size of a control.
308    *
309    * The size allocated by the the algorithm is passed in which the
310    * control must adhere to.  A container is passed in as well which
311    * the control should populate with actors it has not / or does not
312    * need to handle in its size negotiation.
313    *
314    * @param[in]      size       The allocated size.
315    * @param[in,out]  container  The container that holds actors that are fed back into the
316    *                            RelayoutController algorithm.
317    */
318   DALI_INTERNAL void NegotiateSize( const Vector2& size, ActorSizeContainer& container );
319
320   // Keyboard Focus
321
322   /**
323    * @brief Sets whether this control is a focus group for keyboard navigation.
324    *
325    * (i.e. the scope of keyboard focus movement
326    * can be limitied to its child actors). The control is not a focus group by default.
327    * @param[in] isFocusGroup Whether this control is set as a focus group for keyboard navigation.
328    */
329   void SetAsKeyboardFocusGroup(bool isFocusGroup);
330
331   /**
332    * @brief Gets whether this control is a focus group for keyboard navigation.
333    *
334    * @return true if this control is set as a focus group for keyboard navigation.
335    */
336   bool IsKeyboardFocusGroup();
337
338   /**
339    * @brief Gets the next keyboard focusable actor in this control towards the given direction.
340    *
341    * A control needs to override this function in order to support two dimensional keyboard navigation.
342    * @param[in] currentFocusedActor The current focused actor.
343    * @param[in] direction The direction to move the focus towards.
344    * @param[in] loopEnabled Whether the focus movement should be looped within the control.
345    * @return the next keyboard focusable actor in this control or an empty handle if no actor can be focused.
346    */
347   virtual Actor GetNextKeyboardFocusableActor(Actor currentFocusedActor, Toolkit::Control::KeyboardFocusNavigationDirection direction, bool loopEnabled);
348
349   /**
350    * @brief Informs this control that its chosen focusable actor will be focused.
351    *
352    * This allows the application to preform any actions if wishes
353    * before the focus is actually moved to the chosen actor.
354    *
355    * @param[in] commitedFocusableActor The commited focusable actor.
356    */
357   virtual void OnKeyboardFocusChangeCommitted(Actor commitedFocusableActor);
358
359   // Actions & Signals
360
361   /**
362    * @brief Performs actions as requested using the action name.
363    *
364    * @param[in] object The object on which to perform the action.
365    * @param[in] actionName The action to perform.
366    * @param[in] attributes The attributes with which to perfrom this action.
367    * @return true if action has been accepted by this control
368    */
369   static bool DoAction(BaseObject* object, const std::string& actionName, const PropertyValueContainer& attributes);
370
371   /**
372    * Connects a callback function with the object's signals.
373    * @param[in] object The object providing the signal.
374    * @param[in] tracker Used to disconnect the signal.
375    * @param[in] signalName The signal to connect to.
376    * @param[in] functor A newly allocated FunctorDelegate.
377    * @return True if the signal was connected.
378    * @post If a signal was connected, ownership of functor was passed to CallbackBase. Otherwise the caller is responsible for deleting the unused functor.
379    */
380   static bool DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor );
381
382   /**
383    * @copydoc Dali::Toolkit::Control::KeyEventSignal()
384    */
385   Toolkit::Control::KeyEventSignalType& KeyEventSignal();
386
387   /**
388    * @brief Called by the KeyInputFocusManager to emit key event signals.
389    *
390    * @param[in] event The key event.
391    * @return True if the event was consumed.
392    */
393   DALI_INTERNAL bool EmitKeyEventSignal(const KeyEvent& event);
394
395 protected:
396
397   // Construction
398
399   // Flags for the constructor
400   enum ControlBehaviour
401   {
402     CONTROL_BEHAVIOUR_NONE        = 0,
403     REQUIRES_TOUCH_EVENTS         = 1<<1,     ///< True if the OnTouchEvent() callback is required.
404     REQUIRES_STYLE_CHANGE_SIGNALS = 1<<2,     ///< True if needs to monitor style change signals such as theme/font change
405     NO_SIZE_NEGOTIATION           = 1<<3,     ///< True if control does not need size negotiation, i.e. it can be skipped in the algorithm
406     REQUIRES_HOVER_EVENTS         = 1<<4,     ///< True if the OnHoverEvent() callback is required.
407     REQUIRES_MOUSE_WHEEL_EVENTS   = 1<<5      ///< True if the OnMouseWheelEvent() callback is required.
408   };
409
410   /**
411    * @brief Create a Control.
412    *
413    * @param[in] behaviourFlags Behavioural flags from ControlBehaviour enum
414    */
415   Control(ControlBehaviour behaviourFlags);
416
417   /**
418    * @brief Second phase initialization.
419    */
420   void Initialize();
421
422   // Gesture Detection
423
424   /**
425    * @brief Allows deriving classes to enable any of the gesture detectors that are available.
426    *
427    * Gesture detection can be enabled one at a time or in bitwise format as shown:
428    * @code
429    * EnableGestureDetection(Gesture::Type(Gesture::Pinch | Gesture::Tap | Gesture::Pan));
430    * @endcode
431    * @param[in]  type  The gesture type(s) to enable.
432    */
433   void EnableGestureDetection(Gesture::Type type);
434
435   /**
436    * @brief Allows deriving classes to disable any of the gesture detectors.
437    *
438    * Like EnableGestureDetection, this can also be called using bitwise or.
439    * @param[in]  type  The gesture type(s) to disable.
440    * @see EnableGetureDetection
441    */
442   void DisableGestureDetection(Gesture::Type type);
443
444   // Size Negotiation
445
446   /**
447    * @brief Request a relayout, which means performing a size negotiation on this control, its parent and children (and potentially whole scene)
448    *
449    * This method is automatically called from OnStageConnection(), OnChildAdd(),
450    * OnChildRemove(), SetSizePolicy(), SetMinimumSize() and SetMaximumSize().
451    *
452    * This method can also be called from a derived class every time it needs a different size.
453    * At the end of event processing, the relayout process starts and
454    * all controls which requested Relayout will have their sizes (re)negotiated.
455    *
456    * @note RelayoutRequest() can be called multiple times; the size negotiation is still
457    * only performed once, i.e. there is no need to keep track of this in the calling side.
458    */
459   void RelayoutRequest();
460
461   /**
462    * @brief Helper method for controls to Relayout their children if
463    * they do not know whether that child is a control or not.
464    *
465    * @param[in]      actor      The actor to relayout.
466    * @param[in]      size       The size to allocate to the actor.
467    * @param[in,out]  container  The container that holds actors that have not been allocated a size yet.
468    */
469   static void Relayout( Actor actor, const Vector2& size, ActorSizeContainer& container );
470
471 private:
472
473   // For derived classes to override
474
475   /**
476    * @brief This method is called after the Control has been initialized.
477    *
478    * Derived classes should do any second phase initialization by overriding this method.
479    */
480   virtual void OnInitialize();
481
482   /**
483    * @brief This method is called when the control is activated.
484    *
485    * Derived classes should override this if they wish to be notified when they are activated.
486    */
487   virtual void OnActivated();
488
489   /**
490    * @brief This method should be overridden by deriving classes requiring notifications when the style changes.
491    *
492    * @param[in] styleManager  The StyleManager object.
493    * @param[in] change  Information denoting what has changed.
494    */
495   virtual void OnStyleChange( Toolkit::StyleManager styleManager, StyleChange change );
496
497   /**
498    * @brief Called whenever a pinch gesture is detected on this control.
499    *
500    * This can be overridden by deriving classes when pinch detection
501    * is enabled.  The default behaviour is to scale the control by the
502    * pinch scale.
503    *
504    * @note If overridden, then the default behaviour will not occur.
505    * @note Pinch detection should be enabled via EnableGestureDetection().
506    * @param[in]  pinch  The pinch gesture.
507    * @see EnableGestureDetection
508    */
509   virtual void OnPinch(const PinchGesture& pinch);
510
511   /**
512    * @brief Called whenever a pan gesture is detected on this control.
513    *
514    * This should be overridden by deriving classes when pan detection
515    * is enabled.
516    *
517    * @note There is no default behaviour with panning.
518    * @note Pan detection should be enabled via EnableGestureDetection().
519    * @param[in]  pan  The pan gesture.
520    * @see EnableGestureDetection
521    */
522   virtual void OnPan( const PanGesture& pan );
523
524   /**
525    * @brief Called whenever a tap gesture is detected on this control.
526    *
527    * This should be overridden by deriving classes when tap detection
528    * is enabled.
529    *
530    * @note There is no default behaviour with a tap.
531    * @note Tap detection should be enabled via EnableGestureDetection().
532    * @param[in]  tap  The tap gesture.
533    * @see EnableGestureDetection
534    */
535   virtual void OnTap( const TapGesture& tap );
536
537   /**
538    * @brief Called whenever a long press gesture is detected on this control.
539    *
540    * This should be overridden by deriving classes when long press
541    * detection is enabled.
542    *
543    * @note There is no default behaviour associated with a long press.
544    * @note Long press detection should be enabled via EnableGestureDetection().
545    * @param[in]  longPress  The long press gesture.
546    * @see EnableGestureDetection
547    */
548   virtual void OnLongPress( const LongPressGesture& longPress );
549
550   /**
551    * @brief Called whenever the control is added to the stage.
552    *
553    * Could be overridden by derived classes.
554    */
555   virtual void OnControlStageConnection();
556
557   /**
558    * @brief Called whenever the control is removed from the stage.
559    *
560    * Could be overridden by derived classes.
561    */
562   virtual void OnControlStageDisconnection();
563
564   /**
565    * @brief Called whenever an Actor is added to the control.
566    *
567    * Could be overridden by derived classes.
568    *
569    * @param[in] child The added actor.
570    */
571   virtual void OnControlChildAdd( Actor& child );
572
573   /**
574    * @brief Called whenever an Actor is removed from the control.
575    *
576    * Could be overridden by derived classes.
577    *
578    * @param[in] child The removed actor.
579    */
580   virtual void OnControlChildRemove( Actor& child );
581
582   /**
583    * @brief Called whenever the Control's size is set.
584    *
585    * Could be overridden by derived classes.
586    *
587    * @param[in] size The new size.
588    */
589   virtual void OnControlSizeSet( const Vector3& size );
590
591   /**
592    * @brief Called after the size negotiation has been finished for this control.
593    *
594    * The control is expected to assign this given size to itself/its children.
595    *
596    * Should be overridden by derived classes if they need to layout
597    * actors differently after certain operations like add or remove
598    * actors, resize or after changing specific properties.
599    *
600    * Note! As this function is called from inside the size negotiation algorithm, you cannot
601    * call RequestRelayout (the call would just be ignored)
602    *
603    * @param[in]      size       The allocated size.
604    * @param[in,out]  container  The control should add actors to this container that it is not able
605    *                            to allocate a size for.
606    */
607   virtual void OnRelayout( const Vector2& size, ActorSizeContainer& container );
608
609   /**
610    * @brief Called when the control gains key input focus.
611    *
612    * Should be overridden by derived classes if they need to customize what happens when focus is gained.
613    */
614   virtual void OnKeyInputFocusGained();
615
616   /**
617    * @brief Called when the control loses key input focus.
618    *
619    * Should be overridden by derived classes if they need to customize what happens when focus is lost.
620    */
621   virtual void OnKeyInputFocusLost();
622
623   // From CustomActorImpl, derived classes can override these.
624
625   /**
626    * @copydoc Dali::CustomActorImpl::OnSizeAnimation(Animation&, const Vector3&)
627    */
628   virtual void OnSizeAnimation(Animation& animation, const Vector3& targetSize);
629
630   /**
631    * @copydoc Dali::CustomActorImpl::OnTouchEvent(const TouchEvent&)
632    */
633   virtual bool OnTouchEvent(const TouchEvent& event);
634
635   /**
636    * @copydoc Dali::CustomActorImpl::OnHoverEvent(const HoverEvent&)
637    */
638   virtual bool OnHoverEvent(const HoverEvent& event);
639
640   /**
641    * @copydoc Dali::CustomActorImpl::OnKeyEvent(const KeyEvent&)
642    */
643   virtual bool OnKeyEvent(const KeyEvent& event);
644
645   /**
646    * @copydoc Dali::CustomActorImpl::OnMouseWheelEvent(const MouseWheelEvent&)
647    */
648   virtual bool OnMouseWheelEvent(const MouseWheelEvent& event);
649
650   // From CustomActorImpl, derived classes should NOT override these.
651
652   /**
653    * @brief Sends a request to relayout this control.
654    *
655    * The control will be relaid out after the
656    * Dali::Stage::SignalMessageQueueFlushed() signal is emitted.
657    *
658    * It calls OnControlStageConnection() to notify derived classes.
659    *
660    * @see Dali::CustomActorImpl::OnStageConnection()
661    */
662   virtual void OnStageConnection();
663
664   /**
665    * @brief Calls OnControlStageDisconnection() to notify derived classed.
666    *
667    * @see Dali::CustomActorImpl::OnStageDisconnection()
668    */
669   virtual void OnStageDisconnection();
670
671   /**
672    * @brief Sends a request to relayout this control.
673    *
674    * The control will be relaid out after the
675    * Dali::Stage::SignalMessageQueueFlushed() signal is emitted.  It
676    * calls OnControlChildAdd() to notify derived classes.
677    *
678    * @note This method shouldn't be overridden by derived classes.
679    *
680    * @param[in] child The added actor.
681    *
682    * @see Dali::CustomActorImpl::OnChildAdd(Actor&)
683    */
684   virtual void OnChildAdd(Actor& child);
685
686   /**
687    * @brief Sends a request to relayout this control.
688    *
689    * The control will be relaid out after the
690    * Dali::Stage::SignalMessageQueueFlushed() signal is emitted.  It
691    * calls OnControlChildRemove() to notify derived classes.
692    *
693    * @note This method shouldn't be overridden by derived classes.
694    *
695    * @param[in] child The removed actor.
696    *
697    * @see Dali::CustomActorImpl::OnChildRemove(Actor&)
698    */
699   virtual void OnChildRemove(Actor& child);
700
701   /**
702    * @brief It stores the size set by size negotiation and relayout.
703    *
704    * It also keeps a backup of the size set through the Actor's API used in the size negotiation.
705    * It calls the OnControlSizeSet() to notify derived classes.
706    *
707    * @param[in] targetSize The new size.
708    *
709    * @see Dali::CustomActorImpl::OnSizeSet(const Vector3&)
710    */
711   virtual void OnSizeSet(const Vector3& targetSize);
712
713   // From ConnectionTrackerInterface
714
715   /**
716    * @copydoc ConnectionTrackerInterface::SignalConnected
717    */
718   virtual void SignalConnected( SlotObserver* slotObserver, CallbackBase* callback );
719
720   /**
721    * @copydoc ConnectionTrackerInterface::SignalDisconnected
722    */
723   virtual void SignalDisconnected( SlotObserver* slotObserver, CallbackBase* callback );
724
725 private:
726
727   // Undefined
728   DALI_INTERNAL Control(const Control&);
729   DALI_INTERNAL Control& operator=(const Control&);
730
731   class Impl;
732   Impl* mImpl;
733
734   friend class Internal::KeyInputFocusManager;     ///< KeyInputFocusManager needs to call several methods which are private. // TODO: Remove
735 };
736
737 } // namespace Internal
738
739 } // namespace Toolkit
740
741 } // namespace Dali
742
743 #endif // __DALI_TOOLKIT_CONTROL_IMPL_H__