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