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