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=30c6e04bccbeeffa7bf5faa4aff5107dfd835593;hp=15db50b9cd08f78f8c34bcf9c4355061b87931f3;hb=2de247c304a6f70fa87f465eb1b5417efd6e5f6b;hpb=d74d70d51ed70b00e29a2b6feac5419124fffc49 diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index 15db50b..30c6e04 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -19,12 +19,15 @@ #include // EXTERNAL INCLUDES +#include +#include #include #include #include #include // INTERNAL INCLUDES +#include #include #include #include @@ -124,6 +127,8 @@ void Controller::SetMarkupProcessorEnabled(bool enable) GetText(text); SetText(text); } + + mImpl->mModel->mVisualModel->SetMarkupProcessorEnabled(enable); } bool Controller::IsMarkupProcessorEnabled() const @@ -131,6 +136,11 @@ bool Controller::IsMarkupProcessorEnabled() const return mImpl->mMarkupProcessorEnabled; } +bool Controller::HasAnchors() const +{ + return (mImpl->mMarkupProcessorEnabled && mImpl->mModel->mLogicalModel->mAnchors.Count() && mImpl->IsShowingRealText()); +} + void Controller::SetAutoScrollEnabled(bool enable) { DALI_LOG_INFO(gLogFilter, Debug::General, "Controller::SetAutoScrollEnabled[%s] SingleBox[%s]-> [%p]\n", (enable) ? "true" : "false", (mImpl->mLayoutEngine.GetLayout() == Layout::Engine::SINGLE_LINE_BOX) ? "true" : "false", this); @@ -379,14 +389,19 @@ void Controller::SetIgnoreSpacesAfterText(bool ignore) mImpl->mModel->mIgnoreSpacesAfterText = ignore; } -bool Controller::IsMatchSystemLanguageDirection() const +void Controller::ChangedLayoutDirection() +{ + mImpl->mIsLayoutDirectionChanged = true; +} + +void Controller::SetMatchLayoutDirection(DevelText::MatchLayoutDirection type) { - return mImpl->mModel->mMatchSystemLanguageDirection; + mImpl->mModel->mMatchLayoutDirection = type; } -void Controller::SetMatchSystemLanguageDirection(bool match) +DevelText::MatchLayoutDirection Controller::GetMatchLayoutDirection() const { - mImpl->mModel->mMatchSystemLanguageDirection = match; + return mImpl->mModel->mMatchLayoutDirection; } void Controller::SetLayoutDirection(Dali::LayoutDirection::Type layoutDirection) @@ -394,6 +409,19 @@ void Controller::SetLayoutDirection(Dali::LayoutDirection::Type layoutDirection) mImpl->mLayoutDirection = layoutDirection; } +Dali::LayoutDirection::Type Controller::GetLayoutDirection(Dali::Actor& actor) const +{ + if(mImpl->mModel->mMatchLayoutDirection == DevelText::MatchLayoutDirection::LOCALE || + (mImpl->mModel->mMatchLayoutDirection == DevelText::MatchLayoutDirection::INHERIT && !mImpl->mIsLayoutDirectionChanged)) + { + return static_cast(DevelWindow::Get(actor).GetRootLayer().GetProperty(Dali::Actor::Property::LAYOUT_DIRECTION).Get()); + } + else + { + return static_cast(actor.GetProperty(Dali::Actor::Property::LAYOUT_DIRECTION).Get()); + } +} + bool Controller::IsShowingRealText() const { return mImpl->IsShowingRealText(); @@ -403,15 +431,22 @@ void Controller::SetLineWrapMode(Text::LineWrap::Mode lineWrapMode) { if(lineWrapMode != mImpl->mModel->mLineWrapMode) { - // Set the text wrap mode. - mImpl->mModel->mLineWrapMode = lineWrapMode; - // Update Text layout for applying wrap mode - mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | ALIGN | LAYOUT | UPDATE_LAYOUT_SIZE | REORDER); + + if((mImpl->mModel->mLineWrapMode == (Text::LineWrap::Mode)DevelText::LineWrap::HYPHENATION) || (lineWrapMode == (Text::LineWrap::Mode)DevelText::LineWrap::HYPHENATION) || + (mImpl->mModel->mLineWrapMode == (Text::LineWrap::Mode)DevelText::LineWrap::MIXED) || (lineWrapMode == (Text::LineWrap::Mode)DevelText::LineWrap::MIXED)) // hyphen is treated as line break + { + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | GET_LINE_BREAKS); + } + + // Set the text wrap mode. + mImpl->mModel->mLineWrapMode = lineWrapMode; + mImpl->mTextUpdateInfo.mCharacterIndex = 0u; mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters; mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mModel->mLogicalModel->mText.Count(); @@ -429,6 +464,7 @@ Text::LineWrap::Mode Controller::GetLineWrapMode() const void Controller::SetTextElideEnabled(bool enabled) { mImpl->mModel->mElideEnabled = enabled; + mImpl->mModel->mVisualModel->SetTextElideEnabled(enabled); } bool Controller::IsTextElideEnabled() const @@ -1183,12 +1219,31 @@ const std::string& Controller::GetDefaultOutlineProperties() const return EMPTY_STRING; } +void Controller::RelayoutForNewLineSize() +{ + // relayout all characters + mImpl->mTextUpdateInfo.mCharacterIndex = 0; + mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters; + mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mModel->mLogicalModel->mText.Count(); + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | LAYOUT); + + //remove selection + if((mImpl->mEventData != nullptr) && (mImpl->mEventData->mState == EventData::SELECTING)) + { + mImpl->ChangeState(EventData::EDITING); + } + + mImpl->RequestRelayout(); +} + bool Controller::SetDefaultLineSpacing(float lineSpacing) { if(std::fabs(lineSpacing - mImpl->mLayoutEngine.GetDefaultLineSpacing()) > Math::MACHINE_EPSILON_1000) { mImpl->mLayoutEngine.SetDefaultLineSpacing(lineSpacing); mImpl->mRecalculateNaturalSize = true; + + RelayoutForNewLineSize(); return true; } return false; @@ -1205,6 +1260,8 @@ bool Controller::SetDefaultLineSize(float lineSize) { mImpl->mLayoutEngine.SetDefaultLineSize(lineSize); mImpl->mRecalculateNaturalSize = true; + + RelayoutForNewLineSize(); return true; } return false; @@ -1224,28 +1281,37 @@ void Controller::SetInputColor(const Vector4& color) if(EventData::SELECTING == mImpl->mEventData->mState || EventData::EDITING == mImpl->mEventData->mState || EventData::INACTIVE == mImpl->mEventData->mState) { - const bool handlesCrossed = mImpl->mEventData->mLeftSelectionPosition > mImpl->mEventData->mRightSelectionPosition; + if(EventData::SELECTING == mImpl->mEventData->mState) + { + const bool handlesCrossed = mImpl->mEventData->mLeftSelectionPosition > mImpl->mEventData->mRightSelectionPosition; - // Get start and end position of selection - const CharacterIndex startOfSelectedText = handlesCrossed ? mImpl->mEventData->mRightSelectionPosition : mImpl->mEventData->mLeftSelectionPosition; - const Length lengthOfSelectedText = (handlesCrossed ? mImpl->mEventData->mLeftSelectionPosition : mImpl->mEventData->mRightSelectionPosition) - startOfSelectedText; + // Get start and end position of selection + const CharacterIndex startOfSelectedText = handlesCrossed ? mImpl->mEventData->mRightSelectionPosition : mImpl->mEventData->mLeftSelectionPosition; + const Length lengthOfSelectedText = (handlesCrossed ? mImpl->mEventData->mLeftSelectionPosition : mImpl->mEventData->mRightSelectionPosition) - startOfSelectedText; - // Add the color run. - const VectorBase::SizeType numberOfRuns = mImpl->mModel->mLogicalModel->mColorRuns.Count(); - mImpl->mModel->mLogicalModel->mColorRuns.Resize(numberOfRuns + 1u); + // Add the color run. + const VectorBase::SizeType numberOfRuns = mImpl->mModel->mLogicalModel->mColorRuns.Count(); + mImpl->mModel->mLogicalModel->mColorRuns.Resize(numberOfRuns + 1u); - ColorRun& colorRun = *(mImpl->mModel->mLogicalModel->mColorRuns.Begin() + numberOfRuns); - colorRun.color = color; - colorRun.characterRun.characterIndex = startOfSelectedText; - colorRun.characterRun.numberOfCharacters = lengthOfSelectedText; + ColorRun& colorRun = *(mImpl->mModel->mLogicalModel->mColorRuns.Begin() + numberOfRuns); + colorRun.color = color; + colorRun.characterRun.characterIndex = startOfSelectedText; + colorRun.characterRun.numberOfCharacters = lengthOfSelectedText; + + mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText; + mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText; + mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText; + } + else + { + mImpl->mTextUpdateInfo.mCharacterIndex = 0; + mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters; + mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mModel->mLogicalModel->mText.Count(); + } // Request to relayout. mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | COLOR); mImpl->RequestRelayout(); - - mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText; - mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText; - mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText; } } } @@ -1599,6 +1665,23 @@ void Controller::GetHiddenInputOption(Property::Map& options) } } +void Controller::SetInputFilterOption(const Property::Map& options) +{ + if(!mImpl->mInputFilter) + { + mImpl->mInputFilter = std::unique_ptr(new InputFilter()); + } + mImpl->mInputFilter->SetProperties(options); +} + +void Controller::GetInputFilterOption(Property::Map& options) +{ + if(NULL != mImpl->mInputFilter) + { + mImpl->mInputFilter->GetProperties(options); + } +} + void Controller::SetPlaceholderProperty(const Property::Map& map) { PlaceholderHandler::SetPlaceholderProperty(*this, map); @@ -1663,6 +1746,17 @@ void Controller::SetVerticalLineAlignment(Toolkit::DevelText::VerticalLineAlignm mImpl->mModel->mVerticalLineAlignment = alignment; } +Toolkit::DevelText::EllipsisPosition::Type Controller::GetEllipsisPosition() const +{ + return mImpl->mModel->GetEllipsisPosition(); +} + +void Controller::SetEllipsisPosition(Toolkit::DevelText::EllipsisPosition::Type ellipsisPosition) +{ + mImpl->mModel->mEllipsisPosition = ellipsisPosition; + mImpl->mModel->mVisualModel->SetEllipsisPosition(ellipsisPosition); +} + // public : Relayout. Controller::UpdateTextType Controller::Relayout(const Size& size, Dali::LayoutDirection::Type layoutDirection) @@ -1749,6 +1843,11 @@ void Controller::SelectEvent(float x, float y, SelectionType selectType) EventHandler::SelectEvent(*this, x, y, selectType); } +void Controller::SelectEvent(const uint32_t start, const uint32_t end, SelectionType selectType) +{ + EventHandler::SelectEvent(*this, start, end, selectType); +} + void Controller::SetTextSelectionRange(const uint32_t* start, const uint32_t* end) { if(mImpl->mEventData) @@ -1772,7 +1871,7 @@ CharacterIndex Controller::GetPrimaryCursorPosition() const return mImpl->GetPrimaryCursorPosition(); } -bool Controller::SetPrimaryCursorPosition(CharacterIndex index) +bool Controller::SetPrimaryCursorPosition(CharacterIndex index, bool focused) { if(mImpl->mEventData) { @@ -1780,7 +1879,7 @@ bool Controller::SetPrimaryCursorPosition(CharacterIndex index) mImpl->mEventData->mIsLeftHandleSelected = true; mImpl->mEventData->mIsRightHandleSelected = true; mImpl->mEventData->mCheckScrollAmount = true; - if(mImpl->SetPrimaryCursorPosition(index)) + if(mImpl->SetPrimaryCursorPosition(index, focused) && focused) { KeyboardFocusGainEvent(); return true; @@ -1799,6 +1898,11 @@ void Controller::SelectNone() SelectEvent(0.f, 0.f, SelectionType::NONE); } +void Controller::SelectText(const uint32_t start, const uint32_t end) +{ + SelectEvent(start, end, SelectionType::RANGE); +} + string Controller::GetSelectedText() const { string text; @@ -1809,6 +1913,59 @@ string Controller::GetSelectedText() const return text; } +string Controller::CopyText() +{ + string text; + mImpl->RetrieveSelection(text, false); + mImpl->SendSelectionToClipboard(false); // Text not modified + + mImpl->mEventData->mUpdateCursorPosition = true; + + mImpl->RequestRelayout(); // Cursor, Handles, Selection Highlight, Popup + + return text; +} + +string Controller::CutText() +{ + string text; + mImpl->RetrieveSelection(text, false); + + if(!IsEditable()) + { + return ""; + } + + mImpl->SendSelectionToClipboard(true); // Synchronous call to modify text + mImpl->mOperationsPending = ALL_OPERATIONS; + + if((0u != mImpl->mModel->mLogicalModel->mText.Count()) || + !mImpl->IsPlaceholderAvailable()) + { + mImpl->QueueModifyEvent(ModifyEvent::TEXT_DELETED); + } + else + { + ShowPlaceholderText(); + } + + mImpl->mEventData->mUpdateCursorPosition = true; + mImpl->mEventData->mScrollAfterDelete = true; + + mImpl->RequestRelayout(); + + if(nullptr != mImpl->mEditableControlInterface) + { + mImpl->mEditableControlInterface->TextChanged(true); + } + return text; +} + +void Controller::PasteText() +{ + mImpl->RequestGetTextFromClipboard(); // Request clipboard service to retrieve an item +} + InputMethodContext::CallbackData Controller::OnInputMethodContextEvent(InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent) { return EventHandler::OnInputMethodContextEvent(*this, inputMethodContext, inputMethodContextEvent);