1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_TEXT_OVERLAY_TEXT_OVERLAY_COMPONENT_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_TEXT_OVERLAY_TEXT_OVERLAY_COMPONENT_H 18 19 #include "base/memory/referenced.h" 20 #include "core/components/box/box_component.h" 21 #include "core/components/button/button_component.h" 22 #include "core/components/menu/menu_component.h" 23 #include "core/components/option/option_component.h" 24 #include "core/components/select_popup/select_popup_component.h" 25 #include "core/components/text_field/render_text_field.h" 26 #include "core/components/text_field/text_field_component.h" 27 #include "core/components/text_overlay/text_overlay_theme.h" 28 #include "core/components/tween/tween_component.h" 29 #include "core/pipeline/base/component.h" 30 #include "core/pipeline/base/sole_child_component.h" 31 #include "frameworks/core/animation/animator.h" 32 33 namespace OHOS::Ace { 34 #ifdef WEB_SUPPORTED 35 class RenderWeb; 36 #endif 37 constexpr Dimension ICON_SIZE = 24.0_vp; 38 constexpr Dimension ICON_PADDING = 2.0_vp; 39 40 using CommonCallback = std::function<void()>; 41 using StartHandleMoveCallback = 42 std::function<void(int32_t end, const Offset&, const std::function<void(const Offset&)>&, bool isSingleHandle)>; 43 using EndHandleMoveCallback = 44 std::function<void(int32_t start, const Offset&, const std::function<void(const Offset&)>&)>; 45 using CopyAllCallback = std::function<void(const std::function<void(const Offset&, const Offset&)>&)>; 46 47 class TextOverlayComponent : public SoleChildComponent { 48 DECLARE_ACE_TYPE(TextOverlayComponent, SoleChildComponent) 49 50 public: 51 TextOverlayComponent( 52 const RefPtr<ThemeManager>& themeManager, const RefPtr<AccessibilityManager>& accessibilityManager); 53 ~TextOverlayComponent() override = default; 54 55 RefPtr<Element> CreateElement() override; 56 RefPtr<RenderNode> CreateRenderNode() override; 57 58 void InitThemeStyle(const RefPtr<ThemeManager>& themeManager); 59 RefPtr<Component> BuildChild( 60 bool isSingleHandle, bool hasToolBar, bool hasMenu, bool hasIcon, bool hasAnimation = true); 61 RefPtr<Component> BuildToolBar(bool isSingleHandle, bool hasToolBar, bool hasMenu, bool hasIcon, bool hasAnimation); 62 63 void SetWeakTextField(const WeakPtr<RenderTextField>& weakTextField); 64 const WeakPtr<RenderTextField>& GetWeakTextField() const; 65 66 void SetWeakText(const WeakPtr<RenderText>& weakText); 67 const WeakPtr<RenderText>& GetWeakText() const; 68 69 void SetWeakImage(const WeakPtr<RenderImage>& weakImage); 70 const WeakPtr<RenderImage>& GetWeakImage() const; 71 72 #ifdef WEB_SUPPORTED 73 void SetWeakWeb(const WeakPtr<RenderWeb>& weakWeb); 74 const WeakPtr<RenderWeb>& GetWeakWeb() const; 75 #endif 76 77 bool HasMoreButton() const; 78 79 void SetIsPassword(bool isPassword); 80 bool GetIsPassword() const; 81 82 void SetIsSingleHandle(bool isSingleHandle); 83 bool GetIsSingleHandle() const; 84 85 void SetLineHeight(double lineHeight); 86 double GetLineHeight() const; 87 88 void SetStartHandleHeight(double startHandleHeight); 89 const std::optional<double>& GetStartHandleHeight() const; 90 91 void SetEndHandleHeight(double endHandleHeight); 92 const std::optional<double>& GetEndHandleHeight() const; 93 94 void SetClipRect(const Rect& clipRect); 95 const Rect& GetClipRect() const; 96 97 void SetHandleColor(const Color& handleColor); 98 const Color& GetHandleColor() const; 99 100 void SetHandleColorInner(const Color& handleColorInner); 101 const Color& GetHandleColorInner() const; 102 103 void SetHandleDiameter(const Dimension& handleDiameter); 104 const Dimension& GetHandleDiameter() const; 105 106 void SetHandleDiameterInner(const Dimension& handleDiameterInner); 107 const Dimension& GetHandleDiameterInner() const; 108 109 void SetMenuSpacingWithText(const Dimension& menuSpacingWithText); 110 const Dimension& GetMenuSpacingWithText() const; 111 112 void SetOnFocusChange(const std::function<void(bool, bool)>& onFocusChange); 113 const std::function<void(bool, bool)>& GetOnFocusChange() const; 114 115 void SetOnCut(const CommonCallback& onCut); 116 const CommonCallback& GetOnCut() const; 117 118 void SetOnCopy(const CommonCallback& onCopy); 119 const CommonCallback& GetOnCopy() const; 120 121 void SetOnPaste(const CommonCallback& onPaste); 122 const CommonCallback& GetOnPaste() const; 123 124 void SetOnCopyAll(const CopyAllCallback& onCopyAll); 125 const CopyAllCallback& GetOnCopyAll() const; 126 127 void SetCutButtonMarker(const EventMarker& cutButtonMarker); 128 const EventMarker& GetCutButtonMarker() const; 129 130 void SetCopyButtonMarker(const EventMarker& copyButtonMarker); 131 const EventMarker& GetCopyButtonMarker() const; 132 133 void SetPasteButtonMarker(const EventMarker& pasteButtonMarker); 134 const EventMarker& GetPasteButtonMarker() const; 135 136 void SetCopyAllButtonMarker(const EventMarker& copyAllButtonMarker); 137 const EventMarker& GetCopyAllButtonMarker() const; 138 139 void SetMoreButtonMarker(const EventMarker& moreButtonMarker); 140 const EventMarker& GetMoreButtonMarker() const; 141 142 void SetStartHandleOffset(const Offset& offset); 143 const Offset& GetStartHandleOffset() const; 144 145 void SetEndHandleOffset(const Offset& offset); 146 const Offset& GetEndHandleOffset() const; 147 148 void SetMouseOffset(const Offset& mouseOffset); 149 const Offset& GetMouseOffset() const; 150 151 void SetOnStartHandleMove(const StartHandleMoveCallback& onStartHandleMove); 152 const StartHandleMoveCallback& GetOnStartHandleMove() const; 153 154 void SetOnEndHandleMove(const EndHandleMoveCallback& onEndHandleMove); 155 const EndHandleMoveCallback& GetOnEndHandleMove() const; 156 157 void SetRealTextDirection(TextDirection realTextDirection); 158 TextDirection GetRealTextDirection() const; 159 160 void SetOptions(const std::vector<InputOption>& options); 161 const std::vector<InputOption>& GetOptions() const; 162 163 void SetImageFill(const std::optional<Color>& imageFill); 164 void SetOptionsClickMarker(const EventMarker& onOptionsClick); 165 void SetTranslateButtonMarker(const EventMarker& onTranslate); 166 void SetShareButtonMarker(const EventMarker& onShare); 167 void SetSearchButtonMarker(const EventMarker& onSearch); 168 void SetPopOverlay(const CommonCallback& popOverlay); 169 void SetContext(const WeakPtr<PipelineContext>& context); 170 void SetShowOption(const TweenOption& tweenOption); 171 void SetHideOption(const TweenOption& tweenOption); 172 173 void BuildMenuForDeclative(bool isSingleHandle); 174 void AddOptionForMenu(); 175 FirePopOverlay()176 void FirePopOverlay() 177 { 178 if (popOverlay_) { 179 popOverlay_(); 180 } 181 } 182 183 const RefPtr<SelectPopupComponent>& GetMenu() const; 184 SetIsUsingMouse(bool isUsingMouse)185 void SetIsUsingMouse(bool isUsingMouse) 186 { 187 isUsingMouse_ = isUsingMouse; 188 } 189 GetIsUsingMouse()190 bool GetIsUsingMouse() const 191 { 192 return isUsingMouse_; 193 } 194 SetNeedCilpRect(bool needClipRect)195 void SetNeedCilpRect(bool needClipRect) 196 { 197 needClipRect_ = needClipRect; 198 } 199 GetNeedCilpRect()200 bool GetNeedCilpRect() const 201 { 202 return needClipRect_; 203 } 204 205 private: 206 RefPtr<ButtonComponent> BuildButton(const std::string& data, const EventMarker& onClick); 207 RefPtr<ButtonComponent> BuildMoreIconButton(bool hasMenu); 208 RefPtr<Component> BuildMenu(bool isSingleHandle = false); 209 RefPtr<OptionComponent> BuildMenuOption(const std::string& imageSrc, InternalResource::ResourceId resourceId, 210 const std::string& text, bool useResource); 211 RefPtr<Component> BuildAnimation(const RefPtr<Component>& child, bool hasAnimation); 212 void OnOptionClick(int32_t index); 213 void OnToolBarButtonClick(const EventMarker& marker, const std::string& eventName); 214 std::string GetSelectedText() const; 215 216 WeakPtr<PipelineContext> context_; 217 WeakPtr<RenderTextField> weakTextField_; 218 WeakPtr<RenderText> weakText_; 219 WeakPtr<RenderImage> weakImage_; 220 #ifdef WEB_SUPPORTED 221 WeakPtr<RenderWeb> weakWeb_; 222 #endif 223 RefPtr<TextOverlayTheme> theme_; 224 RefPtr<SelectPopupComponent> menu_; 225 RefPtr<ThemeManager> themeManager_; 226 WeakPtr<AccessibilityManager> accessibilityManager_; 227 228 bool hasMoreButton_ = false; 229 bool isPassword_ = false; 230 bool isSingleHandle_ = false; 231 double lineHeight_ = 0.0; 232 std::optional<double> startHandleHeight_; 233 std::optional<double> endHandleHeight_; 234 Rect clipRect_; 235 Color handleColor_; 236 Color handleColorInner_; 237 std::optional<Color> imageFill_; 238 Dimension handleDiameter_; 239 Dimension handleDiameterInner_; 240 Dimension menuSpacingWithText_; 241 Offset startHandleOffset_; 242 Offset endHandleOffset_; 243 Offset mouseOffset_; 244 TextDirection realTextDirection_ = TextDirection::LTR; 245 ComposeId innerComposeId_; 246 ComposeId outerComposeId_; 247 248 CommonCallback popOverlay_; 249 CommonCallback onCut_; 250 CommonCallback onCopy_; 251 CommonCallback onPaste_; 252 CopyAllCallback onCopyAll_; 253 StartHandleMoveCallback onStartHandleMove_; 254 EndHandleMoveCallback onEndHandleMove_; 255 std::function<void(bool, bool)> onFocusChange_; 256 257 EventMarker optionsClickMarker_; 258 EventMarker translateButtonMarker_; 259 EventMarker shareButtonMarker_; 260 EventMarker searchButtonMarker_; 261 EventMarker cutButtonMarker_ = BackEndEventManager<void()>::GetInstance().GetAvailableMarker(); 262 EventMarker copyButtonMarker_ = BackEndEventManager<void()>::GetInstance().GetAvailableMarker(); 263 EventMarker pasteButtonMarker_ = BackEndEventManager<void()>::GetInstance().GetAvailableMarker(); 264 EventMarker copyAllButtonMarker_ = BackEndEventManager<void()>::GetInstance().GetAvailableMarker(); 265 EventMarker moreButtonMarker_ = BackEndEventManager<void()>::GetInstance().GetAvailableMarker(); 266 267 std::vector<InputOption> options_; // Options for menu. 268 bool isUsingMouse_ = false; 269 bool needClipRect_ = true; 270 }; 271 272 } // namespace OHOS::Ace 273 274 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_TEXT_OVERLAY_TEXT_OVERLAY_COMPONENT_H 275