Home | History | Annotate | Download | only in theme
      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 #include "xfa/fwl/theme/cfwl_monthcalendartp.h"
      8 
      9 #include "xfa/fde/cfde_textout.h"
     10 #include "xfa/fwl/cfwl_monthcalendar.h"
     11 #include "xfa/fwl/cfwl_themebackground.h"
     12 #include "xfa/fwl/cfwl_themetext.h"
     13 #include "xfa/fwl/cfwl_widget.h"
     14 #include "xfa/fwl/ifwl_themeprovider.h"
     15 #include "xfa/fxgraphics/cxfa_gecolor.h"
     16 #include "xfa/fxgraphics/cxfa_gepath.h"
     17 
     18 CFWL_MonthCalendarTP::CFWL_MonthCalendarTP() : m_pThemeData(new MCThemeData) {
     19   SetThemeData();
     20 }
     21 
     22 CFWL_MonthCalendarTP::~CFWL_MonthCalendarTP() {}
     23 
     24 void CFWL_MonthCalendarTP::Initialize() {
     25   CFWL_WidgetTP::Initialize();
     26   InitTTO();
     27 }
     28 
     29 void CFWL_MonthCalendarTP::Finalize() {
     30   FinalizeTTO();
     31   CFWL_WidgetTP::Finalize();
     32 }
     33 
     34 void CFWL_MonthCalendarTP::DrawBackground(CFWL_ThemeBackground* pParams) {
     35   if (!pParams)
     36     return;
     37 
     38   switch (pParams->m_iPart) {
     39     case CFWL_Part::Border: {
     40       DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix);
     41       break;
     42     }
     43     case CFWL_Part::Background: {
     44       DrawTotalBK(pParams, &pParams->m_matrix);
     45       break;
     46     }
     47     case CFWL_Part::Header: {
     48       DrawHeadBk(pParams, &pParams->m_matrix);
     49       break;
     50     }
     51     case CFWL_Part::LBtn: {
     52       FWLTHEME_STATE eState = GetState(pParams->m_dwStates);
     53       DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart,
     54                    FWLTHEME_DIRECTION_Left, eState, &pParams->m_matrix);
     55       break;
     56     }
     57     case CFWL_Part::RBtn: {
     58       FWLTHEME_STATE eState = GetState(pParams->m_dwStates);
     59       DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart,
     60                    FWLTHEME_DIRECTION_Right, eState, &pParams->m_matrix);
     61       break;
     62     }
     63     case CFWL_Part::HSeparator: {
     64       DrawHSeperator(pParams, &pParams->m_matrix);
     65       break;
     66     }
     67     case CFWL_Part::DatesIn: {
     68       DrawDatesInBK(pParams, &pParams->m_matrix);
     69       break;
     70     }
     71     case CFWL_Part::TodayCircle: {
     72       DrawTodayCircle(pParams, &pParams->m_matrix);
     73       break;
     74     }
     75     case CFWL_Part::DateInCircle: {
     76       DrawDatesInCircle(pParams, &pParams->m_matrix);
     77       break;
     78     }
     79     case CFWL_Part::WeekNumSep: {
     80       DrawWeekNumSep(pParams, &pParams->m_matrix);
     81       break;
     82     }
     83     default:
     84       break;
     85   }
     86 }
     87 
     88 void CFWL_MonthCalendarTP::DrawText(CFWL_ThemeText* pParams) {
     89   if (!m_pTextOut)
     90     return;
     91 
     92   if ((pParams->m_iPart == CFWL_Part::DatesIn) &&
     93       !(pParams->m_dwStates & FWL_ITEMSTATE_MCD_Flag) &&
     94       (pParams->m_dwStates &
     95        (CFWL_PartState_Hovered | CFWL_PartState_Selected))) {
     96     m_pTextOut->SetTextColor(0xFFFFFFFF);
     97   } else if (pParams->m_iPart == CFWL_Part::Caption) {
     98     m_pTextOut->SetTextColor(m_pThemeData->clrCaption);
     99   } else {
    100     m_pTextOut->SetTextColor(0xFF000000);
    101   }
    102   CFWL_WidgetTP::DrawText(pParams);
    103 }
    104 
    105 void CFWL_MonthCalendarTP::DrawTotalBK(CFWL_ThemeBackground* pParams,
    106                                        CFX_Matrix* pMatrix) {
    107   CXFA_GEPath path;
    108   CFX_RectF rtTotal(pParams->m_rtPart);
    109   path.AddRectangle(rtTotal.left, rtTotal.top, rtTotal.width, rtTotal.height);
    110   pParams->m_pGraphics->SaveGraphState();
    111   pParams->m_pGraphics->SetFillColor(CXFA_GEColor(m_pThemeData->clrBK));
    112   pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    113   pParams->m_pGraphics->RestoreGraphState();
    114 }
    115 
    116 void CFWL_MonthCalendarTP::DrawHeadBk(CFWL_ThemeBackground* pParams,
    117                                       CFX_Matrix* pMatrix) {
    118   CXFA_GEPath path;
    119   CFX_RectF rtHead = pParams->m_rtPart;
    120   path.AddRectangle(rtHead.left, rtHead.top, rtHead.width, rtHead.height);
    121   pParams->m_pGraphics->SaveGraphState();
    122   pParams->m_pGraphics->SetFillColor(CXFA_GEColor(m_pThemeData->clrBK));
    123   pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    124   pParams->m_pGraphics->RestoreGraphState();
    125 }
    126 
    127 void CFWL_MonthCalendarTP::DrawLButton(CFWL_ThemeBackground* pParams,
    128                                        CFX_Matrix* pMatrix) {
    129   CXFA_GEPath path;
    130   CFX_RectF rtLBtn = pParams->m_rtPart;
    131   path.AddRectangle(rtLBtn.left, rtLBtn.top, rtLBtn.width, rtLBtn.height);
    132   pParams->m_pGraphics->SaveGraphState();
    133   pParams->m_pGraphics->SetStrokeColor(
    134       CXFA_GEColor(ArgbEncode(0xff, 205, 219, 243)));
    135   pParams->m_pGraphics->StrokePath(&path, pMatrix);
    136   if (pParams->m_dwStates & CFWL_PartState_Pressed) {
    137     pParams->m_pGraphics->SetFillColor(
    138         CXFA_GEColor(ArgbEncode(0xff, 174, 198, 242)));
    139     pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    140   } else {
    141     pParams->m_pGraphics->SetFillColor(
    142         CXFA_GEColor(ArgbEncode(0xff, 227, 235, 249)));
    143     pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    144   }
    145 
    146   path.Clear();
    147   path.MoveTo(CFX_PointF(rtLBtn.left + rtLBtn.Width() / 3 * 2,
    148                          rtLBtn.top + rtLBtn.height / 4));
    149   path.LineTo(CFX_PointF(rtLBtn.left + rtLBtn.Width() / 3,
    150                          rtLBtn.top + rtLBtn.height / 2));
    151   path.LineTo(CFX_PointF(rtLBtn.left + rtLBtn.Width() / 3 * 2,
    152                          rtLBtn.bottom() - rtLBtn.height / 4));
    153 
    154   pParams->m_pGraphics->SetStrokeColor(
    155       CXFA_GEColor(ArgbEncode(0xff, 50, 104, 205)));
    156   pParams->m_pGraphics->StrokePath(&path, pMatrix);
    157   pParams->m_pGraphics->RestoreGraphState();
    158 }
    159 
    160 void CFWL_MonthCalendarTP::DrawRButton(CFWL_ThemeBackground* pParams,
    161                                        CFX_Matrix* pMatrix) {
    162   CXFA_GEPath path;
    163   CFX_RectF rtRBtn = pParams->m_rtPart;
    164   path.AddRectangle(rtRBtn.left, rtRBtn.top, rtRBtn.width, rtRBtn.height);
    165   pParams->m_pGraphics->SaveGraphState();
    166   pParams->m_pGraphics->SetStrokeColor(
    167       CXFA_GEColor(ArgbEncode(0xff, 205, 219, 243)));
    168   pParams->m_pGraphics->StrokePath(&path, pMatrix);
    169   if (pParams->m_dwStates & CFWL_PartState_Pressed) {
    170     pParams->m_pGraphics->SetFillColor(
    171         CXFA_GEColor(ArgbEncode(0xff, 174, 198, 242)));
    172     pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    173   } else {
    174     pParams->m_pGraphics->SetFillColor(
    175         CXFA_GEColor(ArgbEncode(0xff, 227, 235, 249)));
    176     pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    177   }
    178 
    179   path.Clear();
    180   path.MoveTo(CFX_PointF(rtRBtn.left + rtRBtn.Width() / 3,
    181                          rtRBtn.top + rtRBtn.height / 4));
    182   path.LineTo(CFX_PointF(rtRBtn.left + rtRBtn.Width() / 3 * 2,
    183                          rtRBtn.top + rtRBtn.height / 2));
    184   path.LineTo(CFX_PointF(rtRBtn.left + rtRBtn.Width() / 3,
    185                          rtRBtn.bottom() - rtRBtn.height / 4));
    186 
    187   pParams->m_pGraphics->SetStrokeColor(
    188       CXFA_GEColor(ArgbEncode(0xff, 50, 104, 205)));
    189   pParams->m_pGraphics->StrokePath(&path, pMatrix);
    190   pParams->m_pGraphics->RestoreGraphState();
    191 }
    192 
    193 void CFWL_MonthCalendarTP::DrawHSeperator(CFWL_ThemeBackground* pParams,
    194                                           CFX_Matrix* pMatrix) {
    195   CXFA_GEPath path;
    196   CFX_RectF rtHSep = pParams->m_rtPart;
    197   path.MoveTo(CFX_PointF(rtHSep.left, rtHSep.top + rtHSep.height / 2));
    198   path.LineTo(CFX_PointF(rtHSep.right(), rtHSep.top + rtHSep.height / 2));
    199   pParams->m_pGraphics->SaveGraphState();
    200   pParams->m_pGraphics->SetStrokeColor(
    201       CXFA_GEColor(m_pThemeData->clrSeperator));
    202   pParams->m_pGraphics->StrokePath(&path, pMatrix);
    203   pParams->m_pGraphics->RestoreGraphState();
    204 }
    205 
    206 void CFWL_MonthCalendarTP::DrawWeekNumSep(CFWL_ThemeBackground* pParams,
    207                                           CFX_Matrix* pMatrix) {
    208   CXFA_GEPath path;
    209   CFX_RectF rtWeekSep = pParams->m_rtPart;
    210   path.MoveTo(rtWeekSep.TopLeft());
    211   path.LineTo(rtWeekSep.BottomLeft());
    212   pParams->m_pGraphics->SaveGraphState();
    213   pParams->m_pGraphics->SetStrokeColor(
    214       CXFA_GEColor(m_pThemeData->clrSeperator));
    215   pParams->m_pGraphics->StrokePath(&path, pMatrix);
    216   pParams->m_pGraphics->RestoreGraphState();
    217 }
    218 
    219 void CFWL_MonthCalendarTP::DrawDatesInBK(CFWL_ThemeBackground* pParams,
    220                                          CFX_Matrix* pMatrix) {
    221   pParams->m_pGraphics->SaveGraphState();
    222   if (pParams->m_dwStates & CFWL_PartState_Selected) {
    223     CXFA_GEPath path;
    224     CFX_RectF rtSelDay = pParams->m_rtPart;
    225     path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
    226                       rtSelDay.height);
    227     pParams->m_pGraphics->SetFillColor(
    228         CXFA_GEColor(m_pThemeData->clrDatesSelectedBK));
    229     pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    230   } else if (pParams->m_dwStates & CFWL_PartState_Hovered) {
    231     CXFA_GEPath path;
    232     CFX_RectF rtSelDay = pParams->m_rtPart;
    233     path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
    234                       rtSelDay.height);
    235     pParams->m_pGraphics->SetFillColor(
    236         CXFA_GEColor(m_pThemeData->clrDatesHoverBK));
    237     pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    238   }
    239   pParams->m_pGraphics->RestoreGraphState();
    240 }
    241 
    242 void CFWL_MonthCalendarTP::DrawDatesInCircle(CFWL_ThemeBackground* pParams,
    243                                              CFX_Matrix* pMatrix) {
    244   CXFA_GEPath path;
    245   CFX_RectF rtSelDay = pParams->m_rtPart;
    246   path.AddRectangle(rtSelDay.left, rtSelDay.top, rtSelDay.width,
    247                     rtSelDay.height);
    248   pParams->m_pGraphics->SaveGraphState();
    249   pParams->m_pGraphics->SetStrokeColor(
    250       CXFA_GEColor(m_pThemeData->clrDatesCircle));
    251   pParams->m_pGraphics->StrokePath(&path, pMatrix);
    252   pParams->m_pGraphics->RestoreGraphState();
    253 }
    254 
    255 void CFWL_MonthCalendarTP::DrawTodayCircle(CFWL_ThemeBackground* pParams,
    256                                            CFX_Matrix* pMatrix) {
    257   CXFA_GEPath path;
    258   CFX_RectF rtTodayCircle = pParams->m_rtPart;
    259   path.AddRectangle(rtTodayCircle.left, rtTodayCircle.top, rtTodayCircle.width,
    260                     rtTodayCircle.height);
    261   pParams->m_pGraphics->SaveGraphState();
    262   pParams->m_pGraphics->SetStrokeColor(
    263       CXFA_GEColor(m_pThemeData->clrDatesCircle));
    264   pParams->m_pGraphics->StrokePath(&path, pMatrix);
    265   pParams->m_pGraphics->RestoreGraphState();
    266 }
    267 
    268 FWLTHEME_STATE CFWL_MonthCalendarTP::GetState(uint32_t dwFWLStates) {
    269   if (dwFWLStates & CFWL_PartState_Hovered)
    270     return FWLTHEME_STATE_Hover;
    271   if (dwFWLStates & CFWL_PartState_Pressed)
    272     return FWLTHEME_STATE_Pressed;
    273   return FWLTHEME_STATE_Normal;
    274 }
    275 
    276 void CFWL_MonthCalendarTP::SetThemeData() {
    277   m_pThemeData->clrCaption = ArgbEncode(0xff, 0, 153, 255);
    278   m_pThemeData->clrSeperator = ArgbEncode(0xff, 141, 161, 239);
    279   m_pThemeData->clrDatesHoverBK = ArgbEncode(0xff, 193, 211, 251);
    280   m_pThemeData->clrDatesSelectedBK = ArgbEncode(0xff, 173, 188, 239);
    281   m_pThemeData->clrDatesCircle = ArgbEncode(0xff, 103, 144, 209);
    282   m_pThemeData->clrToday = ArgbEncode(0xff, 0, 0, 0);
    283   m_pThemeData->clrBK = ArgbEncode(0xff, 255, 255, 255);
    284 }
    285