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/declaration/div/div_declaration.h"
17
18 #include "core/components/declaration/common/declaration_constants.h"
19 #include "frameworks/bridge/common/utils/utils.h"
20
21 namespace OHOS::Ace {
22
23 using namespace Framework;
24
InitSpecialized()25 void DivDeclaration::InitSpecialized()
26 {
27 AddSpecializedAttribute(DeclarationConstants::DEFAULT_DIV_ATTR);
28 AddSpecializedStyle(DeclarationConstants::DEFAULT_DIV_STYLE);
29 }
30
SetSpecializedAttr(const std::pair<std::string,std::string> & attr)31 bool DivDeclaration::SetSpecializedAttr(const std::pair<std::string, std::string>& attr)
32 {
33 if (attr.first == DOM_DIV_CARD_TYPE) {
34 auto& divAttr = MaybeResetAttribute<DivAttribute>(AttributeTag::SPECIALIZED_ATTR);
35 if (divAttr.IsValid()) {
36 divAttr.isCard = StringToBool(attr.second);
37 }
38 return true;
39 } else if (attr.first == DOM_DIV_CARD_BLUR) {
40 auto& divAttr = MaybeResetAttribute<DivAttribute>(AttributeTag::SPECIALIZED_ATTR);
41 if (divAttr.IsValid()) {
42 divAttr.isCardBlur = StringToBool(attr.second);
43 }
44 return true;
45 }
46 return false;
47 }
48
SetSpecializedStyle(const std::pair<std::string,std::string> & style)49 bool DivDeclaration::SetSpecializedStyle(const std::pair<std::string, std::string>& style)
50 {
51 static const LinearMapNode<void (*)(const std::string&, DivDeclaration&)> styleSetters[] {
52 { DOM_ALIGN_CONTENT,
53 [](const std::string& value, DivDeclaration& declaration) {
54 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
55 if (divStyle.IsValid()) {
56 divStyle.alignContent = value;
57 }
58 } },
59 { DOM_ALIGN_ITEMS,
60 [](const std::string& value, DivDeclaration& declaration) {
61 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
62 if (divStyle.IsValid()) {
63 divStyle.alignItems = value;
64 }
65 } },
66 { DOM_FLEX_DIRECTION,
67 [](const std::string& value, DivDeclaration& declaration) {
68 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
69 if (divStyle.IsValid()) {
70 divStyle.direction = value;
71 }
72 } },
73 { DOM_FLEX_WRAP,
74 [](const std::string& value, DivDeclaration& declaration) {
75 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
76 if (divStyle.IsValid()) {
77 divStyle.isFlexWrap = (value == DOM_WRAP);
78 }
79 } },
80 { DOM_GRID_AUTO_FLOW,
81 [](const std::string& value, DivDeclaration& declaration) {
82 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
83 if (divStyle.IsValid()) {
84 divStyle.direction = value;
85 }
86 } },
87 { DOM_GRID_COLUMN_END,
88 [](const std::string& value, DivDeclaration& declaration) {
89 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
90 if (divStyle.IsValid()) {
91 divStyle.columnEnd = StringToInt(value);
92 }
93 } },
94 { DOM_GRID_COLUMN_START,
95 [](const std::string& value, DivDeclaration& declaration) {
96 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
97 if (divStyle.IsValid()) {
98 divStyle.columnStart = StringToInt(value);
99 }
100 } },
101 { DOM_GRID_COLUMN_GAP,
102 [](const std::string& value, DivDeclaration& declaration) {
103 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
104 if (divStyle.IsValid()) {
105 divStyle.columnGap = StringToDouble(value);
106 }
107 } },
108 { DOM_GRID_ROW_END,
109 [](const std::string& value, DivDeclaration& declaration) {
110 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
111 if (divStyle.IsValid()) {
112 divStyle.rowEnd = StringToInt(value);
113 }
114 } },
115 { DOM_GRID_ROW_START,
116 [](const std::string& value, DivDeclaration& declaration) {
117 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
118 if (divStyle.IsValid()) {
119 divStyle.rowStart = StringToInt(value);
120 }
121 } },
122 { DOM_GRID_ROW_GAP,
123 [](const std::string& value, DivDeclaration& declaration) {
124 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
125 if (divStyle.IsValid()) {
126 divStyle.rowGap = StringToDouble(value);
127 }
128 } },
129 { DOM_GRID_TEMPLATE_COLUMNS,
130 [](const std::string& value, DivDeclaration& declaration) {
131 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
132 if (divStyle.IsValid()) {
133 divStyle.columnsArgs = value;
134 }
135 } },
136 { DOM_GRID_TEMPLATE_ROWS,
137 [](const std::string& value, DivDeclaration& declaration) {
138 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
139 if (divStyle.IsValid()) {
140 divStyle.rowsArgs = value;
141 }
142 } },
143 { DOM_JUSTIFY_CONTENT,
144 [](const std::string& value, DivDeclaration& declaration) {
145 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
146 if (divStyle.IsValid()) {
147 divStyle.justifyContent = value;
148 }
149 } },
150 { DOM_SCROLL_OVER_SCROLL_EFFECT,
151 [](const std::string& value, DivDeclaration& declaration) {
152 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
153 if (divStyle.IsValid()) {
154 if (value == DOM_SCROLL_EFFECT_SPRING) {
155 divStyle.edgeEffect = EdgeEffect::SPRING;
156 } else if (value == DOM_SCROLL_EFFECT_FADE) {
157 divStyle.edgeEffect = EdgeEffect::FADE;
158 } else {
159 divStyle.edgeEffect = EdgeEffect::NONE;
160 }
161 }
162 } },
163 { DOM_SCROLL_SCROLLBAR_COLOR,
164 [](const std::string& value, DivDeclaration& declaration) {
165 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
166 if (divStyle.IsValid()) {
167 divStyle.scrollBarColor.first = true;
168 divStyle.scrollBarColor.second = declaration.ParseColor(value);
169 }
170 } },
171 { DOM_SCROLL_SCROLLBAR_WIDTH,
172 [](const std::string& value, DivDeclaration& declaration) {
173 auto& divStyle = declaration.MaybeResetStyle<DivStyle>(StyleTag::SPECIALIZED_STYLE);
174 if (divStyle.IsValid()) {
175 divStyle.scrollBarWidth.first = true;
176 auto width = declaration.ParseDimension(value);
177 divStyle.scrollBarWidth.second = width.IsValid() ? width : Dimension();
178 }
179 } },
180 };
181 auto operatorIter = BinarySearchFindIndex(styleSetters, ArraySize(styleSetters), style.first.c_str());
182 if (operatorIter != -1) {
183 styleSetters[operatorIter].value(style.second, *this);
184 return true;
185 }
186 return false;
187 }
188
189 } // namespace OHOS::Ace
190