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