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 enum class FrameNodeType {
33     SELECTMENU,
34     EXTENSIONMENU,
35     BACKBUTTON,
36     MENUONLY
37 };
38 
39 enum class FrameNodeStatus {
40     VISIBLE,
41     VISIBLETOGONE,
42     GONE,
43     GONETOVISIBLE
44 };
45 
46 enum class FrameNodeTrigger {
47     SHOW,
48     SHOWN,
49     HIDE,
50     HIDDEN
51 };
52 
53 class ACE_EXPORT SelectOverlayNode : public FrameNode {
54     DECLARE_ACE_TYPE(SelectOverlayNode, FrameNode)
55 public:
56     explicit SelectOverlayNode(const RefPtr<Pattern>& pattern);
57     ~SelectOverlayNode() override = default;
58 
59     static RefPtr<FrameNode> CreateSelectOverlayNode(
60         const std::shared_ptr<SelectOverlayInfo>& info, SelectOverlayMode mode = SelectOverlayMode::ALL);
61     RefPtr<FrameNode> CreateMoreSelectOverlayNode(const std::vector<MenuOptionsParam>& menuOptionItems, int32_t index);
62 
63     void UpdateToolBar(bool menuItemChanged, bool noAnimation = false);
64 
65     void UpdateMenuInner(const std::shared_ptr<SelectOverlayInfo>& info, bool noAnimation = false);
66 
SetSelectInfo(const std::string & selectInfo)67     void SetSelectInfo(const std::string& selectInfo)
68     {
69         selectInfo_ = selectInfo;
70     }
71 
GetSelectInfo()72     const std::string& GetSelectInfo() const
73     {
74         return selectInfo_;
75     }
76 
77     void ChangeToolBar(bool isUseExtensionMenu);
78 
79     void MoreOrBackAnimation(bool isMore, bool noAnimation = false);
80 
81     bool IsInSelectedOrSelectOverlayArea(const PointF& point);
82 
83     void SetClosedByGlobalEvent(bool closedByGlobalEvent);
84 
GetAnimationStatus()85     bool GetAnimationStatus()
86     {
87         return isDoingAnimation_;
88     }
89 
GetIsExtensionMenu()90     bool GetIsExtensionMenu()
91     {
92         return isExtensionMenu_;
93     }
94 
95     void ShowSelectOverlay(bool animation);
96 
97     void HideSelectOverlay(const std::function<void()>& callback);
98     void HideOrShowCirclesAndBackArrow(FrameNodeType type, float value);
99 
100     void SwitchToOverlayMode();
101 
102 private:
103     void CreateToolBar();
104     void SelectMenuAndInnerInitProperty();
105     void AddMenuItemByCreateMenuCallback(const std::shared_ptr<SelectOverlayInfo>& info, float maxWidth);
106     static const std::vector<MenuItemParam> GetSystemMenuItemParams(const std::shared_ptr<SelectOverlayInfo>& info);
107     static const MenuItemParam GetSystemMenuItemParam(const std::string& menuId, const std::string& menuButton);
108     int32_t AddCreateMenuItems(const std::vector<NG::MenuOptionsParam>& menuItems,
109         const std::shared_ptr<SelectOverlayInfo>& info, float maxWidth);
110     bool AddSystemDefaultOptions(float maxWidth, float& allocatedSize);
111     void LandscapeMenuAddMenuOptions(const std::vector<MenuOptionsParam>& menuOptionItems, bool isDefaultOverMaxWidth,
112         float maxWidth, float allocatedSize, int32_t& extensionOptionStartIndex);
113     void ShowCut(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info);
114     void ShowCopy(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info);
115     void ShowPaste(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info);
116     void ShowCopyAll(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info);
117     void ShowShare(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info);
118     void ShowCamera(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info);
119     void ShowAIWrite(float maxWidth, float& allocatedSize, std::shared_ptr<SelectOverlayInfo>& info);
120     std::function<void()> GetDefaultOptionCallback();
121     std::vector<OptionParam> GetDefaultOptionsParams(const std::shared_ptr<SelectOverlayInfo>& info);
122     void GetFlexibleOptionsParams(
123         const std::shared_ptr<SelectOverlayInfo>& info, std::vector<OptionParam>& params);
124     void addMenuOptionItemsParams(
125         std::vector<OptionParam>& params, const std::shared_ptr<SelectOverlayInfo>& info, int32_t index);
126     void AddExtensionMenuOptions(const std::shared_ptr<SelectOverlayInfo>& info, int32_t index);
127     void AddCreateMenuExtensionMenuOptions(const std::vector<MenuOptionsParam>& menuOptionItems,
128         const std::shared_ptr<SelectOverlayInfo>& info, int32_t startIndex);
129     void AddCreateMenuExtensionMenuParams(const std::vector<MenuOptionsParam>& menuOptionItems,
130         const std::shared_ptr<SelectOverlayInfo>& info, int32_t startIndex, std::vector<OptionParam>& params);
131     std::function<void()> CreateExtensionMenuOptionCallback(int32_t id, const OnMenuItemCallback& onCreateCallback,
132         const std::function<void()>& systemEvent, const MenuOptionsParam& item);
133     void CreatExtensionMenu(std::vector<OptionParam>&& params);
134     void GetDefaultButtonAndMenuWidth(float& maxWidth);
135 
136     void MoreAnimation(bool noAnimation);
137     void BackAnimation(bool noAnimation);
138 
139     void DispatchVisibleState(FrameNodeType type, FrameNodeTrigger trigger);
140     void DispatchVisibleToGoneState(FrameNodeType type, FrameNodeTrigger trigger);
141     void DispatchGoneState(FrameNodeType type, FrameNodeTrigger trigger);
142     void DispatchGoneToVisibleState(FrameNodeType type, FrameNodeTrigger trigger);
143     void ExecuteOverlayStatus(FrameNodeType type, FrameNodeTrigger trigger);
144     void SetFrameNodeStatus(FrameNodeType type, FrameNodeStatus status);
145     void SetFrameNodeVisibility(FrameNodeType type, VisibleType visibleType);
146     void SetFrameNodeOpacity(FrameNodeType type, float opacity);
147     void SetSelectMenuOpacity(float value);
148     void SetExtensionMenuOpacity(float value);
149     void SetBackButtonOpacity(float value);
150     void HideFrameNodeImmediately(FrameNodeType type);
151     void CreateCustomSelectOverlay(const std::shared_ptr<SelectOverlayInfo>& info);
152     void MenuOnlyStatusChange(const std::shared_ptr<SelectOverlayInfo>& info, bool noAnimation);
153     void HideMenuOnlyImmediately();
154     void InitSelectMenuStatus(
155         SelectOverlayMode mode, const std::shared_ptr<SelectOverlayInfo>& info, bool changeOpacity = true);
156 
SetAnimationStatus(bool toDoAnimation)157     void SetAnimationStatus(bool toDoAnimation)
158     {
159         isDoingAnimation_ = toDoAnimation;
160     }
161 
162     static RefPtr<FrameNode> CreateMenuNode(const std::shared_ptr<SelectOverlayInfo>& info);
163     static std::pair<std::vector<MenuOptionsParam>, bool> HandleCollaborationMenuItem(
164         const std::vector<MenuOptionsParam>& params);
165 
166     void NotifyUpdateToolBar(bool itemChanged);
167     void SetSelectMenuInnerSize();
168 
169     using ExecuteStateFunc = void (SelectOverlayNode::*)(FrameNodeType type, FrameNodeTrigger trigger);
170 
171     /* Text selection menu node structure.
172         -rootNode
173             -selectOverlay
174                 -selectMenu_
175                     -selectMenuInner_
176                 -backButton_
177                 -extensionMenu_
178        Attention:
179         If the user-defined selection menu is bound by bindSelectionMenu, there will be only the selectMenu_.
180         Then, selectMenuInner_, backButton_, extensionMenu_ will be null.
181         Text selection menu node structure whill be like bellow:
182         -rootNode
183             -selectOverlay(menuWrapper)
184                 -selectMenu_(menu)
185                     -scroller
186                         -customBuilderMenu
187     */
188     RefPtr<FrameNode> selectMenu_;
189     RefPtr<FrameNode> selectMenuInner_;
190     RefPtr<FrameNode> extensionMenu_;
191     RefPtr<FrameNode> backButton_;
192 
193     FrameNodeStatus selectMenuStatus_ = FrameNodeStatus::VISIBLE;
194     FrameNodeStatus extensionMenuStatus_ = FrameNodeStatus::GONE;
195     FrameNodeStatus backButtonStatus_ = FrameNodeStatus::GONE;
196     FrameNodeStatus menuOnlyStatus_ = FrameNodeStatus::VISIBLE;
197 
198     std::map<FrameNodeStatus, ExecuteStateFunc> stateFuncs_;
199 
200     std::string selectInfo_;
201 
202     // Marks whether it is currently in the animated state.
203     bool isDoingAnimation_ = false;
204 
205     // Controls that only default menus can be converted to extended menus, and extended menus can be converted to
206     // default menus.
207     bool isExtensionMenu_ = false;
208 
209     // Label whether the menu default button needs to appear within the extended menu
210     bool isShowInDefaultMenu_[9] = { false };
211 
212     bool isDefaultBtnOverMaxWidth_ = false;
213 
214     ACE_DISALLOW_COPY_AND_MOVE(SelectOverlayNode);
215 };
216 
217 } // namespace OHOS::Ace::NG
218 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_SELECT_OVERLAY_NODE_H
219