X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller.cpp;h=2a06637c5f8c3490b19530edde7e799cd62e1f19;hb=538dde4e25666ad8658201f1dd3d6b6d226013cc;hp=e990d42f722319d20eb2a5b06cbb17f53e6bc2ea;hpb=05dc87a9b905f2cda598bcbf5a4981ea1e6c4d9a;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 e990d42..2a06637 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -90,7 +90,8 @@ void Controller::SetText( const std::string& text ) // If popup shown then hide it by switching to Editing state if( ( EventData::SELECTING == mImpl->mEventData->mState ) || ( EventData::EDITING_WITH_POPUP == mImpl->mEventData->mState ) || - ( EventData::EDITING_WITH_GRAB_HANDLE == mImpl->mEventData->mState ) ) + ( EventData::EDITING_WITH_GRAB_HANDLE == mImpl->mEventData->mState ) || + ( EventData::EDITING_WITH_PASTE_POPUP == mImpl->mEventData->mState ) ) { mImpl->ChangeState( EventData::EDITING ); } @@ -453,12 +454,12 @@ bool Controller::RemoveText( int cursorOffset, int numberOfChars ) cursorIndex = oldCursorIndex + cursorOffset; } - if( (cursorIndex + numberOfChars) > currentText.Count() ) + if( ( cursorIndex + numberOfChars ) > currentText.Count() ) { numberOfChars = currentText.Count() - cursorIndex; } - if( (cursorIndex + numberOfChars) <= currentText.Count() ) + if( ( cursorIndex + numberOfChars ) <= currentText.Count() ) { Vector::Iterator first = currentText.Begin() + cursorIndex; Vector::Iterator last = first + numberOfChars; @@ -667,7 +668,7 @@ float Controller::GetHeightForWidth( float width ) ProcessModifyEvents(); Size layoutSize; - if( width != mImpl->mVisualModel->mControlSize.width ) + if( fabsf( width - mImpl->mVisualModel->mControlSize.width ) > Math::MACHINE_EPSILON_1000 ) { // Operations that can be done only once until the text changes. const OperationsMask onlyOnceOperations = static_cast( CONVERT_TO_UTF32 | @@ -783,22 +784,33 @@ bool Controller::Relayout( const Size& size ) void Controller::ProcessModifyEvents() { - std::vector& events = mImpl->mModifyEvents; + Vector& events = mImpl->mModifyEvents; - for( unsigned int i=0; i::ConstIterator it = events.Begin(), + endIt = events.End(); + it != endIt; + ++it ) + { + const ModifyEvent& event = *it; + + if( ModifyEvent::TEXT_REPLACED == event.type ) { // A (single) replace event should come first, otherwise we wasted time processing NOOP events - DALI_ASSERT_DEBUG( 0 == i && "Unexpected TEXT_REPLACED event" ); + DALI_ASSERT_DEBUG( it == events.Begin() && "Unexpected TEXT_REPLACED event" ); TextReplacedEvent(); } - else if( ModifyEvent::TEXT_INSERTED == events[i].type ) + else if( ModifyEvent::TEXT_INSERTED == event.type ) { TextInsertedEvent(); } - else if( ModifyEvent::TEXT_DELETED == events[i].type ) + else if( ModifyEvent::TEXT_DELETED == event.type ) { // Placeholder-text cannot be deleted if( !mImpl->IsShowingPlaceholderText() ) @@ -808,15 +820,14 @@ void Controller::ProcessModifyEvents() } } - if( mImpl->mEventData && - 0 != events.size() ) + if( mImpl->mEventData ) { // When the text is being modified, delay cursor blinking mImpl->mEventData->mDecorator->DelayCursorBlink(); } // Discard temporary text - events.clear(); + events.Clear(); } void Controller::ResetText() @@ -843,9 +854,7 @@ void Controller::ResetCursorPosition( CharacterIndex cursorIndex ) mImpl->mEventData->mPrimaryCursorPosition = cursorIndex; // Update the cursor if it's in editing mode. - if( ( EventData::EDITING == mImpl->mEventData->mState ) || - ( EventData::EDITING_WITH_POPUP == mImpl->mEventData->mState ) || - ( EventData::EDITING_WITH_GRAB_HANDLE == mImpl->mEventData->mState ) ) + if ( EventData::IsEditingState( mImpl->mEventData->mState ) ) { mImpl->mEventData->mUpdateCursorPosition = true; } @@ -898,9 +907,7 @@ void Controller::TextInsertedEvent() REORDER ); // Queue a cursor reposition event; this must wait until after DoRelayout() - if( ( EventData::EDITING == mImpl->mEventData->mState ) || - ( EventData::EDITING_WITH_POPUP == mImpl->mEventData->mState ) || - ( EventData::EDITING_WITH_GRAB_HANDLE == mImpl->mEventData->mState ) ) + if ( EventData::IsEditingState( mImpl->mEventData->mState ) ) { mImpl->mEventData->mUpdateCursorPosition = true; mImpl->mEventData->mScrollAfterUpdatePosition = true; @@ -1435,9 +1442,10 @@ void Controller::InsertText( const std::string& text, Controller::InsertType typ Length maxSizeOfNewText = std::min ( ( mImpl->mMaximumNumberOfCharacters - numberOfCharactersInModel ), characterCount ); maxLengthReached = ( characterCount > maxSizeOfNewText ); - // Insert at current cursor position + // The cursor position. CharacterIndex& cursorIndex = mImpl->mEventData->mPrimaryCursorPosition; + // Insert at current cursor position. Vector& modifyText = mImpl->mLogicalModel->mText; if( cursorIndex < numberOfCharactersInModel ) @@ -1505,33 +1513,48 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y ) if( NULL != mImpl->mEventData ) { + DALI_LOG_INFO( gLogFilter, Debug::Concise, "TapEvent state:%d \n", mImpl->mEventData->mState ); + if( 1u == tapCount ) { // This is to avoid unnecessary relayouts when tapping an empty text-field bool relayoutNeeded( false ); - if( mImpl->IsShowingRealText() && - EventData::EDITING == mImpl->mEventData->mState ) + if ( EventData::EDITING_WITH_PASTE_POPUP == mImpl->mEventData->mState || EventData::EDITING_WITH_PASTE_POPUP == mImpl->mEventData->mState ) { - // Show grab handle on second tap - mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE ); - relayoutNeeded = true; + mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE); // If Popup shown hide it here so can be shown again if required. } - else if( EventData::EDITING != mImpl->mEventData->mState && - EventData::EDITING_WITH_GRAB_HANDLE != mImpl->mEventData->mState ) + + if( mImpl->IsShowingRealText() && ( EventData::INACTIVE != mImpl->mEventData->mState ) ) { - if( mImpl->IsShowingPlaceholderText() && ! mImpl->IsFocusedPlaceholderAvailable() ) + // Already in an active state so show a popup + if ( !mImpl->IsClipboardEmpty() ) { - // Hide placeholder text - ResetText(); + // Shows Paste popup but could show full popup with Selection options. ( EDITING_WITH_POPUP ) + mImpl->ChangeState( EventData::EDITING_WITH_PASTE_POPUP ); + } + else + { + mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE ); } - // Show cursor on first tap - mImpl->ChangeState( EventData::EDITING ); relayoutNeeded = true; } - else if( mImpl->IsShowingRealText() ) + else { - // Move the cursor + if( mImpl->IsShowingPlaceholderText() && !mImpl->IsFocusedPlaceholderAvailable() ) + { + // Hide placeholder text + ResetText(); + } + + if ( EventData::INACTIVE == mImpl->mEventData->mState ) + { + mImpl->ChangeState( EventData::EDITING ); + } + else if ( !mImpl->IsClipboardEmpty() ) + { + mImpl->ChangeState( EventData::EDITING_WITH_POPUP ); + } relayoutNeeded = true; } @@ -1562,6 +1585,7 @@ 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" ); @@ -1619,6 +1643,8 @@ void Controller::LongPressEvent( Gesture::State state, float x, float y ) void Controller::SelectEvent( float x, float y, bool selectAll ) { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::SelectEvent\n" ); + if( mImpl->mEventData ) { mImpl->ChangeState( EventData::SELECTING ); @@ -1806,7 +1832,7 @@ void Controller::TextPopupButtonTouched( Dali::Toolkit::TextSelectionPopup::Butt ImfManager::ImfCallbackData Controller::OnImfEvent( ImfManager& imfManager, const ImfManager::ImfEventData& imfEvent ) { - bool update( false ); + bool update = false; bool requestRelayout = false; std::string text; @@ -1934,17 +1960,15 @@ void Controller::NotifyImfManager() { if( mImpl->mEventData ) { - ImfManager imfManager = ImfManager::Get(); - - if( imfManager ) + if( mImpl->mEventData->mImfManager ) { // Notifying IMF of a cursor change triggers a surrounding text request so updating it now. std::string text; GetText( text ); - imfManager.SetSurroundingText( text ); + mImpl->mEventData->mImfManager.SetSurroundingText( text ); - imfManager.SetCursorPosition( GetLogicalCursorPosition() ); - imfManager.NotifyCursorPosition(); + mImpl->mEventData->mImfManager.SetCursorPosition( GetLogicalCursorPosition() ); + mImpl->mEventData->mImfManager.NotifyCursorPosition(); } } }