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 _FWL_LISTBOX_IMP_H 8 #define _FWL_LISTBOX_IMP_H 9 10 #include <memory> 11 12 class CFWL_WidgetImp; 13 class CFWL_WidgetImpProperties; 14 class CFWL_WidgetImpDelegate; 15 class CFWL_ScrollBarImp; 16 class IFWL_Widget; 17 class CFWL_ListBoxImp; 18 class CFWL_ListBoxImpDelegate; 19 class CFWL_ListBoxImp : public CFWL_WidgetImp { 20 public: 21 CFWL_ListBoxImp(const CFWL_WidgetImpProperties& properties, 22 IFWL_Widget* pOuter); 23 ~CFWL_ListBoxImp(); 24 virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const; 25 virtual FX_DWORD GetClassID() const; 26 virtual FWL_ERR Initialize(); 27 virtual FWL_ERR Finalize(); 28 virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE); 29 virtual FWL_ERR Update(); 30 virtual FX_DWORD HitTest(FX_FLOAT fx, FX_FLOAT fy); 31 virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics, 32 const CFX_Matrix* pMatrix = NULL); 33 virtual FWL_ERR SetThemeProvider(IFWL_ThemeProvider* pThemeProvider); 34 virtual int32_t CountSelItems(); 35 virtual FWL_HLISTITEM GetSelItem(int32_t nIndexSel); 36 virtual int32_t GetSelIndex(int32_t nIndex); 37 virtual FWL_ERR SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect = TRUE); 38 virtual FWL_ERR GetItemText(FWL_HLISTITEM hItem, CFX_WideString& wsText); 39 virtual FWL_ERR GetScrollPos(FX_FLOAT& fPos, FX_BOOL bVert = TRUE); 40 virtual FWL_ERR* Sort(IFWL_ListBoxCompare* pCom); 41 42 protected: 43 FWL_HLISTITEM GetItem(FWL_HLISTITEM hItem, FX_DWORD dwKeyCode); 44 void SetSelection(FWL_HLISTITEM hStart, 45 FWL_HLISTITEM hEnd, 46 FX_BOOL bSelected); 47 void SetSelectionDirect(FWL_HLISTITEM hItem, FX_BOOL bSelect); 48 FX_BOOL IsItemSelected(FWL_HLISTITEM hItem); 49 void ClearSelection(); 50 void SelectAll(); 51 FWL_HLISTITEM GetFocusedItem(); 52 void SetFocusItem(FWL_HLISTITEM hItem); 53 FWL_HLISTITEM GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy); 54 FX_BOOL GetItemCheckRect(FWL_HLISTITEM hItem, CFX_RectF& rtCheck); 55 FX_BOOL SetItemChecked(FWL_HLISTITEM hItem, FX_BOOL bChecked); 56 FX_BOOL GetItemChecked(FWL_HLISTITEM hItem); 57 FX_BOOL ScrollToVisible(FWL_HLISTITEM hItem); 58 void DrawBkground(CFX_Graphics* pGraphics, 59 IFWL_ThemeProvider* pTheme, 60 const CFX_Matrix* pMatrix = NULL); 61 void DrawItems(CFX_Graphics* pGraphics, 62 IFWL_ThemeProvider* pTheme, 63 const CFX_Matrix* pMatrix = NULL); 64 void DrawItem(CFX_Graphics* pGraphics, 65 IFWL_ThemeProvider* pTheme, 66 FWL_HLISTITEM hItem, 67 int32_t Index, 68 const CFX_RectF& rtItem, 69 const CFX_Matrix* pMatrix = NULL); 70 void DrawStatic(CFX_Graphics* pGraphics, IFWL_ThemeProvider* pTheme); 71 CFX_SizeF CalcSize(FX_BOOL bAutoSize = FALSE); 72 void GetItemSize(CFX_SizeF& size, 73 FWL_HLISTITEM hItem, 74 FX_FLOAT fWidth, 75 FX_FLOAT fHeight, 76 FX_BOOL bAutoSize = FALSE); 77 FX_FLOAT GetMaxTextWidth(); 78 FX_FLOAT GetScrollWidth(); 79 FX_FLOAT GetItemHeigt(); 80 void InitScrollBar(FX_BOOL bVert = TRUE); 81 void SortItem(); 82 FX_BOOL IsShowScrollBar(FX_BOOL bVert); 83 void ProcessSelChanged(); 84 85 protected: 86 CFX_RectF m_rtClient; 87 CFX_RectF m_rtStatic; 88 CFX_RectF m_rtConent; 89 std::unique_ptr<IFWL_ScrollBar> m_pHorzScrollBar; 90 std::unique_ptr<IFWL_ScrollBar> m_pVertScrollBar; 91 FX_DWORD m_dwTTOStyles; 92 int32_t m_iTTOAligns; 93 FWL_HLISTITEM m_hAnchor; 94 FX_FLOAT m_fItemHeight; 95 FX_FLOAT m_fScorllBarWidth; 96 FX_BOOL m_bLButtonDown; 97 IFWL_ThemeProvider* m_pScrollBarTP; 98 friend class CFWL_ListBoxImpDelegate; 99 }; 100 class CFWL_ListBoxImpDelegate : public CFWL_WidgetImpDelegate { 101 public: 102 CFWL_ListBoxImpDelegate(CFWL_ListBoxImp* pOwner); 103 int32_t OnProcessMessage(CFWL_Message* pMessage) override; 104 FWL_ERR OnProcessEvent(CFWL_Event* pEvent) override; 105 FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics, 106 const CFX_Matrix* pMatrix = NULL) override; 107 108 protected: 109 void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE); 110 void OnLButtonDown(CFWL_MsgMouse* pMsg); 111 void OnLButtonUp(CFWL_MsgMouse* pMsg); 112 void OnMouseWheel(CFWL_MsgMouseWheel* pMsg); 113 void OnKeyDown(CFWL_MsgKey* pMsg); 114 void OnVK(FWL_HLISTITEM hItem, FX_BOOL bShift, FX_BOOL bCtrl); 115 FX_BOOL OnScroll(IFWL_ScrollBar* pScrollBar, FX_DWORD dwCode, FX_FLOAT fPos); 116 void DispatchSelChangedEv(); 117 CFWL_ListBoxImp* m_pOwner; 118 }; 119 #endif 120