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