/*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2018 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.
// public : Configure the text controller.
-void Controller::EnableTextInput( DecoratorPtr decorator )
+void Controller::EnableTextInput( DecoratorPtr decorator, InputMethodContext& inputMethodContext )
{
if( !decorator )
{
if( NULL == mImpl->mEventData )
{
- mImpl->mEventData = new EventData( decorator );
+ mImpl->mEventData = new EventData( decorator, inputMethodContext );
}
}
void Controller::SetMarkupProcessorEnabled( bool enable )
{
- mImpl->mMarkupProcessorEnabled = enable;
+ if( enable != mImpl->mMarkupProcessorEnabled )
+ {
+ //If Text was already set, call the SetText again for enabling or disabling markup
+ mImpl->mMarkupProcessorEnabled = enable;
+ std::string text;
+ GetText( text );
+ SetText( text );
+ }
}
bool Controller::IsMarkupProcessorEnabled() const
return mImpl->mModel->mVerticalAlignment;
}
+bool Controller::IsIgnoreSpacesAfterText() const
+{
+ return mImpl->mModel->mIgnoreSpacesAfterText;
+}
+
+void Controller::SetIgnoreSpacesAfterText( bool ignore )
+{
+ mImpl->mModel->mIgnoreSpacesAfterText = ignore;
+}
+
void Controller::SetLineWrapMode( Text::LineWrap::Mode lineWrapMode )
{
if( lineWrapMode != mImpl->mModel->mLineWrapMode )
DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::SetText\n" );
// Reset keyboard as text changed
- mImpl->ResetImfManager();
+ mImpl->ResetInputMethodContext();
// Remove the previously set text and style.
ResetText();
return mImpl->mModel->mVisualModel->GetOutlineWidth();
}
+void Controller::SetBackgroundColor( const Vector4& color )
+{
+ mImpl->mModel->mVisualModel->SetBackgroundColor( color );
+
+ mImpl->RequestRelayout();
+}
+
+const Vector4& Controller::GetBackgroundColor() const
+{
+ return mImpl->mModel->mVisualModel->GetBackgroundColor();
+}
+
+void Controller::SetBackgroundEnabled( bool enabled )
+{
+ mImpl->mModel->mVisualModel->SetBackgroundEnabled( enabled );
+
+ mImpl->RequestRelayout();
+}
+
+bool Controller::IsBackgroundEnabled() const
+{
+ return mImpl->mModel->mVisualModel->IsBackgroundEnabled();
+}
+
void Controller::SetDefaultEmbossProperties( const std::string& embossProperties )
{
if( NULL == mImpl->mEmbossDefaults )
// Clear the update info. This info will be set the next time the text is updated.
mImpl->mTextUpdateInfo.Clear();
+ mImpl->mTextUpdateInfo.mClearAll = true;
// Restore the actual control's width.
mImpl->mModel->mVisualModel->mControlSize.width = actualControlWidth;
if ( mImpl->mUpdateTextDirection )
{
// Operations that can be done only once until the text changes.
- const OperationsMask onlyOnceOperations = static_cast<OperationsMask>( GET_SCRIPTS |
+ const OperationsMask onlyOnceOperations = static_cast<OperationsMask>( CONVERT_TO_UTF32 |
+ GET_SCRIPTS |
VALIDATE_FONTS |
GET_LINE_BREAKS |
GET_WORD_BREAKS |
BIDI_INFO |
- SHAPE_TEXT );
+ SHAPE_TEXT |
+ GET_GLYPH_METRICS );
// Set the update info to relayout the whole text.
mImpl->mTextUpdateInfo.mParagraphCharacterIndex = 0u;
LAYOUT | REORDER | UPDATE_DIRECTION ),
naturalSize.GetVectorXY() );
+ // Do not do again the only once operations.
+ mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending & ~onlyOnceOperations );
+
// Clear the update info. This info will be set the next time the text is updated.
mImpl->mTextUpdateInfo.Clear();
mImpl->mEventData->mUpdateCursorPosition = true; //If editing started without tap event, cursor update must be triggered.
mImpl->mEventData->mUpdateInputStyle = true;
}
- mImpl->NotifyImfMultiLineStatus();
+ mImpl->NotifyInputMethodContextMultiLineStatus();
if( mImpl->IsShowingPlaceholderText() )
{
// Show alternative placeholder-text when editing
}
else if( Dali::DALI_KEY_SHIFT_LEFT == keyCode )
{
- // DALI_KEY_SHIFT_LEFT is the key code for the Left Shift. It's sent (by the imf?) when the predictive text is enabled
+ // DALI_KEY_SHIFT_LEFT is the key code for the Left Shift. It's sent (by the InputMethodContext?) when the predictive text is enabled
// and a character is typed after the type of a upper case latin character.
// Do nothing.
{
DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::KeyEvent %p keyString %s\n", this, keyString.c_str() );
- // IMF manager is no longer handling key-events
+ // InputMethodContext is no longer handling key-events
mImpl->ClearPreEditFlag();
InsertText( keyString, COMMIT );
( Dali::DALI_KEY_VOLUME_UP != keyCode ) &&
( Dali::DALI_KEY_VOLUME_DOWN != keyCode ) )
{
- // Should not change the state if the key is the shift send by the imf manager.
+ // Should not change the state if the key is the shift send by the InputMethodContext.
// Otherwise, when the state is SELECTING the text controller can't send the right
- // surrounding info to the imf.
+ // surrounding info to the InputMethodContext.
mImpl->ChangeState( EventData::EDITING );
// Will request for relayout.
}
// Reset keyboard as tap event has occurred.
- mImpl->ResetImfManager();
+ mImpl->ResetInputMethodContext();
}
void Controller::PanEvent( Gesture::State state, const Vector2& displacement )
}
else if( !mImpl->IsClipboardVisible() )
{
- // Reset the imf manager to commit the pre-edit before selecting the text.
- mImpl->ResetImfManager();
+ // Reset the InputMethodContext to commit the pre-edit before selecting the text.
+ mImpl->ResetInputMethodContext();
Event event( Event::LONG_PRESS_EVENT );
event.p1.mInt = state;
}
}
-ImfManager::ImfCallbackData Controller::OnImfEvent( ImfManager& imfManager, const ImfManager::ImfEventData& imfEvent )
+InputMethodContext::CallbackData Controller::OnInputMethodContextEvent( InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent )
{
// Whether the text needs to be relaid-out.
bool requestRelayout = false;
- // Whether to retrieve the text and cursor position to be sent to the IMF manager.
+ // Whether to retrieve the text and cursor position to be sent to the InputMethodContext.
bool retrieveText = false;
bool retrieveCursor = false;
- switch( imfEvent.eventName )
+ switch( inputMethodContextEvent.eventName )
{
- case ImfManager::COMMIT:
+ case InputMethodContext::COMMIT:
{
- InsertText( imfEvent.predictiveString, Text::Controller::COMMIT );
+ InsertText( inputMethodContextEvent.predictiveString, Text::Controller::COMMIT );
requestRelayout = true;
retrieveCursor = true;
break;
}
- case ImfManager::PREEDIT:
+ case InputMethodContext::PRE_EDIT:
{
- InsertText( imfEvent.predictiveString, Text::Controller::PRE_EDIT );
+ InsertText( inputMethodContextEvent.predictiveString, Text::Controller::PRE_EDIT );
requestRelayout = true;
retrieveCursor = true;
break;
}
- case ImfManager::DELETESURROUNDING:
+ case InputMethodContext::DELETE_SURROUNDING:
{
- const bool textDeleted = RemoveText( imfEvent.cursorOffset,
- imfEvent.numberOfChars,
+ const bool textDeleted = RemoveText( inputMethodContextEvent.cursorOffset,
+ inputMethodContextEvent.numberOfChars,
DONT_UPDATE_INPUT_STYLE );
if( textDeleted )
}
break;
}
- case ImfManager::GETSURROUNDING:
+ case InputMethodContext::GET_SURROUNDING:
{
retrieveText = true;
retrieveCursor = true;
break;
}
- case ImfManager::PRIVATECOMMAND:
+ case InputMethodContext::PRIVATE_COMMAND:
{
// PRIVATECOMMAND event is just for getting the private command message
retrieveText = true;
retrieveCursor = true;
break;
}
- case ImfManager::VOID:
+ case InputMethodContext::VOID:
{
// do nothing
break;
}
}
- ImfManager::ImfCallbackData callbackData( ( retrieveText || retrieveCursor ), cursorPosition, text, false );
+ InputMethodContext::CallbackData callbackData( ( retrieveText || retrieveCursor ), cursorPosition, text, false );
if( requestRelayout &&
( NULL != mImpl->mEditableControlInterface ) )
std::string stringToPaste( notifier.GetContent() );
// Commit the current pre-edit text; the contents of the clipboard should be appended
- mImpl->ResetImfManager();
+ mImpl->ResetInputMethodContext();
// Temporary disable hiding clipboard
mImpl->SetClipboardHideEnable( false );
// TODO: At the moment the underline runs are only for pre-edit.
mImpl->mModel->mVisualModel->mUnderlineRuns.Clear();
- // Remove the previous IMF pre-edit.
+ // Remove the previous InputMethodContext pre-edit.
if( mImpl->mEventData->mPreEditFlag && ( 0u != mImpl->mEventData->mPreEditLength ) )
{
removedPrevious = RemoveText( -static_cast<int>( mImpl->mEventData->mPrimaryCursorPosition - mImpl->mEventData->mPreEditStartPosition ),
mImpl->ChangeState( EventData::EDITING );
- // Handle the IMF (predicitive text) state changes
+ // Handle the InputMethodContext (predicitive text) state changes
if( COMMIT == type )
{
- // IMF manager is no longer handling key-events
+ // InputMethodContext is no longer handling key-events
mImpl->ClearPreEditFlag();
}
else // PRE_EDIT
{
DALI_LOG_INFO( gLogFilter, Debug::Verbose, "MaxLengthReached (%d)\n", mImpl->mModel->mLogicalModel->mText.Count() );
- mImpl->ResetImfManager();
+ mImpl->ResetInputMethodContext();
if( NULL != mImpl->mEditableControlInterface )
{
totalNumberOfGlyphs,
mImpl->mModel->mHorizontalAlignment,
mImpl->mModel->mLineWrapMode,
- outlineWidth );
+ outlineWidth,
+ mImpl->mModel->mIgnoreSpacesAfterText );
// Resize the vector of positions to have the same size than the vector of glyphs.
Vector<Vector2>& glyphPositions = mImpl->mModel->mVisualModel->mGlyphPositions;
return removed;
}
- // IMF manager is no longer handling key-events
+ // InputMethodContext is no longer handling key-events
mImpl->ClearPreEditFlag();
if( EventData::SELECTING == mImpl->mEventData->mState )