1 /*
2 * Copyright (c) 2020 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 "acelite_config.h"
17
18 #if (FEATURE_COMPONENT_TABS == 1)
19
20 #include "js_fwk_common.h"
21 #include "key_parser.h"
22 #include "keys.h"
23 #include "tab_bar_component.h"
24 #include "ui_label.h"
25 #include "ace_log.h"
26 #include "ace_mem_base.h"
27
28 namespace OHOS {
29 namespace ACELite {
TabBarComponent(jerry_value_t options,jerry_value_t children,AppStyleManager * styleManager)30 TabBarComponent::TabBarComponent(jerry_value_t options, jerry_value_t children, AppStyleManager* styleManager)
31 : Component(options, children, styleManager),
32 options_(options),
33 children_(children),
34 width_(0),
35 height_(0),
36 mode_(nullptr)
37 {
38 SetComponentName(K_TAB_BAR);
39 combinedStyle_ = GetStyleManager()->GetCombinedStyle();
40 }
41
GetChildrenLength()42 uint8_t TabBarComponent::GetChildrenLength()
43 {
44 return jerry_get_array_length(children_);
45 }
46
ReleaseNativeViews()47 void TabBarComponent::ReleaseNativeViews()
48 {
49 if (mode_) {
50 ace_free(mode_);
51 mode_ = nullptr;
52 }
53 }
54
GetTextByIndex(uint8_t index)55 const char* TabBarComponent::GetTextByIndex(uint8_t index)
56 {
57 jerry_value_t childHandler = jerry_get_property_by_index(children_, index);
58 Component* textComponent = ComponentUtils::GetComponentFromBindingObject(childHandler);
59 if (textComponent == nullptr) {
60 jerry_release_value(childHandler);
61 return nullptr;
62 }
63 if (textComponent->GetComponentName() == K_TEXT) {
64 UIView* view = textComponent->GetComponentRootView();
65 UILabel* label = reinterpret_cast<UILabel *>(view);
66 if (label == nullptr) {
67 jerry_release_value(childHandler);
68 return nullptr;
69 }
70 jerry_release_value(childHandler);
71 return label->GetText();
72 }
73
74 jerry_release_value(childHandler);
75 return nullptr;
76 }
77
PreRender()78 void TabBarComponent::PreRender()
79 {
80 SetWidth();
81 SetHeight();
82 SetMode();
83 }
84
SetWidth()85 void TabBarComponent::SetWidth()
86 {
87 jerry_value_t widthKeyHandler = jerry_create_string(reinterpret_cast<const jerry_char_t *>(ATTR_WIDTH));
88 jerry_value_t widthValHandler = GetAttrValHandler(widthKeyHandler);
89 int32_t defaultWidth = GetHorizontalResolution();
90 width_ = defaultWidth;
91 if (jerry_value_is_undefined(widthValHandler)) {
92 if (combinedStyle_) {
93 const AppStyleItem* item = combinedStyle_->GetStyleItemByNameId(K_WIDTH);
94 defaultWidth = (item == nullptr) ? defaultWidth : item->GetNumValue();
95 }
96 }
97 if (defaultWidth >= 0 && defaultWidth <= INT16_MAX) {
98 width_ = defaultWidth;
99 } else {
100 HILOG_DEBUG(HILOG_MODULE_ACE, "set width of tab-bar fail.");
101 }
102 jerry_release_value(widthValHandler);
103 jerry_release_value(widthKeyHandler);
104 }
105
SetHeight()106 void TabBarComponent::SetHeight()
107 {
108 jerry_value_t heightKeyHandler = jerry_create_string(reinterpret_cast<const jerry_char_t *>(ATTR_HEIGHT));
109 jerry_value_t heightValHandler = GetAttrValHandler(heightKeyHandler);
110 int32_t defaultHeight = 50;
111 height_ = defaultHeight;
112 if (jerry_value_is_undefined(heightValHandler)) {
113 if (combinedStyle_) {
114 const AppStyleItem* item = combinedStyle_->GetStyleItemByNameId(K_HEIGHT);
115 defaultHeight = (item == nullptr) ? defaultHeight : item->GetNumValue();
116 }
117 }
118 if (defaultHeight >= 0 && defaultHeight <= VERTICAL_RESOLUTION) {
119 height_ = defaultHeight;
120 } else {
121 HILOG_DEBUG(HILOG_MODULE_ACE, "set height of tab-bar fail.");
122 }
123 jerry_release_value(heightValHandler);
124 jerry_release_value(heightKeyHandler);
125 }
126
SetMode()127 void TabBarComponent::SetMode()
128 {
129 const char * const attrMode = "mode";
130 jerry_value_t modeKeyHandler = jerry_create_string(reinterpret_cast<const jerry_char_t *>(attrMode));
131 jerry_value_t modeValHandler = GetAttrValHandler(modeKeyHandler);
132 char defaultMode[] = "fixed";
133 mode_ = static_cast<char *>(ace_malloc(sizeof(defaultMode)));
134 if (mode_ == nullptr) {
135 HILOG_ERROR(HILOG_MODULE_ACE, "malloc mode_ failed.");
136 } else {
137 if (memcpy_s(mode_, sizeof(defaultMode), defaultMode, sizeof(defaultMode)) != 0) {
138 HILOG_ERROR(HILOG_MODULE_ACE, "memcpy mode_ failed.");
139 ace_free(mode_);
140 mode_ = nullptr;
141 jerry_release_value(modeValHandler);
142 jerry_release_value(modeKeyHandler);
143 return;
144 }
145 if (!jerry_value_is_undefined(modeValHandler) && jerry_value_is_string(modeValHandler)) {
146 char* newMode_ = MallocStringOf(modeValHandler);
147 if (newMode_ != nullptr) {
148 ace_free(mode_);
149 mode_ = newMode_;
150 }
151 } else {
152 HILOG_DEBUG(HILOG_MODULE_ACE, "tab-bar mode value is not define or error.");
153 }
154 }
155 jerry_release_value(modeValHandler);
156 jerry_release_value(modeKeyHandler);
157 }
158
GetAttrValHandler(jerry_value_t attrKeyHandler)159 jerry_value_t TabBarComponent::GetAttrValHandler(jerry_value_t attrKeyHandler)
160 {
161 jerry_value_t attrsKeyHandler = jerry_create_string(reinterpret_cast<const jerry_char_t *>(ATTR_ATTRS));
162 jerry_value_t attrsValHandler = jerry_get_property(options_, attrsKeyHandler);
163 if (jerry_value_is_undefined(attrsValHandler)) {
164 jerry_release_value(attrsKeyHandler);
165 return UNDEFINED;
166 }
167
168 jerry_value_t attrValHandler = jerry_get_property(attrsValHandler, attrKeyHandler);
169 if (jerry_value_is_function(attrValHandler)) {
170 jerry_value_t globalObject = jerry_get_global_object();
171 jerry_value_t appPropName = jerry_create_string((const jerry_char_t*)ATTR_ROOT);
172 jerry_value_t appViewModel = jerry_get_property(globalObject, appPropName);
173 jerry_value_t newAttrValHandler = jerry_call_function(attrValHandler, appViewModel, nullptr, 0);
174 if (newAttrValHandler != attrValHandler) {
175 jerry_release_value(attrValHandler);
176 attrValHandler = newAttrValHandler;
177 }
178 ReleaseJerryValue(appViewModel, appPropName, globalObject, VA_ARG_END_FLAG);
179 }
180 if (jerry_value_is_undefined(attrValHandler) || jerry_value_is_error(attrValHandler)) {
181 jerry_release_value(attrValHandler);
182 attrValHandler = UNDEFINED;
183 }
184 jerry_release_value(attrsValHandler);
185 jerry_release_value(attrsKeyHandler);
186 return attrValHandler;
187 }
188 } // namespace ACELite
189 } // namespace OHOS
190
191 #endif // FEATURE_COMPONENT_TABS
192