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 "frameworks/bridge/common/dom/dom_navigation_bar.h"
17
18 #include "base/log/event_report.h"
19 #include "base/utils/linear_map.h"
20 #include "base/utils/utils.h"
21 #include "frameworks/bridge/common/dom/dom_type.h"
22 #include "frameworks/bridge/common/utils/utils.h"
23
24 namespace OHOS::Ace::Framework {
25 namespace {
26
27 const char EMPHASIZE[] = "emphasize";
GetType(const std::string & value)28 NavigationBarType GetType(const std::string& value)
29 {
30 return value == EMPHASIZE ? NavigationBarType::EMPHASIZE : NavigationBarType::NORMAL;
31 }
32
33 } // namespace
34
DomNavigationBar(NodeId nodeId,const std::string & nodeName)35 DomNavigationBar::DomNavigationBar(NodeId nodeId, const std::string& nodeName)
36 : DOMNode(nodeId, nodeName),
37 navigationBarComponent_(AceType::MakeRefPtr<NavigationBarComponent>(std::to_string(nodeId), nodeName)),
38 navigationBarData_(navigationBarComponent_->GetData())
39 {
40 if (IsRightToLeft()) {
41 navigationBarComponent_->SetTextDirection(TextDirection::RTL);
42 }
43 }
44
InitializeStyle()45 void DomNavigationBar::InitializeStyle()
46 {
47 auto theme = GetTheme<NavigationBarTheme>();
48 navigationBarData_->theme = theme;
49 navigationBarData_->subTitleColor = theme->GetSubTitleColor();
50 navigationBarData_->titleColor = theme->GetTitleColor();
51 }
52
ResetInitializedStyle()53 void DomNavigationBar::ResetInitializedStyle()
54 {
55 InitializeStyle();
56 }
57
58 #ifndef WEARABLE_PRODUCT
OnChildNodeRemoved(const RefPtr<DOMNode> & child)59 void DomNavigationBar::OnChildNodeRemoved(const RefPtr<DOMNode>& child)
60 {
61 if (!child || !navigationBarData_) {
62 return;
63 }
64
65 auto menu = AceType::DynamicCast<MenuComponent>(child->GetSpecializedComponent());
66 if (menu) {
67 navigationBarData_->menu = nullptr;
68 navigationBarData_->allMenuItems.clear();
69 return;
70 }
71 auto tabBar = AceType::DynamicCast<TabBarComponent>(child->GetSpecializedComponent());
72 if (tabBar) {
73 navigationBarData_->tabBar = nullptr;
74 return;
75 }
76
77 auto selectPopup = AceType::DynamicCast<SelectComponent>(child->GetSpecializedComponent());
78 if (selectPopup) {
79 navigationBarData_->selectPopup = nullptr;
80 }
81 }
82
OnChildNodeAdded(const RefPtr<DOMNode> & child,int32_t slot)83 void DomNavigationBar::OnChildNodeAdded(const RefPtr<DOMNode>& child, int32_t slot)
84 {
85 if (!child || !navigationBarComponent_) {
86 return;
87 }
88
89 auto menu = AceType::DynamicCast<MenuComponent>(child->GetSpecializedComponent());
90 if (menu) {
91 navigationBarData_->menu = menu;
92 return;
93 }
94 auto tabBar = AceType::DynamicCast<TabBarComponent>(child->GetSpecializedComponent());
95 if (tabBar) {
96 navigationBarData_->tabBar = tabBar;
97 return;
98 }
99
100 auto selectPopup = AceType::DynamicCast<SelectComponent>(child->GetSpecializedComponent());
101 if (selectPopup) {
102 navigationBarData_->selectPopup = selectPopup;
103 }
104 }
105 #endif
106
CallSpecializedMethod(const std::string & method,const std::string & args)107 void DomNavigationBar::CallSpecializedMethod(const std::string& method, const std::string& args)
108 {
109 if (!navigationBarData_->controller) {
110 EventReport::SendComponentException(ComponentExcepType::NAVIGATION_BAR_ERR);
111 return;
112 }
113 if (method == DOM_NAVIGATION_BAR_METHOD_SHOW) {
114 navigationBarData_->controller->Show();
115 } else if (method == DOM_NAVIGATION_BAR_METHOD_HIDE) {
116 navigationBarData_->controller->Hide();
117 }
118 }
119
PrepareSpecializedComponent()120 void DomNavigationBar::PrepareSpecializedComponent()
121 {
122 navigationBarData_->imageFill = GetImageFill();
123 }
124
SetSpecializedAttr(const std::pair<std::string,std::string> & attr)125 bool DomNavigationBar::SetSpecializedAttr(const std::pair<std::string, std::string>& attr)
126 {
127 static const LinearMapNode<void (*)(const std::string&, const RefPtr<NavigationBarData>&)> attrOperators[] = {
128 { DOM_NAVIGATION_BAR_BACK_ENABLED,
129 [](const std::string& val, const RefPtr<NavigationBarData>& navigationBar) {
130 navigationBar->backEnabled = StringToBool(val);
131 } },
132 { DOM_NAVIGATION_BAR_END_ICON,
133 [](const std::string& val, const RefPtr<NavigationBarData>& navigationBar) {
134 navigationBar->endIcon = val;
135 } },
136 { DOM_NAVIGATION_BAR_HEADER, [](const std::string& val,
137 const RefPtr<NavigationBarData>& navigationBar) { navigationBar->header = val; } },
138 { DOM_NAVIGATION_BAR_LOGO,
139 [](const std::string& val, const RefPtr<NavigationBarData>& navigationBar) { navigationBar->logo = val; } },
140 { DOM_NAVIGATION_BAR_START_ICON,
141 [](const std::string& val, const RefPtr<NavigationBarData>& navigationBar) {
142 navigationBar->startIcon = val;
143 } },
144 { DOM_NAVIGATION_BAR_SUBTITLE,
145 [](const std::string& val, const RefPtr<NavigationBarData>& navigationBar) {
146 navigationBar->subTitle = val;
147 } },
148 { DOM_NAVIGATION_BAR_TITLE, [](const std::string& val,
149 const RefPtr<NavigationBarData>& navigationBar) { navigationBar->title = val; } },
150 { DOM_NAVIGATION_BAR_TYPE,
151 [](const std::string& val, const RefPtr<NavigationBarData>& navigationBar) {
152 navigationBar->type = GetType(val);
153 } },
154 };
155 auto operatorIter = BinarySearchFindIndex(attrOperators, ArraySize(attrOperators), attr.first.c_str());
156 if (operatorIter != -1) {
157 attrOperators[operatorIter].value(attr.second, navigationBarData_);
158 return true;
159 }
160 return false;
161 }
162
SetSpecializedStyle(const std::pair<std::string,std::string> & style)163 bool DomNavigationBar::SetSpecializedStyle(const std::pair<std::string, std::string>& style)
164 {
165 static const LinearMapNode<void (*)(const std::string&, const DomNavigationBar&)> navigationBarStyleOperators[] = {
166 { DOM_NAVIGATION_BAR_SUBTITLE_COLOR,
167 [](const std::string& val, const DomNavigationBar& node) {
168 node.navigationBarData_->subTitleColor = node.ParseColor(val);
169 } },
170 { DOM_NAVIGATION_BAR_TITLE_COLOR,
171 [](const std::string& val, const DomNavigationBar& node) {
172 node.navigationBarData_->titleColor = node.ParseColor(val);
173 } },
174 };
175 auto operatorIter =
176 BinarySearchFindIndex(navigationBarStyleOperators, ArraySize(navigationBarStyleOperators), style.first.c_str());
177 if (operatorIter != -1) {
178 navigationBarStyleOperators[operatorIter].value(style.second, *this);
179 return true;
180 }
181 return false;
182 }
183
AddSpecializedEvent(int32_t pageId,const std::string & event)184 bool DomNavigationBar::AddSpecializedEvent(int32_t pageId, const std::string& event)
185 {
186 if (event == DOM_NAVIGATION_BAR_EVENT_BACK_CLICK) {
187 navigationBarData_->backClickMarker = EventMarker(GetNodeIdForEvent(), event, pageId);
188 } else if (event == DOM_NAVIGATION_BAR_EVENT_START_CLICK) {
189 navigationBarData_->startClickMarker = EventMarker(GetNodeIdForEvent(), event, pageId);
190 } else if (event == DOM_NAVIGATION_BAR_EVENT_END_CLICK) {
191 navigationBarData_->endClickMarker = EventMarker(GetNodeIdForEvent(), event, pageId);
192 } else {
193 return false;
194 }
195 return true;
196 }
197
198 } // namespace OHOS::Ace::Framework
199