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_document_datamerger_imp.h" | 7 #include "xfa/fxfa/parser/xfa_document_datamerger_imp.h" |
8 | 8 |
9 #include "core/fxcrt/include/fx_ext.h" | 9 #include "core/fxcrt/include/fx_ext.h" |
10 #include "xfa/fde/xml/fde_xml_imp.h" | 10 #include "xfa/fde/xml/fde_xml_imp.h" |
(...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
848 rgItemUnmatchList.Add(pTemplateChild); | 848 rgItemUnmatchList.Add(pTemplateChild); |
849 } | 849 } |
850 } | 850 } |
851 } | 851 } |
852 | 852 |
853 switch (eRelation) { | 853 switch (eRelation) { |
854 case XFA_ATTRIBUTEENUM_Choice: { | 854 case XFA_ATTRIBUTEENUM_Choice: { |
855 ASSERT(rgItemMatchList.GetSize()); | 855 ASSERT(rgItemMatchList.GetSize()); |
856 SortRecurseRecord(rgItemMatchList, pDataScope, TRUE); | 856 SortRecurseRecord(rgItemMatchList, pDataScope, TRUE); |
857 pDocument->DataMerge_CopyContainer( | 857 pDocument->DataMerge_CopyContainer( |
858 rgItemMatchList[0].pTemplateChild, pSubformSetNode, pDataScope); | 858 rgItemMatchList[0].pTemplateChild, pSubformSetNode, pDataScope, |
| 859 FALSE, TRUE, TRUE); |
859 break; | 860 break; |
860 } | 861 } |
861 case XFA_ATTRIBUTEENUM_Unordered: { | 862 case XFA_ATTRIBUTEENUM_Unordered: { |
862 if (rgItemMatchList.GetSize()) { | 863 if (rgItemMatchList.GetSize()) { |
863 SortRecurseRecord(rgItemMatchList, pDataScope, FALSE); | 864 SortRecurseRecord(rgItemMatchList, pDataScope, FALSE); |
864 for (int32_t i = 0, count = rgItemMatchList.GetSize(); i < count; | 865 for (int32_t i = 0, count = rgItemMatchList.GetSize(); i < count; |
865 i++) { | 866 i++) { |
866 pDocument->DataMerge_CopyContainer( | 867 pDocument->DataMerge_CopyContainer( |
867 rgItemMatchList[i].pTemplateChild, pSubformSetNode, | 868 rgItemMatchList[i].pTemplateChild, pSubformSetNode, |
868 pDataScope); | 869 pDataScope, FALSE, TRUE, TRUE); |
869 } | 870 } |
870 } | 871 } |
871 for (int32_t i = 0, count = rgItemUnmatchList.GetSize(); i < count; | 872 for (int32_t i = 0, count = rgItemUnmatchList.GetSize(); i < count; |
872 i++) { | 873 i++) { |
873 pDocument->DataMerge_CopyContainer(rgItemUnmatchList[i], | 874 pDocument->DataMerge_CopyContainer(rgItemUnmatchList[i], |
874 pSubformSetNode, pDataScope); | 875 pSubformSetNode, pDataScope, |
| 876 FALSE, TRUE, TRUE); |
875 } | 877 } |
876 break; | 878 break; |
877 } | 879 } |
878 default: | 880 default: |
879 break; | 881 break; |
880 } | 882 } |
881 } else { | 883 } else { |
882 CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( | 884 CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( |
883 pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); | 885 pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); |
884 ASSERT(pSubformSetNode); | 886 ASSERT(pSubformSetNode); |
885 if (!pFirstInstance) | 887 if (!pFirstInstance) |
886 pFirstInstance = pSubformSetNode; | 888 pFirstInstance = pSubformSetNode; |
887 | 889 |
888 for (CXFA_Node* pTemplateChild = | 890 for (CXFA_Node* pTemplateChild = |
889 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 891 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
890 pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 892 pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
891 XFA_NODEITEM_NextSibling)) { | 893 XFA_NODEITEM_NextSibling)) { |
892 if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 894 if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
893 XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, | 895 XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, |
894 pTemplateChild, TRUE, nullptr); | 896 pTemplateChild, TRUE, nullptr); |
895 } else if (pTemplateChild->IsContainerNode()) { | 897 } else if (pTemplateChild->IsContainerNode()) { |
896 pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, | 898 pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, |
897 pDataScope); | 899 pDataScope, FALSE, TRUE, TRUE); |
898 } | 900 } |
899 } | 901 } |
900 } | 902 } |
901 } | 903 } |
902 | 904 |
903 if (iCurRepeatIndex == 0 && bAccessedDataDOM == FALSE) { | 905 if (iCurRepeatIndex == 0 && bAccessedDataDOM == FALSE) { |
904 int32_t iLimit = iMax; | 906 int32_t iLimit = iMax; |
905 if (pInstMgrNode && pTemplateNode->GetNameHash() == 0) { | 907 if (pInstMgrNode && pTemplateNode->GetNameHash() == 0) { |
906 iLimit = subformArray.GetSize(); | 908 iLimit = subformArray.GetSize(); |
907 if (iLimit < iMin) | 909 if (iLimit < iMin) |
(...skipping 20 matching lines...) Expand all Loading... |
928 | 930 |
929 for (CXFA_Node* pTemplateChild = | 931 for (CXFA_Node* pTemplateChild = |
930 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 932 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
931 pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 933 pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
932 XFA_NODEITEM_NextSibling)) { | 934 XFA_NODEITEM_NextSibling)) { |
933 if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 935 if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
934 XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformNode, | 936 XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformNode, |
935 pTemplateChild, TRUE, nullptr); | 937 pTemplateChild, TRUE, nullptr); |
936 } else if (pTemplateChild->IsContainerNode()) { | 938 } else if (pTemplateChild->IsContainerNode()) { |
937 pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformNode, | 939 pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformNode, |
938 pDataScope); | 940 pDataScope, FALSE, TRUE, TRUE); |
939 } | 941 } |
940 } | 942 } |
941 } | 943 } |
942 } | 944 } |
943 } | 945 } |
944 | 946 |
945 int32_t iMinimalLimit = iCurRepeatIndex == 0 ? iInit : iMin; | 947 int32_t iMinimalLimit = iCurRepeatIndex == 0 ? iInit : iMin; |
946 for (; iCurRepeatIndex < iMinimalLimit; iCurRepeatIndex++) { | 948 for (; iCurRepeatIndex < iMinimalLimit; iCurRepeatIndex++) { |
947 CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( | 949 CXFA_Node* pSubformSetNode = XFA_NodeMerge_CloneOrMergeContainer( |
948 pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); | 950 pDocument, pFormParentNode, pTemplateNode, FALSE, pSearchArray); |
949 ASSERT(pSubformSetNode); | 951 ASSERT(pSubformSetNode); |
950 if (!pFirstInstance) | 952 if (!pFirstInstance) |
951 pFirstInstance = pSubformSetNode; | 953 pFirstInstance = pSubformSetNode; |
952 | 954 |
953 FX_BOOL bFound = FALSE; | 955 FX_BOOL bFound = FALSE; |
954 for (CXFA_Node* pTemplateChild = | 956 for (CXFA_Node* pTemplateChild = |
955 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); | 957 pTemplateNode->GetNodeItem(XFA_NODEITEM_FirstChild); |
956 pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( | 958 pTemplateChild; pTemplateChild = pTemplateChild->GetNodeItem( |
957 XFA_NODEITEM_NextSibling)) { | 959 XFA_NODEITEM_NextSibling)) { |
958 if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { | 960 if (NeedGenerateForm(pTemplateChild, bUseInstanceManager)) { |
959 XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, | 961 XFA_NodeMerge_CloneOrMergeContainer(pDocument, pSubformSetNode, |
960 pTemplateChild, TRUE, nullptr); | 962 pTemplateChild, TRUE, nullptr); |
961 } else if (pTemplateChild->IsContainerNode()) { | 963 } else if (pTemplateChild->IsContainerNode()) { |
962 if (bFound && eRelation == XFA_ATTRIBUTEENUM_Choice) | 964 if (bFound && eRelation == XFA_ATTRIBUTEENUM_Choice) |
963 continue; | 965 continue; |
964 | 966 |
965 pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, | 967 pDocument->DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, |
966 pDataScope, FALSE, bDataMerge); | 968 pDataScope, FALSE, bDataMerge, TRUE); |
967 bFound = TRUE; | 969 bFound = TRUE; |
968 } | 970 } |
969 } | 971 } |
970 } | 972 } |
971 return pFirstInstance; | 973 return pFirstInstance; |
972 } | 974 } |
973 | 975 |
974 CXFA_Node* CopyContainer_Field(CXFA_Document* pDocument, | 976 CXFA_Node* CopyContainer_Field(CXFA_Document* pDocument, |
975 CXFA_Node* pTemplateNode, | 977 CXFA_Node* pTemplateNode, |
976 CXFA_Node* pFormNode, | 978 CXFA_Node* pFormNode, |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1463 ASSERT(pDataTopLevel); | 1465 ASSERT(pDataTopLevel); |
1464 CreateDataBinding(pSubformSetNode, pDataTopLevel, TRUE); | 1466 CreateDataBinding(pSubformSetNode, pDataTopLevel, TRUE); |
1465 for (CXFA_Node* pTemplateChild = | 1467 for (CXFA_Node* pTemplateChild = |
1466 pTemplateChosen->GetNodeItem(XFA_NODEITEM_FirstChild); | 1468 pTemplateChosen->GetNodeItem(XFA_NODEITEM_FirstChild); |
1467 pTemplateChild; | 1469 pTemplateChild; |
1468 pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { | 1470 pTemplateChild = pTemplateChild->GetNodeItem(XFA_NODEITEM_NextSibling)) { |
1469 if (NeedGenerateForm(pTemplateChild, TRUE)) { | 1471 if (NeedGenerateForm(pTemplateChild, TRUE)) { |
1470 XFA_NodeMerge_CloneOrMergeContainer(this, pSubformSetNode, pTemplateChild, | 1472 XFA_NodeMerge_CloneOrMergeContainer(this, pSubformSetNode, pTemplateChild, |
1471 TRUE, nullptr); | 1473 TRUE, nullptr); |
1472 } else if (pTemplateChild->IsContainerNode()) { | 1474 } else if (pTemplateChild->IsContainerNode()) { |
1473 DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, pDataTopLevel); | 1475 DataMerge_CopyContainer(pTemplateChild, pSubformSetNode, pDataTopLevel, |
| 1476 FALSE, TRUE, TRUE); |
1474 } | 1477 } |
1475 } | 1478 } |
1476 if (pDDRoot) | 1479 if (pDDRoot) |
1477 UpdateDataRelation(pDataRoot, pDDRoot); | 1480 UpdateDataRelation(pDataRoot, pDDRoot); |
1478 | 1481 |
1479 DataMerge_UpdateBindingRelations(pSubformSetNode); | 1482 DataMerge_UpdateBindingRelations(pSubformSetNode); |
1480 CXFA_Node* pPageSetNode = | 1483 CXFA_Node* pPageSetNode = |
1481 pSubformSetNode->GetFirstChildByClass(XFA_Element::PageSet); | 1484 pSubformSetNode->GetFirstChildByClass(XFA_Element::PageSet); |
1482 while (pPageSetNode) { | 1485 while (pPageSetNode) { |
1483 m_pPendingPageSet.Add(pPageSetNode); | 1486 m_pPendingPageSet.Add(pPageSetNode); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1519 pFormRoot->RemoveChild(pNode); | 1522 pFormRoot->RemoveChild(pNode); |
1520 pFormRoot->SetObject(XFA_ATTRIBUTE_BindingNode, nullptr); | 1523 pFormRoot->SetObject(XFA_ATTRIBUTE_BindingNode, nullptr); |
1521 } | 1524 } |
1522 m_rgGlobalBinding.RemoveAll(); | 1525 m_rgGlobalBinding.RemoveAll(); |
1523 if (bDoDataMerge) | 1526 if (bDoDataMerge) |
1524 DoDataMerge(); | 1527 DoDataMerge(); |
1525 | 1528 |
1526 CXFA_LayoutProcessor* pLayoutProcessor = GetLayoutProcessor(); | 1529 CXFA_LayoutProcessor* pLayoutProcessor = GetLayoutProcessor(); |
1527 pLayoutProcessor->SetForceReLayout(TRUE); | 1530 pLayoutProcessor->SetForceReLayout(TRUE); |
1528 } | 1531 } |
OLD | NEW |