• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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