(Control) Make Control constructors explicit
[platform/core/uifw/dali-toolkit.git] / base / dali-toolkit / public-api / controls / control-impl.cpp
index 7fcbf76..d678af6 100644 (file)
  *
  */
 
+// CLASS HEADER
 #include <dali-toolkit/public-api/controls/control-impl.h>
 
+// EXTERNAL INCLUDES
 #include <stack>
-
+#include <dali/public-api/actors/image-actor.h>
+#include <dali/public-api/actors/mesh-actor.h>
+#include <dali/public-api/animation/constraints.h>
+#include <dali/public-api/geometry/mesh.h>
+#include <dali/public-api/object/type-registry.h>
+#include <dali/public-api/scripting/scripting.h>
 #include <dali/integration-api/debug.h>
 
-#include "dali-toolkit/internal/controls/relayout-controller.h"
-#include "dali-toolkit/internal/controls/relayout-helper.h"
-#include "dali-toolkit/public-api/focus-manager/keyinput-focus-manager.h"
-#include "dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h"
+#include <dali-toolkit/internal/controls/relayout-controller.h>
+#include <dali-toolkit/internal/controls/relayout-helper.h>
+#include <dali-toolkit/public-api/focus-manager/keyinput-focus-manager.h>
+#include <dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h>
 #include <dali-toolkit/public-api/controls/control.h>
-
 #include <dali-toolkit/public-api/styling/style-manager.h>
 #include <dali-toolkit/internal/styling/style-manager-impl.h>
 
@@ -76,6 +82,12 @@ TypeRegistration CONTROL_TYPE( typeid(Control), typeid(CustomActor), Create );
 
 TypeAction ACTION_TYPE_1( CONTROL_TYPE, Toolkit::Control::ACTION_CONTROL_ACTIVATED, &Internal::Control::DoAction );
 
+SignalConnectorType SIGNAL_CONNECTOR_1( CONTROL_TYPE, Toolkit::Control::SIGNAL_KEY_EVENT,     &Internal::Control::DoConnectSignal );
+SignalConnectorType SIGNAL_CONNECTOR_2( CONTROL_TYPE, Toolkit::Control::SIGNAL_TAPPED,        &Internal::Control::DoConnectSignal );
+SignalConnectorType SIGNAL_CONNECTOR_3( CONTROL_TYPE, Toolkit::Control::SIGNAL_PANNED,        &Internal::Control::DoConnectSignal );
+SignalConnectorType SIGNAL_CONNECTOR_4( CONTROL_TYPE, Toolkit::Control::SIGNAL_PINCHED,       &Internal::Control::DoConnectSignal );
+SignalConnectorType SIGNAL_CONNECTOR_5( CONTROL_TYPE, Toolkit::Control::SIGNAL_LONG_PRESSED,  &Internal::Control::DoConnectSignal );
+
 /**
  * Structure which holds information about the background of a control
  */
@@ -200,6 +212,7 @@ void SetupBackgroundActor( Actor actor, Property::Index constrainingIndex, const
 {
   actor.SetColor( color );
   actor.SetPositionInheritanceMode( USE_PARENT_POSITION_PLUS_LOCAL_POSITION );
+  actor.SetColorMode( USE_OWN_MULTIPLY_PARENT_COLOR );
   actor.SetZ( BACKGROUND_ACTOR_Z_POSITION );
 
   Constraint constraint = Constraint::New<Vector3>( constrainingIndex,
@@ -258,22 +271,22 @@ public:
 
   // Gesture Detection Methods
 
-  void PinchDetected(Actor actor, PinchGesture pinch)
+  void PinchDetected(Actor actor, const PinchGesture& pinch)
   {
     mControlImpl.OnPinch(pinch);
   }
 
-  void PanDetected(Actor actor, PanGesture pan)
+  void PanDetected(Actor actor, const PanGesture& pan)
   {
     mControlImpl.OnPan(pan);
   }
 
-  void TapDetected(Actor actor, TapGesture tap)
+  void TapDetected(Actor actor, const TapGesture& tap)
   {
     mControlImpl.OnTap(tap);
   }
 
-  void LongPressDetected(Actor actor, LongPressGesture longPress)
+  void LongPressDetected(Actor actor, const LongPressGesture& longPress)
   {
     mControlImpl.OnLongPress(longPress);
   }
@@ -329,7 +342,7 @@ public:
               controlImpl.SetBackground( image );
             }
           }
-          else if ( value.Get< Property::Map >().empty() )
+          else if ( value.Get< Property::Map >().Empty() )
           {
             // An empty map means the background is no longer required
             controlImpl.ClearBackground();
@@ -414,7 +427,7 @@ public:
               Image image = imageActor.GetImage();
               Property::Map imageMap;
               Scripting::CreatePropertyMap( image, imageMap );
-              map.push_back( Property::StringValuePair( "image", imageMap ) );
+              map[ "image" ] = imageMap;
             }
           }
 
@@ -549,7 +562,7 @@ public:
 
   Toolkit::Control::SizePolicy mWidthPolicy :3;  ///< Stores the width policy. 3 bits covers 8 values
   Toolkit::Control::SizePolicy mHeightPolicy :3; ///< Stores the height policy. 3 bits covers 8 values
