Index: xfa/src/fxfa/parser/xfa_layout_itemlayout.cpp |
diff --git a/xfa/src/fxfa/parser/xfa_layout_itemlayout.cpp b/xfa/src/fxfa/parser/xfa_layout_itemlayout.cpp |
deleted file mode 100644 |
index cdf327826b88a8ade8fcae6a569568c8f2f9a6ed..0000000000000000000000000000000000000000 |
--- a/xfa/src/fxfa/parser/xfa_layout_itemlayout.cpp |
+++ /dev/null |
@@ -1,2968 +0,0 @@ |
-// 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 |
- |
-#include "xfa/src/fxfa/parser/xfa_layout_itemlayout.h" |
- |
-#include <algorithm> |
-#include <memory> |
- |
-#include "xfa/src/fgas/crt/fgas_algorithm.h" |
-#include "xfa/src/fxfa/fm2js/xfa_fm2jsapi.h" |
-#include "xfa/src/fxfa/parser/xfa_docdata.h" |
-#include "xfa/src/fxfa/parser/xfa_doclayout.h" |
-#include "xfa/src/fxfa/parser/xfa_document.h" |
-#include "xfa/src/fxfa/parser/xfa_document_layout_imp.h" |
-#include "xfa/src/fxfa/parser/xfa_layout_appadapter.h" |
-#include "xfa/src/fxfa/parser/xfa_layout_pagemgr_new.h" |
-#include "xfa/src/fxfa/parser/xfa_localemgr.h" |
-#include "xfa/src/fxfa/parser/xfa_object.h" |
-#include "xfa/src/fxfa/parser/xfa_parser.h" |
-#include "xfa/src/fxfa/parser/xfa_script.h" |
-#include "xfa/src/fxfa/parser/xfa_utils.h" |
- |
-CXFA_ItemLayoutProcessor::CXFA_ItemLayoutProcessor(CXFA_Node* pNode, |
- CXFA_LayoutPageMgr* pPageMgr) |
- : m_bKeepBreakFinish(FALSE), |
- m_bIsProcessKeep(FALSE), |
- m_pKeepHeadNode(nullptr), |
- m_pKeepTailNode(nullptr), |
- m_pFormNode(pNode), |
- m_pLayoutItem(nullptr), |
- m_pOldLayoutItem(nullptr), |
- m_pCurChildNode(XFA_LAYOUT_INVALIDNODE), |
- m_pCurChildPreprocessor(nullptr), |
- m_nCurChildNodeStage(XFA_ItemLayoutProcessorStages_None), |
- m_fUsedSize(0), |
- m_pPageMgr(pPageMgr), |
- m_bBreakPending(TRUE), |
- m_fLastRowWidth(0), |
- m_fLastRowY(0), |
- m_fWidthLimite(0), |
- m_bUseInheriated(FALSE), |
- m_ePreProcessRs(XFA_ItemLayoutProcessorResult_Done), |
- m_bHasAvailHeight(TRUE) { |
- FXSYS_assert(m_pFormNode && (m_pFormNode->IsContainerNode() || |
- m_pFormNode->GetClassID() == XFA_ELEMENT_Form)); |
- m_pOldLayoutItem = |
- (CXFA_ContentLayoutItem*)m_pFormNode->GetUserData(XFA_LAYOUTITEMKEY); |
-} |
-CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::CreateContentLayoutItem( |
- CXFA_Node* pFormNode) { |
- if (!pFormNode) { |
- return NULL; |
- } |
- CXFA_ContentLayoutItem* pLayoutItem = NULL; |
- if (m_pOldLayoutItem) { |
- pLayoutItem = m_pOldLayoutItem; |
- m_pOldLayoutItem = m_pOldLayoutItem->m_pNext; |
- return pLayoutItem; |
- } |
- pLayoutItem = (CXFA_ContentLayoutItem*)pFormNode->GetDocument() |
- ->GetParser() |
- ->GetNotify() |
- ->OnCreateLayoutItem(pFormNode); |
- CXFA_ContentLayoutItem* pPrevLayoutItem = |
- (CXFA_ContentLayoutItem*)pFormNode->GetUserData(XFA_LAYOUTITEMKEY); |
- if (pPrevLayoutItem) { |
- while (pPrevLayoutItem->m_pNext) { |
- pPrevLayoutItem = pPrevLayoutItem->m_pNext; |
- } |
- pPrevLayoutItem->m_pNext = pLayoutItem; |
- pLayoutItem->m_pPrev = pPrevLayoutItem; |
- } else { |
- pFormNode->SetUserData(XFA_LAYOUTITEMKEY, pLayoutItem); |
- } |
- return pLayoutItem; |
-} |
-FX_BOOL CXFA_ItemLayoutProcessor::FindLayoutItemSplitPos( |
- CXFA_ContentLayoutItem* pLayoutItem, |
- FX_FLOAT fCurVerticalOffset, |
- FX_FLOAT& fProposedSplitPos, |
- FX_BOOL& bAppChange, |
- FX_BOOL bCalculateMargin) { |
- CXFA_Node* pFormNode = pLayoutItem->m_pFormNode; |
- if (fProposedSplitPos > fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION && |
- fProposedSplitPos <= fCurVerticalOffset + pLayoutItem->m_sSize.y - |
- XFA_LAYOUT_FLOAT_PERCISION) { |
- switch (pFormNode->GetIntact()) { |
- case XFA_ATTRIBUTEENUM_None: { |
- FX_BOOL bAnyChanged = FALSE; |
- CXFA_Document* pDocument = pFormNode->GetDocument(); |
- IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify(); |
- FX_FLOAT fCurTopMargin = 0, fCurBottomMargin = 0; |
- CXFA_Node* pMarginNode = |
- pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); |
- if (pMarginNode && bCalculateMargin) { |
- fCurTopMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset) |
- .ToUnit(XFA_UNIT_Pt); |
- fCurBottomMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset) |
- .ToUnit(XFA_UNIT_Pt); |
- } |
- FX_BOOL bChanged = TRUE; |
- while (bChanged) { |
- bChanged = FALSE; |
- { |
- FX_FLOAT fRelSplitPos = fProposedSplitPos - fCurVerticalOffset; |
- if (pNotify->FindSplitPos(pFormNode, pLayoutItem->GetIndex(), |
- fRelSplitPos)) { |
- bAnyChanged = TRUE; |
- bChanged = TRUE; |
- fProposedSplitPos = fCurVerticalOffset + fRelSplitPos; |
- bAppChange = TRUE; |
- if (fProposedSplitPos <= |
- fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION) { |
- return TRUE; |
- } |
- } |
- } |
- FX_FLOAT fRelSplitPos = fProposedSplitPos - fCurBottomMargin; |
- for (CXFA_ContentLayoutItem* pChildItem = |
- (CXFA_ContentLayoutItem*)pLayoutItem->m_pFirstChild; |
- pChildItem; |
- pChildItem = |
- (CXFA_ContentLayoutItem*)pChildItem->m_pNextSibling) { |
- FX_FLOAT fChildOffset = |
- fCurVerticalOffset + fCurTopMargin + pChildItem->m_sPos.y; |
- FX_BOOL bAppChange = FALSE; |
- if (FindLayoutItemSplitPos(pChildItem, fChildOffset, fRelSplitPos, |
- bAppChange, bCalculateMargin)) { |
- if (fRelSplitPos - fChildOffset < XFA_LAYOUT_FLOAT_PERCISION && |
- bAppChange) { |
- fProposedSplitPos = fRelSplitPos - fCurTopMargin; |
- } else { |
- fProposedSplitPos = fRelSplitPos + fCurBottomMargin; |
- } |
- bAnyChanged = TRUE; |
- bChanged = TRUE; |
- if (fProposedSplitPos <= |
- fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION) { |
- return TRUE; |
- } |
- if (bAnyChanged) { |
- break; |
- } |
- } |
- } |
- } |
- return bAnyChanged; |
- } break; |
- case XFA_ATTRIBUTEENUM_ContentArea: |
- case XFA_ATTRIBUTEENUM_PageArea: { |
- fProposedSplitPos = fCurVerticalOffset; |
- return TRUE; |
- } |
- default: |
- return FALSE; |
- } |
- } |
- return FALSE; |
-} |
-static XFA_ATTRIBUTEENUM XFA_ItemLayoutProcessor_GetLayout( |
- CXFA_Node* pFormNode, |
- FX_BOOL& bRootForceTb) { |
- bRootForceTb = FALSE; |
- XFA_ATTRIBUTEENUM eLayoutMode; |
- if (pFormNode->TryEnum(XFA_ATTRIBUTE_Layout, eLayoutMode, FALSE)) { |
- return eLayoutMode; |
- } |
- CXFA_Node* pParentNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent); |
- if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_Form) { |
- bRootForceTb = TRUE; |
- return XFA_ATTRIBUTEENUM_Tb; |
- } |
- return XFA_ATTRIBUTEENUM_Position; |
-} |
-static FX_BOOL XFA_ExistContainerKeep(CXFA_Node* pCurNode, FX_BOOL bPreFind) { |
- if (pCurNode == NULL || !XFA_ItemLayoutProcessor_IsTakingSpace(pCurNode)) { |
- return FALSE; |
- } |
- XFA_NODEITEM eItemType = XFA_NODEITEM_PrevSibling; |
- if (!bPreFind) { |
- eItemType = XFA_NODEITEM_NextSibling; |
- } |
- CXFA_Node* pPreContainer = |
- pCurNode->GetNodeItem(eItemType, XFA_OBJECTTYPE_ContainerNode); |
- if (pPreContainer == NULL) { |
- return FALSE; |
- } |
- CXFA_Node* pKeep = pCurNode->GetFirstChildByClass(XFA_ELEMENT_Keep); |
- if (pKeep) { |
- XFA_ATTRIBUTEENUM ePrevious; |
- XFA_ATTRIBUTE eKeepType = XFA_ATTRIBUTE_Previous; |
- if (!bPreFind) { |
- eKeepType = XFA_ATTRIBUTE_Next; |
- } |
- if (pKeep->TryEnum(eKeepType, ePrevious, FALSE)) { |
- if (ePrevious == XFA_ATTRIBUTEENUM_ContentArea || |
- ePrevious == XFA_ATTRIBUTEENUM_PageArea) { |
- return TRUE; |
- } |
- } |
- } |
- pKeep = pPreContainer->GetFirstChildByClass(XFA_ELEMENT_Keep); |
- if (!pKeep) { |
- return FALSE; |
- } |
- XFA_ATTRIBUTEENUM eNext; |
- XFA_ATTRIBUTE eKeepType = XFA_ATTRIBUTE_Next; |
- if (!bPreFind) { |
- eKeepType = XFA_ATTRIBUTE_Previous; |
- } |
- if (!pKeep->TryEnum(eKeepType, eNext, FALSE)) { |
- return FALSE; |
- } |
- if (eNext == XFA_ATTRIBUTEENUM_ContentArea || |
- eNext == XFA_ATTRIBUTEENUM_PageArea) { |
- return TRUE; |
- } |
- return FALSE; |
-} |
-FX_FLOAT CXFA_ItemLayoutProcessor::FindSplitPos(FX_FLOAT fProposedSplitPos) { |
- ASSERT(m_pLayoutItem); |
- XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); |
- FX_BOOL bCalculateMargin = TRUE; |
- if (eLayout == XFA_ATTRIBUTEENUM_Position) { |
- bCalculateMargin = FALSE; |
- } |
- while (fProposedSplitPos > XFA_LAYOUT_FLOAT_PERCISION) { |
- FX_BOOL bAppChange = FALSE; |
- if (!FindLayoutItemSplitPos(m_pLayoutItem, 0, fProposedSplitPos, bAppChange, |
- bCalculateMargin)) { |
- break; |
- } |
- } |
- return fProposedSplitPos; |
-} |
-void CXFA_ItemLayoutProcessor::SplitLayoutItem( |
- CXFA_ContentLayoutItem* pLayoutItem, |
- CXFA_ContentLayoutItem* pSecondParent, |
- FX_FLOAT fSplitPos) { |
- FX_FLOAT fCurTopMargin = 0, fCurBottomMargin = 0; |
- XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); |
- FX_BOOL bCalculateMargin = TRUE; |
- if (eLayout == XFA_ATTRIBUTEENUM_Position) { |
- bCalculateMargin = FALSE; |
- } |
- CXFA_Node* pMarginNode = |
- pLayoutItem->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); |
- if (pMarginNode && bCalculateMargin) { |
- fCurTopMargin = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt); |
- fCurBottomMargin = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt); |
- } |
- CXFA_ContentLayoutItem* pSecondLayoutItem = NULL; |
- if (m_pCurChildPreprocessor && |
- m_pCurChildPreprocessor->m_pFormNode == pLayoutItem->m_pFormNode) { |
- pSecondLayoutItem = m_pCurChildPreprocessor->CreateContentLayoutItem( |
- pLayoutItem->m_pFormNode); |
- } else { |
- pSecondLayoutItem = CreateContentLayoutItem(pLayoutItem->m_pFormNode); |
- } |
- pSecondLayoutItem->m_sPos.x = pLayoutItem->m_sPos.x; |
- pSecondLayoutItem->m_sSize.x = pLayoutItem->m_sSize.x; |
- pSecondLayoutItem->m_sPos.y = 0; |
- pSecondLayoutItem->m_sSize.y = pLayoutItem->m_sSize.y - fSplitPos; |
- pLayoutItem->m_sSize.y -= pSecondLayoutItem->m_sSize.y; |
- if (pLayoutItem->m_pFirstChild) { |
- pSecondLayoutItem->m_sSize.y += fCurTopMargin; |
- } |
- if (pSecondParent) { |
- pSecondParent->AddChild(pSecondLayoutItem); |
- if (fCurTopMargin > 0 && pLayoutItem->m_pFirstChild) { |
- pSecondParent->m_sSize.y += fCurTopMargin; |
- CXFA_ContentLayoutItem* pParentItem = |
- (CXFA_ContentLayoutItem*)pSecondParent->m_pParent; |
- while (pParentItem) { |
- pParentItem->m_sSize.y += fCurTopMargin; |
- pParentItem = (CXFA_ContentLayoutItem*)pParentItem->m_pParent; |
- } |
- } |
- } else { |
- pSecondLayoutItem->m_pParent = pLayoutItem->m_pParent; |
- pSecondLayoutItem->m_pNextSibling = pLayoutItem->m_pNextSibling; |
- pLayoutItem->m_pNextSibling = pSecondLayoutItem; |
- } |
- CXFA_ContentLayoutItem* pChildren = |
- (CXFA_ContentLayoutItem*)pLayoutItem->m_pFirstChild; |
- pLayoutItem->m_pFirstChild = NULL; |
- FX_FLOAT lHeightForKeep = 0; |
- CFX_ArrayTemplate<CXFA_ContentLayoutItem*> keepLayoutItems; |
- FX_FLOAT fAddMarginHeight = 0; |
- for (CXFA_ContentLayoutItem *pChildItem = pChildren, *pChildNext = NULL; |
- pChildItem; pChildItem = pChildNext) { |
- pChildNext = (CXFA_ContentLayoutItem*)pChildItem->m_pNextSibling; |
- pChildItem->m_pNextSibling = NULL; |
- if (fSplitPos <= fCurTopMargin + pChildItem->m_sPos.y + fCurBottomMargin + |
- XFA_LAYOUT_FLOAT_PERCISION) { |
- if (!XFA_ExistContainerKeep(pChildItem->m_pFormNode, TRUE)) { |
- pChildItem->m_sPos.y -= fSplitPos - fCurBottomMargin; |
- pChildItem->m_sPos.y += lHeightForKeep; |
- pChildItem->m_sPos.y += fAddMarginHeight; |
- pSecondLayoutItem->AddChild(pChildItem); |
- } else { |
- if (lHeightForKeep < XFA_LAYOUT_FLOAT_PERCISION) { |
- for (int32_t iIndex = 0; iIndex < keepLayoutItems.GetSize(); |
- iIndex++) { |
- CXFA_ContentLayoutItem* pPreItem = keepLayoutItems[iIndex]; |
- pLayoutItem->RemoveChild(pPreItem); |
- pPreItem->m_sPos.y -= fSplitPos; |
- if (pPreItem->m_sPos.y < 0) { |
- pPreItem->m_sPos.y = 0; |
- } |
- if (pPreItem->m_sPos.y + pPreItem->m_sSize.y > lHeightForKeep) { |
- pPreItem->m_sPos.y = lHeightForKeep; |
- lHeightForKeep += pPreItem->m_sSize.y; |
- pSecondLayoutItem->m_sSize.y += pPreItem->m_sSize.y; |
- if (pSecondParent) { |
- pSecondParent->m_sSize.y += pPreItem->m_sSize.y; |
- } |
- } |
- pSecondLayoutItem->AddChild(pPreItem); |
- } |
- } |
- pChildItem->m_sPos.y -= fSplitPos; |
- pChildItem->m_sPos.y += lHeightForKeep; |
- pChildItem->m_sPos.y += fAddMarginHeight; |
- pSecondLayoutItem->AddChild(pChildItem); |
- } |
- } else if (fSplitPos + XFA_LAYOUT_FLOAT_PERCISION >= |
- fCurTopMargin + fCurBottomMargin + pChildItem->m_sPos.y + |
- pChildItem->m_sSize.y) { |
- pLayoutItem->AddChild(pChildItem); |
- if (XFA_ExistContainerKeep(pChildItem->m_pFormNode, FALSE)) { |
- keepLayoutItems.Add(pChildItem); |
- } else { |
- keepLayoutItems.RemoveAll(); |
- } |
- } else { |
- FX_FLOAT fOldHeight = pSecondLayoutItem->m_sSize.y; |
- SplitLayoutItem( |
- pChildItem, pSecondLayoutItem, |
- fSplitPos - fCurTopMargin - fCurBottomMargin - pChildItem->m_sPos.y); |
- fAddMarginHeight = pSecondLayoutItem->m_sSize.y - fOldHeight; |
- pLayoutItem->AddChild(pChildItem); |
- } |
- } |
-} |
-void CXFA_ItemLayoutProcessor::SplitLayoutItem(FX_FLOAT fSplitPos) { |
- ASSERT(m_pLayoutItem); |
- SplitLayoutItem(m_pLayoutItem, NULL, fSplitPos); |
-} |
- |
-IXFA_LayoutPage* CXFA_LayoutItem::GetPage() const { |
- for (CXFA_LayoutItem* pCurNode = const_cast<CXFA_LayoutItem*>(this); pCurNode; |
- pCurNode = pCurNode->m_pParent) { |
- if (pCurNode->m_pFormNode->GetClassID() == XFA_ELEMENT_PageArea) |
- return static_cast<CXFA_ContainerLayoutItem*>(pCurNode); |
- } |
- return nullptr; |
-} |
- |
-CXFA_Node* CXFA_LayoutItem::GetFormNode() const { |
- return m_pFormNode; |
-} |
- |
-void CXFA_LayoutItem::GetRect(CFX_RectF& rtLayout, FX_BOOL bRelative) const { |
- ASSERT(m_bIsContentLayoutItem); |
- const CXFA_ContentLayoutItem* pThis = |
- static_cast<const CXFA_ContentLayoutItem*>(this); |
- CFX_PointF sPos = pThis->m_sPos; |
- CFX_SizeF sSize = pThis->m_sSize; |
- if (!bRelative) { |
- for (CXFA_LayoutItem* pLayoutItem = pThis->m_pParent; pLayoutItem; |
- pLayoutItem = pLayoutItem->m_pParent) { |
- if (CXFA_ContentLayoutItem* pContent = |
- pLayoutItem->AsContentLayoutItem()) { |
- sPos += pContent->m_sPos; |
- if (CXFA_Node* pMarginNode = |
- pLayoutItem->m_pFormNode->GetFirstChildByClass( |
- XFA_ELEMENT_Margin)) { |
- sPos += CFX_PointF(pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset) |
- .ToUnit(XFA_UNIT_Pt), |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset) |
- .ToUnit(XFA_UNIT_Pt)); |
- } |
- } else { |
- if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) { |
- sPos += |
- CFX_PointF(pLayoutItem->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_X) |
- .ToUnit(XFA_UNIT_Pt), |
- pLayoutItem->m_pFormNode->GetMeasure(XFA_ATTRIBUTE_Y) |
- .ToUnit(XFA_UNIT_Pt)); |
- break; |
- } else if (pLayoutItem->m_pFormNode->GetClassID() == |
- XFA_ELEMENT_PageArea) { |
- break; |
- } |
- } |
- } |
- } |
- rtLayout.Set(sPos.x, sPos.y, sSize.x, sSize.y); |
-} |
- |
-CXFA_LayoutItem* CXFA_LayoutItem::GetParent() const { |
- return m_pParent; |
-} |
- |
-const CXFA_LayoutItem* CXFA_LayoutItem::GetFirst() const { |
- ASSERT(m_bIsContentLayoutItem); |
- const CXFA_ContentLayoutItem* pCurNode = |
- static_cast<const CXFA_ContentLayoutItem*>(this); |
- while (pCurNode->m_pPrev) { |
- pCurNode = pCurNode->m_pPrev; |
- } |
- return pCurNode; |
-} |
- |
-CXFA_LayoutItem* CXFA_LayoutItem::GetFirst() { |
- ASSERT(m_bIsContentLayoutItem); |
- CXFA_ContentLayoutItem* pCurNode = static_cast<CXFA_ContentLayoutItem*>(this); |
- while (pCurNode->m_pPrev) { |
- pCurNode = pCurNode->m_pPrev; |
- } |
- return pCurNode; |
-} |
- |
-CXFA_LayoutItem* CXFA_LayoutItem::GetLast() { |
- ASSERT(m_bIsContentLayoutItem); |
- CXFA_ContentLayoutItem* pCurNode = static_cast<CXFA_ContentLayoutItem*>(this); |
- while (pCurNode->m_pNext) { |
- pCurNode = pCurNode->m_pNext; |
- } |
- return pCurNode; |
-} |
- |
-const CXFA_LayoutItem* CXFA_LayoutItem::GetLast() const { |
- ASSERT(m_bIsContentLayoutItem); |
- const CXFA_ContentLayoutItem* pCurNode = |
- static_cast<const CXFA_ContentLayoutItem*>(this); |
- while (pCurNode->m_pNext) { |
- pCurNode = pCurNode->m_pNext; |
- } |
- return pCurNode; |
-} |
- |
-CXFA_LayoutItem* CXFA_LayoutItem::GetPrev() const { |
- ASSERT(m_bIsContentLayoutItem); |
- return static_cast<const CXFA_ContentLayoutItem*>(this)->m_pPrev; |
-} |
- |
-CXFA_LayoutItem* CXFA_LayoutItem::GetNext() const { |
- ASSERT(m_bIsContentLayoutItem); |
- return static_cast<const CXFA_ContentLayoutItem*>(this)->m_pNext; |
-} |
- |
-int32_t CXFA_LayoutItem::GetIndex() const { |
- ASSERT(m_bIsContentLayoutItem); |
- int32_t iIndex = 0; |
- const CXFA_ContentLayoutItem* pCurNode = |
- static_cast<const CXFA_ContentLayoutItem*>(this); |
- while (pCurNode->m_pPrev) { |
- pCurNode = pCurNode->m_pPrev; |
- ++iIndex; |
- } |
- return iIndex; |
-} |
- |
-int32_t CXFA_LayoutItem::GetCount() const { |
- ASSERT(m_bIsContentLayoutItem); |
- int32_t iCount = GetIndex() + 1; |
- const CXFA_ContentLayoutItem* pCurNode = |
- static_cast<const CXFA_ContentLayoutItem*>(this); |
- while (pCurNode->m_pNext) { |
- pCurNode = pCurNode->m_pNext; |
- iCount++; |
- } |
- return iCount; |
-} |
- |
-void CXFA_LayoutItem::AddChild(CXFA_LayoutItem* pChildItem) { |
- if (pChildItem->m_pParent) { |
- pChildItem->m_pParent->RemoveChild(pChildItem); |
- } |
- pChildItem->m_pParent = this; |
- if (m_pFirstChild == NULL) { |
- m_pFirstChild = pChildItem; |
- } else { |
- CXFA_LayoutItem* pExistingChildItem = m_pFirstChild; |
- while (pExistingChildItem->m_pNextSibling) { |
- pExistingChildItem = pExistingChildItem->m_pNextSibling; |
- } |
- pExistingChildItem->m_pNextSibling = pChildItem; |
- } |
-} |
-void CXFA_LayoutItem::AddHeadChild(CXFA_LayoutItem* pChildItem) { |
- if (pChildItem->m_pParent) { |
- pChildItem->m_pParent->RemoveChild(pChildItem); |
- } |
- pChildItem->m_pParent = this; |
- if (m_pFirstChild == NULL) { |
- m_pFirstChild = pChildItem; |
- } else { |
- CXFA_LayoutItem* pExistingChildItem = m_pFirstChild; |
- m_pFirstChild = pChildItem; |
- m_pFirstChild->m_pNextSibling = pExistingChildItem; |
- } |
-} |
-void CXFA_LayoutItem::InsertChild(CXFA_LayoutItem* pBeforeItem, |
- CXFA_LayoutItem* pChildItem) { |
- if (pBeforeItem->m_pParent != this) { |
- return; |
- } |
- if (pChildItem->m_pParent) { |
- pChildItem->m_pParent = NULL; |
- } |
- pChildItem->m_pParent = this; |
- CXFA_LayoutItem* pExistingChildItem = pBeforeItem->m_pNextSibling; |
- pBeforeItem->m_pNextSibling = pChildItem; |
- pChildItem->m_pNextSibling = pExistingChildItem; |
-} |
-void CXFA_LayoutItem::RemoveChild(CXFA_LayoutItem* pChildItem) { |
- if (pChildItem->m_pParent != this) { |
- return; |
- } |
- if (m_pFirstChild == pChildItem) { |
- m_pFirstChild = pChildItem->m_pNextSibling; |
- } else { |
- CXFA_LayoutItem* pExistingChildItem = m_pFirstChild; |
- while (pExistingChildItem && |
- pExistingChildItem->m_pNextSibling != pChildItem) { |
- pExistingChildItem = pExistingChildItem->m_pNextSibling; |
- } |
- if (pExistingChildItem) { |
- pExistingChildItem->m_pNextSibling = pChildItem->m_pNextSibling; |
- } |
- } |
- pChildItem->m_pNextSibling = NULL; |
- pChildItem->m_pParent = NULL; |
-} |
-CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::ExtractLayoutItem() { |
- CXFA_ContentLayoutItem* pLayoutItem = m_pLayoutItem; |
- if (pLayoutItem) { |
- m_pLayoutItem = (CXFA_ContentLayoutItem*)pLayoutItem->m_pNextSibling; |
- pLayoutItem->m_pNextSibling = NULL; |
- } |
- if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done && |
- ToContentLayoutItem(m_pOldLayoutItem)) { |
- if (m_pOldLayoutItem->m_pPrev) { |
- m_pOldLayoutItem->m_pPrev->m_pNext = NULL; |
- } |
- IXFA_Notify* pNotify = |
- m_pOldLayoutItem->m_pFormNode->GetDocument()->GetParser()->GetNotify(); |
- IXFA_DocLayout* pDocLayout = |
- m_pOldLayoutItem->m_pFormNode->GetDocument()->GetDocLayout(); |
- CXFA_ContentLayoutItem* pOldLayoutItem = m_pOldLayoutItem; |
- while (pOldLayoutItem) { |
- CXFA_ContentLayoutItem* pNextOldLayoutItem = pOldLayoutItem->m_pNext; |
- pNotify->OnLayoutEvent(pDocLayout, pOldLayoutItem, |
- XFA_LAYOUTEVENT_ItemRemoving); |
- delete pOldLayoutItem; |
- pOldLayoutItem = pNextOldLayoutItem; |
- } |
- m_pOldLayoutItem = NULL; |
- } |
- return pLayoutItem; |
-} |
-static FX_BOOL XFA_ItemLayoutProcessor_FindBreakNode( |
- CXFA_Node* pContainerNode, |
- CXFA_Node*& pCurActionNode, |
- XFA_ItemLayoutProcessorStages& nCurStage, |
- FX_BOOL bBreakBefore) { |
- FX_BOOL bFindRs = FALSE; |
- for (CXFA_Node* pBreakNode = pContainerNode; pBreakNode; |
- pBreakNode = pBreakNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
- XFA_ATTRIBUTE eAttributeType = XFA_ATTRIBUTE_Before; |
- if (!bBreakBefore) { |
- eAttributeType = XFA_ATTRIBUTE_After; |
- } |
- switch (pBreakNode->GetClassID()) { |
- case XFA_ELEMENT_BreakBefore: { |
- if (bBreakBefore) { |
- pCurActionNode = pBreakNode; |
- nCurStage = XFA_ItemLayoutProcessorStages_BreakBefore; |
- bFindRs = TRUE; |
- } |
- } break; |
- case XFA_ELEMENT_BreakAfter: { |
- if (!bBreakBefore) { |
- pCurActionNode = pBreakNode; |
- nCurStage = XFA_ItemLayoutProcessorStages_BreakAfter; |
- bFindRs = TRUE; |
- } |
- } break; |
- case XFA_ELEMENT_Break: |
- if (pBreakNode->GetEnum(eAttributeType) != XFA_ATTRIBUTEENUM_Auto) { |
- pCurActionNode = pBreakNode; |
- nCurStage = XFA_ItemLayoutProcessorStages_BreakBefore; |
- if (!bBreakBefore) { |
- nCurStage = XFA_ItemLayoutProcessorStages_BreakAfter; |
- } |
- bFindRs = TRUE; |
- break; |
- } |
- default: |
- break; |
- } |
- if (bFindRs) { |
- break; |
- } |
- } |
- return bFindRs; |
-} |
-static void XFA_DeleteLayoutGeneratedNode(CXFA_Node* pGenerateNode) { |
- IXFA_Notify* pNotify = pGenerateNode->GetDocument()->GetParser()->GetNotify(); |
- IXFA_DocLayout* pDocLayout = pGenerateNode->GetDocument()->GetDocLayout(); |
- CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> sIterator( |
- pGenerateNode); |
- for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode; |
- pNode = sIterator.MoveToNext()) { |
- CXFA_ContentLayoutItem* pCurLayoutItem = |
- (CXFA_ContentLayoutItem*)pNode->GetUserData(XFA_LAYOUTITEMKEY); |
- CXFA_ContentLayoutItem* pNextLayoutItem = NULL; |
- while (pCurLayoutItem) { |
- pNextLayoutItem = pCurLayoutItem->m_pNext; |
- pNotify->OnLayoutEvent(pDocLayout, pCurLayoutItem, |
- XFA_LAYOUTEVENT_ItemRemoving); |
- delete pCurLayoutItem; |
- pCurLayoutItem = pNextLayoutItem; |
- } |
- } |
- pGenerateNode->GetNodeItem(XFA_NODEITEM_Parent)->RemoveChild(pGenerateNode); |
-} |
-void CXFA_ItemLayoutProcessor::XFA_ItemLayoutProcessor_GotoNextContainerNode( |
- CXFA_Node*& pCurActionNode, |
- XFA_ItemLayoutProcessorStages& nCurStage, |
- CXFA_Node* pParentContainer, |
- FX_BOOL bUsePageBreak) { |
- CXFA_Node* pEntireContainer = pParentContainer; |
- CXFA_Node* pChildContainer = XFA_LAYOUT_INVALIDNODE; |
- switch (nCurStage) { |
- case XFA_ItemLayoutProcessorStages_BreakBefore: |
- case XFA_ItemLayoutProcessorStages_BreakAfter: { |
- pChildContainer = pCurActionNode->GetNodeItem(XFA_NODEITEM_Parent); |
- } break; |
- case XFA_ItemLayoutProcessorStages_Keep: |
- case XFA_ItemLayoutProcessorStages_Container: |
- pChildContainer = pCurActionNode; |
- break; |
- default: |
- pChildContainer = XFA_LAYOUT_INVALIDNODE; |
- break; |
- } |
- switch (nCurStage) { |
- case XFA_ItemLayoutProcessorStages_Keep: { |
- CXFA_Node* pBreakAfterNode = |
- pChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild); |
- if (!m_bKeepBreakFinish && |
- XFA_ItemLayoutProcessor_FindBreakNode(pBreakAfterNode, pCurActionNode, |
- nCurStage, FALSE)) { |
- return; |
- } |
- goto CheckNextChildContainer; |
- } |
- case XFA_ItemLayoutProcessorStages_None: { |
- pCurActionNode = XFA_LAYOUT_INVALIDNODE; |
- case XFA_ItemLayoutProcessorStages_BookendLeader: |
- for (CXFA_Node* pBookendNode = |
- pCurActionNode == XFA_LAYOUT_INVALIDNODE |
- ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild) |
- : pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
- pBookendNode; pBookendNode = pBookendNode->GetNodeItem( |
- XFA_NODEITEM_NextSibling)) { |
- switch (pBookendNode->GetClassID()) { |
- case XFA_ELEMENT_Bookend: |
- case XFA_ELEMENT_Break: |
- pCurActionNode = pBookendNode; |
- nCurStage = XFA_ItemLayoutProcessorStages_BookendLeader; |
- return; |
- default: |
- break; |
- } |
- } |
- } |
- { |
- pCurActionNode = XFA_LAYOUT_INVALIDNODE; |
- case XFA_ItemLayoutProcessorStages_BreakBefore: |
- if (pCurActionNode != XFA_LAYOUT_INVALIDNODE) { |
- CXFA_Node* pBreakBeforeNode = |
- pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
- if (!m_bKeepBreakFinish && |
- XFA_ItemLayoutProcessor_FindBreakNode( |
- pBreakBeforeNode, pCurActionNode, nCurStage, TRUE)) { |
- return; |
- } |
- if (m_bIsProcessKeep) { |
- if (ProcessKeepNodesForBreakBefore(pCurActionNode, nCurStage, |
- pChildContainer)) { |
- return; |
- } |
- goto CheckNextChildContainer; |
- } |
- pCurActionNode = pChildContainer; |
- nCurStage = XFA_ItemLayoutProcessorStages_Container; |
- return; |
- } |
- goto CheckNextChildContainer; |
- } |
- case XFA_ItemLayoutProcessorStages_Container: { |
- pCurActionNode = XFA_LAYOUT_INVALIDNODE; |
- case XFA_ItemLayoutProcessorStages_BreakAfter: { |
- if (pCurActionNode == XFA_LAYOUT_INVALIDNODE) { |
- CXFA_Node* pBreakAfterNode = |
- pChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild); |
- if (!m_bKeepBreakFinish && |
- XFA_ItemLayoutProcessor_FindBreakNode( |
- pBreakAfterNode, pCurActionNode, nCurStage, FALSE)) { |
- return; |
- } |
- } else { |
- CXFA_Node* pBreakAfterNode = |
- pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
- if (XFA_ItemLayoutProcessor_FindBreakNode( |
- pBreakAfterNode, pCurActionNode, nCurStage, FALSE)) { |
- return; |
- } |
- } |
- goto CheckNextChildContainer; |
- } |
- } |
- CheckNextChildContainer : { |
- CXFA_Node* pNextChildContainer = |
- pChildContainer == XFA_LAYOUT_INVALIDNODE |
- ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild, |
- XFA_OBJECTTYPE_ContainerNode) |
- : pChildContainer->GetNodeItem(XFA_NODEITEM_NextSibling, |
- XFA_OBJECTTYPE_ContainerNode); |
- while (pNextChildContainer && |
- pNextChildContainer->HasFlag(XFA_NODEFLAG_LayoutGeneratedNode)) { |
- CXFA_Node* pSaveNode = pNextChildContainer; |
- pNextChildContainer = pNextChildContainer->GetNodeItem( |
- XFA_NODEITEM_NextSibling, XFA_OBJECTTYPE_ContainerNode); |
- if (pSaveNode->HasFlag(XFA_NODEFLAG_UnusedNode)) { |
- XFA_DeleteLayoutGeneratedNode(pSaveNode); |
- } |
- } |
- if (!pNextChildContainer) { |
- goto NoMoreChildContainer; |
- } |
- FX_BOOL bLastKeep = FALSE; |
- if (ProcessKeepNodesForCheckNext(pCurActionNode, nCurStage, |
- pNextChildContainer, bLastKeep)) { |
- return; |
- } |
- if (!m_bKeepBreakFinish && !bLastKeep && |
- XFA_ItemLayoutProcessor_FindBreakNode( |
- pNextChildContainer->GetNodeItem(XFA_NODEITEM_FirstChild), |
- pCurActionNode, nCurStage, TRUE)) { |
- return; |
- } |
- pCurActionNode = pNextChildContainer; |
- if (m_bIsProcessKeep) { |
- nCurStage = XFA_ItemLayoutProcessorStages_Keep; |
- } else { |
- nCurStage = XFA_ItemLayoutProcessorStages_Container; |
- } |
- return; |
- } |
- NoMoreChildContainer : { |
- pCurActionNode = XFA_LAYOUT_INVALIDNODE; |
- case XFA_ItemLayoutProcessorStages_BookendTrailer: |
- for (CXFA_Node* pBookendNode = |
- pCurActionNode == XFA_LAYOUT_INVALIDNODE |
- ? pEntireContainer->GetNodeItem(XFA_NODEITEM_FirstChild) |
- : pCurActionNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
- pBookendNode; pBookendNode = pBookendNode->GetNodeItem( |
- XFA_NODEITEM_NextSibling)) { |
- switch (pBookendNode->GetClassID()) { |
- case XFA_ELEMENT_Bookend: |
- case XFA_ELEMENT_Break: |
- pCurActionNode = pBookendNode; |
- nCurStage = XFA_ItemLayoutProcessorStages_BookendTrailer; |
- return; |
- default: |
- break; |
- } |
- } |
- } |
- default: |
- pCurActionNode = NULL; |
- nCurStage = XFA_ItemLayoutProcessorStages_Done; |
- } |
-} |
-FX_BOOL CXFA_ItemLayoutProcessor::ProcessKeepNodesForCheckNext( |
- CXFA_Node*& pCurActionNode, |
- XFA_ItemLayoutProcessorStages& nCurStage, |
- CXFA_Node*& pNextContainer, |
- FX_BOOL& bLastKeepNode) { |
- const bool bCanSplit = pNextContainer->GetIntact() == XFA_ATTRIBUTEENUM_None; |
- FX_BOOL bNextKeep = FALSE; |
- if (XFA_ExistContainerKeep(pNextContainer, FALSE)) { |
- bNextKeep = TRUE; |
- } |
- if (bNextKeep && !bCanSplit) { |
- if (!m_bIsProcessKeep && !m_bKeepBreakFinish) { |
- m_pKeepHeadNode = pNextContainer; |
- m_bIsProcessKeep = TRUE; |
- } |
- } else { |
- if (m_bIsProcessKeep && m_pKeepHeadNode) { |
- m_pKeepTailNode = pNextContainer; |
- if (!m_bKeepBreakFinish && |
- XFA_ItemLayoutProcessor_FindBreakNode( |
- pNextContainer->GetNodeItem(XFA_NODEITEM_FirstChild), |
- pCurActionNode, nCurStage, TRUE)) { |
- return TRUE; |
- } else { |
- pNextContainer = m_pKeepHeadNode; |
- m_bKeepBreakFinish = TRUE; |
- m_pKeepHeadNode = NULL; |
- m_pKeepTailNode = NULL; |
- m_bIsProcessKeep = FALSE; |
- } |
- } else { |
- if (m_bKeepBreakFinish) { |
- bLastKeepNode = TRUE; |
- } |
- m_bKeepBreakFinish = FALSE; |
- } |
- } |
- return FALSE; |
-} |
-FX_BOOL CXFA_ItemLayoutProcessor::ProcessKeepNodesForBreakBefore( |
- CXFA_Node*& pCurActionNode, |
- XFA_ItemLayoutProcessorStages& nCurStage, |
- CXFA_Node* pContainerNode) { |
- if (m_pKeepTailNode == pContainerNode) { |
- pCurActionNode = m_pKeepHeadNode; |
- m_bKeepBreakFinish = TRUE; |
- m_pKeepHeadNode = NULL; |
- m_pKeepTailNode = NULL; |
- m_bIsProcessKeep = FALSE; |
- nCurStage = XFA_ItemLayoutProcessorStages_Container; |
- return TRUE; |
- } |
- CXFA_Node* pBreakAfterNode = |
- pContainerNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
- if (XFA_ItemLayoutProcessor_FindBreakNode(pBreakAfterNode, pCurActionNode, |
- nCurStage, FALSE)) { |
- return TRUE; |
- } |
- return FALSE; |
-} |
-FX_BOOL XFA_ItemLayoutProcessor_IsTakingSpace(CXFA_Node* pNode) { |
- XFA_ATTRIBUTEENUM ePresence = pNode->GetEnum(XFA_ATTRIBUTE_Presence); |
- return ePresence == XFA_ATTRIBUTEENUM_Visible || |
- ePresence == XFA_ATTRIBUTEENUM_Invisible; |
-} |
-static inline void XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize( |
- CXFA_Node* pFormNode, |
- FX_FLOAT& fContainerWidth, |
- FX_FLOAT& fContainerHeight, |
- FX_BOOL& bContainerWidthAutoSize, |
- FX_BOOL& bContainerHeightAutoSize) { |
- fContainerWidth = 0; |
- fContainerHeight = 0; |
- bContainerWidthAutoSize = TRUE; |
- bContainerHeightAutoSize = TRUE; |
- XFA_ELEMENT eClassID = pFormNode->GetClassID(); |
- CXFA_Measurement mTmpValue; |
- if (bContainerWidthAutoSize && |
- (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup) && |
- pFormNode->TryMeasure(XFA_ATTRIBUTE_W, mTmpValue, FALSE) && |
- mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) { |
- fContainerWidth = mTmpValue.ToUnit(XFA_UNIT_Pt); |
- bContainerWidthAutoSize = FALSE; |
- } |
- if (bContainerHeightAutoSize && |
- (eClassID == XFA_ELEMENT_Subform || eClassID == XFA_ELEMENT_ExclGroup) && |
- pFormNode->TryMeasure(XFA_ATTRIBUTE_H, mTmpValue, FALSE) && |
- mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) { |
- fContainerHeight = mTmpValue.ToUnit(XFA_UNIT_Pt); |
- bContainerHeightAutoSize = FALSE; |
- } |
- if (bContainerWidthAutoSize && eClassID == XFA_ELEMENT_Subform && |
- pFormNode->TryMeasure(XFA_ATTRIBUTE_MaxW, mTmpValue, FALSE) && |
- mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) { |
- fContainerWidth = mTmpValue.ToUnit(XFA_UNIT_Pt); |
- bContainerWidthAutoSize = FALSE; |
- } |
- if (bContainerHeightAutoSize && eClassID == XFA_ELEMENT_Subform && |
- pFormNode->TryMeasure(XFA_ATTRIBUTE_MaxH, mTmpValue, FALSE) && |
- mTmpValue.GetValue() > XFA_LAYOUT_FLOAT_PERCISION) { |
- fContainerHeight = mTmpValue.ToUnit(XFA_UNIT_Pt); |
- bContainerHeightAutoSize = FALSE; |
- } |
-} |
-static inline void |
-XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize( |
- CXFA_Node* pFormNode, |
- FX_BOOL bContainerWidthAutoSize, |
- FX_FLOAT fContentCalculatedWidth, |
- FX_FLOAT& fContainerWidth, |
- FX_BOOL bContainerHeightAutoSize, |
- FX_FLOAT fContentCalculatedHeight, |
- FX_FLOAT& fContainerHeight) { |
- CXFA_Node* pMarginNode = pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); |
- CXFA_Measurement mTmpValue; |
- if (bContainerWidthAutoSize) { |
- fContainerWidth = fContentCalculatedWidth; |
- if (pMarginNode) { |
- if (pMarginNode->TryMeasure(XFA_ATTRIBUTE_LeftInset, mTmpValue, FALSE)) { |
- fContainerWidth += mTmpValue.ToUnit(XFA_UNIT_Pt); |
- } |
- if (pMarginNode->TryMeasure(XFA_ATTRIBUTE_RightInset, mTmpValue, FALSE)) { |
- fContainerWidth += mTmpValue.ToUnit(XFA_UNIT_Pt); |
- } |
- } |
- } |
- if (bContainerHeightAutoSize) { |
- fContainerHeight = fContentCalculatedHeight; |
- if (pMarginNode) { |
- if (pMarginNode->TryMeasure(XFA_ATTRIBUTE_TopInset, mTmpValue, FALSE)) { |
- fContainerHeight += mTmpValue.ToUnit(XFA_UNIT_Pt); |
- } |
- if (pMarginNode->TryMeasure(XFA_ATTRIBUTE_BottomInset, mTmpValue, |
- FALSE)) { |
- fContainerHeight += mTmpValue.ToUnit(XFA_UNIT_Pt); |
- } |
- } |
- } |
-} |
-void CXFA_ItemLayoutProcessor::CalculatePositionedContainerPos( |
- CXFA_Node* pNode, |
- FX_FLOAT fWidth, |
- FX_FLOAT fHeight, |
- FX_FLOAT& fAbsoluteX, |
- FX_FLOAT& fAbsoluteY) { |
- XFA_ATTRIBUTEENUM eAnchorType = pNode->GetEnum(XFA_ATTRIBUTE_AnchorType); |
- int32_t nAnchorType = 0; |
- switch (eAnchorType) { |
- case XFA_ATTRIBUTEENUM_TopLeft: |
- nAnchorType = 0; |
- break; |
- case XFA_ATTRIBUTEENUM_TopCenter: |
- nAnchorType = 1; |
- break; |
- case XFA_ATTRIBUTEENUM_TopRight: |
- nAnchorType = 2; |
- break; |
- case XFA_ATTRIBUTEENUM_MiddleLeft: |
- nAnchorType = 3; |
- break; |
- case XFA_ATTRIBUTEENUM_MiddleCenter: |
- nAnchorType = 4; |
- break; |
- case XFA_ATTRIBUTEENUM_MiddleRight: |
- nAnchorType = 5; |
- break; |
- case XFA_ATTRIBUTEENUM_BottomLeft: |
- nAnchorType = 6; |
- break; |
- case XFA_ATTRIBUTEENUM_BottomCenter: |
- nAnchorType = 7; |
- break; |
- case XFA_ATTRIBUTEENUM_BottomRight: |
- nAnchorType = 8; |
- break; |
- default: |
- break; |
- } |
- static const uint8_t nNextPos[4][9] = {{0, 1, 2, 3, 4, 5, 6, 7, 8}, |
- {6, 3, 0, 7, 4, 1, 8, 5, 2}, |
- {8, 7, 6, 5, 4, 3, 2, 1, 0}, |
- {2, 5, 8, 1, 4, 7, 0, 3, 6}}; |
- |
- FX_FLOAT fAnchorX = pNode->GetMeasure(XFA_ATTRIBUTE_X).ToUnit(XFA_UNIT_Pt); |
- FX_FLOAT fAnchorY = pNode->GetMeasure(XFA_ATTRIBUTE_Y).ToUnit(XFA_UNIT_Pt); |
- int32_t nRotate = |
- FXSYS_round(pNode->GetMeasure(XFA_ATTRIBUTE_Rotate).GetValue()); |
- nRotate = XFA_MapRotation(nRotate) / 90; |
- int32_t nAbsoluteAnchorType = nNextPos[nRotate][nAnchorType]; |
- fAbsoluteX = fAnchorX; |
- fAbsoluteY = fAnchorY; |
- switch (nAbsoluteAnchorType / 3) { |
- case 1: |
- fAbsoluteY -= fHeight / 2; |
- break; |
- case 2: |
- fAbsoluteY -= fHeight; |
- break; |
- default: |
- break; |
- } |
- switch (nAbsoluteAnchorType % 3) { |
- case 1: |
- fAbsoluteX -= fWidth / 2; |
- break; |
- case 2: |
- fAbsoluteX -= fWidth; |
- break; |
- default: |
- break; |
- } |
-} |
-FX_BOOL CXFA_ItemLayoutProcessor::IncrementRelayoutNode( |
- CXFA_LayoutProcessor* pLayoutProcessor, |
- CXFA_Node* pNode, |
- CXFA_Node* pParentNode) { |
- return FALSE; |
-} |
-void CXFA_ItemLayoutProcessor::DoLayoutPageArea( |
- CXFA_ContainerLayoutItem* pPageAreaLayoutItem) { |
- CXFA_Node* pFormNode = pPageAreaLayoutItem->m_pFormNode; |
- CXFA_Node* pCurChildNode = XFA_LAYOUT_INVALIDNODE; |
- XFA_ItemLayoutProcessorStages nCurChildNodeStage = |
- XFA_ItemLayoutProcessorStages_None; |
- CXFA_LayoutItem* pBeforeItem = NULL; |
- for (XFA_ItemLayoutProcessor_GotoNextContainerNode( |
- pCurChildNode, nCurChildNodeStage, pFormNode, FALSE); |
- pCurChildNode; XFA_ItemLayoutProcessor_GotoNextContainerNode( |
- pCurChildNode, nCurChildNodeStage, pFormNode, FALSE)) { |
- if (nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container) { |
- continue; |
- } |
- if (pCurChildNode->GetClassID() == XFA_ELEMENT_Variables) { |
- continue; |
- } |
- CXFA_ItemLayoutProcessor* pProcessor = |
- new CXFA_ItemLayoutProcessor(pCurChildNode, NULL); |
- pProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX); |
- if (!pProcessor->HasLayoutItem()) { |
- delete pProcessor; |
- continue; |
- } |
- FX_FLOAT fWidth, fHeight; |
- pProcessor->GetCurrentComponentSize(fWidth, fHeight); |
- FX_FLOAT fAbsoluteX = 0, fAbsoluteY = 0; |
- CalculatePositionedContainerPos(pCurChildNode, fWidth, fHeight, fAbsoluteX, |
- fAbsoluteY); |
- pProcessor->SetCurrentComponentPos(fAbsoluteX, fAbsoluteY); |
- CXFA_LayoutItem* pProcessItem = pProcessor->ExtractLayoutItem(); |
- if (pBeforeItem == NULL) { |
- pPageAreaLayoutItem->AddHeadChild(pProcessItem); |
- } else { |
- pPageAreaLayoutItem->InsertChild(pBeforeItem, pProcessItem); |
- } |
- pBeforeItem = pProcessItem; |
- delete pProcessor; |
- } |
- pBeforeItem = NULL; |
- CXFA_LayoutItem* pLayoutItem = pPageAreaLayoutItem->m_pFirstChild; |
- while (pLayoutItem) { |
- if (!pLayoutItem->IsContentLayoutItem() || |
- pLayoutItem->m_pFormNode->GetClassID() != XFA_ELEMENT_Draw) { |
- pLayoutItem = pLayoutItem->m_pNextSibling; |
- continue; |
- } |
- if (pLayoutItem->m_pFormNode->GetClassID() == XFA_ELEMENT_Draw) { |
- CXFA_LayoutItem* pNextLayoutItem = pLayoutItem->m_pNextSibling; |
- pPageAreaLayoutItem->RemoveChild(pLayoutItem); |
- if (pBeforeItem == NULL) { |
- pPageAreaLayoutItem->AddHeadChild(pLayoutItem); |
- } else { |
- pPageAreaLayoutItem->InsertChild(pBeforeItem, pLayoutItem); |
- } |
- pBeforeItem = pLayoutItem; |
- pLayoutItem = pNextLayoutItem; |
- } |
- } |
-} |
-void CXFA_ItemLayoutProcessor::DoLayoutPositionedContainer( |
- CXFA_LayoutContext* pContext) { |
- if (m_pLayoutItem) |
- return; |
- |
- m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); |
- FX_BOOL bIgnoreXY = (m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout) != |
- XFA_ATTRIBUTEENUM_Position); |
- FX_FLOAT fContainerWidth = 0, fContainerHeight = 0; |
- FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE; |
- XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize( |
- m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize, |
- bContainerHeightAutoSize); |
- FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0; |
- FX_FLOAT fHiddenContentCalculatedWidth = 0, |
- fHiddenContentCalculatedHeight = 0; |
- if (m_pCurChildNode == XFA_LAYOUT_INVALIDNODE) { |
- XFA_ItemLayoutProcessor_GotoNextContainerNode( |
- m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE); |
- } |
- int32_t iColIndex = 0; |
- for (; m_pCurChildNode; XFA_ItemLayoutProcessor_GotoNextContainerNode( |
- m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE)) { |
- if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container) { |
- continue; |
- } |
- if (m_pCurChildNode->GetClassID() == XFA_ELEMENT_Variables) { |
- continue; |
- } |
- CXFA_ItemLayoutProcessor* pProcessor = |
- new CXFA_ItemLayoutProcessor(m_pCurChildNode, m_pPageMgr); |
- if (pContext && pContext->m_prgSpecifiedColumnWidths) { |
- int32_t iColSpan = m_pCurChildNode->GetInteger(XFA_ATTRIBUTE_ColSpan); |
- if (iColSpan <= |
- pContext->m_prgSpecifiedColumnWidths->GetSize() - iColIndex) { |
- pContext->m_fCurColumnWidth = 0; |
- pContext->m_bCurColumnWidthAvaiable = TRUE; |
- if (iColSpan == -1) |
- iColSpan = pContext->m_prgSpecifiedColumnWidths->GetSize(); |
- for (int32_t i = 0; iColIndex + i < iColSpan; ++i) { |
- pContext->m_fCurColumnWidth += |
- pContext->m_prgSpecifiedColumnWidths->GetAt(iColIndex + i); |
- } |
- if (pContext->m_fCurColumnWidth == 0) |
- pContext->m_bCurColumnWidthAvaiable = FALSE; |
- iColIndex += iColSpan >= 0 ? iColSpan : 0; |
- } |
- } |
- pProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, |
- pContext); |
- if (!pProcessor->HasLayoutItem()) { |
- delete pProcessor; |
- continue; |
- } |
- FX_FLOAT fWidth, fHeight; |
- pProcessor->GetCurrentComponentSize(fWidth, fHeight); |
- FX_BOOL bChangeParentSize = FALSE; |
- if (XFA_ItemLayoutProcessor_IsTakingSpace(m_pCurChildNode)) { |
- bChangeParentSize = TRUE; |
- } |
- FX_FLOAT fAbsoluteX = 0, fAbsoluteY = 0; |
- if (!bIgnoreXY) { |
- CalculatePositionedContainerPos(m_pCurChildNode, fWidth, fHeight, |
- fAbsoluteX, fAbsoluteY); |
- } |
- pProcessor->SetCurrentComponentPos(fAbsoluteX, fAbsoluteY); |
- if (bContainerWidthAutoSize) { |
- FX_FLOAT fChildSuppliedWidth = fAbsoluteX + fWidth; |
- if (bChangeParentSize) { |
- if (fContentCalculatedWidth < fChildSuppliedWidth) { |
- fContentCalculatedWidth = fChildSuppliedWidth; |
- } |
- } else { |
- if (fHiddenContentCalculatedWidth < fChildSuppliedWidth && |
- m_pCurChildNode->GetClassID() != XFA_ELEMENT_Subform) { |
- fHiddenContentCalculatedWidth = fChildSuppliedWidth; |
- } |
- } |
- } |
- if (bContainerHeightAutoSize) { |
- FX_FLOAT fChildSuppliedHeight = fAbsoluteY + fHeight; |
- if (bChangeParentSize) { |
- if (fContentCalculatedHeight < fChildSuppliedHeight) { |
- fContentCalculatedHeight = fChildSuppliedHeight; |
- } |
- } else { |
- if (fHiddenContentCalculatedHeight < fChildSuppliedHeight && |
- m_pCurChildNode->GetClassID() != XFA_ELEMENT_Subform) { |
- fHiddenContentCalculatedHeight = fChildSuppliedHeight; |
- } |
- } |
- } |
- m_pLayoutItem->AddChild(pProcessor->ExtractLayoutItem()); |
- delete pProcessor; |
- } |
- XFA_VERSION eVersion = m_pFormNode->GetDocument()->GetCurVersionMode(); |
- if (fContentCalculatedWidth == 0 && eVersion < XFA_VERSION_207) { |
- fContentCalculatedWidth = fHiddenContentCalculatedWidth; |
- } |
- if (fContentCalculatedHeight == 0 && eVersion < XFA_VERSION_207) { |
- fContentCalculatedHeight = fHiddenContentCalculatedHeight; |
- } |
- XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize( |
- m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth, |
- fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight, |
- fContainerHeight); |
- SetCurrentComponentSize(fContainerWidth, fContainerHeight); |
-} |
-static inline void XFA_ItemLayoutProcessor_UpdateWidgetSize( |
- CXFA_ContentLayoutItem* pLayoutItem, |
- FX_FLOAT& fWidth, |
- FX_FLOAT& fHeight) { |
- CXFA_Node* pNode = pLayoutItem->m_pFormNode; |
- ASSERT(pNode); |
- XFA_ELEMENT eClassID = pNode->GetClassID(); |
- switch (eClassID) { |
- case XFA_ELEMENT_Subform: |
- case XFA_ELEMENT_Area: |
- case XFA_ELEMENT_ExclGroup: |
- case XFA_ELEMENT_SubformSet: { |
- if (fWidth < -XFA_LAYOUT_FLOAT_PERCISION) { |
- fWidth = pLayoutItem->m_sSize.x; |
- } |
- if (fHeight < -XFA_LAYOUT_FLOAT_PERCISION) { |
- fHeight = pLayoutItem->m_sSize.y; |
- } |
- break; |
- } |
- case XFA_ELEMENT_Draw: |
- case XFA_ELEMENT_Field: { |
- pNode->GetDocument()->GetParser()->GetNotify()->StartFieldDrawLayout( |
- pNode, fWidth, fHeight); |
- break; |
- } |
- default: |
- ASSERT(FALSE); |
- } |
-} |
-static inline void XFA_ItemLayoutProcessor_RelocateTableRowCells( |
- CXFA_ContentLayoutItem* pLayoutRow, |
- const CFX_ArrayTemplate<FX_FLOAT>& rgSpecifiedColumnWidths, |
- XFA_ATTRIBUTEENUM eLayout) { |
- FX_FLOAT fContainerWidth = 0, fContainerHeight = 0; |
- FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE; |
- XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize( |
- pLayoutRow->m_pFormNode, fContainerWidth, fContainerHeight, |
- bContainerWidthAutoSize, bContainerHeightAutoSize); |
- CXFA_Node* pMarginNode = |
- pLayoutRow->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); |
- FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0; |
- if (pMarginNode) { |
- fLeftInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt); |
- fTopInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt); |
- fRightInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt); |
- fBottomInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt); |
- } |
- FX_FLOAT fContentWidthLimit = |
- bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX |
- : fContainerWidth - fLeftInset - fRightInset; |
- FX_FLOAT fContentCurrentHeight = |
- pLayoutRow->m_sSize.y - fTopInset - fBottomInset; |
- FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0; |
- FX_FLOAT fCurrentColX = 0; |
- int32_t nCurrentColIdx = 0; |
- FX_BOOL bMetWholeRowCell = FALSE; |
- for (CXFA_ContentLayoutItem* pLayoutChild = |
- (CXFA_ContentLayoutItem*)pLayoutRow->m_pFirstChild; |
- pLayoutChild; |
- pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) { |
- int32_t nOriginalColSpan = |
- pLayoutChild->m_pFormNode->GetInteger(XFA_ATTRIBUTE_ColSpan); |
- int32_t nColSpan = nOriginalColSpan; |
- FX_FLOAT fColSpanWidth = 0; |
- if (nColSpan == -1 || |
- nCurrentColIdx + nColSpan > rgSpecifiedColumnWidths.GetSize()) { |
- nColSpan = rgSpecifiedColumnWidths.GetSize() - nCurrentColIdx; |
- } |
- for (int32_t i = 0; i < nColSpan; i++) { |
- fColSpanWidth += rgSpecifiedColumnWidths[nCurrentColIdx + i]; |
- } |
- if (nColSpan != nOriginalColSpan) { |
- fColSpanWidth = bMetWholeRowCell ? 0 : std::max(fColSpanWidth, |
- pLayoutChild->m_sSize.y); |
- } |
- if (nOriginalColSpan == -1) { |
- bMetWholeRowCell = TRUE; |
- } |
- pLayoutChild->m_sPos = CFX_PointF(fCurrentColX, 0); |
- pLayoutChild->m_sSize.x = fColSpanWidth; |
- if (XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutChild->m_pFormNode)) { |
- fCurrentColX += fColSpanWidth; |
- nCurrentColIdx += nColSpan; |
- FX_FLOAT fNewHeight = |
- bContainerHeightAutoSize ? -1 : fContentCurrentHeight; |
- XFA_ItemLayoutProcessor_UpdateWidgetSize(pLayoutChild, fColSpanWidth, |
- fNewHeight); |
- pLayoutChild->m_sSize.y = fNewHeight; |
- if (bContainerHeightAutoSize) { |
- FX_FLOAT fChildSuppliedHeight = pLayoutChild->m_sSize.y; |
- if (fContentCalculatedHeight < fChildSuppliedHeight) { |
- fContentCalculatedHeight = fChildSuppliedHeight; |
- } |
- } |
- } |
- } |
- if (bContainerHeightAutoSize) { |
- for (CXFA_ContentLayoutItem* pLayoutChild = |
- (CXFA_ContentLayoutItem*)pLayoutRow->m_pFirstChild; |
- pLayoutChild; |
- pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) { |
- XFA_ItemLayoutProcessor_UpdateWidgetSize( |
- pLayoutChild, pLayoutChild->m_sSize.x, fContentCalculatedHeight); |
- FX_FLOAT fOldChildHeight = pLayoutChild->m_sSize.y; |
- pLayoutChild->m_sSize.y = fContentCalculatedHeight; |
- CXFA_Node* pParaNode = |
- pLayoutChild->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Para); |
- if (pParaNode && pLayoutChild->m_pFirstChild) { |
- FX_FLOAT fOffHeight = fContentCalculatedHeight - fOldChildHeight; |
- XFA_ATTRIBUTEENUM eVType = pParaNode->GetEnum(XFA_ATTRIBUTE_VAlign); |
- switch (eVType) { |
- case XFA_ATTRIBUTEENUM_Middle: |
- fOffHeight = fOffHeight / 2; |
- break; |
- case XFA_ATTRIBUTEENUM_Bottom: |
- break; |
- case XFA_ATTRIBUTEENUM_Top: |
- default: |
- fOffHeight = 0; |
- break; |
- } |
- if (fOffHeight > 0) { |
- for (CXFA_ContentLayoutItem* pInnerLayoutChild = |
- (CXFA_ContentLayoutItem*)pLayoutChild->m_pFirstChild; |
- pInnerLayoutChild; |
- pInnerLayoutChild = |
- (CXFA_ContentLayoutItem*)pInnerLayoutChild->m_pNextSibling) { |
- pInnerLayoutChild->m_sPos.y += fOffHeight; |
- } |
- } |
- } |
- } |
- } |
- if (bContainerWidthAutoSize) { |
- FX_FLOAT fChildSuppliedWidth = fCurrentColX; |
- if (fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX && |
- fContentWidthLimit > fChildSuppliedWidth) { |
- fChildSuppliedWidth = fContentWidthLimit; |
- } |
- if (fContentCalculatedWidth < fChildSuppliedWidth) { |
- fContentCalculatedWidth = fChildSuppliedWidth; |
- } |
- } else { |
- fContentCalculatedWidth = fContainerWidth - fLeftInset - fRightInset; |
- } |
- if (pLayoutRow->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout) == |
- XFA_ATTRIBUTEENUM_Rl_row) { |
- for (CXFA_ContentLayoutItem* pLayoutChild = |
- (CXFA_ContentLayoutItem*)pLayoutRow->m_pFirstChild; |
- pLayoutChild; |
- pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) { |
- pLayoutChild->m_sPos.x = fContentCalculatedWidth - |
- pLayoutChild->m_sPos.x - pLayoutChild->m_sSize.x; |
- } |
- } |
- XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize( |
- pLayoutRow->m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth, |
- fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight, |
- fContainerHeight); |
- pLayoutRow->m_sSize = CFX_SizeF(fContainerWidth, fContainerHeight); |
-} |
-void CXFA_ItemLayoutProcessor::DoLayoutTableContainer(CXFA_Node* pLayoutNode) { |
- if (m_pLayoutItem) |
- return; |
- |
- if (pLayoutNode == NULL) { |
- pLayoutNode = m_pFormNode; |
- } |
- ASSERT(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE); |
- m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); |
- FX_FLOAT fContainerWidth = 0, fContainerHeight = 0; |
- FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE; |
- XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize( |
- m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize, |
- bContainerHeightAutoSize); |
- FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0; |
- CXFA_Node* pMarginNode = |
- m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); |
- FX_FLOAT fLeftInset = 0; |
- FX_FLOAT fRightInset = 0; |
- if (pMarginNode) { |
- fLeftInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt); |
- fRightInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt); |
- } |
- FX_FLOAT fContentWidthLimit = |
- bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX |
- : fContainerWidth - fLeftInset - fRightInset; |
- CFX_WideStringC wsColumnWidths; |
- if (pLayoutNode->TryCData(XFA_ATTRIBUTE_ColumnWidths, wsColumnWidths)) { |
- CFX_WideStringArray widths; |
- if (FX_SeparateStringW(wsColumnWidths.GetPtr(), wsColumnWidths.GetLength(), |
- L' ', widths) > 0) { |
- int32_t iCols = widths.GetSize(); |
- CFX_WideString wsWidth; |
- for (int32_t i = 0; i < iCols; i++) { |
- wsWidth = widths[i]; |
- wsWidth.TrimLeft(L' '); |
- if (!wsWidth.IsEmpty()) { |
- CXFA_Measurement measure(wsWidth); |
- m_rgSpecifiedColumnWidths.Add(measure.ToUnit(XFA_UNIT_Pt)); |
- } |
- } |
- } |
- } |
- int32_t iSpecifiedColumnCount = m_rgSpecifiedColumnWidths.GetSize(); |
- CXFA_LayoutContext layoutContext; |
- layoutContext.m_prgSpecifiedColumnWidths = &m_rgSpecifiedColumnWidths; |
- CXFA_LayoutContext* pLayoutContext = |
- iSpecifiedColumnCount > 0 ? &layoutContext : NULL; |
- if (m_pCurChildNode == XFA_LAYOUT_INVALIDNODE) { |
- XFA_ItemLayoutProcessor_GotoNextContainerNode( |
- m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE); |
- } |
- for (; m_pCurChildNode; XFA_ItemLayoutProcessor_GotoNextContainerNode( |
- m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, FALSE)) { |
- layoutContext.m_bCurColumnWidthAvaiable = FALSE; |
- layoutContext.m_fCurColumnWidth = 0; |
- if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Container) { |
- continue; |
- } |
- CXFA_ItemLayoutProcessor* pProcessor = |
- new CXFA_ItemLayoutProcessor(m_pCurChildNode, m_pPageMgr); |
- pProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, |
- pLayoutContext); |
- if (!pProcessor->HasLayoutItem()) { |
- delete pProcessor; |
- continue; |
- } |
- m_pLayoutItem->AddChild(pProcessor->ExtractLayoutItem()); |
- delete pProcessor; |
- } |
- int32_t iRowCount = 0, iColCount = 0; |
- { |
- CFX_ArrayTemplate<CXFA_ContentLayoutItem*> rgRowItems; |
- CFX_ArrayTemplate<int32_t> rgRowItemsSpan; |
- CFX_ArrayTemplate<FX_FLOAT> rgRowItemsWidth; |
- for (CXFA_ContentLayoutItem* pLayoutChild = |
- (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild; |
- pLayoutChild; |
- pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) { |
- if (pLayoutChild->m_pFormNode->GetClassID() != XFA_ELEMENT_Subform) { |
- continue; |
- } |
- if (!XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutChild->m_pFormNode)) { |
- continue; |
- } |
- XFA_ATTRIBUTEENUM eLayout = |
- pLayoutChild->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); |
- if (eLayout != XFA_ATTRIBUTEENUM_Row && |
- eLayout != XFA_ATTRIBUTEENUM_Rl_row) { |
- continue; |
- } |
- if (CXFA_ContentLayoutItem* pRowLayoutCell = |
- (CXFA_ContentLayoutItem*)pLayoutChild->m_pFirstChild) { |
- rgRowItems.Add(pRowLayoutCell); |
- int32_t iColSpan = |
- pRowLayoutCell->m_pFormNode->GetInteger(XFA_ATTRIBUTE_ColSpan); |
- rgRowItemsSpan.Add(iColSpan); |
- rgRowItemsWidth.Add(pRowLayoutCell->m_sSize.x); |
- } |
- } |
- iRowCount = rgRowItems.GetSize(); |
- iColCount = 0; |
- FX_BOOL bMoreColumns = TRUE; |
- while (bMoreColumns) { |
- bMoreColumns = FALSE; |
- FX_BOOL bAutoCol = FALSE; |
- for (int32_t i = 0; i < iRowCount; i++) { |
- while (rgRowItems[i] && (rgRowItemsSpan[i] <= 0 || |
- !XFA_ItemLayoutProcessor_IsTakingSpace( |
- rgRowItems[i]->m_pFormNode))) { |
- CXFA_ContentLayoutItem* pNewCell = |
- (CXFA_ContentLayoutItem*)rgRowItems[i]->m_pNextSibling; |
- if (rgRowItemsSpan[i] < 0 && XFA_ItemLayoutProcessor_IsTakingSpace( |
- rgRowItems[i]->m_pFormNode)) { |
- pNewCell = NULL; |
- } |
- rgRowItems[i] = pNewCell; |
- rgRowItemsSpan[i] = |
- pNewCell |
- ? pNewCell->m_pFormNode->GetInteger(XFA_ATTRIBUTE_ColSpan) |
- : 0; |
- rgRowItemsWidth[i] = pNewCell ? pNewCell->m_sSize.x : 0; |
- } |
- CXFA_ContentLayoutItem* pCell = rgRowItems[i]; |
- if (!pCell) { |
- continue; |
- } |
- bMoreColumns = TRUE; |
- if (rgRowItemsSpan[i] == 1) { |
- if (iColCount >= iSpecifiedColumnCount) { |
- for (int32_t j = 0, c = iColCount + 1 - |
- m_rgSpecifiedColumnWidths.GetSize(); |
- j < c; j++) { |
- m_rgSpecifiedColumnWidths.Add(0); |
- } |
- } |
- if (m_rgSpecifiedColumnWidths[iColCount] < |
- XFA_LAYOUT_FLOAT_PERCISION) { |
- bAutoCol = TRUE; |
- } |
- if (bAutoCol && |
- m_rgSpecifiedColumnWidths[iColCount] < rgRowItemsWidth[i]) { |
- m_rgSpecifiedColumnWidths[iColCount] = rgRowItemsWidth[i]; |
- } |
- } |
- } |
- if (bMoreColumns) { |
- FX_FLOAT fFinalColumnWidth = 0.0f; |
- if (iColCount < m_rgSpecifiedColumnWidths.GetSize()) |
- fFinalColumnWidth = m_rgSpecifiedColumnWidths[iColCount]; |
- for (int32_t i = 0; i < iRowCount; ++i) { |
- if (!rgRowItems[i]) |
- continue; |
- --rgRowItemsSpan[i]; |
- rgRowItemsWidth[i] -= fFinalColumnWidth; |
- } |
- ++iColCount; |
- } |
- } |
- } |
- FX_FLOAT fCurrentRowY = 0; |
- for (CXFA_ContentLayoutItem* pLayoutChild = |
- (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild; |
- pLayoutChild; |
- pLayoutChild = (CXFA_ContentLayoutItem*)pLayoutChild->m_pNextSibling) { |
- if (!XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutChild->m_pFormNode)) { |
- continue; |
- } |
- if (pLayoutChild->m_pFormNode->GetClassID() == XFA_ELEMENT_Subform) { |
- XFA_ATTRIBUTEENUM eSubformLayout = |
- pLayoutChild->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); |
- if (eSubformLayout == XFA_ATTRIBUTEENUM_Row || |
- eSubformLayout == XFA_ATTRIBUTEENUM_Rl_row) { |
- XFA_ItemLayoutProcessor_RelocateTableRowCells( |
- pLayoutChild, m_rgSpecifiedColumnWidths, eSubformLayout); |
- } |
- } |
- pLayoutChild->m_sPos.y = fCurrentRowY; |
- if (bContainerWidthAutoSize) { |
- pLayoutChild->m_sPos.x = 0; |
- } else { |
- switch (pLayoutChild->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)) { |
- case XFA_ATTRIBUTEENUM_Left: |
- default: |
- pLayoutChild->m_sPos.x = 0; |
- break; |
- case XFA_ATTRIBUTEENUM_Center: |
- pLayoutChild->m_sPos.x = |
- (fContentWidthLimit - pLayoutChild->m_sSize.x) / 2; |
- break; |
- case XFA_ATTRIBUTEENUM_Right: |
- pLayoutChild->m_sPos.x = fContentWidthLimit - pLayoutChild->m_sSize.x; |
- break; |
- } |
- } |
- if (bContainerWidthAutoSize) { |
- FX_FLOAT fChildSuppliedWidth = |
- pLayoutChild->m_sPos.x + pLayoutChild->m_sSize.x; |
- if (fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX && |
- fContentWidthLimit > fChildSuppliedWidth) { |
- fChildSuppliedWidth = fContentWidthLimit; |
- } |
- if (fContentCalculatedWidth < fChildSuppliedWidth) { |
- fContentCalculatedWidth = fChildSuppliedWidth; |
- } |
- } |
- fCurrentRowY += pLayoutChild->m_sSize.y; |
- } |
- if (bContainerHeightAutoSize) { |
- FX_FLOAT fChildSuppliedHeight = fCurrentRowY; |
- if (fContentCalculatedHeight < fChildSuppliedHeight) { |
- fContentCalculatedHeight = fChildSuppliedHeight; |
- } |
- } |
- XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize( |
- m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth, |
- fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight, |
- fContainerHeight); |
- SetCurrentComponentSize(fContainerWidth, fContainerHeight); |
-} |
-static uint8_t XFA_ItemLayoutProcessor_HAlignEnumToInt( |
- XFA_ATTRIBUTEENUM eHAlign) { |
- switch (eHAlign) { |
- case XFA_ATTRIBUTEENUM_Center: |
- return 1; |
- case XFA_ATTRIBUTEENUM_Right: |
- return 2; |
- case XFA_ATTRIBUTEENUM_Left: |
- default: |
- return 0; |
- } |
-} |
-static void XFA_ItemLayoutProcessor_UpdatePendedItemLayout( |
- CXFA_ItemLayoutProcessor* pProcessor, |
- CXFA_ContentLayoutItem* pLayoutItem) { |
- XFA_ATTRIBUTEENUM eLayout = |
- pLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); |
- switch (eLayout) { |
- case XFA_ATTRIBUTEENUM_Row: |
- case XFA_ATTRIBUTEENUM_Rl_row: |
- XFA_ItemLayoutProcessor_RelocateTableRowCells( |
- pLayoutItem, pProcessor->m_rgSpecifiedColumnWidths, eLayout); |
- break; |
- default: |
- break; |
- } |
-} |
-FX_BOOL CXFA_ItemLayoutProcessor::IsAddNewRowForTrailer( |
- CXFA_ContentLayoutItem* pTrailerItem) { |
- if (!pTrailerItem) { |
- return FALSE; |
- } |
- FX_FLOAT fWidth = pTrailerItem->m_sSize.x; |
- XFA_ATTRIBUTEENUM eLayout = m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); |
- if (eLayout != XFA_ATTRIBUTEENUM_Tb && m_fWidthLimite > fWidth) { |
- return FALSE; |
- } |
- return TRUE; |
-} |
-static void XFA_ItemLayoutProcessor_AddTrailerBeforeSplit( |
- CXFA_ItemLayoutProcessor* pProcessor, |
- FX_FLOAT fSplitPos, |
- CXFA_ContentLayoutItem* pTrailerLayoutItem, |
- FX_BOOL bUseInherited = FALSE) { |
- if (!pTrailerLayoutItem) { |
- return; |
- } |
- FX_FLOAT fHeight = pTrailerLayoutItem->m_sSize.y; |
- if (bUseInherited) { |
- FX_FLOAT fNewSplitPos = 0; |
- if (fSplitPos - fHeight > XFA_LAYOUT_FLOAT_PERCISION) { |
- fNewSplitPos = pProcessor->FindSplitPos(fSplitPos - fHeight); |
- } |
- if (fNewSplitPos > XFA_LAYOUT_FLOAT_PERCISION) { |
- pProcessor->SplitLayoutItem(fNewSplitPos); |
- } |
- return; |
- } |
- XFA_ItemLayoutProcessor_UpdatePendedItemLayout(pProcessor, |
- pTrailerLayoutItem); |
- CXFA_Node* pMarginNode = |
- pProcessor->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); |
- FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0; |
- if (pMarginNode) { |
- fLeftInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt); |
- fTopInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt); |
- fRightInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt); |
- fBottomInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt); |
- } |
- if (!pProcessor->IsAddNewRowForTrailer(pTrailerLayoutItem)) { |
- pTrailerLayoutItem->m_sPos.y = pProcessor->m_fLastRowY; |
- pTrailerLayoutItem->m_sPos.x = pProcessor->m_fLastRowWidth; |
- pProcessor->m_pLayoutItem->m_sSize.x += pTrailerLayoutItem->m_sSize.x; |
- pProcessor->m_pLayoutItem->AddChild(pTrailerLayoutItem); |
- return; |
- } |
- FX_FLOAT fNewSplitPos = 0; |
- if (fSplitPos - fHeight > XFA_LAYOUT_FLOAT_PERCISION) { |
- fNewSplitPos = pProcessor->FindSplitPos(fSplitPos - fHeight); |
- } |
- if (fNewSplitPos > XFA_LAYOUT_FLOAT_PERCISION) { |
- pProcessor->SplitLayoutItem(fNewSplitPos); |
- pTrailerLayoutItem->m_sPos.y = fNewSplitPos - fTopInset - fBottomInset; |
- } else { |
- pTrailerLayoutItem->m_sPos.y = fSplitPos - fTopInset - fBottomInset; |
- } |
- switch (pTrailerLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)) { |
- case XFA_ATTRIBUTEENUM_Left: |
- default: |
- pTrailerLayoutItem->m_sPos.x = fLeftInset; |
- break; |
- case XFA_ATTRIBUTEENUM_Right: |
- pTrailerLayoutItem->m_sPos.x = pProcessor->m_pLayoutItem->m_sSize.x - |
- fRightInset - |
- pTrailerLayoutItem->m_sSize.x; |
- break; |
- case XFA_ATTRIBUTEENUM_Center: |
- pTrailerLayoutItem->m_sPos.x = |
- (pProcessor->m_pLayoutItem->m_sSize.x - fLeftInset - fRightInset - |
- pTrailerLayoutItem->m_sSize.x) / |
- 2; |
- break; |
- } |
- pProcessor->m_pLayoutItem->m_sSize.y += fHeight; |
- pProcessor->m_pLayoutItem->AddChild(pTrailerLayoutItem); |
-} |
-static void XFA_ItemLayoutProcessor_AddLeaderAfterSplit( |
- CXFA_ItemLayoutProcessor* pProcessor, |
- CXFA_ContentLayoutItem* pLeaderLayoutItem) { |
- XFA_ItemLayoutProcessor_UpdatePendedItemLayout(pProcessor, pLeaderLayoutItem); |
- CXFA_Node* pMarginNode = |
- pProcessor->m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); |
- FX_FLOAT fLeftInset = 0; |
- FX_FLOAT fRightInset = 0; |
- if (pMarginNode) { |
- fLeftInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt); |
- fRightInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt); |
- } |
- FX_FLOAT fHeight = pLeaderLayoutItem->m_sSize.y; |
- for (CXFA_ContentLayoutItem* pChildItem = |
- (CXFA_ContentLayoutItem*)pProcessor->m_pLayoutItem->m_pFirstChild; |
- pChildItem; |
- pChildItem = (CXFA_ContentLayoutItem*)pChildItem->m_pNextSibling) { |
- pChildItem->m_sPos.y += fHeight; |
- } |
- pLeaderLayoutItem->m_sPos.y = 0; |
- switch (pLeaderLayoutItem->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)) { |
- case XFA_ATTRIBUTEENUM_Left: |
- default: |
- pLeaderLayoutItem->m_sPos.x = fLeftInset; |
- break; |
- case XFA_ATTRIBUTEENUM_Right: |
- pLeaderLayoutItem->m_sPos.x = pProcessor->m_pLayoutItem->m_sSize.x - |
- fRightInset - pLeaderLayoutItem->m_sSize.x; |
- break; |
- case XFA_ATTRIBUTEENUM_Center: |
- pLeaderLayoutItem->m_sPos.x = |
- (pProcessor->m_pLayoutItem->m_sSize.x - fLeftInset - fRightInset - |
- pLeaderLayoutItem->m_sSize.x) / |
- 2; |
- break; |
- } |
- pProcessor->m_pLayoutItem->m_sSize.y += fHeight; |
- pProcessor->m_pLayoutItem->AddChild(pLeaderLayoutItem); |
-} |
-static void XFA_ItemLayoutProcessor_AddPendingNode( |
- CXFA_ItemLayoutProcessor* pProcessor, |
- CXFA_Node* pPendingNode, |
- FX_BOOL bBreakPending) { |
- pProcessor->m_PendingNodes.push_back(pPendingNode); |
- pProcessor->m_bBreakPending = bBreakPending; |
-} |
-static FX_FLOAT XFA_ItemLayoutProcessor_InsertPendingItems( |
- CXFA_ItemLayoutProcessor* pProcessor, |
- CXFA_Node* pCurChildNode) { |
- FX_FLOAT fTotalHeight = 0; |
- if (pProcessor->m_PendingNodes.empty()) { |
- return fTotalHeight; |
- } |
- if (!pProcessor->m_pLayoutItem) { |
- pProcessor->m_pLayoutItem = |
- pProcessor->CreateContentLayoutItem(pCurChildNode); |
- pProcessor->m_pLayoutItem->m_sSize.clear(); |
- } |
- while (!pProcessor->m_PendingNodes.empty()) { |
- std::unique_ptr<CXFA_ItemLayoutProcessor> pPendingProcessor( |
- new CXFA_ItemLayoutProcessor(pProcessor->m_PendingNodes.front(), |
- nullptr)); |
- pProcessor->m_PendingNodes.pop_front(); |
- pPendingProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX); |
- CXFA_ContentLayoutItem* pPendingLayoutItem = |
- pPendingProcessor->HasLayoutItem() |
- ? pPendingProcessor->ExtractLayoutItem() |
- : nullptr; |
- if (pPendingLayoutItem) { |
- XFA_ItemLayoutProcessor_AddLeaderAfterSplit(pProcessor, |
- pPendingLayoutItem); |
- if (pProcessor->m_bBreakPending) { |
- fTotalHeight += pPendingLayoutItem->m_sSize.y; |
- } |
- } |
- } |
- return fTotalHeight; |
-} |
-FX_FLOAT CXFA_ItemLayoutProcessor::InsertKeepLayoutItems() { |
- FX_FLOAT fTotalHeight = 0; |
- if (m_arrayKeepItems.GetSize()) { |
- if (!m_pLayoutItem) { |
- m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); |
- m_pLayoutItem->m_sSize.clear(); |
- } |
- for (int32_t iIndex = m_arrayKeepItems.GetSize() - 1; iIndex >= 0; |
- iIndex--) { |
- XFA_ItemLayoutProcessor_AddLeaderAfterSplit(this, |
- m_arrayKeepItems[iIndex]); |
- fTotalHeight += m_arrayKeepItems[iIndex]->m_sSize.y; |
- } |
- m_arrayKeepItems.RemoveAll(); |
- } |
- return fTotalHeight; |
-} |
-FX_BOOL CXFA_ItemLayoutProcessor::ProcessKeepForSplite( |
- CXFA_ItemLayoutProcessor* pParentProcessor, |
- CXFA_ItemLayoutProcessor* pChildProcessor, |
- XFA_ItemLayoutProcessorResult eRetValue, |
- CFX_ArrayTemplate<CXFA_ContentLayoutItem*>& rgCurLineLayoutItem, |
- FX_FLOAT& fContentCurRowAvailWidth, |
- FX_FLOAT& fContentCurRowHeight, |
- FX_FLOAT& fContentCurRowY, |
- FX_BOOL& bAddedItemInRow, |
- FX_BOOL& bForceEndPage, |
- XFA_ItemLayoutProcessorResult& result) { |
- if (pParentProcessor == NULL || pChildProcessor == NULL) { |
- return FALSE; |
- } |
- if (pParentProcessor->m_pCurChildNode->GetIntact() != |
- XFA_ATTRIBUTEENUM_None || |
- !pChildProcessor->m_bHasAvailHeight) { |
- if (XFA_ExistContainerKeep(pParentProcessor->m_pCurChildNode, TRUE)) { |
- FX_FLOAT fChildWidth, fChildHeight; |
- pChildProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight); |
- CFX_ArrayTemplate<CXFA_ContentLayoutItem*> keepLayoutItems; |
- if (pParentProcessor->JudgePutNextPage(pParentProcessor->m_pLayoutItem, |
- fChildHeight, keepLayoutItems)) { |
- m_arrayKeepItems.RemoveAll(); |
- for (int32_t iIndex = 0; iIndex < keepLayoutItems.GetSize(); iIndex++) { |
- CXFA_ContentLayoutItem* pItem = keepLayoutItems.GetAt(iIndex); |
- pParentProcessor->m_pLayoutItem->RemoveChild(pItem); |
- fContentCurRowY -= pItem->m_sSize.y; |
- m_arrayKeepItems.Add(pItem); |
- } |
- bAddedItemInRow = TRUE; |
- bForceEndPage = TRUE; |
- result = XFA_ItemLayoutProcessorResult_PageFullBreak; |
- return TRUE; |
- } |
- rgCurLineLayoutItem.Add(pChildProcessor->ExtractLayoutItem()); |
- bAddedItemInRow = TRUE; |
- fContentCurRowAvailWidth -= fChildWidth; |
- if (fContentCurRowHeight < fChildHeight) { |
- fContentCurRowHeight = fChildHeight; |
- } |
- result = eRetValue; |
- return TRUE; |
- } |
- } |
- return FALSE; |
-} |
-FX_BOOL CXFA_ItemLayoutProcessor::JudgePutNextPage( |
- CXFA_ContentLayoutItem* pParentLayoutItem, |
- FX_FLOAT fChildHeight, |
- CFX_ArrayTemplate<CXFA_ContentLayoutItem*>& pKeepItems) { |
- if (pParentLayoutItem == NULL) { |
- return FALSE; |
- } |
- FX_FLOAT fItemsHeight = 0; |
- for (CXFA_ContentLayoutItem* pChildLayoutItem = |
- (CXFA_ContentLayoutItem*)pParentLayoutItem->m_pFirstChild; |
- pChildLayoutItem; |
- pChildLayoutItem = |
- (CXFA_ContentLayoutItem*)pChildLayoutItem->m_pNextSibling) { |
- if (XFA_ExistContainerKeep(pChildLayoutItem->m_pFormNode, FALSE)) { |
- pKeepItems.Add(pChildLayoutItem); |
- fItemsHeight += pChildLayoutItem->m_sSize.y; |
- } else { |
- pKeepItems.RemoveAll(); |
- fItemsHeight = 0; |
- } |
- } |
- fItemsHeight += fChildHeight; |
- if (m_pPageMgr->GetNextAvailContentHeight(fItemsHeight)) { |
- return TRUE; |
- } |
- return FALSE; |
-} |
-void CXFA_ItemLayoutProcessor::ProcessUnUseBinds(CXFA_Node* pFormNode) { |
- if (!pFormNode) { |
- return; |
- } |
- CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> sIterator( |
- pFormNode); |
- for (CXFA_Node* pNode = sIterator.MoveToNext(); pNode; |
- pNode = sIterator.MoveToNext()) { |
- if (pNode->IsContainerNode()) { |
- CXFA_Node* pBindNode = pNode->GetBindData(); |
- if (pBindNode) { |
- pBindNode->RemoveBindItem(pNode); |
- pNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL); |
- } |
- } |
- pNode->SetFlag(XFA_NODEFLAG_UnusedNode); |
- } |
-} |
-void CXFA_ItemLayoutProcessor::ProcessUnUseOverFlow( |
- CXFA_Node* pLeaderNode, |
- CXFA_Node* pTrailerNode, |
- CXFA_ContentLayoutItem* pTrailerItem, |
- CXFA_Node* pFormNode) { |
- ProcessUnUseBinds(pLeaderNode); |
- ProcessUnUseBinds(pTrailerNode); |
- if (pFormNode == NULL) { |
- return; |
- } |
- if (pFormNode->GetClassID() == XFA_ELEMENT_Overflow || |
- pFormNode->GetClassID() == XFA_ELEMENT_Break) { |
- pFormNode = pFormNode->GetNodeItem(XFA_NODEITEM_Parent); |
- } |
- if (pLeaderNode && pFormNode) { |
- pFormNode->RemoveChild(pLeaderNode); |
- } |
- if (pTrailerNode && pFormNode) { |
- pFormNode->RemoveChild(pTrailerNode); |
- } |
- if (pTrailerItem) { |
- XFA_ReleaseLayoutItem(pTrailerItem); |
- } |
-} |
-static XFA_ItemLayoutProcessorResult XFA_ItemLayoutProcessor_InsertFlowedItem( |
- CXFA_ItemLayoutProcessor* pThis, |
- CXFA_ItemLayoutProcessor*& pProcessor, |
- FX_BOOL bContainerWidthAutoSize, |
- FX_BOOL bContainerHeightAutoSize, |
- FX_FLOAT fContainerHeight, |
- XFA_ATTRIBUTEENUM eFlowStrategy, |
- uint8_t& uCurHAlignState, |
- CFX_ArrayTemplate<CXFA_ContentLayoutItem*>(&rgCurLineLayoutItems)[3], |
- FX_BOOL bUseBreakControl, |
- FX_FLOAT fAvailHeight, |
- FX_FLOAT fRealHeight, |
- FX_FLOAT& fContentCurRowY, |
- FX_FLOAT& fContentWidthLimit, |
- FX_FLOAT& fContentCurRowAvailWidth, |
- FX_FLOAT& fContentCurRowHeight, |
- FX_BOOL& bAddedItemInRow, |
- FX_BOOL& bForceEndPage, |
- CXFA_LayoutContext* pLayoutContext = NULL, |
- FX_BOOL bNewRow = FALSE) { |
- FX_BOOL bTakeSpace = |
- XFA_ItemLayoutProcessor_IsTakingSpace(pProcessor->m_pFormNode); |
- uint8_t uHAlign = XFA_ItemLayoutProcessor_HAlignEnumToInt( |
- pThis->m_pCurChildNode->GetEnum(XFA_ATTRIBUTE_HAlign)); |
- if (bContainerWidthAutoSize) { |
- uHAlign = 0; |
- } |
- if ((eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb && uHAlign < uCurHAlignState) || |
- (eFlowStrategy == XFA_ATTRIBUTEENUM_Rl_tb && uHAlign > uCurHAlignState)) { |
- return XFA_ItemLayoutProcessorResult_RowFullBreak; |
- } |
- uCurHAlignState = uHAlign; |
- FX_BOOL bIsOwnSplite = |
- pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None; |
- FX_BOOL bUseRealHeight = |
- bTakeSpace && bContainerHeightAutoSize && bIsOwnSplite && |
- pProcessor->m_pFormNode->GetNodeItem(XFA_NODEITEM_Parent)->GetIntact() == |
- XFA_ATTRIBUTEENUM_None; |
- FX_BOOL bIsTransHeight = bTakeSpace; |
- if (bIsTransHeight && !bIsOwnSplite) { |
- FX_BOOL bRootForceTb = FALSE; |
- XFA_ATTRIBUTEENUM eLayoutStrategy = XFA_ItemLayoutProcessor_GetLayout( |
- pProcessor->m_pFormNode, bRootForceTb); |
- if (eLayoutStrategy == XFA_ATTRIBUTEENUM_Lr_tb || |
- eLayoutStrategy == XFA_ATTRIBUTEENUM_Rl_tb) { |
- bIsTransHeight = FALSE; |
- } |
- } |
- FX_BOOL bUseInherited = FALSE; |
- CXFA_LayoutContext layoutContext; |
- if (pThis->m_pPageMgr) { |
- CXFA_Node* pOverflowNode = |
- pThis->m_pPageMgr->QueryOverflow(pThis->m_pFormNode); |
- if (pOverflowNode) { |
- layoutContext.m_pOverflowNode = pOverflowNode; |
- layoutContext.m_pOverflowProcessor = pThis; |
- pLayoutContext = &layoutContext; |
- } |
- } |
- XFA_ItemLayoutProcessorResult eRetValue = XFA_ItemLayoutProcessorResult_Done; |
- if (!bNewRow || |
- pProcessor->m_ePreProcessRs == XFA_ItemLayoutProcessorResult_Done) { |
- eRetValue = pProcessor->DoLayout( |
- bTakeSpace ? bUseBreakControl : FALSE, |
- bUseRealHeight ? fRealHeight - fContentCurRowY : XFA_LAYOUT_FLOAT_MAX, |
- bIsTransHeight ? fRealHeight - fContentCurRowY : XFA_LAYOUT_FLOAT_MAX, |
- pLayoutContext); |
- pProcessor->m_ePreProcessRs = eRetValue; |
- } else { |
- eRetValue = pProcessor->m_ePreProcessRs; |
- pProcessor->m_ePreProcessRs = XFA_ItemLayoutProcessorResult_Done; |
- } |
- if (pProcessor->HasLayoutItem() == FALSE) { |
- return eRetValue; |
- } |
- FX_FLOAT fChildWidth, fChildHeight; |
- pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight); |
- if (bUseRealHeight && fRealHeight < XFA_LAYOUT_FLOAT_PERCISION) { |
- fRealHeight = XFA_LAYOUT_FLOAT_MAX; |
- fAvailHeight = XFA_LAYOUT_FLOAT_MAX; |
- } |
- if (!bTakeSpace || |
- (fChildWidth <= fContentCurRowAvailWidth + XFA_LAYOUT_FLOAT_PERCISION) || |
- (fContentWidthLimit - fContentCurRowAvailWidth <= |
- XFA_LAYOUT_FLOAT_PERCISION)) { |
- CXFA_Node *pOverflowLeaderNode = NULL, *pOverflowTrailerNode = NULL, |
- *pFormNode = NULL; |
- CXFA_ContentLayoutItem* pTrailerLayoutItem = NULL; |
- FX_BOOL bIsAddTrailerHeight = FALSE; |
- if (pThis->m_pPageMgr && |
- pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None) { |
- pFormNode = pThis->m_pPageMgr->QueryOverflow(pProcessor->m_pFormNode); |
- if (pFormNode == NULL && pLayoutContext && |
- pLayoutContext->m_pOverflowProcessor) { |
- pFormNode = pLayoutContext->m_pOverflowNode; |
- bUseInherited = TRUE; |
- } |
- if (pThis->m_pPageMgr->ProcessOverflow(pFormNode, pOverflowLeaderNode, |
- pOverflowTrailerNode, FALSE, |
- FALSE)) { |
- if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowTrailerNode)) { |
- if (pOverflowTrailerNode) { |
- CXFA_ItemLayoutProcessor* pOverflowLeaderProcessor = |
- new CXFA_ItemLayoutProcessor(pOverflowTrailerNode, NULL); |
- pOverflowLeaderProcessor->DoLayout(FALSE, XFA_LAYOUT_FLOAT_MAX); |
- pTrailerLayoutItem = |
- pOverflowLeaderProcessor->HasLayoutItem() |
- ? pOverflowLeaderProcessor->ExtractLayoutItem() |
- : NULL; |
- delete pOverflowLeaderProcessor; |
- } |
- if (bUseInherited) { |
- bIsAddTrailerHeight = |
- pThis->IsAddNewRowForTrailer(pTrailerLayoutItem); |
- } else { |
- bIsAddTrailerHeight = |
- pProcessor->IsAddNewRowForTrailer(pTrailerLayoutItem); |
- } |
- if (bIsAddTrailerHeight) { |
- FX_FLOAT fTrailerHeight = pTrailerLayoutItem->m_sSize.y; |
- fChildHeight += fTrailerHeight; |
- bIsAddTrailerHeight = TRUE; |
- } |
- } |
- } |
- } |
- if (!bTakeSpace || |
- fContentCurRowY + fChildHeight <= |
- fAvailHeight + XFA_LAYOUT_FLOAT_PERCISION || |
- (!bContainerHeightAutoSize && |
- pThis->m_fUsedSize + fAvailHeight + XFA_LAYOUT_FLOAT_PERCISION >= |
- fContainerHeight)) { |
- if (!bTakeSpace || eRetValue == XFA_ItemLayoutProcessorResult_Done) { |
- if (pProcessor->m_bUseInheriated) { |
- if (pTrailerLayoutItem) { |
- XFA_ItemLayoutProcessor_AddTrailerBeforeSplit( |
- pProcessor, fChildHeight, pTrailerLayoutItem); |
- } |
- if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) { |
- XFA_ItemLayoutProcessor_AddPendingNode(pProcessor, |
- pOverflowLeaderNode, FALSE); |
- } |
- pProcessor->m_bUseInheriated = FALSE; |
- } else { |
- if (bIsAddTrailerHeight) { |
- fChildHeight -= pTrailerLayoutItem->m_sSize.y; |
- } |
- pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, |
- pOverflowTrailerNode, |
- pTrailerLayoutItem, pFormNode); |
- } |
- CXFA_ContentLayoutItem* pChildLayoutItem = |
- pProcessor->ExtractLayoutItem(); |
- if (XFA_ExistContainerKeep(pProcessor->m_pFormNode, FALSE) && |
- pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None) { |
- pThis->m_arrayKeepItems.Add(pChildLayoutItem); |
- } else { |
- pThis->m_arrayKeepItems.RemoveAll(); |
- } |
- rgCurLineLayoutItems[uHAlign].Add(pChildLayoutItem); |
- bAddedItemInRow = TRUE; |
- if (bTakeSpace) { |
- fContentCurRowAvailWidth -= fChildWidth; |
- if (fContentCurRowHeight < fChildHeight) { |
- fContentCurRowHeight = fChildHeight; |
- } |
- } |
- return XFA_ItemLayoutProcessorResult_Done; |
- } else { |
- if (eRetValue == XFA_ItemLayoutProcessorResult_PageFullBreak) { |
- if (pProcessor->m_bUseInheriated) { |
- if (pTrailerLayoutItem) { |
- XFA_ItemLayoutProcessor_AddTrailerBeforeSplit( |
- pProcessor, fChildHeight, pTrailerLayoutItem); |
- } |
- if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) { |
- XFA_ItemLayoutProcessor_AddPendingNode( |
- pProcessor, pOverflowLeaderNode, FALSE); |
- } |
- pProcessor->m_bUseInheriated = FALSE; |
- } else { |
- if (bIsAddTrailerHeight) { |
- fChildHeight -= pTrailerLayoutItem->m_sSize.y; |
- } |
- pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, |
- pOverflowTrailerNode, |
- pTrailerLayoutItem, pFormNode); |
- } |
- } |
- rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem()); |
- bAddedItemInRow = TRUE; |
- fContentCurRowAvailWidth -= fChildWidth; |
- if (fContentCurRowHeight < fChildHeight) { |
- fContentCurRowHeight = fChildHeight; |
- } |
- return eRetValue; |
- } |
- } else { |
- XFA_ItemLayoutProcessorResult eResult; |
- if (pThis->ProcessKeepForSplite( |
- pThis, pProcessor, eRetValue, rgCurLineLayoutItems[uHAlign], |
- fContentCurRowAvailWidth, fContentCurRowHeight, fContentCurRowY, |
- bAddedItemInRow, bForceEndPage, eResult)) { |
- return eResult; |
- } |
- bForceEndPage = TRUE; |
- FX_FLOAT fSplitPos = |
- pProcessor->FindSplitPos(fAvailHeight - fContentCurRowY); |
- if (fSplitPos > XFA_LAYOUT_FLOAT_PERCISION) { |
- XFA_ATTRIBUTEENUM eLayout = |
- pProcessor->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); |
- if (eLayout == XFA_ATTRIBUTEENUM_Tb && |
- eRetValue == XFA_ItemLayoutProcessorResult_Done) { |
- pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, |
- pOverflowTrailerNode, |
- pTrailerLayoutItem, pFormNode); |
- rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem()); |
- bAddedItemInRow = TRUE; |
- if (bTakeSpace) { |
- fContentCurRowAvailWidth -= fChildWidth; |
- if (fContentCurRowHeight < fChildHeight) { |
- fContentCurRowHeight = fChildHeight; |
- } |
- } |
- return XFA_ItemLayoutProcessorResult_PageFullBreak; |
- } |
- CXFA_Node *pTempLeaderNode = NULL, *pTempTrailerNode = NULL; |
- if (pThis->m_pPageMgr && !pProcessor->m_bUseInheriated && |
- eRetValue != XFA_ItemLayoutProcessorResult_PageFullBreak) { |
- pThis->m_pPageMgr->ProcessOverflow(pFormNode, pTempLeaderNode, |
- pTempTrailerNode, FALSE, TRUE); |
- } |
- if (pTrailerLayoutItem && bIsAddTrailerHeight) { |
- XFA_ItemLayoutProcessor_AddTrailerBeforeSplit( |
- pProcessor, fSplitPos, pTrailerLayoutItem, bUseInherited); |
- } else { |
- pProcessor->SplitLayoutItem(fSplitPos); |
- } |
- if (bUseInherited) { |
- pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, |
- pOverflowTrailerNode, |
- pTrailerLayoutItem, pFormNode); |
- pThis->m_bUseInheriated = TRUE; |
- } else { |
- if (pProcessor->m_pLayoutItem->m_pFirstChild && |
- pProcessor->m_pLayoutItem->m_pFirstChild->m_pNextSibling == |
- NULL && |
- pProcessor->m_pLayoutItem->m_pFirstChild->m_pFormNode->HasFlag( |
- XFA_NODEFLAG_LayoutGeneratedNode)) { |
- pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, |
- pOverflowTrailerNode, |
- pTrailerLayoutItem, pFormNode); |
- } else { |
- if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) { |
- XFA_ItemLayoutProcessor_AddPendingNode( |
- pProcessor, pOverflowLeaderNode, FALSE); |
- } |
- } |
- } |
- if (pProcessor->m_pLayoutItem->m_pNextSibling) { |
- pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight); |
- rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem()); |
- bAddedItemInRow = TRUE; |
- if (bTakeSpace) { |
- fContentCurRowAvailWidth -= fChildWidth; |
- if (fContentCurRowHeight < fChildHeight) { |
- fContentCurRowHeight = fChildHeight; |
- } |
- } |
- } |
- return XFA_ItemLayoutProcessorResult_PageFullBreak; |
- } else if (fContentCurRowY <= XFA_LAYOUT_FLOAT_PERCISION) { |
- pProcessor->GetCurrentComponentSize(fChildWidth, fChildHeight); |
- if (pProcessor->m_pPageMgr->GetNextAvailContentHeight(fChildHeight)) { |
- CXFA_Node *pTempLeaderNode = NULL, *pTempTrailerNode = NULL; |
- if (pThis->m_pPageMgr) { |
- if (pFormNode == NULL && pLayoutContext) { |
- pFormNode = pLayoutContext->m_pOverflowProcessor->m_pFormNode; |
- } |
- pThis->m_pPageMgr->ProcessOverflow(pFormNode, pTempLeaderNode, |
- pTempTrailerNode, FALSE, TRUE); |
- } |
- if (bUseInherited) { |
- pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, |
- pOverflowTrailerNode, |
- pTrailerLayoutItem, pFormNode); |
- pThis->m_bUseInheriated = TRUE; |
- } |
- return XFA_ItemLayoutProcessorResult_PageFullBreak; |
- } |
- rgCurLineLayoutItems[uHAlign].Add(pProcessor->ExtractLayoutItem()); |
- bAddedItemInRow = TRUE; |
- if (bTakeSpace) { |
- fContentCurRowAvailWidth -= fChildWidth; |
- if (fContentCurRowHeight < fChildHeight) { |
- fContentCurRowHeight = fChildHeight; |
- } |
- } |
- if (eRetValue == XFA_ItemLayoutProcessorResult_Done) { |
- bForceEndPage = FALSE; |
- } |
- return eRetValue; |
- } else { |
- XFA_ATTRIBUTEENUM eLayout = |
- pProcessor->m_pFormNode->GetEnum(XFA_ATTRIBUTE_Layout); |
- if (pProcessor->m_pFormNode->GetIntact() == XFA_ATTRIBUTEENUM_None && |
- eLayout == XFA_ATTRIBUTEENUM_Tb) { |
- if (pThis->m_pPageMgr) { |
- pThis->m_pPageMgr->ProcessOverflow(pFormNode, pOverflowLeaderNode, |
- pOverflowTrailerNode, FALSE, |
- TRUE); |
- } |
- if (pTrailerLayoutItem) { |
- XFA_ItemLayoutProcessor_AddTrailerBeforeSplit(pProcessor, fSplitPos, |
- pTrailerLayoutItem); |
- } |
- if (pProcessor->JudgeLeaderOrTrailerForOccur(pOverflowLeaderNode)) { |
- XFA_ItemLayoutProcessor_AddPendingNode(pProcessor, |
- pOverflowLeaderNode, FALSE); |
- } |
- } else { |
- if (eRetValue == XFA_ItemLayoutProcessorResult_Done) { |
- if (pFormNode == NULL && pLayoutContext) { |
- pFormNode = pLayoutContext->m_pOverflowProcessor->m_pFormNode; |
- } |
- if (pThis->m_pPageMgr) { |
- pThis->m_pPageMgr->ProcessOverflow(pFormNode, pOverflowLeaderNode, |
- pOverflowTrailerNode, FALSE, |
- TRUE); |
- } |
- if (bUseInherited) { |
- pProcessor->ProcessUnUseOverFlow(pOverflowLeaderNode, |
- pOverflowTrailerNode, |
- pTrailerLayoutItem, pFormNode); |
- pThis->m_bUseInheriated = TRUE; |
- } |
- } |
- } |
- return XFA_ItemLayoutProcessorResult_PageFullBreak; |
- } |
- } |
- } else { |
- return XFA_ItemLayoutProcessorResult_RowFullBreak; |
- } |
- return XFA_ItemLayoutProcessorResult_Done; |
-} |
-XFA_ItemLayoutProcessorResult CXFA_ItemLayoutProcessor::DoLayoutFlowedContainer( |
- FX_BOOL bUseBreakControl, |
- XFA_ATTRIBUTEENUM eFlowStrategy, |
- FX_FLOAT fHeightLimit, |
- FX_FLOAT fRealHeight, |
- CXFA_LayoutContext* pContext, |
- FX_BOOL bRootForceTb) { |
- m_bHasAvailHeight = TRUE; |
- FX_FLOAT fContainerWidth = 0, fContainerHeight = 0; |
- FX_BOOL bBreakDone = FALSE; |
- FX_BOOL bContainerWidthAutoSize = TRUE, bContainerHeightAutoSize = TRUE; |
- FX_BOOL bForceEndPage = FALSE; |
- FX_BOOL bIsManualBreak = FALSE; |
- if (m_pCurChildPreprocessor) { |
- m_pCurChildPreprocessor->m_ePreProcessRs = |
- XFA_ItemLayoutProcessorResult_Done; |
- } |
- XFA_ItemLayoutProcessor_CalculateContainerSpecfiedSize( |
- m_pFormNode, fContainerWidth, fContainerHeight, bContainerWidthAutoSize, |
- bContainerHeightAutoSize); |
- if (pContext && pContext->m_bCurColumnWidthAvaiable) { |
- bContainerWidthAutoSize = FALSE; |
- fContainerWidth = pContext->m_fCurColumnWidth; |
- } |
- if (!bContainerHeightAutoSize) { |
- fContainerHeight -= m_fUsedSize; |
- } |
- if (!bContainerHeightAutoSize) { |
- CXFA_Node* pParentNode = m_pFormNode->GetNodeItem(XFA_NODEITEM_Parent); |
- FX_BOOL bFocrTb = FALSE; |
- if (pParentNode && |
- XFA_ItemLayoutProcessor_GetLayout(pParentNode, bFocrTb) == |
- XFA_ATTRIBUTEENUM_Row) { |
- CXFA_Node* pChildContainer = m_pFormNode->GetNodeItem( |
- XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode); |
- if (pChildContainer && |
- pChildContainer->GetNodeItem(XFA_NODEITEM_NextSibling, |
- XFA_OBJECTTYPE_ContainerNode)) { |
- fContainerHeight = 0; |
- bContainerHeightAutoSize = TRUE; |
- } |
- } |
- } |
- CXFA_Node* pMarginNode = |
- m_pFormNode->GetFirstChildByClass(XFA_ELEMENT_Margin); |
- FX_FLOAT fLeftInset = 0, fTopInset = 0, fRightInset = 0, fBottomInset = 0; |
- if (pMarginNode) { |
- fLeftInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_LeftInset).ToUnit(XFA_UNIT_Pt); |
- fTopInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset).ToUnit(XFA_UNIT_Pt); |
- fRightInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_RightInset).ToUnit(XFA_UNIT_Pt); |
- fBottomInset = |
- pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset).ToUnit(XFA_UNIT_Pt); |
- } |
- FX_FLOAT fContentWidthLimit = |
- bContainerWidthAutoSize ? XFA_LAYOUT_FLOAT_MAX |
- : fContainerWidth - fLeftInset - fRightInset; |
- FX_FLOAT fContentCalculatedWidth = 0, fContentCalculatedHeight = 0; |
- FX_FLOAT fAvailHeight = fHeightLimit - fTopInset - fBottomInset; |
- if (fAvailHeight < 0) { |
- m_bHasAvailHeight = FALSE; |
- } |
- fRealHeight = fRealHeight - fTopInset - fBottomInset; |
- FX_FLOAT fContentCurRowY = 0; |
- CXFA_ContentLayoutItem* pLayoutChild = NULL; |
- if (m_pLayoutItem) { |
- if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done && |
- eFlowStrategy != XFA_ATTRIBUTEENUM_Tb) { |
- pLayoutChild = (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild; |
- for (CXFA_ContentLayoutItem* pLayoutNext = pLayoutChild; pLayoutNext; |
- pLayoutNext = (CXFA_ContentLayoutItem*)pLayoutNext->m_pNextSibling) { |
- if (pLayoutNext->m_sPos.y != pLayoutChild->m_sPos.y) { |
- pLayoutChild = pLayoutNext; |
- } |
- } |
- } |
- for (CXFA_ContentLayoutItem* pLayoutTempChild = |
- (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild; |
- pLayoutTempChild != pLayoutChild; |
- pLayoutTempChild = |
- (CXFA_ContentLayoutItem*)pLayoutTempChild->m_pNextSibling) { |
- if (XFA_ItemLayoutProcessor_IsTakingSpace( |
- pLayoutTempChild->m_pFormNode)) { |
- FX_FLOAT fChildContentWidth = |
- pLayoutTempChild->m_sPos.x + pLayoutTempChild->m_sSize.x; |
- FX_FLOAT fChildContentHeight = |
- pLayoutTempChild->m_sPos.y + pLayoutTempChild->m_sSize.y; |
- if (fContentCalculatedWidth < fChildContentWidth) { |
- fContentCalculatedWidth = fChildContentWidth; |
- } |
- if (fContentCalculatedHeight < fChildContentHeight) { |
- fContentCalculatedHeight = fChildContentHeight; |
- } |
- } |
- } |
- if (pLayoutChild) { |
- fContentCurRowY = pLayoutChild->m_sPos.y; |
- } else { |
- fContentCurRowY = fContentCalculatedHeight; |
- } |
- } |
- fContentCurRowY += InsertKeepLayoutItems(); |
- if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_None) { |
- XFA_ItemLayoutProcessor_GotoNextContainerNode( |
- m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE); |
- } |
- fContentCurRowY += |
- XFA_ItemLayoutProcessor_InsertPendingItems(this, m_pFormNode); |
- if (m_pCurChildPreprocessor && |
- m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Container) { |
- if (XFA_ExistContainerKeep(m_pCurChildPreprocessor->GetFormNode(), FALSE)) { |
- m_pKeepHeadNode = m_pCurChildNode; |
- m_bIsProcessKeep = TRUE; |
- m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Keep; |
- } |
- } |
- while (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done) { |
- FX_FLOAT fContentCurRowHeight = 0; |
- FX_FLOAT fContentCurRowAvailWidth = fContentWidthLimit; |
- m_fWidthLimite = fContentCurRowAvailWidth; |
- CFX_ArrayTemplate<CXFA_ContentLayoutItem*> rgCurLineLayoutItems[3]; |
- uint8_t uCurHAlignState = |
- (eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb ? 0 : 2); |
- if (pLayoutChild) { |
- for (CXFA_ContentLayoutItem* pLayoutNext = pLayoutChild; pLayoutNext; |
- pLayoutNext = (CXFA_ContentLayoutItem*)pLayoutNext->m_pNextSibling) { |
- if (pLayoutNext->m_pNextSibling == NULL && m_pCurChildPreprocessor && |
- m_pCurChildPreprocessor->m_pFormNode == pLayoutNext->m_pFormNode) { |
- pLayoutNext->m_pNext = m_pCurChildPreprocessor->m_pLayoutItem; |
- m_pCurChildPreprocessor->m_pLayoutItem = pLayoutNext; |
- break; |
- } |
- uint8_t uHAlign = XFA_ItemLayoutProcessor_HAlignEnumToInt( |
- pLayoutNext->m_pFormNode->GetEnum(XFA_ATTRIBUTE_HAlign)); |
- rgCurLineLayoutItems[uHAlign].Add(pLayoutNext); |
- if (eFlowStrategy == XFA_ATTRIBUTEENUM_Lr_tb) { |
- if (uHAlign > uCurHAlignState) { |
- uCurHAlignState = uHAlign; |
- } |
- } else if (uHAlign < uCurHAlignState) { |
- uCurHAlignState = uHAlign; |
- } |
- if (XFA_ItemLayoutProcessor_IsTakingSpace(pLayoutNext->m_pFormNode)) { |
- if (pLayoutNext->m_sSize.y > fContentCurRowHeight) { |
- fContentCurRowHeight = pLayoutNext->m_sSize.y; |
- } |
- fContentCurRowAvailWidth -= pLayoutNext->m_sSize.x; |
- } |
- } |
- if ((CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild == |
- pLayoutChild) { |
- m_pLayoutItem->m_pFirstChild = NULL; |
- } else { |
- CXFA_ContentLayoutItem* pLayoutNext = |
- (CXFA_ContentLayoutItem*)m_pLayoutItem->m_pFirstChild; |
- for (; pLayoutNext; |
- pLayoutNext = |
- (CXFA_ContentLayoutItem*)pLayoutNext->m_pNextSibling) { |
- if ((CXFA_ContentLayoutItem*)pLayoutNext->m_pNextSibling == |
- pLayoutChild) { |
- pLayoutNext->m_pNextSibling = NULL; |
- break; |
- } |
- } |
- } |
- CXFA_ContentLayoutItem* pLayoutNextTemp = |
- (CXFA_ContentLayoutItem*)pLayoutChild; |
- while (pLayoutNextTemp) { |
- pLayoutNextTemp->m_pParent = NULL; |
- CXFA_ContentLayoutItem* pSaveLayoutNext = |
- (CXFA_ContentLayoutItem*)pLayoutNextTemp->m_pNextSibling; |
- pLayoutNextTemp->m_pNextSibling = NULL; |
- pLayoutNextTemp = pSaveLayoutNext; |
- } |
- pLayoutChild = NULL; |
- } |
- while (m_pCurChildNode) { |
- CXFA_ItemLayoutProcessor* pProcessor = NULL; |
- FX_BOOL bAddedItemInRow = FALSE; |
- fContentCurRowY += |
- XFA_ItemLayoutProcessor_InsertPendingItems(this, m_pFormNode); |
- switch (m_nCurChildNodeStage) { |
- case XFA_ItemLayoutProcessorStages_Keep: |
- case XFA_ItemLayoutProcessorStages_None: |
- break; |
- case XFA_ItemLayoutProcessorStages_BreakBefore: { |
- for (int32_t iIndex = 0; iIndex < m_arrayKeepItems.GetSize(); |
- iIndex++) { |
- CXFA_ContentLayoutItem* pItem = m_arrayKeepItems.GetAt(iIndex); |
- m_pLayoutItem->RemoveChild(pItem); |
- fContentCalculatedHeight -= pItem->m_sSize.y; |
- } |
- CXFA_Node *pLeaderNode = NULL, *pTrailerNode = NULL; |
- FX_BOOL bCreatePage = FALSE; |
- if (bUseBreakControl && m_pPageMgr && |
- m_pPageMgr->ProcessBreakBeforeOrAfter(m_pCurChildNode, TRUE, |
- pLeaderNode, pTrailerNode, |
- bCreatePage) && |
- m_pFormNode->GetClassID() != XFA_ELEMENT_Form && bCreatePage) { |
- if (JudgeLeaderOrTrailerForOccur(pLeaderNode)) { |
- XFA_ItemLayoutProcessor_AddPendingNode(this, pLeaderNode, TRUE); |
- } |
- if (JudgeLeaderOrTrailerForOccur(pTrailerNode)) { |
- if (m_pFormNode->GetNodeItem(XFA_NODEITEM_Parent)->GetClassID() == |
- XFA_ELEMENT_Form && |
- m_pLayoutItem == NULL) { |
- XFA_ItemLayoutProcessor_AddPendingNode(this, pTrailerNode, |
- TRUE); |
- } else { |
- CXFA_ItemLayoutProcessor* pProcessor = |
- new CXFA_ItemLayoutProcessor(pTrailerNode, NULL); |
- XFA_ItemLayoutProcessor_InsertFlowedItem( |
- this, pProcessor, bContainerWidthAutoSize, |
- bContainerHeightAutoSize, fContainerHeight, eFlowStrategy, |
- uCurHAlignState, rgCurLineLayoutItems, FALSE, |
- XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY, |
- fContentWidthLimit, fContentCurRowAvailWidth, |
- fContentCurRowHeight, bAddedItemInRow, bForceEndPage, |
- pContext); |
- delete pProcessor; |
- pProcessor = NULL; |
- } |
- } |
- XFA_ItemLayoutProcessor_GotoNextContainerNode( |
- m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE); |
- bForceEndPage = TRUE; |
- bIsManualBreak = TRUE; |
- goto SuspendAndCreateNewRow; |
- } |
- } break; |
- case XFA_ItemLayoutProcessorStages_BreakAfter: { |
- CXFA_Node *pLeaderNode = NULL, *pTrailerNode = NULL; |
- FX_BOOL bCreatePage = FALSE; |
- if (bUseBreakControl && m_pPageMgr && |
- m_pPageMgr->ProcessBreakBeforeOrAfter(m_pCurChildNode, FALSE, |
- pLeaderNode, pTrailerNode, |
- bCreatePage) && |
- m_pFormNode->GetClassID() != XFA_ELEMENT_Form) { |
- if (JudgeLeaderOrTrailerForOccur(pTrailerNode)) { |
- CXFA_ItemLayoutProcessor* pProcessor = |
- new CXFA_ItemLayoutProcessor(pTrailerNode, NULL); |
- XFA_ItemLayoutProcessor_InsertFlowedItem( |
- this, pProcessor, bContainerWidthAutoSize, |
- bContainerHeightAutoSize, fContainerHeight, eFlowStrategy, |
- uCurHAlignState, rgCurLineLayoutItems, FALSE, |
- XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY, |
- fContentWidthLimit, fContentCurRowAvailWidth, |
- fContentCurRowHeight, bAddedItemInRow, bForceEndPage, |
- pContext); |
- delete pProcessor; |
- pProcessor = NULL; |
- } |
- if (!bCreatePage) { |
- if (JudgeLeaderOrTrailerForOccur(pLeaderNode)) { |
- CalculateRowChildPosition( |
- rgCurLineLayoutItems, eFlowStrategy, |
- bContainerHeightAutoSize, bContainerWidthAutoSize, |
- fContentCalculatedWidth, fContentCalculatedHeight, |
- fContentCurRowY, fContentCurRowHeight, fContentWidthLimit); |
- rgCurLineLayoutItems->RemoveAll(); |
- CXFA_ItemLayoutProcessor* pProcessor = |
- new CXFA_ItemLayoutProcessor(pLeaderNode, NULL); |
- XFA_ItemLayoutProcessor_InsertFlowedItem( |
- this, pProcessor, bContainerWidthAutoSize, |
- bContainerHeightAutoSize, fContainerHeight, eFlowStrategy, |
- uCurHAlignState, rgCurLineLayoutItems, FALSE, |
- XFA_LAYOUT_FLOAT_MAX, XFA_LAYOUT_FLOAT_MAX, fContentCurRowY, |
- fContentWidthLimit, fContentCurRowAvailWidth, |
- fContentCurRowHeight, bAddedItemInRow, bForceEndPage, |
- pContext); |
- delete pProcessor; |
- pProcessor = NULL; |
- } |
- } else { |
- if (JudgeLeaderOrTrailerForOccur(pLeaderNode)) { |
- XFA_ItemLayoutProcessor_AddPendingNode(this, pLeaderNode, TRUE); |
- } |
- } |
- XFA_ItemLayoutProcessor_GotoNextContainerNode( |
- m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE); |
- if (bCreatePage) { |
- bForceEndPage = TRUE; |
- bIsManualBreak = TRUE; |
- if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done) { |
- bBreakDone = TRUE; |
- } |
- } |
- goto SuspendAndCreateNewRow; |
- } |
- } break; |
- case XFA_ItemLayoutProcessorStages_BookendLeader: { |
- CXFA_Node* pLeaderNode = NULL; |
- if (m_pCurChildPreprocessor) { |
- pProcessor = m_pCurChildPreprocessor; |
- m_pCurChildPreprocessor = NULL; |
- } else if (m_pPageMgr && |
- m_pPageMgr->ProcessBookendLeaderOrTrailer( |
- m_pCurChildNode, TRUE, pLeaderNode)) { |
- pProcessor = new CXFA_ItemLayoutProcessor(pLeaderNode, m_pPageMgr); |
- } |
- if (pProcessor) { |
- if (XFA_ItemLayoutProcessor_InsertFlowedItem( |
- this, pProcessor, bContainerWidthAutoSize, |
- bContainerHeightAutoSize, fContainerHeight, eFlowStrategy, |
- uCurHAlignState, rgCurLineLayoutItems, bUseBreakControl, |
- fAvailHeight, fRealHeight, fContentCurRowY, |
- fContentWidthLimit, fContentCurRowAvailWidth, |
- fContentCurRowHeight, bAddedItemInRow, bForceEndPage, |
- pContext) != XFA_ItemLayoutProcessorResult_Done) { |
- goto SuspendAndCreateNewRow; |
- } else { |
- delete pProcessor; |
- pProcessor = NULL; |
- } |
- } |
- } break; |
- case XFA_ItemLayoutProcessorStages_BookendTrailer: { |
- CXFA_Node* pTrailerNode = NULL; |
- if (m_pCurChildPreprocessor) { |
- pProcessor = m_pCurChildPreprocessor; |
- m_pCurChildPreprocessor = NULL; |
- } else if (m_pPageMgr && |
- m_pPageMgr->ProcessBookendLeaderOrTrailer( |
- m_pCurChildNode, FALSE, pTrailerNode)) { |
- pProcessor = new CXFA_ItemLayoutProcessor(pTrailerNode, m_pPageMgr); |
- } |
- if (pProcessor) { |
- if (XFA_ItemLayoutProcessor_InsertFlowedItem( |
- this, pProcessor, bContainerWidthAutoSize, |
- bContainerHeightAutoSize, fContainerHeight, eFlowStrategy, |
- uCurHAlignState, rgCurLineLayoutItems, bUseBreakControl, |
- fAvailHeight, fRealHeight, fContentCurRowY, |
- fContentWidthLimit, fContentCurRowAvailWidth, |
- fContentCurRowHeight, bAddedItemInRow, bForceEndPage, |
- pContext) != XFA_ItemLayoutProcessorResult_Done) { |
- goto SuspendAndCreateNewRow; |
- } else { |
- delete pProcessor; |
- pProcessor = NULL; |
- } |
- } |
- } break; |
- case XFA_ItemLayoutProcessorStages_Container: |
- ASSERT(m_pCurChildNode->IsContainerNode()); |
- if (m_pCurChildNode->GetClassID() == XFA_ELEMENT_Variables) { |
- break; |
- } |
- if (fContentCurRowY >= fHeightLimit + XFA_LAYOUT_FLOAT_PERCISION && |
- XFA_ItemLayoutProcessor_IsTakingSpace(m_pCurChildNode)) { |
- bForceEndPage = TRUE; |
- goto SuspendAndCreateNewRow; |
- } |
- if (m_pCurChildNode->IsContainerNode()) { |
- FX_BOOL bNewRow = FALSE; |
- if (m_pCurChildPreprocessor) { |
- pProcessor = m_pCurChildPreprocessor; |
- m_pCurChildPreprocessor = NULL; |
- bNewRow = TRUE; |
- } else { |
- pProcessor = |
- new CXFA_ItemLayoutProcessor(m_pCurChildNode, m_pPageMgr); |
- } |
- XFA_ItemLayoutProcessor_InsertPendingItems(pProcessor, |
- m_pCurChildNode); |
- XFA_ItemLayoutProcessorResult rs = |
- XFA_ItemLayoutProcessor_InsertFlowedItem( |
- this, pProcessor, bContainerWidthAutoSize, |
- bContainerHeightAutoSize, fContainerHeight, eFlowStrategy, |
- uCurHAlignState, rgCurLineLayoutItems, bUseBreakControl, |
- fAvailHeight, fRealHeight, fContentCurRowY, |
- fContentWidthLimit, fContentCurRowAvailWidth, |
- fContentCurRowHeight, bAddedItemInRow, bForceEndPage, |
- pContext, bNewRow); |
- switch (rs) { |
- case XFA_ItemLayoutProcessorResult_ManualBreak: |
- bIsManualBreak = TRUE; |
- case XFA_ItemLayoutProcessorResult_PageFullBreak: |
- bForceEndPage = TRUE; |
- case XFA_ItemLayoutProcessorResult_RowFullBreak: |
- goto SuspendAndCreateNewRow; |
- case XFA_ItemLayoutProcessorResult_Done: |
- default: |
- fContentCurRowY += XFA_ItemLayoutProcessor_InsertPendingItems( |
- pProcessor, m_pCurChildNode); |
- delete pProcessor; |
- pProcessor = NULL; |
- } |
- } |
- break; |
- case XFA_ItemLayoutProcessorStages_Done: |
- break; |
- default: |
- break; |
- } |
- XFA_ItemLayoutProcessor_GotoNextContainerNode( |
- m_pCurChildNode, m_nCurChildNodeStage, m_pFormNode, TRUE); |
- if (bAddedItemInRow && eFlowStrategy == XFA_ATTRIBUTEENUM_Tb) { |
- break; |
- } else { |
- continue; |
- } |
- SuspendAndCreateNewRow: |
- if (pProcessor) { |
- m_pCurChildPreprocessor = pProcessor; |
- } |
- break; |
- } |
- CalculateRowChildPosition(rgCurLineLayoutItems, eFlowStrategy, |
- bContainerHeightAutoSize, bContainerWidthAutoSize, |
- fContentCalculatedWidth, fContentCalculatedHeight, |
- fContentCurRowY, fContentCurRowHeight, |
- fContentWidthLimit, bRootForceTb); |
- m_fWidthLimite = fContentCurRowAvailWidth; |
- if (bForceEndPage) { |
- break; |
- } |
- } |
- FX_BOOL bRetValue = |
- m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages_Done && |
- m_PendingNodes.empty(); |
- if (bBreakDone) { |
- bRetValue = FALSE; |
- } |
- XFA_ItemLayoutProcessor_CalculateContainerComponentSizeFromContentSize( |
- m_pFormNode, bContainerWidthAutoSize, fContentCalculatedWidth, |
- fContainerWidth, bContainerHeightAutoSize, fContentCalculatedHeight, |
- fContainerHeight); |
- if (fContainerHeight >= XFA_LAYOUT_FLOAT_PERCISION || m_pLayoutItem || |
- bRetValue) { |
- if (m_pLayoutItem == NULL) { |
- m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); |
- } |
- if (fContainerHeight < 0) { |
- fContainerHeight = 0; |
- } |
- SetCurrentComponentSize(fContainerWidth, fContainerHeight); |
- if (bForceEndPage) { |
- m_fUsedSize = 0; |
- } else { |
- m_fUsedSize += m_pLayoutItem->m_sSize.y; |
- } |
- } |
- return bRetValue |
- ? XFA_ItemLayoutProcessorResult_Done |
- : (bIsManualBreak ? XFA_ItemLayoutProcessorResult_ManualBreak |
- : XFA_ItemLayoutProcessorResult_PageFullBreak); |
-} |
-FX_BOOL CXFA_ItemLayoutProcessor::CalculateRowChildPosition( |
- CFX_ArrayTemplate<CXFA_ContentLayoutItem*>(&rgCurLineLayoutItems)[3], |
- XFA_ATTRIBUTEENUM eFlowStrategy, |
- FX_BOOL bContainerHeightAutoSize, |
- FX_BOOL bContainerWidthAutoSize, |
- FX_FLOAT& fContentCalculatedWidth, |
- FX_FLOAT& fContentCalculatedHeight, |
- FX_FLOAT& fContentCurRowY, |
- FX_FLOAT fContentCurRowHeight, |
- FX_FLOAT fContentWidthLimit, |
- FX_BOOL bRootForceTb) { |
- int32_t nGroupLengths[3] = {0, 0, 0}; |
- FX_FLOAT fGroupWidths[3] = {0, 0, 0}; |
- int32_t nTotalLength = 0; |
- for (int32_t i = 0; i < 3; i++) { |
- nGroupLengths[i] = rgCurLineLayoutItems[i].GetSize(); |
- for (int32_t c = nGroupLengths[i], j = 0; j < c; j++) { |
- nTotalLength++; |
- if (XFA_ItemLayoutProcessor_IsTakingSpace( |
- rgCurLineLayoutItems[i][j]->m_pFormNode)) { |
- fGroupWidths[i] += rgCurLineLayoutItems[i][j]->m_sSize.x; |
- } |
- } |
- } |
- if (!nTotalLength) { |
- if (bContainerHeightAutoSize) { |
- FX_FLOAT fNewHeight = fContentCurRowY; |
- if (fContentCalculatedHeight > fNewHeight) { |
- fContentCalculatedHeight = fNewHeight; |
- } |
- } |
- return FALSE; |
- } |
- if (m_pLayoutItem == NULL) { |
- m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); |
- } |
- if (eFlowStrategy != XFA_ATTRIBUTEENUM_Rl_tb) { |
- FX_FLOAT fCurPos; |
- fCurPos = 0; |
- for (int32_t c = nGroupLengths[0], j = 0; j < c; j++) { |
- if (bRootForceTb) { |
- FX_FLOAT fAbsoluteX, fAbsoluteY; |
- CalculatePositionedContainerPos(rgCurLineLayoutItems[0][j]->m_pFormNode, |
- rgCurLineLayoutItems[0][j]->m_sSize.x, |
- rgCurLineLayoutItems[0][j]->m_sSize.y, |
- fAbsoluteX, fAbsoluteY); |
- rgCurLineLayoutItems[0][j]->m_sPos = CFX_PointF(fAbsoluteX, fAbsoluteY); |
- } else { |
- rgCurLineLayoutItems[0][j]->m_sPos = |
- CFX_PointF(fCurPos, fContentCurRowY); |
- if (XFA_ItemLayoutProcessor_IsTakingSpace( |
- rgCurLineLayoutItems[0][j]->m_pFormNode)) { |
- fCurPos += rgCurLineLayoutItems[0][j]->m_sSize.x; |
- } |
- } |
- m_pLayoutItem->AddChild(rgCurLineLayoutItems[0][j]); |
- m_fLastRowWidth = fCurPos; |
- } |
- fCurPos = (fContentWidthLimit + fGroupWidths[0] - fGroupWidths[1] - |
- fGroupWidths[2]) / |
- 2; |
- for (int32_t c = nGroupLengths[1], j = 0; j < c; j++) { |
- if (bRootForceTb) { |
- FX_FLOAT fAbsoluteX, fAbsoluteY; |
- CalculatePositionedContainerPos(rgCurLineLayoutItems[1][j]->m_pFormNode, |
- rgCurLineLayoutItems[1][j]->m_sSize.x, |
- rgCurLineLayoutItems[1][j]->m_sSize.y, |
- fAbsoluteX, fAbsoluteY); |
- rgCurLineLayoutItems[1][j]->m_sPos = CFX_PointF(fAbsoluteX, fAbsoluteY); |
- } else { |
- rgCurLineLayoutItems[1][j]->m_sPos = |
- CFX_PointF(fCurPos, fContentCurRowY); |
- if (XFA_ItemLayoutProcessor_IsTakingSpace( |
- rgCurLineLayoutItems[1][j]->m_pFormNode)) { |
- fCurPos += rgCurLineLayoutItems[1][j]->m_sSize.x; |
- } |
- } |
- m_pLayoutItem->AddChild(rgCurLineLayoutItems[1][j]); |
- m_fLastRowWidth = fCurPos; |
- } |
- fCurPos = fContentWidthLimit - fGroupWidths[2]; |
- for (int32_t c = nGroupLengths[2], j = 0; j < c; j++) { |
- if (bRootForceTb) { |
- FX_FLOAT fAbsoluteX, fAbsoluteY; |
- CalculatePositionedContainerPos(rgCurLineLayoutItems[2][j]->m_pFormNode, |
- rgCurLineLayoutItems[2][j]->m_sSize.x, |
- rgCurLineLayoutItems[2][j]->m_sSize.y, |
- fAbsoluteX, fAbsoluteY); |
- rgCurLineLayoutItems[2][j]->m_sPos = CFX_PointF(fAbsoluteX, fAbsoluteY); |
- } else { |
- rgCurLineLayoutItems[2][j]->m_sPos = |
- CFX_PointF(fCurPos, fContentCurRowY); |
- if (XFA_ItemLayoutProcessor_IsTakingSpace( |
- rgCurLineLayoutItems[2][j]->m_pFormNode)) { |
- fCurPos += rgCurLineLayoutItems[2][j]->m_sSize.x; |
- } |
- } |
- m_pLayoutItem->AddChild(rgCurLineLayoutItems[2][j]); |
- m_fLastRowWidth = fCurPos; |
- } |
- } else { |
- FX_FLOAT fCurPos; |
- fCurPos = fGroupWidths[0]; |
- for (int32_t c = nGroupLengths[0], j = 0; j < c; j++) { |
- if (XFA_ItemLayoutProcessor_IsTakingSpace( |
- rgCurLineLayoutItems[0][j]->m_pFormNode)) { |
- fCurPos -= rgCurLineLayoutItems[0][j]->m_sSize.x; |
- } |
- rgCurLineLayoutItems[0][j]->m_sPos = CFX_PointF(fCurPos, fContentCurRowY); |
- m_pLayoutItem->AddChild(rgCurLineLayoutItems[0][j]); |
- m_fLastRowWidth = fCurPos; |
- } |
- fCurPos = (fContentWidthLimit + fGroupWidths[0] + fGroupWidths[1] - |
- fGroupWidths[2]) / |
- 2; |
- for (int32_t c = nGroupLengths[1], j = 0; j < c; j++) { |
- if (XFA_ItemLayoutProcessor_IsTakingSpace( |
- rgCurLineLayoutItems[1][j]->m_pFormNode)) { |
- fCurPos -= rgCurLineLayoutItems[1][j]->m_sSize.x; |
- } |
- rgCurLineLayoutItems[1][j]->m_sPos = CFX_PointF(fCurPos, fContentCurRowY); |
- m_pLayoutItem->AddChild(rgCurLineLayoutItems[1][j]); |
- m_fLastRowWidth = fCurPos; |
- } |
- fCurPos = fContentWidthLimit; |
- for (int32_t c = nGroupLengths[2], j = 0; j < c; j++) { |
- if (XFA_ItemLayoutProcessor_IsTakingSpace( |
- rgCurLineLayoutItems[2][j]->m_pFormNode)) { |
- fCurPos -= rgCurLineLayoutItems[2][j]->m_sSize.x; |
- } |
- rgCurLineLayoutItems[2][j]->m_sPos = CFX_PointF(fCurPos, fContentCurRowY); |
- m_pLayoutItem->AddChild(rgCurLineLayoutItems[2][j]); |
- m_fLastRowWidth = fCurPos; |
- } |
- } |
- m_fLastRowY = fContentCurRowY; |
- fContentCurRowY += fContentCurRowHeight; |
- if (bContainerWidthAutoSize) { |
- FX_FLOAT fChildSuppliedWidth = fGroupWidths[0]; |
- if (fContentWidthLimit < XFA_LAYOUT_FLOAT_MAX && |
- fContentWidthLimit > fChildSuppliedWidth) { |
- fChildSuppliedWidth = fContentWidthLimit; |
- } |
- if (fContentCalculatedWidth < fChildSuppliedWidth) { |
- fContentCalculatedWidth = fChildSuppliedWidth; |
- } |
- } |
- if (bContainerHeightAutoSize) { |
- FX_FLOAT fChildSuppliedHeight = fContentCurRowY; |
- if (fContentCalculatedHeight < fChildSuppliedHeight) { |
- fContentCalculatedHeight = fChildSuppliedHeight; |
- } |
- } |
- return TRUE; |
-} |
-CXFA_Node* CXFA_ItemLayoutProcessor::GetSubformSetParent( |
- CXFA_Node* pSubformSet) { |
- if (pSubformSet && pSubformSet->GetClassID() == XFA_ELEMENT_SubformSet) { |
- CXFA_Node* pParent = pSubformSet->GetNodeItem(XFA_NODEITEM_Parent); |
- while (pParent) { |
- if (pParent->GetClassID() != XFA_ELEMENT_SubformSet) { |
- return pParent; |
- } |
- pParent = pParent->GetNodeItem(XFA_NODEITEM_Parent); |
- } |
- } |
- return pSubformSet; |
-} |
-void CXFA_ItemLayoutProcessor::DoLayoutField() { |
- if (m_pLayoutItem) |
- return; |
- |
- ASSERT(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE); |
- m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); |
- if (!m_pLayoutItem) { |
- return; |
- } |
- CXFA_Document* pDocument = m_pFormNode->GetDocument(); |
- IXFA_Notify* pNotify = pDocument->GetParser()->GetNotify(); |
- FX_FLOAT fHeight = -1; |
- FX_FLOAT fWidth = -1; |
- pNotify->StartFieldDrawLayout(m_pFormNode, fWidth, fHeight); |
- int32_t nRotate = |
- FXSYS_round(m_pFormNode->GetMeasure(XFA_ATTRIBUTE_Rotate).GetValue()); |
- nRotate = XFA_MapRotation(nRotate); |
- if (nRotate == 90 || nRotate == 270) { |
- FX_FLOAT fTmp = fWidth; |
- fWidth = fHeight; |
- fHeight = fTmp; |
- } |
- SetCurrentComponentSize(fWidth, fHeight); |
-} |
-XFA_ItemLayoutProcessorResult CXFA_ItemLayoutProcessor::DoLayout( |
- FX_BOOL bUseBreakControl, |
- FX_FLOAT fHeightLimit, |
- FX_FLOAT fRealHeight, |
- CXFA_LayoutContext* pContext) { |
- XFA_ELEMENT eClassID = m_pFormNode->GetClassID(); |
- switch (eClassID) { |
- case XFA_ELEMENT_Subform: |
- case XFA_ELEMENT_Area: |
- case XFA_ELEMENT_ExclGroup: |
- case XFA_ELEMENT_SubformSet: { |
- FX_BOOL bRootForceTb = FALSE; |
- CXFA_Node* pLayoutNode = GetSubformSetParent(m_pFormNode); |
- XFA_ATTRIBUTEENUM eLayoutStrategy = |
- XFA_ItemLayoutProcessor_GetLayout(pLayoutNode, bRootForceTb); |
- switch (eLayoutStrategy) { |
- case XFA_ATTRIBUTEENUM_Tb: |
- case XFA_ATTRIBUTEENUM_Lr_tb: |
- case XFA_ATTRIBUTEENUM_Rl_tb: |
- return DoLayoutFlowedContainer(bUseBreakControl, eLayoutStrategy, |
- fHeightLimit, fRealHeight, pContext, |
- bRootForceTb); |
- case XFA_ATTRIBUTEENUM_Position: |
- case XFA_ATTRIBUTEENUM_Row: |
- case XFA_ATTRIBUTEENUM_Rl_row: |
- default: |
- DoLayoutPositionedContainer(pContext); |
- m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done; |
- return XFA_ItemLayoutProcessorResult_Done; |
- case XFA_ATTRIBUTEENUM_Table: |
- DoLayoutTableContainer(pLayoutNode); |
- m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done; |
- return XFA_ItemLayoutProcessorResult_Done; |
- } |
- } |
- case XFA_ELEMENT_Draw: |
- case XFA_ELEMENT_Field: |
- DoLayoutField(); |
- m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages_Done; |
- return XFA_ItemLayoutProcessorResult_Done; |
- case XFA_ELEMENT_ContentArea: |
- return XFA_ItemLayoutProcessorResult_Done; |
- default: |
- return XFA_ItemLayoutProcessorResult_Done; |
- } |
-} |
-void CXFA_ItemLayoutProcessor::GetCurrentComponentPos(FX_FLOAT& fAbsoluteX, |
- FX_FLOAT& fAbsoluteY) { |
- ASSERT(m_pLayoutItem); |
- fAbsoluteX = m_pLayoutItem->m_sPos.x; |
- fAbsoluteY = m_pLayoutItem->m_sPos.y; |
-} |
-void CXFA_ItemLayoutProcessor::GetCurrentComponentSize(FX_FLOAT& fWidth, |
- FX_FLOAT& fHeight) { |
- ASSERT(m_pLayoutItem); |
- fWidth = m_pLayoutItem->m_sSize.x; |
- fHeight = m_pLayoutItem->m_sSize.y; |
-} |
-void CXFA_ItemLayoutProcessor::SetCurrentComponentPos(FX_FLOAT fAbsoluteX, |
- FX_FLOAT fAbsoluteY) { |
- m_pLayoutItem->m_sPos = CFX_PointF(fAbsoluteX, fAbsoluteY); |
-} |
-void CXFA_ItemLayoutProcessor::SetCurrentComponentSize(FX_FLOAT fWidth, |
- FX_FLOAT fHeight) { |
- m_pLayoutItem->m_sSize = CFX_SizeF(fWidth, fHeight); |
-} |
-FX_BOOL CXFA_ItemLayoutProcessor::JudgeLeaderOrTrailerForOccur( |
- CXFA_Node* pFormNode) { |
- if (pFormNode == NULL) { |
- return FALSE; |
- } |
- CXFA_Node* pTemplate = pFormNode->GetTemplateNode(); |
- if (!pTemplate) { |
- pTemplate = pFormNode; |
- } |
- CXFA_Occur NodeOccur(pTemplate->GetFirstChildByClass(XFA_ELEMENT_Occur)); |
- int32_t iMax = NodeOccur.GetMax(); |
- if (iMax > -1) { |
- int32_t iCount = |
- (int32_t)(uintptr_t)m_PendingNodesCount.GetValueAt(pTemplate); |
- if (iCount >= iMax) { |
- return FALSE; |
- } |
- iCount++; |
- m_PendingNodesCount.SetAt(pTemplate, (void*)(uintptr_t)(iCount)); |
- return TRUE; |
- } |
- return TRUE; |
-} |