xref: /aosp_15_r20/external/pdfium/fpdfsdk/pwl/cpwl_cblistbox.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1 // Copyright 2020 The PDFium Authors
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 "fpdfsdk/pwl/cpwl_cblistbox.h"
8 
9 #include <utility>
10 
11 #include "fpdfsdk/pwl/cpwl_combo_box.h"
12 #include "fpdfsdk/pwl/cpwl_list_ctrl.h"
13 #include "public/fpdf_fwlevent.h"
14 #include "third_party/base/notreached.h"
15 
CPWL_CBListBox(const CreateParams & cp,std::unique_ptr<IPWL_FillerNotify::PerWindowData> pAttachedData)16 CPWL_CBListBox::CPWL_CBListBox(
17     const CreateParams& cp,
18     std::unique_ptr<IPWL_FillerNotify::PerWindowData> pAttachedData)
19     : CPWL_ListBox(cp, std::move(pAttachedData)) {}
20 
21 CPWL_CBListBox::~CPWL_CBListBox() = default;
22 
OnLButtonUp(Mask<FWL_EVENTFLAG> nFlag,const CFX_PointF & point)23 bool CPWL_CBListBox::OnLButtonUp(Mask<FWL_EVENTFLAG> nFlag,
24                                  const CFX_PointF& point) {
25   CPWL_Wnd::OnLButtonUp(nFlag, point);
26 
27   if (!m_bMouseDown)
28     return true;
29 
30   ReleaseCapture();
31   m_bMouseDown = false;
32 
33   if (!ClientHitTest(point))
34     return true;
35   if (CPWL_Wnd* pParent = GetParentWindow())
36     pParent->NotifyLButtonUp(this, point);
37 
38   return !OnNotifySelectionChanged(false, nFlag);
39 }
40 
IsMovementKey(FWL_VKEYCODE nKeyCode) const41 bool CPWL_CBListBox::IsMovementKey(FWL_VKEYCODE nKeyCode) const {
42   switch (nKeyCode) {
43     case FWL_VKEY_Up:
44     case FWL_VKEY_Down:
45     case FWL_VKEY_Home:
46     case FWL_VKEY_Left:
47     case FWL_VKEY_End:
48     case FWL_VKEY_Right:
49       return true;
50     default:
51       return false;
52   }
53 }
54 
OnMovementKeyDown(FWL_VKEYCODE nKeyCode,Mask<FWL_EVENTFLAG> nFlag)55 bool CPWL_CBListBox::OnMovementKeyDown(FWL_VKEYCODE nKeyCode,
56                                        Mask<FWL_EVENTFLAG> nFlag) {
57   switch (nKeyCode) {
58     case FWL_VKEY_Up:
59       m_pListCtrl->OnVK_UP(IsSHIFTKeyDown(nFlag), IsCTRLKeyDown(nFlag));
60       break;
61     case FWL_VKEY_Down:
62       m_pListCtrl->OnVK_DOWN(IsSHIFTKeyDown(nFlag), IsCTRLKeyDown(nFlag));
63       break;
64     case FWL_VKEY_Home:
65       m_pListCtrl->OnVK_HOME(IsSHIFTKeyDown(nFlag), IsCTRLKeyDown(nFlag));
66       break;
67     case FWL_VKEY_Left:
68       m_pListCtrl->OnVK_LEFT(IsSHIFTKeyDown(nFlag), IsCTRLKeyDown(nFlag));
69       break;
70     case FWL_VKEY_End:
71       m_pListCtrl->OnVK_END(IsSHIFTKeyDown(nFlag), IsCTRLKeyDown(nFlag));
72       break;
73     case FWL_VKEY_Right:
74       m_pListCtrl->OnVK_RIGHT(IsSHIFTKeyDown(nFlag), IsCTRLKeyDown(nFlag));
75       break;
76     default:
77       NOTREACHED_NORETURN();
78   }
79   return OnNotifySelectionChanged(true, nFlag);
80 }
81 
IsChar(uint16_t nChar,Mask<FWL_EVENTFLAG> nFlag) const82 bool CPWL_CBListBox::IsChar(uint16_t nChar, Mask<FWL_EVENTFLAG> nFlag) const {
83   return m_pListCtrl->OnChar(nChar, IsSHIFTKeyDown(nFlag),
84                              IsCTRLKeyDown(nFlag));
85 }
86 
OnCharNotify(uint16_t nChar,Mask<FWL_EVENTFLAG> nFlag)87 bool CPWL_CBListBox::OnCharNotify(uint16_t nChar, Mask<FWL_EVENTFLAG> nFlag) {
88   if (auto* pComboBox = static_cast<CPWL_ComboBox*>(GetParentWindow()))
89     pComboBox->SetSelectText();
90 
91   return OnNotifySelectionChanged(true, nFlag);
92 }
93