| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fwl/theme/cfwl_checkboxtp.h" | 7 #include "xfa/fwl/theme/cfwl_checkboxtp.h" |
| 8 | 8 |
| 9 #include "core/fxge/cfx_pathdata.h" | 9 #include "core/fxge/cfx_pathdata.h" |
| 10 #include "xfa/fde/tto/fde_textout.h" | 10 #include "xfa/fde/tto/fde_textout.h" |
| 11 #include "xfa/fwl/basewidget/ifwl_checkbox.h" | 11 #include "xfa/fwl/basewidget/ifwl_checkbox.h" |
| 12 #include "xfa/fwl/core/cfwl_themebackground.h" | 12 #include "xfa/fwl/core/cfwl_themebackground.h" |
| 13 #include "xfa/fwl/core/cfwl_themetext.h" | 13 #include "xfa/fwl/core/cfwl_themetext.h" |
| 14 #include "xfa/fwl/core/ifwl_widget.h" | 14 #include "xfa/fwl/core/ifwl_widget.h" |
| 15 #include "xfa/fxgraphics/cfx_color.h" | 15 #include "xfa/fxgraphics/cfx_color.h" |
| 16 #include "xfa/fxgraphics/cfx_path.h" | 16 #include "xfa/fxgraphics/cfx_path.h" |
| 17 | 17 |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 const int kSignMargin = 3; | |
| 21 const int kSignBorder = 2; | |
| 22 const int kSignPath = 100; | 20 const int kSignPath = 100; |
| 23 | 21 |
| 24 } // namespace | 22 } // namespace |
| 25 | 23 |
| 26 #define CHECKBOX_COLOR_BOXLT1 (ArgbEncode(255, 172, 168, 153)) | 24 #define CHECKBOX_COLOR_BOXLT1 (ArgbEncode(255, 172, 168, 153)) |
| 27 #define CHECKBOX_COLOR_BOXLT2 (ArgbEncode(255, 113, 111, 100)) | 25 #define CHECKBOX_COLOR_BOXLT2 (ArgbEncode(255, 113, 111, 100)) |
| 28 #define CHECKBOX_COLOR_BOXRB1 (ArgbEncode(255, 241, 239, 226)) | 26 #define CHECKBOX_COLOR_BOXRB1 (ArgbEncode(255, 241, 239, 226)) |
| 29 #define CHECKBOX_COLOR_BOXRB2 (ArgbEncode(255, 255, 255, 255)) | 27 #define CHECKBOX_COLOR_BOXRB2 (ArgbEncode(255, 255, 255, 255)) |
| 30 | 28 |
| 31 CFWL_CheckBoxTP::CFWL_CheckBoxTP() : m_pThemeData(new CKBThemeData) { | 29 CFWL_CheckBoxTP::CFWL_CheckBoxTP() : m_pThemeData(new CKBThemeData) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 49 | 47 |
| 50 FX_BOOL CFWL_CheckBoxTP::DrawText(CFWL_ThemeText* pParams) { | 48 FX_BOOL CFWL_CheckBoxTP::DrawText(CFWL_ThemeText* pParams) { |
| 51 if (!m_pTextOut) | 49 if (!m_pTextOut) |
| 52 return FALSE; | 50 return FALSE; |
| 53 m_pTextOut->SetTextColor(pParams->m_dwStates & CFWL_PartState_Disabled | 51 m_pTextOut->SetTextColor(pParams->m_dwStates & CFWL_PartState_Disabled |
| 54 ? FWLTHEME_CAPACITY_TextDisColor | 52 ? FWLTHEME_CAPACITY_TextDisColor |
| 55 : FWLTHEME_CAPACITY_TextColor); | 53 : FWLTHEME_CAPACITY_TextColor); |
| 56 return CFWL_WidgetTP::DrawText(pParams); | 54 return CFWL_WidgetTP::DrawText(pParams); |
| 57 } | 55 } |
| 58 | 56 |
| 59 FX_BOOL CFWL_CheckBoxTP::DrawBackground(CFWL_ThemeBackground* pParams) { | |
| 60 if (!pParams) | |
| 61 return FALSE; | |
| 62 switch (pParams->m_iPart) { | |
| 63 case CFWL_Part::Border: { | |
| 64 DrawBorder(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); | |
| 65 break; | |
| 66 } | |
| 67 case CFWL_Part::Edge: { | |
| 68 DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(), | |
| 69 &pParams->m_rtPart, &pParams->m_matrix); | |
| 70 break; | |
| 71 } | |
| 72 case CFWL_Part::Background: { | |
| 73 FillBackground(pParams->m_pGraphics, &pParams->m_rtPart, | |
| 74 &pParams->m_matrix); | |
| 75 if (pParams->m_dwStates & CFWL_PartState_Focused) { | |
| 76 pParams->m_rtPart = *(CFX_RectF*)pParams->m_pData; | |
| 77 DrawFocus(pParams->m_pGraphics, &pParams->m_rtPart, &pParams->m_matrix); | |
| 78 } | |
| 79 break; | |
| 80 } | |
| 81 case CFWL_Part::CheckBox: { | |
| 82 DrawBoxBk(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart, | |
| 83 pParams->m_dwStates, &pParams->m_matrix); | |
| 84 if ((pParams->m_dwStates & CFWL_PartState_Checked) | | |
| 85 (pParams->m_dwStates & CFWL_PartState_Neutral)) { | |
| 86 DrawSign(pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart, | |
| 87 pParams->m_dwStates, &pParams->m_matrix); | |
| 88 } | |
| 89 DrawSignBorder( | |
| 90 pParams->m_pWidget, pParams->m_pGraphics, &pParams->m_rtPart, | |
| 91 pParams->m_dwStates & CFWL_PartState_Disabled, &pParams->m_matrix); | |
| 92 break; | |
| 93 } | |
| 94 default: { return FALSE; } | |
| 95 } | |
| 96 return TRUE; | |
| 97 } | |
| 98 | |
| 99 FWL_Error CFWL_CheckBoxTP::Initialize() { | 57 FWL_Error CFWL_CheckBoxTP::Initialize() { |
| 100 InitTTO(); | 58 InitTTO(); |
| 101 return CFWL_WidgetTP::Initialize(); | 59 return CFWL_WidgetTP::Initialize(); |
| 102 } | 60 } |
| 103 | 61 |
| 104 FWL_Error CFWL_CheckBoxTP::Finalize() { | 62 FWL_Error CFWL_CheckBoxTP::Finalize() { |
| 105 FinalizeTTO(); | 63 FinalizeTTO(); |
| 106 return CFWL_WidgetTP::Finalize(); | 64 return CFWL_WidgetTP::Finalize(); |
| 107 } | 65 } |
| 108 | 66 |
| 109 void CFWL_CheckBoxTP::DrawBoxBk(IFWL_Widget* pWidget, | |
| 110 CFX_Graphics* pGraphics, | |
| 111 const CFX_RectF* pRect, | |
| 112 uint32_t dwStates, | |
| 113 CFX_Matrix* pMatrix) { | |
| 114 dwStates &= 0x03; | |
| 115 int32_t fillMode = FXFILL_WINDING; | |
| 116 uint32_t dwStyleEx = pWidget->GetStylesEx(); | |
| 117 dwStyleEx &= FWL_STYLEEXT_CKB_ShapeMask; | |
| 118 CFX_Path path; | |
| 119 path.Create(); | |
| 120 FX_FLOAT fRight = pRect->right(); | |
| 121 FX_FLOAT fBottom = pRect->bottom(); | |
| 122 bool bClipSign = !!(dwStates & CFWL_PartState_Hovered); | |
| 123 if ((dwStyleEx == FWL_STYLEEXT_CKB_ShapeSolidSquare) || | |
| 124 (dwStyleEx == FWL_STYLEEXT_CKB_ShapeSunkenSquare)) { | |
| 125 path.AddRectangle(pRect->left, pRect->top, pRect->width, pRect->height); | |
| 126 if (bClipSign) { | |
| 127 fillMode = FXFILL_ALTERNATE; | |
| 128 path.AddRectangle(pRect->left + kSignMargin, pRect->top + kSignMargin, | |
| 129 pRect->width - kSignMargin * 2, | |
| 130 pRect->height - kSignMargin * 2); | |
| 131 } | |
| 132 } else { | |
| 133 CFX_RectF rect(*pRect); | |
| 134 rect.Deflate(0, 0, 1, 1); | |
| 135 path.AddEllipse(rect); | |
| 136 if (bClipSign) { | |
| 137 fillMode = FXFILL_ALTERNATE; | |
| 138 CFX_RectF rtClip(rect); | |
| 139 rtClip.Deflate(kSignMargin - 1, kSignMargin - 1); | |
| 140 path.AddEllipse(rtClip); | |
| 141 } | |
| 142 } | |
| 143 int32_t iTheme = 1; | |
| 144 if (dwStates & CFWL_PartState_Hovered) { | |
| 145 iTheme = 2; | |
| 146 } else if (dwStates & CFWL_PartState_Pressed) { | |
| 147 iTheme = 3; | |
| 148 } else if (dwStates & CFWL_PartState_Disabled) { | |
| 149 iTheme = 4; | |
| 150 } | |
| 151 if (dwStates & CFWL_PartState_Checked) { | |
| 152 iTheme += 4; | |
| 153 } else if (dwStates & CFWL_PartState_Neutral) { | |
| 154 iTheme += 8; | |
| 155 } | |
| 156 DrawAxialShading(pGraphics, pRect->left - 1, pRect->top - 1, fRight, fBottom, | |
| 157 m_pThemeData->clrBoxBk[iTheme][0], | |
| 158 m_pThemeData->clrBoxBk[iTheme][1], &path, fillMode, pMatrix); | |
| 159 } | |
| 160 | |
| 161 void CFWL_CheckBoxTP::DrawSign(IFWL_Widget* pWidget, | |
| 162 CFX_Graphics* pGraphics, | |
| 163 const CFX_RectF* pRtBox, | |
| 164 uint32_t dwStates, | |
| 165 CFX_Matrix* pMatrix) { | |
| 166 CFX_RectF rtSign(*pRtBox); | |
| 167 rtSign.Deflate(kSignMargin, kSignMargin); | |
| 168 uint32_t dwColor = m_pThemeData->clrSignCheck; | |
| 169 bool bCheck = true; | |
| 170 if ((dwStates & CFWL_PartState_Disabled) && | |
| 171 (dwStates & CFWL_PartState_Checked)) { | |
| 172 dwColor = m_pThemeData->clrSignBorderDisable; | |
| 173 } else if (dwStates & CFWL_PartState_Neutral) { | |
| 174 if (dwStates & CFWL_PartState_Hovered) { | |
| 175 dwColor = m_pThemeData->clrSignNeutralHover; | |
| 176 } else if (dwStates & CFWL_PartState_Pressed) { | |
| 177 dwColor = m_pThemeData->clrSignNeutralPressed; | |
| 178 } else if (dwStates & CFWL_PartState_Disabled) { | |
| 179 dwColor = m_pThemeData->clrSignBorderDisable; | |
| 180 } else { | |
| 181 dwColor = m_pThemeData->clrSignNeutralNormal; | |
| 182 } | |
| 183 bCheck = false; | |
| 184 } | |
| 185 if (bCheck) { | |
| 186 uint32_t dwStyle = pWidget->GetStylesEx(); | |
| 187 switch (dwStyle & FWL_STYLEEXT_CKB_SignShapeMask) { | |
| 188 case FWL_STYLEEXT_CKB_SignShapeCheck: { | |
| 189 DrawSignCheck(pGraphics, &rtSign, dwColor, pMatrix); | |
| 190 break; | |
| 191 } | |
| 192 case FWL_STYLEEXT_CKB_SignShapeCircle: { | |
| 193 rtSign.Deflate(1, 1); | |
| 194 DrawSignCircle(pGraphics, &rtSign, dwColor, pMatrix); | |
| 195 break; | |
| 196 } | |
| 197 case FWL_STYLEEXT_CKB_SignShapeCross: { | |
| 198 DrawSignCross(pGraphics, &rtSign, dwColor, pMatrix); | |
| 199 break; | |
| 200 } | |
| 201 case FWL_STYLEEXT_CKB_SignShapeDiamond: { | |
| 202 DrawSignDiamond(pGraphics, &rtSign, dwColor, pMatrix); | |
| 203 break; | |
| 204 } | |
| 205 case FWL_STYLEEXT_CKB_SignShapeSquare: { | |
| 206 DrawSignSquare(pGraphics, &rtSign, dwColor, pMatrix); | |
| 207 break; | |
| 208 } | |
| 209 case FWL_STYLEEXT_CKB_SignShapeStar: { | |
| 210 DrawSignStar(pGraphics, &rtSign, dwColor, pMatrix); | |
| 211 break; | |
| 212 } | |
| 213 } | |
| 214 } else { | |
| 215 FillSoildRect(pGraphics, ArgbEncode(255, 33, 161, 33), &rtSign, pMatrix); | |
| 216 } | |
| 217 } | |
| 218 | |
| 219 void CFWL_CheckBoxTP::DrawSignNeutral(CFX_Graphics* pGraphics, | |
| 220 const CFX_RectF* pRtSign, | |
| 221 CFX_Matrix* pMatrix) { | |
| 222 ((CFX_RectF*)pRtSign)->Inflate(-3, -3); | |
| 223 FillSoildRect(pGraphics, m_pThemeData->clrSignNeutral, pRtSign, pMatrix); | |
| 224 } | |
| 225 | |
| 226 void CFWL_CheckBoxTP::DrawSignCheck(CFX_Graphics* pGraphics, | 67 void CFWL_CheckBoxTP::DrawSignCheck(CFX_Graphics* pGraphics, |
| 227 const CFX_RectF* pRtSign, | 68 const CFX_RectF* pRtSign, |
| 228 FX_ARGB argbFill, | 69 FX_ARGB argbFill, |
| 229 CFX_Matrix* pMatrix) { | 70 CFX_Matrix* pMatrix) { |
| 230 if (!m_pCheckPath) | 71 if (!m_pCheckPath) |
| 231 InitCheckPath(pRtSign->width); | 72 InitCheckPath(pRtSign->width); |
| 232 | 73 |
| 233 CFX_Matrix mt; | 74 CFX_Matrix mt; |
| 234 mt.SetIdentity(); | 75 mt.SetIdentity(); |
| 235 mt.Translate(pRtSign->left, pRtSign->top); | 76 mt.Translate(pRtSign->left, pRtSign->top); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 } | 177 } |
| 337 path.LineTo(px[nNext], py[nNext]); | 178 path.LineTo(px[nNext], py[nNext]); |
| 338 } | 179 } |
| 339 CFX_Color crFill(argbFill); | 180 CFX_Color crFill(argbFill); |
| 340 pGraphics->SaveGraphState(); | 181 pGraphics->SaveGraphState(); |
| 341 pGraphics->SetFillColor(&crFill); | 182 pGraphics->SetFillColor(&crFill); |
| 342 pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); | 183 pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix); |
| 343 pGraphics->RestoreGraphState(); | 184 pGraphics->RestoreGraphState(); |
| 344 } | 185 } |
| 345 | 186 |
| 346 void CFWL_CheckBoxTP::DrawSignBorder(IFWL_Widget* pWidget, | |
| 347 CFX_Graphics* pGraphics, | |
| 348 const CFX_RectF* pRtBox, | |
| 349 FX_BOOL bDisable, | |
| 350 CFX_Matrix* pMatrix) { | |
| 351 switch (pWidget->GetStylesEx() & FWL_STYLEEXT_CKB_ShapeMask) { | |
| 352 case FWL_STYLEEXT_CKB_ShapeSolidSquare: { | |
| 353 DrawAnnulusRect(pGraphics, bDisable ? m_pThemeData->clrSignBorderDisable | |
| 354 : m_pThemeData->clrSignBorderNormal, | |
| 355 pRtBox, 1, pMatrix); | |
| 356 break; | |
| 357 } | |
| 358 case FWL_STYLEEXT_CKB_ShapeSunkenSquare: { | |
| 359 Draw3DRect(pGraphics, FWLTHEME_EDGE_Sunken, kSignBorder, pRtBox, | |
| 360 CHECKBOX_COLOR_BOXLT1, CHECKBOX_COLOR_BOXLT2, | |
| 361 CHECKBOX_COLOR_BOXRB1, CHECKBOX_COLOR_BOXRB2, pMatrix); | |
| 362 break; | |
| 363 } | |
| 364 case FWL_STYLEEXT_CKB_ShapeSolidCircle: { | |
| 365 DrawAnnulusCircle(pGraphics, bDisable ? m_pThemeData->clrSignBorderDisable | |
| 366 : m_pThemeData->clrSignBorderNormal, | |
| 367 pRtBox, 1, pMatrix); | |
| 368 break; | |
| 369 } | |
| 370 case FWL_STYLEEXT_CKB_ShapeSunkenCircle: { | |
| 371 Draw3DCircle(pGraphics, FWLTHEME_EDGE_Sunken, kSignBorder, pRtBox, | |
| 372 CHECKBOX_COLOR_BOXLT1, CHECKBOX_COLOR_BOXLT2, | |
| 373 CHECKBOX_COLOR_BOXRB1, CHECKBOX_COLOR_BOXRB2, pMatrix); | |
| 374 break; | |
| 375 } | |
| 376 } | |
| 377 } | |
| 378 | |
| 379 void CFWL_CheckBoxTP::SetThemeData(uint32_t dwID) { | 187 void CFWL_CheckBoxTP::SetThemeData(uint32_t dwID) { |
| 380 uint32_t* pData = (uint32_t*)&m_pThemeData->clrBoxBk; | 188 uint32_t* pData = (uint32_t*)&m_pThemeData->clrBoxBk; |
| 381 if (dwID) { | 189 if (dwID) { |
| 382 *pData++ = 0, *pData++ = 0, *pData++ = ArgbEncode(255, 220, 220, 215), | 190 *pData++ = 0, *pData++ = 0, *pData++ = ArgbEncode(255, 220, 220, 215), |
| 383 *pData++ = ArgbEncode(255, 255, 255, 255), | 191 *pData++ = ArgbEncode(255, 255, 255, 255), |
| 384 *pData++ = ArgbEncode(255, 255, 240, 207), | 192 *pData++ = ArgbEncode(255, 255, 240, 207), |
| 385 *pData++ = ArgbEncode(255, 248, 179, 48), | 193 *pData++ = ArgbEncode(255, 248, 179, 48), |
| 386 *pData++ = ArgbEncode(255, 176, 176, 167), | 194 *pData++ = ArgbEncode(255, 176, 176, 167), |
| 387 *pData++ = ArgbEncode(255, 241, 239, 239), | 195 *pData++ = ArgbEncode(255, 241, 239, 239), |
| 388 *pData++ = ArgbEncode(255, 255, 255, 255), | 196 *pData++ = ArgbEncode(255, 255, 255, 255), |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 pt1.x + px2 * FX_BEZIER, pt1.y + py2 * FX_BEZIER, | 314 pt1.x + px2 * FX_BEZIER, pt1.y + py2 * FX_BEZIER, |
| 507 pt1.x, pt1.y); | 315 pt1.x, pt1.y); |
| 508 FX_FLOAT fScale = fCheckLen / kSignPath; | 316 FX_FLOAT fScale = fCheckLen / kSignPath; |
| 509 CFX_Matrix mt; | 317 CFX_Matrix mt; |
| 510 mt.Set(1, 0, 0, 1, 0, 0); | 318 mt.Set(1, 0, 0, 1, 0, 0); |
| 511 mt.Scale(fScale, fScale); | 319 mt.Scale(fScale, fScale); |
| 512 CFX_PathData* pData = m_pCheckPath->GetPathData(); | 320 CFX_PathData* pData = m_pCheckPath->GetPathData(); |
| 513 pData->Transform(&mt); | 321 pData->Transform(&mt); |
| 514 } | 322 } |
| 515 } | 323 } |
| 324 |
| 325 FX_BOOL CFWL_CheckBoxTP::DrawBackground(CFWL_ThemeBackground* pParams) { |
| 326 if (pParams->m_iPart != CFWL_Part::CheckBox) { |
| 327 return FALSE; |
| 328 } |
| 329 if ((pParams->m_dwStates & CFWL_PartState_Checked) || |
| 330 (pParams->m_dwStates & CFWL_PartState_Neutral)) { |
| 331 DrawCheckSign(pParams->m_pWidget, pParams->m_pGraphics, pParams->m_rtPart, |
| 332 pParams->m_dwStates, &pParams->m_matrix); |
| 333 } |
| 334 return FALSE; |
| 335 } |
| 336 |
| 337 void CFWL_CheckBoxTP::DrawCheckSign(IFWL_Widget* pWidget, |
| 338 CFX_Graphics* pGraphics, |
| 339 const CFX_RectF& pRtBox, |
| 340 int32_t iState, |
| 341 CFX_Matrix* pMatrix) { |
| 342 CFX_RectF rtSign(pRtBox); |
| 343 uint32_t dwColor = iState & CFWL_PartState_Neutral ? 0xFFA9A9A9 : 0xFF000000; |
| 344 |
| 345 uint32_t dwStyle = pWidget->GetStylesEx(); |
| 346 rtSign.Deflate(rtSign.width / 4, rtSign.height / 4); |
| 347 switch (dwStyle & FWL_STYLEEXT_CKB_SignShapeMask) { |
| 348 case FWL_STYLEEXT_CKB_SignShapeCheck: |
| 349 DrawSignCheck(pGraphics, &rtSign, dwColor, pMatrix); |
| 350 break; |
| 351 case FWL_STYLEEXT_CKB_SignShapeCircle: |
| 352 DrawSignCircle(pGraphics, &rtSign, dwColor, pMatrix); |
| 353 break; |
| 354 case FWL_STYLEEXT_CKB_SignShapeCross: |
| 355 DrawSignCross(pGraphics, &rtSign, dwColor, pMatrix); |
| 356 break; |
| 357 case FWL_STYLEEXT_CKB_SignShapeDiamond: |
| 358 DrawSignDiamond(pGraphics, &rtSign, dwColor, pMatrix); |
| 359 break; |
| 360 case FWL_STYLEEXT_CKB_SignShapeSquare: |
| 361 DrawSignSquare(pGraphics, &rtSign, dwColor, pMatrix); |
| 362 break; |
| 363 case FWL_STYLEEXT_CKB_SignShapeStar: |
| 364 DrawSignStar(pGraphics, &rtSign, dwColor, pMatrix); |
| 365 break; |
| 366 default: |
| 367 break; |
| 368 } |
| 369 } |
| OLD | NEW |