• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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_NG_PATTERNS_SELECT_OVERLAY_NODE_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SELECT_OVERLAY_NODE_H
18 
19 #include <cstdint>
20 #include <memory>
21 
22 #include "base/memory/referenced.h"
23 #include "base/utils/noncopyable.h"
24 #include "core/components_ng/base/frame_node.h"
25 #include "core/components_ng/pattern/select_overlay/select_overlay_property.h"
26 #include "core/components_ng/property/property.h"
27 
28 namespace OHOS::Ace::NG {
29 
30 struct OptionParam;
31 
32 const std::string SelectOverlayRrightClickMenuWrapper = "select_overlay_right_click_menuWrapper";
33 
34 enum class FrameNodeType {
35     SELECTMENU,
36     EXTENSIONMENU,
37     BACKBUTTON,
38     MENUONLY
39 };
40 
41 enum class FrameNodeStatus {
42     VISIBLE,
43     VISIBLETOGONE,
44     GONE,
45     GONETOVISIBLE
46 };
47 
48 enum class FrameNodeTrigger {
49     SHOW,
50     SHOWN,
51     HIDE,
52     HIDDEN
53 };
54 
55 class ACE_EXPORT SelectOverlayNode : public FrameNode {
56     DECLARE_ACE_TYPE(SelectOverlayNode, FrameNode);
57 public:
58     explicit SelectOverlayNode(const RefPtr<Pattern>& pattern);
59     ~SelectOverlayNode() override = default;
60 
61     static RefPtr<FrameNode> CreateSelectOverlayNode(
62         const std::shared_ptr<SelectOverlayInfo>& info, SelectOverlayMode mode = SelectOverlayMode::ALL);
63     RefPtr<FrameNode> CreateMoreSelectOverlayNode(const std::vector<MenuOptionsParam>& menuOptionItems, int32_t index);
64 
65     void UpdateToolBar(bool menuItemChanged, bool noAnimation = false);
66 
67     void UpdateMenuOptions(const std::shared_ptr<SelectOverlayInfo>& info);
68 
69     void UpdateMenuInner(const std::shared_ptr<SelectOverlayInfo>& info, bool noAnimation = false);
70 
SetSelectInfo(const std::string & selectInfo)71     void SetSelectInfo(const std::string& selectInfo)
72     {
73         selectInfo_ = selectInfo;
74     }
75 
GetSelectInfo()76     const std::string& GetSelectInfo() const
77     {
78         return selectInfo_;
79     }
80 
81     void ChangeToolBar(bool isUseExtensionMenu);
82 
83     void MoreOrBackAnimation(bool isMore, bool noAnimation = false);
84 
85     bool IsInSelectedOrSelectOverlayArea(const PointF& point);
86 
87     void SetClosedByGlobalEvent(bool closedByGlobalEvent);
88 
GetAnimationStatus()89     bool GetAnimationStatus()
90     {
91         return isDoingAnimation_;
92     }
93 
GetIsExtensionMenu()94     bool GetIsExtensionMenu()
95     {
96         return isExtensionMenu_;
97     }
98 
99     void ShowSelectOverlay(bool animation);
100 
101     void HideSelectOverlay(const std::function<void()>& callback);
102     void HideOrShowCirclesAndBackArrow(FrameNodeType type, float value);
103 
104     void SwitchToOverlayMode();
105     void UpdateSelectMenuBg();
106     void AddCustomMenuCallbacks(const std::shared_ptr<SelectOverlayInfo>& info);
107     void OnCustomSelectMenuAppear();
108     void FireCustomMenuChangeEvent(bool isMenuShow);
109     void OnDetachFromMainTree(bool recursive, PipelineContext* context) override;
110     void UpdateToolBarFromMainWindow(bool menuItemChanged, bool noAnimation = false);
111 
112 private:
113     void CreateToolBar();
114     void SelectMenuAndInnerInitProperty();
115     void AddMenuItemByCreateMenuCallback(const std::shared_ptr<SelectOverlayInfo>& info, float maxWidth);
116     static const std::vector<MenuItemParam> GetSystemMenuItemParams(const std::shared_ptr<SelectOverlayInfo>& info);
117     static void AddMenuItemParamIf(
118         bool condition, const std::string& menuId, const std::string& menuButton, std::vector<MenuItemParam>& items);
119     int32_t AddCreateMenuItems(const std::vector<NG::MenuOptionsParam>& menuItems,
120         const std::shared_ptr<SelectOverlayInfo>& info, float maxWidth);
121     bool AddSystemDefaultOptions(float maxWidth, float& allocatedSize);
122     void LandscapeMenuAddMenuOptions(bool isDefaultOverMaxWidth, float maxWidth, float allocatedSize,
123         int32_t& extensionOptionStartIndex, const std::shared_ptr<SelectOverlayInfo>& info);
124     void ShowCut(
125         float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info, const std::string& label);
126     void ShowCopy(
127         float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info, const std::string& label);
128     void ShowPaste(
129         float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info, const std::string& label);
130     void ShowCopyAll(
131         float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info, const std::string& label);
132     void ShowTranslate(
133         float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info, const std::string& label);
134     void ShowSearch(
135         float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info, const std::string& label);
136     void ShowShare(
137         float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info, const std::string& label);
138     void ShowCamera(
139         float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info, const std::string& label);
140     void ShowAIWrite(
141         float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info, const std::string& label);
142     void ShowAIMenuOptions(
143         float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info, const std::string& label);
144     bool IsShowOnTargetAPIVersion();
145     bool IsShowTranslateOnTargetAPIVersion();
146     std::function<void()> GetDefaultOptionCallback();
147     std::function<void(WeakPtr<NG::FrameNode>)> GetSymbolFunc(const std::string& symbolId);
148     std::vector<OptionParam> GetDefaultOptionsParams(const std::shared_ptr<SelectOverlayInfo>& info);
149     void GetFlexibleOptionsParams(
150         const std::shared_ptr<SelectOverlayInfo>& info, std::vector<OptionParam>& params);
151     void addMenuOptionItemsParams(
152         std::vector<OptionParam>& params, const std::shared_ptr<SelectOverlayInfo>& info, int32_t index);
153     void AddExtensionMenuOptions(const std::shared_ptr<SelectOverlayInfo>& info, int32_t index);
154     void AddCreateMenuExtensionMenuOptions(const std::vector<MenuOptionsParam>& menuOptionItems,
155         const std::shared_ptr<SelectOverlayInfo>& info, int32_t startIndex);
156     void AddCreateMenuExtensionMenuParams(const std::vector<MenuOptionsParam>& menuOptionItems,
157         const std::shared_ptr<SelectOverlayInfo>& info, int32_t startIndex, std::vector<OptionParam>& params);
158     std::function<void()> CreateExtensionMenuOptionCallback(int32_t id, const OnMenuItemCallback& onCreateCallback,
159         const std::function<void()>& systemEvent, const MenuOptionsParam& item);
160     void CreatExtensionMenu(std::vector<OptionParam>&& params);
161     void GetDefaultButtonAndMenuWidth(float& maxWidth);
162 
163     void MoreAnimation(bool noAnimation);
164     void BackAnimation(bool noAnimation);
165 
166     void DispatchVisibleState(FrameNodeType type, FrameNodeTrigger trigger);
167     void DispatchVisibleToGoneState(FrameNodeType type, FrameNodeTrigger trigger);
168     void DispatchGoneState(FrameNodeType type, FrameNodeTrigger trigger);
169     void DispatchGoneToVisibleState(FrameNodeType type, FrameNodeTrigger trigger);
170     void ExecuteOverlayStatus(FrameNodeType type, FrameNodeTrigger trigger);
171     void SetFrameNodeStatus(FrameNodeType type, FrameNodeStatus status);
172     void SetFrameNodeVisibility(FrameNodeType type, VisibleType visibleType);
173     void SetFrameNodeOpacity(FrameNodeType type, float opacity);
174     void SetSelectMenuOpacity(float value);
175     void SetExtensionMenuOpacity(float value);
176     void SetBackButtonOpacity(float value);
177     void HideFrameNodeImmediately(FrameNodeType type);
178     void CreateCustomSelectOverlay(const std::shared_ptr<SelectOverlayInfo>& info);
179     void UpdateMoreOrBackSymbolOptions(bool isMoreButton, bool isReplaceEffectEnable);
180     void UpdateMoreOrBackSymbolOptionsWithDelay();
181     void MenuOnlyStatusChange(const std::shared_ptr<SelectOverlayInfo>& info, bool noAnimation);
182     void HideMenuOnlyImmediately();
183     void InitSelectMenuStatus(
184         SelectOverlayMode mode, const std::shared_ptr<SelectOverlayInfo>& info, bool changeOpacity = true);
185 
SetAnimationStatus(bool toDoAnimation)186     void SetAnimationStatus(bool toDoAnimation)
187     {
188         isDoingAnimation_ = toDoAnimation;
189     }
190 
SetIsMoreOrBackSymbolIcon(bool isMoreOrBackSymbol)191     void SetIsMoreOrBackSymbolIcon(bool isMoreOrBackSymbol)
192     {
193         isMoreOrBackSymbolIcon_ = isMoreOrBackSymbol;
194     }
195 
196     static RefPtr<FrameNode> CreateMenuNode(const std::shared_ptr<SelectOverlayInfo>& info);
197     static std::pair<std::vector<MenuOptionsParam>, bool> HandleCollaborationMenuItem(
198         const std::vector<MenuOptionsParam>& params);
199 
200     void NotifyUpdateToolBar(bool itemChanged, bool withoutAnimation);
201     void SetSelectMenuInnerSize();
202     void ShowAskCelia(
203         float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info, const std::string& label);
204 
205     using ExecuteStateFunc = void (SelectOverlayNode::*)(FrameNodeType type, FrameNodeTrigger trigger);
206 
207     /* Text selection menu node structure.
208         -rootNode
209             -selectOverlay
210                 -selectMenu_
211                     -selectMenuInner_
212                 -backButton_
213                 -extensionMenu_
214        Attention:
215         If the user-defined selection menu is bound by bindSelectionMenu, there will be only the selectMenu_.
216         Then, selectMenuInner_, backButton_, extensionMenu_ will be null.
217         Text selection menu node structure whill be like bellow:
218         -rootNode
219             -selectOverlay(menuWrapper)
220                 -selectMenu_(menu)
221                     -scroller
222                         -customBuilderMenu
223     */
224     RefPtr<FrameNode> selectMenu_;
225     RefPtr<FrameNode> selectMenuInner_;
226     RefPtr<FrameNode> extensionMenu_;
227     RefPtr<FrameNode> backButton_;
228     RefPtr<FrameNode> moreOrBackSymbol_;
229     RefPtr<FrameNode> moreButton_;
230 
231     FrameNodeStatus selectMenuStatus_ = FrameNodeStatus::VISIBLE;
232     FrameNodeStatus extensionMenuStatus_ = FrameNodeStatus::GONE;
233     FrameNodeStatus backButtonStatus_ = FrameNodeStatus::GONE;
234     FrameNodeStatus menuOnlyStatus_ = FrameNodeStatus::VISIBLE;
235 
236     std::map<FrameNodeStatus, ExecuteStateFunc> stateFuncs_;
237 
238     std::string selectInfo_;
239 
240     // Marks whether it is currently in the animated state.
241     bool isDoingAnimation_ = false;
242 
243     // Controls that only default menus can be converted to extended menus, and extended menus can be converted to
244     // default menus.
245     bool isExtensionMenu_ = false;
246 
247     // Label whether the menu default button needs to appear within the extended menu
248     bool isShowInDefaultMenu_[11] = { false }; // OPTION_INDEX_ASK_CELIA + 1
249 
250     bool isDefaultBtnOverMaxWidth_ = false;
251 
252     bool isMoreOrBackSymbolIcon_ = false;
253     bool isCustomMenuAppear_ = false;
254 
255     ACE_DISALLOW_COPY_AND_MOVE(SelectOverlayNode);
256 };
257 
258 } // namespace OHOS::Ace::NG
259 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SELECT_OVERLAY_NODE_H
260