1 /* 2 * Copyright (c) 2021-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_EVENT_FOCUS_HUB_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_FOCUS_HUB_H 18 19 #include "base/memory/ace_type.h" 20 #include "core/components_ng/base/geometry_node.h" 21 #include "core/components_ng/event/touch_event.h" 22 #include "core/event/key_event.h" 23 #include "core/gestures/gesture_event.h" 24 25 namespace OHOS::Ace::NG { 26 27 class FrameNode; 28 class FocusHub; 29 class EventHub; 30 31 using TabIndexNodeList = std::list<std::pair<int32_t, WeakPtr<FocusHub>>>; 32 constexpr int32_t DEFAULT_TAB_FOCUSED_INDEX = -2; 33 constexpr int32_t NONE_TAB_FOCUSED_INDEX = -1; 34 constexpr int32_t MASK_FOCUS_STEP_FORWARD = 0x10; 35 constexpr int32_t MASK_FOCUS_STEP_TAB = 0x5; 36 37 enum class FocusType : int32_t { 38 DISABLE = 0, 39 NODE = 1, 40 SCOPE = 2, 41 }; 42 enum class FocusNodeType : int32_t { 43 DEFAULT = 0, 44 GROUP_DEFAULT = 1, 45 }; 46 enum class ScopeType : int32_t { 47 OTHERS = 0, 48 FLEX = 1, 49 PROJECT_AREA = 2, 50 }; 51 enum class FocusStep : int32_t { 52 NONE = 0x0, 53 LEFT = 0x1, 54 UP = 0x2, 55 RIGHT = 0x11, 56 DOWN = 0x12, 57 LEFT_END = 0x3, 58 UP_END = 0x4, 59 RIGHT_END = 0X13, 60 DOWN_END = 0x14, 61 SHIFT_TAB = 0x5, 62 TAB = 0x15, 63 }; 64 65 using GetNextFocusNodeFunc = std::function<void(FocusStep, const WeakPtr<FocusHub>&, WeakPtr<FocusHub>&)>; 66 67 enum class FocusStyleType : int32_t { 68 NONE = -1, 69 INNER_BORDER = 0, 70 OUTER_BORDER = 1, 71 CUSTOM_BORDER = 2, 72 CUSTOM_REGION = 3, 73 }; 74 75 enum class OnKeyEventType : int32_t { 76 DEFAULT = 0, 77 CONTEXT_MENU = 1, 78 }; 79 80 enum class FocusDependence : int32_t { 81 CHILD = 0, 82 SELF = 1, 83 AUTO = 2, 84 }; 85 86 class ACE_EXPORT FocusPaintParam : public virtual AceType { 87 DECLARE_ACE_TYPE(FocusPaintParam, AceType) 88 89 public: 90 FocusPaintParam() = default; 91 ~FocusPaintParam() override = default; 92 HasPaintRect()93 bool HasPaintRect() const 94 { 95 return paintRect.has_value(); 96 } GetPaintRect()97 const RoundRect& GetPaintRect() const 98 { 99 return paintRect.value(); 100 } 101 HasPaintColor()102 bool HasPaintColor() const 103 { 104 return paintColor.has_value(); 105 } GetPaintColor()106 const Color& GetPaintColor() const 107 { 108 return paintColor.value(); 109 } 110 HasPaintWidth()111 bool HasPaintWidth() const 112 { 113 return paintWidth.has_value(); 114 } GetPaintWidth()115 const Dimension& GetPaintWidth() const 116 { 117 return paintWidth.value(); 118 } 119 HasFocusPadding()120 bool HasFocusPadding() const 121 { 122 return focusPadding.has_value(); 123 } GetFocusPadding()124 const Dimension& GetFocusPadding() const 125 { 126 return focusPadding.value(); 127 } SetPaintRect(const RoundRect & rect)128 void SetPaintRect(const RoundRect& rect) 129 { 130 paintRect = rect; 131 } SetPaintColor(const Color & color)132 void SetPaintColor(const Color& color) 133 { 134 paintColor = color; 135 } SetPaintWidth(const Dimension & width)136 void SetPaintWidth(const Dimension& width) 137 { 138 paintWidth = width; 139 } SetFocusPadding(const Dimension & padding)140 void SetFocusPadding(const Dimension& padding) 141 { 142 focusPadding = padding; 143 } 144 145 private: 146 std::optional<RoundRect> paintRect; 147 std::optional<Color> paintColor; 148 std::optional<Dimension> paintWidth; 149 std::optional<Dimension> focusPadding; 150 }; 151 152 class ACE_EXPORT FocusPattern : public virtual AceType { 153 DECLARE_ACE_TYPE(FocusPattern, AceType) 154 155 public: 156 FocusPattern() = default; FocusPattern(FocusType focusType,bool focusable)157 FocusPattern(FocusType focusType, bool focusable) : focusType_(focusType), focusable_(focusable) {} FocusPattern(FocusType focusType,bool focusable,FocusStyleType styleType)158 FocusPattern(FocusType focusType, bool focusable, FocusStyleType styleType) 159 : focusType_(focusType), focusable_(focusable), styleType_(styleType) 160 {} FocusPattern(FocusType focusType,bool focusable,FocusStyleType styleType,const FocusPaintParam & paintParams)161 FocusPattern(FocusType focusType, bool focusable, FocusStyleType styleType, const FocusPaintParam& paintParams) 162 : focusType_(focusType), focusable_(focusable), styleType_(styleType) 163 { 164 if (!paintParams_) { 165 paintParams_ = std::make_unique<FocusPaintParam>(); 166 } 167 if (paintParams.HasPaintRect()) { 168 paintParams_->SetPaintRect(paintParams.GetPaintRect()); 169 } 170 if (paintParams.HasPaintColor()) { 171 paintParams_->SetPaintColor(paintParams.GetPaintColor()); 172 } 173 if (paintParams.HasPaintWidth()) { 174 paintParams_->SetPaintWidth(paintParams.GetPaintWidth()); 175 } 176 if (paintParams.HasFocusPadding()) { 177 paintParams_->SetFocusPadding(paintParams.GetFocusPadding()); 178 } 179 } FocusPattern(const FocusPattern & focusPattern)180 FocusPattern(const FocusPattern& focusPattern) 181 { 182 focusType_ = focusPattern.GetFocusType(); 183 focusable_ = focusPattern.GetFocusable(); 184 styleType_ = focusPattern.GetStyleType(); 185 if (focusPattern.GetFocusPaintParams()) { 186 SetFocusPaintParams(*focusPattern.GetFocusPaintParams()); 187 } 188 isFocusActiveWhenFocused_ = focusPattern.GetIsFocusActiveWhenFocused(); 189 } 190 ~FocusPattern() override = default; 191 GetFocusType()192 FocusType GetFocusType() const 193 { 194 return focusType_; 195 } SetFocusType(FocusType type)196 void SetFocusType(FocusType type) 197 { 198 focusType_ = type; 199 } 200 GetFocusable()201 bool GetFocusable() const 202 { 203 return focusable_; 204 } SetFocusable(bool focusable)205 void SetFocusable(bool focusable) 206 { 207 focusable_ = focusable; 208 } 209 GetStyleType()210 FocusStyleType GetStyleType() const 211 { 212 return styleType_; 213 } SetStyleType(FocusStyleType styleType)214 void SetStyleType(FocusStyleType styleType) 215 { 216 styleType_ = styleType; 217 } 218 GetFocusPaintParams()219 const std::unique_ptr<FocusPaintParam>& GetFocusPaintParams() const 220 { 221 return paintParams_; 222 } SetFocusPaintParams(const FocusPaintParam & paintParams)223 void SetFocusPaintParams(const FocusPaintParam& paintParams) 224 { 225 if (!paintParams_) { 226 paintParams_ = std::make_unique<FocusPaintParam>(); 227 } 228 if (paintParams.HasPaintRect()) { 229 paintParams_->SetPaintRect(paintParams.GetPaintRect()); 230 } 231 if (paintParams.HasPaintColor()) { 232 paintParams_->SetPaintColor(paintParams.GetPaintColor()); 233 } 234 if (paintParams.HasPaintWidth()) { 235 paintParams_->SetPaintWidth(paintParams.GetPaintWidth()); 236 } 237 if (paintParams.HasFocusPadding()) { 238 paintParams_->SetFocusPadding(paintParams.GetFocusPadding()); 239 } 240 } 241 GetIsFocusActiveWhenFocused()242 bool GetIsFocusActiveWhenFocused() const 243 { 244 return isFocusActiveWhenFocused_; 245 } SetIsFocusActiveWhenFocused(bool value)246 void SetIsFocusActiveWhenFocused(bool value) 247 { 248 isFocusActiveWhenFocused_ = value; 249 } 250 251 private: 252 FocusType focusType_ = FocusType::DISABLE; 253 bool focusable_ = false; 254 FocusStyleType styleType_ = FocusStyleType::OUTER_BORDER; 255 std::unique_ptr<FocusPaintParam> paintParams_ = nullptr; 256 bool isFocusActiveWhenFocused_ = false; 257 }; 258 259 struct ScopeFocusAlgorithm final { 260 ScopeFocusAlgorithm() = default; ScopeFocusAlgorithmfinal261 ScopeFocusAlgorithm(bool isVertical, bool isLeftToRight, ScopeType scopeType) 262 : isVertical(isVertical), isLeftToRight(isLeftToRight), scopeType(scopeType) 263 {} ScopeFocusAlgorithmfinal264 ScopeFocusAlgorithm(bool isVertical, bool isLeftToRight, ScopeType scopeType, GetNextFocusNodeFunc&& function) 265 : isVertical(isVertical), isLeftToRight(isLeftToRight), scopeType(scopeType), 266 getNextFocusNode(std::move(function)) 267 {} 268 ~ScopeFocusAlgorithm() = default; 269 270 bool isVertical { true }; 271 bool isLeftToRight { true }; 272 ScopeType scopeType { ScopeType::OTHERS }; 273 GetNextFocusNodeFunc getNextFocusNode; 274 }; 275 276 class ACE_EXPORT FocusCallbackEvents : public virtual AceType { 277 DECLARE_ACE_TYPE(FocusCallbackEvents, AceType) 278 public: 279 FocusCallbackEvents() = default; 280 ~FocusCallbackEvents() override = default; 281 ClearOnFocusCallback()282 void ClearOnFocusCallback() 283 { 284 if (onFocusCallback_) { 285 onFocusCallback_ = nullptr; 286 } 287 } 288 SetOnFocusCallback(OnFocusFunc && onFocusCallback)289 void SetOnFocusCallback(OnFocusFunc&& onFocusCallback) 290 { 291 onFocusCallback_ = std::move(onFocusCallback); 292 } 293 GetOnFocusCallback()294 const OnFocusFunc& GetOnFocusCallback() 295 { 296 return onFocusCallback_; 297 } 298 ClearOnBlurCallback()299 void ClearOnBlurCallback() 300 { 301 if (onBlurCallback_) { 302 onBlurCallback_ = nullptr; 303 } 304 } 305 SetOnBlurCallback(OnBlurFunc && onBlurCallback)306 void SetOnBlurCallback(OnBlurFunc&& onBlurCallback) 307 { 308 onBlurCallback_ = std::move(onBlurCallback); 309 } 310 GetOnBlurCallback()311 const OnBlurFunc& GetOnBlurCallback() 312 { 313 return onBlurCallback_; 314 } 315 SetOnKeyEventCallback(OnKeyCallbackFunc && onKeyEventCallback)316 void SetOnKeyEventCallback(OnKeyCallbackFunc&& onKeyEventCallback) 317 { 318 onKeyEventCallback_ = std::move(onKeyEventCallback); 319 } 320 ClearOnKeyEventCallback()321 void ClearOnKeyEventCallback() 322 { 323 if (onKeyEventCallback_) { 324 onKeyEventCallback_ = nullptr; 325 } 326 } 327 GetOnKeyEventCallback()328 const OnKeyCallbackFunc& GetOnKeyEventCallback() 329 { 330 return onKeyEventCallback_; 331 } 332 SetOnClickCallback(GestureEventFunc && onClickEventCallback)333 void SetOnClickCallback(GestureEventFunc&& onClickEventCallback) 334 { 335 onClickEventCallback_ = std::move(onClickEventCallback); 336 } 337 GetOnClickCallback()338 const GestureEventFunc& GetOnClickCallback() 339 { 340 return onClickEventCallback_; 341 } 342 GetTabIndex()343 int32_t GetTabIndex() const 344 { 345 return tabIndex_; 346 } 347 SetTabIndex(int32_t tabIndex)348 void SetTabIndex(int32_t tabIndex) 349 { 350 tabIndex_ = tabIndex; 351 } 352 IsDefaultFocus()353 bool IsDefaultFocus() const 354 { 355 return isDefaultFocus_; 356 } 357 SetIsDefaultFocus(bool isDefaultFocus)358 void SetIsDefaultFocus(bool isDefaultFocus) 359 { 360 isDefaultFocus_ = isDefaultFocus; 361 } 362 IsDefaultGroupFocus()363 bool IsDefaultGroupFocus() const 364 { 365 return isDefaultGroupFocus_; 366 } 367 SetIsDefaultGroupFocus(bool isDefaultGroupFocus)368 void SetIsDefaultGroupFocus(bool isDefaultGroupFocus) 369 { 370 isDefaultGroupFocus_ = isDefaultGroupFocus; 371 } 372 GetDefaultFocusNode()373 WeakPtr<FocusHub> GetDefaultFocusNode() const 374 { 375 return defaultFocusNode_; 376 } 377 SetDefaultFocusNode(const WeakPtr<FocusHub> & node)378 void SetDefaultFocusNode(const WeakPtr<FocusHub>& node) 379 { 380 defaultFocusNode_ = node; 381 } 382 IsFocusOnTouch()383 std::optional<bool> IsFocusOnTouch() const 384 { 385 return isFocusOnTouch_; 386 } 387 SetIsFocusOnTouch(bool isFocusOnTouch)388 void SetIsFocusOnTouch(bool isFocusOnTouch) 389 { 390 isFocusOnTouch_ = isFocusOnTouch; 391 } 392 SetIsDefaultHasFocused(bool isDefaultHasFocused)393 void SetIsDefaultHasFocused(bool isDefaultHasFocused) 394 { 395 isDefaultHasFocused_ = isDefaultHasFocused; 396 } 397 IsDefaultHasFocused()398 bool IsDefaultHasFocused() const 399 { 400 return isDefaultHasFocused_; 401 } 402 SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused)403 void SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused) 404 { 405 isDefaultGroupHasFocused_ = isDefaultGroupHasFocused; 406 } 407 IsDefaultGroupHasFocused()408 bool IsDefaultGroupHasFocused() const 409 { 410 return isDefaultGroupHasFocused_; 411 } 412 413 private: 414 OnFocusFunc onFocusCallback_; 415 OnBlurFunc onBlurCallback_; 416 OnKeyCallbackFunc onKeyEventCallback_; 417 GestureEventFunc onClickEventCallback_; 418 419 WeakPtr<FocusHub> defaultFocusNode_; 420 421 std::optional<bool> isFocusOnTouch_; 422 bool isDefaultFocus_ = { false }; 423 bool isDefaultHasFocused_ = { false }; 424 bool isDefaultGroupFocus_ = { false }; 425 bool isDefaultGroupHasFocused_ { false }; 426 427 int32_t tabIndex_ = 0; 428 }; 429 430 class ACE_EXPORT FocusHub : public virtual AceType { DECLARE_ACE_TYPE(FocusHub,AceType)431 DECLARE_ACE_TYPE(FocusHub, AceType) 432 public: 433 explicit FocusHub(const WeakPtr<EventHub>& eventHub, FocusType type = FocusType::DISABLE, bool focusable = false) 434 : eventHub_(eventHub), focusable_(focusable), focusType_(type) 435 {} FocusHub(const WeakPtr<EventHub> & eventHub,const FocusPattern & focusPattern)436 explicit FocusHub(const WeakPtr<EventHub>& eventHub, const FocusPattern& focusPattern) 437 { 438 eventHub_ = eventHub; 439 focusable_ = focusPattern.GetFocusable(); 440 focusType_ = focusPattern.GetFocusType(); 441 focusStyleType_ = focusPattern.GetStyleType(); 442 if (focusPattern.GetFocusPaintParams()) { 443 SetFocusPaintParamsPtr(focusPattern.GetFocusPaintParams()); 444 } 445 isFocusActiveWhenFocused_ = focusPattern.GetIsFocusActiveWhenFocused(); 446 } 447 ~FocusHub() override = default; 448 SetFocusStyleType(FocusStyleType type)449 void SetFocusStyleType(FocusStyleType type) 450 { 451 focusStyleType_ = type; 452 } GetFocusStyleType()453 FocusStyleType GetFocusStyleType() const 454 { 455 return focusStyleType_; 456 } 457 458 static void CloseKeyboard(); 459 460 static void IsCloseKeyboard(RefPtr<FrameNode> frameNode); 461 462 static void PushPageCloseKeyboard(); 463 464 static void NavCloseKeyboard(); 465 GetBlurReason()466 BlurReason GetBlurReason() const 467 { 468 return blurReason_; 469 } 470 SetFocusPaintParamsPtr(const std::unique_ptr<FocusPaintParam> & paramsPtr)471 void SetFocusPaintParamsPtr(const std::unique_ptr<FocusPaintParam>& paramsPtr) 472 { 473 CHECK_NULL_VOID(paramsPtr); 474 if (!focusPaintParamsPtr_) { 475 focusPaintParamsPtr_ = std::make_unique<FocusPaintParam>(); 476 } 477 if (paramsPtr->HasPaintRect()) { 478 focusPaintParamsPtr_->SetPaintRect(paramsPtr->GetPaintRect()); 479 } 480 if (paramsPtr->HasPaintColor()) { 481 focusPaintParamsPtr_->SetPaintColor(paramsPtr->GetPaintColor()); 482 } 483 if (paramsPtr->HasPaintWidth()) { 484 focusPaintParamsPtr_->SetPaintWidth(paramsPtr->GetPaintWidth()); 485 } 486 if (paramsPtr->HasFocusPadding()) { 487 focusPaintParamsPtr_->SetFocusPadding(paramsPtr->GetFocusPadding()); 488 } 489 } 490 HasPaintRect()491 bool HasPaintRect() const 492 { 493 return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasPaintRect() : false; 494 } GetPaintRect()495 RoundRect GetPaintRect() const 496 { 497 CHECK_NULL_RETURN(focusPaintParamsPtr_, RoundRect()); 498 return focusPaintParamsPtr_->GetPaintRect(); 499 } 500 HasPaintColor()501 bool HasPaintColor() const 502 { 503 return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasPaintColor() : false; 504 } GetPaintColor()505 const Color& GetPaintColor() const 506 { 507 CHECK_NULL_RETURN(focusPaintParamsPtr_, Color::TRANSPARENT); 508 return focusPaintParamsPtr_->GetPaintColor(); 509 } 510 HasPaintWidth()511 bool HasPaintWidth() const 512 { 513 return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasPaintWidth() : false; 514 } GetPaintWidth()515 Dimension GetPaintWidth() const 516 { 517 CHECK_NULL_RETURN(focusPaintParamsPtr_, Dimension()); 518 return focusPaintParamsPtr_->GetPaintWidth(); 519 } 520 HasFocusPadding()521 bool HasFocusPadding() const 522 { 523 return focusPaintParamsPtr_ ? focusPaintParamsPtr_->HasFocusPadding() : false; 524 } 525 HasBackwardFocusMovement()526 bool HasBackwardFocusMovement() const 527 { 528 return hasBackwardMovement_; 529 } 530 HasForwardFocusMovement()531 bool HasForwardFocusMovement() const 532 { 533 return hasForwardMovement_; 534 } 535 ClearFocusMovementFlags()536 void ClearFocusMovementFlags() 537 { 538 hasBackwardMovement_ = false; 539 hasForwardMovement_ = false; 540 } 541 542 bool HasBackwardFocusMovementInChildren(); 543 bool HasForwardFocusMovementInChildren(); 544 void ClearFocusMovementFlagsInChildren(); 545 GetFocusPadding()546 Dimension GetFocusPadding() const 547 { 548 CHECK_NULL_RETURN(focusPaintParamsPtr_, Dimension()); 549 return focusPaintParamsPtr_->GetFocusPadding(); 550 } SetPaintRect(const RoundRect & rect)551 void SetPaintRect(const RoundRect& rect) 552 { 553 if (!focusPaintParamsPtr_) { 554 focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>(); 555 } 556 focusPaintParamsPtr_->SetPaintRect(rect); 557 } SetPaintColor(const Color & color)558 void SetPaintColor(const Color& color) 559 { 560 if (!focusPaintParamsPtr_) { 561 focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>(); 562 } 563 focusPaintParamsPtr_->SetPaintColor(color); 564 } SetPaintWidth(const Dimension & width)565 void SetPaintWidth(const Dimension& width) 566 { 567 if (!focusPaintParamsPtr_) { 568 focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>(); 569 } 570 focusPaintParamsPtr_->SetPaintWidth(width); 571 } SetFocusPadding(const Dimension & padding)572 void SetFocusPadding(const Dimension& padding) 573 { 574 if (!focusPaintParamsPtr_) { 575 focusPaintParamsPtr_ = std::unique_ptr<FocusPaintParam>(); 576 } 577 focusPaintParamsPtr_->SetFocusPadding(padding); 578 } 579 580 RefPtr<FrameNode> GetFrameNode() const; 581 RefPtr<GeometryNode> GetGeometryNode() const; 582 RefPtr<FocusHub> GetParentFocusHub() const; 583 RefPtr<FocusHub> GetRootFocusHub(); 584 std::string GetFrameName() const; 585 int32_t GetFrameId() const; 586 587 bool HandleKeyEvent(const KeyEvent& keyEvent); 588 bool RequestFocusImmediately(bool isJudgeRootTree = false); 589 void RequestFocus() const; 590 void RequestFocusWithDefaultFocusFirstly(); 591 void UpdateAccessibilityFocusInfo(); 592 void SwitchFocus(const RefPtr<FocusHub>& focusNode); 593 594 RefPtr<FocusHub> GetChildMainView(); 595 RefPtr<FocusHub> GetMainViewRootScope(); 596 597 static RefPtr<FocusHub> GetCurrentMainView(); 598 static void LostFocusToViewRoot(); 599 600 bool HandleFocusOnMainView(); 601 void LostFocus(BlurReason reason = BlurReason::FOCUS_SWITCH); 602 void LostSelfFocus(); 603 void RemoveSelf(BlurReason reason = BlurReason::FRAME_DESTROY); 604 void RemoveChild(const RefPtr<FocusHub>& focusNode, BlurReason reason = BlurReason::FRAME_DESTROY); 605 bool GoToNextFocusLinear(FocusStep step, const RectF& rect = RectF()); 606 bool TryRequestFocus(const RefPtr<FocusHub>& focusNode, const RectF& rect, FocusStep step = FocusStep::NONE); 607 608 void CollectTabIndexNodes(TabIndexNodeList& tabIndexNodes); 609 bool GoToFocusByTabNodeIdx(TabIndexNodeList& tabIndexNodes, int32_t tabNodeIdx); 610 bool HandleFocusByTabIndex(const KeyEvent& event); 611 RefPtr<FocusHub> GetChildFocusNodeByType(FocusNodeType nodeType = FocusNodeType::DEFAULT); 612 RefPtr<FocusHub> GetChildFocusNodeById(const std::string& id); 613 void HandleParentScroll() const; 614 int32_t GetFocusingTabNodeIdx(TabIndexNodeList& tabIndexNodes) const; 615 bool RequestFocusImmediatelyById(const std::string& id); 616 617 bool IsFocusableByTab(); 618 bool IsFocusableNodeByTab(); 619 bool IsFocusableScopeByTab(); 620 621 bool IsFocusableWholePath(); 622 bool IsOnRootTree() const; 623 624 bool IsFocusable(); 625 bool IsFocusableNode(); 626 bool IsFocusableScope(); 627 IsParentFocusable()628 bool IsParentFocusable() const 629 { 630 return parentFocusable_; 631 } 632 void SetParentFocusable(bool parentFocusable); 633 634 void RefreshFocus(); 635 636 void SetFocusable(bool focusable, bool isExplicit = true); 637 void SetShow(bool show); 638 void SetEnabled(bool enabled); 639 640 bool IsShow() const; 641 642 bool IsEnabled() const; 643 IsCurrentFocus()644 bool IsCurrentFocus() const 645 { 646 return currentFocus_; 647 } 648 bool IsCurrentFocusWholePath(); 649 ClearUserOnFocus()650 void ClearUserOnFocus() 651 { 652 if (focusCallbackEvents_) { 653 focusCallbackEvents_->ClearOnFocusCallback(); 654 } 655 } 656 SetOnFocusCallback(OnFocusFunc && onFocusCallback)657 void SetOnFocusCallback(OnFocusFunc&& onFocusCallback) 658 { 659 if (!focusCallbackEvents_) { 660 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 661 } 662 focusCallbackEvents_->SetOnFocusCallback(std::move(onFocusCallback)); 663 } GetOnFocusCallback()664 OnFocusFunc GetOnFocusCallback() 665 { 666 return focusCallbackEvents_ ? focusCallbackEvents_->GetOnFocusCallback() : nullptr; 667 } 668 ClearUserOnBlur()669 void ClearUserOnBlur() 670 { 671 if (focusCallbackEvents_) { 672 focusCallbackEvents_->ClearOnBlurCallback(); 673 } 674 } 675 SetOnBlurCallback(OnBlurFunc && onBlurCallback)676 void SetOnBlurCallback(OnBlurFunc&& onBlurCallback) 677 { 678 if (!focusCallbackEvents_) { 679 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 680 } 681 focusCallbackEvents_->SetOnBlurCallback(std::move(onBlurCallback)); 682 } 683 GetOnBlurCallback()684 OnBlurFunc GetOnBlurCallback() 685 { 686 return focusCallbackEvents_ ? focusCallbackEvents_->GetOnBlurCallback() : nullptr; 687 } 688 SetOnKeyCallback(OnKeyCallbackFunc && onKeyCallback)689 void SetOnKeyCallback(OnKeyCallbackFunc&& onKeyCallback) 690 { 691 if (!focusCallbackEvents_) { 692 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 693 } 694 focusCallbackEvents_->SetOnKeyEventCallback(std::move(onKeyCallback)); 695 } 696 ClearUserOnKey()697 void ClearUserOnKey() 698 { 699 if (focusCallbackEvents_) { 700 focusCallbackEvents_->ClearOnKeyEventCallback(); 701 } 702 } 703 GetOnKeyCallback()704 OnKeyCallbackFunc GetOnKeyCallback() 705 { 706 return focusCallbackEvents_ ? focusCallbackEvents_->GetOnKeyEventCallback() : nullptr; 707 } 708 SetOnClickCallback(GestureEventFunc && onClickCallback)709 void SetOnClickCallback(GestureEventFunc&& onClickCallback) 710 { 711 if (!focusCallbackEvents_) { 712 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 713 } 714 focusCallbackEvents_->SetOnClickCallback(std::move(onClickCallback)); 715 } GetOnClickCallback()716 GestureEventFunc GetOnClickCallback() 717 { 718 return focusCallbackEvents_ ? focusCallbackEvents_->GetOnClickCallback() : nullptr; 719 } 720 SetOnFocusInternal(OnFocusFunc && onFocusInternal)721 void SetOnFocusInternal(OnFocusFunc&& onFocusInternal) 722 { 723 onFocusInternal_ = std::move(onFocusInternal); 724 } SetOnBlurInternal(OnBlurFunc && onBlurInternal)725 void SetOnBlurInternal(OnBlurFunc&& onBlurInternal) 726 { 727 onBlurInternal_ = std::move(onBlurInternal); 728 } SetOnBlurReasonInternal(OnBlurReasonFunc && onBlurReasonInternal)729 void SetOnBlurReasonInternal(OnBlurReasonFunc&& onBlurReasonInternal) 730 { 731 onBlurReasonInternal_ = std::move(onBlurReasonInternal); 732 } SetOnPreFocusCallback(OnPreFocusFunc && onPreFocusCallback)733 void SetOnPreFocusCallback(OnPreFocusFunc&& onPreFocusCallback) 734 { 735 onPreFocusCallback_ = std::move(onPreFocusCallback); 736 } 737 SetOnClearFocusStateInternal(OnClearFocusStateFunc && onClearFocusCallback)738 void SetOnClearFocusStateInternal(OnClearFocusStateFunc&& onClearFocusCallback) 739 { 740 onClearFocusStateCallback_ = std::move(onClearFocusCallback); 741 } 742 SetOnPaintFocusStateInternal(OnPaintFocusStateFunc && onPaintFocusCallback)743 void SetOnPaintFocusStateInternal(OnPaintFocusStateFunc&& onPaintFocusCallback) 744 { 745 onPaintFocusStateCallback_ = std::move(onPaintFocusCallback); 746 } 747 748 void SetOnKeyEventInternal(OnKeyEventFunc&& onKeyEvent, OnKeyEventType type = OnKeyEventType::DEFAULT) 749 { 750 onKeyEventsInternal_[type] = std::move(onKeyEvent); 751 } 752 FindContextMenuOnKeyEvent(OnKeyEventType type)753 bool FindContextMenuOnKeyEvent(OnKeyEventType type) 754 { 755 return (onKeyEventsInternal_.find(type) != onKeyEventsInternal_.end()); 756 } 757 ProcessOnKeyEventInternal(const KeyEvent & event)758 bool ProcessOnKeyEventInternal(const KeyEvent& event) 759 { 760 bool result = false; 761 for (const auto& onKeyEvent : onKeyEventsInternal_) { 762 auto callback = onKeyEvent.second; 763 if (callback && callback(event)) { 764 result = true; 765 } 766 } 767 return result; 768 } 769 770 std::list<RefPtr<FocusHub>>::iterator FlushChildrenFocusHub(std::list<RefPtr<FocusHub>>& focusNodes); 771 GetChildren()772 std::list<RefPtr<FocusHub>> GetChildren() 773 { 774 std::list<RefPtr<FocusHub>> focusNodes; 775 FlushChildrenFocusHub(focusNodes); 776 return focusNodes; 777 } 778 IsChild()779 bool IsChild() const 780 { 781 return focusType_ == FocusType::NODE; 782 } 783 SetRect(const RectF & rect)784 void SetRect(const RectF& rect) 785 { 786 rectFromOrigin_ = rect; 787 } GetRect()788 const RectF& GetRect() const 789 { 790 return rectFromOrigin_; 791 } 792 793 void DumpFocusTree(int32_t depth); 794 void DumpFocusNodeTree(int32_t depth); 795 void DumpFocusScopeTree(int32_t depth); 796 797 bool OnClick(const KeyEvent& event); 798 SetFocusType(FocusType type)799 void SetFocusType(FocusType type) 800 { 801 if (focusType_ != type && type == FocusType::DISABLE) { 802 RemoveSelf(BlurReason::FOCUS_SWITCH); 803 } 804 focusType_ = type; 805 } GetFocusType()806 FocusType GetFocusType() const 807 { 808 return focusType_; 809 } 810 GetTabIndex()811 int32_t GetTabIndex() const 812 { 813 return focusCallbackEvents_ ? focusCallbackEvents_->GetTabIndex() : 0; 814 } SetTabIndex(int32_t tabIndex)815 void SetTabIndex(int32_t tabIndex) 816 { 817 if (!focusCallbackEvents_) { 818 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 819 } 820 focusCallbackEvents_->SetTabIndex(tabIndex); 821 } 822 IsDefaultFocus()823 bool IsDefaultFocus() const 824 { 825 return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultFocus() : false; 826 } 827 void SetIsDefaultFocus(bool isDefaultFocus); 828 IsDefaultGroupFocus()829 bool IsDefaultGroupFocus() const 830 { 831 return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultGroupFocus() : false; 832 } 833 void SetIsDefaultGroupFocus(bool isDefaultGroupFocus); 834 GetDefaultFocusNode()835 WeakPtr<FocusHub> GetDefaultFocusNode() const 836 { 837 return focusCallbackEvents_ ? focusCallbackEvents_->GetDefaultFocusNode() : nullptr; 838 } SetDefaultFocusNode(const WeakPtr<FocusHub> & node)839 void SetDefaultFocusNode(const WeakPtr<FocusHub>& node) 840 { 841 if (!focusCallbackEvents_) { 842 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 843 } 844 focusCallbackEvents_->SetDefaultFocusNode(node); 845 } 846 IsFocusOnTouch()847 std::optional<bool> IsFocusOnTouch() const 848 { 849 return focusCallbackEvents_ ? focusCallbackEvents_->IsFocusOnTouch() : std::nullopt; 850 } 851 void SetIsFocusOnTouch(bool isFocusOnTouch); 852 SetIsDefaultHasFocused(bool isDefaultHasFocused)853 void SetIsDefaultHasFocused(bool isDefaultHasFocused) 854 { 855 if (!focusCallbackEvents_) { 856 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 857 } 858 focusCallbackEvents_->SetIsDefaultHasFocused(isDefaultHasFocused); 859 } IsDefaultHasFocused()860 bool IsDefaultHasFocused() const 861 { 862 return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultHasFocused() : false; 863 } 864 SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused)865 void SetIsDefaultGroupHasFocused(bool isDefaultGroupHasFocused) 866 { 867 if (!focusCallbackEvents_) { 868 focusCallbackEvents_ = MakeRefPtr<FocusCallbackEvents>(); 869 } 870 focusCallbackEvents_->SetIsDefaultGroupHasFocused(isDefaultGroupHasFocused); 871 } 872 IsDefaultGroupHasFocused()873 bool IsDefaultGroupHasFocused() const 874 { 875 return focusCallbackEvents_ ? focusCallbackEvents_->IsDefaultGroupHasFocused() : false; 876 } 877 SetIsViewRootScopeFocused(const RefPtr<FocusHub> & viewRootScope,bool isViewRootScopeFocused)878 void SetIsViewRootScopeFocused(const RefPtr<FocusHub>& viewRootScope, bool isViewRootScopeFocused) 879 { 880 isViewRootScopeFocused_ = isViewRootScopeFocused; 881 if (viewRootScope) { 882 viewRootScope->SetFocusDependence(isViewRootScopeFocused ? FocusDependence::SELF : FocusDependence::AUTO); 883 } 884 } GetIsViewRootScopeFocused()885 bool GetIsViewRootScopeFocused() const 886 { 887 return isViewRootScopeFocused_; 888 } 889 IsImplicitFocusableScope()890 bool IsImplicitFocusableScope() const 891 { 892 return (focusType_ == FocusType::SCOPE) && focusable_ && implicitFocusable_; 893 } 894 895 std::optional<std::string> GetInspectorKey() const; 896 897 bool PaintFocusState(bool isNeedStateStyles = true, bool forceUpdate = false); 898 bool PaintAllFocusState(); 899 bool PaintInnerFocusState(const RoundRect& paintRect, bool forceUpdate = false); 900 void ClearFocusState(bool isNeedStateStyles = true); 901 void ClearAllFocusState(); 902 SetInnerFocusPaintRectCallback(const std::function<void (RoundRect &)> & callback)903 void SetInnerFocusPaintRectCallback(const std::function<void(RoundRect&)>& callback) 904 { 905 getInnerFocusRectFunc_ = callback; 906 } 907 SetLastWeakFocusNode(const WeakPtr<FocusHub> & focusHub)908 void SetLastWeakFocusNode(const WeakPtr<FocusHub>& focusHub) 909 { 910 lastWeakFocusNode_ = focusHub; 911 } GetLastWeakFocusNode()912 WeakPtr<FocusHub> GetLastWeakFocusNode() const 913 { 914 return lastWeakFocusNode_; 915 } 916 SetIsFocusUnit(bool isFocusUnit)917 void SetIsFocusUnit(bool isFocusUnit) 918 { 919 isFocusUnit_ = isFocusUnit; 920 } 921 GetFocusDependence()922 FocusDependence GetFocusDependence() const 923 { 924 return focusDepend_; 925 } SetFocusDependence(FocusDependence focusDepend)926 void SetFocusDependence(FocusDependence focusDepend) 927 { 928 focusDepend_ = focusDepend; 929 } 930 SetIsViewHasFocused(bool isViewHasFocused)931 void SetIsViewHasFocused(bool isViewHasFocused) 932 { 933 isViewHasFocused_ = isViewHasFocused; 934 } GetIsViewHasFocused()935 bool GetIsViewHasFocused() const 936 { 937 return isViewHasFocused_; 938 } 939 GetFocusableCount()940 size_t GetFocusableCount() 941 { 942 size_t count = 0; 943 auto children = GetChildren(); 944 for (const auto& child : children) { 945 if (child->IsFocusable()) { 946 count++; 947 } 948 } 949 return count; 950 } 951 SetIsFocusActiveWhenFocused(bool value)952 void SetIsFocusActiveWhenFocused(bool value) 953 { 954 isFocusActiveWhenFocused_ = value; 955 } GetIsFocusActiveWhenFocused()956 bool GetIsFocusActiveWhenFocused() const 957 { 958 return isFocusActiveWhenFocused_; 959 } 960 IsFocusStepVertical(FocusStep step)961 static inline bool IsFocusStepVertical(FocusStep step) 962 { 963 return (static_cast<uint32_t>(step) & 0x1) == 0; 964 } 965 IsFocusStepForward(FocusStep step)966 static inline bool IsFocusStepForward(FocusStep step) 967 { 968 return (static_cast<uint32_t>(step) & MASK_FOCUS_STEP_FORWARD) != 0; 969 } 970 IsFocusStepTab(FocusStep step)971 static inline bool IsFocusStepTab(FocusStep step) 972 { 973 return (static_cast<uint32_t>(step) & MASK_FOCUS_STEP_TAB) == MASK_FOCUS_STEP_TAB; 974 } 975 976 static double GetProjectAreaOnRect(const RectF& rect, const RectF& projectRect, FocusStep step); 977 978 protected: 979 bool OnKeyEvent(const KeyEvent& keyEvent); 980 bool OnKeyEventNode(const KeyEvent& keyEvent); 981 bool OnKeyEventScope(const KeyEvent& keyEvent); 982 983 bool AcceptFocusOfSpecifyChild(FocusStep step); 984 bool AcceptFocusOfLastFocus(); 985 bool AcceptFocusByRectOfLastFocus(const RectF& rect); 986 bool AcceptFocusByRectOfLastFocusNode(const RectF& rect); 987 bool AcceptFocusByRectOfLastFocusScope(const RectF& rect); 988 bool AcceptFocusByRectOfLastFocusFlex(const RectF& rect); 989 990 bool CalculateRect(const RefPtr<FocusHub>& childNode, RectF& rect) const; 991 bool RequestNextFocus(FocusStep moveStep, const RectF& rect); 992 bool FocusToHeadOrTailChild(bool isHead); 993 994 void OnFocus(); 995 void OnFocusNode(); 996 void OnFocusScope(bool currentHasFocused = false); 997 void OnBlur(); 998 void OnBlurNode(); 999 void OnBlurScope(); 1000 HandleFocus()1001 void HandleFocus() 1002 { 1003 // Need update: void RenderNode::MoveWhenOutOfViewPort(bool hasEffect) 1004 OnFocus(); 1005 } 1006 1007 private: 1008 bool CalculatePosition(); 1009 1010 void SetScopeFocusAlgorithm(); 1011 1012 void SetLastFocusNodeIndex(const RefPtr<FocusHub>& focusNode); 1013 1014 void ScrollToLastFocusIndex() const; 1015 1016 void CheckFocusStateStyle(bool onFocus); 1017 bool HasFocusStateStyle(); 1018 1019 bool IsNeedPaintFocusState(); 1020 1021 RefPtr<FocusHub> GetNearestNodeByProjectArea(const std::list<RefPtr<FocusHub>>& allNodes, FocusStep step); 1022 1023 OnFocusFunc onFocusInternal_; 1024 OnBlurFunc onBlurInternal_; 1025 OnBlurReasonFunc onBlurReasonInternal_; 1026 std::unordered_map<OnKeyEventType, OnKeyEventFunc> onKeyEventsInternal_; 1027 OnPreFocusFunc onPreFocusCallback_; 1028 OnClearFocusStateFunc onClearFocusStateCallback_; 1029 OnPaintFocusStateFunc onPaintFocusStateCallback_; 1030 1031 RefPtr<FocusCallbackEvents> focusCallbackEvents_; 1032 1033 RefPtr<TouchEventImpl> focusOnTouchListener_; 1034 1035 WeakPtr<EventHub> eventHub_; 1036 1037 WeakPtr<FocusHub> lastWeakFocusNode_ { nullptr }; 1038 int32_t lastFocusNodeIndex_ { -1 }; 1039 int32_t lastTabIndexNodeId_ { DEFAULT_TAB_FOCUSED_INDEX }; 1040 1041 bool focusable_ { true }; 1042 bool isFocusableExplicit_ { false }; 1043 bool implicitFocusable_ { false }; 1044 bool parentFocusable_ { true }; 1045 bool currentFocus_ { false }; 1046 bool isFocusUnit_ { false }; 1047 bool isViewRootScopeFocused_ { true }; 1048 bool isViewHasFocused_ { false }; 1049 bool hasForwardMovement_ { false }; 1050 bool hasBackwardMovement_ { false }; 1051 bool isFocusActiveWhenFocused_ { false }; 1052 1053 FocusType focusType_ = FocusType::DISABLE; 1054 FocusStyleType focusStyleType_ = FocusStyleType::NONE; 1055 std::unique_ptr<FocusPaintParam> focusPaintParamsPtr_; 1056 std::function<void(RoundRect&)> getInnerFocusRectFunc_; 1057 1058 RectF rectFromOrigin_; 1059 ScopeFocusAlgorithm focusAlgorithm_; 1060 BlurReason blurReason_ = BlurReason::FOCUS_SWITCH; 1061 FocusDependence focusDepend_ = FocusDependence::CHILD; 1062 }; 1063 } // namespace OHOS::Ace::NG 1064 1065 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_FOCUS_HUB_H 1066