14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#ifndef XFA_FWL_CFWL_LISTBOX_H_
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define XFA_FWL_CFWL_LISTBOX_H_
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_edit.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_event.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_listbox.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_listitem.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_widget.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_widgetproperties.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FWL_STYLEEXT_LTB_MultiSelection (1L << 0)
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FWL_STYLEEXT_LTB_LeftAlign (0L << 4)
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FWL_STYLEEXT_LTB_CenterAlign (1L << 4)
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FWL_STYLEEXT_LTB_RightAlign (2L << 4)
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FWL_STYLEEXT_LTB_AlignMask (3L << 4)
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FWL_STYLEEXT_LTB_ShowScrollBarFocus (1L << 10)
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FWL_ITEMSTATE_LTB_Selected (1L << 0)
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FWL_ITEMSTATE_LTB_Focused (1L << 1)
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFWL_MessageKillFocus;
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFWL_MessageMouse;
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFWL_MessageMouseWheel;
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFX_DIBitmap;
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannclass CFWL_ListBox : public CFWL_Widget {
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann public:
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  explicit CFWL_ListBox(const CFWL_App* pApp,
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        std::unique_ptr<CFWL_WidgetProperties> properties,
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        CFWL_Widget* pOuter);
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ~CFWL_ListBox() override;
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  // CFWL_Widget
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FWL_Type GetClassID() const override;
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void Update() override;
4433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  FWL_WidgetHit HitTest(const CFX_PointF& point) override;
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void DrawWidget(CXFA_Graphics* pGraphics, const CFX_Matrix& matrix) override;
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) override;
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void OnProcessMessage(CFWL_Message* pMessage) override;
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void OnProcessEvent(CFWL_Event* pEvent) override;
49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void OnDrawWidget(CXFA_Graphics* pGraphics,
50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                    const CFX_Matrix& matrix) override;
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t CountItems(const CFWL_Widget* pWidget) const;
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ListItem* GetItem(const CFWL_Widget* pWidget, int32_t nIndex) const;
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t GetItemIndex(CFWL_Widget* pWidget, CFWL_ListItem* pItem);
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFWL_ListItem* AddString(const WideStringView& wsAdd);
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void RemoveAt(int32_t iIndex);
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void DeleteString(CFWL_ListItem* pItem);
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void DeleteAll();
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t CountSelItems();
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ListItem* GetSelItem(int32_t nIndexSel);
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t GetSelIndex(int32_t nIndex);
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetSelItem(CFWL_ListItem* hItem, bool bSelect);
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float GetItemHeight() const { return m_fItemHeight; }
67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float CalcItemHeight();
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann protected:
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ListItem* GetListItem(CFWL_ListItem* hItem, uint32_t dwKeyCode);
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetSelection(CFWL_ListItem* hStart, CFWL_ListItem* hEnd, bool bSelected);
7233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  CFWL_ListItem* GetItemAtPoint(const CFX_PointF& point);
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool ScrollToVisible(CFWL_ListItem* hItem);
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void InitVerticalScrollBar();
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void InitHorizontalScrollBar();
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsShowScrollBar(bool bVert);
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ScrollBar* GetVertScrollBar() const { return m_pVertScrollBar.get(); }
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  const CFX_RectF& GetRTClient() const { return m_rtClient; }
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann private:
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetSelectionDirect(CFWL_ListItem* hItem, bool bSelect);
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsMultiSelection() const;
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool IsItemSelected(CFWL_ListItem* hItem);
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void ClearSelection();
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SelectAll();
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ListItem* GetFocusedItem();
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void SetFocusItem(CFWL_ListItem* hItem);
88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void DrawBkground(CXFA_Graphics* pGraphics,
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    IFWL_ThemeProvider* pTheme,
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                    const CFX_Matrix* pMatrix);
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void DrawItems(CXFA_Graphics* pGraphics,
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 IFWL_ThemeProvider* pTheme,
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                 const CFX_Matrix* pMatrix);
94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void DrawItem(CXFA_Graphics* pGraphics,
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                IFWL_ThemeProvider* pTheme,
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                CFWL_ListItem* hItem,
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                int32_t Index,
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                const CFX_RectF& rtItem,
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                const CFX_Matrix* pMatrix);
100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  void DrawStatic(CXFA_Graphics* pGraphics, IFWL_ThemeProvider* pTheme);
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_SizeF CalcSize(bool bAutoSize);
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void UpdateItemSize(CFWL_ListItem* hItem,
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      CFX_SizeF& size,
104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                      float fWidth,
105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                      float fHeight,
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      bool bAutoSize) const;
107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float GetMaxTextWidth();
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float GetScrollWidth();
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void OnFocusChanged(CFWL_Message* pMsg, bool bSet);
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void OnLButtonDown(CFWL_MessageMouse* pMsg);
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void OnLButtonUp(CFWL_MessageMouse* pMsg);
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void OnMouseWheel(CFWL_MessageMouseWheel* pMsg);
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void OnKeyDown(CFWL_MessageKey* pMsg);
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  void OnVK(CFWL_ListItem* hItem, bool bShift, bool bCtrl);
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool OnScroll(CFWL_ScrollBar* pScrollBar,
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                CFWL_EventScroll::Code dwCode,
118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                float fPos);
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF m_rtClient;
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF m_rtStatic;
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF m_rtConent;
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CFWL_ScrollBar> m_pHorzScrollBar;
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::unique_ptr<CFWL_ScrollBar> m_pVertScrollBar;
125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FDE_TextStyle m_dwTTOStyles;
126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  FDE_TextAlignment m_iTTOAligns;
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ListItem* m_hAnchor;
128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float m_fItemHeight;
129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float m_fScorllBarWidth;
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool m_bLButtonDown;
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IFWL_ThemeProvider* m_pScrollBarTP;
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  std::vector<std::unique_ptr<CFWL_ListItem>> m_ItemArray;
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#endif  // XFA_FWL_CFWL_LISTBOX_H_
136