X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftext-controls%2Ftext-field-impl.cpp;h=e8e24cfba29e87cfe5f0b56c230a66b989ec5c03;hb=302d95105bb93ddbe505b2ecc29162ea5a504da7;hp=e0d75ce7f68d824ceace452a350bb4e1bf626bfd;hpb=7777cc6a51e62ec3451345ff222ec1686a772650;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index e0d75ce..e8e24cf 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -30,7 +30,9 @@ // INTERNAL INCLUDES #include +#include #include +#include #include #include #include @@ -270,7 +272,17 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr } case Toolkit::TextField::Property::EXCEED_POLICY: { - // TODO + impl.mExceedPolicy = value.Get(); + + if( Dali::Toolkit::TextField::EXCEED_POLICY_CLIP == impl.mExceedPolicy ) + { + impl.EnableClipping(); + } + else + { + UnparentAndReset( impl.mStencil ); + } + impl.RequestTextRelayout(); break; } case Toolkit::TextField::Property::HORIZONTAL_ALIGNMENT: @@ -1114,7 +1126,7 @@ void TextField::OnInitialize() { Actor self = Self(); - mController = Text::Controller::New( *this ); + mController = Text::Controller::New( this, this ); // When using the vector-based rendering, the size of the GLyphs are different TextAbstraction::GlyphType glyphType = (Text::RENDERING_VECTOR_BASED == mRenderingBackend) ? TextAbstraction::VECTOR_GLYPH : TextAbstraction::BITMAP_GLYPH; @@ -1160,6 +1172,11 @@ void TextField::OnInitialize() self.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH ); self.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::HEIGHT ); self.OnStageSignal().Connect( this, &TextField::OnStageConnect ); + + if( Dali::Toolkit::TextField::EXCEED_POLICY_CLIP == mExceedPolicy ) + { + EnableClipping(); + } } void TextField::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange::Type change ) @@ -1222,7 +1239,6 @@ void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container ) mRenderer = Backend::Get().NewRenderer( mRenderingBackend ); } - EnableClipping( ( Dali::Toolkit::TextField::EXCEED_POLICY_CLIP == mExceedPolicy ), size ); RenderText( updateTextType ); } @@ -1248,7 +1264,6 @@ void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container ) void TextField::RenderText( Text::Controller::UpdateTextType updateTextType ) { - Actor self = Self(); Actor renderableActor; if( Text::Controller::NONE_UPDATED != ( Text::Controller::MODEL_UPDATED & updateTextType ) ) @@ -1271,39 +1286,19 @@ void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container ) mRenderableActor.SetPosition( scrollOffset.x, scrollOffset.y ); - Actor clipRootActor; - if( mClipper ) - { - clipRootActor = mClipper->GetRootActor(); - } + // Make sure the actors are parented correctly with/without clipping + Actor self = mStencil ? mStencil : Self(); for( std::vector::const_iterator it = mClippingDecorationActors.begin(), endIt = mClippingDecorationActors.end(); it != endIt; ++it ) { - Actor actor = *it; - - if( clipRootActor ) - { - clipRootActor.Add( actor ); - } - else - { - self.Add( actor ); - } + self.Add( *it ); } mClippingDecorationActors.clear(); - // Make sure the actor is parented correctly with/without clipping - if( clipRootActor ) - { - clipRootActor.Add( mRenderableActor ); - } - else - { - self.Add( mRenderableActor ); - } + self.Add( mRenderableActor ); } } @@ -1416,21 +1411,6 @@ bool TextField::OnKeyEvent( const KeyEvent& event ) return mController->KeyEvent( event ); } -void TextField::AddDecoration( Actor& actor, bool needsClipping ) -{ - if( actor ) - { - if( needsClipping ) - { - mClippingDecorationActors.push_back( actor ); - } - else - { - Self().Add( actor ); - } - } -} - void TextField::RequestTextRelayout() { RelayoutRequest(); @@ -1442,6 +1422,12 @@ void TextField::TextChanged() mTextChangedSignal.Emit( handle ); } +void TextField::MaxLengthReached() +{ + Dali::Toolkit::TextField handle( GetOwner() ); + mMaxLengthReachedSignal.Emit( handle ); +} + void TextField::InputStyleChanged( Text::InputStyle::Mask inputStyleMask ) { Dali::Toolkit::TextField handle( GetOwner() ); @@ -1492,6 +1478,21 @@ void TextField::InputStyleChanged( Text::InputStyle::Mask inputStyleMask ) mInputStyleChangedSignal.Emit( handle, fieldInputStyleMask ); } +void TextField::AddDecoration( Actor& actor, bool needsClipping ) +{ + if( actor ) + { + if( needsClipping ) + { + mClippingDecorationActors.push_back( actor ); + } + else + { + Self().Add( actor ); + } + } +} + void TextField::OnStageConnect( Dali::Actor actor ) { if ( mHasBeenStaged ) @@ -1504,12 +1505,6 @@ void TextField::OnStageConnect( Dali::Actor actor ) } } -void TextField::MaxLengthReached() -{ - Dali::Toolkit::TextField handle( GetOwner() ); - mMaxLengthReachedSignal.Emit( handle ); -} - ImfManager::ImfCallbackData TextField::OnImfEvent( Dali::ImfManager& imfManager, const ImfManager::ImfEventData& imfEvent ) { DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField::OnImfEvent %p eventName %d\n", mController.Get(), imfEvent.eventName ); @@ -1531,31 +1526,27 @@ void TextField::GetHandleImagePropertyValue( Property::Value& value, Text::Hand } } -void TextField::EnableClipping( bool clipping, const Vector2& size ) +void TextField::EnableClipping() { - if( clipping ) + if( !mStencil ) { - // Not worth to created clip actor if width or height is equal to zero. - if( size.width > Math::MACHINE_EPSILON_1000 && size.height > Math::MACHINE_EPSILON_1000 ) - { - if( !mClipper ) - { - Actor self = Self(); + // Creates an extra control to be used as stencil buffer. + mStencil = Control::New(); + mStencil.SetAnchorPoint( AnchorPoint::CENTER ); + mStencil.SetParentOrigin( ParentOrigin::CENTER ); - mClipper = Clipper::New( size ); - self.Add( mClipper->GetRootActor() ); - self.Add( mClipper->GetImageView() ); - } - else if ( mClipper ) - { - mClipper->Refresh( size ); - } - } - } - else - { - // Note - this will automatically remove the root actor & the image view - mClipper.Reset(); + // Creates a background visual. Even if the color is transparent it updates the stencil. + Property::Map backGroundMap; + backGroundMap[Toolkit::Visual::Property::TYPE] = Visual::COLOR; + backGroundMap[ColorVisual::Property::MIX_COLOR] = Color::TRANSPARENT; + + mStencil.SetProperty( Toolkit::Control::Property::BACKGROUND, backGroundMap ); + + // Enable the clipping property. + mStencil.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN ); + mStencil.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); + + Self().Add( mStencil ); } } @@ -1615,7 +1606,7 @@ TextField::TextField() TextField::~TextField() { - mClipper.Reset(); + UnparentAndReset( mStencil ); if( ( NULL != mIdleCallback ) && Adaptor::IsAvailable() ) {