7#include "xfa/fxfa/layout/cxfa_viewlayoutprocessor.h"
11#include "core/fxcrt/stl_util.h"
12#include "fxjs/gc/container_trace.h"
13#include "fxjs/xfa/cfxjse_engine.h"
14#include "fxjs/xfa/cjx_object.h"
15#include "third_party/base/check.h"
16#include "xfa/fxfa/cxfa_ffnotify.h"
17#include "xfa/fxfa/cxfa_ffpageview.h"
18#include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
19#include "xfa/fxfa/layout/cxfa_contentlayoutprocessor.h"
20#include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
21#include "xfa/fxfa/layout/cxfa_traversestrategy_layoutitem.h"
22#include "xfa/fxfa/layout/cxfa_viewlayoutitem.h"
23#include "xfa/fxfa/parser/cxfa_contentarea.h"
24#include "xfa/fxfa/parser/cxfa_document.h"
25#include "xfa/fxfa/parser/cxfa_localemgr.h"
26#include "xfa/fxfa/parser/cxfa_measurement.h"
27#include "xfa/fxfa/parser/cxfa_medium.h"
28#include "xfa/fxfa/parser/cxfa_node.h"
29#include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h"
30#include "xfa/fxfa/parser/cxfa_object.h"
31#include "xfa/fxfa/parser/cxfa_occur.h"
32#include "xfa/fxfa/parser/cxfa_pageset.h"
33#include "xfa/fxfa/parser/cxfa_subform.h"
34#include "xfa/fxfa/parser/cxfa_traversestrategy_xfacontainernode.h"
35#include "xfa/fxfa/parser/cxfa_traversestrategy_xfanode.h"
36#include "xfa/fxfa/parser/xfa_document_datamerger_imp.h"
40class TraverseStrategy_ViewLayoutItem {
42 static CXFA_ViewLayoutItem* GetFirstChild(CXFA_ViewLayoutItem* pLayoutItem) {
43 for (
CXFA_LayoutItem* pChildItem = pLayoutItem->GetFirstChild(); pChildItem;
44 pChildItem = pChildItem->GetNextSibling()) {
52 static CXFA_ViewLayoutItem* GetNextSibling(CXFA_ViewLayoutItem* pLayoutItem) {
54 pChildItem; pChildItem = pChildItem->GetNextSibling()) {
62 static CXFA_ViewLayoutItem* GetParent(CXFA_ViewLayoutItem* pLayoutItem) {
63 return ToViewLayoutItem(pLayoutItem->GetParent());
67using ViewLayoutItemIterator =
68 CXFA_NodeIteratorTemplate<CXFA_ViewLayoutItem,
69 TraverseStrategy_ViewLayoutItem>;
71class TraverseStrategy_PageSet {
73 static CXFA_ViewLayoutItem* GetFirstChild(CXFA_ViewLayoutItem* pLayoutItem) {
77 for (
CXFA_LayoutItem* pChildItem = pLayoutItem->GetFirstChild(); pChildItem;
78 pChildItem = pChildItem->GetNextSibling()) {
88 static CXFA_ViewLayoutItem* GetNextSibling(CXFA_ViewLayoutItem* pLayoutItem) {
90 pChildItem; pChildItem = pChildItem->GetNextSibling()) {
100 static CXFA_ViewLayoutItem* GetParent(CXFA_ViewLayoutItem* pLayoutItem) {
101 return ToViewLayoutItem(pLayoutItem->GetParent());
105using PageSetIterator =
106 CXFA_NodeIteratorTemplate<CXFA_ViewLayoutItem, TraverseStrategy_PageSet>;
111 XFA_WidgetStatus::kPrintable};
112 WideString wsRelevant =
132 CXFA_LayoutProcessor* pDocLayout,
136 int32_t nPageIndex) {
137 bool bVisibleItem =
false;
149 dwRelevantContainer = GetRelevant(pViewItem->GetFormNode(), dwRelevant);
150 dwStatus = dwRelevantContainer;
156 pChild = pChild->GetNextSibling()) {
158 SyncContainer(pNotify, pDocLayout, pChild, dwRelevantContainer,
159 bVisibleItem, nPageIndex);
166 WideString* pTargetAll) {
175 size_t iSplitIndex = 0;
176 bool bTargetAllFind =
true;
179 absl::optional<size_t> iSplitNextIndex = 0;
180 if (!bTargetAllFind) {
181 iSplitNextIndex = pTargetAll->Find(
' ', iSplitIndex);
182 if (!iSplitNextIndex.has_value())
184 wsExpr = pTargetAll->Substr(iSplitIndex,
185 iSplitNextIndex.value() - iSplitIndex);
187 wsExpr
= *pTargetAll;
192 bTargetAllFind =
false;
193 if (wsExpr
[0
] ==
'#') {
196 wsExpr.Last(wsExpr.GetLength() - 1).AsStringView()
);
199 }
else if (bNewExprStyle) {
200 WideString wsProcessedTarget = wsExpr;
201 if (wsExpr.First(4).EqualsASCII(
"som(") && wsExpr
.Back() == L')')
202 wsProcessedTarget = wsExpr.Substr(4, wsExpr.GetLength() - 5);
204 absl::optional<CFXJSE_Engine::ResolveResult> maybeResult =
205 pDocument->GetScriptContext()->ResolveObjects(
206 pPageSetRoot, wsProcessedTarget.AsStringView(),
207 Mask<XFA_ResolveFlag>{
208 XFA_ResolveFlag::kChildren, XFA_ResolveFlag::kProperties,
209 XFA_ResolveFlag::kAttributes, XFA_ResolveFlag::kSiblings,
210 XFA_ResolveFlag::kParent});
211 if (maybeResult.has_value() &&
212 maybeResult.value().objects.front()->IsNode()) {
213 return maybeResult.value().objects.front()->AsNode();
216 iSplitIndex = iSplitNextIndex.value();
220void SetLayoutGeneratedNodeFlag(
CXFA_Node* pNode) {
226absl::optional<CXFA_ViewLayoutItem*> CheckContentAreaNotUsed(
227 CXFA_ViewLayoutItem* pPageAreaLayoutItem,
229 for (
CXFA_LayoutItem* pChild = pPageAreaLayoutItem->GetFirstChild(); pChild;
230 pChild = pChild->GetNextSibling()) {
232 if (pLayoutItem && pLayoutItem
->GetFormNode() == pContentArea) {
233 if (!pLayoutItem->GetFirstChild())
235 return absl::nullopt;
243 CXFA_LayoutProcessor* pDocLayout) {
245 while (pCurLayoutItem) {
247 SyncRemoveLayoutItem(pCurLayoutItem, pNotify, pDocLayout);
248 pCurLayoutItem = pNextLayoutItem;
251 pLayoutItem->RemoveSelfIfParented();
254bool RunBreakTestScript(CXFA_Script* pTestScript) {
255 WideString wsExpression = pTestScript->JSObject()->GetContent(
false);
265 pChild = pChild->GetNextSibling()) {
268 fHeight += pContent->m_sSize.height;
273std::vector<
float> GetHeightsForContentAreas(
const CXFA_LayoutItem* pItem) {
274 std::vector<
float> heights;
276 pChild = pChild->GetNextSibling()) {
278 heights.push_back(CalculateLayoutItemHeight(pChild));
283std::pair<size_t, CXFA_LayoutItem*> GetPageAreaCountAndLastPageAreaFromPageSet(
284 CXFA_ViewLayoutItem* pPageSetLayoutItem) {
288 pPageSetLayoutItem->GetFirstChild();
290 pPageAreaLayoutItem = pPageAreaLayoutItem->GetNextSibling()) {
296 pLast = pPageAreaLayoutItem;
298 return {nCount, pLast};
301bool ContentAreasFitInPageAreas(
const CXFA_Node* pNode,
302 const std::vector<
float>& rgUsedHeights) {
303 size_t iCurContentAreaIndex = 0;
304 for (
const CXFA_Node* pContentAreaNode = pNode->GetFirstChild();
306 pContentAreaNode = pContentAreaNode->GetNextSibling()) {
310 if (iCurContentAreaIndex >= rgUsedHeights.size())
313 const float fHeight = pContentAreaNode->JSObject()->GetMeasureInUnit(
316 if (rgUsedHeights[iCurContentAreaIndex] > fHeight)
319 ++iCurContentAreaIndex;
331 cppgc::Visitor* visitor)
const {
332 visitor->Trace(pCurPageSet);
333 visitor->Trace(pCurPageArea);
334 visitor->Trace(pCurContentArea);
339 CXFA_LayoutProcessor* pLayoutProcessor)
341 m_pLayoutProcessor(pLayoutProcessor),
342 m_CurrentViewRecordIter(m_ProposedViewRecords.end()) {}
349 while (pLayoutItem) {
352 pLayoutItem = pNextLayout;
357 visitor->Trace(m_pLayoutProcessor);
358 visitor->Trace(m_pPageSetNode);
359 visitor->Trace(m_pCurPageArea);
360 visitor->Trace(m_pPageSetRootLayoutItem);
361 visitor->Trace(m_pPageSetCurLayoutItem);
362 ContainerTrace(visitor, m_ProposedViewRecords);
364 if (m_CurrentViewRecordIter != m_ProposedViewRecords.end())
365 visitor->Trace(*m_CurrentViewRecordIter);
367 ContainerTrace(visitor, m_PageArray);
368 ContainerTrace(visitor, m_pPageSetMap);
377 m_pPageSetNode = pTemplateNode->JSObject()->GetOrCreateProperty<CXFA_PageSet>(
378 0, XFA_Element::PageSet);
379 DCHECK(m_pPageSetNode);
381 if (m_pPageSetRootLayoutItem) {
382 m_pPageSetRootLayoutItem->RemoveSelfIfParented();
384 m_pPageSetRootLayoutItem = cppgc::MakeGarbageCollected<CXFA_ViewLayoutItem>(
385 GetHeap()->GetAllocationHandle(), m_pPageSetNode,
nullptr);
387 m_pPageSetCurLayoutItem = m_pPageSetRootLayoutItem;
388 m_pPageSetNode->JSObject()->SetLayoutItem(m_pPageSetRootLayoutItem.Get());
391 m_pPageSetNode->JSObject()->GetEnum(XFA_Attribute::Relation);
393 m_ePageSetMode = eRelation;
398 for (pPageArea = m_pPageSetNode->GetFirstChild(); pPageArea;
399 pPageArea = pPageArea->GetNextSibling()) {
404 if (pPageArea->GetFirstChildByClass<CXFA_ContentArea>(
414 m_pPageSetNode->GetChild<CXFA_Node>(0, XFA_Element::PageArea,
false);
416 pPageArea = pDocument->CreateNode(m_pPageSetNode->GetPacketType(),
417 XFA_Element::PageArea);
421 m_pPageSetNode->InsertChildAndNotify(pPageArea,
nullptr);
424 CXFA_ContentArea* pContentArea =
425 pPageArea->GetChild<CXFA_ContentArea>(0,
XFA_Element::ContentArea,
false);
427 pContentArea =
static_cast<CXFA_ContentArea*>(pDocument
->CreateNode(
432 pPageArea->InsertChildAndNotify(pContentArea,
nullptr);
434 pContentArea->JSObject()->SetMeasure(
436 pContentArea->JSObject()->SetMeasure(
438 pContentArea->JSObject()->SetMeasure(
440 pContentArea->JSObject()->SetMeasure(
443 CXFA_Medium* pMedium =
444 pPageArea->GetChild<CXFA_Medium>(0,
XFA_Element::Medium,
false);
446 pMedium =
static_cast<CXFA_Medium*>(
451 pPageArea->InsertChildAndNotify(pMedium,
nullptr);
453 pMedium->JSObject()->SetMeasure(
455 pMedium->JSObject()->SetMeasure(
462 bool bProBreakBefore =
false;
463 const CXFA_Node* pBreakBeforeNode =
nullptr;
464 while (pRootSubform) {
465 for (
const CXFA_Node* pBreakNode = pRootSubform->GetFirstChild();
466 pBreakNode; pBreakNode = pBreakNode->GetNextSibling()) {
472 bProBreakBefore =
true;
473 pBreakBeforeNode = pBreakNode;
480 bProBreakBefore =
true;
482 pRootSubform->GetFirstChildByClass<CXFA_Subform>(
XFA_Element::Subform);
484 pRootSubform = pRootSubform->GetNextSameClassSibling<CXFA_Subform>(
488 if (pBreakBeforeNode) {
489 BreakData ret = ExecuteBreakBeforeOrAfter(pBreakBeforeNode,
true);
491 ResetToFirstViewRecord();
495 return AppendNewPage(
true);
499 if (m_CurrentViewRecordIter != GetTailPosition())
502 CXFA_Node* pPageNode = GetNextAvailPageArea(
nullptr,
nullptr,
false,
false);
506 if (bFirstTemPage && !HasCurrentViewRecord())
507 ResetToFirstViewRecord();
508 return !bFirstTemPage || HasCurrentViewRecord();
512 CXFA_ViewRecord* pNewRecord,
513 CXFA_ViewRecord* pPrevRecord) {
514 if (!pNewRecord || !pPrevRecord)
516 if (pNewRecord->pCurPageSet != pPrevRecord->pCurPageSet) {
517 pNewRecord->pCurPageSet->RemoveSelfIfParented();
520 if (pNewRecord->pCurPageArea != pPrevRecord->pCurPageArea) {
521 pNewRecord->pCurPageArea->RemoveSelfIfParented();
524 if (pNewRecord->pCurContentArea != pPrevRecord->pCurContentArea) {
525 pNewRecord->pCurContentArea->RemoveSelfIfParented();
531 CXFA_ContentLayoutItem* pContentLayoutItem,
533 if (pContentLayoutItem) {
534 CXFA_ViewRecord* pViewRecord = GetCurrentViewRecord();
538 pViewRecord->pCurContentArea->AppendLastChild(pContentLayoutItem);
539 m_bCreateOverFlowPage =
false;
542 if (eStatus == CXFA_ContentLayoutProcessor::Result::kPageFullBreak &&
543 m_CurrentViewRecordIter == GetTailPosition()) {
544 AppendNewPage(
false);
546 m_CurrentViewRecordIter = GetTailPosition();
547 m_pCurPageArea = GetCurrentViewRecord()->pCurPageArea->GetFormNode();
552 CXFA_ViewRecord* pViewRecord = GetCurrentViewRecord();
556 CXFA_ViewLayoutItem* pLayoutItem = pViewRecord->pCurContentArea;
560 float fAvailHeight = pLayoutItem
->GetFormNode()->JSObject()->GetMeasureInUnit(
564 if (m_CurrentViewRecordIter == m_ProposedViewRecords.begin())
570 m_ProposedViewRecords.emplace_back(pNewRecord);
577 auto* pNewRecord = cppgc::MakeGarbageCollected<CXFA_ViewRecord>(
578 GetHeap()->GetAllocationHandle());
579 if (!HasCurrentViewRecord()) {
580 CXFA_Node* pPageSet = pPageNode->GetParent();
581 if (pPageSet == m_pPageSetNode) {
582 pNewRecord->pCurPageSet = m_pPageSetRootLayoutItem;
584 auto* pPageSetLayoutItem =
585 cppgc::MakeGarbageCollected<CXFA_ViewLayoutItem>(
586 GetHeap()->GetAllocationHandle(), pPageSet,
nullptr);
587 pPageSet->JSObject()->SetLayoutItem(pPageSetLayoutItem);
588 m_pPageSetRootLayoutItem->AppendLastChild(pPageSetLayoutItem);
589 pNewRecord->pCurPageSet = pPageSetLayoutItem;
591 AppendNewRecord(pNewRecord);
595 if (!IsPageSetRootOrderedOccurrence()) {
596 *pNewRecord = *GetCurrentViewRecord();
597 AppendNewRecord(pNewRecord);
601 CXFA_Node* pPageSet = pPageNode->GetParent();
603 if (pPageSet == m_pPageSetNode) {
604 pNewRecord->pCurPageSet = m_pPageSetCurLayoutItem;
606 CXFA_ViewLayoutItem* pParentLayoutItem =
607 ToViewLayoutItem(pPageSet->JSObject()->GetLayoutItem());
608 if (!pParentLayoutItem)
609 pParentLayoutItem = m_pPageSetCurLayoutItem;
610 pNewRecord->pCurPageSet = pParentLayoutItem;
612 AppendNewRecord(pNewRecord);
616 CXFA_ViewLayoutItem* pParentPageSetLayout =
nullptr;
617 if (pPageSet == GetCurrentViewRecord()->pCurPageSet->GetFormNode()) {
618 pParentPageSetLayout =
619 ToViewLayoutItem(GetCurrentViewRecord()->pCurPageSet->GetParent());
621 pParentPageSetLayout =
622 ToViewLayoutItem(pPageSet->GetParent()->JSObject()->GetLayoutItem());
624 auto* pPageSetLayoutItem = cppgc::MakeGarbageCollected<CXFA_ViewLayoutItem>(
625 GetHeap()->GetAllocationHandle(), pPageSet,
nullptr);
626 pPageSet->JSObject()->SetLayoutItem(pPageSetLayoutItem);
627 if (!pParentPageSetLayout) {
628 CXFA_ViewLayoutItem* pPrePageSet = m_pPageSetRootLayoutItem;
629 while (pPrePageSet->GetNextSibling())
630 pPrePageSet = pPrePageSet->GetNextSibling()->AsViewLayoutItem();
632 if (pPrePageSet->GetParent()) {
633 pPrePageSet->GetParent()->InsertAfter(pPageSetLayoutItem, pPrePageSet);
635 m_pPageSetCurLayoutItem = pPageSetLayoutItem;
637 pParentPageSetLayout->AppendLastChild(pPageSetLayoutItem);
639 pNewRecord->pCurPageSet = pPageSetLayoutItem;
640 AppendNewRecord(pNewRecord);
646 auto* pNewRecord = cppgc::MakeGarbageCollected<CXFA_ViewRecord>(
647 GetHeap()->GetAllocationHandle());
648 CXFA_ViewRecord* pCurrentRecord = GetCurrentViewRecord();
650 *pNewRecord = *pCurrentRecord;
652 pNewRecord->pCurPageSet = m_pPageSetRootLayoutItem;
653 AppendNewRecord(pNewRecord);
658 CXFA_ViewRecord* pNewRecord,
660 CXFA_ViewLayoutItem* pNewPageAreaLayoutItem =
nullptr;
661 if (fxcrt::IndexInBounds(m_PageArray, m_nAvailPages)) {
662 CXFA_ViewLayoutItem* pViewItem = m_PageArray[m_nAvailPages];
665 pNewPageAreaLayoutItem = pViewItem;
668 auto* pViewItem = cppgc::MakeGarbageCollected<CXFA_ViewLayoutItem>(
669 GetHeap()->GetAllocationHandle(), pNewPageArea,
670 pNotify->OnCreateViewLayoutItem(pNewPageArea));
671 m_PageArray.push_back(pViewItem);
675 pNewPageAreaLayoutItem = pViewItem;
677 pNewRecord->pCurPageSet->AppendLastChild(pNewPageAreaLayoutItem);
678 pNewRecord->pCurPageArea = pNewPageAreaLayoutItem;
679 pNewRecord->pCurContentArea =
nullptr;
683 CXFA_ViewRecord* pNewRecord,
686 pNewRecord->pCurContentArea =
nullptr;
689 auto* pNewViewLayoutItem = cppgc::MakeGarbageCollected<CXFA_ViewLayoutItem>(
690 GetHeap()->GetAllocationHandle(), pContentArea,
nullptr);
691 pNewRecord->pCurPageArea->AppendLastChild(pNewViewLayoutItem);
692 pNewRecord->pCurContentArea = pNewViewLayoutItem;
696 for (CXFA_ViewLayoutItem* pRootPageSetLayoutItem =
697 m_pPageSetRootLayoutItem.Get();
698 pRootPageSetLayoutItem; pRootPageSetLayoutItem = ToViewLayoutItem(
699 pRootPageSetLayoutItem->GetNextSibling())) {
700 PageSetIterator sIterator(pRootPageSetLayoutItem);
701 for (CXFA_ViewLayoutItem* pPageSetLayoutItem = sIterator.GetCurrent();
702 pPageSetLayoutItem; pPageSetLayoutItem = sIterator.MoveToNext()) {
706 switch (ePageRelation) {
709 ProcessSimplexOrDuplexPageSets(
714 ProcessLastPageSet();
722 return fxcrt::CollectionSize<int32_t>(m_PageArray);
726 if (!fxcrt::IndexInBounds(m_PageArray, index))
728 return m_PageArray[index].Get();
732 const CXFA_ViewLayoutItem* pPage)
const {
733 auto it = std::find(m_PageArray.begin(), m_PageArray.end(), pPage);
734 return it != m_PageArray.end()
735 ? pdfium::base::checked_cast<int32_t>(it - m_PageArray.begin())
744 switch (eTargetType) {
748 if (ShouldGetNextPageArea(pTarget, bStartNew)) {
751 pPageArea = pTarget->GetParent();
753 pPageArea = GetNextAvailPageArea(pPageArea, pTarget,
false,
false);
760 if (ShouldGetNextPageArea(pTarget, bStartNew)) {
762 GetNextAvailPageArea(pTarget,
nullptr,
true,
false);
782 bool bStartNew)
const {
783 return bStartNew || !pTarget || !HasCurrentViewRecord() ||
784 pTarget != GetCurrentViewRecord()->pCurPageArea->GetFormNode();
790 BreakData ret = {
nullptr,
nullptr,
false};
795 WideString wsBreakLeader;
796 WideString wsBreakTrailer;
800 pCurNode->JSObject()->GetInteger(
XFA_Attribute::StartNew) != 0;
801 CXFA_Script* pScript =
802 pCurNode->GetFirstChildByClass<CXFA_Script>(
XFA_Element::Script);
803 if (pScript && !RunBreakTestScript(pScript))
806 WideString wsTarget =
808 CXFA_Node* pTarget = ResolveBreakTarget(m_pPageSetNode,
true, &wsTarget);
809 wsBreakTrailer = pCurNode->JSObject()->GetCData(
XFA_Attribute::Trailer);
810 wsBreakLeader = pCurNode->JSObject()->GetCData(
XFA_Attribute::Leader);
811 ret
.pLeader = ResolveBreakTarget(pContainer,
true, &wsBreakLeader);
812 ret
.pTrailer = ResolveBreakTarget(pContainer,
true, &wsBreakTrailer);
815 pTarget, bStartNew)) {
819 if (!m_ProposedViewRecords.empty() &&
820 m_CurrentViewRecordIter == m_ProposedViewRecords.begin() &&
821 eType == XFA_Element::BreakBefore) {
827 pParentNode = pParentNode->GetParent();
838 pCurNode->JSObject()->GetInteger(
XFA_Attribute::StartNew) != 0;
839 WideString wsTarget = pCurNode->JSObject()->GetCData(
841 CXFA_Node* pTarget = ResolveBreakTarget(m_pPageSetNode,
true, &wsTarget);
843 pCurNode->JSObject()->GetEnum(
845 pTarget, bStartNew)) {
858 return ProcessBreakBeforeOrAfter(pBreakNode,
true);
863 return ProcessBreakBeforeOrAfter(pBreakNode,
false);
866absl::optional<CXFA_ViewLayoutProcessor::BreakData>
870 if (!pFormNode->PresenceRequiresSpace())
871 return absl::nullopt;
873 BreakData break_data = ExecuteBreakBeforeOrAfter(pBreakNode, bBefore);
878 if (!break_data.pLeader->IsContainerNode())
879 return absl::nullopt;
884 if (!break_data.pLeader)
885 return absl::nullopt;
888 SetLayoutGeneratedNodeFlag(break_data
.pLeader);
891 if (!break_data.pTrailer->IsContainerNode())
892 return absl::nullopt;
899 if (!break_data.pTrailer)
900 return absl::nullopt;
903 SetLayoutGeneratedNodeFlag(break_data
.pTrailer);
910 return ProcessBookendLeaderOrTrailer(pBookendNode,
true);
915 return ProcessBookendLeaderOrTrailer(pBookendNode,
false);
923 ResolveBookendLeaderOrTrailer(pBookendNode, bLeader);
924 if (!pLeaderTemplate)
930 pLeaderTemplate
, pFormNode
, pDataScope
, true, true, true);
931 if (!pBookendAppendNode)
935 SetLayoutGeneratedNodeFlag(pBookendAppendNode);
936 return pBookendAppendNode;
946 WideString wsOverflowLeader =
947 pOverflowNode->JSObject()->GetCData(
XFA_Attribute::OverflowLeader);
948 WideString wsOverflowTarget =
949 pOverflowNode->JSObject()->GetCData(
XFA_Attribute::OverflowTarget);
950 WideString wsOverflowTrailer =
951 pOverflowNode->JSObject()->GetCData(
XFA_Attribute::OverflowTrailer);
957 if (!wsOverflowTarget
.IsEmpty() && bCreatePage && !m_bCreateOverFlowPage) {
959 ResolveBreakTarget(m_pPageSetNode,
true, &wsOverflowTarget);
961 m_bCreateOverFlowPage =
true;
978 ResolveBreakTarget(pContainer,
true, &wsOverflowLeader);
980 ResolveBreakTarget(pContainer,
true, &wsOverflowTrailer);
988 WideString wsOverflowTarget =
990 if (!wsOverflowTarget
.IsEmpty() && bCreatePage && !m_bCreateOverFlowPage) {
992 ResolveBreakTarget(m_pPageSetNode,
true, &wsOverflowTarget);
994 m_bCreateOverFlowPage =
true;
1010 WideString wsLeader =
1012 WideString wsTrailer =
1013 pOverflowNode->JSObject()->GetCData(
XFA_Attribute::Trailer);
1014 *pLeaderTemplate = ResolveBreakTarget(pContainer,
true, &wsLeader);
1015 *pTrailerTemplate = ResolveBreakTarget(pContainer,
true, &wsTrailer);
1024 return absl::nullopt;
1031 for (
CXFA_Node* pCurNode = bIsOverflowNode ? pFormNode
1032 : pFormNode->GetFirstChild();
1033 pCurNode; pCurNode = pCurNode->GetNextSibling()) {
1034 if (BreakOverflow(pCurNode, bCreatePage, &pLeaderTemplate,
1035 &pTrailerTemplate)) {
1036 if (bIsOverflowNode)
1037 pFormNode = pCurNode->GetParent();
1041 if (pLeaderTemplate) {
1045 pLeaderTemplate
, pFormNode
, pDataScope
, true, true, true);
1046 if (!overflow_data.pLeader)
1047 return absl::nullopt;
1050 SetLayoutGeneratedNodeFlag(overflow_data
.pLeader);
1052 if (pTrailerTemplate) {
1057 pTrailerTemplate
, pFormNode
, pDataScope
, true, true, true);
1058 if (!overflow_data.pTrailer)
1059 return absl::nullopt;
1062 SetLayoutGeneratedNodeFlag(overflow_data
.pTrailer);
1064 return overflow_data;
1066 if (bIsOverflowNode)
1069 return absl::nullopt;
1078 WideString leader = pBookendNode->JSObject()->GetCData(
1082 return ResolveBreakTarget(pContainer,
false, &leader);
1088 WideString leader = pBookendNode->JSObject()->GetCData(
1090 return ResolveBreakTarget(pContainer,
true, &leader);
1100 if (!pPageSet && !pStartChild)
1103 if (IsPageSetRootOrderedOccurrence()) {
1104 return FindPageAreaFromPageSet_Ordered(pPageSet, pStartChild,
1105 pTargetPageArea, pTargetContentArea,
1111 return FindPageAreaFromPageSet_SimplexDuplex(
1112 pPageSet, pStartChild, pTargetPageArea, pTargetContentArea, bNewPage,
1113 bQuery, ePreferredPosition);
1123 int32_t iPageSetCount = 0;
1124 if (!pStartChild && !bQuery) {
1125 auto it = m_pPageSetMap.find(pPageSet);
1126 if (it != m_pPageSetMap.end())
1127 iPageSetCount = it->second;
1130 pPageSet->GetFirstChildByClass<CXFA_Occur>(
XFA_Element::Occur);
1132 absl::optional<int32_t> ret =
1133 pOccurNode->JSObject()->TryInteger(XFA_Attribute::Max,
false);
1134 if (ret.has_value())
1137 if (iMax >= 0 && iMax <= iPageSetCount)
1143 pStartChild ? pStartChild->GetNextSibling() : pPageSet->GetFirstChild();
1144 for (; pCurrentNode; pCurrentNode = pCurrentNode->GetNextSibling()) {
1146 if ((pTargetPageArea == pCurrentNode || !pTargetPageArea)) {
1147 if (!pCurrentNode->GetFirstChildByClass<CXFA_ContentArea>(
1149 if (pTargetPageArea == pCurrentNode) {
1150 CreateMinPageRecord(pCurrentNode,
true,
false);
1151 pTargetPageArea =
nullptr;
1156 CXFA_ViewRecord* pNewRecord =
1157 CreateViewRecord(pCurrentNode, !pStartChild);
1158 AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
1159 if (!pTargetContentArea) {
1160 pTargetContentArea =
1161 pCurrentNode->GetFirstChildByClass<CXFA_ContentArea>(
1164 AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
1166 m_pCurPageArea = pCurrentNode;
1167 m_nCurPageCount = 1;
1172 CreateMinPageRecord(pCurrentNode,
false,
false);
1174 if (FindPageAreaFromPageSet_Ordered(pCurrentNode,
nullptr,
1175 pTargetPageArea, pTargetContentArea,
1176 bNewPage, bQuery)) {
1181 CreateMinPageSetRecord(pCurrentNode,
true);
1184 if (!pStartChild && bRes && !bQuery)
1185 m_pPageSetMap[pPageSet] = ++iPageSetCount;
1198 CXFA_Node* pPreferredPageArea =
nullptr;
1202 pCurrentNode = pPageSet->GetFirstChild();
1204 pCurrentNode = pStartChild->GetNextSibling();
1206 for (; pCurrentNode; pCurrentNode = pCurrentNode->GetNextSibling()) {
1208 if (!MatchPageAreaOddOrEven(pCurrentNode))
1212 pCurrentNode->JSObject()->GetEnum(
XFA_Attribute::PagePosition);
1214 if (eCurPagePosition != ePreferredPosition)
1217 pCurrentNode->JSObject()->GetEnum(
XFA_Attribute::OddOrEven) ==
1219 pPreferredPageArea = pCurrentNode;
1222 CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
1223 AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
1224 AddContentAreaLayoutItem(
1225 pNewRecord, pCurrentNode->GetFirstChildByClass<CXFA_ContentArea>(
1230 if (eCurPagePosition != ePreferredPosition)
1233 pCurrentNode->JSObject()->GetEnum(
XFA_Attribute::OddOrEven) ==
1235 pPreferredPageArea = pCurrentNode;
1240 if ((pTargetPageArea == pCurrentNode || !pTargetPageArea)) {
1241 if (!pCurrentNode->GetFirstChildByClass<CXFA_ContentArea>(
1243 if (pTargetPageArea == pCurrentNode) {
1244 CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
1245 AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
1246 pTargetPageArea =
nullptr;
1252 eCurPagePosition == ePreferredPosition) {
1253 pPreferredPageArea = pCurrentNode;
1256 if (eCurPagePosition == eFallbackPosition && !pFallbackPageArea) {
1257 pFallbackPageArea = pCurrentNode;
1259 }
else if (pTargetPageArea && !MatchPageAreaOddOrEven(pTargetPageArea)) {
1260 CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
1261 AddPageAreaLayoutItem(pNewRecord, pCurrentNode);
1262 AddContentAreaLayoutItem(
1263 pNewRecord, pCurrentNode->GetFirstChildByClass<CXFA_ContentArea>(
1267 if (FindPageAreaFromPageSet_SimplexDuplex(
1268 pCurrentNode,
nullptr, pTargetPageArea, pTargetContentArea,
1269 bNewPage, bQuery, ePreferredPosition)) {
1276 if (pPreferredPageArea)
1277 pCurPageArea = pPreferredPageArea;
1278 else if (pFallbackPageArea)
1279 pCurPageArea = pFallbackPageArea;
1285 CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
1286 AddPageAreaLayoutItem(pNewRecord, pCurPageArea);
1287 if (!pTargetContentArea) {
1288 pTargetContentArea = pCurPageArea->GetFirstChildByClass<CXFA_ContentArea>(
1291 AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
1293 m_pCurPageArea = pCurPageArea;
1301 absl::optional<XFA_AttributeValue> ret =
1302 pPageArea->JSObject()->TryEnum(XFA_Attribute::OddOrEven,
true);
1303 if (!ret.has_value() || ret == XFA_AttributeValue::Any)
1307 return ret == XFA_AttributeValue::Odd ? iPageLast == 0 : iPageLast == 1;
1315 if (!m_pCurPageArea) {
1316 FindPageAreaFromPageSet(m_pPageSetNode,
nullptr, pTargetPageArea,
1317 pTargetContentArea, bNewPage, bQuery);
1318 return m_pCurPageArea;
1321 if (!pTargetPageArea || pTargetPageArea == m_pCurPageArea) {
1322 if (!bNewPage && GetNextContentArea(pTargetContentArea))
1323 return m_pCurPageArea;
1325 if (IsPageSetRootOrderedOccurrence()) {
1328 m_pCurPageArea->GetFirstChildByClass<CXFA_Occur>(XFA_Element::Occur);
1330 absl::optional<int32_t> ret =
1331 pOccurNode->JSObject()->TryInteger(XFA_Attribute::Max,
false);
1332 if (ret.has_value())
1335 if ((iMax < 0 || m_nCurPageCount < iMax)) {
1337 CXFA_ViewRecord* pNewRecord = CreateViewRecord(m_pCurPageArea,
false);
1338 AddPageAreaLayoutItem(pNewRecord, m_pCurPageArea);
1339 if (!pTargetContentArea) {
1340 pTargetContentArea =
1341 m_pCurPageArea->GetFirstChildByClass<CXFA_ContentArea>(
1342 XFA_Element::ContentArea);
1344 AddContentAreaLayoutItem(pNewRecord, pTargetContentArea);
1347 return m_pCurPageArea;
1352 if (!bQuery && IsPageSetRootOrderedOccurrence())
1353 CreateMinPageRecord(m_pCurPageArea,
false,
true);
1354 if (FindPageAreaFromPageSet(m_pCurPageArea->GetParent(), m_pCurPageArea,
1355 pTargetPageArea, pTargetContentArea, bNewPage,
1357 return m_pCurPageArea;
1360 CXFA_Node* pPageSet = m_pCurPageArea->GetParent();
1362 if (FindPageAreaFromPageSet(pPageSet,
nullptr, pTargetPageArea,
1363 pTargetContentArea, bNewPage, bQuery)) {
1364 return m_pCurPageArea;
1366 if (!bQuery && IsPageSetRootOrderedOccurrence())
1367 CreateMinPageSetRecord(pPageSet,
false);
1368 if (FindPageAreaFromPageSet(
nullptr, pPageSet, pTargetPageArea,
1369 pTargetContentArea, bNewPage, bQuery)) {
1370 return m_pCurPageArea;
1372 if (pPageSet == m_pPageSetNode)
1375 pPageSet = pPageSet->GetParent();
1382 GetCurrentViewRecord()->pCurContentArea->GetFormNode();
1383 if (!pContentArea) {
1384 pContentArea = pCurContentNode->GetNextSameClassSibling<CXFA_ContentArea>(
1389 if (pContentArea->GetParent() != m_pCurPageArea)
1392 absl::optional<CXFA_ViewLayoutItem*> pContentAreaLayout =
1393 CheckContentAreaNotUsed(GetCurrentViewRecord()->pCurPageArea.Get(),
1395 if (!pContentAreaLayout.has_value())
1397 if (pContentAreaLayout.value()) {
1398 if (pContentAreaLayout.value()->GetFormNode() == pCurContentNode)
1401 CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
1402 pNewRecord->pCurContentArea = pContentAreaLayout.value();
1407 CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
1408 AddContentAreaLayoutItem(pNewRecord, pContentArea);
1413 if (!IsPageSetRootOrderedOccurrence())
1416 CXFA_NodeIterator sIterator(m_pPageSetNode);
1417 for (
CXFA_Node* pPageSetNode = sIterator.GetCurrent(); pPageSetNode;
1418 pPageSetNode = sIterator.MoveToNext()) {
1422 if (eRelation == XFA_AttributeValue::OrderedOccurrence)
1423 m_pPageSetMap[pPageSetNode] = 0;
1429 bool bTargetPageArea,
1435 absl::optional<int32_t> ret;
1437 pPageArea->GetFirstChildByClass<CXFA_Occur>(
XFA_Element::Occur);
1439 ret = pOccurNode->JSObject()->TryInteger(XFA_Attribute::Min,
false);
1440 if (ret.has_value())
1444 if (!ret.has_value() && !bTargetPageArea)
1447 CXFA_Node* pContentArea = pPageArea->GetFirstChildByClass<CXFA_ContentArea>(
1449 if (iMin < 1 && bTargetPageArea && !pContentArea)
1454 i = m_nCurPageCount;
1456 for (; i < iMin; i++) {
1457 CXFA_ViewRecord* pNewRecord = CreateViewRecordSimple();
1458 AddPageAreaLayoutItem(pNewRecord, pPageArea);
1459 AddContentAreaLayoutItem(pNewRecord, pContentArea);
1466 auto it = m_pPageSetMap.find(pPageSet);
1467 if (it == m_pPageSetMap.end())
1470 int32_t iCurSetCount = it->second;
1475 pPageSet->GetFirstChildByClass<CXFA_Occur>(
XFA_Element::Occur);
1479 absl::optional<int32_t> iMin =
1480 pOccurNode->JSObject()->TryInteger(XFA_Attribute::Min,
false);
1481 if (!iMin.has_value() || iCurSetCount >= iMin.value())
1484 for (int32_t i = 0; i < iMin.value() - iCurSetCount; i++) {
1485 for (
CXFA_Node* node = pPageSet->GetFirstChild(); node;
1486 node = node->GetNextSibling()) {
1488 CreateMinPageRecord(node,
false,
false);
1490 CreateMinPageSetRecord(node,
true);
1493 m_pPageSetMap[pPageSet] = iMin.value();
1500 for (
CXFA_Node* pCurrentNode = pRecordNode->GetNextSibling(); pCurrentNode;
1501 pCurrentNode = pCurrentNode->GetNextSibling()) {
1503 CreateMinPageRecord(pCurrentNode,
false,
false);
1505 CreateMinPageSetRecord(pCurrentNode,
true);
1510 if (!m_pCurPageArea)
1513 CreateMinPageRecord(m_pCurPageArea,
false,
true);
1514 CreateNextMinRecord(m_pCurPageArea);
1515 CXFA_Node* pPageSet = m_pCurPageArea->GetParent();
1517 CreateMinPageSetRecord(pPageSet,
false);
1518 if (pPageSet == m_pPageSetNode)
1521 CreateNextMinRecord(pPageSet);
1522 pPageSet = pPageSet->GetParent();
1527 CXFA_ViewRecord* pViewRecord = GetCurrentViewRecord();
1531 CXFA_Node* pCurContentNode = pViewRecord->pCurContentArea->GetFormNode();
1532 if (!pCurContentNode)
1535 pCurContentNode = pCurContentNode->GetNextSameClassSibling<CXFA_ContentArea>(
1537 if (pCurContentNode) {
1538 float fNextContentHeight = pCurContentNode->JSObject()->GetMeasureInUnit(
1540 return fNextContentHeight > fChildHeight;
1543 CXFA_Node* pPageNode = GetCurrentViewRecord()->pCurPageArea->GetFormNode();
1545 pPageNode->GetFirstChildByClass<CXFA_Occur>(
XFA_Element::Occur);
1547 absl::optional<int32_t> ret;
1549 ret = pOccurNode->JSObject()->TryInteger(XFA_Attribute::Max,
false);
1550 if (ret.has_value())
1553 if (ret.has_value()) {
1554 if (m_nCurPageCount == iMax) {
1556 int32_t nSrcPageCount = m_nCurPageCount;
1557 auto psSrcIter = GetTailPosition();
1559 GetNextAvailPageArea(
nullptr,
nullptr,
false,
true);
1560 m_pCurPageArea = pSrcPage;
1561 m_nCurPageCount = nSrcPageCount;
1562 CXFA_ViewRecord* pPrevRecord = psSrcIter->Get();
1564 while (psSrcIter != m_ProposedViewRecords.end()) {
1565 auto psSaveIter = psSrcIter++;
1566 RemoveLayoutRecord(psSaveIter->Get(), pPrevRecord);
1567 m_ProposedViewRecords.erase(psSaveIter);
1571 pNextPage->GetFirstChildByClass<CXFA_ContentArea>(
1574 float fNextContentHeight = pContentArea->JSObject()->GetMeasureInUnit(
1576 if (fNextContentHeight > fChildHeight)
1584 CXFA_Node* pContentArea = pPageNode->GetFirstChildByClass<CXFA_ContentArea>(
1589 float fNextContentHeight = pContentArea->JSObject()->GetMeasureInUnit(
1592 fNextContentHeight > fChildHeight;
1596 if (!m_pPageSetNode)
1599 m_ProposedViewRecords.clear();
1600 m_CurrentViewRecordIter = m_ProposedViewRecords.end();
1601 m_pCurPageArea =
nullptr;
1602 m_nCurPageCount = 0;
1603 m_bCreateOverFlowPage =
false;
1604 m_pPageSetMap.clear();
1609 CXFA_Document* pDocument = m_pPageSetNode->GetDocument();
1613 while (pCurLayoutItem) {
1617 SyncRemoveLayoutItem(pCurLayoutItem, pNotify, pDocLayout);
1618 pCurLayoutItem = pNextLayoutItem;
1624 SaveLayoutItemChildren(pCurLayoutItem);
1625 pCurLayoutItem = pNextLayoutItem;
1630 for (
CXFA_Node* pCurNode = pFormNode->GetFirstChild(); pCurNode;
1631 pCurNode = pCurNode->GetNextSibling()) {
1633 WideString wsOverflowLeader =
1634 pCurNode->JSObject()->GetCData(
XFA_Attribute::OverflowLeader);
1635 WideString wsOverflowTarget =
1636 pCurNode->JSObject()->GetCData(
XFA_Attribute::OverflowTarget);
1637 WideString wsOverflowTrailer =
1638 pCurNode->JSObject()->GetCData(
XFA_Attribute::OverflowTrailer);
1653 CXFA_Document* pDocument = m_pPageSetNode->GetDocument();
1660 size_t pending_index = 0;
1662 pRootLayout = ToViewLayoutItem(pRootLayout->GetNextSibling())) {
1664 ViewLayoutItemIterator iterator(pRootLayout);
1665 CXFA_ViewLayoutItem* pRootPageSetViewItem = iterator.GetCurrent();
1666 DCHECK(pRootPageSetViewItem->GetFormNode()->GetElementType() ==
1667 XFA_Element::PageSet);
1668 if (pending_index < pDocument->GetPendingNodesCount()) {
1669 pPendingPageSet = pDocument->GetPendingNodeAtIndex(pending_index);
1672 if (!pPendingPageSet) {
1676 pRootPageSetViewItem
->GetFormNode()->CloneTemplateToForm(
false);
1681 if (pRootPageSetViewItem
->GetFormNode()->JSObject()->GetLayoutItem() ==
1682 pRootPageSetViewItem) {
1683 pRootPageSetViewItem
->GetFormNode()->JSObject()->SetLayoutItem(
nullptr);
1687 for (CXFA_ViewLayoutItem* pViewItem = iterator.MoveToNext(); pViewItem;
1688 pViewItem = iterator.MoveToNext()) {
1695 CXFA_Node* pParentNode = pViewItem->GetParent()->GetFormNode();
1697 CXFA_Node* pNewNode = XFA_NodeMerge_CloneOrMergeContainer(
1698 pDocument, pParentNode, pOldNode,
true,
nullptr);
1699 if (pOldNode != pNewNode) {
1700 pOldNode->JSObject()->SetLayoutItem(
nullptr);
1707 CXFA_Node* pParentNode = pViewItem->GetParent()->GetFormNode();
1708 bool bIsExistForm =
true;
1709 for (int32_t iLevel = 0; iLevel < 3; iLevel++) {
1710 pFormLayout = pFormLayout->GetFirstChild();
1712 while (pFormLayout &&
1714 pFormLayout = pFormLayout->GetNextSibling();
1718 bIsExistForm =
false;
1726 CXFA_Node* pExistingNode = XFA_DataMerge_FindFormDOMInstance(
1729 CXFA_ContainerIterator sIterator(pExistingNode);
1730 for (
CXFA_Node* pIter = sIterator.GetCurrent(); pIter;
1731 pIter = sIterator.MoveToNext()) {
1734 pIter->JSObject()->GetLayoutItem();
1737 pLayoutItem->RemoveSelfIfParented();
1741 if (pExistingNode) {
1749 pOldNode
, pParentNode
,
1752 if (pOldNode != pNewNode) {
1753 pOldNode->JSObject()->SetLayoutItem(
nullptr);
1759 CXFA_Node* pParentNode = pViewItem->GetParent()->GetFormNode();
1760 for (
CXFA_Node* pChildNode = pParentNode->GetFirstChild(); pChildNode;
1761 pChildNode = pChildNode->GetNextSibling()) {
1775 if (!pPendingPageSet->GetParent()) {
1779 pNode->GetFirstChildByClass<CXFA_Subform>(
XFA_Element::Subform);
1780 if (pFormToplevelSubform)
1791 pPageSet->GetNextSameClassSibling<CXFA_PageSet>(
XFA_Element::PageSet);
1792 CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode>
1793 sIterator(pPageSet);
1794 CXFA_Node* pNode = sIterator.GetCurrent();
1800 CXFA_ContainerIterator iteChild(pNode);
1801 CXFA_Node* pChildNode = iteChild.MoveToNext();
1802 for (; pChildNode; pChildNode = iteChild.MoveToNext()) {
1804 pChildNode->JSObject()->GetLayoutItem();
1807 pLayoutItem->RemoveSelfIfParented();
1814 pLayoutItem->RemoveSelfIfParented();
1817 CXFA_Node* pNext = sIterator.SkipChildrenAndMoveToNext();
1818 pNode->GetParent()->RemoveChildAndNotify(pNode,
true);
1823 pNode = sIterator.MoveToNext();
1827 pNode = sIterator.MoveToNext();
1830 pPageSet = pNextPageSet;
1837 pRootLayoutItem = ToViewLayoutItem(pRootLayoutItem->GetNextSibling())) {
1838 ViewLayoutItemIterator iterator(pRootLayoutItem);
1839 for (CXFA_ViewLayoutItem* pViewItem = iterator.GetCurrent(); pViewItem;
1840 pViewItem = iterator.MoveToNext()) {
1845 m_pLayoutProcessor->GetRootContentLayoutProcessor()->DoLayoutPageArea(
1852 MergePageSetContents();
1853 LayoutPageSetContents();
1854 CXFA_FFNotify* pNotify = m_pPageSetNode->GetDocument()->GetNotify();
1855 int32_t nPageIdx = -1;
1858 pRootLayoutItem = ToViewLayoutItem(pRootLayoutItem->GetNextSibling())) {
1859 ViewLayoutItemIterator iteratorParent(pRootLayoutItem);
1860 for (CXFA_ViewLayoutItem* pViewItem = iteratorParent.GetCurrent();
1861 pViewItem; pViewItem = iteratorParent.MoveToNext()) {
1868 XFA_WidgetStatus::kPrintable};
1869 CXFA_LayoutItemIterator iterator(pViewItem);
1871 while (pChildLayoutItem) {
1872 CXFA_ContentLayoutItem* pContentItem =
1874 if (!pContentItem) {
1875 pChildLayoutItem = iterator.MoveToNext();
1886 GetRelevant(pContentItem->GetFormNode(), dwRelevant);
1887 SyncContainer(pNotify, m_pLayoutProcessor, pContentItem,
1888 dwRelevantChild, bVisible, nPageIdx);
1889 pChildLayoutItem = iterator.SkipChildrenAndMoveToNext();
1894 int32_t nPage = fxcrt::CollectionSize<int32_t>(m_PageArray);
1895 for (int32_t i = nPage - 1; i >= m_nAvailPages; i--) {
1896 CXFA_ViewLayoutItem* pPage = m_PageArray[i];
1897 m_PageArray.erase(m_PageArray.begin() + i);
1904 m_pPageSetCurLayoutItem =
nullptr;
1908 if (!m_pPageSetRootLayoutItem)
1911 CXFA_ViewLayoutItem* pRootLayoutItem = m_pPageSetRootLayoutItem;
1912 if (pRootLayoutItem &&
1914 CXFA_Document*
const pRootDocument =
1919 XFA_ReleaseLayoutItem(pRootLayoutItem);
1920 m_pPageSetRootLayoutItem =
nullptr;
1921 pRootLayoutItem =
nullptr;
1922 pPageSetFormNode =
nullptr;
1923 m_PageArray.clear();
1925 while (pPageSetFormNode) {
1927 pPageSetFormNode->GetNextSameClassSibling<CXFA_PageSet>(
1929 pPageSetFormNode->GetParent()->RemoveChildAndNotify(pPageSetFormNode,
1932 pPageSetFormNode = pNextPageSet;
1935 pRootLayoutItem = m_pPageSetRootLayoutItem;
1936 CXFA_ViewLayoutItem* pNextLayout =
nullptr;
1937 for (; pRootLayoutItem; pRootLayoutItem = pNextLayout) {
1938 pNextLayout = ToViewLayoutItem(pRootLayoutItem->GetNextSibling());
1939 SaveLayoutItemChildren(pRootLayoutItem);
1940 pRootLayoutItem->RemoveSelfIfParented();
1942 m_pPageSetRootLayoutItem =
nullptr;
1946 CXFA_ViewLayoutItem* pPageSetLayoutItem,
1948 size_t nPageAreaCount;
1950 std::tie(nPageAreaCount, pLastPageAreaLayoutItem) =
1951 GetPageAreaCountAndLastPageAreaFromPageSet(pPageSetLayoutItem);
1952 if (!pLastPageAreaLayoutItem)
1955 if (!FindPageAreaFromPageSet_SimplexDuplex(
1956 pPageSetLayoutItem
->GetFormNode(),
nullptr,
nullptr,
nullptr,
true,
1960 (nPageAreaCount == 1 &&
1961 !FindPageAreaFromPageSet_SimplexDuplex(
1962 pPageSetLayoutItem
->GetFormNode(),
nullptr,
nullptr,
nullptr,
true,
1978 CXFA_ViewRecord* pRecord = CreateViewRecordSimple();
1979 AddPageAreaLayoutItem(pRecord, pNode);
1984 std::vector<
float> rgUsedHeights =
1985 GetHeightsForContentAreas(pLastPageAreaLayoutItem);
1986 if (ContentAreasFitInPageAreas(pNode, rgUsedHeights)) {
1988 pLastPageAreaLayoutItem->GetFirstChild();
1989 CXFA_Node* pContentAreaNode = pNode->GetFirstChild();
1991 while (pChildLayoutItem && pContentAreaNode) {
1994 pChildLayoutItem = pChildLayoutItem->GetNextSibling();
1998 pContentAreaNode = pContentAreaNode->GetNextSibling();
2002 pChildLayoutItem = pChildLayoutItem->GetNextSibling();
2003 pContentAreaNode = pContentAreaNode->GetNextSibling();
2008 if (pNode->JSObject()->GetEnum(
XFA_Attribute::PagePosition) ==
2010 CXFA_ViewRecord* pRecord = CreateViewRecordSimple();
2011 AddPageAreaLayoutItem(pRecord, pNode);
CXFA_Node * GetNodeByID(CXFA_Node *pRoot, WideStringView wsID) const
CXFA_FFNotify * GetNotify() const
CXFA_Node * DataMerge_CopyContainer(CXFA_Node *pTemplateNode, CXFA_Node *pFormNode, CXFA_Node *pDataScope, bool bOneInstance, bool bDataMerge, bool bUpLevel)
void AppendPendingNode(CXFA_Node *node)
void DataMerge_UpdateBindingRelations(CXFA_Node *pFormUpdateRoot)
CXFA_Node * CreateNode(XFA_PacketType packet, XFA_Element eElement)
CXFA_Object * GetXFAObject(XFA_HashCode wsNodeNameHash)
void SetPendingNodesUnusedAndUnbound()
void OnLayoutItemAdded(CXFA_LayoutProcessor *pLayout, CXFA_LayoutItem *pSender, int32_t iPageIdx, Mask< XFA_WidgetStatus > dwStatus)
void OnPageViewEvent(CXFA_ViewLayoutItem *pSender, CXFA_FFDoc::PageViewEvent eEvent)
void OnLayoutItemRemoving(CXFA_LayoutProcessor *pLayout, CXFA_LayoutItem *pSender)
bool IsContentLayoutItem() const
CXFA_ViewLayoutItem * AsViewLayoutItem()
void SetFormNode(CXFA_Node *pNode)
CXFA_ContentLayoutItem * AsContentLayoutItem()
CXFA_Node * GetFormNode() const
const CXFA_ContentLayoutItem * AsContentLayoutItem() const
static CXFA_LayoutProcessor * FromDocument(const CXFA_Document *pXFADoc)
CXFA_Measurement(float fValue, XFA_Unit eUnit)
void RemoveChildAndNotify(CXFA_Node *pNode, bool bNotify)
CXFA_Node * GetFirstContainerChild() const
void SetNodeAndDescendantsUnused()
CXFA_Node * GetContainerParent() const
void InsertChildAndNotify(CXFA_Node *pNode, CXFA_Node *pBeforeNode)
bool IsLayoutGeneratedNode() const
void SetFlag(XFA_NodeFlag dwFlag)
void ClearFlag(XFA_NodeFlag dwFlag)
CXFA_Node * GetTemplateNodeIfExists() const
bool IsUnusedNode() const
XFA_PacketType GetPacketType() const
bool PresenceRequiresSpace() const
void SetInitializedFlagAndNotify()
bool HasRemovedChildren() const
XFA_Element GetElementType() const
CXFA_Document * GetDocument() const
bool IsContainerNode() const
void SetOldSubform(CXFA_Node *pSubform)
CXFA_Node * GetOldSubform() const
void FinishPaginatedPageSets()
int32_t GetPageIndex(const CXFA_ViewLayoutItem *pPage) const
CXFA_ViewLayoutItem * GetPage(int32_t index) const
CXFA_Node * QueryOverflow(CXFA_Node *pFormNode)
absl::optional< BreakData > ProcessBreakAfter(const CXFA_Node *pBreakNode)
absl::optional< OverflowData > ProcessOverflow(CXFA_Node *pFormNode, bool bCreatePage)
bool PrepareFirstPage(CXFA_Node *pRootSubform)
bool InitLayoutPage(CXFA_Node *pFormNode)
CXFA_Node * ProcessBookendTrailer(const CXFA_Node *pBookendNode)
CXFA_ViewLayoutItem * GetRootLayoutItem() const
int32_t GetPageCount() const
CXFA_Node * ProcessBookendLeader(const CXFA_Node *pBookendNode)
absl::optional< BreakData > ProcessBreakBefore(const CXFA_Node *pBreakNode)
void SubmitContentItem(CXFA_ContentLayoutItem *pContentLayoutItem, CXFA_ContentLayoutProcessor::Result eStatus)
~CXFA_ViewLayoutProcessor()
bool GetNextAvailContentHeight(float fChildHeight)
CharType operator[](const size_t index) const
WideString & operator=(const WideString &that)
bool EqualsASCII(ByteStringView that) const
constexpr float kXFALayoutPrecision
void XFA_ReleaseLayoutItem(CXFA_LayoutItem *pLayoutItem)
CXFA_Node * ToNode(CXFA_Object *pObj)
UNOWNED_PTR_EXCLUSION CXFA_Node * pTrailer
UNOWNED_PTR_EXCLUSION CXFA_Node * pLeader
UNOWNED_PTR_EXCLUSION CXFA_Node * pTrailer
UNOWNED_PTR_EXCLUSION CXFA_Node * pLeader
CXFA_Node * XFA_DataMerge_FindDataScope(CXFA_Node *pParentFormNode)