• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "xfa/fxfa/app/xfa_ffchoicelist.h"
8 
9 #include <vector>
10 
11 #include "third_party/base/ptr_util.h"
12 #include "third_party/base/stl_util.h"
13 #include "xfa/fwl/cfwl_app.h"
14 #include "xfa/fwl/cfwl_combobox.h"
15 #include "xfa/fwl/cfwl_edit.h"
16 #include "xfa/fwl/cfwl_eventselectchanged.h"
17 #include "xfa/fwl/cfwl_listbox.h"
18 #include "xfa/fwl/cfwl_notedriver.h"
19 #include "xfa/fwl/cfwl_widgetproperties.h"
20 #include "xfa/fxfa/app/xfa_fffield.h"
21 #include "xfa/fxfa/app/xfa_fwladapter.h"
22 #include "xfa/fxfa/cxfa_eventparam.h"
23 #include "xfa/fxfa/xfa_ffdoc.h"
24 #include "xfa/fxfa/xfa_ffdocview.h"
25 #include "xfa/fxfa/xfa_ffpageview.h"
26 #include "xfa/fxfa/xfa_ffwidget.h"
27 
CXFA_FFListBox(CXFA_WidgetAcc * pDataAcc)28 CXFA_FFListBox::CXFA_FFListBox(CXFA_WidgetAcc* pDataAcc)
29     : CXFA_FFField(pDataAcc), m_pOldDelegate(nullptr) {}
30 
~CXFA_FFListBox()31 CXFA_FFListBox::~CXFA_FFListBox() {
32   if (m_pNormalWidget) {
33     CFWL_NoteDriver* pNoteDriver =
34         m_pNormalWidget->GetOwnerApp()->GetNoteDriver();
35     pNoteDriver->UnregisterEventTarget(m_pNormalWidget);
36   }
37 }
38 
LoadWidget()39 bool CXFA_FFListBox::LoadWidget() {
40   CFWL_ListBox* pListBox = new CFWL_ListBox(
41       GetFWLApp(), pdfium::MakeUnique<CFWL_WidgetProperties>(), nullptr);
42   pListBox->ModifyStyles(FWL_WGTSTYLE_VScroll | FWL_WGTSTYLE_NoBackground,
43                          0xFFFFFFFF);
44   m_pNormalWidget = (CFWL_Widget*)pListBox;
45   m_pNormalWidget->SetLayoutItem(this);
46 
47   CFWL_NoteDriver* pNoteDriver =
48       m_pNormalWidget->GetOwnerApp()->GetNoteDriver();
49   pNoteDriver->RegisterEventTarget(m_pNormalWidget, m_pNormalWidget);
50 
51   m_pOldDelegate = m_pNormalWidget->GetDelegate();
52   m_pNormalWidget->SetDelegate(this);
53   m_pNormalWidget->LockUpdate();
54 
55   std::vector<CFX_WideString> wsLabelArray;
56   m_pDataAcc->GetChoiceListItems(wsLabelArray, false);
57   int32_t iItems = pdfium::CollectionSize<int32_t>(wsLabelArray);
58   for (int32_t i = 0; i < iItems; i++) {
59     pListBox->AddString(wsLabelArray[i].AsStringC());
60   }
61   uint32_t dwExtendedStyle = FWL_STYLEEXT_LTB_ShowScrollBarFocus;
62   if (m_pDataAcc->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
63     dwExtendedStyle |= FWL_STYLEEXT_LTB_MultiSelection;
64   }
65   dwExtendedStyle |= GetAlignment();
66   m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
67   CFX_ArrayTemplate<int32_t> iSelArray;
68   m_pDataAcc->GetSelectedItems(iSelArray);
69   int32_t iSelCount = iSelArray.GetSize();
70   for (int32_t j = 0; j < iSelCount; j++) {
71     CFWL_ListItem* item = pListBox->GetItem(nullptr, iSelArray[j]);
72     pListBox->SetSelItem(item, true);
73   }
74   m_pNormalWidget->UnlockUpdate();
75   return CXFA_FFField::LoadWidget();
76 }
77 
OnKillFocus(CXFA_FFWidget * pNewFocus)78 bool CXFA_FFListBox::OnKillFocus(CXFA_FFWidget* pNewFocus) {
79   if (!ProcessCommittedData())
80     UpdateFWLData();
81   CXFA_FFField::OnKillFocus(pNewFocus);
82   return true;
83 }
84 
CommitData()85 bool CXFA_FFListBox::CommitData() {
86   CFWL_ListBox* pListBox = static_cast<CFWL_ListBox*>(m_pNormalWidget);
87   int32_t iSels = pListBox->CountSelItems();
88   CFX_ArrayTemplate<int32_t> iSelArray;
89   for (int32_t i = 0; i < iSels; ++i)
90     iSelArray.Add(pListBox->GetSelIndex(i));
91   m_pDataAcc->SetSelectedItems(iSelArray, true, false, true);
92   return true;
93 }
94 
IsDataChanged()95 bool CXFA_FFListBox::IsDataChanged() {
96   CFX_ArrayTemplate<int32_t> iSelArray;
97   m_pDataAcc->GetSelectedItems(iSelArray);
98   int32_t iOldSels = iSelArray.GetSize();
99   CFWL_ListBox* pListBox = (CFWL_ListBox*)m_pNormalWidget;
100   int32_t iSels = pListBox->CountSelItems();
101   if (iOldSels != iSels)
102     return true;
103 
104   for (int32_t i = 0; i < iSels; ++i) {
105     CFWL_ListItem* hlistItem = pListBox->GetItem(nullptr, iSelArray[i]);
106     if (!(hlistItem->GetStates() & FWL_ITEMSTATE_LTB_Selected))
107       return true;
108   }
109   return false;
110 }
111 
GetAlignment()112 uint32_t CXFA_FFListBox::GetAlignment() {
113   uint32_t dwExtendedStyle = 0;
114   if (CXFA_Para para = m_pDataAcc->GetPara()) {
115     int32_t iHorz = para.GetHorizontalAlign();
116     switch (iHorz) {
117       case XFA_ATTRIBUTEENUM_Center:
118         dwExtendedStyle |= FWL_STYLEEXT_LTB_CenterAlign;
119         break;
120       case XFA_ATTRIBUTEENUM_Justify:
121         break;
122       case XFA_ATTRIBUTEENUM_JustifyAll:
123         break;
124       case XFA_ATTRIBUTEENUM_Radix:
125         break;
126       case XFA_ATTRIBUTEENUM_Right:
127         dwExtendedStyle |= FWL_STYLEEXT_LTB_RightAlign;
128         break;
129       default:
130         dwExtendedStyle |= FWL_STYLEEXT_LTB_LeftAlign;
131         break;
132     }
133   }
134   return dwExtendedStyle;
135 }
UpdateFWLData()136 bool CXFA_FFListBox::UpdateFWLData() {
137   if (!m_pNormalWidget) {
138     return false;
139   }
140   CFWL_ListBox* pListBox = ((CFWL_ListBox*)m_pNormalWidget);
141   CFX_ArrayTemplate<CFWL_ListItem*> selItemArray;
142   CFX_ArrayTemplate<int32_t> iSelArray;
143   m_pDataAcc->GetSelectedItems(iSelArray);
144   int32_t iSelCount = iSelArray.GetSize();
145   for (int32_t j = 0; j < iSelCount; j++) {
146     CFWL_ListItem* lpItemSel = pListBox->GetSelItem(iSelArray[j]);
147     selItemArray.Add(lpItemSel);
148   }
149   pListBox->SetSelItem(pListBox->GetSelItem(-1), false);
150   for (int32_t i = 0; i < iSelCount; i++) {
151     ((CFWL_ListBox*)m_pNormalWidget)->SetSelItem(selItemArray[i], true);
152   }
153   m_pNormalWidget->Update();
154   return true;
155 }
OnSelectChanged(CFWL_Widget * pWidget,const CFX_ArrayTemplate<int32_t> & arrSels)156 void CXFA_FFListBox::OnSelectChanged(
157     CFWL_Widget* pWidget,
158     const CFX_ArrayTemplate<int32_t>& arrSels) {
159   CXFA_EventParam eParam;
160   eParam.m_eType = XFA_EVENT_Change;
161   eParam.m_pTarget = m_pDataAcc;
162   m_pDataAcc->GetValue(eParam.m_wsPrevText, XFA_VALUEPICTURE_Raw);
163   CFWL_ListBox* pListBox = (CFWL_ListBox*)m_pNormalWidget;
164   int32_t iSels = pListBox->CountSelItems();
165   if (iSels > 0) {
166     CFWL_ListItem* item = pListBox->GetSelItem(0);
167     eParam.m_wsNewText = item ? item->GetText() : L"";
168   }
169 
170   m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
171 }
SetItemState(int32_t nIndex,bool bSelected)172 void CXFA_FFListBox::SetItemState(int32_t nIndex, bool bSelected) {
173   CFWL_ListItem* item = ((CFWL_ListBox*)m_pNormalWidget)->GetSelItem(nIndex);
174   ((CFWL_ListBox*)m_pNormalWidget)->SetSelItem(item, bSelected);
175   m_pNormalWidget->Update();
176   AddInvalidateRect();
177 }
InsertItem(const CFX_WideStringC & wsLabel,int32_t nIndex)178 void CXFA_FFListBox::InsertItem(const CFX_WideStringC& wsLabel,
179                                 int32_t nIndex) {
180   CFX_WideString wsTemp(wsLabel);
181   ((CFWL_ListBox*)m_pNormalWidget)->AddString(wsTemp.AsStringC());
182   m_pNormalWidget->Update();
183   AddInvalidateRect();
184 }
DeleteItem(int32_t nIndex)185 void CXFA_FFListBox::DeleteItem(int32_t nIndex) {
186   CFWL_ListBox* listBox = static_cast<CFWL_ListBox*>(m_pNormalWidget);
187   if (nIndex < 0)
188     listBox->DeleteAll();
189   else
190     listBox->DeleteString(listBox->GetItem(nullptr, nIndex));
191 
192   listBox->Update();
193   AddInvalidateRect();
194 }
195 
OnProcessMessage(CFWL_Message * pMessage)196 void CXFA_FFListBox::OnProcessMessage(CFWL_Message* pMessage) {
197   m_pOldDelegate->OnProcessMessage(pMessage);
198 }
199 
OnProcessEvent(CFWL_Event * pEvent)200 void CXFA_FFListBox::OnProcessEvent(CFWL_Event* pEvent) {
201   CXFA_FFField::OnProcessEvent(pEvent);
202   switch (pEvent->GetType()) {
203     case CFWL_Event::Type::SelectChanged: {
204       CFX_ArrayTemplate<int32_t> arrSels;
205       OnSelectChanged(m_pNormalWidget, arrSels);
206       break;
207     }
208     default:
209       break;
210   }
211   m_pOldDelegate->OnProcessEvent(pEvent);
212 }
OnDrawWidget(CFX_Graphics * pGraphics,const CFX_Matrix * pMatrix)213 void CXFA_FFListBox::OnDrawWidget(CFX_Graphics* pGraphics,
214                                   const CFX_Matrix* pMatrix) {
215   m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
216 }
217 
CXFA_FFComboBox(CXFA_WidgetAcc * pDataAcc)218 CXFA_FFComboBox::CXFA_FFComboBox(CXFA_WidgetAcc* pDataAcc)
219     : CXFA_FFField(pDataAcc), m_pOldDelegate(nullptr) {}
220 
~CXFA_FFComboBox()221 CXFA_FFComboBox::~CXFA_FFComboBox() {}
222 
GetBBox(uint32_t dwStatus,bool bDrawFocus)223 CFX_RectF CXFA_FFComboBox::GetBBox(uint32_t dwStatus, bool bDrawFocus) {
224   if (bDrawFocus)
225     return CFX_RectF();
226   return CXFA_FFWidget::GetBBox(dwStatus);
227 }
228 
PtInActiveRect(const CFX_PointF & point)229 bool CXFA_FFComboBox::PtInActiveRect(const CFX_PointF& point) {
230   auto pComboBox = static_cast<CFWL_ComboBox*>(m_pNormalWidget);
231   return pComboBox && pComboBox->GetBBox().Contains(point);
232 }
233 
LoadWidget()234 bool CXFA_FFComboBox::LoadWidget() {
235   CFWL_ComboBox* pComboBox = new CFWL_ComboBox(GetFWLApp());
236   m_pNormalWidget = (CFWL_Widget*)pComboBox;
237   m_pNormalWidget->SetLayoutItem(this);
238 
239   CFWL_NoteDriver* pNoteDriver =
240       m_pNormalWidget->GetOwnerApp()->GetNoteDriver();
241   pNoteDriver->RegisterEventTarget(m_pNormalWidget, m_pNormalWidget);
242 
243   m_pOldDelegate = m_pNormalWidget->GetDelegate();
244   m_pNormalWidget->SetDelegate(this);
245   m_pNormalWidget->LockUpdate();
246 
247   std::vector<CFX_WideString> wsLabelArray;
248   m_pDataAcc->GetChoiceListItems(wsLabelArray, false);
249   int32_t iItems = pdfium::CollectionSize<int32_t>(wsLabelArray);
250   for (int32_t i = 0; i < iItems; i++) {
251     pComboBox->AddString(wsLabelArray[i].AsStringC());
252   }
253   CFX_ArrayTemplate<int32_t> iSelArray;
254   m_pDataAcc->GetSelectedItems(iSelArray);
255   int32_t iSelCount = iSelArray.GetSize();
256   if (iSelCount > 0) {
257     pComboBox->SetCurSel(iSelArray[0]);
258   } else {
259     CFX_WideString wsText;
260     m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Raw);
261     pComboBox->SetEditText(wsText);
262   }
263   UpdateWidgetProperty();
264   m_pNormalWidget->UnlockUpdate();
265   return CXFA_FFField::LoadWidget();
266 }
UpdateWidgetProperty()267 void CXFA_FFComboBox::UpdateWidgetProperty() {
268   CFWL_ComboBox* pComboBox = (CFWL_ComboBox*)m_pNormalWidget;
269   if (!pComboBox) {
270     return;
271   }
272   uint32_t dwExtendedStyle = 0;
273   uint32_t dwEditStyles =
274       FWL_STYLEEXT_EDT_ReadOnly | FWL_STYLEEXT_EDT_LastLineHeight;
275   dwExtendedStyle |= UpdateUIProperty();
276   if (m_pDataAcc->IsChoiceListAllowTextEntry()) {
277     dwEditStyles &= ~FWL_STYLEEXT_EDT_ReadOnly;
278     dwExtendedStyle |= FWL_STYLEEXT_CMB_DropDown;
279   }
280   if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open ||
281       !m_pDataAcc->GetDoc()->GetXFADoc()->IsInteractive()) {
282     dwEditStyles |= FWL_STYLEEXT_EDT_ReadOnly;
283     dwExtendedStyle |= FWL_STYLEEXT_CMB_ReadOnly;
284   }
285   dwExtendedStyle |= GetAlignment();
286   m_pNormalWidget->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF);
287   if (m_pDataAcc->GetHorizontalScrollPolicy() != XFA_ATTRIBUTEENUM_Off) {
288     dwEditStyles |= FWL_STYLEEXT_EDT_AutoHScroll;
289   }
290   pComboBox->EditModifyStylesEx(dwEditStyles, 0xFFFFFFFF);
291 }
292 
OnRButtonUp(uint32_t dwFlags,const CFX_PointF & point)293 bool CXFA_FFComboBox::OnRButtonUp(uint32_t dwFlags, const CFX_PointF& point) {
294   if (!CXFA_FFField::OnRButtonUp(dwFlags, point))
295     return false;
296 
297   GetDoc()->GetDocEnvironment()->PopupMenu(this, point);
298   return true;
299 }
300 
OnKillFocus(CXFA_FFWidget * pNewWidget)301 bool CXFA_FFComboBox::OnKillFocus(CXFA_FFWidget* pNewWidget) {
302   bool flag = ProcessCommittedData();
303   if (!flag) {
304     UpdateFWLData();
305   }
306   CXFA_FFField::OnKillFocus(pNewWidget);
307   return true;
308 }
OpenDropDownList()309 void CXFA_FFComboBox::OpenDropDownList() {
310   ((CFWL_ComboBox*)m_pNormalWidget)->OpenDropDownList(true);
311 }
CommitData()312 bool CXFA_FFComboBox::CommitData() {
313   return m_pDataAcc->SetValue(m_wsNewValue, XFA_VALUEPICTURE_Raw);
314 }
IsDataChanged()315 bool CXFA_FFComboBox::IsDataChanged() {
316   CFWL_ComboBox* pFWLcombobox = ((CFWL_ComboBox*)m_pNormalWidget);
317   CFX_WideString wsText = pFWLcombobox->GetEditText();
318   int32_t iCursel = pFWLcombobox->GetCurSel();
319   if (iCursel >= 0) {
320     CFX_WideString wsSel = pFWLcombobox->GetTextByIndex(iCursel);
321     if (wsSel == wsText)
322       m_pDataAcc->GetChoiceListItem(wsText, iCursel, true);
323   }
324 
325   CFX_WideString wsOldValue;
326   m_pDataAcc->GetValue(wsOldValue, XFA_VALUEPICTURE_Raw);
327   if (wsOldValue != wsText) {
328     m_wsNewValue = wsText;
329     return true;
330   }
331   return false;
332 }
FWLEventSelChange(CXFA_EventParam * pParam)333 void CXFA_FFComboBox::FWLEventSelChange(CXFA_EventParam* pParam) {
334   pParam->m_eType = XFA_EVENT_Change;
335   pParam->m_pTarget = m_pDataAcc;
336   CFWL_ComboBox* pFWLcombobox = ((CFWL_ComboBox*)m_pNormalWidget);
337   pParam->m_wsNewText = pFWLcombobox->GetEditText();
338   m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, pParam);
339 }
GetAlignment()340 uint32_t CXFA_FFComboBox::GetAlignment() {
341   uint32_t dwExtendedStyle = 0;
342   if (CXFA_Para para = m_pDataAcc->GetPara()) {
343     int32_t iHorz = para.GetHorizontalAlign();
344     switch (iHorz) {
345       case XFA_ATTRIBUTEENUM_Center:
346         dwExtendedStyle |=
347             FWL_STYLEEXT_CMB_EditHCenter | FWL_STYLEEXT_CMB_ListItemCenterAlign;
348         break;
349       case XFA_ATTRIBUTEENUM_Justify:
350         dwExtendedStyle |= FWL_STYLEEXT_CMB_EditJustified;
351         break;
352       case XFA_ATTRIBUTEENUM_JustifyAll:
353         break;
354       case XFA_ATTRIBUTEENUM_Radix:
355         break;
356       case XFA_ATTRIBUTEENUM_Right:
357         break;
358       default:
359         dwExtendedStyle |=
360             FWL_STYLEEXT_CMB_EditHNear | FWL_STYLEEXT_CMB_ListItemLeftAlign;
361         break;
362     }
363     int32_t iVert = para.GetVerticalAlign();
364     switch (iVert) {
365       case XFA_ATTRIBUTEENUM_Middle:
366         dwExtendedStyle |= FWL_STYLEEXT_CMB_EditVCenter;
367         break;
368       case XFA_ATTRIBUTEENUM_Bottom:
369         dwExtendedStyle |= FWL_STYLEEXT_CMB_EditVFar;
370         break;
371       default:
372         dwExtendedStyle |= FWL_STYLEEXT_CMB_EditVNear;
373         break;
374     }
375   }
376   return dwExtendedStyle;
377 }
UpdateFWLData()378 bool CXFA_FFComboBox::UpdateFWLData() {
379   if (!m_pNormalWidget) {
380     return false;
381   }
382   CFX_ArrayTemplate<int32_t> iSelArray;
383   m_pDataAcc->GetSelectedItems(iSelArray);
384   int32_t iSelCount = iSelArray.GetSize();
385   if (iSelCount > 0) {
386     ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(iSelArray[0]);
387   } else {
388     CFX_WideString wsText;
389     ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(-1);
390     m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Raw);
391     ((CFWL_ComboBox*)m_pNormalWidget)->SetEditText(wsText);
392   }
393   m_pNormalWidget->Update();
394   return true;
395 }
CanUndo()396 bool CXFA_FFComboBox::CanUndo() {
397   return m_pDataAcc->IsChoiceListAllowTextEntry() &&
398          ((CFWL_ComboBox*)m_pNormalWidget)->EditCanUndo();
399 }
CanRedo()400 bool CXFA_FFComboBox::CanRedo() {
401   return m_pDataAcc->IsChoiceListAllowTextEntry() &&
402          ((CFWL_ComboBox*)m_pNormalWidget)->EditCanRedo();
403 }
Undo()404 bool CXFA_FFComboBox::Undo() {
405   return m_pDataAcc->IsChoiceListAllowTextEntry() &&
406          ((CFWL_ComboBox*)m_pNormalWidget)->EditUndo();
407 }
Redo()408 bool CXFA_FFComboBox::Redo() {
409   return m_pDataAcc->IsChoiceListAllowTextEntry() &&
410          ((CFWL_ComboBox*)m_pNormalWidget)->EditRedo();
411 }
CanCopy()412 bool CXFA_FFComboBox::CanCopy() {
413   return ((CFWL_ComboBox*)m_pNormalWidget)->EditCanCopy();
414 }
CanCut()415 bool CXFA_FFComboBox::CanCut() {
416   if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
417     return false;
418   }
419   return m_pDataAcc->IsChoiceListAllowTextEntry() &&
420          ((CFWL_ComboBox*)m_pNormalWidget)->EditCanCut();
421 }
CanPaste()422 bool CXFA_FFComboBox::CanPaste() {
423   return m_pDataAcc->IsChoiceListAllowTextEntry() &&
424          (m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open);
425 }
CanSelectAll()426 bool CXFA_FFComboBox::CanSelectAll() {
427   return ((CFWL_ComboBox*)m_pNormalWidget)->EditCanSelectAll();
428 }
Copy(CFX_WideString & wsCopy)429 bool CXFA_FFComboBox::Copy(CFX_WideString& wsCopy) {
430   return ((CFWL_ComboBox*)m_pNormalWidget)->EditCopy(wsCopy);
431 }
Cut(CFX_WideString & wsCut)432 bool CXFA_FFComboBox::Cut(CFX_WideString& wsCut) {
433   return m_pDataAcc->IsChoiceListAllowTextEntry() &&
434          ((CFWL_ComboBox*)m_pNormalWidget)->EditCut(wsCut);
435 }
Paste(const CFX_WideString & wsPaste)436 bool CXFA_FFComboBox::Paste(const CFX_WideString& wsPaste) {
437   return m_pDataAcc->IsChoiceListAllowTextEntry() &&
438          ((CFWL_ComboBox*)m_pNormalWidget)->EditPaste(wsPaste);
439 }
SelectAll()440 void CXFA_FFComboBox::SelectAll() {
441   ((CFWL_ComboBox*)m_pNormalWidget)->EditSelectAll();
442 }
Delete()443 void CXFA_FFComboBox::Delete() {
444   ((CFWL_ComboBox*)m_pNormalWidget)->EditDelete();
445 }
DeSelect()446 void CXFA_FFComboBox::DeSelect() {
447   ((CFWL_ComboBox*)m_pNormalWidget)->EditDeSelect();
448 }
SetItemState(int32_t nIndex,bool bSelected)449 void CXFA_FFComboBox::SetItemState(int32_t nIndex, bool bSelected) {
450   if (bSelected) {
451     ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(nIndex);
452   } else {
453     ((CFWL_ComboBox*)m_pNormalWidget)->SetCurSel(-1);
454   }
455   m_pNormalWidget->Update();
456   AddInvalidateRect();
457 }
InsertItem(const CFX_WideStringC & wsLabel,int32_t nIndex)458 void CXFA_FFComboBox::InsertItem(const CFX_WideStringC& wsLabel,
459                                  int32_t nIndex) {
460   ((CFWL_ComboBox*)m_pNormalWidget)->AddString(wsLabel);
461   m_pNormalWidget->Update();
462   AddInvalidateRect();
463 }
DeleteItem(int32_t nIndex)464 void CXFA_FFComboBox::DeleteItem(int32_t nIndex) {
465   if (nIndex < 0) {
466     ((CFWL_ComboBox*)m_pNormalWidget)->RemoveAll();
467   } else {
468     ((CFWL_ComboBox*)m_pNormalWidget)->RemoveAt(nIndex);
469   }
470   m_pNormalWidget->Update();
471   AddInvalidateRect();
472 }
OnTextChanged(CFWL_Widget * pWidget,const CFX_WideString & wsChanged)473 void CXFA_FFComboBox::OnTextChanged(CFWL_Widget* pWidget,
474                                     const CFX_WideString& wsChanged) {
475   CXFA_EventParam eParam;
476   m_pDataAcc->GetValue(eParam.m_wsPrevText, XFA_VALUEPICTURE_Raw);
477   eParam.m_wsChange = wsChanged;
478   FWLEventSelChange(&eParam);
479 }
OnSelectChanged(CFWL_Widget * pWidget,bool bLButtonUp)480 void CXFA_FFComboBox::OnSelectChanged(CFWL_Widget* pWidget, bool bLButtonUp) {
481   CXFA_EventParam eParam;
482   m_pDataAcc->GetValue(eParam.m_wsPrevText, XFA_VALUEPICTURE_Raw);
483   FWLEventSelChange(&eParam);
484   if (m_pDataAcc->GetChoiceListCommitOn() == XFA_ATTRIBUTEENUM_Select &&
485       bLButtonUp) {
486     m_pDocView->SetFocusWidgetAcc(nullptr);
487   }
488 }
OnPreOpen(CFWL_Widget * pWidget)489 void CXFA_FFComboBox::OnPreOpen(CFWL_Widget* pWidget) {
490   CXFA_EventParam eParam;
491   eParam.m_eType = XFA_EVENT_PreOpen;
492   eParam.m_pTarget = m_pDataAcc;
493   m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_PreOpen, &eParam);
494 }
OnPostOpen(CFWL_Widget * pWidget)495 void CXFA_FFComboBox::OnPostOpen(CFWL_Widget* pWidget) {
496   CXFA_EventParam eParam;
497   eParam.m_eType = XFA_EVENT_PostOpen;
498   eParam.m_pTarget = m_pDataAcc;
499   m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_PostOpen, &eParam);
500 }
501 
OnProcessMessage(CFWL_Message * pMessage)502 void CXFA_FFComboBox::OnProcessMessage(CFWL_Message* pMessage) {
503   m_pOldDelegate->OnProcessMessage(pMessage);
504 }
505 
OnProcessEvent(CFWL_Event * pEvent)506 void CXFA_FFComboBox::OnProcessEvent(CFWL_Event* pEvent) {
507   CXFA_FFField::OnProcessEvent(pEvent);
508   switch (pEvent->GetType()) {
509     case CFWL_Event::Type::SelectChanged: {
510       CFWL_EventSelectChanged* postEvent =
511           static_cast<CFWL_EventSelectChanged*>(pEvent);
512       OnSelectChanged(m_pNormalWidget, postEvent->bLButtonUp);
513       break;
514     }
515     case CFWL_Event::Type::EditChanged: {
516       CFX_WideString wsChanged;
517       OnTextChanged(m_pNormalWidget, wsChanged);
518       break;
519     }
520     case CFWL_Event::Type::PreDropDown: {
521       OnPreOpen(m_pNormalWidget);
522       break;
523     }
524     case CFWL_Event::Type::PostDropDown: {
525       OnPostOpen(m_pNormalWidget);
526       break;
527     }
528     default:
529       break;
530   }
531   m_pOldDelegate->OnProcessEvent(pEvent);
532 }
533 
OnDrawWidget(CFX_Graphics * pGraphics,const CFX_Matrix * pMatrix)534 void CXFA_FFComboBox::OnDrawWidget(CFX_Graphics* pGraphics,
535                                    const CFX_Matrix* pMatrix) {
536   m_pOldDelegate->OnDrawWidget(pGraphics, pMatrix);
537 }
538