7#include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
9#include "fxjs/gc/container_trace.h"
10#include "fxjs/xfa/cjx_object.h"
11#include "v8/include/cppgc/heap.h"
12#include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
13#include "xfa/fxfa/layout/cxfa_contentlayoutprocessor.h"
14#include "xfa/fxfa/layout/cxfa_viewlayoutprocessor.h"
15#include "xfa/fxfa/parser/cxfa_document.h"
16#include "xfa/fxfa/parser/cxfa_localemgr.h"
17#include "xfa/fxfa/parser/cxfa_measurement.h"
18#include "xfa/fxfa/parser/cxfa_node.h"
19#include "xfa/fxfa/parser/cxfa_subform.h"
20#include "xfa/fxfa/parser/xfa_document_datamerger_imp.h"
21#include "xfa/fxfa/parser/xfa_utils.h"
25 const CXFA_Document* pXFADoc) {
29CXFA_LayoutProcessor::CXFA_LayoutProcessor(
cppgc::Heap* pHeap)
34void CXFA_LayoutProcessor::
Trace(
cppgc::Visitor* visitor)
const {
35 CXFA_Document::LayoutProcessorIface::Trace(visitor);
36 visitor->Trace(m_pViewLayoutProcessor);
37 visitor->Trace(m_pContentLayoutProcessor);
45 return NeedLayout() ? RestartLayout() : 100;
48int32_t CXFA_LayoutProcessor::RestartLayout() {
49 m_pContentLayoutProcessor =
nullptr;
50 m_nProgressCounter = 0;
56 CXFA_Subform* pFormRoot =
57 pFormPacketNode->GetFirstChildByClass<CXFA_Subform>(
XFA_Element::Subform);
61 if (!m_pViewLayoutProcessor) {
62 m_pViewLayoutProcessor =
63 cppgc::MakeGarbageCollected<CXFA_ViewLayoutProcessor>(
64 GetHeap()->GetAllocationHandle(), GetHeap(),
this);
66 if (!m_pViewLayoutProcessor->InitLayoutPage(pFormRoot))
69 if (!m_pViewLayoutProcessor->PrepareFirstPage(pFormRoot))
72 m_pContentLayoutProcessor =
73 cppgc::MakeGarbageCollected<CXFA_ContentLayoutProcessor>(
74 GetHeap()->GetAllocationHandle(), GetHeap(), pFormRoot,
75 m_pViewLayoutProcessor);
76 m_nProgressCounter = 1;
81 if (m_nProgressCounter < 1)
85 CXFA_Node* pFormNode = m_pContentLayoutProcessor->GetFormNode();
91 float fAvailHeight = m_pViewLayoutProcessor->GetAvailHeight();
93 m_pContentLayoutProcessor->DoLayout(
true, fAvailHeight, fAvailHeight);
97 CXFA_ContentLayoutItem* pLayoutItem =
98 m_pContentLayoutProcessor->ExtractLayoutItem();
100 pLayoutItem->m_sPos = CFX_PointF(fPosX, fPosY);
102 m_pViewLayoutProcessor->SubmitContentItem(pLayoutItem, eStatus);
106 m_pViewLayoutProcessor->FinishPaginatedPageSets();
107 m_pViewLayoutProcessor->SyncLayoutData();
108 m_bHasChangedContainers =
false;
109 m_bNeedLayout =
false;
114 : m_nProgressCounter - 1) /
123 return !m_bHasChangedContainers;
127 return m_pViewLayoutProcessor ? m_pViewLayoutProcessor->GetPageCount() : 0;
130CXFA_ViewLayoutItem* CXFA_LayoutProcessor::
GetPage(int32_t index)
const {
131 return m_pViewLayoutProcessor ? m_pViewLayoutProcessor->GetPage(index)
136 return pFormItem->JSObject()->GetLayoutItem();
140 m_bHasChangedContainers =
true;
143bool CXFA_LayoutProcessor::NeedLayout()
const {
144 return m_bNeedLayout || m_bHasChangedContainers;
CXFA_Document * GetDocument() const
LayoutProcessorIface * GetLayoutProcessor() const
~CXFA_LayoutProcessor() override
int32_t CountPages() const
void Trace(cppgc::Visitor *visitor) const override
CXFA_LayoutItem * GetLayoutItem(CXFA_Node *pFormItem)
void SetHasChangedContainer() override
CXFA_ViewLayoutItem * GetPage(int32_t index) const
static CXFA_LayoutProcessor * FromDocument(const CXFA_Document *pXFADoc)
void SetForceRelayout() override