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