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