1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffnotify.h"
8*3ac0a46fSAndroid Build Coastguard Worker
9*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
10*3ac0a46fSAndroid Build Coastguard Worker
11*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
12*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffapp.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffarc.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffbarcode.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffcheckbutton.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffcombobox.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdatetimeedit.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdoc.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdocview.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffexclgroup.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_fffield.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffimage.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffimageedit.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffline.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_fflistbox.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffnumericedit.h"
27*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffpageview.h"
28*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffpasswordedit.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffpushbutton.h"
30*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffrectangle.h"
31*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffsignature.h"
32*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_fftext.h"
33*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffwidget.h"
34*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffwidgethandler.h"
35*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_fwladapterwidgetmgr.h"
36*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_textlayout.h"
37*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_textprovider.h"
38*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
39*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_barcode.h"
40*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_binditems.h"
41*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_button.h"
42*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_checkbutton.h"
43*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_node.h"
44*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_passwordedit.h"
45*3ac0a46fSAndroid Build Coastguard Worker
CXFA_FFNotify(CXFA_FFDoc * pDoc)46*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFNotify::CXFA_FFNotify(CXFA_FFDoc* pDoc) : m_pDoc(pDoc) {}
47*3ac0a46fSAndroid Build Coastguard Worker
48*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFNotify::~CXFA_FFNotify() = default;
49*3ac0a46fSAndroid Build Coastguard Worker
Trace(cppgc::Visitor * visitor) const50*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::Trace(cppgc::Visitor* visitor) const {
51*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(m_pDoc);
52*3ac0a46fSAndroid Build Coastguard Worker }
53*3ac0a46fSAndroid Build Coastguard Worker
OnPageViewEvent(CXFA_ViewLayoutItem * pSender,CXFA_FFDoc::PageViewEvent eEvent)54*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::OnPageViewEvent(CXFA_ViewLayoutItem* pSender,
55*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDoc::PageViewEvent eEvent) {
56*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pSender->GetLayout());
57*3ac0a46fSAndroid Build Coastguard Worker if (pDocView)
58*3ac0a46fSAndroid Build Coastguard Worker pDocView->OnPageViewEvent(pSender, eEvent);
59*3ac0a46fSAndroid Build Coastguard Worker }
60*3ac0a46fSAndroid Build Coastguard Worker
OnWidgetListItemAdded(CXFA_Node * pSender,const WideString & wsLabel,int32_t iIndex)61*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::OnWidgetListItemAdded(CXFA_Node* pSender,
62*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsLabel,
63*3ac0a46fSAndroid Build Coastguard Worker int32_t iIndex) {
64*3ac0a46fSAndroid Build Coastguard Worker if (pSender->GetFFWidgetType() != XFA_FFWidgetType::kChoiceList)
65*3ac0a46fSAndroid Build Coastguard Worker return;
66*3ac0a46fSAndroid Build Coastguard Worker
67*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* pWidget = m_pDoc->GetDocView()->GetWidgetForNode(pSender);
68*3ac0a46fSAndroid Build Coastguard Worker for (; pWidget; pWidget = pWidget->GetNextFFWidget()) {
69*3ac0a46fSAndroid Build Coastguard Worker if (pWidget->IsLoaded())
70*3ac0a46fSAndroid Build Coastguard Worker ToDropDown(ToField(pWidget))->InsertItem(wsLabel, iIndex);
71*3ac0a46fSAndroid Build Coastguard Worker }
72*3ac0a46fSAndroid Build Coastguard Worker }
73*3ac0a46fSAndroid Build Coastguard Worker
OnWidgetListItemRemoved(CXFA_Node * pSender,int32_t iIndex)74*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::OnWidgetListItemRemoved(CXFA_Node* pSender,
75*3ac0a46fSAndroid Build Coastguard Worker int32_t iIndex) {
76*3ac0a46fSAndroid Build Coastguard Worker if (pSender->GetFFWidgetType() != XFA_FFWidgetType::kChoiceList)
77*3ac0a46fSAndroid Build Coastguard Worker return;
78*3ac0a46fSAndroid Build Coastguard Worker
79*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* pWidget = m_pDoc->GetDocView()->GetWidgetForNode(pSender);
80*3ac0a46fSAndroid Build Coastguard Worker for (; pWidget; pWidget = pWidget->GetNextFFWidget()) {
81*3ac0a46fSAndroid Build Coastguard Worker if (pWidget->IsLoaded())
82*3ac0a46fSAndroid Build Coastguard Worker ToDropDown(ToField(pWidget))->DeleteItem(iIndex);
83*3ac0a46fSAndroid Build Coastguard Worker }
84*3ac0a46fSAndroid Build Coastguard Worker }
85*3ac0a46fSAndroid Build Coastguard Worker
OnCreateViewLayoutItem(CXFA_Node * pNode)86*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFPageView* CXFA_FFNotify::OnCreateViewLayoutItem(CXFA_Node* pNode) {
87*3ac0a46fSAndroid Build Coastguard Worker if (pNode->GetElementType() != XFA_Element::PageArea)
88*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
89*3ac0a46fSAndroid Build Coastguard Worker
90*3ac0a46fSAndroid Build Coastguard Worker auto* pLayout = CXFA_LayoutProcessor::FromDocument(m_pDoc->GetXFADoc());
91*3ac0a46fSAndroid Build Coastguard Worker return cppgc::MakeGarbageCollected<CXFA_FFPageView>(
92*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), m_pDoc->GetDocView(pLayout),
93*3ac0a46fSAndroid Build Coastguard Worker pNode);
94*3ac0a46fSAndroid Build Coastguard Worker }
95*3ac0a46fSAndroid Build Coastguard Worker
OnCreateContentLayoutItem(CXFA_Node * pNode)96*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFNotify::OnCreateContentLayoutItem(CXFA_Node* pNode) {
97*3ac0a46fSAndroid Build Coastguard Worker DCHECK(pNode->GetElementType() != XFA_Element::ContentArea);
98*3ac0a46fSAndroid Build Coastguard Worker DCHECK(pNode->GetElementType() != XFA_Element::PageArea);
99*3ac0a46fSAndroid Build Coastguard Worker
100*3ac0a46fSAndroid Build Coastguard Worker // We only need to create the widget for certain types of objects.
101*3ac0a46fSAndroid Build Coastguard Worker if (!pNode->HasCreatedUIWidget())
102*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
103*3ac0a46fSAndroid Build Coastguard Worker
104*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* pWidget = nullptr;
105*3ac0a46fSAndroid Build Coastguard Worker switch (pNode->GetFFWidgetType()) {
106*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kBarcode: {
107*3ac0a46fSAndroid Build Coastguard Worker auto* child = CXFA_Barcode::FromNode(pNode->GetUIChildNode());
108*3ac0a46fSAndroid Build Coastguard Worker if (!child)
109*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
110*3ac0a46fSAndroid Build Coastguard Worker
111*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFBarcode>(
112*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode, child);
113*3ac0a46fSAndroid Build Coastguard Worker break;
114*3ac0a46fSAndroid Build Coastguard Worker }
115*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kButton: {
116*3ac0a46fSAndroid Build Coastguard Worker auto* child = CXFA_Button::FromNode(pNode->GetUIChildNode());
117*3ac0a46fSAndroid Build Coastguard Worker if (!child)
118*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
119*3ac0a46fSAndroid Build Coastguard Worker
120*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFPushButton>(
121*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode, child);
122*3ac0a46fSAndroid Build Coastguard Worker break;
123*3ac0a46fSAndroid Build Coastguard Worker }
124*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kCheckButton: {
125*3ac0a46fSAndroid Build Coastguard Worker auto* child = CXFA_CheckButton::FromNode(pNode->GetUIChildNode());
126*3ac0a46fSAndroid Build Coastguard Worker if (!child)
127*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
128*3ac0a46fSAndroid Build Coastguard Worker
129*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFCheckButton>(
130*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode, child);
131*3ac0a46fSAndroid Build Coastguard Worker break;
132*3ac0a46fSAndroid Build Coastguard Worker }
133*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kChoiceList: {
134*3ac0a46fSAndroid Build Coastguard Worker if (pNode->IsListBox()) {
135*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFListBox>(
136*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
137*3ac0a46fSAndroid Build Coastguard Worker } else {
138*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFComboBox>(
139*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
140*3ac0a46fSAndroid Build Coastguard Worker }
141*3ac0a46fSAndroid Build Coastguard Worker break;
142*3ac0a46fSAndroid Build Coastguard Worker }
143*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kDateTimeEdit:
144*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFDateTimeEdit>(
145*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
146*3ac0a46fSAndroid Build Coastguard Worker break;
147*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kImageEdit:
148*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFImageEdit>(
149*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
150*3ac0a46fSAndroid Build Coastguard Worker break;
151*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kNumericEdit:
152*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFNumericEdit>(
153*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
154*3ac0a46fSAndroid Build Coastguard Worker break;
155*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kPasswordEdit: {
156*3ac0a46fSAndroid Build Coastguard Worker auto* child = CXFA_PasswordEdit::FromNode(pNode->GetUIChildNode());
157*3ac0a46fSAndroid Build Coastguard Worker if (!child)
158*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
159*3ac0a46fSAndroid Build Coastguard Worker
160*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFPasswordEdit>(
161*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode, child);
162*3ac0a46fSAndroid Build Coastguard Worker break;
163*3ac0a46fSAndroid Build Coastguard Worker }
164*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kSignature:
165*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFSignature>(
166*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
167*3ac0a46fSAndroid Build Coastguard Worker break;
168*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kTextEdit:
169*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFTextEdit>(
170*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
171*3ac0a46fSAndroid Build Coastguard Worker break;
172*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kArc:
173*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFArc>(
174*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
175*3ac0a46fSAndroid Build Coastguard Worker break;
176*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kLine:
177*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFLine>(
178*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
179*3ac0a46fSAndroid Build Coastguard Worker break;
180*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kRectangle:
181*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFRectangle>(
182*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
183*3ac0a46fSAndroid Build Coastguard Worker break;
184*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kText:
185*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFText>(
186*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
187*3ac0a46fSAndroid Build Coastguard Worker break;
188*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kImage:
189*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFImage>(
190*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
191*3ac0a46fSAndroid Build Coastguard Worker break;
192*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kSubform:
193*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFWidget>(
194*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
195*3ac0a46fSAndroid Build Coastguard Worker break;
196*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kExclGroup:
197*3ac0a46fSAndroid Build Coastguard Worker pWidget = cppgc::MakeGarbageCollected<CXFA_FFExclGroup>(
198*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetHeap()->GetAllocationHandle(), pNode);
199*3ac0a46fSAndroid Build Coastguard Worker break;
200*3ac0a46fSAndroid Build Coastguard Worker case XFA_FFWidgetType::kNone:
201*3ac0a46fSAndroid Build Coastguard Worker return nullptr;
202*3ac0a46fSAndroid Build Coastguard Worker }
203*3ac0a46fSAndroid Build Coastguard Worker auto* pLayout = CXFA_LayoutProcessor::FromDocument(m_pDoc->GetXFADoc());
204*3ac0a46fSAndroid Build Coastguard Worker pWidget->SetDocView(m_pDoc->GetDocView(pLayout));
205*3ac0a46fSAndroid Build Coastguard Worker return pWidget;
206*3ac0a46fSAndroid Build Coastguard Worker }
207*3ac0a46fSAndroid Build Coastguard Worker
StartFieldDrawLayout(CXFA_Node * pItem,float * pCalcWidth,float * pCalcHeight)208*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::StartFieldDrawLayout(CXFA_Node* pItem,
209*3ac0a46fSAndroid Build Coastguard Worker float* pCalcWidth,
210*3ac0a46fSAndroid Build Coastguard Worker float* pCalcHeight) {
211*3ac0a46fSAndroid Build Coastguard Worker pItem->StartWidgetLayout(m_pDoc.Get(), pCalcWidth, pCalcHeight);
212*3ac0a46fSAndroid Build Coastguard Worker }
213*3ac0a46fSAndroid Build Coastguard Worker
RunScript(CXFA_Script * script,CXFA_Node * item)214*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFNotify::RunScript(CXFA_Script* script, CXFA_Node* item) {
215*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
216*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
217*3ac0a46fSAndroid Build Coastguard Worker return false;
218*3ac0a46fSAndroid Build Coastguard Worker
219*3ac0a46fSAndroid Build Coastguard Worker CXFA_EventParam EventParam;
220*3ac0a46fSAndroid Build Coastguard Worker EventParam.m_eType = XFA_EVENT_Unknown;
221*3ac0a46fSAndroid Build Coastguard Worker EventParam.m_bTargeted = false;
222*3ac0a46fSAndroid Build Coastguard Worker
223*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError iRet;
224*3ac0a46fSAndroid Build Coastguard Worker bool bRet;
225*3ac0a46fSAndroid Build Coastguard Worker std::tie(iRet, bRet) = item->ExecuteBoolScript(pDocView, script, &EventParam);
226*3ac0a46fSAndroid Build Coastguard Worker return iRet == XFA_EventError::kSuccess && bRet;
227*3ac0a46fSAndroid Build Coastguard Worker }
228*3ac0a46fSAndroid Build Coastguard Worker
ExecEventByDeepFirst(CXFA_Node * pFormNode,XFA_EVENTTYPE eEventType,bool bIsFormReady,bool bRecursive)229*3ac0a46fSAndroid Build Coastguard Worker XFA_EventError CXFA_FFNotify::ExecEventByDeepFirst(CXFA_Node* pFormNode,
230*3ac0a46fSAndroid Build Coastguard Worker XFA_EVENTTYPE eEventType,
231*3ac0a46fSAndroid Build Coastguard Worker bool bIsFormReady,
232*3ac0a46fSAndroid Build Coastguard Worker bool bRecursive) {
233*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
234*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
235*3ac0a46fSAndroid Build Coastguard Worker return XFA_EventError::kNotExist;
236*3ac0a46fSAndroid Build Coastguard Worker return pDocView->ExecEventActivityByDeepFirst(pFormNode, eEventType,
237*3ac0a46fSAndroid Build Coastguard Worker bIsFormReady, bRecursive);
238*3ac0a46fSAndroid Build Coastguard Worker }
239*3ac0a46fSAndroid Build Coastguard Worker
AddCalcValidate(CXFA_Node * pNode)240*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::AddCalcValidate(CXFA_Node* pNode) {
241*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
242*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
243*3ac0a46fSAndroid Build Coastguard Worker return;
244*3ac0a46fSAndroid Build Coastguard Worker
245*3ac0a46fSAndroid Build Coastguard Worker pDocView->AddCalculateNode(pNode);
246*3ac0a46fSAndroid Build Coastguard Worker pDocView->AddValidateNode(pNode);
247*3ac0a46fSAndroid Build Coastguard Worker }
248*3ac0a46fSAndroid Build Coastguard Worker
GetAppProvider()249*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFApp::CallbackIface* CXFA_FFNotify::GetAppProvider() {
250*3ac0a46fSAndroid Build Coastguard Worker return m_pDoc->GetApp()->GetAppProvider();
251*3ac0a46fSAndroid Build Coastguard Worker }
252*3ac0a46fSAndroid Build Coastguard Worker
HandleWidgetEvent(CXFA_Node * pNode,CXFA_EventParam * pParam)253*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::HandleWidgetEvent(CXFA_Node* pNode,
254*3ac0a46fSAndroid Build Coastguard Worker CXFA_EventParam* pParam) {
255*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
256*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
257*3ac0a46fSAndroid Build Coastguard Worker return;
258*3ac0a46fSAndroid Build Coastguard Worker
259*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidgetHandler* pHandler = pDocView->GetWidgetHandler();
260*3ac0a46fSAndroid Build Coastguard Worker if (!pHandler)
261*3ac0a46fSAndroid Build Coastguard Worker return;
262*3ac0a46fSAndroid Build Coastguard Worker
263*3ac0a46fSAndroid Build Coastguard Worker pHandler->ProcessEvent(pNode, pParam);
264*3ac0a46fSAndroid Build Coastguard Worker }
265*3ac0a46fSAndroid Build Coastguard Worker
OpenDropDownList(CXFA_Node * pNode)266*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::OpenDropDownList(CXFA_Node* pNode) {
267*3ac0a46fSAndroid Build Coastguard Worker auto* pDocLayout = CXFA_LayoutProcessor::FromDocument(m_pDoc->GetXFADoc());
268*3ac0a46fSAndroid Build Coastguard Worker CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
269*3ac0a46fSAndroid Build Coastguard Worker if (!pLayoutItem)
270*3ac0a46fSAndroid Build Coastguard Worker return;
271*3ac0a46fSAndroid Build Coastguard Worker
272*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* hWidget = CXFA_FFWidget::FromLayoutItem(pLayoutItem);
273*3ac0a46fSAndroid Build Coastguard Worker if (!hWidget)
274*3ac0a46fSAndroid Build Coastguard Worker return;
275*3ac0a46fSAndroid Build Coastguard Worker
276*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDoc* hDoc = GetFFDoc();
277*3ac0a46fSAndroid Build Coastguard Worker hDoc->SetFocusWidget(hWidget);
278*3ac0a46fSAndroid Build Coastguard Worker if (hWidget->GetNode()->GetFFWidgetType() != XFA_FFWidgetType::kChoiceList)
279*3ac0a46fSAndroid Build Coastguard Worker return;
280*3ac0a46fSAndroid Build Coastguard Worker
281*3ac0a46fSAndroid Build Coastguard Worker if (!hWidget->IsLoaded())
282*3ac0a46fSAndroid Build Coastguard Worker return;
283*3ac0a46fSAndroid Build Coastguard Worker
284*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDropDown* pDropDown = ToDropDown(ToField(hWidget));
285*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFComboBox* pComboBox = ToComboBox(pDropDown);
286*3ac0a46fSAndroid Build Coastguard Worker if (!pComboBox)
287*3ac0a46fSAndroid Build Coastguard Worker return;
288*3ac0a46fSAndroid Build Coastguard Worker
289*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView::UpdateScope scope(m_pDoc->GetDocView());
290*3ac0a46fSAndroid Build Coastguard Worker pComboBox->OpenDropDownList();
291*3ac0a46fSAndroid Build Coastguard Worker }
292*3ac0a46fSAndroid Build Coastguard Worker
ResetData(CXFA_Node * pNode)293*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::ResetData(CXFA_Node* pNode) {
294*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
295*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
296*3ac0a46fSAndroid Build Coastguard Worker return;
297*3ac0a46fSAndroid Build Coastguard Worker
298*3ac0a46fSAndroid Build Coastguard Worker pDocView->ResetNode(pNode);
299*3ac0a46fSAndroid Build Coastguard Worker }
300*3ac0a46fSAndroid Build Coastguard Worker
GetLayoutStatus()301*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView::LayoutStatus CXFA_FFNotify::GetLayoutStatus() {
302*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
303*3ac0a46fSAndroid Build Coastguard Worker return pDocView ? pDocView->GetLayoutStatus()
304*3ac0a46fSAndroid Build Coastguard Worker : CXFA_FFDocView::LayoutStatus::kNone;
305*3ac0a46fSAndroid Build Coastguard Worker }
306*3ac0a46fSAndroid Build Coastguard Worker
RunNodeInitialize(CXFA_Node * pNode)307*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::RunNodeInitialize(CXFA_Node* pNode) {
308*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
309*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
310*3ac0a46fSAndroid Build Coastguard Worker return;
311*3ac0a46fSAndroid Build Coastguard Worker
312*3ac0a46fSAndroid Build Coastguard Worker pDocView->AddNewFormNode(pNode);
313*3ac0a46fSAndroid Build Coastguard Worker }
314*3ac0a46fSAndroid Build Coastguard Worker
RunSubformIndexChange(CXFA_Subform * pSubformNode)315*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::RunSubformIndexChange(CXFA_Subform* pSubformNode) {
316*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
317*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
318*3ac0a46fSAndroid Build Coastguard Worker return;
319*3ac0a46fSAndroid Build Coastguard Worker
320*3ac0a46fSAndroid Build Coastguard Worker pDocView->AddIndexChangedSubform(pSubformNode);
321*3ac0a46fSAndroid Build Coastguard Worker }
322*3ac0a46fSAndroid Build Coastguard Worker
GetFocusWidgetNode()323*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* CXFA_FFNotify::GetFocusWidgetNode() {
324*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
325*3ac0a46fSAndroid Build Coastguard Worker return pDocView ? pDocView->GetFocusNode() : nullptr;
326*3ac0a46fSAndroid Build Coastguard Worker }
327*3ac0a46fSAndroid Build Coastguard Worker
SetFocusWidgetNode(CXFA_Node * pNode)328*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::SetFocusWidgetNode(CXFA_Node* pNode) {
329*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
330*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
331*3ac0a46fSAndroid Build Coastguard Worker return;
332*3ac0a46fSAndroid Build Coastguard Worker pDocView->SetFocusNode(pNode);
333*3ac0a46fSAndroid Build Coastguard Worker }
334*3ac0a46fSAndroid Build Coastguard Worker
OnNodeReady(CXFA_Node * pNode)335*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::OnNodeReady(CXFA_Node* pNode) {
336*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
337*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
338*3ac0a46fSAndroid Build Coastguard Worker return;
339*3ac0a46fSAndroid Build Coastguard Worker
340*3ac0a46fSAndroid Build Coastguard Worker if (pNode->HasCreatedUIWidget()) {
341*3ac0a46fSAndroid Build Coastguard Worker pNode->SetWidgetReady();
342*3ac0a46fSAndroid Build Coastguard Worker return;
343*3ac0a46fSAndroid Build Coastguard Worker }
344*3ac0a46fSAndroid Build Coastguard Worker
345*3ac0a46fSAndroid Build Coastguard Worker switch (pNode->GetElementType()) {
346*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::BindItems:
347*3ac0a46fSAndroid Build Coastguard Worker pDocView->AddBindItem(static_cast<CXFA_BindItems*>(pNode));
348*3ac0a46fSAndroid Build Coastguard Worker break;
349*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Validate:
350*3ac0a46fSAndroid Build Coastguard Worker pNode->SetFlag(XFA_NodeFlag::kNeedsInitApp);
351*3ac0a46fSAndroid Build Coastguard Worker break;
352*3ac0a46fSAndroid Build Coastguard Worker default:
353*3ac0a46fSAndroid Build Coastguard Worker break;
354*3ac0a46fSAndroid Build Coastguard Worker }
355*3ac0a46fSAndroid Build Coastguard Worker }
356*3ac0a46fSAndroid Build Coastguard Worker
OnValueChanging(CXFA_Node * pSender,XFA_Attribute eAttr)357*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::OnValueChanging(CXFA_Node* pSender, XFA_Attribute eAttr) {
358*3ac0a46fSAndroid Build Coastguard Worker if (eAttr != XFA_Attribute::Presence)
359*3ac0a46fSAndroid Build Coastguard Worker return;
360*3ac0a46fSAndroid Build Coastguard Worker if (pSender->GetPacketType() == XFA_PacketType::Datasets)
361*3ac0a46fSAndroid Build Coastguard Worker return;
362*3ac0a46fSAndroid Build Coastguard Worker if (!pSender->IsFormContainer())
363*3ac0a46fSAndroid Build Coastguard Worker return;
364*3ac0a46fSAndroid Build Coastguard Worker
365*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
366*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
367*3ac0a46fSAndroid Build Coastguard Worker return;
368*3ac0a46fSAndroid Build Coastguard Worker if (pDocView->GetLayoutStatus() != CXFA_FFDocView::LayoutStatus::kEnd)
369*3ac0a46fSAndroid Build Coastguard Worker return;
370*3ac0a46fSAndroid Build Coastguard Worker
371*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* pWidget = m_pDoc->GetDocView()->GetWidgetForNode(pSender);
372*3ac0a46fSAndroid Build Coastguard Worker for (; pWidget; pWidget = pWidget->GetNextFFWidget()) {
373*3ac0a46fSAndroid Build Coastguard Worker if (pWidget->IsLoaded())
374*3ac0a46fSAndroid Build Coastguard Worker pWidget->InvalidateRect();
375*3ac0a46fSAndroid Build Coastguard Worker }
376*3ac0a46fSAndroid Build Coastguard Worker }
377*3ac0a46fSAndroid Build Coastguard Worker
OnValueChanged(CXFA_Node * pSender,XFA_Attribute eAttr,CXFA_Node * pParentNode,CXFA_Node * pWidgetNode)378*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::OnValueChanged(CXFA_Node* pSender,
379*3ac0a46fSAndroid Build Coastguard Worker XFA_Attribute eAttr,
380*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pParentNode,
381*3ac0a46fSAndroid Build Coastguard Worker CXFA_Node* pWidgetNode) {
382*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
383*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
384*3ac0a46fSAndroid Build Coastguard Worker return;
385*3ac0a46fSAndroid Build Coastguard Worker
386*3ac0a46fSAndroid Build Coastguard Worker if (pSender->GetPacketType() != XFA_PacketType::Form) {
387*3ac0a46fSAndroid Build Coastguard Worker if (eAttr == XFA_Attribute::Value)
388*3ac0a46fSAndroid Build Coastguard Worker pDocView->AddCalculateNodeNotify(pSender);
389*3ac0a46fSAndroid Build Coastguard Worker return;
390*3ac0a46fSAndroid Build Coastguard Worker }
391*3ac0a46fSAndroid Build Coastguard Worker
392*3ac0a46fSAndroid Build Coastguard Worker XFA_Element eType = pParentNode->GetElementType();
393*3ac0a46fSAndroid Build Coastguard Worker bool bIsContainerNode = pParentNode->IsContainerNode();
394*3ac0a46fSAndroid Build Coastguard Worker bool bUpdateProperty = false;
395*3ac0a46fSAndroid Build Coastguard Worker pDocView->SetChangeMark();
396*3ac0a46fSAndroid Build Coastguard Worker switch (eType) {
397*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Caption: {
398*3ac0a46fSAndroid Build Coastguard Worker CXFA_TextLayout* pCapOut = pWidgetNode->GetCaptionTextLayout();
399*3ac0a46fSAndroid Build Coastguard Worker if (!pCapOut)
400*3ac0a46fSAndroid Build Coastguard Worker return;
401*3ac0a46fSAndroid Build Coastguard Worker
402*3ac0a46fSAndroid Build Coastguard Worker pCapOut->Unload();
403*3ac0a46fSAndroid Build Coastguard Worker break;
404*3ac0a46fSAndroid Build Coastguard Worker }
405*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Ui:
406*3ac0a46fSAndroid Build Coastguard Worker case XFA_Element::Para:
407*3ac0a46fSAndroid Build Coastguard Worker bUpdateProperty = true;
408*3ac0a46fSAndroid Build Coastguard Worker break;
409*3ac0a46fSAndroid Build Coastguard Worker default:
410*3ac0a46fSAndroid Build Coastguard Worker break;
411*3ac0a46fSAndroid Build Coastguard Worker }
412*3ac0a46fSAndroid Build Coastguard Worker if (bIsContainerNode && eAttr == XFA_Attribute::Access)
413*3ac0a46fSAndroid Build Coastguard Worker bUpdateProperty = true;
414*3ac0a46fSAndroid Build Coastguard Worker
415*3ac0a46fSAndroid Build Coastguard Worker if (eAttr == XFA_Attribute::Value) {
416*3ac0a46fSAndroid Build Coastguard Worker pDocView->AddCalculateNodeNotify(pSender);
417*3ac0a46fSAndroid Build Coastguard Worker if (eType == XFA_Element::Value || bIsContainerNode) {
418*3ac0a46fSAndroid Build Coastguard Worker if (bIsContainerNode) {
419*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetDocView()->UpdateUIDisplay(pWidgetNode, nullptr);
420*3ac0a46fSAndroid Build Coastguard Worker pDocView->AddCalculateNode(pWidgetNode);
421*3ac0a46fSAndroid Build Coastguard Worker pDocView->AddValidateNode(pWidgetNode);
422*3ac0a46fSAndroid Build Coastguard Worker } else if (pWidgetNode->GetParent()->GetElementType() ==
423*3ac0a46fSAndroid Build Coastguard Worker XFA_Element::ExclGroup) {
424*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetDocView()->UpdateUIDisplay(pWidgetNode, nullptr);
425*3ac0a46fSAndroid Build Coastguard Worker }
426*3ac0a46fSAndroid Build Coastguard Worker return;
427*3ac0a46fSAndroid Build Coastguard Worker }
428*3ac0a46fSAndroid Build Coastguard Worker }
429*3ac0a46fSAndroid Build Coastguard Worker
430*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* pWidget = m_pDoc->GetDocView()->GetWidgetForNode(pWidgetNode);
431*3ac0a46fSAndroid Build Coastguard Worker for (; pWidget; pWidget = pWidget->GetNextFFWidget()) {
432*3ac0a46fSAndroid Build Coastguard Worker if (!pWidget->IsLoaded())
433*3ac0a46fSAndroid Build Coastguard Worker continue;
434*3ac0a46fSAndroid Build Coastguard Worker
435*3ac0a46fSAndroid Build Coastguard Worker if (bUpdateProperty)
436*3ac0a46fSAndroid Build Coastguard Worker pWidget->UpdateWidgetProperty();
437*3ac0a46fSAndroid Build Coastguard Worker pWidget->PerformLayout();
438*3ac0a46fSAndroid Build Coastguard Worker pWidget->InvalidateRect();
439*3ac0a46fSAndroid Build Coastguard Worker }
440*3ac0a46fSAndroid Build Coastguard Worker }
441*3ac0a46fSAndroid Build Coastguard Worker
OnContainerChanged()442*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::OnContainerChanged() {
443*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->GetXFADoc()->GetLayoutProcessor()->SetHasChangedContainer();
444*3ac0a46fSAndroid Build Coastguard Worker }
445*3ac0a46fSAndroid Build Coastguard Worker
OnChildAdded(CXFA_Node * pSender)446*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::OnChildAdded(CXFA_Node* pSender) {
447*3ac0a46fSAndroid Build Coastguard Worker if (!pSender->IsFormContainer())
448*3ac0a46fSAndroid Build Coastguard Worker return;
449*3ac0a46fSAndroid Build Coastguard Worker
450*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
451*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
452*3ac0a46fSAndroid Build Coastguard Worker return;
453*3ac0a46fSAndroid Build Coastguard Worker
454*3ac0a46fSAndroid Build Coastguard Worker const bool bLayoutReady =
455*3ac0a46fSAndroid Build Coastguard Worker !pDocView->InLayoutStatus() &&
456*3ac0a46fSAndroid Build Coastguard Worker pDocView->GetLayoutStatus() == CXFA_FFDocView::LayoutStatus::kEnd;
457*3ac0a46fSAndroid Build Coastguard Worker if (bLayoutReady)
458*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->SetChangeMark();
459*3ac0a46fSAndroid Build Coastguard Worker }
460*3ac0a46fSAndroid Build Coastguard Worker
OnChildRemoved()461*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::OnChildRemoved() {
462*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView();
463*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
464*3ac0a46fSAndroid Build Coastguard Worker return;
465*3ac0a46fSAndroid Build Coastguard Worker
466*3ac0a46fSAndroid Build Coastguard Worker const bool bLayoutReady =
467*3ac0a46fSAndroid Build Coastguard Worker !pDocView->InLayoutStatus() &&
468*3ac0a46fSAndroid Build Coastguard Worker pDocView->GetLayoutStatus() == CXFA_FFDocView::LayoutStatus::kEnd;
469*3ac0a46fSAndroid Build Coastguard Worker if (bLayoutReady)
470*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->SetChangeMark();
471*3ac0a46fSAndroid Build Coastguard Worker }
472*3ac0a46fSAndroid Build Coastguard Worker
OnLayoutItemAdded(CXFA_LayoutProcessor * pLayout,CXFA_LayoutItem * pSender,int32_t iPageIdx,Mask<XFA_WidgetStatus> dwStatus)473*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::OnLayoutItemAdded(CXFA_LayoutProcessor* pLayout,
474*3ac0a46fSAndroid Build Coastguard Worker CXFA_LayoutItem* pSender,
475*3ac0a46fSAndroid Build Coastguard Worker int32_t iPageIdx,
476*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_WidgetStatus> dwStatus) {
477*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout);
478*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
479*3ac0a46fSAndroid Build Coastguard Worker return;
480*3ac0a46fSAndroid Build Coastguard Worker
481*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* pWidget = CXFA_FFWidget::FromLayoutItem(pSender);
482*3ac0a46fSAndroid Build Coastguard Worker if (!pWidget)
483*3ac0a46fSAndroid Build Coastguard Worker return;
484*3ac0a46fSAndroid Build Coastguard Worker
485*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFPageView* pNewPageView = pDocView->GetPageView(iPageIdx);
486*3ac0a46fSAndroid Build Coastguard Worker constexpr Mask<XFA_WidgetStatus> kRemove{XFA_WidgetStatus::kVisible,
487*3ac0a46fSAndroid Build Coastguard Worker XFA_WidgetStatus::kViewable,
488*3ac0a46fSAndroid Build Coastguard Worker XFA_WidgetStatus::kPrintable};
489*3ac0a46fSAndroid Build Coastguard Worker pWidget->ModifyStatus(dwStatus, kRemove);
490*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFPageView* pPrePageView = pWidget->GetPageView();
491*3ac0a46fSAndroid Build Coastguard Worker if (pPrePageView != pNewPageView ||
492*3ac0a46fSAndroid Build Coastguard Worker dwStatus.TestAll(
493*3ac0a46fSAndroid Build Coastguard Worker {XFA_WidgetStatus::kVisible, XFA_WidgetStatus::kViewable})) {
494*3ac0a46fSAndroid Build Coastguard Worker pWidget->SetPageView(pNewPageView);
495*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->WidgetPostAdd(pWidget);
496*3ac0a46fSAndroid Build Coastguard Worker }
497*3ac0a46fSAndroid Build Coastguard Worker if (pDocView->GetLayoutStatus() != CXFA_FFDocView::LayoutStatus::kEnd ||
498*3ac0a46fSAndroid Build Coastguard Worker !(dwStatus & XFA_WidgetStatus::kVisible)) {
499*3ac0a46fSAndroid Build Coastguard Worker return;
500*3ac0a46fSAndroid Build Coastguard Worker }
501*3ac0a46fSAndroid Build Coastguard Worker if (pWidget->IsLoaded()) {
502*3ac0a46fSAndroid Build Coastguard Worker if (pWidget->GetWidgetRect() != pWidget->RecacheWidgetRect())
503*3ac0a46fSAndroid Build Coastguard Worker pWidget->PerformLayout();
504*3ac0a46fSAndroid Build Coastguard Worker } else {
505*3ac0a46fSAndroid Build Coastguard Worker pWidget->LoadWidget();
506*3ac0a46fSAndroid Build Coastguard Worker }
507*3ac0a46fSAndroid Build Coastguard Worker pWidget->InvalidateRect();
508*3ac0a46fSAndroid Build Coastguard Worker }
509*3ac0a46fSAndroid Build Coastguard Worker
OnLayoutItemRemoving(CXFA_LayoutProcessor * pLayout,CXFA_LayoutItem * pSender)510*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNotify::OnLayoutItemRemoving(CXFA_LayoutProcessor* pLayout,
511*3ac0a46fSAndroid Build Coastguard Worker CXFA_LayoutItem* pSender) {
512*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* pDocView = m_pDoc->GetDocView(pLayout);
513*3ac0a46fSAndroid Build Coastguard Worker if (!pDocView)
514*3ac0a46fSAndroid Build Coastguard Worker return;
515*3ac0a46fSAndroid Build Coastguard Worker
516*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* pWidget = CXFA_FFWidget::FromLayoutItem(pSender);
517*3ac0a46fSAndroid Build Coastguard Worker if (!pWidget)
518*3ac0a46fSAndroid Build Coastguard Worker return;
519*3ac0a46fSAndroid Build Coastguard Worker
520*3ac0a46fSAndroid Build Coastguard Worker pDocView->DeleteLayoutItem(pWidget);
521*3ac0a46fSAndroid Build Coastguard Worker m_pDoc->WidgetPreRemove(pWidget);
522*3ac0a46fSAndroid Build Coastguard Worker pWidget->InvalidateRect();
523*3ac0a46fSAndroid Build Coastguard Worker }
524