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