X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller.cpp;h=643c8b83ab53bb3e4ffd56d3c230bb0be75caa1d;hb=ce9f965e8f8f51ae0992a85db9fd919519992a65;hp=47de1a26de606b326db6cdb4dedb41a816172c04;hpb=761122f3e8ff2b224d2329a911a78dc35177c5ea;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index 47de1a2..643c8b8 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -93,6 +93,7 @@ FontDescriptionRun& UpdateSelectionFontStyleRun( EventData* eventData, // Recalculate the selection highlight as the metrics may have changed. eventData->mUpdateLeftSelectionPosition = true; eventData->mUpdateRightSelectionPosition = true; + eventData->mUpdateHighlightBox = true; return fontDescriptionRun; } @@ -143,7 +144,7 @@ void Controller::SetAutoScrollEnabled( bool enable ) mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | LAYOUT | ALIGN | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | UPDATE_DIRECTION | REORDER ); @@ -154,7 +155,7 @@ void Controller::SetAutoScrollEnabled( bool enable ) mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | LAYOUT | ALIGN | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | REORDER ); } @@ -193,6 +194,69 @@ float Controller::GetAutoScrollLineAlignment() const return offset; } +void Controller::SetHorizontalScrollEnabled( bool enable ) +{ + if( ( NULL != mImpl->mEventData ) && + mImpl->mEventData->mDecorator ) + { + mImpl->mEventData->mDecorator->SetHorizontalScrollEnabled( enable ); + } +} + +bool Controller::IsHorizontalScrollEnabled() const +{ + if( ( NULL != mImpl->mEventData ) && + mImpl->mEventData->mDecorator ) + { + return mImpl->mEventData->mDecorator->IsHorizontalScrollEnabled(); + } + + return false; +} + +void Controller::SetVerticalScrollEnabled( bool enable ) +{ + if( ( NULL != mImpl->mEventData ) && + mImpl->mEventData->mDecorator ) + { + if( mImpl->mEventData->mDecorator ) + { + mImpl->mEventData->mDecorator->SetVerticalScrollEnabled( enable ); + } + } +} + +bool Controller::IsVerticalScrollEnabled() const +{ + if( ( NULL != mImpl->mEventData ) && + mImpl->mEventData->mDecorator ) + { + return mImpl->mEventData->mDecorator->IsVerticalScrollEnabled(); + } + + return false; +} + +void Controller::SetSmoothHandlePanEnabled( bool enable ) +{ + if( ( NULL != mImpl->mEventData ) && + mImpl->mEventData->mDecorator ) + { + mImpl->mEventData->mDecorator->SetSmoothHandlePanEnabled( enable ); + } +} + +bool Controller::IsSmoothHandlePanEnabled() const +{ + if( ( NULL != mImpl->mEventData ) && + mImpl->mEventData->mDecorator ) + { + return mImpl->mEventData->mDecorator->IsSmoothHandlePanEnabled(); + } + + return false; +} + void Controller::SetText( const std::string& text ) { DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::SetText\n" ); @@ -861,7 +925,7 @@ void Controller::SetInputFontFamily( const std::string& fontFamily ) SHAPE_TEXT | GET_GLYPH_METRICS | LAYOUT | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | REORDER | ALIGN ); mImpl->mRecalculateNaturalSize = true; @@ -874,6 +938,7 @@ void Controller::SetInputFontFamily( const std::string& fontFamily ) // As the font changes, recalculate the handle positions is needed. mImpl->mEventData->mUpdateLeftSelectionPosition = true; mImpl->mEventData->mUpdateRightSelectionPosition = true; + mImpl->mEventData->mUpdateHighlightBox = true; mImpl->mEventData->mScrollAfterUpdatePosition = true; } } @@ -934,7 +999,7 @@ void Controller::SetInputFontWeight( FontWeight weight ) SHAPE_TEXT | GET_GLYPH_METRICS | LAYOUT | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | REORDER | ALIGN ); mImpl->mRecalculateNaturalSize = true; @@ -947,6 +1012,7 @@ void Controller::SetInputFontWeight( FontWeight weight ) // As the font might change, recalculate the handle positions is needed. mImpl->mEventData->mUpdateLeftSelectionPosition = true; mImpl->mEventData->mUpdateRightSelectionPosition = true; + mImpl->mEventData->mUpdateHighlightBox = true; mImpl->mEventData->mScrollAfterUpdatePosition = true; } } @@ -987,7 +1053,7 @@ void Controller::SetInputFontWidth( FontWidth width ) SHAPE_TEXT | GET_GLYPH_METRICS | LAYOUT | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | REORDER | ALIGN ); mImpl->mRecalculateNaturalSize = true; @@ -1000,6 +1066,7 @@ void Controller::SetInputFontWidth( FontWidth width ) // As the font might change, recalculate the handle positions is needed. mImpl->mEventData->mUpdateLeftSelectionPosition = true; mImpl->mEventData->mUpdateRightSelectionPosition = true; + mImpl->mEventData->mUpdateHighlightBox = true; mImpl->mEventData->mScrollAfterUpdatePosition = true; } } @@ -1040,7 +1107,7 @@ void Controller::SetInputFontSlant( FontSlant slant ) SHAPE_TEXT | GET_GLYPH_METRICS | LAYOUT | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | REORDER | ALIGN ); mImpl->mRecalculateNaturalSize = true; @@ -1053,6 +1120,7 @@ void Controller::SetInputFontSlant( FontSlant slant ) // As the font might change, recalculate the handle positions is needed. mImpl->mEventData->mUpdateLeftSelectionPosition = true; mImpl->mEventData->mUpdateRightSelectionPosition = true; + mImpl->mEventData->mUpdateHighlightBox = true; mImpl->mEventData->mScrollAfterUpdatePosition = true; } } @@ -1092,7 +1160,7 @@ void Controller::SetInputFontPointSize( float size ) SHAPE_TEXT | GET_GLYPH_METRICS | LAYOUT | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | REORDER | ALIGN ); mImpl->mRecalculateNaturalSize = true; @@ -1105,6 +1173,7 @@ void Controller::SetInputFontPointSize( float size ) // As the font might change, recalculate the handle positions is needed. mImpl->mEventData->mUpdateLeftSelectionPosition = true; mImpl->mEventData->mUpdateRightSelectionPosition = true; + mImpl->mEventData->mUpdateHighlightBox = true; mImpl->mEventData->mScrollAfterUpdatePosition = true; } } @@ -1379,17 +1448,18 @@ float Controller::GetHeightForWidth( float width ) return layoutSize.height; } -bool Controller::Relayout( const Size& size ) +Controller::UpdateTextType Controller::Relayout( const Size& size ) { DALI_LOG_INFO( gLogFilter, Debug::Verbose, "-->Controller::Relayout %p size %f,%f, autoScroll[%s]\n", this, size.width, size.height, (mImpl->mAutoScrollEnabled)?"true":"false" ); + UpdateTextType updateTextType = NONE_UPDATED; + if( ( size.width < Math::MACHINE_EPSILON_1000 ) || ( size.height < Math::MACHINE_EPSILON_1000 ) ) { - bool glyphsRemoved( false ); if( 0u != mImpl->mVisualModel->mGlyphPositions.Count() ) { mImpl->mVisualModel->mGlyphPositions.Clear(); - glyphsRemoved = true; + updateTextType = MODEL_UPDATED; } // Clear the update info. This info will be set the next time the text is updated. @@ -1398,7 +1468,7 @@ bool Controller::Relayout( const Size& size ) // Not worth to relayout if width or height is equal to zero. DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::Relayout (skipped)\n" ); - return glyphsRemoved; + return updateTextType; } // Whether a new size has been set. @@ -1412,7 +1482,7 @@ bool Controller::Relayout( const Size& size ) mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | LAYOUT | ALIGN | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | REORDER ); // Set the update info to relayout the whole text. mImpl->mTextUpdateInfo.mFullRelayoutNeeded = true; @@ -1437,6 +1507,11 @@ bool Controller::Relayout( const Size& size ) mImpl->mOperationsPending, layoutSize ) || updated; + if( updated ) + { + updateTextType = MODEL_UPDATED; + } + // Do not re-do any operation until something changes. mImpl->mOperationsPending = NO_OPERATION; @@ -1468,14 +1543,17 @@ bool Controller::Relayout( const Size& size ) } // Move the cursor, grab handle etc. - updated = mImpl->ProcessInputEvents() || updated; + if( mImpl->ProcessInputEvents() ) + { + updateTextType = static_cast( updateTextType | DECORATOR_UPDATED ); + } } // Clear the update info. This info will be set the next time the text is updated. mImpl->mTextUpdateInfo.Clear(); DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::Relayout\n" ); - return updated; + return updateTextType; } void Controller::ProcessModifyEvents() @@ -1627,6 +1705,9 @@ bool Controller::DoRelayout( const Size& size, const CharacterIndex startIndex = mImpl->mTextUpdateInfo.mParagraphCharacterIndex; const Length requestedNumberOfCharacters = mImpl->mTextUpdateInfo.mRequestedNumberOfCharacters; + // Get the current layout size. + layoutSize = mImpl->mVisualModel->GetLayoutSize(); + if( NO_OPERATION != ( LAYOUT & operations ) ) { DALI_LOG_INFO( gLogFilter, Debug::Verbose, "-->Controller::DoRelayout LAYOUT & operations\n"); @@ -1648,7 +1729,7 @@ bool Controller::DoRelayout( const Size& size, if( 0u == totalNumberOfGlyphs ) { - if( NO_OPERATION != ( UPDATE_ACTUAL_SIZE & operations ) ) + if( NO_OPERATION != ( UPDATE_LAYOUT_SIZE & operations ) ) { mImpl->mVisualModel->SetLayoutSize( Size::ZERO ); } @@ -1694,14 +1775,18 @@ bool Controller::DoRelayout( const Size& size, layoutParameters.estimatedNumberOfLines = mImpl->mTextUpdateInfo.mEstimatedNumberOfLines; // Update the visual model. + Size newLayoutSize; viewUpdated = mImpl->mLayoutEngine.LayoutText( layoutParameters, glyphPositions, mImpl->mVisualModel->mLines, - layoutSize ); + newLayoutSize ); + viewUpdated = viewUpdated || ( newLayoutSize != layoutSize ); if( viewUpdated ) { + layoutSize = newLayoutSize; + if ( NO_OPERATION != ( UPDATE_DIRECTION & operations ) ) { mImpl->mAutoScrollDirectionRTL = false; @@ -1748,8 +1833,8 @@ bool Controller::DoRelayout( const Size& size, } } // REORDER - // Sets the actual size. - if( NO_OPERATION != ( UPDATE_ACTUAL_SIZE & operations ) ) + // Sets the layout size. + if( NO_OPERATION != ( UPDATE_LAYOUT_SIZE & operations ) ) { mImpl->mVisualModel->SetLayoutSize( layoutSize ); } @@ -1758,10 +1843,6 @@ bool Controller::DoRelayout( const Size& size, // Store the size used to layout the text. mImpl->mVisualModel->mControlSize = size; } - else - { - layoutSize = mImpl->mVisualModel->GetLayoutSize(); - } if( NO_OPERATION != ( ALIGN & operations ) ) { @@ -1795,7 +1876,7 @@ void Controller::SetMultiLineEnabled( bool enable ) // Set the flags to redo the layout operations const OperationsMask layoutOperations = static_cast( LAYOUT | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | ALIGN | REORDER ); @@ -2304,6 +2385,7 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y ) } else { + // Show cursor and grabhandle on first tap, this matches the behaviour of tapping when already editing mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE ); } relayoutNeeded = true; @@ -2354,7 +2436,6 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y ) } void Controller::PanEvent( Gesture::State state, const Vector2& displacement ) - // Show cursor and grabhandle on first tap, this matches the behaviour of tapping when already editing { DALI_ASSERT_DEBUG( mImpl->mEventData && "Unexpected PanEvent" ); @@ -2416,8 +2497,6 @@ void Controller::SelectEvent( float x, float y, bool selectAll ) if( NULL != mImpl->mEventData ) { - mImpl->ChangeState( EventData::SELECTING ); - if( selectAll ) { Event event( Event::SELECT_ALL ); @@ -2561,7 +2640,10 @@ void Controller::TextPopupButtonTouched( Dali::Toolkit::TextSelectionPopup::Butt case Toolkit::TextSelectionPopup::COPY: { mImpl->SendSelectionToClipboard( false ); // Text not modified - mImpl->RequestRelayout(); // Handles, Selection Highlight, Popup + + mImpl->mEventData->mUpdateCursorPosition = true; + + mImpl->RequestRelayout(); // Cursor, Handles, Selection Highlight, Popup break; } case Toolkit::TextSelectionPopup::PASTE: @@ -2842,7 +2924,7 @@ void Controller::ClearFontData() SHAPE_TEXT | GET_GLYPH_METRICS | LAYOUT | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | REORDER | ALIGN ); }