| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "xfa/fxfa/parser/xfa_layout_itemlayout.h" | 7 #include "xfa/fxfa/parser/xfa_layout_itemlayout.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| 11 | 11 |
| 12 #include "xfa/fxfa/app/xfa_ffnotify.h" | 12 #include "xfa/fxfa/app/xfa_ffnotify.h" |
| 13 #include "xfa/fxfa/parser/cxfa_occur.h" | 13 #include "xfa/fxfa/parser/cxfa_occur.h" |
| 14 #include "xfa/fxfa/parser/xfa_doclayout.h" | 14 #include "xfa/fxfa/parser/xfa_doclayout.h" |
| 15 #include "xfa/fxfa/parser/xfa_document.h" | 15 #include "xfa/fxfa/parser/xfa_document.h" |
| 16 #include "xfa/fxfa/parser/xfa_document_layout_imp.h" | 16 #include "xfa/fxfa/parser/xfa_document_layout_imp.h" |
| 17 #include "xfa/fxfa/parser/xfa_layout_appadapter.h" | 17 #include "xfa/fxfa/parser/xfa_layout_appadapter.h" |
| 18 #include "xfa/fxfa/parser/xfa_layout_pagemgr_new.h" | 18 #include "xfa/fxfa/parser/xfa_layout_pagemgr_new.h" |
| 19 #include "xfa/fxfa/parser/xfa_localemgr.h" | 19 #include "xfa/fxfa/parser/xfa_localemgr.h" |
| 20 #include "xfa/fxfa/parser/xfa_object.h" | 20 #include "xfa/fxfa/parser/xfa_object.h" |
| 21 #include "xfa/fxfa/parser/xfa_parser.h" | |
| 22 #include "xfa/fxfa/parser/xfa_parser_imp.h" | 21 #include "xfa/fxfa/parser/xfa_parser_imp.h" |
| 23 #include "xfa/fxfa/parser/xfa_script.h" | 22 #include "xfa/fxfa/parser/xfa_script.h" |
| 24 #include "xfa/fxfa/parser/xfa_utils.h" | 23 #include "xfa/fxfa/parser/xfa_utils.h" |
| 25 | 24 |
| 26 namespace { | 25 namespace { |
| 27 | 26 |
| 28 int32_t SeparateStringW(const FX_WCHAR* pStr, | 27 int32_t SeparateStringW(const FX_WCHAR* pStr, |
| 29 int32_t iStrLen, | 28 int32_t iStrLen, |
| 30 FX_WCHAR delimiter, | 29 FX_WCHAR delimiter, |
| 31 CFX_WideStringArray& pieces) { | 30 CFX_WideStringArray& pieces) { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 if (!pFormNode) { | 84 if (!pFormNode) { |
| 86 return nullptr; | 85 return nullptr; |
| 87 } | 86 } |
| 88 CXFA_ContentLayoutItem* pLayoutItem = nullptr; | 87 CXFA_ContentLayoutItem* pLayoutItem = nullptr; |
| 89 if (m_pOldLayoutItem) { | 88 if (m_pOldLayoutItem) { |
| 90 pLayoutItem = m_pOldLayoutItem; | 89 pLayoutItem = m_pOldLayoutItem; |
| 91 m_pOldLayoutItem = m_pOldLayoutItem->m_pNext; | 90 m_pOldLayoutItem = m_pOldLayoutItem->m_pNext; |
| 92 return pLayoutItem; | 91 return pLayoutItem; |
| 93 } | 92 } |
| 94 pLayoutItem = (CXFA_ContentLayoutItem*)pFormNode->GetDocument() | 93 pLayoutItem = (CXFA_ContentLayoutItem*)pFormNode->GetDocument() |
| 95 ->GetParser() | |
| 96 ->GetNotify() | 94 ->GetNotify() |
| 97 ->OnCreateLayoutItem(pFormNode); | 95 ->OnCreateLayoutItem(pFormNode); |
| 98 CXFA_ContentLayoutItem* pPrevLayoutItem = | 96 CXFA_ContentLayoutItem* pPrevLayoutItem = |
| 99 (CXFA_ContentLayoutItem*)pFormNode->GetUserData(XFA_LAYOUTITEMKEY); | 97 (CXFA_ContentLayoutItem*)pFormNode->GetUserData(XFA_LAYOUTITEMKEY); |
| 100 if (pPrevLayoutItem) { | 98 if (pPrevLayoutItem) { |
| 101 while (pPrevLayoutItem->m_pNext) { | 99 while (pPrevLayoutItem->m_pNext) { |
| 102 pPrevLayoutItem = pPrevLayoutItem->m_pNext; | 100 pPrevLayoutItem = pPrevLayoutItem->m_pNext; |
| 103 } | 101 } |
| 104 pPrevLayoutItem->m_pNext = pLayoutItem; | 102 pPrevLayoutItem->m_pNext = pLayoutItem; |
| 105 pLayoutItem->m_pPrev = pPrevLayoutItem; | 103 pLayoutItem->m_pPrev = pPrevLayoutItem; |
| 106 } else { | 104 } else { |
| 107 pFormNode->SetUserData(XFA_LAYOUTITEMKEY, pLayoutItem); | 105 pFormNode->SetUserData(XFA_LAYOUTITEMKEY, pLayoutItem); |
| 108 } | 106 } |
| 109 return pLayoutItem; | 107 return pLayoutItem; |
| 110 } | 108 } |
| 111 FX_BOOL CXFA_ItemLayoutProcessor::FindLayoutItemSplitPos( | 109 FX_BOOL CXFA_ItemLayoutProcessor::FindLayoutItemSplitPos( |
| 112 CXFA_ContentLayoutItem* pLayoutItem, | 110 CXFA_ContentLayoutItem* pLayoutItem, |
| 113 FX_FLOAT fCurVerticalOffset, | 111 FX_FLOAT fCurVerticalOffset, |
| 114 FX_FLOAT& fProposedSplitPos, | 112 FX_FLOAT& fProposedSplitPos, |
| 115 FX_BOOL& bAppChange, | 113 FX_BOOL& bAppChange, |
| 116 FX_BOOL bCalculateMargin) { | 114 FX_BOOL bCalculateMargin) { |
| 117 CXFA_Node* pFormNode = pLayoutItem->m_pFormNode; | 115 CXFA_Node* pFormNode = pLayoutItem->m_pFormNode; |
| 118 if (fProposedSplitPos > fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION && | 116 if (fProposedSplitPos > fCurVerticalOffset + XFA_LAYOUT_FLOAT_PERCISION && |
| 119 fProposedSplitPos <= fCurVerticalOffset + pLayoutItem->m_sSize.y - | 117 fProposedSplitPos <= fCurVerticalOffset + pLayoutItem->m_sSize.y - |
| 120 XFA_LAYOUT_FLOAT_PERCISION) { | 118 XFA_LAYOUT_FLOAT_PERCISION) { |
| 121 switch (pFormNode->GetIntact()) { | 119 switch (pFormNode->GetIntact()) { |
| 122 case XFA_ATTRIBUTEENUM_None: { | 120 case XFA_ATTRIBUTEENUM_None: { |
| 123 FX_BOOL bAnyChanged = FALSE; | 121 FX_BOOL bAnyChanged = FALSE; |
| 124 CXFA_Document* pDocument = pFormNode->GetDocument(); | 122 CXFA_Document* pDocument = pFormNode->GetDocument(); |
| 125 CXFA_FFNotify* pNotify = pDocument->GetParser()->GetNotify(); | 123 CXFA_FFNotify* pNotify = pDocument->GetNotify(); |
| 126 FX_FLOAT fCurTopMargin = 0, fCurBottomMargin = 0; | 124 FX_FLOAT fCurTopMargin = 0, fCurBottomMargin = 0; |
| 127 CXFA_Node* pMarginNode = | 125 CXFA_Node* pMarginNode = |
| 128 pFormNode->GetFirstChildByClass(XFA_Element::Margin); | 126 pFormNode->GetFirstChildByClass(XFA_Element::Margin); |
| 129 if (pMarginNode && bCalculateMargin) { | 127 if (pMarginNode && bCalculateMargin) { |
| 130 fCurTopMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset) | 128 fCurTopMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_TopInset) |
| 131 .ToUnit(XFA_UNIT_Pt); | 129 .ToUnit(XFA_UNIT_Pt); |
| 132 fCurBottomMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset) | 130 fCurBottomMargin = pMarginNode->GetMeasure(XFA_ATTRIBUTE_BottomInset) |
| 133 .ToUnit(XFA_UNIT_Pt); | 131 .ToUnit(XFA_UNIT_Pt); |
| 134 } | 132 } |
| 135 FX_BOOL bChanged = TRUE; | 133 FX_BOOL bChanged = TRUE; |
| (...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 m_pLayoutItem = | 576 m_pLayoutItem = |
| 579 static_cast<CXFA_ContentLayoutItem*>(pLayoutItem->m_pNextSibling); | 577 static_cast<CXFA_ContentLayoutItem*>(pLayoutItem->m_pNextSibling); |
| 580 pLayoutItem->m_pNextSibling = nullptr; | 578 pLayoutItem->m_pNextSibling = nullptr; |
| 581 } | 579 } |
| 582 if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done || | 580 if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages_Done || |
| 583 !ToContentLayoutItem(m_pOldLayoutItem)) | 581 !ToContentLayoutItem(m_pOldLayoutItem)) |
| 584 return pLayoutItem; | 582 return pLayoutItem; |
| 585 if (m_pOldLayoutItem->m_pPrev) | 583 if (m_pOldLayoutItem->m_pPrev) |
| 586 m_pOldLayoutItem->m_pPrev->m_pNext = nullptr; | 584 m_pOldLayoutItem->m_pPrev->m_pNext = nullptr; |
| 587 CXFA_FFNotify* pNotify = | 585 CXFA_FFNotify* pNotify = |
| 588 m_pOldLayoutItem->m_pFormNode->GetDocument()->GetParser()->GetNotify(); | 586 m_pOldLayoutItem->m_pFormNode->GetDocument()->GetNotify(); |
| 589 CXFA_LayoutProcessor* pDocLayout = | 587 CXFA_LayoutProcessor* pDocLayout = |
| 590 m_pOldLayoutItem->m_pFormNode->GetDocument()->GetDocLayout(); | 588 m_pOldLayoutItem->m_pFormNode->GetDocument()->GetDocLayout(); |
| 591 CXFA_ContentLayoutItem* pOldLayoutItem = m_pOldLayoutItem; | 589 CXFA_ContentLayoutItem* pOldLayoutItem = m_pOldLayoutItem; |
| 592 while (pOldLayoutItem) { | 590 while (pOldLayoutItem) { |
| 593 CXFA_ContentLayoutItem* pNextOldLayoutItem = pOldLayoutItem->m_pNext; | 591 CXFA_ContentLayoutItem* pNextOldLayoutItem = pOldLayoutItem->m_pNext; |
| 594 pNotify->OnLayoutItemRemoving(pDocLayout, pOldLayoutItem); | 592 pNotify->OnLayoutItemRemoving(pDocLayout, pOldLayoutItem); |
| 595 if (pOldLayoutItem->m_pParent) | 593 if (pOldLayoutItem->m_pParent) |
| 596 pOldLayoutItem->m_pParent->RemoveChild(pOldLayoutItem); | 594 pOldLayoutItem->m_pParent->RemoveChild(pOldLayoutItem); |
| 597 delete pOldLayoutItem; | 595 delete pOldLayoutItem; |
| 598 pOldLayoutItem = pNextOldLayoutItem; | 596 pOldLayoutItem = pNextOldLayoutItem; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 default: | 638 default: |
| 641 break; | 639 break; |
| 642 } | 640 } |
| 643 if (bFindRs) { | 641 if (bFindRs) { |
| 644 break; | 642 break; |
| 645 } | 643 } |
| 646 } | 644 } |
| 647 return bFindRs; | 645 return bFindRs; |
| 648 } | 646 } |
| 649 static void XFA_DeleteLayoutGeneratedNode(CXFA_Node* pGenerateNode) { | 647 static void XFA_DeleteLayoutGeneratedNode(CXFA_Node* pGenerateNode) { |
| 650 CXFA_FFNotify* pNotify = | 648 CXFA_FFNotify* pNotify = pGenerateNode->GetDocument()->GetNotify(); |
| 651 pGenerateNode->GetDocument()->GetParser()->GetNotify(); | |
| 652 CXFA_LayoutProcessor* pDocLayout = | 649 CXFA_LayoutProcessor* pDocLayout = |
| 653 pGenerateNode->GetDocument()->GetDocLayout(); | 650 pGenerateNode->GetDocument()->GetDocLayout(); |
| 654 CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> sIterator( | 651 CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFANode> sIterator( |
| 655 pGenerateNode); | 652 pGenerateNode); |
| 656 for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode; | 653 for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode; |
| 657 pNode = sIterator.MoveToNext()) { | 654 pNode = sIterator.MoveToNext()) { |
| 658 CXFA_ContentLayoutItem* pCurLayoutItem = | 655 CXFA_ContentLayoutItem* pCurLayoutItem = |
| 659 (CXFA_ContentLayoutItem*)pNode->GetUserData(XFA_LAYOUTITEMKEY); | 656 (CXFA_ContentLayoutItem*)pNode->GetUserData(XFA_LAYOUTITEMKEY); |
| 660 CXFA_ContentLayoutItem* pNextLayoutItem = nullptr; | 657 CXFA_ContentLayoutItem* pNextLayoutItem = nullptr; |
| 661 while (pCurLayoutItem) { | 658 while (pCurLayoutItem) { |
| (...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1226 if (fWidth < -XFA_LAYOUT_FLOAT_PERCISION) { | 1223 if (fWidth < -XFA_LAYOUT_FLOAT_PERCISION) { |
| 1227 fWidth = pLayoutItem->m_sSize.x; | 1224 fWidth = pLayoutItem->m_sSize.x; |
| 1228 } | 1225 } |
| 1229 if (fHeight < -XFA_LAYOUT_FLOAT_PERCISION) { | 1226 if (fHeight < -XFA_LAYOUT_FLOAT_PERCISION) { |
| 1230 fHeight = pLayoutItem->m_sSize.y; | 1227 fHeight = pLayoutItem->m_sSize.y; |
| 1231 } | 1228 } |
| 1232 break; | 1229 break; |
| 1233 } | 1230 } |
| 1234 case XFA_Element::Draw: | 1231 case XFA_Element::Draw: |
| 1235 case XFA_Element::Field: { | 1232 case XFA_Element::Field: { |
| 1236 pNode->GetDocument()->GetParser()->GetNotify()->StartFieldDrawLayout( | 1233 pNode->GetDocument()->GetNotify()->StartFieldDrawLayout(pNode, fWidth, |
| 1237 pNode, fWidth, fHeight); | 1234 fHeight); |
| 1238 break; | 1235 break; |
| 1239 } | 1236 } |
| 1240 default: | 1237 default: |
| 1241 ASSERT(FALSE); | 1238 ASSERT(FALSE); |
| 1242 } | 1239 } |
| 1243 } | 1240 } |
| 1244 static inline void XFA_ItemLayoutProcessor_RelocateTableRowCells( | 1241 static inline void XFA_ItemLayoutProcessor_RelocateTableRowCells( |
| 1245 CXFA_ContentLayoutItem* pLayoutRow, | 1242 CXFA_ContentLayoutItem* pLayoutRow, |
| 1246 const CFX_ArrayTemplate<FX_FLOAT>& rgSpecifiedColumnWidths, | 1243 const CFX_ArrayTemplate<FX_FLOAT>& rgSpecifiedColumnWidths, |
| 1247 XFA_ATTRIBUTEENUM eLayout) { | 1244 XFA_ATTRIBUTEENUM eLayout) { |
| (...skipping 1641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2889 void CXFA_ItemLayoutProcessor::DoLayoutField() { | 2886 void CXFA_ItemLayoutProcessor::DoLayoutField() { |
| 2890 if (m_pLayoutItem) | 2887 if (m_pLayoutItem) |
| 2891 return; | 2888 return; |
| 2892 | 2889 |
| 2893 ASSERT(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE); | 2890 ASSERT(m_pCurChildNode == XFA_LAYOUT_INVALIDNODE); |
| 2894 m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); | 2891 m_pLayoutItem = CreateContentLayoutItem(m_pFormNode); |
| 2895 if (!m_pLayoutItem) { | 2892 if (!m_pLayoutItem) { |
| 2896 return; | 2893 return; |
| 2897 } | 2894 } |
| 2898 CXFA_Document* pDocument = m_pFormNode->GetDocument(); | 2895 CXFA_Document* pDocument = m_pFormNode->GetDocument(); |
| 2899 CXFA_FFNotify* pNotify = pDocument->GetParser()->GetNotify(); | 2896 CXFA_FFNotify* pNotify = pDocument->GetNotify(); |
| 2900 FX_FLOAT fHeight = -1; | 2897 FX_FLOAT fHeight = -1; |
| 2901 FX_FLOAT fWidth = -1; | 2898 FX_FLOAT fWidth = -1; |
| 2902 pNotify->StartFieldDrawLayout(m_pFormNode, fWidth, fHeight); | 2899 pNotify->StartFieldDrawLayout(m_pFormNode, fWidth, fHeight); |
| 2903 int32_t nRotate = | 2900 int32_t nRotate = |
| 2904 FXSYS_round(m_pFormNode->GetMeasure(XFA_ATTRIBUTE_Rotate).GetValue()); | 2901 FXSYS_round(m_pFormNode->GetMeasure(XFA_ATTRIBUTE_Rotate).GetValue()); |
| 2905 nRotate = XFA_MapRotation(nRotate); | 2902 nRotate = XFA_MapRotation(nRotate); |
| 2906 if (nRotate == 90 || nRotate == 270) { | 2903 if (nRotate == 90 || nRotate == 270) { |
| 2907 FX_FLOAT fTmp = fWidth; | 2904 FX_FLOAT fTmp = fWidth; |
| 2908 fWidth = fHeight; | 2905 fWidth = fHeight; |
| 2909 fHeight = fTmp; | 2906 fHeight = fTmp; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2990 if (iMax < 0) | 2987 if (iMax < 0) |
| 2991 return TRUE; | 2988 return TRUE; |
| 2992 | 2989 |
| 2993 int32_t iCount = m_PendingNodesCount[pTemplate]; | 2990 int32_t iCount = m_PendingNodesCount[pTemplate]; |
| 2994 if (iCount >= iMax) | 2991 if (iCount >= iMax) |
| 2995 return FALSE; | 2992 return FALSE; |
| 2996 | 2993 |
| 2997 m_PendingNodesCount[pTemplate] = iCount + 1; | 2994 m_PendingNodesCount[pTemplate] = iCount + 1; |
| 2998 return TRUE; | 2995 return TRUE; |
| 2999 } | 2996 } |
| OLD | NEW |