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_v2/inspector/select_composed_element.h"
17 
18 #include "core/components/select/select_element.h"
19 #include "core/components_v2/inspector/utils.h"
20 
21 #include "base/log/dump_log.h"
22 
23 namespace OHOS::Ace::V2 {
24 
25 const std::unordered_map<std::string, std::function<std::string(const SelectComposedElement&)>> CREATE_JSON_MAP {
__anon43f96c9c0102(const SelectComposedElement& inspector) 26     { "options", [](const SelectComposedElement& inspector) { return inspector.GetOptions(); } },
__anon43f96c9c0202(const SelectComposedElement& inspector) 27     { "selected", [](const SelectComposedElement& inspector) { return inspector.GetSelected(); } },
__anon43f96c9c0302(const SelectComposedElement& inspector) 28     { "value", [](const SelectComposedElement& inspector) { return inspector.GetSelectValue(); } },
__anon43f96c9c0402(const SelectComposedElement& inspector) 29     { "font", [](const SelectComposedElement& inspector) { return inspector.GetFont(); } },
__anon43f96c9c0502(const SelectComposedElement& inspector) 30     { "fontColor", [](const SelectComposedElement& inspector) { return inspector.GetFontColor(); } },
__anon43f96c9c0602(const SelectComposedElement& inspector) 31     { "selectedOptionBgColor", [](const SelectComposedElement& inspector) { return inspector.GetSelectBgColor(); } },
__anon43f96c9c0702(const SelectComposedElement& inspector) 32     { "selectedOptionFont", [](const SelectComposedElement& inspector) { return inspector.GetSelectFont(); } },
33     { "selectedOptionFontColor", [](const SelectComposedElement& inspector)
__anon43f96c9c0802(const SelectComposedElement& inspector) 34         { return inspector.GetSelectFontColor(); } },
__anon43f96c9c0902(const SelectComposedElement& inspector) 35     { "optionBgColor", [](const SelectComposedElement& inspector) { return inspector.GetOptionBgColor(); } },
__anon43f96c9c0a02(const SelectComposedElement& inspector) 36     { "optionFont", [](const SelectComposedElement& inspector) { return inspector.GetOptionFont(); } },
__anon43f96c9c0b02(const SelectComposedElement& inspector) 37     { "optionFontColor", [](const SelectComposedElement& inspector) { return inspector.GetOptionFontColor(); } }
38 };
39 
Dump(void)40 void SelectComposedElement::Dump(void)
41 {
42     InspectorComposedElement::Dump();
43     DumpLog::GetInstance().AddDesc(std::string("select_composed_element"));
44     DumpLog::GetInstance().AddDesc(std::string("options: ").append(GetOptions()));
45     DumpLog::GetInstance().AddDesc(std::string("selected: ").append(GetSelected()));
46     DumpLog::GetInstance().AddDesc(std::string("value: ").append(GetSelectValue()));
47     DumpLog::GetInstance().AddDesc(std::string("font: ").append(GetFont()));
48     DumpLog::GetInstance().AddDesc(std::string("fontColor: ").append(GetFontColor()));
49     DumpLog::GetInstance().AddDesc(std::string("selectedOptionBgColor: ").append(GetSelectBgColor()));
50     DumpLog::GetInstance().AddDesc(std::string("selectedOptionFont: ").append(GetSelectFont()));
51     DumpLog::GetInstance().AddDesc(std::string("selectedOptionFontColor: ").append(GetSelectFontColor()));
52     DumpLog::GetInstance().AddDesc(std::string("optionBgColor: ").append(GetOptionBgColor()));
53     DumpLog::GetInstance().AddDesc(std::string("optionFont: ").append(GetOptionFont()));
54     DumpLog::GetInstance().AddDesc(std::string("optionFontColor: ").append(GetOptionFontColor()));
55 }
56 
ToJsonObject() const57 std::unique_ptr<OHOS::Ace::JsonValue> SelectComposedElement::ToJsonObject() const
58 {
59     auto resultJson = InspectorComposedElement::ToJsonObject();
60     for (const auto& value : CREATE_JSON_MAP) {
61         resultJson->Put(value.first.c_str(), value.second(*this).c_str());
62     }
63     return resultJson;
64 }
65 
GetOptions() const66 std::string SelectComposedElement::GetOptions() const
67 {
68     auto render = GetRenderSelect();
69     auto jsonValue = JsonUtil::Create(true);
70     if (!render) {
71         return "";
72     }
73     auto selectComponent = render->GetSelectComponent();
74     if (!selectComponent) {
75         return "";
76     }
77     auto popup = selectComponent->GetSelectPopupComponent();
78     if (popup) {
79         auto vectorValue = popup->GetSelectOptions();
80         auto jsonOptions = JsonUtil::CreateArray(true);
81         for (size_t i = 0; i < vectorValue.size(); i++) {
82             if (vectorValue[i] && vectorValue[i]->GetIcon()) {
83                 auto temp = JsonUtil::Create(true);
84                 temp->Put("value", vectorValue[i]->GetValue().c_str());
85                 temp->Put("icon", vectorValue[i]->GetIcon()->GetSrc().c_str());
86                 auto index = std::to_string(i);
87                 jsonOptions->Put(index.c_str(), temp);
88             }
89         }
90         jsonValue->Put("options", jsonOptions);
91         return jsonValue->ToString();
92     }
93     return "";
94 }
95 
GetSelected() const96 std::string SelectComposedElement::GetSelected() const
97 {
98     auto render = GetRenderSelect();
99     if (render) {
100         if (render->GetSelectComponent()) {
101             return std::to_string(render->GetSelectComponent()->GetSelected());
102         }
103     }
104     return "";
105 }
106 
GetSelectValue() const107 std::string SelectComposedElement::GetSelectValue() const
108 {
109     auto render = GetRenderSelect();
110     if (render) {
111         return render->GetSelectComponent()->GetTipText()->GetData();
112     }
113     return "";
114 }
115 
GetFont() const116 std::string SelectComposedElement::GetFont() const
117 {
118     auto render = GetRenderSelect();
119     if (render) {
120         return GetTextStyleInJson(render->GetSelectComponent()->GetSelectStyle());
121     }
122     return "";
123 }
124 
GetFontColor() const125 std::string SelectComposedElement::GetFontColor() const
126 {
127     auto render = GetRenderSelect();
128     if (render) {
129         return ConvertColorToString(render->GetSelectComponent()->GetSelectStyle().GetTextColor());
130     }
131     return "";
132 }
133 
GetSelectBgColor() const134 std::string SelectComposedElement::GetSelectBgColor() const
135 {
136     auto render = GetRenderSelect();
137     if (render) {
138         auto popup = render->GetSelectComponent()->GetPopup();
139         if (!popup) {
140             LOGE("popup is null");
141             return "";
142         }
143         auto option = popup->GetSelectOptions();
144         for (auto& optionItem : option) {
145             if (optionItem) {
146                 return ConvertColorToString(optionItem->GetSelectedBackgroundColor());
147             }
148         }
149     }
150     return "";
151 }
152 
GetSelectFont() const153 std::string SelectComposedElement::GetSelectFont() const
154 {
155     auto render = GetRenderSelect();
156     if (render) {
157         auto popup = render->GetSelectComponent()->GetPopup();
158         if (!popup) {
159             LOGE("popup is null");
160             return "";
161         }
162         auto option = popup->GetSelectOptions();
163         for (auto& optionItem : option) {
164             if (optionItem) {
165                 return GetTextStyleInJson(optionItem->GetSelectedTextStyle());
166             }
167         }
168     }
169     return "";
170 }
171 
GetSelectFontColor() const172 std::string SelectComposedElement::GetSelectFontColor() const
173 {
174     auto render = GetRenderSelect();
175     if (render) {
176         auto popup = render->GetSelectComponent()->GetPopup();
177         if (!popup) {
178             LOGE("popup is null");
179             return "";
180         }
181         auto option = popup->GetSelectOptions();
182         for (auto& optionItem : option) {
183             if (optionItem) {
184                 return ConvertColorToString(optionItem->GetSelectedTextStyle().GetTextColor());
185             }
186         }
187     }
188     return "";
189 }
190 
GetOptionBgColor() const191 std::string SelectComposedElement::GetOptionBgColor() const
192 {
193     auto render = GetRenderSelect();
194     if (render) {
195         auto popup = render->GetSelectComponent()->GetPopup();
196         if (!popup) {
197             LOGE("popup is null");
198             return "";
199         }
200         auto option = popup->GetSelectOptions();
201         for (auto& optionItem : option) {
202             if (optionItem) {
203                 return ConvertColorToString(optionItem->GetBackgroundColor());
204             }
205         }
206     }
207     return "";
208 }
209 
GetOptionFont() const210 std::string SelectComposedElement::GetOptionFont() const
211 {
212     auto render = GetRenderSelect();
213     if (render) {
214         auto popup = render->GetSelectComponent()->GetPopup();
215         if (!popup) {
216             LOGE("popup is null");
217             return "";
218         }
219         auto option = popup->GetSelectOptions();
220         for (auto& optionItem : option) {
221             if (optionItem) {
222                 return GetTextStyleInJson(optionItem->GetTextStyle());
223             }
224         }
225     }
226     return "";
227 }
228 
GetOptionFontColor() const229 std::string SelectComposedElement::GetOptionFontColor() const
230 {
231     auto render = GetRenderSelect();
232     if (render) {
233         return ConvertColorToString(render->GetSelectComponent()->GetSelectStyle().GetTextColor());
234     }
235     return "";
236 }
237 
GetWidth() const238 std::string SelectComposedElement::GetWidth() const
239 {
240     auto render = GetRenderSelect();
241     if (!render) {
242         return "";
243     }
244     auto selectComponent = render->GetSelectComponent();
245     if (!selectComponent) {
246         return "";
247     }
248     return selectComponent->GetWidth().ToString();
249 }
250 
GetHeight() const251 std::string SelectComposedElement::GetHeight() const
252 {
253     auto render = GetRenderSelect();
254     if (!render) {
255         return "";
256     }
257     auto selectComponent = render->GetSelectComponent();
258     if (!selectComponent) {
259         return "";
260     }
261     return selectComponent->GetHeight().ToString();
262 }
263 
GetRenderSelect() const264 OHOS::Ace::RefPtr<OHOS::Ace::RenderSelect> SelectComposedElement::GetRenderSelect() const
265 {
266     auto node = GetInspectorNode(SelectElement::TypeId());
267     if (node) {
268         return AceType::DynamicCast<RenderSelect>(node);
269     }
270     return nullptr;
271 }
272 
273 } // namespace OHOS::Ace::V2