{
if( mFontDefaults )
{
- DALI_LOG_INFO( gLogFilter, Debug::Concise, "Controller::GetDefaultFonts font family(%s)\n", mFontDefaults->mFontDescription.family.c_str() );
+ DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::GetDefaultFonts font family(%s)\n", mFontDefaults->mFontDescription.family.c_str() );
FontRun fontRun;
fontRun.characterRun.characterIndex = 0;
fontRun.characterRun.numberOfCharacters = numberOfCharacters;
void Controller::Impl::OnLongPressEvent( const Event& event )
{
+ DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::OnLongPressEvent\n" );
+
if ( EventData::EDITING == mEventData->mState )
{
ChangeState ( EventData::EDITING_WITH_POPUP );
{
mEventData->mUpdateCursorPosition = true;
- ChangeState( EventData::EDITING_WITH_POPUP );
+ if ( !IsClipboardEmpty() )
+ {
+ ChangeState( EventData::EDITING_WITH_PASTE_POPUP ); // Moving grabhandle will show Paste Popup
+ }
if( handleStopScrolling )
{
void Controller::Impl::OnSelectAllEvent()
{
+ DALI_LOG_INFO( gLogFilter, Debug::Verbose, "OnSelectAllEvent mEventData->mSelectionEnabled%s \n", mEventData->mSelectionEnabled?"true":"false");
+
if( NULL == mEventData )
{
// Nothing to do if there is no text.
buttonsToShow = TextSelectionPopup::Buttons ( ( buttonsToShow | TextSelectionPopup::SELECT_ALL ) );
}
}
- else if ( EventData::EDITING_WITH_POPUP == mEventData->mState )
+ else if ( EventData::EDITING_WITH_POPUP == mEventData->mState )
{
if ( mLogicalModel->mText.Count() && !IsShowingPlaceholderText())
{
buttonsToShow = TextSelectionPopup::Buttons ( ( buttonsToShow | TextSelectionPopup::CLIPBOARD ) );
}
}
+ else if ( EventData::EDITING_WITH_PASTE_POPUP == mEventData->mState )
+ {
+ if ( !IsClipboardEmpty() )
+ {
+ buttonsToShow = TextSelectionPopup::Buttons ( ( buttonsToShow | TextSelectionPopup::PASTE ) );
+ buttonsToShow = TextSelectionPopup::Buttons ( ( buttonsToShow | TextSelectionPopup::CLIPBOARD ) );
+ }
+ }
mEventData->mDecorator->SetEnabledPopupButtons( buttonsToShow );
}
return;
}
+ DALI_LOG_INFO( gLogFilter, Debug::General, "ChangeState state:%d newstate:%d\n", mEventData->mState, newState );
+
if( mEventData->mState != newState )
{
mEventData->mState = newState;
}
else if( EventData::EDITING_WITH_POPUP == mEventData->mState )
{
+ DALI_LOG_INFO( gLogFilter, Debug::Verbose, "EDITING_WITH_POPUP \n", newState );
+
mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
if( mEventData->mCursorBlinkEnabled )
{
}
else if( EventData::EDITING_WITH_GRAB_HANDLE == mEventData->mState )
{
+ DALI_LOG_INFO( gLogFilter, Debug::Verbose, "EDITING_WITH_GRAB_HANDLE \n", newState );
+
mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
if( mEventData->mCursorBlinkEnabled )
{
}
else if ( EventData::GRAB_HANDLE_PANNING == mEventData->mState )
{
+ DALI_LOG_INFO( gLogFilter, Debug::Verbose, "GRAB_HANDLE_PANNING \n", newState );
+
mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
if( mEventData->mCursorBlinkEnabled )
{
}
mEventData->mDecoratorUpdated = true;
}
+ else if ( EventData::EDITING_WITH_PASTE_POPUP == mEventData->mState )
+ {
+ DALI_LOG_INFO( gLogFilter, Debug::Verbose, "EDITING_WITH_PASTE_POPUP \n", newState );
+
+ mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
+ if( mEventData->mCursorBlinkEnabled )
+ {
+ mEventData->mDecorator->StartCursorBlink();
+ }
+
+ mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, true );
+ mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false );
+ mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false );
+
+ if( mEventData->mGrabHandlePopupEnabled )
+ {
+ SetPopupButtons();
+ mEventData->mDecorator->SetPopupActive( true );
+ }
+ HideClipboard();
+ mEventData->mDecoratorUpdated = true;
+ }
}
}
startIndex = hitCharacter;
endIndex = hitCharacter;
+ bool isHitCharacterWhitespace = TextAbstraction::IsWhiteSpace( mLogicalModel->mText[hitCharacter] );
- if( !TextAbstraction::IsWhiteSpace( mLogicalModel->mText[hitCharacter] ) )
+ // Find the start and end of the text
+ for( startIndex = hitCharacter; startIndex > 0; --startIndex )
{
- // Find the start and end of the text
- for( startIndex = hitCharacter; startIndex > 0; --startIndex )
+ if( isHitCharacterWhitespace != TextAbstraction::IsWhiteSpace( mLogicalModel->mText[ startIndex-1 ] ) )
{
- Character charCode = mLogicalModel->mText[ startIndex-1 ];
- if( TextAbstraction::IsWhiteSpace( charCode ) )
- {
- break;
- }
+ break;
}
- const CharacterIndex pastTheEnd = mLogicalModel->mText.Count();
- for( endIndex = hitCharacter + 1u; endIndex < pastTheEnd; ++endIndex )
+ }
+ const CharacterIndex pastTheEnd = mLogicalModel->mText.Count();
+ for( endIndex = hitCharacter + 1u; endIndex < pastTheEnd; ++endIndex )
+ {
+ if( isHitCharacterWhitespace != TextAbstraction::IsWhiteSpace( mLogicalModel->mText[ endIndex ] ) )
{
- Character charCode = mLogicalModel->mText[ endIndex ];
- if( TextAbstraction::IsWhiteSpace( charCode ) )
- {
- break;
- }
+ break;
}
}
}
}
// Set which cursors are active according the state.
- if( ( EventData::EDITING == mEventData->mState ) ||
- ( EventData::EDITING_WITH_POPUP == mEventData->mState ) ||
- ( EventData::EDITING_WITH_GRAB_HANDLE == mEventData->mState ) ||
- ( EventData::GRAB_HANDLE_PANNING == mEventData->mState ) )
+ if( EventData::IsEditingState( mEventData->mState ) || ( EventData::GRAB_HANDLE_PANNING == mEventData->mState ) )
{
if( cursorInfo.isSecondaryCursor )
{
const Vector2 cursorPosition = cursorInfo.primaryPosition + mEventData->mScrollPosition + mAlignmentOffset;
- // Sets the grab handle position.
+ // Sets the handle's position.
mEventData->mDecorator->SetPosition( handleType,
cursorPosition.x,
cursorPosition.y,
// 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 );
}
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;
}
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;
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 )
+ {
+ mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE); // If Popup shown hide it here so can be shown again if required.
+ }
+
+ if( mImpl->IsShowingRealText() && ( EventData::INACTIVE != mImpl->mEventData->mState ) )
{
- // Show grab handle on second tap
- mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE );
+ // Already in an active state so show a popup
+ if ( !mImpl->IsClipboardEmpty() )
+ {
+ // 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 );
+ }
relayoutNeeded = true;
}
- else if( EventData::EDITING != mImpl->mEventData->mState &&
- EventData::EDITING_WITH_GRAB_HANDLE != mImpl->mEventData->mState )
+ else
{
if( mImpl->IsShowingPlaceholderText() && !mImpl->IsFocusedPlaceholderAvailable() )
{
// Hide placeholder text
ResetText();
}
- // Show cursor on first tap
- mImpl->ChangeState( EventData::EDITING );
- relayoutNeeded = true;
- }
- else if( mImpl->IsShowingRealText() )
- {
- // Move the cursor
+
+ if ( EventData::INACTIVE == mImpl->mEventData->mState )
+ {
+ mImpl->ChangeState( EventData::EDITING );
+ }
+ else if ( !mImpl->IsClipboardEmpty() )
+ {
+ mImpl->ChangeState( EventData::EDITING_WITH_POPUP );
+ }
relayoutNeeded = true;
}
}
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" );
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 );