1d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Copyright 2017 PDFium Authors. All rights reserved.
2d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// found in the LICENSE file.
4d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
5d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_fflistbox.h"
8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <algorithm>
10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <utility>
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <vector>
12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fwl/cfwl_listbox.h"
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fwl/cfwl_notedriver.h"
15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fwl/cfwl_widget.h"
16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_eventparam.h"
17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_para.h"
18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannnamespace {
20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFWL_ListBox* ToListBox(CFWL_Widget* widget) {
22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return static_cast<CFWL_ListBox*>(widget);
23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}  // namespace
26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_FFListBox::CXFA_FFListBox(CXFA_Node* pNode)
28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    : CXFA_FFField(pNode), m_pOldDelegate(nullptr) {}
29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_FFListBox::~CXFA_FFListBox() {
31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_pNormalWidget)
32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFWL_NoteDriver* pNoteDriver =
35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_pNormalWidget->GetOwnerApp()->GetNoteDriver();
36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pNoteDriver->UnregisterEventTarget(m_pNormalWidget.get());
37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_FFListBox::LoadWidget() {
40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto pNew = pdfium::MakeUnique<CFWL_ListBox>(
41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetFWLApp(), pdfium::MakeUnique<CFWL_WidgetProperties>(), nullptr);
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFWL_ListBox* pListBox = pNew.get();
43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pListBox->ModifyStyles(FWL_WGTSTYLE_VScroll | FWL_WGTSTYLE_NoBackground,
44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                         0xFFFFFFFF);
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pNormalWidget = std::move(pNew);
46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pNormalWidget->SetLayoutItem(this);
47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFWL_NoteDriver* pNoteDriver =
49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_pNormalWidget->GetOwnerApp()->GetNoteDriver();
50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pNoteDriver->RegisterEventTarget(m_pNormalWidget.get(),
51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                   m_pNormalWidget.get());
52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pOldDelegate = m_pNormalWidget->GetDelegate();
53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pNormalWidget->SetDelegate(this);
54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pNormalWidget->LockUpdate();
55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (const auto& label : m_pNode->GetWidgetAcc()->GetChoiceListItems(false))
57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pListBox->AddString(label.AsStringView());
58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  uint32_t dwExtendedStyle = FWL_STYLEEXT_LTB_ShowScrollBarFocus;
60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_pNode->GetWidgetAcc()->IsChoiceListMultiSelect())
61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    dwExtendedStyle |= FWL_STYLEEXT_LTB_MultiSelection;
62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  dwExtendedStyle |= GetAlignment();
64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (int32_t selected : m_pNode->GetWidgetAcc()->GetSelectedItems())
66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pListBox->SetSelItem(pListBox->GetItem(nullptr, selected), true);
67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pNormalWidget->UnlockUpdate();
69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return CXFA_FFField::LoadWidget();
70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_FFListBox::OnKillFocus(CXFA_FFWidget* pNewFocus) {
73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!ProcessCommittedData())
74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    UpdateFWLData();
75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_FFField::OnKillFocus(pNewFocus);
77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_FFListBox::CommitData() {
81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* pListBox = ToListBox(m_pNormalWidget.get());
82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<int32_t> iSelArray;
83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iSels = pListBox->CountSelItems();
84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (int32_t i = 0; i < iSels; ++i)
85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    iSelArray.push_back(pListBox->GetSelIndex(i));
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pNode->GetWidgetAcc()->SetSelectedItems(iSelArray, true, false, true);
88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_FFListBox::IsDataChanged() {
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<int32_t> iSelArray = m_pNode->GetWidgetAcc()->GetSelectedItems();
93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iOldSels = pdfium::CollectionSize<int32_t>(iSelArray);
94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* pListBox = ToListBox(m_pNormalWidget.get());
95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iSels = pListBox->CountSelItems();
96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iOldSels != iSels)
97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return true;
98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (int32_t i = 0; i < iSels; ++i) {
100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CFWL_ListItem* hlistItem = pListBox->GetItem(nullptr, iSelArray[i]);
101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!(hlistItem->GetStates() & FWL_ITEMSTATE_LTB_Selected))
102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return true;
103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return false;
105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannuint32_t CXFA_FFListBox::GetAlignment() {
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Para* para = m_pNode->GetParaIfExists();
109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!para)
110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return 0;
111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  uint32_t dwExtendedStyle = 0;
113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (para->GetHorizontalAlign()) {
114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Center:
115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      dwExtendedStyle |= FWL_STYLEEXT_LTB_CenterAlign;
116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Justify:
118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::JustifyAll:
120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Radix:
122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Right:
124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      dwExtendedStyle |= FWL_STYLEEXT_LTB_RightAlign;
125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      dwExtendedStyle |= FWL_STYLEEXT_LTB_LeftAlign;
128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return dwExtendedStyle;
131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_FFListBox::UpdateFWLData() {
134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_pNormalWidget)
135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* pListBox = ToListBox(m_pNormalWidget.get());
138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<int32_t> iSelArray = m_pNode->GetWidgetAcc()->GetSelectedItems();
139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<CFWL_ListItem*> selItemArray(iSelArray.size());
140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::transform(iSelArray.begin(), iSelArray.end(), selItemArray.begin(),
141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                 [pListBox](int32_t val) { return pListBox->GetSelItem(val); });
142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pListBox->SetSelItem(pListBox->GetSelItem(-1), false);
144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CFWL_ListItem* pItem : selItemArray)
145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pListBox->SetSelItem(pItem, true);
146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pNormalWidget->Update();
148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_FFListBox::OnSelectChanged(CFWL_Widget* pWidget) {
152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_EventParam eParam;
153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  eParam.m_eType = XFA_EVENT_Change;
154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  eParam.m_pTarget = m_pNode->GetWidgetAcc();
155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  eParam.m_wsPrevText = m_pNode->GetWidgetAcc()->GetValue(XFA_VALUEPICTURE_Raw);
156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* pListBox = ToListBox(m_pNormalWidget.get());
158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iSels = pListBox->CountSelItems();
159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iSels > 0) {
160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CFWL_ListItem* item = pListBox->GetSelItem(0);
161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    eParam.m_wsNewText = item ? item->GetText() : L"";
162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pNode->ProcessEvent(GetDocView(), XFA_AttributeEnum::Change, &eParam);
164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_FFListBox::SetItemState(int32_t nIndex, bool bSelected) {
167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* pListBox = ToListBox(m_pNormalWidget.get());
168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pListBox->SetSelItem(pListBox->GetSelItem(nIndex), bSelected);
169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pNormalWidget->Update();
170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  AddInvalidateRect();
171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_FFListBox::InsertItem(const WideStringView& wsLabel, int32_t nIndex) {
174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsTemp(wsLabel);
175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ToListBox(m_pNormalWidget.get())->AddString(wsTemp.AsStringView());
176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pNormalWidget->Update();
177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  AddInvalidateRect();
178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_FFListBox::DeleteItem(int32_t nIndex) {
181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* pListBox = ToListBox(m_pNormalWidget.get());
182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (nIndex < 0)
183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pListBox->DeleteAll();
184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  else
185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pListBox->DeleteString(pListBox->GetItem(nullptr, nIndex));
186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pListBox->Update();
188d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  AddInvalidateRect();
189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_FFListBox::OnProcessMessage(CFWL_Message* pMessage) {
192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pOldDelegate->OnProcessMessage(pMessage);
193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_FFListBox::OnProcessEvent(CFWL_Event* pEvent) {
196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_FFField::OnProcessEvent(pEvent);
197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (pEvent->GetType()) {
198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case CFWL_Event::Type::SelectChanged:
199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      OnSelectChanged(m_pNormalWidget.get());
200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pOldDelegate->OnProcessEvent(pEvent);
205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_FFListBox::OnDrawWidget(CXFA_Graphics* pGraphics,
208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  const CFX_Matrix& matrix) {
209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pOldDelegate->OnDrawWidget(pGraphics, matrix);
210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFormFieldType CXFA_FFListBox::GetFormFieldType() {
213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return FormFieldType::kXFA_ListBox;
214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
215