• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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