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