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