-  ControlBehaviour mFlags :4;             ///< Flags passed in from constructor. Need to increase this size when new enums are added
+  ControlBehaviour mFlags :6;             ///< Flags passed in from constructor. Need to increase this size when new enums are added
   bool mInsideRelayout:1;                 ///< Detect when were in Relayout
   bool mIsKeyboardNavigationSupported:1;  ///< Stores whether keyboard navigation is supported by the control.
   bool mIsKeyboardFocusGroup:1;           ///< Stores whether the control is a focus group.
@@ -593,81 +606,136 @@ Control::~Control()
   delete mImpl;
 }
 
-void Control::Initialize()
+void Control::SetSizePolicy( Toolkit::Control::SizePolicy widthPolicy, Toolkit::Control::SizePolicy heightPolicy )
 {
+  bool relayoutRequest( false );
 
-  // Calling deriving classes
-  OnInitialize();
-
-  if( mImpl->mFlags & REQUIRES_STYLE_CHANGE_SIGNALS )
+  if ( ( mImpl->mWidthPolicy != widthPolicy ) || ( mImpl->mHeightPolicy != heightPolicy ) )
   {
-    Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
+    relayoutRequest = true;
+  }
 
-    // Register for style changes
-    styleManager.StyleChangeSignal().Connect( this, &Control::DoStyleChange );
+  mImpl->mWidthPolicy = widthPolicy;
+  mImpl->mHeightPolicy = heightPolicy;
 
-    // SetTheme
-    GetImpl( styleManager ).ApplyThemeStyle( GetOwner() );
+  // Ensure RelayoutRequest is called AFTER new policies have been set.
+  if ( relayoutRequest )
+  {
+    RelayoutRequest();
   }
+}
 
-  mImpl->mInitialized = true;
+void Control::GetSizePolicy( Toolkit::Control::SizePolicy& widthPolicy, Toolkit::Control::SizePolicy& heightPolicy ) const
+{
+  widthPolicy = mImpl->mWidthPolicy;
+  heightPolicy = mImpl->mHeightPolicy;
 }
 
-void Control::EnableGestureDetection(Gesture::Type type)
+void Control::SetMinimumSize( const Vector3& size )
 {
-  if ( (type & Gesture::Pinch) && !mImpl->mPinchGestureDetector )
+  const Vector3& minSize = mImpl->GetMinimumSize();
+  if ( fabsf( minSize.width - size.width ) > Math::MACHINE_EPSILON_1000 ||
+       fabsf( minSize.height - size.height ) > Math::MACHINE_EPSILON_1000 )
   {
-    mImpl->mPinchGestureDetector = PinchGestureDetector::New();
-    mImpl->mPinchGestureDetector.DetectedSignal().Connect(mImpl, &Impl::PinchDetected);
-    mImpl->mPinchGestureDetector.Attach(Self());
-  }
+    mImpl->SetMinimumSize( size );
 
-  if ( (type & Gesture::Pan) && !mImpl->mPanGestureDetector )
-  {
-    mImpl->mPanGestureDetector = PanGestureDetector::New();
-    mImpl->mPanGestureDetector.DetectedSignal().Connect(mImpl, &Impl::PanDetected);
-    mImpl->mPanGestureDetector.Attach(Self());
+    // Only relayout if our control is using the minimum or range policy.
+    if ( ( mImpl->mHeightPolicy == Toolkit::Control::Minimum ) || ( mImpl->mWidthPolicy  == Toolkit::Control::Minimum ) ||
+         ( mImpl->mHeightPolicy == Toolkit::Control::Range   ) || ( mImpl->mWidthPolicy  == Toolkit::Control::Range   ) )
+    {
+      RelayoutRequest();
+    }
   }
+}
 
-  if ( (type & Gesture::Tap) && !mImpl->mTapGestureDetector )
+const Vector3& Control::GetMinimumSize() const
+{
+  return mImpl->GetMinimumSize();
+}
+
+void Control::SetMaximumSize( const Vector3& size )
+{
+  const Vector3& maxSize = mImpl->GetMaximumSize();
+  if ( fabsf( maxSize.width - size.width ) > Math::MACHINE_EPSILON_1000 ||
+       fabsf( maxSize.height - size.height ) > Math::MACHINE_EPSILON_1000 )
   {
-    mImpl->mTapGestureDetector = TapGestureDetector::New();
-    mImpl->mTapGestureDetector.DetectedSignal().Connect(mImpl, &Impl::TapDetected);
-    mImpl->mTapGestureDetector.Attach(Self());
+    mImpl->SetMaximumSize( size );
+
+    // Only relayout if our control is using the maximum or range policy.
+    if ( ( mImpl->mHeightPolicy == Toolkit::Control::Maximum ) || ( mImpl->mWidthPolicy  == Toolkit::Control::Maximum ) ||
+         ( mImpl->mHeightPolicy == Toolkit::Control::Range   ) || ( mImpl->mWidthPolicy  == Toolkit::Control::Range   ) )
+    {
+      RelayoutRequest();
+    }
   }
+}
 
