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"
8#define FWLTHEME_CAPACITY_ComboFormHandler 8.0f
9CFWL_ComboBoxTP::CFWL_ComboBoxTP() {
10  m_dwThemeID = 0;
11}
12CFWL_ComboBoxTP::~CFWL_ComboBoxTP() {}
13FX_BOOL CFWL_ComboBoxTP::IsValidWidget(IFWL_Widget* pWidget) {
14  if (!pWidget)
15    return FALSE;
16  return pWidget->GetClassID() == FWL_CLASSHASH_ComboBox;
17}
18FX_BOOL CFWL_ComboBoxTP::DrawBackground(CFWL_ThemeBackground* pParams) {
19  if (!pParams)
20    return FALSE;
21  switch (pParams->m_iPart) {
22    case FWL_PART_CMB_Border: {
23      DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix);
24      break;
25    }
26    case FWL_PART_CMB_Edge: {
27      DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(),
28               &pParams->m_rtPart, &pParams->m_matrix);
29      break;
30    }
31    case FWL_PART_CMB_Background: {
32      CFX_Path path;
33      path.Create();
34      CFX_RectF& rect = pParams->m_rtPart;
35      path.AddRectangle(rect.left, rect.top, rect.width, rect.height);
36      CFX_Color cr;
37      switch (pParams->m_dwStates) {
38        case FWL_PARTSTATE_CMB_Selected:
39          cr = FWLTHEME_COLOR_BKSelected;
40          break;
41        case FWL_PARTSTATE_CMB_Disabled:
42          cr = FWLTHEME_COLOR_EDGERB1;
43          break;
44        default:
45          cr = 0xFFFFFFFF;
46      }
47      pParams->m_pGraphics->SaveGraphState();
48      pParams->m_pGraphics->SetFillColor(&cr);
49      pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, &pParams->m_matrix);
50      pParams->m_pGraphics->RestoreGraphState();
51      break;
52    }
53    case FWL_PART_CMB_DropDownButton: {
54      DrawDropDownButton(pParams, pParams->m_dwStates, &pParams->m_matrix);
55      break;
56    }
57    case FWL_PART_CMB_StretcgHandler: {
58      DrawStrethHandler(pParams, 0, &pParams->m_matrix);
59      break;
60    }
61    default: { return FALSE; }
62  }
63  return TRUE;
64}
65void CFWL_ComboBoxTP::DrawStrethHandler(CFWL_ThemeBackground* pParams,
66                                        FX_DWORD dwStates,
67                                        CFX_Matrix* pMatrix) {
68  CFX_Path path;
69  path.Create();
70  path.AddRectangle(pParams->m_rtPart.left, pParams->m_rtPart.top,
71                    pParams->m_rtPart.width - 1, pParams->m_rtPart.height);
72  CFX_Color cr(ArgbEncode(0xff, 0xff, 0, 0));
73  pParams->m_pGraphics->SetFillColor(&cr);
74  pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, &pParams->m_matrix);
75}
76void* CFWL_ComboBoxTP::GetCapacity(CFWL_ThemePart* pThemePart,
77                                   FX_DWORD dwCapacity) {
78  if (dwCapacity == FWL_WGTCAPACITY_CMB_ComboFormHandler) {
79    m_fValue = FWLTHEME_CAPACITY_ComboFormHandler;
80    return &m_fValue;
81  }
82  return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
83}
84#ifdef THEME_XPSimilar
85void CFWL_ComboBoxTP::DrawDropDownButton(CFWL_ThemeBackground* pParams,
86                                         FX_DWORD dwStates,
87                                         CFX_Matrix* pMatrix) {
88  FWLTHEME_STATE eState = FWLTHEME_STATE_Normal;
89  switch (dwStates) {
90    case FWL_PARTSTATE_CMB_Normal: {
91      eState = FWLTHEME_STATE_Normal;
92      break;
93    }
94    case FWL_PARTSTATE_CMB_Hovered: {
95      eState = FWLTHEME_STATE_Hover;
96      break;
97    }
98    case FWL_PARTSTATE_CMB_Pressed: {
99      eState = FWLTHEME_STATE_Pressed;
100      break;
101    }
102    case FWL_PARTSTATE_CMB_Disabled: {
103      eState = FWLTHEME_STATE_Disabale;
104      break;
105    }
106    default: {}
107  }
108  DrawArrowBtn(pParams->m_pGraphics, &pParams->m_rtPart,
109               FWLTHEME_DIRECTION_Down, eState, &pParams->m_matrix);
110}
111#else
112void CFWL_ComboBoxTP::DrawDropDownButton(CFWL_ThemeBackground* pParams,
113                                         FX_DWORD dwStates,
114                                         CFX_Matrix* pMatrix) {
115  FX_BOOL bPressed = ((pParams->m_dwStates & FWL_CMBPARTSTATE_Pressed) ==
116                      FWL_CMBPARTSTATE_Pressed);
117  FX_FLOAT fWidth = bPressed ? 1.0f : 2.0f;
118  FWLTHEME_EDGE eType = bPressed ? FWLTHEME_EDGE_Flat : FWLTHEME_EDGE_Raised;
119  Draw3DRect(pParams->m_pGraphics, eType, fWidth, &pParams->m_rtPart,
120             FWLTHEME_COLOR_EDGELT1, FWLTHEME_COLOR_EDGELT2,
121             FWLTHEME_COLOR_EDGERB1, FWLTHEME_COLOR_EDGERB2, pMatrix);
122  CFX_Path path;
123  path.Create();
124  path.AddRectangle(pParams->m_rtPart.left + fWidth,
125                    pParams->m_rtPart.top + fWidth,
126                    pParams->m_rtPart.width - 2 * fWidth,
127                    pParams->m_rtPart.height - 2 * fWidth);
128  pParams->m_pGraphics->SaveGraphState();
129  CFX_Color crFill(FWLTHEME_COLOR_Background);
130  pParams->m_pGraphics->SetFillColor(&crFill);
131  pParams->m_pGraphics->FillPath(&path, FXFILL_WINDING, &pParams->m_matrix);
132  pParams->m_pGraphics->RestoreGraphState();
133  FX_ARGB argbFill = ArgbEncode(255, 77, 97, 133);
134  switch (pParams->m_dwStates & 0x03) {
135    case FWL_CMBPARTSTATE_Normal: {
136    }
137    case FWL_CMBPARTSTATE_Hovered: {
138    }
139    case FWL_CMBPARTSTATE_Pressed: {
140      argbFill = 0xFF000000;
141      break;
142    }
143    case FWL_CMBPARTSTATE_Disabled: {
144      argbFill = 0xFFF0F0F0;
145      break;
146    }
147  }
148  DrawArrow(pParams->m_pGraphics, &pParams->m_rtPart, FWLTHEME_DIRECTION_Down,
149            argbFill, bPressed, &pParams->m_matrix);
150}
151#endif
152