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_MENU_MENU_WRAPPER_PATTERN_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_MENU_MENU_WRAPPER_PATTERN_H 18 19 #include "base/memory/ace_type.h" 20 #include "base/memory/referenced.h" 21 #include "base/subwindow/subwindow_manager.h" 22 #include "base/utils/string_utils.h" 23 #include "base/utils/utils.h" 24 #include "core/components/common/properties/color.h" 25 #include "core/components/common/properties/placement.h" 26 #include "core/components_ng/pattern/menu/menu_item/menu_item_pattern.h" 27 #include "core/components_ng/pattern/menu/menu_pattern.h" 28 #include "core/components_ng/pattern/menu/wrapper/menu_wrapper_layout_algorithm.h" 29 #include "core/components_ng/pattern/overlay/popup_base_pattern.h" 30 #include "core/components_ng/pattern/pattern.h" 31 #include "core/components_v2/inspector/inspector_constants.h" 32 #include "core/pipeline_ng/ui_task_scheduler.h" 33 34 namespace OHOS::Ace::NG { 35 36 // has full screen size 37 // used for detecting clicks outside Menu area 38 class MenuWrapperPattern : public PopupBasePattern { 39 DECLARE_ACE_TYPE(MenuWrapperPattern, Pattern); 40 41 public: MenuWrapperPattern(int32_t Id)42 explicit MenuWrapperPattern(int32_t Id) : targetId_(Id) {} 43 ~MenuWrapperPattern() override = default; 44 IsAtomicNode()45 bool IsAtomicNode() const override 46 { 47 return false; 48 } 49 GetFocusPattern()50 FocusPattern GetFocusPattern() const override 51 { 52 return { FocusType::SCOPE, true }; 53 } 54 CreateLayoutAlgorithm()55 RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override 56 { 57 return MakeRefPtr<MenuWrapperLayoutAlgorithm>(); 58 } 59 60 void HandleMouseEvent(const MouseInfo& info, RefPtr<MenuItemPattern>& menuItem); 61 GetTargetId()62 int32_t GetTargetId() const override 63 { 64 return targetId_; 65 } 66 67 void HideMenu(); 68 IsHided()69 bool IsHided() const 70 { 71 return isHided_; 72 } 73 SetMenuHide()74 void SetMenuHide() 75 { 76 isHided_ = true; 77 } 78 IsContextMenu()79 bool IsContextMenu() const 80 { 81 auto menu = GetMenu(); 82 CHECK_NULL_RETURN(menu, false); 83 auto menuPattern = menu->GetPattern<MenuPattern>(); 84 CHECK_NULL_RETURN(menuPattern, false); 85 return menuPattern->IsContextMenu(); 86 } 87 GetPreviewMode()88 MenuPreviewMode GetPreviewMode() const 89 { 90 auto menu = GetMenu(); 91 CHECK_NULL_RETURN(menu, MenuPreviewMode::NONE); 92 auto menuPattern = menu->GetPattern<MenuPattern>(); 93 CHECK_NULL_RETURN(menuPattern, MenuPreviewMode::NONE); 94 return menuPattern->GetPreviewMode(); 95 } 96 IsSelectMenu()97 bool IsSelectMenu() const 98 { 99 auto menu = GetMenu(); 100 CHECK_NULL_RETURN(menu, false); 101 auto menuPattern = menu->GetPattern<MenuPattern>(); 102 CHECK_NULL_RETURN(menuPattern, false); 103 return menuPattern->IsSelectMenu(); 104 } 105 106 void HideSubMenu(); 107 GetMenu()108 RefPtr<FrameNode> GetMenu() const 109 { 110 auto host = GetHost(); 111 CHECK_NULL_RETURN(host, nullptr); 112 auto menu = AceType::DynamicCast<FrameNode>(host->GetChildAtIndex(0)); 113 CHECK_NULL_RETURN(menu, nullptr); 114 return menu; 115 } 116 GetPreview()117 RefPtr<FrameNode> GetPreview() const 118 { 119 auto host = GetHost(); 120 CHECK_NULL_RETURN(host, nullptr); 121 auto preview = AceType::DynamicCast<FrameNode>(host->GetChildAtIndex(1)); 122 CHECK_NULL_RETURN(preview, nullptr); 123 return preview; 124 } 125 126 OffsetT<Dimension> GetAnimationOffset(); 127 void SetAniamtinOption(const AnimationOption& animationOption); 128 SetMenuPlacementAfterLayout(const Placement & placement)129 void SetMenuPlacementAfterLayout(const Placement& placement) 130 { 131 menuPlacement_ = placement; 132 } 133 SetFirstShow()134 void SetFirstShow() 135 { 136 isFirstShow_ = true; 137 } 138 RegisterMenuAppearCallback(const std::function<void ()> & onAppear)139 void RegisterMenuAppearCallback(const std::function<void()>& onAppear) 140 { 141 onAppearCallback_ = onAppear; 142 } 143 RegisterMenuDisappearCallback(const std::function<void ()> & onDisappear)144 void RegisterMenuDisappearCallback(const std::function<void()>& onDisappear) 145 { 146 onDisappearCallback_ = onDisappear; 147 } 148 RegisterMenuAboutToAppearCallback(const std::function<void ()> & aboutToAppear)149 void RegisterMenuAboutToAppearCallback(const std::function<void()>& aboutToAppear) 150 { 151 aboutToAppearCallback_ = aboutToAppear; 152 } 153 RegisterMenuAboutToDisappearCallback(const std::function<void ()> & aboutToDisappear)154 void RegisterMenuAboutToDisappearCallback(const std::function<void()>& aboutToDisappear) 155 { 156 aboutToDisappearCallback_ = aboutToDisappear; 157 } 158 RegisterMenuStateChangeCallback(const std::function<void (const std::string &)> & callback)159 void RegisterMenuStateChangeCallback(const std::function<void(const std::string&)>& callback) 160 { 161 onStateChangeCallback_ = callback; 162 } 163 CallMenuAppearCallback()164 void CallMenuAppearCallback() 165 { 166 if (onAppearCallback_) { 167 onAppearCallback_(); 168 } 169 } 170 CallMenuDisappearCallback()171 void CallMenuDisappearCallback() 172 { 173 if (onDisappearCallback_) { 174 onDisappearCallback_(); 175 } 176 } 177 CallMenuAboutToAppearCallback()178 void CallMenuAboutToAppearCallback() 179 { 180 if (aboutToAppearCallback_) { 181 aboutToAppearCallback_(); 182 } 183 } 184 CallMenuAboutToDisappearCallback()185 void CallMenuAboutToDisappearCallback() 186 { 187 if (aboutToDisappearCallback_) { 188 aboutToDisappearCallback_(); 189 } 190 } 191 CallMenuStateChangeCallback(const std::string & value)192 void CallMenuStateChangeCallback(const std::string& value) 193 { 194 if (onStateChangeCallback_) { 195 onStateChangeCallback_(value); 196 } 197 } 198 GetMenuDisappearCallback()199 const std::function<void()>& GetMenuDisappearCallback() 200 { 201 return onDisappearCallback_; 202 } 203 SetShow(bool isShow)204 void SetShow(bool isShow) 205 { 206 isShow_ = isShow; 207 } 208 GetShow()209 bool GetShow() const 210 { 211 return isShow_; 212 } 213 214 protected: 215 void OnTouchEvent(const TouchEventInfo& info); 216 void CheckAndShowAnimation(); 217 218 private: AvoidKeyboard()219 bool AvoidKeyboard() const override 220 { 221 return false; 222 } 223 bool IsSelectOverlayCustomMenu(const RefPtr<FrameNode>& menu) const; 224 void OnAttachToFrameNode() override; 225 void RegisterOnTouch(); 226 void OnModifyDone() override; 227 bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override; 228 void SetHotAreas(const RefPtr<LayoutWrapper>& layoutWrapper); 229 void StartShowAnimation(); 230 231 void HideMenu(const RefPtr<FrameNode>& menu); 232 233 std::function<void()> onAppearCallback_ = nullptr; 234 std::function<void()> onDisappearCallback_ = nullptr; 235 std::function<void()> aboutToAppearCallback_ = nullptr; 236 std::function<void()> aboutToDisappearCallback_ = nullptr; 237 std::function<void(const std::string&)> onStateChangeCallback_ = nullptr; 238 RefPtr<TouchEventImpl> onTouch_; 239 // menuId in OverlayManager's map 240 int32_t targetId_ = -1; 241 242 AnimationOption animationOption_; 243 Placement menuPlacement_ = Placement::NONE; 244 bool isFirstShow_ = true; 245 bool isHided_ = false; 246 bool isShow_ = false; 247 bool isShowInSubWindow_ = true; 248 ACE_DISALLOW_COPY_AND_MOVE(MenuWrapperPattern); 249 }; 250 } // namespace OHOS::Ace::NG 251 252 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_MENU_MENU_WRAPPER_PATTERN_H 253