| 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 "core/fpdfdoc/cpdf_formfield.h" | 7 #include "core/fpdfdoc/cpdf_formfield.h" |
| 8 | 8 |
| 9 #include <set> | 9 #include <set> |
| 10 | 10 |
| (...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 548 if (bSelected) { | 548 if (bSelected) { |
| 549 if (GetType() == ListBox) { | 549 if (GetType() == ListBox) { |
| 550 SelectOption(index, true); | 550 SelectOption(index, true); |
| 551 if (!(m_Flags & kFormListMultiSelect)) { | 551 if (!(m_Flags & kFormListMultiSelect)) { |
| 552 m_pDict->SetStringFor("V", PDF_EncodeText(opt_value)); | 552 m_pDict->SetStringFor("V", PDF_EncodeText(opt_value)); |
| 553 } else { | 553 } else { |
| 554 CPDF_Array* pArray = new CPDF_Array; | 554 CPDF_Array* pArray = new CPDF_Array; |
| 555 for (int i = 0; i < CountOptions(); i++) { | 555 for (int i = 0; i < CountOptions(); i++) { |
| 556 if (i == index || IsItemSelected(i)) { | 556 if (i == index || IsItemSelected(i)) { |
| 557 opt_value = GetOptionValue(i); | 557 opt_value = GetOptionValue(i); |
| 558 pArray->AddString(PDF_EncodeText(opt_value)); | 558 pArray->AddNew<CPDF_String>(PDF_EncodeText(opt_value), false); |
| 559 } | 559 } |
| 560 } | 560 } |
| 561 m_pDict->SetFor("V", pArray); | 561 m_pDict->SetFor("V", pArray); |
| 562 } | 562 } |
| 563 } else { | 563 } else { |
| 564 m_pDict->SetStringFor("V", PDF_EncodeText(opt_value)); | 564 m_pDict->SetStringFor("V", PDF_EncodeText(opt_value)); |
| 565 CPDF_Array* pI = new CPDF_Array; | 565 CPDF_Array* pI = new CPDF_Array; |
| 566 pI->AddInteger(index); | 566 pI->AddNew<CPDF_Number>(index); |
| 567 m_pDict->SetFor("I", pI); | 567 m_pDict->SetFor("I", pI); |
| 568 } | 568 } |
| 569 } else { | 569 } else { |
| 570 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); | 570 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); |
| 571 if (pValue) { | 571 if (pValue) { |
| 572 if (GetType() == ListBox) { | 572 if (GetType() == ListBox) { |
| 573 SelectOption(index, false); | 573 SelectOption(index, false); |
| 574 if (pValue->IsString()) { | 574 if (pValue->IsString()) { |
| 575 if (pValue->GetUnicodeText() == opt_value) | 575 if (pValue->GetUnicodeText() == opt_value) |
| 576 m_pDict->RemoveFor("V"); | 576 m_pDict->RemoveFor("V"); |
| 577 } else if (pValue->IsArray()) { | 577 } else if (pValue->IsArray()) { |
| 578 std::unique_ptr<CPDF_Array> pArray(new CPDF_Array); | 578 std::unique_ptr<CPDF_Array> pArray(new CPDF_Array); |
| 579 for (int i = 0; i < CountOptions(); i++) { | 579 for (int i = 0; i < CountOptions(); i++) { |
| 580 if (i != index && IsItemSelected(i)) { | 580 if (i != index && IsItemSelected(i)) { |
| 581 opt_value = GetOptionValue(i); | 581 opt_value = GetOptionValue(i); |
| 582 pArray->AddString(PDF_EncodeText(opt_value)); | 582 pArray->AddNew<CPDF_String>(PDF_EncodeText(opt_value), false); |
| 583 } | 583 } |
| 584 } | 584 } |
| 585 if (pArray->GetCount() > 0) | 585 if (pArray->GetCount() > 0) |
| 586 m_pDict->SetFor("V", pArray.release()); // std::move someday | 586 m_pDict->SetFor("V", pArray.release()); // std::move someday |
| 587 } | 587 } |
| 588 } else { | 588 } else { |
| 589 m_pDict->RemoveFor("V"); | 589 m_pDict->RemoveFor("V"); |
| 590 m_pDict->RemoveFor("I"); | 590 m_pDict->RemoveFor("I"); |
| 591 } | 591 } |
| 592 } | 592 } |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 677 PDF_EncodeText(csOptLabel.c_str(), csOptLabel.GetLength()); | 677 PDF_EncodeText(csOptLabel.c_str(), csOptLabel.GetLength()); |
| 678 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt"); | 678 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt"); |
| 679 CPDF_Array* pOpt = ToArray(pValue); | 679 CPDF_Array* pOpt = ToArray(pValue); |
| 680 if (!pOpt) { | 680 if (!pOpt) { |
| 681 pOpt = new CPDF_Array; | 681 pOpt = new CPDF_Array; |
| 682 m_pDict->SetFor("Opt", pOpt); | 682 m_pDict->SetFor("Opt", pOpt); |
| 683 } | 683 } |
| 684 | 684 |
| 685 int iCount = pdfium::base::checked_cast<int>(pOpt->GetCount()); | 685 int iCount = pdfium::base::checked_cast<int>(pOpt->GetCount()); |
| 686 if (index >= iCount) { | 686 if (index >= iCount) { |
| 687 pOpt->AddString(csStr); | 687 pOpt->AddNew<CPDF_String>(csStr, false); |
| 688 index = iCount; | 688 index = iCount; |
| 689 } else { | 689 } else { |
| 690 CPDF_String* pString = new CPDF_String(csStr, false); | 690 pOpt->InsertNewAt<CPDF_String>(index, csStr, false); |
| 691 pOpt->InsertAt(index, pString); | |
| 692 } | 691 } |
| 693 | 692 |
| 694 if (bNotify) | 693 if (bNotify) |
| 695 NotifyListOrComboBoxAfterChange(); | 694 NotifyListOrComboBoxAfterChange(); |
| 696 return index; | 695 return index; |
| 697 } | 696 } |
| 698 | 697 |
| 699 bool CPDF_FormField::ClearOptions(bool bNotify) { | 698 bool CPDF_FormField::ClearOptions(bool bNotify) { |
| 700 if (bNotify && m_pForm->m_pFormNotify) { | 699 if (bNotify && m_pForm->m_pFormNotify) { |
| 701 CFX_WideString csValue; | 700 CFX_WideString csValue; |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 829 if (iCount < 0 || index >= iCount) | 828 if (iCount < 0 || index >= iCount) |
| 830 return -1; | 829 return -1; |
| 831 return pArray->GetIntegerAt(index); | 830 return pArray->GetIntegerAt(index); |
| 832 } | 831 } |
| 833 | 832 |
| 834 bool CPDF_FormField::IsOptionSelected(int iOptIndex) const { | 833 bool CPDF_FormField::IsOptionSelected(int iOptIndex) const { |
| 835 CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "I")); | 834 CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "I")); |
| 836 if (!pArray) | 835 if (!pArray) |
| 837 return false; | 836 return false; |
| 838 | 837 |
| 839 for (CPDF_Object* pObj : *pArray) { | 838 for (const auto& pObj : *pArray) { |
| 840 if (pObj->GetInteger() == iOptIndex) | 839 if (pObj->GetInteger() == iOptIndex) |
| 841 return true; | 840 return true; |
| 842 } | 841 } |
| 843 return false; | 842 return false; |
| 844 } | 843 } |
| 845 | 844 |
| 846 bool CPDF_FormField::SelectOption(int iOptIndex, bool bSelected, bool bNotify) { | 845 bool CPDF_FormField::SelectOption(int iOptIndex, bool bSelected, bool bNotify) { |
| 847 CPDF_Array* pArray = m_pDict->GetArrayFor("I"); | 846 CPDF_Array* pArray = m_pDict->GetArrayFor("I"); |
| 848 if (!pArray) { | 847 if (!pArray) { |
| 849 if (!bSelected) | 848 if (!bSelected) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 872 | 871 |
| 873 if (iFind > iOptIndex) { | 872 if (iFind > iOptIndex) { |
| 874 if (!bSelected) | 873 if (!bSelected) |
| 875 continue; | 874 continue; |
| 876 | 875 |
| 877 if (bNotify && m_pForm->m_pFormNotify) { | 876 if (bNotify && m_pForm->m_pFormNotify) { |
| 878 CFX_WideString csValue = GetOptionLabel(iOptIndex); | 877 CFX_WideString csValue = GetOptionLabel(iOptIndex); |
| 879 if (!NotifyListOrComboBoxBeforeChange(csValue)) | 878 if (!NotifyListOrComboBoxBeforeChange(csValue)) |
| 880 return false; | 879 return false; |
| 881 } | 880 } |
| 882 pArray->InsertAt(i, new CPDF_Number(iOptIndex)); | 881 pArray->InsertNewAt<CPDF_Number>(i, iOptIndex); |
| 883 bReturn = true; | 882 bReturn = true; |
| 884 break; | 883 break; |
| 885 } | 884 } |
| 886 } | 885 } |
| 887 if (!bReturn) { | 886 if (!bReturn) { |
| 888 if (bSelected) | 887 if (bSelected) |
| 889 pArray->AddInteger(iOptIndex); | 888 pArray->AddNew<CPDF_Number>(iOptIndex); |
| 890 | 889 |
| 891 if (pArray->IsEmpty()) | 890 if (pArray->IsEmpty()) |
| 892 m_pDict->RemoveFor("I"); | 891 m_pDict->RemoveFor("I"); |
| 893 } | 892 } |
| 894 if (bNotify) | 893 if (bNotify) |
| 895 NotifyListOrComboBoxAfterChange(); | 894 NotifyListOrComboBoxAfterChange(); |
| 896 | 895 |
| 897 return true; | 896 return true; |
| 898 } | 897 } |
| 899 | 898 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 989 case ListBox: | 988 case ListBox: |
| 990 NotifyAfterSelectionChange(); | 989 NotifyAfterSelectionChange(); |
| 991 break; | 990 break; |
| 992 case ComboBox: | 991 case ComboBox: |
| 993 NotifyAfterValueChange(); | 992 NotifyAfterValueChange(); |
| 994 break; | 993 break; |
| 995 default: | 994 default: |
| 996 break; | 995 break; |
| 997 } | 996 } |
| 998 } | 997 } |
| OLD | NEW |