• 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_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