1 /*
2  * Copyright (c) 2024 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/overlay/group_manager.h"
17 
18 #include "base/utils/utils.h"
19 #include "core/components_ng/pattern/stage/page_event_hub.h"
20 #include "core/components_ng/pattern/checkbox/checkbox_pattern.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/radio/radio_paint_property.h"
24 #include "core/components_ng/pattern/radio/radio_pattern.h"
25 #include "core/components_v2/inspector/inspector_constants.h"
26 #include "core/pipeline/base/element_register.h"
27 #include "core/pipeline_ng/ui_task_scheduler.h"
28 
29 namespace OHOS::Ace::NG {
30 
AddRadioToGroup(const std::string & group,int32_t radioId)31 void GroupManager::AddRadioToGroup(const std::string& group, int32_t radioId)
32 {
33     radioGroupNotify_[group].push_back(radioId);
34 }
35 
RemoveRadioFromGroup(const std::string & group,int32_t radioId)36 void GroupManager::RemoveRadioFromGroup(const std::string& group, int32_t radioId)
37 {
38     radioGroupNotify_[group].remove(radioId);
39 }
40 
HasRadioId(const std::string & group,int32_t radioId)41 bool GroupManager::HasRadioId(const std::string& group, int32_t radioId)
42 {
43     auto list = radioGroupNotify_[group];
44     auto it = find(list.begin(), list.end(), radioId);
45     return it != list.end();
46 }
47 
UpdateRadioGroupValue(const std::string & group,int32_t radioId)48 void GroupManager::UpdateRadioGroupValue(const std::string& group, int32_t radioId)
49 {
50     const auto& list = radioGroupNotify_[group];
51     for (auto&& item : list) {
52         if (item == radioId) {
53             continue;
54         }
55         auto node = DynamicCast<FrameNode>(ElementRegister::GetInstance()->GetNodeById(item));
56         if (!node) {
57             continue;
58         }
59         auto pattern = node->GetPattern<RadioPattern>();
60         if (!pattern) {
61             continue;
62         }
63         pattern->UpdateUncheckStatus(node);
64     }
65 }
66 
AddCheckBoxToGroup(const std::string & group,const WeakPtr<FrameNode> & checkBoxNode)67 void GroupManager::AddCheckBoxToGroup(const std::string& group, const WeakPtr<FrameNode>& checkBoxNode)
68 {
69     checkBoxListMap_[group].push_back(checkBoxNode);
70     checkboxChangedMap_[group] = true;
71 }
72 
AddCheckBoxGroup(const std::string & group,const WeakPtr<FrameNode> & checkBoxGroupNode)73 void GroupManager::AddCheckBoxGroup(const std::string& group, const WeakPtr<FrameNode>& checkBoxGroupNode)
74 {
75     auto frameNode = checkBoxGroupNode.Upgrade();
76     CHECK_NULL_VOID(frameNode);
77     auto pattern = frameNode->GetPattern<CheckBoxGroupPattern>();
78     CHECK_NULL_VOID(pattern);
79     if (checkBoxGroupMap_[group].Upgrade()) {
80         pattern->SetIsAddToMap(false);
81     } else {
82         pattern->SetIsAddToMap(true);
83         checkBoxGroupMap_[group] = frameNode;
84     }
85 }
86 
RemoveCheckBoxFromGroup(const std::string & group,int32_t checkBoxId)87 void GroupManager::RemoveCheckBoxFromGroup(const std::string& group, int32_t checkBoxId)
88 {
89     auto& checkboxList = checkBoxListMap_[group];
90     for (auto && item : checkboxList) {
91         auto frameNode = item.Upgrade();
92         if (frameNode && frameNode->GetId() == checkBoxId) {
93             checkboxList.remove(item);
94             checkboxChangedMap_[group] = true;
95             return;
96         }
97     }
98 }
99 
RemoveCheckBoxGroup(const std::string & group,int32_t checkBoxGroupId)100 void GroupManager::RemoveCheckBoxGroup(const std::string& group, int32_t checkBoxGroupId)
101 {
102     auto frameNode = checkBoxGroupMap_[group].Upgrade();
103     if (frameNode && frameNode->GetId() == checkBoxGroupId) {
104         checkBoxGroupMap_.erase(group);
105     }
106 }
107 
GetCheckboxList(const std::string & group)108 std::list<RefPtr<FrameNode>> GroupManager::GetCheckboxList(const std::string& group)
109 {
110     auto checkboxList = checkBoxListMap_[group];
111     std::list<RefPtr<FrameNode>> result;
112     for (std::list<WeakPtr<FrameNode>>::iterator iter = checkboxList.begin(); iter != checkboxList.end();) {
113         auto frameNode = (*iter).Upgrade();
114         if (!frameNode) {
115             iter = checkboxList.erase(iter);
116         } else {
117             result.push_back(frameNode);
118             ++iter;
119         }
120     }
121     return result;
122 }
123 
GetCheckboxGroup(const std::string & group)124 RefPtr<FrameNode> GroupManager::GetCheckboxGroup(const std::string& group)
125 {
126     return checkBoxGroupMap_[group].Upgrade();
127 }
128 
GetGroupManager()129 WeakPtr<GroupManager> GroupManager::GetGroupManager()
130 {
131     WeakPtr<GroupManager> groupManager;
132     auto context = PipelineContext::GetCurrentContext();
133     CHECK_NULL_RETURN(context, nullptr);
134     if (Container::IsInSubContainer()) {
135         auto overlayManager = context->GetOverlayManager();
136         CHECK_NULL_RETURN(overlayManager, nullptr);
137         groupManager = overlayManager->GetGroupManager();
138     } else {
139         auto stageManager = context->GetStageManager();
140         CHECK_NULL_RETURN(stageManager, nullptr);
141         auto pageNode = stageManager->GetLastPage();
142         CHECK_NULL_RETURN(pageNode, nullptr);
143         auto pageEventHub = pageNode->GetEventHub<NG::PageEventHub>();
144         CHECK_NULL_RETURN(pageEventHub, nullptr);
145         groupManager = pageEventHub->GetGroupManager();
146     }
147     return groupManager;
148 }
149 } // namespace OHOS::Ace::NG
150