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 #ifndef FPDFSDK_PDFWINDOW_PWL_COMBOBOX_H_
8 #define FPDFSDK_PDFWINDOW_PWL_COMBOBOX_H_
9 
10 #include "fpdfsdk/pdfwindow/PWL_Edit.h"
11 #include "fpdfsdk/pdfwindow/PWL_ListBox.h"
12 #include "fpdfsdk/pdfwindow/PWL_Wnd.h"
13 
14 class CPWL_CBEdit : public CPWL_Edit {
15  public:
CPWL_CBEdit()16   CPWL_CBEdit() {}
~CPWL_CBEdit()17   ~CPWL_CBEdit() override {}
18 };
19 
20 class CPWL_CBListBox : public CPWL_ListBox {
21  public:
CPWL_CBListBox()22   CPWL_CBListBox() {}
~CPWL_CBListBox()23   ~CPWL_CBListBox() override {}
24 
25   // CPWL_ListBox
26   FX_BOOL OnLButtonUp(const CFX_FloatPoint& point, uint32_t nFlag) override;
27 
28   FX_BOOL OnKeyDownWithExit(uint16_t nChar, FX_BOOL& bExit, uint32_t nFlag);
29   FX_BOOL OnCharWithExit(uint16_t nChar, FX_BOOL& bExit, uint32_t nFlag);
30 };
31 
32 #define PWL_COMBOBOX_BUTTON_WIDTH 13
33 
34 class CPWL_CBButton : public CPWL_Wnd {
35  public:
CPWL_CBButton()36   CPWL_CBButton() {}
~CPWL_CBButton()37   ~CPWL_CBButton() override {}
38 
39   // CPWL_Wnd
40   void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override;
41   void DrawThisAppearance(CFX_RenderDevice* pDevice,
42                           CFX_Matrix* pUser2Device) override;
43   FX_BOOL OnLButtonDown(const CFX_FloatPoint& point, uint32_t nFlag) override;
44   FX_BOOL OnLButtonUp(const CFX_FloatPoint& point, uint32_t nFlag) override;
45 };
46 
47 class CPWL_ComboBox : public CPWL_Wnd {
48  public:
49   CPWL_ComboBox();
~CPWL_ComboBox()50   ~CPWL_ComboBox() override {}
51 
GetEdit()52   CPWL_Edit* GetEdit() const { return m_pEdit; }
53 
54   // CPWL_Wnd:
55   CFX_ByteString GetClassName() const override;
56   void OnCreate(PWL_CREATEPARAM& cp) override;
57   FX_BOOL OnKeyDown(uint16_t nChar, uint32_t nFlag) override;
58   FX_BOOL OnChar(uint16_t nChar, uint32_t nFlag) override;
59   void OnNotify(CPWL_Wnd* pWnd,
60                 uint32_t msg,
61                 intptr_t wParam = 0,
62                 intptr_t lParam = 0) override;
63   void CreateChildWnd(const PWL_CREATEPARAM& cp) override;
64   void RePosChildWnd() override;
65   CFX_FloatRect GetFocusRect() const override;
66   void SetFocus() override;
67   void KillFocus() override;
68 
69   void SetFillerNotify(IPWL_Filler_Notify* pNotify);
70 
71   CFX_WideString GetText() const;
72   void SetText(const FX_WCHAR* text);
73 
74   void AddString(const FX_WCHAR* str);
75   int32_t GetSelect() const;
76   void SetSelect(int32_t nItemIndex);
77 
78   void SetEditSel(int32_t nStartChar, int32_t nEndChar);
79   void GetEditSel(int32_t& nStartChar, int32_t& nEndChar) const;
80   void Clear();
81   void SelectAll();
82   FX_BOOL IsPopup() const;
83 
84   void SetSelectText();
85 
AttachFFLData(void * pData)86   void AttachFFLData(void* pData) { m_pFormFiller = pData; }
87 
88  private:
89   void CreateEdit(const PWL_CREATEPARAM& cp);
90   void CreateButton(const PWL_CREATEPARAM& cp);
91   void CreateListBox(const PWL_CREATEPARAM& cp);
92   void SetPopup(FX_BOOL bPopup);
93 
94   CPWL_CBEdit* m_pEdit;
95   CPWL_CBButton* m_pButton;
96   CPWL_CBListBox* m_pList;
97   FX_BOOL m_bPopup;
98   CFX_FloatRect m_rcOldWindow;
99   int32_t m_nPopupWhere;
100   int32_t m_nSelectItem;
101   IPWL_Filler_Notify* m_pFillerNotify;
102 
103   void* m_pFormFiller;
104 };
105 
106 #endif  // FPDFSDK_PDFWINDOW_PWL_COMBOBOX_H_
107