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 return;
116 }
117 std::unique_ptr<JsonValue> argsValue = JsonUtil::ParseJsonString(args);
118 if (!argsValue || !argsValue->IsArray() || argsValue->GetArraySize() != METHOD_TO_ARGS_SIZE) {
119 LOGW("stepper parse args error");
120 return;
121 }
122 std::unique_ptr<JsonValue> valueParams = argsValue->GetArrayItem(0);
123
124 std::string status;
125 std::unique_ptr<JsonValue> statusValue = valueParams->GetValue("status");
126 if (statusValue && statusValue->IsString()) {
127 status = statusValue->GetString();
128 }
129
130 std::string label;
131 std::unique_ptr<JsonValue> labelValue = valueParams->GetValue("label");
132 if (labelValue && labelValue->IsString()) {
133 label = labelValue->GetString();
134 }
135 controller->SetRightButtonStatus(status, label);
136 }
137 }
138
OnChildNodeAdded(const RefPtr<DOMNode> & child,int32_t slot)139 void DOMStepper::OnChildNodeAdded(const RefPtr<DOMNode>& child, int32_t slot)
140 {
141 auto domStepperItem = AceType::DynamicCast<DOMStepperItem>(child);
142 if (!domStepperItem) {
143 return;
144 }
145 auto childIndex = domStepperItem->GetItemIndex();
146 if (childIndex != DEFAULT_NODE_INDEX) {
147 stepperComponent_->InsertChild(childIndex, child->GetRootComponent());
148 } else {
149 stepperComponent_->AppendChild(child->GetRootComponent());
150 }
151 }
152
OnChildNodeRemoved(const RefPtr<DOMNode> & child)153 void DOMStepper::OnChildNodeRemoved(const RefPtr<DOMNode>& child)
154 {
155 if (!stepperComponent_ || !child) {
156 return;
157 }
158 stepperComponent_->RemoveChild(child->GetRootComponent());
159 }
160
InitializeStyle()161 void DOMStepper::InitializeStyle()
162 {
163 ResetInitializedStyle();
164 }
165
ResetInitializedStyle()166 void DOMStepper::ResetInitializedStyle()
167 {
168 auto theme = GetTheme<StepperTheme>();
169 if (!theme) {
170 return;
171 }
172 stepperComponent_->SetDefaultPaddingStart(theme->GetDefaultPaddingStart());
173 stepperComponent_->SetDefaultPaddingEnd(theme->GetDefaultPaddingEnd());
174 stepperComponent_->SetProgressColor(theme->GetProgressColor());
175 stepperComponent_->SetProgressDiameter(theme->GetProgressDiameter());
176 stepperComponent_->SetArrowWidth(theme->GetArrowWidth());
177 stepperComponent_->SetArrowHeight(theme->GetArrowHeight());
178 stepperComponent_->SetArrowColor(theme->GetArrowColor());
179 stepperComponent_->SetDisabledColor(theme->GetDisabledColor());
180 stepperComponent_->SetRadius(theme->GetRadius());
181 stepperComponent_->SetButtonPressedColor(theme->GetButtonPressedColor());
182 stepperComponent_->SetButtonPressedHeight(theme->GetButtonPressedHeight());
183 stepperComponent_->SetControlHeight(theme->GetControlHeight());
184 stepperComponent_->SetControlMargin(theme->GetControlMargin());
185 stepperComponent_->SetControlPadding(theme->GetControlPadding());
186 stepperComponent_->SetFocusColor(theme->GetFocusColor());
187 stepperComponent_->SetFocusBorderWidth(theme->GetFocusBorderWidth());
188 stepperComponent_->SetMouseHoverColor(theme->GetMouseHoverColor());
189 stepperComponent_->SetDisabledAlpha(theme->GetDisabledAlpha());
190 }
191
PrepareSpecializedComponent()192 void DOMStepper::PrepareSpecializedComponent()
193 {
194 stepperComponent_->SetTextDirection(IsRightToLeft() ? TextDirection::RTL : TextDirection::LTR);
195 }
196
197 } // namespace OHOS::Ace::Framework
198