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