X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller-impl.cpp;h=f7f173969f07d4228c0e591bac434a4c0a51cdff;hb=4bce4a632f936959d3be32a106d534459d10e88d;hp=74d9abf3344a062d23c2bf1061b4a5cdf4e0d083;hpb=e1ccc59ca19a05c71c035839115e20d480385289;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index 74d9abf..f7f1739 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -101,15 +101,18 @@ EventData::EventData( DecoratorPtr decorator ) mScrollPosition(), mState( INACTIVE ), mPrimaryCursorPosition( 0u ), - mSecondaryCursorPosition( 0u ), + mLeftSelectionPosition( 0u ), + mRightSelectionPosition( 0u ), mDecoratorUpdated( false ), mCursorBlinkEnabled( true ), mGrabHandleEnabled( true ), - mGrabHandlePopupEnabled( true ), - mSelectionEnabled( true ), + mGrabHandlePopupEnabled( false ), + mSelectionEnabled( false ), mHorizontalScrollingEnabled( true ), mVerticalScrollingEnabled( false ), mUpdateCursorPosition( false ), + mUpdateLeftSelectionPosition( false ), + mUpdateRightSelectionPosition( false ), mScrollAfterUpdateCursorPosition( false ) {} @@ -160,8 +163,10 @@ bool Controller::Impl::ProcessInputEvents() break; } case Event::GRAB_HANDLE_EVENT: + case Event::LEFT_SELECTION_HANDLE_EVENT: + case Event::RIGHT_SELECTION_HANDLE_EVENT: // Fall through { - OnGrabHandleEvent( *iter ); + OnHandleEvent( *iter ); break; } } @@ -181,8 +186,35 @@ bool Controller::Impl::ProcessInputEvents() mEventData->mScrollAfterUpdateCursorPosition = false; } + mEventData->mDecoratorUpdated = true; mEventData->mUpdateCursorPosition = false; } + else if( mEventData->mUpdateLeftSelectionPosition ) + { + UpdateSelectionHandle( LEFT_SELECTION_HANDLE ); + + if( mEventData->mScrollAfterUpdateCursorPosition ) + { + ScrollToMakeCursorVisible(); + mEventData->mScrollAfterUpdateCursorPosition = false; + } + + mEventData->mDecoratorUpdated = true; + mEventData->mUpdateLeftSelectionPosition = false; + } + else if( mEventData->mUpdateRightSelectionPosition ) + { + UpdateSelectionHandle( RIGHT_SELECTION_HANDLE ); + + if( mEventData->mScrollAfterUpdateCursorPosition ) + { + ScrollToMakeCursorVisible(); + mEventData->mScrollAfterUpdateCursorPosition = false; + } + + mEventData->mDecoratorUpdated = true; + mEventData->mUpdateRightSelectionPosition = false; + } mEventData->mEventQueue.clear(); @@ -325,7 +357,7 @@ void Controller::Impl::OnPanEvent( const Event& event ) } } -void Controller::Impl::OnGrabHandleEvent( const Event& event ) +void Controller::Impl::OnHandleEvent( const Event& event ) { if( NULL == mEventData ) { @@ -333,46 +365,68 @@ void Controller::Impl::OnGrabHandleEvent( const Event& event ) return; } - unsigned int state = event.p1.mUint; + const unsigned int state = event.p1.mUint; - if( GRAB_HANDLE_PRESSED == state ) + if( HANDLE_PRESSED == state ) { // The event.p2 and event.p3 are in decorator coords. Need to transforms to text coords. const float xPosition = event.p2.mFloat - mEventData->mScrollPosition.x - mAlignmentOffset.x; const float yPosition = event.p3.mFloat - mEventData->mScrollPosition.y - mAlignmentOffset.y; - //mDecorator->HidePopup(); - ChangeState ( EventData::EDITING ); + const CharacterIndex handleNewPosition = GetClosestCursorIndex( xPosition, yPosition ); - const CharacterIndex newCursorPosition = GetClosestCursorIndex( xPosition, yPosition ); + if( Event::GRAB_HANDLE_EVENT == event.type ) + { + ChangeState ( EventData::EDITING ); - if( newCursorPosition != mEventData->mPrimaryCursorPosition ) + if( handleNewPosition != mEventData->mPrimaryCursorPosition ) + { + mEventData->mPrimaryCursorPosition = handleNewPosition; + mEventData->mUpdateCursorPosition = true; + } + } + else if( Event::LEFT_SELECTION_HANDLE_EVENT == event.type ) { - mEventData->mPrimaryCursorPosition = newCursorPosition; - mEventData->mUpdateCursorPosition = true; + if( handleNewPosition != mEventData->mLeftSelectionPosition ) + { + mEventData->mLeftSelectionPosition = handleNewPosition; + mEventData->mUpdateLeftSelectionPosition = true; + } + } + else if( Event::RIGHT_SELECTION_HANDLE_EVENT == event.type ) + { + if( handleNewPosition != mEventData->mRightSelectionPosition ) + { + mEventData->mRightSelectionPosition = handleNewPosition; + mEventData->mUpdateRightSelectionPosition = true; + } } } - else if( mEventData->mGrabHandlePopupEnabled && - ( ( GRAB_HANDLE_RELEASED == state ) || - ( GRAB_HANDLE_STOP_SCROLLING == state ) ) ) + else if( ( HANDLE_RELEASED == state ) || + ( HANDLE_STOP_SCROLLING == state ) ) { - //mDecorator->ShowPopup(); - ChangeState ( EventData::EDITING_WITH_POPUP ); - mEventData->mUpdateCursorPosition = true; - mEventData->mDecoratorUpdated = true; - - if( GRAB_HANDLE_STOP_SCROLLING == state ) + if( mEventData->mGrabHandlePopupEnabled ) + { + ChangeState( EventData::EDITING_WITH_POPUP ); + } + if( Event::GRAB_HANDLE_EVENT == event.type ) { - // The event.p2 and event.p3 are in decorator coords. Need to transforms to text coords. - const float xPosition = event.p2.mFloat - mEventData->mScrollPosition.x - mAlignmentOffset.x; - const float yPosition = event.p3.mFloat - mEventData->mScrollPosition.y - mAlignmentOffset.y; + mEventData->mUpdateCursorPosition = true; + + if( HANDLE_STOP_SCROLLING == state ) + { + // The event.p2 and event.p3 are in decorator coords. Need to transforms to text coords. + const float xPosition = event.p2.mFloat - mEventData->mScrollPosition.x - mAlignmentOffset.x; + const float yPosition = event.p3.mFloat - mEventData->mScrollPosition.y - mAlignmentOffset.y; - mEventData->mPrimaryCursorPosition = GetClosestCursorIndex( xPosition, yPosition ); + mEventData->mPrimaryCursorPosition = GetClosestCursorIndex( xPosition, yPosition ); - mEventData->mScrollAfterUpdateCursorPosition = true; + mEventData->mScrollAfterUpdateCursorPosition = true; + } } + mEventData->mDecoratorUpdated = true; } - else if( GRAB_HANDLE_SCROLLING == state ) + else if( HANDLE_SCROLLING == state ) { const float xSpeed = event.p2.mFloat; const Vector2& actualSize = mVisualModel->GetActualSize(); @@ -380,6 +434,8 @@ void Controller::Impl::OnGrabHandleEvent( const Event& event ) mEventData->mScrollPosition.x += xSpeed; ClampHorizontalScroll( actualSize ); + + mEventData->mDecoratorUpdated = true; } } @@ -411,8 +467,8 @@ void Controller::Impl::RepositionSelectionHandles( float visualX, float visualY const Vector& lines = mVisualModel->mLines; float height = lines.Count() ? lines[0].ascender + -lines[0].descender : 0.0f; - mEventData->mDecorator->SetPosition( PRIMARY_SELECTION_HANDLE, primaryX, mEventData->mScrollPosition.y, height ); - mEventData->mDecorator->SetPosition( SECONDARY_SELECTION_HANDLE, secondaryX, mEventData->mScrollPosition.y, height ); + mEventData->mDecorator->SetPosition( LEFT_SELECTION_HANDLE, primaryX, mEventData->mScrollPosition.y, height ); + mEventData->mDecorator->SetPosition( RIGHT_SELECTION_HANDLE, secondaryX, mEventData->mScrollPosition.y, height ); mEventData->mDecorator->ClearHighlights(); mEventData->mDecorator->AddHighlight( primaryX, mEventData->mScrollPosition.y, secondaryX, height + mEventData->mScrollPosition.y ); @@ -435,8 +491,9 @@ void Controller::Impl::ChangeState( EventData::State newState ) { mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_NONE ); mEventData->mDecorator->StopCursorBlink(); - mEventData->mDecorator->SetGrabHandleActive( false ); - mEventData->mDecorator->SetSelectionActive( false ); + mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); + mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); mEventData->mDecorator->SetPopupActive( false ); mEventData->mDecoratorUpdated = true; } @@ -444,8 +501,9 @@ void Controller::Impl::ChangeState( EventData::State newState ) { mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_NONE ); mEventData->mDecorator->StopCursorBlink(); - mEventData->mDecorator->SetGrabHandleActive( false ); - mEventData->mDecorator->SetSelectionActive( true ); + mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); + mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, true ); + mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, true ); mEventData->mDecoratorUpdated = true; } else if( EventData::EDITING == mEventData->mState ) @@ -457,13 +515,14 @@ void Controller::Impl::ChangeState( EventData::State newState ) } if( mEventData->mGrabHandleEnabled ) { - mEventData->mDecorator->SetGrabHandleActive( true ); + mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, true ); } if( mEventData->mGrabHandlePopupEnabled ) { mEventData->mDecorator->SetPopupActive( false ); } - mEventData->mDecorator->SetSelectionActive( false ); + mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); mEventData->mDecoratorUpdated = true; } else if( EventData::EDITING_WITH_POPUP == mEventData->mState ) @@ -475,13 +534,15 @@ void Controller::Impl::ChangeState( EventData::State newState ) } if( mEventData->mGrabHandleEnabled ) { - mEventData->mDecorator->SetGrabHandleActive( true ); + mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, true ); + mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, true ); } if( mEventData->mGrabHandlePopupEnabled ) { mEventData->mDecorator->SetPopupActive( true ); } - mEventData->mDecorator->SetSelectionActive( false ); + mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); mEventData->mDecoratorUpdated = true; } } @@ -841,18 +902,28 @@ void Controller::Impl::UpdateCursorPosition() GetCursorPosition( mEventData->mPrimaryCursorPosition, cursorInfo ); + const Vector2 offset = mEventData->mScrollPosition + mAlignmentOffset; + const Vector2 cursorPosition = cursorInfo.primaryPosition + offset; + + // Sets the cursor position. mEventData->mDecorator->SetPosition( PRIMARY_CURSOR, - cursorInfo.primaryPosition.x + mEventData->mScrollPosition.x + mAlignmentOffset.x, - cursorInfo.primaryPosition.y + mEventData->mScrollPosition.y + mAlignmentOffset.y, + cursorPosition.x, + cursorPosition.y, cursorInfo.primaryCursorHeight, cursorInfo.lineHeight ); + // Sets the grab handle position. + mEventData->mDecorator->SetPosition( GRAB_HANDLE, + cursorPosition.x, + cursorPosition.y, + cursorInfo.lineHeight ); + if( cursorInfo.isSecondaryCursor ) { mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_BOTH ); mEventData->mDecorator->SetPosition( SECONDARY_CURSOR, - cursorInfo.secondaryPosition.x + mEventData->mScrollPosition.x + mAlignmentOffset.x, - cursorInfo.secondaryPosition.y + mEventData->mScrollPosition.y + mAlignmentOffset.y, + cursorInfo.secondaryPosition.x + offset.x, + cursorInfo.secondaryPosition.y + offset.y, cursorInfo.secondaryCursorHeight, cursorInfo.lineHeight ); } @@ -860,9 +931,31 @@ void Controller::Impl::UpdateCursorPosition() { mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY ); } +} + +void Controller::Impl::UpdateSelectionHandle( HandleType handleType ) +{ + if( ( LEFT_SELECTION_HANDLE != handleType ) && + ( RIGHT_SELECTION_HANDLE != handleType ) ) + { + return; + } + + const bool leftSelectionHandle = LEFT_SELECTION_HANDLE == handleType; + const CharacterIndex index = leftSelectionHandle ? mEventData->mLeftSelectionPosition : mEventData->mRightSelectionPosition; - mEventData->mUpdateCursorPosition = false; - mEventData->mDecoratorUpdated = true; + CursorInfo cursorInfo; + GetCursorPosition( index, + cursorInfo ); + + const Vector2 offset = mEventData->mScrollPosition + mAlignmentOffset; + const Vector2 cursorPosition = cursorInfo.primaryPosition + offset; + + // Sets the grab handle position. + mEventData->mDecorator->SetPosition( handleType, + cursorPosition.x, + cursorPosition.y, + cursorInfo.lineHeight ); } void Controller::Impl::ClampHorizontalScroll( const Vector2& actualSize )