Index: xfa/src/fxfa/src/app/xfa_ffdocview.cpp |
diff --git a/xfa/src/fxfa/src/app/xfa_ffdocview.cpp b/xfa/src/fxfa/src/app/xfa_ffdocview.cpp |
index f85ba658554a7b8b16fd058f95c8003191167946..59d4a59f0da540dd9cb430c65e3c0d769fbb6296 100644 |
--- a/xfa/src/fxfa/src/app/xfa_ffdocview.cpp |
+++ b/xfa/src/fxfa/src/app/xfa_ffdocview.cpp |
@@ -1,936 +1,936 @@ |
-// Copyright 2014 PDFium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
- |
-#include "xfa/src/foxitlib.h" |
-#include "xfa/src/fxfa/src/common/xfa_common.h" |
-#include "xfa_fwladapter.h" |
-#include "xfa_ffdocview.h" |
-#include "xfa_ffpageview.h" |
-#include "xfa_ffwidgethandler.h" |
-#include "xfa_ffdoc.h" |
-#include "xfa_ffwidget.h" |
-#include "xfa_fffield.h" |
-#include "xfa_ffpushbutton.h" |
-#include "xfa_ffcheckbutton.h" |
-#include "xfa_ffchoicelist.h" |
-#include "xfa_ffimageedit.h" |
-#include "xfa_fftextedit.h" |
-#include "xfa_ffbarcode.h" |
-#include "xfa_ffdraw.h" |
-#include "xfa_fftext.h" |
-#include "xfa_ffpath.h" |
-#include "xfa_ffimage.h" |
-#include "xfa_ffexclgroup.h" |
-#include "xfa_ffsubform.h" |
-#include "xfa_ffsignature.h" |
-#include "xfa_ffapp.h" |
-#include "xfa_textlayout.h" |
-#include "xfa_ffwidgetacc.h" |
-extern const XFA_ATTRIBUTEENUM gs_EventActivity[] = { |
- XFA_ATTRIBUTEENUM_Click, XFA_ATTRIBUTEENUM_Change, |
- XFA_ATTRIBUTEENUM_DocClose, XFA_ATTRIBUTEENUM_DocReady, |
- XFA_ATTRIBUTEENUM_Enter, XFA_ATTRIBUTEENUM_Exit, |
- XFA_ATTRIBUTEENUM_Full, XFA_ATTRIBUTEENUM_IndexChange, |
- XFA_ATTRIBUTEENUM_Initialize, XFA_ATTRIBUTEENUM_MouseDown, |
- XFA_ATTRIBUTEENUM_MouseEnter, XFA_ATTRIBUTEENUM_MouseExit, |
- XFA_ATTRIBUTEENUM_MouseUp, XFA_ATTRIBUTEENUM_PostExecute, |
- XFA_ATTRIBUTEENUM_PostOpen, XFA_ATTRIBUTEENUM_PostPrint, |
- XFA_ATTRIBUTEENUM_PostSave, XFA_ATTRIBUTEENUM_PostSign, |
- XFA_ATTRIBUTEENUM_PostSubmit, XFA_ATTRIBUTEENUM_PreExecute, |
- XFA_ATTRIBUTEENUM_PreOpen, XFA_ATTRIBUTEENUM_PrePrint, |
- XFA_ATTRIBUTEENUM_PreSave, XFA_ATTRIBUTEENUM_PreSign, |
- XFA_ATTRIBUTEENUM_PreSubmit, XFA_ATTRIBUTEENUM_Ready, |
- XFA_ATTRIBUTEENUM_Unknown, |
-}; |
-CXFA_FFDocView::CXFA_FFDocView(CXFA_FFDoc* pDoc) |
- : m_bLayoutEvent(FALSE), |
- m_pListFocusWidget(nullptr), |
- m_bInLayoutStatus(FALSE), |
- m_pDoc(pDoc), |
- m_pWidgetHandler(nullptr), |
- m_pXFADocLayout(nullptr), |
- m_pFocusAcc(nullptr), |
- m_pFocusWidget(nullptr), |
- m_pOldFocusWidget(nullptr), |
- m_iStatus(XFA_DOCVIEW_LAYOUTSTATUS_None), |
- m_iLock(0) { |
-} |
-CXFA_FFDocView::~CXFA_FFDocView() { |
- DestroyDocView(); |
- if (m_pWidgetHandler) { |
- delete m_pWidgetHandler; |
- } |
- m_pWidgetHandler = NULL; |
-} |
-void CXFA_FFDocView::InitLayout(CXFA_Node* pNode) { |
- RunBindItems(); |
- ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Initialize); |
- ExecEventActivityByDeepFirst(pNode, XFA_EVENT_IndexChange); |
-} |
-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) { |
- return iStatus; |
- } |
- CXFA_Node* pRootItem = |
- (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); |
- if (!pRootItem) { |
- return iStatus; |
- } |
- InitLayout(pRootItem); |
- InitCalculate(pRootItem); |
- InitValidate(pRootItem); |
- ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, TRUE); |
- m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start; |
- return iStatus; |
-} |
-int32_t CXFA_FFDocView::DoLayout(IFX_Pause* pPause) { |
- int32_t iStatus = 100; |
- iStatus = m_pXFADocLayout->DoLayout(pPause); |
- if (iStatus != 100) { |
- return iStatus; |
- } |
- m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Doing; |
- return iStatus; |
-} |
-void CXFA_FFDocView::StopLayout() { |
- CXFA_Node* pRootItem = |
- (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); |
- if (!pRootItem) { |
- return; |
- } |
- CXFA_Node* pSubformNode = pRootItem->GetChild(0, XFA_ELEMENT_Subform); |
- if (!pSubformNode) { |
- return; |
- } |
- CXFA_Node* pPageSetNode = |
- pSubformNode->GetFirstChildByClass(XFA_ELEMENT_PageSet); |
- if (!pPageSetNode) { |
- return; |
- } |
- RunCalculateWidgets(); |
- RunValidate(); |
- InitLayout(pPageSetNode); |
- InitCalculate(pPageSetNode); |
- InitValidate(pPageSetNode); |
- ExecEventActivityByDeepFirst(pPageSetNode, XFA_EVENT_Ready, TRUE); |
- ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready); |
- ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocReady); |
- RunCalculateWidgets(); |
- RunValidate(); |
- if (RunLayout()) { |
- ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready); |
- } |
- m_CalculateAccs.RemoveAll(); |
- if (m_pFocusAcc && !m_pFocusWidget) { |
- SetFocusWidgetAcc(m_pFocusAcc); |
- } |
- m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_End; |
-} |
-int32_t CXFA_FFDocView::GetLayoutStatus() { |
- return m_iStatus; |
-} |
-void CXFA_FFDocView::ShowNullTestMsg() { |
- int32_t iCount = m_arrNullTestMsg.GetSize(); |
- CXFA_FFApp* pApp = m_pDoc->GetApp(); |
- IXFA_AppProvider* pAppProvider = pApp->GetAppProvider(); |
- if (pAppProvider && iCount) { |
- int32_t iRemain = iCount > 7 ? iCount - 7 : 0; |
- iCount -= iRemain; |
- CFX_WideString wsMsg; |
- for (int32_t i = 0; i < iCount; i++) { |
- wsMsg += m_arrNullTestMsg[i] + FX_WSTRC(L"\n"); |
- } |
- if (iRemain > 0) { |
- CFX_WideString wsLimit; |
- pAppProvider->LoadString(XFA_IDS_ValidateLimit, wsLimit); |
- if (!wsLimit.IsEmpty()) { |
- CFX_WideString wsTemp; |
- wsTemp.Format((const FX_WCHAR*)wsLimit, iRemain); |
- wsMsg += FX_WSTRC(L"\n") + wsTemp; |
- } |
- } |
- CFX_WideString wsTitle; |
- pAppProvider->LoadString(XFA_IDS_AppName, wsTitle); |
- pAppProvider->MsgBox(wsMsg, wsTitle, XFA_MBICON_Status, XFA_MB_OK); |
- } |
- m_arrNullTestMsg.RemoveAll(); |
-} |
-void CXFA_FFDocView::UpdateDocView() { |
- if (IsUpdateLocked()) { |
- return; |
- } |
- LockUpdate(); |
- int32_t iNewAdds = m_NewAddedNodes.GetSize(); |
- for (int32_t i = 0; i < iNewAdds; i++) { |
- CXFA_Node* pNode = (CXFA_Node*)m_NewAddedNodes[i]; |
- InitCalculate(pNode); |
- InitValidate(pNode); |
- ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Ready, TRUE); |
- } |
- m_NewAddedNodes.RemoveAll(); |
- this->RunSubformIndexChange(); |
- this->RunCalculateWidgets(); |
- this->RunValidate(); |
- ShowNullTestMsg(); |
- m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Next; |
- if (RunLayout() && m_bLayoutEvent) { |
- RunEventLayoutReady(); |
- } |
- m_bLayoutEvent = FALSE; |
- m_CalculateAccs.RemoveAll(); |
- this->RunInvalidate(); |
- UnlockUpdate(); |
-} |
-int32_t CXFA_FFDocView::CountPageViews() { |
- if (!m_pXFADocLayout) { |
- return 0; |
- } |
- return m_pXFADocLayout->CountPages(); |
-} |
-IXFA_PageView* CXFA_FFDocView::GetPageView(int32_t nIndex) { |
- if (!m_pXFADocLayout) { |
- return NULL; |
- } |
- return static_cast<CXFA_FFPageView*>(m_pXFADocLayout->GetPage(nIndex)); |
-} |
-IXFA_Widget* CXFA_FFDocView::GetWidgetByName(const CFX_WideStringC& wsName) { |
- return GetWidgetByName(wsName, NULL); |
-} |
-CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName( |
- const CFX_WideStringC& wsName) { |
- return GetWidgetAccByName(wsName, NULL); |
-} |
-IXFA_DocLayout* CXFA_FFDocView::GetXFALayout() const { |
- return m_pDoc->GetXFADoc()->GetDocLayout(); |
-} |
-FX_BOOL CXFA_FFDocView::ResetSingleWidgetAccData(CXFA_WidgetAcc* pWidgetAcc) { |
- CXFA_Node* pNode = pWidgetAcc->GetNode(); |
- XFA_ELEMENT eType = pNode->GetClassID(); |
- if (eType != XFA_ELEMENT_Field && eType != XFA_ELEMENT_ExclGroup) { |
- return FALSE; |
- } |
- FX_BOOL bNotify = IsStaticNotify(); |
- pWidgetAcc->ResetData(); |
- pWidgetAcc->UpdateUIDisplay(); |
- if (bNotify) { |
- pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL, NULL, |
- NULL); |
- } |
- if (CXFA_Validate validate = pWidgetAcc->GetValidate()) { |
- AddValidateWidget(pWidgetAcc); |
- ((CXFA_Node*)validate)->SetFlag(XFA_NODEFLAG_NeedsInitApp, TRUE, FALSE); |
- } |
- return TRUE; |
-} |
-void CXFA_FFDocView::ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc) { |
- m_bLayoutEvent = TRUE; |
- FX_BOOL bChanged = FALSE; |
- CXFA_Node* pFormNode = NULL; |
- if (pWidgetAcc) { |
- bChanged = ResetSingleWidgetAccData(pWidgetAcc); |
- pFormNode = pWidgetAcc->GetNode(); |
- } else { |
- pFormNode = GetRootSubform(); |
- } |
- if (!pFormNode) { |
- return; |
- } |
- if (pFormNode->GetClassID() != XFA_ELEMENT_Field && |
- pFormNode->GetClassID() != XFA_ELEMENT_ExclGroup) { |
- CXFA_WidgetAccIterator Iterator(this, pFormNode); |
- while (CXFA_WidgetAcc* pAcc = Iterator.MoveToNext()) { |
- bChanged |= ResetSingleWidgetAccData(pAcc); |
- if (pAcc->GetNode()->GetClassID() == XFA_ELEMENT_ExclGroup) { |
- Iterator.SkipTree(); |
- } |
- } |
- } |
- if (bChanged) { |
- m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc); |
- } |
-} |
-int32_t CXFA_FFDocView::ProcessWidgetEvent(CXFA_EventParam* pParam, |
- CXFA_WidgetAcc* pWidgetAcc) { |
- if (pParam == NULL) { |
- return XFA_EVENTERROR_Error; |
- } |
- if (pParam->m_eType == XFA_EVENT_Validate) { |
- CFX_WideString wsValidateStr = FX_WSTRC(L"preSubmit"); |
- CXFA_Node* pConfigItem = |
- (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Config); |
- if (pConfigItem) { |
- CXFA_Node* pValidateNode = NULL; |
- CXFA_Node* pAcrobatNode = pConfigItem->GetChild(0, XFA_ELEMENT_Acrobat); |
- pValidateNode = |
- pAcrobatNode ? pAcrobatNode->GetChild(0, XFA_ELEMENT_Validate) : NULL; |
- if (!pValidateNode) { |
- CXFA_Node* pPresentNode = pConfigItem->GetChild(0, XFA_ELEMENT_Present); |
- pValidateNode = pPresentNode |
- ? pPresentNode->GetChild(0, XFA_ELEMENT_Validate) |
- : NULL; |
- } |
- if (pValidateNode) { |
- wsValidateStr = pValidateNode->GetContent(); |
- } |
- } |
- FX_BOOL bValidate = FALSE; |
- switch (pParam->m_iValidateActivities) { |
- case XFA_VALIDATE_preSubmit: |
- bValidate = wsValidateStr.Find(L"preSubmit") != -1; |
- break; |
- case XFA_VALIDATE_prePrint: |
- bValidate = wsValidateStr.Find(L"prePrint") != -1; |
- break; |
- case XFA_VALIDATE_preExecute: |
- bValidate = wsValidateStr.Find(L"preExecute") != -1; |
- break; |
- case XFA_VALIDATE_preSave: |
- bValidate = wsValidateStr.Find(L"preSave") != -1; |
- break; |
- } |
- if (!bValidate) { |
- return XFA_EVENTERROR_Sucess; |
- } |
- } |
- CXFA_Node* pNode = pWidgetAcc ? pWidgetAcc->GetNode() : NULL; |
- if (!pNode) { |
- CXFA_Node* pRootItem = |
- (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); |
- if (!pRootItem) { |
- return XFA_EVENTERROR_Error; |
- } |
- pNode = pRootItem->GetChild(0, XFA_ELEMENT_Subform); |
- } |
- ExecEventActivityByDeepFirst(pNode, pParam->m_eType, pParam->m_bIsFormReady); |
- return XFA_EVENTERROR_Sucess; |
-} |
-IXFA_WidgetHandler* CXFA_FFDocView::GetWidgetHandler() { |
- if (!m_pWidgetHandler) { |
- m_pWidgetHandler = new CXFA_FFWidgetHandler(this); |
- } |
- return m_pWidgetHandler; |
-} |
-IXFA_WidgetIterator* CXFA_FFDocView::CreateWidgetIterator() { |
- CXFA_Node* pFormRoot = GetRootSubform(); |
- if (!pFormRoot) { |
- return NULL; |
- } |
- return new CXFA_FFDocWidgetIterator(this, pFormRoot); |
-} |
-IXFA_WidgetAccIterator* CXFA_FFDocView::CreateWidgetAccIterator( |
- XFA_WIDGETORDER eOrder) { |
- CXFA_Node* pFormRoot = GetRootSubform(); |
- if (!pFormRoot) { |
- return NULL; |
- } |
- return new CXFA_WidgetAccIterator(this, pFormRoot); |
-} |
-IXFA_Widget* CXFA_FFDocView::GetFocusWidget() { |
- return m_pFocusWidget; |
-} |
-void CXFA_FFDocView::KillFocus() { |
- if (m_pFocusWidget && |
- (m_pFocusWidget->GetStatus() & XFA_WIDGETSTATUS_Focused)) { |
- (m_pFocusWidget)->OnKillFocus(NULL); |
- } |
- m_pFocusAcc = NULL; |
- m_pFocusWidget = NULL; |
- m_pOldFocusWidget = NULL; |
-} |
-FX_BOOL CXFA_FFDocView::SetFocus(IXFA_Widget* hWidget) { |
- CXFA_FFWidget* pNewFocus = (CXFA_FFWidget*)hWidget; |
- if (m_pOldFocusWidget == pNewFocus) { |
- return FALSE; |
- } |
- CXFA_FFWidget* pOldFocus = m_pOldFocusWidget; |
- m_pOldFocusWidget = pNewFocus; |
- if (pOldFocus) { |
- if (m_pFocusWidget != m_pOldFocusWidget && |
- (pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Focused)) { |
- m_pFocusWidget = pOldFocus; |
- pOldFocus->OnKillFocus(pNewFocus); |
- } else if ((pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) { |
- if (!pOldFocus->IsLoaded()) { |
- pOldFocus->LoadWidget(); |
- } |
- pOldFocus->OnSetFocus(m_pFocusWidget); |
- m_pFocusWidget = pOldFocus; |
- pOldFocus->OnKillFocus(pNewFocus); |
- } |
- } |
- if (m_pFocusWidget == m_pOldFocusWidget) { |
- return FALSE; |
- } |
- pNewFocus = m_pOldFocusWidget; |
- if (m_pListFocusWidget && pNewFocus == m_pListFocusWidget) { |
- m_pFocusAcc = NULL; |
- m_pFocusWidget = NULL; |
- m_pListFocusWidget = NULL; |
- m_pOldFocusWidget = NULL; |
- return FALSE; |
- } |
- if (pNewFocus && (pNewFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) { |
- if (!pNewFocus->IsLoaded()) { |
- pNewFocus->LoadWidget(); |
- } |
- pNewFocus->OnSetFocus(m_pFocusWidget); |
- } |
- m_pFocusAcc = pNewFocus ? pNewFocus->GetDataAcc() : NULL; |
- m_pFocusWidget = pNewFocus; |
- m_pOldFocusWidget = m_pFocusWidget; |
- return TRUE; |
-} |
-CXFA_WidgetAcc* CXFA_FFDocView::GetFocusWidgetAcc() { |
- return m_pFocusAcc; |
-} |
-void CXFA_FFDocView::SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) { |
- CXFA_FFWidget* pNewFocus = |
- pWidgetAcc ? pWidgetAcc->GetNextWidget(NULL) : NULL; |
- if (SetFocus(pNewFocus)) { |
- m_pFocusAcc = pWidgetAcc; |
- if (m_iStatus >= XFA_DOCVIEW_LAYOUTSTATUS_End) { |
- m_pDoc->GetDocProvider()->SetFocusWidget(m_pDoc, m_pFocusWidget); |
- } |
- } |
-} |
-void CXFA_FFDocView::DeleteLayoutItem(CXFA_FFWidget* pWidget) { |
- if (m_pFocusAcc == pWidget->GetDataAcc()) { |
- m_pFocusAcc = NULL; |
- m_pFocusWidget = NULL; |
- m_pOldFocusWidget = NULL; |
- } |
-} |
-static int32_t XFA_ProcessEvent(CXFA_FFDocView* pDocView, |
- CXFA_WidgetAcc* pWidgetAcc, |
- CXFA_EventParam* pParam) { |
- if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) { |
- return XFA_EVENTERROR_NotExist; |
- } |
- if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) { |
- return XFA_EVENTERROR_NotExist; |
- } |
- switch (pParam->m_eType) { |
- case XFA_EVENT_Calculate: |
- return pWidgetAcc->ProcessCalculate(); |
- case XFA_EVENT_Validate: |
- if (((CXFA_FFDoc*)pDocView->GetDoc()) |
- ->GetDocProvider() |
- ->IsValidationsEnabled(pDocView->GetDoc())) { |
- return pWidgetAcc->ProcessValidate(0x01); |
- } |
- return XFA_EVENTERROR_Disabled; |
- case XFA_EVENT_InitCalculate: { |
- CXFA_Calculate calc = pWidgetAcc->GetCalculate(); |
- if (!calc) { |
- return XFA_EVENTERROR_NotExist; |
- } |
- if (pWidgetAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) { |
- return XFA_EVENTERROR_Disabled; |
- } |
- CXFA_Script script = calc.GetScript(); |
- return pWidgetAcc->ExecuteScript(script, pParam); |
- } |
- default: |
- break; |
- } |
- int32_t iRet = |
- pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam); |
- return iRet; |
-} |
-int32_t CXFA_FFDocView::ExecEventActivityByDeepFirst(CXFA_Node* pFormNode, |
- XFA_EVENTTYPE eEventType, |
- FX_BOOL bIsFormReady, |
- FX_BOOL bRecursive, |
- CXFA_Node* pExclude) { |
- int32_t iRet = XFA_EVENTERROR_NotExist; |
- if (pFormNode == pExclude) { |
- return iRet; |
- } |
- XFA_ELEMENT elementType = pFormNode->GetClassID(); |
- if (elementType == XFA_ELEMENT_Field) { |
- if (eEventType == XFA_EVENT_IndexChange) { |
- return iRet; |
- } |
- CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData(); |
- if (pWidgetAcc == NULL) { |
- return iRet; |
- } |
- CXFA_EventParam eParam; |
- eParam.m_eType = eEventType; |
- eParam.m_pTarget = pWidgetAcc; |
- eParam.m_bIsFormReady = bIsFormReady; |
- return XFA_ProcessEvent(this, pWidgetAcc, &eParam); |
- } |
- if (bRecursive) { |
- for (CXFA_Node* pNode = pFormNode->GetNodeItem( |
- XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode); |
- pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling, |
- XFA_OBJECTTYPE_ContainerNode)) { |
- elementType = pNode->GetClassID(); |
- if (elementType != XFA_ELEMENT_Variables && |
- elementType != XFA_ELEMENT_Draw) { |
- iRet |= ExecEventActivityByDeepFirst(pNode, eEventType, bIsFormReady, |
- bRecursive, pExclude); |
- } |
- } |
- } |
- CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData(); |
- if (pWidgetAcc == NULL) { |
- 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; |
-} |
-CXFA_FFWidget* CXFA_FFDocView::GetWidgetByName(const CFX_WideStringC& wsName, |
- CXFA_FFWidget* pRefWidget) { |
- CXFA_WidgetAcc* pRefAcc = pRefWidget ? pRefWidget->GetDataAcc() : NULL; |
- if (CXFA_WidgetAcc* pAcc = GetWidgetAccByName(wsName, pRefAcc)) { |
- return pAcc->GetNextWidget(NULL); |
- } |
- return NULL; |
-} |
-CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName( |
- const CFX_WideStringC& wsName, |
- CXFA_WidgetAcc* pRefWidgetAcc) { |
- CFX_WideString wsExpression; |
- FX_DWORD dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | |
- XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; |
- IXFA_ScriptContext* pScriptContext = m_pDoc->GetXFADoc()->GetScriptContext(); |
- if (!pScriptContext) { |
- return NULL; |
- } |
- CXFA_Node* refNode = NULL; |
- if (pRefWidgetAcc != NULL) { |
- refNode = pRefWidgetAcc->GetNode(); |
- wsExpression = wsName; |
- } else { |
- wsExpression = L"$form." + wsName; |
- } |
- XFA_RESOLVENODE_RS resoveNodeRS; |
- int32_t iRet = pScriptContext->ResolveObjects(refNode, wsExpression, |
- resoveNodeRS, dwStyle); |
- if (iRet < 1) { |
- return NULL; |
- } |
- if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { |
- CXFA_Object* pNode = resoveNodeRS.nodes[0]; |
- if (pNode->IsNode()) { |
- return (CXFA_WidgetAcc*)((CXFA_Node*)pNode)->GetWidgetData(); |
- } |
- } |
- return NULL; |
-} |
-void CXFA_FFDocView::OnPageEvent(IXFA_LayoutPage* pSender, |
- XFA_PAGEEVENT eEvent, |
- int32_t iPageIndex) { |
- FX_BOOL bNofify = m_iStatus >= XFA_DOCVIEW_LAYOUTSTATUS_End; |
- CXFA_FFPageView* pFFPageView = static_cast<CXFA_FFPageView*>(pSender); |
- if (eEvent == XFA_PAGEEVENT_PageRemoved) { |
- if (bNofify) { |
- m_pDoc->GetDocProvider()->PageViewEvent(pFFPageView, |
- XFA_PAGEVIEWEVENT_PostRemoved); |
- } |
- } else if (eEvent == XFA_PAGEEVENT_PageAdded) { |
- if (bNofify) { |
- m_pDoc->GetDocProvider()->PageViewEvent(pFFPageView, |
- XFA_PAGEVIEWEVENT_PostAdded); |
- pFFPageView->LoadPageView(); |
- } |
- } |
-} |
-void CXFA_FFDocView::LockUpdate() { |
- m_iLock++; |
-} |
-void CXFA_FFDocView::UnlockUpdate() { |
- m_iLock--; |
-} |
-FX_BOOL CXFA_FFDocView::IsUpdateLocked() { |
- return m_iLock; |
-} |
-void CXFA_FFDocView::ClearInvalidateList() { |
- FX_POSITION ps = m_mapPageInvalidate.GetStartPosition(); |
- while (ps) { |
- void* pPageView = NULL; |
- CFX_RectF* pRect = NULL; |
- m_mapPageInvalidate.GetNextAssoc(ps, pPageView, (void*&)pRect); |
- delete pRect; |
- } |
- m_mapPageInvalidate.RemoveAll(); |
-} |
-void CXFA_FFDocView::AddInvalidateRect(CXFA_FFWidget* pWidget, |
- const CFX_RectF& rtInvalidate) { |
- AddInvalidateRect(pWidget->GetPageView(), rtInvalidate); |
-} |
-void CXFA_FFDocView::AddInvalidateRect(IXFA_PageView* pPageView, |
- const CFX_RectF& rtInvalidate) { |
- CFX_RectF* pRect = (CFX_RectF*)m_mapPageInvalidate.GetValueAt(pPageView); |
- if (!pRect) { |
- pRect = new CFX_RectF; |
- pRect->Set(rtInvalidate.left, rtInvalidate.top, rtInvalidate.width, |
- rtInvalidate.height); |
- m_mapPageInvalidate.SetAt(pPageView, pRect); |
- } else { |
- pRect->Union(rtInvalidate); |
- } |
-} |
-void CXFA_FFDocView::RunInvalidate() { |
- FX_POSITION ps = m_mapPageInvalidate.GetStartPosition(); |
- while (ps) { |
- IXFA_PageView* pPageView = NULL; |
- CFX_RectF* pRect = NULL; |
- m_mapPageInvalidate.GetNextAssoc(ps, (void*&)pPageView, (void*&)pRect); |
- m_pDoc->GetDocProvider()->InvalidateRect(pPageView, *pRect); |
- delete pRect; |
- } |
- m_mapPageInvalidate.RemoveAll(); |
-} |
-FX_BOOL CXFA_FFDocView::RunLayout() { |
- LockUpdate(); |
- m_bInLayoutStatus = TRUE; |
- if (!m_pXFADocLayout->IncrementLayout() && |
- m_pXFADocLayout->StartLayout() < 100) { |
- m_pXFADocLayout->DoLayout(); |
- UnlockUpdate(); |
- m_bInLayoutStatus = FALSE; |
- return TRUE; |
- } |
- m_bInLayoutStatus = FALSE; |
- UnlockUpdate(); |
- return FALSE; |
-} |
-void CXFA_FFDocView::RunSubformIndexChange() { |
- int32_t iSubforms = m_IndexChangedSubforms.GetSize(); |
- for (int32_t i = 0; i < iSubforms; i++) { |
- CXFA_Node* pSubformNode = (CXFA_Node*)m_IndexChangedSubforms[i]; |
- CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pSubformNode->GetWidgetData(); |
- if (!pWidgetAcc) { |
- continue; |
- } |
- CXFA_EventParam eParam; |
- eParam.m_eType = XFA_EVENT_IndexChange; |
- eParam.m_pTarget = pWidgetAcc; |
- pWidgetAcc->ProcessEvent(XFA_ATTRIBUTEENUM_IndexChange, &eParam); |
- } |
- m_IndexChangedSubforms.RemoveAll(); |
-} |
-void CXFA_FFDocView::AddNewFormNode(CXFA_Node* pNode) { |
- m_NewAddedNodes.Add(pNode); |
- this->InitLayout(pNode); |
-} |
-void CXFA_FFDocView::AddIndexChangedSubform(CXFA_Node* pNode) { |
- FXSYS_assert(pNode->GetClassID() == XFA_ELEMENT_Subform); |
- m_IndexChangedSubforms.Add(pNode); |
-} |
-void CXFA_FFDocView::RunDocClose() { |
- CXFA_Node* pRootItem = |
- (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); |
- if (!pRootItem) { |
- return; |
- } |
- ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocClose); |
-} |
-void CXFA_FFDocView::DestroyDocView() { |
- ClearInvalidateList(); |
- m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_None; |
- m_iLock = 0; |
- m_ValidateAccs.RemoveAll(); |
- m_bindItems.RemoveAll(); |
- m_CalculateAccs.RemoveAll(); |
-} |
-FX_BOOL CXFA_FFDocView::IsStaticNotify() { |
- return m_pDoc->GetDocType() == XFA_DOCTYPE_Static; |
-} |
-void CXFA_FFDocView::AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) { |
- int32_t iAccs = m_CalculateAccs.GetSize(); |
- CXFA_WidgetAcc* pCurrentAcc = |
- (iAccs < 1) ? (CXFA_WidgetAcc*)NULL |
- : (CXFA_WidgetAcc*)m_CalculateAccs[iAccs - 1]; |
- if (pCurrentAcc != pWidgetAcc) { |
- m_CalculateAccs.Add(pWidgetAcc); |
- } |
-} |
-void CXFA_FFDocView::AddCalculateNodeNotify(CXFA_Node* pNodeChange) { |
- CXFA_CalcData* pGlobalData = |
- (CXFA_CalcData*)pNodeChange->GetUserData(XFA_CalcData); |
- int32_t iCount = pGlobalData ? pGlobalData->m_Globals.GetSize() : 0; |
- for (int32_t i = 0; i < iCount; i++) { |
- CXFA_WidgetAcc* pResultAcc = (CXFA_WidgetAcc*)pGlobalData->m_Globals[i]; |
- if (pResultAcc->GetNode()->HasFlag(XFA_NODEFLAG_HasRemoved)) { |
- continue; |
- } |
- int32_t iAccs = m_CalculateAccs.GetSize(); |
- CXFA_WidgetAcc* pCurrentAcc = |
- (iAccs < 1) ? (CXFA_WidgetAcc*)NULL |
- : (CXFA_WidgetAcc*)m_CalculateAccs[iAccs - 1]; |
- if (pCurrentAcc != pResultAcc) { |
- m_CalculateAccs.Add(pResultAcc); |
- } |
- } |
-} |
-void CXFA_FFDocView::RunCalculateRecursive(int32_t& iIndex) { |
- while (iIndex < m_CalculateAccs.GetSize()) { |
- CXFA_WidgetAcc* pCurAcc = (CXFA_WidgetAcc*)m_CalculateAccs[iIndex]; |
- AddCalculateNodeNotify(pCurAcc->GetNode()); |
- int32_t iRefCount = |
- (int32_t)(uintptr_t)pCurAcc->GetNode()->GetUserData(XFA_CalcRefCount); |
- iRefCount++; |
- pCurAcc->GetNode()->SetUserData(XFA_CalcRefCount, |
- (void*)(uintptr_t)iRefCount); |
- if (iRefCount > 11) { |
- break; |
- } |
- if ((pCurAcc->ProcessCalculate()) == XFA_EVENTERROR_Sucess) { |
- AddValidateWidget(pCurAcc); |
- } |
- iIndex++; |
- RunCalculateRecursive(iIndex); |
- } |
-} |
-int32_t CXFA_FFDocView::RunCalculateWidgets() { |
- if (!m_pDoc->GetDocProvider()->IsCalculationsEnabled(m_pDoc)) { |
- return XFA_EVENTERROR_Disabled; |
- } |
- int32_t iCounts = m_CalculateAccs.GetSize(); |
- int32_t iIndex = 0; |
- if (iCounts > 0) { |
- RunCalculateRecursive(iIndex); |
- } |
- for (int32_t i = 0; i < m_CalculateAccs.GetSize(); i++) { |
- CXFA_WidgetAcc* pCurAcc = (CXFA_WidgetAcc*)m_CalculateAccs[i]; |
- pCurAcc->GetNode()->SetUserData(XFA_CalcRefCount, (void*)(uintptr_t)0); |
- } |
- m_CalculateAccs.RemoveAll(); |
- return XFA_EVENTERROR_Sucess; |
-} |
-void CXFA_FFDocView::AddValidateWidget(CXFA_WidgetAcc* pWidget) { |
- if (m_ValidateAccs.Find(pWidget) < 0) { |
- m_ValidateAccs.Add(pWidget); |
- } |
-} |
-FX_BOOL CXFA_FFDocView::InitCalculate(CXFA_Node* pNode) { |
- ExecEventActivityByDeepFirst(pNode, XFA_EVENT_InitCalculate); |
- return TRUE; |
-} |
-FX_BOOL CXFA_FFDocView::InitValidate(CXFA_Node* pNode) { |
- if (!m_pDoc->GetDocProvider()->IsValidationsEnabled(m_pDoc)) { |
- return FALSE; |
- } |
- ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Validate); |
- m_ValidateAccs.RemoveAll(); |
- return TRUE; |
-} |
-FX_BOOL CXFA_FFDocView::RunValidate() { |
- if (!m_pDoc->GetDocProvider()->IsValidationsEnabled(m_pDoc)) { |
- return FALSE; |
- } |
- int32_t iCounts = m_ValidateAccs.GetSize(); |
- for (int32_t i = 0; i < iCounts; i++) { |
- CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)m_ValidateAccs[i]; |
- if (pAcc->GetNode()->HasFlag(XFA_NODEFLAG_HasRemoved)) { |
- continue; |
- } |
- pAcc->ProcessValidate(); |
- } |
- m_ValidateAccs.RemoveAll(); |
- return TRUE; |
-} |
-FX_BOOL CXFA_FFDocView::RunEventLayoutReady() { |
- CXFA_Node* pRootItem = |
- (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); |
- if (!pRootItem) { |
- return FALSE; |
- } |
- ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready); |
- RunLayout(); |
- return TRUE; |
-} |
-void CXFA_FFDocView::RunBindItems() { |
- int32_t iCount = m_bindItems.GetSize(); |
- for (int32_t i = 0; i < iCount; i++) { |
- if (((CXFA_Node*)m_bindItems[i])->HasFlag(XFA_NODEFLAG_HasRemoved)) { |
- continue; |
- } |
- CXFA_Node* pWidgetNode = |
- ((CXFA_Node*)m_bindItems[i])->GetNodeItem(XFA_NODEITEM_Parent); |
- CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pWidgetNode->GetWidgetData(); |
- if (!pAcc) { |
- continue; |
- } |
- CXFA_BindItems binditems((CXFA_Node*)m_bindItems[i]); |
- IXFA_ScriptContext* pScriptContext = |
- pWidgetNode->GetDocument()->GetScriptContext(); |
- CFX_WideStringC wsRef; |
- binditems.GetRef(wsRef); |
- FX_DWORD dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | |
- XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent | |
- XFA_RESOLVENODE_ALL; |
- XFA_RESOLVENODE_RS rs; |
- pScriptContext->ResolveObjects(pWidgetNode, wsRef, rs, dwStyle); |
- int32_t iCount = rs.nodes.GetSize(); |
- pAcc->DeleteItem(-1); |
- if (rs.dwFlags != XFA_RESOVENODE_RSTYPE_Nodes || iCount < 1) { |
- continue; |
- } |
- CFX_WideStringC wsValueRef, wsLabelRef; |
- binditems.GetValueRef(wsValueRef); |
- binditems.GetLabelRef(wsLabelRef); |
- FX_BOOL bUseValue = wsLabelRef.IsEmpty() || wsLabelRef == wsValueRef; |
- FX_BOOL bLabelUseContent = |
- wsLabelRef.IsEmpty() || wsLabelRef == FX_WSTRC(L"$"); |
- FX_BOOL bValueUseContent = |
- wsValueRef.IsEmpty() || wsValueRef == FX_WSTRC(L"$"); |
- CFX_WideString wsValue, wsLabel; |
- FX_DWORD uValueHash = FX_HashCode_String_GetW(CFX_WideString(wsValueRef), |
- wsValueRef.GetLength()); |
- for (int32_t i = 0; i < iCount; i++) { |
- CXFA_Object* refObj = rs.nodes[i]; |
- if (!refObj->IsNode()) { |
- continue; |
- } |
- CXFA_Node* refNode = (CXFA_Node*)refObj; |
- if (bValueUseContent) { |
- wsValue = refNode->GetContent(); |
- } else { |
- CXFA_Node* nodeValue = refNode->GetFirstChildByName(uValueHash); |
- if (nodeValue == NULL) { |
- wsValue = refNode->GetContent(); |
- } else { |
- wsValue = nodeValue->GetContent(); |
- } |
- } |
- if (!bUseValue) { |
- if (bLabelUseContent) { |
- wsLabel = refNode->GetContent(); |
- } else { |
- CXFA_Node* nodeLabel = refNode->GetFirstChildByName(wsLabelRef); |
- if (nodeLabel != NULL) { |
- wsLabel = nodeLabel->GetContent(); |
- } |
- } |
- } else { |
- wsLabel = wsValue; |
- } |
- pAcc->InsertItem(wsLabel, wsValue); |
- } |
- } |
- m_bindItems.RemoveAll(); |
-} |
-void CXFA_FFDocView::SetChangeMark() { |
- if (m_iStatus < XFA_DOCVIEW_LAYOUTSTATUS_End) { |
- return; |
- } |
- m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc); |
-} |
-CXFA_Node* CXFA_FFDocView::GetRootSubform() { |
- CXFA_Node* pFormPacketNode = |
- (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); |
- if (!pFormPacketNode) { |
- return NULL; |
- } |
- return pFormPacketNode->GetFirstChildByClass(XFA_ELEMENT_Subform); |
-} |
-CXFA_FFDocWidgetIterator::CXFA_FFDocWidgetIterator(CXFA_FFDocView* pDocView, |
- CXFA_Node* pTravelRoot) |
- : m_ContentIterator(pTravelRoot) { |
- m_pDocView = pDocView; |
- m_pCurWidget = NULL; |
-} |
-CXFA_FFDocWidgetIterator::~CXFA_FFDocWidgetIterator() {} |
-void CXFA_FFDocWidgetIterator::Reset() { |
- m_ContentIterator.Reset(); |
- m_pCurWidget = NULL; |
-} |
-IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToFirst() { |
- return NULL; |
-} |
-IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToLast() { |
- return NULL; |
-} |
-IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToNext() { |
- CXFA_Node* pItem = m_pCurWidget ? m_ContentIterator.MoveToNext() |
- : m_ContentIterator.GetCurrent(); |
- while (pItem) { |
- if (CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData()) { |
- while ((m_pCurWidget = pAcc->GetNextWidget(NULL)) != NULL) { |
- if (!m_pCurWidget->IsLoaded() && |
- (m_pCurWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) { |
- m_pCurWidget->LoadWidget(); |
- } |
- return m_pCurWidget; |
- } |
- } |
- pItem = m_ContentIterator.MoveToNext(); |
- } |
- return NULL; |
-} |
-IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToPrevious() { |
- return NULL; |
-} |
-IXFA_Widget* CXFA_FFDocWidgetIterator::GetCurrentWidget() { |
- return NULL; |
-} |
-FX_BOOL CXFA_FFDocWidgetIterator::SetCurrentWidget(IXFA_Widget* hWidget) { |
- return FALSE; |
-} |
-IXFA_WidgetAccIterator* XFA_WidgetAccIterator_Create( |
- CXFA_WidgetAcc* pTravelRoot, |
- XFA_WIDGETORDER eOrder) { |
- if (!pTravelRoot) { |
- return NULL; |
- } |
- return new CXFA_WidgetAccIterator(pTravelRoot->GetDocView(), |
- pTravelRoot->GetNode()); |
-} |
-CXFA_WidgetAccIterator::CXFA_WidgetAccIterator(CXFA_FFDocView* pDocView, |
- CXFA_Node* pTravelRoot) |
- : m_ContentIterator(pTravelRoot) { |
- m_pDocView = pDocView; |
- m_pCurWidgetAcc = NULL; |
-} |
-CXFA_WidgetAccIterator::~CXFA_WidgetAccIterator() {} |
-void CXFA_WidgetAccIterator::Reset() { |
- m_pCurWidgetAcc = NULL; |
- m_ContentIterator.Reset(); |
-} |
-CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToFirst() { |
- return NULL; |
-} |
-CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToLast() { |
- return NULL; |
-} |
-CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToNext() { |
- CXFA_Node* pItem = m_pCurWidgetAcc ? m_ContentIterator.MoveToNext() |
- : m_ContentIterator.GetCurrent(); |
- while (pItem) { |
- if ((m_pCurWidgetAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData()) != NULL) { |
- return m_pCurWidgetAcc; |
- } |
- pItem = m_ContentIterator.MoveToNext(); |
- } |
- return NULL; |
-} |
-CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToPrevious() { |
- return NULL; |
-} |
-CXFA_WidgetAcc* CXFA_WidgetAccIterator::GetCurrentWidgetAcc() { |
- return NULL; |
-} |
-FX_BOOL CXFA_WidgetAccIterator::SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget) { |
- return FALSE; |
-} |
-void CXFA_WidgetAccIterator::SkipTree() { |
- m_ContentIterator.SkipChildrenAndMoveToNext(); |
- m_pCurWidgetAcc = NULL; |
-} |
+// Copyright 2014 PDFium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
+ |
+#include "xfa/src/foxitlib.h" |
+#include "xfa/src/fxfa/src/common/xfa_common.h" |
+#include "xfa_fwladapter.h" |
+#include "xfa_ffdocview.h" |
+#include "xfa_ffpageview.h" |
+#include "xfa_ffwidgethandler.h" |
+#include "xfa_ffdoc.h" |
+#include "xfa_ffwidget.h" |
+#include "xfa_fffield.h" |
+#include "xfa_ffpushbutton.h" |
+#include "xfa_ffcheckbutton.h" |
+#include "xfa_ffchoicelist.h" |
+#include "xfa_ffimageedit.h" |
+#include "xfa_fftextedit.h" |
+#include "xfa_ffbarcode.h" |
+#include "xfa_ffdraw.h" |
+#include "xfa_fftext.h" |
+#include "xfa_ffpath.h" |
+#include "xfa_ffimage.h" |
+#include "xfa_ffexclgroup.h" |
+#include "xfa_ffsubform.h" |
+#include "xfa_ffsignature.h" |
+#include "xfa_ffapp.h" |
+#include "xfa_textlayout.h" |
+#include "xfa_ffwidgetacc.h" |
+extern const XFA_ATTRIBUTEENUM gs_EventActivity[] = { |
+ XFA_ATTRIBUTEENUM_Click, XFA_ATTRIBUTEENUM_Change, |
+ XFA_ATTRIBUTEENUM_DocClose, XFA_ATTRIBUTEENUM_DocReady, |
+ XFA_ATTRIBUTEENUM_Enter, XFA_ATTRIBUTEENUM_Exit, |
+ XFA_ATTRIBUTEENUM_Full, XFA_ATTRIBUTEENUM_IndexChange, |
+ XFA_ATTRIBUTEENUM_Initialize, XFA_ATTRIBUTEENUM_MouseDown, |
+ XFA_ATTRIBUTEENUM_MouseEnter, XFA_ATTRIBUTEENUM_MouseExit, |
+ XFA_ATTRIBUTEENUM_MouseUp, XFA_ATTRIBUTEENUM_PostExecute, |
+ XFA_ATTRIBUTEENUM_PostOpen, XFA_ATTRIBUTEENUM_PostPrint, |
+ XFA_ATTRIBUTEENUM_PostSave, XFA_ATTRIBUTEENUM_PostSign, |
+ XFA_ATTRIBUTEENUM_PostSubmit, XFA_ATTRIBUTEENUM_PreExecute, |
+ XFA_ATTRIBUTEENUM_PreOpen, XFA_ATTRIBUTEENUM_PrePrint, |
+ XFA_ATTRIBUTEENUM_PreSave, XFA_ATTRIBUTEENUM_PreSign, |
+ XFA_ATTRIBUTEENUM_PreSubmit, XFA_ATTRIBUTEENUM_Ready, |
+ XFA_ATTRIBUTEENUM_Unknown, |
+}; |
+CXFA_FFDocView::CXFA_FFDocView(CXFA_FFDoc* pDoc) |
+ : m_bLayoutEvent(FALSE), |
+ m_pListFocusWidget(nullptr), |
+ m_bInLayoutStatus(FALSE), |
+ m_pDoc(pDoc), |
+ m_pWidgetHandler(nullptr), |
+ m_pXFADocLayout(nullptr), |
+ m_pFocusAcc(nullptr), |
+ m_pFocusWidget(nullptr), |
+ m_pOldFocusWidget(nullptr), |
+ m_iStatus(XFA_DOCVIEW_LAYOUTSTATUS_None), |
+ m_iLock(0) { |
+} |
+CXFA_FFDocView::~CXFA_FFDocView() { |
+ DestroyDocView(); |
+ if (m_pWidgetHandler) { |
+ delete m_pWidgetHandler; |
+ } |
+ m_pWidgetHandler = NULL; |
+} |
+void CXFA_FFDocView::InitLayout(CXFA_Node* pNode) { |
+ RunBindItems(); |
+ ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Initialize); |
+ ExecEventActivityByDeepFirst(pNode, XFA_EVENT_IndexChange); |
+} |
+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) { |
+ return iStatus; |
+ } |
+ CXFA_Node* pRootItem = |
+ (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); |
+ if (!pRootItem) { |
+ return iStatus; |
+ } |
+ InitLayout(pRootItem); |
+ InitCalculate(pRootItem); |
+ InitValidate(pRootItem); |
+ ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, TRUE); |
+ m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start; |
+ return iStatus; |
+} |
+int32_t CXFA_FFDocView::DoLayout(IFX_Pause* pPause) { |
+ int32_t iStatus = 100; |
+ iStatus = m_pXFADocLayout->DoLayout(pPause); |
+ if (iStatus != 100) { |
+ return iStatus; |
+ } |
+ m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Doing; |
+ return iStatus; |
+} |
+void CXFA_FFDocView::StopLayout() { |
+ CXFA_Node* pRootItem = |
+ (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); |
+ if (!pRootItem) { |
+ return; |
+ } |
+ CXFA_Node* pSubformNode = pRootItem->GetChild(0, XFA_ELEMENT_Subform); |
+ if (!pSubformNode) { |
+ return; |
+ } |
+ CXFA_Node* pPageSetNode = |
+ pSubformNode->GetFirstChildByClass(XFA_ELEMENT_PageSet); |
+ if (!pPageSetNode) { |
+ return; |
+ } |
+ RunCalculateWidgets(); |
+ RunValidate(); |
+ InitLayout(pPageSetNode); |
+ InitCalculate(pPageSetNode); |
+ InitValidate(pPageSetNode); |
+ ExecEventActivityByDeepFirst(pPageSetNode, XFA_EVENT_Ready, TRUE); |
+ ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready); |
+ ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocReady); |
+ RunCalculateWidgets(); |
+ RunValidate(); |
+ if (RunLayout()) { |
+ ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready); |
+ } |
+ m_CalculateAccs.RemoveAll(); |
+ if (m_pFocusAcc && !m_pFocusWidget) { |
+ SetFocusWidgetAcc(m_pFocusAcc); |
+ } |
+ m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_End; |
+} |
+int32_t CXFA_FFDocView::GetLayoutStatus() { |
+ return m_iStatus; |
+} |
+void CXFA_FFDocView::ShowNullTestMsg() { |
+ int32_t iCount = m_arrNullTestMsg.GetSize(); |
+ CXFA_FFApp* pApp = m_pDoc->GetApp(); |
+ IXFA_AppProvider* pAppProvider = pApp->GetAppProvider(); |
+ if (pAppProvider && iCount) { |
+ int32_t iRemain = iCount > 7 ? iCount - 7 : 0; |
+ iCount -= iRemain; |
+ CFX_WideString wsMsg; |
+ for (int32_t i = 0; i < iCount; i++) { |
+ wsMsg += m_arrNullTestMsg[i] + FX_WSTRC(L"\n"); |
+ } |
+ if (iRemain > 0) { |
+ CFX_WideString wsLimit; |
+ pAppProvider->LoadString(XFA_IDS_ValidateLimit, wsLimit); |
+ if (!wsLimit.IsEmpty()) { |
+ CFX_WideString wsTemp; |
+ wsTemp.Format((const FX_WCHAR*)wsLimit, iRemain); |
+ wsMsg += FX_WSTRC(L"\n") + wsTemp; |
+ } |
+ } |
+ CFX_WideString wsTitle; |
+ pAppProvider->LoadString(XFA_IDS_AppName, wsTitle); |
+ pAppProvider->MsgBox(wsMsg, wsTitle, XFA_MBICON_Status, XFA_MB_OK); |
+ } |
+ m_arrNullTestMsg.RemoveAll(); |
+} |
+void CXFA_FFDocView::UpdateDocView() { |
+ if (IsUpdateLocked()) { |
+ return; |
+ } |
+ LockUpdate(); |
+ int32_t iNewAdds = m_NewAddedNodes.GetSize(); |
+ for (int32_t i = 0; i < iNewAdds; i++) { |
+ CXFA_Node* pNode = (CXFA_Node*)m_NewAddedNodes[i]; |
+ InitCalculate(pNode); |
+ InitValidate(pNode); |
+ ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Ready, TRUE); |
+ } |
+ m_NewAddedNodes.RemoveAll(); |
+ this->RunSubformIndexChange(); |
+ this->RunCalculateWidgets(); |
+ this->RunValidate(); |
+ ShowNullTestMsg(); |
+ m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Next; |
+ if (RunLayout() && m_bLayoutEvent) { |
+ RunEventLayoutReady(); |
+ } |
+ m_bLayoutEvent = FALSE; |
+ m_CalculateAccs.RemoveAll(); |
+ this->RunInvalidate(); |
+ UnlockUpdate(); |
+} |
+int32_t CXFA_FFDocView::CountPageViews() { |
+ if (!m_pXFADocLayout) { |
+ return 0; |
+ } |
+ return m_pXFADocLayout->CountPages(); |
+} |
+IXFA_PageView* CXFA_FFDocView::GetPageView(int32_t nIndex) { |
+ if (!m_pXFADocLayout) { |
+ return NULL; |
+ } |
+ return static_cast<CXFA_FFPageView*>(m_pXFADocLayout->GetPage(nIndex)); |
+} |
+IXFA_Widget* CXFA_FFDocView::GetWidgetByName(const CFX_WideStringC& wsName) { |
+ return GetWidgetByName(wsName, NULL); |
+} |
+CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName( |
+ const CFX_WideStringC& wsName) { |
+ return GetWidgetAccByName(wsName, NULL); |
+} |
+IXFA_DocLayout* CXFA_FFDocView::GetXFALayout() const { |
+ return m_pDoc->GetXFADoc()->GetDocLayout(); |
+} |
+FX_BOOL CXFA_FFDocView::ResetSingleWidgetAccData(CXFA_WidgetAcc* pWidgetAcc) { |
+ CXFA_Node* pNode = pWidgetAcc->GetNode(); |
+ XFA_ELEMENT eType = pNode->GetClassID(); |
+ if (eType != XFA_ELEMENT_Field && eType != XFA_ELEMENT_ExclGroup) { |
+ return FALSE; |
+ } |
+ FX_BOOL bNotify = IsStaticNotify(); |
+ pWidgetAcc->ResetData(); |
+ pWidgetAcc->UpdateUIDisplay(); |
+ if (bNotify) { |
+ pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL, NULL, |
+ NULL); |
+ } |
+ if (CXFA_Validate validate = pWidgetAcc->GetValidate()) { |
+ AddValidateWidget(pWidgetAcc); |
+ ((CXFA_Node*)validate)->SetFlag(XFA_NODEFLAG_NeedsInitApp, TRUE, FALSE); |
+ } |
+ return TRUE; |
+} |
+void CXFA_FFDocView::ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc) { |
+ m_bLayoutEvent = TRUE; |
+ FX_BOOL bChanged = FALSE; |
+ CXFA_Node* pFormNode = NULL; |
+ if (pWidgetAcc) { |
+ bChanged = ResetSingleWidgetAccData(pWidgetAcc); |
+ pFormNode = pWidgetAcc->GetNode(); |
+ } else { |
+ pFormNode = GetRootSubform(); |
+ } |
+ if (!pFormNode) { |
+ return; |
+ } |
+ if (pFormNode->GetClassID() != XFA_ELEMENT_Field && |
+ pFormNode->GetClassID() != XFA_ELEMENT_ExclGroup) { |
+ CXFA_WidgetAccIterator Iterator(this, pFormNode); |
+ while (CXFA_WidgetAcc* pAcc = Iterator.MoveToNext()) { |
+ bChanged |= ResetSingleWidgetAccData(pAcc); |
+ if (pAcc->GetNode()->GetClassID() == XFA_ELEMENT_ExclGroup) { |
+ Iterator.SkipTree(); |
+ } |
+ } |
+ } |
+ if (bChanged) { |
+ m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc); |
+ } |
+} |
+int32_t CXFA_FFDocView::ProcessWidgetEvent(CXFA_EventParam* pParam, |
+ CXFA_WidgetAcc* pWidgetAcc) { |
+ if (pParam == NULL) { |
+ return XFA_EVENTERROR_Error; |
+ } |
+ if (pParam->m_eType == XFA_EVENT_Validate) { |
+ CFX_WideString wsValidateStr = FX_WSTRC(L"preSubmit"); |
+ CXFA_Node* pConfigItem = |
+ (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Config); |
+ if (pConfigItem) { |
+ CXFA_Node* pValidateNode = NULL; |
+ CXFA_Node* pAcrobatNode = pConfigItem->GetChild(0, XFA_ELEMENT_Acrobat); |
+ pValidateNode = |
+ pAcrobatNode ? pAcrobatNode->GetChild(0, XFA_ELEMENT_Validate) : NULL; |
+ if (!pValidateNode) { |
+ CXFA_Node* pPresentNode = pConfigItem->GetChild(0, XFA_ELEMENT_Present); |
+ pValidateNode = pPresentNode |
+ ? pPresentNode->GetChild(0, XFA_ELEMENT_Validate) |
+ : NULL; |
+ } |
+ if (pValidateNode) { |
+ wsValidateStr = pValidateNode->GetContent(); |
+ } |
+ } |
+ FX_BOOL bValidate = FALSE; |
+ switch (pParam->m_iValidateActivities) { |
+ case XFA_VALIDATE_preSubmit: |
+ bValidate = wsValidateStr.Find(L"preSubmit") != -1; |
+ break; |
+ case XFA_VALIDATE_prePrint: |
+ bValidate = wsValidateStr.Find(L"prePrint") != -1; |
+ break; |
+ case XFA_VALIDATE_preExecute: |
+ bValidate = wsValidateStr.Find(L"preExecute") != -1; |
+ break; |
+ case XFA_VALIDATE_preSave: |
+ bValidate = wsValidateStr.Find(L"preSave") != -1; |
+ break; |
+ } |
+ if (!bValidate) { |
+ return XFA_EVENTERROR_Sucess; |
+ } |
+ } |
+ CXFA_Node* pNode = pWidgetAcc ? pWidgetAcc->GetNode() : NULL; |
+ if (!pNode) { |
+ CXFA_Node* pRootItem = |
+ (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); |
+ if (!pRootItem) { |
+ return XFA_EVENTERROR_Error; |
+ } |
+ pNode = pRootItem->GetChild(0, XFA_ELEMENT_Subform); |
+ } |
+ ExecEventActivityByDeepFirst(pNode, pParam->m_eType, pParam->m_bIsFormReady); |
+ return XFA_EVENTERROR_Sucess; |
+} |
+IXFA_WidgetHandler* CXFA_FFDocView::GetWidgetHandler() { |
+ if (!m_pWidgetHandler) { |
+ m_pWidgetHandler = new CXFA_FFWidgetHandler(this); |
+ } |
+ return m_pWidgetHandler; |
+} |
+IXFA_WidgetIterator* CXFA_FFDocView::CreateWidgetIterator() { |
+ CXFA_Node* pFormRoot = GetRootSubform(); |
+ if (!pFormRoot) { |
+ return NULL; |
+ } |
+ return new CXFA_FFDocWidgetIterator(this, pFormRoot); |
+} |
+IXFA_WidgetAccIterator* CXFA_FFDocView::CreateWidgetAccIterator( |
+ XFA_WIDGETORDER eOrder) { |
+ CXFA_Node* pFormRoot = GetRootSubform(); |
+ if (!pFormRoot) { |
+ return NULL; |
+ } |
+ return new CXFA_WidgetAccIterator(this, pFormRoot); |
+} |
+IXFA_Widget* CXFA_FFDocView::GetFocusWidget() { |
+ return m_pFocusWidget; |
+} |
+void CXFA_FFDocView::KillFocus() { |
+ if (m_pFocusWidget && |
+ (m_pFocusWidget->GetStatus() & XFA_WIDGETSTATUS_Focused)) { |
+ (m_pFocusWidget)->OnKillFocus(NULL); |
+ } |
+ m_pFocusAcc = NULL; |
+ m_pFocusWidget = NULL; |
+ m_pOldFocusWidget = NULL; |
+} |
+FX_BOOL CXFA_FFDocView::SetFocus(IXFA_Widget* hWidget) { |
+ CXFA_FFWidget* pNewFocus = (CXFA_FFWidget*)hWidget; |
+ if (m_pOldFocusWidget == pNewFocus) { |
+ return FALSE; |
+ } |
+ CXFA_FFWidget* pOldFocus = m_pOldFocusWidget; |
+ m_pOldFocusWidget = pNewFocus; |
+ if (pOldFocus) { |
+ if (m_pFocusWidget != m_pOldFocusWidget && |
+ (pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Focused)) { |
+ m_pFocusWidget = pOldFocus; |
+ pOldFocus->OnKillFocus(pNewFocus); |
+ } else if ((pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) { |
+ if (!pOldFocus->IsLoaded()) { |
+ pOldFocus->LoadWidget(); |
+ } |
+ pOldFocus->OnSetFocus(m_pFocusWidget); |
+ m_pFocusWidget = pOldFocus; |
+ pOldFocus->OnKillFocus(pNewFocus); |
+ } |
+ } |
+ if (m_pFocusWidget == m_pOldFocusWidget) { |
+ return FALSE; |
+ } |
+ pNewFocus = m_pOldFocusWidget; |
+ if (m_pListFocusWidget && pNewFocus == m_pListFocusWidget) { |
+ m_pFocusAcc = NULL; |
+ m_pFocusWidget = NULL; |
+ m_pListFocusWidget = NULL; |
+ m_pOldFocusWidget = NULL; |
+ return FALSE; |
+ } |
+ if (pNewFocus && (pNewFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) { |
+ if (!pNewFocus->IsLoaded()) { |
+ pNewFocus->LoadWidget(); |
+ } |
+ pNewFocus->OnSetFocus(m_pFocusWidget); |
+ } |
+ m_pFocusAcc = pNewFocus ? pNewFocus->GetDataAcc() : NULL; |
+ m_pFocusWidget = pNewFocus; |
+ m_pOldFocusWidget = m_pFocusWidget; |
+ return TRUE; |
+} |
+CXFA_WidgetAcc* CXFA_FFDocView::GetFocusWidgetAcc() { |
+ return m_pFocusAcc; |
+} |
+void CXFA_FFDocView::SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) { |
+ CXFA_FFWidget* pNewFocus = |
+ pWidgetAcc ? pWidgetAcc->GetNextWidget(NULL) : NULL; |
+ if (SetFocus(pNewFocus)) { |
+ m_pFocusAcc = pWidgetAcc; |
+ if (m_iStatus >= XFA_DOCVIEW_LAYOUTSTATUS_End) { |
+ m_pDoc->GetDocProvider()->SetFocusWidget(m_pDoc, m_pFocusWidget); |
+ } |
+ } |
+} |
+void CXFA_FFDocView::DeleteLayoutItem(CXFA_FFWidget* pWidget) { |
+ if (m_pFocusAcc == pWidget->GetDataAcc()) { |
+ m_pFocusAcc = NULL; |
+ m_pFocusWidget = NULL; |
+ m_pOldFocusWidget = NULL; |
+ } |
+} |
+static int32_t XFA_ProcessEvent(CXFA_FFDocView* pDocView, |
+ CXFA_WidgetAcc* pWidgetAcc, |
+ CXFA_EventParam* pParam) { |
+ if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) { |
+ return XFA_EVENTERROR_NotExist; |
+ } |
+ if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) { |
+ return XFA_EVENTERROR_NotExist; |
+ } |
+ switch (pParam->m_eType) { |
+ case XFA_EVENT_Calculate: |
+ return pWidgetAcc->ProcessCalculate(); |
+ case XFA_EVENT_Validate: |
+ if (((CXFA_FFDoc*)pDocView->GetDoc()) |
+ ->GetDocProvider() |
+ ->IsValidationsEnabled(pDocView->GetDoc())) { |
+ return pWidgetAcc->ProcessValidate(0x01); |
+ } |
+ return XFA_EVENTERROR_Disabled; |
+ case XFA_EVENT_InitCalculate: { |
+ CXFA_Calculate calc = pWidgetAcc->GetCalculate(); |
+ if (!calc) { |
+ return XFA_EVENTERROR_NotExist; |
+ } |
+ if (pWidgetAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) { |
+ return XFA_EVENTERROR_Disabled; |
+ } |
+ CXFA_Script script = calc.GetScript(); |
+ return pWidgetAcc->ExecuteScript(script, pParam); |
+ } |
+ default: |
+ break; |
+ } |
+ int32_t iRet = |
+ pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam); |
+ return iRet; |
+} |
+int32_t CXFA_FFDocView::ExecEventActivityByDeepFirst(CXFA_Node* pFormNode, |
+ XFA_EVENTTYPE eEventType, |
+ FX_BOOL bIsFormReady, |
+ FX_BOOL bRecursive, |
+ CXFA_Node* pExclude) { |
+ int32_t iRet = XFA_EVENTERROR_NotExist; |
+ if (pFormNode == pExclude) { |
+ return iRet; |
+ } |
+ XFA_ELEMENT elementType = pFormNode->GetClassID(); |
+ if (elementType == XFA_ELEMENT_Field) { |
+ if (eEventType == XFA_EVENT_IndexChange) { |
+ return iRet; |
+ } |
+ CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData(); |
+ if (pWidgetAcc == NULL) { |
+ return iRet; |
+ } |
+ CXFA_EventParam eParam; |
+ eParam.m_eType = eEventType; |
+ eParam.m_pTarget = pWidgetAcc; |
+ eParam.m_bIsFormReady = bIsFormReady; |
+ return XFA_ProcessEvent(this, pWidgetAcc, &eParam); |
+ } |
+ if (bRecursive) { |
+ for (CXFA_Node* pNode = pFormNode->GetNodeItem( |
+ XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode); |
+ pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling, |
+ XFA_OBJECTTYPE_ContainerNode)) { |
+ elementType = pNode->GetClassID(); |
+ if (elementType != XFA_ELEMENT_Variables && |
+ elementType != XFA_ELEMENT_Draw) { |
+ iRet |= ExecEventActivityByDeepFirst(pNode, eEventType, bIsFormReady, |
+ bRecursive, pExclude); |
+ } |
+ } |
+ } |
+ CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData(); |
+ if (pWidgetAcc == NULL) { |
+ 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; |
+} |
+CXFA_FFWidget* CXFA_FFDocView::GetWidgetByName(const CFX_WideStringC& wsName, |
+ CXFA_FFWidget* pRefWidget) { |
+ CXFA_WidgetAcc* pRefAcc = pRefWidget ? pRefWidget->GetDataAcc() : NULL; |
+ if (CXFA_WidgetAcc* pAcc = GetWidgetAccByName(wsName, pRefAcc)) { |
+ return pAcc->GetNextWidget(NULL); |
+ } |
+ return NULL; |
+} |
+CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName( |
+ const CFX_WideStringC& wsName, |
+ CXFA_WidgetAcc* pRefWidgetAcc) { |
+ CFX_WideString wsExpression; |
+ FX_DWORD dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | |
+ XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent; |
+ IXFA_ScriptContext* pScriptContext = m_pDoc->GetXFADoc()->GetScriptContext(); |
+ if (!pScriptContext) { |
+ return NULL; |
+ } |
+ CXFA_Node* refNode = NULL; |
+ if (pRefWidgetAcc != NULL) { |
+ refNode = pRefWidgetAcc->GetNode(); |
+ wsExpression = wsName; |
+ } else { |
+ wsExpression = L"$form." + wsName; |
+ } |
+ XFA_RESOLVENODE_RS resoveNodeRS; |
+ int32_t iRet = pScriptContext->ResolveObjects(refNode, wsExpression, |
+ resoveNodeRS, dwStyle); |
+ if (iRet < 1) { |
+ return NULL; |
+ } |
+ if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) { |
+ CXFA_Object* pNode = resoveNodeRS.nodes[0]; |
+ if (pNode->IsNode()) { |
+ return (CXFA_WidgetAcc*)((CXFA_Node*)pNode)->GetWidgetData(); |
+ } |
+ } |
+ return NULL; |
+} |
+void CXFA_FFDocView::OnPageEvent(IXFA_LayoutPage* pSender, |
+ XFA_PAGEEVENT eEvent, |
+ int32_t iPageIndex) { |
+ FX_BOOL bNofify = m_iStatus >= XFA_DOCVIEW_LAYOUTSTATUS_End; |
+ CXFA_FFPageView* pFFPageView = static_cast<CXFA_FFPageView*>(pSender); |
+ if (eEvent == XFA_PAGEEVENT_PageRemoved) { |
+ if (bNofify) { |
+ m_pDoc->GetDocProvider()->PageViewEvent(pFFPageView, |
+ XFA_PAGEVIEWEVENT_PostRemoved); |
+ } |
+ } else if (eEvent == XFA_PAGEEVENT_PageAdded) { |
+ if (bNofify) { |
+ m_pDoc->GetDocProvider()->PageViewEvent(pFFPageView, |
+ XFA_PAGEVIEWEVENT_PostAdded); |
+ pFFPageView->LoadPageView(); |
+ } |
+ } |
+} |
+void CXFA_FFDocView::LockUpdate() { |
+ m_iLock++; |
+} |
+void CXFA_FFDocView::UnlockUpdate() { |
+ m_iLock--; |
+} |
+FX_BOOL CXFA_FFDocView::IsUpdateLocked() { |
+ return m_iLock; |
+} |
+void CXFA_FFDocView::ClearInvalidateList() { |
+ FX_POSITION ps = m_mapPageInvalidate.GetStartPosition(); |
+ while (ps) { |
+ void* pPageView = NULL; |
+ CFX_RectF* pRect = NULL; |
+ m_mapPageInvalidate.GetNextAssoc(ps, pPageView, (void*&)pRect); |
+ delete pRect; |
+ } |
+ m_mapPageInvalidate.RemoveAll(); |
+} |
+void CXFA_FFDocView::AddInvalidateRect(CXFA_FFWidget* pWidget, |
+ const CFX_RectF& rtInvalidate) { |
+ AddInvalidateRect(pWidget->GetPageView(), rtInvalidate); |
+} |
+void CXFA_FFDocView::AddInvalidateRect(IXFA_PageView* pPageView, |
+ const CFX_RectF& rtInvalidate) { |
+ CFX_RectF* pRect = (CFX_RectF*)m_mapPageInvalidate.GetValueAt(pPageView); |
+ if (!pRect) { |
+ pRect = new CFX_RectF; |
+ pRect->Set(rtInvalidate.left, rtInvalidate.top, rtInvalidate.width, |
+ rtInvalidate.height); |
+ m_mapPageInvalidate.SetAt(pPageView, pRect); |
+ } else { |
+ pRect->Union(rtInvalidate); |
+ } |
+} |
+void CXFA_FFDocView::RunInvalidate() { |
+ FX_POSITION ps = m_mapPageInvalidate.GetStartPosition(); |
+ while (ps) { |
+ IXFA_PageView* pPageView = NULL; |
+ CFX_RectF* pRect = NULL; |
+ m_mapPageInvalidate.GetNextAssoc(ps, (void*&)pPageView, (void*&)pRect); |
+ m_pDoc->GetDocProvider()->InvalidateRect(pPageView, *pRect); |
+ delete pRect; |
+ } |
+ m_mapPageInvalidate.RemoveAll(); |
+} |
+FX_BOOL CXFA_FFDocView::RunLayout() { |
+ LockUpdate(); |
+ m_bInLayoutStatus = TRUE; |
+ if (!m_pXFADocLayout->IncrementLayout() && |
+ m_pXFADocLayout->StartLayout() < 100) { |
+ m_pXFADocLayout->DoLayout(); |
+ UnlockUpdate(); |
+ m_bInLayoutStatus = FALSE; |
+ return TRUE; |
+ } |
+ m_bInLayoutStatus = FALSE; |
+ UnlockUpdate(); |
+ return FALSE; |
+} |
+void CXFA_FFDocView::RunSubformIndexChange() { |
+ int32_t iSubforms = m_IndexChangedSubforms.GetSize(); |
+ for (int32_t i = 0; i < iSubforms; i++) { |
+ CXFA_Node* pSubformNode = (CXFA_Node*)m_IndexChangedSubforms[i]; |
+ CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pSubformNode->GetWidgetData(); |
+ if (!pWidgetAcc) { |
+ continue; |
+ } |
+ CXFA_EventParam eParam; |
+ eParam.m_eType = XFA_EVENT_IndexChange; |
+ eParam.m_pTarget = pWidgetAcc; |
+ pWidgetAcc->ProcessEvent(XFA_ATTRIBUTEENUM_IndexChange, &eParam); |
+ } |
+ m_IndexChangedSubforms.RemoveAll(); |
+} |
+void CXFA_FFDocView::AddNewFormNode(CXFA_Node* pNode) { |
+ m_NewAddedNodes.Add(pNode); |
+ this->InitLayout(pNode); |
+} |
+void CXFA_FFDocView::AddIndexChangedSubform(CXFA_Node* pNode) { |
+ FXSYS_assert(pNode->GetClassID() == XFA_ELEMENT_Subform); |
+ m_IndexChangedSubforms.Add(pNode); |
+} |
+void CXFA_FFDocView::RunDocClose() { |
+ CXFA_Node* pRootItem = |
+ (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); |
+ if (!pRootItem) { |
+ return; |
+ } |
+ ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocClose); |
+} |
+void CXFA_FFDocView::DestroyDocView() { |
+ ClearInvalidateList(); |
+ m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_None; |
+ m_iLock = 0; |
+ m_ValidateAccs.RemoveAll(); |
+ m_bindItems.RemoveAll(); |
+ m_CalculateAccs.RemoveAll(); |
+} |
+FX_BOOL CXFA_FFDocView::IsStaticNotify() { |
+ return m_pDoc->GetDocType() == XFA_DOCTYPE_Static; |
+} |
+void CXFA_FFDocView::AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) { |
+ int32_t iAccs = m_CalculateAccs.GetSize(); |
+ CXFA_WidgetAcc* pCurrentAcc = |
+ (iAccs < 1) ? (CXFA_WidgetAcc*)NULL |
+ : (CXFA_WidgetAcc*)m_CalculateAccs[iAccs - 1]; |
+ if (pCurrentAcc != pWidgetAcc) { |
+ m_CalculateAccs.Add(pWidgetAcc); |
+ } |
+} |
+void CXFA_FFDocView::AddCalculateNodeNotify(CXFA_Node* pNodeChange) { |
+ CXFA_CalcData* pGlobalData = |
+ (CXFA_CalcData*)pNodeChange->GetUserData(XFA_CalcData); |
+ int32_t iCount = pGlobalData ? pGlobalData->m_Globals.GetSize() : 0; |
+ for (int32_t i = 0; i < iCount; i++) { |
+ CXFA_WidgetAcc* pResultAcc = (CXFA_WidgetAcc*)pGlobalData->m_Globals[i]; |
+ if (pResultAcc->GetNode()->HasFlag(XFA_NODEFLAG_HasRemoved)) { |
+ continue; |
+ } |
+ int32_t iAccs = m_CalculateAccs.GetSize(); |
+ CXFA_WidgetAcc* pCurrentAcc = |
+ (iAccs < 1) ? (CXFA_WidgetAcc*)NULL |
+ : (CXFA_WidgetAcc*)m_CalculateAccs[iAccs - 1]; |
+ if (pCurrentAcc != pResultAcc) { |
+ m_CalculateAccs.Add(pResultAcc); |
+ } |
+ } |
+} |
+void CXFA_FFDocView::RunCalculateRecursive(int32_t& iIndex) { |
+ while (iIndex < m_CalculateAccs.GetSize()) { |
+ CXFA_WidgetAcc* pCurAcc = (CXFA_WidgetAcc*)m_CalculateAccs[iIndex]; |
+ AddCalculateNodeNotify(pCurAcc->GetNode()); |
+ int32_t iRefCount = |
+ (int32_t)(uintptr_t)pCurAcc->GetNode()->GetUserData(XFA_CalcRefCount); |
+ iRefCount++; |
+ pCurAcc->GetNode()->SetUserData(XFA_CalcRefCount, |
+ (void*)(uintptr_t)iRefCount); |
+ if (iRefCount > 11) { |
+ break; |
+ } |
+ if ((pCurAcc->ProcessCalculate()) == XFA_EVENTERROR_Sucess) { |
+ AddValidateWidget(pCurAcc); |
+ } |
+ iIndex++; |
+ RunCalculateRecursive(iIndex); |
+ } |
+} |
+int32_t CXFA_FFDocView::RunCalculateWidgets() { |
+ if (!m_pDoc->GetDocProvider()->IsCalculationsEnabled(m_pDoc)) { |
+ return XFA_EVENTERROR_Disabled; |
+ } |
+ int32_t iCounts = m_CalculateAccs.GetSize(); |
+ int32_t iIndex = 0; |
+ if (iCounts > 0) { |
+ RunCalculateRecursive(iIndex); |
+ } |
+ for (int32_t i = 0; i < m_CalculateAccs.GetSize(); i++) { |
+ CXFA_WidgetAcc* pCurAcc = (CXFA_WidgetAcc*)m_CalculateAccs[i]; |
+ pCurAcc->GetNode()->SetUserData(XFA_CalcRefCount, (void*)(uintptr_t)0); |
+ } |
+ m_CalculateAccs.RemoveAll(); |
+ return XFA_EVENTERROR_Sucess; |
+} |
+void CXFA_FFDocView::AddValidateWidget(CXFA_WidgetAcc* pWidget) { |
+ if (m_ValidateAccs.Find(pWidget) < 0) { |
+ m_ValidateAccs.Add(pWidget); |
+ } |
+} |
+FX_BOOL CXFA_FFDocView::InitCalculate(CXFA_Node* pNode) { |
+ ExecEventActivityByDeepFirst(pNode, XFA_EVENT_InitCalculate); |
+ return TRUE; |
+} |
+FX_BOOL CXFA_FFDocView::InitValidate(CXFA_Node* pNode) { |
+ if (!m_pDoc->GetDocProvider()->IsValidationsEnabled(m_pDoc)) { |
+ return FALSE; |
+ } |
+ ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Validate); |
+ m_ValidateAccs.RemoveAll(); |
+ return TRUE; |
+} |
+FX_BOOL CXFA_FFDocView::RunValidate() { |
+ if (!m_pDoc->GetDocProvider()->IsValidationsEnabled(m_pDoc)) { |
+ return FALSE; |
+ } |
+ int32_t iCounts = m_ValidateAccs.GetSize(); |
+ for (int32_t i = 0; i < iCounts; i++) { |
+ CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)m_ValidateAccs[i]; |
+ if (pAcc->GetNode()->HasFlag(XFA_NODEFLAG_HasRemoved)) { |
+ continue; |
+ } |
+ pAcc->ProcessValidate(); |
+ } |
+ m_ValidateAccs.RemoveAll(); |
+ return TRUE; |
+} |
+FX_BOOL CXFA_FFDocView::RunEventLayoutReady() { |
+ CXFA_Node* pRootItem = |
+ (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); |
+ if (!pRootItem) { |
+ return FALSE; |
+ } |
+ ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready); |
+ RunLayout(); |
+ return TRUE; |
+} |
+void CXFA_FFDocView::RunBindItems() { |
+ int32_t iCount = m_bindItems.GetSize(); |
+ for (int32_t i = 0; i < iCount; i++) { |
+ if (((CXFA_Node*)m_bindItems[i])->HasFlag(XFA_NODEFLAG_HasRemoved)) { |
+ continue; |
+ } |
+ CXFA_Node* pWidgetNode = |
+ ((CXFA_Node*)m_bindItems[i])->GetNodeItem(XFA_NODEITEM_Parent); |
+ CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pWidgetNode->GetWidgetData(); |
+ if (!pAcc) { |
+ continue; |
+ } |
+ CXFA_BindItems binditems((CXFA_Node*)m_bindItems[i]); |
+ IXFA_ScriptContext* pScriptContext = |
+ pWidgetNode->GetDocument()->GetScriptContext(); |
+ CFX_WideStringC wsRef; |
+ binditems.GetRef(wsRef); |
+ FX_DWORD dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties | |
+ XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent | |
+ XFA_RESOLVENODE_ALL; |
+ XFA_RESOLVENODE_RS rs; |
+ pScriptContext->ResolveObjects(pWidgetNode, wsRef, rs, dwStyle); |
+ int32_t iCount = rs.nodes.GetSize(); |
+ pAcc->DeleteItem(-1); |
+ if (rs.dwFlags != XFA_RESOVENODE_RSTYPE_Nodes || iCount < 1) { |
+ continue; |
+ } |
+ CFX_WideStringC wsValueRef, wsLabelRef; |
+ binditems.GetValueRef(wsValueRef); |
+ binditems.GetLabelRef(wsLabelRef); |
+ FX_BOOL bUseValue = wsLabelRef.IsEmpty() || wsLabelRef == wsValueRef; |
+ FX_BOOL bLabelUseContent = |
+ wsLabelRef.IsEmpty() || wsLabelRef == FX_WSTRC(L"$"); |
+ FX_BOOL bValueUseContent = |
+ wsValueRef.IsEmpty() || wsValueRef == FX_WSTRC(L"$"); |
+ CFX_WideString wsValue, wsLabel; |
+ FX_DWORD uValueHash = FX_HashCode_String_GetW(CFX_WideString(wsValueRef), |
+ wsValueRef.GetLength()); |
+ for (int32_t i = 0; i < iCount; i++) { |
+ CXFA_Object* refObj = rs.nodes[i]; |
+ if (!refObj->IsNode()) { |
+ continue; |
+ } |
+ CXFA_Node* refNode = (CXFA_Node*)refObj; |
+ if (bValueUseContent) { |
+ wsValue = refNode->GetContent(); |
+ } else { |
+ CXFA_Node* nodeValue = refNode->GetFirstChildByName(uValueHash); |
+ if (nodeValue == NULL) { |
+ wsValue = refNode->GetContent(); |
+ } else { |
+ wsValue = nodeValue->GetContent(); |
+ } |
+ } |
+ if (!bUseValue) { |
+ if (bLabelUseContent) { |
+ wsLabel = refNode->GetContent(); |
+ } else { |
+ CXFA_Node* nodeLabel = refNode->GetFirstChildByName(wsLabelRef); |
+ if (nodeLabel != NULL) { |
+ wsLabel = nodeLabel->GetContent(); |
+ } |
+ } |
+ } else { |
+ wsLabel = wsValue; |
+ } |
+ pAcc->InsertItem(wsLabel, wsValue); |
+ } |
+ } |
+ m_bindItems.RemoveAll(); |
+} |
+void CXFA_FFDocView::SetChangeMark() { |
+ if (m_iStatus < XFA_DOCVIEW_LAYOUTSTATUS_End) { |
+ return; |
+ } |
+ m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc); |
+} |
+CXFA_Node* CXFA_FFDocView::GetRootSubform() { |
+ CXFA_Node* pFormPacketNode = |
+ (CXFA_Node*)m_pDoc->GetXFADoc()->GetXFANode(XFA_HASHCODE_Form); |
+ if (!pFormPacketNode) { |
+ return NULL; |
+ } |
+ return pFormPacketNode->GetFirstChildByClass(XFA_ELEMENT_Subform); |
+} |
+CXFA_FFDocWidgetIterator::CXFA_FFDocWidgetIterator(CXFA_FFDocView* pDocView, |
+ CXFA_Node* pTravelRoot) |
+ : m_ContentIterator(pTravelRoot) { |
+ m_pDocView = pDocView; |
+ m_pCurWidget = NULL; |
+} |
+CXFA_FFDocWidgetIterator::~CXFA_FFDocWidgetIterator() {} |
+void CXFA_FFDocWidgetIterator::Reset() { |
+ m_ContentIterator.Reset(); |
+ m_pCurWidget = NULL; |
+} |
+IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToFirst() { |
+ return NULL; |
+} |
+IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToLast() { |
+ return NULL; |
+} |
+IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToNext() { |
+ CXFA_Node* pItem = m_pCurWidget ? m_ContentIterator.MoveToNext() |
+ : m_ContentIterator.GetCurrent(); |
+ while (pItem) { |
+ if (CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData()) { |
+ while ((m_pCurWidget = pAcc->GetNextWidget(NULL)) != NULL) { |
+ if (!m_pCurWidget->IsLoaded() && |
+ (m_pCurWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) { |
+ m_pCurWidget->LoadWidget(); |
+ } |
+ return m_pCurWidget; |
+ } |
+ } |
+ pItem = m_ContentIterator.MoveToNext(); |
+ } |
+ return NULL; |
+} |
+IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToPrevious() { |
+ return NULL; |
+} |
+IXFA_Widget* CXFA_FFDocWidgetIterator::GetCurrentWidget() { |
+ return NULL; |
+} |
+FX_BOOL CXFA_FFDocWidgetIterator::SetCurrentWidget(IXFA_Widget* hWidget) { |
+ return FALSE; |
+} |
+IXFA_WidgetAccIterator* XFA_WidgetAccIterator_Create( |
+ CXFA_WidgetAcc* pTravelRoot, |
+ XFA_WIDGETORDER eOrder) { |
+ if (!pTravelRoot) { |
+ return NULL; |
+ } |
+ return new CXFA_WidgetAccIterator(pTravelRoot->GetDocView(), |
+ pTravelRoot->GetNode()); |
+} |
+CXFA_WidgetAccIterator::CXFA_WidgetAccIterator(CXFA_FFDocView* pDocView, |
+ CXFA_Node* pTravelRoot) |
+ : m_ContentIterator(pTravelRoot) { |
+ m_pDocView = pDocView; |
+ m_pCurWidgetAcc = NULL; |
+} |
+CXFA_WidgetAccIterator::~CXFA_WidgetAccIterator() {} |
+void CXFA_WidgetAccIterator::Reset() { |
+ m_pCurWidgetAcc = NULL; |
+ m_ContentIterator.Reset(); |
+} |
+CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToFirst() { |
+ return NULL; |
+} |
+CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToLast() { |
+ return NULL; |
+} |
+CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToNext() { |
+ CXFA_Node* pItem = m_pCurWidgetAcc ? m_ContentIterator.MoveToNext() |
+ : m_ContentIterator.GetCurrent(); |
+ while (pItem) { |
+ if ((m_pCurWidgetAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData()) != NULL) { |
+ return m_pCurWidgetAcc; |
+ } |
+ pItem = m_ContentIterator.MoveToNext(); |
+ } |
+ return NULL; |
+} |
+CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToPrevious() { |
+ return NULL; |
+} |
+CXFA_WidgetAcc* CXFA_WidgetAccIterator::GetCurrentWidgetAcc() { |
+ return NULL; |
+} |
+FX_BOOL CXFA_WidgetAccIterator::SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget) { |
+ return FALSE; |
+} |
+void CXFA_WidgetAccIterator::SkipTree() { |
+ m_ContentIterator.SkipChildrenAndMoveToNext(); |
+ m_pCurWidgetAcc = NULL; |
+} |