Replace vector.h with vector-wrapper.h
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / buttons / push-button-default-painter-impl.cpp
index cf0cf92..31176f4 100644 (file)
 // EXTERNAL INCLUDES
 #include <dali/public-api/actors/image-actor.h>
 #include <dali/public-api/adaptor-framework/timer.h>
+#include <dali/public-api/animation/active-constraint.h>
+#include <dali/public-api/animation/constraint.h>
 #include <dali/public-api/animation/constraints.h>
 #include <dali/public-api/object/ref-object.h>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/public-api/controls/buttons/push-button.h>
-#include <dali-toolkit/public-api/controls/text-view/text-view.h>
 #include "push-button-impl.h"
 
 namespace Dali
@@ -89,180 +90,190 @@ PushButtonDefaultPainter::~PushButtonDefaultPainter()
   }
 }
 
-void PushButtonDefaultPainter::SetButtonImage( Toolkit::PushButton& pushButton, Actor image )
+void PushButtonDefaultPainter::Initialize( Toolkit::Button& button )
 {
-  Toolkit::Internal::PushButton& pushButtonImpl = GetImplementation( pushButton );
+  Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
   Actor& buttonImage = pushButtonImpl.GetButtonImage();
-  Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
+  Actor& selectedImage = pushButtonImpl.GetSelectedImage();
+  Actor& backgroundImage = pushButtonImpl.GetBackgroundImage();
+  Actor& disabledImage = pushButtonImpl.GetDisabledImage();
+  Actor& disabledBackgroundImage = pushButtonImpl.GetDisabledBackgroundImage();
+  Actor& label = pushButtonImpl.GetLabel();
 
-  switch( mPaintState )
+  Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
+
+  if( buttonImage )
   {
-    case ReleasedState:
-    {
-      if( buttonImage && buttonImage.GetParent() )
-      {
-        StopFadeOutAnimation( pushButton );
-        FadeOutImage( pushButton, Foreground, buttonImage );
+    SetButtonImage( pushButton, buttonImage );
+  }
 
-        buttonImage = image;
+  if( backgroundImage )
+  {
+    SetBackgroundImage( pushButton, backgroundImage );
+  }
 
-        FadeInImage( pushButton, buttonImage );
+  if( selectedImage )
+  {
+    SetSelectedImage( pushButton, selectedImage );
+  }
 
-        StartFadeOutAnimation( pushButton );
-        StartFadeInAnimation();
-      }
-      else
-      {
-        buttonImage = image;
-        pushButton.Add( buttonImage );
-      }
-      break;
-    }
-    case ReleasedPressedTransition: // FALLTHROUGH
-    case ReleasedDisabledTransition:
-    {
-      float opacity = 1.f;
-      if( fadeOutButtonImage )
-      {
-        opacity = fadeOutButtonImage.GetCurrentOpacity();
-      }
-      StopFadeOutAnimation( pushButton );
+  if( disabledImage )
+  {
+    SetDisabledImage( pushButton, disabledImage );
+  }
 
-      // Replaces the button image.
-      buttonImage = image;
+  if( disabledBackgroundImage )
+  {
+    SetDisabledBackgroundImage( pushButton, disabledBackgroundImage );
+  }
 
-      pushButton.Add( buttonImage );
-      FadeOutImage( pushButton, Foreground, buttonImage, opacity );
+  if( label )
+  {
+    SetLabel( pushButton, label );
+  }
 
-      StartFadeOutAnimation( pushButton );
-      break;
-    }
-    case PressedReleasedTransition: // FALLTHROUGH
-    case DisabledReleasedTransition:
-    {
-      StopFadeInAnimation();
-      pushButton.Remove( buttonImage );
+  SetDisabled( pushButton, mDisabled );
+}
 
-      buttonImage = image;
+void PushButtonDefaultPainter::SetSize( Toolkit::Button& button, const Vector3& size )
+{
+  if( size != mSize )
+  {
+    mSize = size;
 
-      FadeInImage( pushButton, buttonImage );
-      StartFadeInAnimation();
-      break;
+    Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
+    Actor& buttonImage = pushButtonImpl.GetButtonImage();
+    Actor& selectedImage = pushButtonImpl.GetSelectedImage();
+    Actor& backgroundImage = pushButtonImpl.GetBackgroundImage();
+    Actor& disabledImage = pushButtonImpl.GetDisabledImage();
+    Actor& disabledBackgroundImage = pushButtonImpl.GetDisabledBackgroundImage();
+    Actor& label = pushButtonImpl.GetLabel();
+
+    ApplyConstraint( buttonImage, FOREGROUND_DEPTH );
+    ApplyConstraint( backgroundImage, BACKGROUND_DEPTH );
+    ApplyConstraint( selectedImage, FOREGROUND_DEPTH );
+    ApplyConstraint( disabledImage, FOREGROUND_DEPTH );
+    ApplyConstraint( disabledBackgroundImage, BACKGROUND_DEPTH );
+
+    if( label )
+    {
+      label.SetPosition( 0.f, 0.f, LABEL_DEPTH );
+      label.SetSize( mSize );
     }
-    default:
-      buttonImage = image;
-      break;
   }
-
-  buttonImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
-  buttonImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
-  ApplyConstraint( buttonImage, FOREGROUND_DEPTH );
 }
 
-void PushButtonDefaultPainter::SetBackgroundImage( Toolkit::PushButton& pushButton, Actor image )
+void PushButtonDefaultPainter::SetDisabled( Toolkit::Button& button, bool disabled )
 {
-  Toolkit::Internal::PushButton& pushButtonImpl = GetImplementation( pushButton );
+  Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
+  Actor& buttonImage = pushButtonImpl.GetButtonImage();
+  Actor& selectedImage = pushButtonImpl.GetSelectedImage();
   Actor& backgroundImage = pushButtonImpl.GetBackgroundImage();
-  Actor& fadeOutBackgroundImage = pushButtonImpl.GetFadeOutBackgroundImage();
+  Actor& disabledImage = pushButtonImpl.GetDisabledImage();
+  Actor& disabledBackgroundImage = pushButtonImpl.GetDisabledBackgroundImage();
+  Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
+
+  Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
+
+  mDisabled = disabled;
 
   switch( mPaintState )
   {
-    case ReleasedState:             // FALLTHROUGH
-    case PressedState:
-    case ReleasedPressedTransition:
-    case PressedReleasedTransition:
+  case ReleasedState:
+  {
+    if( disabled )
     {
-      if( backgroundImage && backgroundImage.GetParent() )
-      {
-        StopFadeOutAnimation( pushButton );
-        FadeOutImage( pushButton, Background, backgroundImage  );
-
-        backgroundImage = image;
-
-        FadeInImage( pushButton, backgroundImage );
+      StopFadeOutAnimation( pushButton );
+      FadeOutImage( pushButton, Background, backgroundImage );
+      FadeOutImage( pushButton, Foreground, buttonImage );
+      FadeInImage( pushButton, disabledBackgroundImage );
+      FadeInImage( pushButton, disabledImage );
+      StartFadeOutAnimation( pushButton );
+      StartFadeInAnimation();
 
-        StartFadeOutAnimation( pushButton );
-        StartFadeInAnimation();
+      if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
+      {
+        mPaintState = ReleasedDisabledTransition;
       }
       else
       {
-        backgroundImage = image;
-        pushButton.Add( backgroundImage );
+        mPaintState = DisabledReleasedState;
       }
-      break;
     }
-    case ReleasedDisabledTransition: // FALLTHROUGH
-    case PressedDisabledTransition:
+    break;
+  }
+  case PressedState:
+  {
+    if( disabled )
     {
-      float opacity = 1.f;
-      if( fadeOutBackgroundImage )
-      {
-        opacity = fadeOutBackgroundImage.GetCurrentOpacity();
-      }
       StopFadeOutAnimation( pushButton );
-
-      // Replaces the button image.
-      backgroundImage = image;
-
-      pushButton.Add( backgroundImage );
-      FadeOutImage( pushButton, Background, backgroundImage, opacity );
-
+      FadeOutImage( pushButton, Background, backgroundImage );
+      FadeOutImage( pushButton, Foreground, selectedImage );
+      FadeInImage( pushButton, disabledBackgroundImage );
+      FadeInImage( pushButton, disabledImage );
       StartFadeOutAnimation( pushButton );
-      break;
+      StartFadeInAnimation();
+
+      if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
+      {
+        mPaintState = PressedDisabledTransition;
+      }
+      else
+      {
+        mPaintState = DisabledPressedState;
+      }
     }
-    case DisabledReleasedTransition: // FALLTHROUGH
-    case DisabledPressedTransition:
+    break;
+  }
+  case DisabledReleasedState:
+  {
+    if( !disabled )
     {
-      StopFadeInAnimation();
-      pushButton.Remove( backgroundImage );
-
-      backgroundImage = image;
-
+      StopFadeOutAnimation( pushButton );
+      FadeOutImage( pushButton, Background, disabledBackgroundImage );
+      FadeOutImage( pushButton, Foreground, disabledImage );
       FadeInImage( pushButton, backgroundImage );
+      FadeInImage( pushButton, buttonImage );
+      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
-      break;
-    }
-    default:
-      backgroundImage = image;
-      break;
-    }
-
-  backgroundImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
-  backgroundImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
-  ApplyConstraint( backgroundImage, BACKGROUND_DEPTH );
-}
 
-void PushButtonDefaultPainter::SetSelectedImage( Toolkit::PushButton& pushButton, Actor image )
-{
-  Toolkit::Internal::PushButton& pushButtonImpl = GetImplementation( pushButton );
-  Actor& selectedImage = pushButtonImpl.GetSelectedImage();
-  Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
-
-  switch( mPaintState )
+      if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
+      {
+        mPaintState = DisabledReleasedTransition;
+      }
+      else
+      {
+        mPaintState = ReleasedState;
+      }
+    }
+    break;
+  }
+  case DisabledPressedState:
   {
-    case PressedState:
+    if( !disabled )
     {
-      if( selectedImage && selectedImage.GetParent() )
-      {
-        StopFadeOutAnimation( pushButton );
-        FadeOutImage( pushButton, Foreground, selectedImage  );
-
-        selectedImage = image;
-
-        FadeInImage( pushButton, selectedImage );
+      StopFadeOutAnimation( pushButton );
+      FadeOutImage( pushButton, Background, disabledBackgroundImage );
+      FadeOutImage( pushButton, Foreground, disabledImage );
+      FadeInImage( pushButton, backgroundImage );
+      FadeInImage( pushButton, selectedImage );
+      StartFadeOutAnimation( pushButton );
+      StartFadeInAnimation();
 
-        StartFadeOutAnimation( pushButton );
-        StartFadeInAnimation();
+      if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
+      {
+        mPaintState = DisabledPressedTransition;
       }
       else
       {
-        selectedImage = image;
-        pushButton.Add( selectedImage );
+        mPaintState = PressedState;
       }
-      break;
     }
-    case PressedReleasedTransition: // FALLTHROUGH
-    case PressedDisabledTransition:
+    break;
+  }
+  case ReleasedPressedTransition:
+  {
+    if( disabled )
     {
       float opacity = 1.f;
       if( fadeOutButtonImage )
@@ -270,604 +281,608 @@ void PushButtonDefaultPainter::SetSelectedImage( Toolkit::PushButton& pushButton
         opacity = fadeOutButtonImage.GetCurrentOpacity();
       }
       StopFadeOutAnimation( pushButton );
+      StopFadeInAnimation();
 
-      // Replaces the button image.
-      selectedImage = image;
+      FadeOutImage( pushButton, Foreground, selectedImage, 1.f - opacity );
+      FadeOutImage( pushButton, Background, backgroundImage );
 
-      pushButton.Add( selectedImage );
-      FadeOutImage( pushButton, Foreground, selectedImage, opacity );
+      FadeInImage( pushButton, disabledImage );
+      FadeInImage( pushButton, disabledBackgroundImage );
 
       StartFadeOutAnimation( pushButton );
-      break;
-    }
-    case ReleasedPressedTransition: // FALLTHROUGH
-    case DisabledPressedTransition:
-    {
-      StopFadeInAnimation();
-      pushButton.Remove( selectedImage );
-
-      selectedImage = image;
-
-      FadeInImage( pushButton, selectedImage );
       StartFadeInAnimation();
-      break;
-    }
-    default:
-      selectedImage = image;
-      break;
-  }
-
-  selectedImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
-  selectedImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
-  ApplyConstraint( selectedImage, FOREGROUND_DEPTH );
-}
-
-void PushButtonDefaultPainter::SetDisabledImage( Toolkit::PushButton& pushButton, Actor image )
-{
-  Toolkit::Internal::PushButton& pushButtonImpl = GetImplementation( pushButton );
-  Actor& disabledImage = pushButtonImpl.GetDisabledImage();
-  Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
 
-  switch( mPaintState )
-  {
-    case DisabledReleasedState: // FALLTHROUGH
-    case DisabledPressedState:
-    {
-      if( disabledImage && disabledImage.GetParent() )
+      if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
       {
-        StopFadeOutAnimation( pushButton );
-        FadeOutImage( pushButton, Foreground, disabledImage  );
-
-        disabledImage = image;
-
-        FadeInImage( pushButton, disabledImage );
-
-        StartFadeOutAnimation( pushButton );
-        StartFadeInAnimation();
+        mPaintState = PressedDisabledTransition;
       }
       else
       {
-        disabledImage = image;
-        pushButton.Add( disabledImage );
+        mPaintState = DisabledPressedState;
       }
-      break;
     }
-    case ReleasedDisabledTransition: // FALLTHROUGH
-    case PressedDisabledTransition:
+    break;
+  }
+  case PressedReleasedTransition:
+  {
+    if( disabled )
     {
+      float opacity = 1.f;
+      if( fadeOutButtonImage )
+      {
+        opacity = fadeOutButtonImage.GetCurrentOpacity();
+      }
+      StopFadeOutAnimation( pushButton );
       StopFadeInAnimation();
-      pushButton.Remove( disabledImage );
 
-      disabledImage = image;
+      FadeOutImage( pushButton, Foreground, buttonImage, 1.f - opacity );
+      FadeOutImage( pushButton, Background, backgroundImage );
 
       FadeInImage( pushButton, disabledImage );
+      FadeInImage( pushButton, disabledBackgroundImage );
+
+      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
-      break;
+
+      if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
+      {
+        mPaintState = ReleasedDisabledTransition;
+      }
+      else
+      {
+        mPaintState = DisabledReleasedState;
+      }
     }
-    case DisabledReleasedTransition: // FALLTHROUGH
-    case DisabledPressedTransition:
+    break;
+  }
+  case ReleasedDisabledTransition:
+  {
+    if( !disabled )
     {
       float opacity = 1.f;
       if( fadeOutButtonImage )
       {
         opacity = fadeOutButtonImage.GetCurrentOpacity();
       }
-      StopFadeOutAnimation( pushButton );
-
-      // Replaces the button image.
-      disabledImage = image;
+      StopFadeOutAnimation( pushButton, false );
+      StopFadeInAnimation();
 
-      pushButton.Add( disabledImage );
-      FadeOutImage( pushButton, Foreground, disabledImage, opacity );
+      FadeOutImage( pushButton, Foreground, disabledImage, 1.f - opacity );
+      FadeOutImage( pushButton, Background, disabledBackgroundImage, 1.f - opacity );
+      FadeInImage( pushButton, buttonImage, opacity );
+      FadeInImage( pushButton, backgroundImage, opacity );
 
       StartFadeOutAnimation( pushButton );
-      break;
+      StartFadeInAnimation();
+
+      if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
+      {
+        mPaintState = DisabledReleasedTransition;
+      }
+      else
+      {
+        mPaintState = ReleasedState;
+      }
     }
-    default:
-      disabledImage = image;
-      break;
+    break;
   }
-
-  disabledImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
-  disabledImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
-  ApplyConstraint( disabledImage, FOREGROUND_DEPTH );
-}
-
-void PushButtonDefaultPainter::SetDisabledBackgroundImage( Toolkit::PushButton& pushButton, Actor image )
-{
-  Toolkit::Internal::PushButton& pushButtonImpl = GetImplementation( pushButton );
-  Actor& disabledBackgroundImage = pushButtonImpl.GetDisabledBackgroundImage();
-  Actor& fadeOutBackgroundImage = pushButtonImpl.GetFadeOutBackgroundImage();
-
-  switch( mPaintState )
+  case DisabledReleasedTransition:
   {
-    case DisabledReleasedState: // FALLTHROUGH
-    case DisabledPressedState:
+    if( disabled )
     {
-      if( disabledBackgroundImage && disabledBackgroundImage.GetParent() )
+      float opacity = 1.f;
+      if( fadeOutButtonImage )
       {
-        StopFadeOutAnimation( pushButton );
-        FadeOutImage( pushButton, Background, disabledBackgroundImage  );
+        opacity = fadeOutButtonImage.GetCurrentOpacity();
+      }
+      StopFadeOutAnimation( pushButton, false );
+      StopFadeInAnimation();
 
-        disabledBackgroundImage = image;
+      FadeOutImage( pushButton, Foreground, buttonImage, 1.f - opacity );
+      FadeOutImage( pushButton, Background, backgroundImage, 1.f - opacity );
+      FadeInImage( pushButton, disabledImage, opacity );
+      FadeInImage( pushButton, disabledBackgroundImage, opacity );
 
-        FadeInImage( pushButton, disabledBackgroundImage );
+      StartFadeOutAnimation( pushButton );
+      StartFadeInAnimation();
 
-        StartFadeOutAnimation( pushButton );
-        StartFadeInAnimation();
+      if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
+      {
+        mPaintState = ReleasedDisabledTransition;
       }
       else
       {
-        disabledBackgroundImage = image;
-        pushButton.Add( disabledBackgroundImage );
+        mPaintState = DisabledReleasedState;
       }
-      break;
     }
-    case ReleasedDisabledTransition: // FALLTHROUGH
-    case PressedDisabledTransition:
+    break;
+  }
+  case PressedDisabledTransition:
+  {
+    if( !disabled )
     {
+      float opacity = 1.f;
+      if( fadeOutButtonImage )
+      {
+        opacity = fadeOutButtonImage.GetCurrentOpacity();
+      }
+      StopFadeOutAnimation( pushButton, false );
       StopFadeInAnimation();
-      pushButton.Remove( disabledBackgroundImage );
 
-      disabledBackgroundImage = image;
+      FadeOutImage( pushButton, Foreground, disabledImage, 1.f - opacity );
+      FadeOutImage( pushButton, Background, disabledBackgroundImage, 1.f - opacity );
+      FadeInImage( pushButton, selectedImage, opacity );
+      FadeInImage( pushButton, backgroundImage, opacity );
 
-      FadeInImage( pushButton, disabledBackgroundImage );
+      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
-      break;
+
+      if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
+      {
+        mPaintState = DisabledPressedTransition;
+      }
+      else
+      {
+        mPaintState = PressedState;
+      }
     }
-    case DisabledReleasedTransition: // FALLTHROUGH
-    case DisabledPressedTransition:
+    break;
+  }
+  case DisabledPressedTransition:
+  {
+    if( disabled )
     {
       float opacity = 1.f;
-      if( fadeOutBackgroundImage )
+      if( fadeOutButtonImage )
       {
-        opacity = fadeOutBackgroundImage.GetCurrentOpacity();
+        opacity = fadeOutButtonImage.GetCurrentOpacity();
       }
-      StopFadeOutAnimation( pushButton );
-
-      // Replaces the button image.
-      disabledBackgroundImage = image;
+      StopFadeOutAnimation( pushButton, false );
+      StopFadeInAnimation();
 
-      pushButton.Add( disabledBackgroundImage );
-      FadeOutImage( pushButton, Background, disabledBackgroundImage, opacity );
+      FadeOutImage( pushButton, Foreground, selectedImage, 1.f - opacity );
+      FadeOutImage( pushButton, Background, backgroundImage, 1.f - opacity );
+      FadeInImage( pushButton, disabledImage, opacity );
+      FadeInImage( pushButton, disabledBackgroundImage, opacity );
 
       StartFadeOutAnimation( pushButton );
-      break;
+      StartFadeInAnimation();
+
+      if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
+      {
+        mPaintState = PressedDisabledTransition;
+      }
+      else
+      {
+        mPaintState = DisabledPressedState;
+      }
     }
-    default:
-      disabledBackgroundImage = image;
-      break;
+    break;
+  }
+  default:
+    break;
   }
-
-  disabledBackgroundImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
-  disabledBackgroundImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
-  ApplyConstraint( disabledBackgroundImage, BACKGROUND_DEPTH );
 }
 
-void PushButtonDefaultPainter::SetLabel( Toolkit::PushButton& pushButton, Actor label )
+void PushButtonDefaultPainter::SetAnimationTime( float animationTime )
 {
-  Toolkit::Internal::PushButton& pushButtonImpl = GetImplementation( pushButton );
-  Actor& labelActor = pushButtonImpl.GetLabel();
-
-  if( labelActor && labelActor.GetParent() )
-  {
-    labelActor.GetParent().Remove( labelActor );
-  }
-
-  labelActor = label;
-  labelActor.SetAnchorPoint( AnchorPoint::CENTER );
-  labelActor.SetParentOrigin( ParentOrigin::CENTER );
+  mAnimationTime = animationTime;
+}
 
-  labelActor.SetPosition( 0.f, 0.f, LABEL_DEPTH );
-  labelActor.SetSize( mSize );
+float PushButtonDefaultPainter::GetAnimationTime() const
+{
+  return mAnimationTime;
+}
 
-  pushButton.Add( labelActor  );
+void PushButtonDefaultPainter::SetAutoRepeating( bool autorepeating )
+{
+  mAutoRepeating = autorepeating;
 }
 
-void PushButtonDefaultPainter::Initialize( Toolkit::Button& button )
+void PushButtonDefaultPainter::SetLabel( Toolkit::Button& button, Actor label )
 {
   Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
-  Actor& buttonImage = pushButtonImpl.GetButtonImage();
-  Actor& selectedImage = pushButtonImpl.GetSelectedImage();
-  Actor& backgroundImage = pushButtonImpl.GetBackgroundImage();
-  Actor& disabledImage = pushButtonImpl.GetDisabledImage();
-  Actor& disabledBackgroundImage = pushButtonImpl.GetDisabledBackgroundImage();
-  Actor& label = pushButtonImpl.GetLabel();
+  Actor& labelActor = pushButtonImpl.GetLabel();
 
   Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
 
-  if( buttonImage )
-  {
-    SetButtonImage( pushButton, buttonImage );
-  }
-
-  if( backgroundImage )
-  {
-    SetBackgroundImage( pushButton, backgroundImage );
-  }
-
-  if( selectedImage )
-  {
-    SetSelectedImage( pushButton, selectedImage );
-  }
-
-  if( disabledImage )
-  {
-    SetDisabledImage( pushButton, disabledImage );
-  }
-
-  if( disabledBackgroundImage )
-  {
-    SetDisabledBackgroundImage( pushButton, disabledBackgroundImage );
-  }
-
-  if( label )
+  if( labelActor && labelActor.GetParent() )
   {
-    SetLabel( pushButton, label );
+    labelActor.GetParent().Remove( labelActor );
   }
 
-  SetDisabled( pushButton, mDisabled );
-}
-
-void PushButtonDefaultPainter::SetSize( Toolkit::Button& button, const Vector3& size )
-{
-  if( size != mSize )
-  {
-    mSize = size;
-
-    Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
-    Actor& buttonImage = pushButtonImpl.GetButtonImage();
-    Actor& selectedImage = pushButtonImpl.GetSelectedImage();
-    Actor& backgroundImage = pushButtonImpl.GetBackgroundImage();
-    Actor& disabledImage = pushButtonImpl.GetDisabledImage();
-    Actor& disabledBackgroundImage = pushButtonImpl.GetDisabledBackgroundImage();
-    Actor& label = pushButtonImpl.GetLabel();
-
-    ApplyConstraint( buttonImage, FOREGROUND_DEPTH );
-    ApplyConstraint( backgroundImage, BACKGROUND_DEPTH );
-    ApplyConstraint( selectedImage, FOREGROUND_DEPTH );
-    ApplyConstraint( disabledImage, FOREGROUND_DEPTH );
-    ApplyConstraint( disabledBackgroundImage, BACKGROUND_DEPTH );
+  labelActor = label;
+  labelActor.SetAnchorPoint( AnchorPoint::CENTER );
+  labelActor.SetParentOrigin( ParentOrigin::CENTER );
 
-    if( label )
-    {
-      label.SetPosition( 0.f, 0.f, LABEL_DEPTH );
-      label.SetSize( mSize );
-    }
-  }
+  labelActor.SetPosition( 0.f, 0.f, LABEL_DEPTH );
+  labelActor.SetSize( mSize );
+
+  pushButton.Add( labelActor  );
 }
 
-void PushButtonDefaultPainter::SetDisabled( Toolkit::Button& button, bool disabled )
+void PushButtonDefaultPainter::SetButtonImage( Toolkit::Button& button, Actor image )
 {
   Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
   Actor& buttonImage = pushButtonImpl.GetButtonImage();
-  Actor& selectedImage = pushButtonImpl.GetSelectedImage();
-  Actor& backgroundImage = pushButtonImpl.GetBackgroundImage();
-  Actor& disabledImage = pushButtonImpl.GetDisabledImage();
-  Actor& disabledBackgroundImage = pushButtonImpl.GetDisabledBackgroundImage();
   Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
 
   Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
 
-  mDisabled = disabled;
-
   switch( mPaintState )
   {
-  case ReleasedState:
-  {
-    if( disabled )
+    case ReleasedState:
     {
-      StopFadeOutAnimation( pushButton );
-      FadeOutImage( pushButton, Background, backgroundImage );
-      FadeOutImage( pushButton, Foreground, buttonImage );
-      FadeInImage( pushButton, disabledBackgroundImage );
-      FadeInImage( pushButton, disabledImage );
-      StartFadeOutAnimation( pushButton );
-      StartFadeInAnimation();
-
-      if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
+      if( buttonImage && buttonImage.GetParent() )
       {
-        mPaintState = ReleasedDisabledTransition;
+        StopFadeOutAnimation( pushButton );
+        FadeOutImage( pushButton, Foreground, buttonImage );
+
+        buttonImage = image;
+
+        FadeInImage( pushButton, buttonImage );
+
+        StartFadeOutAnimation( pushButton );
+        StartFadeInAnimation();
       }
       else
       {
-        mPaintState = DisabledReleasedState;
+        buttonImage = image;
+        pushButton.Add( buttonImage );
       }
+      break;
     }
-    break;
-  }
-  case PressedState:
-  {
-    if( disabled )
+    case ReleasedPressedTransition: // FALLTHROUGH
+    case ReleasedDisabledTransition:
     {
-      StopFadeOutAnimation( pushButton );
-      FadeOutImage( pushButton, Background, backgroundImage );
-      FadeOutImage( pushButton, Foreground, selectedImage );
-      FadeInImage( pushButton, disabledBackgroundImage );
-      FadeInImage( pushButton, disabledImage );
-      StartFadeOutAnimation( pushButton );
-      StartFadeInAnimation();
-
-      if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
-      {
-        mPaintState = PressedDisabledTransition;
-      }
-      else
+      float opacity = 1.f;
+      if( fadeOutButtonImage )
       {
-        mPaintState = DisabledPressedState;
+        opacity = fadeOutButtonImage.GetCurrentOpacity();
       }
+      StopFadeOutAnimation( pushButton );
+
+      // Replaces the button image.
+      buttonImage = image;
+
+      pushButton.Add( buttonImage );
+      FadeOutImage( pushButton, Foreground, buttonImage, opacity );
+
+      StartFadeOutAnimation( pushButton );
+      break;
     }
-    break;
-  }
-  case DisabledReleasedState:
-  {
-    if( !disabled )
+    case PressedReleasedTransition: // FALLTHROUGH
+    case DisabledReleasedTransition:
     {
-      StopFadeOutAnimation( pushButton );
-      FadeOutImage( pushButton, Background, disabledBackgroundImage );
-      FadeOutImage( pushButton, Foreground, disabledImage );
-      FadeInImage( pushButton, backgroundImage );
+      StopFadeInAnimation();
+      pushButton.Remove( buttonImage );
+
+      buttonImage = image;
+
       FadeInImage( pushButton, buttonImage );
-      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
+      break;
+    }
+    default:
+      buttonImage = image;
+      break;
+  }
 
-      if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
+  buttonImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+  buttonImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
+  ApplyConstraint( buttonImage, FOREGROUND_DEPTH );
+}
+
+void PushButtonDefaultPainter::SetSelectedImage( Toolkit::Button& button, Actor image )
+{
+  Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
+  Actor& selectedImage = pushButtonImpl.GetSelectedImage();
+  Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
+
+  Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
+
+  switch( mPaintState )
+  {
+    case PressedState:
+    {
+      if( selectedImage && selectedImage.GetParent() )
       {
-        mPaintState = DisabledReleasedTransition;
+        StopFadeOutAnimation( pushButton );
+        FadeOutImage( pushButton, Foreground, selectedImage  );
+
+        selectedImage = image;
+
+        FadeInImage( pushButton, selectedImage );
+
+        StartFadeOutAnimation( pushButton );
+        StartFadeInAnimation();
       }
       else
       {
-        mPaintState = ReleasedState;
+        selectedImage = image;
+        pushButton.Add( selectedImage );
       }
+      break;
     }
-    break;
-  }
-  case DisabledPressedState:
-  {
-    if( !disabled )
+    case PressedReleasedTransition: // FALLTHROUGH
+    case PressedDisabledTransition:
     {
+      float opacity = 1.f;
+      if( fadeOutButtonImage )
+      {
+        opacity = fadeOutButtonImage.GetCurrentOpacity();
+      }
       StopFadeOutAnimation( pushButton );
-      FadeOutImage( pushButton, Background, disabledBackgroundImage );
-      FadeOutImage( pushButton, Foreground, disabledImage );
-      FadeInImage( pushButton, backgroundImage );
-      FadeInImage( pushButton, selectedImage );
+
+      // Replaces the button image.
+      selectedImage = image;
+
+      pushButton.Add( selectedImage );
+      FadeOutImage( pushButton, Foreground, selectedImage, opacity );
+
       StartFadeOutAnimation( pushButton );
+      break;
+    }
+    case ReleasedPressedTransition: // FALLTHROUGH
+    case DisabledPressedTransition:
+    {
+      StopFadeInAnimation();
+      pushButton.Remove( selectedImage );
+
+      selectedImage = image;
+
+      FadeInImage( pushButton, selectedImage );
       StartFadeInAnimation();
+      break;
+    }
+    default:
+      selectedImage = image;
+      break;
+  }
 
-      if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
+  selectedImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+  selectedImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
+  ApplyConstraint( selectedImage, FOREGROUND_DEPTH );
+}
+
+void PushButtonDefaultPainter::SetBackgroundImage( Toolkit::Button& button, Actor image )
+{
+  Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
+  Actor& backgroundImage = pushButtonImpl.GetBackgroundImage();
+  Actor& fadeOutBackgroundImage = pushButtonImpl.GetFadeOutBackgroundImage();
+
+  Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
+
+  switch( mPaintState )
+  {
+    case ReleasedState:             // FALLTHROUGH
+    case PressedState:
+    case ReleasedPressedTransition:
+    case PressedReleasedTransition:
+    {
+      if( backgroundImage && backgroundImage.GetParent() )
       {
-        mPaintState = DisabledPressedTransition;
+        StopFadeOutAnimation( pushButton );
+        FadeOutImage( pushButton, Background, backgroundImage  );
+
+        backgroundImage = image;
+
+        FadeInImage( pushButton, backgroundImage );
+
+        StartFadeOutAnimation( pushButton );
+        StartFadeInAnimation();
       }
       else
       {
-        mPaintState = PressedState;
+        backgroundImage = image;
+        pushButton.Add( backgroundImage );
       }
+      break;
     }
-    break;
-  }
-  case ReleasedPressedTransition:
-  {
-    if( disabled )
+    case ReleasedDisabledTransition: // FALLTHROUGH
+    case PressedDisabledTransition:
     {
       float opacity = 1.f;
-      if( fadeOutButtonImage )
+      if( fadeOutBackgroundImage )
       {
-        opacity = fadeOutButtonImage.GetCurrentOpacity();
+        opacity = fadeOutBackgroundImage.GetCurrentOpacity();
       }
       StopFadeOutAnimation( pushButton );
+
+      // Replaces the button image.
+      backgroundImage = image;
+
+      pushButton.Add( backgroundImage );
+      FadeOutImage( pushButton, Background, backgroundImage, opacity );
+
+      StartFadeOutAnimation( pushButton );
+      break;
+    }
+    case DisabledReleasedTransition: // FALLTHROUGH
+    case DisabledPressedTransition:
+    {
       StopFadeInAnimation();
+      pushButton.Remove( backgroundImage );
 
-      FadeOutImage( pushButton, Foreground, selectedImage, 1.f - opacity );
-      FadeOutImage( pushButton, Background, backgroundImage );
+      backgroundImage = image;
+
+      FadeInImage( pushButton, backgroundImage );
+      StartFadeInAnimation();
+      break;
+    }
+    default:
+      backgroundImage = image;
+      break;
+    }
+
+  backgroundImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+  backgroundImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
+  ApplyConstraint( backgroundImage, BACKGROUND_DEPTH );
+}
+
+void PushButtonDefaultPainter::SetDisabledImage( Toolkit::Button& button, Actor image )
+{
+  Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
+  Actor& disabledImage = pushButtonImpl.GetDisabledImage();
+  Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
+
+  Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
+
+  switch( mPaintState )
+  {
+    case DisabledReleasedState: // FALLTHROUGH
+    case DisabledPressedState:
+    {
+      if( disabledImage && disabledImage.GetParent() )
+      {
+        StopFadeOutAnimation( pushButton );
+        FadeOutImage( pushButton, Foreground, disabledImage  );
 
-      FadeInImage( pushButton, disabledImage );
-      FadeInImage( pushButton, disabledBackgroundImage );
+        disabledImage = image;
 
-      StartFadeOutAnimation( pushButton );
-      StartFadeInAnimation();
+        FadeInImage( pushButton, disabledImage );
 
-      if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
-      {
-        mPaintState = PressedDisabledTransition;
+        StartFadeOutAnimation( pushButton );
+        StartFadeInAnimation();
       }
       else
       {
-        mPaintState = DisabledPressedState;
+        disabledImage = image;
+        pushButton.Add( disabledImage );
       }
+      break;
     }
-    break;
-  }
-  case PressedReleasedTransition:
-  {
-    if( disabled )
+    case ReleasedDisabledTransition: // FALLTHROUGH
+    case PressedDisabledTransition:
     {
-      float opacity = 1.f;
-      if( fadeOutButtonImage )
-      {
-        opacity = fadeOutButtonImage.GetCurrentOpacity();
-      }
-      StopFadeOutAnimation( pushButton );
       StopFadeInAnimation();
+      pushButton.Remove( disabledImage );
 
-      FadeOutImage( pushButton, Foreground, buttonImage, 1.f - opacity );
-      FadeOutImage( pushButton, Background, backgroundImage );
+      disabledImage = image;
 
       FadeInImage( pushButton, disabledImage );
-      FadeInImage( pushButton, disabledBackgroundImage );
-
-      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
-
-      if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
-      {
-        mPaintState = ReleasedDisabledTransition;
-      }
-      else
-      {
-        mPaintState = DisabledReleasedState;
-      }
+      break;
     }
-    break;
-  }
-  case ReleasedDisabledTransition:
-  {
-    if( !disabled )
+    case DisabledReleasedTransition: // FALLTHROUGH
+    case DisabledPressedTransition:
     {
       float opacity = 1.f;
       if( fadeOutButtonImage )
       {
         opacity = fadeOutButtonImage.GetCurrentOpacity();
       }
-      StopFadeOutAnimation( pushButton, false );
-      StopFadeInAnimation();
+      StopFadeOutAnimation( pushButton );
 
-      FadeOutImage( pushButton, Foreground, disabledImage, 1.f - opacity );
-      FadeOutImage( pushButton, Background, disabledBackgroundImage, 1.f - opacity );
-      FadeInImage( pushButton, buttonImage, opacity );
-      FadeInImage( pushButton, backgroundImage, opacity );
+      // Replaces the button image.
+      disabledImage = image;
 
-      StartFadeOutAnimation( pushButton );
-      StartFadeInAnimation();
+      pushButton.Add( disabledImage );
+      FadeOutImage( pushButton, Foreground, disabledImage, opacity );
 
-      if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
-      {
-        mPaintState = DisabledReleasedTransition;
-      }
-      else
-      {
-        mPaintState = ReleasedState;
-      }
+      StartFadeOutAnimation( pushButton );
+      break;
     }
-    break;
+    default:
+      disabledImage = image;
+      break;
   }
-  case DisabledReleasedTransition:
+
+  disabledImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+  disabledImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
+  ApplyConstraint( disabledImage, FOREGROUND_DEPTH );
+}
+
+void PushButtonDefaultPainter::SetDisabledBackgroundImage( Toolkit::Button& button, Actor image )
+{
+  Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
+  Actor& disabledBackgroundImage = pushButtonImpl.GetDisabledBackgroundImage();
+  Actor& fadeOutBackgroundImage = pushButtonImpl.GetFadeOutBackgroundImage();
+
+  Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
+
+  switch( mPaintState )
   {
-    if( disabled )
+    case DisabledReleasedState: // FALLTHROUGH
+    case DisabledPressedState:
     {
-      float opacity = 1.f;
-      if( fadeOutButtonImage )
+      if( disabledBackgroundImage && disabledBackgroundImage.GetParent() )
       {
-        opacity = fadeOutButtonImage.GetCurrentOpacity();
-      }
-      StopFadeOutAnimation( pushButton, false );
-      StopFadeInAnimation();
+        StopFadeOutAnimation( pushButton );
+        FadeOutImage( pushButton, Background, disabledBackgroundImage  );
 
-      FadeOutImage( pushButton, Foreground, buttonImage, 1.f - opacity );
-      FadeOutImage( pushButton, Background, backgroundImage, 1.f - opacity );
-      FadeInImage( pushButton, disabledImage, opacity );
-      FadeInImage( pushButton, disabledBackgroundImage, opacity );
+        disabledBackgroundImage = image;
 
-      StartFadeOutAnimation( pushButton );
-      StartFadeInAnimation();
+        FadeInImage( pushButton, disabledBackgroundImage );
 
-      if( buttonImage || disabledImage || backgroundImage || disabledBackgroundImage )
-      {
-        mPaintState = ReleasedDisabledTransition;
+        StartFadeOutAnimation( pushButton );
+        StartFadeInAnimation();
       }
       else
       {
-        mPaintState = DisabledReleasedState;
+        disabledBackgroundImage = image;
+        pushButton.Add( disabledBackgroundImage );
       }
+      break;
     }
-    break;
-  }
-  case PressedDisabledTransition:
-  {
-    if( !disabled )
+    case ReleasedDisabledTransition: // FALLTHROUGH
+    case PressedDisabledTransition:
     {
-      float opacity = 1.f;
-      if( fadeOutButtonImage )
-      {
-        opacity = fadeOutButtonImage.GetCurrentOpacity();
-      }
-      StopFadeOutAnimation( pushButton, false );
       StopFadeInAnimation();
+      pushButton.Remove( disabledBackgroundImage );
 
-      FadeOutImage( pushButton, Foreground, disabledImage, 1.f - opacity );
-      FadeOutImage( pushButton, Background, disabledBackgroundImage, 1.f - opacity );
-      FadeInImage( pushButton, selectedImage, opacity );
-      FadeInImage( pushButton, backgroundImage, opacity );
+      disabledBackgroundImage = image;
 
-      StartFadeOutAnimation( pushButton );
+      FadeInImage( pushButton, disabledBackgroundImage );
       StartFadeInAnimation();
-
-      if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
-      {
-        mPaintState = DisabledPressedTransition;
-      }
-      else
-      {
-        mPaintState = PressedState;
-      }
+      break;
     }
-    break;
-  }
-  case DisabledPressedTransition:
-  {
-    if( disabled )
+    case DisabledReleasedTransition: // FALLTHROUGH
+    case DisabledPressedTransition:
     {
       float opacity = 1.f;
-      if( fadeOutButtonImage )
+      if( fadeOutBackgroundImage )
       {
-        opacity = fadeOutButtonImage.GetCurrentOpacity();
+        opacity = fadeOutBackgroundImage.GetCurrentOpacity();
       }
-      StopFadeOutAnimation( pushButton, false );
-      StopFadeInAnimation();
+      StopFadeOutAnimation( pushButton );
 
-      FadeOutImage( pushButton, Foreground, selectedImage, 1.f - opacity );
-      FadeOutImage( pushButton, Background, backgroundImage, 1.f - opacity );
-      FadeInImage( pushButton, disabledImage, opacity );
-      FadeInImage( pushButton, disabledBackgroundImage, opacity );
+      // Replaces the button image.
+      disabledBackgroundImage = image;
 
-      StartFadeOutAnimation( pushButton );
-      StartFadeInAnimation();
+      pushButton.Add( disabledBackgroundImage );
+      FadeOutImage( pushButton, Background, disabledBackgroundImage, opacity );
 
-      if( selectedImage || disabledImage || backgroundImage || disabledBackgroundImage )
-      {
-        mPaintState = PressedDisabledTransition;
-      }
-      else
-      {
-        mPaintState = DisabledPressedState;
-      }
+      StartFadeOutAnimation( pushButton );
+      break;
     }
-    break;
-  }
-  default:
-    break;
+    default:
+      disabledBackgroundImage = image;
+      break;
   }
-}
-
-void PushButtonDefaultPainter::SetAnimationTime( float animationTime )
-{
-  mAnimationTime = animationTime;
-}
-
-float PushButtonDefaultPainter::GetAnimationTime() const
-{
-  return mAnimationTime;
-}
 
-void PushButtonDefaultPainter::SetAutoRepeating( bool autorepeating )
-{
-  mAutoRepeating = autorepeating;
+  disabledBackgroundImage.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+  disabledBackgroundImage.SetParentOrigin( ParentOrigin::TOP_LEFT );
+  ApplyConstraint( disabledBackgroundImage, BACKGROUND_DEPTH );
 }
 
-void PushButtonDefaultPainter::Pressed( Toolkit::PushButton& button )
+void PushButtonDefaultPainter::Pressed( Toolkit::Button& button )
 {
   Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
   Actor& selectedImage = pushButtonImpl.GetSelectedImage();
   Actor& buttonImage = pushButtonImpl.GetButtonImage();
   Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
 
+  Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
+
   switch( mPaintState )
   {
     case ReleasedState:
     {
-      StopFadeOutAnimation( button );
-      FadeOutImage( button, Foreground, buttonImage );
-      FadeInImage( button, selectedImage );
-      StartFadeOutAnimation( button );
+      StopFadeOutAnimation( pushButton );
+      FadeOutImage( pushButton, Foreground, buttonImage );
+      FadeInImage( pushButton, selectedImage );
+      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
 
       if( buttonImage || selectedImage )
@@ -895,13 +910,13 @@ void PushButtonDefaultPainter::Pressed( Toolkit::PushButton& button )
       {
         opacity = fadeOutButtonImage.GetCurrentOpacity();
       }
-      StopFadeOutAnimation( button, false );
+      StopFadeOutAnimation( pushButton, false );
       StopFadeInAnimation();
 
-      FadeOutImage( button, Foreground, buttonImage, 1.f - opacity );
-      FadeInImage( button, selectedImage, opacity );
+      FadeOutImage( pushButton, Foreground, buttonImage, 1.f - opacity );
+      FadeInImage( pushButton, selectedImage, opacity );
 
-      StartFadeOutAnimation( button );
+      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
 
       if( buttonImage || selectedImage )
@@ -919,21 +934,23 @@ void PushButtonDefaultPainter::Pressed( Toolkit::PushButton& button )
   }
 }
 
-void PushButtonDefaultPainter::Released( Toolkit::PushButton& button )
+void PushButtonDefaultPainter::Released( Toolkit::Button& button )
 {
   Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
   Actor& selectedImage = pushButtonImpl.GetSelectedImage();
   Actor& buttonImage = pushButtonImpl.GetButtonImage();
   Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
 
+  Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
+
   switch( mPaintState )
   {
     case PressedState:
     {
-      StopFadeOutAnimation( button );
-      FadeOutImage( button, Foreground, selectedImage );
-      FadeInImage( button, buttonImage );
-      StartFadeOutAnimation( button );
+      StopFadeOutAnimation( pushButton );
+      FadeOutImage( pushButton, Foreground, selectedImage );
+      FadeInImage( pushButton, buttonImage );
+      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
 
       if( buttonImage || selectedImage )
@@ -953,13 +970,13 @@ void PushButtonDefaultPainter::Released( Toolkit::PushButton& button )
       {
         opacity = fadeOutButtonImage.GetCurrentOpacity();
       }
-      StopFadeOutAnimation( button, false );
+      StopFadeOutAnimation( pushButton, false );
       StopFadeInAnimation();
 
-      FadeOutImage( button, Foreground, selectedImage, 1.f - opacity );
-      FadeInImage( button, buttonImage, opacity );
+      FadeOutImage( pushButton, Foreground, selectedImage, 1.f - opacity );
+      FadeInImage( pushButton, buttonImage, opacity );
 
-      StartFadeOutAnimation( button );
+      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
 
       if( buttonImage || selectedImage )
@@ -979,26 +996,28 @@ void PushButtonDefaultPainter::Released( Toolkit::PushButton& button )
   }
 }
 
-void PushButtonDefaultPainter::Clicked( Toolkit::PushButton& button )
+void PushButtonDefaultPainter::Clicked( Toolkit::Button& button )
 {
   Released( button );
 }
 
-void PushButtonDefaultPainter::Toggled( Toolkit::PushButton& button )
+void PushButtonDefaultPainter::Selected( Toolkit::Button& button )
 {
   Toolkit::Internal::PushButton& pushButtonImpl = GetPushButtonImpl( button );
   Actor& selectedImage = pushButtonImpl.GetSelectedImage();
   Actor& buttonImage = pushButtonImpl.GetButtonImage();
   Actor& fadeOutButtonImage = pushButtonImpl.GetFadeOutButtonImage();
 
+  Toolkit::PushButton& pushButton = static_cast<Toolkit::PushButton&>( button );
+
   switch( mPaintState )
   {
     case ReleasedState:
     {
-      StopFadeOutAnimation( button );
-      FadeOutImage( button, Foreground, buttonImage );
-      FadeInImage( button, selectedImage );
-      StartFadeOutAnimation( button );
+      StopFadeOutAnimation( pushButton );
+      FadeOutImage( pushButton, Foreground, buttonImage );
+      FadeInImage( pushButton, selectedImage );
+      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
 
       if( buttonImage || selectedImage )
@@ -1013,10 +1032,10 @@ void PushButtonDefaultPainter::Toggled( Toolkit::PushButton& button )
     }
     case PressedState:
     {
-      StopFadeOutAnimation( button );
-      FadeOutImage( button, Foreground, selectedImage );
-      FadeInImage( button, buttonImage );
-      StartFadeOutAnimation( button );
+      StopFadeOutAnimation( pushButton );
+      FadeOutImage( pushButton, Foreground, selectedImage );
+      FadeInImage( pushButton, buttonImage );
+      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
 
       if( buttonImage || selectedImage )
@@ -1036,13 +1055,13 @@ void PushButtonDefaultPainter::Toggled( Toolkit::PushButton& button )
       {
         opacity = fadeOutButtonImage.GetCurrentOpacity();
       }
-      StopFadeOutAnimation( button, false );
+      StopFadeOutAnimation( pushButton, false );
       StopFadeInAnimation();
 
-      FadeOutImage( button, Foreground, selectedImage, 1.f - opacity );
-      FadeInImage( button, buttonImage, opacity );
+      FadeOutImage( pushButton, Foreground, selectedImage, 1.f - opacity );
+      FadeInImage( pushButton, buttonImage, opacity );
 
-      StartFadeOutAnimation( button );
+      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
 
       if( buttonImage || selectedImage )
@@ -1062,13 +1081,13 @@ void PushButtonDefaultPainter::Toggled( Toolkit::PushButton& button )
       {
         opacity = 1.f - fadeOutButtonImage.GetCurrentOpacity();
       }
-      StopFadeOutAnimation( button, false );
+      StopFadeOutAnimation( pushButton, false );
       StopFadeInAnimation();
 
-      FadeOutImage( button, Foreground, buttonImage, 1.f - opacity );
-      FadeInImage( button, selectedImage, opacity );
+      FadeOutImage( pushButton, Foreground, buttonImage, 1.f - opacity );
+      FadeInImage( pushButton, selectedImage, opacity );
 
-      StartFadeOutAnimation( button );
+      StartFadeOutAnimation( pushButton );
       StartFadeInAnimation();
 
       if( buttonImage || selectedImage )