X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftext-controls%2Ftext-field-impl.h;h=0472aa826d286d3d1aae9165bcfa3da40df1b344;hb=HEAD;hp=dfd12a274c96283746cdf6af0b6719b222c9e8e3;hpb=14abad437f0a1737b07aead32134ebd37b8e4891;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.h b/dali-toolkit/internal/controls/text-controls/text-field-impl.h index dfd12a2..ed1a008 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.h +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_INTERNAL_TEXT_FIELD_H /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 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. @@ -19,18 +19,21 @@ */ // EXTERNAL INCLUDES -#include #include +#include +#include +#include // INTERNAL INCLUDES #include #include #include +#include +#include #include #include #include #include -#include #include #include #include @@ -50,8 +53,9 @@ class TextField : public Control, public Text::ControlInterface, public Text::Ed public: /** * @copydoc Dali::Toollkit::TextField::New() + * @param[in] additionalBehaviour custom behavior flags for this TextField. Default is CONTROL_BEHAVIOUR_DEFAULT */ - static Toolkit::TextField New(); + static Toolkit::TextField New(ControlBehaviour additionalBehaviour = ControlBehaviour::CONTROL_BEHAVIOUR_DEFAULT); // Properties @@ -126,6 +130,21 @@ public: */ DevelTextField::InputFilteredSignalType& InputFilteredSignal(); + /** + * @copydoc TextField::SelectionChangedSignal() + */ + DevelTextField::SelectionChangedSignalType& SelectionChangedSignal(); + + /** + * @copydoc TextField::SelectionClearedSignal() + */ + DevelTextField::SelectionClearedSignalType& SelectionClearedSignal(); + + /** + * @copydoc TextField::SelectionStartedSignal() + */ + DevelTextField::SelectionStartedSignalType& SelectionStartedSignal(); + private: // From Control /** * @copydoc Control::OnInitialize() @@ -133,6 +152,11 @@ private: // From Control void OnInitialize() override; /** + * @copydoc Toolkit::Internal::Control::CreateAccessibleObject() + */ + DevelControl::ControlAccessible* CreateAccessibleObject() override; + + /** * @copydoc Control::OnStyleChange() */ void OnStyleChange(Toolkit::StyleManager styleManager, StyleChange::Type change) override; @@ -188,6 +212,11 @@ private: // From Control void OnSceneConnection(int depth) override; /** + * @copydoc Control::OnPropertySet() + */ + void OnPropertySet(Property::Index index, const Property::Value& propertyValue) override; + + /** * @copydoc Dali::CustomActorImpl::OnKeyEvent(const KeyEvent&) */ bool OnKeyEvent(const KeyEvent& event) override; @@ -232,9 +261,14 @@ private: // From Control void InputStyleChanged(Text::InputStyle::Mask inputStyleMask) override; /** + * @copydoc Text::SelectableControlInterface::SelectionChanged() + */ + void SelectionChanged(uint32_t oldStart, uint32_t oldEnd, uint32_t newStart, uint32_t newEnd) override; + + /** * @copydoc Text::EditableControlInterface::AddDecoration() */ - void AddDecoration(Actor& actor, bool needsClipping) override; + void AddDecoration(Actor& actor, Toolkit::Text::DecorationType type, bool needsClipping) override; /** * @copydoc Text::EditableControlInterface::InputFiltered() @@ -288,6 +322,21 @@ public: */ void SetEditable(bool editable) override; + /** + * @copydoc Dali::EditableControlInterface::CopyText() + */ + string CopyText() override; + + /** + * @copydoc Dali::EditableControlInterface::CutText() + */ + string CutText() override; + + /** + * @copydoc Text::EditableControlInterface::PasteText() + */ + void PasteText() override; + // From AnchorControlInterface /** @@ -295,17 +344,107 @@ public: */ void AnchorClicked(const std::string& href) override; -private: // Implementation /** - * @copydoc Dali::Toolkit::Text::Controller::(InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent) + * @brief Get the rendered size of a specific text range. + * if the requested text is at multilines, multiple sizes will be returned for each text located in a separate line. + * if a line contains characters with different directions, multiple sizes will be returned for each block of contiguous characters with the same direction. + * + * @param[in] startIndex start index of the text requested to calculate size for. + * @param[in] endIndex end index(included) of the text requested to calculate size for. + * @return list of sizes of the reuested text. */ - InputMethodContext::CallbackData OnInputMethodContextEvent(InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent); + Vector GetTextSize(const uint32_t startIndex, const uint32_t endIndex) const; /** - * @brief Callback when Clipboard signals an item should be pasted - * @param[in] clipboard handle to Clipboard Event Notifier + * @brief Get the top/left rendered position of a specific text range. + * if the requested text is at multilines, multiple positions will be returned for each text located in a separate line. + * if a line contains characters with different directions, multiple positions will be returned for each block of contiguous characters with the same direction. + * + * @param[in] startIndex start index of the text requested to get position to. + * @param[in] endIndex end index(included) of the text requested to get position to. + * @return list of positions of the requested text. + */ + Vector GetTextPosition(const uint32_t startIndex, const uint32_t endIndex) const; + + /** + * @brief Get the line bounding rectangle. + * if the requested index is out of range or the line is not yet rendered, a rect of {0, 0, 0, 0} is returned. + * + * @param[in] lineIndex line index to which we want to calculate the geometry for. + * @return bounding rectangle. + */ + Rect GetLineBoundingRectangle(const uint32_t lineIndex) const; + + /** + * @brief Get the character bounding rectangle. + * If the text is not yet rendered or the index > text.Count(); a rect of {0, 0, 0, 0} is returned. + * + * @param[in] charIndex character index to which we want to calculate the geometry for. + * @return bounding rectangle. + */ + Rect GetCharacterBoundingRectangle(const uint32_t charIndex) const; + + /** + * @brief Get the character index. + * If the text is not yet rendered or the text is empty, -1 is returned. + * + * @param[in] visualX visual x position. + * @param[in] visualY visual y position. + * @return character index. */ - void OnClipboardTextSelected(ClipboardEventNotifier& clipboard); + int GetCharacterIndexAtPosition(float visualX, float visualY) const; + + /** + * @brief Gets the bounding box of a specific text range. + * + * @param[in] startIndex start index of the text requested to get bounding box to. + * @param[in] endIndex end index(included) of the text requested to get bounding box to. + * @return bounding box of the requested text. + */ + Rect<> GetTextBoundingRectangle(uint32_t startIndex, uint32_t endIndex) const; + + /** + * @brief Set the @p spannedText into current textField + * the spanned text contains content (text) and format (spans with ranges) + * the text is copied into text-controller and the spans are applied on ranges + * + * @param[in] spannedText the text with spans. + */ + void SetSpannedText(const Text::Spanned& spannedText); + + /** + * @brief Set removing front inset to TextField. + * + * @param[in] remove Whether front inset of TextField has to be removed or not. + */ + void SetRemoveFrontInset(const bool remove); + + /** + * @brief Whether front inset of TextField is removed or not. + * + * @return True if the front inset of TextField is removed. + */ + bool IsRemoveFrontInset() const; + + /** + * @brief Set removing back inset to TextField. + * + * @param[in] remove Whether back inset of TextField has to be removed or not. + */ + void SetRemoveBackInset(const bool remove); + + /** + * @brief Whether back inset of TextField is removed or not. + * + * @return True if the back inset of TextField is removed. + */ + bool IsRemoveBackInset() const; + +private: // Implementation + /** + * @copydoc Dali::Toolkit::Text::Controller::(InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent) + */ + InputMethodContext::CallbackData OnInputMethodContextEvent(InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent); /** * @brief Get a Property Map for the image used for the required Handle Image @@ -336,13 +475,6 @@ private: // Implementation bool OnTouched(Actor actor, const TouchEvent& touch); /** - * @brief Callbacks called on idle. - * - * If there are notifications of change of input style on the queue, Toolkit::TextField::InputStyleChangedSignal() are emitted. - */ - void OnIdleSignal(); - - /** * @brief Emits TextChanged signal. */ void EmitTextChangedSignal(); @@ -353,6 +485,21 @@ private: // Implementation void EmitCursorPositionChangedSignal(); /** + * @brief Emits SelectionChanged signal. + */ + void EmitSelectionChangedSignal(); + + /** + * @brief Emits SelectionCleared signal. + */ + void EmitSelectionClearedSignal(); + + /** + * @brief Emits SelectionStarted signal. + */ + void EmitSelectionStartedSignal(); + + /** * @brief Callback function for when the layout is changed. * @param[in] actor The actor whose layoutDirection is changed. * @param[in] type The layoutDirection. @@ -360,9 +507,18 @@ private: // Implementation void OnLayoutDirectionChanged(Actor actor, LayoutDirection::Type type); /** + * @brief Add a layer for active or cursor. + * @param[in] layer The actor in which to store the layer. + * @param[in] actor The new layer to add. + */ + void AddLayer(Actor& layer, Actor& actor); + + /** * Construct a new TextField. + * + * @param[in] additionalBehaviour additional behaviour flags for this TextField */ - TextField(); + TextField(ControlBehaviour additionalBehaviour); /** * A reference counted object may only be deleted by calling Unreference() @@ -389,6 +545,9 @@ private: // Implementation // Connection needed to re-render text, when a Text Field returns to the scene. void OnSceneConnect(Dali::Actor actor); + // Needed to synchronize TextAnchor actors with Anchor objects in text's logical model + void OnAccessibilityStatusChanged(); + private: // Data // Signals Toolkit::TextField::TextChangedSignalType mTextChangedSignal; @@ -397,19 +556,23 @@ private: // Data Toolkit::DevelTextField::AnchorClickedSignalType mAnchorClickedSignal; Toolkit::DevelTextField::InputFilteredSignalType mInputFilteredSignal; Toolkit::DevelTextField::CursorPositionChangedSignalType mCursorPositionChangedSignal; - - InputMethodContext mInputMethodContext; - Text::ControllerPtr mController; - Text::RendererPtr mRenderer; - Text::DecoratorPtr mDecorator; - Toolkit::Control mStencil; ///< For EXCEED_POLICY_CLIP - std::vector mClippingDecorationActors; ///< Decoration actors which need clipping. - Dali::InputMethodOptions mInputMethodOptions; - - Actor mRenderableActor; - Actor mActiveLayer; - Actor mBackgroundActor; - CallbackBase* mIdleCallback; + Toolkit::DevelTextField::SelectionChangedSignalType mSelectionChangedSignal; + Toolkit::DevelTextField::SelectionClearedSignalType mSelectionClearedSignal; + Toolkit::DevelTextField::SelectionStartedSignalType mSelectionStartedSignal; + + InputMethodContext mInputMethodContext; + Text::ControllerPtr mController; + Text::RendererPtr mRenderer; + Text::DecoratorPtr mDecorator; + Toolkit::Control mStencil; ///< For EXCEED_POLICY_CLIP + std::vector mClippingDecorationActors; ///< Decoration actors which need clipping. + std::vector mAnchorActors; + Dali::InputMethodOptions mInputMethodOptions; + + Actor mRenderableActor; + Actor mActiveLayer; + Actor mCursorLayer; + Actor mBackgroundActor; float mAlignmentOffset; int mRenderingBackend; @@ -417,94 +580,59 @@ private: // Data bool mHasBeenStaged : 1; bool mTextChanged : 1; ///< If true, emits TextChangedSignal in next OnRelayout(). bool mCursorPositionChanged : 1; ///< If true, emits CursorPositionChangedSignal at the end of OnRelayout(). + bool mSelectionChanged : 1; ///< If true, emits SelectionChangedSignal at the end of OnRelayout(). + bool mSelectionCleared : 1; ///< If true, emits SelectionClearedSignal at the end of OnRelayout(). //args for cursor position changed event unsigned int mOldPosition; + //args for selection changed event + uint32_t mOldSelectionStart; + uint32_t mOldSelectionEnd; + + bool mSelectionStarted : 1; ///< If true, emits SelectionStartedSignal at the end of OnRelayout(). + protected: + struct PropertyHandler; + /** * @brief This structure is to connect TextField with Accessible functions. */ - struct AccessibleImpl : public DevelControl::AccessibleImpl, - public virtual Dali::Accessibility::Text, - public virtual Dali::Accessibility::EditableText + class TextFieldAccessible : public EditableTextControlAccessible { - using DevelControl::AccessibleImpl::AccessibleImpl; + public: + using EditableTextControlAccessible::EditableTextControlAccessible; /** * @copydoc Dali::Accessibility::Accessible::GetName() */ - std::string GetName() override; - - /** - * @copydoc Dali::Accessibility::Text::GetText() - */ - std::string GetText(size_t startOffset, size_t endOffset) override; - - /** - * @copydoc Dali::Accessibility::Text::GetCharacterCount() - */ - size_t GetCharacterCount() override; - - /** - * @copydoc Dali::Accessibility::Text::GetCursorOffset() - */ - size_t GetCursorOffset() override; - - /** - * @copydoc Dali::Accessibility::Text::SetCursorOffset() - */ - bool SetCursorOffset(size_t offset) override; - - /** - * @copydoc Dali::Accessibility::Text::GetTextAtOffset() - */ - Accessibility::Range GetTextAtOffset(size_t offset, Accessibility::TextBoundary boundary) override; - - /** - * @copydoc Dali::Accessibility::Text::GetRangeOfSelection() - */ - Accessibility::Range GetRangeOfSelection(size_t selectionIndex) override; - - /** - * @copydoc Dali::Accessibility::Text::RemoveSelection() - */ - bool RemoveSelection(size_t selectionIndex) override; - - /** - * @copydoc Dali::Accessibility::Text::SetRangeOfSelection() - */ - bool SetRangeOfSelection(size_t selectionIndex, size_t startOffset, size_t endOffset) override; - - /** - * @copydoc Dali::Accessibility::EditableText::CopyText() - */ - bool CopyText(size_t startPosition, size_t endPosition) override; + std::string GetName() const override; + protected: /** - * @copydoc Dali::Accessibility::EditableText::CutText() + * @copydoc Dali::Toolkit::Internal::TextControlAccessible::GetTextAnchors() */ - bool CutText(size_t startPosition, size_t endPosition) override; + const std::vector& GetTextAnchors() const override; /** - * @copydoc Dali::Accessibility::Accessible::GetStates() + * @copydoc Dali::Toolkit::Internal::TextControlAccessible::GetTextController() */ - Accessibility::States CalculateStates() override; + Toolkit::Text::ControllerPtr GetTextController() const override; /** - * @copydoc Dali::Accessibility::EditableText::InsertText() + * @copydoc Dali::Toolkit::Internal::TextControlAccessible::GetSubstituteCharacter() */ - bool InsertText(size_t startPosition, std::string text) override; + std::uint32_t GetSubstituteCharacter() const override; /** - * @copydoc Dali::Accessibility::EditableText::SetTextContents() + * @copydoc Dali::Toolkit::Internal::TextControlAccessible::IsHiddenInput() */ - bool SetTextContents(std::string newContents) override; + bool IsHiddenInput() const override; /** - * @copydoc Dali::Accessibility::EditableText::DeleteText() + * @copydoc Dali::Toolkit::Internal::EditableTextControlAccessible::RequestTextRelayout() */ - bool DeleteText(size_t startPosition, size_t endPosition) override; + void RequestTextRelayout() override; }; };