14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffdocview.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_extension.h"
10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/cfxjse_engine.h"
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_object.h"
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h"
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h"
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffapp.h"
15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffbarcode.h"
16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffcheckbutton.h"
17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffdoc.h"
18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffdraw.h"
19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffexclgroup.h"
20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_fffield.h"
21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffimage.h"
22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffimageedit.h"
23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffpageview.h"
24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffpushbutton.h"
25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffsignature.h"
26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffsubform.h"
27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_fftext.h"
28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffwidget.h"
29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffwidgethandler.h"
30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_fwladapterwidgetmgr.h"
31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_textprovider.h"
32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_widgetacciterator.h"
33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_acrobat.h"
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_binditems.h"
35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_calculate.h"
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_layoutprocessor.h"
37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_pageset.h"
38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_present.h"
39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_subform.h"
40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_validate.h"
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_resolvenode_rs.h"
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst XFA_AttributeEnum gs_EventActivity[] = {
44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::Click,      XFA_AttributeEnum::Change,
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::DocClose,   XFA_AttributeEnum::DocReady,
46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::Enter,      XFA_AttributeEnum::Exit,
47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::Full,       XFA_AttributeEnum::IndexChange,
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::Initialize, XFA_AttributeEnum::MouseDown,
49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::MouseEnter, XFA_AttributeEnum::MouseExit,
50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::MouseUp,    XFA_AttributeEnum::PostExecute,
51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::PostOpen,   XFA_AttributeEnum::PostPrint,
52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::PostSave,   XFA_AttributeEnum::PostSign,
53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::PostSubmit, XFA_AttributeEnum::PreExecute,
54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::PreOpen,    XFA_AttributeEnum::PrePrint,
55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::PreSave,    XFA_AttributeEnum::PreSign,
56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::PreSubmit,  XFA_AttributeEnum::Ready,
57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum::Unknown,
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_FFDocView::CXFA_FFDocView(CXFA_FFDoc* pDoc)
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_bLayoutEvent(false),
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pListFocusWidget(nullptr),
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bInLayoutStatus(false),
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pDoc(pDoc),
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pXFADocLayout(nullptr),
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iStatus(XFA_DOCVIEW_LAYOUTSTATUS_None),
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iLock(0) {}
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_FFDocView::~CXFA_FFDocView() {
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  DestroyDocView();
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::InitLayout(CXFA_Node* pNode) {
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RunBindItems();
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Initialize, false, true,
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               nullptr);
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ExecEventActivityByDeepFirst(pNode, XFA_EVENT_IndexChange, false, true,
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               nullptr);
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_FFDocView::StartLayout(int32_t iStartPage) {
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start;
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pDoc->GetXFADoc()->DoProtoMerge();
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pDoc->GetXFADoc()->DoDataMerge();
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pXFADocLayout = GetXFALayout();
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iStatus = m_pXFADocLayout->StartLayout();
88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iStatus < 0)
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return iStatus;
90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pRootItem =
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pRootItem)
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return iStatus;
95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  InitLayout(pRootItem);
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  InitCalculate(pRootItem);
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  InitValidate(pRootItem);
99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, true, true, nullptr);
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start;
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return iStatus;
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_FFDocView::DoLayout() {
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iStatus = 100;
107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  iStatus = m_pXFADocLayout->DoLayout();
108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iStatus != 100)
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return iStatus;
110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Doing;
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return iStatus;
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::StopLayout() {
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pRootItem =
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pRootItem)
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Subform* pSubformNode =
122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pRootItem->GetChild<CXFA_Subform>(0, XFA_Element::Subform, false);
123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pSubformNode)
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_PageSet* pPageSetNode =
127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pSubformNode->GetFirstChildByClass<CXFA_PageSet>(XFA_Element::PageSet);
128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pPageSetNode)
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RunCalculateWidgets();
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RunValidate();
133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  InitLayout(pPageSetNode);
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  InitCalculate(pPageSetNode);
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  InitValidate(pPageSetNode);
137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ExecEventActivityByDeepFirst(pPageSetNode, XFA_EVENT_Ready, true, true,
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               nullptr);
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, false, true,
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               nullptr);
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocReady, false, true,
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               nullptr);
144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RunCalculateWidgets();
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RunValidate();
147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (RunLayout()) {
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, false, true,
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                 nullptr);
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_CalculateAccs.clear();
154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_pFocusAcc && !m_pFocusWidget)
155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    SetFocusWidgetAcc(m_pFocusAcc.Get());
156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_End;
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::ShowNullTestMsg() {
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iCount = pdfium::CollectionSize<int32_t>(m_arrNullTestMsg);
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_FFApp* pApp = m_pDoc->GetApp();
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IXFA_AppProvider* pAppProvider = pApp->GetAppProvider();
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pAppProvider && iCount) {
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t iRemain = iCount > 7 ? iCount - 7 : 0;
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    iCount -= iRemain;
167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsMsg;
168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (int32_t i = 0; i < iCount; i++)
16933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      wsMsg += m_arrNullTestMsg[i] + L"\n";
170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iRemain > 0) {
172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsMsg += L"\n" + WideString::Format(
173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           L"Message limit exceeded. Remaining %d "
174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           L"validation errors not reported.",
175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           iRemain);
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pAppProvider->MsgBox(wsMsg, pAppProvider->GetAppTitle(), XFA_MBICON_Status,
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         XFA_MB_OK);
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_arrNullTestMsg.clear();
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::UpdateDocView() {
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsUpdateLocked())
1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  LockUpdate();
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (CXFA_Node* pNode : m_NewAddedNodes) {
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    InitCalculate(pNode);
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    InitValidate(pNode);
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Ready, true, true, nullptr);
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_NewAddedNodes.clear();
194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RunSubformIndexChange();
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RunCalculateWidgets();
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RunValidate();
198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ShowNullTestMsg();
200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (RunLayout() && m_bLayoutEvent)
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    RunEventLayoutReady();
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bLayoutEvent = false;
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_CalculateAccs.clear();
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RunInvalidate();
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  UnlockUpdate();
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_FFDocView::CountPageViews() const {
211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_pXFADocLayout ? m_pXFADocLayout->CountPages() : 0;
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_FFPageView* CXFA_FFDocView::GetPageView(int32_t nIndex) const {
215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_pXFADocLayout)
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return static_cast<CXFA_FFPageView*>(m_pXFADocLayout->GetPage(nIndex));
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_LayoutProcessor* CXFA_FFDocView::GetXFALayout() const {
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_pDoc->GetXFADoc()->GetDocLayout();
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_FFDocView::ResetSingleWidgetAccData(CXFA_WidgetAcc* pWidgetAcc) {
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pNode = pWidgetAcc->GetNode();
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  XFA_Element eType = pNode->GetElementType();
227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eType != XFA_Element::Field && eType != XFA_Element::ExclGroup)
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pWidgetAcc->ResetData();
231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pWidgetAcc->UpdateUIDisplay(this, nullptr);
232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Validate* validate = pNode->GetValidateIfExists();
233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!validate)
234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return true;
235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  AddValidateWidget(pWidgetAcc);
237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  validate->SetFlag(XFA_NodeFlag_NeedsInitApp, false);
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_FFDocView::ResetWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) {
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bLayoutEvent = true;
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bChanged = false;
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pFormNode = nullptr;
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pWidgetAcc) {
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bChanged = ResetSingleWidgetAccData(pWidgetAcc);
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFormNode = pWidgetAcc->GetNode();
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pFormNode = GetRootSubform();
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pFormNode)
2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pFormNode->GetElementType() != XFA_Element::Field &&
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pFormNode->GetElementType() != XFA_Element::ExclGroup) {
256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_WidgetAccIterator Iterator(pFormNode);
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (CXFA_WidgetAcc* pAcc = Iterator.MoveToNext()) {
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bChanged |= ResetSingleWidgetAccData(pAcc);
259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pAcc->GetNode()->GetElementType() == XFA_Element::ExclGroup)
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        Iterator.SkipTree();
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bChanged)
264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pDoc->GetDocEnvironment()->SetChangeMark(m_pDoc.Get());
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_FFDocView::ProcessWidgetEvent(CXFA_EventParam* pParam,
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           CXFA_WidgetAcc* pWidgetAcc) {
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pParam)
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return XFA_EVENTERROR_Error;
2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pParam->m_eType == XFA_EVENT_Validate) {
273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsValidateStr(L"preSubmit");
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CXFA_Node* pConfigItem =
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Config));
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pConfigItem) {
277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Acrobat* pAcrobatNode =
278d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pConfigItem->GetChild<CXFA_Acrobat>(0, XFA_Element::Acrobat, false);
279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Validate* pValidateNode =
280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pAcrobatNode ? pAcrobatNode->GetChild<CXFA_Validate>(
281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                             0, XFA_Element::Validate, false)
282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                       : nullptr;
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!pValidateNode) {
284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Present* pPresentNode =
285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pConfigItem->GetChild<CXFA_Present>(0, XFA_Element::Present, false);
286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pValidateNode = pPresentNode ? pPresentNode->GetChild<CXFA_Validate>(
287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                           0, XFA_Element::Validate, false)
288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                     : nullptr;
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pValidateNode)
291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsValidateStr = pValidateNode->JSObject()->GetContent(false);
2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!wsValidateStr.Contains(L"preSubmit"))
2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return XFA_EVENTERROR_Success;
2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pNode = pWidgetAcc ? pWidgetAcc->GetNode() : nullptr;
2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pNode) {
3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CXFA_Node* pRootItem =
3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pRootItem)
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return XFA_EVENTERROR_Error;
304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode = pRootItem->GetChild<CXFA_Node>(0, XFA_Element::Subform, false);
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ExecEventActivityByDeepFirst(pNode, pParam->m_eType, pParam->m_bIsFormReady,
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               true, nullptr);
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return XFA_EVENTERROR_Success;
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_FFWidget* CXFA_FFDocView::GetWidgetForNode(CXFA_Node* node) {
314d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return static_cast<CXFA_FFWidget*>(GetXFALayout()->GetLayoutItem(node));
315d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
316d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_FFWidgetHandler* CXFA_FFDocView::GetWidgetHandler() {
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pWidgetHandler)
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pWidgetHandler = pdfium::MakeUnique<CXFA_FFWidgetHandler>(this);
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_pWidgetHandler.get();
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
323d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::unique_ptr<CXFA_WidgetAccIterator>
324d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_FFDocView::CreateWidgetAccIterator() {
325d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Subform* pFormRoot = GetRootSubform();
326d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pFormRoot ? pdfium::MakeUnique<CXFA_WidgetAccIterator>(pFormRoot)
327d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                   : nullptr;
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
329d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::KillFocus() {
3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pFocusWidget &&
3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (m_pFocusWidget->GetStatus() & XFA_WidgetStatus_Focused)) {
333d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pFocusWidget->OnKillFocus(nullptr);
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pFocusAcc = nullptr;
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pFocusWidget = nullptr;
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pOldFocusWidget = nullptr;
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_FFDocView::SetFocus(CXFA_FFWidget* hWidget) {
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_FFWidget* pNewFocus = hWidget;
342d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_pOldFocusWidget == pNewFocus)
3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
344d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
345d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_FFWidget* pOldFocus = m_pOldFocusWidget.Get();
3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pOldFocusWidget = pNewFocus;
3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pOldFocus) {
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (m_pFocusWidget != m_pOldFocusWidget &&
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        (pOldFocus->GetStatus() & XFA_WidgetStatus_Focused)) {
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pFocusWidget = pOldFocus;
3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pOldFocus->OnKillFocus(pNewFocus);
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else if ((pOldFocus->GetStatus() & XFA_WidgetStatus_Visible)) {
353d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!pOldFocus->IsLoaded())
3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pOldFocus->LoadWidget();
355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
356d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pOldFocus->OnSetFocus(m_pFocusWidget.Get());
3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pFocusWidget = pOldFocus;
3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pOldFocus->OnKillFocus(pNewFocus);
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
361d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_pFocusWidget == m_pOldFocusWidget)
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
363d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
364d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pNewFocus = m_pOldFocusWidget.Get();
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pListFocusWidget && pNewFocus == m_pListFocusWidget) {
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pFocusAcc = nullptr;
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pFocusWidget = nullptr;
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pListFocusWidget = nullptr;
3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pOldFocusWidget = nullptr;
3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pNewFocus && (pNewFocus->GetStatus() & XFA_WidgetStatus_Visible)) {
373d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pNewFocus->IsLoaded())
3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pNewFocus->LoadWidget();
375d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNewFocus->OnSetFocus(m_pFocusWidget.Get());
3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pFocusAcc = pNewFocus ? pNewFocus->GetNode()->GetWidgetAcc() : nullptr;
3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pFocusWidget = pNewFocus;
3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pOldFocusWidget = m_pFocusWidget;
3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
382d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) {
384d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_FFWidget* pNewFocus = nullptr;
385d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pWidgetAcc)
386d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNewFocus = GetWidgetForNode(pWidgetAcc->GetNode());
387d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!SetFocus(pNewFocus))
388d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
389d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
390d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pFocusAcc = pWidgetAcc;
391d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_iStatus != XFA_DOCVIEW_LAYOUTSTATUS_End)
392d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
393d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
394d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pDoc->GetDocEnvironment()->SetFocusWidget(m_pDoc.Get(),
395d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              m_pFocusWidget.Get());
3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
397d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::DeleteLayoutItem(CXFA_FFWidget* pWidget) {
399d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_pFocusAcc && m_pFocusAcc->GetNode() != pWidget->GetNode())
400d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
401d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
402d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pFocusAcc = nullptr;
403d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pFocusWidget = nullptr;
404d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pOldFocusWidget = nullptr;
4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
406d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannstatic int32_t XFA_ProcessEvent(CXFA_FFDocView* pDocView,
4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                CXFA_WidgetAcc* pWidgetAcc,
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                CXFA_EventParam* pParam) {
410d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pParam || pParam->m_eType == XFA_EVENT_Unknown)
4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return XFA_EVENTERROR_NotExist;
412d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pWidgetAcc)
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return XFA_EVENTERROR_NotExist;
414d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
415d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* node = pWidgetAcc->GetNode();
416d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (node && node->GetElementType() == XFA_Element::Draw)
417d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_NotExist;
418d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (pParam->m_eType) {
4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_EVENT_Calculate:
421d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return node->ProcessCalculate(pDocView);
4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_EVENT_Validate:
423d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pDocView->GetDoc()->GetDocEnvironment()->IsValidationsEnabled(
424d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              pDocView->GetDoc())) {
425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return node->ProcessValidate(pDocView, 0x01);
4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return XFA_EVENTERROR_Disabled;
4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_EVENT_InitCalculate: {
429d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Calculate* calc = node->GetCalculateIfExists();
430d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!calc)
4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return XFA_EVENTERROR_NotExist;
432d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (node->IsUserInteractive())
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return XFA_EVENTERROR_Disabled;
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
435d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return node->ExecuteScript(pDocView, calc->GetScriptIfExists(), pParam);
4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default:
4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
440d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
441d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return node->ProcessEvent(pDocView, gs_EventActivity[pParam->m_eType],
442d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            pParam);
4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
444d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_FFDocView::ExecEventActivityByDeepFirst(CXFA_Node* pFormNode,
4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                     XFA_EVENTTYPE eEventType,
4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                     bool bIsFormReady,
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                     bool bRecursive,
4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                     CXFA_Node* pExclude) {
450d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pFormNode == pExclude)
451d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_NotExist;
452d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
4534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  XFA_Element elementType = pFormNode->GetElementType();
4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (elementType == XFA_Element::Field) {
455d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (eEventType == XFA_EVENT_IndexChange)
456d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return XFA_EVENTERROR_NotExist;
457d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
458d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_WidgetAcc* pWidgetAcc = pFormNode->GetWidgetAcc();
459d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pWidgetAcc)
460d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return XFA_EVENTERROR_NotExist;
461d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CXFA_EventParam eParam;
4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    eParam.m_eType = eEventType;
4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    eParam.m_pTarget = pWidgetAcc;
4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    eParam.m_bIsFormReady = bIsFormReady;
4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return XFA_ProcessEvent(this, pWidgetAcc, &eParam);
4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
468d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
469d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iRet = XFA_EVENTERROR_NotExist;
4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bRecursive) {
471d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (CXFA_Node* pNode = pFormNode->GetFirstContainerChild(); pNode;
472d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann         pNode = pNode->GetNextContainerSibling()) {
4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      elementType = pNode->GetElementType();
4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (elementType != XFA_Element::Variables &&
4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          elementType != XFA_Element::Draw) {
4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        iRet |= ExecEventActivityByDeepFirst(pNode, eEventType, bIsFormReady,
4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                             bRecursive, pExclude);
4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
481d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_WidgetAcc* pWidgetAcc = pFormNode->GetWidgetAcc();
482d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pWidgetAcc)
4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return iRet;
484d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_EventParam eParam;
4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  eParam.m_eType = eEventType;
4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  eParam.m_pTarget = pWidgetAcc;
4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  eParam.m_bIsFormReady = bIsFormReady;
4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  iRet |= XFA_ProcessEvent(this, pWidgetAcc, &eParam);
490d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return iRet;
4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
494d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_FFWidget* CXFA_FFDocView::GetWidgetByName(const WideString& wsName,
4954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                               CXFA_FFWidget* pRefWidget) {
496d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_WidgetAcc* pRefAcc =
497d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pRefWidget ? pRefWidget->GetNode()->GetWidgetAcc() : nullptr;
4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_WidgetAcc* pAcc = GetWidgetAccByName(wsName, pRefAcc);
499d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pAcc)
500d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return GetWidgetForNode(pAcc->GetNode());
5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName(
505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const WideString& wsName,
5064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CXFA_WidgetAcc* pRefWidgetAcc) {
507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsExpression;
5084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent;
510d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFXJSE_Engine* pScriptContext = m_pDoc->GetXFADoc()->GetScriptContext();
511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pScriptContext)
5124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
513d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
5144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* refNode = nullptr;
5154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pRefWidgetAcc) {
5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    refNode = pRefWidgetAcc->GetNode();
5174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wsExpression = wsName;
5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wsExpression = L"$form." + wsName;
5204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
521d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
522d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_RESOLVENODE_RS resolveNodeRS;
523d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pScriptContext->ResolveObjects(refNode, wsExpression.AsStringView(),
524d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                      &resolveNodeRS, dwStyle, nullptr)) {
5254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
5264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
527d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
528d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (resolveNodeRS.dwFlags == XFA_ResolveNode_RSType_Nodes) {
529d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pNode = resolveNodeRS.objects.front()->AsNode();
530d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode)
531d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pNode->GetWidgetAcc();
5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return nullptr;
5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::OnPageEvent(CXFA_ContainerLayoutItem* pSender,
5374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                 uint32_t dwEvent) {
5384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_FFPageView* pFFPageView = static_cast<CXFA_FFPageView*>(pSender);
5394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pDoc->GetDocEnvironment()->PageViewEvent(pFFPageView, dwEvent);
5404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
542d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::AddInvalidateRect(CXFA_FFWidget* pWidget,
5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       const CFX_RectF& rtInvalidate) {
5454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  AddInvalidateRect(pWidget->GetPageView(), rtInvalidate);
5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::AddInvalidateRect(CXFA_FFPageView* pPageView,
5494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       const CFX_RectF& rtInvalidate) {
5504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_mapPageInvalidate[pPageView]) {
5514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_mapPageInvalidate[pPageView]->Union(rtInvalidate);
5524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
5534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
554d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
55533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_mapPageInvalidate[pPageView] = pdfium::MakeUnique<CFX_RectF>(rtInvalidate);
5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::RunInvalidate() {
5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (const auto& pair : m_mapPageInvalidate)
560d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pDoc->GetDocEnvironment()->InvalidateRect(pair.first, *pair.second);
561d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_mapPageInvalidate.clear();
5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_FFDocView::RunLayout() {
5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  LockUpdate();
5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bInLayoutStatus = true;
5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pXFADocLayout->IncrementLayout() &&
5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pXFADocLayout->StartLayout() < 100) {
5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pXFADocLayout->DoLayout();
5714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    UnlockUpdate();
5724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bInLayoutStatus = false;
5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pDoc->GetDocEnvironment()->PageViewEvent(nullptr,
5744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                               XFA_PAGEVIEWEVENT_StopLayout);
5754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
5764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
577d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
5784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bInLayoutStatus = false;
5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pDoc->GetDocEnvironment()->PageViewEvent(nullptr,
5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                             XFA_PAGEVIEWEVENT_StopLayout);
5814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  UnlockUpdate();
5824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return false;
5834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::RunSubformIndexChange() {
5864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (CXFA_Node* pSubformNode : m_IndexChangedSubforms) {
587d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pSubformNode->GetWidgetAcc())
5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CXFA_EventParam eParam;
5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    eParam.m_eType = XFA_EVENT_IndexChange;
592d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    eParam.m_pTarget = pSubformNode->GetWidgetAcc();
593d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pSubformNode->ProcessEvent(this, XFA_AttributeEnum::IndexChange, &eParam);
5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_IndexChangedSubforms.clear();
5964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::AddNewFormNode(CXFA_Node* pNode) {
5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_NewAddedNodes.push_back(pNode);
6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  InitLayout(pNode);
6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::AddIndexChangedSubform(CXFA_Node* pNode) {
6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(pNode->GetElementType() == XFA_Element::Subform);
6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_IndexChangedSubforms.push_back(pNode);
6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::RunDocClose() {
6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pRootItem =
6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
611d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pRootItem)
6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
613d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocClose, false, true,
6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               nullptr);
6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
617d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::DestroyDocView() {
6194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ClearInvalidateList();
6204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_None;
6214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_iLock = 0;
6224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_ValidateAccs.clear();
6234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_BindItems.clear();
6244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_CalculateAccs.clear();
6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) {
6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_WidgetAcc* pCurrentAcc =
6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      !m_CalculateAccs.empty() ? m_CalculateAccs.back() : nullptr;
6304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pCurrentAcc != pWidgetAcc)
6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_CalculateAccs.push_back(pWidgetAcc);
6324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::AddCalculateNodeNotify(CXFA_Node* pNodeChange) {
635d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_CalcData* pGlobalData = pNodeChange->JSObject()->GetCalcData();
63633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (!pGlobalData)
63733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    return;
63833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann
639d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (auto* pResult : pGlobalData->m_Globals) {
640d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pResult->HasRemovedChildren())
641d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      AddCalculateWidgetAcc(pResult->GetWidgetAcc());
6424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
645d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannsize_t CXFA_FFDocView::RunCalculateRecursive(size_t index) {
646d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  while (index < m_CalculateAccs.size()) {
647d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* node = m_CalculateAccs[index]->GetNode();
648d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
649d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    AddCalculateNodeNotify(node);
650d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    size_t recurse = node->JSObject()->GetCalcRecursionCount() + 1;
651d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    node->JSObject()->SetCalcRecursionCount(recurse);
652d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (recurse > 11)
6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
654d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (node->ProcessCalculate(this) == XFA_EVENTERROR_Success)
655d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      AddValidateWidget(node->GetWidgetAcc());
656d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
657d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    index = RunCalculateRecursive(++index);
6584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
659d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return index;
6604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_FFDocView::RunCalculateWidgets() {
663d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_pDoc->GetDocEnvironment()->IsCalculationsEnabled(m_pDoc.Get()))
6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return XFA_EVENTERROR_Disabled;
665d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_CalculateAccs.empty())
666d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    RunCalculateRecursive(0);
6674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (CXFA_WidgetAcc* pCurAcc : m_CalculateAccs)
669d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pCurAcc->GetNode()->JSObject()->SetCalcRecursionCount(0);
6704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_CalculateAccs.clear();
6724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return XFA_EVENTERROR_Success;
6734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::AddValidateWidget(CXFA_WidgetAcc* pWidget) {
6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pdfium::ContainsValue(m_ValidateAccs, pWidget))
6774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_ValidateAccs.push_back(pWidget);
6784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
680d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_FFDocView::InitCalculate(CXFA_Node* pNode) {
6814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ExecEventActivityByDeepFirst(pNode, XFA_EVENT_InitCalculate, false, true,
6824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               nullptr);
683d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
684d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
685d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_FFDocView::ProcessValueChanged(CXFA_WidgetAcc* widgetAcc) {
686d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  AddValidateWidget(widgetAcc);
687d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  AddCalculateWidgetAcc(widgetAcc);
688d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  RunCalculateWidgets();
689d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  RunValidate();
6904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_FFDocView::InitValidate(CXFA_Node* pNode) {
693d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_pDoc->GetDocEnvironment()->IsValidationsEnabled(m_pDoc.Get()))
6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Validate, false, true, nullptr);
6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_ValidateAccs.clear();
6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_FFDocView::RunValidate() {
702d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_pDoc->GetDocEnvironment()->IsValidationsEnabled(m_pDoc.Get()))
7034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
7044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (CXFA_WidgetAcc* pAcc : m_ValidateAccs) {
706d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* node = pAcc->GetNode();
707d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!node->HasRemovedChildren())
708d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      node->ProcessValidate(this, 0);
7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_ValidateAccs.clear();
7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
713d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_FFDocView::RunEventLayoutReady() {
7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pRootItem =
7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
717d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pRootItem)
7184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
719d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
7204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, false, true,
7214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               nullptr);
7224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RunLayout();
7234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
7244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
725d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
7264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::RunBindItems() {
727d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (auto* item : m_BindItems) {
7284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (item->HasRemovedChildren())
7294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
7304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
731d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pWidgetNode = item->GetParent();
732d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_WidgetAcc* pAcc = pWidgetNode->GetWidgetAcc();
7334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pAcc)
7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
736d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CFXJSE_Engine* pScriptContext =
7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pWidgetNode->GetDocument()->GetScriptContext();
738d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsRef = item->GetRef();
7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    uint32_t dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent |
7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                       XFA_RESOLVENODE_ALL;
7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    XFA_RESOLVENODE_RS rs;
743d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pScriptContext->ResolveObjects(pWidgetNode, wsRef.AsStringView(), &rs,
744d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                   dwStyle, nullptr);
745d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pAcc->DeleteItem(-1, false, false);
746d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (rs.dwFlags != XFA_ResolveNode_RSType_Nodes || rs.objects.empty())
7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
749d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsValueRef = item->GetValueRef();
750d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsLabelRef = item->GetLabelRef();
7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const bool bUseValue = wsLabelRef.IsEmpty() || wsLabelRef == wsValueRef;
75233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    const bool bLabelUseContent = wsLabelRef.IsEmpty() || wsLabelRef == L"$";
75333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    const bool bValueUseContent = wsValueRef.IsEmpty() || wsValueRef == L"$";
754d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsValue;
755d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsLabel;
756d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    uint32_t uValueHash = FX_HashCode_GetW(wsValueRef.AsStringView(), false);
757d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (CXFA_Object* refObject : rs.objects) {
758d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* refNode = refObject->AsNode();
759d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!refNode)
7604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        continue;
761d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
7624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (bValueUseContent) {
763d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsValue = refNode->JSObject()->GetContent(false);
7644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
7654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CXFA_Node* nodeValue = refNode->GetFirstChildByName(uValueHash);
766d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsValue = nodeValue ? nodeValue->JSObject()->GetContent(false)
767d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            : refNode->JSObject()->GetContent(false);
7684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
769d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
7704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!bUseValue) {
7714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bLabelUseContent) {
772d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          wsLabel = refNode->JSObject()->GetContent(false);
7734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        } else {
774d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          CXFA_Node* nodeLabel =
775d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              refNode->GetFirstChildByName(wsLabelRef.AsStringView());
7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (nodeLabel)
777d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            wsLabel = nodeLabel->JSObject()->GetContent(false);
7784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
7794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
7804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        wsLabel = wsValue;
7814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
782d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pAcc->InsertItem(wsLabel, wsValue, false);
7834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
7844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_BindItems.clear();
7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
787d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_FFDocView::SetChangeMark() {
789d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_iStatus < XFA_DOCVIEW_LAYOUTSTATUS_End)
7904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
791d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
792d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pDoc->GetDocEnvironment()->SetChangeMark(m_pDoc.Get());
7934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
794d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
795d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Subform* CXFA_FFDocView::GetRootSubform() {
7964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pFormPacketNode =
7974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
798d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pFormPacketNode)
7994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
8004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
801d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pFormPacketNode->GetFirstChildByClass<CXFA_Subform>(
802d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      XFA_Element::Subform);
8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
804