diff options
Diffstat (limited to 'xfa/fxfa')
-rw-r--r-- | xfa/fxfa/cxfa_ffdocview.cpp | 169 | ||||
-rw-r--r-- | xfa/fxfa/cxfa_ffdocview.h | 20 |
2 files changed, 88 insertions, 101 deletions
diff --git a/xfa/fxfa/cxfa_ffdocview.cpp b/xfa/fxfa/cxfa_ffdocview.cpp index 3ac705c8b2..0bf45e919a 100644 --- a/xfa/fxfa/cxfa_ffdocview.cpp +++ b/xfa/fxfa/cxfa_ffdocview.cpp @@ -72,23 +72,26 @@ void CXFA_FFDocView::InitLayout(CXFA_Node* pNode) { ExecEventActivityByDeepFirst(pNode, XFA_EVENT_IndexChange, false, true, nullptr); } + int32_t CXFA_FFDocView::StartLayout(int32_t iStartPage) { m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start; m_pDoc->GetXFADoc()->DoProtoMerge(); m_pDoc->GetXFADoc()->DoDataMerge(); m_pXFADocLayout = GetXFALayout(); + int32_t iStatus = m_pXFADocLayout->StartLayout(); - if (iStatus < 0) { + if (iStatus < 0) return iStatus; - } + CXFA_Node* pRootItem = ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form)); - if (!pRootItem) { + if (!pRootItem) return iStatus; - } + InitLayout(pRootItem); InitCalculate(pRootItem); InitValidate(pRootItem); + ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, true, true, nullptr); m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start; return iStatus; @@ -107,35 +110,40 @@ int32_t CXFA_FFDocView::DoLayout() { void CXFA_FFDocView::StopLayout() { CXFA_Node* pRootItem = ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form)); - if (!pRootItem) { + if (!pRootItem) return; - } + CXFA_Node* pSubformNode = pRootItem->GetChild(0, XFA_Element::Subform); - if (!pSubformNode) { + if (!pSubformNode) return; - } + CXFA_Node* pPageSetNode = pSubformNode->GetFirstChildByClass(XFA_Element::PageSet); - if (!pPageSetNode) { + if (!pPageSetNode) return; - } + RunCalculateWidgets(); RunValidate(); + InitLayout(pPageSetNode); InitCalculate(pPageSetNode); InitValidate(pPageSetNode); + ExecEventActivityByDeepFirst(pPageSetNode, XFA_EVENT_Ready, true, true, nullptr); ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, false, true, nullptr); ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocReady, false, true, nullptr); + RunCalculateWidgets(); RunValidate(); + if (RunLayout()) { ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, false, true, nullptr); } + m_CalculateAccs.clear(); if (m_pFocusAcc && !m_pFocusWidget) SetFocusWidgetAcc(m_pFocusAcc.Get()); @@ -143,10 +151,6 @@ void CXFA_FFDocView::StopLayout() { m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_End; } -int32_t CXFA_FFDocView::GetLayoutStatus() { - return m_iStatus; -} - void CXFA_FFDocView::ShowNullTestMsg() { int32_t iCount = pdfium::CollectionSize<int32_t>(m_arrNullTestMsg); CXFA_FFApp* pApp = m_pDoc->GetApp(); @@ -155,9 +159,9 @@ void CXFA_FFDocView::ShowNullTestMsg() { int32_t iRemain = iCount > 7 ? iCount - 7 : 0; iCount -= iRemain; WideString wsMsg; - for (int32_t i = 0; i < iCount; i++) { + for (int32_t i = 0; i < iCount; i++) wsMsg += m_arrNullTestMsg[i] + L"\n"; - } + if (iRemain > 0) { WideString wsTemp; wsTemp.Format( @@ -183,10 +187,13 @@ void CXFA_FFDocView::UpdateDocView() { ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Ready, true, true, nullptr); } m_NewAddedNodes.clear(); + RunSubformIndexChange(); RunCalculateWidgets(); RunValidate(); + ShowNullTestMsg(); + if (RunLayout() && m_bLayoutEvent) RunEventLayoutReady(); @@ -243,14 +250,12 @@ void CXFA_FFDocView::ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc) { CXFA_WidgetAccIterator Iterator(pFormNode); while (CXFA_WidgetAcc* pAcc = Iterator.MoveToNext()) { bChanged |= ResetSingleWidgetAccData(pAcc); - if (pAcc->GetNode()->GetElementType() == XFA_Element::ExclGroup) { + if (pAcc->GetNode()->GetElementType() == XFA_Element::ExclGroup) Iterator.SkipTree(); - } } } - if (bChanged) { + if (bChanged) m_pDoc->GetDocEnvironment()->SetChangeMark(m_pDoc.Get()); - } } int32_t CXFA_FFDocView::ProcessWidgetEvent(CXFA_EventParam* pParam, @@ -292,6 +297,7 @@ int32_t CXFA_FFDocView::ProcessWidgetEvent(CXFA_EventParam* pParam, pNode = pRootItem->GetChild(0, XFA_Element::Subform); } + ExecEventActivityByDeepFirst(pNode, pParam->m_eType, pParam->m_bIsFormReady, true, nullptr); return XFA_EVENTERROR_Success; @@ -306,13 +312,8 @@ CXFA_FFWidgetHandler* CXFA_FFDocView::GetWidgetHandler() { std::unique_ptr<CXFA_WidgetAccIterator> CXFA_FFDocView::CreateWidgetAccIterator() { CXFA_Node* pFormRoot = GetRootSubform(); - if (!pFormRoot) - return nullptr; - return pdfium::MakeUnique<CXFA_WidgetAccIterator>(pFormRoot); -} - -CXFA_FFWidget* CXFA_FFDocView::GetFocusWidget() const { - return m_pFocusWidget.Get(); + return pFormRoot ? pdfium::MakeUnique<CXFA_WidgetAccIterator>(pFormRoot) + : nullptr; } void CXFA_FFDocView::KillFocus() { @@ -338,9 +339,9 @@ bool CXFA_FFDocView::SetFocus(CXFA_FFWidget* hWidget) { m_pFocusWidget = pOldFocus; pOldFocus->OnKillFocus(pNewFocus); } else if ((pOldFocus->GetStatus() & XFA_WidgetStatus_Visible)) { - if (!pOldFocus->IsLoaded()) { + if (!pOldFocus->IsLoaded()) pOldFocus->LoadWidget(); - } + pOldFocus->OnSetFocus(m_pFocusWidget.Get()); m_pFocusWidget = pOldFocus; pOldFocus->OnKillFocus(pNewFocus); @@ -368,38 +369,37 @@ bool CXFA_FFDocView::SetFocus(CXFA_FFWidget* hWidget) { return true; } -CXFA_WidgetAcc* CXFA_FFDocView::GetFocusWidgetAcc() { - return m_pFocusAcc.Get(); -} - void CXFA_FFDocView::SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) { CXFA_FFWidget* pNewFocus = pWidgetAcc ? pWidgetAcc->GetNextWidget(nullptr) : nullptr; - if (SetFocus(pNewFocus)) { - m_pFocusAcc = pWidgetAcc; - if (m_iStatus == XFA_DOCVIEW_LAYOUTSTATUS_End) - m_pDoc->GetDocEnvironment()->SetFocusWidget(m_pDoc.Get(), - m_pFocusWidget.Get()); - } + if (!SetFocus(pNewFocus)) + return; + + m_pFocusAcc = pWidgetAcc; + if (m_iStatus != XFA_DOCVIEW_LAYOUTSTATUS_End) + return; + + m_pDoc->GetDocEnvironment()->SetFocusWidget(m_pDoc.Get(), + m_pFocusWidget.Get()); } void CXFA_FFDocView::DeleteLayoutItem(CXFA_FFWidget* pWidget) { - if (m_pFocusAcc == pWidget->GetDataAcc()) { - m_pFocusAcc = nullptr; - m_pFocusWidget = nullptr; - m_pOldFocusWidget = nullptr; - } + if (m_pFocusAcc != pWidget->GetDataAcc()) + return; + + m_pFocusAcc = nullptr; + m_pFocusWidget = nullptr; + m_pOldFocusWidget = nullptr; } static int32_t XFA_ProcessEvent(CXFA_FFDocView* pDocView, CXFA_WidgetAcc* pWidgetAcc, CXFA_EventParam* pParam) { - if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) { + if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) return XFA_EVENTERROR_NotExist; - } - if (!pWidgetAcc || pWidgetAcc->GetElementType() == XFA_Element::Draw) { + if (!pWidgetAcc || pWidgetAcc->GetElementType() == XFA_Element::Draw) return XFA_EVENTERROR_NotExist; - } + switch (pParam->m_eType) { case XFA_EVENT_Calculate: return pWidgetAcc->ProcessCalculate(); @@ -412,9 +412,8 @@ static int32_t XFA_ProcessEvent(CXFA_FFDocView* pDocView, return XFA_EVENTERROR_Disabled; case XFA_EVENT_InitCalculate: { CXFA_Calculate calc = pWidgetAcc->GetCalculate(); - if (!calc) { + if (!calc) return XFA_EVENTERROR_NotExist; - } if (pWidgetAcc->GetNode()->IsUserInteractive()) return XFA_EVENTERROR_Disabled; @@ -424,9 +423,8 @@ static int32_t XFA_ProcessEvent(CXFA_FFDocView* pDocView, default: break; } - int32_t iRet = - pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam); - return iRet; + + return pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam); } int32_t CXFA_FFDocView::ExecEventActivityByDeepFirst(CXFA_Node* pFormNode, @@ -434,25 +432,26 @@ int32_t CXFA_FFDocView::ExecEventActivityByDeepFirst(CXFA_Node* pFormNode, bool bIsFormReady, bool bRecursive, CXFA_Node* pExclude) { - int32_t iRet = XFA_EVENTERROR_NotExist; - if (pFormNode == pExclude) { - return iRet; - } + if (pFormNode == pExclude) + return XFA_EVENTERROR_NotExist; + XFA_Element elementType = pFormNode->GetElementType(); if (elementType == XFA_Element::Field) { - if (eEventType == XFA_EVENT_IndexChange) { - return iRet; - } + if (eEventType == XFA_EVENT_IndexChange) + return XFA_EVENTERROR_NotExist; + CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData(); - if (!pWidgetAcc) { - return iRet; - } + if (!pWidgetAcc) + return XFA_EVENTERROR_NotExist; + CXFA_EventParam eParam; eParam.m_eType = eEventType; eParam.m_pTarget = pWidgetAcc; eParam.m_bIsFormReady = bIsFormReady; return XFA_ProcessEvent(this, pWidgetAcc, &eParam); } + + int32_t iRet = XFA_EVENTERROR_NotExist; if (bRecursive) { for (CXFA_Node* pNode = pFormNode->GetNodeItem( XFA_NODEITEM_FirstChild, XFA_ObjectType::ContainerNode); @@ -467,14 +466,15 @@ int32_t CXFA_FFDocView::ExecEventActivityByDeepFirst(CXFA_Node* pFormNode, } } CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData(); - if (!pWidgetAcc) { + if (!pWidgetAcc) return iRet; - } + CXFA_EventParam eParam; eParam.m_eType = eEventType; eParam.m_pTarget = pWidgetAcc; eParam.m_bIsFormReady = bIsFormReady; iRet |= XFA_ProcessEvent(this, pWidgetAcc, &eParam); + return iRet; } @@ -502,6 +502,7 @@ CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName( } else { wsExpression = L"$form." + wsName; } + XFA_RESOLVENODE_RS resoveNodeRS; int32_t iRet = pScriptContext->ResolveObjects( refNode, wsExpression.AsStringView(), resoveNodeRS, dwStyle); @@ -522,21 +523,6 @@ void CXFA_FFDocView::OnPageEvent(CXFA_ContainerLayoutItem* pSender, m_pDoc->GetDocEnvironment()->PageViewEvent(pFFPageView, dwEvent); } -void CXFA_FFDocView::LockUpdate() { - m_iLock++; -} - -void CXFA_FFDocView::UnlockUpdate() { - m_iLock--; -} - -bool CXFA_FFDocView::IsUpdateLocked() { - return m_iLock > 0; -} - -void CXFA_FFDocView::ClearInvalidateList() { - m_mapPageInvalidate.clear(); -} void CXFA_FFDocView::AddInvalidateRect(CXFA_FFWidget* pWidget, const CFX_RectF& rtInvalidate) { @@ -549,12 +535,14 @@ void CXFA_FFDocView::AddInvalidateRect(CXFA_FFPageView* pPageView, m_mapPageInvalidate[pPageView]->Union(rtInvalidate); return; } + m_mapPageInvalidate[pPageView] = pdfium::MakeUnique<CFX_RectF>(rtInvalidate); } void CXFA_FFDocView::RunInvalidate() { for (const auto& pair : m_mapPageInvalidate) m_pDoc->GetDocEnvironment()->InvalidateRect(pair.first, *pair.second); + m_mapPageInvalidate.clear(); } @@ -570,6 +558,7 @@ bool CXFA_FFDocView::RunLayout() { XFA_PAGEVIEWEVENT_StopLayout); return true; } + m_bInLayoutStatus = false; m_pDoc->GetDocEnvironment()->PageViewEvent(nullptr, XFA_PAGEVIEWEVENT_StopLayout); @@ -605,9 +594,9 @@ void CXFA_FFDocView::AddIndexChangedSubform(CXFA_Node* pNode) { void CXFA_FFDocView::RunDocClose() { CXFA_Node* pRootItem = ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form)); - if (!pRootItem) { + if (!pRootItem) return; - } + ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocClose, false, true, nullptr); } @@ -621,10 +610,6 @@ void CXFA_FFDocView::DestroyDocView() { m_CalculateAccs.clear(); } -bool CXFA_FFDocView::IsStaticNotify() { - return m_pDoc->GetFormType() == FormType::kXFAForeground; -} - void CXFA_FFDocView::AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) { CXFA_WidgetAcc* pCurrentAcc = !m_CalculateAccs.empty() ? m_CalculateAccs.back() : nullptr; @@ -655,7 +640,6 @@ size_t CXFA_FFDocView::RunCalculateRecursive(size_t index) { (void*)(uintptr_t)iRefCount); if (iRefCount > 11) break; - if (pCurAcc->ProcessCalculate() == XFA_EVENTERROR_Success) AddValidateWidget(pCurAcc); @@ -667,7 +651,6 @@ size_t CXFA_FFDocView::RunCalculateRecursive(size_t index) { int32_t CXFA_FFDocView::RunCalculateWidgets() { if (!m_pDoc->GetDocEnvironment()->IsCalculationsEnabled(m_pDoc.Get())) return XFA_EVENTERROR_Disabled; - if (!m_CalculateAccs.empty()) RunCalculateRecursive(0); @@ -683,10 +666,9 @@ void CXFA_FFDocView::AddValidateWidget(CXFA_WidgetAcc* pWidget) { m_ValidateAccs.push_back(pWidget); } -bool CXFA_FFDocView::InitCalculate(CXFA_Node* pNode) { +void CXFA_FFDocView::InitCalculate(CXFA_Node* pNode) { ExecEventActivityByDeepFirst(pNode, XFA_EVENT_InitCalculate, false, true, nullptr); - return true; } bool CXFA_FFDocView::InitValidate(CXFA_Node* pNode) { @@ -709,12 +691,13 @@ bool CXFA_FFDocView::RunValidate() { m_ValidateAccs.clear(); return true; } + bool CXFA_FFDocView::RunEventLayoutReady() { CXFA_Node* pRootItem = ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form)); - if (!pRootItem) { + if (!pRootItem) return false; - } + ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, false, true, nullptr); RunLayout(); @@ -759,12 +742,14 @@ void CXFA_FFDocView::RunBindItems() { CXFA_Node* refNode = refObject->AsNode(); if (!refNode) continue; + if (bValueUseContent) { wsValue = refNode->GetContent(); } else { CXFA_Node* nodeValue = refNode->GetFirstChildByName(uValueHash); wsValue = nodeValue ? nodeValue->GetContent() : refNode->GetContent(); } + if (!bUseValue) { if (bLabelUseContent) { wsLabel = refNode->GetContent(); diff --git a/xfa/fxfa/cxfa_ffdocview.h b/xfa/fxfa/cxfa_ffdocview.h index 067b41165a..6f8b682a73 100644 --- a/xfa/fxfa/cxfa_ffdocview.h +++ b/xfa/fxfa/cxfa_ffdocview.h @@ -47,7 +47,7 @@ class CXFA_FFDocView { int32_t StartLayout(int32_t iStartPage = 0); int32_t DoLayout(); void StopLayout(); - int32_t GetLayoutStatus(); + int32_t GetLayoutStatus() const { return m_iStatus; } void UpdateDocView(); int32_t CountPageViews() const; CXFA_FFPageView* GetPageView(int32_t nIndex) const; @@ -57,7 +57,7 @@ class CXFA_FFDocView { CXFA_WidgetAcc* pWidgetAcc); CXFA_FFWidgetHandler* GetWidgetHandler(); std::unique_ptr<CXFA_WidgetAccIterator> CreateWidgetAccIterator(); - CXFA_FFWidget* GetFocusWidget() const; + CXFA_FFWidget* GetFocusWidget() const { return m_pFocusWidget.Get(); } void KillFocus(); bool SetFocus(CXFA_FFWidget* hWidget); CXFA_FFWidget* GetWidgetByName(const WideString& wsName, @@ -66,10 +66,10 @@ class CXFA_FFDocView { CXFA_WidgetAcc* pRefWidgetAcc); CXFA_LayoutProcessor* GetXFALayout() const; void OnPageEvent(CXFA_ContainerLayoutItem* pSender, uint32_t dwEvent); - void LockUpdate(); - void UnlockUpdate(); - bool IsUpdateLocked(); - void ClearInvalidateList(); + void LockUpdate() { m_iLock++; } + void UnlockUpdate() { m_iLock--; } + bool IsUpdateLocked() { return m_iLock > 0; } + void ClearInvalidateList() { m_mapPageInvalidate.clear(); } void AddInvalidateRect(CXFA_FFWidget* pWidget, const CFX_RectF& rtInvalidate); void AddInvalidateRect(CXFA_FFPageView* pPageView, const CFX_RectF& rtInvalidate); @@ -86,12 +86,14 @@ class CXFA_FFDocView { void AddCalculateNodeNotify(CXFA_Node* pNodeChange); void AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc); int32_t RunCalculateWidgets(); - bool IsStaticNotify(); + bool IsStaticNotify() { + return m_pDoc->GetFormType() == FormType::kXFAForeground; + } bool RunLayout(); void RunSubformIndexChange(); void AddNewFormNode(CXFA_Node* pNode); void AddIndexChangedSubform(CXFA_Node* pNode); - CXFA_WidgetAcc* GetFocusWidgetAcc(); + CXFA_WidgetAcc* GetFocusWidgetAcc() const { return m_pFocusAcc.Get(); } void SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc); void DeleteLayoutItem(CXFA_FFWidget* pWidget); int32_t ExecEventActivityByDeepFirst(CXFA_Node* pFormNode, @@ -109,7 +111,7 @@ class CXFA_FFDocView { bool RunEventLayoutReady(); void RunBindItems(); - bool InitCalculate(CXFA_Node* pNode); + void InitCalculate(CXFA_Node* pNode); void InitLayout(CXFA_Node* pNode); size_t RunCalculateRecursive(size_t index); void ShowNullTestMsg(); |