X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller.cpp;h=0b0b77dfaa21b52098d72e1c300b66fcd5b67c80;hp=47de1a26de606b326db6cdb4dedb41a816172c04;hb=2cf32ac170f397aacce527efd34909b3fd62efda;hpb=ae44254100eb934f5f766c9ac834261b379afed3 diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index 47de1a2..0b0b77d 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.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. @@ -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 ); } @@ -163,7 +164,7 @@ void Controller::SetAutoScrollEnabled( bool enable ) } else { - DALI_LOG_WARNING( "Attempted AutoScrolling on a non SINGLE_LINE_BOX, request ignored" ); + DALI_LOG_WARNING( "Attempted AutoScrolling on a non SINGLE_LINE_BOX, request ignored\n" ); mImpl->mAutoScrollEnabled = false; } } @@ -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" ); @@ -364,7 +428,7 @@ void Controller::SetDefaultFontFamily( const std::string& defaultFontFamily ) mImpl->mFontDefaults->mFontDescription.family = defaultFontFamily; DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::SetDefaultFontFamily %s\n", defaultFontFamily.c_str()); - mImpl->mFontDefaults->familyDefined = true; + mImpl->mFontDefaults->familyDefined = !defaultFontFamily.empty(); // Clear the font-specific data ClearFontData(); @@ -382,26 +446,6 @@ const std::string& Controller::GetDefaultFontFamily() const return EMPTY_STRING; } -void Controller::SetDefaultFontStyle( const std::string& style ) -{ - if( NULL == mImpl->mFontDefaults ) - { - mImpl->mFontDefaults = new FontDefaults(); - } - - mImpl->mFontDefaults->mFontStyle = style; -} - -const std::string& Controller::GetDefaultFontStyle() const -{ - if( NULL != mImpl->mFontDefaults ) - { - return mImpl->mFontDefaults->mFontStyle; - } - - return EMPTY_STRING; -} - void Controller::SetDefaultFontWeight( FontWeight weight ) { if( NULL == mImpl->mFontDefaults ) @@ -418,6 +462,11 @@ void Controller::SetDefaultFontWeight( FontWeight weight ) mImpl->RequestRelayout(); } +bool Controller::IsDefaultFontWeightDefined() const +{ + return mImpl->mFontDefaults->weightDefined; +} + FontWeight Controller::GetDefaultFontWeight() const { if( NULL != mImpl->mFontDefaults ) @@ -444,6 +493,11 @@ void Controller::SetDefaultFontWidth( FontWidth width ) mImpl->RequestRelayout(); } +bool Controller::IsDefaultFontWidthDefined() const +{ + return mImpl->mFontDefaults->widthDefined; +} + FontWidth Controller::GetDefaultFontWidth() const { if( NULL != mImpl->mFontDefaults ) @@ -470,6 +524,11 @@ void Controller::SetDefaultFontSlant( FontSlant slant ) mImpl->RequestRelayout(); } +bool Controller::IsDefaultFontSlantDefined() const +{ + return mImpl->mFontDefaults->slantDefined; +} + FontSlant Controller::GetDefaultFontSlant() const { if( NULL != mImpl->mFontDefaults ) @@ -508,7 +567,7 @@ float Controller::GetDefaultPointSize() const void Controller::UpdateAfterFontChange( const std::string& newDefaultFont ) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::UpdateAfterFontChange"); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::UpdateAfterFontChange\n"); if( !mImpl->mFontDefaults->familyDefined ) // If user defined font then should not update when system font changes { @@ -861,7 +920,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 +933,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; } } @@ -890,25 +950,6 @@ const std::string& Controller::GetInputFontFamily() const return GetDefaultFontFamily(); } -void Controller::SetInputFontStyle( const std::string& fontStyle ) -{ - if( NULL != mImpl->mEventData ) - { - mImpl->mEventData->mInputStyle.fontStyle = fontStyle; - } -} - -const std::string& Controller::GetInputFontStyle() const -{ - if( NULL != mImpl->mEventData ) - { - return mImpl->mEventData->mInputStyle.fontStyle; - } - - // Return the default font's style if there is no EventData. - return GetDefaultFontStyle(); -} - void Controller::SetInputFontWeight( FontWeight weight ) { if( NULL != mImpl->mEventData ) @@ -934,7 +975,7 @@ void Controller::SetInputFontWeight( FontWeight weight ) SHAPE_TEXT | GET_GLYPH_METRICS | LAYOUT | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | REORDER | ALIGN ); mImpl->mRecalculateNaturalSize = true; @@ -947,11 +988,24 @@ 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; } } } +bool Controller::IsInputFontWeightDefined() const +{ + bool defined = false; + + if( NULL != mImpl->mEventData ) + { + defined = mImpl->mEventData->mInputStyle.weightDefined; + } + + return defined; +} + FontWeight Controller::GetInputFontWeight() const { if( NULL != mImpl->mEventData ) @@ -987,7 +1041,7 @@ void Controller::SetInputFontWidth( FontWidth width ) SHAPE_TEXT | GET_GLYPH_METRICS | LAYOUT | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | REORDER | ALIGN ); mImpl->mRecalculateNaturalSize = true; @@ -1000,11 +1054,24 @@ 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; } } } +bool Controller::IsInputFontWidthDefined() const +{ + bool defined = false; + + if( NULL != mImpl->mEventData ) + { + defined = mImpl->mEventData->mInputStyle.widthDefined; + } + + return defined; +} + FontWidth Controller::GetInputFontWidth() const { if( NULL != mImpl->mEventData ) @@ -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,11 +1120,24 @@ 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; } } } +bool Controller::IsInputFontSlantDefined() const +{ + bool defined = false; + + if( NULL != mImpl->mEventData ) + { + defined = mImpl->mEventData->mInputStyle.slantDefined; + } + + return defined; +} + FontSlant Controller::GetInputFontSlant() const { if( NULL != mImpl->mEventData ) @@ -1092,7 +1172,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 +1185,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 +1460,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 +1480,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 +1494,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 +1519,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 +1555,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 +1717,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 +1741,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 +1787,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 +1845,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 +1855,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 +1888,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 ); @@ -1899,7 +1992,7 @@ void Controller::KeyboardFocusGainEvent() mImpl->ChangeState( EventData::EDITING ); mImpl->mEventData->mUpdateCursorPosition = true; //If editing started without tap event, cursor update must be triggered. } - + mImpl->NotifyImfMultiLineStatus(); if( mImpl->IsShowingPlaceholderText() ) { // Show alternative placeholder-text when editing @@ -2091,7 +2184,7 @@ void Controller::InsertText( const std::string& text, Controller::InsertType typ { if( !mImpl->mEventData->mPreEditFlag ) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Entered PreEdit state" ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Entered PreEdit state\n" ); // Record the start of the pre-edit text mImpl->mEventData->mPreEditStartPosition = mImpl->mEventData->mPrimaryCursorPosition; @@ -2304,6 +2397,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 +2448,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 +2509,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 +2652,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 +2936,7 @@ void Controller::ClearFontData() SHAPE_TEXT | GET_GLYPH_METRICS | LAYOUT | - UPDATE_ACTUAL_SIZE | + UPDATE_LAYOUT_SIZE | REORDER | ALIGN ); }