xref: /aosp_15_r20/external/pdfium/xfa/fxfa/cxfa_ffnotify.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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