| 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,
|
|
|