X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftext-controls%2Ftext-field-impl.cpp;h=27eae92fd068a7da93e85c32adb465195059d362;hb=6217e54055ab9eb0bd2863cc4eb1e51621045792;hp=d29bfad4d1f9bb003cca282514672cca65ccf5d6;hpb=ab9500345f798f495c9201ab7cb3df88e24f7671;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git 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 d29bfad..27eae92 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -138,10 +138,13 @@ DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "enableEditing", DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "fontSizeScale", FLOAT, FONT_SIZE_SCALE ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "primaryCursorPosition", INTEGER, PRIMARY_CURSOR_POSITION ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "grabHandleColor", VECTOR4, GRAB_HANDLE_COLOR ) +DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "inputFilter", MAP, INPUT_FILTER ) 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_TYPE_REGISTRATION_END() // clang-format on @@ -764,6 +767,15 @@ void TextField::SetProperty(BaseObject* object, Property::Index index, const Pro impl.RequestTextRelayout(); break; } + case Toolkit::DevelTextField::Property::INPUT_FILTER: + { + const Property::Map* map = value.GetMap(); + if(map) + { + impl.mController->SetInputFilterOption(*map); + } + break; + } } // switch } // textfield } @@ -1119,6 +1131,13 @@ Property::Value TextField::GetProperty(BaseObject* object, Property::Index index value = impl.mDecorator->GetHandleColor(); break; } + case Toolkit::DevelTextField::Property::INPUT_FILTER: + { + Property::Map map; + impl.mController->GetInputFilterOption(map); + value = map; + break; + } } //switch } @@ -1195,6 +1214,22 @@ bool TextField::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* { field.InputStyleChangedSignal().Connect(tracker, functor); } + else if(0 == strcmp(signalName.c_str(), SIGNAL_ANCHOR_CLICKED)) + { + if(field) + { + Internal::TextField& fieldImpl(GetImpl(field)); + fieldImpl.AnchorClickedSignal().Connect(tracker, functor); + } + } + else if(0 == strcmp(signalName.c_str(), SIGNAL_INPUT_FILTERED)) + { + if(field) + { + Internal::TextField& fieldImpl(GetImpl(field)); + fieldImpl.InputFilteredSignal().Connect(tracker, functor); + } + } else { // signalName does not match any signal @@ -1219,11 +1254,21 @@ Toolkit::TextField::InputStyleChangedSignalType& TextField::InputStyleChangedSig return mInputStyleChangedSignal; } +DevelTextField::AnchorClickedSignalType& TextField::AnchorClickedSignal() +{ + return mAnchorClickedSignal; +} + +DevelTextField::InputFilteredSignalType& TextField::InputFilteredSignal() +{ + return mInputFilteredSignal; +} + void TextField::OnInitialize() { Actor self = Self(); - mController = Text::Controller::New(this, this, this); + mController = Text::Controller::New(this, this, this, this); // When using the vector-based rendering, the size of the GLyphs are different TextAbstraction::GlyphType glyphType = (DevelText::RENDERING_VECTOR_BASED == mRenderingBackend) ? TextAbstraction::VECTOR_GLYPH : TextAbstraction::BITMAP_GLYPH; @@ -1393,6 +1438,12 @@ void TextField::OnRelayout(const Vector2& size, RelayoutContainer& container) ResizeActor(mActiveLayer, contentSize); } + // If there is text changed, callback is called. + if(mTextChanged) + { + EmitTextChangedSignal(); + } + const Text::Controller::UpdateTextType updateTextType = mController->Relayout(contentSize, layoutDirection); if((Text::Controller::NONE_UPDATED != updateTextType) || @@ -1412,14 +1463,6 @@ void TextField::OnRelayout(const Vector2& size, RelayoutContainer& container) } RenderText(updateTextType); - - // If there is text changed, callback is called. - if(mTextChanged) - { - Dali::Toolkit::TextField handle(GetOwner()); - mTextChangedSignal.Emit(handle); - mTextChanged = false; - } } // The text-field emits signals when the input style changes. These changes of style are @@ -1621,6 +1664,7 @@ void TextField::OnTap(const TapGesture& gesture) padding = Self().GetProperty(Toolkit::Control::Property::PADDING); const Vector2& localPoint = gesture.GetLocalPoint(); mController->TapEvent(gesture.GetNumberOfTaps(), localPoint.x - padding.start, localPoint.y - padding.top); + mController->AnchorEvent(localPoint.x - padding.start, localPoint.y - padding.top); SetKeyInputFocus(); } @@ -1710,9 +1754,23 @@ void TextField::CaretMoved(unsigned int position) } } -void TextField::TextChanged() +void TextField::TextChanged(bool immediate) +{ + if(immediate) // Emits TextChangedSignal immediately + { + EmitTextChangedSignal(); + } + else + { + mTextChanged = true; + } +} + +void TextField::EmitTextChangedSignal() { - mTextChanged = true; + Dali::Toolkit::TextField handle(GetOwner()); + mTextChangedSignal.Emit(handle); + mTextChanged = false; } void TextField::MaxLengthReached() @@ -1771,6 +1829,18 @@ void TextField::InputStyleChanged(Text::InputStyle::Mask inputStyleMask) mInputStyleChangedSignal.Emit(handle, fieldInputStyleMask); } +void TextField::AnchorClicked(const std::string& href) +{ + Dali::Toolkit::TextField handle(GetOwner()); + mAnchorClickedSignal.Emit(handle, href.c_str(), href.length()); +} + +void TextField::InputFiltered(Toolkit::InputFilter::Property::Type type) +{ + Dali::Toolkit::TextField handle(GetOwner()); + mInputFilteredSignal.Emit(handle, type); +} + void TextField::AddDecoration(Actor& actor, bool needsClipping) { if(actor) @@ -1789,6 +1859,18 @@ void TextField::AddDecoration(Actor& actor, bool needsClipping) } } +void TextField::GetControlBackgroundColor(Vector4& color) const +{ + Property::Value propValue = Self().GetProperty(Toolkit::Control::Property::BACKGROUND); + Property::Map* resultMap = propValue.GetMap(); + + Property::Value* colorValue = nullptr; + if(resultMap && (colorValue = resultMap->Find(ColorVisual::Property::MIX_COLOR))) + { + colorValue->Get(color); + } +} + void TextField::OnSceneConnect(Dali::Actor actor) { if(mHasBeenStaged) @@ -1906,7 +1988,7 @@ TextField::~TextField() std::string TextField::AccessibleImpl::GetName() { - auto slf = Toolkit::TextField::DownCast(self); + auto slf = Toolkit::TextField::DownCast(Self()); return slf.GetProperty(Toolkit::TextField::Property::TEXT).Get(); } @@ -1916,7 +1998,7 @@ std::string TextField::AccessibleImpl::GetText(size_t startOffset, if(endOffset <= startOffset) return {}; - auto slf = Toolkit::TextField::DownCast(self); + auto slf = Toolkit::TextField::DownCast(Self()); auto txt = slf.GetProperty(Toolkit::TextField::Property::TEXT).Get(); @@ -1928,7 +2010,7 @@ std::string TextField::AccessibleImpl::GetText(size_t startOffset, size_t TextField::AccessibleImpl::GetCharacterCount() { - auto slf = Toolkit::TextField::DownCast(self); + auto slf = Toolkit::TextField::DownCast(Self()); auto txt = slf.GetProperty(Toolkit::TextField::Property::TEXT).Get(); @@ -1937,13 +2019,13 @@ size_t TextField::AccessibleImpl::GetCharacterCount() size_t TextField::AccessibleImpl::GetCaretOffset() { - auto slf = Toolkit::TextField::DownCast(self); + auto slf = Toolkit::TextField::DownCast(Self()); return Dali::Toolkit::GetImpl(slf).getController()->GetCursorPosition(); } bool TextField::AccessibleImpl::SetCaretOffset(size_t offset) { - auto slf = Toolkit::TextField::DownCast(self); + auto slf = Toolkit::TextField::DownCast(Self()); auto txt = slf.GetProperty(Toolkit::TextField::Property::TEXT).Get(); if(offset > txt.size()) return false; @@ -1957,7 +2039,7 @@ bool TextField::AccessibleImpl::SetCaretOffset(size_t offset) Dali::Accessibility::Range TextField::AccessibleImpl::GetTextAtOffset( size_t offset, Dali::Accessibility::TextBoundary boundary) { - auto slf = Toolkit::TextField::DownCast(self); + auto slf = Toolkit::TextField::DownCast(Self()); auto txt = slf.GetProperty(Toolkit::TextField::Property::TEXT).Get(); auto txt_size = txt.size(); @@ -2037,7 +2119,7 @@ TextField::AccessibleImpl::GetSelection(size_t selectionNum) if(selectionNum > 0) return {}; - auto slf = Toolkit::TextField::DownCast(self); + auto slf = Toolkit::TextField::DownCast(Self()); auto ctrl = Dali::Toolkit::GetImpl(slf).getController(); std::string ret; ctrl->RetrieveSelection(ret); @@ -2052,7 +2134,7 @@ bool TextField::AccessibleImpl::RemoveSelection(size_t selectionNum) if(selectionNum > 0) return false; - auto slf = Toolkit::TextField::DownCast(self); + auto slf = Toolkit::TextField::DownCast(Self()); Dali::Toolkit::GetImpl(slf).getController()->SetSelection(0, 0); return true; } @@ -2065,7 +2147,7 @@ bool TextField::AccessibleImpl::SetSelection(size_t selectionNum, if(selectionNum > 0) return false; - auto slf = Toolkit::TextField::DownCast(self); + auto slf = Toolkit::TextField::DownCast(Self()); Dali::Toolkit::GetImpl(slf).getController()->SetSelection(startOffset, endOffset); return true; @@ -2077,7 +2159,7 @@ bool TextField::AccessibleImpl::CopyText(size_t startPosition, if(endPosition <= startPosition) return false; - auto slf = Toolkit::TextField::DownCast(self); + auto slf = Toolkit::TextField::DownCast(Self()); auto txt = slf.GetProperty(Toolkit::TextField::Property::TEXT).Get(); Dali::Toolkit::GetImpl(slf).getController()->CopyStringToClipboard(txt.substr(startPosition, endPosition - startPosition)); @@ -2090,12 +2172,27 @@ bool TextField::AccessibleImpl::CutText(size_t startPosition, if(endPosition <= startPosition) return false; - auto slf = Toolkit::TextField::DownCast(self); + auto slf = Toolkit::TextField::DownCast(Self()); auto txt = slf.GetProperty(Toolkit::TextField::Property::TEXT).Get(); Dali::Toolkit::GetImpl(slf).getController()->CopyStringToClipboard(txt.substr(startPosition, endPosition - startPosition)); slf.SetProperty(Toolkit::TextField::Property::TEXT, - txt.substr(0, startPosition) + txt.substr(endPosition - startPosition, txt.size())); + txt.substr(0, startPosition) + txt.substr(endPosition)); + + return true; +} + +bool TextField::AccessibleImpl::DeleteText(size_t startPosition, + size_t endPosition) +{ + if(endPosition <= startPosition) + return false; + + auto slf = Toolkit::TextField::DownCast(Self()); + auto txt = slf.GetProperty(Toolkit::TextField::Property::TEXT).Get(); + + slf.SetProperty(Toolkit::TextField::Property::TEXT, + txt.substr(0, startPosition) + txt.substr(endPosition)); return true; } @@ -2118,6 +2215,26 @@ Dali::Accessibility::States TextField::AccessibleImpl::CalculateStates() return states; } +bool TextField::AccessibleImpl::InsertText(size_t startPosition, + std::string text) +{ + auto slf = Toolkit::TextField::DownCast(Self()); + auto txt = slf.GetProperty(Toolkit::TextField::Property::TEXT).Get(); + + txt.insert(startPosition, text); + + slf.SetProperty(Toolkit::TextField::Property::TEXT, std::move(txt)); + + return true; +} + +bool TextField::AccessibleImpl::SetTextContents(std::string newContents) +{ + auto slf = Toolkit::TextField::DownCast(Self()); + slf.SetProperty(Toolkit::TextField::Property::TEXT, std::move(newContents)); + return true; +} + } // namespace Internal } // namespace Toolkit