1 /*
2  * Copyright (c) 2021 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/indexer_composed_element.h"
17 
18 #include "base/log/dump_log.h"
19 #include "base/utils/string_utils.h"
20 #include "core/components/common/layout/constants.h"
21 #include "core/components/text/text_element.h"
22 #include "core/components_v2/indexer/indexer_element.h"
23 #include "core/components_v2/indexer/render_indexer_item.h"
24 #include "core/components_v2/inspector/utils.h"
25 
26 namespace OHOS::Ace::V2 {
27 namespace {
28 const std::unordered_map<std::string, std::function<std::string(const IndexerComposedElement&)>> CREATE_JSON_MAP {
__anoncaba870b0202(const IndexerComposedElement& inspector) 29     { "color", [](const IndexerComposedElement& inspector) { return inspector.GetColor(); } },
__anoncaba870b0302(const IndexerComposedElement& inspector) 30     { "selectedColor", [](const IndexerComposedElement& inspector) { return inspector.GetSelectedColor(); } },
__anoncaba870b0402(const IndexerComposedElement& inspector) 31     { "popupColor", [](const IndexerComposedElement& inspector) { return inspector.GetPopupColor(); } },
32     { "selectedBackgroundColor",
__anoncaba870b0502(const IndexerComposedElement& inspector) 33         [](const IndexerComposedElement& inspector) { return inspector.GetSelectedBackgroundColor(); } },
__anoncaba870b0602(const IndexerComposedElement& inspector) 34     { "popupBackground", [](const IndexerComposedElement& inspector) { return inspector.GetPopupBackground(); } },
__anoncaba870b0702(const IndexerComposedElement& inspector) 35     { "itemSize", [](const IndexerComposedElement& inspector) { return inspector.GetItemSize(); } },
__anoncaba870b0802(const IndexerComposedElement& inspector) 36     { "alignStyle", [](const IndexerComposedElement& inspector) { return inspector.GetAlignStyle(); } },
__anoncaba870b0902(const IndexerComposedElement& inspector) 37     { "selectedFont", [](const IndexerComposedElement& inspector) { return inspector.GetSelectedFont(); } },
__anoncaba870b0a02(const IndexerComposedElement& inspector) 38     { "popupFont", [](const IndexerComposedElement& inspector) { return inspector.GetPopupFont(); } },
__anoncaba870b0b02(const IndexerComposedElement& inspector) 39     { "font", [](const IndexerComposedElement& inspector) { return inspector.GetFont(); } },
40 };
41 
42 const std::unordered_map<std::string,
43     std::function<std::unique_ptr<JsonValue>(const IndexerComposedElement&)>> CREATE_JSON_VALUE_MAP {
__anoncaba870b0c02(const IndexerComposedElement& inspector) 44     { "constructor", [](const IndexerComposedElement& inspector) { return inspector.GetConstructor(); } }
45 };
46 
47 const std::unordered_map<std::string, std::function<bool(const IndexerComposedElement&)>> CREATE_JSON_BOOL_MAP {
__anoncaba870b0d02(const IndexerComposedElement& inspector) 48     { "usingPopup", [](const IndexerComposedElement& inspector) { return inspector.GetUsingPopup(); } },
49 };
50 }; // namespace
51 
Dump()52 void IndexerComposedElement::Dump()
53 {
54     InspectorComposedElement::Dump();
55     for (const auto& value : CREATE_JSON_MAP) {
56         DumpLog::GetInstance().AddDesc(std::string(value.first + ":").append(value.second(*this)));
57     }
58 }
59 
ToJsonObject() const60 std::unique_ptr<JsonValue> IndexerComposedElement::ToJsonObject() const
61 {
62     auto resultJson = InspectorComposedElement::ToJsonObject();
63     for (const auto& value : CREATE_JSON_MAP) {
64         resultJson->Put(value.first.c_str(), value.second(*this).c_str());
65     }
66     for (const auto& value : CREATE_JSON_BOOL_MAP) {
67         resultJson->Put(value.first.c_str(), value.second(*this));
68     }
69     for (const auto& value : CREATE_JSON_VALUE_MAP) {
70         resultJson->Put(value.first.c_str(), value.second(*this));
71     }
72     return resultJson;
73 }
74 
GetColor() const75 std::string IndexerComposedElement::GetColor() const
76 {
77     auto node = GetInspectorNode(IndexerElement::TypeId());
78     if (!node) {
79         return "";
80     }
81     auto render = AceType::DynamicCast<RenderIndexer>(node)->GetSpecificItem(0);
82     if (!render) {
83         return "#99000000";
84     }
85     auto Color = render->GetNormalTextStyle().GetTextColor();
86     return Color.ColorToString();
87 }
88 
GetSelectedColor() const89 std::string IndexerComposedElement::GetSelectedColor() const
90 {
91     auto node = GetInspectorNode(IndexerElement::TypeId());
92     if (!node) {
93         return "";
94     }
95     auto render = AceType::DynamicCast<RenderIndexer>(node)->GetSpecificItem(0);
96     if (!render) {
97         return "";
98     }
99     auto selectedColor = render->GetActiveTextStyle().GetTextColor();
100     return selectedColor.ColorToString();
101 }
102 
GetPopupColor() const103 std::string IndexerComposedElement::GetPopupColor() const
104 {
105     auto node = GetInspectorNode(IndexerElement::TypeId());
106     if (!node) {
107         return "";
108     }
109     auto render = AceType::DynamicCast<RenderIndexer>(node);
110     auto popupColor = render ? render->GetBubbleText()->GetTextStyle().GetTextColor() : Color::BLACK;
111     return popupColor.ColorToString();
112 }
113 
GetSelectedBackgroundColor() const114 std::string IndexerComposedElement::GetSelectedBackgroundColor() const
115 {
116     auto node = GetInspectorNode(IndexerElement::TypeId());
117     if (!node) {
118         return "";
119     }
120     auto render = AceType::DynamicCast<RenderIndexer>(node)->GetSpecificItem(0);
121     auto selectedBackgroundColor = render ? render->GetSelectedBackgroundColor() : Color::BLACK;
122     return selectedBackgroundColor.ColorToString();
123 }
124 
GetPopupBackground() const125 std::string IndexerComposedElement::GetPopupBackground() const
126 {
127     auto node = GetInspectorNode(IndexerElement::TypeId());
128     if (!node) {
129         return "";
130     }
131     auto render = AceType::DynamicCast<RenderIndexer>(node);
132     auto popupBackground = render ? render->GetBubbleBackgroundColor() : Color::BLACK;
133     return popupBackground.ColorToString();
134 }
135 
GetItemSize() const136 std::string IndexerComposedElement::GetItemSize() const
137 {
138     auto node = GetInspectorNode(IndexerElement::TypeId());
139     if (!node) {
140         return "";
141     }
142     auto render = AceType::DynamicCast<RenderIndexer>(node)->GetSpecificItem(0);
143     auto size = render ? render->GetItemSize().Value() : 0;
144     return std::to_string(size);
145 }
146 
GetAlignStyle() const147 std::string IndexerComposedElement::GetAlignStyle() const
148 {
149     auto node = GetInspectorNode(IndexerElement::TypeId());
150     if (!node) {
151         return "";
152     }
153     auto render = AceType::DynamicCast<RenderIndexer>(node);
154     auto style = render ? render->GetAlignStyle() : AlignStyle::RIGHT;
155     return ConvertAlignStyleToString(style);
156 }
157 
GetSelectedFont() const158 std::string IndexerComposedElement::GetSelectedFont() const
159 {
160     auto node = GetInspectorNode(IndexerElement::TypeId());
161     if (!node) {
162         return "";
163     }
164     auto render = AceType::DynamicCast<RenderIndexer>(node)->GetSpecificItem(0);
165     auto selectedFontJson = JsonUtil::Create(true);
166     auto fontSize = render ? render->GetActiveTextStyle().GetFontSize() : Dimension();
167     auto fontStyle = render ? render->GetActiveTextStyle().GetFontStyle() : FontStyle::NORMAL;
168     auto fontWeight = render ? render->GetActiveTextStyle().GetFontWeight() : FontWeight::NORMAL;
169     auto fontFamily = render ? render->GetActiveTextStyle().GetFontFamilies() : std::vector<std::string>();
170     selectedFontJson->Put("size", fontSize.Value());
171     selectedFontJson->Put("weight", ConvertWrapFontWeightToStirng(fontWeight).c_str());
172     selectedFontJson->Put("family", ConvertFontFamily(fontFamily).c_str());
173     selectedFontJson->Put("style", ConvertWrapFontStyleToStirng(fontStyle).c_str());
174     return selectedFontJson->ToString();
175 }
176 
GetPopupFont() const177 std::string IndexerComposedElement::GetPopupFont() const
178 {
179     auto node = GetInspectorNode(IndexerElement::TypeId());
180     if (!node) {
181         return "";
182     }
183     auto render = AceType::DynamicCast<RenderIndexer>(node);
184     auto popupFontJson = JsonUtil::Create(true);
185     auto fontSize = render ? render->GetBubbleText()->GetTextStyle().GetFontSize() : Dimension();
186     auto fontStyle = render ? render->GetBubbleText()->GetTextStyle().GetFontStyle() : FontStyle::NORMAL;
187     auto fontWeight = render ? render->GetBubbleText()->GetTextStyle().GetFontWeight() : FontWeight::NORMAL;
188     auto fontFamily = render ? render->GetBubbleText()->GetTextStyle().GetFontFamilies() : std::vector<std::string>();
189     popupFontJson->Put("size", fontSize.Value());
190     popupFontJson->Put("weight", ConvertWrapFontWeightToStirng(fontWeight).c_str());
191     popupFontJson->Put("family", ConvertFontFamily(fontFamily).c_str());
192     popupFontJson->Put("style", ConvertWrapFontStyleToStirng(fontStyle).c_str());
193     return popupFontJson->ToString();
194 }
195 
GetFont() const196 std::string IndexerComposedElement::GetFont() const
197 {
198     auto node = GetInspectorNode(IndexerElement::TypeId());
199     if (!node) {
200         return "";
201     }
202     auto render = AceType::DynamicCast<RenderIndexer>(node)->GetSpecificItem(0);
203     auto fontJson = JsonUtil::Create(true);
204     auto fontSize = render ? render->GetNormalTextStyle().GetFontSize() : Dimension();
205     auto fontStyle = render ? render->GetNormalTextStyle().GetFontStyle() : FontStyle::NORMAL;
206     auto fontWeight = render ? render->GetNormalTextStyle().GetFontWeight() : FontWeight::NORMAL;
207     auto fontFamily = render ? render->GetNormalTextStyle().GetFontFamilies() : std::vector<std::string>();
208     fontJson->Put("size", fontSize.Value());
209     fontJson->Put("weight", ConvertWrapFontWeightToStirng(fontWeight).c_str());
210     fontJson->Put("family", ConvertFontFamily(fontFamily).c_str());
211     fontJson->Put("style", ConvertWrapFontStyleToStirng(fontStyle).c_str());
212     return fontJson->ToString();
213 }
214 
GetConstructor() const215 std::unique_ptr<JsonValue> IndexerComposedElement::GetConstructor() const
216 {
217     auto jsonValue = JsonUtil::Create(true);
218     jsonValue->Put("arrayValue", GetArrayValue().c_str());
219     jsonValue->Put("selected", GetIndexSelected().c_str());
220     return jsonValue;
221 }
222 
GetIndexSelected() const223 std::string IndexerComposedElement::GetIndexSelected() const
224 {
225     auto node = GetInspectorNode(IndexerElement::TypeId());
226     if (!node) {
227         return "";
228     }
229     auto render = AceType::DynamicCast<RenderIndexer>(node);
230     auto selected = render->GetFocusIndex();
231     return std::to_string(selected);
232 }
233 
GetArrayValue() const234 std::string IndexerComposedElement::GetArrayValue() const
235 {
236     auto node = GetInspectorNode(IndexerElement::TypeId());
237     if (!node) {
238         return "";
239     }
240     auto render = AceType::DynamicCast<RenderIndexer>(node);
241     auto jsonValueArray = JsonUtil::CreateArray(true);
242     auto value = render->GetArrayValue();
243     uint32_t length = value.size();
244     if (length <= 0) {
245         return "";
246     }
247     for (uint32_t i = 0; i < length; i++) {
248         auto index = std::to_string(i);
249         jsonValueArray->Put(index.c_str(), StringUtils::Str16ToStr8(value[i]).c_str());
250     }
251     return jsonValueArray->ToString();
252 }
253 
GetUsingPopup() const254 bool IndexerComposedElement::GetUsingPopup() const
255 {
256     auto node = GetInspectorNode(IndexerElement::TypeId());
257     if (!node) {
258         return false;
259     }
260     auto render = AceType::DynamicCast<RenderIndexer>(node);
261     return render ? render->GetBubbleEnabled() : false;
262 }
263 
ConvertAlignStyleToString(AlignStyle alignStyle) const264 std::string IndexerComposedElement::ConvertAlignStyleToString(AlignStyle alignStyle) const
265 {
266     std::string result = "";
267     switch (alignStyle) {
268         case AlignStyle::RIGHT:
269             result = "AlignStyle.Right";
270             break;
271         case AlignStyle::LEFT:
272             result = "AlignStyle.Left";
273             break;
274         default:
275             break;
276     }
277     return result;
278 }
279 
ConvertFontFamily(const std::vector<std::string> & fontFamily) const280 std::string IndexerComposedElement::ConvertFontFamily(const std::vector<std::string>& fontFamily) const
281 {
282     std::string result = "";
283     for (const auto& item : fontFamily) {
284         result += item;
285         result += ",";
286     }
287     if (!result.empty()) {
288         result = result.substr(0, result.size() - 1);
289     }
290     return result;
291 }
292 } // namespace OHOS::Ace::V2