• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 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 "frameworks/bridge/declarative_frontend/jsview/js_grid_row.h"
17 
18 #include "base/geometry/dimension.h"
19 #include "base/log/ace_scoring_log.h"
20 #include "base/log/ace_trace.h"
21 #include "base/memory/referenced.h"
22 #include "bridge/declarative_frontend/jsview/js_view_common_def.h"
23 #include "bridge/declarative_frontend/jsview/models/grid_row_model_impl.h"
24 #include "core/common/resource/resource_parse_utils.h"
25 #include "core/components_ng/base/view_stack_processor.h"
26 #include "core/components_ng/pattern/grid_row/grid_row_model_ng.h"
27 #include "core/components_v2/grid_layout/grid_container_util_class.h"
28 
29 namespace OHOS::Ace {
GetInstance()30 GridRowModel* GridRowModel::GetInstance()
31 {
32 #ifdef NG_BUILD
33     static NG::GridRowModelNG instance;
34     return &instance;
35 #else
36     if (Container::IsCurrentUseNewPipeline()) {
37         static NG::GridRowModelNG instance;
38         return &instance;
39     } else {
40         static Framework::GridRowModelImpl instance;
41         return &instance;
42     }
43 #endif
44 }
45 } // namespace OHOS::Ace
46 
47 namespace OHOS::Ace::Framework {
48 namespace {
49 
50 constexpr size_t MAX_NUMBER_BREAKPOINT = 6;
51 constexpr size_t XS = 0;
52 constexpr size_t SM = 1;
53 constexpr size_t MD = 2;
54 constexpr size_t LG = 3;
55 constexpr size_t XL = 4;
56 constexpr size_t XXL = 5;
57 constexpr int32_t PARAMS_NUM_TOW = 2;
58 constexpr int32_t PARAMS_NUM_THREE = 3;
59 constexpr int32_t PARAMS_NUM_FOUR = 4;
60 constexpr int32_t PARAMS_NUM_FIVE = 5;
61 
InheritGridRowOption(const RefPtr<V2::GridContainerSize> & gridContainerSize,std::optional<int32_t> (& containerSizeArray)[MAX_NUMBER_BREAKPOINT])62 void InheritGridRowOption(const RefPtr<V2::GridContainerSize>& gridContainerSize,
63     std::optional<int32_t> (&containerSizeArray)[MAX_NUMBER_BREAKPOINT])
64 {
65     if (!containerSizeArray[0].has_value()) {
66         containerSizeArray[0] = V2::DEFAULT_COLUMN_NUMBER;
67     }
68     for (size_t i = 1; i < MAX_NUMBER_BREAKPOINT; i++) {
69         if (!containerSizeArray[i].has_value()) {
70             containerSizeArray[i] = containerSizeArray[i - 1].value();
71         }
72     }
73     gridContainerSize->xs = containerSizeArray[0].value();
74     gridContainerSize->sm = containerSizeArray[1].value();
75     gridContainerSize->md = containerSizeArray[2].value();
76     gridContainerSize->lg = containerSizeArray[3].value();
77     gridContainerSize->xl = containerSizeArray[4].value();
78     gridContainerSize->xxl = containerSizeArray[5].value();
79 }
80 
InheritGridColumns(const RefPtr<V2::GridContainerSize> & gridContainerSize,std::optional<int32_t> (& containerSizeArray)[MAX_NUMBER_BREAKPOINT])81 void InheritGridColumns(const RefPtr<V2::GridContainerSize>& gridContainerSize,
82     std::optional<int32_t> (&containerSizeArray)[MAX_NUMBER_BREAKPOINT])
83 {
84     for (size_t i = 0; i < MAX_NUMBER_BREAKPOINT; ++i) {
85         if (containerSizeArray[i].has_value()) {
86             containerSizeArray[0] = containerSizeArray[i].value();
87             break;
88         }
89     }
90     CHECK_NULL_VOID(containerSizeArray[0].has_value());
91     for (size_t i = 1; i < MAX_NUMBER_BREAKPOINT; ++i) {
92         if (!containerSizeArray[i].has_value()) {
93             containerSizeArray[i] = containerSizeArray[i - 1].value();
94         }
95     }
96     gridContainerSize->xs = containerSizeArray[XS].value();
97     gridContainerSize->sm = containerSizeArray[SM].value();
98     gridContainerSize->md = containerSizeArray[MD].value();
99     gridContainerSize->lg = containerSizeArray[LG].value();
100     gridContainerSize->xl = containerSizeArray[XL].value();
101     gridContainerSize->xxl = containerSizeArray[XXL].value();
102 }
103 
SaveGridRowGutterOptionxResObjXsSmMd(const RefPtr<V2::Gutter> & gutter,RefPtr<ResourceObject> (& gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])104 void SaveGridRowGutterOptionxResObjXsSmMd(const RefPtr<V2::Gutter>& gutter,
105     RefPtr<ResourceObject> (&gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])
106 {
107     if (!SystemProperties::ConfigChangePerform()) {
108         return;
109     }
110     if (gutterSizeArrayResObj[0]) {
111         auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
112             CalcDimension result;
113             ResourceParseUtils::ParseResDimensionVp(resObj, result);
114             gutter->xXs = result;
115         };
116         gutter->AddResource("gridrow.gutter.xXs", gutterSizeArrayResObj[0], std::move(updateFunc));
117     }
118     if (gutterSizeArrayResObj[1]) {
119         auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
120             CalcDimension result;
121             ResourceParseUtils::ParseResDimensionVp(resObj, result);
122             gutter->xSm = result;
123         };
124         gutter->AddResource("gridrow.gutter.xSm", gutterSizeArrayResObj[1], std::move(updateFunc));
125     }
126     if (gutterSizeArrayResObj[PARAMS_NUM_TOW]) {
127         auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
128             CalcDimension result;
129             ResourceParseUtils::ParseResDimensionVp(resObj, result);
130             gutter->xMd = result;
131         };
132         gutter->AddResource("gridrow.gutter.xMd", gutterSizeArrayResObj[PARAMS_NUM_TOW], std::move(updateFunc));
133     }
134 }
135 
SaveGridRowGutterOptionxResObjLgXlXXl(const RefPtr<V2::Gutter> & gutter,RefPtr<ResourceObject> (& gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])136 void SaveGridRowGutterOptionxResObjLgXlXXl(const RefPtr<V2::Gutter>& gutter,
137     RefPtr<ResourceObject> (&gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])
138 {
139     if (!SystemProperties::ConfigChangePerform()) {
140         return;
141     }
142     if (gutterSizeArrayResObj[PARAMS_NUM_THREE]) {
143         auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
144             CalcDimension result;
145             ResourceParseUtils::ParseResDimensionVp(resObj, result);
146             gutter->xLg = result;
147         };
148         gutter->AddResource("gridrow.gutter.xLg", gutterSizeArrayResObj[PARAMS_NUM_THREE], std::move(updateFunc));
149     }
150     if (gutterSizeArrayResObj[PARAMS_NUM_FOUR]) {
151         auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
152             CalcDimension result;
153             ResourceParseUtils::ParseResDimensionVp(resObj, result);
154             gutter->xXl = result;
155         };
156         gutter->AddResource("gridrow.gutter.xXl", gutterSizeArrayResObj[PARAMS_NUM_FOUR], std::move(updateFunc));
157     }
158     if (gutterSizeArrayResObj[PARAMS_NUM_FIVE]) {
159         auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
160             CalcDimension result;
161             ResourceParseUtils::ParseResDimensionVp(resObj, result);
162             gutter->xXXl = result;
163         };
164         gutter->AddResource("gridrow.gutter.xXXl", gutterSizeArrayResObj[PARAMS_NUM_FIVE], std::move(updateFunc));
165     }
166 }
167 
SaveGridRowGutterOptionyResObjXsSmMd(const RefPtr<V2::Gutter> & gutter,RefPtr<ResourceObject> (& gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])168 void SaveGridRowGutterOptionyResObjXsSmMd(const RefPtr<V2::Gutter>& gutter,
169     RefPtr<ResourceObject> (&gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])
170 {
171     if (!SystemProperties::ConfigChangePerform()) {
172         return;
173     }
174     if (gutterSizeArrayResObj[0]) {
175         auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
176             CalcDimension result;
177             ResourceParseUtils::ParseResDimensionVp(resObj, result);
178             gutter->yXs = result;
179         };
180         gutter->AddResource("gridrow.gutter.yXs", gutterSizeArrayResObj[0], std::move(updateFunc));
181     }
182     if (gutterSizeArrayResObj[1]) {
183         auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
184             CalcDimension result;
185             ResourceParseUtils::ParseResDimensionVp(resObj, result);
186             gutter->ySm = result;
187         };
188         gutter->AddResource("gridrow.gutter.ySm", gutterSizeArrayResObj[1], std::move(updateFunc));
189     }
190     if (gutterSizeArrayResObj[PARAMS_NUM_TOW]) {
191         auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
192             CalcDimension result;
193             ResourceParseUtils::ParseResDimensionVp(resObj, result);
194             gutter->yMd = result;
195         };
196         gutter->AddResource("gridrow.gutter.yMd", gutterSizeArrayResObj[PARAMS_NUM_TOW], std::move(updateFunc));
197     }
198 }
199 
SaveGridRowGutterOptionyResObjLgXlXXl(const RefPtr<V2::Gutter> & gutter,RefPtr<ResourceObject> (& gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])200 void SaveGridRowGutterOptionyResObjLgXlXXl(const RefPtr<V2::Gutter>& gutter,
201     RefPtr<ResourceObject> (&gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT])
202 {
203     if (!SystemProperties::ConfigChangePerform()) {
204         return;
205     }
206     if (gutterSizeArrayResObj[PARAMS_NUM_THREE]) {
207         auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
208             CalcDimension result;
209             ResourceParseUtils::ParseResDimensionVp(resObj, result);
210             gutter->yLg = result;
211         };
212         gutter->AddResource("gridrow.gutter.yLg", gutterSizeArrayResObj[PARAMS_NUM_THREE], std::move(updateFunc));
213     }
214     if (gutterSizeArrayResObj[PARAMS_NUM_FOUR]) {
215         auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
216             CalcDimension result;
217             ResourceParseUtils::ParseResDimensionVp(resObj, result);
218             gutter->yXl = result;
219         };
220         gutter->AddResource("gridrow.gutter.yXl", gutterSizeArrayResObj[PARAMS_NUM_FOUR], std::move(updateFunc));
221     }
222     if (gutterSizeArrayResObj[PARAMS_NUM_FIVE]) {
223         auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
224             CalcDimension result;
225             ResourceParseUtils::ParseResDimensionVp(resObj, result);
226             gutter->yXXl = result;
227         };
228         gutter->AddResource("gridrow.gutter.yXXl", gutterSizeArrayResObj[PARAMS_NUM_FIVE], std::move(updateFunc));
229     }
230 }
231 
InheritGridRowGutterOption(const RefPtr<V2::Gutter> & gutter,std::optional<CalcDimension> (& gutterSizeArray)[MAX_NUMBER_BREAKPOINT],RefPtr<ResourceObject> (& gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT],bool isHorizontal)232 void InheritGridRowGutterOption(const RefPtr<V2::Gutter>& gutter,
233     std::optional<CalcDimension> (&gutterSizeArray)[MAX_NUMBER_BREAKPOINT],
234     RefPtr<ResourceObject> (&gutterSizeArrayResObj)[MAX_NUMBER_BREAKPOINT], bool isHorizontal)
235 {
236     if (!gutterSizeArray[0].has_value()) {
237         gutterSizeArray[0] = CalcDimension(0);
238     }
239     for (size_t i = 1; i < MAX_NUMBER_BREAKPOINT; i++) {
240         if (!gutterSizeArray[i].has_value()) {
241             gutterSizeArray[i] = gutterSizeArray[i - 1].value();
242         }
243         if (!gutterSizeArrayResObj[i]) {
244             gutterSizeArrayResObj[i] = gutterSizeArrayResObj[i - 1];
245         }
246     }
247     if (isHorizontal) {
248         gutter->xXs = gutterSizeArray[0].value();
249         gutter->xSm = gutterSizeArray[1].value();
250         gutter->xMd = gutterSizeArray[2].value();
251         gutter->xLg = gutterSizeArray[3].value();
252         gutter->xXl = gutterSizeArray[4].value();
253         gutter->xXXl = gutterSizeArray[5].value();
254         SaveGridRowGutterOptionxResObjXsSmMd(gutter, gutterSizeArrayResObj);
255         SaveGridRowGutterOptionxResObjLgXlXXl(gutter, gutterSizeArrayResObj);
256         return;
257     }
258     gutter->yXs = gutterSizeArray[0].value();
259     gutter->ySm = gutterSizeArray[1].value();
260     gutter->yMd = gutterSizeArray[2].value();
261     gutter->yLg = gutterSizeArray[3].value();
262     gutter->yXl = gutterSizeArray[4].value();
263     gutter->yXXl = gutterSizeArray[5].value();
264     SaveGridRowGutterOptionyResObjXsSmMd(gutter, gutterSizeArrayResObj);
265     SaveGridRowGutterOptionyResObjLgXlXXl(gutter, gutterSizeArrayResObj);
266 }
267 
ParseGutterObjectSub(const JSRef<JSObject> & gutterParam,RefPtr<V2::Gutter> & gutter,bool isHorizontal)268 void ParseGutterObjectSub(const JSRef<JSObject>& gutterParam, RefPtr<V2::Gutter>& gutter, bool isHorizontal)
269 {
270     std::optional<CalcDimension> gutterOptions[MAX_NUMBER_BREAKPOINT];
271     RefPtr<ResourceObject> gutterOptionsResObj[MAX_NUMBER_BREAKPOINT];
272     auto xs = gutterParam->GetProperty("xs");
273     CalcDimension xsDimension;
274     RefPtr<ResourceObject> xsDimensionResObj;
275     if (JSContainerBase::ParseJsDimensionVp(xs, xsDimension, xsDimensionResObj)) {
276         gutterOptions[0] = xsDimension;
277     }
278     auto sm = gutterParam->GetProperty("sm");
279     CalcDimension smDimension;
280     RefPtr<ResourceObject> smDimensionnResObj;
281     if (JSContainerBase::ParseJsDimensionVp(sm, smDimension, smDimensionnResObj)) {
282         gutterOptions[1] = smDimension;
283     }
284     auto md = gutterParam->GetProperty("md");
285     CalcDimension mdDimension;
286     RefPtr<ResourceObject> mdDimensionResObj;
287     if (JSContainerBase::ParseJsDimensionVp(md, mdDimension, mdDimensionResObj)) {
288         gutterOptions[PARAMS_NUM_TOW] = mdDimension;
289     }
290     auto lg = gutterParam->GetProperty("lg");
291     CalcDimension lgDimension;
292     RefPtr<ResourceObject> lgDimensionResObj;
293     if (JSContainerBase::ParseJsDimensionVp(lg, lgDimension, lgDimensionResObj)) {
294         gutterOptions[PARAMS_NUM_THREE] = lgDimension;
295     }
296     auto xl = gutterParam->GetProperty("xl");
297     CalcDimension xlDimension;
298     RefPtr<ResourceObject> xlDimensionResObj;
299     if (JSContainerBase::ParseJsDimensionVp(xl, xlDimension, xlDimensionResObj)) {
300         gutterOptions[PARAMS_NUM_FOUR] = xlDimension;
301     }
302     auto xxl = gutterParam->GetProperty("xxl");
303     CalcDimension xxlDimension;
304     RefPtr<ResourceObject> xxlDimensionResObj;
305     if (JSContainerBase::ParseJsDimensionVp(xxl, xxlDimension, xxlDimensionResObj)) {
306         gutterOptions[PARAMS_NUM_FIVE] = xxlDimension;
307     }
308     if (SystemProperties::ConfigChangePerform()) {
309         gutterOptionsResObj[0] = xsDimensionResObj;
310         gutterOptionsResObj[1] = smDimensionnResObj;
311         gutterOptionsResObj[PARAMS_NUM_TOW] = mdDimensionResObj;
312         gutterOptionsResObj[PARAMS_NUM_THREE] = lgDimensionResObj;
313         gutterOptionsResObj[PARAMS_NUM_FOUR] = xlDimensionResObj;
314         gutterOptionsResObj[PARAMS_NUM_FIVE] = xxlDimensionResObj;
315     }
316 
317     InheritGridRowGutterOption(gutter, gutterOptions, gutterOptionsResObj, isHorizontal);
318 }
319 
SetXGutterResObj(RefPtr<ResourceObject> xDimension,RefPtr<V2::Gutter> & gutter)320 void SetXGutterResObj(RefPtr<ResourceObject> xDimension, RefPtr<V2::Gutter>& gutter)
321 {
322     auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
323         CalcDimension result;
324         ResourceParseUtils::ParseResDimensionVpNG(resObj, result);
325         gutter->xXs = result;
326         gutter->xSm = result;
327         gutter->xMd = result;
328         gutter->xLg = result;
329         gutter->xXl = result;
330         gutter->xXXl = result;
331     };
332     gutter->AddResource("gridrow.gutter.x", xDimension, std::move(updateFunc));
333 }
334 
SetYGutterResObj(RefPtr<ResourceObject> yDimension,RefPtr<V2::Gutter> & gutter)335 void SetYGutterResObj(RefPtr<ResourceObject> yDimension, RefPtr<V2::Gutter>& gutter)
336 {
337     auto&& updateFunc = [](const RefPtr<ResourceObject>& resObj, RefPtr<V2::Gutter>& gutter) {
338         CalcDimension result;
339         ResourceParseUtils::ParseResDimensionVpNG(resObj, result);
340         gutter->yXs = result;
341         gutter->ySm = result;
342         gutter->yMd = result;
343         gutter->yLg = result;
344         gutter->yXl = result;
345         gutter->yXXl = result;
346     };
347     gutter->AddResource("gridrow.gutter.y", yDimension, std::move(updateFunc));
348 }
349 
ParseGutterObject(const JSRef<JSVal> & gutterObject,RefPtr<V2::Gutter> & gutter,bool isHorizontal)350 void ParseGutterObject(const JSRef<JSVal>& gutterObject, RefPtr<V2::Gutter>& gutter, bool isHorizontal)
351 {
352     CalcDimension dim;
353     RefPtr<ResourceObject> dimResObj;
354     if (JSContainerBase::ParseJsDimensionVp(gutterObject, dim, dimResObj)) {
355         if (SystemProperties::ConfigChangePerform() && dimResObj) {
356             isHorizontal ? SetXGutterResObj(dimResObj, gutter) : SetYGutterResObj(dimResObj, gutter);
357         }
358         isHorizontal ? gutter->SetXGutter(dim) : gutter->SetYGutter(dim);
359         return;
360     }
361     if (!gutterObject->IsObject()) {
362         return;
363     }
364     auto gutterParam = JSRef<JSObject>::Cast(gutterObject);
365     ParseGutterObjectSub(gutterParam, gutter, isHorizontal);
366 }
367 
ParserGutter(const JSRef<JSVal> & jsValue)368 RefPtr<V2::Gutter> ParserGutter(const JSRef<JSVal>& jsValue)
369 {
370     CalcDimension result;
371     if (JSContainerBase::ParseJsDimensionVp(jsValue, result)) {
372         auto gutter = AceType::MakeRefPtr<V2::Gutter>(result);
373         return gutter;
374     } else {
375         if (!jsValue->IsObject()) {
376             return AceType::MakeRefPtr<V2::Gutter>();
377         }
378         auto paramGutter = JSRef<JSObject>::Cast(jsValue);
379         auto xObject = paramGutter->GetProperty("x");
380         auto yObject = paramGutter->GetProperty("y");
381         auto gutter = AceType::MakeRefPtr<V2::Gutter>();
382         ParseGutterObject(xObject, gutter, true);
383         ParseGutterObject(yObject, gutter, false);
384         return gutter;
385     }
386 }
387 
ParserColumns(const JSRef<JSVal> & jsValue)388 RefPtr<V2::GridContainerSize> ParserColumns(const JSRef<JSVal>& jsValue)
389 {
390     if (jsValue->IsNumber()) {
391         auto columnNumber = jsValue->ToNumber<int32_t>();
392         return columnNumber > 0 ? AceType::MakeRefPtr<V2::GridContainerSize>(columnNumber)
393                                 : AceType::MakeRefPtr<V2::GridContainerSize>(NG::DEFAULT_COLUMN_NUMBER);
394     } else if (jsValue->IsObject()) {
395         auto gridContainerSize = AceType::MakeRefPtr<V2::GridContainerSize>(NG::DEFAULT_COLUMN_NUMBER);
396         auto gridParam = JSRef<JSObject>::Cast(jsValue);
397         std::optional<int32_t> containerSizeArray[MAX_NUMBER_BREAKPOINT];
398         auto xs = gridParam->GetProperty("xs");
399         if (xs->IsNumber() && xs->ToNumber<int32_t>() > 0) {
400             containerSizeArray[XS] = xs->ToNumber<int32_t>();
401         }
402         auto sm = gridParam->GetProperty("sm");
403         if (sm->IsNumber() && sm->ToNumber<int32_t>() > 0) {
404             containerSizeArray[SM] = sm->ToNumber<int32_t>();
405         }
406         auto md = gridParam->GetProperty("md");
407         if (md->IsNumber() && md->ToNumber<int32_t>() > 0) {
408             containerSizeArray[MD] = md->ToNumber<int32_t>();
409         }
410         auto lg = gridParam->GetProperty("lg");
411         if (lg->IsNumber() && lg->ToNumber<int32_t>() > 0) {
412             containerSizeArray[LG] = lg->ToNumber<int32_t>();
413         }
414         auto xl = gridParam->GetProperty("xl");
415         if (xl->IsNumber() && xl->ToNumber<int32_t>() > 0) {
416             containerSizeArray[XL] = xl->ToNumber<int32_t>();
417         }
418         auto xxl = gridParam->GetProperty("xxl");
419         if (xxl->IsNumber() && xxl->ToNumber<int32_t>() > 0) {
420             containerSizeArray[XXL] = xxl->ToNumber<int32_t>();
421         }
422         InheritGridRowOption(gridContainerSize, containerSizeArray);
423         return gridContainerSize;
424     } else {
425         return AceType::MakeRefPtr<V2::GridContainerSize>(NG::DEFAULT_COLUMN_NUMBER);
426     }
427 }
428 
ParserColumnsNG(const JSRef<JSVal> & jsValue)429 RefPtr<V2::GridContainerSize> ParserColumnsNG(const JSRef<JSVal>& jsValue)
430 {
431     if (jsValue->IsNumber()) {
432         auto columnNumber = jsValue->ToNumber<int32_t>();
433         return columnNumber > 0 ? AceType::MakeRefPtr<V2::GridContainerSize>(columnNumber)
434                                 : AceType::MakeRefPtr<V2::GridContainerSize>();
435     }
436     if (jsValue->IsObject()) {
437         auto gridContainerSize = AceType::MakeRefPtr<V2::GridContainerSize>();
438         auto gridParam = JSRef<JSObject>::Cast(jsValue);
439         std::optional<int32_t> containerSizeArray[MAX_NUMBER_BREAKPOINT];
440         auto xs = gridParam->GetProperty("xs");
441         if (xs->IsNumber() && xs->ToNumber<int32_t>() > 0) {
442             containerSizeArray[XS] = xs->ToNumber<int32_t>();
443         }
444         auto sm = gridParam->GetProperty("sm");
445         if (sm->IsNumber() && sm->ToNumber<int32_t>() > 0) {
446             containerSizeArray[SM] = sm->ToNumber<int32_t>();
447         }
448         auto md = gridParam->GetProperty("md");
449         if (md->IsNumber() && md->ToNumber<int32_t>() > 0) {
450             containerSizeArray[MD] = md->ToNumber<int32_t>();
451         }
452         auto lg = gridParam->GetProperty("lg");
453         if (lg->IsNumber() && lg->ToNumber<int32_t>() > 0) {
454             containerSizeArray[LG] = lg->ToNumber<int32_t>();
455         }
456         auto xl = gridParam->GetProperty("xl");
457         if (xl->IsNumber() && xl->ToNumber<int32_t>() > 0) {
458             containerSizeArray[XL] = xl->ToNumber<int32_t>();
459         }
460         auto xxl = gridParam->GetProperty("xxl");
461         if (xxl->IsNumber() && xxl->ToNumber<int32_t>() > 0) {
462             containerSizeArray[XXL] = xxl->ToNumber<int32_t>();
463         }
464         InheritGridColumns(gridContainerSize, containerSizeArray);
465         return gridContainerSize;
466     }
467     return AceType::MakeRefPtr<V2::GridContainerSize>();
468 }
469 
ParserBreakpoints(const JSRef<JSVal> & jsValue)470 RefPtr<V2::BreakPoints> ParserBreakpoints(const JSRef<JSVal>& jsValue)
471 {
472     if (!jsValue->IsObject()) {
473         return AceType::MakeRefPtr<V2::BreakPoints>();
474     }
475     auto breakpoints = JSRef<JSObject>::Cast(jsValue);
476     auto value = breakpoints->GetProperty("value");
477     auto reference = breakpoints->GetProperty("reference");
478     auto breakpoint = AceType::MakeRefPtr<V2::BreakPoints>();
479     if (reference->IsNumber()) {
480         breakpoint->reference = static_cast<V2::BreakPointsReference>(reference->ToNumber<int32_t>());
481     }
482     if (value->IsArray()) {
483         JSRef<JSArray> array = JSRef<JSArray>::Cast(value);
484         breakpoint->breakpoints.clear();
485         if (array->Length() > MAX_NUMBER_BREAKPOINT - 1) {
486             return breakpoint;
487         }
488         double width = -1.0;
489         for (size_t i = 0; i < array->Length(); i++) {
490             JSRef<JSVal> threshold = array->GetValueAt(i);
491             if (threshold->IsString() || threshold->IsNumber()) {
492                 CalcDimension valueDimension;
493                 JSContainerBase::ParseJsDimensionVp(threshold, valueDimension);
494                 breakpoint->userDefine = true;
495                 if (GreatNotEqual(width, valueDimension.Value())) {
496                     return breakpoint;
497                 }
498                 width = valueDimension.Value();
499                 breakpoint->breakpoints.push_back(threshold->ToString());
500             }
501         }
502     }
503     return breakpoint;
504 }
505 
ParserDirection(const JSRef<JSVal> & jsValue)506 V2::GridRowDirection ParserDirection(const JSRef<JSVal>& jsValue)
507 {
508     V2::GridRowDirection direction(V2::GridRowDirection::Row);
509     if (jsValue->IsNumber()) {
510         direction = static_cast<V2::GridRowDirection>(jsValue->ToNumber<int32_t>());
511     }
512     return direction;
513 }
514 
515 } // namespace
516 
Create(const JSCallbackInfo & info)517 void JSGridRow::Create(const JSCallbackInfo& info)
518 {
519     if (info[0]->IsObject()) {
520         auto gridRow = JSRef<JSObject>::Cast(info[0]);
521         auto columns = gridRow->GetProperty("columns");
522         auto gutter = gridRow->GetProperty("gutter");
523         auto breakpoints = gridRow->GetProperty("breakpoints");
524         auto direction = gridRow->GetProperty("direction");
525 
526         RefPtr<V2::GridContainerSize> parsedColumns;
527         if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_TWENTY)) {
528             parsedColumns = ParserColumns(columns);
529         } else {
530             parsedColumns = ParserColumnsNG(columns);
531         }
532         auto parsedGutter = ParserGutter(gutter);
533         auto parsedBreakpoints = ParserBreakpoints(breakpoints);
534         auto parsedDirection = ParserDirection(direction);
535         GridRowModel::GetInstance()->Create(parsedColumns, parsedGutter, parsedBreakpoints, parsedDirection);
536     } else {
537         GridRowModel::GetInstance()->Create();
538     }
539 }
540 
JsBreakpointEvent(const JSCallbackInfo & info)541 void JSGridRow::JsBreakpointEvent(const JSCallbackInfo& info)
542 {
543     if (!info[0]->IsFunction()) {
544         return;
545     }
546     auto jsFunc = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(info[0]));
547     WeakPtr<NG::FrameNode> targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
548     auto onBreakpointChange = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc), node = targetNode](
549                                   const std::string& value) {
550         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
551         ACE_SCORING_EVENT("GridRow.onBreakpointChange");
552         auto newJSVal = JSRef<JSVal>::Make(ToJSValue(value));
553         PipelineContext::SetCallBackNode(node);
554         func->ExecuteJS(1, &newJSVal);
555     };
556     GridRowModel::GetInstance()->SetOnBreakPointChange(onBreakpointChange);
557 }
558 
Height(const JSCallbackInfo & info)559 void JSGridRow::Height(const JSCallbackInfo& info)
560 {
561     JSViewAbstract::JsHeight(info[0]);
562     GridRowModel::GetInstance()->SetHeight();
563 }
564 
AlignItems(const JSCallbackInfo & info)565 void JSGridRow::AlignItems(const JSCallbackInfo& info)
566 {
567     if (info[0]->IsNumber()) {
568         auto value = info[0]->ToNumber<int32_t>();
569         ParseAlignItems(value);
570     } else if (info[0]->IsUndefined()) {
571         GridRowModel::GetInstance()->SetAlignItems(FlexAlign::FLEX_START);
572     }
573 }
574 
ParseAlignItems(int32_t alignItem)575 void JSGridRow::ParseAlignItems(int32_t alignItem)
576 {
577     if (alignItem == static_cast<int32_t>(FlexAlign::FLEX_START) ||
578         alignItem == static_cast<int32_t>(FlexAlign::FLEX_END) ||
579         alignItem == static_cast<int32_t>(FlexAlign::CENTER) || alignItem == static_cast<int32_t>(FlexAlign::STRETCH)) {
580         GridRowModel::GetInstance()->SetAlignItems(static_cast<FlexAlign>(alignItem));
581     } else if (Container::GreatOrEqualAPIVersion(PlatformVersion::VERSION_TEN)) {
582         GridRowModel::GetInstance()->SetAlignItems(FlexAlign::FLEX_START);
583     }
584 }
585 
JSBind(BindingTarget globalObj)586 void JSGridRow::JSBind(BindingTarget globalObj)
587 {
588     JSClass<JSGridRow>::Declare("GridRow");
589     JSClass<JSGridRow>::StaticMethod("create", &JSGridRow::Create);
590     JSClass<JSGridRow>::StaticMethod("onBreakpointChange", &JSGridRow::JsBreakpointEvent);
591     JSClass<JSGridRow>::StaticMethod("height", &JSGridRow::Height);
592     JSClass<JSGridRow>::StaticMethod("alignItems", &JSGridRow::AlignItems);
593     JSClass<JSGridRow>::StaticMethod("onDetach", &JSInteractableView::JsOnDetach);
594     JSClass<JSGridRow>::StaticMethod("onDisAppear", &JSInteractableView::JsOnDisAppear);
595     JSClass<JSGridRow>::StaticMethod("onAttach", &JSInteractableView::JsOnAttach);
596     JSClass<JSGridRow>::StaticMethod("onAppear", &JSInteractableView::JsOnAppear);
597     JSClass<JSGridRow>::StaticMethod("onTouch", &JSInteractableView::JsOnTouch);
598     JSClass<JSGridRow>::InheritAndBind<JSContainerBase>(globalObj);
599 }
600 
601 } // namespace OHOS::Ace::Framework
602