X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftext-controls%2Ftext-field-impl.cpp;h=32beca1aa6df1cab0dd061257222c280e9f36a20;hp=d2bfc5c072be289b2b8e5dee936a59bf17e9480e;hb=4946918df0bb894b946175b13529c656893c440a;hpb=a88db82a75443d573185aea2938f1f0be141ca64 diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index d2bfc5c..32beca1 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -140,11 +140,14 @@ DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "grabHandleColor" DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "inputFilter", MAP, INPUT_FILTER ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "ellipsisPosition", INTEGER, ELLIPSIS_POSITION ) -DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "textChanged", SIGNAL_TEXT_CHANGED ) -DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "maxLengthReached", SIGNAL_MAX_LENGTH_REACHED ) -DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "inputStyleChanged", SIGNAL_INPUT_STYLE_CHANGED) -DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "anchorClicked", SIGNAL_ANCHOR_CLICKED ) -DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "inputFiltered", SIGNAL_INPUT_FILTERED ) +DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "textChanged", SIGNAL_TEXT_CHANGED ) +DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "maxLengthReached", SIGNAL_MAX_LENGTH_REACHED ) +DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "inputStyleChanged", SIGNAL_INPUT_STYLE_CHANGED ) +DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "anchorClicked", SIGNAL_ANCHOR_CLICKED ) +DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "inputFiltered", SIGNAL_INPUT_FILTERED ) +DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "cursorPositionChanged", SIGNAL_CURSOR_POSITION_CHANGED) +DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "selectionChanged", SIGNAL_SELECTION_CHANGED ) +DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "selectionCleared", SIGNAL_SELECTION_CLEARED ) DALI_TYPE_REGISTRATION_END() // clang-format on @@ -1214,6 +1217,35 @@ Uint32Pair TextField::GetTextSelectionRange() const return range; } +string TextField::CopyText() +{ + string copiedText = ""; + if(mController && mController->IsShowingRealText()) + { + copiedText = mController->CopyText(); + } + return copiedText; +} + +string TextField::CutText() +{ + string cutText = ""; + if(mController && mController->IsShowingRealText()) + { + cutText = mController->CutText(); + } + return cutText; +} + +void TextField::PasteText() +{ + if(mController) + { + SetKeyInputFocus(); //Giving focus to the field that was passed to the PasteText in case the passed field (current field) doesn't have focus. + mController->PasteText(); + } +} + InputMethodContext TextField::GetInputMethodContext() { return mInputMethodContext; @@ -1246,6 +1278,14 @@ bool TextField::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* fieldImpl.AnchorClickedSignal().Connect(tracker, functor); } } + else if(0 == strcmp(signalName.c_str(), SIGNAL_CURSOR_POSITION_CHANGED)) + { + if(field) + { + Internal::TextField& fieldImpl(GetImpl(field)); + fieldImpl.CursorPositionChangedSignal().Connect(tracker, functor); + } + } else if(0 == strcmp(signalName.c_str(), SIGNAL_INPUT_FILTERED)) { if(field) @@ -1254,6 +1294,22 @@ bool TextField::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* fieldImpl.InputFilteredSignal().Connect(tracker, functor); } } + else if(0 == strcmp(signalName.c_str(), SIGNAL_SELECTION_CHANGED)) + { + if(field) + { + Internal::TextField& fieldImpl(GetImpl(field)); + fieldImpl.SelectionChangedSignal().Connect(tracker, functor); + } + } + else if(0 == strcmp(signalName.c_str(), SIGNAL_SELECTION_CLEARED)) + { + if(field) + { + Internal::TextField& fieldImpl(GetImpl(field)); + fieldImpl.SelectionClearedSignal().Connect(tracker, functor); + } + } else { // signalName does not match any signal @@ -1283,11 +1339,26 @@ DevelTextField::AnchorClickedSignalType& TextField::AnchorClickedSignal() return mAnchorClickedSignal; } +DevelTextField::CursorPositionChangedSignalType& TextField::CursorPositionChangedSignal() +{ + return mCursorPositionChangedSignal; +} + DevelTextField::InputFilteredSignalType& TextField::InputFilteredSignal() { return mInputFilteredSignal; } +DevelTextField::SelectionChangedSignalType& TextField::SelectionChangedSignal() +{ + return mSelectionChangedSignal; +} + +DevelTextField::SelectionClearedSignalType& TextField::SelectionClearedSignal() +{ + return mSelectionClearedSignal; +} + void TextField::OnInitialize() { Actor self = Self(); @@ -1330,6 +1401,7 @@ void TextField::OnInitialize() // Forward input events to controller EnableGestureDetection(static_cast(GestureType::TAP | GestureType::PAN | GestureType::LONG_PRESS)); GetTapGestureDetector().SetMaximumTapsRequired(2); + GetTapGestureDetector().ReceiveAllTapEvents(true); self.TouchedSignal().Connect(this, &TextField::OnTouched); @@ -1484,6 +1556,21 @@ void TextField::OnRelayout(const Vector2& size, RelayoutContainer& container) RenderText(updateTextType); } + if(mCursorPositionChanged) + { + EmitCursorPositionChangedSignal(); + } + + if(mSelectionChanged) + { + EmitSelectionChangedSignal(); + } + + if(mSelectionCleared) + { + EmitSelectionClearedSignal(); + } + // The text-field emits signals when the input style changes. These changes of style are // detected during the relayout process (size negotiation), i.e after the cursor has been moved. Signals // can't be emitted during the size negotiation as the callbacks may update the UI. @@ -1765,11 +1852,17 @@ void TextField::TextDeleted(unsigned int position, unsigned int length, const st } } -void TextField::CursorMoved(unsigned int position) +void TextField::CursorPositionChanged(unsigned int oldPosition, unsigned int newPosition) { if(Accessibility::IsUp()) { - Control::Impl::GetAccessibilityObject(Self())->EmitTextCursorMoved(position); + Control::Impl::GetAccessibilityObject(Self())->EmitTextCursorMoved(newPosition); + } + + if((oldPosition != newPosition) && !mCursorPositionChanged) + { + mCursorPositionChanged = true; + mOldPosition = oldPosition; } } @@ -1854,12 +1947,56 @@ void TextField::AnchorClicked(const std::string& href) mAnchorClickedSignal.Emit(handle, href.c_str(), href.length()); } +void TextField::EmitCursorPositionChangedSignal() +{ + Dali::Toolkit::TextField handle(GetOwner()); + mCursorPositionChangedSignal.Emit(handle, mOldPosition); + mCursorPositionChanged = false; +} + void TextField::InputFiltered(Toolkit::InputFilter::Property::Type type) { Dali::Toolkit::TextField handle(GetOwner()); mInputFilteredSignal.Emit(handle, type); } +void TextField::EmitSelectionChangedSignal() +{ + Dali::Toolkit::TextField handle(GetOwner()); + mSelectionChangedSignal.Emit(handle, mOldSelectionStart, mOldSelectionEnd); + mSelectionChanged = false; +} + +void TextField::EmitSelectionClearedSignal() +{ + Dali::Toolkit::TextField handle(GetOwner()); + mSelectionClearedSignal.Emit(handle); + mSelectionCleared = false; +} + +void TextField::SelectionChanged(uint32_t oldStart, uint32_t oldEnd, uint32_t newStart, uint32_t newEnd) +{ + if(((oldStart != newStart) || (oldEnd != newEnd)) && !mSelectionChanged) + { + if(newStart == newEnd) + { + mSelectionCleared = true; + } + + mSelectionChanged = true; + mOldSelectionStart = oldStart; + mOldSelectionEnd = oldEnd; + + if(mOldSelectionStart > mOldSelectionEnd) + { + //swap + uint32_t temp = mOldSelectionStart; + mOldSelectionStart = mOldSelectionEnd; + mOldSelectionEnd = temp; + } + } +} + void TextField::AddDecoration(Actor& actor, bool needsClipping) { if(actor) @@ -1996,7 +2133,13 @@ TextField::TextField() mRenderingBackend(DEFAULT_RENDERING_BACKEND), mExceedPolicy(Dali::Toolkit::TextField::EXCEED_POLICY_CLIP), mHasBeenStaged(false), - mTextChanged(false) + mTextChanged(false), + mCursorPositionChanged(false), + mSelectionChanged(false), + mSelectionCleared(false), + mOldPosition(0u), + mOldSelectionStart(0u), + mOldSelectionEnd(0u) { } @@ -2067,8 +2210,8 @@ bool TextField::AccessibleImpl::SetCursorOffset(size_t offset) Dali::Accessibility::Range TextField::AccessibleImpl::GetTextAtOffset( size_t offset, Dali::Accessibility::TextBoundary boundary) { - auto self = Toolkit::TextField::DownCast(Self()); - auto text = self.GetProperty(Toolkit::TextField::Property::TEXT).Get(); + auto self = Toolkit::TextField::DownCast(Self()); + auto text = self.GetProperty(Toolkit::TextField::Property::TEXT).Get(); auto textSize = text.size(); auto range = Dali::Accessibility::Range{}; @@ -2089,7 +2232,7 @@ Dali::Accessibility::Range TextField::AccessibleImpl::GetTextAtOffset( case Dali::Accessibility::TextBoundary::LINE: { auto textString = text.c_str(); - auto breaks = std::vector(textSize, 0); + auto breaks = std::vector(textSize, 0); if(boundary == Dali::Accessibility::TextBoundary::WORD) { @@ -2164,8 +2307,8 @@ Dali::Accessibility::Range TextField::AccessibleImpl::GetRangeOfSelection(size_t return {}; } - auto self = Toolkit::TextField::DownCast(Self()); - auto controller = Dali::Toolkit::GetImpl(self).GetTextController(); + auto self = Toolkit::TextField::DownCast(Self()); + auto controller = Dali::Toolkit::GetImpl(self).GetTextController(); std::string value{}; controller->RetrieveSelection(value); auto indices = controller->GetSelectionIndexes(); @@ -2264,7 +2407,7 @@ Dali::Accessibility::States TextField::AccessibleImpl::CalculateStates() bool TextField::AccessibleImpl::InsertText(size_t startPosition, std::string text) { - auto self = Toolkit::TextField::DownCast(Self()); + auto self = Toolkit::TextField::DownCast(Self()); auto insertedText = self.GetProperty(Toolkit::TextField::Property::TEXT).Get(); insertedText.insert(startPosition, text);