summaryrefslogtreecommitdiff
path: root/xfa/src/fxfa/src/parser/xfa_layout_pagemgr_new.h
blob: dcaf01c739ebd64fde5143b51abb4a67caf0498a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// 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

#ifndef _XFA_LAYOUT_PAGEMGR_H_
#define _XFA_LAYOUT_PAGEMGR_H_
class CXFA_ContainerRecord : public CFX_Object
{
public:
    CXFA_ContainerRecord(CXFA_ContainerLayoutItemImpl* pPageSet = NULL, CXFA_ContainerLayoutItemImpl* pPageArea = NULL, CXFA_ContainerLayoutItemImpl* pContentArea = NULL)
        : pCurPageSet(pPageSet), pCurPageArea(pPageArea), pCurContentArea(pContentArea)
    {
    }
    CXFA_ContainerLayoutItemImpl* pCurPageSet;
    CXFA_ContainerLayoutItemImpl* pCurPageArea;
    CXFA_ContainerLayoutItemImpl* pCurContentArea;
};
class CXFA_LayoutPageMgr : public CFX_Object
{
public:
    CXFA_LayoutPageMgr(CXFA_LayoutProcessor* pLayoutProcessor);
    ~CXFA_LayoutPageMgr();
    FX_BOOL		InitLayoutPage(CXFA_Node* pFormNode);
    FX_BOOL		PrepareFirstPage(CXFA_Node* pRootSubform);
    FX_FLOAT	GetAvailHeight();
    FX_BOOL		GetNextAvailContentHeight(FX_FLOAT fChildHeight);
    void		SubmitContentItem(CXFA_ContentLayoutItemImpl* pContentLayoutItem, XFA_ItemLayoutProcessorResult eStatus);
    void		FinishPaginatedPageSets();
    void		SyncLayoutData();
    FX_INT32			GetPageCount() const;
    IXFA_LayoutPage*	GetPage(FX_INT32 index) const;
    FX_INT32			GetPageIndex(IXFA_LayoutPage* pPage) const;
    inline CXFA_ContainerLayoutItemImpl*	GetRootLayoutItem() const
    {
        return m_pPageSetLayoutItemRoot;
    }
    FX_BOOL		ProcessBreakBeforeOrAfter(CXFA_Node* pBreakNode, FX_BOOL bBefore, CXFA_Node* &pBreakLeaderNode, CXFA_Node* &pBreakTrailerNode, FX_BOOL& bCreatePage);
    FX_BOOL		ProcessOverflow(CXFA_Node* pFormNode, CXFA_Node* &pLeaderNode, CXFA_Node* &pTrailerNode, FX_BOOL bDataMerge = FALSE, FX_BOOL bCreatePage = TRUE);
    CXFA_Node*	QueryOverflow(CXFA_Node* pFormNode, CXFA_LayoutContext* pLayoutContext = NULL);
    FX_BOOL		ProcessBookendLeaderOrTrailer(CXFA_Node* pBookendNode, FX_BOOL bLeader, CXFA_Node* &pBookendAppendNode);
    CXFA_LayoutItemImpl* FindOrCreateLayoutItem(CXFA_Node* pFormNode);
protected:
    FX_BOOL 	AppendNewPage(FX_BOOL bFirstTemPage = FALSE);
    void		ReorderPendingLayoutRecordToTail(CXFA_ContainerRecord* pNewRecord, CXFA_ContainerRecord* pPrevRecord);
    void		RemoveLayoutRecord(CXFA_ContainerRecord* pNewRecord, CXFA_ContainerRecord* pPrevRecord);
    inline CXFA_ContainerRecord* GetCurrentContainerRecord()
    {
        CXFA_ContainerRecord* result = ((CXFA_ContainerRecord*)m_rgProposedContainerRecord.GetAt(m_pCurrentContainerRecord));
        ASSERT(result);
        return result;
    }
    CXFA_ContainerRecord* CreateContainerRecord(CXFA_Node* pPageNode = NULL, FX_BOOL bCreateNew = FALSE);
    void		AddPageAreaLayoutItem(CXFA_ContainerRecord* pNewRecord, CXFA_Node* pNewPageArea);
    void		AddContentAreaLayoutItem(CXFA_ContainerRecord* pNewRecord, CXFA_Node* pContentArea);
    FX_BOOL		RunBreak(XFA_ELEMENT eBreakType, XFA_ATTRIBUTEENUM eTargetType, CXFA_Node* pTarget, FX_BOOL bStartNew);
    CXFA_Node*	BreakOverflow(CXFA_Node* pOverflowNode, CXFA_Node*& pLeaderTemplate, CXFA_Node*& pTrailerTemplate, FX_BOOL bCreatePage = TRUE);
    FX_BOOL		ResolveBookendLeaderOrTrailer(CXFA_Node* pBookendNode, FX_BOOL bLeader, CXFA_Node* &pBookendAppendTemplate);
    FX_BOOL		ExecuteBreakBeforeOrAfter(CXFA_Node* pCurNode, FX_BOOL bBefore, CXFA_Node* &pBreakLeaderTemplate, CXFA_Node* &pBreakTrailerTemplate);

