Index: fpdfsdk/src/fpdfxfa/fpdfxfa_doc.cpp |
diff --git a/fpdfsdk/src/fpdfxfa/fpdfxfa_doc.cpp b/fpdfsdk/src/fpdfxfa/fpdfxfa_doc.cpp |
index f9bf1705546281d54288bce44407398469883306..cf508ca8620a5cf76de27c5d75a67280ea59a45e 100644 |
--- a/fpdfsdk/src/fpdfxfa/fpdfxfa_doc.cpp |
+++ b/fpdfsdk/src/fpdfxfa/fpdfxfa_doc.cpp |
@@ -41,10 +41,13 @@ CPDFXFA_Document::CPDFXFA_Document(CPDF_Document* pPDFDoc, |
m_pXFADoc(nullptr), |
m_pXFADocView(nullptr), |
m_pApp(pProvider), |
- m_pJSContext(nullptr) { |
-} |
+ m_pJSContext(nullptr), |
+ m_nLoadStatus(FXFA_LOADSTATUS_PRELOAD), |
+ m_nPageCount(0) {} |
CPDFXFA_Document::~CPDFXFA_Document() { |
+ m_nLoadStatus = FXFA_LOADSTATUS_CLOSING; |
+ |
if (m_pXFADoc) { |
IXFA_App* pApp = m_pApp->GetXFAApp(); |
if (pApp) { |
@@ -65,9 +68,13 @@ CPDFXFA_Document::~CPDFXFA_Document() { |
else |
delete m_pPDFDoc; |
} |
+ |
+ m_nLoadStatus = FXFA_LOADSTATUS_CLOSED; |
} |
FX_BOOL CPDFXFA_Document::LoadXFADoc() { |
+ m_nLoadStatus = FXFA_LOADSTATUS_LOADING; |
+ |
if (!m_pPDFDoc) |
return FALSE; |
@@ -113,6 +120,8 @@ FX_BOOL CPDFXFA_Document::LoadXFADoc() { |
m_pXFADocView->DoLayout(NULL); |
m_pXFADocView->StopLayout(); |
+ m_nLoadStatus = FXFA_LOADSTATUS_LOADED; |
+ |
return TRUE; |
} |
@@ -145,7 +154,8 @@ CPDFXFA_Page* CPDFXFA_Document::GetPage(int page_index) { |
if (pPage) |
pPage->AddRef(); |
} else { |
- m_XFAPageList.SetSize(GetPageCount()); |
+ m_nPageCount = GetPageCount(); |
+ m_XFAPageList.SetSize(m_nPageCount); |
} |
if (pPage) |
return pPage; |
@@ -470,25 +480,38 @@ FX_BOOL CPDFXFA_Document::PopupMenu(IXFA_Widget* hWidget, |
void CPDFXFA_Document::PageViewEvent(IXFA_PageView* pPageView, |
FX_DWORD dwFlags) { |
- if (!pPageView || (dwFlags != XFA_PAGEVIEWEVENT_PostAdded && |
- dwFlags != XFA_PAGEVIEWEVENT_PostRemoved)) { |
- return; |
- } |
- CPDFXFA_Page* pPage = nullptr; |
CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv(); |
- if (dwFlags == XFA_PAGEVIEWEVENT_PostAdded) { |
- int nPageIndex = pPageView->GetPageViewIndex(); |
- pPage = GetPage(nPageIndex); |
- if (pPage) |
- pPage->SetXFAPageView(pPageView); |
- pEnv->FFI_PageEvent(nPageIndex, dwFlags); |
+ if (!pEnv) |
return; |
+ |
+ if (m_nLoadStatus != FXFA_LOADSTATUS_LOADING && |
+ m_nLoadStatus != FXFA_LOADSTATUS_CLOSING && |
+ XFA_PAGEVIEWEVENT_StopLayout == dwFlags) { |
+ int nNewCount = GetPageCount(); |
+ if (nNewCount == m_nPageCount) |
+ return; |
+ |
+ IXFA_DocView* pXFADocView = GetXFADocView(); |
+ if (!pXFADocView) |
+ return; |
+ for (int iPageIter = 0; iPageIter < m_nPageCount; iPageIter++) { |
+ CPDFXFA_Page* pPage = m_XFAPageList.GetAt(iPageIter); |
+ if (!pPage) |
+ continue; |
+ m_pSDKDoc->RemovePageView(pPage); |
+ IXFA_PageView* pXFAPageView = pXFADocView->GetPageView(iPageIter); |
+ pPage->SetXFAPageView(pXFAPageView); |
+ if (pXFAPageView) |
+ pXFAPageView->LoadPageView(nullptr); |
+ } |
+ |
+ int flag = (nNewCount < m_nPageCount) ? FXFA_PAGEVIEWEVENT_POSTREMOVED |
+ : FXFA_PAGEVIEWEVENT_POSTADDED; |
+ int count = FXSYS_abs(nNewCount - m_nPageCount); |
+ m_nPageCount = nNewCount; |
+ m_XFAPageList.SetSize(nNewCount); |
+ pEnv->FFI_PageEvent(count, flag); |
} |
- pPage = GetPage(pPageView); |
- if (!pPage) |
- return; |
- pEnv->FFI_PageEvent(pPage->GetPageIndex(), dwFlags); |
- pPage->Release(); |
} |
void CPDFXFA_Document::WidgetEvent(IXFA_Widget* hWidget, |