*
*/
-#include <dali/dali.h>
-
+// CLASS HEADER
#include <dali-toolkit/internal/controls/text-input/text-input-impl.h>
-#include <dali-toolkit/internal/controls/text-view/text-processor.h>
-#include <dali-toolkit/public-api/controls/buttons/push-button.h>
-#include <dali-toolkit/public-api/controls/alignment/alignment.h>
-#include <dali-toolkit/public-api/controls/default-controls/solid-color-actor.h>
-
-#include <dali/integration-api/debug.h>
+// EXTERNAL INCLUDES
#include <math.h>
#include <sstream>
#include <algorithm>
+#include <dali/public-api/adaptor-framework/virtual-keyboard.h>
+#include <dali/public-api/animation/constraints.h>
+#include <dali/public-api/common/stage.h>
+#include <dali/public-api/events/key-event.h>
+#include <dali/public-api/events/touch-event.h>
+#include <dali/public-api/object/type-registry.h>
+#include <dali/public-api/object/property-notification.h>
+#include <dali/integration-api/debug.h>
+
+// INTERNAL INCLUDES
+#include <dali-toolkit/internal/controls/text-view/text-processor.h>
+#include <dali-toolkit/public-api/controls/buttons/push-button.h>
+#include <dali-toolkit/public-api/controls/alignment/alignment.h>
+#include <dali-toolkit/public-api/controls/default-controls/solid-color-actor.h>
-using namespace std;
using namespace Dali;
// Local Data
// Signals
-Toolkit::TextInput::InputSignalV2& TextInput::InputStartedSignal()
+Toolkit::TextInput::InputSignalType& TextInput::InputStartedSignal()
{
- return mInputStartedSignalV2;
+ return mInputStartedSignal;
}
-Toolkit::TextInput::InputSignalV2& TextInput::InputFinishedSignal()
+Toolkit::TextInput::InputSignalType& TextInput::InputFinishedSignal()
{
- return mInputFinishedSignalV2;
+ return mInputFinishedSignal;
}
-Toolkit::TextInput::InputSignalV2& TextInput::CutAndPasteToolBarDisplayedSignal()
+Toolkit::TextInput::InputSignalType& TextInput::CutAndPasteToolBarDisplayedSignal()
{
- return mCutAndPasteToolBarDisplayedV2;
+ return mCutAndPasteToolBarDisplayed;
}
-Toolkit::TextInput::StyleChangedSignalV2& TextInput::StyleChangedSignal()
+Toolkit::TextInput::StyleChangedSignalType& TextInput::StyleChangedSignal()
{
- return mStyleChangedSignalV2;
+ return mStyleChangedSignal;
}
Toolkit::TextInput::TextModifiedSignalType& TextInput::TextModifiedSignal()
return mTextModifiedSignal;
}
-Toolkit::TextInput::MaxInputCharactersReachedSignalV2& TextInput::MaxInputCharactersReachedSignal()
+Toolkit::TextInput::MaxInputCharactersReachedSignalType& TextInput::MaxInputCharactersReachedSignal()
{
- return mMaxInputCharactersReachedSignalV2;
+ return mMaxInputCharactersReachedSignal;
}
-Toolkit::TextInput::InputTextExceedBoundariesSignalV2& TextInput::InputTextExceedBoundariesSignal()
+Toolkit::TextInput::InputTextExceedBoundariesSignalType& TextInput::InputTextExceedBoundariesSignal()
{
- return mInputTextExceedBoundariesSignalV2;
+ return mInputTextExceedBoundariesSignal;
}
bool TextInput::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
StartCursorBlinkTimer();
Toolkit::TextInput handle( GetOwner() );
- mInputStartedSignalV2.Emit( handle );
+ mInputStartedSignal.Emit( handle );
ImfManager imfManager = ImfManager::Get();
imfManager.Activate();
// When window gain lost focus, the imf manager is deactivated. Thus when window gain focus again, the imf manager must be activated.
- imfManager.SetRestoreAferFocusLost( true );
+ imfManager.SetRestoreAfterFocusLost( true );
imfManager.SetCursorPosition( mCursorPosition );
imfManager.NotifyCursorPosition();
if ( imfManager )
{
// The text editing is finished. Therefore the imf manager don't have restore activation.
- imfManager.SetRestoreAferFocusLost( false );
+ imfManager.SetRestoreAfterFocusLost( false );
// Notify that the text editing finish.
imfManager.Deactivate();
VirtualKeyboard::LanguageChangedSignal().Disconnect( this, &TextInput::SetTextDirection );
Toolkit::TextInput handle( GetOwner() );
- mInputFinishedSignalV2.Emit( handle );
+ mInputFinishedSignal.Emit( handle );
mEditModeActive = false;
mPreEditFlag = false;
RemoveHighlight();
mActiveLayer.SetSize(targetSize);
}
-void TextInput::OnRelaidOut( Vector2 size, ActorSizeContainer& container )
+void TextInput::OnRelayout( const Vector2& size, ActorSizeContainer& container )
{
Relayout( mDisplayedTextView, size, container );
Relayout( mPopupPanel.GetRootActor(), size, container );
// Private Internal methods
-void TextInput::OnHandlePan(Actor actor, PanGesture gesture)
+void TextInput::OnHandlePan(Actor actor, const PanGesture& gesture)
{
switch (gesture.state)
{
return false;
}
-void TextInput::OnDoubleTap(Dali::Actor actor, Dali::TapGesture tap)
+void TextInput::OnDoubleTap(Dali::Actor actor, const Dali::TapGesture& tap)
{
// If text exists then select nearest word.
if ( !mStyledText.empty())
}
// TODO: Change the function name to be more general.
-void TextInput::OnTextTap(Dali::Actor actor, Dali::TapGesture tap)
+void TextInput::OnTextTap(Dali::Actor actor, const Dali::TapGesture& tap)
{
DALI_LOG_INFO( gLogFilter, Debug::General, "OnTap mPreEditFlag[%s] mEditOnTouch[%s] mEditModeActive[%s] ", (mPreEditFlag)?"true":"false"
, (mEditOnTouch)?"true":"false"
// otherwise the Grab handle will be shown when selecting.
if ( createGrabHandle && IsGrabHandleEnabled() )
{
- const Vector3 cursorPosition = GetActualPositionFromCharacterPosition(mCursorPosition);
+ Vector3 altPosition; // Alternate (i.e. opposite direction) cursor position.
+ bool altPositionValid; // Alternate cursor validity flag.
+ bool directionRTL; // Need to know direction of primary cursor (in case we have 2 cursors and need to show them differently)
+ Vector3 cursorPosition = GetActualPositionFromCharacterPosition( mCursorPosition, directionRTL, altPosition, altPositionValid );
+
+ if( altPositionValid )
+ {
+ // Check which of the positions is the closest.
+ if( fabsf( altPosition.x - tap.localPoint.x ) < fabsf( cursorPosition.x - tap.localPoint.x ) )
+ {
+ cursorPosition = altPosition;
+ }
+ }
CreateGrabHandle();
}
}
-void TextInput::OnLongPress(Dali::Actor actor, Dali::LongPressGesture longPress)
+void TextInput::OnLongPress(Dali::Actor actor, const Dali::LongPressGesture& longPress)
{
DALI_LOG_INFO( gLogFilter, Debug::General, "OnLongPress\n" );
{
// Some text is selected so erase it before adding space.
DeleteHighlightedText( true );
- update = true;
}
mCursorPosition = mCursorPosition + InsertAt(Text(keyString), mCursorPosition, 0);
return false;
}
+void TextInput::ChooseRtlSelectionHandlePosition( const Vector3& cursorPositionOne,
+ const Vector3& cursorPositionTwo,
+ bool altPositionValidOne,
+ bool altPositionValidTwo,
+ const Vector3& altPositionOne,
+ const Vector3& altPositionTwo )
+{
+ // TODO VCC Valid for one line.
+ // Try to place the selection handles. TODO think in something better. Probably need to know the direction of the paragraph.
+ if( cursorPositionOne != cursorPositionTwo )
+ {
+ if( cursorPositionOne.x < cursorPositionTwo.x )
+ {
+ mSelectionHandleOneActualPosition = cursorPositionOne;
+ mSelectionHandleTwoActualPosition = cursorPositionTwo;
+ }
+ else
+ {
+ mSelectionHandleOneActualPosition = cursorPositionTwo;
+ mSelectionHandleTwoActualPosition = cursorPositionOne;
+ }
+ }
+ else
+ {
+ mSelectionHandleOneActualPosition = cursorPositionOne;
+ if( altPositionValidOne )
+ {
+ if( altPositionOne.x < mSelectionHandleOneActualPosition.x )
+ {
+ mSelectionHandleOneActualPosition = altPositionOne;
+ }
+ }
+ if( altPositionValidTwo )
+ {
+ if( altPositionTwo.x < mSelectionHandleOneActualPosition.x )
+ {
+ mSelectionHandleOneActualPosition = altPositionTwo;
+ }
+ }
+
+ mSelectionHandleTwoActualPosition = cursorPositionTwo;
+ if( altPositionValidTwo )
+ {
+ if( altPositionTwo.x > mSelectionHandleTwoActualPosition.x )
+ {
+ mSelectionHandleTwoActualPosition = altPositionTwo;
+ }
+ }
+ if( altPositionValidOne )
+ {
+ if( altPositionOne.x > mSelectionHandleTwoActualPosition.x )
+ {
+ mSelectionHandleTwoActualPosition = altPositionOne;
+ }
+ }
+ }
+}
+
void TextInput::OnTextViewScrolled( Toolkit::TextView textView, Vector2 scrollPosition )
{
// Updates the stored scroll position.
if( mGrabHandle || mCursor )
{
cursorSize.height = GetRowRectFromCharacterPosition( mCursorPosition ).height;
- const Vector3 cursorPosition = GetActualPositionFromCharacterPosition(mCursorPosition);
+
+ Vector3 altPosition; // Alternate (i.e. opposite direction) cursor position.
+ bool altPositionValid; // Alternate cursor validity flag.
+ bool directionRTL; // Need to know direction of primary cursor (in case we have 2 cursors and need to show them differently)
+ Vector3 cursorPosition = GetActualPositionFromCharacterPosition( mCursorPosition, directionRTL, altPosition, altPositionValid );
+
+ if( altPositionValid )
+ {
+ // Check which of the positions is the closest.
+ if( fabsf( altPosition.x - mActualGrabHandlePosition.x ) < fabsf( cursorPosition.x - mActualGrabHandlePosition.x ) )
+ {
+ cursorPosition = altPosition;
+ }
+ }
mIsCursorInScrollArea = mIsGrabHandleInScrollArea = IsPositionInsideBoundaries( cursorPosition, cursorSize, controlSize );
// Updates the selection handles and highlighted text position and visibility.
if( mSelectionHandleOne && mSelectionHandleTwo )
{
- const Vector3 cursorPositionOne = GetActualPositionFromCharacterPosition(mSelectionHandleOnePosition);
- const Vector3 cursorPositionTwo = GetActualPositionFromCharacterPosition(mSelectionHandleTwoPosition);
+ Vector3 altPositionOne; // Alternate (i.e. opposite direction) cursor position.
+ bool altPositionValidOne; // Alternate cursor validity flag.
+ bool directionRTLOne; // Need to know direction of primary cursor (in case we have 2 cursors and need to show them differently)
+ Vector3 cursorPositionOne = GetActualPositionFromCharacterPosition( mSelectionHandleOnePosition, directionRTLOne, altPositionOne, altPositionValidOne );
+
+ Vector3 altPositionTwo; // Alternate (i.e. opposite direction) cursor position.
+ bool altPositionValidTwo; // Alternate cursor validity flag.
+ bool directionRTLTwo; // Need to know direction of primary cursor (in case we have 2 cursors and need to show them differently)
+ Vector3 cursorPositionTwo = GetActualPositionFromCharacterPosition( mSelectionHandleTwoPosition, directionRTLTwo, altPositionTwo, altPositionValidTwo );
+
+ // VCC TODO: This method is a hack for one line.
+ ChooseRtlSelectionHandlePosition( cursorPositionOne,
+ cursorPositionTwo,
+ altPositionValidOne,
+ altPositionValidTwo,
+ altPositionOne,
+ altPositionTwo );
+
cursorSize.height = ( *( mTextLayoutInfo.mCharacterLayoutInfoTable.begin() + mSelectionHandleOnePosition ) ).mSize.height;
const bool isSelectionHandleOneVisible = IsPositionInsideBoundaries( cursorPositionOne, cursorSize, controlSize );
cursorSize.height = ( *( mTextLayoutInfo.mCharacterLayoutInfoTable.begin() + mSelectionHandleTwoPosition ) ).mSize.height;
const bool isSelectionHandleTwoVisible = IsPositionInsideBoundaries( cursorPositionTwo, cursorSize, controlSize );
- mSelectionHandleOneActualPosition = cursorPositionOne.GetVectorXY();
- mSelectionHandleTwoActualPosition = cursorPositionTwo.GetVectorXY();
-
mSelectionHandleOne.SetVisible( isSelectionHandleOneVisible );
mSelectionHandleTwo.SetVisible( isSelectionHandleTwoVisible );
mSelectionHandleOne.SetPosition( mSelectionHandleOneActualPosition + UI_OFFSET + mSelectionHandleOneOffset );
// update table as text may have changed.
GetTextLayoutInfo();
- mSelectionHandleOneActualPosition = GetActualPositionFromCharacterPosition( mSelectionHandleOnePosition );
- mSelectionHandleTwoActualPosition = GetActualPositionFromCharacterPosition( mSelectionHandleTwoPosition );
+ Vector3 altPositionOne; // Alternate (i.e. opposite direction) cursor position.
+ bool altPositionValidOne; // Alternate cursor validity flag.
+ bool directionRTLOne; // Need to know direction of primary cursor (in case we have 2 cursors and need to show them differently)
+ Vector3 cursorPositionOne = GetActualPositionFromCharacterPosition( mSelectionHandleOnePosition, directionRTLOne, altPositionOne, altPositionValidOne );
+
+ Vector3 altPositionTwo; // Alternate (i.e. opposite direction) cursor position.
+ bool altPositionValidTwo; // Alternate cursor validity flag.
+ bool directionRTLTwo; // Need to know direction of primary cursor (in case we have 2 cursors and need to show them differently)
+ Vector3 cursorPositionTwo = GetActualPositionFromCharacterPosition( mSelectionHandleTwoPosition, directionRTLTwo, altPositionTwo, altPositionValidTwo );
+
+ // VCC TODO: This method is a hack for one line.
+ ChooseRtlSelectionHandlePosition( cursorPositionOne,
+ cursorPositionTwo,
+ altPositionValidOne,
+ altPositionValidTwo,
+ altPositionOne,
+ altPositionTwo );
mSelectionHandleOne.SetPosition( mSelectionHandleOneActualPosition + UI_OFFSET + mSelectionHandleOneOffset );
mSelectionHandleTwo.SetPosition( mSelectionHandleTwoActualPosition + UI_OFFSET + mSelectionHandleTwoOffset );
std::size_t newHandlePosition = 0;
ReturnClosestIndex( actualSelectionHandlePosition.GetVectorXY(), newHandlePosition );
- actualHandlePosition = GetActualPositionFromCharacterPosition( newHandlePosition );
+ Vector3 altPosition; // Alternate (i.e. opposite direction) cursor position.
+ bool altPositionValid; // Alternate cursor validity flag.
+ bool directionRTL; // Need to know direction of primary cursor (in case we have 2 cursors and need to show them differently)
+ actualHandlePosition = GetActualPositionFromCharacterPosition( newHandlePosition, directionRTL, altPosition, altPositionValid );
+ if( altPositionValid )
+ {
+ // Check which of the positions is the closest.
+ if( fabsf( altPosition.x - actualSelectionHandlePosition.x ) < fabsf( actualHandlePosition.x - actualSelectionHandlePosition.x ) )
+ {
+ actualHandlePosition = altPosition;
+ }
+ }
bool handleVisible = true;
}
}
-void TextInput::GetVisualTextSelection(std::vector<bool>& selectedVisualText, std::size_t startSelection, std::size_t endSelection)
+void TextInput::GetVisualTextSelection( std::vector<bool>& selectedVisualText, std::size_t startSelection, std::size_t endSelection )
{
- std::vector<int>::iterator it = mTextLayoutInfo.mCharacterLogicalToVisualMap.begin();
- std::vector<int>::iterator startSelectionIt = mTextLayoutInfo.mCharacterLogicalToVisualMap.begin() + std::min(startSelection, endSelection);
- std::vector<int>::iterator endSelectionIt = mTextLayoutInfo.mCharacterLogicalToVisualMap.begin() + std::max(startSelection, endSelection);
- std::vector<int>::iterator end = mTextLayoutInfo.mCharacterLogicalToVisualMap.end();
+ selectedVisualText.resize( mTextLayoutInfo.mCharacterLogicalToVisualMap.size(), false );
- selectedVisualText.resize( mTextLayoutInfo.mCharacterLogicalToVisualMap.size() );
+ // VCC Set true/false in logical order. TODO : It needs to be checked.
- // Deselect text prior to startSelectionIt
- for(;it!=startSelectionIt;++it)
+ if( startSelection > endSelection )
{
- selectedVisualText[*it] = false;
+ std::swap( startSelection, endSelection );
}
-
- // Select text from startSelectionIt -> endSelectionIt
- for(;it!=endSelectionIt;++it)
+ std::size_t index = 0u;
+ for( std::vector<bool>::iterator it = selectedVisualText.begin(), endIt = selectedVisualText.end(); it != endIt; ++it, ++index )
{
- selectedVisualText[*it] = true;
- }
-
- // Deselect text after endSelection
- for(;it!=end;++it)
- {
- selectedVisualText[*it] = false;
+ if( ( index < startSelection ) || ( endSelection <= index ) )
+ {
+ *it = false;
+ }
+ else
+ {
+ *it = true;
+ }
}
-
- selectedVisualText.resize( mTextLayoutInfo.mCharacterLogicalToVisualMap.size(), false );
}
// Calculate the dimensions of the quads they will make the highlight mesh
TextInput::HighlightInfo TextInput::CalculateHighlightInfo()
{
// At the moment there is no public API to modify the block alignment option.
- const bool blockAlignEnabled = true;
mNewHighlightInfo.mQuadList.clear(); // clear last quad information.
// Get vector of flags representing characters that are selected (true) vs unselected (false).
std::vector<bool> selectedVisualText;
- GetVisualTextSelection(selectedVisualText, mSelectionHandleOnePosition, mSelectionHandleTwoPosition);
- std::vector<bool>::iterator selectedIt(selectedVisualText.begin());
- std::vector<bool>::iterator selectedEndIt(selectedVisualText.end());
+ GetVisualTextSelection( selectedVisualText, mSelectionHandleOnePosition, mSelectionHandleTwoPosition );
+ std::vector<bool>::iterator selectedIt = selectedVisualText.begin();
+ std::vector<bool>::iterator selectedEndIt = selectedVisualText.end();
SelectionState selectionState = SelectionNone; ///< Current selection status of cursor over entire text.
float rowLeft = 0.0f;
// selectionState: None when not in selection, Started when in selection, and Ended when reached end of selection.
Toolkit::TextView::CharacterLayoutInfo& charInfo(*it);
- bool charSelected( false );
+ bool charSelected = false;
if( selectedIt != selectedEndIt )
{
charSelected = *selectedIt++;
}
- if(selectionState == SelectionNone)
+ if( selectionState == SelectionNone )
{
- if(charSelected)
+ if( charSelected )
{
selectionState = SelectionStarted;
rowLeft = charInfo.mPosition.x - mTextLayoutInfo.mScrollOffset.x;
rowRight = rowLeft + charInfo.mSize.width;
}
}
- else if(selectionState == SelectionStarted)
+ else if( selectionState == SelectionStarted )
{
// break selection on:
// 1. new line causing selection break. (\n or wordwrap)
// 2. character not selected.
- if(charInfo.mPosition.y - lastIt->mPosition.y > CHARACTER_THRESHOLD ||
- !charSelected)
+ if( !charSelected ||
+ ( charInfo.mPosition.y - lastIt->mPosition.y > CHARACTER_THRESHOLD ) )
{
// finished selection.
// TODO: TextView should have a table of visual rows, and each character a reference to the row
float rowTop = rowBottom - rowSize.height;
// Still selected, and block-align mode then set rowRight to max, so it can be clamped afterwards
- if(charSelected && blockAlignEnabled)
+ if(charSelected)
{
rowRight = std::numeric_limits<float>::max();
}
if( charSelected )
{
// if block-align mode then set rowLeft to min, so it can be clamped afterwards
- rowLeft = blockAlignEnabled ? 0.0f : charInfo.mPosition.x - mTextLayoutInfo.mScrollOffset.x;
+ rowLeft = 0.0f;
rowRight = ( charInfo.mPosition.x - mTextLayoutInfo.mScrollOffset.x ) + charInfo.mSize.width;
selectionState = SelectionStarted;
}
mNewHighlightInfo.Clamp2D( topLeft, bottomRight );
// For block-align align Further Clamp quads to max left and right extents
- if(blockAlignEnabled)
- {
// BlockAlign: Will adjust highlight to block:
// i.e.
// H[ello] (top row right = max of all rows right)
// [is some]
// [text]
// (common in regular text editors/web browser selection)
-
mNewHighlightInfo.Clamp2D( Vector2(maxRowLeft, topLeft.y), Vector2(maxRowRight, bottomRight.y ) );
+
+ // Finally clamp quads again so they don't exceed the boundry of the control.
+ const Vector3& controlSize = GetControlSize();
+ mNewHighlightInfo.Clamp2D( Vector2::ZERO, Vector2(controlSize.x, controlSize.y) );
+ } // end if
+
+ return mNewHighlightInfo;
+}
+
+// VCC TODO: two methods are not needed. this one is a quick hack to fix PLMs. Should implement one which support both directions.
+// This method creates one quad per character so different selection boxes for a mix of LTR and RTL languages are created.
+TextInput::HighlightInfo TextInput::CalculateHighlightInfoRtl()
+{
+ // At the moment there is no public API to modify the block alignment option.
+
+ mNewHighlightInfo.mQuadList.clear(); // clear last quad information.
+
+ if ( !mTextLayoutInfo.mCharacterLayoutInfoTable.empty() && !mTextLayoutInfo.mCharacterLogicalToVisualMap.empty() )
+ {
+ Toolkit::TextView::CharacterLayoutInfoContainer::iterator it = mTextLayoutInfo.mCharacterLayoutInfoTable.begin();
+ Toolkit::TextView::CharacterLayoutInfoContainer::iterator end = mTextLayoutInfo.mCharacterLayoutInfoTable.end();
+
+ // Get vector of flags representing characters that are selected (true) vs unselected (false).
+ std::vector<bool> selectedVisualText;
+ GetVisualTextSelection( selectedVisualText, mSelectionHandleOnePosition, mSelectionHandleTwoPosition );
+ std::vector<bool>::iterator selectedIt = selectedVisualText.begin();
+ std::vector<bool>::iterator selectedEndIt = selectedVisualText.end();
+
+ // SelectionState selectionState = SelectionNone; ///< Current selection status of cursor over entire text.
+ float rowLeft = 0.0f;
+ float rowRight = 0.0f;
+
+ // VCC TODO this is valid for one line.
+ Vector2 min, max;
+ const Size rowSize = GetRowRectFromCharacterPosition( 0, min, max );
+
+ // Scan through entire text.
+ while(it != end)
+ {
+ // selectionState: None when not in selection, Started when in selection, and Ended when reached end of selection.
+
+ Toolkit::TextView::CharacterLayoutInfo& charInfo(*it);
+ bool charSelected = false;
+ if( selectedIt != selectedEndIt )
+ {
+ charSelected = *selectedIt++;
+ }
+
+ if( charSelected )
+ {
+ rowLeft = charInfo.mPosition.x - mTextLayoutInfo.mScrollOffset.x;
+ rowRight = rowLeft + charInfo.mSize.width;
+
+ float rowBottom = charInfo.mPosition.y - mTextLayoutInfo.mScrollOffset.y;
+ float rowTop = rowBottom - rowSize.height;
+ mNewHighlightInfo.AddQuad( rowLeft, rowTop, rowRight, rowBottom );
+ }
+
+ ++it;
}
// Finally clamp quads again so they don't exceed the boundry of the control.
if ( mHighlightMeshActor )
{
// vertex and triangle buffers should always be present if MeshActor is alive.
- HighlightInfo newHighlightInfo = CalculateHighlightInfo();
+ HighlightInfo newHighlightInfo = CalculateHighlightInfoRtl();
MeshData::VertexContainer vertices;
Dali::MeshData::FaceIndices faceIndices;
++closestIndex;
}
}
- else if( closestIndex == numeric_limits<std::size_t>::max() ) // -1 RTL (after last arabic character on line)
+ else if( closestIndex == std::numeric_limits<std::size_t>::max() ) // -1 RTL (after last arabic character on line)
{
closestIndex = mTextLayoutInfo.mCharacterVisualToLogicalMap.size();
}
cursorPosition.x -= mTextLayoutInfo.mScrollOffset.x;
cursorPosition.y -= mTextLayoutInfo.mScrollOffset.y;
+
if( alternatePositionValid )
{
alternatePosition.x -= mTextLayoutInfo.mScrollOffset.x;
*/
MarkupProcessor::StyledTextArray selectedText(mCurrentCopySelecton.begin(),mCurrentCopySelecton.end());
MarkupProcessor::GetPlainString( selectedText, stringToStore );
+
bool success = mClipboard.SetItem( stringToStore );
return success;
}
{
// emit signal if input style changes.
Toolkit::TextInput handle( GetOwner() );
- mStyleChangedSignalV2.Emit( handle, mInputStyle );
+ mStyleChangedSignal.Emit( handle, mInputStyle );
}
void TextInput::EmitTextModified()
DALI_LOG_INFO(gLogFilter, Debug::General, "EmitMaxInputCharactersReachedSignal \n");
Toolkit::TextInput handle( GetOwner() );
- mMaxInputCharactersReachedSignalV2.Emit( handle );
+ mMaxInputCharactersReachedSignal.Emit( handle );
}
void TextInput::EmitInputTextExceedsBoundariesSignal()
// Emit a signal when the input text exceeds the boundaries of the text input.
Toolkit::TextInput handle( GetOwner() );
- mInputTextExceedBoundariesSignalV2.Emit( handle );
+ mInputTextExceedBoundariesSignal.Emit( handle );
}
} // namespace Internal