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 11CFWL_ComboBox* CFWL_ComboBox::Create() { 12 return new CFWL_ComboBox; 13} 14FWL_ERR CFWL_ComboBox::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_ComboBox> pComboBox(IFWL_ComboBox::Create( 21 m_pProperties->MakeWidgetImpProperties(&m_comboBoxData))); 22 FWL_ERR ret = pComboBox->Initialize(); 23 if (ret != FWL_ERR_Succeeded) { 24 return ret; 25 } 26 m_pIface = pComboBox.release(); 27 CFWL_Widget::Initialize(); 28 return FWL_ERR_Succeeded; 29} 30int32_t CFWL_ComboBox::AddString(const CFX_WideStringC& wsText) { 31 CFWL_ComboBoxItem* pItem = new CFWL_ComboBoxItem; 32 pItem->m_wsText = wsText; 33 pItem->m_dwStyles = 0; 34 return m_comboBoxData.m_arrItem.Add(pItem); 35} 36int32_t CFWL_ComboBox::AddString(const CFX_WideStringC& wsText, 37 CFX_DIBitmap* pIcon) { 38 CFWL_ComboBoxItem* pItem = new CFWL_ComboBoxItem; 39 pItem->m_wsText = wsText; 40 pItem->m_dwStyles = 0; 41 pItem->m_pDIB = pIcon; 42 return m_comboBoxData.m_arrItem.Add(pItem); 43} 44int32_t CFWL_ComboBox::RemoveAt(int32_t iIndex) { 45 return m_comboBoxData.m_arrItem.RemoveAt(iIndex); 46} 47int32_t CFWL_ComboBox::RemoveAll() { 48 m_comboBoxData.m_arrItem.RemoveAll(); 49 return 0; 50} 51int32_t CFWL_ComboBox::CountItems() { 52 return m_comboBoxData.CountItems(GetWidget()); 53} 54FWL_ERR CFWL_ComboBox::GetTextByIndex(int32_t iIndex, CFX_WideString& wsText) { 55 CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>( 56 m_comboBoxData.GetItem(m_pIface, iIndex)); 57 if (!pItem) 58 return FWL_ERR_Indefinite; 59 wsText = pItem->m_wsText; 60 return FWL_ERR_Succeeded; 61} 62int32_t CFWL_ComboBox::GetCurSel() { 63 if (!m_pIface) 64 return -1; 65 return static_cast<IFWL_ComboBox*>(m_pIface)->GetCurSel(); 66} 67FWL_ERR CFWL_ComboBox::SetCurSel(int32_t iSel) { 68 if (!m_pIface) 69 return FWL_ERR_Indefinite; 70 return static_cast<IFWL_ComboBox*>(m_pIface)->SetCurSel(iSel); 71} 72FWL_ERR CFWL_ComboBox::SetEditText(const CFX_WideStringC& wsText) { 73 if (!m_pIface) 74 return FWL_ERR_Indefinite; 75 return static_cast<IFWL_ComboBox*>(m_pIface)->SetEditText(wsText); 76} 77int32_t CFWL_ComboBox::GetEditTextLength() const { 78 if (!m_pIface) 79 return 0; 80 return static_cast<IFWL_ComboBox*>(m_pIface)->GetEditTextLength(); 81} 82FWL_ERR CFWL_ComboBox::GetEditText(CFX_WideString& wsText, 83 int32_t nStart, 84 int32_t nCount) const { 85 if (!m_pIface) 86 return FWL_ERR_Indefinite; 87 return static_cast<IFWL_ComboBox*>(m_pIface) 88 ->GetEditText(wsText, nStart, nCount); 89} 90FWL_ERR CFWL_ComboBox::SetEditSelRange(int32_t nStart, int32_t nCount) { 91 if (!m_pIface) 92 return FWL_ERR_Indefinite; 93 return static_cast<IFWL_ComboBox*>(m_pIface)->SetEditSelRange(nStart, nCount); 94} 95int32_t CFWL_ComboBox::GetEditSelRange(int32_t nIndex, int32_t& nStart) { 96 if (!m_pIface) 97 return 0; 98 return static_cast<IFWL_ComboBox*>(m_pIface)->GetEditSelRange(nIndex, nStart); 99} 100int32_t CFWL_ComboBox::GetEditLimit() { 101 if (!m_pIface) 102 return 0; 103 return static_cast<IFWL_ComboBox*>(m_pIface)->GetEditLimit(); 104} 105FWL_ERR CFWL_ComboBox::SetEditLimit(int32_t nLimit) { 106 if (!m_pIface) 107 return FWL_ERR_Indefinite; 108 return static_cast<IFWL_ComboBox*>(m_pIface)->SetEditLimit(nLimit); 109} 110FWL_ERR CFWL_ComboBox::EditDoClipboard(int32_t iCmd) { 111 if (!m_pIface) 112 return FWL_ERR_Indefinite; 113 return static_cast<IFWL_ComboBox*>(m_pIface)->EditDoClipboard(iCmd); 114} 115FX_BOOL CFWL_ComboBox::EditRedo(const CFX_ByteStringC& bsRecord) { 116 if (!m_pIface) 117 return FALSE; 118 return static_cast<IFWL_ComboBox*>(m_pIface)->EditRedo(bsRecord); 119} 120FX_BOOL CFWL_ComboBox::EditUndo(const CFX_ByteStringC& bsRecord) { 121 if (!m_pIface) 122 return FALSE; 123 return static_cast<IFWL_ComboBox*>(m_pIface)->EditUndo(bsRecord); 124} 125FWL_ERR CFWL_ComboBox::SetMaxListHeight(FX_FLOAT fMaxHeight) { 126 m_comboBoxData.m_fMaxListHeight = fMaxHeight; 127 return FWL_ERR_Succeeded; 128} 129FWL_ERR CFWL_ComboBox::SetItemData(int32_t iIndex, void* pData) { 130 CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>( 131 m_comboBoxData.GetItem(m_pIface, iIndex)); 132 if (!pItem) 133 return FWL_ERR_Indefinite; 134 pItem->m_pData = pData; 135 return FWL_ERR_Succeeded; 136} 137void* CFWL_ComboBox::GetItemData(int32_t iIndex) { 138 CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>( 139 m_comboBoxData.GetItem(m_pIface, iIndex)); 140 if (!pItem) 141 return NULL; 142 return pItem->m_pData; 143} 144FWL_ERR CFWL_ComboBox::SetListTheme(IFWL_ThemeProvider* pTheme) { 145 return static_cast<IFWL_ComboBox*>(m_pIface)->GetListBoxt()->SetThemeProvider( 146 pTheme); 147} 148FX_BOOL CFWL_ComboBox::AfterFocusShowDropList() { 149 return static_cast<IFWL_ComboBox*>(m_pIface)->AfterFocusShowDropList(); 150} 151FWL_ERR CFWL_ComboBox::OpenDropDownList(FX_BOOL bActivate) { 152 return static_cast<IFWL_ComboBox*>(m_pIface)->OpenDropDownList(bActivate); 153} 154FX_BOOL CFWL_ComboBox::EditCanUndo() { 155 if (!m_pIface) 156 return FALSE; 157 return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanUndo(); 158} 159FX_BOOL CFWL_ComboBox::EditCanRedo() { 160 if (!m_pIface) 161 return FALSE; 162 return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanRedo(); 163} 164FX_BOOL CFWL_ComboBox::EditUndo() { 165 if (!m_pIface) 166 return FALSE; 167 return static_cast<IFWL_ComboBox*>(m_pIface)->EditUndo(); 168} 169FX_BOOL CFWL_ComboBox::EditRedo() { 170 if (!m_pIface) 171 return FALSE; 172 return static_cast<IFWL_ComboBox*>(m_pIface)->EditRedo(); 173} 174FX_BOOL CFWL_ComboBox::EditCanCopy() { 175 if (!m_pIface) 176 return FALSE; 177 return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanCopy(); 178} 179FX_BOOL CFWL_ComboBox::EditCanCut() { 180 if (!m_pIface) 181 return FALSE; 182 return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanCut(); 183} 184FX_BOOL CFWL_ComboBox::EditCanSelectAll() { 185 if (!m_pIface) 186 return FALSE; 187 return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanSelectAll(); 188} 189FX_BOOL CFWL_ComboBox::EditCopy(CFX_WideString& wsCopy) { 190 if (!m_pIface) 191 return FALSE; 192 return static_cast<IFWL_ComboBox*>(m_pIface)->EditCopy(wsCopy); 193} 194FX_BOOL CFWL_ComboBox::EditCut(CFX_WideString& wsCut) { 195 if (!m_pIface) 196 return FALSE; 197 return static_cast<IFWL_ComboBox*>(m_pIface)->EditCut(wsCut); 198} 199FX_BOOL CFWL_ComboBox::EditPaste(const CFX_WideString& wsPaste) { 200 if (!m_pIface) 201 return FALSE; 202 return static_cast<IFWL_ComboBox*>(m_pIface)->EditPaste(wsPaste); 203} 204FX_BOOL CFWL_ComboBox::EditSelectAll() { 205 if (!m_pIface) 206 return FALSE; 207 return static_cast<IFWL_ComboBox*>(m_pIface)->EditSelectAll(); 208} 209FX_BOOL CFWL_ComboBox::EditDelete() { 210 if (!m_pIface) 211 return FALSE; 212 return static_cast<IFWL_ComboBox*>(m_pIface)->EditDelete(); 213} 214FX_BOOL CFWL_ComboBox::EditDeSelect() { 215 if (!m_pIface) 216 return FALSE; 217 return static_cast<IFWL_ComboBox*>(m_pIface)->EditDeSelect(); 218} 219FWL_ERR CFWL_ComboBox::GetBBox(CFX_RectF& rect) { 220 if (!m_pIface) 221 return FALSE; 222 return static_cast<IFWL_ComboBox*>(m_pIface)->GetBBox(rect); 223} 224FWL_ERR CFWL_ComboBox::EditModifyStylesEx(FX_DWORD dwStylesExAdded, 225 FX_DWORD dwStylesExRemoved) { 226 if (!m_pIface) 227 return FALSE; 228 return static_cast<IFWL_ComboBox*>(m_pIface) 229 ->EditModifyStylesEx(dwStylesExAdded, dwStylesExRemoved); 230} 231CFWL_ComboBox::CFWL_ComboBox() {} 232CFWL_ComboBox::~CFWL_ComboBox() {} 233CFWL_ComboBox::CFWL_ComboBoxDP::CFWL_ComboBoxDP() { 234 m_fItemHeight = 0; 235 m_fMaxListHeight = 0; 236} 237CFWL_ComboBox::CFWL_ComboBoxDP::~CFWL_ComboBoxDP() { 238 int32_t nCount = m_arrItem.GetSize(); 239 for (int32_t i = 0; i < nCount; i++) { 240 delete static_cast<CFWL_ComboBoxItem*>(m_arrItem[i]); 241 } 242 m_arrItem.RemoveAll(); 243} 244int32_t CFWL_ComboBox::CFWL_ComboBoxDP::CountItems(IFWL_Widget* pWidget) { 245 return m_arrItem.GetSize(); 246} 247FWL_HLISTITEM CFWL_ComboBox::CFWL_ComboBoxDP::GetItem(IFWL_Widget* pWidget, 248 int32_t nIndex) { 249 int32_t iCount = m_arrItem.GetSize(); 250 if (nIndex >= iCount || nIndex < 0) { 251 return NULL; 252 } 253 return (FWL_HLISTITEM)m_arrItem[nIndex]; 254} 255int32_t CFWL_ComboBox::CFWL_ComboBoxDP::GetItemIndex(IFWL_Widget* pWidget, 256 FWL_HLISTITEM hItem) { 257 return m_arrItem.Find(hItem); 258} 259FX_BOOL CFWL_ComboBox::CFWL_ComboBoxDP::SetItemIndex(IFWL_Widget* pWidget, 260 FWL_HLISTITEM hItem, 261 int32_t nIndex) { 262 return m_arrItem.SetAt(nIndex, hItem); 263} 264FX_DWORD CFWL_ComboBox::CFWL_ComboBoxDP::GetItemStyles(IFWL_Widget* pWidget, 265 FWL_HLISTITEM hItem) { 266 if (!hItem) 267 return 0; 268 return reinterpret_cast<CFWL_ComboBoxItem*>(hItem)->m_dwStyles; 269} 270FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::GetItemText(IFWL_Widget* pWidget, 271 FWL_HLISTITEM hItem, 272 CFX_WideString& wsText) { 273 if (!hItem) 274 return FWL_ERR_Indefinite; 275 wsText = reinterpret_cast<CFWL_ComboBoxItem*>(hItem)->m_wsText; 276 return FWL_ERR_Succeeded; 277} 278FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::GetItemRect(IFWL_Widget* pWidget, 279 FWL_HLISTITEM hItem, 280 CFX_RectF& rtItem) { 281 if (!hItem) 282 return FWL_ERR_Indefinite; 283 CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>(hItem); 284 rtItem.Set(pItem->m_rtItem.left, pItem->m_rtItem.top, pItem->m_rtItem.width, 285 pItem->m_rtItem.height); 286 return FWL_ERR_Succeeded; 287} 288void* CFWL_ComboBox::CFWL_ComboBoxDP::GetItemData(IFWL_Widget* pWidget, 289 FWL_HLISTITEM hItem) { 290 if (!hItem) 291 return NULL; 292 CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>(hItem); 293 return pItem->m_pData; 294} 295FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemStyles(IFWL_Widget* pWidget, 296 FWL_HLISTITEM hItem, 297 FX_DWORD dwStyle) { 298 if (!hItem) 299 return FWL_ERR_Indefinite; 300 reinterpret_cast<CFWL_ComboBoxItem*>(hItem)->m_dwStyles = dwStyle; 301 return FWL_ERR_Succeeded; 302} 303FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemText(IFWL_Widget* pWidget, 304 FWL_HLISTITEM hItem, 305 const FX_WCHAR* pszText) { 306 if (!hItem) 307 return FWL_ERR_Indefinite; 308 reinterpret_cast<CFWL_ComboBoxItem*>(hItem)->m_wsText = pszText; 309 return FWL_ERR_Succeeded; 310} 311FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemRect(IFWL_Widget* pWidget, 312 FWL_HLISTITEM hItem, 313 const CFX_RectF& rtItem) { 314 if (!hItem) 315 return FWL_ERR_Indefinite; 316 reinterpret_cast<CFWL_ComboBoxItem*>(hItem)->m_rtItem = rtItem; 317 return FWL_ERR_Succeeded; 318} 319FX_FLOAT CFWL_ComboBox::CFWL_ComboBoxDP::GetItemHeight(IFWL_Widget* pWidget) { 320 return m_fItemHeight; 321} 322CFX_DIBitmap* CFWL_ComboBox::CFWL_ComboBoxDP::GetItemIcon(IFWL_Widget* pWidget, 323 FWL_HLISTITEM hItem) { 324 if (!hItem) 325 return NULL; 326 return reinterpret_cast<CFWL_ComboBoxItem*>(hItem)->m_pDIB; 327} 328FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::GetItemCheckRect(IFWL_Widget* pWidget, 329 FWL_HLISTITEM hItem, 330 CFX_RectF& rtCheck) { 331 CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>(hItem); 332 rtCheck = pItem->m_rtCheckBox; 333 return FWL_ERR_Succeeded; 334} 335FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemCheckRect( 336 IFWL_Widget* pWidget, 337 FWL_HLISTITEM hItem, 338 const CFX_RectF& rtCheck) { 339 CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>(hItem); 340 pItem->m_rtCheckBox = rtCheck; 341 return FWL_ERR_Succeeded; 342} 343FX_DWORD CFWL_ComboBox::CFWL_ComboBoxDP::GetItemCheckState( 344 IFWL_Widget* pWidget, 345 FWL_HLISTITEM hItem) { 346 CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>(hItem); 347 return pItem->m_dwCheckState; 348} 349FWL_ERR CFWL_ComboBox::CFWL_ComboBoxDP::SetItemCheckState( 350 IFWL_Widget* pWidget, 351 FWL_HLISTITEM hItem, 352 FX_DWORD dwCheckState) { 353 CFWL_ComboBoxItem* pItem = reinterpret_cast<CFWL_ComboBoxItem*>(hItem); 354 pItem->m_dwCheckState = dwCheckState; 355 return FWL_ERR_Succeeded; 356} 357FX_FLOAT CFWL_ComboBox::CFWL_ComboBoxDP::GetListHeight(IFWL_Widget* pWidget) { 358 return m_fMaxListHeight; 359} 360