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 |
+} |