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/src/foxitlib.h"
8CFWL_DateTimePickerTP::CFWL_DateTimePickerTP() {
9  m_pThemeData = new DTPThemeData;
10  initThemeData();
11}
12CFWL_DateTimePickerTP::~CFWL_DateTimePickerTP() {
13  delete m_pThemeData;
14}
15FX_BOOL CFWL_DateTimePickerTP::IsValidWidget(IFWL_Widget* pWidget) {
16  if (!pWidget)
17    return FALSE;
18  return pWidget->GetClassID() == FWL_CLASSHASH_DateTimePicker;
19}
20FX_BOOL CFWL_DateTimePickerTP::DrawBackground(CFWL_ThemeBackground* pParams) {
21  if (!pParams)
22    return FALSE;
23  switch (pParams->m_iPart) {
24    case FWL_PART_DTP_Border: {
25      DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix);
26      break;
27    }
28    case FWL_PART_DTP_Edge: {
29      DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(),
30               &pParams->m_rtPart, &pParams->m_matrix);
31      break;
32    }
33    case FWL_PART_DTP_DropDownButton: {
34      DrawDropDownButton(pParams, &pParams->m_matrix);
35      break;
36    }
37    default: {}
38  }
39  return TRUE;
40}
41#ifdef THEME_XPSimilar
42void CFWL_DateTimePickerTP::DrawDropDownButton(CFWL_ThemeBackground* pParams,
43                                               CFX_Matrix* pMatrix) {
44  FX_DWORD dwStates = pParams->m_dwStates;
45  dwStates &= 0x03;
46  FWLTHEME_STATE eState = FWLTHEME_STATE_Normal;
47  switch (eState & dwStates) {
48    case FWL_PARTSTATE_DTP_Normal: {
49      eState = FWLTHEME_STATE_Normal;
50      break;
51    }
52    case FWL_PARTSTATE_DTP_Hovered: {
53      eState = FWLTHEME_STATE_Hover;
54      break;
55    }
56    case FWL_PARTSTATE_DTP_Pressed: {
57      eState = FWLTHEME_STATE_Pressed;
58      break;
59    }
60    case FWL_PARTSTATE_DTP_Disabled: {
61      eState = FWLTHEME_STATE_Disabale;
62      break;
63    }
64    default: {}
65  }
66  DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart,
67               FWLTHEME_DIRECTION_Down, eState, pMatrix);
68}
69#else
70void CFWL_DateTimePickerTP::DrawDropDownButton(CFWL_ThemeBackground* pParams,
71                                               CFX_Matrix* pMatrix) {
72  FX_BOOL bPressed = ((pParams->m_dwStates & FWL_PARTSTATE_DTP_Pressed) ==
73                      FWL_PARTSTATE_DTP_Pressed);
74  FX_FLOAT fWidth = bPressed ? 1.0f : 2.0f;
75  FWLTHEME_EDGE eType = bPressed ? FWLTHEME_EDGE_Flat : FWLTHEME_EDGE_Raised;
76  Draw3DRect(pParams->m_pGraphics, eType, fWidth, &pParams->m_rtPart,
77             FWLTHEME_COLOR_EDGELT1, FWLTHEME_COLOR_EDGELT2,
78             FWLTHEME_COLOR_EDGERB1, FWLTHEME_COLOR_EDGERB2, pMatrix);
79  CFX_Path path;
80  path.Create();
81  path.AddRectangle(pParams->m_rtPart.left + fWidth,
82                    pParams->m_rtPart.top + fWidth,
83                    pParams->m_rtPart.width - 2 * fWidth,
84                    pParams->m_rtPart.height - 2 * fWidth);
85  pParams->m_pGraphics->SaveGraphState();
86  CFX_Color crFill(FWLTHEME_COLOR_Background);
87  pParams->m_pGraphics->SetFillColor(&crFill);
88  pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
89  pParams->m_pGraphics->RestoreGraphState();
90  FX_ARGB argbFill = ArgbEncode(255, 77, 97, 133);
91  switch (pParams->m_dwStates & 0x03) {
92    case FWL_PARTSTATE_DTP_Normal: {
93    }
94    case FWL_PARTSTATE_DTP_Hovered: {
95    }
96    case FWL_PARTSTATE_DTP_Pressed: {
97      argbFill = 0xFF000000;
98      break;
99    }
100    case FWL_PARTSTATE_DTP_Disabled: {
101      argbFill = 0xFFF0F0F0;
102      break;
103    }
104  }
105  DrawArrow(pParams->m_pGraphics, &pParams->m_rtPart, FWLTHEME_DIRECTION_Down,
106            argbFill, bPressed, pMatrix);
107}
108#endif
109void CFWL_DateTimePickerTP::initThemeData() {
110  FX_DWORD* pData = (FX_DWORD*)&m_pThemeData->BoxBkColor;
111  *pData++ = 0, *pData++ = 0, *pData++ = ArgbEncode(255, 220, 220, 215),
112  *pData++ = ArgbEncode(255, 255, 255, 255),
113  *pData++ = ArgbEncode(255, 255, 240, 207),
114  *pData++ = ArgbEncode(255, 248, 179, 48),
115  *pData++ = ArgbEncode(255, 176, 176, 167),
116  *pData++ = ArgbEncode(255, 241, 239, 239),
117  *pData++ = ArgbEncode(255, 255, 255, 255),
118  *pData++ = ArgbEncode(255, 255, 255, 255),
119  *pData++ = ArgbEncode(255, 220, 220, 215),
120  *pData++ = ArgbEncode(255, 255, 255, 255),
121  *pData++ = ArgbEncode(255, 255, 240, 207),
122  *pData++ = ArgbEncode(255, 248, 179, 48),
123  *pData++ = ArgbEncode(255, 176, 176, 167),
124  *pData++ = ArgbEncode(255, 241, 239, 239),
125  *pData++ = ArgbEncode(255, 255, 255, 255),
126  *pData++ = ArgbEncode(255, 255, 255, 255),
127  *pData++ = ArgbEncode(255, 220, 220, 215),
128  *pData++ = ArgbEncode(255, 255, 255, 255),
129  *pData++ = ArgbEncode(255, 255, 240, 207),
130  *pData++ = ArgbEncode(255, 248, 179, 48),
131  *pData++ = ArgbEncode(255, 176, 176, 167),
132  *pData++ = ArgbEncode(255, 241, 239, 239),
133  *pData++ = ArgbEncode(255, 255, 255, 255),
134  *pData++ = ArgbEncode(255, 255, 255, 255);
135}
136