| // 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_CXFA_ITEMLAYOUTPROCESSOR_H_ |
| #define XFA_FXFA_PARSER_CXFA_ITEMLAYOUTPROCESSOR_H_ |
| |
| #include <float.h> |
| |
| #include <list> |
| #include <map> |
| #include <tuple> |
| #include <vector> |
| |
| #include "core/fxcrt/fx_basic.h" |
| #include "core/fxcrt/fx_coordinates.h" |
| #include "xfa/fxfa/fxfa_basic.h" |
| |
| #define XFA_LAYOUT_INVALIDNODE ((CXFA_Node*)(intptr_t)-1) |
| #define XFA_LAYOUT_FLOAT_PERCISION (0.0005f) |
| |
| class CXFA_ContainerLayoutItem; |
| class CXFA_ContentLayoutItem; |
| class CXFA_ItemLayoutProcessor; |
| class CXFA_LayoutContext; |
| class CXFA_LayoutPageMgr; |
| class CXFA_LayoutProcessor; |
| class CXFA_Node; |
| |
| enum class XFA_ItemLayoutProcessorResult { |
| Done, |
| PageFullBreak, |
| RowFullBreak, |
| ManualBreak, |
| }; |
| |
| enum class XFA_ItemLayoutProcessorStages { |
| None, |
| BookendLeader, |
| BreakBefore, |
| Keep, |
| Container, |
| BreakAfter, |
| BookendTrailer, |
| Done, |
| }; |
| |
| bool XFA_ItemLayoutProcessor_IsTakingSpace(CXFA_Node* pNode); |
| |
| class CXFA_ItemLayoutProcessor { |
| public: |
| static bool IncrementRelayoutNode(CXFA_LayoutProcessor* pLayoutProcessor, |
| CXFA_Node* pNode, |
| CXFA_Node* pParentNode); |
| |
| CXFA_ItemLayoutProcessor(CXFA_Node* pNode, CXFA_LayoutPageMgr* pPageMgr); |
| ~CXFA_ItemLayoutProcessor(); |
| |
| XFA_ItemLayoutProcessorResult DoLayout(bool bUseBreakControl, |
| float fHeightLimit, |
| float fRealHeight, |
| CXFA_LayoutContext* pContext); |
| void DoLayoutPageArea(CXFA_ContainerLayoutItem* pPageAreaLayoutItem); |
| |
| CFX_SizeF GetCurrentComponentSize(); |
| CXFA_Node* GetFormNode() { return m_pFormNode; } |
| bool HasLayoutItem() const { return !!m_pLayoutItem; } |
| CXFA_ContentLayoutItem* ExtractLayoutItem(); |
| void SplitLayoutItem(float fSplitPos); |
| |
| float FindSplitPos(float fProposedSplitPos); |
| |
| bool ProcessKeepForSplit( |
| CXFA_ItemLayoutProcessor* pParentProcessor, |
| CXFA_ItemLayoutProcessor* pChildProcessor, |
| XFA_ItemLayoutProcessorResult eRetValue, |
| std::vector<CXFA_ContentLayoutItem*>* rgCurLineLayoutItem, |
| float* fContentCurRowAvailWidth, |
| float* fContentCurRowHeight, |
| float* fContentCurRowY, |
| bool* bAddedItemInRow, |
| bool* bForceEndPage, |
| XFA_ItemLayoutProcessorResult* result); |
| void ProcessUnUseOverFlow(CXFA_Node* pLeaderNode, |
| CXFA_Node* pTrailerNode, |
| CXFA_ContentLayoutItem* pTrailerItem, |
| CXFA_Node* pFormNode); |
| bool IsAddNewRowForTrailer(CXFA_ContentLayoutItem* pTrailerItem); |
| bool JudgeLeaderOrTrailerForOccur(CXFA_Node* pFormNode); |
| |
| CXFA_ContentLayoutItem* CreateContentLayoutItem(CXFA_Node* pFormNode); |
| |
| CXFA_Node* m_pFormNode; |
| CXFA_ContentLayoutItem* m_pLayoutItem; |
| CXFA_Node* m_pCurChildNode; |
| float m_fUsedSize; |
| CXFA_LayoutPageMgr* m_pPageMgr; |
| std::list<CXFA_Node*> m_PendingNodes; |
| bool m_bBreakPending; |
| std::vector<float> m_rgSpecifiedColumnWidths; |
| std::vector<CXFA_ContentLayoutItem*> m_arrayKeepItems; |
| float m_fLastRowWidth; |
| float m_fLastRowY; |
| bool m_bUseInheriated; |
| XFA_ItemLayoutProcessorResult m_ePreProcessRs; |
| |
| private: |
| void SetCurrentComponentPos(const CFX_PointF& pos); |
| void SetCurrentComponentSize(const CFX_SizeF& size); |
| |
| void SplitLayoutItem(CXFA_ContentLayoutItem* pLayoutItem, |
| CXFA_ContentLayoutItem* pSecondParent, |
| float fSplitPos); |
| float InsertKeepLayoutItems(); |
| bool CalculateRowChildPosition( |
| std::vector<CXFA_ContentLayoutItem*> (&rgCurLineLayoutItems)[3], |
| XFA_ATTRIBUTEENUM eFlowStrategy, |
| bool bContainerHeightAutoSize, |
| bool bContainerWidthAutoSize, |
| float* fContentCalculatedWidth, |
| float* fContentCalculatedHeight, |
| float* fContentCurRowY, |
| float fContentCurRowHeight, |
| float fContentWidthLimit, |
| bool bRootForceTb); |
| void ProcessUnUseBinds(CXFA_Node* pFormNode); |
| bool JudgePutNextPage(CXFA_ContentLayoutItem* pParentLayoutItem, |
| float fChildHeight, |
| std::vector<CXFA_ContentLayoutItem*>* pKeepItems); |
| |
| void DoLayoutPositionedContainer(CXFA_LayoutContext* pContext); |
| void DoLayoutTableContainer(CXFA_Node* pLayoutNode); |
| XFA_ItemLayoutProcessorResult DoLayoutFlowedContainer( |
| bool bUseBreakControl, |
| XFA_ATTRIBUTEENUM eFlowStrategy, |
| float fHeightLimit, |
| float fRealHeight, |
| CXFA_LayoutContext* pContext, |
| bool bRootForceTb); |
| void DoLayoutField(); |
| |
| void GotoNextContainerNode(CXFA_Node*& pCurActionNode, |
| XFA_ItemLayoutProcessorStages& nCurStage, |
| CXFA_Node* pParentContainer, |
| bool bUsePageBreak); |
| |
| bool ProcessKeepNodesForCheckNext(CXFA_Node*& pCurActionNode, |
| XFA_ItemLayoutProcessorStages& nCurStage, |
| CXFA_Node*& pNextContainer, |
| bool& bLastKeepNode); |
| |
| bool ProcessKeepNodesForBreakBefore(CXFA_Node*& pCurActionNode, |
| XFA_ItemLayoutProcessorStages& nCurStage, |
| CXFA_Node* pContainerNode); |
| |
| CXFA_Node* GetSubformSetParent(CXFA_Node* pSubformSet); |
| |
| bool m_bKeepBreakFinish; |
| bool m_bIsProcessKeep; |
| CXFA_Node* m_pKeepHeadNode; |
| CXFA_Node* m_pKeepTailNode; |
| CXFA_ContentLayoutItem* m_pOldLayoutItem; |
| CXFA_ItemLayoutProcessor* m_pCurChildPreprocessor; |
| XFA_ItemLayoutProcessorStages m_nCurChildNodeStage; |
| std::map<CXFA_Node*, int32_t> m_PendingNodesCount; |
| float m_fWidthLimite; |
| bool m_bHasAvailHeight; |
| }; |
| |
| #endif // XFA_FXFA_PARSER_CXFA_ITEMLAYOUTPROCESSOR_H_ |