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_stepper.h"
17
18 #include "base/utils/linear_map.h"
19 #include "base/utils/utils.h"
20 #include "core/components/common/properties/color.h"
21 #include "core/components/stepper/stepper_theme.h"
22 #include "core/components/theme/theme_manager.h"
23 #include "frameworks/bridge/common/dom/dom_stepper_item.h"
24 #include "frameworks/bridge/common/utils/utils.h"
25
26 namespace OHOS::Ace::Framework {
27 namespace {
28
29 constexpr int32_t DEFAULT_NODE_INDEX = -1;
30 constexpr int32_t METHOD_TO_ARGS_SIZE = 1;
31
32 } // namespace
33
DOMStepper(NodeId nodeId,const std::string & nodeName)34 DOMStepper::DOMStepper(NodeId nodeId, const std::string& nodeName) : DOMNode(nodeId, nodeName)
35 {
36 stepperComponent_ = AceType::MakeRefPtr<StepperComponent>(std::list<RefPtr<Component>>());
37 }
38
SetSpecializedAttr(const std::pair<std::string,std::string> & attr)39 bool DOMStepper::SetSpecializedAttr(const std::pair<std::string, std::string>& attr)
40 {
41 // static linear map must be sorted by key.
42 static const LinearMapNode<void (*)(const std::string&, DOMStepper&)> attrsOperators[] = {
43 { DOM_STEPPER_INDEX,
44 [](const std::string& val, DOMStepper& stepper) {
45 stepper.stepperComponent_->SetIndex(StringUtils::StringToInt(val));
46 } },
47 };
48 auto iter = BinarySearchFindIndex(attrsOperators, ArraySize(attrsOperators), attr.first.c_str());
49 if (iter != -1) {
50 attrsOperators[iter].value(attr.second, *this);
51 return true;
52 } else {
53 return false;
54 }
55 }
56
SetSpecializedStyle(const std::pair<std::string,std::string> & style)57 bool DOMStepper::SetSpecializedStyle(const std::pair<std::string, std::string>& style)
58 {
59 return false;
60 }
61
AddSpecializedEvent(int32_t pageId,const std::string & event)62 bool DOMStepper::AddSpecializedEvent(int32_t pageId, const std::string& event)
63 {
64 // static linear map must be sorted by key.
65 static const LinearMapNode<void (*)(int32_t, DOMStepper&)> eventOperators[] = {
66 {
67 DOM_STEPPER_EVENT_BACK,
68 [](int32_t pageId, DOMStepper& stepper) {
69 stepper.backEventId_ = EventMarker(stepper.GetNodeIdForEvent(), DOM_STEPPER_EVENT_BACK, pageId);
70 stepper.stepperComponent_->SetBackEventId(stepper.backEventId_);
71 },
72 },
73 {
74 DOM_STEPPER_EVENT_CHANGE,
75 [](int32_t pageId, DOMStepper& stepper) {
76 stepper.changeEventId_ = EventMarker(stepper.GetNodeIdForEvent(), DOM_STEPPER_EVENT_CHANGE, pageId);
77 stepper.stepperComponent_->SetChangeEventId(stepper.changeEventId_);
78 },
79 },
80 {
81 DOM_STEPPER_EVENT_FINISH,
82 [](int32_t pageId, DOMStepper& stepper) {
83 stepper.finishEventId_ = EventMarker(stepper.GetNodeIdForEvent(), DOM_STEPPER_EVENT_FINISH, pageId);
84 stepper.stepperComponent_->SetFinishEventId(stepper.finishEventId_);
85 },
86 },
87 {
88 DOM_STEPPER_EVENT_NEXT,
89 [](int32_t pageId, DOMStepper& stepper) {
90 stepper.nextEventId_ = EventMarker(stepper.GetNodeIdForEvent(), DOM_STEPPER_EVENT_NEXT, pageId);
91 stepper.stepperComponent_->SetNextEventId(stepper.nextEventId_);
92 },
93 },
94 {
95 DOM_STEPPER_EVENT_SKIP,
96 [](int32_t pageId, DOMStepper& stepper) {
97 stepper.skipEventId_ = EventMarker(stepper.GetNodeIdForEvent(), DOM_STEPPER_EVENT_SKIP, pageId);
98 stepper.stepperComponent_->SetSkipEventId(stepper.skipEventId_);
99 },
100 },
101 };
102 auto iter = BinarySearchFindIndex(eventOperators, ArraySize(eventOperators), event.c_str());
103 if (iter != -1) {
104 eventOperators[iter].value(pageId, *this);
105 return true;
106 }
107 return false;
108 }
109
CallSpecializedMethod(const std::string & method,const std::string & args)110 void DOMStepper::CallSpecializedMethod(const std::string& method, const std::string& args)
111 {
112 if (method == DOM_STEPPER_SET_RIGHT_BUTTON_STATUS) {
113 auto controller = stepperComponent_->GetStepperController();
114 if (!controller) {
115 LOGE("get controller failed");
116 return;
117 }
118 std::unique_ptr<JsonValue> argsValue = JsonUtil::ParseJsonString(args);
119 if (!argsValue || !argsValue->IsArray() || argsValue->GetArraySize() != METHOD_TO_ARGS_SIZE) {
120 LOGE("parse args error");
121 return;
122 }
123 std::unique_ptr<JsonValue> valueParams = argsValue->GetArrayItem(0);
124
125 std::string status;
126 std::unique_ptr<JsonValue> statusValue = valueParams->GetValue("status");
127 if (statusValue && statusValue->IsString()) {
128 status = statusValue->GetString();
129 }
130
131 std::string label;
132 std::unique_ptr<JsonValue> labelValue = valueParams->GetValue("label");
133 if (labelValue && labelValue->IsString()) {
134 label = labelValue->GetString();
135 }
136 controller->SetRightButtonStatus(status, label);
137 }
138 }
139
OnChildNodeAdded(const RefPtr<DOMNode> & child,int32_t slot)140 void DOMStepper::OnChildNodeAdded(const RefPtr<DOMNode>& child, int32_t slot)
141 {
142 auto domStepperItem = AceType::DynamicCast<DOMStepperItem>(child);
143 if (!domStepperItem) {
144 LOGE("child is not stepper item, add to stepper failed.");
145 return;
146 }
147 auto childIndex = domStepperItem->GetItemIndex();
148 LOGD("DOMStepper AddChild %{public}s, childIndex: %{public}d, slot: %{public}d",
149 child->GetTag().c_str(), childIndex, slot);
150 if (childIndex != DEFAULT_NODE_INDEX) {
151 stepperComponent_->InsertChild(childIndex, child->GetRootComponent());
152 } else {
153 stepperComponent_->AppendChild(child->GetRootComponent());
154 }
155 }
156
OnChildNodeRemoved(const RefPtr<DOMNode> & child)157 void DOMStepper::OnChildNodeRemoved(const RefPtr<DOMNode>& child)
158 {
159 if (!stepperComponent_ || !child) {
160 LOGE("DOMStepper OnChildNodeRemoved listComponent_ is null");
161 return;
162 }
163 stepperComponent_->RemoveChild(child->GetRootComponent());
164 }
165
InitializeStyle()166 void DOMStepper::InitializeStyle()
167 {
168 ResetInitializedStyle();
169 }
170
ResetInitializedStyle()171 void DOMStepper::ResetInitializedStyle()
172 {
173 auto theme = GetTheme<StepperTheme>();
174 if (!theme) {
175 LOGE("Stepper theme is null");
176 return;
177 }
178 stepperComponent_->SetDefaultPaddingStart(theme->GetDefaultPaddingStart());
179 stepperComponent_->SetDefaultPaddingEnd(theme->GetDefaultPaddingEnd());
180 stepperComponent_->SetProgressColor(theme->GetProgressColor());
181 stepperComponent_->SetProgressDiameter(theme->GetProgressDiameter());
182 stepperComponent_->SetArrowWidth(theme->GetArrowWidth());
183 stepperComponent_->SetArrowHeight(theme->GetArrowHeight());
184 stepperComponent_->SetArrowColor(theme->GetArrowColor());
185 stepperComponent_->SetDisabledColor(theme->GetDisabledColor());
186 stepperComponent_->SetRadius(theme->GetRadius());
187 stepperComponent_->SetButtonPressedColor(theme->GetButtonPressedColor());
188 stepperComponent_->SetButtonPressedHeight(theme->GetButtonPressedHeight());
189 stepperComponent_->SetControlHeight(theme->GetControlHeight());
190 stepperComponent_->SetControlMargin(theme->GetControlMargin());
191 stepperComponent_->SetControlPadding(theme->GetControlPadding());
192 stepperComponent_->SetFocusColor(theme->GetFocusColor());
193 stepperComponent_->SetFocusBorderWidth(theme->GetFocusBorderWidth());
194 stepperComponent_->SetMouseHoverColor(theme->GetMouseHoverColor());
195 stepperComponent_->SetDisabledAlpha(theme->GetDisabledAlpha());
196 }
197
PrepareSpecializedComponent()198 void DOMStepper::PrepareSpecializedComponent()
199 {
200 stepperComponent_->SetTextDirection(IsRightToLeft() ? TextDirection::RTL : TextDirection::LTR);
201 }
202
203 } // namespace OHOS::Ace::Framework
204