• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_MONTHCALENDAR_H_
8 #define XFA_FWL_CFWL_MONTHCALENDAR_H_
9 
10 #include <memory>
11 #include <vector>
12 
13 #include "xfa/fgas/localization/fgas_datetime.h"
14 #include "xfa/fwl/cfwl_event.h"
15 #include "xfa/fwl/cfwl_widget.h"
16 #include "xfa/fwl/cfwl_widgetproperties.h"
17 
18 #define FWL_ITEMSTATE_MCD_Nomal 0
19 #define FWL_ITEMSTATE_MCD_Flag (1L << 0)
20 #define FWL_ITEMSTATE_MCD_Selected (1L << 1)
21 
22 class CFWL_MessageMouse;
23 class CFWL_Widget;
24 
25 class CFWL_MonthCalendar : public CFWL_Widget {
26  public:
27   CFWL_MonthCalendar(const CFWL_App* app,
28                      std::unique_ptr<CFWL_WidgetProperties> properties,
29                      CFWL_Widget* pOuter);
30   ~CFWL_MonthCalendar() override;
31 
32   // FWL_WidgetImp
33   FWL_Type GetClassID() const override;
34   CFX_RectF GetAutosizedWidgetRect() override;
35   void Update() override;
36   void DrawWidget(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix) override;
37   void OnProcessMessage(CFWL_Message* pMessage) override;
38   void OnDrawWidget(CFX_Graphics* pGraphics,
39                     const CFX_Matrix* pMatrix) override;
40 
41   void SetSelect(int32_t iYear, int32_t iMonth, int32_t iDay);
42 
43  private:
44   struct DATE {
DATEDATE45     DATE() : iYear(0), iMonth(0), iDay(0) {}
46 
DATEDATE47     DATE(int32_t year, int32_t month, int32_t day)
48         : iYear(year), iMonth(month), iDay(day) {}
49 
50     bool operator<(const DATE& right) {
51       if (iYear < right.iYear)
52         return true;
53       if (iYear == right.iYear) {
54         if (iMonth < right.iMonth)
55           return true;
56         if (iMonth == right.iMonth)
57           return iDay < right.iDay;
58       }
59       return false;
60     }
61 
62     bool operator>(const DATE& right) {
63       if (iYear > right.iYear)
64         return true;
65       if (iYear == right.iYear) {
66         if (iMonth > right.iMonth)
67           return true;
68         if (iMonth == right.iMonth)
69           return iDay > right.iDay;
70       }
71       return false;
72     }
73 
74     int32_t iYear;
75     int32_t iMonth;
76     int32_t iDay;
77   };
78   struct DATEINFO {
79     DATEINFO(int32_t day,
80              int32_t dayofweek,
81              uint32_t dwSt,
82              CFX_RectF rc,
83              CFX_WideString& wsday);
84     ~DATEINFO();
85 
86     int32_t iDay;
87     int32_t iDayOfWeek;
88     uint32_t dwStates;
89     CFX_RectF rect;
90     CFX_WideString wsDay;
91   };
92 
93   void DrawBackground(CFX_Graphics* pGraphics,
94                       IFWL_ThemeProvider* pTheme,
95                       const CFX_Matrix* pMatrix);
96   void DrawHeadBK(CFX_Graphics* pGraphics,
97                   IFWL_ThemeProvider* pTheme,
98                   const CFX_Matrix* pMatrix);
99   void DrawLButton(CFX_Graphics* pGraphics,
100                    IFWL_ThemeProvider* pTheme,
101                    const CFX_Matrix* pMatrix);
102   void DrawRButton(CFX_Graphics* pGraphics,
103                    IFWL_ThemeProvider* pTheme,
104                    const CFX_Matrix* pMatrix);
105   void DrawCaption(CFX_Graphics* pGraphics,
106                    IFWL_ThemeProvider* pTheme,
107                    const CFX_Matrix* pMatrix);
108   void DrawSeperator(CFX_Graphics* pGraphics,
109                      IFWL_ThemeProvider* pTheme,
110                      const CFX_Matrix* pMatrix);
111   void DrawDatesInBK(CFX_Graphics* pGraphics,
112                      IFWL_ThemeProvider* pTheme,
113                      const CFX_Matrix* pMatrix);
114   void DrawWeek(CFX_Graphics* pGraphics,
115                 IFWL_ThemeProvider* pTheme,
116                 const CFX_Matrix* pMatrix);
117   void DrawToday(CFX_Graphics* pGraphics,
118                  IFWL_ThemeProvider* pTheme,
119                  const CFX_Matrix* pMatrix);
120   void DrawDatesIn(CFX_Graphics* pGraphics,
121                    IFWL_ThemeProvider* pTheme,
122                    const CFX_Matrix* pMatrix);
123   void DrawDatesOut(CFX_Graphics* pGraphics,
124                     IFWL_ThemeProvider* pTheme,
125                     const CFX_Matrix* pMatrix);
126   void DrawDatesInCircle(CFX_Graphics* pGraphics,
127                          IFWL_ThemeProvider* pTheme,
128                          const CFX_Matrix* pMatrix);
129   CFX_SizeF CalcSize();
130   void Layout();
131   void CalcHeadSize();
132   void CalcTodaySize();
133   void CalDateItem();
134   void GetCapValue();
135   void InitDate();
136   void ClearDateItem();
137   void ResetDateItem();
138   void NextMonth();
139   void PrevMonth();
140   void ChangeToMonth(int32_t iYear, int32_t iMonth);
141   void RemoveSelDay();
142   void AddSelDay(int32_t iDay);
143   void JumpToToday();
144   CFX_WideString GetHeadText(int32_t iYear, int32_t iMonth);
145   CFX_WideString GetTodayText(int32_t iYear, int32_t iMonth, int32_t iDay);
146   int32_t GetDayAtPoint(const CFX_PointF& point) const;
147   CFX_RectF GetDayRect(int32_t iDay);
148   void OnLButtonDown(CFWL_MessageMouse* pMsg);
149   void OnLButtonUp(CFWL_MessageMouse* pMsg);
150   void DisForm_OnLButtonUp(CFWL_MessageMouse* pMsg);
151   void OnMouseMove(CFWL_MessageMouse* pMsg);
152   void OnMouseLeave(CFWL_MessageMouse* pMsg);
153 
154   bool m_bInitialized;
155   CFX_RectF m_rtHead;
156   CFX_RectF m_rtWeek;
157   CFX_RectF m_rtLBtn;
158   CFX_RectF m_rtRBtn;
159   CFX_RectF m_rtDates;
160   CFX_RectF m_rtHSep;
161   CFX_RectF m_rtHeadText;
162   CFX_RectF m_rtToday;
163   CFX_RectF m_rtTodayFlag;
164   CFX_RectF m_rtWeekNum;
165   CFX_RectF m_rtWeekNumSep;
166   CFX_WideString m_wsHead;
167   CFX_WideString m_wsToday;
168   std::unique_ptr<CFX_DateTime> m_pDateTime;
169   std::vector<std::unique_ptr<DATEINFO>> m_arrDates;
170   int32_t m_iCurYear;
171   int32_t m_iCurMonth;
172   int32_t m_iYear;
173   int32_t m_iMonth;
174   int32_t m_iDay;
175   int32_t m_iHovered;
176   int32_t m_iLBtnPartStates;
177   int32_t m_iRBtnPartStates;
178   DATE m_dtMin;
179   DATE m_dtMax;
180   CFX_SizeF m_szHead;
181   CFX_SizeF m_szCell;
182   CFX_SizeF m_szToday;
183   std::vector<int32_t> m_arrSelDays;
184   CFX_RectF m_rtClient;
185   bool m_bFlag;
186 };
187 
188 #endif  // XFA_FWL_CFWL_MONTHCALENDAR_H_
189