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