| // 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_path.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 (!FXSYS_IsFloatBigger(window.right - window.left, | |
| kComboBoxTriangleLength) || | |
| !FXSYS_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_Path path; | |
| path.AppendPoint(pt1, CFX_Path::Point::Type::kMove); | |
| path.AppendPoint(pt2, CFX_Path::Point::Type::kLine); | |
| path.AppendPoint(pt3, CFX_Path::Point::Type::kLine); | |
| path.AppendPoint(pt1, CFX_Path::Point::Type::kLine); | |
| pDevice->DrawPath(&path, &mtUser2Device, nullptr, | |
| kDefaultBlackColor.ToFXColor(GetTransparency()), 0, | |
| CFX_FillRenderOptions::EvenOddOptions()); | |
| } | |
| bool CPWL_CBButton::OnLButtonDown(Mask<FWL_EVENTFLAG> 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(Mask<FWL_EVENTFLAG> nFlag, | |
| const CFX_PointF& point) { | |
| CPWL_Wnd::OnLButtonUp(nFlag, point); | |
| ReleaseCapture(); | |
| return true; | |
| } |