1// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#ifndef XFA_FWL_CFWL_DATETIMEPICKER_H_
8#define XFA_FWL_CFWL_DATETIMEPICKER_H_
9
10#include <memory>
11
12#include "xfa/fwl/cfwl_datetimeedit.h"
13#include "xfa/fwl/cfwl_event.h"
14#include "xfa/fwl/cfwl_monthcalendar.h"
15#include "xfa/fwl/cfwl_widget.h"
16#include "xfa/fwl/cfwl_widgetproperties.h"
17
18#define FWL_STYLEEXT_DTP_LongDateFormat 0
19#define FWL_STYLEEXT_DTP_ShortDateFormat (1L << 1)
20#define FWL_STYLEEXT_DTP_EditHNear 0
21#define FWL_STYLEEXT_DTP_EditHCenter (1L << 4)
22#define FWL_STYLEEXT_DTP_EditHFar (2L << 4)
23#define FWL_STYLEEXT_DTP_EditVNear 0
24#define FWL_STYLEEXT_DTP_EditVCenter (1L << 6)
25#define FWL_STYLEEXT_DTP_EditVFar (2L << 6)
26#define FWL_STYLEEXT_DTP_EditJustified (1L << 8)
27#define FWL_STYLEEXT_DTP_EditHAlignMask (3L << 4)
28#define FWL_STYLEEXT_DTP_EditVAlignMask (3L << 6)
29
30class CFWL_DateTimeEdit;
31class CFWL_FormProxy;
32
33class CFWL_DateTimePicker : public CFWL_Widget {
34 public:
35  explicit CFWL_DateTimePicker(const CFWL_App* pApp);
36  ~CFWL_DateTimePicker() override;
37
38  // CFWL_Widget
39  FWL_Type GetClassID() const override;
40  void Update() override;
41  FWL_WidgetHit HitTest(const CFX_PointF& point) override;
42  void DrawWidget(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix) override;
43  void SetThemeProvider(IFWL_ThemeProvider* pTP) override;
44  void OnProcessMessage(CFWL_Message* pMessage) override;
45  void OnDrawWidget(CFX_Graphics* pGraphics,
46                    const CFX_Matrix* pMatrix) override;
47
48  void GetCurSel(int32_t& iYear, int32_t& iMonth, int32_t& iDay);
49  void SetCurSel(int32_t iYear, int32_t iMonth, int32_t iDay);
50
51  void SetEditText(const CFX_WideString& wsText);
52  CFX_WideString GetEditText() const;
53
54  int32_t CountSelRanges() const { return m_pEdit->CountSelRanges(); }
55  int32_t GetSelRange(int32_t nIndex, int32_t* nStart) const {
56    return m_pEdit->GetSelRange(nIndex, nStart);
57  }
58
59  CFX_RectF GetBBox() const;
60  void SetEditLimit(int32_t nLimit) { m_pEdit->SetLimit(nLimit); }
61  void ModifyEditStylesEx(uint32_t dwStylesExAdded, uint32_t dwStylesExRemoved);
62
63  bool IsMonthCalendarVisible() const;
64  void ShowMonthCalendar(bool bActivate);
65  void ProcessSelChanged(int32_t iYear, int32_t iMonth, int32_t iDay);
66
67  CFWL_FormProxy* GetFormProxy() const { return m_pForm.get(); }
68
69 private:
70  void DrawDropDownButton(CFX_Graphics* pGraphics,
71                          IFWL_ThemeProvider* pTheme,
72                          const CFX_Matrix* pMatrix);
73  void FormatDateString(int32_t iYear,
74                        int32_t iMonth,
75                        int32_t iDay,
76                        CFX_WideString& wsText);
77  void ResetEditAlignment();
78  void InitProxyForm();
79  void OnFocusChanged(CFWL_Message* pMsg, bool bSet);
80  void OnLButtonDown(CFWL_MessageMouse* pMsg);
81  void OnLButtonUp(CFWL_MessageMouse* pMsg);
82  void OnMouseMove(CFWL_MessageMouse* pMsg);
83  void OnMouseLeave(CFWL_MessageMouse* pMsg);
84
85  bool DisForm_IsMonthCalendarVisible() const;
86  void DisForm_ShowMonthCalendar(bool bActivate);
87  FWL_WidgetHit DisForm_HitTest(const CFX_PointF& point) const;
88  bool DisForm_IsNeedShowButton() const;
89  void DisForm_Update();
90  CFX_RectF DisForm_GetBBox() const;
91  void DisForm_DrawWidget(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix);
92  void DisForm_OnFocusChanged(CFWL_Message* pMsg, bool bSet);
93
94  CFX_RectF m_rtBtn;
95  CFX_RectF m_rtClient;
96  int32_t m_iBtnState;
97  int32_t m_iYear;
98  int32_t m_iMonth;
99  int32_t m_iDay;
100  bool m_bLBtnDown;
101  std::unique_ptr<CFWL_DateTimeEdit> m_pEdit;
102  std::unique_ptr<CFWL_MonthCalendar> m_pMonthCal;
103  std::unique_ptr<CFWL_FormProxy> m_pForm;
104  FX_FLOAT m_fBtn;
105};
106
107#endif  // XFA_FWL_CFWL_DATETIMEPICKER_H_
108