    FX_INT32	CreateMinPageRecord(CXFA_Node* pPageArea, FX_BOOL bTargetPageArea, FX_BOOL bCreateLast = FALSE);
    void		CreateMinPageSetRecord(CXFA_Node* pPageSet, FX_BOOL bCreateAll = FALSE);
    void		CreateNextMinRecord(CXFA_Node* pRecordNode);
    FX_BOOL		FindPageAreaFromPageSet(CXFA_Node* pPageSet, CXFA_Node* pStartChild, CXFA_Node* pTargetPageArea = NULL, CXFA_Node* pTargetContentArea = NULL, FX_BOOL bNewPage = FALSE, FX_BOOL bQuery = FALSE);
    FX_BOOL		FindPageAreaFromPageSet_Ordered(CXFA_Node* pPageSet, CXFA_Node* pStartChild, CXFA_Node* pTargetPageArea = NULL, CXFA_Node* pTargetContentArea = NULL, FX_BOOL bNewPage = FALSE, FX_BOOL bQuery = FALSE);
    FX_BOOL		FindPageAreaFromPageSet_SimplexDuplex(CXFA_Node* pPageSet, CXFA_Node* pStartChild, CXFA_Node* pTargetPageArea = NULL, CXFA_Node* pTargetContentArea = NULL, FX_BOOL bNewPage = FALSE, FX_BOOL bQuery = FALSE, XFA_ATTRIBUTEENUM ePreferredPosition = XFA_ATTRIBUTEENUM_First);
    FX_BOOL		MatchPageAreaOddOrEven(CXFA_Node* pPageArea, FX_BOOL bLastMatch);
    CXFA_Node*	GetNextAvailPageArea(CXFA_Node* pTargetPageArea, CXFA_Node* pTargetContentArea = NULL, FX_BOOL bNewPage = FALSE, FX_BOOL bQuery = FALSE);
    FX_BOOL		GetNextContentArea(CXFA_Node* pTargetContentArea);
    void		InitPageSetMap();
    void		ProcessLastPageSet();
    inline	FX_BOOL	IsPageSetRootOrderedOccurrence()
    {
        return m_ePageSetMode == XFA_ATTRIBUTEENUM_OrderedOccurrence;
    }
    void		ClearData();
    void		ClearRecordList();
    void		MergePageSetContents();
    void		LayoutPageSetContents();
    void		PrepareLayout();
    CXFA_LayoutProcessor*				m_pLayoutProcessor;
    CXFA_Node*							m_pTemplatePageSetRoot;
    CXFA_ContainerLayoutItemImpl*		m_pPageSetLayoutItemRoot;
    CXFA_ContainerLayoutItemImpl*		m_pPageSetCurRoot;
    FX_POSITION							m_pCurrentContainerRecord;
    CFX_PtrList							m_rgProposedContainerRecord;
    CXFA_Node*							m_pCurPageArea;
    FX_INT32							m_nAvailPages;
    FX_INT32							m_nCurPageCount;
    XFA_ATTRIBUTEENUM					m_ePageSetMode;
    FX_BOOL								m_bCreateOverFlowPage;
    CFX_MapPtrTemplate<CXFA_Node*, FX_INT32> m_pPageSetMap;
#ifdef _XFA_LAYOUTITEM_MAPCACHE_
    void						SaveLayoutItem(CXFA_LayoutItemImpl* pParentLayoutItem);
    CFX_MapPtrToPtr				m_NodeToContent;
#elif defined(_XFA_LAYOUTITEM_ProcessCACHE_)
    void						SaveLayoutItem(CXFA_LayoutItemImpl* pParentLayoutItem);
#endif
    CFX_ArrayTemplate<CXFA_ContainerLayoutItemImpl*>				m_PageArray;
};
#endif