1d201456903f3ecae1f7794edfab0d5678e64226shiqian// Copyright 2014 PDFium Authors. All rights reserved. 2d201456903f3ecae1f7794edfab0d5678e64226shiqian// Use of this source code is governed by a BSD-style license that can be 3d201456903f3ecae1f7794edfab0d5678e64226shiqian// found in the LICENSE file. 4d201456903f3ecae1f7794edfab0d5678e64226shiqian 5d201456903f3ecae1f7794edfab0d5678e64226shiqian// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6d201456903f3ecae1f7794edfab0d5678e64226shiqian 7d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "core/fpdfdoc/cpdf_formfield.h" 8d201456903f3ecae1f7794edfab0d5678e64226shiqian 9d201456903f3ecae1f7794edfab0d5678e64226shiqian#include <memory> 10d201456903f3ecae1f7794edfab0d5678e64226shiqian#include <set> 11d201456903f3ecae1f7794edfab0d5678e64226shiqian#include <utility> 12d201456903f3ecae1f7794edfab0d5678e64226shiqian 13d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "core/fpdfapi/parser/cfdf_document.h" 14d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "core/fpdfapi/parser/cpdf_array.h" 15d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "core/fpdfapi/parser/cpdf_document.h" 16d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "core/fpdfapi/parser/cpdf_name.h" 17d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "core/fpdfapi/parser/cpdf_number.h" 18d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "core/fpdfapi/parser/cpdf_simple_parser.h" 19d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "core/fpdfapi/parser/cpdf_string.h" 20d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "core/fpdfapi/parser/fpdf_parser_decode.h" 21d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "core/fpdfdoc/cpdf_formcontrol.h" 22d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "core/fpdfdoc/cpdf_interform.h" 23d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "core/fpdfdoc/cpvt_generateap.h" 24d201456903f3ecae1f7794edfab0d5678e64226shiqian#include "third_party/base/stl_util.h" 25d201456903f3ecae1f7794edfab0d5678e64226shiqian 26d201456903f3ecae1f7794edfab0d5678e64226shiqiannamespace { 27d201456903f3ecae1f7794edfab0d5678e64226shiqian 28d201456903f3ecae1f7794edfab0d5678e64226shiqianconst int kMaxRecursion = 32; 29d201456903f3ecae1f7794edfab0d5678e64226shiqian 30d201456903f3ecae1f7794edfab0d5678e64226shiqianconst int kFormListMultiSelect = 0x100; 31d201456903f3ecae1f7794edfab0d5678e64226shiqian 32d201456903f3ecae1f7794edfab0d5678e64226shiqianconst int kFormComboEdit = 0x100; 33d201456903f3ecae1f7794edfab0d5678e64226shiqian 34d201456903f3ecae1f7794edfab0d5678e64226shiqianconst int kFormRadioNoToggleOff = 0x100; 35dac3e879c56a50696a36f53e1e5e353e48fa665fzhanyong.wanconst int kFormRadioUnison = 0x200; 360d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 3725958f3e4c4097caca8347b7937f5f6fb26d6c56vladlosevconst int kFormTextMultiLine = 0x100; 38ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wanconst int kFormTextPassword = 0x200; 39ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wanconst int kFormTextNoScroll = 0x400; 40ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wanconst int kFormTextComb = 0x800; 41ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan 42ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wanbool IsUnison(CPDF_FormField* pField) { 43ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan if (pField->GetType() == CPDF_FormField::CheckBox) 44ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan return true; 45ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan return (pField->GetFieldFlags() & 0x2000000) != 0; 46ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan} 47ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan 48ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan} // namespace 49ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan 50ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wanCPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict, 518bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan const FX_CHAR* name, 52ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan int nLevel) { 53ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan if (nLevel > kMaxRecursion) 548bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan return nullptr; 5540e72a8a837b47cbfe2e695068c1845073ab2630zhanyong.wan if (!pFieldDict) 56a9f380f5c7ff75cd715c58e11885dddc54baef02zhanyong.wan return nullptr; 5740e72a8a837b47cbfe2e695068c1845073ab2630zhanyong.wan 58ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan CPDF_Object* pAttr = pFieldDict->GetDirectObjectFor(name); 59ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan if (pAttr) 60ad99ca14461f0e929d835d29518e11c05e8d41f0zhanyong.wan return pAttr; 61dac3e879c56a50696a36f53e1e5e353e48fa665fzhanyong.wan 62d201456903f3ecae1f7794edfab0d5678e64226shiqian CPDF_Dictionary* pParent = pFieldDict->GetDictFor("Parent"); 63d201456903f3ecae1f7794edfab0d5678e64226shiqian if (!pParent) 64d201456903f3ecae1f7794edfab0d5678e64226shiqian return nullptr; 65d201456903f3ecae1f7794edfab0d5678e64226shiqian return FPDF_GetFieldAttr(pParent, name, nLevel + 1); 66d201456903f3ecae1f7794edfab0d5678e64226shiqian} 67d201456903f3ecae1f7794edfab0d5678e64226shiqian 680af0709b02899f9177db55eba7929e65e5834b29zhanyong.wanCFX_WideString FPDF_GetFullName(CPDF_Dictionary* pFieldDict) { 69d201456903f3ecae1f7794edfab0d5678e64226shiqian CFX_WideString full_name; 700af0709b02899f9177db55eba7929e65e5834b29zhanyong.wan std::set<CPDF_Dictionary*> visited; 71d201456903f3ecae1f7794edfab0d5678e64226shiqian CPDF_Dictionary* pLevel = pFieldDict; 72ae3247986bbbafcc913b5fe6132090ad6f1c3f36zhanyong.wan while (pLevel) { 73d201456903f3ecae1f7794edfab0d5678e64226shiqian visited.insert(pLevel); 74c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan CFX_WideString short_name = pLevel->GetUnicodeTextFor("T"); 75d201456903f3ecae1f7794edfab0d5678e64226shiqian if (!short_name.IsEmpty()) { 76c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan if (full_name.IsEmpty()) 77c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan full_name = short_name; 78d201456903f3ecae1f7794edfab0d5678e64226shiqian else 79d201456903f3ecae1f7794edfab0d5678e64226shiqian full_name = short_name + L"." + full_name; 80b2db677c9905a34ca6454aa526f7a0cc5cfaeca1zhanyong.wan } 81f8b268ee86ca74bba3276352f1e7de53d1336c3ezhanyong.wan pLevel = pLevel->GetDictFor("Parent"); 8216e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan if (pdfium::ContainsKey(visited, pLevel)) 83f8b268ee86ca74bba3276352f1e7de53d1336c3ezhanyong.wan break; 8416e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan } 85f8b268ee86ca74bba3276352f1e7de53d1336c3ezhanyong.wan return full_name; 86b50ef44a3527d958270ff1f08cb99e3ac633bd17zhanyong.wan} 87b50ef44a3527d958270ff1f08cb99e3ac633bd17zhanyong.wan 8816e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wanCPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict) 89f8b268ee86ca74bba3276352f1e7de53d1336c3ezhanyong.wan : m_Type(Unknown), 90b50ef44a3527d958270ff1f08cb99e3ac633bd17zhanyong.wan m_pForm(pForm), 9116e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan m_pDict(pDict), 9216e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan m_FontSize(0), 93f8b268ee86ca74bba3276352f1e7de53d1336c3ezhanyong.wan m_pFont(nullptr) { 94b50ef44a3527d958270ff1f08cb99e3ac633bd17zhanyong.wan SyncFieldFlags(); 9516e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan} 9616e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan 9716e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wanCPDF_FormField::~CPDF_FormField() {} 98f8b268ee86ca74bba3276352f1e7de53d1336c3ezhanyong.wan 9916e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wanvoid CPDF_FormField::SyncFieldFlags() { 10016e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, "FT") 10116e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan ? FPDF_GetFieldAttr(m_pDict, "FT")->GetString() 102f8b268ee86ca74bba3276352f1e7de53d1336c3ezhanyong.wan : CFX_ByteString(); 10316e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan uint32_t flags = FPDF_GetFieldAttr(m_pDict, "Ff") 10416e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan ? FPDF_GetFieldAttr(m_pDict, "Ff")->GetInteger() 10516e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan : 0; 10616e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan m_Flags = 0; 107d201456903f3ecae1f7794edfab0d5678e64226shiqian if (flags & FORMFLAG_READONLY) 108d201456903f3ecae1f7794edfab0d5678e64226shiqian m_Flags |= FORMFLAG_READONLY; 109d201456903f3ecae1f7794edfab0d5678e64226shiqian if (flags & FORMFLAG_REQUIRED) 1109b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian m_Flags |= FORMFLAG_REQUIRED; 1119b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian if (flags & FORMFLAG_NOEXPORT) 1129b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian m_Flags |= FORMFLAG_NOEXPORT; 1139b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian 114b50ef44a3527d958270ff1f08cb99e3ac633bd17zhanyong.wan if (type_name == "Btn") { 1159b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian if (flags & 0x8000) { 116fe186c382905dcf57014985ccea8e067275e9f5fshiqian m_Type = RadioButton; 1179b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian if (flags & 0x4000) 1189b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian m_Flags |= kFormRadioNoToggleOff; 119d201456903f3ecae1f7794edfab0d5678e64226shiqian if (flags & 0x2000000) 120c214ebc830aa918d54e535c6caa2da6317877e12zhanyong.wan m_Flags |= kFormRadioUnison; 1219b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian } else if (flags & 0x10000) { 1229b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian m_Type = PushButton; 1239b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian } else { 1249b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian m_Type = CheckBox; 1258bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan } 1269b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian } else if (type_name == "Tx") { 1279b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian if (flags & 0x100000) { 1288bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan m_Type = File; 1299b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian } else if (flags & 0x2000000) { 130a9f380f5c7ff75cd715c58e11885dddc54baef02zhanyong.wan m_Type = RichText; 13140e72a8a837b47cbfe2e695068c1845073ab2630zhanyong.wan } else { 1329b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian m_Type = Text; 1339b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian if (flags & 0x1000) 1349b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian m_Flags |= kFormTextMultiLine; 135d201456903f3ecae1f7794edfab0d5678e64226shiqian if (flags & 0x2000) 13653e0dc4041f660b6517b15b08b496e164be614f1shiqian m_Flags |= kFormTextPassword; 137c214ebc830aa918d54e535c6caa2da6317877e12zhanyong.wan if (flags & 0x800000) 138b50ef44a3527d958270ff1f08cb99e3ac633bd17zhanyong.wan m_Flags |= kFormTextNoScroll; 1392ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan if (flags & 0x100000) 140c214ebc830aa918d54e535c6caa2da6317877e12zhanyong.wan m_Flags |= kFormTextComb; 141c214ebc830aa918d54e535c6caa2da6317877e12zhanyong.wan } 142b50ef44a3527d958270ff1f08cb99e3ac633bd17zhanyong.wan LoadDA(); 143b50ef44a3527d958270ff1f08cb99e3ac633bd17zhanyong.wan } else if (type_name == "Ch") { 144d201456903f3ecae1f7794edfab0d5678e64226shiqian if (flags & 0x20000) { 145bf26ca01f23e432f8b2355fd700707ba217a7605vladlosev m_Type = ComboBox; 1462ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan if (flags & 0x40000) 147f8b268ee86ca74bba3276352f1e7de53d1336c3ezhanyong.wan m_Flags |= kFormComboEdit; 148f8b268ee86ca74bba3276352f1e7de53d1336c3ezhanyong.wan } else { 149d201456903f3ecae1f7794edfab0d5678e64226shiqian m_Type = ListBox; 1502ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan if (flags & 0x200000) 1512ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan m_Flags |= kFormListMultiSelect; 1520c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } 1532ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan LoadDA(); 1542ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan } else if (type_name == "Sig") { 1550d27868d0faef474594682f25336229daa89d6d7zhanyong.wan m_Type = Sign; 156d201456903f3ecae1f7794edfab0d5678e64226shiqian } 1579b093c1779eb48a55db026cfd525f4cf1bbd4749shiqian} 1580d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 1592ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wanCFX_WideString CPDF_FormField::GetFullName() const { 160c214ebc830aa918d54e535c6caa2da6317877e12zhanyong.wan return FPDF_GetFullName(m_pDict); 1613d7042176307f0d7700a3640f3b3bcc8790b8fcdvladlosev} 1620d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 1638bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wanbool CPDF_FormField::ResetField(bool bNotify) { 1648bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan switch (m_Type) { 165c440a6923aa65d5be64134a6f430a5867a63df3fshiqian case CPDF_FormField::CheckBox: 166c440a6923aa65d5be64134a6f430a5867a63df3fshiqian case CPDF_FormField::RadioButton: { 167aaebfcdc4005afb22b68df61b58edd1ccc002913zhanyong.wan int iCount = CountControls(); 1682ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan if (iCount) { 169d201456903f3ecae1f7794edfab0d5678e64226shiqian // TODO(weili): Check whether anything special needs to be done for 170cd3e4016ea451c9ee5cb7925329f2611098cbcf9zhanyong.wan // unison field. Otherwise, merge these branches. 1712ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan if (IsUnison(this)) { 1722ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan for (int i = 0; i < iCount; i++) 1732ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan CheckControl(i, GetControl(i)->IsDefaultChecked(), false); 1742ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan } else { 1752ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan for (int i = 0; i < iCount; i++) 176f8b268ee86ca74bba3276352f1e7de53d1336c3ezhanyong.wan CheckControl(i, GetControl(i)->IsDefaultChecked(), false); 1772ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan } 1782ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan } 179cd3e4016ea451c9ee5cb7925329f2611098cbcf9zhanyong.wan if (bNotify && m_pForm->m_pFormNotify) 180cd3e4016ea451c9ee5cb7925329f2611098cbcf9zhanyong.wan m_pForm->m_pFormNotify->AfterCheckedStatusChange(this); 181d201456903f3ecae1f7794edfab0d5678e64226shiqian break; 1820d27868d0faef474594682f25336229daa89d6d7zhanyong.wan } 1830d27868d0faef474594682f25336229daa89d6d7zhanyong.wan case CPDF_FormField::ComboBox: 184985a30360ce4824b65cb35ad55faa0d7c1ad1104zhanyong.wan case CPDF_FormField::ListBox: { 185d201456903f3ecae1f7794edfab0d5678e64226shiqian CFX_WideString csValue; 186d201456903f3ecae1f7794edfab0d5678e64226shiqian ClearSelection(); 187f8b268ee86ca74bba3276352f1e7de53d1336c3ezhanyong.wan int iIndex = GetDefaultSelectedItem(); 188b2db677c9905a34ca6454aa526f7a0cc5cfaeca1zhanyong.wan if (iIndex >= 0) 1892534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan csValue = GetOptionLabel(iIndex); 1900c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 1912ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan if (bNotify && !NotifyListOrComboBoxBeforeChange(csValue)) 192b50ef44a3527d958270ff1f08cb99e3ac633bd17zhanyong.wan return false; 1932ccea88c99d1ae23383d1b8eb3680a4a4d2edd66zhanyong.wan 194c214ebc830aa918d54e535c6caa2da6317877e12zhanyong.wan SetItemSelection(iIndex, true); 19516e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan if (bNotify) 196d201456903f3ecae1f7794edfab0d5678e64226shiqian NotifyListOrComboBoxAfterChange(); 19735c39756495bea5959de5778aaaf33a94f8c1e2ezhanyong.wan break; 19881e1cc73c83265e54b2ec7edc17e77f4d1b89e86zhanyong.wan } 19981e1cc73c83265e54b2ec7edc17e77f4d1b89e86zhanyong.wan case CPDF_FormField::Text: 20035c39756495bea5959de5778aaaf33a94f8c1e2ezhanyong.wan case CPDF_FormField::RichText: 20181e1cc73c83265e54b2ec7edc17e77f4d1b89e86zhanyong.wan case CPDF_FormField::File: 20212a92c26fc0e0de81f687dbe739a6aa24f37f9ddzhanyong.wan default: { 20312a92c26fc0e0de81f687dbe739a6aa24f37f9ddzhanyong.wan CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, "DV"); 20412a92c26fc0e0de81f687dbe739a6aa24f37f9ddzhanyong.wan CFX_WideString csDValue; 20512a92c26fc0e0de81f687dbe739a6aa24f37f9ddzhanyong.wan if (pDV) 2060d27868d0faef474594682f25336229daa89d6d7zhanyong.wan csDValue = pDV->GetUnicodeText(); 207bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 208bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V"); 209bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CFX_WideString csValue; 210bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (pV) 211bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan csValue = pV->GetUnicodeText(); 2120d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 2130d27868d0faef474594682f25336229daa89d6d7zhanyong.wan CPDF_Object* pRV = FPDF_GetFieldAttr(m_pDict, "RV"); 214bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (!pRV && (csDValue == csValue)) 215bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return false; 216bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 217bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (bNotify && !NotifyBeforeValueChange(csDValue)) 218bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return false; 219d201456903f3ecae1f7794edfab0d5678e64226shiqian 220d201456903f3ecae1f7794edfab0d5678e64226shiqian if (pDV) { 221d201456903f3ecae1f7794edfab0d5678e64226shiqian std::unique_ptr<CPDF_Object> pClone = pDV->Clone(); 2228bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan if (!pClone) 2238bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan return false; 2248bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan 2258bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan m_pDict->SetFor("V", std::move(pClone)); 2268bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan if (pRV) 2278bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan m_pDict->SetFor("RV", pDV->Clone()); 2288bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan } else { 2298bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan m_pDict->RemoveFor("V"); 2308bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan m_pDict->RemoveFor("RV"); 2318bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan } 2328bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan if (bNotify) 2338bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan NotifyAfterValueChange(); 2348bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan break; 2358bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan } 2368bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan } 2378bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan return true; 2388bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan} 2398bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan 2408bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wanint CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl) const { 2418bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan if (!pControl) 2428bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan return -1; 2438bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan 2448bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan auto it = std::find(m_ControlList.begin(), m_ControlList.end(), pControl); 2458bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan return it != m_ControlList.end() ? it - m_ControlList.begin() : -1; 2468bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan} 2478bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan 2488bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wanint CPDF_FormField::GetFieldType() const { 2498bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan switch (m_Type) { 2508bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan case PushButton: 2518bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan return FIELDTYPE_PUSHBUTTON; 2528bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan case CheckBox: 2538bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan return FIELDTYPE_CHECKBOX; 2548bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan case RadioButton: 2558bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan return FIELDTYPE_RADIOBUTTON; 2568bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan case ComboBox: 2578bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan return FIELDTYPE_COMBOBOX; 2588bdb31e0540c46de485b362178f60e8bb947ff43zhanyong.wan case ListBox: 259b2db677c9905a34ca6454aa526f7a0cc5cfaeca1zhanyong.wan return FIELDTYPE_LISTBOX; 260b2db677c9905a34ca6454aa526f7a0cc5cfaeca1zhanyong.wan case Text: 261b2db677c9905a34ca6454aa526f7a0cc5cfaeca1zhanyong.wan case RichText: 262b2db677c9905a34ca6454aa526f7a0cc5cfaeca1zhanyong.wan case File: 263b2db677c9905a34ca6454aa526f7a0cc5cfaeca1zhanyong.wan return FIELDTYPE_TEXTFIELD; 264c440a6923aa65d5be64134a6f430a5867a63df3fshiqian case Sign: 265c440a6923aa65d5be64134a6f430a5867a63df3fshiqian return FIELDTYPE_SIGNATURE; 266c440a6923aa65d5be64134a6f430a5867a63df3fshiqian default: 267c440a6923aa65d5be64134a6f430a5867a63df3fshiqian break; 268c440a6923aa65d5be64134a6f430a5867a63df3fshiqian } 269c440a6923aa65d5be64134a6f430a5867a63df3fshiqian return FIELDTYPE_UNKNOWN; 270c440a6923aa65d5be64134a6f430a5867a63df3fshiqian} 271c440a6923aa65d5be64134a6f430a5867a63df3fshiqian 272c440a6923aa65d5be64134a6f430a5867a63df3fshiqianCPDF_AAction CPDF_FormField::GetAdditionalAction() const { 273c440a6923aa65d5be64134a6f430a5867a63df3fshiqian CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "AA"); 274c440a6923aa65d5be64134a6f430a5867a63df3fshiqian return CPDF_AAction(pObj ? pObj->GetDict() : nullptr); 275c440a6923aa65d5be64134a6f430a5867a63df3fshiqian} 276c440a6923aa65d5be64134a6f430a5867a63df3fshiqian 277c440a6923aa65d5be64134a6f430a5867a63df3fshiqianCFX_WideString CPDF_FormField::GetAlternateName() const { 278c440a6923aa65d5be64134a6f430a5867a63df3fshiqian CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TU"); 279c440a6923aa65d5be64134a6f430a5867a63df3fshiqian return pObj ? pObj->GetUnicodeText() : L""; 280c440a6923aa65d5be64134a6f430a5867a63df3fshiqian} 281c440a6923aa65d5be64134a6f430a5867a63df3fshiqian 282c440a6923aa65d5be64134a6f430a5867a63df3fshiqianCFX_WideString CPDF_FormField::GetMappingName() const { 283c440a6923aa65d5be64134a6f430a5867a63df3fshiqian CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TM"); 284c440a6923aa65d5be64134a6f430a5867a63df3fshiqian return pObj ? pObj->GetUnicodeText() : L""; 285c440a6923aa65d5be64134a6f430a5867a63df3fshiqian} 286c440a6923aa65d5be64134a6f430a5867a63df3fshiqian 287c440a6923aa65d5be64134a6f430a5867a63df3fshiqianuint32_t CPDF_FormField::GetFieldFlags() const { 288c440a6923aa65d5be64134a6f430a5867a63df3fshiqian CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "Ff"); 28964cdcb69b28fc26e78d95c574187f7dd9830c84cshiqian return pObj ? pObj->GetInteger() : 0; 29064cdcb69b28fc26e78d95c574187f7dd9830c84cshiqian} 29164cdcb69b28fc26e78d95c574187f7dd9830c84cshiqian 292e92ccedad996eeb4f0d9244a1acd8882b5f54fd0zhanyong.wanCFX_ByteString CPDF_FormField::GetDefaultStyle() const { 29364cdcb69b28fc26e78d95c574187f7dd9830c84cshiqian CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DS"); 29464cdcb69b28fc26e78d95c574187f7dd9830c84cshiqian return pObj ? pObj->GetString() : ""; 29564cdcb69b28fc26e78d95c574187f7dd9830c84cshiqian} 296e92ccedad996eeb4f0d9244a1acd8882b5f54fd0zhanyong.wan 297e92ccedad996eeb4f0d9244a1acd8882b5f54fd0zhanyong.wanCFX_WideString CPDF_FormField::GetRichTextString() const { 298e92ccedad996eeb4f0d9244a1acd8882b5f54fd0zhanyong.wan CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "RV"); 299e92ccedad996eeb4f0d9244a1acd8882b5f54fd0zhanyong.wan return pObj ? pObj->GetUnicodeText() : L""; 300e92ccedad996eeb4f0d9244a1acd8882b5f54fd0zhanyong.wan} 30164cdcb69b28fc26e78d95c574187f7dd9830c84cshiqian 30264cdcb69b28fc26e78d95c574187f7dd9830c84cshiqianCFX_WideString CPDF_FormField::GetValue(bool bDefault) const { 30364cdcb69b28fc26e78d95c574187f7dd9830c84cshiqian if (GetType() == CheckBox || GetType() == RadioButton) 304e92ccedad996eeb4f0d9244a1acd8882b5f54fd0zhanyong.wan return GetCheckValue(bDefault); 305e92ccedad996eeb4f0d9244a1acd8882b5f54fd0zhanyong.wan 306e92ccedad996eeb4f0d9244a1acd8882b5f54fd0zhanyong.wan CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V"); 307e92ccedad996eeb4f0d9244a1acd8882b5f54fd0zhanyong.wan if (!pValue) { 308e92ccedad996eeb4f0d9244a1acd8882b5f54fd0zhanyong.wan if (!bDefault) { 30964cdcb69b28fc26e78d95c574187f7dd9830c84cshiqian if (m_Type == RichText) 31064cdcb69b28fc26e78d95c574187f7dd9830c84cshiqian pValue = FPDF_GetFieldAttr(m_pDict, "V"); 31106d04c0945bf47bae90532552e6e8294802fc9aavladlosev if (!pValue && m_Type != Text) 312d201456903f3ecae1f7794edfab0d5678e64226shiqian pValue = FPDF_GetFieldAttr(m_pDict, "DV"); 313c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan } 314c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan if (!pValue) 315c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan return CFX_WideString(); 316c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan } 317c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan 318e0865dd9199e8fffd5c2f95a68de6c1851f77c15shiqian switch (pValue->GetType()) { 319d201456903f3ecae1f7794edfab0d5678e64226shiqian case CPDF_Object::STRING: 320d201456903f3ecae1f7794edfab0d5678e64226shiqian case CPDF_Object::STREAM: 321e0865dd9199e8fffd5c2f95a68de6c1851f77c15shiqian return pValue->GetUnicodeText(); 322e0865dd9199e8fffd5c2f95a68de6c1851f77c15shiqian case CPDF_Object::ARRAY: 323e0865dd9199e8fffd5c2f95a68de6c1851f77c15shiqian pValue = pValue->AsArray()->GetDirectObjectAt(0); 324e0865dd9199e8fffd5c2f95a68de6c1851f77c15shiqian if (pValue) 325c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan return pValue->GetUnicodeText(); 326c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan break; 327c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan default: 328c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan break; 329c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan } 330c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan return CFX_WideString(); 331d201456903f3ecae1f7794edfab0d5678e64226shiqian} 332d201456903f3ecae1f7794edfab0d5678e64226shiqian 333e0865dd9199e8fffd5c2f95a68de6c1851f77c15shiqianCFX_WideString CPDF_FormField::GetValue() const { 334d201456903f3ecae1f7794edfab0d5678e64226shiqian return GetValue(false); 335d201456903f3ecae1f7794edfab0d5678e64226shiqian} 336e0865dd9199e8fffd5c2f95a68de6c1851f77c15shiqian 337e0865dd9199e8fffd5c2f95a68de6c1851f77c15shiqianCFX_WideString CPDF_FormField::GetDefaultValue() const { 338e0865dd9199e8fffd5c2f95a68de6c1851f77c15shiqian return GetValue(true); 339e0865dd9199e8fffd5c2f95a68de6c1851f77c15shiqian} 340d201456903f3ecae1f7794edfab0d5678e64226shiqian 341d201456903f3ecae1f7794edfab0d5678e64226shiqianbool CPDF_FormField::SetValue(const CFX_WideString& value, 342c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan bool bDefault, 343d21c142eb89ce42817165368641329072e2ad8fbvladlosev bool bNotify) { 344c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan switch (m_Type) { 345c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan case CheckBox: 346c78ae6196dc9c24380b5cf86f8fd75a4d3edc704zhanyong.wan case RadioButton: { 34706d04c0945bf47bae90532552e6e8294802fc9aavladlosev SetCheckValue(value, bDefault, bNotify); 3480c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return true; 3490c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } 350d201456903f3ecae1f7794edfab0d5678e64226shiqian case File: 351d201456903f3ecae1f7794edfab0d5678e64226shiqian case RichText: 3520c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev case Text: 3530c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev case ComboBox: { 3540c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev CFX_WideString csValue = value; 355d201456903f3ecae1f7794edfab0d5678e64226shiqian if (bNotify && !NotifyBeforeValueChange(csValue)) 356d201456903f3ecae1f7794edfab0d5678e64226shiqian return false; 357d201456903f3ecae1f7794edfab0d5678e64226shiqian 3580c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev CFX_ByteString key(bDefault ? "DV" : "V"); 3590c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev int iIndex = FindOptionValue(csValue); 3600c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (iIndex < 0) { 3610c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev CFX_ByteString bsEncodeText = PDF_EncodeText(csValue); 3620c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev m_pDict->SetNewFor<CPDF_String>(key, bsEncodeText, false); 3630c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (m_Type == RichText && !bDefault) 364d201456903f3ecae1f7794edfab0d5678e64226shiqian m_pDict->SetNewFor<CPDF_String>("RV", bsEncodeText, false); 365d201456903f3ecae1f7794edfab0d5678e64226shiqian m_pDict->RemoveFor("I"); 366d201456903f3ecae1f7794edfab0d5678e64226shiqian } else { 367d201456903f3ecae1f7794edfab0d5678e64226shiqian m_pDict->SetNewFor<CPDF_String>(key, PDF_EncodeText(csValue), false); 3680c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (!bDefault) { 3690c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev ClearSelection(); 370d201456903f3ecae1f7794edfab0d5678e64226shiqian SetItemSelection(iIndex, true); 3710c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } 372d201456903f3ecae1f7794edfab0d5678e64226shiqian } 373d201456903f3ecae1f7794edfab0d5678e64226shiqian if (bNotify) 374c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan NotifyAfterValueChange(); 375c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan break; 376c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan } 377c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan case ListBox: { 378c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan int iIndex = FindOptionValue(value); 379d201456903f3ecae1f7794edfab0d5678e64226shiqian if (iIndex < 0) 380d201456903f3ecae1f7794edfab0d5678e64226shiqian return false; 381d201456903f3ecae1f7794edfab0d5678e64226shiqian 382d201456903f3ecae1f7794edfab0d5678e64226shiqian if (bDefault && iIndex == GetDefaultSelectedItem()) 3830c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return false; 3840c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 385d201456903f3ecae1f7794edfab0d5678e64226shiqian if (bNotify && !NotifyBeforeSelectionChange(value)) 386c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan return false; 387c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan 388d201456903f3ecae1f7794edfab0d5678e64226shiqian if (!bDefault) { 389d201456903f3ecae1f7794edfab0d5678e64226shiqian ClearSelection(); 390c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan SetItemSelection(iIndex, true); 391c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan } 392d201456903f3ecae1f7794edfab0d5678e64226shiqian if (bNotify) 393d201456903f3ecae1f7794edfab0d5678e64226shiqian NotifyAfterSelectionChange(); 3940af0709b02899f9177db55eba7929e65e5834b29zhanyong.wan break; 395d201456903f3ecae1f7794edfab0d5678e64226shiqian } 396e0ecb7ac588e4061fe57207ff3734e465637b14dshiqian default: 3970c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev break; 398d201456903f3ecae1f7794edfab0d5678e64226shiqian } 399d201456903f3ecae1f7794edfab0d5678e64226shiqian return true; 400d201456903f3ecae1f7794edfab0d5678e64226shiqian} 4010c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 4020c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosevbool CPDF_FormField::SetValue(const CFX_WideString& value, bool bNotify) { 403d201456903f3ecae1f7794edfab0d5678e64226shiqian return SetValue(value, false, bNotify); 4040c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev} 4050c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 4060c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosevint CPDF_FormField::GetMaxLen() const { 4070c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "MaxLen")) 408d201456903f3ecae1f7794edfab0d5678e64226shiqian return pObj->GetInteger(); 4090c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 4100c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev for (const auto& pControl : m_ControlList) { 411d201456903f3ecae1f7794edfab0d5678e64226shiqian if (!pControl) 412d201456903f3ecae1f7794edfab0d5678e64226shiqian continue; 413d201456903f3ecae1f7794edfab0d5678e64226shiqian CPDF_Dictionary* pWidgetDict = pControl->m_pWidgetDict; 4140c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (pWidgetDict->KeyExist("MaxLen")) 4150c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return pWidgetDict->GetIntegerFor("MaxLen"); 416d201456903f3ecae1f7794edfab0d5678e64226shiqian } 4170c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return 0; 4180c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev} 4190c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 4200af0709b02899f9177db55eba7929e65e5834b29zhanyong.wanint CPDF_FormField::CountSelectedItems() const { 4210c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); 4220c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (!pValue) { 4230c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev pValue = FPDF_GetFieldAttr(m_pDict, "I"); 4240c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (!pValue) 4250c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return 0; 4260c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } 4270c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 4280c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (pValue->IsString() || pValue->IsNumber()) 4290c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return pValue->GetString().IsEmpty() ? 0 : 1; 4300c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (CPDF_Array* pArray = pValue->AsArray()) 4310c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return pArray->GetCount(); 4320c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return 0; 4330c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev} 4340c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 4350c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosevint CPDF_FormField::GetSelectedIndex(int index) const { 4360c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); 4370c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (!pValue) { 4380c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev pValue = FPDF_GetFieldAttr(m_pDict, "I"); 4390c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (!pValue) 4400c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return -1; 4410c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } 4420c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (pValue->IsNumber()) 4430c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return pValue->GetInteger(); 4440c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 4450c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev CFX_WideString sel_value; 446c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan if (pValue->IsString()) { 447c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan if (index != 0) 448c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan return -1; 4490c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev sel_value = pValue->GetUnicodeText(); 4500c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } else { 4510c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev CPDF_Array* pArray = pValue->AsArray(); 4520c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (!pArray || index < 0) 4530c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return -1; 4540c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 455c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan CPDF_Object* elementValue = pArray->GetDirectObjectAt(index); 456c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan sel_value = 457c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan elementValue ? elementValue->GetUnicodeText() : CFX_WideString(); 4580c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } 4590c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (index < CountSelectedOptions()) { 460c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan int iOptIndex = GetSelectedOptionIndex(index); 461c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan CFX_WideString csOpt = GetOptionValue(iOptIndex); 462c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan if (csOpt == sel_value) 463d201456903f3ecae1f7794edfab0d5678e64226shiqian return iOptIndex; 464d201456903f3ecae1f7794edfab0d5678e64226shiqian } 4650c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev for (int i = 0; i < CountOptions(); i++) { 4660c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (sel_value == GetOptionValue(i)) 4670c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return i; 4680c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } 4690c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return -1; 4700c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev} 4710c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 4720c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosevbool CPDF_FormField::ClearSelection(bool bNotify) { 4730c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (bNotify && m_pForm->m_pFormNotify) { 4740c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev CFX_WideString csValue; 4750c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev int iIndex = GetSelectedIndex(0); 4760af0709b02899f9177db55eba7929e65e5834b29zhanyong.wan if (iIndex >= 0) 4770c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev csValue = GetOptionLabel(iIndex); 4780c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 4790c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (!NotifyListOrComboBoxBeforeChange(csValue)) 4800c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return false; 4810c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } 4820c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev m_pDict->RemoveFor("V"); 4830c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev m_pDict->RemoveFor("I"); 4840c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (bNotify) 4850c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev NotifyListOrComboBoxAfterChange(); 4860c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return true; 4870c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev} 4880c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 4890c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosevbool CPDF_FormField::IsItemSelected(int index) const { 4900c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev ASSERT(GetType() == ComboBox || GetType() == ListBox); 4910c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (index < 0 || index >= CountOptions()) 4920c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return false; 4930c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (IsOptionSelected(index)) 4940c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return true; 4950af0709b02899f9177db55eba7929e65e5834b29zhanyong.wan 4960c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev CFX_WideString opt_value = GetOptionValue(index); 4970c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); 4980c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (!pValue) { 499c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan pValue = FPDF_GetFieldAttr(m_pDict, "I"); 500c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan if (!pValue) 5010c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return false; 5020c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } 5030c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 5040c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (pValue->IsString()) 5050c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return pValue->GetUnicodeText() == opt_value; 5060c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 507c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan if (pValue->IsNumber()) { 508c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan if (pValue->GetString().IsEmpty()) 5090c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return false; 510c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan return (pValue->GetInteger() == index); 511c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan } 5120c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 513c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan CPDF_Array* pArray = pValue->AsArray(); 514c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan if (!pArray) 5150c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return false; 5160af0709b02899f9177db55eba7929e65e5834b29zhanyong.wan 5170c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev int iPos = -1; 5180c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev for (int j = 0; j < CountSelectedOptions(); j++) { 5190af0709b02899f9177db55eba7929e65e5834b29zhanyong.wan if (GetSelectedOptionIndex(j) == index) { 5200c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev iPos = j; 521c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan break; 5220c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } 5230c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } 5240c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev for (int i = 0; i < static_cast<int>(pArray->GetCount()); i++) 5250c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (pArray->GetDirectObjectAt(i)->GetUnicodeText() == opt_value && 5260c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev i == iPos) { 5270c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return true; 5280c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev } 529c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan return false; 5300c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev} 5310c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev 5320c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosevbool CPDF_FormField::SetItemSelection(int index, bool bSelected, bool bNotify) { 533c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan ASSERT(GetType() == ComboBox || GetType() == ListBox); 5340c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev if (index < 0 || index >= CountOptions()) 5350c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev return false; 536c18438ca2983d4f334cfdbd4453e15c41111fa17zhanyong.wan 5370c5a66245b8c5939b36b2aad6f4d5ab89b724b1avladlosev CFX_WideString opt_value = GetOptionValue(index); 5380af0709b02899f9177db55eba7929e65e5834b29zhanyong.wan if (bNotify && !NotifyListOrComboBoxBeforeChange(opt_value)) 539d201456903f3ecae1f7794edfab0d5678e64226shiqian return false; 5402534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan 5412534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan if (bSelected) { 5422534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan if (GetType() == ListBox) { 5432534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan SelectOption(index, true); 5442534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan if (!(m_Flags & kFormListMultiSelect)) { 5452534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan m_pDict->SetNewFor<CPDF_String>("V", PDF_EncodeText(opt_value), false); 5462534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } else { 5472534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan CPDF_Array* pArray = m_pDict->SetNewFor<CPDF_Array>("V"); 5482534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan for (int i = 0; i < CountOptions(); i++) { 5492534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan if (i == index || IsItemSelected(i)) { 5502534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan opt_value = GetOptionValue(i); 5512534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan pArray->AddNew<CPDF_String>(PDF_EncodeText(opt_value), false); 5522534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } 5532534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } 5542534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } 5552534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } else { 5562534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan m_pDict->SetNewFor<CPDF_String>("V", PDF_EncodeText(opt_value), false); 5572534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan CPDF_Array* pI = m_pDict->SetNewFor<CPDF_Array>("I"); 5582534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan pI->AddNew<CPDF_Number>(index); 5592534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } 5602534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } else { 5612534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); 5622534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan if (pValue) { 5632534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan if (GetType() == ListBox) { 5642534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan SelectOption(index, false); 5652534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan if (pValue->IsString()) { 5662534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan if (pValue->GetUnicodeText() == opt_value) 5672534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan m_pDict->RemoveFor("V"); 5682534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } else if (pValue->IsArray()) { 5692534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan std::unique_ptr<CPDF_Array> pArray(new CPDF_Array); 5702534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan for (int i = 0; i < CountOptions(); i++) { 5712534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan if (i != index && IsItemSelected(i)) { 5722534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan opt_value = GetOptionValue(i); 5732534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan pArray->AddNew<CPDF_String>(PDF_EncodeText(opt_value), false); 5742534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } 5752534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } 5762534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan if (pArray->GetCount() > 0) 5772534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan m_pDict->SetFor("V", std::move(pArray)); 5782534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } 5792534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } else { 5802534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan m_pDict->RemoveFor("V"); 5812534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan m_pDict->RemoveFor("I"); 5822534ae201e47986d36d5fab0e523a7f046b8ec1ezhanyong.wan } 5830d27868d0faef474594682f25336229daa89d6d7zhanyong.wan } 584600105ee3ac48a01143486e5536a5b8fff5b5b25zhanyong.wan } 5850d27868d0faef474594682f25336229daa89d6d7zhanyong.wan if (bNotify) 586600105ee3ac48a01143486e5536a5b8fff5b5b25zhanyong.wan NotifyListOrComboBoxAfterChange(); 5870d27868d0faef474594682f25336229daa89d6d7zhanyong.wan return true; 58889080477aee9bd91536c9fb47bc31c62ea7d75bbzhanyong.wan} 5890d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 5900d27868d0faef474594682f25336229daa89d6d7zhanyong.wanbool CPDF_FormField::IsItemDefaultSelected(int index) const { 5910d27868d0faef474594682f25336229daa89d6d7zhanyong.wan ASSERT(GetType() == ComboBox || GetType() == ListBox); 59289080477aee9bd91536c9fb47bc31c62ea7d75bbzhanyong.wan if (index < 0 || index >= CountOptions()) 5930d27868d0faef474594682f25336229daa89d6d7zhanyong.wan return false; 5940d27868d0faef474594682f25336229daa89d6d7zhanyong.wan int iDVIndex = GetDefaultSelectedItem(); 5950d27868d0faef474594682f25336229daa89d6d7zhanyong.wan return iDVIndex >= 0 && iDVIndex == index; 59689080477aee9bd91536c9fb47bc31c62ea7d75bbzhanyong.wan} 5970d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 5980d27868d0faef474594682f25336229daa89d6d7zhanyong.wanint CPDF_FormField::GetDefaultSelectedItem() const { 5990d27868d0faef474594682f25336229daa89d6d7zhanyong.wan ASSERT(GetType() == ComboBox || GetType() == ListBox); 6000d27868d0faef474594682f25336229daa89d6d7zhanyong.wan CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "DV"); 601e6095deec89dcf5237948b3460d84a137622f16czhanyong.wan if (!pValue) 602d201456903f3ecae1f7794edfab0d5678e64226shiqian return -1; 6030d27868d0faef474594682f25336229daa89d6d7zhanyong.wan CFX_WideString csDV = pValue->GetUnicodeText(); 604bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (csDV.IsEmpty()) 6050d27868d0faef474594682f25336229daa89d6d7zhanyong.wan return -1; 6060d27868d0faef474594682f25336229daa89d6d7zhanyong.wan for (int i = 0; i < CountOptions(); i++) { 607bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (csDV == GetOptionValue(i)) 6080d27868d0faef474594682f25336229daa89d6d7zhanyong.wan return i; 6090d27868d0faef474594682f25336229daa89d6d7zhanyong.wan } 6100d27868d0faef474594682f25336229daa89d6d7zhanyong.wan return -1; 6110d27868d0faef474594682f25336229daa89d6d7zhanyong.wan} 6120d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 613bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wanint CPDF_FormField::CountOptions() const { 6140d27868d0faef474594682f25336229daa89d6d7zhanyong.wan CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt")); 6150d27868d0faef474594682f25336229daa89d6d7zhanyong.wan return pArray ? pArray->GetCount() : 0; 6160d27868d0faef474594682f25336229daa89d6d7zhanyong.wan} 6170d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 6180d27868d0faef474594682f25336229daa89d6d7zhanyong.wanCFX_WideString CPDF_FormField::GetOptionText(int index, int sub_index) const { 6190d27868d0faef474594682f25336229daa89d6d7zhanyong.wan CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt")); 6200d27868d0faef474594682f25336229daa89d6d7zhanyong.wan if (!pArray) 6210d27868d0faef474594682f25336229daa89d6d7zhanyong.wan return CFX_WideString(); 6220d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 6230d27868d0faef474594682f25336229daa89d6d7zhanyong.wan CPDF_Object* pOption = pArray->GetDirectObjectAt(index); 624bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (!pOption) 625bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return CFX_WideString(); 6260d27868d0faef474594682f25336229daa89d6d7zhanyong.wan if (CPDF_Array* pOptionArray = pOption->AsArray()) 6270d27868d0faef474594682f25336229daa89d6d7zhanyong.wan pOption = pOptionArray->GetDirectObjectAt(sub_index); 6280d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 6290d27868d0faef474594682f25336229daa89d6d7zhanyong.wan CPDF_String* pString = ToString(pOption); 630bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return pString ? pString->GetUnicodeText() : CFX_WideString(); 6310d27868d0faef474594682f25336229daa89d6d7zhanyong.wan} 6320d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 6330d27868d0faef474594682f25336229daa89d6d7zhanyong.wanCFX_WideString CPDF_FormField::GetOptionLabel(int index) const { 6340d27868d0faef474594682f25336229daa89d6d7zhanyong.wan return GetOptionText(index, 1); 6350d27868d0faef474594682f25336229daa89d6d7zhanyong.wan} 6360d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 637bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wanCFX_WideString CPDF_FormField::GetOptionValue(int index) const { 638bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return GetOptionText(index, 0); 6390d27868d0faef474594682f25336229daa89d6d7zhanyong.wan} 6400d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 6410d27868d0faef474594682f25336229daa89d6d7zhanyong.wanint CPDF_FormField::FindOption(CFX_WideString csOptLabel) const { 6420d27868d0faef474594682f25336229daa89d6d7zhanyong.wan for (int i = 0; i < CountOptions(); i++) { 6430d27868d0faef474594682f25336229daa89d6d7zhanyong.wan if (GetOptionValue(i) == csOptLabel) 644bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return i; 645bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } 646bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return -1; 6470d27868d0faef474594682f25336229daa89d6d7zhanyong.wan} 648bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 649bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wanint CPDF_FormField::FindOptionValue(const CFX_WideString& csOptValue) const { 6500d27868d0faef474594682f25336229daa89d6d7zhanyong.wan for (int i = 0; i < CountOptions(); i++) { 651bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (GetOptionValue(i) == csOptValue) 652bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return i; 6530d27868d0faef474594682f25336229daa89d6d7zhanyong.wan } 654bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return -1; 655bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan} 6560d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 657bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan#ifdef PDF_ENABLE_XFA 658bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wanint CPDF_FormField::InsertOption(CFX_WideString csOptLabel, 659bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan int index, 660bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan bool bNotify) { 661bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (csOptLabel.IsEmpty()) 662bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return -1; 663bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 664bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (bNotify && !NotifyListOrComboBoxBeforeChange(csOptLabel)) 665bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return -1; 6660d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 667bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CFX_ByteString csStr = 668bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan PDF_EncodeText(csOptLabel.c_str(), csOptLabel.GetLength()); 669bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CPDF_Array* pOpt = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt")); 670bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (!pOpt) 6710d27868d0faef474594682f25336229daa89d6d7zhanyong.wan pOpt = m_pDict->SetNewFor<CPDF_Array>("Opt"); 672bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 673bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan int iCount = pdfium::base::checked_cast<int>(pOpt->GetCount()); 674bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (index >= iCount) { 675bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan pOpt->AddNew<CPDF_String>(csStr, false); 6760d27868d0faef474594682f25336229daa89d6d7zhanyong.wan index = iCount; 6770d27868d0faef474594682f25336229daa89d6d7zhanyong.wan } else { 678bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan pOpt->InsertNewAt<CPDF_String>(index, csStr, false); 679bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } 680bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 681bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (bNotify) 682bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan NotifyListOrComboBoxAfterChange(); 683bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return index; 684bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan} 685bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 686bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wanbool CPDF_FormField::ClearOptions(bool bNotify) { 687bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (bNotify && m_pForm->m_pFormNotify) { 688bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CFX_WideString csValue; 689bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan int iIndex = GetSelectedIndex(0); 690bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (iIndex >= 0) 691bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan csValue = GetOptionLabel(iIndex); 692bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (!NotifyListOrComboBoxBeforeChange(csValue)) 693bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return false; 694bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } 6950d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 696bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan m_pDict->RemoveFor("Opt"); 697bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan m_pDict->RemoveFor("V"); 698bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan m_pDict->RemoveFor("DV"); 699bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan m_pDict->RemoveFor("I"); 700bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan m_pDict->RemoveFor("TI"); 701bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 702bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (bNotify) 703bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan NotifyListOrComboBoxAfterChange(); 704bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 705bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return true; 706bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan} 707bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan#endif // PDF_ENABLE_XFA 7086baed3c1173c19f5d43af75798d3685853fbe8bdzhanyong.wan 709bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wanbool CPDF_FormField::CheckControl(int iControlIndex, 710bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan bool bChecked, 711bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan bool bNotify) { 712bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan ASSERT(GetType() == CheckBox || GetType() == RadioButton); 713bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CPDF_FormControl* pControl = GetControl(iControlIndex); 714bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (!pControl) 715bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return false; 716bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (!bChecked && pControl->IsChecked() == bChecked) 717bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return false; 718bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 719bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CFX_WideString csWExport = pControl->GetExportValue(); 720bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CFX_ByteString csBExport = PDF_EncodeText(csWExport); 721bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan int iCount = CountControls(); 722bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan bool bUnison = IsUnison(this); 7230d27868d0faef474594682f25336229daa89d6d7zhanyong.wan for (int i = 0; i < iCount; i++) { 724bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CPDF_FormControl* pCtrl = GetControl(i); 725bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (bUnison) { 726bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CFX_WideString csEValue = pCtrl->GetExportValue(); 727bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (csEValue == csWExport) { 7280d27868d0faef474594682f25336229daa89d6d7zhanyong.wan if (pCtrl->GetOnStateName() == pControl->GetOnStateName()) 729bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan pCtrl->CheckControl(bChecked); 730bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan else if (bChecked) 731bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan pCtrl->CheckControl(false); 732bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } else if (bChecked) { 7330d27868d0faef474594682f25336229daa89d6d7zhanyong.wan pCtrl->CheckControl(false); 734bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } 735bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } else { 736bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (i == iControlIndex) 737bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan pCtrl->CheckControl(bChecked); 7380d27868d0faef474594682f25336229daa89d6d7zhanyong.wan else if (bChecked) 739bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan pCtrl->CheckControl(false); 740bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } 741bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } 742bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 743bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, "Opt"); 744bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (!ToArray(pOpt)) { 7450d27868d0faef474594682f25336229daa89d6d7zhanyong.wan if (bChecked) { 746bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan m_pDict->SetNewFor<CPDF_Name>("V", csBExport); 747bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } else { 748bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CFX_ByteString csV; 749bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V"); 7500d27868d0faef474594682f25336229daa89d6d7zhanyong.wan if (pV) 751bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan csV = pV->GetString(); 752bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (csV == csBExport) 753bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan m_pDict->SetNewFor<CPDF_Name>("V", "Off"); 754bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } 7550d27868d0faef474594682f25336229daa89d6d7zhanyong.wan } else if (bChecked) { 756bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CFX_ByteString csIndex; 757bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan csIndex.Format("%d", iControlIndex); 758bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan m_pDict->SetNewFor<CPDF_Name>("V", csIndex); 759bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } 760bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (bNotify && m_pForm->m_pFormNotify) 761bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan m_pForm->m_pFormNotify->AfterCheckedStatusChange(this); 762bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return true; 763bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan} 7640d27868d0faef474594682f25336229daa89d6d7zhanyong.wan 765bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wanCFX_WideString CPDF_FormField::GetCheckValue(bool bDefault) const { 766bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan ASSERT(GetType() == CheckBox || GetType() == RadioButton); 767bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CFX_WideString csExport = L"Off"; 768bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan int iCount = CountControls(); 769bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan for (int i = 0; i < iCount; i++) { 7700d27868d0faef474594682f25336229daa89d6d7zhanyong.wan CPDF_FormControl* pControl = GetControl(i); 7710d27868d0faef474594682f25336229daa89d6d7zhanyong.wan bool bChecked = 772bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan bDefault ? pControl->IsDefaultChecked() : pControl->IsChecked(); 773bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (bChecked) { 774bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan csExport = pControl->GetExportValue(); 775bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan break; 776bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } 7770d27868d0faef474594682f25336229daa89d6d7zhanyong.wan } 778bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return csExport; 779bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan} 780bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 781bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wanbool CPDF_FormField::SetCheckValue(const CFX_WideString& value, 782bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan bool bDefault, 783bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan bool bNotify) { 784bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan ASSERT(GetType() == CheckBox || GetType() == RadioButton); 785bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan int iCount = CountControls(); 7860d27868d0faef474594682f25336229daa89d6d7zhanyong.wan for (int i = 0; i < iCount; i++) { 787bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CPDF_FormControl* pControl = GetControl(i); 788bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CFX_WideString csExport = pControl->GetExportValue(); 789bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan bool val = csExport == value; 790bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (!bDefault) 791bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CheckControl(GetControlIndex(pControl), val); 792bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (val) 793bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan break; 794bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan } 7950d27868d0faef474594682f25336229daa89d6d7zhanyong.wan if (bNotify && m_pForm->m_pFormNotify) 796bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan m_pForm->m_pFormNotify->AfterCheckedStatusChange(this); 797bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return true; 798bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan} 799bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 800bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wanint CPDF_FormField::GetTopVisibleIndex() const { 801bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TI"); 802bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return pObj ? pObj->GetInteger() : 0; 803bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan} 804bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 805bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wanint CPDF_FormField::CountSelectedOptions() const { 8060d27868d0faef474594682f25336229daa89d6d7zhanyong.wan CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "I")); 807bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return pArray ? pArray->GetCount() : 0; 808bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan} 809bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 8100d27868d0faef474594682f25336229daa89d6d7zhanyong.wanint CPDF_FormField::GetSelectedOptionIndex(int index) const { 811bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "I")); 8120d27868d0faef474594682f25336229daa89d6d7zhanyong.wan if (!pArray) 813bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return -1; 814bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 815bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan int iCount = pArray->GetCount(); 816bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan if (iCount < 0 || index >= iCount) 817bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan return -1; 8180d27868d0faef474594682f25336229daa89d6d7zhanyong.wan return pArray->GetIntegerAt(index); 819bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan} 820bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wan 821bd851333e89517762c91a3fef67cf25a6f1bd37azhanyong.wanbool CPDF_FormField::IsOptionSelected(int iOptIndex) const { 82216e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "I")); 823d201456903f3ecae1f7794edfab0d5678e64226shiqian if (!pArray) 82416e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan return false; 82556a2e686e915d483cb22db091140130b23814127zhanyong.wan 82616e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan for (const auto& pObj : *pArray) { 82716e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan if (pObj->GetInteger() == iOptIndex) 82856a2e686e915d483cb22db091140130b23814127zhanyong.wan return true; 82956a2e686e915d483cb22db091140130b23814127zhanyong.wan } 83016e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan return false; 83116e9dd6e28a8a7fb2d611011e7353e042fcb282fzhanyong.wan} 832d201456903f3ecae1f7794edfab0d5678e64226shiqian 833d201456903f3ecae1f7794edfab0d5678e64226shiqianbool CPDF_FormField::SelectOption(int iOptIndex, bool bSelected, bool bNotify) { 834d201456903f3ecae1f7794edfab0d5678e64226shiqian CPDF_Array* pArray = m_pDict->GetArrayFor("I"); 835d201456903f3ecae1f7794edfab0d5678e64226shiqian if (!pArray) { 836bf9b4b48dc65adc2edd44175f77b4a7363c59234shiqian if (!bSelected) 837bf9b4b48dc65adc2edd44175f77b4a7363c59234shiqian return true; 83856a2e686e915d483cb22db091140130b23814127zhanyong.wan 839bf9b4b48dc65adc2edd44175f77b4a7363c59234shiqian pArray = m_pDict->SetNewFor<CPDF_Array>("I"); 840d201456903f3ecae1f7794edfab0d5678e64226shiqian } 841d201456903f3ecae1f7794edfab0d5678e64226shiqian 842d201456903f3ecae1f7794edfab0d5678e64226shiqian bool bReturn = false; 84356a2e686e915d483cb22db091140130b23814127zhanyong.wan for (size_t i = 0; i < pArray->GetCount(); i++) { 844d201456903f3ecae1f7794edfab0d5678e64226shiqian int iFind = pArray->GetIntegerAt(i); 845d201456903f3ecae1f7794edfab0d5678e64226shiqian if (iFind == iOptIndex) { 846d201456903f3ecae1f7794edfab0d5678e64226shiqian if (bSelected) 847d201456903f3ecae1f7794edfab0d5678e64226shiqian return true; 84856a2e686e915d483cb22db091140130b23814127zhanyong.wan 849d201456903f3ecae1f7794edfab0d5678e64226shiqian if (bNotify && m_pForm->m_pFormNotify) { 850d201456903f3ecae1f7794edfab0d5678e64226shiqian CFX_WideString csValue = GetOptionLabel(iOptIndex); 85156a2e686e915d483cb22db091140130b23814127zhanyong.wan if (!NotifyListOrComboBoxBeforeChange(csValue)) 85256a2e686e915d483cb22db091140130b23814127zhanyong.wan return false; 85356a2e686e915d483cb22db091140130b23814127zhanyong.wan } 85456a2e686e915d483cb22db091140130b23814127zhanyong.wan pArray->RemoveAt(i); 85556a2e686e915d483cb22db091140130b23814127zhanyong.wan bReturn = true; 85656a2e686e915d483cb22db091140130b23814127zhanyong.wan break; 85756a2e686e915d483cb22db091140130b23814127zhanyong.wan } 85856a2e686e915d483cb22db091140130b23814127zhanyong.wan 85956a2e686e915d483cb22db091140130b23814127zhanyong.wan if (iFind > iOptIndex) { 86056a2e686e915d483cb22db091140130b23814127zhanyong.wan if (!bSelected) 86156a2e686e915d483cb22db091140130b23814127zhanyong.wan continue; 86256a2e686e915d483cb22db091140130b23814127zhanyong.wan 86356a2e686e915d483cb22db091140130b23814127zhanyong.wan if (bNotify && m_pForm->m_pFormNotify) { 86456a2e686e915d483cb22db091140130b23814127zhanyong.wan CFX_WideString csValue = GetOptionLabel(iOptIndex); 86556a2e686e915d483cb22db091140130b23814127zhanyong.wan if (!NotifyListOrComboBoxBeforeChange(csValue)) 86656a2e686e915d483cb22db091140130b23814127zhanyong.wan return false; 86756a2e686e915d483cb22db091140130b23814127zhanyong.wan } 86856a2e686e915d483cb22db091140130b23814127zhanyong.wan pArray->InsertNewAt<CPDF_Number>(i, iOptIndex); 86956a2e686e915d483cb22db091140130b23814127zhanyong.wan bReturn = true; 87056a2e686e915d483cb22db091140130b23814127zhanyong.wan break; 87156a2e686e915d483cb22db091140130b23814127zhanyong.wan } 87256a2e686e915d483cb22db091140130b23814127zhanyong.wan } 87356a2e686e915d483cb22db091140130b23814127zhanyong.wan if (!bReturn) { 87456a2e686e915d483cb22db091140130b23814127zhanyong.wan if (bSelected) 87556a2e686e915d483cb22db091140130b23814127zhanyong.wan pArray->AddNew<CPDF_Number>(iOptIndex); 87656a2e686e915d483cb22db091140130b23814127zhanyong.wan 87756a2e686e915d483cb22db091140130b23814127zhanyong.wan if (pArray->IsEmpty()) 87856a2e686e915d483cb22db091140130b23814127zhanyong.wan m_pDict->RemoveFor("I"); 87956a2e686e915d483cb22db091140130b23814127zhanyong.wan } 88056a2e686e915d483cb22db091140130b23814127zhanyong.wan if (bNotify) 881d201456903f3ecae1f7794edfab0d5678e64226shiqian NotifyListOrComboBoxAfterChange(); 882d201456903f3ecae1f7794edfab0d5678e64226shiqian 8831998cf5d32a19aaffe8652545802744d9133022dvladlosev return true; 8841998cf5d32a19aaffe8652545802744d9133022dvladlosev} 8851998cf5d32a19aaffe8652545802744d9133022dvladlosev 8861998cf5d32a19aaffe8652545802744d9133022dvladlosevbool CPDF_FormField::ClearSelectedOptions(bool bNotify) { 88756a2e686e915d483cb22db091140130b23814127zhanyong.wan if (bNotify && m_pForm->m_pFormNotify) { 8881998cf5d32a19aaffe8652545802744d9133022dvladlosev CFX_WideString csValue; 8891998cf5d32a19aaffe8652545802744d9133022dvladlosev int iIndex = GetSelectedIndex(0); 8901998cf5d32a19aaffe8652545802744d9133022dvladlosev if (iIndex >= 0) 8911998cf5d32a19aaffe8652545802744d9133022dvladlosev csValue = GetOptionLabel(iIndex); 8921998cf5d32a19aaffe8652545802744d9133022dvladlosev 89356a2e686e915d483cb22db091140130b23814127zhanyong.wan if (!NotifyListOrComboBoxBeforeChange(csValue)) 8941998cf5d32a19aaffe8652545802744d9133022dvladlosev return false; 8951998cf5d32a19aaffe8652545802744d9133022dvladlosev } 8961998cf5d32a19aaffe8652545802744d9133022dvladlosev m_pDict->RemoveFor("I"); 89756a2e686e915d483cb22db091140130b23814127zhanyong.wan if (bNotify) 8981998cf5d32a19aaffe8652545802744d9133022dvladlosev NotifyListOrComboBoxAfterChange(); 89956a2e686e915d483cb22db091140130b23814127zhanyong.wan 90056a2e686e915d483cb22db091140130b23814127zhanyong.wan return true; 90156a2e686e915d483cb22db091140130b23814127zhanyong.wan} 90256a2e686e915d483cb22db091140130b23814127zhanyong.wan 9031998cf5d32a19aaffe8652545802744d9133022dvladlosevvoid CPDF_FormField::LoadDA() { 9041998cf5d32a19aaffe8652545802744d9133022dvladlosev CPDF_Dictionary* pFormDict = m_pForm->m_pFormDict; 9051998cf5d32a19aaffe8652545802744d9133022dvladlosev if (!pFormDict) 9061998cf5d32a19aaffe8652545802744d9133022dvladlosev return; 9071998cf5d32a19aaffe8652545802744d9133022dvladlosev 9081998cf5d32a19aaffe8652545802744d9133022dvladlosev CFX_ByteString DA; 9091998cf5d32a19aaffe8652545802744d9133022dvladlosev if (CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DA")) 9101998cf5d32a19aaffe8652545802744d9133022dvladlosev DA = pObj->GetString(); 9111998cf5d32a19aaffe8652545802744d9133022dvladlosev 9121998cf5d32a19aaffe8652545802744d9133022dvladlosev if (DA.IsEmpty()) 9131998cf5d32a19aaffe8652545802744d9133022dvladlosev DA = pFormDict->GetStringFor("DA"); 9141998cf5d32a19aaffe8652545802744d9133022dvladlosev 91556a2e686e915d483cb22db091140130b23814127zhanyong.wan if (DA.IsEmpty()) 91656a2e686e915d483cb22db091140130b23814127zhanyong.wan return; 91756a2e686e915d483cb22db091140130b23814127zhanyong.wan 91856a2e686e915d483cb22db091140130b23814127zhanyong.wan CPDF_Dictionary* pDR = pFormDict->GetDictFor("DR"); 91956a2e686e915d483cb22db091140130b23814127zhanyong.wan if (!pDR) 9201998cf5d32a19aaffe8652545802744d9133022dvladlosev return; 9211998cf5d32a19aaffe8652545802744d9133022dvladlosev 9221998cf5d32a19aaffe8652545802744d9133022dvladlosev CPDF_Dictionary* pFont = pDR->GetDictFor("Font"); 9231998cf5d32a19aaffe8652545802744d9133022dvladlosev if (!pFont) 9241998cf5d32a19aaffe8652545802744d9133022dvladlosev return; 9251998cf5d32a19aaffe8652545802744d9133022dvladlosev 9261998cf5d32a19aaffe8652545802744d9133022dvladlosev CPDF_SimpleParser syntax(DA.AsStringC()); 9271998cf5d32a19aaffe8652545802744d9133022dvladlosev syntax.FindTagParamFromStart("Tf", 2); 92856a2e686e915d483cb22db091140130b23814127zhanyong.wan CFX_ByteString font_name(syntax.GetWord()); 9291998cf5d32a19aaffe8652545802744d9133022dvladlosev CPDF_Dictionary* pFontDict = pFont->GetDictFor(font_name); 9301998cf5d32a19aaffe8652545802744d9133022dvladlosev if (!pFontDict) 9311998cf5d32a19aaffe8652545802744d9133022dvladlosev return; 9321998cf5d32a19aaffe8652545802744d9133022dvladlosev 9331998cf5d32a19aaffe8652545802744d9133022dvladlosev m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict); 93456a2e686e915d483cb22db091140130b23814127zhanyong.wan m_FontSize = FX_atof(syntax.GetWord()); 9351998cf5d32a19aaffe8652545802744d9133022dvladlosev} 9361998cf5d32a19aaffe8652545802744d9133022dvladlosev 9371998cf5d32a19aaffe8652545802744d9133022dvladlosevbool CPDF_FormField::NotifyBeforeSelectionChange(const CFX_WideString& value) { 93856a2e686e915d483cb22db091140130b23814127zhanyong.wan if (!m_pForm->m_pFormNotify) 9391998cf5d32a19aaffe8652545802744d9133022dvladlosev return true; 94056a2e686e915d483cb22db091140130b23814127zhanyong.wan return m_pForm->m_pFormNotify->BeforeSelectionChange(this, value) >= 0; 94156a2e686e915d483cb22db091140130b23814127zhanyong.wan} 94256a2e686e915d483cb22db091140130b23814127zhanyong.wan 94356a2e686e915d483cb22db091140130b23814127zhanyong.wanvoid CPDF_FormField::NotifyAfterSelectionChange() { 9441998cf5d32a19aaffe8652545802744d9133022dvladlosev if (!m_pForm->m_pFormNotify) 9451998cf5d32a19aaffe8652545802744d9133022dvladlosev return; 9461998cf5d32a19aaffe8652545802744d9133022dvladlosev m_pForm->m_pFormNotify->AfterSelectionChange(this); 9471998cf5d32a19aaffe8652545802744d9133022dvladlosev} 9481998cf5d32a19aaffe8652545802744d9133022dvladlosev 9491998cf5d32a19aaffe8652545802744d9133022dvladlosevbool CPDF_FormField::NotifyBeforeValueChange(const CFX_WideString& value) { 9501998cf5d32a19aaffe8652545802744d9133022dvladlosev if (!m_pForm->m_pFormNotify) 9511998cf5d32a19aaffe8652545802744d9133022dvladlosev return true; 9521998cf5d32a19aaffe8652545802744d9133022dvladlosev return m_pForm->m_pFormNotify->BeforeValueChange(this, value) >= 0; 9531998cf5d32a19aaffe8652545802744d9133022dvladlosev} 9541998cf5d32a19aaffe8652545802744d9133022dvladlosev 9551998cf5d32a19aaffe8652545802744d9133022dvladlosevvoid CPDF_FormField::NotifyAfterValueChange() { 95656a2e686e915d483cb22db091140130b23814127zhanyong.wan if (!m_pForm->m_pFormNotify) 95756a2e686e915d483cb22db091140130b23814127zhanyong.wan return; 95856a2e686e915d483cb22db091140130b23814127zhanyong.wan m_pForm->m_pFormNotify->AfterValueChange(this); 95956a2e686e915d483cb22db091140130b23814127zhanyong.wan} 9601998cf5d32a19aaffe8652545802744d9133022dvladlosev 9611998cf5d32a19aaffe8652545802744d9133022dvladlosevbool CPDF_FormField::NotifyListOrComboBoxBeforeChange( 9621998cf5d32a19aaffe8652545802744d9133022dvladlosev const CFX_WideString& value) { 9631998cf5d32a19aaffe8652545802744d9133022dvladlosev switch (GetType()) { 964d201456903f3ecae1f7794edfab0d5678e64226shiqian case ListBox: 965d201456903f3ecae1f7794edfab0d5678e64226shiqian return NotifyBeforeSelectionChange(value); 966d201456903f3ecae1f7794edfab0d5678e64226shiqian case ComboBox: 967d201456903f3ecae1f7794edfab0d5678e64226shiqian return NotifyBeforeValueChange(value); 968d201456903f3ecae1f7794edfab0d5678e64226shiqian default: 969d201456903f3ecae1f7794edfab0d5678e64226shiqian return true; 970d201456903f3ecae1f7794edfab0d5678e64226shiqian } 971d201456903f3ecae1f7794edfab0d5678e64226shiqian} 972d201456903f3ecae1f7794edfab0d5678e64226shiqian 973d201456903f3ecae1f7794edfab0d5678e64226shiqianvoid CPDF_FormField::NotifyListOrComboBoxAfterChange() { 97456a2e686e915d483cb22db091140130b23814127zhanyong.wan switch (GetType()) { 97556a2e686e915d483cb22db091140130b23814127zhanyong.wan case ListBox: 97656a2e686e915d483cb22db091140130b23814127zhanyong.wan NotifyAfterSelectionChange(); 97756a2e686e915d483cb22db091140130b23814127zhanyong.wan break; 97856a2e686e915d483cb22db091140130b23814127zhanyong.wan case ComboBox: 97956a2e686e915d483cb22db091140130b23814127zhanyong.wan NotifyAfterValueChange(); 98056a2e686e915d483cb22db091140130b23814127zhanyong.wan break; 98156a2e686e915d483cb22db091140130b23814127zhanyong.wan default: 98256a2e686e915d483cb22db091140130b23814127zhanyong.wan break; 98356a2e686e915d483cb22db091140130b23814127zhanyong.wan } 98456a2e686e915d483cb22db091140130b23814127zhanyong.wan} 98556a2e686e915d483cb22db091140130b23814127zhanyong.wan