-  if ( (type & Gesture::LongPress) && !mImpl->mLongPressGestureDetector )
+const Vector3& Control::GetMaximumSize() const
+{
+  return mImpl->GetMaximumSize();
+}
+
+Vector3 Control::GetNaturalSize()
+{
+  // could be overridden in derived classes.
+  return mImpl->mNaturalSize;
+}
+
+float Control::GetHeightForWidth( float width )
+{
+  // could be overridden in derived classes.
+  float height( 0.0f );
+  if ( mImpl->mNaturalSize.width > 0.0f )
   {
-    mImpl->mLongPressGestureDetector = LongPressGestureDetector::New();
-    mImpl->mLongPressGestureDetector.DetectedSignal().Connect(mImpl, &Impl::LongPressDetected);
-    mImpl->mLongPressGestureDetector.Attach(Self());
+    height = mImpl->mNaturalSize.height * width / mImpl->mNaturalSize.width;
   }
+  return height;
 }
 
-void Control::DisableGestureDetection(Gesture::Type type)
+float Control::GetWidthForHeight( float height )
 {
-  if ( (type & Gesture::Pinch) && mImpl->mPinchGestureDetector )
+  // could be overridden in derived classes.
+  float width( 0.0f );
+  if ( mImpl->mNaturalSize.height > 0.0f )
   {
-    mImpl->mPinchGestureDetector.Detach(Self());
-    mImpl->mPinchGestureDetector.Reset();
+    width = mImpl->mNaturalSize.width * height / mImpl->mNaturalSize.height;
   }
+  return width;
+}
 
-  if ( (type & Gesture::Pan) && mImpl->mPanGestureDetector )
+const Vector3& Control::GetControlSize() const
+{
+  return mImpl->mCurrentSize;
+}
+
+const Vector3& Control::GetSizeSet() const
+{
+  return mImpl->mNaturalSize;
+}
+
+void Control::SetKeyInputFocus()
+{
+  if( Self().OnStage() )
   {
-    mImpl->mPanGestureDetector.Detach(Self());
-    mImpl->mPanGestureDetector.Reset();
+    Toolkit::KeyInputFocusManager::Get().SetFocus(Toolkit::Control::DownCast(Self()));
   }
+}
 
-  if ( (type & Gesture::Tap) && mImpl->mTapGestureDetector )
+bool Control::HasKeyInputFocus()
+{
+  bool result = false;
+  if( Self().OnStage() )
   {
-    mImpl->mTapGestureDetector.Detach(Self());
-    mImpl->mTapGestureDetector.Reset();
+    result = Toolkit::KeyInputFocusManager::Get().IsKeyboardListener(Toolkit::Control::DownCast(Self()));
   }
+  return result;
+}
 
-  if ( (type & Gesture::LongPress) && mImpl->mLongPressGestureDetector)
+void Control::ClearKeyInputFocus()
+{
+  if( Self().OnStage() )
   {
-    mImpl->mLongPressGestureDetector.Detach(Self());
-    mImpl->mLongPressGestureDetector.Reset();
+    Toolkit::KeyInputFocusManager::Get().RemoveFocus(Toolkit::Control::DownCast(Self()));
   }
 }
 
@@ -733,7 +801,7 @@ void Control::SetBackground( Image image )
   {
     // Remove Current actor, unset AFTER removal so that we do not inform deriving classes
     Self().Remove( background.actor );
-    background.actor = NULL;
+    background.actor.Reset();
   }
 
   ImageActor imageActor = ImageActor::New( image );
@@ -766,122 +834,20 @@ Actor Control::GetBackgroundActor() const
   return Actor();
 }
 
