1 /* 2 * Copyright (c) 2025 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_PATTERN_WEB_SELECT_OVERLAY_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_WEB_SELECT_OVERLAY_H 18 19 #include <optional> 20 21 #include "base/geometry/ng/rect_t.h" 22 #include "base/memory/ace_type.h" 23 #include "base/memory/referenced.h" 24 #include "core/components_ng/pattern/text/base_text_select_overlay.h" 25 #include "core/components_ng/pattern/text/text_base.h" 26 27 namespace OHOS::Ace { 28 class WebDelegateObserver; 29 } 30 31 namespace OHOS::NWeb { 32 class NWebQuickMenuParams; 33 class NWebQuickMenuCallback; 34 class NWebTouchHandleState; 35 class NWebCursorInfo; 36 class NWebSelectPopupMenuParam; 37 class NWebDateTimeChooser; 38 class NWebDateTimeSuggestion; 39 class NWebSelectPopupMenuCallback; 40 class NWebDateTimeChooserCallback; 41 class NWebAccessibilityNodeInfo; 42 class NWebMessage; 43 class NWebKeyEvent; 44 class NWebSelectMenuBound; 45 enum class CursorType; 46 } 47 48 namespace OHOS::Ace::NG { 49 50 class TransitionalNodeInfo; 51 52 namespace { 53 struct TouchHandleState { 54 int32_t id = -1; 55 int32_t x = -1; 56 int32_t y = -1; 57 int32_t edge_height = 0; 58 }; 59 60 enum WebOverlayType { INSERT_OVERLAY, SELECTION_OVERLAY, INVALID_OVERLAY }; 61 } 62 63 class WebSelectOverlay : public BaseTextSelectOverlay { 64 DECLARE_ACE_TYPE(WebSelectOverlay, BaseTextSelectOverlay); 65 66 public: WebSelectOverlay(const WeakPtr<TextBase> & textBase)67 explicit WebSelectOverlay(const WeakPtr<TextBase> &textBase) : BaseTextSelectOverlay(textBase) 68 {} 69 ~WebSelectOverlay() = default; 70 71 // Web Handle Menu Entry 72 bool RunQuickMenu(std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params, 73 std::shared_ptr<OHOS::NWeb::NWebQuickMenuCallback> callback); 74 // Chromium kernel notifies handle position change 75 void OnTouchSelectionChanged(std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> insertHandle, 76 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startSelectionHandle, 77 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endSelectionHandle); 78 void RegisterSelectOverlayEvent(SelectOverlayInfo& selectInfo); 79 void UpdateSelectHandleInfo(); 80 bool IsSelectHandleReverse(); 81 // Check whether the handle status is valid. 82 WebOverlayType GetTouchHandleOverlayType( 83 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> insertHandle, 84 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startSelectionHandle, 85 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endSelectionHandle); 86 bool IsTouchHandleValid(std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> handle); 87 void RegisterSelectOverLayOnClose(SelectOverlayInfo& selectInfo); 88 void CheckHandles(SelectHandleInfo& handleInfo, const std::shared_ptr<OHOS::NWeb::NWebTouchHandleState>& handle); 89 RectF ComputeTouchHandleRect(std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> touchHandle); 90 void SetMenuOptions(SelectOverlayInfo& selectInfo, 91 std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params, 92 std::shared_ptr<OHOS::NWeb::NWebQuickMenuCallback> callback); 93 void StartListenSelectOverlayParentScroll(const RefPtr<FrameNode>& host); 94 void RegisterSelectOverlayParentScrollCallback(int32_t parentId, int32_t callbackId); 95 void HideHandleAndQuickMenuIfNecessary(bool hide, bool isScroll = false); 96 void OnParentScrollStartOrEndCallback(bool isEnd); 97 void StopListenSelectOverlayParentScroll(const RefPtr<FrameNode>& host); 98 RectF ComputeMouseClippedSelectionBounds(int32_t x, int32_t y, int32_t w, int32_t h); 99 void UpdateRunQuickMenuSelectInfo(SelectOverlayInfo& selectInfo, 100 std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params, 101 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> insertTouchHandle, 102 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> beginTouchHandle, 103 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endTouchHandle); 104 RectF ComputeClippedSelectionBounds( 105 std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params, 106 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startHandle, 107 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endHandle, 108 bool& isNewAvoid); 109 void QuickMenuIsNeedNewAvoid( 110 SelectOverlayInfo& selectInfo, 111 std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> params, 112 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startHandle, 113 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endHandle); 114 void HideMagnifier(); 115 void UpdateTouchHandleForOverlay(bool fromOverlay = false); 116 void OnMagnifierHandleMove(const RectF& handleRect, bool isFirst); 117 RectF ChangeHandleHeight(const GestureEvent& event, bool isFirst); 118 void OnSelectHandleStart(const GestureEvent& event, bool isFirst); 119 void SelectCancel(); 120 void UpdateClippedSelectionBounds(int32_t x, int32_t y, int32_t w, int32_t h); 121 void ChangeVisibilityOfQuickMenu(); IsShowHandle()122 bool IsShowHandle() { return isShowHandle_; } 123 124 // override BaseTextSelectOverlay 125 bool PreProcessOverlay(const OverlayRequest& request) override; 126 bool CheckHandleVisible(const RectF& paintRect) override; OnResetTextSelection()127 void OnResetTextSelection() override {} 128 void AfterCloseOverlay() override; AllowTranslate()129 bool AllowTranslate() override { return true; } 130 // override BaseTextSelectOverlay end 131 132 // override SelectOverlayHolder 133 void OnUpdateSelectOverlayInfo(SelectOverlayInfo& selectInfo, int32_t requestCode) override; 134 std::optional<SelectHandleInfo> GetFirstHandleInfo() override; 135 std::optional<SelectHandleInfo> GetSecondHandleInfo() override; 136 void OnUpdateMenuInfo(SelectMenuInfo& menuInfo, SelectOverlayDirtyFlag dirtyFlag) override; 137 RectF GetSelectArea() override; 138 std::string GetSelectedText() override; 139 // override SelectOverlayHolder end 140 141 // override SelectOverlayCallback 142 void OnMenuItemAction(OptionMenuActionId id, OptionMenuType type) override; 143 void OnHandleMove(const RectF& rect, bool isFirst) override; 144 void OnHandleMoveStart(const GestureEvent& event, bool isFirst) override; 145 void OnHandleMoveDone(const RectF& rect, bool isFirst) override; 146 void OnCloseOverlay(OptionMenuType menuType, CloseReason reason, RefPtr<OverlayInfo> info = nullptr) override; 147 void OnHandleGlobalTouchEvent(SourceType sourceType, TouchType touchType, bool touchInside = true) override; 148 void OnOverlayClick(const GestureEvent& event, bool isClickCaret) override; 149 bool CheckTouchInHostNode(const PointF& touchPoint) override; 150 void OnHandleReverse(bool isReverse) override; 151 void OnHandleMarkInfoChange(const std::shared_ptr<SelectOverlayInfo> info, SelectOverlayDirtyFlag flag) override; 152 void OnAfterSelectOverlayShow(bool isCreated) override; 153 // override SelectOverlayCallback end 154 private: 155 bool isShowHandle_ = false; 156 bool needResetHandleReverse_ = false; 157 SelectOverlayInfo webSelectInfo_; 158 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> insertHandle_ = nullptr; 159 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> startSelectionHandle_ = nullptr; 160 std::shared_ptr<OHOS::NWeb::NWebTouchHandleState> endSelectionHandle_ = nullptr; 161 std::shared_ptr<OHOS::NWeb::NWebQuickMenuCallback> quickMenuCallback_ = nullptr; 162 bool selectOverlayDragging_ = false; 163 bool isCurrentStartHandleDragging_ = false; 164 bool selectTemporarilyHidden_ = false; 165 bool selectTemporarilyHiddenByScroll_ = false; 166 bool isQuickMenuMouseTrigger_ = false; 167 ScrollableParentInfo scrollableParentInfo_; 168 std::shared_ptr<OHOS::NWeb::NWebQuickMenuParams> dropParams_ = nullptr; 169 SelectMenuInfo selectMenuInfo_; 170 ACE_DISALLOW_COPY_AND_MOVE(WebSelectOverlay); 171 OnCreateMenuCallback onCreateMenuCallback_; 172 OnMenuItemClickCallback onMenuItemClick_; 173 }; 174 } // namespace OHOS::Ace::NG 175 176 #endif //FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_WEB_SELECT_OVERLAY_H 177