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