| // Copyright 2020 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 "fpdfsdk/pwl/cpwl_cbbutton.h" |
| |
| #include <utility> |
| |
| #include "core/fxge/cfx_fillrenderoptions.h" |
| #include "core/fxge/cfx_pathdata.h" |
| #include "core/fxge/cfx_renderdevice.h" |
| |
| CPWL_CBButton::CPWL_CBButton( |
| const CreateParams& cp, |
| std::unique_ptr<IPWL_SystemHandler::PerWindowData> pAttachedData) |
| : CPWL_Wnd(cp, std::move(pAttachedData)) {} |
| |
| CPWL_CBButton::~CPWL_CBButton() = default; |
| |
| void CPWL_CBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, |
| const CFX_Matrix& mtUser2Device) { |
| CPWL_Wnd::DrawThisAppearance(pDevice, mtUser2Device); |
| |
| if (!IsVisible()) |
| return; |
| |
| CFX_FloatRect window = CPWL_Wnd::GetWindowRect(); |
| if (window.IsEmpty()) |
| return; |
| |
| constexpr float kComboBoxTriangleLength = 6.0f; |
| constexpr float kComboBoxTriangleHalfLength = kComboBoxTriangleLength / 2; |
| constexpr float kComboBoxTriangleQuarterLength = kComboBoxTriangleLength / 4; |
| if (!IsFloatBigger(window.right - window.left, kComboBoxTriangleLength) || |
| !IsFloatBigger(window.top - window.bottom, kComboBoxTriangleHalfLength)) { |
| return; |
| } |
| |
| CFX_PointF ptCenter = GetCenterPoint(); |
| CFX_PointF pt1(ptCenter.x - kComboBoxTriangleHalfLength, |
| ptCenter.y + kComboBoxTriangleQuarterLength); |
| CFX_PointF pt2(ptCenter.x + kComboBoxTriangleHalfLength, |
| ptCenter.y + kComboBoxTriangleQuarterLength); |
| CFX_PointF pt3(ptCenter.x, ptCenter.y - kComboBoxTriangleQuarterLength); |
| |
| CFX_PathData path; |
| path.AppendPoint(pt1, FXPT_TYPE::MoveTo); |
| path.AppendPoint(pt2, FXPT_TYPE::LineTo); |
| path.AppendPoint(pt3, FXPT_TYPE::LineTo); |
| path.AppendPoint(pt1, FXPT_TYPE::LineTo); |
| |
| pDevice->DrawPath(&path, &mtUser2Device, nullptr, |
| PWL_DEFAULT_BLACKCOLOR.ToFXColor(GetTransparency()), 0, |
| CFX_FillRenderOptions::EvenOddOptions()); |
| } |
| |
| bool CPWL_CBButton::OnLButtonDown(uint32_t nFlag, const CFX_PointF& point) { |
| CPWL_Wnd::OnLButtonDown(nFlag, point); |
| |
| SetCapture(); |
| CPWL_Wnd* pParent = GetParentWindow(); |
| if (pParent) |
| pParent->NotifyLButtonDown(this, point); |
| |
| return true; |
| } |
| |
| bool CPWL_CBButton::OnLButtonUp(uint32_t nFlag, const CFX_PointF& point) { |
| CPWL_Wnd::OnLButtonUp(nFlag, point); |
| |
| ReleaseCapture(); |
| return true; |
| } |