Home | History | Annotate | Download | only in lightwidget
      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 #include <memory>
      8 
      9 #include "xfa/src/foxitlib.h"
     10 
     11 CFWL_ListBox* CFWL_ListBox::Create() {
     12   return new CFWL_ListBox;
     13 }
     14 FWL_ERR CFWL_ListBox::Initialize(const CFWL_WidgetProperties* pProperties) {
     15   if (m_pIface)
     16     return FWL_ERR_Indefinite;
     17   if (pProperties) {
     18     *m_pProperties = *pProperties;
     19   }
     20   std::unique_ptr<IFWL_ListBox> pListBox(IFWL_ListBox::Create(
     21       m_pProperties->MakeWidgetImpProperties(&m_ListBoxDP), nullptr));
     22   FWL_ERR ret = pListBox->Initialize();
     23   if (ret != FWL_ERR_Succeeded) {
     24     return ret;
     25   }
     26   m_pIface = pListBox.release();
     27   CFWL_Widget::Initialize();
     28   return FWL_ERR_Succeeded;
     29 }
     30 FWL_ERR CFWL_ListBox::AddDIBitmap(CFX_DIBitmap* pDIB, FWL_HLISTITEM hItem) {
     31   reinterpret_cast<CFWL_ListItem*>(hItem)->m_pDIB = pDIB;
     32   return FWL_ERR_Succeeded;
     33 }
     34 FWL_HLISTITEM CFWL_ListBox::AddString(const CFX_WideStringC& wsAdd,
     35                                       FX_BOOL bSelect) {
     36   CFWL_ListItem* pItem = new CFWL_ListItem;
     37   pItem->m_dwStates = 0;
     38   pItem->m_wsText = wsAdd;
     39   pItem->m_dwStates = bSelect ? FWL_ITEMSTATE_LTB_Selected : 0;
     40   m_ListBoxDP.m_arrItem.Add(pItem);
     41   return (FWL_HLISTITEM)pItem;
     42 }
     43 FX_BOOL CFWL_ListBox::DeleteString(FWL_HLISTITEM hItem) {
     44   int32_t nIndex = m_ListBoxDP.GetItemIndex(GetWidget(), hItem);
     45   if (nIndex < 0 || nIndex >= m_ListBoxDP.m_arrItem.GetSize()) {
     46     return FALSE;
     47   }
     48   CFWL_ListItem* pDelItem =
     49       reinterpret_cast<CFWL_ListItem*>(m_ListBoxDP.GetItem(m_pIface, nIndex));
     50   int32_t iCount = m_ListBoxDP.CountItems(m_pIface);
     51   int32_t iSel = nIndex + 1;
     52   if (iSel >= iCount) {
     53     iSel = nIndex - 1;
     54     if (iSel < 0) {
     55       iSel = -1;
     56     }
     57   }
     58   if (iSel >= 0) {
     59     CFWL_ListItem* pSel =
     60         reinterpret_cast<CFWL_ListItem*>(m_ListBoxDP.GetItem(m_pIface, iSel));
     61     pSel->m_dwStates |= FWL_ITEMSTATE_LTB_Selected;
     62   }
     63   m_ListBoxDP.m_arrItem.RemoveAt(nIndex);
     64   delete pDelItem;
     65   return TRUE;
     66 }
     67 FX_BOOL CFWL_ListBox::DeleteAll() {
     68   int32_t iCount = m_ListBoxDP.CountItems(m_pIface);
     69   for (int32_t i = 0; i < iCount; i++) {
     70     CFWL_ListItem* pItem =
     71         reinterpret_cast<CFWL_ListItem*>(m_ListBoxDP.GetItem(m_pIface, i));
     72     delete pItem;
     73   }
     74   m_ListBoxDP.m_arrItem.RemoveAll();
     75   return TRUE;
     76 }
     77 int32_t CFWL_ListBox::CountSelItems() {
     78   if (!m_pIface)
     79     return 0;
     80   return static_cast<IFWL_ListBox*>(m_pIface)->CountSelItems();
     81 }
     82 FWL_HLISTITEM CFWL_ListBox::GetSelItem(int32_t nIndexSel) {
     83   if (!m_pIface)
     84     return NULL;
     85   return static_cast<IFWL_ListBox*>(m_pIface)->GetSelItem(nIndexSel);
     86 }
     87 int32_t CFWL_ListBox::GetSelIndex(int32_t nIndex) {
     88   if (!m_pIface)
     89     return 0;
     90   return static_cast<IFWL_ListBox*>(m_pIface)->GetSelIndex(nIndex);
     91 }
     92 FWL_ERR CFWL_ListBox::SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect) {
     93   if (!m_pIface)
     94     return FWL_ERR_Indefinite;
     95   return static_cast<IFWL_ListBox*>(m_pIface)->SetSelItem(hItem, bSelect);
     96 }
     97 FWL_ERR CFWL_ListBox::GetItemText(FWL_HLISTITEM hItem, CFX_WideString& wsText) {
     98   if (!m_pIface)
     99     return FWL_ERR_Indefinite;
    100   return static_cast<IFWL_ListBox*>(m_pIface)->GetItemText(hItem, wsText);
    101 }
    102 FWL_ERR CFWL_ListBox::GetScrollPos(FX_FLOAT& fPos, FX_BOOL bVert) {
    103   if (!m_pIface)
    104     return FWL_ERR_Indefinite;
    105   return static_cast<IFWL_ListBox*>(m_pIface)->GetScrollPos(fPos, bVert);
    106 }
    107 FWL_ERR CFWL_ListBox::SetItemHeight(FX_FLOAT fItemHeight) {
    108   m_ListBoxDP.m_fItemHeight = fItemHeight;
    109   return FWL_ERR_Succeeded;
    110 }
    111 FWL_HLISTITEM CFWL_ListBox::GetFocusItem() {
    112   for (int32_t i = 0; i < m_ListBoxDP.m_arrItem.GetSize(); i++) {
    113     CFWL_ListItem* hItem =
    114         static_cast<CFWL_ListItem*>(m_ListBoxDP.m_arrItem[i]);
    115     if (hItem->m_dwStates & FWL_ITEMSTATE_LTB_Focused) {
    116       return (FWL_HLISTITEM)hItem;
    117     }
    118   }
    119   return NULL;
    120 }
    121 FWL_ERR CFWL_ListBox::SetFocusItem(FWL_HLISTITEM hItem) {
    122   int32_t nIndex = m_ListBoxDP.GetItemIndex(GetWidget(), hItem);
    123   static_cast<CFWL_ListItem*>(m_ListBoxDP.m_arrItem[nIndex])->m_dwStates |=
    124       FWL_ITEMSTATE_LTB_Focused;
    125   return FWL_ERR_Succeeded;
    126 }
    127 FWL_ERR* CFWL_ListBox::Sort(IFWL_ListBoxCompare* pCom) {
    128   return static_cast<IFWL_ListBox*>(m_pIface)->Sort(pCom);
    129 }
    130 int32_t CFWL_ListBox::CountItems() {
    131   return m_ListBoxDP.m_arrItem.GetSize();
    132 }
    133 FWL_HLISTITEM CFWL_ListBox::GetItem(int32_t nIndex) {
    134   int32_t nCount = m_ListBoxDP.m_arrItem.GetSize();
    135   if (nIndex > nCount - 1 && nIndex < 0) {
    136     return NULL;
    137   }
    138   return (FWL_HLISTITEM)m_ListBoxDP.m_arrItem[nIndex];
    139 }
    140 FWL_ERR CFWL_ListBox::SetItemString(FWL_HLISTITEM hItem,
    141                                     const CFX_WideStringC& wsText) {
    142   if (!hItem)
    143     return FWL_ERR_Indefinite;
    144   reinterpret_cast<CFWL_ListItem*>(hItem)->m_wsText = wsText;
    145   return FWL_ERR_Succeeded;
    146 }
    147 FWL_ERR CFWL_ListBox::GetItemString(FWL_HLISTITEM hItem,
    148                                     CFX_WideString& wsText) {
    149   if (!hItem)
    150     return FWL_ERR_Indefinite;
    151   wsText = reinterpret_cast<CFWL_ListItem*>(hItem)->m_wsText;
    152   return FWL_ERR_Succeeded;
    153 }
    154 FWL_ERR CFWL_ListBox::SetItemData(FWL_HLISTITEM hItem, void* pData) {
    155   if (!hItem)
    156     return FWL_ERR_Indefinite;
    157   reinterpret_cast<CFWL_ListItem*>(hItem)->m_pData = pData;
    158   return FWL_ERR_Succeeded;
    159 }
    160 void* CFWL_ListBox::GetItemData(FWL_HLISTITEM hItem) {
    161   if (!hItem)
    162     return NULL;
    163   return reinterpret_cast<CFWL_ListItem*>(hItem)->m_pData;
    164 }
    165 FWL_HLISTITEM CFWL_ListBox::GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
    166   CFX_RectF rtClient;
    167   m_pIface->GetClientRect(rtClient);
    168   fx -= rtClient.left;
    169   fy -= rtClient.top;
    170   FX_FLOAT fPosX = 0;
    171   FX_FLOAT fPosY = 0;
    172   static_cast<IFWL_ListBox*>(m_pIface)->GetScrollPos(fx);
    173   static_cast<IFWL_ListBox*>(m_pIface)->GetScrollPos(fy, FALSE);
    174   int32_t nCount = m_ListBoxDP.CountItems(NULL);
    175   for (int32_t i = 0; i < nCount; i++) {
    176     FWL_HLISTITEM hItem = m_ListBoxDP.GetItem(NULL, i);
    177     if (!hItem) {
    178       continue;
    179     }
    180     CFX_RectF rtItem;
    181     m_ListBoxDP.GetItemRect(NULL, hItem, rtItem);
    182     rtItem.Offset(-fPosX, -fPosY);
    183     if (rtItem.Contains(fx, fy)) {
    184       return hItem;
    185     }
    186   }
    187   return NULL;
    188 }
    189 FX_DWORD CFWL_ListBox::GetItemStates(FWL_HLISTITEM hItem) {
    190   if (!hItem)
    191     return 0;
    192   CFWL_ListItem* pItem = reinterpret_cast<CFWL_ListItem*>(hItem);
    193   return pItem->m_dwStates | pItem->m_dwCheckState;
    194 }
    195 CFWL_ListBox::CFWL_ListBox() {}
    196 CFWL_ListBox::~CFWL_ListBox() {}
    197 CFWL_ListBox::CFWL_ListBoxDP::CFWL_ListBoxDP() {}
    198 CFWL_ListBox::CFWL_ListBoxDP::~CFWL_ListBoxDP() {
    199   int32_t nCount = m_arrItem.GetSize();
    200   for (int32_t i = 0; i < nCount; i++) {
    201     delete static_cast<CFWL_ListItem*>(m_arrItem[i]);
    202   }
    203   m_arrItem.RemoveAll();
    204 }
    205 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetCaption(IFWL_Widget* pWidget,
    206                                                  CFX_WideString& wsCaption) {
    207   wsCaption = m_wsData;
    208   return FWL_ERR_Succeeded;
    209 }
    210 int32_t CFWL_ListBox::CFWL_ListBoxDP::CountItems(IFWL_Widget* pWidget) {
    211   return m_arrItem.GetSize();
    212 }
    213 FWL_HLISTITEM CFWL_ListBox::CFWL_ListBoxDP::GetItem(IFWL_Widget* pWidget,
    214                                                     int32_t nIndex) {
    215   if (nIndex >= m_arrItem.GetSize() || nIndex < 0) {
    216     return NULL;
    217   } else {
    218     return (FWL_HLISTITEM)m_arrItem[nIndex];
    219   }
    220 }
    221 int32_t CFWL_ListBox::CFWL_ListBoxDP::GetItemIndex(IFWL_Widget* pWidget,
    222                                                    FWL_HLISTITEM hItem) {
    223   return m_arrItem.Find(hItem);
    224 }
    225 FX_BOOL CFWL_ListBox::CFWL_ListBoxDP::SetItemIndex(IFWL_Widget* pWidget,
    226                                                    FWL_HLISTITEM hItem,
    227                                                    int32_t nIndex) {
    228   return m_arrItem.SetAt(nIndex, hItem);
    229 }
    230 FX_DWORD CFWL_ListBox::CFWL_ListBoxDP::GetItemStyles(IFWL_Widget* pWidget,
    231                                                      FWL_HLISTITEM hItem) {
    232   if (!hItem)
    233     return -1;
    234   return reinterpret_cast<CFWL_ListItem*>(hItem)->m_dwStates;
    235 }
    236 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetItemText(IFWL_Widget* pWidget,
    237                                                   FWL_HLISTITEM hItem,
    238                                                   CFX_WideString& wsText) {
    239   if (!hItem)
    240     return FWL_ERR_Indefinite;
    241   wsText = reinterpret_cast<CFWL_ListItem*>(hItem)->m_wsText;
    242   return FWL_ERR_Succeeded;
    243 }
    244 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetItemRect(IFWL_Widget* pWidget,
    245                                                   FWL_HLISTITEM hItem,
    246                                                   CFX_RectF& rtItem) {
    247   if (!hItem)
    248     return FWL_ERR_Indefinite;
    249   CFWL_ListItem* pItem = reinterpret_cast<CFWL_ListItem*>(hItem);
    250   rtItem = pItem->m_rtItem;
    251   return FWL_ERR_Succeeded;
    252 }
    253 void* CFWL_ListBox::CFWL_ListBoxDP::GetItemData(IFWL_Widget* pWidget,
    254                                                 FWL_HLISTITEM hItem) {
    255   if (!hItem)
    256     return NULL;
    257   CFWL_ListItem* pItem = reinterpret_cast<CFWL_ListItem*>(hItem);
    258   return pItem->m_pData;
    259 }
    260 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemStyles(IFWL_Widget* pWidget,
    261                                                     FWL_HLISTITEM hItem,
    262                                                     FX_DWORD dwStyle) {
    263   if (!hItem)
    264     return FWL_ERR_Indefinite;
    265   reinterpret_cast<CFWL_ListItem*>(hItem)->m_dwStates = dwStyle;
    266   return FWL_ERR_Succeeded;
    267 }
    268 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemText(IFWL_Widget* pWidget,
    269                                                   FWL_HLISTITEM hItem,
    270                                                   const FX_WCHAR* pszText) {
    271   if (!hItem)
    272     return FWL_ERR_Indefinite;
    273   reinterpret_cast<CFWL_ListItem*>(hItem)->m_wsText = pszText;
    274   return FWL_ERR_Succeeded;
    275 }
    276 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemRect(IFWL_Widget* pWidget,
    277                                                   FWL_HLISTITEM hItem,
    278                                                   const CFX_RectF& rtItem) {
    279   if (!hItem)
    280     return FWL_ERR_Indefinite;
    281   reinterpret_cast<CFWL_ListItem*>(hItem)->m_rtItem = rtItem;
    282   return FWL_ERR_Succeeded;
    283 }
    284 FX_FLOAT CFWL_ListBox::CFWL_ListBoxDP::GetItemHeight(IFWL_Widget* pWidget) {
    285   return m_fItemHeight;
    286 }
    287 CFX_DIBitmap* CFWL_ListBox::CFWL_ListBoxDP::GetItemIcon(IFWL_Widget* pWidget,
    288                                                         FWL_HLISTITEM hItem) {
    289   return reinterpret_cast<CFWL_ListItem*>(hItem)->m_pDIB;
    290 }
    291 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetItemCheckRect(IFWL_Widget* pWidget,
    292                                                        FWL_HLISTITEM hItem,
    293                                                        CFX_RectF& rtCheck) {
    294   rtCheck = reinterpret_cast<CFWL_ListItem*>(hItem)->m_rtCheckBox;
    295   return FWL_ERR_Succeeded;
    296 }
    297 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemCheckRect(
    298     IFWL_Widget* pWidget,
    299     FWL_HLISTITEM hItem,
    300     const CFX_RectF& rtCheck) {
    301   reinterpret_cast<CFWL_ListItem*>(hItem)->m_rtCheckBox = rtCheck;
    302   return FWL_ERR_Succeeded;
    303 }
    304 FX_DWORD CFWL_ListBox::CFWL_ListBoxDP::GetItemCheckState(IFWL_Widget* pWidget,
    305                                                          FWL_HLISTITEM hItem) {
    306   return reinterpret_cast<CFWL_ListItem*>(hItem)->m_dwCheckState;
    307 }
    308 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemCheckState(IFWL_Widget* pWidget,
    309                                                         FWL_HLISTITEM hItem,
    310                                                         FX_DWORD dwCheckState) {
    311   reinterpret_cast<CFWL_ListItem*>(hItem)->m_dwCheckState = dwCheckState;
    312   return FWL_ERR_Succeeded;
    313 }
    314