X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller-impl.cpp;h=7b3f2d686d54111d7ae981d91ea3b230ec31c8bd;hb=07bdc775bf08ac2f53c8f6a3a8856077a299959b;hp=6cf26fc5ad930cd6951352070160b87cb3d862a9;hpb=12fe9741661d0fefaabddd959d04566a0a2d2233;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 6cf26fc..7b3f2d6 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ #include #include #include +#include #include namespace @@ -73,6 +74,7 @@ EventData::EventData( DecoratorPtr decorator ) mPlaceholderTextInactive(), mPlaceholderTextColor( 0.8f, 0.8f, 0.8f, 0.8f ), mEventQueue(), + mInputStyleChangedQueue(), mState( INACTIVE ), mPrimaryCursorPosition( 0u ), mLeftSelectionPosition( 0u ), @@ -91,6 +93,7 @@ EventData::EventData( DecoratorPtr decorator ) mUpdateGrabHandlePosition( false ), mUpdateLeftSelectionPosition( false ), mUpdateRightSelectionPosition( false ), + mIsLeftHandleSelected( false ), mUpdateHighlightBox( false ), mScrollAfterUpdatePosition( false ), mScrollAfterDelete( false ), @@ -218,16 +221,12 @@ bool Controller::Impl::ProcessInputEvents() GetCursorPosition( mEventData->mRightSelectionPosition, rightHandleInfo ); - if( mEventData->mScrollAfterUpdatePosition && mEventData->mUpdateLeftSelectionPosition ) + if( mEventData->mScrollAfterUpdatePosition && ( mEventData->mIsLeftHandleSelected ? mEventData->mUpdateLeftSelectionPosition : mEventData->mUpdateRightSelectionPosition ) ) { - const Vector2 currentCursorPosition( leftHandleInfo.primaryPosition.x, leftHandleInfo.lineOffset ); - ScrollToMakePositionVisible( currentCursorPosition, leftHandleInfo.lineHeight ); - } + CursorInfo& info = mEventData->mIsLeftHandleSelected ? leftHandleInfo : rightHandleInfo; - if( mEventData->mScrollAfterUpdatePosition && mEventData->mUpdateRightSelectionPosition ) - { - const Vector2 currentCursorPosition( rightHandleInfo.primaryPosition.x, rightHandleInfo.lineOffset ); - ScrollToMakePositionVisible( currentCursorPosition, rightHandleInfo.lineHeight ); + const Vector2 currentCursorPosition( info.primaryPosition.x, info.lineOffset ); + ScrollToMakePositionVisible( currentCursorPosition, info.lineHeight ); } } @@ -265,6 +264,10 @@ bool Controller::Impl::ProcessInputEvents() if( mEventData->mUpdateInputStyle ) { + // Keep a copy of the current input style. + InputStyle currentInputStyle; + currentInputStyle.Copy( mEventData->mInputStyle ); + // Set the default style first. RetrieveDefaultInputStyle( mEventData->mInputStyle ); @@ -274,6 +277,16 @@ bool Controller::Impl::ProcessInputEvents() // Retrieve the style from the style runs stored in the logical model. mLogicalModel->RetrieveStyle( styleIndex, mEventData->mInputStyle ); + // Compare if the input style has changed. + const bool hasInputStyleChanged = !currentInputStyle.Equal( mEventData->mInputStyle ); + + if( hasInputStyleChanged ) + { + const InputStyle::Mask styleChangedMask = currentInputStyle.GetInputStyleChangeMask( mEventData->mInputStyle ); + // Queue the input style changed signal. + mEventData->mInputStyleChangedQueue.PushBack( styleChangedMask ); + } + mEventData->mUpdateInputStyle = false; } @@ -310,6 +323,15 @@ void Controller::Impl::NotifyImfManager() } } +void Controller::Impl::NotifyImfMultiLineStatus() +{ + if ( mEventData ) + { + LayoutEngine::Layout layout = mLayoutEngine.GetLayout(); + mEventData->mImfManager.NotifyTextInputMultiLine( layout == LayoutEngine::MULTI_LINE_BOX ); + } +} + CharacterIndex Controller::Impl::GetLogicalCursorPosition() const { CharacterIndex cursorPosition = 0u; @@ -827,15 +849,22 @@ bool Controller::Impl::UpdateModel( OperationsMask operationsRequired ) // Validate the fonts set through the mark-up string. Vector& fontDescriptionRuns = mLogicalModel->mFontDescriptionRuns; - // Get the default font id. - const FontId defaultFontId = ( NULL == mFontDefaults ) ? 0u : mFontDefaults->GetFontId( mFontClient ); + // Get the default font's description. + TextAbstraction::FontDescription defaultFontDescription; + TextAbstraction::PointSize26Dot6 defaultPointSize = TextAbstraction::FontClient::DEFAULT_POINT_SIZE; + if( NULL != mFontDefaults ) + { + defaultFontDescription = mFontDefaults->mFontDescription; + defaultPointSize = mFontDefaults->mDefaultPointSize * 64u; + } // Validates the fonts. If there is a character with no assigned font it sets a default one. // After this call, fonts are validated. multilanguageSupport.ValidateFonts( utf32Characters, scripts, fontDescriptionRuns, - defaultFontId, + defaultFontDescription, + defaultPointSize, startIndex, requestedNumberOfCharacters, validFonts ); @@ -993,11 +1022,25 @@ void Controller::Impl::RetrieveDefaultInputStyle( InputStyle& inputStyle ) inputStyle.slant = TextAbstraction::FontSlant::NORMAL; inputStyle.size = 0.f; - inputStyle.familyDefined = false; - inputStyle.weightDefined = false; - inputStyle.widthDefined = false; - inputStyle.slantDefined = false; - inputStyle.sizeDefined = false; + inputStyle.lineSpacing = 0.f; + + inputStyle.underlineProperties.clear(); + inputStyle.shadowProperties.clear(); + inputStyle.embossProperties.clear(); + inputStyle.outlineProperties.clear(); + + inputStyle.isFamilyDefined = false; + inputStyle.isWeightDefined = false; + inputStyle.isWidthDefined = false; + inputStyle.isSlantDefined = false; + inputStyle.isSizeDefined = false; + + inputStyle.isLineSpacingDefined = false; + + inputStyle.isUnderlineDefined = false; + inputStyle.isShadowDefined = false; + inputStyle.isEmbossDefined = false; + inputStyle.isOutlineDefined = false; // Sets the default font's family name, weight, width, slant and size. if( mFontDefaults ) @@ -1005,31 +1048,31 @@ void Controller::Impl::RetrieveDefaultInputStyle( InputStyle& inputStyle ) if( mFontDefaults->familyDefined ) { inputStyle.familyName = mFontDefaults->mFontDescription.family; - inputStyle.familyDefined = true; + inputStyle.isFamilyDefined = true; } if( mFontDefaults->weightDefined ) { inputStyle.weight = mFontDefaults->mFontDescription.weight; - inputStyle.weightDefined = true; + inputStyle.isWeightDefined = true; } if( mFontDefaults->widthDefined ) { inputStyle.width = mFontDefaults->mFontDescription.width; - inputStyle.widthDefined = true; + inputStyle.isWidthDefined = true; } if( mFontDefaults->slantDefined ) { inputStyle.slant = mFontDefaults->mFontDescription.slant; - inputStyle.slantDefined = true; + inputStyle.isSlantDefined = true; } if( mFontDefaults->sizeDefined ) { inputStyle.size = mFontDefaults->mDefaultPointSize; - inputStyle.sizeDefined = true; + inputStyle.isSizeDefined = true; } } } @@ -1203,17 +1246,31 @@ void Controller::Impl::OnPanEvent( const Event& event ) return; } - int state = event.p1.mInt; + const bool isHorizontalScrollEnabled = mEventData->mDecorator->IsHorizontalScrollEnabled(); + const bool isVerticalScrollEnabled = mEventData->mDecorator->IsVerticalScrollEnabled(); - if( ( Gesture::Started == state ) || - ( Gesture::Continuing == state ) ) + if( !isHorizontalScrollEnabled && !isVerticalScrollEnabled ) { - if( mEventData->mDecorator ) + // Nothing to do if scrolling is not enabled. + return; + } + + const int state = event.p1.mInt; + + switch( state ) + { + case Gesture::Started: + { + // Will remove the cursor, handles or text's popup, ... + ChangeState( EventData::TEXT_PANNING ); + break; + } + case Gesture::Continuing: { const Vector2& layoutSize = mVisualModel->GetLayoutSize(); const Vector2 currentScroll = mScrollPosition; - if( mEventData->mDecorator->IsHorizontalScrollEnabled() ) + if( isHorizontalScrollEnabled ) { const float displacementX = event.p2.mFloat; mScrollPosition.x += displacementX; @@ -1221,7 +1278,7 @@ void Controller::Impl::OnPanEvent( const Event& event ) ClampHorizontalScroll( layoutSize ); } - if( mEventData->mDecorator->IsVerticalScrollEnabled() ) + if( isVerticalScrollEnabled ) { const float displacementY = event.p3.mFloat; mScrollPosition.y += displacementY; @@ -1230,7 +1287,17 @@ void Controller::Impl::OnPanEvent( const Event& event ) } mEventData->mDecorator->UpdatePositions( mScrollPosition - currentScroll ); + break; + } + case Gesture::Finished: + case Gesture::Cancelled: // FALLTHROUGH + { + // Will go back to the previous state to show the cursor, handles, the text's popup, ... + ChangeState( mEventData->mPreviousState ); + break; } + default: + break; } } @@ -1302,6 +1369,9 @@ void Controller::Impl::OnHandleEvent( const Event& event ) // Updates the decorator if the soft handle panning is enabled. It triggers a relayout in the decorator and the new position of the handle is set. mEventData->mDecoratorUpdated = isSmoothHandlePanEnabled; + + // Will define the order to scroll the text to match the handle position. + mEventData->mIsLeftHandleSelected = true; } else if( Event::RIGHT_SELECTION_HANDLE_EVENT == event.type ) { @@ -1319,6 +1389,9 @@ void Controller::Impl::OnHandleEvent( const Event& event ) // Updates the decorator if the soft handle panning is enabled. It triggers a relayout in the decorator and the new position of the handle is set. mEventData->mDecoratorUpdated = isSmoothHandlePanEnabled; + + // Will define the order to scroll the text to match the handle position. + mEventData->mIsLeftHandleSelected = false; } } // end ( HANDLE_PRESSED == state ) else if( ( HANDLE_RELEASED == state ) || @@ -1361,6 +1434,7 @@ void Controller::Impl::OnHandleEvent( const Event& event ) mEventData->mUpdateHighlightBox = true; mEventData->mUpdateLeftSelectionPosition = true; + mEventData->mUpdateRightSelectionPosition = true; if( handleStopScrolling || isSmoothHandlePanEnabled ) { @@ -1379,6 +1453,7 @@ void Controller::Impl::OnHandleEvent( const Event& event ) mEventData->mUpdateHighlightBox = true; mEventData->mUpdateRightSelectionPosition = true; + mEventData->mUpdateLeftSelectionPosition = true; if( handleStopScrolling || isSmoothHandlePanEnabled ) { @@ -1597,9 +1672,23 @@ void Controller::Impl::RetrieveSelection( std::string& selectedText, bool delete if( deleteAfterRetrieval ) // Only delete text if copied successfully { + // Keep a copy of the current input style. + InputStyle currentInputStyle; + currentInputStyle.Copy( mEventData->mInputStyle ); + // Set as input style the style of the first deleted character. mLogicalModel->RetrieveStyle( startOfSelectedText, mEventData->mInputStyle ); + // Compare if the input style has changed. + const bool hasInputStyleChanged = !currentInputStyle.Equal( mEventData->mInputStyle ); + + if( hasInputStyleChanged ) + { + const InputStyle::Mask styleChangedMask = currentInputStyle.GetInputStyleChangeMask( mEventData->mInputStyle ); + // Queue the input style changed signal. + mEventData->mInputStyleChangedQueue.PushBack( styleChangedMask ); + } + mLogicalModel->UpdateTextStyleRuns( startOfSelectedText, -static_cast( lengthOfSelectedText ) ); // Mark the paragraphs to be updated. @@ -1659,11 +1748,11 @@ void Controller::Impl::SendSelectionToClipboard( bool deleteAfterSending ) ChangeState( EventData::EDITING ); } -void Controller::Impl::GetTextFromClipboard( unsigned int itemIndex, std::string& retrievedString ) +void Controller::Impl::RequestGetTextFromClipboard() { if ( mClipboard ) { - retrievedString = mClipboard.GetItem( itemIndex ); + mClipboard.RequestItem(); } } @@ -1759,6 +1848,14 @@ void Controller::Impl::RepositionSelectionHandles() const Length numberOfCharactersEnd = *( charactersPerGlyphBuffer + glyphEnd ); bool splitEndGlyph = ( glyphStart != glyphEnd ) && ( numberOfCharactersEnd > 1u ) && HasLigatureMustBreak( mLogicalModel->GetScript( selectionEndMinusOne ) ); + // The number of quads of the selection box. + const unsigned int numberOfQuads = 1u + ( glyphEnd - glyphStart ) + ( ( numberOfLines > 1u ) ? 2u * numberOfLines : 0u ); + mEventData->mDecorator->ResizeHighlightQuads( numberOfQuads ); + + // Count the actual number of quads. + unsigned int actualNumberOfQuads = 0u; + Vector4 quad; + // Traverse the glyphs. for( GlyphIndex index = glyphStart; index <= glyphEnd; ++index ) { @@ -1782,18 +1879,17 @@ void Controller::Impl::RepositionSelectionHandles() // Calculate the number of characters selected. const Length numberOfCharacters = ( glyphStart == glyphEnd ) ? ( selectionEnd - selectionStart ) : ( numberOfCharactersStart - interGlyphIndex ); - const float xPosition = lineRun->alignmentOffset + position.x - glyph.xBearing + mScrollPosition.x + glyphAdvance * static_cast( isCurrentRightToLeft ? ( numberOfCharactersStart - interGlyphIndex - numberOfCharacters ) : interGlyphIndex ); - const float xPositionAdvance = xPosition + static_cast( numberOfCharacters ) * glyphAdvance; - const float yPosition = selectionBoxInfo->lineOffset; + quad.x = lineRun->alignmentOffset + position.x - glyph.xBearing + mScrollPosition.x + glyphAdvance * static_cast( isCurrentRightToLeft ? ( numberOfCharactersStart - interGlyphIndex - numberOfCharacters ) : interGlyphIndex ); + quad.y = selectionBoxInfo->lineOffset; + quad.z = quad.x + static_cast( numberOfCharacters ) * glyphAdvance; + quad.w = selectionBoxInfo->lineOffset + selectionBoxInfo->lineHeight; // Store the min and max 'x' for each line. - selectionBoxInfo->minX = std::min( selectionBoxInfo->minX, xPosition ); - selectionBoxInfo->maxX = std::max( selectionBoxInfo->maxX, xPositionAdvance ); + selectionBoxInfo->minX = std::min( selectionBoxInfo->minX, quad.x ); + selectionBoxInfo->maxX = std::max( selectionBoxInfo->maxX, quad.z ); - mEventData->mDecorator->AddHighlight( xPosition, - yPosition, - xPositionAdvance, - yPosition + selectionBoxInfo->lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, quad ); + ++actualNumberOfQuads; splitStartGlyph = false; continue; @@ -1814,35 +1910,35 @@ void Controller::Impl::RepositionSelectionHandles() const Length numberOfCharacters = numberOfCharactersEnd - interGlyphIndex; - const float xPosition = lineRun->alignmentOffset + position.x - glyph.xBearing + mScrollPosition.x + ( isCurrentRightToLeft ? ( glyphAdvance * static_cast( numberOfCharacters ) ) : 0.f ); - const float xPositionAdvance = xPosition + static_cast( interGlyphIndex ) * glyphAdvance; - const float yPosition = selectionBoxInfo->lineOffset; + quad.x = lineRun->alignmentOffset + position.x - glyph.xBearing + mScrollPosition.x + ( isCurrentRightToLeft ? ( glyphAdvance * static_cast( numberOfCharacters ) ) : 0.f ); + quad.y = selectionBoxInfo->lineOffset; + quad.z = quad.x + static_cast( interGlyphIndex ) * glyphAdvance; + quad.w = quad.y + selectionBoxInfo->lineHeight; // Store the min and max 'x' for each line. - selectionBoxInfo->minX = std::min( selectionBoxInfo->minX, xPosition ); - selectionBoxInfo->maxX = std::max( selectionBoxInfo->maxX, xPositionAdvance ); + selectionBoxInfo->minX = std::min( selectionBoxInfo->minX, quad.x ); + selectionBoxInfo->maxX = std::max( selectionBoxInfo->maxX, quad.z ); - mEventData->mDecorator->AddHighlight( xPosition, - yPosition, - xPositionAdvance, - yPosition + selectionBoxInfo->lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; splitEndGlyph = false; continue; } - const float xPosition = lineRun->alignmentOffset + position.x - glyph.xBearing + mScrollPosition.x; - const float xPositionAdvance = xPosition + glyph.advance; - const float yPosition = selectionBoxInfo->lineOffset; + quad.x = lineRun->alignmentOffset + position.x - glyph.xBearing + mScrollPosition.x; + quad.y = selectionBoxInfo->lineOffset; + quad.z = quad.x + glyph.advance; + quad.w = quad.y + selectionBoxInfo->lineHeight; // Store the min and max 'x' for each line. - selectionBoxInfo->minX = std::min( selectionBoxInfo->minX, xPosition ); - selectionBoxInfo->maxX = std::max( selectionBoxInfo->maxX, xPositionAdvance ); + selectionBoxInfo->minX = std::min( selectionBoxInfo->minX, quad.x ); + selectionBoxInfo->maxX = std::max( selectionBoxInfo->maxX, quad.z ); - mEventData->mDecorator->AddHighlight( xPosition, - yPosition, - xPositionAdvance, - yPosition + selectionBoxInfo->lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; // Whether to retrieve the next line. if( index == lastGlyphOfLine ) @@ -1886,7 +1982,7 @@ void Controller::Impl::RepositionSelectionHandles() const SelectionBoxInfo& info = *it; // Update the size of the highlighted text. - highLightSize.height += selectionBoxInfo->lineHeight; + highLightSize.height += info.lineHeight; minHighlightX = std::min( minHighlightX, info.minX ); maxHighlightX = std::max( maxHighlightX, info.maxX ); } @@ -1904,11 +2000,15 @@ void Controller::Impl::RepositionSelectionHandles() if( boxifyBegin ) { + quad.x = 0.f; + quad.y = firstSelectionBoxLineInfo.lineOffset; + quad.z = firstSelectionBoxLineInfo.minX; + quad.w = firstSelectionBoxLineInfo.lineOffset + firstSelectionBoxLineInfo.lineHeight; + // Boxify at the beginning of the line. - mEventData->mDecorator->AddHighlight( 0.f, - firstSelectionBoxLineInfo.lineOffset, - firstSelectionBoxLineInfo.minX, - firstSelectionBoxLineInfo.lineOffset + firstSelectionBoxLineInfo.lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; // Update the size of the highlighted text. minHighlightX = 0.f; @@ -1916,11 +2016,15 @@ void Controller::Impl::RepositionSelectionHandles() if( boxifyEnd ) { + quad.x = firstSelectionBoxLineInfo.maxX; + quad.y = firstSelectionBoxLineInfo.lineOffset; + quad.z = mVisualModel->mControlSize.width; + quad.w = firstSelectionBoxLineInfo.lineOffset + firstSelectionBoxLineInfo.lineHeight; + // Boxify at the end of the line. - mEventData->mDecorator->AddHighlight( firstSelectionBoxLineInfo.maxX, - firstSelectionBoxLineInfo.lineOffset, - mVisualModel->mControlSize.width, - firstSelectionBoxLineInfo.lineOffset + firstSelectionBoxLineInfo.lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; // Update the size of the highlighted text. maxHighlightX = mVisualModel->mControlSize.width; @@ -1936,15 +2040,23 @@ void Controller::Impl::RepositionSelectionHandles() { const SelectionBoxInfo& info = *it; - mEventData->mDecorator->AddHighlight( 0.f, - info.lineOffset, - info.minX, - info.lineOffset + info.lineHeight ); + quad.x = 0.f; + quad.y = info.lineOffset; + quad.z = info.minX; + quad.w = info.lineOffset + info.lineHeight; + + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; - mEventData->mDecorator->AddHighlight( info.maxX, - info.lineOffset, - mVisualModel->mControlSize.width, - info.lineOffset + info.lineHeight ); + quad.x = info.maxX; + quad.y = info.lineOffset; + quad.z = mVisualModel->mControlSize.width; + quad.w = info.lineOffset + info.lineHeight; + + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; } // Update the size of the highlighted text. @@ -1961,11 +2073,15 @@ void Controller::Impl::RepositionSelectionHandles() if( boxifyBegin ) { + quad.x = 0.f; + quad.y = lastSelectionBoxLineInfo.lineOffset; + quad.z = lastSelectionBoxLineInfo.minX; + quad.w = lastSelectionBoxLineInfo.lineOffset + lastSelectionBoxLineInfo.lineHeight; + // Boxify at the beginning of the line. - mEventData->mDecorator->AddHighlight( 0.f, - lastSelectionBoxLineInfo.lineOffset, - lastSelectionBoxLineInfo.minX, - lastSelectionBoxLineInfo.lineOffset + lastSelectionBoxLineInfo.lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; // Update the size of the highlighted text. minHighlightX = 0.f; @@ -1973,17 +2089,24 @@ void Controller::Impl::RepositionSelectionHandles() if( boxifyEnd ) { + quad.x = lastSelectionBoxLineInfo.maxX; + quad.y = lastSelectionBoxLineInfo.lineOffset; + quad.z = mVisualModel->mControlSize.width; + quad.w = lastSelectionBoxLineInfo.lineOffset + lastSelectionBoxLineInfo.lineHeight; + // Boxify at the end of the line. - mEventData->mDecorator->AddHighlight( lastSelectionBoxLineInfo.maxX, - lastSelectionBoxLineInfo.lineOffset, - mVisualModel->mControlSize.width, - lastSelectionBoxLineInfo.lineOffset + lastSelectionBoxLineInfo.lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; // Update the size of the highlighted text. maxHighlightX = mVisualModel->mControlSize.width; } } + // Set the actual number of quads. + mEventData->mDecorator->ResizeHighlightQuads( actualNumberOfQuads ); + // Sets the highlight's size and position. In decorator's coords. // The highlight's height has been calculated above (before 'boxifying' the highlight). highLightSize.width = maxHighlightX - minHighlightX; @@ -2152,6 +2275,7 @@ void Controller::Impl::ChangeState( EventData::State newState ) if( mEventData->mState != newState ) { + mEventData->mPreviousState = mEventData->mState; mEventData->mState = newState; switch( mEventData->mState ) @@ -2163,9 +2287,9 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHighlightActive( false ); mEventData->mDecorator->SetPopupActive( false ); mEventData->mDecoratorUpdated = true; - HideClipboard(); break; } case EventData::INTERRUPTED: @@ -2173,9 +2297,9 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHighlightActive( false ); mEventData->mDecorator->SetPopupActive( false ); mEventData->mDecoratorUpdated = true; - HideClipboard(); break; } case EventData::SELECTING: @@ -2185,6 +2309,7 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, true ); mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, true ); + mEventData->mDecorator->SetHighlightActive( true ); if( mEventData->mGrabHandlePopupEnabled ) { SetPopupButtons(); @@ -2204,12 +2329,12 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHighlightActive( false ); if( mEventData->mGrabHandlePopupEnabled ) { mEventData->mDecorator->SetPopupActive( false ); } mEventData->mDecoratorUpdated = true; - HideClipboard(); break; } case EventData::EDITING_WITH_POPUP: @@ -2225,6 +2350,7 @@ void Controller::Impl::ChangeState( EventData::State newState ) { mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHighlightActive( false ); } else { @@ -2235,7 +2361,6 @@ void Controller::Impl::ChangeState( EventData::State newState ) SetPopupButtons(); mEventData->mDecorator->SetPopupActive( true ); } - HideClipboard(); mEventData->mDecoratorUpdated = true; break; } @@ -2252,12 +2377,12 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, true ); mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHighlightActive( false ); if( mEventData->mGrabHandlePopupEnabled ) { mEventData->mDecorator->SetPopupActive( false ); } mEventData->mDecoratorUpdated = true; - HideClipboard(); break; } case EventData::SELECTION_HANDLE_PANNING: @@ -2267,6 +2392,7 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, true ); mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, true ); + mEventData->mDecorator->SetHighlightActive( true ); if( mEventData->mGrabHandlePopupEnabled ) { mEventData->mDecorator->SetPopupActive( false ); @@ -2286,6 +2412,7 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, true ); mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHighlightActive( false ); if( mEventData->mGrabHandlePopupEnabled ) { mEventData->mDecorator->SetPopupActive( false ); @@ -2306,13 +2433,34 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, true ); mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHighlightActive( false ); if( mEventData->mGrabHandlePopupEnabled ) { SetPopupButtons(); mEventData->mDecorator->SetPopupActive( true ); } - HideClipboard(); + mEventData->mDecoratorUpdated = true; + break; + } + case EventData::TEXT_PANNING: + { + mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_NONE ); + mEventData->mDecorator->StopCursorBlink(); + mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); + if( mEventData->mDecorator->IsHandleActive( LEFT_SELECTION_HANDLE ) || + mEventData->mDecorator->IsHandleActive( RIGHT_SELECTION_HANDLE ) ) + { + mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); + mEventData->mDecorator->SetHighlightActive( true ); + } + + if( mEventData->mGrabHandlePopupEnabled ) + { + mEventData->mDecorator->SetPopupActive( false ); + } + mEventData->mDecoratorUpdated = true; break; } @@ -2602,7 +2750,10 @@ void Controller::Impl::ScrollTextToMatchCursor( const CursorInfo& cursorInfo ) void Controller::Impl::RequestRelayout() { - mControlInterface.RequestTextRelayout(); + if( NULL != mControlInterface ) + { + mControlInterface->RequestTextRelayout(); + } } } // namespace Text