| // 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_FXFA_PARSER_XFA_LAYOUT_PAGEMGR_NEW_H_ |
| #define XFA_FXFA_PARSER_XFA_LAYOUT_PAGEMGR_NEW_H_ |
| |
| #include "xfa/fxfa/parser/xfa_doclayout.h" |
| #include "xfa/fxfa/parser/xfa_layout_itemlayout.h" |
| |
| class CXFA_ContainerRecord { |
| public: |
| CXFA_ContainerRecord(CXFA_ContainerLayoutItem* pPageSet = NULL, |
| CXFA_ContainerLayoutItem* pPageArea = NULL, |
| CXFA_ContainerLayoutItem* pContentArea = NULL) |
| : pCurPageSet(pPageSet), |
| pCurPageArea(pPageArea), |
| pCurContentArea(pContentArea) {} |
| CXFA_ContainerLayoutItem* pCurPageSet; |
| CXFA_ContainerLayoutItem* pCurPageArea; |
| CXFA_ContainerLayoutItem* pCurContentArea; |
| }; |
| class CXFA_LayoutPageMgr { |
| 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_ContentLayoutItem* pContentLayoutItem, |
| XFA_ItemLayoutProcessorResult eStatus); |
| void FinishPaginatedPageSets(); |
| void SyncLayoutData(); |
| int32_t GetPageCount() const; |
| CXFA_ContainerLayoutItem* GetPage(int32_t index) const; |
| int32_t GetPageIndex(const CXFA_ContainerLayoutItem* pPage) const; |
| inline CXFA_ContainerLayoutItem* 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_LayoutItem* 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); |
| |
| int32_t 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(); |
| void SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem); |
| CXFA_LayoutProcessor* m_pLayoutProcessor; |
| CXFA_Node* m_pTemplatePageSetRoot; |
| CXFA_ContainerLayoutItem* m_pPageSetLayoutItemRoot; |
| CXFA_ContainerLayoutItem* m_pPageSetCurRoot; |
| FX_POSITION m_pCurrentContainerRecord; |
| CFX_PtrList m_rgProposedContainerRecord; |
| CXFA_Node* m_pCurPageArea; |
| int32_t m_nAvailPages; |
| int32_t m_nCurPageCount; |
| XFA_ATTRIBUTEENUM m_ePageSetMode; |
| FX_BOOL m_bCreateOverFlowPage; |
| CFX_MapPtrTemplate<CXFA_Node*, int32_t> m_pPageSetMap; |
| CFX_ArrayTemplate<CXFA_ContainerLayoutItem*> m_PageArray; |
| }; |
| |
| #endif // XFA_FXFA_PARSER_XFA_LAYOUT_PAGEMGR_NEW_H_ |