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 #include "core/components_ng/pattern/checkbox/checkbox_pattern.h"
17
18 #include "core/components/checkable/checkable_theme.h"
19 #include "core/components_ng/pattern/checkbox/checkbox_layout_algorithm.h"
20 #include "core/components_ng/pattern/checkbox/checkbox_paint_property.h"
21 #include "core/components_ng/pattern/checkboxgroup/checkboxgroup_paint_property.h"
22 #include "core/components_ng/pattern/checkboxgroup/checkboxgroup_pattern.h"
23 #include "core/components_ng/pattern/stage/page_event_hub.h"
24 #include "core/components_ng/property/calc_length.h"
25 #include "core/components_ng/property/property.h"
26 #include "core/components_v2/inspector/inspector_constants.h"
27 #include "core/event/touch_event.h"
28 #include "core/pipeline/base/constants.h"
29 #include "core/pipeline_ng/pipeline_context.h"
30
31 namespace OHOS::Ace::NG {
32
OnAttachToFrameNode()33 void CheckBoxPattern::OnAttachToFrameNode()
34 {
35 auto host = GetHost();
36 CHECK_NULL_VOID(host);
37 host->GetLayoutProperty()->UpdateAlignment(Alignment::CENTER);
38 }
39
OnModifyDone()40 void CheckBoxPattern::OnModifyDone()
41 {
42 UpdateState();
43 auto host = GetHost();
44 CHECK_NULL_VOID(host);
45 auto pipeline = host->GetContext();
46 CHECK_NULL_VOID(pipeline);
47 auto checkBoxTheme = pipeline->GetTheme<CheckboxTheme>();
48 CHECK_NULL_VOID(checkBoxTheme);
49 auto layoutProperty = host->GetLayoutProperty();
50 CHECK_NULL_VOID(layoutProperty);
51 if (!layoutProperty->GetMarginProperty()) {
52 MarginProperty margin;
53 margin.left = CalcLength(checkBoxTheme->GetHotZoneHorizontalPadding().Value());
54 margin.right = CalcLength(checkBoxTheme->GetHotZoneHorizontalPadding().Value());
55 margin.top = CalcLength(checkBoxTheme->GetHotZoneVerticalPadding().Value());
56 margin.bottom = CalcLength(checkBoxTheme->GetHotZoneVerticalPadding().Value());
57 layoutProperty->UpdateMargin(margin);
58 }
59 hotZoneHorizontalPadding_ = checkBoxTheme->GetHotZoneHorizontalPadding();
60 hotZoneVerticalPadding_ = checkBoxTheme->GetHotZoneVerticalPadding();
61 InitClickEvent();
62 InitTouchEvent();
63 InitMouseEvent();
64 auto focusHub = host->GetFocusHub();
65 CHECK_NULL_VOID(focusHub);
66 InitOnKeyEvent(focusHub);
67 }
68
InitClickEvent()69 void CheckBoxPattern::InitClickEvent()
70 {
71 if (clickListener_) {
72 return;
73 }
74 auto host = GetHost();
75 CHECK_NULL_VOID(host);
76 auto gesture = host->GetOrCreateGestureEventHub();
77 CHECK_NULL_VOID(gesture);
78 auto clickCallback = [weak = WeakClaim(this)](GestureEvent& info) {
79 auto checkboxPattern = weak.Upgrade();
80 CHECK_NULL_VOID(checkboxPattern);
81 checkboxPattern->OnClick();
82 };
83 clickListener_ = MakeRefPtr<ClickEvent>(std::move(clickCallback));
84 gesture->AddClickEvent(clickListener_);
85 }
86
InitTouchEvent()87 void CheckBoxPattern::InitTouchEvent()
88 {
89 if (touchListener_) {
90 return;
91 }
92 auto host = GetHost();
93 CHECK_NULL_VOID(host);
94 auto gesture = host->GetOrCreateGestureEventHub();
95 CHECK_NULL_VOID(gesture);
96 auto touchCallback = [weak = WeakClaim(this)](const TouchEventInfo& info) {
97 auto checkboxPattern = weak.Upgrade();
98 CHECK_NULL_VOID(checkboxPattern);
99 if (info.GetTouches().front().GetTouchType() == TouchType::DOWN) {
100 checkboxPattern->OnTouchDown();
101 }
102 if (info.GetTouches().front().GetTouchType() == TouchType::UP ||
103 info.GetTouches().front().GetTouchType() == TouchType::CANCEL) {
104 checkboxPattern->OnTouchUp();
105 }
106 };
107 touchListener_ = MakeRefPtr<TouchEventImpl>(std::move(touchCallback));
108 gesture->AddTouchEvent(touchListener_);
109 }
110
InitMouseEvent()111 void CheckBoxPattern::InitMouseEvent()
112 {
113 if (mouseEvent_) {
114 return;
115 }
116 auto host = GetHost();
117 CHECK_NULL_VOID(host);
118 auto gesture = host->GetOrCreateGestureEventHub();
119 CHECK_NULL_VOID(gesture);
120 auto eventHub = host->GetEventHub<CheckBoxEventHub>();
121 auto inputHub = eventHub->GetOrCreateInputEventHub();
122
123 auto mouseTask = [weak = WeakClaim(this)](bool isHover) {
124 auto pattern = weak.Upgrade();
125 if (pattern) {
126 pattern->HandleMouseEvent(isHover);
127 }
128 };
129 mouseEvent_ = MakeRefPtr<InputEvent>(std::move(mouseTask));
130 inputHub->AddOnHoverEvent(mouseEvent_);
131 }
132
HandleMouseEvent(bool isHover)133 void CheckBoxPattern::HandleMouseEvent(bool isHover)
134 {
135 isHover_ = isHover;
136 auto host = GetHost();
137 CHECK_NULL_VOID(host);
138 host->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
139 }
140
OnClick()141 void CheckBoxPattern::OnClick()
142 {
143 auto host = GetHost();
144 CHECK_NULL_VOID(host);
145 auto paintProperty = host->GetPaintProperty<CheckBoxPaintProperty>();
146 CHECK_NULL_VOID(paintProperty);
147 bool isSelected = false;
148 if (paintProperty->HasCheckBoxSelect()) {
149 isSelected = paintProperty->GetCheckBoxSelectValue();
150 } else {
151 isSelected = false;
152 }
153 paintProperty->UpdateCheckBoxSelect(!isSelected);
154 UpdateState();
155 }
156
OnTouchDown()157 void CheckBoxPattern::OnTouchDown()
158 {
159 auto host = GetHost();
160 CHECK_NULL_VOID(host);
161 isTouch_ = true;
162 host->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
163 }
164
OnTouchUp()165 void CheckBoxPattern::OnTouchUp()
166 {
167 auto host = GetHost();
168 CHECK_NULL_VOID(host);
169 isTouch_ = false;
170 host->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
171 }
172
UpdateUnSelect()173 void CheckBoxPattern::UpdateUnSelect()
174 {
175 auto host = GetHost();
176 CHECK_NULL_VOID(host);
177 auto paintProperty = host->GetPaintProperty<CheckBoxPaintProperty>();
178 CHECK_NULL_VOID(paintProperty);
179 if (paintProperty->HasCheckBoxSelect() && !paintProperty->GetCheckBoxSelectValue()) {
180 uiStatus_ = UIStatus::UNSELECTED;
181 host->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
182 }
183 }
184
UpdateUIStatus(bool check)185 void CheckBoxPattern::UpdateUIStatus(bool check)
186 {
187 uiStatus_ = check ? UIStatus::OFF_TO_ON : UIStatus::ON_TO_OFF;
188 auto host = GetHost();
189 CHECK_NULL_VOID(host);
190 host->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
191 }
192
OnDetachFromFrameNode(FrameNode * frameNode)193 void CheckBoxPattern::OnDetachFromFrameNode(FrameNode* frameNode)
194 {
195 CHECK_NULL_VOID(frameNode);
196 auto pipelineContext = PipelineContext::GetCurrentContext();
197 CHECK_NULL_VOID(pipelineContext);
198 auto stageManager = pipelineContext->GetStageManager();
199 CHECK_NULL_VOID(stageManager);
200 auto pageNode = stageManager->GetLastPage();
201 CHECK_NULL_VOID(pageNode);
202 auto pageEventHub = pageNode->GetEventHub<NG::PageEventHub>();
203 CHECK_NULL_VOID(pageEventHub);
204 auto checkBoxEventHub = frameNode->GetEventHub<NG::CheckBoxEventHub>();
205 CHECK_NULL_VOID(checkBoxEventHub);
206 pageEventHub->RemoveCheckBoxFromGroup(checkBoxEventHub->GetGroupName(), frameNode->GetId());
207 }
208
UpdateState()209 void CheckBoxPattern::UpdateState()
210 {
211 auto host = GetHost();
212 CHECK_NULL_VOID(host);
213 auto pattern = host->GetPattern<CheckBoxPattern>();
214 CHECK_NULL_VOID(pattern);
215 auto eventHub = host->GetEventHub<CheckBoxEventHub>();
216 CHECK_NULL_VOID(eventHub);
217 auto pipelineContext = PipelineContext::GetCurrentContext();
218 CHECK_NULL_VOID(pipelineContext);
219 auto stageManager = pipelineContext->GetStageManager();
220 CHECK_NULL_VOID(stageManager);
221 auto pageNode = stageManager->GetLastPage();
222 CHECK_NULL_VOID(pageNode);
223 auto pageEventHub = pageNode->GetEventHub<NG::PageEventHub>();
224 CHECK_NULL_VOID(pageEventHub);
225 auto paintProperty = host->GetPaintProperty<CheckBoxPaintProperty>();
226 CHECK_NULL_VOID(paintProperty);
227 auto checkBoxGroupMap = pageEventHub->GetCheckBoxGroupMap();
228 auto preGroup = pattern->GetPreGroup();
229 auto group = eventHub->GetGroupName();
230 if (!preGroup.has_value()) {
231 pageEventHub->AddCheckBoxToGroup(group, host->GetId());
232 auto callback = [weak = WeakClaim(this)]() {
233 auto checkbox = weak.Upgrade();
234 if (checkbox) {
235 checkbox->CheckBoxGroupIsTrue();
236 }
237 };
238 PipelineContext::GetCurrentContext()->AddBuildFinishCallBack(callback);
239 if (paintProperty->HasCheckBoxSelect()) {
240 auto isSelected = paintProperty->GetCheckBoxSelectValue();
241 SetLastSelect(isSelected);
242 }
243 isFirstCreated_ = false;
244 pattern->SetPreGroup(group);
245 return;
246 }
247 if (preGroup.has_value() && preGroup.value() != group) {
248 pageEventHub->RemoveCheckBoxFromGroup(preGroup.value(), host->GetId());
249 pageEventHub->AddCheckBoxToGroup(group, host->GetId());
250 }
251 pattern->SetPreGroup(group);
252 bool isSelected = false;
253 if (paintProperty->HasCheckBoxSelect()) {
254 isSelected = paintProperty->GetCheckBoxSelectValue();
255 if (lastSelect_ != isSelected) {
256 UpdateUIStatus(isSelected);
257 SetLastSelect(isSelected);
258 auto checkboxEventHub = GetEventHub<CheckBoxEventHub>();
259 CHECK_NULL_VOID(checkboxEventHub);
260 checkboxEventHub->UpdateChangeEvent(isSelected);
261 }
262 }
263 UpdateCheckBoxGroupStatus(host, checkBoxGroupMap, isSelected);
264 }
265
UpdateCheckBoxGroupStatus(const RefPtr<FrameNode> & checkBoxFrameNode,std::unordered_map<std::string,std::list<WeakPtr<FrameNode>>> & checkBoxGroupMap,bool select)266 void CheckBoxPattern::UpdateCheckBoxGroupStatus(const RefPtr<FrameNode>& checkBoxFrameNode,
267 std::unordered_map<std::string, std::list<WeakPtr<FrameNode>>>& checkBoxGroupMap, bool select)
268 {
269 checkBoxFrameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
270 auto checkBoxEventHub = checkBoxFrameNode->GetEventHub<CheckBoxEventHub>();
271 CHECK_NULL_VOID(checkBoxEventHub);
272 auto group = checkBoxEventHub->GetGroupName();
273 std::vector<std::string> vec;
274 RefPtr<FrameNode> checkBoxGroupNode;
275 bool isSameAsSelf = true;
276 const auto& list = checkBoxGroupMap[group];
277 for (auto&& item : list) {
278 auto node = item.Upgrade();
279 if (!node) {
280 continue;
281 }
282 if (node == checkBoxFrameNode) {
283 if (select) {
284 auto eventHub = node->GetEventHub<CheckBoxEventHub>();
285 CHECK_NULL_VOID(eventHub);
286 vec.push_back(eventHub->GetName());
287 }
288 continue;
289 }
290 if (node->GetTag() == V2::CHECKBOXGROUP_ETS_TAG) {
291 checkBoxGroupNode = node;
292 continue;
293 }
294 auto paintProperty = node->GetPaintProperty<CheckBoxPaintProperty>();
295 CHECK_NULL_VOID(paintProperty);
296 if (!paintProperty->HasCheckBoxSelect()) {
297 if (select) {
298 isSameAsSelf = false;
299 }
300 }
301 if (paintProperty->HasCheckBoxSelect() && paintProperty->GetCheckBoxSelectValue() != select) {
302 isSameAsSelf = false;
303 }
304 if (paintProperty->HasCheckBoxSelect() && paintProperty->GetCheckBoxSelectValue()) {
305 auto eventHub = node->GetEventHub<CheckBoxEventHub>();
306 CHECK_NULL_VOID(eventHub);
307 vec.push_back(eventHub->GetName());
308 }
309 }
310 CHECK_NULL_VOID(checkBoxGroupNode);
311 auto groupPaintProperty = checkBoxGroupNode->GetPaintProperty<CheckBoxGroupPaintProperty>();
312 CHECK_NULL_VOID(groupPaintProperty);
313 auto pattern = checkBoxGroupNode->GetPattern<CheckBoxGroupPattern>();
314 CHECK_NULL_VOID(pattern);
315 if (isSameAsSelf) {
316 if (select) {
317 groupPaintProperty->SetSelectStatus(CheckBoxGroupPaintProperty::SelectStatus::ALL);
318 pattern->UpdateUIStatus(select);
319 } else {
320 groupPaintProperty->SetSelectStatus(CheckBoxGroupPaintProperty::SelectStatus::NONE);
321 pattern->ResetUIStatus();
322 }
323 checkBoxGroupNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
324 } else {
325 auto checkBoxGroupStatus = groupPaintProperty->GetSelectStatus();
326 if (checkBoxGroupStatus == CheckBoxGroupPaintProperty::SelectStatus::ALL ||
327 checkBoxGroupStatus == CheckBoxGroupPaintProperty::SelectStatus::NONE) {
328 groupPaintProperty->SetSelectStatus(CheckBoxGroupPaintProperty::SelectStatus::PART);
329 checkBoxGroupNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
330 }
331 }
332
333 auto status = groupPaintProperty->GetSelectStatus();
334 CheckboxGroupResult groupResult(vec, int(status));
335 auto eventHub = checkBoxGroupNode->GetEventHub<CheckBoxGroupEventHub>();
336 CHECK_NULL_VOID(eventHub);
337 eventHub->UpdateChangeEvent(&groupResult);
338 }
339
CheckBoxGroupIsTrue()340 void CheckBoxPattern::CheckBoxGroupIsTrue()
341 {
342 auto checkBoxFrameNode = GetHost();
343 CHECK_NULL_VOID(checkBoxFrameNode);
344 auto pipelineContext = PipelineContext::GetCurrentContext();
345 CHECK_NULL_VOID(pipelineContext);
346 auto stageManager = pipelineContext->GetStageManager();
347 CHECK_NULL_VOID(stageManager);
348 auto pageNode = stageManager->GetLastPage();
349 CHECK_NULL_VOID(pageNode);
350 auto pageEventHub = pageNode->GetEventHub<NG::PageEventHub>();
351 CHECK_NULL_VOID(pageEventHub);
352 auto paintProperty = checkBoxFrameNode->GetPaintProperty<CheckBoxPaintProperty>();
353 CHECK_NULL_VOID(paintProperty);
354 auto checkBoxGroupMap = pageEventHub->GetCheckBoxGroupMap();
355 auto checkBoxEventHub = checkBoxFrameNode->GetEventHub<CheckBoxEventHub>();
356 CHECK_NULL_VOID(checkBoxEventHub);
357 auto group = checkBoxEventHub->GetGroupName();
358 std::vector<std::string> vec;
359 RefPtr<FrameNode> checkBoxGroupNode;
360 bool allSelectIsNull = true;
361 const auto& list = checkBoxGroupMap[group];
362 for (auto&& item : list) {
363 auto node = item.Upgrade();
364 if (!node) {
365 continue;
366 }
367 if (node->GetTag() == V2::CHECKBOXGROUP_ETS_TAG) {
368 checkBoxGroupNode = node;
369 continue;
370 }
371 auto paintProperty = node->GetPaintProperty<CheckBoxPaintProperty>();
372 CHECK_NULL_VOID(paintProperty);
373
374 if (paintProperty->HasCheckBoxSelect()) {
375 allSelectIsNull = false;
376 } else {
377 paintProperty->UpdateCheckBoxSelect(false);
378 }
379 }
380
381 CHECK_NULL_VOID_NOLOG(checkBoxGroupNode);
382 auto groupPaintProperty = checkBoxGroupNode->GetPaintProperty<CheckBoxGroupPaintProperty>();
383 if (groupPaintProperty->GetIsCheckBoxCallbackDealed()) {
384 return;
385 }
386 // All checkboxes do not set select status.
387 if (allSelectIsNull) {
388 if (groupPaintProperty->HasCheckBoxGroupSelect() && groupPaintProperty->GetCheckBoxGroupSelectValue()) {
389 groupPaintProperty->SetSelectStatus(CheckBoxGroupPaintProperty::SelectStatus::ALL);
390 groupPaintProperty->UpdateCheckBoxGroupSelect(true);
391 checkBoxGroupNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
392 for (auto&& item : list) {
393 auto node = item.Upgrade();
394 if (!node) {
395 continue;
396 }
397 if (node->GetTag() == V2::CHECKBOXGROUP_ETS_TAG) {
398 continue;
399 }
400 auto paintProperty = node->GetPaintProperty<CheckBoxPaintProperty>();
401 CHECK_NULL_VOID(paintProperty);
402 paintProperty->UpdateCheckBoxSelect(true);
403 auto checkBoxPattern = node->GetPattern<CheckBoxPattern>();
404 CHECK_NULL_VOID(checkBoxPattern);
405 checkBoxPattern->UpdateUIStatus(true);
406 checkBoxPattern->SetLastSelect(true);
407 }
408 }
409 }
410 // Some checkboxes set select status.
411 if (!allSelectIsNull) {
412 bool allIsSame = true;
413 bool selfSelect = paintProperty->GetCheckBoxSelectValue();
414 for (auto&& item : list) {
415 auto node = item.Upgrade();
416 if (node == checkBoxFrameNode) {
417 continue;
418 }
419 if (!node) {
420 continue;
421 }
422 if (node->GetTag() == V2::CHECKBOXGROUP_ETS_TAG) {
423 continue;
424 }
425 auto paintProperty = node->GetPaintProperty<CheckBoxPaintProperty>();
426 CHECK_NULL_VOID(paintProperty);
427 if (selfSelect != paintProperty->GetCheckBoxSelectValue()) {
428 allIsSame = false;
429 }
430 node->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
431 }
432 auto checkBoxGroupPattern = checkBoxGroupNode->GetPattern<CheckBoxGroupPattern>();
433 CHECK_NULL_VOID(checkBoxGroupPattern);
434 if (allIsSame && paintProperty->GetCheckBoxSelectValue()) {
435 groupPaintProperty->SetSelectStatus(CheckBoxGroupPaintProperty::SelectStatus::ALL);
436 checkBoxGroupPattern->UpdateUIStatus(true);
437 } else if (allIsSame && !paintProperty->GetCheckBoxSelectValue()) {
438 groupPaintProperty->SetSelectStatus(CheckBoxGroupPaintProperty::SelectStatus::NONE);
439 checkBoxGroupPattern->ResetUIStatus();
440 } else {
441 groupPaintProperty->SetSelectStatus(CheckBoxGroupPaintProperty::SelectStatus::PART);
442 checkBoxGroupPattern->ResetUIStatus();
443 }
444 checkBoxGroupNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
445 }
446 groupPaintProperty->SetIsCheckBoxCallbackDealed(true);
447 }
448
InitOnKeyEvent(const RefPtr<FocusHub> & focusHub)449 void CheckBoxPattern::InitOnKeyEvent(const RefPtr<FocusHub>& focusHub)
450 {
451 auto onKeyEvent = [wp = WeakClaim(this)](const KeyEvent& event) -> bool {
452 auto pattern = wp.Upgrade();
453 if (!pattern) {
454 return false;
455 }
456 return pattern->OnKeyEvent(event);
457 };
458 focusHub->SetOnKeyEventInternal(std::move(onKeyEvent));
459
460 auto getInnerPaintRectCallback = [wp = WeakClaim(this)](RoundRect& paintRect) {
461 auto pattern = wp.Upgrade();
462 if (pattern) {
463 pattern->GetInnerFocusPaintRect(paintRect);
464 }
465 };
466 focusHub->SetInnerFocusPaintRectCallback(getInnerPaintRectCallback);
467 }
468
OnKeyEvent(const KeyEvent & event)469 bool CheckBoxPattern::OnKeyEvent(const KeyEvent& event)
470 {
471 if (event.action != KeyAction::DOWN) {
472 return false;
473 }
474 if (event.code == KeyCode::KEY_ENTER) {
475 OnClick();
476 return true;
477 }
478 return false;
479 }
480
GetInnerFocusPaintRect(RoundRect & paintRect)481 void CheckBoxPattern::GetInnerFocusPaintRect(RoundRect& paintRect)
482 {
483 auto pipelineContext = PipelineBase::GetCurrentContext();
484 CHECK_NULL_VOID(pipelineContext);
485 auto checkBoxTheme = pipelineContext->GetTheme<CheckboxTheme>();
486 CHECK_NULL_VOID(checkBoxTheme);
487 auto borderRadius = checkBoxTheme->GetFocusRadius().ConvertToPx();
488 auto focusPaintPadding = checkBoxTheme->GetFocusPaintPadding().ConvertToPx();
489 float originX = offset_.GetX() - focusPaintPadding;
490 float originY = offset_.GetY() - focusPaintPadding;
491 float width = size_.Width() + 2 * focusPaintPadding;
492 float height = size_.Height() + 2 * focusPaintPadding;
493 paintRect.SetRect({ originX, originY, width, height });
494 paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_LEFT_POS, borderRadius, borderRadius);
495 paintRect.SetCornerRadius(RoundRect::CornerPos::TOP_RIGHT_POS, borderRadius, borderRadius);
496 paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_LEFT_POS, borderRadius, borderRadius);
497 paintRect.SetCornerRadius(RoundRect::CornerPos::BOTTOM_RIGHT_POS, borderRadius, borderRadius);
498 }
499
GetFocusPattern() const500 FocusPattern CheckBoxPattern::GetFocusPattern() const
501 {
502 auto pipeline = PipelineBase::GetCurrentContext();
503 CHECK_NULL_RETURN(pipeline, FocusPattern());
504 auto checkBoxTheme = pipeline->GetTheme<CheckboxTheme>();
505 CHECK_NULL_RETURN(checkBoxTheme, FocusPattern());
506 auto activeColor = checkBoxTheme->GetActiveColor();
507 FocusPaintParam focusPaintParam;
508 focusPaintParam.SetPaintColor(activeColor);
509 return { FocusType::NODE, true, FocusStyleType::CUSTOM_REGION, focusPaintParam };
510 }
511
512 // Set the default hot zone for the component.
AddHotZoneRect()513 void CheckBoxPattern::AddHotZoneRect()
514 {
515 hotZoneOffset_.SetX(offset_.GetX() - hotZoneHorizontalPadding_.ConvertToPx());
516 hotZoneOffset_.SetY(offset_.GetY() - hotZoneVerticalPadding_.ConvertToPx());
517 hotZoneSize_.SetWidth(size_.Width() + 2 * hotZoneHorizontalPadding_.ConvertToPx());
518 hotZoneSize_.SetHeight(size_.Height() + 2 * hotZoneVerticalPadding_.ConvertToPx());
519 DimensionRect hotZoneRegion;
520 hotZoneRegion.SetSize(DimensionSize(Dimension(hotZoneSize_.Width()), Dimension(hotZoneSize_.Height())));
521 hotZoneRegion.SetOffset(DimensionOffset(Dimension(hotZoneOffset_.GetX()), Dimension(hotZoneOffset_.GetY())));
522 auto host = GetHost();
523 CHECK_NULL_VOID(host);
524 host->AddHotZoneRect(hotZoneRegion);
525 }
526
527 } // namespace OHOS::Ace::NG
528