// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "xfa/fwl/theme/cfwl_monthcalendartp.h"

#include "xfa/fde/tto/fde_textout.h"
#include "xfa/fwl/basewidget/ifwl_monthcalendar.h"
#include "xfa/fwl/core/cfwl_themebackground.h"
#include "xfa/fwl/core/cfwl_themetext.h"
#include "xfa/fwl/core/ifwl_themeprovider.h"
#include "xfa/fwl/core/ifwl_widget.h"
#include "xfa/fxgraphics/cfx_color.h"
#include "xfa/fxgraphics/cfx_path.h"

#define FWL_THEMECAPACITY_MC_HEADER_WIDTH 200
#define FWL_THEMECAPACITY_MC_HEADER_HEIGHT 30
#define FWL_THEMECAPACITY_MC_HEADER_BTN_WIDTH 18
#define FWL_THEMECAPACITY_MC_HEADER_BTN_HEIGHT 16
#define FWL_THEMECAPACITY_MC_HEADER_BTN_HMARGIN 5
#define FWL_THEMECAPACITY_MC_HEADER_BTN_VMARGIN \
  (FWL_THEMECAPACITY_MC_HEADER_HEIGHT -         \
   FWL_THEMECAPACITY_MC_HEADER_BTN_HEIGHT) /    \
      2
#define FWL_THEMECAPACITY_MC_HEADER_TEXTWIDHT 100
#define FWL_THEMECAPACITY_MC_HEADER_TEXTHEIGHT 20
#define FWL_THEMECAPACITY_MC_HEADER_TEXT_HMARGIN \
  (FWL_THEMECAPACITY_MC_HEADER_WIDTH -           \
   FWL_THEMECAPACITY_MC_HEADER_TEXTWIDHT) /      \
      2
#define FWL_THEMECAPACITY_MC_HEADER_TEXT_VMARGIN \
  (FWL_THEMECAPACITY_MC_HEADER_HEIGHT -          \
   FWL_THEMECAPACITY_MC_HEADER_TEXTHEIGHT) /     \
      2
#define FWL_THEMECAPACITY_MC_HSEP_WIDTH (FWL_THEMECAPACITY_MC_WEEK_WIDTH - 10)
#define FWL_THEMECAPACITY_MC_HSEP_HEIGHT 1
#define FWL_THEMECAPACITY_MC_VSEP_WIDTH 1
#define FWL_THEMECAPACITY_MC_VSEP_HEIGHT FWL_THEMECAPACITY_MC_WEEKNUM_HEIGHT
#define FWL_THEMECAPACITY_MC_WEEKNUM_WIDTH 26
#define FWL_THEMECAPACITY_MC_SEP_DOFFSET -4
#define FWL_THEMECAPACITY_MC_SEP_X 3
#define FWL_THEMECAPACITY_MC_SEP_Y                                         \
  (FWL_THEMECAPACITY_MC_HEADER_HEIGHT + FWL_THEMECAPACITY_MC_WEEK_HEIGHT + \
   FWL_THEMECAPACITY_MC_SEP_DOFFSET)
#define FWL_THEMECAPACITY_MC_WEEKNUM_HEIGHT \
  (6 * FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT)
#define FWL_THEMECAPACITY_MC_WEEK_WIDTH \
  (FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH * 7)
#define FWL_THEMECAPACITY_MC_WEEK_HEIGHT FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT
#define FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH \
  (FWL_THEMECAPACITY_MC_HEADER_WIDTH / 7)
#define FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT 16
#define FWL_THEMECAPACITY_MC_TODAY_WIDHT FWL_THEMECAPACITY_MC_HEADER_WIDTH
#define FWL_THEMECAPACITY_MC_TODAY_HEIGHT FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT
#define FWL_THEMECAPACITY_MC_TODAY_FLAG_WIDHT \
  FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH
#define FWL_MC_WIDTH 200
#define FWL_MC_HEIGHT 160

