1 /*
2  * Copyright (c) 2021-2022 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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PICKER_RENDER_PICKER_BASE_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PICKER_RENDER_PICKER_BASE_H
18 
19 #include <functional>
20 #include <vector>
21 
22 #include "core/components/box/render_box.h"
23 #include "core/components/button/render_button.h"
24 #include "core/components/checkable/render_checkbox.h"
25 #include "core/components/gesture_listener/render_gesture_listener.h"
26 #include "core/components/picker/picker_base_component.h"
27 #include "core/components/picker/picker_text_component.h"
28 #include "core/components/picker/render_picker_column.h"
29 #include "core/components/stack/render_stack.h"
30 #include "core/components/triangle/render_triangle.h"
31 #include "core/gestures/click_recognizer.h"
32 #include "core/gestures/drag_recognizer.h"
33 #include "core/gestures/raw_recognizer.h"
34 #include "core/pipeline/base/render_node.h"
35 
36 namespace OHOS::Ace {
37 
38 class RenderPickerBase : public RenderNode {
39     DECLARE_ACE_TYPE(RenderPickerBase, RenderNode);
40 
41 public:
42     static RefPtr<RenderNode> Create();
43     void Update(const RefPtr<Component>& component) override;
44     void PerformLayout() override;
45 
OnPaintFinish()46     void OnPaintFinish() override
47     {
48         UpdateAccessibility();
49     }
50 
StartAnimation()51     void StartAnimation()
52     {
53         if (!data_) {
54             return;
55         }
56         data_->OnAnimationPlaying();
57     }
58 
59     void UpdateRenders();
60 
FlushColumnsOptions()61     void FlushColumnsOptions()
62     {
63         if (switch_ && data_ && data_->GetLunar()) {
64             auto lunar = data_->GetLunar();
65             lunar->SetValue(data_->IsShowLunar());
66             switch_->Update(lunar);
67             switch_->MarkNeedLayout();
68         }
69         for (const auto& column : columns_) {
70             column->FlushCurrentOptions();
71         }
72     }
73 
74     bool TouchTest(const Point& globalPoint, const Point& parentLocalPoint, const TouchRestrict& touchRestrict,
75         TouchTestResult& result) override;
76 
GetPickerBaseComponent()77     const RefPtr<PickerBaseComponent>& GetPickerBaseComponent() const
78     {
79         return data_;
80     }
81 
GetRenderPickerColumn()82     const std::vector<RefPtr<RenderPickerColumn>>& GetRenderPickerColumn() const
83     {
84         return columns_;
85     }
86 
GetColumnHeight()87     const Dimension& GetColumnHeight() const
88     {
89         return columnHeight_;
90     }
91 
GetRange()92     const std::vector<std::string>& GetRange() const
93     {
94         return range_;
95     }
96 
GetSelected()97     uint32_t GetSelected() const
98     {
99         return selectedIndex_;
100     }
101 
GetStartDate()102     const PickerDate& GetStartDate() const
103     {
104         return startDateSolar_;
105     }
106 
GetEndDate()107     const PickerDate& GetEndDate() const
108     {
109         return endDateSolar_;
110     }
111 
GetSelectedDate()112     const PickerDate& GetSelectedDate() const
113     {
114         return selectedDate_;
115     }
116 
GetType()117     const std::string GetType() const
118     {
119         return type_;
120     }
121 
122 protected:
OnTouchTestHit(const Offset &,const TouchRestrict &,TouchTestResult & result)123     void OnTouchTestHit(const Offset&, const TouchRestrict&, TouchTestResult& result) override
124     {
125         if (data_ && !data_->GetSubsidiary()) {
126             result.emplace_back(rawDetect_);
127         }
128     }
129 
SetTextOnCancel(const std::function<void (void)> & value)130     void SetTextOnCancel(const std::function<void(void)>& value)
131     {
132         onTextCancel_ = value;
133     }
134 
SetTextOnAccept(const std::function<void (const std::string &,double)> & value)135     void SetTextOnAccept(const std::function<void(const std::string&, double)>& value)
136     {
137         onTextAccept_ = value;
138     }
139 
SetTextOnChange(const std::function<void (const std::string &,double)> & value)140     void SetTextOnChange(const std::function<void(const std::string&, double)>& value)
141     {
142         onTextChange_ = value;
143     }
144 
145     void InitializeSelectedOption(const RefPtr<RenderPickerColumn>& pickerColumn);
146     const RefPtr<RenderBox> GetBgColorBox() const;
147     Size focusBoxSize_;
148     Offset focusBoxOffset_;
149 
150     RefPtr<PickerBaseComponent> data_;
151     std::vector<RefPtr<RenderPickerColumn>> columns_;
152     RefPtr<RenderBox> box_;
153     RefPtr<RenderNode> columnParent_;
154 
155     std::function<void(void)> onTextCancel_;
156     std::function<void(const std::string&, double)> onTextAccept_;
157     std::function<void(const std::string&, double)> onTextChange_;
158 
159 private:
160     void HandleFinish(bool success);
161     void HandleSwitch(bool checked);
162     void HandleColumnChange(const std::string& tag, bool isAdd, uint32_t index, bool needNotify);
163 
164     void GetRenders();
165     void GetRenders(const RefPtr<RenderNode>& render);
166     void DealRenders(const RefPtr<RenderNode>& render);
167     void ClearRenders();
168 
169     void InitPickerAnimation();
170 
171     void SetButtonHandler();
172     void SetSwitchHandler();
173 
174     void LayoutBoxes();
175     void LayoutColumns();
176     void SetOutBoxBorderRadius();
177 
178     void UpdateAccessibility();
179     void UpdateTextAccessibility(const RefPtr<AccessibilityNode>& node, const RefPtr<RenderText>& text);
180     void UpdateButtonAccessibility(const RefPtr<AccessibilityNode>& node, const RefPtr<RenderButton>& button);
181     void UpdateSwitchAccessibility(const RefPtr<AccessibilityNode>& node, const RefPtr<RenderCheckbox>& renderSwitch);
182     // used for inspector node in PC preview
183     void UpdatePickerDialogAccessibility(const RefPtr<AccessibilityNode>& node, const RefPtr<RenderBox>& box);
184 
185     void SetTriangleHandler();
186     void HandleTriangleClick(bool value);
187 
188     bool onChildTouchTest(const RefPtr<RenderNode>& child, const TouchRestrict& touchRestrict, TouchTestResult& result);
189 
190     enum DialogStatus {
191         ACCEPT = 0,
192         CANCEL,
193         UPDATE,
194     };
195 
196     bool switchHandlerSetted_ = false;
197     bool hasLayout_ = false;
198     Dimension columnHeight_;
199     uint32_t selectedIndex_ = 0;
200     std::vector<std::string> range_ {""};
201     std::string type_ = "DatePickerType.Date";
202     PickerDate startDateSolar_ = PickerDate(1970, 1, 1);
203     PickerDate endDateSolar_ = PickerDate(2100, 12, 31);
204     PickerDate selectedDate_ = PickerDate::Current();
205 
206     std::function<void()> onCancelCallback_;
207     std::function<void(const std::shared_ptr<BaseEventInfo>&)> onChangeCallback_;
208     std::function<void(const std::string&)> onJSChangeCallback_;
209     std::function<void(const std::string&)> onColumnChangeCallback_;
210     std::function<void(const std::string&)> onDialogAccept_;
211     std::function<void()> onDialogCancel_;
212     std::function<void(const std::string&)> onDialogChange_;
213     RefPtr<RenderText> title_;
214     RefPtr<RenderTriangle> triangle_;
215     RefPtr<RenderDisplay> lunarDisplay_;
216     RefPtr<RenderDisplay> buttonsDisplay_;
217     RefPtr<RenderStack> stack_;
218     RefPtr<RenderBox> outBox_;
219     RefPtr<RenderButton> cancel_;
220     RefPtr<RenderButton> ok_;
221     RefPtr<RenderCheckbox> switch_;
222     RefPtr<RenderText> lunarText_;
223     RefPtr<RawRecognizer> rawDetect_ = AceType::MakeRefPtr<RawRecognizer>();
224 };
225 
226 } // namespace OHOS::Ace
227 
228 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PICKER_RENDER_PICKER_BASE_H
229