-void Control::OnThemeChange( Toolkit::StyleManager styleManager )
-{
-  GetImpl( styleManager ).ApplyThemeStyle( GetOwner() );
-}
-
-void Control::OnPinch(PinchGesture pinch)
-{
-  if( !( mImpl->mStartingPinchScale ) )
-  {
-    // lazy allocate
-    mImpl->mStartingPinchScale = new Vector3;
-  }
-
-  if( pinch.state == Gesture::Started )
-  {
-    *( mImpl->mStartingPinchScale ) = Self().GetCurrentScale();
-  }
-
-  Self().SetScale( *( mImpl->mStartingPinchScale ) * pinch.scale );
-}
-
-void Control::OnStageConnection()
-{
-  RelayoutRequest();
-
-  // Notify derived classes.
-  OnControlStageConnection();
-}
-
-void Control::OnStageDisconnection()
-{
-  // Notify derived classes
-  OnControlStageDisconnection();
-}
-
-void Control::OnChildAdd(Actor& child)
-{
-  // If this is the background actor, then we do not want to relayout or inform deriving classes
-  if ( mImpl->mBackground && ( child == mImpl->mBackground->actor ) )
-  {
-    return;
-  }
-
-  // Request for relayout as we may need to position the new child and old ones
-  RelayoutRequest();
-
-  // Notify derived classes.
-  OnControlChildAdd( child );
-}
-
-void Control::OnChildRemove(Actor& child)
-{
-  // If this is the background actor, then we do not want to relayout or inform deriving classes
-  if ( mImpl->mBackground && ( child == mImpl->mBackground->actor ) )
-  {
-    return;
-  }
-
-  // Request for relayout as we may need to re-position the old child
-  RelayoutRequest();
-
-  // Notify derived classes.
-  OnControlChildRemove( child );
-}
-
-void Control::OnSizeSet(const Vector3& targetSize)
-{
-  if( ( !mImpl->mInsideRelayout ) && ( targetSize != mImpl->mNaturalSize ) )
-  {
-    // Only updates size if set through Actor's API
-    mImpl->mNaturalSize = targetSize;
-  }
-
-  if( targetSize != mImpl->mCurrentSize )
-  {
-    // Update control size.
-    mImpl->mCurrentSize = targetSize;
-
-    // Notify derived classes.
-    OnControlSizeSet( targetSize );
-  }
-}
-
-void Control::OnSizeAnimation(Animation& animation, const Vector3& targetSize)
-{
-  // @todo consider animating negotiated child sizes to target size
-}
-
-bool Control::OnTouchEvent(const TouchEvent& event)
-{
-  return false; // Do not consume
-}
-
-bool Control::OnKeyEvent(const KeyEvent& event)
-{
-  return false; // Do not consume
-}
-
-bool Control::OnMouseWheelEvent(const MouseWheelEvent& event)
-{
-  return false; // Do not consume
-}
-
-void Control::OnKeyInputFocusGained()
+void Control::SetKeyboardNavigationSupport(bool isSupported)
 {
-  // Do Nothing
+  mImpl->mIsKeyboardNavigationSupported = isSupported;
 }
 
-void Control::OnKeyInputFocusLost()
+bool Control::IsKeyboardNavigationSupported()
 {
-  // Do Nothing
+  return mImpl->mIsKeyboardNavigationSupported;
 }
 
-Actor Control::GetChildByAlias(const std::string& actorAlias)
+void Control::Activate()
 {
-  return Actor();
+  // Inform deriving classes
+  OnActivated();
 }
 
 bool Control::OnAccessibilityPan(PanGesture gesture)
@@ -899,250 +865,6 @@ bool Control::OnAccessibilityValueChange(bool isIncrease)
   return false; // Accessibility value change action is not handled by default
 }
 
