| 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/cxfa_layoutpagemgr.h" | 7 #include "xfa/fxfa/parser/cxfa_layoutpagemgr.h" |
| 8 | 8 |
| 9 #include "xfa/fxfa/app/xfa_ffnotify.h" | 9 #include "xfa/fxfa/app/xfa_ffnotify.h" |
| 10 #include "xfa/fxfa/parser/cxfa_containerlayoutitem.h" | 10 #include "xfa/fxfa/parser/cxfa_containerlayoutitem.h" |
| (...skipping 1102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1113 | 1113 |
| 1114 bool CXFA_LayoutPageMgr::FindPageAreaFromPageSet_Ordered( | 1114 bool CXFA_LayoutPageMgr::FindPageAreaFromPageSet_Ordered( |
| 1115 CXFA_Node* pPageSet, | 1115 CXFA_Node* pPageSet, |
| 1116 CXFA_Node* pStartChild, | 1116 CXFA_Node* pStartChild, |
| 1117 CXFA_Node* pTargetPageArea, | 1117 CXFA_Node* pTargetPageArea, |
| 1118 CXFA_Node* pTargetContentArea, | 1118 CXFA_Node* pTargetContentArea, |
| 1119 bool bNewPage, | 1119 bool bNewPage, |
| 1120 bool bQuery) { | 1120 bool bQuery) { |
| 1121 int32_t iPageSetCount = 0; | 1121 int32_t iPageSetCount = 0; |
| 1122 if (!pStartChild && !bQuery) { | 1122 if (!pStartChild && !bQuery) { |
| 1123 m_pPageSetMap.Lookup(pPageSet, iPageSetCount); | 1123 auto it = m_pPageSetMap.find(pPageSet); |
| 1124 if (it != m_pPageSetMap.end()) |
| 1125 iPageSetCount = it->second; |
| 1124 int32_t iMax = -1; | 1126 int32_t iMax = -1; |
| 1125 CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_Element::Occur); | 1127 CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_Element::Occur); |
| 1126 if (pOccurNode) | 1128 if (pOccurNode) |
| 1127 pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, false); | 1129 pOccurNode->TryInteger(XFA_ATTRIBUTE_Max, iMax, false); |
| 1128 if (iMax >= 0 && iMax <= iPageSetCount) | 1130 if (iMax >= 0 && iMax <= iPageSetCount) |
| 1129 return false; | 1131 return false; |
| 1130 } | 1132 } |
| 1131 | |
| 1132 bool bRes = false; | 1133 bool bRes = false; |
| 1133 CXFA_Node* pCurrentNode = | 1134 CXFA_Node* pCurrentNode = |
| 1134 pStartChild ? pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling) | 1135 pStartChild ? pStartChild->GetNodeItem(XFA_NODEITEM_NextSibling) |
| 1135 : pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild); | 1136 : pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild); |
| 1136 for (; pCurrentNode; | 1137 for (; pCurrentNode; |
| 1137 pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { | 1138 pCurrentNode = pCurrentNode->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
| 1138 if (pCurrentNode->GetElementType() == XFA_Element::PageArea) { | 1139 if (pCurrentNode->GetElementType() == XFA_Element::PageArea) { |
| 1139 if ((pTargetPageArea == pCurrentNode || !pTargetPageArea)) { | 1140 if ((pTargetPageArea == pCurrentNode || !pTargetPageArea)) { |
| 1140 if (!pCurrentNode->GetFirstChildByClass(XFA_Element::ContentArea)) { | 1141 if (!pCurrentNode->GetFirstChildByClass(XFA_Element::ContentArea)) { |
| 1141 if (pTargetPageArea == pCurrentNode) { | 1142 if (pTargetPageArea == pCurrentNode) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1166 pTargetPageArea, pTargetContentArea, | 1167 pTargetPageArea, pTargetContentArea, |
| 1167 bNewPage, bQuery)) { | 1168 bNewPage, bQuery)) { |
| 1168 bRes = true; | 1169 bRes = true; |
| 1169 break; | 1170 break; |
| 1170 } | 1171 } |
| 1171 if (!bQuery) | 1172 if (!bQuery) |
| 1172 CreateMinPageSetRecord(pCurrentNode, true); | 1173 CreateMinPageSetRecord(pCurrentNode, true); |
| 1173 } | 1174 } |
| 1174 } | 1175 } |
| 1175 if (!pStartChild && bRes && !bQuery) | 1176 if (!pStartChild && bRes && !bQuery) |
| 1176 m_pPageSetMap.SetAt(pPageSet, ++iPageSetCount); | 1177 m_pPageSetMap[pPageSet] = ++iPageSetCount; |
| 1177 return bRes; | 1178 return bRes; |
| 1178 } | 1179 } |
| 1179 | 1180 |
| 1180 bool CXFA_LayoutPageMgr::FindPageAreaFromPageSet_SimplexDuplex( | 1181 bool CXFA_LayoutPageMgr::FindPageAreaFromPageSet_SimplexDuplex( |
| 1181 CXFA_Node* pPageSet, | 1182 CXFA_Node* pPageSet, |
| 1182 CXFA_Node* pStartChild, | 1183 CXFA_Node* pStartChild, |
| 1183 CXFA_Node* pTargetPageArea, | 1184 CXFA_Node* pTargetPageArea, |
| 1184 CXFA_Node* pTargetContentArea, | 1185 CXFA_Node* pTargetContentArea, |
| 1185 bool bNewPage, | 1186 bool bNewPage, |
| 1186 bool bQuery, | 1187 bool bQuery, |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1407 if (!IsPageSetRootOrderedOccurrence()) | 1408 if (!IsPageSetRootOrderedOccurrence()) |
| 1408 return; | 1409 return; |
| 1409 | 1410 |
| 1410 CXFA_NodeIterator sIterator(m_pTemplatePageSetRoot); | 1411 CXFA_NodeIterator sIterator(m_pTemplatePageSetRoot); |
| 1411 for (CXFA_Node* pPageSetNode = sIterator.GetCurrent(); pPageSetNode; | 1412 for (CXFA_Node* pPageSetNode = sIterator.GetCurrent(); pPageSetNode; |
| 1412 pPageSetNode = sIterator.MoveToNext()) { | 1413 pPageSetNode = sIterator.MoveToNext()) { |
| 1413 if (pPageSetNode->GetElementType() == XFA_Element::PageSet) { | 1414 if (pPageSetNode->GetElementType() == XFA_Element::PageSet) { |
| 1414 XFA_ATTRIBUTEENUM eRelation = | 1415 XFA_ATTRIBUTEENUM eRelation = |
| 1415 pPageSetNode->GetEnum(XFA_ATTRIBUTE_Relation); | 1416 pPageSetNode->GetEnum(XFA_ATTRIBUTE_Relation); |
| 1416 if (eRelation == XFA_ATTRIBUTEENUM_OrderedOccurrence) | 1417 if (eRelation == XFA_ATTRIBUTEENUM_OrderedOccurrence) |
| 1417 m_pPageSetMap.SetAt(pPageSetNode, 0); | 1418 m_pPageSetMap[pPageSetNode] = 0; |
| 1418 } | 1419 } |
| 1419 } | 1420 } |
| 1420 } | 1421 } |
| 1421 | 1422 |
| 1422 int32_t CXFA_LayoutPageMgr::CreateMinPageRecord(CXFA_Node* pPageArea, | 1423 int32_t CXFA_LayoutPageMgr::CreateMinPageRecord(CXFA_Node* pPageArea, |
| 1423 bool bTargetPageArea, | 1424 bool bTargetPageArea, |
| 1424 bool bCreateLast) { | 1425 bool bCreateLast) { |
| 1425 if (!pPageArea) | 1426 if (!pPageArea) |
| 1426 return 0; | 1427 return 0; |
| 1427 | 1428 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1445 } | 1446 } |
| 1446 } | 1447 } |
| 1447 return iMin; | 1448 return iMin; |
| 1448 } | 1449 } |
| 1449 | 1450 |
| 1450 void CXFA_LayoutPageMgr::CreateMinPageSetRecord(CXFA_Node* pPageSet, | 1451 void CXFA_LayoutPageMgr::CreateMinPageSetRecord(CXFA_Node* pPageSet, |
| 1451 bool bCreateAll) { | 1452 bool bCreateAll) { |
| 1452 if (!pPageSet) | 1453 if (!pPageSet) |
| 1453 return; | 1454 return; |
| 1454 | 1455 |
| 1455 int32_t iCurSetCount = 0; | 1456 auto it = m_pPageSetMap.find(pPageSet); |
| 1456 if (!m_pPageSetMap.Lookup(pPageSet, iCurSetCount)) | 1457 if (it == m_pPageSetMap.end()) |
| 1457 return; | 1458 return; |
| 1459 |
| 1460 int32_t iCurSetCount = it->second; |
| 1458 if (bCreateAll) | 1461 if (bCreateAll) |
| 1459 iCurSetCount = 0; | 1462 iCurSetCount = 0; |
| 1460 | 1463 |
| 1461 CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_Element::Occur); | 1464 CXFA_Node* pOccurNode = pPageSet->GetFirstChildByClass(XFA_Element::Occur); |
| 1462 int32_t iMin = 0; | 1465 int32_t iMin = 0; |
| 1463 if (pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, false)) { | 1466 if (pOccurNode && pOccurNode->TryInteger(XFA_ATTRIBUTE_Min, iMin, false)) { |
| 1464 if (iCurSetCount < iMin) { | 1467 if (iCurSetCount < iMin) { |
| 1465 for (int32_t i = 0; i < iMin - iCurSetCount; i++) { | 1468 for (int32_t i = 0; i < iMin - iCurSetCount; i++) { |
| 1466 for (CXFA_Node* pCurrentPageNode = | 1469 for (CXFA_Node* pCurrentPageNode = |
| 1467 pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild); | 1470 pPageSet->GetNodeItem(XFA_NODEITEM_FirstChild); |
| 1468 pCurrentPageNode; pCurrentPageNode = pCurrentPageNode->GetNodeItem( | 1471 pCurrentPageNode; pCurrentPageNode = pCurrentPageNode->GetNodeItem( |
| 1469 XFA_NODEITEM_NextSibling)) { | 1472 XFA_NODEITEM_NextSibling)) { |
| 1470 if (pCurrentPageNode->GetElementType() == XFA_Element::PageArea) { | 1473 if (pCurrentPageNode->GetElementType() == XFA_Element::PageArea) { |
| 1471 CreateMinPageRecord(pCurrentPageNode, false); | 1474 CreateMinPageRecord(pCurrentPageNode, false); |
| 1472 } else if (pCurrentPageNode->GetElementType() == | 1475 } else if (pCurrentPageNode->GetElementType() == |
| 1473 XFA_Element::PageSet) { | 1476 XFA_Element::PageSet) { |
| 1474 CreateMinPageSetRecord(pCurrentPageNode, true); | 1477 CreateMinPageSetRecord(pCurrentPageNode, true); |
| 1475 } | 1478 } |
| 1476 } | 1479 } |
| 1477 } | 1480 } |
| 1478 m_pPageSetMap.SetAt(pPageSet, iMin); | 1481 m_pPageSetMap[pPageSet] = iMin; |
| 1479 } | 1482 } |
| 1480 } | 1483 } |
| 1481 } | 1484 } |
| 1482 | 1485 |
| 1483 void CXFA_LayoutPageMgr::CreateNextMinRecord(CXFA_Node* pRecordNode) { | 1486 void CXFA_LayoutPageMgr::CreateNextMinRecord(CXFA_Node* pRecordNode) { |
| 1484 if (!pRecordNode) | 1487 if (!pRecordNode) |
| 1485 return; | 1488 return; |
| 1486 | 1489 |
| 1487 for (CXFA_Node* pCurrentNode = | 1490 for (CXFA_Node* pCurrentNode = |
| 1488 pRecordNode->GetNodeItem(XFA_NODEITEM_NextSibling); | 1491 pRecordNode->GetNodeItem(XFA_NODEITEM_NextSibling); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1575 auto sPos = m_ProposedContainerRecords.begin(); | 1578 auto sPos = m_ProposedContainerRecords.begin(); |
| 1576 while (sPos != m_ProposedContainerRecords.end()) { | 1579 while (sPos != m_ProposedContainerRecords.end()) { |
| 1577 CXFA_ContainerRecord* pRecord = *sPos++; | 1580 CXFA_ContainerRecord* pRecord = *sPos++; |
| 1578 delete pRecord; | 1581 delete pRecord; |
| 1579 } | 1582 } |
| 1580 m_ProposedContainerRecords.clear(); | 1583 m_ProposedContainerRecords.clear(); |
| 1581 m_CurrentContainerRecordIter = m_ProposedContainerRecords.end(); | 1584 m_CurrentContainerRecordIter = m_ProposedContainerRecords.end(); |
| 1582 m_pCurPageArea = nullptr; | 1585 m_pCurPageArea = nullptr; |
| 1583 m_nCurPageCount = 0; | 1586 m_nCurPageCount = 0; |
| 1584 m_bCreateOverFlowPage = false; | 1587 m_bCreateOverFlowPage = false; |
| 1585 m_pPageSetMap.RemoveAll(); | 1588 m_pPageSetMap.clear(); |
| 1586 } | 1589 } |
| 1587 | 1590 |
| 1588 CXFA_LayoutItem* CXFA_LayoutPageMgr::FindOrCreateLayoutItem( | 1591 CXFA_LayoutItem* CXFA_LayoutPageMgr::FindOrCreateLayoutItem( |
| 1589 CXFA_Node* pFormNode) { | 1592 CXFA_Node* pFormNode) { |
| 1590 return pFormNode->GetDocument()->GetNotify()->OnCreateLayoutItem(pFormNode); | 1593 return pFormNode->GetDocument()->GetNotify()->OnCreateLayoutItem(pFormNode); |
| 1591 } | 1594 } |
| 1592 | 1595 |
| 1593 void CXFA_LayoutPageMgr::SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem) { | 1596 void CXFA_LayoutPageMgr::SaveLayoutItem(CXFA_LayoutItem* pParentLayoutItem) { |
| 1594 CXFA_LayoutItem* pNextLayoutItem; | 1597 CXFA_LayoutItem* pNextLayoutItem; |
| 1595 CXFA_LayoutItem* pCurLayoutItem = pParentLayoutItem->m_pFirstChild; | 1598 CXFA_LayoutItem* pCurLayoutItem = pParentLayoutItem->m_pFirstChild; |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1982 pRootLayoutItem = m_pPageSetLayoutItemRoot; | 1985 pRootLayoutItem = m_pPageSetLayoutItemRoot; |
| 1983 CXFA_ContainerLayoutItem* pNextLayout = nullptr; | 1986 CXFA_ContainerLayoutItem* pNextLayout = nullptr; |
| 1984 for (; pRootLayoutItem; pRootLayoutItem = pNextLayout) { | 1987 for (; pRootLayoutItem; pRootLayoutItem = pNextLayout) { |
| 1985 pNextLayout = | 1988 pNextLayout = |
| 1986 static_cast<CXFA_ContainerLayoutItem*>(pRootLayoutItem->m_pNextSibling); | 1989 static_cast<CXFA_ContainerLayoutItem*>(pRootLayoutItem->m_pNextSibling); |
| 1987 SaveLayoutItem(pRootLayoutItem); | 1990 SaveLayoutItem(pRootLayoutItem); |
| 1988 delete pRootLayoutItem; | 1991 delete pRootLayoutItem; |
| 1989 } | 1992 } |
| 1990 m_pPageSetLayoutItemRoot = nullptr; | 1993 m_pPageSetLayoutItemRoot = nullptr; |
| 1991 } | 1994 } |
| OLD | NEW |