CFWL_MonthCalendarTP::CFWL_MonthCalendarTP() {
  m_pThemeData = new MCThemeData;
  SetThemeData(0);
}
CFWL_MonthCalendarTP::~CFWL_MonthCalendarTP() {
  delete m_pThemeData;
}
FX_BOOL CFWL_MonthCalendarTP::IsValidWidget(IFWL_Widget* pWidget) {
  if (!pWidget)
    return FALSE;
  return pWidget->GetClassID() == FWL_CLASSHASH_MonthCalendar;
}
uint32_t CFWL_MonthCalendarTP::SetThemeID(IFWL_Widget* pWidget,
                                          uint32_t dwThemeID,
                                          FX_BOOL bChildren) {
  if (m_pThemeData) {
    SetThemeData(FWL_GetThemeColor(dwThemeID));
  }
  return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren);
}
FX_BOOL CFWL_MonthCalendarTP::DrawBackground(CFWL_ThemeBackground* pParams) {
  if (!pParams)
    return FALSE;
  switch (pParams->m_iPart) {
    case FWL_PART_MCD_Border: {
      DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix);
      break;
    }
    case FWL_PART_MCD_Edge: {
      DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(),
               &pParams->m_rtPart, &pParams->m_matrix);
      break;
    }
    case FWL_PART_MCD_Background: {
      DrawTotalBK(pParams, &pParams->m_matrix);
      break;
    }
    case FWL_PART_MCD_Header: {
      DrawHeadBk(pParams, &pParams->m_matrix);
      break;
    }
    case FWL_PART_MCD_LBtn: {
#ifdef THEME_XPSimilar
      FWLTHEME_STATE eState = GetState(pParams->m_dwStates);
      DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart,
                   FWLTHEME_DIRECTION_Left, eState, &pParams->m_matrix);
#else
      DrawLButton(pParams, &pParams->m_matrix);
#endif
      break;
    }
    case FWL_PART_MCD_RBtn: {
#ifdef THEME_XPSimilar
      FWLTHEME_STATE eState = GetState(pParams->m_dwStates);
      DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart,
                   FWLTHEME_DIRECTION_Right, eState, &pParams->m_matrix);
#else
      DrawRButton(pParams, &pParams->m_matrix);
