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 _FWL_MONTHCALENDAR_IMP_H 8 #define _FWL_MONTHCALENDAR_IMP_H 9 class CFWL_WidgetImp; 10 class CFWL_WidgetImpProperties; 11 class CFWL_WidgetImpDelegate; 12 class IFWL_Widget; 13 class IFDE_DateTime; 14 class CFDE_DateTime; 15 extern uint8_t FX_DaysInMonth(int32_t iYear, uint8_t iMonth); 16 class CFWL_MonthCalendarImp; 17 class CFWL_MonthCalendarImpDelegate; 18 class CFWL_MonthCalendarImp : public CFWL_WidgetImp { 19 public: 20 CFWL_MonthCalendarImp(const CFWL_WidgetImpProperties& properties, 21 IFWL_Widget* pOuter); 22 ~CFWL_MonthCalendarImp(); 23 virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const; 24 virtual FX_DWORD GetClassID() const; 25 virtual FWL_ERR Initialize(); 26 virtual FWL_ERR Finalize(); 27 virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE); 28 virtual FWL_ERR Update(); 29 virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics, 30 const CFX_Matrix* pMatrix = NULL); 31 virtual int32_t CountSelect(); 32 virtual FX_BOOL GetSelect(int32_t& iYear, 33 int32_t& iMonth, 34 int32_t& iDay, 35 int32_t nIndex = 0); 36 virtual FX_BOOL SetSelect(int32_t iYear, int32_t iMonth, int32_t iDay); 37 38 protected: 39 void DrawBkground(CFX_Graphics* pGraphics, 40 IFWL_ThemeProvider* pTheme, 41 const CFX_Matrix* pMatrix); 42 void DrawHeadBK(CFX_Graphics* pGraphics, 43 IFWL_ThemeProvider* pTheme, 44 const CFX_Matrix* pMatrix); 45 void DrawLButton(CFX_Graphics* pGraphics, 46 IFWL_ThemeProvider* pTheme, 47 const CFX_Matrix* pMatrix); 48 void DrawRButton(CFX_Graphics* pGraphics, 49 IFWL_ThemeProvider* pTheme, 50 const CFX_Matrix* pMatrix); 51 void DrawCaption(CFX_Graphics* pGraphics, 52 IFWL_ThemeProvider* pTheme, 53 const CFX_Matrix* pMatrix); 54 void DrawSeperator(CFX_Graphics* pGraphics, 55 IFWL_ThemeProvider* pTheme, 56 const CFX_Matrix* pMatrix); 57 void DrawDatesInBK(CFX_Graphics* pGraphics, 58 IFWL_ThemeProvider* pTheme, 59 const CFX_Matrix* pMatrix); 60 void DrawWeek(CFX_Graphics* pGraphics, 61 IFWL_ThemeProvider* pTheme, 62 const CFX_Matrix* pMatrix); 63 void DrawWeekNumber(CFX_Graphics* pGraphics, 64 IFWL_ThemeProvider* pTheme, 65 const CFX_Matrix* pMatrix); 66 void DrawWeekNumberSep(CFX_Graphics* pGraphics, 67 IFWL_ThemeProvider* pTheme, 68 const CFX_Matrix* pMatrix); 69 void DrawToday(CFX_Graphics* pGraphics, 70 IFWL_ThemeProvider* pTheme, 71 const CFX_Matrix* pMatrix); 72 void DrawDatesIn(CFX_Graphics* pGraphics, 73 IFWL_ThemeProvider* pTheme, 74 const CFX_Matrix* pMatrix); 75 void DrawDatesOut(CFX_Graphics* pGraphics, 76 IFWL_ThemeProvider* pTheme, 77 const CFX_Matrix* pMatrix); 78 void DrawDatesInCircle(CFX_Graphics* pGraphics, 79 IFWL_ThemeProvider* pTheme, 80 const CFX_Matrix* pMatrix); 81 void DrawTodayCircle(CFX_Graphics* pGraphics, 82 IFWL_ThemeProvider* pTheme, 83 const CFX_Matrix* pMatrix); 84 CFX_SizeF CalcSize(FX_BOOL bAutoSize = FALSE); 85 void LayOut(); 86 void CalcHeadSize(); 87 void CalcTodaySize(); 88 void CalDateItem(); 89 void GetCapValue(); 90 int32_t CalWeekNumber(int32_t iYear, int32_t iMonth, int32_t iDay); 91 92 FX_BOOL GetMinDate(int32_t& iYear, int32_t& iMonth, int32_t& iDay); 93 FX_BOOL SetMinDate(int32_t iYear, int32_t iMonth, int32_t iDay); 94 FX_BOOL GetMaxDate(int32_t& iYear, int32_t& iMonth, int32_t& iDay); 95 FX_BOOL SetMaxDate(int32_t iYear, int32_t iMonth, int32_t iDay); 96 FX_BOOL InitDate(); 97 void ClearDateItem(); 98 void ReSetDateItem(); 99 FX_BOOL NextMonth(); 100 FX_BOOL PrevMonth(); 101 void ChangeToMonth(int32_t iYear, int32_t iMonth); 102 FX_BOOL RemoveSelDay(int32_t iDay, FX_BOOL bAll = FALSE); 103 FX_BOOL AddSelDay(int32_t iDay); 104 FX_BOOL JumpToToday(); 105 void GetHeadText(int32_t iYear, int32_t iMonth, CFX_WideString& wsHead); 106 void GetTodayText(int32_t iYear, 107 int32_t iMonth, 108 int32_t iDay, 109 CFX_WideString& wsToday); 110 int32_t GetDayAtPoint(FX_FLOAT x, FX_FLOAT y); 111 FX_BOOL GetDayRect(int32_t iDay, CFX_RectF& rtDay); 112 typedef struct _DATE { _DATE_DATE113 _DATE() { 114 iYear = 0; 115 iMonth = 0; 116 iDay = 0; 117 } _DATE_DATE118 _DATE(int32_t year, int32_t month, int32_t day) 119 : iYear(year), iMonth(month), iDay(day) {} 120 FX_BOOL operator<(const _DATE& right) { 121 if (iYear < right.iYear) { 122 return TRUE; 123 } else if (iYear == right.iYear) { 124 if (iMonth < right.iMonth) { 125 return TRUE; 126 } else if (iMonth == right.iMonth) { 127 return iDay < right.iDay; 128 } 129 } 130 return FALSE; 131 } 132 FX_BOOL operator>(const _DATE& right) { 133 if (iYear > right.iYear) { 134 return TRUE; 135 } else if (iYear == right.iYear) { 136 if (iMonth > right.iMonth) { 137 return TRUE; 138 } else if (iMonth == right.iMonth) { 139 return iDay > right.iDay; 140 } 141 } 142 return FALSE; 143 } 144 int32_t iYear; 145 int32_t iMonth; 146 int32_t iDay; 147 148 } DATE, *LPDATE; 149 FX_BOOL m_bInit; 150 CFX_RectF m_rtHead; 151 CFX_RectF m_rtWeek; 152 CFX_RectF m_rtLBtn; 153 CFX_RectF m_rtRBtn; 154 CFX_RectF m_rtDates; 155 CFX_RectF m_rtHSep; 156 CFX_RectF m_rtHeadText; 157 CFX_RectF m_rtToday; 158 CFX_RectF m_rtTodayFlag; 159 CFX_RectF m_rtWeekNum; 160 CFX_RectF m_rtWeekNumSep; 161 CFX_RectF m_rtTemp; 162 CFX_WideString m_wsHead; 163 CFX_WideString m_wsToday; 164 CFX_DateTime* m_pDateTime; 165 CFX_PtrArray m_arrDates; 166 int32_t m_iCurYear; 167 int32_t m_iCurMonth; 168 int32_t m_iYear; 169 int32_t m_iMonth; 170 int32_t m_iDay; 171 int32_t m_iHovered; 172 int32_t m_iLBtnPartStates; 173 int32_t m_iRBtnPartStates; 174 DATE m_dtMin; 175 DATE m_dtMax; 176 CFX_SizeF m_szHead; 177 CFX_SizeF m_szCell; 178 CFX_SizeF m_szToday; 179 typedef CFX_ArrayTemplate<int32_t> CFWL_Int32Array; 180 CFWL_Int32Array m_arrSelDays; 181 int32_t m_iMaxSel; 182 CFX_RectF m_rtClient; 183 FX_FLOAT m_fHeadWid; 184 FX_FLOAT m_fHeadHei; 185 FX_FLOAT m_fHeadBtnWid; 186 FX_FLOAT m_fHeadBtnHei; 187 FX_FLOAT m_fHeadBtnHMargin; 188 FX_FLOAT m_fHeadBtnVMargin; 189 FX_FLOAT m_fHeadTextWid; 190 FX_FLOAT m_fHeadTextHei; 191 FX_FLOAT m_fHeadTextHMargin; 192 FX_FLOAT m_fHeadTextVMargin; 193 FX_FLOAT m_fHSepWid; 194 FX_FLOAT m_fHSepHei; 195 196 FX_FLOAT m_fWeekNumWid; 197 FX_FLOAT m_fSepDOffset; 198 FX_FLOAT m_fSepX; 199 FX_FLOAT m_fSepY; 200 201 FX_FLOAT m_fWeekNumHeigh; 202 FX_FLOAT m_fWeekWid; 203 FX_FLOAT m_fWeekHei; 204 FX_FLOAT m_fDateCellWid; 205 FX_FLOAT m_fDateCellHei; 206 207 FX_FLOAT m_fTodayWid; 208 FX_FLOAT m_fTodayHei; 209 FX_FLOAT m_fTodayFlagWid; 210 211 FX_FLOAT m_fMCWid; 212 FX_FLOAT m_fMCHei; 213 friend class CFWL_MonthCalendarImpDelegate; 214 }; 215 typedef struct _DATEINFO { _DATEINFO_DATEINFO216 _DATEINFO(int32_t day, 217 int32_t dayofweek, 218 FX_DWORD dwSt, 219 CFX_RectF rc, 220 CFX_WideString& wsday) 221 : iDay(day), 222 iDayOfWeek(dayofweek), 223 dwStates(dwSt), 224 rect(rc), 225 wsDay(wsday) {} 226 int32_t iDay; 227 int32_t iDayOfWeek; 228 FX_DWORD dwStates; 229 CFX_RectF rect; 230 CFX_WideString wsDay; 231 } DATEINFO, *LPDATEINFO; 232 class CFWL_MonthCalendarImpDelegate : public CFWL_WidgetImpDelegate { 233 public: 234 CFWL_MonthCalendarImpDelegate(CFWL_MonthCalendarImp* pOwner); 235 int32_t OnProcessMessage(CFWL_Message* pMessage) override; 236 FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics, 237 const CFX_Matrix* pMatrix = NULL) override; 238 239 protected: 240 void OnActivate(CFWL_Message* pMsg); 241 void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE); 242 void OnLButtonDown(CFWL_MsgMouse* pMsg); 243 void OnLButtonUp(CFWL_MsgMouse* pMsg); 244 void OnMouseMove(CFWL_MsgMouse* pMsg); 245 void OnMouseLeave(CFWL_MsgMouse* pMsg); 246 CFWL_MonthCalendarImp* m_pOwner; 247 }; 248 #endif 249