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_PICKER_BASE_COMPONENT_H
17  #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PICKER_PICKER_BASE_COMPONENT_H
18  
19  #include "base/utils/system_properties.h"
20  #include "core/accessibility/accessibility_manager.h"
21  #include "core/common/container.h"
22  #include "core/components/checkable/checkable_component.h"
23  #include "core/components/common/rotation/rotation_controller.h"
24  #include "core/components/dialog/dialog_component.h"
25  #include "core/components/picker/picker_animation_controller.h"
26  #include "core/components/picker/picker_column_component.h"
27  #include "core/components/picker/picker_data.h"
28  #include "core/components/stack/stack_element.h"
29  #include "core/components/text/text_component.h"
30  #include "core/event/back_end_event_manager.h"
31  #include "core/pipeline/base/sole_child_component.h"
32  #include "core/components_v2/common/common_def.h"
33  
34  namespace OHOS::Ace {
35  
36  class ACE_EXPORT DatePickerChangeEvent : public BaseEventInfo {
37      DECLARE_RELATIONSHIP_OF_CLASSES(DatePickerChangeEvent, BaseEventInfo);
38  
39  public:
DatePickerChangeEvent(const std::string & str)40      explicit DatePickerChangeEvent(const std::string& str) : BaseEventInfo
41          ("DatePickerChangeEvent"), selectedStr_(str) {}
42      ~DatePickerChangeEvent() = default;
43  
GetSelectedStr()44      const std::string& GetSelectedStr() const
45      {
46          return selectedStr_;
47      }
48  
49  private:
50      std::string selectedStr_;
51  };
52  
53  class ACE_EXPORT PickerBaseComponent : public SoleChildComponent {
54      DECLARE_ACE_TYPE(PickerBaseComponent, SoleChildComponent);
55  
56  public:
PickerBaseComponent()57      PickerBaseComponent() : rotationController_(AceType::MakeRefPtr<RotationController>()) {}
58      ~PickerBaseComponent() override = default;
59  
60      RefPtr<RenderNode> CreateRenderNode() override;
61      RefPtr<Element> CreateElement() override;
62  
63      void Initialize(const RefPtr<AccessibilityManager>& accessibilityManager, const RefPtr<ThemeManager>& themeManager);
64  
SetDialogName(const std::string & dialogName)65      void SetDialogName(const std::string& dialogName)
66      {
67          dialogInsprctorTag_ = dialogName;
68      }
69  
GetDialogName()70      const std::string& GetDialogName()
71      {
72          return dialogInsprctorTag_;
73      }
74  
GetHasTitle()75      bool GetHasTitle() const
76      {
77          return hasTitle_;
78      }
SetHasTitle(bool value)79      void SetHasTitle(bool value)
80      {
81          hasTitle_ = (!subsidiary_ && value);
82      }
83  
GetHasLunar()84      bool GetHasLunar() const
85      {
86          return hasLunar_;
87      }
SetHasLunar(bool value)88      void SetHasLunar(bool value)
89      {
90          hasLunar_ = SystemProperties::GetDeviceType() == DeviceType::PHONE && value;
91      }
92  
GetHasButtons()93      bool GetHasButtons() const
94      {
95          return hasButtons_;
96      }
SetHasButtons(bool value)97      void SetHasButtons(bool value)
98      {
99          hasButtons_ = (!subsidiary_ && value);
100      }
101  
GetHasTriangle()102      bool GetHasTriangle() const
103      {
104          return hasTriangle_;
105      }
SetHasTriangle(bool value)106      void SetHasTriangle(bool value)
107      {
108          hasTriangle_ = value;
109      }
110  
GetIsDialog()111      bool GetIsDialog() const
112      {
113          return isDialog_;
114      }
SetIsDialog(bool value)115      void SetIsDialog(bool value)
116      {
117          isDialog_ = value;
118      }
119  
GetIsCreateDialogComponent()120      bool GetIsCreateDialogComponent() const
121      {
122          return isCreateDialogComponent_;
123      }
SetIsCreateDialogComponent(bool value)124      void SetIsCreateDialogComponent(bool value)
125      {
126          isCreateDialogComponent_ = value;
127      }
128  
GetSubsidiary()129      bool GetSubsidiary() const
130      {
131          return subsidiary_;
132      }
SetSubsidiary(bool value)133      void SetSubsidiary(bool value)
134      {
135          subsidiary_ = value;
136      }
137  
GetMasterHasLunar()138      bool GetMasterHasLunar() const
139      {
140          return masterHasLunar_;
141      }
SetMasterHasLunar(bool value)142      void SetMasterHasLunar(bool value)
143      {
144          masterHasLunar_ = value;
145      }
146  
GetOnChange()147      const EventMarker& GetOnChange() const
148      {
149          return onChange_;
150      }
SetOnChange(const EventMarker & value)151      void SetOnChange(const EventMarker& value)
152      {
153          onChange_ = value;
154      }
155  
GetOnColumnChange()156      const EventMarker& GetOnColumnChange() const
157      {
158          return onColumnChange_;
159      }
SetOnColumnChange(const EventMarker & value)160      void SetOnColumnChange(const EventMarker& value)
161      {
162          onColumnChange_ = value;
163      }
164  
GetOnCancel()165      const EventMarker& GetOnCancel() const
166      {
167          return onCancel_;
168      }
SetOnCancel(const EventMarker & value)169      void SetOnCancel(const EventMarker& value)
170      {
171          onCancel_ = value;
172      }
173  
GetDialogAcceptEvent()174      const EventMarker& GetDialogAcceptEvent() const
175      {
176          return OnDialogAccept_;
177      }
SetDialogAcceptEvent(const EventMarker & value)178      void SetDialogAcceptEvent(const EventMarker& value)
179      {
180          OnDialogAccept_ = value;
181      }
182  
GetDialogCancelEvent()183      const EventMarker& GetDialogCancelEvent() const
184      {
185          return OnDialogCancel_;
186      }
SetDialogCancelEvent(const EventMarker & value)187      void SetDialogCancelEvent(const EventMarker& value)
188      {
189          OnDialogCancel_ = value;
190      }
191  
GetDialogChangeEvent()192      const EventMarker& GetDialogChangeEvent() const
193      {
194          return OnDialogChange_;
195      }
SetDialogChangeEvent(const EventMarker & value)196      void SetDialogChangeEvent(const EventMarker& value)
197      {
198          OnDialogChange_ = value;
199      }
200  
201      void ClearColumns();
202  
203      void AppendColumn(const RefPtr<PickerColumnComponent>& column);
204  
205      RefPtr<PickerColumnComponent> GetColumn(const std::string& tag) const;
206  
GetColumnCount()207      virtual uint32_t GetColumnCount() const
208      {
209          return columns_.size();
210      }
211  
212      void RemoveColumn(const std::string& tag);
213  
214      void SetFinishCallback(const ColumnFinishCallback& value);
215  
216      void SetChangeCallback(const ColumnChangeCallback& value);
217  
GetTheme()218      const RefPtr<PickerTheme>& GetTheme() const
219      {
220          return theme_;
221      }
SetTheme(const RefPtr<PickerTheme> & value)222      void SetTheme(const RefPtr<PickerTheme>& value)
223      {
224          theme_ = value;
225      }
226  
227  
GetAnimationController()228      const RefPtr<PickerAnimationController>& GetAnimationController() const
229      {
230          return animationController_;
231      }
232  
SetAnimationController(const RefPtr<PickerAnimationController> & value)233      void SetAnimationController(const RefPtr<PickerAnimationController>& value)
234      {
235          animationController_ = value;
236      }
237  
GetTitle()238      const RefPtr<TextComponent>& GetTitle() const
239      {
240          return title_;
241      }
242  
GetLunar()243      const RefPtr<CheckboxComponent>& GetLunar() const
244      {
245          return lunar_;
246      }
247  
GetNodeId()248      int32_t GetNodeId() const
249      {
250          return nodeId_;
251      }
252  
SetNodeId(int32_t value)253      void SetNodeId(int32_t value)
254      {
255          if (!GetIsDialog()) {
256              nodeId_ = value;
257          }
258      }
259  
GetColumnHeight()260      const Dimension& GetColumnHeight() const
261      {
262          return columnHeight_;
263      }
SetColumnHeight(const Dimension & value)264      void SetColumnHeight(const Dimension& value)
265      {
266          columnHeight_ = value;
267      }
268  
GetDefaultHeight()269      bool GetDefaultHeight() const
270      {
271          return defaultHeight_;
272      }
273  
SetDefaultHeight(bool value)274      void SetDefaultHeight(bool value)
275      {
276          defaultHeight_ = value;
277      }
278  
GetStack()279      const RefPtr<StackElement>& GetStack()
280      {
281          return stack_;
282      }
283  
284      void ShowDialog(const RefPtr<StackElement>& stack, bool disableTouchEvent = true);
285      bool HideDialog();
286      void OpenDialog(const DialogProperties& properties);
287      void CloseDialog();
288  
IsDialogShowed()289      bool IsDialogShowed()
290      {
291          return dialogShowed_;
292      }
293  
GetLunarAccessibility()294      const RefPtr<AccessibilityNode>& GetLunarAccessibility() const
295      {
296          return lunarAccessibility_;
297      }
298  
GetSwitchAccessibility()299      const RefPtr<AccessibilityNode>& GetSwitchAccessibility() const
300      {
301          return switchAccessibility_;
302      }
303  
GetTitleAccessibility()304      const RefPtr<AccessibilityNode>& GetTitleAccessibility() const
305      {
306          return titleAccessibility_;
307      }
308  
GetCancelAccessibility()309      const RefPtr<AccessibilityNode>& GetCancelAccessibility() const
310      {
311          return cancelAccessibility_;
312      }
313  
GetOkAccessibility()314      const RefPtr<AccessibilityNode>& GetOkAccessibility() const
315      {
316          return okAccessibility_;
317      }
318  
319      // used for inspector node in PC preview
GetPickerDialogAccessibility()320      const RefPtr<AccessibilityNode>& GetPickerDialogAccessibility() const
321      {
322          return rootAccessibility_;
323      }
324  
SubsidiaryShowed()325      virtual bool SubsidiaryShowed() const
326      {
327          return false;
328      }
329  
NeedRtlColumnOrder()330      virtual bool NeedRtlColumnOrder() const
331      {
332          return true;
333      }
334  
IsShowLunar()335      virtual bool IsShowLunar() const
336      {
337          return false;
338      }
339  
340      virtual void OnTitleBuilding();
341  
OnColumnsCreating()342      virtual void OnColumnsCreating() {}
343  
OnColumnsBuilding()344      virtual void OnColumnsBuilding() {}
345  
346      virtual std::string GetSelectedObject(bool isColumnChange,
347          const std::string& changeColumnTag, int32_t status = -1) const
348      {
349          return "{}";
350      }
351  
OnSelectedSaving()352      virtual void OnSelectedSaving() {}
353  
OnDataLinking(const std::string & tag,bool isAdd,uint32_t index,std::vector<std::string> & resultTags)354      virtual void OnDataLinking(const std::string& tag, bool isAdd, uint32_t index, std::vector<std::string>& resultTags)
355      {}
356  
OnLunarCallback(bool checked,std::vector<std::string> & resultTags)357      virtual void OnLunarCallback(bool checked, std::vector<std::string>& resultTags) {}
OnTriangleCallback(bool value)358      virtual void OnTriangleCallback(bool value) {}
OnAnimationPlaying()359      virtual void OnAnimationPlaying() {}
360  
GetRotationController()361      const RefPtr<RotationController>& GetRotationController() const
362      {
363          return rotationController_;
364      }
365  
GetOnCancelClickId()366      const EventMarker& GetOnCancelClickId() const
367      {
368          return onCancelClickId_;
369      }
370  
GetOnOkClickId()371      const EventMarker& GetOnOkClickId() const
372      {
373          return onOkClickId_;
374      }
375  
376      // used for inspector node in PC preview
SetPickerBaseId(const int32_t nodeId)377      void SetPickerBaseId(const int32_t nodeId)
378      {
379          pickerId_ = nodeId;
380      }
381  
382      // used for inspector node in PC preview
GetPickerBaseId()383      int32_t GetPickerBaseId() const
384      {
385          return pickerId_;
386      }
387  
388      ACE_DEFINE_COMPONENT_EVENT(OnTextCancel, void(void));
389      ACE_DEFINE_COMPONENT_EVENT(OnTextAccept, void(const std::string&, double));
390      ACE_DEFINE_COMPONENT_EVENT(OnTextChange, void(const std::string&, double));
391  
392      void SetNeedVibrate(bool needVibrate);
393  
GetNeedVibrate()394      bool GetNeedVibrate()
395      {
396          return needVibrate_;
397      }
398  
GetHasBackgroundColor()399      bool GetHasBackgroundColor() const
400      {
401          return hasBackgroundColor_;
402      }
SetHasBackgroundColor(bool value)403      void SetHasBackgroundColor(bool value)
404      {
405          hasBackgroundColor_ = value;
406      }
407  
408      static const char PICKER_YEAR_COLUMN[];
409      static const char PICKER_MONTH_COLUMN[];
410      static const char PICKER_DAY_COLUMN[];
411      static const char PICKER_HOUR_COLUMN[];
412      static const char PICKER_MINUTE_COLUMN[];
413      static const char PICKER_SECOND_COLUMN[];
414      static const char PICKER_TEXT_COLUMN[];
415      static const char PICKER_MONTHDAY_COLUMN[];
416      static const char PICKER_AMPM_COLUMN[];
417  
418  private:
419      void InitializeTitle(std::list<RefPtr<Component>>& outChildren);
420  
421      void InitializeColumns(
422          std::list<RefPtr<Component>>& outChildren, const RefPtr<AccessibilityManager>& accessibilityManager);
423  
424      void InitializeChildAccessibility(const RefPtr<AccessibilityManager>& accessibilityManager);
425  
426      void ClearAccessibilityNodes();
427  
428      RefPtr<Component> GenerateAccessibilityComposed(
429          const std::string& name, const RefPtr<Component>& child, RefPtr<AccessibilityNode>& node);
430  
431      void InitializeLunar(std::list<RefPtr<Component>>& outChildren, const RefPtr<ThemeManager>& themeManager);
432  
433      void InitializeButtons(std::list<RefPtr<Component>>& outChildren, const RefPtr<ThemeManager>& themeManager);
434  
435      void InitializeContainer(const std::list<RefPtr<Component>>& outChildren);
436  
437      bool dialogShowed_ = false;
438      bool hasTitle_ = false;
439      bool hasLunar_ = false;
440      bool hasButtons_ = false;
441      bool hasTriangle_ = false;
442      bool isDialog_ = true;
443      bool subsidiary_ = false;
444      bool masterHasLunar_ = false;
445      bool needVibrate_ = true;
446      bool isCreateDialogComponent_ = false;
447      bool hasBackgroundColor_ = false;
448      int32_t nodeId_ = -1; // default of dialog's node id.
449      // used for inspector node in PC preview
450      int32_t pickerId_ = -1;
451  
452      RefPtr<PickerTheme> theme_;
453      RefPtr<StackElement> stack_;
454  
455      RefPtr<TextComponent> title_ = AceType::MakeRefPtr<TextComponent>("");
456      RefPtr<CheckboxComponent> lunar_;
457      std::vector<RefPtr<PickerColumnComponent>> columns_;
458      WeakPtr<AccessibilityManager> accessibilityManager_;
459      int32_t rootAccessibilityId_ = -1;
460      RefPtr<AccessibilityNode> rootAccessibility_;
461      RefPtr<AccessibilityNode> titleAccessibility_;
462      RefPtr<AccessibilityNode> lunarAccessibility_;
463      RefPtr<AccessibilityNode> switchAccessibility_;
464      RefPtr<AccessibilityNode> cancelAccessibility_;
465      RefPtr<AccessibilityNode> okAccessibility_;
466  
467      EventMarker onChange_;
468      EventMarker onColumnChange_;
469      EventMarker onCancel_;
470      EventMarker onOkClickId_ = BackEndEventManager<void()>::GetInstance().GetAvailableMarker();
471      EventMarker onCancelClickId_ = BackEndEventManager<void()>::GetInstance().GetAvailableMarker();
472      EventMarker OnDialogAccept_;
473      EventMarker OnDialogCancel_;
474      EventMarker OnDialogChange_;
475  
476      Dimension columnHeight_;
477      bool defaultHeight_ = false;
478  
479      RefPtr<RotationController> rotationController_;
480  
481      RefPtr<PickerAnimationController> animationController_;
482      RefPtr<DialogComponent> dialogComponent_;
483      std::string dialogInsprctorTag_;
484  };
485  
486  } // namespace OHOS::Ace
487  
488  #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PICKER_PICKER_BASE_COMPONENT_H
489