-
-void Control::SetKeyboardNavigationSupport(bool isSupported)
-{
-  mImpl->mIsKeyboardNavigationSupported = isSupported;
-}
-
-bool Control::IsKeyboardNavigationSupported()
-{
-  return mImpl->mIsKeyboardNavigationSupported;
-}
-
-void Control::SetAsKeyboardFocusGroup(bool isFocusGroup)
-{
-  mImpl->mIsKeyboardFocusGroup = isFocusGroup;
-
-  // The following line will be removed when the deprecated API in KeyboardFocusManager is deleted
-  Toolkit::KeyboardFocusManager::Get().SetAsFocusGroup(Self(), isFocusGroup);
-}
-
-bool Control::IsKeyboardFocusGroup()
-{
-  return Toolkit::KeyboardFocusManager::Get().IsFocusGroup(Self());
-}
-
-Actor Control::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Toolkit::Control::KeyboardFocusNavigationDirection direction, bool loopEnabled)
-{
-  return Actor();
-}
-
-bool Control::DoAction(BaseObject* object, const std::string& actionName, const std::vector<Property::Value>& attributes)
-{
-  bool ret = false;
-
-  if( object && (actionName == Toolkit::Control::ACTION_CONTROL_ACTIVATED) )
-  {
-    Toolkit::Control control = Toolkit::Control::DownCast( BaseHandle( object ) );
-    if( control )
-    {
-      // if cast succeeds there is an implementation so no need to check
-      control.GetImplementation().OnActivated();
-    }
-  }
-
-  return ret;
-}
-
-void Control::DoStyleChange( Toolkit::StyleManager styleManager, StyleChange change )
-{
-  if( change.themeChange )
-  {
-    OnThemeChange( styleManager );
-  }
-  else if( change.defaultFontChange || change.defaultFontSizeChange )
-  {
-    OnFontChange( change.defaultFontChange, change.defaultFontSizeChange );
-  }
-}
-
-Toolkit::Control::KeyEventSignalV2& Control::KeyEventSignal()
-{
-  return mImpl->mKeyEventSignalV2;
-}
-
-void Control::SetSizePolicy( Toolkit::Control::SizePolicy widthPolicy, Toolkit::Control::SizePolicy heightPolicy )
-{
-  bool relayoutRequest( false );
-
-  if ( ( mImpl->mWidthPolicy != widthPolicy ) || ( mImpl->mHeightPolicy != heightPolicy ) )
-  {
-    relayoutRequest = true;
-  }
-
-  mImpl->mWidthPolicy = widthPolicy;
-  mImpl->mHeightPolicy = heightPolicy;
-
-  // Ensure RelayoutRequest is called AFTER new policies have been set.
-  if ( relayoutRequest )
-  {
-    RelayoutRequest();
-  }
-}
-
-void Control::GetSizePolicy( Toolkit::Control::SizePolicy& widthPolicy, Toolkit::Control::SizePolicy& heightPolicy ) const
-{
-  widthPolicy = mImpl->mWidthPolicy;
-  heightPolicy = mImpl->mHeightPolicy;
-}
-
-void Control::SetMinimumSize( const Vector3& size )
-{
-  const Vector3& minSize = mImpl->GetMinimumSize();
-  if ( fabsf( minSize.width - size.width ) > Math::MACHINE_EPSILON_1000 ||
-       fabsf( minSize.height - size.height ) > Math::MACHINE_EPSILON_1000 )
-  {
-    mImpl->SetMinimumSize( size );
-
-    // Only relayout if our control is using the minimum or range policy.
-    if ( ( mImpl->mHeightPolicy == Toolkit::Control::Minimum ) || ( mImpl->mWidthPolicy  == Toolkit::Control::Minimum ) ||
-         ( mImpl->mHeightPolicy == Toolkit::Control::Range   ) || ( mImpl->mWidthPolicy  == Toolkit::Control::Range   ) )
-    {
-      RelayoutRequest();
-    }
-  }
-}
-
-const Vector3& Control::GetMinimumSize() const
-{
-  return mImpl->GetMinimumSize();
-}
-
-void Control::SetMaximumSize( const Vector3& size )
-{
-  const Vector3& maxSize = mImpl->GetMaximumSize();
-  if ( fabsf( maxSize.width - size.width ) > Math::MACHINE_EPSILON_1000 ||
-       fabsf( maxSize.height - size.height ) > Math::MACHINE_EPSILON_1000 )
-  {
-    mImpl->SetMaximumSize( size );
-
-    // Only relayout if our control is using the maximum or range policy.
-    if ( ( mImpl->mHeightPolicy == Toolkit::Control::Maximum ) || ( mImpl->mWidthPolicy  == Toolkit::Control::Maximum ) ||
-         ( mImpl->mHeightPolicy == Toolkit::Control::Range   ) || ( mImpl->mWidthPolicy  == Toolkit::Control::Range   ) )
-    {
-      RelayoutRequest();
-    }
-  }
-}
-
-const Vector3& Control::GetMaximumSize() const
-{
-  return mImpl->GetMaximumSize();
-}
-
-Vector3 Control::GetNaturalSize()
-{
-  // could be overridden in derived classes.
-  return mImpl->mNaturalSize;
-}
-
-float Control::GetHeightForWidth( float width )
-{
-  // could be overridden in derived classes.
-  float height( 0.0f );
-  if ( mImpl->mNaturalSize.width > 0.0f )
-  {
-    height = mImpl->mNaturalSize.height * width / mImpl->mNaturalSize.width;
-  }
-  return height;
-}
-
-float Control::GetWidthForHeight( float height )
-{
-  // could be overridden in derived classes.
-  float width( 0.0f );
-  if ( mImpl->mNaturalSize.height > 0.0f )
-  {
-    width = mImpl->mNaturalSize.width * height / mImpl->mNaturalSize.height;
-  }
-  return width;
-}
-
-const Vector3& Control::GetControlSize() const
-{
-  return mImpl->mCurrentSize;
-}
-
-const Vector3& Control::GetSizeSet() const
-{
-  return mImpl->mNaturalSize;
-}
-
-void Control::SetKeyInputFocus()
-{
-  if( Self().OnStage() )
-  {
-    Toolkit::KeyInputFocusManager::Get().SetFocus(Toolkit::Control::DownCast(Self()));
-  }
-}
-
-bool Control::HasKeyInputFocus()
-{
-  bool result = false;
-  if( Self().OnStage() )
-  {
-    result = Toolkit::KeyInputFocusManager::Get().IsKeyboardListener(Toolkit::Control::DownCast(Self()));
-  }
-  return result;
-}
-
-void Control::ClearKeyInputFocus()
-{
-  if( Self().OnStage() )
-  {
-    Toolkit::KeyInputFocusManager::Get().RemoveFocus(Toolkit::Control::DownCast(Self()));
-  }
-}
-
-void Control::RelayoutRequest()
-{
-  // unfortunate double negative but thats to guarantee new controls get size negotiation
-  // by default and have to "opt-out" if they dont want it
-  if( !(mImpl->mFlags & NO_SIZE_NEGOTIATION) )
-  {
-    Internal::RelayoutController::Request();
-  }
-}
-
-void Control::Relayout(Vector2 size, ActorSizeContainer& container)
-{
-  // Avoids relayout again when OnSizeSet callback arrives.
-  mImpl->mInsideRelayout = true;
-  Self().SetSize( size );
-  // @todo this really needs to be at the end of method but not sure why the scope used to be only the SetSize, needs to be cleaned up in size negotiation rework
-  mImpl->mInsideRelayout = false;
-
-  // Only relayout controls which requested to be relaid out.
-  OnRelaidOut( size, container );
-}
-
-void Control::Relayout( Actor actor, Vector2 size, ActorSizeContainer& container )
-{
-  if ( actor )
-  {
-    Toolkit::Control control( Toolkit::Control::DownCast( actor ) );
-    if( control )
-    {
-      control.GetImplementation().NegotiateSize( size, container );
-    }
-    else
-    {
-      container.push_back( ActorSizePair( actor, size ) );
-    }
-  }
-}
-
-void Control::OnRelaidOut( Vector2 size, ActorSizeContainer& container )
-{
-  unsigned int numChildren = Self().GetChildCount();
-
-  for( unsigned int i=0; i<numChildren; ++i )
-  {
-    container.push_back( ActorSizePair( Self().GetChildAt(i), size ) );
-  }
-}
-
 void Control::NegotiateSize( Vector2 allocatedSize, ActorSizeContainer& container )
 {
   Vector2 size;
@@ -1248,18 +970,106 @@ void Control::NegotiateSize( Vector2 allocatedSize, ActorSizeContainer& containe
   Relayout( size, container );
 }
 
-bool Control::EmitKeyEventSignal( const KeyEvent& event )
+void Control::SetAsKeyboardFocusGroup(bool isFocusGroup)
 {
-  // Guard against destruction during signal emission
-  Dali::Toolkit::Control handle( GetOwner() );
-
-  bool consumed = false;
+  mImpl->mIsKeyboardFocusGroup = isFocusGroup;
 
-  // signals are allocated dynamically when someone connects
-  if ( !mImpl->mKeyEventSignalV2.Empty() )
-  {
-    consumed = mImpl->mKeyEventSignalV2.Emit( handle, event );
-  }
+  // The following line will be removed when the deprecated API in KeyboardFocusManager is deleted
+  Toolkit::KeyboardFocusManager::Get().SetAsFocusGroup(Self(), isFocusGroup);
+}
+
+bool Control::IsKeyboardFocusGroup()
+{
+  return Toolkit::KeyboardFocusManager::Get().IsFocusGroup(Self());
+}
+
+Actor Control::GetNextKeyboardFocusableActor(Actor currentFocusedActor, Toolkit::Control::KeyboardFocusNavigationDirection direction, bool loopEnabled)
+{
+  return Actor();
+}
+
+void Control::OnKeyboardFocusChangeCommitted(Actor commitedFocusableActor)
+{
+}
+
+bool Control::DoAction(BaseObject* object, const std::string& actionName, const PropertyValueContainer& attributes)
+{
+  bool ret = false;
+
+  if( object && (actionName == Toolkit::Control::ACTION_CONTROL_ACTIVATED) )
+  {
+    Toolkit::Control control = Toolkit::Control::DownCast( BaseHandle( object ) );
+    if( control )
+    {
+      // if cast succeeds there is an implementation so no need to check
+      control.GetImplementation().OnActivated();
+    }
+  }
+
+  return ret;
+}
+
+bool Control::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
+{
+  Dali::BaseHandle handle( object );
+
+  bool connected( false );
+  Toolkit::Control control = Toolkit::Control::DownCast(handle);
+  if ( control )
+  {
+    Control& controlImpl( control.GetImplementation() );
+    connected = true;
+
+    if ( Toolkit::Control::SIGNAL_KEY_EVENT == signalName )
+    {
+      controlImpl.KeyEventSignal().Connect( tracker, functor );
+    }
+    else if( Toolkit::Control::SIGNAL_TAPPED == signalName )
+    {
+      controlImpl.EnableGestureDetection( Gesture::Tap );
+      controlImpl.GetTapGestureDetector().DetectedSignal().Connect( tracker, functor );
+    }
+    else if( Toolkit::Control::SIGNAL_PANNED == signalName )
+    {
+      controlImpl.EnableGestureDetection( Gesture::Pan );
+      controlImpl.GetPanGestureDetector().DetectedSignal().Connect( tracker, functor );
+    }
+    else if( Toolkit::Control::SIGNAL_PINCHED == signalName )
+    {
+      controlImpl.EnableGestureDetection( Gesture::Pinch );
+      controlImpl.GetPinchGestureDetector().DetectedSignal().Connect( tracker, functor );
+    }
+    else if( Toolkit::Control::SIGNAL_LONG_PRESSED == signalName )
+    {
+      controlImpl.EnableGestureDetection( Gesture::LongPress );
+      controlImpl.GetLongPressGestureDetector().DetectedSignal().Connect( tracker, functor );
+    }
+    else
+    {
+      // signalName does not match any signal
+      connected = false;
+    }
+  }
+  return connected;
+}
+
+Toolkit::Control::KeyEventSignalV2& Control::KeyEventSignal()
+{
+  return mImpl->mKeyEventSignalV2;
+}
+
+bool Control::EmitKeyEventSignal( const KeyEvent& event )
+{
+  // Guard against destruction during signal emission
+  Dali::Toolkit::Control handle( GetOwner() );
+
+  bool consumed = false;
+
+  // signals are allocated dynamically when someone connects
+  if ( !mImpl->mKeyEventSignalV2.Empty() )
+  {
+    consumed = mImpl->mKeyEventSignalV2.Emit( handle, event );
+  }
 
   if (!consumed)
   {
@@ -1270,6 +1080,297 @@ bool Control::EmitKeyEventSignal( const KeyEvent& event )
   return consumed;
 }
 
+Control::Control( ControlBehaviour behaviourFlags )
+: CustomActorImpl( behaviourFlags & REQUIRES_TOUCH_EVENTS ),
+  mImpl(new Impl(*this))
+{
+  mImpl->mFlags = behaviourFlags;
+}
+
+void Control::Initialize()
+{
+
+  // Calling deriving classes
+  OnInitialize();
+
+  if( mImpl->mFlags & REQUIRES_STYLE_CHANGE_SIGNALS )
+  {
+    Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
+
+    // Register for style changes
+    styleManager.StyleChangeSignal().Connect( this, &Control::DoStyleChange );
+
+    // SetTheme
+    GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) );
+  }
+
+  SetRequiresHoverEvents(mImpl->mFlags & REQUIRES_HOVER_EVENTS);
+  SetRequiresMouseWheelEvents(mImpl->mFlags & REQUIRES_MOUSE_WHEEL_EVENTS);
+
+  mImpl->mInitialized = true;
+}
+
+void Control::EnableGestureDetection(Gesture::Type type)
+{
+  if ( (type & Gesture::Pinch) && !mImpl->mPinchGestureDetector )
+  {
+    mImpl->mPinchGestureDetector = PinchGestureDetector::New();
+    mImpl->mPinchGestureDetector.DetectedSignal().Connect(mImpl, &Impl::PinchDetected);
+    mImpl->mPinchGestureDetector.Attach(Self());
+  }
+
+  if ( (type & Gesture::Pan) && !mImpl->mPanGestureDetector )
+  {
+    mImpl->mPanGestureDetector = PanGestureDetector::New();
+    mImpl->mPanGestureDetector.DetectedSignal().Connect(mImpl, &Impl::PanDetected);
+    mImpl->mPanGestureDetector.Attach(Self());
+  }
+
+  if ( (type & Gesture::Tap) && !mImpl->mTapGestureDetector )
+  {
+    mImpl->mTapGestureDetector = TapGestureDetector::New();
+    mImpl->mTapGestureDetector.DetectedSignal().Connect(mImpl, &Impl::TapDetected);
+    mImpl->mTapGestureDetector.Attach(Self());
+  }
+
+  if ( (type & Gesture::LongPress) && !mImpl->mLongPressGestureDetector )
+  {
+    mImpl->mLongPressGestureDetector = LongPressGestureDetector::New();
+    mImpl->mLongPressGestureDetector.DetectedSignal().Connect(mImpl, &Impl::LongPressDetected);
+    mImpl->mLongPressGestureDetector.Attach(Self());
+  }
+}
+
+void Control::DisableGestureDetection(Gesture::Type type)
+{
+  if ( (type & Gesture::Pinch) && mImpl->mPinchGestureDetector )
+  {
+    mImpl->mPinchGestureDetector.Detach(Self());
+    mImpl->mPinchGestureDetector.Reset();
+  }
+
+  if ( (type & Gesture::Pan) && mImpl->mPanGestureDetector )
+  {
+    mImpl->mPanGestureDetector.Detach(Self());
+    mImpl->mPanGestureDetector.Reset();
+  }
+
+  if ( (type & Gesture::Tap) && mImpl->mTapGestureDetector )
+  {
+    mImpl->mTapGestureDetector.Detach(Self());
+    mImpl->mTapGestureDetector.Reset();
+  }
+
+  if ( (type & Gesture::LongPress) && mImpl->mLongPressGestureDetector)
+  {
+    mImpl->mLongPressGestureDetector.Detach(Self());
+    mImpl->mLongPressGestureDetector.Reset();
+  }
+}
+
+void Control::RelayoutRequest()
+{
+  // unfortunate double negative but thats to guarantee new controls get size negotiation
+  // by default and have to "opt-out" if they dont want it
+  if( !(mImpl->mFlags & NO_SIZE_NEGOTIATION) )
+  {
+    Internal::RelayoutController::Request();
+  }
+}
+
+void Control::Relayout( Actor actor, Vector2 size, ActorSizeContainer& container )
+{
+  if ( actor )
+  {
+    Toolkit::Control control( Toolkit::Control::DownCast( actor ) );
+    if( control )
+    {
+      control.GetImplementation().NegotiateSize( size, container );
+    }
+    else
+    {
+      container.push_back( ActorSizePair( actor, size ) );
+    }
+  }
+}
+
+void Control::OnInitialize()
+{
+}
+
+void Control::OnActivated()
+{
+}
+
+void Control::OnThemeChange( Toolkit::StyleManager styleManager )
+{
+  GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) );
+}
+
+void Control::OnFontChange( bool defaultFontChange, bool defaultFontSizeChange )
+{
+}
+
+void Control::OnPinch(const PinchGesture& pinch)
+{
+  if( !( mImpl->mStartingPinchScale ) )
+  {
+    // lazy allocate
+    mImpl->mStartingPinchScale = new Vector3;
+  }
+
+  if( pinch.state == Gesture::Started )
+  {
+    *( mImpl->mStartingPinchScale ) = Self().GetCurrentScale();
+  }
+
+  Self().SetScale( *( mImpl->mStartingPinchScale ) * pinch.scale );
+}
+
+void Control::OnPan( const PanGesture& pan )
+{
+}
+
+void Control::OnTap(const TapGesture& tap)
+{
+}
+
+void Control::OnLongPress( const LongPressGesture& longPress )
+{
+}
+
+void Control::OnControlStageConnection()
+{
+}
+
+void Control::OnControlStageDisconnection()
+{
+}
+
+void Control::OnControlChildAdd( Actor& child )
+{
+}
+
+void Control::OnControlChildRemove( Actor& child )
+{
+}
+
+void Control::OnControlSizeSet( const Vector3& size )
+{
+}
+
+void Control::OnRelaidOut( Vector2 size, ActorSizeContainer& container )
+{
+  unsigned int numChildren = Self().GetChildCount();
+
+  for( unsigned int i=0; i<numChildren; ++i )
+  {
+    container.push_back( ActorSizePair( Self().GetChildAt(i), size ) );
+  }
+}
+
+void Control::OnKeyInputFocusGained()
+{
+  // Do Nothing
+}
+
+void Control::OnKeyInputFocusLost()
+{
+  // Do Nothing
+}
+
+void Control::OnSizeAnimation(Animation& animation, const Vector3& targetSize)
+{
+  // @todo consider animating negotiated child sizes to target size
+}
+
+bool Control::OnTouchEvent(const TouchEvent& event)
+{
+  return false; // Do not consume
+}
+
+bool Control::OnHoverEvent(const HoverEvent& event)
+{
+  return false; // Do not consume
+}
+
+bool Control::OnKeyEvent(const KeyEvent& event)
+{
+  return false; // Do not consume
+}
+
+bool Control::OnMouseWheelEvent(const MouseWheelEvent& event)
+{
+  return false; // Do not consume
+}
+
+Actor Control::GetChildByAlias(const std::string& actorAlias)
+{
+  return Actor();
+}
+
+void Control::OnStageConnection()
+{
+  RelayoutRequest();
+
+  // Notify derived classes.
+  OnControlStageConnection();
+}
+
+void Control::OnStageDisconnection()
+{
+  // Notify derived classes
+  OnControlStageDisconnection();
+}
+
+void Control::OnChildAdd(Actor& child)
+{
+  // If this is the background actor, then we do not want to relayout or inform deriving classes
+  if ( mImpl->mBackground && ( child == mImpl->mBackground->actor ) )
+  {
+    return;
+  }
+
+  // Request for relayout as we may need to position the new child and old ones
+  RelayoutRequest();
+
+  // Notify derived classes.
+  OnControlChildAdd( child );
+}
+
+void Control::OnChildRemove(Actor& child)
+{
+  // If this is the background actor, then we do not want to relayout or inform deriving classes
+  if ( mImpl->mBackground && ( child == mImpl->mBackground->actor ) )
+  {
+    return;
+  }
+
+  // Request for relayout as we may need to re-position the old child
+  RelayoutRequest();
+
+  // Notify derived classes.
+  OnControlChildRemove( child );
+}
+
+void Control::OnSizeSet(const Vector3& targetSize)
+{
+  if( ( !mImpl->mInsideRelayout ) && ( targetSize != mImpl->mNaturalSize ) )
+  {
+    // Only updates size if set through Actor's API
+    mImpl->mNaturalSize = targetSize;
+  }
+
+  if( targetSize != mImpl->mCurrentSize )
+  {
+    // Update control size.
+    mImpl->mCurrentSize = targetSize;
+
+    // Notify derived classes.
+    OnControlSizeSet( targetSize );
+  }
+}
+
 void Control::SignalConnected( SlotObserver* slotObserver, CallbackBase* callback )
 {
   mImpl->SignalConnected( slotObserver, callback );
@@ -1280,11 +1381,28 @@ void Control::SignalDisconnected( SlotObserver* slotObserver, CallbackBase* call
   mImpl->SignalDisconnected( slotObserver, callback );
 }
 
-Control::Control( ControlBehaviour behaviourFlags )
-: CustomActorImpl( behaviourFlags & REQUIRES_TOUCH_EVENTS ),
-  mImpl(new Impl(*this))
+void Control::DoStyleChange( Toolkit::StyleManager styleManager, StyleChange change )
 {
-  mImpl->mFlags = behaviourFlags;
+  if( change.themeChange )
+  {
+    OnThemeChange( styleManager );
+  }
+  else if( change.defaultFontChange || change.defaultFontSizeChange )
+  {
+    OnFontChange( change.defaultFontChange, change.defaultFontSizeChange );
+  }
+}
+
+void Control::Relayout(Vector2 size, ActorSizeContainer& container)
+{
+  // Avoids relayout again when OnSizeSet callback arrives.
+  mImpl->mInsideRelayout = true;
+  Self().SetSize( size );
+  // @todo this really needs to be at the end of method but not sure why the scope used to be only the SetSize, needs to be cleaned up in size negotiation rework
+  mImpl->mInsideRelayout = false;
+
+  // Only relayout controls which requested to be relaid out.
+  OnRelaidOut( size, container );
 }
 
 } // namespace Internal