#endif
      break;
    }
    case FWL_PART_MCD_HSeparator: {
      DrawHSeperator(pParams, &pParams->m_matrix);
      break;
    }
    case FWL_PART_MCD_DatesIn: {
      DrawDatesInBK(pParams, &pParams->m_matrix);
      break;
    }
    case FWL_PART_MCD_TodayCircle: {
      DrawTodayCircle(pParams, &pParams->m_matrix);
      break;
    }
    case FWL_PART_MCD_DateInCircle: {
      DrawDatesInCircle(pParams, &pParams->m_matrix);
      break;
    }
    case FWL_PART_MCD_WeekNumSep: {
      DrawWeekNumSep(pParams, &pParams->m_matrix);
      break;
    }
    default: {}
  }
  return TRUE;
}
FX_BOOL CFWL_MonthCalendarTP::DrawText(CFWL_ThemeText* pParams) {
  if (!m_pTextOut)
    return FALSE;
  if ((pParams->m_iPart == FWL_PART_MCD_DatesIn) &&
      !(pParams->m_dwStates & FWL_ITEMSTATE_MCD_Flag) &&
      (pParams->m_dwStates &
       (FWL_PARTSTATE_MCD_Hovered | FWL_PARTSTATE_MCD_Selected))) {
    m_pTextOut->SetTextColor(0xFFFFFFFF);
  } else if (pParams->m_iPart == FWL_PART_MCD_Caption) {
    m_pTextOut->SetTextColor(m_pThemeData->clrCaption);
  } else {
    m_pTextOut->SetTextColor(0xFF000000);
  }
  return CFWL_WidgetTP::DrawText(pParams);
}
void* CFWL_MonthCalendarTP::GetCapacity(CFWL_ThemePart* pThemePart,
                                        uint32_t dwCapacity) {
  FX_BOOL bDefPro = FALSE;
  FX_BOOL bDwordVal = FALSE;
  switch (dwCapacity) {
    case FWL_WGTCAPACITY_MC_HEADER_WIDTH: {
      m_fValue = FWL_THEMECAPACITY_MC_HEADER_WIDTH;
      break;
    }
    case FWL_WGTCAPACITY_MC_HEADER_Height: {
      m_fValue = FWL_THEMECAPACITY_MC_HEADER_HEIGHT;
      break;
    }
    case FWL_WGTCAPACITY_MC_HEADER_BTN_WIDTH: {
      m_fValue = FWL_THEMECAPACITY_MC_HEADER_BTN_WIDTH;
      break;
    }
    case FWL_WGTCAPACITY_MC_HEADER_BTN_HEIGHT: {
      m_fValue = FWL_THEMECAPACITY_MC_HEADER_BTN_HEIGHT;
      break;
    }
    case FWL_WGTCAPACITY_MC_HEADER_BTN_HMARGIN: {
      bDwordVal = TRUE;
      m_dwValue = FWL_THEMECAPACITY_MC_HEADER_BTN_HMARGIN;
      break;
    }
    case FWL_WGTCAPACITY_MC_HEADER_BTN_VMARGIN: {
      m_fValue = FWL_THEMECAPACITY_MC_HEADER_BTN_VMARGIN;
      break;
    }
    case FWL_WGTCAPACITY_MC_HEADER_TEXTWIDHT: {
      m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXTWIDHT;
      break;
    }
    case FWL_WGTCAPACITY_MC_HEADER_TEXTHEIGHT: {
      m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXTHEIGHT;
      break;
    }
    case FWL_WGTCAPACITY_MC_HEADER_TEXT_HMARGIN: {
      m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXT_HMARGIN;
      break;
    }
    case FWL_WGTCAPACITY_MC_HEADER_TEXT_VMARGIN: {
      m_fValue = FWL_THEMECAPACITY_MC_HEADER_TEXT_VMARGIN;
      break;
    }
    case FWL_WGTCAPACITY_MC_HSEP_WIDTH: {
      m_fValue = FWL_THEMECAPACITY_MC_HSEP_WIDTH;
      break;
    }
    case FWL_WGTCAPACITY_MC_HSEP_HEIGHT: {
      m_fValue = FWL_THEMECAPACITY_MC_HSEP_HEIGHT;
      break;
    }
    case FWL_WGTCAPACITY_MC_VSEP_WIDTH: {
      m_fValue = FWL_THEMECAPACITY_MC_VSEP_WIDTH;
      break;
    }
    case FWL_WGTCAPACITY_MC_VSEP_HEIGHT: {
      m_fValue = FWL_THEMECAPACITY_MC_VSEP_HEIGHT;
      break;
    }
    case FWL_WGTCAPACITY_MC_WEEKNUM_WIDTH: {
      m_fValue = FWL_THEMECAPACITY_MC_WEEKNUM_WIDTH;
      break;
    }
    case FWL_WGTCAPACITY_MC_WEEKNUM_HEIGHT: {
      m_fValue = FWL_THEMECAPACITY_MC_WEEKNUM_HEIGHT;
      break;
    }
    case FWL_WGTCAPACITY_MC_WEEK_WIDTH: {
      m_fValue = FWL_THEMECAPACITY_MC_WEEK_WIDTH;
      break;
    }
    case FWL_WGTCAPACITY_MC_WEEK_HEIGHT: {
      m_fValue = FWL_THEMECAPACITY_MC_WEEK_HEIGHT;
      break;
    }
    case FWL_WGTCAPACITY_MC_SEP_DOFFSET: {
      m_fValue = FWL_THEMECAPACITY_MC_SEP_DOFFSET;
      break;
    }
    case FWL_WGTCAPACITY_MC_SEP_X: {
      m_fValue = FWL_THEMECAPACITY_MC_SEP_X;
      break;
    }
    case FWL_WGTCAPACITY_MC_SEP_Y: {
      m_fValue = FWL_THEMECAPACITY_MC_SEP_Y;
      break;
    }
    case FWL_WGTCAPACITY_MC_DATES_CELL_WIDTH: {
      m_fValue = FWL_THEMECAPACITY_MC_DATES_CELL_WIDTH;
      break;
    }
    case FWL_WGTCAPACITY_MC_DATES_CELL_HEIGHT: {
      m_fValue = FWL_THEMECAPACITY_MC_DATES_CELL_HEIGHT;
      break;
    }
    case FWL_WGTCAPACITY_MC_TODAY_WIDHT: {
      m_fValue = FWL_THEMECAPACITY_MC_TODAY_WIDHT;
      break;
    }
    case FWL_WGTCAPACITY_MC_TODAY_HEIGHT: {
      m_fValue = FWL_THEMECAPACITY_MC_TODAY_HEIGHT;
      break;
    }
    case FWL_WGTCAPACITY_MC_TODAY_FLAG_WIDHT: {
      m_fValue = FWL_THEMECAPACITY_MC_TODAY_FLAG_WIDHT;
      break;
    }
    case FWL_WGTCAPACITY_MC_WIDTH: {
      m_fValue = FWL_MC_WIDTH;
      break;
    }
    case FWL_WGTCAPACITY_MC_HEIGHT: {
      m_fValue = FWL_MC_HEIGHT;
      break;
    }
    case FWL_MCCAPACITY_Sun: {
      wsResource = L"Sun";
      return &wsResource;
    }
    case FWL_MCCAPACITY_Mon: {
      wsResource = L"Mon";
      return &wsResource;
    }
    case FWL_MCCAPACITY_Tue: {
      wsResource = L"Tue";
      return &wsResource;
    }
    case FWL_MCCAPACITY_Wed: {
      wsResource = L"Wed";
      return &wsResource;
    }
    case FWL_MCCAPACITY_Thu: {
      wsResource = L"Thu";
      return &wsResource;
    }
    case FWL_MCCAPACITY_Fri: {
      wsResource = L"Fri";
      return &wsResource;
    }
    case FWL_MCCAPACITY_Sat: {
      wsResource = L"Sat";
      return &wsResource;
    }
    case FWL_MCCAPACITY_January: {
      wsResource = L"January";
      return &wsResource;
    }
    case FWL_MCCAPACITY_February: {
      wsResource = L"February";
      return &wsResource;
    }
    case FWL_MCCAPACITY_March: {
      wsResource = L"March";
      return &wsResource;
    }
    case FWL_MCCAPACITY_April: {
      wsResource = L"April";
      return &wsResource;
    }
    case FWL_MCCAPACITY_May: {
      wsResource = L"May";
      return &wsResource;
    }
    case FWL_MCCAPACITY_June: {
      wsResource = L"June";
      return &wsResource;
    }
    case FWL_MCCAPACITY_July: {
      wsResource = L"July";
      return &wsResource;
    }
    case FWL_MCCAPACITY_August: {
      wsResource = L"August";
      return &wsResource;
    }
    case FWL_MCCAPACITY_September: {
      wsResource = L"September";
      return &wsResource;
    }
    case FWL_MCCAPACITY_October: {
      wsResource = L"October";
      return &wsResource;
    }
    case FWL_MCCAPACITY_November: {
      wsResource = L"November";
      return &wsResource;
    }
    case FWL_MCCAPACITY_December: {
      wsResource = L"December";
      return &wsResource;
    }
    case FWL_MCCAPACITY_Today: {
      wsResource = L"Today";
      return &wsResource;
    }
    default: { bDefPro = TRUE; }
  }
  if (!bDefPro) {
    if (bDwordVal) {
      return &m_dwValue;
    }
    return &m_fValue;
  }
  return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
}
FWL_ERR CFWL_MonthCalendarTP::Initialize() {
  InitTTO();
  return CFWL_WidgetTP::Initialize();
}
FWL_ERR CFWL_MonthCalendarTP::Finalize() {
  FinalizeTTO();
  return CFWL_WidgetTP::Finalize();
}
FX_BOOL CFWL_MonthCalendarTP::DrawTotalBK(CFWL_ThemeBackground* pParams,
                                          CFX_Matrix* pMatrix) {
  CFX_Path path;
  path.Create();
  CFX_RectF rtTotal(pParams->m_rtPart);
  path.AddRectangle(rtTotal.left, rtTotal.top, rtTotal.width, rtTotal.height);
  pParams->m_pGraphics->SaveGraphState();
  CFX_Color clrBK(m_pThemeData->clrBK);
  pParams->m_pGraphics->SetFillColor(&clrBK);
  pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
  pParams->m_pGraphics->RestoreGraphState();
  return TRUE;
}
FX_BOOL CFWL_MonthCalendarTP::DrawHeadBk(CFWL_ThemeBackground* pParams,
                                         CFX_Matrix* pMatrix) {
  CFX_Path path;
  path.Create();
  CFX_RectF rtHead = pParams->m_rtPart;
  path.AddRectangle(rtHead.left, rtHead.top, rtHead.width, rtHead.height);
  pParams->m_pGraphics->SaveGraphState();
  CFX_Color clrHeadBK(m_pThemeData->clrBK);
  pParams->m_pGraphics->SetFillColor(&clrHeadBK);
  pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
  pParams->m_pGraphics->RestoreGraphState();
  return TRUE;
}
FX_BOOL CFWL_MonthCalendarTP::DrawLButton(CFWL_ThemeBackground* pParams,
                                          CFX_Matrix* pMatrix) {
  CFX_Path path;
  path.Create();
  CFX_RectF rtLBtn;
  rtLBtn = pParams->m_rtPart;
  path.AddRectangle(rtLBtn.left, rtLBtn.top, rtLBtn.width, rtLBtn.height);
  pParams->m_pGraphics->SaveGraphState();
  CFX_Color clrLBtnEdge(ArgbEncode(0xff, 205, 219, 243));
  pParams->m_pGraphics->SetStrokeColor(&clrLBtnEdge);
  pParams->m_pGraphics->StrokePath(&path, pMatrix);
  if ((pParams->m_dwStates & FWL_PARTSTATE_MCD_Pressed) ==
      FWL_PARTSTATE_MCD_Pressed) {
    CFX_Color clrLBtnFill(ArgbEncode(0xff, 174, 198, 242));
    pParams->m_pGraphics->SetFillColor(&clrLBtnFill);
    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
  } else {
    CFX_Color clrLBtnFill(ArgbEncode(0xff, 227, 235, 249));
    pParams->m_pGraphics->SetFillColor(&clrLBtnFill);
    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
  }
  path.Clear();
  path.MoveTo(rtLBtn.left + rtLBtn.Width() / 3 * 2,
              rtLBtn.top + rtLBtn.height / 4);
  path.LineTo(rtLBtn.left + rtLBtn.Width() / 3, rtLBtn.top + rtLBtn.height / 2);
  path.LineTo(rtLBtn.left + rtLBtn.Width() / 3 * 2,
              rtLBtn.bottom() - rtLBtn.height / 4);
  CFX_Color clrFlag(ArgbEncode(0xff, 50, 104, 205));
  pParams->m_pGraphics->SetStrokeColor(&clrFlag);
  pParams->m_pGraphics->StrokePath(&path, pMatrix);
  pParams->m_pGraphics->RestoreGraphState();
  return TRUE;
}
FX_BOOL CFWL_MonthCalendarTP::DrawRButton(CFWL_ThemeBackground* pParams,
                                          CFX_Matrix* pMatrix) {
  CFX_Path path;
  path.Create();
  CFX_RectF rtRBtn;
  rtRBtn = pParams->m_rtPart;
  path.AddRectangle(rtRBtn.left, rtRBtn.top, rtRBtn.width, rtRBtn.height);
  pParams->m_pGraphics->SaveGraphState();
  CFX_Color clrRBtnEdge(ArgbEncode(0xff, 205, 219, 243));
  pParams->m_pGraphics->SetStrokeColor(&clrRBtnEdge);
  pParams->m_pGraphics->StrokePath(&path, pMatrix);
  if ((pParams->m_dwStates & FWL_PARTSTATE_MCD_Pressed) ==
      FWL_PARTSTATE_MCD_Pressed) {
    CFX_Color clrRBtnFill(ArgbEncode(0xff, 174, 198, 242));
    pParams->m_pGraphics->SetFillColor(&clrRBtnFill);
    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
  } else {
    CFX_Color clrRBtnFill(ArgbEncode(0xff, 227, 235, 249));
    pParams->m_pGraphics->SetFillColor(&clrRBtnFill);
    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
  }
  path.Clear();
  path.MoveTo(rtRBtn.left + rtRBtn.Width() / 3, rtRBtn.top + rtRBtn.height / 4);
  path.LineTo(rtRBtn.left + rtRBtn.Width() / 3 * 2,
              rtRBtn.top + rtRBtn.height / 2);
  path.LineTo(rtRBtn.left + rtRBtn.Width() / 3,
              rtRBtn.bottom() - rtRBtn.height / 4);
  CFX_Color clrFlag(ArgbEncode(0xff, 50, 104, 205));
  pParams->m_pGraphics->SetStrokeColor(&clrFlag);
  pParams->m_pGraphics->StrokePath(&path, pMatrix);
  pParams->m_pGraphics->RestoreGraphState();
  return TRUE;
}
FX_BOOL CFWL_MonthCalendarTP::DrawHSeperator(CFWL_ThemeBackground* pParams,
                                             CFX_Matrix* pMatrix) {
  CFX_Path path;
  path.Create();
  CFX_RectF rtHSep;
  rtHSep = pParams->m_rtPart;
  path.MoveTo(rtHSep.left, rtHSep.top + rtHSep.height / 2);
  path.LineTo(rtHSep.right(), rtHSep.top + rtHSep.height / 2);
  pParams->m_pGraphics->SaveGraphState();
  CFX_Color clrHSep(m_pThemeData->clrSeperator);
  pParams->m_pGraphics->SetStrokeColor(&clrHSep);
  pParams->m_pGraphics->StrokePath(&path, pMatrix);
  pParams->m_pGraphics->RestoreGraphState();
  return TRUE;
}
FX_BOOL CFWL_MonthCalendarTP::DrawWeekNumSep(CFWL_ThemeBackground* pParams,
                                             CFX_Matrix* pMatrix) {
  CFX_Path path;
  path.Create();
  CFX_RectF rtWeekSep;
  rtWeekSep = pParams->m_rtPart;
  path.MoveTo(rtWeekSep.left, rtWeekSep.top);
  path.LineTo(rtWeekSep.left, rtWeekSep.bottom());
  pParams->m_pGraphics->SaveGraphState();
  CFX_Color clrHSep(m_pThemeData->clrSeperator);
  pParams->m_pGraphics->SetStrokeColor(&clrHSep);
  pParams->m_pGraphics->StrokePath(&path, pMatrix);
  pParams->m_pGraphics->RestoreGraphState();
  return TRUE;
}
FX_BOOL CFWL_MonthCalendarTP::DrawDatesInBK(CFWL_ThemeBackground* pParams,
                                            CFX_Matrix* pMatrix) {
  pParams->m_pGraphics->SaveGraphState();
  if (pParams->m_dwStates & FWL_PARTSTATE_MCD_Selected) {
    CFX_Path path;
    path.Create();
    CFX_RectF rtSelDay;
    rtSelDay = pParams->m_rtPart;
    path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
                      rtSelDay.height);
    CFX_Color clrSelDayBK;
    clrSelDayBK = m_pThemeData->clrDatesSelectedBK;
    pParams->m_pGraphics->SetFillColor(&clrSelDayBK);
    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
  } else if (pParams->m_dwStates & FWL_PARTSTATE_MCD_Hovered) {
    CFX_Path path;
    path.Create();
    CFX_RectF rtSelDay;
    rtSelDay = pParams->m_rtPart;
    path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
                      rtSelDay.height);
    CFX_Color clrSelDayBK;
    clrSelDayBK = m_pThemeData->clrDatesHoverBK;
    pParams->m_pGraphics->SetFillColor(&clrSelDayBK);
    pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
  }
  pParams->m_pGraphics->RestoreGraphState();
  return FALSE;
}
FX_BOOL CFWL_MonthCalendarTP::DrawDatesInCircle(CFWL_ThemeBackground* pParams,
                                                CFX_Matrix* pMatrix) {
  CFX_Path path;
  path.Create();
  CFX_RectF rtSelDay;
  rtSelDay = pParams->m_rtPart;
  path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
                    rtSelDay.height);
  pParams->m_pGraphics->SaveGraphState();
  CFX_Color clrSelDayBK;
  clrSelDayBK = m_pThemeData->clrDatesCircle;
  pParams->m_pGraphics->SetStrokeColor(&clrSelDayBK);
  pParams->m_pGraphics->StrokePath(&path, pMatrix);
  pParams->m_pGraphics->RestoreGraphState();
  return TRUE;
}
FX_BOOL CFWL_MonthCalendarTP::DrawTodayCircle(CFWL_ThemeBackground* pParams,
                                              CFX_Matrix* pMatrix) {
  CFX_Path path;
  path.Create();
  CFX_RectF rtTodayCircle;
  rtTodayCircle = pParams->m_rtPart;
  path.AddRectangle(rtTodayCircle.left, rtTodayCircle.top, rtTodayCircle.width,
                    rtTodayCircle.height);
  pParams->m_pGraphics->SaveGraphState();
  CFX_Color clrTodayCircle;
  clrTodayCircle = m_pThemeData->clrDatesCircle;
  pParams->m_pGraphics->SetStrokeColor(&clrTodayCircle);
  pParams->m_pGraphics->StrokePath(&path, pMatrix);
  pParams->m_pGraphics->RestoreGraphState();
  return TRUE;
}
FWLTHEME_STATE CFWL_MonthCalendarTP::GetState(uint32_t dwFWLStates) {
  if (dwFWLStates & FWL_PARTSTATE_MCD_Hovered) {
    return FWLTHEME_STATE_Hover;
  } else if (dwFWLStates & FWL_PARTSTATE_MCD_Pressed) {
    return FWLTHEME_STATE_Pressed;
  }
  return FWLTHEME_STATE_Normal;
}
void CFWL_MonthCalendarTP::SetThemeData(uint32_t dwThemeID) {
  if (dwThemeID == 0) {
    m_pThemeData->clrCaption = ArgbEncode(0xff, 0, 153, 255);
    m_pThemeData->clrSeperator = ArgbEncode(0xff, 141, 161, 239);
    m_pThemeData->clrDatesHoverBK = ArgbEncode(0xff, 193, 211, 251);
    m_pThemeData->clrDatesSelectedBK = ArgbEncode(0xff, 173, 188, 239);
    m_pThemeData->clrDatesCircle = ArgbEncode(0xff, 103, 144, 209);
    m_pThemeData->clrToday = ArgbEncode(0xff, 0, 0, 0);
    m_pThemeData->clrBK = ArgbEncode(0xff, 255, 255, 255);
  } else {
    m_pThemeData->clrCaption = ArgbEncode(0xff, 128, 128, 0);
    m_pThemeData->clrSeperator = ArgbEncode(0xff, 128, 128, 64);
    m_pThemeData->clrDatesHoverBK = ArgbEncode(0xff, 217, 220, 191);
    m_pThemeData->clrDatesSelectedBK = ArgbEncode(0xff, 204, 208, 183);
    m_pThemeData->clrDatesCircle = ArgbEncode(0xff, 128, 128, 0);
    m_pThemeData->clrToday = ArgbEncode(0xff, 0, 0, 0);
    m_pThemeData->clrBK = ArgbEncode(0xff, 255, 255, 255);
  }
}
