1 /* 2 * Copyright (c) 2022-2023 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_EVENT_HUB_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_EVENT_HUB_H 18 19 #include <list> 20 #include <utility> 21 22 #include "base/memory/ace_type.h" 23 #include "base/memory/referenced.h" 24 #include "base/utils/noncopyable.h" 25 #include "core/components_ng/event/focus_hub.h" 26 #include "core/components_ng/event/gesture_event_hub.h" 27 #include "core/components_ng/event/input_event_hub.h" 28 #include "core/components_ng/event/state_style_manager.h" 29 30 namespace OHOS::Ace::NG { 31 32 class FrameNode; 33 using OnAreaChangedFunc = 34 std::function<void(const RectF& oldRect, const OffsetF& oldOrigin, const RectF& rect, const OffsetF& origin)>; 35 36 struct KeyboardShortcut { 37 std::string value; 38 uint8_t keys = 0; 39 std::function<void()> onKeyboardShortcutAction = nullptr; 40 }; 41 42 enum class DragFuncType { 43 DRAG_ENTER, 44 DRAG_LEAVE, 45 DRAG_MOVE, 46 DRAG_DROP, 47 DRAG_END, 48 }; 49 50 // The event hub is mainly used to handle common collections of events, such as gesture events, mouse events, etc. 51 class EventHub : public virtual AceType { 52 DECLARE_ACE_TYPE(EventHub, AceType) 53 54 public: 55 EventHub() = default; ~EventHub()56 ~EventHub() override 57 { 58 keyboardShortcut_.clear(); 59 }; 60 GetOrCreateGestureEventHub()61 const RefPtr<GestureEventHub>& GetOrCreateGestureEventHub() 62 { 63 if (!gestureEventHub_) { 64 gestureEventHub_ = CreateGestureEventHub(); 65 } 66 return gestureEventHub_; 67 } 68 CreateGestureEventHub()69 virtual RefPtr<GestureEventHub> CreateGestureEventHub() 70 { 71 return MakeRefPtr<GestureEventHub>(WeakClaim(this)); 72 } 73 GetGestureEventHub()74 const RefPtr<GestureEventHub>& GetGestureEventHub() const 75 { 76 return gestureEventHub_; 77 } 78 SetGestureEventHub(const RefPtr<GestureEventHub> & gestureEventHub)79 void SetGestureEventHub(const RefPtr<GestureEventHub>& gestureEventHub) 80 { 81 gestureEventHub_ = gestureEventHub; 82 } 83 GetOrCreateInputEventHub()84 const RefPtr<InputEventHub>& GetOrCreateInputEventHub() 85 { 86 if (!inputEventHub_) { 87 inputEventHub_ = MakeRefPtr<InputEventHub>(WeakClaim(this)); 88 } 89 return inputEventHub_; 90 } 91 GetInputEventHub()92 const RefPtr<InputEventHub>& GetInputEventHub() const 93 { 94 return inputEventHub_; 95 } 96 97 const RefPtr<FocusHub>& GetOrCreateFocusHub(FocusType type = FocusType::DISABLE, bool focusable = false, 98 FocusStyleType focusStyleType = FocusStyleType::NONE, 99 const std::unique_ptr<FocusPaintParam>& paintParamsPtr = nullptr) 100 { 101 if (!focusHub_) { 102 focusHub_ = MakeRefPtr<FocusHub>(WeakClaim(this), type, focusable); 103 focusHub_->SetFocusStyleType(focusStyleType); 104 if (paintParamsPtr) { 105 focusHub_->SetFocusPaintParamsPtr(paintParamsPtr); 106 } 107 } 108 return focusHub_; 109 } 110 GetOrCreateFocusHub(const FocusPattern & focusPattern)111 const RefPtr<FocusHub>& GetOrCreateFocusHub(const FocusPattern& focusPattern) 112 { 113 if (!focusHub_) { 114 focusHub_ = MakeRefPtr<FocusHub>(WeakClaim(this), focusPattern); 115 } 116 return focusHub_; 117 } 118 GetFocusHub()119 const RefPtr<FocusHub>& GetFocusHub() const 120 { 121 return focusHub_; 122 } 123 124 void AttachHost(const WeakPtr<FrameNode>& host); 125 126 RefPtr<FrameNode> GetFrameNode() const; 127 128 GetEventTargetImpl CreateGetEventTargetImpl() const; 129 OnContextAttached()130 void OnContextAttached() 131 { 132 if (gestureEventHub_) { 133 gestureEventHub_->OnContextAttached(); 134 } 135 } 136 ClearUserOnAppear()137 void ClearUserOnAppear() 138 { 139 if (onAppear_) { 140 onAppear_ = nullptr; 141 } 142 } 143 SetOnAppear(std::function<void ()> && onAppear)144 void SetOnAppear(std::function<void()>&& onAppear) 145 { 146 onAppear_ = std::move(onAppear); 147 } 148 FireOnAppear()149 void FireOnAppear() 150 { 151 if (onAppear_) { 152 auto pipeline = PipelineBase::GetCurrentContext(); 153 CHECK_NULL_VOID(pipeline); 154 auto taskScheduler = pipeline->GetTaskExecutor(); 155 CHECK_NULL_VOID(taskScheduler); 156 taskScheduler->PostTask( 157 [weak = WeakClaim(this)]() { 158 auto eventHub = weak.Upgrade(); 159 CHECK_NULL_VOID(eventHub); 160 if (eventHub->onAppear_) { 161 // callback may be overwritten in its invoke so we copy it first 162 auto onAppear = eventHub->onAppear_; 163 onAppear(); 164 } 165 }, 166 TaskExecutor::TaskType::UI); 167 } 168 } 169 ClearUserOnDisAppear()170 void ClearUserOnDisAppear() 171 { 172 if (onDisappear_) { 173 onDisappear_ = nullptr; 174 } 175 } 176 SetOnDisappear(std::function<void ()> && onDisappear)177 void SetOnDisappear(std::function<void()>&& onDisappear) 178 { 179 onDisappear_ = std::move(onDisappear); 180 } 181 FireOnDisappear()182 virtual void FireOnDisappear() 183 { 184 if (onDisappear_) { 185 // callback may be overwritten in its invoke so we copy it first 186 auto onDisappear = onDisappear_; 187 onDisappear(); 188 } 189 } 190 ClearUserOnAreaChanged()191 void ClearUserOnAreaChanged() 192 { 193 if (onAreaChanged_) { 194 onAreaChanged_ = nullptr; 195 } 196 } 197 SetOnAreaChanged(OnAreaChangedFunc && onAreaChanged)198 void SetOnAreaChanged(OnAreaChangedFunc&& onAreaChanged) 199 { 200 onAreaChanged_ = std::move(onAreaChanged); 201 } 202 FireOnAreaChanged(const RectF & oldRect,const OffsetF & oldOrigin,const RectF & rect,const OffsetF & origin)203 void FireOnAreaChanged(const RectF& oldRect, const OffsetF& oldOrigin, const RectF& rect, const OffsetF& origin) 204 { 205 if (onAreaChanged_) { 206 // callback may be overwritten in its invoke so we copy it first 207 auto onAreaChanged = onAreaChanged_; 208 onAreaChanged(oldRect, oldOrigin, rect, origin); 209 } 210 } 211 FireInnerOnAreaChanged(const RectF & oldRect,const OffsetF & oldOrigin,const RectF & rect,const OffsetF & origin)212 void FireInnerOnAreaChanged( 213 const RectF& oldRect, const OffsetF& oldOrigin, const RectF& rect, const OffsetF& origin) 214 { 215 for (auto& innerCallbackInfo : onAreaChangedInnerCallbacks_) { 216 if (innerCallbackInfo.second) { 217 auto innerOnAreaCallback = innerCallbackInfo.second; 218 innerOnAreaCallback(oldRect, oldOrigin, rect, origin); 219 } 220 } 221 } 222 HasOnAreaChanged()223 bool HasOnAreaChanged() const 224 { 225 return static_cast<bool>(onAreaChanged_); 226 } 227 HasInnerOnAreaChanged()228 bool HasInnerOnAreaChanged() const 229 { 230 return !onAreaChangedInnerCallbacks_.empty(); 231 } 232 233 using OnDragFunc = std::function<void(const RefPtr<OHOS::Ace::DragEvent>&, const std::string&)>; 234 using OnNewDragFunc = std::function<void(const RefPtr<OHOS::Ace::DragEvent>&)>; 235 using OnDragStartFunc = std::function<DragDropInfo(const RefPtr<OHOS::Ace::DragEvent>&, const std::string&)>; SetOnDragStart(OnDragStartFunc && onDragStart)236 void SetOnDragStart(OnDragStartFunc&& onDragStart) 237 { 238 onDragStart_ = std::move(onDragStart); 239 } 240 GetOnDragStart()241 const OnDragStartFunc& GetOnDragStart() const 242 { 243 return onDragStart_; 244 } 245 HasOnDragStart()246 bool HasOnDragStart() const 247 { 248 return static_cast<bool>(onDragStart_); 249 } 250 SetOnDragEnter(OnDragFunc && onDragEnter)251 void SetOnDragEnter(OnDragFunc&& onDragEnter) 252 { 253 onDragEnter_ = std::move(onDragEnter); 254 } 255 FireOnDragEnter(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)256 void FireOnDragEnter(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams) 257 { 258 if (SystemProperties::GetDebugEnabled()) { 259 LOGI("DragDropManager fire onDragEnter"); 260 } 261 if (onDragEnter_) { 262 // callback may be overwritten in its invoke so we copy it first 263 auto onDragEnter = onDragEnter_; 264 onDragEnter(info, extraParams); 265 } 266 } 267 SetOnDragLeave(OnDragFunc && onDragLeave)268 void SetOnDragLeave(OnDragFunc&& onDragLeave) 269 { 270 onDragLeave_ = std::move(onDragLeave); 271 } 272 FireOnDragLeave(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)273 void FireOnDragLeave(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams) 274 { 275 if (SystemProperties::GetDebugEnabled()) { 276 LOGI("DragDropManager fire onDragLeave"); 277 } 278 if (onDragLeave_) { 279 // callback may be overwritten in its invoke so we copy it first 280 auto onDragLeave = onDragLeave_; 281 onDragLeave(info, extraParams); 282 } 283 } 284 SetOnDragMove(OnDragFunc && onDragMove)285 void SetOnDragMove(OnDragFunc&& onDragMove) 286 { 287 onDragMove_ = std::move(onDragMove); 288 } 289 FireOnDragMove(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)290 void FireOnDragMove(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams) 291 { 292 if (SystemProperties::GetDebugEnabled()) { 293 LOGI("DragDropManager fire onDragMove"); 294 } 295 if (onDragMove_) { 296 // callback may be overwritten in its invoke so we copy it first 297 auto onDragMove = onDragMove_; 298 onDragMove(info, extraParams); 299 } 300 } 301 HasOnDragMove()302 bool HasOnDragMove() const 303 { 304 return static_cast<bool>(onDragMove_); 305 } 306 SetOnDrop(OnDragFunc && onDrop)307 void SetOnDrop(OnDragFunc&& onDrop) 308 { 309 onDrop_ = std::move(onDrop); 310 } 311 SetOnDragEnd(OnNewDragFunc && onDragEnd)312 void SetOnDragEnd(OnNewDragFunc&& onDragEnd) 313 { 314 onDragEnd_ = std::move(onDragEnd); 315 } 316 GetOnDragEnd()317 const OnNewDragFunc& GetOnDragEnd() const 318 { 319 return onDragEnd_; 320 } 321 HasOnDragEnd()322 bool HasOnDragEnd() const 323 { 324 return static_cast<bool>(onDragEnd_); 325 } 326 HasOnItemDragMove()327 virtual bool HasOnItemDragMove() 328 { 329 return false; 330 } 331 HasOnItemDrop()332 virtual bool HasOnItemDrop() 333 { 334 return false; 335 } 336 FireOnDrop(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)337 void FireOnDrop(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams) 338 { 339 if (SystemProperties::GetDebugEnabled()) { 340 LOGI("DragDropManager fire onDrop"); 341 } 342 if (onDrop_) { 343 // callback may be overwritten in its invoke so we copy it first 344 auto onDrop = onDrop_; 345 onDrop(info, extraParams); 346 } 347 } 348 HasOnDrop()349 bool HasOnDrop() const 350 { 351 return onDrop_ != nullptr; 352 } 353 HasCustomerOnDrop()354 bool HasCustomerOnDrop() const 355 { 356 return customerOnDrop_ != nullptr; 357 } 358 GetDragExtraParams(const std::string & extraInfo,const Point & point,DragEventType isStart)359 virtual std::string GetDragExtraParams(const std::string& extraInfo, const Point& point, DragEventType isStart) 360 { 361 auto json = JsonUtil::Create(true); 362 if (!extraInfo.empty()) { 363 json->Put("extraInfo", extraInfo.c_str()); 364 } 365 return json->ToString(); 366 } 367 IsEnabled()368 bool IsEnabled() const 369 { 370 return enabled_; 371 } 372 IsDeveloperEnabled()373 bool IsDeveloperEnabled() const 374 { 375 return developerEnabled_; 376 } 377 SetEnabled(bool enabled)378 void SetEnabled(bool enabled) 379 { 380 enabled_ = enabled; 381 developerEnabled_ = enabled; 382 } 383 SetEnabledInternal(bool enabled)384 void SetEnabledInternal(bool enabled) 385 { 386 enabled_ = enabled; 387 } 388 389 // restore enabled value to what developer sets RestoreEnabled()390 void RestoreEnabled() 391 { 392 enabled_ = developerEnabled_; 393 } 394 395 // get XTS inspector value ToJsonValue(std::unique_ptr<JsonValue> & json)396 virtual void ToJsonValue(std::unique_ptr<JsonValue>& json) const {} 397 FromJson(const std::unique_ptr<JsonValue> & json)398 virtual void FromJson(const std::unique_ptr<JsonValue>& json) {} 399 400 void MarkModifyDone(); 401 402 void SetCurrentUIState(UIState state, bool flag); 403 UpdateCurrentUIState(UIState state)404 void UpdateCurrentUIState(UIState state) 405 { 406 if (stateStyleMgr_) { 407 stateStyleMgr_->UpdateCurrentUIState(state); 408 } 409 } 410 ResetCurrentUIState(UIState state)411 void ResetCurrentUIState(UIState state) 412 { 413 if (stateStyleMgr_) { 414 stateStyleMgr_->ResetCurrentUIState(state); 415 } 416 } 417 GetCurrentUIState()418 UIState GetCurrentUIState() const 419 { 420 return stateStyleMgr_ ? stateStyleMgr_->GetCurrentUIState() : UI_STATE_NORMAL; 421 } 422 HasStateStyle(UIState state)423 bool HasStateStyle(UIState state) const 424 { 425 if (stateStyleMgr_) { 426 return stateStyleMgr_->HasStateStyle(state); 427 } 428 return false; 429 } 430 431 void AddSupportedState(UIState state); 432 433 void SetSupportedStates(UIState state); 434 435 bool IsCurrentStateOn(UIState state); 436 SetKeyboardShortcut(const std::string & value,uint8_t keys,const std::function<void ()> & onKeyboardShortcutAction)437 void SetKeyboardShortcut( 438 const std::string& value, uint8_t keys, const std::function<void()>& onKeyboardShortcutAction) 439 { 440 if (value.empty() && keys == 0) { 441 if (keyboardShortcut_.size() == 1) { 442 keyboardShortcut_.clear(); 443 } 444 return; 445 } 446 KeyboardShortcut keyboardShortcut; 447 for (auto&& ch : value) { 448 keyboardShortcut.value.push_back(static_cast<char>(std::toupper(ch))); 449 } 450 keyboardShortcut.keys = keys; 451 keyboardShortcut.onKeyboardShortcutAction = onKeyboardShortcutAction; 452 keyboardShortcut_.emplace_back(keyboardShortcut); 453 } 454 GetKeyboardShortcut()455 std::vector<KeyboardShortcut>& GetKeyboardShortcut() 456 { 457 return keyboardShortcut_; 458 } 459 460 void SetCustomerOnDragFunc(DragFuncType dragFuncType, OnDragFunc&& onDragFunc); 461 462 void SetCustomerOnDragFunc(DragFuncType dragFuncType, OnNewDragFunc&& onDragEnd); 463 GetCustomerOnDragFunc(DragFuncType dragFuncType)464 const OnDragFunc GetCustomerOnDragFunc(DragFuncType dragFuncType) const 465 { 466 OnDragFunc dragFunc; 467 switch (dragFuncType) { 468 case DragFuncType::DRAG_ENTER: 469 dragFunc = customerOnDragEnter_; 470 break; 471 case DragFuncType::DRAG_LEAVE: 472 dragFunc = customerOnDragLeave_; 473 break; 474 case DragFuncType::DRAG_MOVE: 475 dragFunc = customerOnDragMove_; 476 break; 477 case DragFuncType::DRAG_DROP: 478 dragFunc = customerOnDrop_; 479 break; 480 default: 481 LOGW("unsuport dragFuncType"); 482 break; 483 } 484 return dragFunc; 485 } 486 GetCustomerOnDragEndFunc()487 const OnNewDragFunc& GetCustomerOnDragEndFunc() const 488 { 489 return customerOnDragEnd_; 490 } 491 ClearCustomerOnDragFunc()492 void ClearCustomerOnDragFunc() 493 { 494 onDragStart_ = nullptr; 495 customerOnDragEnter_ = nullptr; 496 customerOnDragLeave_ = nullptr; 497 customerOnDragMove_ = nullptr; 498 customerOnDrop_ = nullptr; 499 customerOnDragEnd_ = nullptr; 500 } 501 502 void FireCustomerOnDragFunc(DragFuncType dragFuncType, const RefPtr<OHOS::Ace::DragEvent>& info, 503 const std::string& extraParams = ""); 504 505 bool IsFireOnDrop(const RefPtr<OHOS::Ace::DragEvent>& info); 506 507 void HandleInternalOnDrop(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams); 508 509 void PostEnabledTask(); 510 511 void AddInnerOnAreaChangedCallback(int32_t id, OnAreaChangedFunc&& callback); 512 ClearOnAreaChangedInnerCallbacks()513 void ClearOnAreaChangedInnerCallbacks() 514 { 515 onAreaChangedInnerCallbacks_.clear(); 516 } 517 518 protected: OnModifyDone()519 virtual void OnModifyDone() {} 520 521 private: 522 WeakPtr<FrameNode> host_; 523 RefPtr<GestureEventHub> gestureEventHub_; 524 RefPtr<InputEventHub> inputEventHub_; 525 RefPtr<FocusHub> focusHub_; 526 RefPtr<StateStyleManager> stateStyleMgr_; 527 528 std::function<void()> onAppear_; 529 std::function<void()> onDisappear_; 530 OnAreaChangedFunc onAreaChanged_; 531 std::unordered_map<int32_t, OnAreaChangedFunc> onAreaChangedInnerCallbacks_; 532 533 OnDragStartFunc onDragStart_; 534 OnDragFunc onDragEnter_; 535 OnDragFunc onDragLeave_; 536 OnDragFunc onDragMove_; 537 OnDragFunc onDrop_; 538 OnNewDragFunc onDragEnd_; 539 540 OnDragFunc customerOnDragEnter_; 541 OnDragFunc customerOnDragLeave_; 542 OnDragFunc customerOnDragMove_; 543 OnDragFunc customerOnDrop_; 544 OnNewDragFunc customerOnDragEnd_; 545 546 bool enabled_ { true }; 547 bool developerEnabled_ { true }; 548 std::vector<KeyboardShortcut> keyboardShortcut_; 549 550 ACE_DISALLOW_COPY_AND_MOVE(EventHub); 551 }; 552 553 class TextCommonEvent : public BaseEventInfo { DECLARE_RELATIONSHIP_OF_CLASSES(TextCommonEvent,BaseEventInfo)554 DECLARE_RELATIONSHIP_OF_CLASSES(TextCommonEvent, BaseEventInfo) 555 public: 556 TextCommonEvent() : BaseEventInfo("TextCommonEvent") {} 557 ~TextCommonEvent() override = default; 558 }; 559 560 } // namespace OHOS::Ace::NG 561 562 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_EVENT_EVENT_HUB_H 563