Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1077)

Unified Diff: xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.cpp

Issue 1636873004: XFA: Fix DOS newlines (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: All of them Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.h ('k') | xfa/src/fxfa/src/parser/xfa_locale.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.cpp
diff --git a/xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.cpp b/xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.cpp
index aedd0903715b370e06426634589d8bfa6fc295c8..ffae772cd206f1e6b8607b164e4343c2c3032288 100644
--- a/xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.cpp
+++ b/xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.cpp
@@ -1,2017 +1,2017 @@
-// 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_utils.h"
-#include "xfa/src/fxfa/src/common/xfa_object.h"
-#include "xfa/src/fxfa/src/common/xfa_document.h"
-#include "xfa/src/fxfa/src/common/xfa_parser.h"
-#include "xfa/src/fxfa/src/common/xfa_script.h"
-#include "xfa/src/fxfa/src/common/xfa_docdata.h"
-#include "xfa/src/fxfa/src/common/xfa_doclayout.h"
-#include "xfa/src/fxfa/src/common/xfa_localemgr.h"
-#include "xfa/src/fxfa/src/common/xfa_fm2jsapi.h"
-#include "xfa_document_datamerger_imp.h"
-#include "xfa_document_layout_imp.h"
-#include "xfa_layout_itemlayout.h"
-#include "xfa_layout_pagemgr_new.h"
-#include "xfa_layout_appadapter.h"
-CXFA_LayoutPageMgr::CXFA_LayoutPageMgr(CXFA_LayoutProcessor* pLayoutProcessor)
- : m_pLayoutProcessor(pLayoutProcessor),
- m_pTemplatePageSetRoot(nullptr),
- m_pPageSetLayoutItemRoot(nullptr),
- m_pPageSetCurRoot(nullptr),
- m_pCurrentContainerRecord(nullptr),
- m_pCurPageArea(nullptr),
- m_nAvailPages(0),
- m_nCurPageCount(0),
- m_ePageSetMode(XFA_ATTRIBUTEENUM_OrderedOccurrence),
- m_bCreateOverFlowPage(FALSE) {
-}
-CXFA_LayoutPageMgr::~CXFA_LayoutPageMgr() {
- ClearData();
- CXFA_LayoutItem* pLayoutItem = GetRootLayoutItem();
- CXFA_LayoutItem* pNextLayout = NULL;
- for (; pLayoutItem; pLayoutItem = pNextLayout) {
- pNextLayout = pLayoutItem->m_pNextSibling;
- XFA_ReleaseLayoutItem(pLayoutItem);
- }
-}
-FX_BOOL CXFA_LayoutPageMgr::InitLayoutPage(CXFA_Node* pFormNode) {
- PrepareLayout();
- CXFA_Node* pTemplateNode = pFormNode->GetTemplateNode();
- if (!pTemplateNode) {
- return FALSE;
- }
- m_pTemplatePageSetRoot = pTemplateNode->GetProperty(0, XFA_ELEMENT_PageSet);
- ASSERT(m_pTemplatePageSetRoot);
- if (m_pPageSetLayoutItemRoot) {
- m_pPageSetLayoutItemRoot->m_pParent = NULL;
- m_pPageSetLayoutItemRoot->m_pFirstChild = NULL;
- m_pPageSetLayoutItemRoot->m_pNextSibling = NULL;
- m_pPageSetLayoutItemRoot->m_pFormNode = m_pTemplatePageSetRoot;
- } else {
- m_pPageSetLayoutItemRoot =
- new CXFA_ContainerLayoutItem(m_pTemplatePageSetRoot);
- }
- m_pPageSetCurRoot = m_pPageSetLayoutItemRoot;
- m_pTemplatePageSetRoot->SetUserData(XFA_LAYOUTITEMKEY,
- (void*)m_pPageSetLayoutItemRoot);
- XFA_ATTRIBUTEENUM eRelation =
- m_pTemplatePageSetRoot->GetEnum(XFA_ATTRIBUTE_Relation);
- if (eRelation != XFA_ATTRIBUTEENUM_Unknown) {
- m_ePageSetMode = eRelation;
- }
- InitPageSetMap();
- CXFA_Node* pPageArea = NULL;
- int32_t iCount = 0;
- for (pPageArea = m_pTemplatePageSetRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
- pPageArea;
- pPageArea = pPageArea->GetNodeItem(XFA_NODEITEM_NextSibling)) {
- if (pPageArea->GetClassID() == XFA_ELEMENT_PageArea) {
- iCount++;
- if (pPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea)) {
- return TRUE;
- }
- }
- }
- if (iCount > 0) {
- return FALSE;
- }
- CXFA_Document* pDocument = pTemplateNode->GetDocument();
- IXFA_ObjFactory* pObjFactory = pDocument->GetParser()->GetFactory();
- pPageArea = m_pTemplatePageSetRoot->GetChild(0, XFA_ELEMENT_PageArea);
- if (!pPageArea) {
- pPageArea = pObjFactory->CreateNode(m_pTemplatePageSetRoot->GetPacketID(),
- XFA_ELEMENT_PageArea);
- if (!pPageArea) {
- return FALSE;
- }
- m_pTemplatePageSetRoot->InsertChild(pPageArea, NULL);
- pPageArea->SetFlag(XFA_NODEFLAG_Initialized);
- }
- CXFA_Node* pContentArea = pPageArea->GetChild(0, XFA_ELEMENT_ContentArea);
- if (!pContentArea) {
- pContentArea = pObjFactory->CreateNode(pPageArea->GetPacketID(),
- XFA_ELEMENT_ContentArea);
- if (!pContentArea) {
- return FALSE;
- }
- pPageArea->InsertChild(pContentArea, NULL);
- pContentArea->SetFlag(XFA_NODEFLAG_Initialized);
- pContentArea->SetMeasure(XFA_ATTRIBUTE_X,
- CXFA_Measurement(0.25f, XFA_UNIT_In));
- pContentArea->SetMeasure(XFA_ATTRIBUTE_Y,
- CXFA_Measurement(0.25f, XFA_UNIT_In));
- pContentArea->SetMeasure(XFA_ATTRIBUTE_W,
- CXFA_Measurement(8.0f, XFA_UNIT_In));
- pContentArea->SetMeasure(XFA_ATTRIBUTE_H,
- CXFA_Measurement(10.5f, XFA_UNIT_In));
- }
- CXFA_Node* pMedium = pPageArea->GetChild(0, XFA_ELEMENT_Medium);
- if (!pMedium) {
- pMedium =
- pObjFactory->CreateNode(pPageArea->GetPacketID(), XFA_ELEMENT_Medium);
- if (!pContentArea) {
- return FALSE;
- }
- pPageArea->InsertChild(pMedium, NULL);
- pMedium->SetFlag(XFA_NODEFLAG_Initialized);
- pMedium->SetMeasure(XFA_ATTRIBUTE_Short,
- CXFA_Measurement(8.5f, XFA_UNIT_In));
- pMedium->SetMeasure(XFA_ATTRIBUTE_Long,
- CXFA_Measurement(11.0f, XFA_UNIT_In));
- }
- return TRUE;
-}
-FX_BOOL CXFA_LayoutPageMgr::PrepareFirstPage(CXFA_Node* pRootSubform) {
- FX_BOOL bProBreakBefore = FALSE;
- CXFA_Node* pBreakBeforeNode = NULL;
- while (pRootSubform) {
- for (CXFA_Node* pBreakNode =
- pRootSubform->GetNodeItem(XFA_NODEITEM_FirstChild);
- pBreakNode;
- pBreakNode = pBreakNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
- XFA_ELEMENT eType = pBreakNode->GetClassID();
- if (eType == XFA_ELEMENT_BreakBefore ||
- (eType == XFA_ELEMENT_Break &&
- pBreakNode->GetEnum(XFA_ATTRIBUTE_Before) !=
- XFA_ATTRIBUTEENUM_Auto)) {
- bProBreakBefore = TRUE;
- pBreakBeforeNode = pBreakNode;
- break;
- }
- }
- if (bProBreakBefore) {
- break;
- }
- bProBreakBefore = TRUE;
- pRootSubform = pRootSubform->GetFirstChildByClass(XFA_ELEMENT_Subform);
- while (pRootSubform &&
- !XFA_ItemLayoutProcessor_IsTakingSpace(pRootSubform)) {
- pRootSubform = pRootSubform->GetNextSameClassSibling(XFA_ELEMENT_Subform);
- }
- }
- CXFA_Node *pLeader, *pTrailer;
- if (pBreakBeforeNode &&
- ExecuteBreakBeforeOrAfter(pBreakBeforeNode, TRUE, pLeader, pTrailer)) {
- m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetHeadPosition();
- return TRUE;
- }
- return AppendNewPage(TRUE);
-}
-FX_BOOL CXFA_LayoutPageMgr::AppendNewPage(FX_BOOL bFirstTemPage) {
- if (m_pCurrentContainerRecord !=
- m_rgProposedContainerRecord.GetTailPosition()) {
- return TRUE;
- }
- CXFA_Node* pPageNode = GetNextAvailPageArea(NULL);
- if (!pPageNode) {
- return FALSE;
- }
- if (bFirstTemPage && m_pCurrentContainerRecord == NULL) {
- m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetHeadPosition();
- }
- return !bFirstTemPage || m_pCurrentContainerRecord != NULL;
-}
-static void XFA_LayoutItemMgr_ReorderLayoutItemToTail(
- CXFA_ContainerLayoutItem* pLayoutItem) {
- CXFA_ContainerLayoutItem* pParentLayoutItem =
- (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
- if (!pParentLayoutItem) {
- return;
- }
- pParentLayoutItem->RemoveChild(pLayoutItem);
- pParentLayoutItem->AddChild(pLayoutItem);
-}
-static void XFA_LayoutItemMgr_RemoveLayoutItem(
- CXFA_ContainerLayoutItem* pLayoutItem) {
- CXFA_ContainerLayoutItem* pParentLayoutItem =
- (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
- if (!pParentLayoutItem) {
- return;
- }
- pParentLayoutItem->RemoveChild(pLayoutItem);
-}
-void CXFA_LayoutPageMgr::RemoveLayoutRecord(CXFA_ContainerRecord* pNewRecord,
- CXFA_ContainerRecord* pPrevRecord) {
- if (!pNewRecord || !pPrevRecord) {
- return;
- }
- if (pNewRecord->pCurPageSet != pPrevRecord->pCurPageSet) {
- XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurPageSet);
- return;
- }
- if (pNewRecord->pCurPageArea != pPrevRecord->pCurPageArea) {
- XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurPageArea);
- return;
- }
- if (pNewRecord->pCurContentArea != pPrevRecord->pCurContentArea) {
- XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurContentArea);
- return;
- }
-}
-void CXFA_LayoutPageMgr::ReorderPendingLayoutRecordToTail(
- CXFA_ContainerRecord* pNewRecord,
- CXFA_ContainerRecord* pPrevRecord) {
- if (!pNewRecord || !pPrevRecord) {
- return;
- }
- if (pNewRecord->pCurPageSet != pPrevRecord->pCurPageSet) {
- XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurPageSet);
- return;
- }
- if (pNewRecord->pCurPageArea != pPrevRecord->pCurPageArea) {
- XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurPageArea);
- return;
- }
- if (pNewRecord->pCurContentArea != pPrevRecord->pCurContentArea) {
- XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurContentArea);
- return;
- }
-}
-void CXFA_LayoutPageMgr::SubmitContentItem(
- CXFA_ContentLayoutItem* pContentLayoutItem,
- XFA_ItemLayoutProcessorResult eStatus) {
- if (pContentLayoutItem) {
- GetCurrentContainerRecord()->pCurContentArea->AddChild(pContentLayoutItem);
- m_bCreateOverFlowPage = FALSE;
- }
- if (eStatus != XFA_ItemLayoutProcessorResult_Done) {
- if (eStatus == XFA_ItemLayoutProcessorResult_PageFullBreak &&
- m_pCurrentContainerRecord ==
- m_rgProposedContainerRecord.GetTailPosition()) {
- AppendNewPage();
- }
- m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetTailPosition();
- m_pCurPageArea = GetCurrentContainerRecord()->pCurPageArea->m_pFormNode;
- }
-}
-FX_FLOAT CXFA_LayoutPageMgr::GetAvailHeight() {
- FX_FLOAT fAvailHeight =
- GetCurrentContainerRecord()
- ->pCurContentArea->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_H)
- .ToUnit(XFA_UNIT_Pt);
- if (fAvailHeight < XFA_LAYOUT_FLOAT_PERCISION) {
- if (m_pCurrentContainerRecord ==
- m_rgProposedContainerRecord.GetHeadPosition()) {
- fAvailHeight = 0;
- } else {
- fAvailHeight = XFA_LAYOUT_FLOAT_MAX;
- }
- }
- return fAvailHeight;
-}
-static CXFA_Node* XFA_ResolveBreakTarget(CXFA_Node* pPageSetRoot,
- FX_BOOL bNewExprStyle,
- CFX_WideStringC& wsTargetExpr) {
- CXFA_Document* pDocument = pPageSetRoot->GetDocument();
- if (wsTargetExpr.IsEmpty()) {
- return NULL;
- }
- CFX_WideString wsTargetAll = wsTargetExpr;
- wsTargetAll.TrimLeft();
- wsTargetAll.TrimRight();
- int32_t iSpliteIndex = 0;
- FX_BOOL bTargetAllFind = TRUE;
- while (iSpliteIndex != -1) {
- CFX_WideString wsTargetExpr;
- int32_t iSpliteNextIndex = 0;
- if (!bTargetAllFind) {
- iSpliteNextIndex = wsTargetAll.Find(' ', iSpliteIndex);
- wsTargetExpr =
- wsTargetAll.Mid(iSpliteIndex, iSpliteNextIndex - iSpliteIndex);
- } else {
- wsTargetExpr = wsTargetAll;
- }
- if (wsTargetExpr.IsEmpty()) {
- return NULL;
- }
- bTargetAllFind = FALSE;
- if (wsTargetExpr.GetAt(0) == '#') {
- CXFA_Node* pNode = pDocument->GetNodeByID(
- (CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Template),
- wsTargetExpr.Mid(1));
- if (pNode) {
- return pNode;
- }
- } else if (bNewExprStyle) {
- CFX_WideString wsProcessedTarget = wsTargetExpr;
- if (wsTargetExpr.Left(4) == FX_WSTRC(L"som(") &&
- wsTargetExpr.Right(1) == FX_WSTRC(L")")) {
- wsProcessedTarget = wsTargetExpr.Mid(4, wsTargetExpr.GetLength() - 5);
- }
- XFA_RESOLVENODE_RS rs;
- int32_t iCount = pDocument->GetScriptContext()->ResolveObjects(
- pPageSetRoot, wsProcessedTarget, rs,
- XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
- XFA_RESOLVENODE_Attributes | XFA_RESOLVENODE_Siblings |
- XFA_RESOLVENODE_Parent);
- if (iCount > 0 && rs.nodes[0]->IsNode()) {
- return (CXFA_Node*)rs.nodes[0];
- }
- }
- iSpliteIndex = iSpliteNextIndex;
- }
- return NULL;
-}
-
-FX_BOOL XFA_LayoutPageMgr_RunBreakTestScript(CXFA_Node* pTestScript) {
- CFX_WideString wsExpression;
- pTestScript->TryContent(wsExpression);
- if (wsExpression.IsEmpty()) {
- return TRUE;
- }
- return pTestScript->GetDocument()->GetParser()->GetNotify()->RunScript(
- pTestScript, pTestScript->GetNodeItem(XFA_NODEITEM_Parent,
- XFA_OBJECTTYPE_ContainerNode));
-}
-CXFA_ContainerRecord* CXFA_LayoutPageMgr::CreateContainerRecord(
- CXFA_Node* pPageNode,
- FX_BOOL bCreateNew) {
- CXFA_ContainerRecord* pNewRecord = new CXFA_ContainerRecord();
- if (m_pCurrentContainerRecord) {
- if (!IsPageSetRootOrderedOccurrence() || pPageNode == NULL) {
- *pNewRecord = *GetCurrentContainerRecord();
- m_rgProposedContainerRecord.AddTail(pNewRecord);
- return pNewRecord;
- }
- CXFA_Node* pPageSet = pPageNode->GetNodeItem(XFA_NODEITEM_Parent);
- if (!bCreateNew) {
- if (pPageSet == m_pTemplatePageSetRoot) {
- pNewRecord->pCurPageSet = m_pPageSetCurRoot;
- } else {
- CXFA_ContainerLayoutItem* pParentLayoutItem =
- (CXFA_ContainerLayoutItem*)pPageSet->GetUserData(XFA_LAYOUTITEMKEY);
- if (pParentLayoutItem == NULL) {
- pParentLayoutItem = m_pPageSetCurRoot;
- }
- pNewRecord->pCurPageSet = pParentLayoutItem;
- }
- } else {
- CXFA_ContainerLayoutItem* pParentPageSetLayout = NULL;
- if (pPageSet == GetCurrentContainerRecord()->pCurPageSet->m_pFormNode) {
- pParentPageSetLayout =
- (CXFA_ContainerLayoutItem*)
- GetCurrentContainerRecord()->pCurPageSet->m_pParent;
- } else {
- pParentPageSetLayout =
- (CXFA_ContainerLayoutItem*)pPageSet->GetNodeItem(
- XFA_NODEITEM_Parent)
- ->GetUserData(XFA_LAYOUTITEMKEY);
- }
- CXFA_ContainerLayoutItem* pPageSetLayoutItem =
- new CXFA_ContainerLayoutItem(pPageSet);
- pPageSet->SetUserData(XFA_LAYOUTITEMKEY, (void*)pPageSetLayoutItem);
- if (pParentPageSetLayout == NULL) {
- CXFA_ContainerLayoutItem* pPrePageSet = m_pPageSetLayoutItemRoot;
- while (pPrePageSet->m_pNextSibling) {
- pPrePageSet = (CXFA_ContainerLayoutItem*)pPrePageSet->m_pNextSibling;
- }
- pPrePageSet->m_pNextSibling = pPageSetLayoutItem;
- m_pPageSetCurRoot = pPageSetLayoutItem;
- } else {
- pParentPageSetLayout->AddChild(pPageSetLayoutItem);
- }
- pNewRecord->pCurPageSet = pPageSetLayoutItem;
- }
- } else {
- if (pPageNode) {
- CXFA_Node* pPageSet = pPageNode->GetNodeItem(XFA_NODEITEM_Parent);
- if (pPageSet == m_pTemplatePageSetRoot) {
- pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot;
- } else {
- CXFA_ContainerLayoutItem* pPageSetLayoutItem =
- new CXFA_ContainerLayoutItem(pPageSet);
- pPageSet->SetUserData(XFA_LAYOUTITEMKEY, (void*)pPageSetLayoutItem);
- m_pPageSetLayoutItemRoot->AddChild(pPageSetLayoutItem);
- pNewRecord->pCurPageSet = pPageSetLayoutItem;
- }
- } else {
- pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot;
- }
- }
- m_rgProposedContainerRecord.AddTail(pNewRecord);
- return pNewRecord;
-}
-void CXFA_LayoutPageMgr::AddPageAreaLayoutItem(CXFA_ContainerRecord* pNewRecord,
- CXFA_Node* pNewPageArea) {
- CXFA_ContainerLayoutItem* pNewPageAreaLayoutItem = NULL;
- if (m_PageArray.GetSize() > m_nAvailPages) {
- CXFA_ContainerLayoutItem* pContainerItem = m_PageArray[m_nAvailPages];
- pContainerItem->m_pFormNode = pNewPageArea;
- m_nAvailPages++;
- pNewPageAreaLayoutItem = pContainerItem;
- } else {
- IXFA_Notify* pNotify =
- pNewPageArea->GetDocument()->GetParser()->GetNotify();
- CXFA_ContainerLayoutItem* pContainerItem =
- (CXFA_ContainerLayoutItem*)pNotify->OnCreateLayoutItem(pNewPageArea);
- m_PageArray.Add(pContainerItem);
- m_nAvailPages++;
- pNotify->OnPageEvent(pContainerItem, XFA_PAGEEVENT_PageAdded,
- (void*)(uintptr_t)m_nAvailPages);
- pNewPageAreaLayoutItem = pContainerItem;
- }
- pNewRecord->pCurPageSet->AddChild(pNewPageAreaLayoutItem);
- pNewRecord->pCurPageArea = pNewPageAreaLayoutItem;
- pNewRecord->pCurContentArea = NULL;
-}
-void CXFA_LayoutPageMgr::AddContentAreaLayoutItem(
- CXFA_ContainerRecord* pNewRecord,
- CXFA_Node* pContentArea) {
- if (pContentArea == NULL) {
- pNewRecord->pCurContentArea = NULL;
- return;
- }
- CXFA_ContainerLayoutItem* pNewContentAreaLayoutItem =
- new CXFA_ContainerLayoutItem(pContentArea);
- ASSERT(pNewRecord->pCurPageArea);
- pNewRecord->pCurPageArea->AddChild(pNewContentAreaLayoutItem);
- pNewRecord->pCurContentArea = pNewContentAreaLayoutItem;
-}
-class CXFA_TraverseStrategy_PageSetContainerLayoutItem {
- public:
- static inline CXFA_ContainerLayoutItem* GetFirstChild(
- CXFA_ContainerLayoutItem* pLayoutItem) {
- if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_PageSet) {
- CXFA_ContainerLayoutItem* pChildItem =
- (CXFA_ContainerLayoutItem*)pLayoutItem->m_pFirstChild;
- while (pChildItem &&
- pChildItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageSet) {
- pChildItem = (CXFA_ContainerLayoutItem*)pChildItem->m_pNextSibling;
- }
- return pChildItem;
- }
- return NULL;
- }
- static inline CXFA_ContainerLayoutItem* GetNextSibling(
- CXFA_ContainerLayoutItem* pLayoutItem) {
- CXFA_ContainerLayoutItem* pChildItem =
- (CXFA_ContainerLayoutItem*)pLayoutItem->m_pNextSibling;
- while (pChildItem &&
- pChildItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageSet) {
- pChildItem = (CXFA_ContainerLayoutItem*)pChildItem->m_pNextSibling;
- }
- return pChildItem;
- }
- static inline CXFA_ContainerLayoutItem* GetParent(
- CXFA_ContainerLayoutItem* pLayoutItem) {
- return (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
- }
-};
-void CXFA_LayoutPageMgr::FinishPaginatedPageSets() {
- CXFA_ContainerLayoutItem* pRootPageSetLayoutItem = m_pPageSetLayoutItemRoot;
- for (; pRootPageSetLayoutItem;
- pRootPageSetLayoutItem =
- (CXFA_ContainerLayoutItem*)pRootPageSetLayoutItem->m_pNextSibling) {
- CXFA_NodeIteratorTemplate<CXFA_ContainerLayoutItem,
- CXFA_TraverseStrategy_PageSetContainerLayoutItem>
- sIterator(pRootPageSetLayoutItem);
- for (CXFA_ContainerLayoutItem* pPageSetLayoutItem = sIterator.GetCurrent();
- pPageSetLayoutItem; pPageSetLayoutItem = sIterator.MoveToNext()) {
- XFA_ATTRIBUTEENUM ePageRelation =
- pPageSetLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Relation);
- switch (ePageRelation) {
- case XFA_ATTRIBUTEENUM_OrderedOccurrence:
- default: { ProcessLastPageSet(); } break;
- case XFA_ATTRIBUTEENUM_SimplexPaginated:
- case XFA_ATTRIBUTEENUM_DuplexPaginated: {
- CXFA_LayoutItem* pLastPageAreaLayoutItem = NULL;
- int32_t nPageAreaCount = 0;
- for (CXFA_LayoutItem* pPageAreaLayoutItem =
- pPageSetLayoutItem->m_pFirstChild;
- pPageAreaLayoutItem;
- pPageAreaLayoutItem = pPageAreaLayoutItem->m_pNextSibling) {
- if (pPageAreaLayoutItem->m_pFormNode->GetClassID() !=
- XFA_ELEMENT_PageArea) {
- continue;
- }
- nPageAreaCount++;
- pLastPageAreaLayoutItem = pPageAreaLayoutItem;
- }
- if (!pLastPageAreaLayoutItem) {
- break;
- }
- if (!FindPageAreaFromPageSet_SimplexDuplex(
- pPageSetLayoutItem->m_pFormNode, NULL, NULL, NULL, TRUE, TRUE,
- nPageAreaCount == 1 ? XFA_ATTRIBUTEENUM_Only
- : XFA_ATTRIBUTEENUM_Last) &&
- (nPageAreaCount == 1 &&
- !FindPageAreaFromPageSet_SimplexDuplex(
- pPageSetLayoutItem->m_pFormNode, NULL, NULL, NULL, TRUE,
- TRUE, XFA_ATTRIBUTEENUM_Last))) {
- break;
- }
- CXFA_Node* pNode = m_pCurPageArea;
- XFA_ATTRIBUTEENUM eCurChoice =
- pNode->GetEnum(XFA_ATTRIBUTE_PagePosition);
- if (eCurChoice == XFA_ATTRIBUTEENUM_Last) {
- XFA_ATTRIBUTEENUM eOddOrEven = XFA_ATTRIBUTEENUM_Any;
- pNode->TryEnum(XFA_ATTRIBUTE_OddOrEven, eOddOrEven);
- XFA_ATTRIBUTEENUM eLastChoice =
- pLastPageAreaLayoutItem->m_pFormNode->GetEnum(
- XFA_ATTRIBUTE_PagePosition);
- if (eLastChoice == XFA_ATTRIBUTEENUM_First &&
- (ePageRelation == XFA_ATTRIBUTEENUM_SimplexPaginated ||
- eOddOrEven != XFA_ATTRIBUTEENUM_Odd)) {
- CXFA_ContainerRecord* pRecord = CreateContainerRecord();
- AddPageAreaLayoutItem(pRecord, pNode);
- break;
- ;
- }
- }
- FX_BOOL bUsable = TRUE;
- CFX_ArrayTemplate<FX_FLOAT> rgUsedHeights;
- for (CXFA_LayoutItem* pChildLayoutItem =
- pLastPageAreaLayoutItem->m_pFirstChild;
- pChildLayoutItem;
- pChildLayoutItem = pChildLayoutItem->m_pNextSibling) {
- if (pChildLayoutItem->m_pFormNode->GetClassID() !=
- XFA_ELEMENT_ContentArea) {
- continue;
- }
- FX_FLOAT fUsedHeight = 0;
- for (CXFA_LayoutItem* pContentChildLayoutItem =
- pChildLayoutItem->m_pFirstChild;
- pContentChildLayoutItem;
- pContentChildLayoutItem =
- pContentChildLayoutItem->m_pNextSibling) {
- if (CXFA_ContentLayoutItem* pContent =
- pContentChildLayoutItem->AsContentLayoutItem()) {
- fUsedHeight += pContent->m_sSize.y;
- }
- }
- rgUsedHeights.Add(fUsedHeight);
- }
- int32_t iCurContentAreaIndex = -1;
- for (CXFA_Node* pContentAreaNode =
- pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
- pContentAreaNode;
- pContentAreaNode =
- pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
- if (pContentAreaNode->GetClassID() != XFA_ELEMENT_ContentArea) {
- continue;
- }
- iCurContentAreaIndex++;
- if (rgUsedHeights[iCurContentAreaIndex] >
- pContentAreaNode->GetMeasure(XFA_ATTRIBUTE_H)
- .ToUnit(XFA_UNIT_Pt) +
- XFA_LAYOUT_FLOAT_PERCISION) {
- bUsable = FALSE;
- break;
- }
- }
- if (bUsable) {
- CXFA_LayoutItem* pChildLayoutItem =
- pLastPageAreaLayoutItem->m_pFirstChild;
- CXFA_Node* pContentAreaNode =
- pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
- pLastPageAreaLayoutItem->m_pFormNode = pNode;
- while (pChildLayoutItem && pContentAreaNode) {
- if (pChildLayoutItem->m_pFormNode->GetClassID() !=
- XFA_ELEMENT_ContentArea) {
- pChildLayoutItem = pChildLayoutItem->m_pNextSibling;
- continue;
- }
- if (pContentAreaNode->GetClassID() != XFA_ELEMENT_ContentArea) {
- pContentAreaNode =
- pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling);
- continue;
- }
- pChildLayoutItem->m_pFormNode = pContentAreaNode;
- pChildLayoutItem = pChildLayoutItem->m_pNextSibling;
- pContentAreaNode =
- pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling);
- }
- } else if (pNode->GetEnum(XFA_ATTRIBUTE_PagePosition) ==
- XFA_ATTRIBUTEENUM_Last) {
- CXFA_ContainerRecord* pRecord = CreateContainerRecord();
- AddPageAreaLayoutItem(pRecord, pNode);
- }
- } break;
- }
- }
- }
-}
-int32_t CXFA_LayoutPageMgr::GetPageCount() const {
- return m_PageArray.GetSize();
-}
-IXFA_LayoutPage* CXFA_LayoutPageMgr::GetPage(int32_t index) const {
- if (index < 0 || index >= m_PageArray.GetSize())
- return nullptr;
- return m_PageArray[index];
-}
-int32_t CXFA_LayoutPageMgr::GetPageIndex(const IXFA_LayoutPage* pPage) const {
- // FIXME: Find() method should take const.
- return m_PageArray.Find(static_cast<CXFA_ContainerLayoutItem*>(
- const_cast<IXFA_LayoutPage*>(pPage)));
-}
-FX_BOOL CXFA_LayoutPageMgr::RunBreak(XFA_ELEMENT eBreakType,
- XFA_ATTRIBUTEENUM eTargetType,
- CXFA_Node* pTarget,
- FX_BOOL bStartNew) {
- FX_BOOL bRet = FALSE;
- switch (eTargetType) {
- case XFA_ATTRIBUTEENUM_ContentArea:
- if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_ContentArea) {
- pTarget = NULL;
- }
- if (!pTarget || !m_pCurrentContainerRecord ||
- pTarget !=
- GetCurrentContainerRecord()->pCurContentArea->m_pFormNode ||
- bStartNew) {
- CXFA_Node* pPageArea = NULL;
- if (pTarget) {
- pPageArea = pTarget->GetNodeItem(XFA_NODEITEM_Parent);
- }
- pPageArea = GetNextAvailPageArea(pPageArea, pTarget);
- bRet = pPageArea != NULL;
- }
- break;
- case XFA_ATTRIBUTEENUM_PageArea:
- if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) {
- pTarget = NULL;
- }
- if (!pTarget || !m_pCurrentContainerRecord ||
- pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode ||
- bStartNew) {
- CXFA_Node* pPageArea = GetNextAvailPageArea(pTarget, NULL, TRUE);
- bRet = pPageArea != NULL;
- }
- break;
- case XFA_ATTRIBUTEENUM_PageOdd:
- if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) {
- pTarget = NULL;
- }
- if (m_nAvailPages % 2 != 1 || !m_pCurrentContainerRecord ||
- (pTarget &&
- pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode) ||
- bStartNew) {
- if (m_nAvailPages % 2 == 1) {
- }
- }
- break;
- case XFA_ATTRIBUTEENUM_PageEven:
- if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) {
- pTarget = NULL;
- }
- if (m_nAvailPages % 2 != 0 || !m_pCurrentContainerRecord ||
- (pTarget &&
- pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode) ||
- bStartNew) {
- if (m_nAvailPages % 2 == 0) {
- }
- }
- break;
- case XFA_ATTRIBUTEENUM_Auto:
- default:
- break;
- ;
- }
- return bRet;
-}
-FX_BOOL CXFA_LayoutPageMgr::ExecuteBreakBeforeOrAfter(
- CXFA_Node* pCurNode,
- FX_BOOL bBefore,
- CXFA_Node*& pBreakLeaderTemplate,
- CXFA_Node*& pBreakTrailerTemplate) {
- XFA_ELEMENT eType = pCurNode->GetClassID();
- switch (eType) {
- case XFA_ELEMENT_BreakBefore:
- case XFA_ELEMENT_BreakAfter: {
- CFX_WideStringC wsBreakLeader, wsBreakTrailer;
- CXFA_Node* pFormNode = pCurNode->GetNodeItem(
- XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
- CXFA_Node* pContainer = pFormNode->GetTemplateNode();
- FX_BOOL bStartNew = pCurNode->GetInteger(XFA_ATTRIBUTE_StartNew) != 0;
- CXFA_Node* pScript = pCurNode->GetFirstChildByClass(XFA_ELEMENT_Script);
- if (pScript && !XFA_LayoutPageMgr_RunBreakTestScript(pScript)) {
- return FALSE;
- }
- CFX_WideStringC wsTarget = pCurNode->GetCData(XFA_ATTRIBUTE_Target);
- CXFA_Node* pTarget =
- XFA_ResolveBreakTarget(m_pTemplatePageSetRoot, TRUE, wsTarget);
- wsBreakTrailer = pCurNode->GetCData(XFA_ATTRIBUTE_Trailer);
- wsBreakLeader = pCurNode->GetCData(XFA_ATTRIBUTE_Leader);
- pBreakLeaderTemplate =
- XFA_ResolveBreakTarget(pContainer, TRUE, wsBreakLeader);
- pBreakTrailerTemplate =
- XFA_ResolveBreakTarget(pContainer, TRUE, wsBreakTrailer);
- if (RunBreak(eType, pCurNode->GetEnum(XFA_ATTRIBUTE_TargetType), pTarget,
- bStartNew)) {
- return TRUE;
- } else {
- if (m_rgProposedContainerRecord.GetCount() > 0 &&
- m_pCurrentContainerRecord ==
- m_rgProposedContainerRecord.GetHeadPosition() &&
- eType == XFA_ELEMENT_BreakBefore) {
- CXFA_Node* pParentNode = pFormNode->GetNodeItem(
- XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
- if (!pParentNode ||
- pFormNode !=
- pParentNode->GetNodeItem(XFA_NODEITEM_FirstChild,
- XFA_OBJECTTYPE_ContainerNode)) {
- break;
- }
- pParentNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent);
- if (!pParentNode || pParentNode->GetClassID() != XFA_ELEMENT_Form) {
- break;
- }
- return TRUE;
- }
- }
- } break;
- case XFA_ELEMENT_Break: {
- FX_BOOL bStartNew = pCurNode->GetInteger(XFA_ATTRIBUTE_StartNew) != 0;
- CFX_WideStringC wsTarget = pCurNode->GetCData(
- bBefore ? XFA_ATTRIBUTE_BeforeTarget : XFA_ATTRIBUTE_AfterTarget);
- CXFA_Node* pTarget =
- XFA_ResolveBreakTarget(m_pTemplatePageSetRoot, TRUE, wsTarget);
- if (RunBreak(bBefore ? XFA_ELEMENT_BreakBefore : XFA_ELEMENT_BreakAfter,
- pCurNode->GetEnum(bBefore ? XFA_ATTRIBUTE_Before
- : XFA_ATTRIBUTE_After),
- pTarget, bStartNew)) {
- return TRUE;
- }
- } break;
- default:
- break;
- }
- return FALSE;
-}
-static void XFA_SetLayoutGeneratedNodeFlag(CXFA_Node* pNode) {
- pNode->SetFlag(XFA_NODEFLAG_LayoutGeneratedNode, TRUE, FALSE);
- pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE, FALSE);
-}
-FX_BOOL CXFA_LayoutPageMgr::ProcessBreakBeforeOrAfter(
- CXFA_Node* pBreakNode,
- FX_BOOL bBefore,
- CXFA_Node*& pBreakLeaderNode,
- CXFA_Node*& pBreakTrailerNode,
- FX_BOOL& bCreatePage) {
- CXFA_Node *pLeaderTemplate = NULL, *pTrailerTemplate = NULL;
- CXFA_Node* pFormNode = pBreakNode->GetNodeItem(XFA_NODEITEM_Parent,
- XFA_OBJECTTYPE_ContainerNode);
- if (XFA_ItemLayoutProcessor_IsTakingSpace(pFormNode)) {
- bCreatePage = ExecuteBreakBeforeOrAfter(pBreakNode, bBefore,
- pLeaderTemplate, pTrailerTemplate);
- CXFA_Document* pDocument = pBreakNode->GetDocument();
- CXFA_Node* pDataScope = NULL;
- pFormNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent,
- XFA_OBJECTTYPE_ContainerNode);
- if (pLeaderTemplate) {
- if (!pDataScope) {
- pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
- }
- pBreakLeaderNode = pDocument->DataMerge_CopyContainer(
- pLeaderTemplate, pFormNode, pDataScope, TRUE);
- pDocument->DataMerge_UpdateBindingRelations(pBreakLeaderNode);
- XFA_SetLayoutGeneratedNodeFlag(pBreakLeaderNode);
- }
- if (pTrailerTemplate) {
- if (!pDataScope) {
- pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
- }
- pBreakTrailerNode = pDocument->DataMerge_CopyContainer(
- pTrailerTemplate, pFormNode, pDataScope, TRUE);
- pDocument->DataMerge_UpdateBindingRelations(pBreakTrailerNode);
- XFA_SetLayoutGeneratedNodeFlag(pBreakTrailerNode);
- }
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CXFA_LayoutPageMgr::ProcessBookendLeaderOrTrailer(
- CXFA_Node* pBookendNode,
- FX_BOOL bLeader,
- CXFA_Node*& pBookendAppendNode) {
- CXFA_Node* pLeaderTemplate = NULL;
- CXFA_Node* pFormNode = pBookendNode->GetNodeItem(
- XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
- if (ResolveBookendLeaderOrTrailer(pBookendNode, bLeader, pLeaderTemplate)) {
- CXFA_Document* pDocument = pBookendNode->GetDocument();
- CXFA_Node* pDataScope = NULL;
- if (pLeaderTemplate) {
- if (!pDataScope) {
- pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
- }
- pBookendAppendNode = pDocument->DataMerge_CopyContainer(
- pLeaderTemplate, pFormNode, pDataScope, TRUE);
- pDocument->DataMerge_UpdateBindingRelations(pBookendAppendNode);
- XFA_SetLayoutGeneratedNodeFlag(pBookendAppendNode);
- return TRUE;
- }
- }
- return FALSE;
-}
-CXFA_Node* CXFA_LayoutPageMgr::BreakOverflow(CXFA_Node* pOverflowNode,
- CXFA_Node*& pLeaderTemplate,
- CXFA_Node*& pTrailerTemplate,
- FX_BOOL bCreatePage) {
- CFX_WideStringC wsOverflowLeader, wsOverflowTrailer;
- CXFA_Node* pContainer =
- pOverflowNode->GetNodeItem(XFA_NODEITEM_Parent,
- XFA_OBJECTTYPE_ContainerNode)
- ->GetTemplateNode();
- if (pOverflowNode->GetClassID() == XFA_ELEMENT_Break) {
- CFX_WideStringC wsOverflowLeader;
- CFX_WideStringC wsOverflowTarget;
- CFX_WideStringC wsOverflowTrailer;
- pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowLeader, wsOverflowLeader);
- pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowTrailer, wsOverflowTrailer);
- pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowTarget, wsOverflowTarget);
- if (!wsOverflowLeader.IsEmpty() || !wsOverflowTrailer.IsEmpty() ||
- !wsOverflowTarget.IsEmpty()) {
- if (!wsOverflowTarget.IsEmpty() && bCreatePage &&
- !m_bCreateOverFlowPage) {
- CXFA_Node* pTarget = XFA_ResolveBreakTarget(
- this->m_pTemplatePageSetRoot, TRUE, wsOverflowTarget);
- if (pTarget) {
- m_bCreateOverFlowPage = TRUE;
- switch (pTarget->GetClassID()) {
- case XFA_ELEMENT_PageArea:
- RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_PageArea,
- pTarget, TRUE);
- break;
- case XFA_ELEMENT_ContentArea:
- RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_ContentArea,
- pTarget, TRUE);
- break;
- default:
- break;
- }
- }
- }
- if (!bCreatePage) {
- pLeaderTemplate =
- XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowLeader);
- pTrailerTemplate =
- XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowTrailer);
- }
- return pOverflowNode;
- }
- return NULL;
- } else if (pOverflowNode->GetClassID() == XFA_ELEMENT_Overflow) {
- CFX_WideStringC wsOverflowTarget;
- pOverflowNode->TryCData(XFA_ATTRIBUTE_Leader, wsOverflowLeader);
- pOverflowNode->TryCData(XFA_ATTRIBUTE_Trailer, wsOverflowTrailer);
- pOverflowNode->TryCData(XFA_ATTRIBUTE_Target, wsOverflowTarget);
- if (!wsOverflowTarget.IsEmpty() && bCreatePage && !m_bCreateOverFlowPage) {
- CXFA_Node* pTarget = XFA_ResolveBreakTarget(this->m_pTemplatePageSetRoot,
- TRUE, wsOverflowTarget);
- if (pTarget) {
- m_bCreateOverFlowPage = TRUE;
- switch (pTarget->GetClassID()) {
- case XFA_ELEMENT_PageArea:
- RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_PageArea, pTarget,
- TRUE);
- break;
- case XFA_ELEMENT_ContentArea:
- RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_ContentArea,
- pTarget, TRUE);
- break;
- default:
- break;
- }
- }
- }
- if (!bCreatePage) {
- pLeaderTemplate =
- XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowLeader);
- pTrailerTemplate =
- XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowTrailer);
- }
- return pOverflowNode;
- }
- return NULL;
-}
-FX_BOOL CXFA_LayoutPageMgr::ProcessOverflow(CXFA_Node* pFormNode,
- CXFA_Node*& pLeaderNode,
- CXFA_Node*& pTrailerNode,
- FX_BOOL bDataMerge,
- FX_BOOL bCreatePage) {
- if (pFormNode == NULL) {
- return FALSE;
- }
- CXFA_Node *pLeaderTemplate = NULL, *pTrailerTemplate = NULL;
- FX_BOOL bIsOverflowNode = FALSE;
- if (pFormNode->GetClassID() == XFA_ELEMENT_Overflow ||
- pFormNode->GetClassID() == XFA_ELEMENT_Break) {
- bIsOverflowNode = TRUE;
- }
- for (CXFA_Node* pCurNode =
- bIsOverflowNode ? pFormNode
- : pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
- pCurNode; pCurNode = pCurNode->GetNodeItem((XFA_NODEITEM_NextSibling))) {
- if (BreakOverflow(pCurNode, pLeaderTemplate, pTrailerTemplate,
- bCreatePage)) {
- if (bIsOverflowNode) {
- pFormNode = pCurNode->GetNodeItem(XFA_NODEITEM_Parent);
- }
- CXFA_Document* pDocument = pCurNode->GetDocument();
- CXFA_Node* pDataScope = NULL;
- if (pLeaderTemplate) {
- if (!pDataScope) {
- pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
- }
- pLeaderNode = pDocument->DataMerge_CopyContainer(
- pLeaderTemplate, pFormNode, pDataScope, TRUE);
- pDocument->DataMerge_UpdateBindingRelations(pLeaderNode);
- XFA_SetLayoutGeneratedNodeFlag(pLeaderNode);
- }
- if (pTrailerTemplate) {
- if (!pDataScope) {
- pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
- }
- pTrailerNode = pDocument->DataMerge_CopyContainer(
- pTrailerTemplate, pFormNode, pDataScope, TRUE);
- pDocument->DataMerge_UpdateBindingRelations(pTrailerNode);
- XFA_SetLayoutGeneratedNodeFlag(pTrailerNode);
- }
- return TRUE;
- }
- if (bIsOverflowNode) {
- break;
- }
- }
- return FALSE;
-}
-FX_BOOL CXFA_LayoutPageMgr::ResolveBookendLeaderOrTrailer(
- CXFA_Node* pBookendNode,
- FX_BOOL bLeader,
- CXFA_Node*& pBookendAppendTemplate) {
- CFX_WideStringC wsBookendLeader;
- CXFA_Node* pContainer =
- pBookendNode->GetNodeItem(XFA_NODEITEM_Parent,
- XFA_OBJECTTYPE_ContainerNode)
- ->GetTemplateNode();
- if (pBookendNode->GetClassID() == XFA_ELEMENT_Break) {
- pBookendNode->TryCData(
- bLeader ? XFA_ATTRIBUTE_BookendLeader : XFA_ATTRIBUTE_BookendTrailer,
- wsBookendLeader);
- if (!wsBookendLeader.IsEmpty()) {
- pBookendAppendTemplate =
- XFA_ResolveBreakTarget(pContainer, FALSE, wsBookendLeader);
- return TRUE;
- }
- return FALSE;
- } else if (pBookendNode->GetClassID() == XFA_ELEMENT_Bookend) {
- pBookendNode->TryCData(
- bLeader ? XFA_ATTRIBUTE_Leader : XFA_ATTRIBUTE_Trailer,
- wsBookendLeader);
- pBookendAppendTemplate =
- XFA_ResolveBreakTarget(pContainer, TRUE, wsBookendLeader);
- return TRUE;
- }
- return FALSE;
-}
-FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet(
- CXFA_Node* pPageSet,
- CXFA_Node* pStartChild,
- CXFA_Node* pTargetPageArea,
- CXFA_Node* pTargetContentArea,
- FX_BOOL bNewPage,
- FX_BOOL bQuery) {
- if (pPageSet == NULL && pStartChild == NULL) {
- return FALSE;
- }
- if (IsPageSetRootOrderedOccurrence()) {
- return FindPageAreaFromPageSet_Ordered(pPageSet, pStartChild,
- pTargetPageArea, pTargetContentArea,
- bNewPage, bQuery);
- }
- XFA_ATTRIBUTEENUM ePreferredPosition = m_pCurrentContainerRecord
- ? XFA_ATTRIBUTEENUM_Rest
- : XFA_ATTRIBUTEENUM_First;
- return FindPageAreaFromPageSet_SimplexDuplex(
- pPageSet, pStartChild, pTargetPageArea, pTargetContentArea, bNewPage,
- bQuery, ePreferredPosition);
-}
-FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet_Ordered(
- CXFA_Node* pPageSet,
- CXFA_Node* pStartChild,
- CXFA_Node* pTargetPageArea,
- CXFA_Node* pTargetContentArea,
- FX_BOOL bNewPage,
- FX_BOOL bQuery) {
- int32_t iPageSetCount = 0;
- if (!pStartChild && !bQuery) {
- m_pPageSetMap.Lookup(pPageSet, iPageSetCount);
- int32_t iMax = -1;
- CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_ELEMENT_Occur);
- if (pOccurNode) {
- pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
- }
- if (iMax >= 0 && iMax <= iPageSetCount) {
- return FALSE;
- }
- }
- FX_BOOL bRes = FALSE;
- CXFA_Node* pCurrentNode =
- pStartChild ? pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling)
- : pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild);
- for (; pCurrentNode;
- pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
- if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) {
- if ((pTargetPageArea == pCurrentNode || pTargetPageArea == NULL)) {
- if (pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea) ==
- NULL) {
- if (pTargetPageArea == pCurrentNode) {
- CreateMinPageRecord(pCurrentNode, TRUE);
- pTargetPageArea = NULL;
- }
- continue;
- }
- if (!bQuery) {
- CXFA_ContainerRecord* pNewRecord =
- CreateContainerRecord(pCurrentNode, pStartChild == NULL);
- AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
- if (pTargetContentArea == NULL) {
- pTargetContentArea =
- pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
- }
- AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
- }
- m_pCurPageArea = pCurrentNode;
- m_nCurPageCount = 1;
- bRes = TRUE;
- break;
- }
- if (!bQuery) {
- CreateMinPageRecord(pCurrentNode, FALSE);
- }
- } else if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) {
- if (FindPageAreaFromPageSet_Ordered(pCurrentNode, NULL, pTargetPageArea,
- pTargetContentArea, bNewPage,
- bQuery)) {
- bRes = TRUE;
- break;
- }
- if (!bQuery) {
- CreateMinPageSetRecord(pCurrentNode, TRUE);
- }
- }
- }
- if (!pStartChild && bRes && !bQuery) {
- m_pPageSetMap.SetAt(pPageSet, ++iPageSetCount);
- }
- return bRes;
-}
-FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet_SimplexDuplex(
- CXFA_Node* pPageSet,
- CXFA_Node* pStartChild,
- CXFA_Node* pTargetPageArea,
- CXFA_Node* pTargetContentArea,
- FX_BOOL bNewPage,
- FX_BOOL bQuery,
- XFA_ATTRIBUTEENUM ePreferredPosition) {
- const XFA_ATTRIBUTEENUM eFallbackPosition = XFA_ATTRIBUTEENUM_Any;
- CXFA_Node *pPreferredPageArea = NULL, *pFallbackPageArea = NULL;
- CXFA_Node* pCurrentNode = NULL;
- if (!pStartChild || pStartChild->GetClassID() == XFA_ELEMENT_PageArea) {
- pCurrentNode = pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild);
- } else {
- pCurrentNode = pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling);
- }
- for (; pCurrentNode;
- pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
- if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) {
- if (!MatchPageAreaOddOrEven(pCurrentNode, FALSE)) {
- continue;
- }
- XFA_ATTRIBUTEENUM eCurPagePosition =
- pCurrentNode->GetEnum(XFA_ATTRIBUTE_PagePosition);
- if (ePreferredPosition == XFA_ATTRIBUTEENUM_Last) {
- if (eCurPagePosition != ePreferredPosition) {
- continue;
- }
- if (m_ePageSetMode == XFA_ATTRIBUTEENUM_SimplexPaginated ||
- pCurrentNode->GetEnum(XFA_ATTRIBUTE_OddOrEven) ==
- XFA_ATTRIBUTEENUM_Any) {
- pPreferredPageArea = pCurrentNode;
- break;
- }
- CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
- AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
- AddContentAreaLayoutItem(pNewRecord, pCurrentNode->GetFirstChildByClass(
- XFA_ELEMENT_ContentArea));
- pPreferredPageArea = pCurrentNode;
- return FALSE;
- } else if (ePreferredPosition == XFA_ATTRIBUTEENUM_Only) {
- if (eCurPagePosition != ePreferredPosition) {
- continue;
- }
- if (m_ePageSetMode != XFA_ATTRIBUTEENUM_DuplexPaginated ||
- pCurrentNode->GetEnum(XFA_ATTRIBUTE_OddOrEven) ==
- XFA_ATTRIBUTEENUM_Any) {
- pPreferredPageArea = pCurrentNode;
- break;
- }
- return FALSE;
- }
- if ((pTargetPageArea == pCurrentNode || pTargetPageArea == NULL)) {
- if (pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea) ==
- NULL) {
- if (pTargetPageArea == pCurrentNode) {
- CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
- AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
- pTargetPageArea = NULL;
- }
- continue;
- }
- if ((ePreferredPosition == XFA_ATTRIBUTEENUM_Rest &&
- eCurPagePosition == XFA_ATTRIBUTEENUM_Any) ||
- eCurPagePosition == ePreferredPosition) {
- pPreferredPageArea = pCurrentNode;
- break;
- } else if (eCurPagePosition == eFallbackPosition &&
- !pFallbackPageArea) {
- pFallbackPageArea = pCurrentNode;
- }
- } else if (pTargetPageArea &&
- !MatchPageAreaOddOrEven(pTargetPageArea, FALSE)) {
- CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
- AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
- AddContentAreaLayoutItem(pNewRecord, pCurrentNode->GetFirstChildByClass(
- XFA_ELEMENT_ContentArea));
- }
- } else if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) {
- if (FindPageAreaFromPageSet_SimplexDuplex(
- pCurrentNode, NULL, pTargetPageArea, pTargetContentArea, bNewPage,
- bQuery, ePreferredPosition)) {
- break;
- }
- }
- }
- CXFA_Node* pCurPageArea = NULL;
- if (pPreferredPageArea) {
- pCurPageArea = pPreferredPageArea;
- } else if (pFallbackPageArea) {
- pCurPageArea = pFallbackPageArea;
- }
- if (!pCurPageArea) {
- return FALSE;
- }
- if (!bQuery) {
- CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
- AddPageAreaLayoutItem(pNewRecord, pCurPageArea);
- if (pTargetContentArea == NULL) {
- pTargetContentArea =
- pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
- }
- AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
- }
- m_pCurPageArea = pCurPageArea;
- return TRUE;
-}
-FX_BOOL CXFA_LayoutPageMgr::MatchPageAreaOddOrEven(CXFA_Node* pPageArea,
- FX_BOOL bLastMatch) {
- if (m_ePageSetMode != XFA_ATTRIBUTEENUM_DuplexPaginated) {
- return TRUE;
- }
- XFA_ATTRIBUTEENUM eOddOrEven = XFA_ATTRIBUTEENUM_Any;
- pPageArea->TryEnum(XFA_ATTRIBUTE_OddOrEven, eOddOrEven);
- if (eOddOrEven != XFA_ATTRIBUTEENUM_Any) {
- int32_t iPageCount = GetPageCount();
- if (bLastMatch) {
- return eOddOrEven == XFA_ATTRIBUTEENUM_Odd ? iPageCount % 2 == 1
- : iPageCount % 2 == 0;
- }
- return eOddOrEven == XFA_ATTRIBUTEENUM_Odd ? iPageCount % 2 == 0
- : iPageCount % 2 == 1;
- }
- return TRUE;
-}
-CXFA_Node* CXFA_LayoutPageMgr::GetNextAvailPageArea(
- CXFA_Node* pTargetPageArea,
- CXFA_Node* pTargetContentArea,
- FX_BOOL bNewPage,
- FX_BOOL bQuery) {
- if (m_pCurPageArea == NULL) {
- FindPageAreaFromPageSet(m_pTemplatePageSetRoot, NULL, pTargetPageArea,
- pTargetContentArea, bNewPage, bQuery);
- ASSERT(m_pCurPageArea);
- return m_pCurPageArea;
- }
- if (pTargetPageArea == NULL || pTargetPageArea == m_pCurPageArea) {
- if (!bNewPage && GetNextContentArea(pTargetContentArea)) {
- return m_pCurPageArea;
- }
- if (IsPageSetRootOrderedOccurrence()) {
- int32_t iMax = -1;
- CXFA_Node* pOccurNode =
- m_pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_Occur);
- if (pOccurNode) {
- pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
- }
- if ((iMax < 0 || m_nCurPageCount < iMax)) {
- if (!bQuery) {
- CXFA_ContainerRecord* pNewRecord =
- CreateContainerRecord(m_pCurPageArea);
- AddPageAreaLayoutItem(pNewRecord, m_pCurPageArea);
- if (pTargetContentArea == NULL) {
- pTargetContentArea =
- m_pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
- }
- AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
- }
- m_nCurPageCount++;
- return m_pCurPageArea;
- }
- }
- }
- if (!bQuery && IsPageSetRootOrderedOccurrence()) {
- CreateMinPageRecord(m_pCurPageArea, FALSE, TRUE);
- }
- if (FindPageAreaFromPageSet(m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent),
- m_pCurPageArea, pTargetPageArea,
- pTargetContentArea, bNewPage, bQuery)) {
- return m_pCurPageArea;
- }
- CXFA_Node* pPageSet = m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent);
- while (TRUE) {
- if (FindPageAreaFromPageSet(pPageSet, NULL, pTargetPageArea,
- pTargetContentArea, bNewPage, bQuery)) {
- return m_pCurPageArea;
- }
- if (!bQuery && IsPageSetRootOrderedOccurrence()) {
- CreateMinPageSetRecord(pPageSet);
- }
- if (FindPageAreaFromPageSet(NULL, pPageSet, pTargetPageArea,
- pTargetContentArea, bNewPage, bQuery)) {
- return m_pCurPageArea;
- }
- if (pPageSet == m_pTemplatePageSetRoot) {
- break;
- }
- pPageSet = pPageSet->GetNodeItem(XFA_NODEITEM_Parent);
- }
- return NULL;
-}
-static FX_BOOL XFA_LayoutPageMgr_CheckContentAreaNotUsed(
- CXFA_ContainerLayoutItem* pPageAreaLayoutItem,
- CXFA_Node* pContentArea,
- CXFA_ContainerLayoutItem*& pContentAreaLayoutItem) {
- for (CXFA_ContainerLayoutItem* pLayoutItem =
- (CXFA_ContainerLayoutItem*)pPageAreaLayoutItem->m_pFirstChild;
- pLayoutItem;
- pLayoutItem = (CXFA_ContainerLayoutItem*)pLayoutItem->m_pNextSibling) {
- if (pLayoutItem->m_pFormNode == pContentArea) {
- if (pLayoutItem->m_pFirstChild == NULL) {
- pContentAreaLayoutItem = pLayoutItem;
- return TRUE;
- }
- return FALSE;
- }
- }
- return TRUE;
-}
-FX_BOOL CXFA_LayoutPageMgr::GetNextContentArea(CXFA_Node* pContentArea) {
- CXFA_Node* pCurContentNode =
- GetCurrentContainerRecord()->pCurContentArea->m_pFormNode;
- if (pContentArea == NULL) {
- pContentArea =
- pCurContentNode->GetNextSameClassSibling(XFA_ELEMENT_ContentArea);
- if (pContentArea == NULL) {
- return FALSE;
- }
- } else {
- if (pContentArea->GetNodeItem(XFA_NODEITEM_Parent) != m_pCurPageArea) {
- return FALSE;
- }
- CXFA_ContainerLayoutItem* pContentAreaLayout = NULL;
- if (!XFA_LayoutPageMgr_CheckContentAreaNotUsed(
- GetCurrentContainerRecord()->pCurPageArea, pContentArea,
- pContentAreaLayout)) {
- return FALSE;
- }
- if (pContentAreaLayout) {
- if (pContentAreaLayout->m_pFormNode != pCurContentNode) {
- CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
- pNewRecord->pCurContentArea = pContentAreaLayout;
- return TRUE;
- } else {
- return FALSE;
- }
- }
- }
- CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
- AddContentAreaLayoutItem(pNewRecord, pContentArea);
- return TRUE;
-}
-void CXFA_LayoutPageMgr::InitPageSetMap() {
- if (!IsPageSetRootOrderedOccurrence()) {
- return;
- }
- CXFA_NodeIterator sIterator(m_pTemplatePageSetRoot);
- for (CXFA_Node* pPageSetNode = sIterator.GetCurrent(); pPageSetNode;
- pPageSetNode = sIterator.MoveToNext()) {
- if (pPageSetNode->GetClassID() == XFA_ELEMENT_PageSet) {
- XFA_ATTRIBUTEENUM eRelation =
- pPageSetNode->GetEnum(XFA_ATTRIBUTE_Relation);
- if (eRelation == XFA_ATTRIBUTEENUM_OrderedOccurrence) {
- m_pPageSetMap.SetAt(pPageSetNode, 0);
- }
- }
- }
-}
-int32_t CXFA_LayoutPageMgr::CreateMinPageRecord(CXFA_Node* pPageArea,
- FX_BOOL bTargetPageArea,
- FX_BOOL bCreateLast) {
- if (pPageArea == NULL) {
- return 0;
- }
- CXFA_Node* pOccurNode = pPageArea->GetFirstChildByClass(XFA_ELEMENT_Occur);
- int32_t iMin = 0;
- if ((pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE)) ||
- bTargetPageArea) {
- CXFA_Node* pContentArea =
- pPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
- if (iMin < 1 && bTargetPageArea && !pContentArea) {
- iMin = 1;
- }
- int32_t i = 0;
- if (bCreateLast) {
- i = m_nCurPageCount;
- }
- for (; i < iMin; i++) {
- CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
- AddPageAreaLayoutItem(pNewRecord, pPageArea);
- AddContentAreaLayoutItem(pNewRecord, pContentArea);
- }
- }
- return iMin;
-}
-void CXFA_LayoutPageMgr::CreateMinPageSetRecord(CXFA_Node* pPageSet,
- FX_BOOL bCreateAll) {
- if (pPageSet == NULL) {
- return;
- }
- int32_t iCurSetCount = 0;
- if (!m_pPageSetMap.Lookup(pPageSet, iCurSetCount)) {
- return;
- }
- if (bCreateAll) {
- iCurSetCount = 0;
- }
- CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_ELEMENT_Occur);
- int32_t iMin = 0;
- if (pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE)) {
- if (iCurSetCount < iMin) {
- for (int32_t i = 0; i < iMin - iCurSetCount; i++) {
- for (CXFA_Node* pCurrentPageNode =
- pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild);
- pCurrentPageNode; pCurrentPageNode = pCurrentPageNode->GetNodeItem(
- XFA_NODEITEM_NextSibling)) {
- if (pCurrentPageNode->GetClassID() == XFA_ELEMENT_PageArea) {
- CreateMinPageRecord(pCurrentPageNode, FALSE);
- } else if (pCurrentPageNode->GetClassID() == XFA_ELEMENT_PageSet) {
- CreateMinPageSetRecord(pCurrentPageNode, TRUE);
- }
- }
- }
- m_pPageSetMap.SetAt(pPageSet, iMin);
- }
- }
-}
-void CXFA_LayoutPageMgr::CreateNextMinRecord(CXFA_Node* pRecordNode) {
- if (pRecordNode == NULL) {
- return;
- }
- for (CXFA_Node* pCurrentNode =
- pRecordNode->GetNodeItem(XFA_NODEITEM_NextSibling);
- pCurrentNode;
- pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
- if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) {
- CreateMinPageRecord(pCurrentNode, FALSE);
- } else if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) {
- CreateMinPageSetRecord(pCurrentNode, TRUE);
- }
- }
-}
-void CXFA_LayoutPageMgr::ProcessLastPageSet() {
- CreateMinPageRecord(m_pCurPageArea, FALSE, TRUE);
- CreateNextMinRecord(m_pCurPageArea);
- CXFA_Node* pPageSet = m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent);
- while (TRUE) {
- CreateMinPageSetRecord(pPageSet);
- if (pPageSet == m_pTemplatePageSetRoot) {
- break;
- }
- CreateNextMinRecord(pPageSet);
- pPageSet = pPageSet->GetNodeItem(XFA_NODEITEM_Parent);
- }
-}
-FX_BOOL CXFA_LayoutPageMgr::GetNextAvailContentHeight(FX_FLOAT fChildHeight) {
- CXFA_Node* pCurContentNode =
- GetCurrentContainerRecord()->pCurContentArea->m_pFormNode;
- if (pCurContentNode == NULL) {
- return FALSE;
- }
- pCurContentNode =
- pCurContentNode->GetNextSameClassSibling(XFA_ELEMENT_ContentArea);
- if (pCurContentNode) {
- FX_FLOAT fNextContentHeight =
- pCurContentNode->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
- return fNextContentHeight > fChildHeight;
- }
- CXFA_Node* pPageNode = GetCurrentContainerRecord()->pCurPageArea->m_pFormNode;
- CXFA_Node* pOccurNode = pPageNode->GetFirstChildByClass(XFA_ELEMENT_Occur);
- int32_t iMax = 0;
- if (pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE)) {
- if (m_nCurPageCount == iMax) {
- CXFA_Node* pSrcPage = m_pCurPageArea;
- int32_t nSrcPageCount = m_nCurPageCount;
- FX_POSITION psSrcRecord = m_rgProposedContainerRecord.GetTailPosition();
- CXFA_Node* pNextPage = GetNextAvailPageArea(NULL, NULL, FALSE, TRUE);
- m_pCurPageArea = pSrcPage;
- m_nCurPageCount = nSrcPageCount;
- CXFA_ContainerRecord* pPrevRecord =
- (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(
- psSrcRecord);
- while (psSrcRecord) {
- FX_POSITION psSaveRecord = psSrcRecord;
- CXFA_ContainerRecord* pInsertRecord =
- (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(
- psSrcRecord);
- RemoveLayoutRecord(pInsertRecord, pPrevRecord);
- delete pInsertRecord;
- m_rgProposedContainerRecord.RemoveAt(psSaveRecord);
- }
- if (pNextPage) {
- CXFA_Node* pContentArea =
- pNextPage->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
- if (pContentArea) {
- FX_FLOAT fNextContentHeight =
- pContentArea->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
- if (fNextContentHeight > fChildHeight) {
- return TRUE;
- }
- }
- }
- return FALSE;
- }
- }
- CXFA_Node* pContentArea =
- pPageNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
- FX_FLOAT fNextContentHeight =
- pContentArea->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
- if (fNextContentHeight < XFA_LAYOUT_FLOAT_PERCISION) {
- return TRUE;
- }
- if (fNextContentHeight > fChildHeight) {
- return TRUE;
- }
- return FALSE;
-}
-void CXFA_LayoutPageMgr::ClearData() {
- ClearRecordList();
-}
-void CXFA_LayoutPageMgr::ClearRecordList() {
- if (!m_pTemplatePageSetRoot) {
- return;
- }
- if (m_rgProposedContainerRecord.GetCount() > 0) {
- FX_POSITION sPos;
- sPos = m_rgProposedContainerRecord.GetHeadPosition();
- while (sPos) {
- CXFA_ContainerRecord* pRecord =
- (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(sPos);
- delete pRecord;
- }
- m_rgProposedContainerRecord.RemoveAll();
- }
- m_pCurrentContainerRecord = NULL;
- m_pCurPageArea = NULL;
- m_nCurPageCount = 0;
- m_bCreateOverFlowPage = FALSE;
- m_pPageSetMap.RemoveAll();
-}
-CXFA_LayoutItem* CXFA_LayoutPageMgr::FindOrCreateLayoutItem(
- CXFA_Node* pFormNode) {
-#if defined(_XFA_LAYOUTITEM_MAPCACHE_)
- if (m_NodeToContent.GetCount() > 0) {
- CXFA_ContentLayoutItem* pLayoutItem = NULL;
- if (m_NodeToContent.Lookup(pFormNode, (void*&)pLayoutItem)) {
- if (pLayoutItem->m_pNext) {
- m_NodeToContent.SetAt(pFormNode, pLayoutItem->m_pNext);
- pLayoutItem->m_pNext->m_pPrev = NULL;
- pLayoutItem->m_pNext = NULL;
- } else {
- m_NodeToContent.RemoveKey(pFormNode);
- }
- pLayoutItem->m_pFormNode = pFormNode;
- return pLayoutItem;
- }
- }
-#endif
- return (CXFA_LayoutItem*)pFormNode->GetDocument()
- ->GetParser()
- ->GetNotify()
- ->OnCreateLayoutItem(pFormNode);
-}
-#if defined(_XFA_LAYOUTITEM_MAPCACHE_)
-void CXFA_LayoutPageMgr::SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem) {
- CXFA_LayoutItem* pNextLayoutItem,
- * pCurLayoutItem = pParentLayoutItem->m_pFirstChild;
- while (pCurLayoutItem) {
- pNextLayoutItem = pCurLayoutItem->m_pNextSibling;
- if (pCurLayoutItem->m_pFirstChild) {
- SaveLayoutItem(pCurLayoutItem);
- }
- if (pCurLayoutItem->IsContentLayoutItem()) {
- if (m_NodeToContent.GetValueAt(pCurLayoutItem->m_pFormNode) == NULL) {
- pCurLayoutItem->m_pFormNode->SetUserData(XFA_LAYOUTITEMKEY, NULL);
- m_NodeToContent.SetAt(pCurLayoutItem->m_pFormNode, pCurLayoutItem);
- }
- } else if (pCurLayoutItem->m_pFormNode->GetClassID() !=
- XFA_ELEMENT_PageArea) {
- delete pCurLayoutItem;
- pCurLayoutItem = NULL;
- }
- if (pCurLayoutItem) {
- pCurLayoutItem->m_pParent = NULL;
- pCurLayoutItem->m_pNextSibling = NULL;
- pCurLayoutItem->m_pFirstChild = NULL;
- }
- pCurLayoutItem = pNextLayoutItem;
- }
-}
-#elif defined(_XFA_LAYOUTITEM_ProcessCACHE_)
-static void XFA_SyncRemoveLayoutItem(CXFA_LayoutItem* pParentLayoutItem,
- IXFA_Notify* pNotify,
- IXFA_DocLayout* pDocLayout) {
- CXFA_LayoutItem* pNextLayoutItem;
- CXFA_LayoutItem* pCurLayoutItem = pParentLayoutItem->m_pFirstChild;
- while (pCurLayoutItem) {
- pNextLayoutItem = pCurLayoutItem->m_pNextSibling;
- if (pCurLayoutItem->m_pFirstChild) {
- XFA_SyncRemoveLayoutItem(pCurLayoutItem, pNotify, pDocLayout);
- }
- pNotify->OnLayoutEvent(pDocLayout, pCurLayoutItem,
- XFA_LAYOUTEVENT_ItemRemoving);
- delete pCurLayoutItem;
- pCurLayoutItem = pNextLayoutItem;
- }
-}
-void CXFA_LayoutPageMgr::SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem) {
- CXFA_LayoutItem* pNextLayoutItem;
- CXFA_LayoutItem* pCurLayoutItem = pParentLayoutItem->m_pFirstChild;
- while (pCurLayoutItem) {
- pNextLayoutItem = pCurLayoutItem->m_pNextSibling;
- if (pCurLayoutItem->IsContentLayoutItem()) {
- FX_DWORD dwFlag = pCurLayoutItem->m_pFormNode->GetFlag();
- if (dwFlag & (XFA_NODEFLAG_HasRemoved)) {
- IXFA_Notify* pNotify =
- m_pTemplatePageSetRoot->GetDocument()->GetParser()->GetNotify();
- IXFA_DocLayout* pDocLayout =
- m_pTemplatePageSetRoot->GetDocument()->GetDocLayout();
- if (pCurLayoutItem->m_pFirstChild) {
- XFA_SyncRemoveLayoutItem(pCurLayoutItem, pNotify, pDocLayout);
- }
- pNotify->OnLayoutEvent(pDocLayout, pCurLayoutItem,
- XFA_LAYOUTEVENT_ItemRemoving);
- delete pCurLayoutItem;
- pCurLayoutItem = pNextLayoutItem;
- continue;
- }
- if (dwFlag & XFA_NODEFLAG_LayoutGeneratedNode) {
- CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
- sIterator(pCurLayoutItem->m_pFormNode);
- for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
- pNode = sIterator.MoveToNext()) {
- pNode->SetFlag(XFA_NODEFLAG_UnusedNode, TRUE, FALSE);
- }
- }
- }
- if (pCurLayoutItem->m_pFirstChild) {
- SaveLayoutItem(pCurLayoutItem);
- }
- pCurLayoutItem->m_pParent = NULL;
- pCurLayoutItem->m_pNextSibling = NULL;
- pCurLayoutItem->m_pFirstChild = NULL;
- if (!pCurLayoutItem->IsContentLayoutItem() &&
- pCurLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) {
- delete pCurLayoutItem;
- }
- pCurLayoutItem = pNextLayoutItem;
- }
-}
-#endif
-CXFA_Node* CXFA_LayoutPageMgr::QueryOverflow(
- CXFA_Node* pFormNode,
- CXFA_LayoutContext* pLayoutContext) {
- for (CXFA_Node* pCurNode = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
- pCurNode; pCurNode = pCurNode->GetNodeItem((XFA_NODEITEM_NextSibling))) {
- if (pCurNode->GetClassID() == XFA_ELEMENT_Break) {
- CFX_WideStringC wsOverflowLeader;
- CFX_WideStringC wsOverflowTarget;
- CFX_WideStringC wsOverflowTrailer;
- pCurNode->TryCData(XFA_ATTRIBUTE_OverflowLeader, wsOverflowLeader);
- pCurNode->TryCData(XFA_ATTRIBUTE_OverflowTrailer, wsOverflowTrailer);
- pCurNode->TryCData(XFA_ATTRIBUTE_OverflowTarget, wsOverflowTarget);
- if (!wsOverflowLeader.IsEmpty() || !wsOverflowTrailer.IsEmpty() ||
- !wsOverflowTarget.IsEmpty()) {
- return pCurNode;
- }
- return NULL;
- } else if (pCurNode->GetClassID() == XFA_ELEMENT_Overflow) {
- return pCurNode;
- }
- }
- return NULL;
-}
-void CXFA_LayoutPageMgr::MergePageSetContents() {
- CXFA_Document* pDocument = m_pTemplatePageSetRoot->GetDocument();
- IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify();
- IXFA_DocLayout* pDocLayout = pDocument->GetDocLayout();
- CXFA_ContainerLayoutItem* pRootLayout = this->GetRootLayoutItem();
- {
- for (int32_t iIndex = 0; iIndex < pDocument->m_pPendingPageSet.GetSize();
- iIndex++) {
- CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
- sIterator(pDocument->m_pPendingPageSet.GetAt(iIndex));
- for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
- pNode = sIterator.MoveToNext()) {
- if (pNode->IsContainerNode()) {
- CXFA_Node* pBindNode = pNode->GetBindData();
- if (pBindNode) {
- pBindNode->RemoveBindItem(pNode);
- pNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
- }
- }
- pNode->SetFlag(XFA_NODEFLAG_UnusedNode);
- }
- }
- }
- int32_t iIndex = 0;
- CXFA_Node* pPendingPageSet = NULL;
- for (; pRootLayout;
- pRootLayout = (CXFA_ContainerLayoutItem*)pRootLayout->m_pNextSibling) {
- pPendingPageSet = NULL;
- CXFA_NodeIteratorTemplate<
- CXFA_ContainerLayoutItem,
- CXFA_TraverseStrategy_ContentAreaContainerLayoutItem>
- iterator(pRootLayout);
- CXFA_ContainerLayoutItem* pRootPageSetContainerItem = iterator.GetCurrent();
- ASSERT(pRootPageSetContainerItem->m_pFormNode->GetClassID() ==
- XFA_ELEMENT_PageSet);
- if (iIndex < pDocument->m_pPendingPageSet.GetSize()) {
- pPendingPageSet = pDocument->m_pPendingPageSet.GetAt(iIndex);
- iIndex++;
- }
- if (!pPendingPageSet) {
- if (pRootPageSetContainerItem->m_pFormNode->GetPacketID() ==
- XFA_XDPPACKET_Template) {
- pPendingPageSet =
- pRootPageSetContainerItem->m_pFormNode->CloneTemplateToForm(FALSE);
- } else {
- pPendingPageSet = pRootPageSetContainerItem->m_pFormNode;
- }
- }
- if (pRootPageSetContainerItem->m_pFormNode->GetUserData(
- XFA_LAYOUTITEMKEY) == pRootPageSetContainerItem) {
- pRootPageSetContainerItem->m_pFormNode->SetUserData(XFA_LAYOUTITEMKEY,
- NULL);
- }
- pRootPageSetContainerItem->m_pFormNode = pPendingPageSet;
- pPendingPageSet->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
- for (CXFA_ContainerLayoutItem* pContainerItem = iterator.MoveToNext();
- pContainerItem; pContainerItem = iterator.MoveToNext()) {
- CXFA_Node* pNode = pContainerItem->m_pFormNode;
- if (pNode->GetPacketID() != XFA_XDPPACKET_Template) {
- continue;
- }
- switch (pNode->GetClassID()) {
- case XFA_ELEMENT_PageSet: {
- CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode;
- pContainerItem->m_pFormNode = XFA_NodeMerge_CloneOrMergeContainer(
- pDocument, pParentNode, pContainerItem->m_pFormNode, TRUE);
- } break;
- case XFA_ELEMENT_PageArea: {
- CXFA_ContainerLayoutItem* pFormLayout = pContainerItem;
- CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode;
- FX_BOOL bIsExistForm = TRUE;
- for (int32_t iLevel = 0; iLevel < 3; iLevel++) {
- pFormLayout = (CXFA_ContainerLayoutItem*)pFormLayout->m_pFirstChild;
- if (iLevel == 2) {
- while (pFormLayout &&
- !XFA_ItemLayoutProcessor_IsTakingSpace(
- pFormLayout->m_pFormNode)) {
- pFormLayout =
- (CXFA_ContainerLayoutItem*)pFormLayout->m_pNextSibling;
- }
- }
- if (pFormLayout == NULL) {
- bIsExistForm = FALSE;
- break;
- }
- }
- if (bIsExistForm) {
- CXFA_Node* pNewSubform = pFormLayout->m_pFormNode;
- if (pContainerItem->m_pOldSubform != NULL &&
- pContainerItem->m_pOldSubform != pNewSubform) {
- CXFA_Node* pExistingNode = XFA_DataMerge_FindFormDOMInstance(
- pDocument, pContainerItem->m_pFormNode->GetClassID(),
- pContainerItem->m_pFormNode->GetNameHash(), pParentNode);
- CXFA_ContainerIterator sIterator(pExistingNode);
- for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
- pNode = sIterator.MoveToNext()) {
- if (pNode->GetClassID() != XFA_ELEMENT_ContentArea) {
- CXFA_LayoutItem* pLayoutItem = static_cast<CXFA_LayoutItem*>(
- pNode->GetUserData(XFA_LAYOUTITEMKEY));
- if (pLayoutItem) {
- pNotify->OnLayoutEvent(pDocLayout, pLayoutItem,
- XFA_LAYOUTEVENT_ItemRemoving);
- delete pLayoutItem;
- }
- }
- }
- if (pExistingNode) {
- pParentNode->RemoveChild(pExistingNode);
- }
- }
- pContainerItem->m_pOldSubform = pNewSubform;
- }
- pContainerItem->m_pFormNode = pDocument->DataMerge_CopyContainer(
- pContainerItem->m_pFormNode, pParentNode,
- (CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Record), TRUE);
- } break;
- case XFA_ELEMENT_ContentArea: {
- CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode;
- for (CXFA_Node* pChildNode =
- pParentNode->GetNodeItem(XFA_NODEITEM_FirstChild);
- pChildNode;
- pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
- if (pChildNode->GetTemplateNode() != pContainerItem->m_pFormNode) {
- continue;
- }
- pContainerItem->m_pFormNode = pChildNode;
- break;
- }
- } break;
- default:
- break;
- }
- }
- if (!pPendingPageSet->GetNodeItem(XFA_NODEITEM_Parent)) {
- CXFA_Node* pFormToplevelSubform =
- ((CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Form))
- ->GetFirstChildByClass(XFA_ELEMENT_Subform);
- pFormToplevelSubform->InsertChild(pPendingPageSet);
- }
- pDocument->DataMerge_UpdateBindingRelations(pPendingPageSet);
- pPendingPageSet->SetFlag(XFA_NODEFLAG_Initialized);
- }
- pPendingPageSet = GetRootLayoutItem()->m_pFormNode;
- while (pPendingPageSet) {
- CXFA_Node* pNextPendingPageSet =
- pPendingPageSet->GetNextSameClassSibling(XFA_ELEMENT_PageSet);
- CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
- sIterator(pPendingPageSet);
- CXFA_Node* pNode = sIterator.GetCurrent();
- while (pNode) {
- if (pNode->HasFlag(XFA_NODEFLAG_UnusedNode)) {
- if (pNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) {
- XFA_ELEMENT eCurId = pNode->GetClassID();
- if (eCurId == XFA_ELEMENT_PageArea || eCurId == XFA_ELEMENT_PageSet) {
- CXFA_ContainerIterator iteChild(pNode);
- CXFA_Node* pChildNode = iteChild.MoveToNext();
- for (; pChildNode; pChildNode = iteChild.MoveToNext()) {
- CXFA_LayoutItem* pLayoutItem = static_cast<CXFA_LayoutItem*>(
- pChildNode->GetUserData(XFA_LAYOUTITEMKEY));
- if (pLayoutItem) {
- pNotify->OnLayoutEvent(pDocLayout, pLayoutItem,
- XFA_LAYOUTEVENT_ItemRemoving);
- delete pLayoutItem;
- }
- }
- } else if (eCurId != XFA_ELEMENT_ContentArea) {
- CXFA_LayoutItem* pLayoutItem = static_cast<CXFA_LayoutItem*>(
- pNode->GetUserData(XFA_LAYOUTITEMKEY));
- if (pLayoutItem) {
- pNotify->OnLayoutEvent(pDocLayout, pLayoutItem,
- XFA_LAYOUTEVENT_ItemRemoving);
- delete pLayoutItem;
- }
- }
- CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext();
- pNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pNode);
- pNode = pNext;
- } else {
- pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
- pNode->SetFlag(XFA_NODEFLAG_Initialized);
- pNode = sIterator.MoveToNext();
- }
- } else {
- pNode->SetFlag(XFA_NODEFLAG_Initialized);
- pNode = sIterator.MoveToNext();
- }
- }
- pPendingPageSet = pNextPendingPageSet;
- }
-}
-void CXFA_LayoutPageMgr::LayoutPageSetContents() {
- CXFA_ContainerLayoutItem* pRootLayoutItem = this->GetRootLayoutItem();
- for (; pRootLayoutItem;
- pRootLayoutItem =
- (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling) {
- CXFA_NodeIteratorTemplate<
- CXFA_ContainerLayoutItem,
- CXFA_TraverseStrategy_ContentAreaContainerLayoutItem>
- iterator(pRootLayoutItem);
- for (CXFA_ContainerLayoutItem* pContainerItem = iterator.GetCurrent();
- pContainerItem; pContainerItem = iterator.MoveToNext()) {
- CXFA_Node* pNode = pContainerItem->m_pFormNode;
- switch (pNode->GetClassID()) {
- case XFA_ELEMENT_PageArea:
- m_pLayoutProcessor->GetRootRootItemLayoutProcessor()
- ->DoLayoutPageArea(pContainerItem);
- break;
- default:
- break;
- }
- }
- }
-}
-void XFA_SyncContainer(IXFA_Notify* pNotify,
- IXFA_DocLayout* pDocLayout,
- CXFA_LayoutItem* pContainerItem,
- FX_DWORD dwRelevant,
- FX_BOOL bVisible,
- int32_t nPageIndex) {
- FX_BOOL bVisibleItem = FALSE;
- FX_DWORD dwStatus = 0;
- FX_DWORD dwRelevantContainer = 0;
- if (bVisible) {
- XFA_ATTRIBUTEENUM eAttributeValue =
- pContainerItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Presence);
- if (eAttributeValue == XFA_ATTRIBUTEENUM_Visible ||
- eAttributeValue == XFA_ATTRIBUTEENUM_Unknown) {
- bVisibleItem = TRUE;
- }
- dwRelevantContainer =
- XFA_GetRelevant(pContainerItem->m_pFormNode, dwRelevant);
- dwStatus =
- (bVisibleItem ? XFA_LAYOUTSTATUS_Visible : 0) | dwRelevantContainer;
- }
- pNotify->OnLayoutEvent(pDocLayout, pContainerItem, XFA_LAYOUTEVENT_ItemAdded,
- (void*)(uintptr_t)nPageIndex,
- (void*)(uintptr_t)dwStatus);
- for (CXFA_LayoutItem* pChild = pContainerItem->m_pFirstChild; pChild;
- pChild = pChild->m_pNextSibling) {
- if (pChild->IsContentLayoutItem()) {
- XFA_SyncContainer(pNotify, pDocLayout, pChild, dwRelevantContainer,
- bVisibleItem, nPageIndex);
- }
- }
-}
-void CXFA_LayoutPageMgr::SyncLayoutData() {
- MergePageSetContents();
- LayoutPageSetContents();
- IXFA_Notify* pNotify =
- m_pTemplatePageSetRoot->GetDocument()->GetParser()->GetNotify();
- int32_t nPageIdx = -1;
- CXFA_ContainerLayoutItem* pRootLayoutItem = this->GetRootLayoutItem();
- for (; pRootLayoutItem;
- pRootLayoutItem =
- (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling) {
- CXFA_NodeIteratorTemplate<
- CXFA_ContainerLayoutItem,
- CXFA_TraverseStrategy_ContentAreaContainerLayoutItem>
- iteratorParent(pRootLayoutItem);
- for (CXFA_ContainerLayoutItem* pContainerItem = iteratorParent.GetCurrent();
- pContainerItem; pContainerItem = iteratorParent.MoveToNext()) {
- switch (pContainerItem->m_pFormNode->GetClassID()) {
- case XFA_ELEMENT_PageArea: {
- nPageIdx++;
- FX_DWORD dwRelevant =
- XFA_LAYOUTSTATUS_Viewable | XFA_LAYOUTSTATUS_Printable;
- CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
- CXFA_TraverseStrategy_LayoutItem>
- iterator(pContainerItem);
- CXFA_LayoutItem* pChildLayoutItem = iterator.GetCurrent();
- while (pChildLayoutItem) {
- CXFA_ContentLayoutItem* pContentItem =
- pChildLayoutItem->AsContentLayoutItem();
- if (!pContentItem) {
- pChildLayoutItem = iterator.MoveToNext();
- continue;
- }
- FX_BOOL bVisible =
- (pContentItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Presence) ==
- XFA_ATTRIBUTEENUM_Visible);
- FX_DWORD dwRelevantChild =
- XFA_GetRelevant(pContentItem->m_pFormNode, dwRelevant);
- XFA_SyncContainer(pNotify, m_pLayoutProcessor, pContentItem,
- dwRelevantChild, bVisible, nPageIdx);
- pChildLayoutItem = iterator.SkipChildrenAndMoveToNext();
- }
- } break;
- default:
- break;
- }
- }
- }
- int32_t nPage = m_PageArray.GetSize();
- for (int32_t i = nPage - 1; i >= m_nAvailPages; i--) {
- CXFA_ContainerLayoutItem* pPage = m_PageArray[i];
- m_PageArray.RemoveAt(i);
- pNotify->OnPageEvent(pPage, XFA_PAGEEVENT_PageRemoved);
- delete pPage;
- }
- ClearRecordList();
-}
-void XFA_ReleaseLayoutItem_NoPageArea(CXFA_LayoutItem* pLayoutItem) {
- CXFA_LayoutItem* pNext, * pNode = pLayoutItem->m_pFirstChild;
- while (pNode) {
- pNext = pNode->m_pNextSibling;
- pNode->m_pParent = NULL;
- XFA_ReleaseLayoutItem_NoPageArea(pNode);
- pNode = pNext;
- }
- if (pLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) {
- delete pLayoutItem;
- }
-}
-void CXFA_LayoutPageMgr::PrepareLayout() {
- m_pPageSetCurRoot = NULL;
- m_ePageSetMode = XFA_ATTRIBUTEENUM_OrderedOccurrence;
- m_nAvailPages = 0;
- ClearRecordList();
- if (!m_pPageSetLayoutItemRoot) {
- return;
- }
- CXFA_ContainerLayoutItem* pRootLayoutItem = m_pPageSetLayoutItemRoot;
- if (pRootLayoutItem &&
- pRootLayoutItem->m_pFormNode->GetPacketID() == XFA_XDPPACKET_Form) {
- CXFA_Node* pPageSetFormNode = pRootLayoutItem->m_pFormNode;
- pRootLayoutItem->m_pFormNode->GetDocument()->m_pPendingPageSet.RemoveAll();
- if (pPageSetFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) {
- XFA_ReleaseLayoutItem(pRootLayoutItem);
- m_pPageSetLayoutItemRoot = NULL;
- pRootLayoutItem = NULL;
- pPageSetFormNode = NULL;
- m_PageArray.RemoveAll();
- }
- while (pPageSetFormNode) {
- CXFA_Node* pNextPageSet =
- pPageSetFormNode->GetNextSameClassSibling(XFA_ELEMENT_PageSet);
- pPageSetFormNode->GetNodeItem(XFA_NODEITEM_Parent)
- ->RemoveChild(pPageSetFormNode, FALSE);
- pRootLayoutItem->m_pFormNode->GetDocument()->m_pPendingPageSet.Add(
- pPageSetFormNode);
- pPageSetFormNode = pNextPageSet;
- }
- }
-#if defined(_XFA_LAYOUTITEM_MAPCACHE_) || defined(_XFA_LAYOUTITEM_ProcessCACHE_)
- pRootLayoutItem = m_pPageSetLayoutItemRoot;
- CXFA_ContainerLayoutItem* pNextLayout = NULL;
- for (; pRootLayoutItem; pRootLayoutItem = pNextLayout) {
- pNextLayout = (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling;
- SaveLayoutItem(pRootLayoutItem);
- delete pRootLayoutItem;
- }
- m_pPageSetLayoutItemRoot = NULL;
-#else
- IXFA_Notify* pNotify =
- m_pLayoutProcessor->GetDocument()->GetParser()->GetNotify();
- pRootLayoutItem = m_pPageSetLayoutItemRoot;
- for (; pRootLayoutItem;
- pRootLayoutItem =
- (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling) {
- CXFA_NodeIteratorTemplate<CXFA_ContainerLayoutItem,
- CXFA_TraverseStrategy_PageAreaContainerLayoutItem>
- iterator(pRootLayoutItem);
- for (CXFA_ContainerLayoutItem* pContainerItem = iterator.GetCurrent();
- pContainerItem; pContainerItem = iterator.MoveToNext()) {
- if (pContainerItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) {
- continue;
- }
- CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
- CXFA_TraverseStrategy_LayoutItem>
- iterator(pContainerItem);
- for (CXFA_LayoutItem* pLayoutItem = iterator.GetCurrent(); pLayoutItem;
- pLayoutItem = iterator.MoveToNext()) {
- if (!pLayoutItem->IsContentLayoutItem()) {
- continue;
- }
- pNotify->OnLayoutEvent(m_pLayoutProcessor, pLayoutItem,
- XFA_LAYOUTEVENT_ItemRemoving);
- }
- pNotify->OnPageEvent(pContainerItem, XFA_PAGEEVENT_PageRemoved);
- }
- }
- pRootLayoutItem = m_pPageSetLayoutItemRoot;
- CXFA_ContainerLayoutItem* pNextLayout = NULL;
- for (; pRootLayoutItem; pRootLayoutItem = pNextLayout) {
- pNextLayout = (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling;
- XFA_ReleaseLayoutItem_NoPageArea(pRootLayoutItem);
- }
- m_pPageSetLayoutItemRoot = NULL;
-#endif
-}
+// 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_utils.h"
+#include "xfa/src/fxfa/src/common/xfa_object.h"
+#include "xfa/src/fxfa/src/common/xfa_document.h"
+#include "xfa/src/fxfa/src/common/xfa_parser.h"
+#include "xfa/src/fxfa/src/common/xfa_script.h"
+#include "xfa/src/fxfa/src/common/xfa_docdata.h"
+#include "xfa/src/fxfa/src/common/xfa_doclayout.h"
+#include "xfa/src/fxfa/src/common/xfa_localemgr.h"
+#include "xfa/src/fxfa/src/common/xfa_fm2jsapi.h"
+#include "xfa_document_datamerger_imp.h"
+#include "xfa_document_layout_imp.h"
+#include "xfa_layout_itemlayout.h"
+#include "xfa_layout_pagemgr_new.h"
+#include "xfa_layout_appadapter.h"
+CXFA_LayoutPageMgr::CXFA_LayoutPageMgr(CXFA_LayoutProcessor* pLayoutProcessor)
+ : m_pLayoutProcessor(pLayoutProcessor),
+ m_pTemplatePageSetRoot(nullptr),
+ m_pPageSetLayoutItemRoot(nullptr),
+ m_pPageSetCurRoot(nullptr),
+ m_pCurrentContainerRecord(nullptr),
+ m_pCurPageArea(nullptr),
+ m_nAvailPages(0),
+ m_nCurPageCount(0),
+ m_ePageSetMode(XFA_ATTRIBUTEENUM_OrderedOccurrence),
+ m_bCreateOverFlowPage(FALSE) {
+}
+CXFA_LayoutPageMgr::~CXFA_LayoutPageMgr() {
+ ClearData();
+ CXFA_LayoutItem* pLayoutItem = GetRootLayoutItem();
+ CXFA_LayoutItem* pNextLayout = NULL;
+ for (; pLayoutItem; pLayoutItem = pNextLayout) {
+ pNextLayout = pLayoutItem->m_pNextSibling;
+ XFA_ReleaseLayoutItem(pLayoutItem);
+ }
+}
+FX_BOOL CXFA_LayoutPageMgr::InitLayoutPage(CXFA_Node* pFormNode) {
+ PrepareLayout();
+ CXFA_Node* pTemplateNode = pFormNode->GetTemplateNode();
+ if (!pTemplateNode) {
+ return FALSE;
+ }
+ m_pTemplatePageSetRoot = pTemplateNode->GetProperty(0, XFA_ELEMENT_PageSet);
+ ASSERT(m_pTemplatePageSetRoot);
+ if (m_pPageSetLayoutItemRoot) {
+ m_pPageSetLayoutItemRoot->m_pParent = NULL;
+ m_pPageSetLayoutItemRoot->m_pFirstChild = NULL;
+ m_pPageSetLayoutItemRoot->m_pNextSibling = NULL;
+ m_pPageSetLayoutItemRoot->m_pFormNode = m_pTemplatePageSetRoot;
+ } else {
+ m_pPageSetLayoutItemRoot =
+ new CXFA_ContainerLayoutItem(m_pTemplatePageSetRoot);
+ }
+ m_pPageSetCurRoot = m_pPageSetLayoutItemRoot;
+ m_pTemplatePageSetRoot->SetUserData(XFA_LAYOUTITEMKEY,
+ (void*)m_pPageSetLayoutItemRoot);
+ XFA_ATTRIBUTEENUM eRelation =
+ m_pTemplatePageSetRoot->GetEnum(XFA_ATTRIBUTE_Relation);
+ if (eRelation != XFA_ATTRIBUTEENUM_Unknown) {
+ m_ePageSetMode = eRelation;
+ }
+ InitPageSetMap();
+ CXFA_Node* pPageArea = NULL;
+ int32_t iCount = 0;
+ for (pPageArea = m_pTemplatePageSetRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
+ pPageArea;
+ pPageArea = pPageArea->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+ if (pPageArea->GetClassID() == XFA_ELEMENT_PageArea) {
+ iCount++;
+ if (pPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea)) {
+ return TRUE;
+ }
+ }
+ }
+ if (iCount > 0) {
+ return FALSE;
+ }
+ CXFA_Document* pDocument = pTemplateNode->GetDocument();
+ IXFA_ObjFactory* pObjFactory = pDocument->GetParser()->GetFactory();
+ pPageArea = m_pTemplatePageSetRoot->GetChild(0, XFA_ELEMENT_PageArea);
+ if (!pPageArea) {
+ pPageArea = pObjFactory->CreateNode(m_pTemplatePageSetRoot->GetPacketID(),
+ XFA_ELEMENT_PageArea);
+ if (!pPageArea) {
+ return FALSE;
+ }
+ m_pTemplatePageSetRoot->InsertChild(pPageArea, NULL);
+ pPageArea->SetFlag(XFA_NODEFLAG_Initialized);
+ }
+ CXFA_Node* pContentArea = pPageArea->GetChild(0, XFA_ELEMENT_ContentArea);
+ if (!pContentArea) {
+ pContentArea = pObjFactory->CreateNode(pPageArea->GetPacketID(),
+ XFA_ELEMENT_ContentArea);
+ if (!pContentArea) {
+ return FALSE;
+ }
+ pPageArea->InsertChild(pContentArea, NULL);
+ pContentArea->SetFlag(XFA_NODEFLAG_Initialized);
+ pContentArea->SetMeasure(XFA_ATTRIBUTE_X,
+ CXFA_Measurement(0.25f, XFA_UNIT_In));
+ pContentArea->SetMeasure(XFA_ATTRIBUTE_Y,
+ CXFA_Measurement(0.25f, XFA_UNIT_In));
+ pContentArea->SetMeasure(XFA_ATTRIBUTE_W,
+ CXFA_Measurement(8.0f, XFA_UNIT_In));
+ pContentArea->SetMeasure(XFA_ATTRIBUTE_H,
+ CXFA_Measurement(10.5f, XFA_UNIT_In));
+ }
+ CXFA_Node* pMedium = pPageArea->GetChild(0, XFA_ELEMENT_Medium);
+ if (!pMedium) {
+ pMedium =
+ pObjFactory->CreateNode(pPageArea->GetPacketID(), XFA_ELEMENT_Medium);
+ if (!pContentArea) {
+ return FALSE;
+ }
+ pPageArea->InsertChild(pMedium, NULL);
+ pMedium->SetFlag(XFA_NODEFLAG_Initialized);
+ pMedium->SetMeasure(XFA_ATTRIBUTE_Short,
+ CXFA_Measurement(8.5f, XFA_UNIT_In));
+ pMedium->SetMeasure(XFA_ATTRIBUTE_Long,
+ CXFA_Measurement(11.0f, XFA_UNIT_In));
+ }
+ return TRUE;
+}
+FX_BOOL CXFA_LayoutPageMgr::PrepareFirstPage(CXFA_Node* pRootSubform) {
+ FX_BOOL bProBreakBefore = FALSE;
+ CXFA_Node* pBreakBeforeNode = NULL;
+ while (pRootSubform) {
+ for (CXFA_Node* pBreakNode =
+ pRootSubform->GetNodeItem(XFA_NODEITEM_FirstChild);
+ pBreakNode;
+ pBreakNode = pBreakNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+ XFA_ELEMENT eType = pBreakNode->GetClassID();
+ if (eType == XFA_ELEMENT_BreakBefore ||
+ (eType == XFA_ELEMENT_Break &&
+ pBreakNode->GetEnum(XFA_ATTRIBUTE_Before) !=
+ XFA_ATTRIBUTEENUM_Auto)) {
+ bProBreakBefore = TRUE;
+ pBreakBeforeNode = pBreakNode;
+ break;
+ }
+ }
+ if (bProBreakBefore) {
+ break;
+ }
+ bProBreakBefore = TRUE;
+ pRootSubform = pRootSubform->GetFirstChildByClass(XFA_ELEMENT_Subform);
+ while (pRootSubform &&
+ !XFA_ItemLayoutProcessor_IsTakingSpace(pRootSubform)) {
+ pRootSubform = pRootSubform->GetNextSameClassSibling(XFA_ELEMENT_Subform);
+ }
+ }
+ CXFA_Node *pLeader, *pTrailer;
+ if (pBreakBeforeNode &&
+ ExecuteBreakBeforeOrAfter(pBreakBeforeNode, TRUE, pLeader, pTrailer)) {
+ m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetHeadPosition();
+ return TRUE;
+ }
+ return AppendNewPage(TRUE);
+}
+FX_BOOL CXFA_LayoutPageMgr::AppendNewPage(FX_BOOL bFirstTemPage) {
+ if (m_pCurrentContainerRecord !=
+ m_rgProposedContainerRecord.GetTailPosition()) {
+ return TRUE;
+ }
+ CXFA_Node* pPageNode = GetNextAvailPageArea(NULL);
+ if (!pPageNode) {
+ return FALSE;
+ }
+ if (bFirstTemPage && m_pCurrentContainerRecord == NULL) {
+ m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetHeadPosition();
+ }
+ return !bFirstTemPage || m_pCurrentContainerRecord != NULL;
+}
+static void XFA_LayoutItemMgr_ReorderLayoutItemToTail(
+ CXFA_ContainerLayoutItem* pLayoutItem) {
+ CXFA_ContainerLayoutItem* pParentLayoutItem =
+ (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
+ if (!pParentLayoutItem) {
+ return;
+ }
+ pParentLayoutItem->RemoveChild(pLayoutItem);
+ pParentLayoutItem->AddChild(pLayoutItem);
+}
+static void XFA_LayoutItemMgr_RemoveLayoutItem(
+ CXFA_ContainerLayoutItem* pLayoutItem) {
+ CXFA_ContainerLayoutItem* pParentLayoutItem =
+ (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
+ if (!pParentLayoutItem) {
+ return;
+ }
+ pParentLayoutItem->RemoveChild(pLayoutItem);
+}
+void CXFA_LayoutPageMgr::RemoveLayoutRecord(CXFA_ContainerRecord* pNewRecord,
+ CXFA_ContainerRecord* pPrevRecord) {
+ if (!pNewRecord || !pPrevRecord) {
+ return;
+ }
+ if (pNewRecord->pCurPageSet != pPrevRecord->pCurPageSet) {
+ XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurPageSet);
+ return;
+ }
+ if (pNewRecord->pCurPageArea != pPrevRecord->pCurPageArea) {
+ XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurPageArea);
+ return;
+ }
+ if (pNewRecord->pCurContentArea != pPrevRecord->pCurContentArea) {
+ XFA_LayoutItemMgr_RemoveLayoutItem(pNewRecord->pCurContentArea);
+ return;
+ }
+}
+void CXFA_LayoutPageMgr::ReorderPendingLayoutRecordToTail(
+ CXFA_ContainerRecord* pNewRecord,
+ CXFA_ContainerRecord* pPrevRecord) {
+ if (!pNewRecord || !pPrevRecord) {
+ return;
+ }
+ if (pNewRecord->pCurPageSet != pPrevRecord->pCurPageSet) {
+ XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurPageSet);
+ return;
+ }
+ if (pNewRecord->pCurPageArea != pPrevRecord->pCurPageArea) {
+ XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurPageArea);
+ return;
+ }
+ if (pNewRecord->pCurContentArea != pPrevRecord->pCurContentArea) {
+ XFA_LayoutItemMgr_ReorderLayoutItemToTail(pNewRecord->pCurContentArea);
+ return;
+ }
+}
+void CXFA_LayoutPageMgr::SubmitContentItem(
+ CXFA_ContentLayoutItem* pContentLayoutItem,
+ XFA_ItemLayoutProcessorResult eStatus) {
+ if (pContentLayoutItem) {
+ GetCurrentContainerRecord()->pCurContentArea->AddChild(pContentLayoutItem);
+ m_bCreateOverFlowPage = FALSE;
+ }
+ if (eStatus != XFA_ItemLayoutProcessorResult_Done) {
+ if (eStatus == XFA_ItemLayoutProcessorResult_PageFullBreak &&
+ m_pCurrentContainerRecord ==
+ m_rgProposedContainerRecord.GetTailPosition()) {
+ AppendNewPage();
+ }
+ m_pCurrentContainerRecord = m_rgProposedContainerRecord.GetTailPosition();
+ m_pCurPageArea = GetCurrentContainerRecord()->pCurPageArea->m_pFormNode;
+ }
+}
+FX_FLOAT CXFA_LayoutPageMgr::GetAvailHeight() {
+ FX_FLOAT fAvailHeight =
+ GetCurrentContainerRecord()
+ ->pCurContentArea->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_H)
+ .ToUnit(XFA_UNIT_Pt);
+ if (fAvailHeight < XFA_LAYOUT_FLOAT_PERCISION) {
+ if (m_pCurrentContainerRecord ==
+ m_rgProposedContainerRecord.GetHeadPosition()) {
+ fAvailHeight = 0;
+ } else {
+ fAvailHeight = XFA_LAYOUT_FLOAT_MAX;
+ }
+ }
+ return fAvailHeight;
+}
+static CXFA_Node* XFA_ResolveBreakTarget(CXFA_Node* pPageSetRoot,
+ FX_BOOL bNewExprStyle,
+ CFX_WideStringC& wsTargetExpr) {
+ CXFA_Document* pDocument = pPageSetRoot->GetDocument();
+ if (wsTargetExpr.IsEmpty()) {
+ return NULL;
+ }
+ CFX_WideString wsTargetAll = wsTargetExpr;
+ wsTargetAll.TrimLeft();
+ wsTargetAll.TrimRight();
+ int32_t iSpliteIndex = 0;
+ FX_BOOL bTargetAllFind = TRUE;
+ while (iSpliteIndex != -1) {
+ CFX_WideString wsTargetExpr;
+ int32_t iSpliteNextIndex = 0;
+ if (!bTargetAllFind) {
+ iSpliteNextIndex = wsTargetAll.Find(' ', iSpliteIndex);
+ wsTargetExpr =
+ wsTargetAll.Mid(iSpliteIndex, iSpliteNextIndex - iSpliteIndex);
+ } else {
+ wsTargetExpr = wsTargetAll;
+ }
+ if (wsTargetExpr.IsEmpty()) {
+ return NULL;
+ }
+ bTargetAllFind = FALSE;
+ if (wsTargetExpr.GetAt(0) == '#') {
+ CXFA_Node* pNode = pDocument->GetNodeByID(
+ (CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Template),
+ wsTargetExpr.Mid(1));
+ if (pNode) {
+ return pNode;
+ }
+ } else if (bNewExprStyle) {
+ CFX_WideString wsProcessedTarget = wsTargetExpr;
+ if (wsTargetExpr.Left(4) == FX_WSTRC(L"som(") &&
+ wsTargetExpr.Right(1) == FX_WSTRC(L")")) {
+ wsProcessedTarget = wsTargetExpr.Mid(4, wsTargetExpr.GetLength() - 5);
+ }
+ XFA_RESOLVENODE_RS rs;
+ int32_t iCount = pDocument->GetScriptContext()->ResolveObjects(
+ pPageSetRoot, wsProcessedTarget, rs,
+ XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
+ XFA_RESOLVENODE_Attributes | XFA_RESOLVENODE_Siblings |
+ XFA_RESOLVENODE_Parent);
+ if (iCount > 0 && rs.nodes[0]->IsNode()) {
+ return (CXFA_Node*)rs.nodes[0];
+ }
+ }
+ iSpliteIndex = iSpliteNextIndex;
+ }
+ return NULL;
+}
+
+FX_BOOL XFA_LayoutPageMgr_RunBreakTestScript(CXFA_Node* pTestScript) {
+ CFX_WideString wsExpression;
+ pTestScript->TryContent(wsExpression);
+ if (wsExpression.IsEmpty()) {
+ return TRUE;
+ }
+ return pTestScript->GetDocument()->GetParser()->GetNotify()->RunScript(
+ pTestScript, pTestScript->GetNodeItem(XFA_NODEITEM_Parent,
+ XFA_OBJECTTYPE_ContainerNode));
+}
+CXFA_ContainerRecord* CXFA_LayoutPageMgr::CreateContainerRecord(
+ CXFA_Node* pPageNode,
+ FX_BOOL bCreateNew) {
+ CXFA_ContainerRecord* pNewRecord = new CXFA_ContainerRecord();
+ if (m_pCurrentContainerRecord) {
+ if (!IsPageSetRootOrderedOccurrence() || pPageNode == NULL) {
+ *pNewRecord = *GetCurrentContainerRecord();
+ m_rgProposedContainerRecord.AddTail(pNewRecord);
+ return pNewRecord;
+ }
+ CXFA_Node* pPageSet = pPageNode->GetNodeItem(XFA_NODEITEM_Parent);
+ if (!bCreateNew) {
+ if (pPageSet == m_pTemplatePageSetRoot) {
+ pNewRecord->pCurPageSet = m_pPageSetCurRoot;
+ } else {
+ CXFA_ContainerLayoutItem* pParentLayoutItem =
+ (CXFA_ContainerLayoutItem*)pPageSet->GetUserData(XFA_LAYOUTITEMKEY);
+ if (pParentLayoutItem == NULL) {
+ pParentLayoutItem = m_pPageSetCurRoot;
+ }
+ pNewRecord->pCurPageSet = pParentLayoutItem;
+ }
+ } else {
+ CXFA_ContainerLayoutItem* pParentPageSetLayout = NULL;
+ if (pPageSet == GetCurrentContainerRecord()->pCurPageSet->m_pFormNode) {
+ pParentPageSetLayout =
+ (CXFA_ContainerLayoutItem*)
+ GetCurrentContainerRecord()->pCurPageSet->m_pParent;
+ } else {
+ pParentPageSetLayout =
+ (CXFA_ContainerLayoutItem*)pPageSet->GetNodeItem(
+ XFA_NODEITEM_Parent)
+ ->GetUserData(XFA_LAYOUTITEMKEY);
+ }
+ CXFA_ContainerLayoutItem* pPageSetLayoutItem =
+ new CXFA_ContainerLayoutItem(pPageSet);
+ pPageSet->SetUserData(XFA_LAYOUTITEMKEY, (void*)pPageSetLayoutItem);
+ if (pParentPageSetLayout == NULL) {
+ CXFA_ContainerLayoutItem* pPrePageSet = m_pPageSetLayoutItemRoot;
+ while (pPrePageSet->m_pNextSibling) {
+ pPrePageSet = (CXFA_ContainerLayoutItem*)pPrePageSet->m_pNextSibling;
+ }
+ pPrePageSet->m_pNextSibling = pPageSetLayoutItem;
+ m_pPageSetCurRoot = pPageSetLayoutItem;
+ } else {
+ pParentPageSetLayout->AddChild(pPageSetLayoutItem);
+ }
+ pNewRecord->pCurPageSet = pPageSetLayoutItem;
+ }
+ } else {
+ if (pPageNode) {
+ CXFA_Node* pPageSet = pPageNode->GetNodeItem(XFA_NODEITEM_Parent);
+ if (pPageSet == m_pTemplatePageSetRoot) {
+ pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot;
+ } else {
+ CXFA_ContainerLayoutItem* pPageSetLayoutItem =
+ new CXFA_ContainerLayoutItem(pPageSet);
+ pPageSet->SetUserData(XFA_LAYOUTITEMKEY, (void*)pPageSetLayoutItem);
+ m_pPageSetLayoutItemRoot->AddChild(pPageSetLayoutItem);
+ pNewRecord->pCurPageSet = pPageSetLayoutItem;
+ }
+ } else {
+ pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot;
+ }
+ }
+ m_rgProposedContainerRecord.AddTail(pNewRecord);
+ return pNewRecord;
+}
+void CXFA_LayoutPageMgr::AddPageAreaLayoutItem(CXFA_ContainerRecord* pNewRecord,
+ CXFA_Node* pNewPageArea) {
+ CXFA_ContainerLayoutItem* pNewPageAreaLayoutItem = NULL;
+ if (m_PageArray.GetSize() > m_nAvailPages) {
+ CXFA_ContainerLayoutItem* pContainerItem = m_PageArray[m_nAvailPages];
+ pContainerItem->m_pFormNode = pNewPageArea;
+ m_nAvailPages++;
+ pNewPageAreaLayoutItem = pContainerItem;
+ } else {
+ IXFA_Notify* pNotify =
+ pNewPageArea->GetDocument()->GetParser()->GetNotify();
+ CXFA_ContainerLayoutItem* pContainerItem =
+ (CXFA_ContainerLayoutItem*)pNotify->OnCreateLayoutItem(pNewPageArea);
+ m_PageArray.Add(pContainerItem);
+ m_nAvailPages++;
+ pNotify->OnPageEvent(pContainerItem, XFA_PAGEEVENT_PageAdded,
+ (void*)(uintptr_t)m_nAvailPages);
+ pNewPageAreaLayoutItem = pContainerItem;
+ }
+ pNewRecord->pCurPageSet->AddChild(pNewPageAreaLayoutItem);
+ pNewRecord->pCurPageArea = pNewPageAreaLayoutItem;
+ pNewRecord->pCurContentArea = NULL;
+}
+void CXFA_LayoutPageMgr::AddContentAreaLayoutItem(
+ CXFA_ContainerRecord* pNewRecord,
+ CXFA_Node* pContentArea) {
+ if (pContentArea == NULL) {
+ pNewRecord->pCurContentArea = NULL;
+ return;
+ }
+ CXFA_ContainerLayoutItem* pNewContentAreaLayoutItem =
+ new CXFA_ContainerLayoutItem(pContentArea);
+ ASSERT(pNewRecord->pCurPageArea);
+ pNewRecord->pCurPageArea->AddChild(pNewContentAreaLayoutItem);
+ pNewRecord->pCurContentArea = pNewContentAreaLayoutItem;
+}
+class CXFA_TraverseStrategy_PageSetContainerLayoutItem {
+ public:
+ static inline CXFA_ContainerLayoutItem* GetFirstChild(
+ CXFA_ContainerLayoutItem* pLayoutItem) {
+ if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_PageSet) {
+ CXFA_ContainerLayoutItem* pChildItem =
+ (CXFA_ContainerLayoutItem*)pLayoutItem->m_pFirstChild;
+ while (pChildItem &&
+ pChildItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageSet) {
+ pChildItem = (CXFA_ContainerLayoutItem*)pChildItem->m_pNextSibling;
+ }
+ return pChildItem;
+ }
+ return NULL;
+ }
+ static inline CXFA_ContainerLayoutItem* GetNextSibling(
+ CXFA_ContainerLayoutItem* pLayoutItem) {
+ CXFA_ContainerLayoutItem* pChildItem =
+ (CXFA_ContainerLayoutItem*)pLayoutItem->m_pNextSibling;
+ while (pChildItem &&
+ pChildItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageSet) {
+ pChildItem = (CXFA_ContainerLayoutItem*)pChildItem->m_pNextSibling;
+ }
+ return pChildItem;
+ }
+ static inline CXFA_ContainerLayoutItem* GetParent(
+ CXFA_ContainerLayoutItem* pLayoutItem) {
+ return (CXFA_ContainerLayoutItem*)pLayoutItem->m_pParent;
+ }
+};
+void CXFA_LayoutPageMgr::FinishPaginatedPageSets() {
+ CXFA_ContainerLayoutItem* pRootPageSetLayoutItem = m_pPageSetLayoutItemRoot;
+ for (; pRootPageSetLayoutItem;
+ pRootPageSetLayoutItem =
+ (CXFA_ContainerLayoutItem*)pRootPageSetLayoutItem->m_pNextSibling) {
+ CXFA_NodeIteratorTemplate<CXFA_ContainerLayoutItem,
+ CXFA_TraverseStrategy_PageSetContainerLayoutItem>
+ sIterator(pRootPageSetLayoutItem);
+ for (CXFA_ContainerLayoutItem* pPageSetLayoutItem = sIterator.GetCurrent();
+ pPageSetLayoutItem; pPageSetLayoutItem = sIterator.MoveToNext()) {
+ XFA_ATTRIBUTEENUM ePageRelation =
+ pPageSetLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Relation);
+ switch (ePageRelation) {
+ case XFA_ATTRIBUTEENUM_OrderedOccurrence:
+ default: { ProcessLastPageSet(); } break;
+ case XFA_ATTRIBUTEENUM_SimplexPaginated:
+ case XFA_ATTRIBUTEENUM_DuplexPaginated: {
+ CXFA_LayoutItem* pLastPageAreaLayoutItem = NULL;
+ int32_t nPageAreaCount = 0;
+ for (CXFA_LayoutItem* pPageAreaLayoutItem =
+ pPageSetLayoutItem->m_pFirstChild;
+ pPageAreaLayoutItem;
+ pPageAreaLayoutItem = pPageAreaLayoutItem->m_pNextSibling) {
+ if (pPageAreaLayoutItem->m_pFormNode->GetClassID() !=
+ XFA_ELEMENT_PageArea) {
+ continue;
+ }
+ nPageAreaCount++;
+ pLastPageAreaLayoutItem = pPageAreaLayoutItem;
+ }
+ if (!pLastPageAreaLayoutItem) {
+ break;
+ }
+ if (!FindPageAreaFromPageSet_SimplexDuplex(
+ pPageSetLayoutItem->m_pFormNode, NULL, NULL, NULL, TRUE, TRUE,
+ nPageAreaCount == 1 ? XFA_ATTRIBUTEENUM_Only
+ : XFA_ATTRIBUTEENUM_Last) &&
+ (nPageAreaCount == 1 &&
+ !FindPageAreaFromPageSet_SimplexDuplex(
+ pPageSetLayoutItem->m_pFormNode, NULL, NULL, NULL, TRUE,
+ TRUE, XFA_ATTRIBUTEENUM_Last))) {
+ break;
+ }
+ CXFA_Node* pNode = m_pCurPageArea;
+ XFA_ATTRIBUTEENUM eCurChoice =
+ pNode->GetEnum(XFA_ATTRIBUTE_PagePosition);
+ if (eCurChoice == XFA_ATTRIBUTEENUM_Last) {
+ XFA_ATTRIBUTEENUM eOddOrEven = XFA_ATTRIBUTEENUM_Any;
+ pNode->TryEnum(XFA_ATTRIBUTE_OddOrEven, eOddOrEven);
+ XFA_ATTRIBUTEENUM eLastChoice =
+ pLastPageAreaLayoutItem->m_pFormNode->GetEnum(
+ XFA_ATTRIBUTE_PagePosition);
+ if (eLastChoice == XFA_ATTRIBUTEENUM_First &&
+ (ePageRelation == XFA_ATTRIBUTEENUM_SimplexPaginated ||
+ eOddOrEven != XFA_ATTRIBUTEENUM_Odd)) {
+ CXFA_ContainerRecord* pRecord = CreateContainerRecord();
+ AddPageAreaLayoutItem(pRecord, pNode);
+ break;
+ ;
+ }
+ }
+ FX_BOOL bUsable = TRUE;
+ CFX_ArrayTemplate<FX_FLOAT> rgUsedHeights;
+ for (CXFA_LayoutItem* pChildLayoutItem =
+ pLastPageAreaLayoutItem->m_pFirstChild;
+ pChildLayoutItem;
+ pChildLayoutItem = pChildLayoutItem->m_pNextSibling) {
+ if (pChildLayoutItem->m_pFormNode->GetClassID() !=
+ XFA_ELEMENT_ContentArea) {
+ continue;
+ }
+ FX_FLOAT fUsedHeight = 0;
+ for (CXFA_LayoutItem* pContentChildLayoutItem =
+ pChildLayoutItem->m_pFirstChild;
+ pContentChildLayoutItem;
+ pContentChildLayoutItem =
+ pContentChildLayoutItem->m_pNextSibling) {
+ if (CXFA_ContentLayoutItem* pContent =
+ pContentChildLayoutItem->AsContentLayoutItem()) {
+ fUsedHeight += pContent->m_sSize.y;
+ }
+ }
+ rgUsedHeights.Add(fUsedHeight);
+ }
+ int32_t iCurContentAreaIndex = -1;
+ for (CXFA_Node* pContentAreaNode =
+ pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+ pContentAreaNode;
+ pContentAreaNode =
+ pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+ if (pContentAreaNode->GetClassID() != XFA_ELEMENT_ContentArea) {
+ continue;
+ }
+ iCurContentAreaIndex++;
+ if (rgUsedHeights[iCurContentAreaIndex] >
+ pContentAreaNode->GetMeasure(XFA_ATTRIBUTE_H)
+ .ToUnit(XFA_UNIT_Pt) +
+ XFA_LAYOUT_FLOAT_PERCISION) {
+ bUsable = FALSE;
+ break;
+ }
+ }
+ if (bUsable) {
+ CXFA_LayoutItem* pChildLayoutItem =
+ pLastPageAreaLayoutItem->m_pFirstChild;
+ CXFA_Node* pContentAreaNode =
+ pNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+ pLastPageAreaLayoutItem->m_pFormNode = pNode;
+ while (pChildLayoutItem && pContentAreaNode) {
+ if (pChildLayoutItem->m_pFormNode->GetClassID() !=
+ XFA_ELEMENT_ContentArea) {
+ pChildLayoutItem = pChildLayoutItem->m_pNextSibling;
+ continue;
+ }
+ if (pContentAreaNode->GetClassID() != XFA_ELEMENT_ContentArea) {
+ pContentAreaNode =
+ pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+ continue;
+ }
+ pChildLayoutItem->m_pFormNode = pContentAreaNode;
+ pChildLayoutItem = pChildLayoutItem->m_pNextSibling;
+ pContentAreaNode =
+ pContentAreaNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+ }
+ } else if (pNode->GetEnum(XFA_ATTRIBUTE_PagePosition) ==
+ XFA_ATTRIBUTEENUM_Last) {
+ CXFA_ContainerRecord* pRecord = CreateContainerRecord();
+ AddPageAreaLayoutItem(pRecord, pNode);
+ }
+ } break;
+ }
+ }
+ }
+}
+int32_t CXFA_LayoutPageMgr::GetPageCount() const {
+ return m_PageArray.GetSize();
+}
+IXFA_LayoutPage* CXFA_LayoutPageMgr::GetPage(int32_t index) const {
+ if (index < 0 || index >= m_PageArray.GetSize())
+ return nullptr;
+ return m_PageArray[index];
+}
+int32_t CXFA_LayoutPageMgr::GetPageIndex(const IXFA_LayoutPage* pPage) const {
+ // FIXME: Find() method should take const.
+ return m_PageArray.Find(static_cast<CXFA_ContainerLayoutItem*>(
+ const_cast<IXFA_LayoutPage*>(pPage)));
+}
+FX_BOOL CXFA_LayoutPageMgr::RunBreak(XFA_ELEMENT eBreakType,
+ XFA_ATTRIBUTEENUM eTargetType,
+ CXFA_Node* pTarget,
+ FX_BOOL bStartNew) {
+ FX_BOOL bRet = FALSE;
+ switch (eTargetType) {
+ case XFA_ATTRIBUTEENUM_ContentArea:
+ if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_ContentArea) {
+ pTarget = NULL;
+ }
+ if (!pTarget || !m_pCurrentContainerRecord ||
+ pTarget !=
+ GetCurrentContainerRecord()->pCurContentArea->m_pFormNode ||
+ bStartNew) {
+ CXFA_Node* pPageArea = NULL;
+ if (pTarget) {
+ pPageArea = pTarget->GetNodeItem(XFA_NODEITEM_Parent);
+ }
+ pPageArea = GetNextAvailPageArea(pPageArea, pTarget);
+ bRet = pPageArea != NULL;
+ }
+ break;
+ case XFA_ATTRIBUTEENUM_PageArea:
+ if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) {
+ pTarget = NULL;
+ }
+ if (!pTarget || !m_pCurrentContainerRecord ||
+ pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode ||
+ bStartNew) {
+ CXFA_Node* pPageArea = GetNextAvailPageArea(pTarget, NULL, TRUE);
+ bRet = pPageArea != NULL;
+ }
+ break;
+ case XFA_ATTRIBUTEENUM_PageOdd:
+ if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) {
+ pTarget = NULL;
+ }
+ if (m_nAvailPages % 2 != 1 || !m_pCurrentContainerRecord ||
+ (pTarget &&
+ pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode) ||
+ bStartNew) {
+ if (m_nAvailPages % 2 == 1) {
+ }
+ }
+ break;
+ case XFA_ATTRIBUTEENUM_PageEven:
+ if (pTarget && pTarget->GetClassID() != XFA_ELEMENT_PageArea) {
+ pTarget = NULL;
+ }
+ if (m_nAvailPages % 2 != 0 || !m_pCurrentContainerRecord ||
+ (pTarget &&
+ pTarget != GetCurrentContainerRecord()->pCurPageArea->m_pFormNode) ||
+ bStartNew) {
+ if (m_nAvailPages % 2 == 0) {
+ }
+ }
+ break;
+ case XFA_ATTRIBUTEENUM_Auto:
+ default:
+ break;
+ ;
+ }
+ return bRet;
+}
+FX_BOOL CXFA_LayoutPageMgr::ExecuteBreakBeforeOrAfter(
+ CXFA_Node* pCurNode,
+ FX_BOOL bBefore,
+ CXFA_Node*& pBreakLeaderTemplate,
+ CXFA_Node*& pBreakTrailerTemplate) {
+ XFA_ELEMENT eType = pCurNode->GetClassID();
+ switch (eType) {
+ case XFA_ELEMENT_BreakBefore:
+ case XFA_ELEMENT_BreakAfter: {
+ CFX_WideStringC wsBreakLeader, wsBreakTrailer;
+ CXFA_Node* pFormNode = pCurNode->GetNodeItem(
+ XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
+ CXFA_Node* pContainer = pFormNode->GetTemplateNode();
+ FX_BOOL bStartNew = pCurNode->GetInteger(XFA_ATTRIBUTE_StartNew) != 0;
+ CXFA_Node* pScript = pCurNode->GetFirstChildByClass(XFA_ELEMENT_Script);
+ if (pScript && !XFA_LayoutPageMgr_RunBreakTestScript(pScript)) {
+ return FALSE;
+ }
+ CFX_WideStringC wsTarget = pCurNode->GetCData(XFA_ATTRIBUTE_Target);
+ CXFA_Node* pTarget =
+ XFA_ResolveBreakTarget(m_pTemplatePageSetRoot, TRUE, wsTarget);
+ wsBreakTrailer = pCurNode->GetCData(XFA_ATTRIBUTE_Trailer);
+ wsBreakLeader = pCurNode->GetCData(XFA_ATTRIBUTE_Leader);
+ pBreakLeaderTemplate =
+ XFA_ResolveBreakTarget(pContainer, TRUE, wsBreakLeader);
+ pBreakTrailerTemplate =
+ XFA_ResolveBreakTarget(pContainer, TRUE, wsBreakTrailer);
+ if (RunBreak(eType, pCurNode->GetEnum(XFA_ATTRIBUTE_TargetType), pTarget,
+ bStartNew)) {
+ return TRUE;
+ } else {
+ if (m_rgProposedContainerRecord.GetCount() > 0 &&
+ m_pCurrentContainerRecord ==
+ m_rgProposedContainerRecord.GetHeadPosition() &&
+ eType == XFA_ELEMENT_BreakBefore) {
+ CXFA_Node* pParentNode = pFormNode->GetNodeItem(
+ XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
+ if (!pParentNode ||
+ pFormNode !=
+ pParentNode->GetNodeItem(XFA_NODEITEM_FirstChild,
+ XFA_OBJECTTYPE_ContainerNode)) {
+ break;
+ }
+ pParentNode = pParentNode->GetNodeItem(XFA_NODEITEM_Parent);
+ if (!pParentNode || pParentNode->GetClassID() != XFA_ELEMENT_Form) {
+ break;
+ }
+ return TRUE;
+ }
+ }
+ } break;
+ case XFA_ELEMENT_Break: {
+ FX_BOOL bStartNew = pCurNode->GetInteger(XFA_ATTRIBUTE_StartNew) != 0;
+ CFX_WideStringC wsTarget = pCurNode->GetCData(
+ bBefore ? XFA_ATTRIBUTE_BeforeTarget : XFA_ATTRIBUTE_AfterTarget);
+ CXFA_Node* pTarget =
+ XFA_ResolveBreakTarget(m_pTemplatePageSetRoot, TRUE, wsTarget);
+ if (RunBreak(bBefore ? XFA_ELEMENT_BreakBefore : XFA_ELEMENT_BreakAfter,
+ pCurNode->GetEnum(bBefore ? XFA_ATTRIBUTE_Before
+ : XFA_ATTRIBUTE_After),
+ pTarget, bStartNew)) {
+ return TRUE;
+ }
+ } break;
+ default:
+ break;
+ }
+ return FALSE;
+}
+static void XFA_SetLayoutGeneratedNodeFlag(CXFA_Node* pNode) {
+ pNode->SetFlag(XFA_NODEFLAG_LayoutGeneratedNode, TRUE, FALSE);
+ pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE, FALSE);
+}
+FX_BOOL CXFA_LayoutPageMgr::ProcessBreakBeforeOrAfter(
+ CXFA_Node* pBreakNode,
+ FX_BOOL bBefore,
+ CXFA_Node*& pBreakLeaderNode,
+ CXFA_Node*& pBreakTrailerNode,
+ FX_BOOL& bCreatePage) {
+ CXFA_Node *pLeaderTemplate = NULL, *pTrailerTemplate = NULL;
+ CXFA_Node* pFormNode = pBreakNode->GetNodeItem(XFA_NODEITEM_Parent,
+ XFA_OBJECTTYPE_ContainerNode);
+ if (XFA_ItemLayoutProcessor_IsTakingSpace(pFormNode)) {
+ bCreatePage = ExecuteBreakBeforeOrAfter(pBreakNode, bBefore,
+ pLeaderTemplate, pTrailerTemplate);
+ CXFA_Document* pDocument = pBreakNode->GetDocument();
+ CXFA_Node* pDataScope = NULL;
+ pFormNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent,
+ XFA_OBJECTTYPE_ContainerNode);
+ if (pLeaderTemplate) {
+ if (!pDataScope) {
+ pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
+ }
+ pBreakLeaderNode = pDocument->DataMerge_CopyContainer(
+ pLeaderTemplate, pFormNode, pDataScope, TRUE);
+ pDocument->DataMerge_UpdateBindingRelations(pBreakLeaderNode);
+ XFA_SetLayoutGeneratedNodeFlag(pBreakLeaderNode);
+ }
+ if (pTrailerTemplate) {
+ if (!pDataScope) {
+ pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
+ }
+ pBreakTrailerNode = pDocument->DataMerge_CopyContainer(
+ pTrailerTemplate, pFormNode, pDataScope, TRUE);
+ pDocument->DataMerge_UpdateBindingRelations(pBreakTrailerNode);
+ XFA_SetLayoutGeneratedNodeFlag(pBreakTrailerNode);
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CXFA_LayoutPageMgr::ProcessBookendLeaderOrTrailer(
+ CXFA_Node* pBookendNode,
+ FX_BOOL bLeader,
+ CXFA_Node*& pBookendAppendNode) {
+ CXFA_Node* pLeaderTemplate = NULL;
+ CXFA_Node* pFormNode = pBookendNode->GetNodeItem(
+ XFA_NODEITEM_Parent, XFA_OBJECTTYPE_ContainerNode);
+ if (ResolveBookendLeaderOrTrailer(pBookendNode, bLeader, pLeaderTemplate)) {
+ CXFA_Document* pDocument = pBookendNode->GetDocument();
+ CXFA_Node* pDataScope = NULL;
+ if (pLeaderTemplate) {
+ if (!pDataScope) {
+ pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
+ }
+ pBookendAppendNode = pDocument->DataMerge_CopyContainer(
+ pLeaderTemplate, pFormNode, pDataScope, TRUE);
+ pDocument->DataMerge_UpdateBindingRelations(pBookendAppendNode);
+ XFA_SetLayoutGeneratedNodeFlag(pBookendAppendNode);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+CXFA_Node* CXFA_LayoutPageMgr::BreakOverflow(CXFA_Node* pOverflowNode,
+ CXFA_Node*& pLeaderTemplate,
+ CXFA_Node*& pTrailerTemplate,
+ FX_BOOL bCreatePage) {
+ CFX_WideStringC wsOverflowLeader, wsOverflowTrailer;
+ CXFA_Node* pContainer =
+ pOverflowNode->GetNodeItem(XFA_NODEITEM_Parent,
+ XFA_OBJECTTYPE_ContainerNode)
+ ->GetTemplateNode();
+ if (pOverflowNode->GetClassID() == XFA_ELEMENT_Break) {
+ CFX_WideStringC wsOverflowLeader;
+ CFX_WideStringC wsOverflowTarget;
+ CFX_WideStringC wsOverflowTrailer;
+ pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowLeader, wsOverflowLeader);
+ pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowTrailer, wsOverflowTrailer);
+ pOverflowNode->TryCData(XFA_ATTRIBUTE_OverflowTarget, wsOverflowTarget);
+ if (!wsOverflowLeader.IsEmpty() || !wsOverflowTrailer.IsEmpty() ||
+ !wsOverflowTarget.IsEmpty()) {
+ if (!wsOverflowTarget.IsEmpty() && bCreatePage &&
+ !m_bCreateOverFlowPage) {
+ CXFA_Node* pTarget = XFA_ResolveBreakTarget(
+ this->m_pTemplatePageSetRoot, TRUE, wsOverflowTarget);
+ if (pTarget) {
+ m_bCreateOverFlowPage = TRUE;
+ switch (pTarget->GetClassID()) {
+ case XFA_ELEMENT_PageArea:
+ RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_PageArea,
+ pTarget, TRUE);
+ break;
+ case XFA_ELEMENT_ContentArea:
+ RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_ContentArea,
+ pTarget, TRUE);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ if (!bCreatePage) {
+ pLeaderTemplate =
+ XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowLeader);
+ pTrailerTemplate =
+ XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowTrailer);
+ }
+ return pOverflowNode;
+ }
+ return NULL;
+ } else if (pOverflowNode->GetClassID() == XFA_ELEMENT_Overflow) {
+ CFX_WideStringC wsOverflowTarget;
+ pOverflowNode->TryCData(XFA_ATTRIBUTE_Leader, wsOverflowLeader);
+ pOverflowNode->TryCData(XFA_ATTRIBUTE_Trailer, wsOverflowTrailer);
+ pOverflowNode->TryCData(XFA_ATTRIBUTE_Target, wsOverflowTarget);
+ if (!wsOverflowTarget.IsEmpty() && bCreatePage && !m_bCreateOverFlowPage) {
+ CXFA_Node* pTarget = XFA_ResolveBreakTarget(this->m_pTemplatePageSetRoot,
+ TRUE, wsOverflowTarget);
+ if (pTarget) {
+ m_bCreateOverFlowPage = TRUE;
+ switch (pTarget->GetClassID()) {
+ case XFA_ELEMENT_PageArea:
+ RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_PageArea, pTarget,
+ TRUE);
+ break;
+ case XFA_ELEMENT_ContentArea:
+ RunBreak(XFA_ELEMENT_Overflow, XFA_ATTRIBUTEENUM_ContentArea,
+ pTarget, TRUE);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ if (!bCreatePage) {
+ pLeaderTemplate =
+ XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowLeader);
+ pTrailerTemplate =
+ XFA_ResolveBreakTarget(pContainer, TRUE, wsOverflowTrailer);
+ }
+ return pOverflowNode;
+ }
+ return NULL;
+}
+FX_BOOL CXFA_LayoutPageMgr::ProcessOverflow(CXFA_Node* pFormNode,
+ CXFA_Node*& pLeaderNode,
+ CXFA_Node*& pTrailerNode,
+ FX_BOOL bDataMerge,
+ FX_BOOL bCreatePage) {
+ if (pFormNode == NULL) {
+ return FALSE;
+ }
+ CXFA_Node *pLeaderTemplate = NULL, *pTrailerTemplate = NULL;
+ FX_BOOL bIsOverflowNode = FALSE;
+ if (pFormNode->GetClassID() == XFA_ELEMENT_Overflow ||
+ pFormNode->GetClassID() == XFA_ELEMENT_Break) {
+ bIsOverflowNode = TRUE;
+ }
+ for (CXFA_Node* pCurNode =
+ bIsOverflowNode ? pFormNode
+ : pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+ pCurNode; pCurNode = pCurNode->GetNodeItem((XFA_NODEITEM_NextSibling))) {
+ if (BreakOverflow(pCurNode, pLeaderTemplate, pTrailerTemplate,
+ bCreatePage)) {
+ if (bIsOverflowNode) {
+ pFormNode = pCurNode->GetNodeItem(XFA_NODEITEM_Parent);
+ }
+ CXFA_Document* pDocument = pCurNode->GetDocument();
+ CXFA_Node* pDataScope = NULL;
+ if (pLeaderTemplate) {
+ if (!pDataScope) {
+ pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
+ }
+ pLeaderNode = pDocument->DataMerge_CopyContainer(
+ pLeaderTemplate, pFormNode, pDataScope, TRUE);
+ pDocument->DataMerge_UpdateBindingRelations(pLeaderNode);
+ XFA_SetLayoutGeneratedNodeFlag(pLeaderNode);
+ }
+ if (pTrailerTemplate) {
+ if (!pDataScope) {
+ pDataScope = XFA_DataMerge_FindDataScope(pFormNode);
+ }
+ pTrailerNode = pDocument->DataMerge_CopyContainer(
+ pTrailerTemplate, pFormNode, pDataScope, TRUE);
+ pDocument->DataMerge_UpdateBindingRelations(pTrailerNode);
+ XFA_SetLayoutGeneratedNodeFlag(pTrailerNode);
+ }
+ return TRUE;
+ }
+ if (bIsOverflowNode) {
+ break;
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CXFA_LayoutPageMgr::ResolveBookendLeaderOrTrailer(
+ CXFA_Node* pBookendNode,
+ FX_BOOL bLeader,
+ CXFA_Node*& pBookendAppendTemplate) {
+ CFX_WideStringC wsBookendLeader;
+ CXFA_Node* pContainer =
+ pBookendNode->GetNodeItem(XFA_NODEITEM_Parent,
+ XFA_OBJECTTYPE_ContainerNode)
+ ->GetTemplateNode();
+ if (pBookendNode->GetClassID() == XFA_ELEMENT_Break) {
+ pBookendNode->TryCData(
+ bLeader ? XFA_ATTRIBUTE_BookendLeader : XFA_ATTRIBUTE_BookendTrailer,
+ wsBookendLeader);
+ if (!wsBookendLeader.IsEmpty()) {
+ pBookendAppendTemplate =
+ XFA_ResolveBreakTarget(pContainer, FALSE, wsBookendLeader);
+ return TRUE;
+ }
+ return FALSE;
+ } else if (pBookendNode->GetClassID() == XFA_ELEMENT_Bookend) {
+ pBookendNode->TryCData(
+ bLeader ? XFA_ATTRIBUTE_Leader : XFA_ATTRIBUTE_Trailer,
+ wsBookendLeader);
+ pBookendAppendTemplate =
+ XFA_ResolveBreakTarget(pContainer, TRUE, wsBookendLeader);
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet(
+ CXFA_Node* pPageSet,
+ CXFA_Node* pStartChild,
+ CXFA_Node* pTargetPageArea,
+ CXFA_Node* pTargetContentArea,
+ FX_BOOL bNewPage,
+ FX_BOOL bQuery) {
+ if (pPageSet == NULL && pStartChild == NULL) {
+ return FALSE;
+ }
+ if (IsPageSetRootOrderedOccurrence()) {
+ return FindPageAreaFromPageSet_Ordered(pPageSet, pStartChild,
+ pTargetPageArea, pTargetContentArea,
+ bNewPage, bQuery);
+ }
+ XFA_ATTRIBUTEENUM ePreferredPosition = m_pCurrentContainerRecord
+ ? XFA_ATTRIBUTEENUM_Rest
+ : XFA_ATTRIBUTEENUM_First;
+ return FindPageAreaFromPageSet_SimplexDuplex(
+ pPageSet, pStartChild, pTargetPageArea, pTargetContentArea, bNewPage,
+ bQuery, ePreferredPosition);
+}
+FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet_Ordered(
+ CXFA_Node* pPageSet,
+ CXFA_Node* pStartChild,
+ CXFA_Node* pTargetPageArea,
+ CXFA_Node* pTargetContentArea,
+ FX_BOOL bNewPage,
+ FX_BOOL bQuery) {
+ int32_t iPageSetCount = 0;
+ if (!pStartChild && !bQuery) {
+ m_pPageSetMap.Lookup(pPageSet, iPageSetCount);
+ int32_t iMax = -1;
+ CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_ELEMENT_Occur);
+ if (pOccurNode) {
+ pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
+ }
+ if (iMax >= 0 && iMax <= iPageSetCount) {
+ return FALSE;
+ }
+ }
+ FX_BOOL bRes = FALSE;
+ CXFA_Node* pCurrentNode =
+ pStartChild ? pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling)
+ : pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild);
+ for (; pCurrentNode;
+ pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+ if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) {
+ if ((pTargetPageArea == pCurrentNode || pTargetPageArea == NULL)) {
+ if (pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea) ==
+ NULL) {
+ if (pTargetPageArea == pCurrentNode) {
+ CreateMinPageRecord(pCurrentNode, TRUE);
+ pTargetPageArea = NULL;
+ }
+ continue;
+ }
+ if (!bQuery) {
+ CXFA_ContainerRecord* pNewRecord =
+ CreateContainerRecord(pCurrentNode, pStartChild == NULL);
+ AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
+ if (pTargetContentArea == NULL) {
+ pTargetContentArea =
+ pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
+ }
+ AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
+ }
+ m_pCurPageArea = pCurrentNode;
+ m_nCurPageCount = 1;
+ bRes = TRUE;
+ break;
+ }
+ if (!bQuery) {
+ CreateMinPageRecord(pCurrentNode, FALSE);
+ }
+ } else if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) {
+ if (FindPageAreaFromPageSet_Ordered(pCurrentNode, NULL, pTargetPageArea,
+ pTargetContentArea, bNewPage,
+ bQuery)) {
+ bRes = TRUE;
+ break;
+ }
+ if (!bQuery) {
+ CreateMinPageSetRecord(pCurrentNode, TRUE);
+ }
+ }
+ }
+ if (!pStartChild && bRes && !bQuery) {
+ m_pPageSetMap.SetAt(pPageSet, ++iPageSetCount);
+ }
+ return bRes;
+}
+FX_BOOL CXFA_LayoutPageMgr::FindPageAreaFromPageSet_SimplexDuplex(
+ CXFA_Node* pPageSet,
+ CXFA_Node* pStartChild,
+ CXFA_Node* pTargetPageArea,
+ CXFA_Node* pTargetContentArea,
+ FX_BOOL bNewPage,
+ FX_BOOL bQuery,
+ XFA_ATTRIBUTEENUM ePreferredPosition) {
+ const XFA_ATTRIBUTEENUM eFallbackPosition = XFA_ATTRIBUTEENUM_Any;
+ CXFA_Node *pPreferredPageArea = NULL, *pFallbackPageArea = NULL;
+ CXFA_Node* pCurrentNode = NULL;
+ if (!pStartChild || pStartChild->GetClassID() == XFA_ELEMENT_PageArea) {
+ pCurrentNode = pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild);
+ } else {
+ pCurrentNode = pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling);
+ }
+ for (; pCurrentNode;
+ pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+ if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) {
+ if (!MatchPageAreaOddOrEven(pCurrentNode, FALSE)) {
+ continue;
+ }
+ XFA_ATTRIBUTEENUM eCurPagePosition =
+ pCurrentNode->GetEnum(XFA_ATTRIBUTE_PagePosition);
+ if (ePreferredPosition == XFA_ATTRIBUTEENUM_Last) {
+ if (eCurPagePosition != ePreferredPosition) {
+ continue;
+ }
+ if (m_ePageSetMode == XFA_ATTRIBUTEENUM_SimplexPaginated ||
+ pCurrentNode->GetEnum(XFA_ATTRIBUTE_OddOrEven) ==
+ XFA_ATTRIBUTEENUM_Any) {
+ pPreferredPageArea = pCurrentNode;
+ break;
+ }
+ CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+ AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
+ AddContentAreaLayoutItem(pNewRecord, pCurrentNode->GetFirstChildByClass(
+ XFA_ELEMENT_ContentArea));
+ pPreferredPageArea = pCurrentNode;
+ return FALSE;
+ } else if (ePreferredPosition == XFA_ATTRIBUTEENUM_Only) {
+ if (eCurPagePosition != ePreferredPosition) {
+ continue;
+ }
+ if (m_ePageSetMode != XFA_ATTRIBUTEENUM_DuplexPaginated ||
+ pCurrentNode->GetEnum(XFA_ATTRIBUTE_OddOrEven) ==
+ XFA_ATTRIBUTEENUM_Any) {
+ pPreferredPageArea = pCurrentNode;
+ break;
+ }
+ return FALSE;
+ }
+ if ((pTargetPageArea == pCurrentNode || pTargetPageArea == NULL)) {
+ if (pCurrentNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea) ==
+ NULL) {
+ if (pTargetPageArea == pCurrentNode) {
+ CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+ AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
+ pTargetPageArea = NULL;
+ }
+ continue;
+ }
+ if ((ePreferredPosition == XFA_ATTRIBUTEENUM_Rest &&
+ eCurPagePosition == XFA_ATTRIBUTEENUM_Any) ||
+ eCurPagePosition == ePreferredPosition) {
+ pPreferredPageArea = pCurrentNode;
+ break;
+ } else if (eCurPagePosition == eFallbackPosition &&
+ !pFallbackPageArea) {
+ pFallbackPageArea = pCurrentNode;
+ }
+ } else if (pTargetPageArea &&
+ !MatchPageAreaOddOrEven(pTargetPageArea, FALSE)) {
+ CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+ AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
+ AddContentAreaLayoutItem(pNewRecord, pCurrentNode->GetFirstChildByClass(
+ XFA_ELEMENT_ContentArea));
+ }
+ } else if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) {
+ if (FindPageAreaFromPageSet_SimplexDuplex(
+ pCurrentNode, NULL, pTargetPageArea, pTargetContentArea, bNewPage,
+ bQuery, ePreferredPosition)) {
+ break;
+ }
+ }
+ }
+ CXFA_Node* pCurPageArea = NULL;
+ if (pPreferredPageArea) {
+ pCurPageArea = pPreferredPageArea;
+ } else if (pFallbackPageArea) {
+ pCurPageArea = pFallbackPageArea;
+ }
+ if (!pCurPageArea) {
+ return FALSE;
+ }
+ if (!bQuery) {
+ CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+ AddPageAreaLayoutItem(pNewRecord, pCurPageArea);
+ if (pTargetContentArea == NULL) {
+ pTargetContentArea =
+ pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
+ }
+ AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
+ }
+ m_pCurPageArea = pCurPageArea;
+ return TRUE;
+}
+FX_BOOL CXFA_LayoutPageMgr::MatchPageAreaOddOrEven(CXFA_Node* pPageArea,
+ FX_BOOL bLastMatch) {
+ if (m_ePageSetMode != XFA_ATTRIBUTEENUM_DuplexPaginated) {
+ return TRUE;
+ }
+ XFA_ATTRIBUTEENUM eOddOrEven = XFA_ATTRIBUTEENUM_Any;
+ pPageArea->TryEnum(XFA_ATTRIBUTE_OddOrEven, eOddOrEven);
+ if (eOddOrEven != XFA_ATTRIBUTEENUM_Any) {
+ int32_t iPageCount = GetPageCount();
+ if (bLastMatch) {
+ return eOddOrEven == XFA_ATTRIBUTEENUM_Odd ? iPageCount % 2 == 1
+ : iPageCount % 2 == 0;
+ }
+ return eOddOrEven == XFA_ATTRIBUTEENUM_Odd ? iPageCount % 2 == 0
+ : iPageCount % 2 == 1;
+ }
+ return TRUE;
+}
+CXFA_Node* CXFA_LayoutPageMgr::GetNextAvailPageArea(
+ CXFA_Node* pTargetPageArea,
+ CXFA_Node* pTargetContentArea,
+ FX_BOOL bNewPage,
+ FX_BOOL bQuery) {
+ if (m_pCurPageArea == NULL) {
+ FindPageAreaFromPageSet(m_pTemplatePageSetRoot, NULL, pTargetPageArea,
+ pTargetContentArea, bNewPage, bQuery);
+ ASSERT(m_pCurPageArea);
+ return m_pCurPageArea;
+ }
+ if (pTargetPageArea == NULL || pTargetPageArea == m_pCurPageArea) {
+ if (!bNewPage && GetNextContentArea(pTargetContentArea)) {
+ return m_pCurPageArea;
+ }
+ if (IsPageSetRootOrderedOccurrence()) {
+ int32_t iMax = -1;
+ CXFA_Node* pOccurNode =
+ m_pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_Occur);
+ if (pOccurNode) {
+ pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE);
+ }
+ if ((iMax < 0 || m_nCurPageCount < iMax)) {
+ if (!bQuery) {
+ CXFA_ContainerRecord* pNewRecord =
+ CreateContainerRecord(m_pCurPageArea);
+ AddPageAreaLayoutItem(pNewRecord, m_pCurPageArea);
+ if (pTargetContentArea == NULL) {
+ pTargetContentArea =
+ m_pCurPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
+ }
+ AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
+ }
+ m_nCurPageCount++;
+ return m_pCurPageArea;
+ }
+ }
+ }
+ if (!bQuery && IsPageSetRootOrderedOccurrence()) {
+ CreateMinPageRecord(m_pCurPageArea, FALSE, TRUE);
+ }
+ if (FindPageAreaFromPageSet(m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent),
+ m_pCurPageArea, pTargetPageArea,
+ pTargetContentArea, bNewPage, bQuery)) {
+ return m_pCurPageArea;
+ }
+ CXFA_Node* pPageSet = m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent);
+ while (TRUE) {
+ if (FindPageAreaFromPageSet(pPageSet, NULL, pTargetPageArea,
+ pTargetContentArea, bNewPage, bQuery)) {
+ return m_pCurPageArea;
+ }
+ if (!bQuery && IsPageSetRootOrderedOccurrence()) {
+ CreateMinPageSetRecord(pPageSet);
+ }
+ if (FindPageAreaFromPageSet(NULL, pPageSet, pTargetPageArea,
+ pTargetContentArea, bNewPage, bQuery)) {
+ return m_pCurPageArea;
+ }
+ if (pPageSet == m_pTemplatePageSetRoot) {
+ break;
+ }
+ pPageSet = pPageSet->GetNodeItem(XFA_NODEITEM_Parent);
+ }
+ return NULL;
+}
+static FX_BOOL XFA_LayoutPageMgr_CheckContentAreaNotUsed(
+ CXFA_ContainerLayoutItem* pPageAreaLayoutItem,
+ CXFA_Node* pContentArea,
+ CXFA_ContainerLayoutItem*& pContentAreaLayoutItem) {
+ for (CXFA_ContainerLayoutItem* pLayoutItem =
+ (CXFA_ContainerLayoutItem*)pPageAreaLayoutItem->m_pFirstChild;
+ pLayoutItem;
+ pLayoutItem = (CXFA_ContainerLayoutItem*)pLayoutItem->m_pNextSibling) {
+ if (pLayoutItem->m_pFormNode == pContentArea) {
+ if (pLayoutItem->m_pFirstChild == NULL) {
+ pContentAreaLayoutItem = pLayoutItem;
+ return TRUE;
+ }
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CXFA_LayoutPageMgr::GetNextContentArea(CXFA_Node* pContentArea) {
+ CXFA_Node* pCurContentNode =
+ GetCurrentContainerRecord()->pCurContentArea->m_pFormNode;
+ if (pContentArea == NULL) {
+ pContentArea =
+ pCurContentNode->GetNextSameClassSibling(XFA_ELEMENT_ContentArea);
+ if (pContentArea == NULL) {
+ return FALSE;
+ }
+ } else {
+ if (pContentArea->GetNodeItem(XFA_NODEITEM_Parent) != m_pCurPageArea) {
+ return FALSE;
+ }
+ CXFA_ContainerLayoutItem* pContentAreaLayout = NULL;
+ if (!XFA_LayoutPageMgr_CheckContentAreaNotUsed(
+ GetCurrentContainerRecord()->pCurPageArea, pContentArea,
+ pContentAreaLayout)) {
+ return FALSE;
+ }
+ if (pContentAreaLayout) {
+ if (pContentAreaLayout->m_pFormNode != pCurContentNode) {
+ CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+ pNewRecord->pCurContentArea = pContentAreaLayout;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ }
+ }
+ CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+ AddContentAreaLayoutItem(pNewRecord, pContentArea);
+ return TRUE;
+}
+void CXFA_LayoutPageMgr::InitPageSetMap() {
+ if (!IsPageSetRootOrderedOccurrence()) {
+ return;
+ }
+ CXFA_NodeIterator sIterator(m_pTemplatePageSetRoot);
+ for (CXFA_Node* pPageSetNode = sIterator.GetCurrent(); pPageSetNode;
+ pPageSetNode = sIterator.MoveToNext()) {
+ if (pPageSetNode->GetClassID() == XFA_ELEMENT_PageSet) {
+ XFA_ATTRIBUTEENUM eRelation =
+ pPageSetNode->GetEnum(XFA_ATTRIBUTE_Relation);
+ if (eRelation == XFA_ATTRIBUTEENUM_OrderedOccurrence) {
+ m_pPageSetMap.SetAt(pPageSetNode, 0);
+ }
+ }
+ }
+}
+int32_t CXFA_LayoutPageMgr::CreateMinPageRecord(CXFA_Node* pPageArea,
+ FX_BOOL bTargetPageArea,
+ FX_BOOL bCreateLast) {
+ if (pPageArea == NULL) {
+ return 0;
+ }
+ CXFA_Node* pOccurNode = pPageArea->GetFirstChildByClass(XFA_ELEMENT_Occur);
+ int32_t iMin = 0;
+ if ((pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE)) ||
+ bTargetPageArea) {
+ CXFA_Node* pContentArea =
+ pPageArea->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
+ if (iMin < 1 && bTargetPageArea && !pContentArea) {
+ iMin = 1;
+ }
+ int32_t i = 0;
+ if (bCreateLast) {
+ i = m_nCurPageCount;
+ }
+ for (; i < iMin; i++) {
+ CXFA_ContainerRecord* pNewRecord = CreateContainerRecord();
+ AddPageAreaLayoutItem(pNewRecord, pPageArea);
+ AddContentAreaLayoutItem(pNewRecord, pContentArea);
+ }
+ }
+ return iMin;
+}
+void CXFA_LayoutPageMgr::CreateMinPageSetRecord(CXFA_Node* pPageSet,
+ FX_BOOL bCreateAll) {
+ if (pPageSet == NULL) {
+ return;
+ }
+ int32_t iCurSetCount = 0;
+ if (!m_pPageSetMap.Lookup(pPageSet, iCurSetCount)) {
+ return;
+ }
+ if (bCreateAll) {
+ iCurSetCount = 0;
+ }
+ CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_ELEMENT_Occur);
+ int32_t iMin = 0;
+ if (pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, FALSE)) {
+ if (iCurSetCount < iMin) {
+ for (int32_t i = 0; i < iMin - iCurSetCount; i++) {
+ for (CXFA_Node* pCurrentPageNode =
+ pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild);
+ pCurrentPageNode; pCurrentPageNode = pCurrentPageNode->GetNodeItem(
+ XFA_NODEITEM_NextSibling)) {
+ if (pCurrentPageNode->GetClassID() == XFA_ELEMENT_PageArea) {
+ CreateMinPageRecord(pCurrentPageNode, FALSE);
+ } else if (pCurrentPageNode->GetClassID() == XFA_ELEMENT_PageSet) {
+ CreateMinPageSetRecord(pCurrentPageNode, TRUE);
+ }
+ }
+ }
+ m_pPageSetMap.SetAt(pPageSet, iMin);
+ }
+ }
+}
+void CXFA_LayoutPageMgr::CreateNextMinRecord(CXFA_Node* pRecordNode) {
+ if (pRecordNode == NULL) {
+ return;
+ }
+ for (CXFA_Node* pCurrentNode =
+ pRecordNode->GetNodeItem(XFA_NODEITEM_NextSibling);
+ pCurrentNode;
+ pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+ if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageArea) {
+ CreateMinPageRecord(pCurrentNode, FALSE);
+ } else if (pCurrentNode->GetClassID() == XFA_ELEMENT_PageSet) {
+ CreateMinPageSetRecord(pCurrentNode, TRUE);
+ }
+ }
+}
+void CXFA_LayoutPageMgr::ProcessLastPageSet() {
+ CreateMinPageRecord(m_pCurPageArea, FALSE, TRUE);
+ CreateNextMinRecord(m_pCurPageArea);
+ CXFA_Node* pPageSet = m_pCurPageArea->GetNodeItem(XFA_NODEITEM_Parent);
+ while (TRUE) {
+ CreateMinPageSetRecord(pPageSet);
+ if (pPageSet == m_pTemplatePageSetRoot) {
+ break;
+ }
+ CreateNextMinRecord(pPageSet);
+ pPageSet = pPageSet->GetNodeItem(XFA_NODEITEM_Parent);
+ }
+}
+FX_BOOL CXFA_LayoutPageMgr::GetNextAvailContentHeight(FX_FLOAT fChildHeight) {
+ CXFA_Node* pCurContentNode =
+ GetCurrentContainerRecord()->pCurContentArea->m_pFormNode;
+ if (pCurContentNode == NULL) {
+ return FALSE;
+ }
+ pCurContentNode =
+ pCurContentNode->GetNextSameClassSibling(XFA_ELEMENT_ContentArea);
+ if (pCurContentNode) {
+ FX_FLOAT fNextContentHeight =
+ pCurContentNode->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
+ return fNextContentHeight > fChildHeight;
+ }
+ CXFA_Node* pPageNode = GetCurrentContainerRecord()->pCurPageArea->m_pFormNode;
+ CXFA_Node* pOccurNode = pPageNode->GetFirstChildByClass(XFA_ELEMENT_Occur);
+ int32_t iMax = 0;
+ if (pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, FALSE)) {
+ if (m_nCurPageCount == iMax) {
+ CXFA_Node* pSrcPage = m_pCurPageArea;
+ int32_t nSrcPageCount = m_nCurPageCount;
+ FX_POSITION psSrcRecord = m_rgProposedContainerRecord.GetTailPosition();
+ CXFA_Node* pNextPage = GetNextAvailPageArea(NULL, NULL, FALSE, TRUE);
+ m_pCurPageArea = pSrcPage;
+ m_nCurPageCount = nSrcPageCount;
+ CXFA_ContainerRecord* pPrevRecord =
+ (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(
+ psSrcRecord);
+ while (psSrcRecord) {
+ FX_POSITION psSaveRecord = psSrcRecord;
+ CXFA_ContainerRecord* pInsertRecord =
+ (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(
+ psSrcRecord);
+ RemoveLayoutRecord(pInsertRecord, pPrevRecord);
+ delete pInsertRecord;
+ m_rgProposedContainerRecord.RemoveAt(psSaveRecord);
+ }
+ if (pNextPage) {
+ CXFA_Node* pContentArea =
+ pNextPage->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
+ if (pContentArea) {
+ FX_FLOAT fNextContentHeight =
+ pContentArea->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
+ if (fNextContentHeight > fChildHeight) {
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+ }
+ }
+ CXFA_Node* pContentArea =
+ pPageNode->GetFirstChildByClass(XFA_ELEMENT_ContentArea);
+ FX_FLOAT fNextContentHeight =
+ pContentArea->GetMeasure(XFA_ATTRIBUTE_H).ToUnit(XFA_UNIT_Pt);
+ if (fNextContentHeight < XFA_LAYOUT_FLOAT_PERCISION) {
+ return TRUE;
+ }
+ if (fNextContentHeight > fChildHeight) {
+ return TRUE;
+ }
+ return FALSE;
+}
+void CXFA_LayoutPageMgr::ClearData() {
+ ClearRecordList();
+}
+void CXFA_LayoutPageMgr::ClearRecordList() {
+ if (!m_pTemplatePageSetRoot) {
+ return;
+ }
+ if (m_rgProposedContainerRecord.GetCount() > 0) {
+ FX_POSITION sPos;
+ sPos = m_rgProposedContainerRecord.GetHeadPosition();
+ while (sPos) {
+ CXFA_ContainerRecord* pRecord =
+ (CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetNext(sPos);
+ delete pRecord;
+ }
+ m_rgProposedContainerRecord.RemoveAll();
+ }
+ m_pCurrentContainerRecord = NULL;
+ m_pCurPageArea = NULL;
+ m_nCurPageCount = 0;
+ m_bCreateOverFlowPage = FALSE;
+ m_pPageSetMap.RemoveAll();
+}
+CXFA_LayoutItem* CXFA_LayoutPageMgr::FindOrCreateLayoutItem(
+ CXFA_Node* pFormNode) {
+#if defined(_XFA_LAYOUTITEM_MAPCACHE_)
+ if (m_NodeToContent.GetCount() > 0) {
+ CXFA_ContentLayoutItem* pLayoutItem = NULL;
+ if (m_NodeToContent.Lookup(pFormNode, (void*&)pLayoutItem)) {
+ if (pLayoutItem->m_pNext) {
+ m_NodeToContent.SetAt(pFormNode, pLayoutItem->m_pNext);
+ pLayoutItem->m_pNext->m_pPrev = NULL;
+ pLayoutItem->m_pNext = NULL;
+ } else {
+ m_NodeToContent.RemoveKey(pFormNode);
+ }
+ pLayoutItem->m_pFormNode = pFormNode;
+ return pLayoutItem;
+ }
+ }
+#endif
+ return (CXFA_LayoutItem*)pFormNode->GetDocument()
+ ->GetParser()
+ ->GetNotify()
+ ->OnCreateLayoutItem(pFormNode);
+}
+#if defined(_XFA_LAYOUTITEM_MAPCACHE_)
+void CXFA_LayoutPageMgr::SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem) {
+ CXFA_LayoutItem* pNextLayoutItem,
+ * pCurLayoutItem = pParentLayoutItem->m_pFirstChild;
+ while (pCurLayoutItem) {
+ pNextLayoutItem = pCurLayoutItem->m_pNextSibling;
+ if (pCurLayoutItem->m_pFirstChild) {
+ SaveLayoutItem(pCurLayoutItem);
+ }
+ if (pCurLayoutItem->IsContentLayoutItem()) {
+ if (m_NodeToContent.GetValueAt(pCurLayoutItem->m_pFormNode) == NULL) {
+ pCurLayoutItem->m_pFormNode->SetUserData(XFA_LAYOUTITEMKEY, NULL);
+ m_NodeToContent.SetAt(pCurLayoutItem->m_pFormNode, pCurLayoutItem);
+ }
+ } else if (pCurLayoutItem->m_pFormNode->GetClassID() !=
+ XFA_ELEMENT_PageArea) {
+ delete pCurLayoutItem;
+ pCurLayoutItem = NULL;
+ }
+ if (pCurLayoutItem) {
+ pCurLayoutItem->m_pParent = NULL;
+ pCurLayoutItem->m_pNextSibling = NULL;
+ pCurLayoutItem->m_pFirstChild = NULL;
+ }
+ pCurLayoutItem = pNextLayoutItem;
+ }
+}
+#elif defined(_XFA_LAYOUTITEM_ProcessCACHE_)
+static void XFA_SyncRemoveLayoutItem(CXFA_LayoutItem* pParentLayoutItem,
+ IXFA_Notify* pNotify,
+ IXFA_DocLayout* pDocLayout) {
+ CXFA_LayoutItem* pNextLayoutItem;
+ CXFA_LayoutItem* pCurLayoutItem = pParentLayoutItem->m_pFirstChild;
+ while (pCurLayoutItem) {
+ pNextLayoutItem = pCurLayoutItem->m_pNextSibling;
+ if (pCurLayoutItem->m_pFirstChild) {
+ XFA_SyncRemoveLayoutItem(pCurLayoutItem, pNotify, pDocLayout);
+ }
+ pNotify->OnLayoutEvent(pDocLayout, pCurLayoutItem,
+ XFA_LAYOUTEVENT_ItemRemoving);
+ delete pCurLayoutItem;
+ pCurLayoutItem = pNextLayoutItem;
+ }
+}
+void CXFA_LayoutPageMgr::SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem) {
+ CXFA_LayoutItem* pNextLayoutItem;
+ CXFA_LayoutItem* pCurLayoutItem = pParentLayoutItem->m_pFirstChild;
+ while (pCurLayoutItem) {
+ pNextLayoutItem = pCurLayoutItem->m_pNextSibling;
+ if (pCurLayoutItem->IsContentLayoutItem()) {
+ FX_DWORD dwFlag = pCurLayoutItem->m_pFormNode->GetFlag();
+ if (dwFlag & (XFA_NODEFLAG_HasRemoved)) {
+ IXFA_Notify* pNotify =
+ m_pTemplatePageSetRoot->GetDocument()->GetParser()->GetNotify();
+ IXFA_DocLayout* pDocLayout =
+ m_pTemplatePageSetRoot->GetDocument()->GetDocLayout();
+ if (pCurLayoutItem->m_pFirstChild) {
+ XFA_SyncRemoveLayoutItem(pCurLayoutItem, pNotify, pDocLayout);
+ }
+ pNotify->OnLayoutEvent(pDocLayout, pCurLayoutItem,
+ XFA_LAYOUTEVENT_ItemRemoving);
+ delete pCurLayoutItem;
+ pCurLayoutItem = pNextLayoutItem;
+ continue;
+ }
+ if (dwFlag & XFA_NODEFLAG_LayoutGeneratedNode) {
+ CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
+ sIterator(pCurLayoutItem->m_pFormNode);
+ for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
+ pNode = sIterator.MoveToNext()) {
+ pNode->SetFlag(XFA_NODEFLAG_UnusedNode, TRUE, FALSE);
+ }
+ }
+ }
+ if (pCurLayoutItem->m_pFirstChild) {
+ SaveLayoutItem(pCurLayoutItem);
+ }
+ pCurLayoutItem->m_pParent = NULL;
+ pCurLayoutItem->m_pNextSibling = NULL;
+ pCurLayoutItem->m_pFirstChild = NULL;
+ if (!pCurLayoutItem->IsContentLayoutItem() &&
+ pCurLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) {
+ delete pCurLayoutItem;
+ }
+ pCurLayoutItem = pNextLayoutItem;
+ }
+}
+#endif
+CXFA_Node* CXFA_LayoutPageMgr::QueryOverflow(
+ CXFA_Node* pFormNode,
+ CXFA_LayoutContext* pLayoutContext) {
+ for (CXFA_Node* pCurNode = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+ pCurNode; pCurNode = pCurNode->GetNodeItem((XFA_NODEITEM_NextSibling))) {
+ if (pCurNode->GetClassID() == XFA_ELEMENT_Break) {
+ CFX_WideStringC wsOverflowLeader;
+ CFX_WideStringC wsOverflowTarget;
+ CFX_WideStringC wsOverflowTrailer;
+ pCurNode->TryCData(XFA_ATTRIBUTE_OverflowLeader, wsOverflowLeader);
+ pCurNode->TryCData(XFA_ATTRIBUTE_OverflowTrailer, wsOverflowTrailer);
+ pCurNode->TryCData(XFA_ATTRIBUTE_OverflowTarget, wsOverflowTarget);
+ if (!wsOverflowLeader.IsEmpty() || !wsOverflowTrailer.IsEmpty() ||
+ !wsOverflowTarget.IsEmpty()) {
+ return pCurNode;
+ }
+ return NULL;
+ } else if (pCurNode->GetClassID() == XFA_ELEMENT_Overflow) {
+ return pCurNode;
+ }
+ }
+ return NULL;
+}
+void CXFA_LayoutPageMgr::MergePageSetContents() {
+ CXFA_Document* pDocument = m_pTemplatePageSetRoot->GetDocument();
+ IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify();
+ IXFA_DocLayout* pDocLayout = pDocument->GetDocLayout();
+ CXFA_ContainerLayoutItem* pRootLayout = this->GetRootLayoutItem();
+ {
+ for (int32_t iIndex = 0; iIndex < pDocument->m_pPendingPageSet.GetSize();
+ iIndex++) {
+ CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
+ sIterator(pDocument->m_pPendingPageSet.GetAt(iIndex));
+ for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
+ pNode = sIterator.MoveToNext()) {
+ if (pNode->IsContainerNode()) {
+ CXFA_Node* pBindNode = pNode->GetBindData();
+ if (pBindNode) {
+ pBindNode->RemoveBindItem(pNode);
+ pNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
+ }
+ }
+ pNode->SetFlag(XFA_NODEFLAG_UnusedNode);
+ }
+ }
+ }
+ int32_t iIndex = 0;
+ CXFA_Node* pPendingPageSet = NULL;
+ for (; pRootLayout;
+ pRootLayout = (CXFA_ContainerLayoutItem*)pRootLayout->m_pNextSibling) {
+ pPendingPageSet = NULL;
+ CXFA_NodeIteratorTemplate<
+ CXFA_ContainerLayoutItem,
+ CXFA_TraverseStrategy_ContentAreaContainerLayoutItem>
+ iterator(pRootLayout);
+ CXFA_ContainerLayoutItem* pRootPageSetContainerItem = iterator.GetCurrent();
+ ASSERT(pRootPageSetContainerItem->m_pFormNode->GetClassID() ==
+ XFA_ELEMENT_PageSet);
+ if (iIndex < pDocument->m_pPendingPageSet.GetSize()) {
+ pPendingPageSet = pDocument->m_pPendingPageSet.GetAt(iIndex);
+ iIndex++;
+ }
+ if (!pPendingPageSet) {
+ if (pRootPageSetContainerItem->m_pFormNode->GetPacketID() ==
+ XFA_XDPPACKET_Template) {
+ pPendingPageSet =
+ pRootPageSetContainerItem->m_pFormNode->CloneTemplateToForm(FALSE);
+ } else {
+ pPendingPageSet = pRootPageSetContainerItem->m_pFormNode;
+ }
+ }
+ if (pRootPageSetContainerItem->m_pFormNode->GetUserData(
+ XFA_LAYOUTITEMKEY) == pRootPageSetContainerItem) {
+ pRootPageSetContainerItem->m_pFormNode->SetUserData(XFA_LAYOUTITEMKEY,
+ NULL);
+ }
+ pRootPageSetContainerItem->m_pFormNode = pPendingPageSet;
+ pPendingPageSet->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
+ for (CXFA_ContainerLayoutItem* pContainerItem = iterator.MoveToNext();
+ pContainerItem; pContainerItem = iterator.MoveToNext()) {
+ CXFA_Node* pNode = pContainerItem->m_pFormNode;
+ if (pNode->GetPacketID() != XFA_XDPPACKET_Template) {
+ continue;
+ }
+ switch (pNode->GetClassID()) {
+ case XFA_ELEMENT_PageSet: {
+ CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode;
+ pContainerItem->m_pFormNode = XFA_NodeMerge_CloneOrMergeContainer(
+ pDocument, pParentNode, pContainerItem->m_pFormNode, TRUE);
+ } break;
+ case XFA_ELEMENT_PageArea: {
+ CXFA_ContainerLayoutItem* pFormLayout = pContainerItem;
+ CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode;
+ FX_BOOL bIsExistForm = TRUE;
+ for (int32_t iLevel = 0; iLevel < 3; iLevel++) {
+ pFormLayout = (CXFA_ContainerLayoutItem*)pFormLayout->m_pFirstChild;
+ if (iLevel == 2) {
+ while (pFormLayout &&
+ !XFA_ItemLayoutProcessor_IsTakingSpace(
+ pFormLayout->m_pFormNode)) {
+ pFormLayout =
+ (CXFA_ContainerLayoutItem*)pFormLayout->m_pNextSibling;
+ }
+ }
+ if (pFormLayout == NULL) {
+ bIsExistForm = FALSE;
+ break;
+ }
+ }
+ if (bIsExistForm) {
+ CXFA_Node* pNewSubform = pFormLayout->m_pFormNode;
+ if (pContainerItem->m_pOldSubform != NULL &&
+ pContainerItem->m_pOldSubform != pNewSubform) {
+ CXFA_Node* pExistingNode = XFA_DataMerge_FindFormDOMInstance(
+ pDocument, pContainerItem->m_pFormNode->GetClassID(),
+ pContainerItem->m_pFormNode->GetNameHash(), pParentNode);
+ CXFA_ContainerIterator sIterator(pExistingNode);
+ for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
+ pNode = sIterator.MoveToNext()) {
+ if (pNode->GetClassID() != XFA_ELEMENT_ContentArea) {
+ CXFA_LayoutItem* pLayoutItem = static_cast<CXFA_LayoutItem*>(
+ pNode->GetUserData(XFA_LAYOUTITEMKEY));
+ if (pLayoutItem) {
+ pNotify->OnLayoutEvent(pDocLayout, pLayoutItem,
+ XFA_LAYOUTEVENT_ItemRemoving);
+ delete pLayoutItem;
+ }
+ }
+ }
+ if (pExistingNode) {
+ pParentNode->RemoveChild(pExistingNode);
+ }
+ }
+ pContainerItem->m_pOldSubform = pNewSubform;
+ }
+ pContainerItem->m_pFormNode = pDocument->DataMerge_CopyContainer(
+ pContainerItem->m_pFormNode, pParentNode,
+ (CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Record), TRUE);
+ } break;
+ case XFA_ELEMENT_ContentArea: {
+ CXFA_Node* pParentNode = pContainerItem->m_pParent->m_pFormNode;
+ for (CXFA_Node* pChildNode =
+ pParentNode->GetNodeItem(XFA_NODEITEM_FirstChild);
+ pChildNode;
+ pChildNode = pChildNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
+ if (pChildNode->GetTemplateNode() != pContainerItem->m_pFormNode) {
+ continue;
+ }
+ pContainerItem->m_pFormNode = pChildNode;
+ break;
+ }
+ } break;
+ default:
+ break;
+ }
+ }
+ if (!pPendingPageSet->GetNodeItem(XFA_NODEITEM_Parent)) {
+ CXFA_Node* pFormToplevelSubform =
+ ((CXFA_Node*)pDocument->GetXFANode(XFA_HASHCODE_Form))
+ ->GetFirstChildByClass(XFA_ELEMENT_Subform);
+ pFormToplevelSubform->InsertChild(pPendingPageSet);
+ }
+ pDocument->DataMerge_UpdateBindingRelations(pPendingPageSet);
+ pPendingPageSet->SetFlag(XFA_NODEFLAG_Initialized);
+ }
+ pPendingPageSet = GetRootLayoutItem()->m_pFormNode;
+ while (pPendingPageSet) {
+ CXFA_Node* pNextPendingPageSet =
+ pPendingPageSet->GetNextSameClassSibling(XFA_ELEMENT_PageSet);
+ CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
+ sIterator(pPendingPageSet);
+ CXFA_Node* pNode = sIterator.GetCurrent();
+ while (pNode) {
+ if (pNode->HasFlag(XFA_NODEFLAG_UnusedNode)) {
+ if (pNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode) {
+ XFA_ELEMENT eCurId = pNode->GetClassID();
+ if (eCurId == XFA_ELEMENT_PageArea || eCurId == XFA_ELEMENT_PageSet) {
+ CXFA_ContainerIterator iteChild(pNode);
+ CXFA_Node* pChildNode = iteChild.MoveToNext();
+ for (; pChildNode; pChildNode = iteChild.MoveToNext()) {
+ CXFA_LayoutItem* pLayoutItem = static_cast<CXFA_LayoutItem*>(
+ pChildNode->GetUserData(XFA_LAYOUTITEMKEY));
+ if (pLayoutItem) {
+ pNotify->OnLayoutEvent(pDocLayout, pLayoutItem,
+ XFA_LAYOUTEVENT_ItemRemoving);
+ delete pLayoutItem;
+ }
+ }
+ } else if (eCurId != XFA_ELEMENT_ContentArea) {
+ CXFA_LayoutItem* pLayoutItem = static_cast<CXFA_LayoutItem*>(
+ pNode->GetUserData(XFA_LAYOUTITEMKEY));
+ if (pLayoutItem) {
+ pNotify->OnLayoutEvent(pDocLayout, pLayoutItem,
+ XFA_LAYOUTEVENT_ItemRemoving);
+ delete pLayoutItem;
+ }
+ }
+ CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext();
+ pNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pNode);
+ pNode = pNext;
+ } else {
+ pNode->SetFlag(XFA_NODEFLAG_UnusedNode, FALSE);
+ pNode->SetFlag(XFA_NODEFLAG_Initialized);
+ pNode = sIterator.MoveToNext();
+ }
+ } else {
+ pNode->SetFlag(XFA_NODEFLAG_Initialized);
+ pNode = sIterator.MoveToNext();
+ }
+ }
+ pPendingPageSet = pNextPendingPageSet;
+ }
+}
+void CXFA_LayoutPageMgr::LayoutPageSetContents() {
+ CXFA_ContainerLayoutItem* pRootLayoutItem = this->GetRootLayoutItem();
+ for (; pRootLayoutItem;
+ pRootLayoutItem =
+ (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling) {
+ CXFA_NodeIteratorTemplate<
+ CXFA_ContainerLayoutItem,
+ CXFA_TraverseStrategy_ContentAreaContainerLayoutItem>
+ iterator(pRootLayoutItem);
+ for (CXFA_ContainerLayoutItem* pContainerItem = iterator.GetCurrent();
+ pContainerItem; pContainerItem = iterator.MoveToNext()) {
+ CXFA_Node* pNode = pContainerItem->m_pFormNode;
+ switch (pNode->GetClassID()) {
+ case XFA_ELEMENT_PageArea:
+ m_pLayoutProcessor->GetRootRootItemLayoutProcessor()
+ ->DoLayoutPageArea(pContainerItem);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+}
+void XFA_SyncContainer(IXFA_Notify* pNotify,
+ IXFA_DocLayout* pDocLayout,
+ CXFA_LayoutItem* pContainerItem,
+ FX_DWORD dwRelevant,
+ FX_BOOL bVisible,
+ int32_t nPageIndex) {
+ FX_BOOL bVisibleItem = FALSE;
+ FX_DWORD dwStatus = 0;
+ FX_DWORD dwRelevantContainer = 0;
+ if (bVisible) {
+ XFA_ATTRIBUTEENUM eAttributeValue =
+ pContainerItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Presence);
+ if (eAttributeValue == XFA_ATTRIBUTEENUM_Visible ||
+ eAttributeValue == XFA_ATTRIBUTEENUM_Unknown) {
+ bVisibleItem = TRUE;
+ }
+ dwRelevantContainer =
+ XFA_GetRelevant(pContainerItem->m_pFormNode, dwRelevant);
+ dwStatus =
+ (bVisibleItem ? XFA_LAYOUTSTATUS_Visible : 0) | dwRelevantContainer;
+ }
+ pNotify->OnLayoutEvent(pDocLayout, pContainerItem, XFA_LAYOUTEVENT_ItemAdded,
+ (void*)(uintptr_t)nPageIndex,
+ (void*)(uintptr_t)dwStatus);
+ for (CXFA_LayoutItem* pChild = pContainerItem->m_pFirstChild; pChild;
+ pChild = pChild->m_pNextSibling) {
+ if (pChild->IsContentLayoutItem()) {
+ XFA_SyncContainer(pNotify, pDocLayout, pChild, dwRelevantContainer,
+ bVisibleItem, nPageIndex);
+ }
+ }
+}
+void CXFA_LayoutPageMgr::SyncLayoutData() {
+ MergePageSetContents();
+ LayoutPageSetContents();
+ IXFA_Notify* pNotify =
+ m_pTemplatePageSetRoot->GetDocument()->GetParser()->GetNotify();
+ int32_t nPageIdx = -1;
+ CXFA_ContainerLayoutItem* pRootLayoutItem = this->GetRootLayoutItem();
+ for (; pRootLayoutItem;
+ pRootLayoutItem =
+ (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling) {
+ CXFA_NodeIteratorTemplate<
+ CXFA_ContainerLayoutItem,
+ CXFA_TraverseStrategy_ContentAreaContainerLayoutItem>
+ iteratorParent(pRootLayoutItem);
+ for (CXFA_ContainerLayoutItem* pContainerItem = iteratorParent.GetCurrent();
+ pContainerItem; pContainerItem = iteratorParent.MoveToNext()) {
+ switch (pContainerItem->m_pFormNode->GetClassID()) {
+ case XFA_ELEMENT_PageArea: {
+ nPageIdx++;
+ FX_DWORD dwRelevant =
+ XFA_LAYOUTSTATUS_Viewable | XFA_LAYOUTSTATUS_Printable;
+ CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
+ CXFA_TraverseStrategy_LayoutItem>
+ iterator(pContainerItem);
+ CXFA_LayoutItem* pChildLayoutItem = iterator.GetCurrent();
+ while (pChildLayoutItem) {
+ CXFA_ContentLayoutItem* pContentItem =
+ pChildLayoutItem->AsContentLayoutItem();
+ if (!pContentItem) {
+ pChildLayoutItem = iterator.MoveToNext();
+ continue;
+ }
+ FX_BOOL bVisible =
+ (pContentItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Presence) ==
+ XFA_ATTRIBUTEENUM_Visible);
+ FX_DWORD dwRelevantChild =
+ XFA_GetRelevant(pContentItem->m_pFormNode, dwRelevant);
+ XFA_SyncContainer(pNotify, m_pLayoutProcessor, pContentItem,
+ dwRelevantChild, bVisible, nPageIdx);
+ pChildLayoutItem = iterator.SkipChildrenAndMoveToNext();
+ }
+ } break;
+ default:
+ break;
+ }
+ }
+ }
+ int32_t nPage = m_PageArray.GetSize();
+ for (int32_t i = nPage - 1; i >= m_nAvailPages; i--) {
+ CXFA_ContainerLayoutItem* pPage = m_PageArray[i];
+ m_PageArray.RemoveAt(i);
+ pNotify->OnPageEvent(pPage, XFA_PAGEEVENT_PageRemoved);
+ delete pPage;
+ }
+ ClearRecordList();
+}
+void XFA_ReleaseLayoutItem_NoPageArea(CXFA_LayoutItem* pLayoutItem) {
+ CXFA_LayoutItem* pNext, * pNode = pLayoutItem->m_pFirstChild;
+ while (pNode) {
+ pNext = pNode->m_pNextSibling;
+ pNode->m_pParent = NULL;
+ XFA_ReleaseLayoutItem_NoPageArea(pNode);
+ pNode = pNext;
+ }
+ if (pLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) {
+ delete pLayoutItem;
+ }
+}
+void CXFA_LayoutPageMgr::PrepareLayout() {
+ m_pPageSetCurRoot = NULL;
+ m_ePageSetMode = XFA_ATTRIBUTEENUM_OrderedOccurrence;
+ m_nAvailPages = 0;
+ ClearRecordList();
+ if (!m_pPageSetLayoutItemRoot) {
+ return;
+ }
+ CXFA_ContainerLayoutItem* pRootLayoutItem = m_pPageSetLayoutItemRoot;
+ if (pRootLayoutItem &&
+ pRootLayoutItem->m_pFormNode->GetPacketID() == XFA_XDPPACKET_Form) {
+ CXFA_Node* pPageSetFormNode = pRootLayoutItem->m_pFormNode;
+ pRootLayoutItem->m_pFormNode->GetDocument()->m_pPendingPageSet.RemoveAll();
+ if (pPageSetFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) {
+ XFA_ReleaseLayoutItem(pRootLayoutItem);
+ m_pPageSetLayoutItemRoot = NULL;
+ pRootLayoutItem = NULL;
+ pPageSetFormNode = NULL;
+ m_PageArray.RemoveAll();
+ }
+ while (pPageSetFormNode) {
+ CXFA_Node* pNextPageSet =
+ pPageSetFormNode->GetNextSameClassSibling(XFA_ELEMENT_PageSet);
+ pPageSetFormNode->GetNodeItem(XFA_NODEITEM_Parent)
+ ->RemoveChild(pPageSetFormNode, FALSE);
+ pRootLayoutItem->m_pFormNode->GetDocument()->m_pPendingPageSet.Add(
+ pPageSetFormNode);
+ pPageSetFormNode = pNextPageSet;
+ }
+ }
+#if defined(_XFA_LAYOUTITEM_MAPCACHE_) || defined(_XFA_LAYOUTITEM_ProcessCACHE_)
+ pRootLayoutItem = m_pPageSetLayoutItemRoot;
+ CXFA_ContainerLayoutItem* pNextLayout = NULL;
+ for (; pRootLayoutItem; pRootLayoutItem = pNextLayout) {
+ pNextLayout = (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling;
+ SaveLayoutItem(pRootLayoutItem);
+ delete pRootLayoutItem;
+ }
+ m_pPageSetLayoutItemRoot = NULL;
+#else
+ IXFA_Notify* pNotify =
+ m_pLayoutProcessor->GetDocument()->GetParser()->GetNotify();
+ pRootLayoutItem = m_pPageSetLayoutItemRoot;
+ for (; pRootLayoutItem;
+ pRootLayoutItem =
+ (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling) {
+ CXFA_NodeIteratorTemplate<CXFA_ContainerLayoutItem,
+ CXFA_TraverseStrategy_PageAreaContainerLayoutItem>
+ iterator(pRootLayoutItem);
+ for (CXFA_ContainerLayoutItem* pContainerItem = iterator.GetCurrent();
+ pContainerItem; pContainerItem = iterator.MoveToNext()) {
+ if (pContainerItem->m_pFormNode->GetClassID() != XFA_ELEMENT_PageArea) {
+ continue;
+ }
+ CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
+ CXFA_TraverseStrategy_LayoutItem>
+ iterator(pContainerItem);
+ for (CXFA_LayoutItem* pLayoutItem = iterator.GetCurrent(); pLayoutItem;
+ pLayoutItem = iterator.MoveToNext()) {
+ if (!pLayoutItem->IsContentLayoutItem()) {
+ continue;
+ }
+ pNotify->OnLayoutEvent(m_pLayoutProcessor, pLayoutItem,
+ XFA_LAYOUTEVENT_ItemRemoving);
+ }
+ pNotify->OnPageEvent(pContainerItem, XFA_PAGEEVENT_PageRemoved);
+ }
+ }
+ pRootLayoutItem = m_pPageSetLayoutItemRoot;
+ CXFA_ContainerLayoutItem* pNextLayout = NULL;
+ for (; pRootLayoutItem; pRootLayoutItem = pNextLayout) {
+ pNextLayout = (CXFA_ContainerLayoutItem*)pRootLayoutItem->m_pNextSibling;
+ XFA_ReleaseLayoutItem_NoPageArea(pRootLayoutItem);
+ }
+ m_pPageSetLayoutItemRoot = NULL;
+#endif
+}
« no previous file with comments | « xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.h ('k') | xfa/src/fxfa/src/parser/xfa_locale.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698