1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "core/include/fpdfdoc/fpdf_doc.h"
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "doc_utils.h"
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL PDF_FormField_IsUnison(CPDF_FormField* pField) {
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bUnison = FALSE;
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pField->GetType() == CPDF_FormField::CheckBox) {
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bUnison = TRUE;
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_DWORD dwFlags = pField->GetFieldFlags();
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bUnison = ((dwFlags & 0x2000000) != 0);
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bUnison;
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict) {
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pDict = pDict;
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Type = Unknown;
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pForm = pForm;
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pFont = NULL;
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_FontSize = 0;
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SyncFieldFlags();
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_FormField::~CPDF_FormField() {}
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_FormField::SyncFieldFlags() {
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, "FT")
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 ? FPDF_GetFieldAttr(m_pDict, "FT")->GetString()
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 : CFX_ByteString();
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD flags = FPDF_GetFieldAttr(m_pDict, "Ff")
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       ? FPDF_GetFieldAttr(m_pDict, "Ff")->GetInteger()
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       : 0;
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_Flags = 0;
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (flags & 1) {
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Flags |= FORMFIELD_READONLY;
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (flags & 2) {
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Flags |= FORMFIELD_REQUIRED;
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (flags & 4) {
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Flags |= FORMFIELD_NOEXPORT;
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (type_name == "Btn") {
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (flags & 0x8000) {
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Type = RadioButton;
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (flags & 0x4000) {
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_Flags |= FORMRADIO_NOTOGGLEOFF;
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (flags & 0x2000000) {
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_Flags |= FORMRADIO_UNISON;
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (flags & 0x10000) {
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Type = PushButton;
57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    } else {
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Type = CheckBox;
59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (type_name == "Tx") {
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (flags & 0x100000) {
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Type = File;
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (flags & 0x2000000) {
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Type = RichText;
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Type = Text;
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (flags & 0x1000) {
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_Flags |= FORMTEXT_MULTILINE;
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (flags & 0x2000) {
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_Flags |= FORMTEXT_PASSWORD;
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (flags & 0x800000) {
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_Flags |= FORMTEXT_NOSCROLL;
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (flags & 0x100000) {
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_Flags |= FORMTEXT_COMB;
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    LoadDA();
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (type_name == "Ch") {
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (flags & 0x20000) {
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Type = ComboBox;
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (flags & 0x40000) {
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_Flags |= FORMCOMBO_EDIT;
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_Type = ListBox;
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (flags & 0x200000) {
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_Flags |= FORMLIST_MULTISELECT;
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    LoadDA();
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (type_name == "Sig") {
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_Type = Sign;
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_FormField::GetFullName() {
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return ::GetFullName(m_pDict);
100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify) {
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_Type) {
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CPDF_FormField::CheckBox:
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CPDF_FormField::RadioButton: {
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_ByteArray statusArray;
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        SaveCheckedFieldStatus(this, statusArray);
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int iCount = CountControls();
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iCount) {
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (PDF_FormField_IsUnison(this)) {
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          for (int i = 0; i < iCount; i++) {
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CheckControl(i, GetControl(i)->IsDefaultChecked(), FALSE);
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        } else {
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          for (int i = 0; i < iCount; i++) {
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPDF_FormControl* pControl = GetControl(i);
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FX_BOOL bChecked = pControl->IsDefaultChecked();
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CheckControl(i, bChecked, FALSE);
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } break;
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CPDF_FormField::ComboBox: {
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_WideString csValue;
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ClearSelection();
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int iIndex = GetDefaultSelectedItem();
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iIndex >= 0) {
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        csValue = GetOptionLabel(iIndex);
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iRet < 0) {
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      SetItemSelection(iIndex, TRUE);
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pForm->m_pFormNotify->AfterValueChange(this);
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } break;
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CPDF_FormField::ListBox: {
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_WideString csValue;
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ClearSelection();
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int iIndex = GetDefaultSelectedItem();
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iIndex >= 0) {
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        csValue = GetOptionLabel(iIndex);
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iRet < 0) {
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      SetItemSelection(iIndex, TRUE);
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pForm->m_pFormNotify->AfterSelectionChange(this);
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } break;
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CPDF_FormField::Text:
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CPDF_FormField::RichText:
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CPDF_FormField::File:
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default: {
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, "DV");
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_WideString csDValue;
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pDV) {
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        csDValue = pDV->GetUnicodeText();
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_WideString csValue;
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pV) {
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        csValue = pV->GetUnicodeText();
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pRV = FPDF_GetFieldAttr(m_pDict, "RV");
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!pRV && (csDValue == csValue)) {
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return FALSE;
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csDValue);
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iRet < 0) {
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pDV) {
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_Object* pClone = pDV->Clone();
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (!pClone) {
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pDict->SetAt("V", pClone);
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pRV) {
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CPDF_Object* pCloneR = pDV->Clone();
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_pDict->SetAt("RV", pCloneR);
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pDict->RemoveAt("V");
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pDict->RemoveAt("RV");
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pForm->m_pFormNotify->AfterValueChange(this);
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_bUpdated = TRUE;
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } break;
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl) {
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pControl) {
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < m_ControlList.GetSize(); i++) {
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_ControlList.GetAt(i) == pControl)
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return i;
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return -1;
218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::GetFieldType() {
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_Type) {
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PushButton:
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FIELDTYPE_PUSHBUTTON;
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CheckBox:
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FIELDTYPE_CHECKBOX;
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case RadioButton:
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FIELDTYPE_RADIOBUTTON;
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case ComboBox:
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FIELDTYPE_COMBOBOX;
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case ListBox:
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FIELDTYPE_LISTBOX;
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case Text:
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case RichText:
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case File:
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FIELDTYPE_TEXTFIELD;
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case Sign:
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FIELDTYPE_SIGNATURE;
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FIELDTYPE_UNKNOWN;
241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPDF_AAction CPDF_FormField::GetAdditionalAction() {
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "AA");
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObj) {
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pObj->GetDict();
248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_FormField::GetAlternateName() {
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TU");
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObj) {
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return L"";
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pObj->GetUnicodeText();
255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_FormField::GetMappingName() {
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TM");
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObj) {
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return L"";
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pObj->GetUnicodeText();
262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CPDF_FormField::GetFieldFlags() {
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "Ff");
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObj) {
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pObj->GetInteger();
269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPDF_FormField::GetDefaultStyle() {
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DS");
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObj) {
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return "";
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pObj->GetString();
276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_FormField::GetRichTextString() {
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "RV");
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObj) {
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return L"";
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pObj->GetUnicodeText();
283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault) {
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (GetType() == CheckBox || GetType() == RadioButton) {
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return GetCheckValue(bDefault);
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V");
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pValue) {
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!bDefault) {
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_Type == RichText) {
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pValue = FPDF_GetFieldAttr(m_pDict, "V");
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!pValue && m_Type != Text) {
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pValue = FPDF_GetFieldAttr(m_pDict, "DV");
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pValue) {
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return CFX_WideString();
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (pValue->GetType()) {
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STRING:
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_STREAM:
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pValue->GetUnicodeText();
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PDFOBJ_ARRAY:
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pValue = pValue->AsArray()->GetElementValue(0);
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pValue)
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return pValue->GetUnicodeText();
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return CFX_WideString();
313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_FormField::GetValue() {
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return GetValue(FALSE);
316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_FormField::GetDefaultValue() {
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return GetValue(TRUE);
319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value,
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 FX_BOOL bDefault,
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 FX_BOOL bNotify) {
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_Type) {
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case CheckBox:
325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case RadioButton: {
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      SetCheckValue(value, bDefault, bNotify);
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case File:
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case RichText:
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case Text:
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case ComboBox: {
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_WideString csValue = value;
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (iRet < 0) {
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int iIndex = FindOptionValue(csValue);
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iIndex < 0) {
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_ByteString bsEncodeText = PDF_EncodeText(csValue);
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pDict->SetAtString(bDefault ? "DV" : "V", bsEncodeText);
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (m_Type == RichText && !bDefault) {
345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_pDict->SetAtString("RV", bsEncodeText);
346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pDict->RemoveAt("I");
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pDict->SetAtString(bDefault ? "DV" : "V", PDF_EncodeText(csValue));
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (bDefault) {
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          ClearSelection();
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          SetItemSelection(iIndex, TRUE);
354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pForm->m_pFormNotify->AfterValueChange(this);
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_bUpdated = TRUE;
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } break;
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case ListBox: {
362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int iIndex = FindOptionValue(value);
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iIndex < 0) {
364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bDefault && iIndex == GetDefaultSelectedItem()) {
367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        return FALSE;
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_WideString csValue = value;
371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iRet < 0) {
373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bDefault) {
377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ClearSelection();
379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        SetItemSelection(iIndex, TRUE);
380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pForm->m_pFormNotify->AfterSelectionChange(this);
383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_bUpdated = TRUE;
385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_InterForm::m_bUpdateAP) {
391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    UpdateAP(NULL);
392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bNotify) {
396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return SetValue(value, FALSE, bNotify);
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::GetMaxLen() {
399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "MaxLen"))
400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pObj->GetInteger();
401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < m_ControlList.GetSize(); i++) {
403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_FormControl* pControl = m_ControlList.GetAt(i);
404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pControl)
405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Dictionary* pWidgetDict = pControl->m_pWidgetDict;
408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pWidgetDict->KeyExist("MaxLen"))
409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pWidgetDict->GetInteger("MaxLen");
410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::CountSelectedItems() {
414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pValue) {
416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pValue = FPDF_GetFieldAttr(m_pDict, "I");
417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pValue)
418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 0;
419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pValue->IsString() || pValue->IsNumber())
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pValue->GetString().IsEmpty() ? 0 : 1;
423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Array* pArray = pValue->AsArray())
424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pArray->GetCount();
425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::GetSelectedIndex(int index) {
428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pValue) {
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pValue = FPDF_GetFieldAttr(m_pDict, "I");
431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pValue)
432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return -1;
433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pValue->IsNumber())
435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pValue->GetInteger();
436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_WideString sel_value;
438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pValue->IsString()) {
439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (index != 0)
440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return -1;
441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    sel_value = pValue->GetUnicodeText();
442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Array* pArray = pValue->AsArray();
444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pArray || index < 0)
445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return -1;
446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Object* elementValue = pArray->GetElementValue(index);
448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    sel_value =
449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        elementValue ? elementValue->GetUnicodeText() : CFX_WideString();
450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index < CountSelectedOptions()) {
452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int iOptIndex = GetSelectedOptionIndex(index);
453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString csOpt = GetOptionValue(iOptIndex);
454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (csOpt == sel_value) {
455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return iOptIndex;
456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int nOpts = CountOptions();
459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < nOpts; i++) {
460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (sel_value == GetOptionValue(i)) {
461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return i;
462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return -1;
465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::ClearSelection(FX_BOOL bNotify) {
467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int iRet = 0;
469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString csValue;
470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int iIndex = GetSelectedIndex(0);
471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iIndex >= 0) {
472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      csValue = GetOptionLabel(iIndex);
473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ListBox) {
475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ComboBox) {
478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iRet < 0) {
481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pDict->RemoveAt("V");
485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pDict->RemoveAt("I");
486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ListBox) {
488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormNotify->AfterSelectionChange(this);
489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ComboBox) {
491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormNotify->AfterValueChange(this);
492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_InterForm::m_bUpdateAP) {
495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    UpdateAP(NULL);
496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pForm->m_bUpdated = TRUE;
498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::IsItemSelected(int index) {
501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(GetType() == ComboBox || GetType() == ListBox);
502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index < 0 || index >= CountOptions()) {
503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (IsOptionSelected(index)) {
506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_WideString opt_value = GetOptionValue(index);
509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pValue) {
511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pValue = FPDF_GetFieldAttr(m_pDict, "I");
512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!pValue) {
513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pValue->IsString())
518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pValue->GetUnicodeText() == opt_value;
519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pValue->IsNumber()) {
521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pValue->GetString().IsEmpty())
522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return (pValue->GetInteger() == index);
524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = pValue->AsArray();
527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pArray)
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iPos = -1;
531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int j = 0; j < CountSelectedOptions(); j++) {
532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetSelectedOptionIndex(j) == index) {
533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iPos = j;
534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (FX_DWORD i = 0; i < pArray->GetCount(); i++)
538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pArray->GetElementValue(i)->GetUnicodeText() == opt_value &&
539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        (int)i == iPos) {
540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::SetItemSelection(int index,
545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         FX_BOOL bSelected,
546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         FX_BOOL bNotify) {
547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(GetType() == ComboBox || GetType() == ListBox);
548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index < 0 || index >= CountOptions()) {
549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_WideString opt_value = GetOptionValue(index);
552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int iRet = 0;
554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ListBox) {
555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, opt_value);
556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ComboBox) {
558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, opt_value);
559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iRet < 0) {
561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bSelected) {
565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pValue) {
567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_Type == ListBox) {
568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        SelectOption(index, FALSE);
569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pValue->IsString()) {
570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (pValue->GetUnicodeText() == opt_value) {
571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            m_pDict->RemoveAt("V");
572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (pValue->IsArray()) {
574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CPDF_Array* pArray = new CPDF_Array;
575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          int iCount = CountOptions();
576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          for (int i = 0; i < iCount; i++) {
577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (i != index) {
578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              if (IsItemSelected(i)) {
579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                opt_value = GetOptionValue(i);
580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                pArray->AddString(PDF_EncodeText(opt_value));
581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              }
582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (pArray->GetCount() < 1) {
585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pArray->Release();
586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else {
587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            m_pDict->SetAt("V", pArray);
588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
589e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else if (m_Type == ComboBox) {
591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pDict->RemoveAt("V");
592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pDict->RemoveAt("I");
593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_Type == ListBox) {
597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      SelectOption(index, TRUE);
598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!(m_Flags & FORMLIST_MULTISELECT)) {
599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pDict->SetAtString("V", PDF_EncodeText(opt_value));
600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CPDF_Array* pArray = new CPDF_Array;
602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int iCount = CountOptions();
603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        for (int i = 0; i < iCount; i++) {
604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FX_BOOL bSelected;
605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (i != index) {
606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            bSelected = IsItemSelected(i);
607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else {
608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            bSelected = TRUE;
609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (bSelected) {
611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            opt_value = GetOptionValue(i);
612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            pArray->AddString(PDF_EncodeText(opt_value));
613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pDict->SetAt("V", pArray);
616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (m_Type == ComboBox) {
618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pDict->SetAtString("V", PDF_EncodeText(opt_value));
619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Array* pI = new CPDF_Array;
620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pI->AddInteger(index);
621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pDict->SetAt("I", pI);
622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ListBox) {
626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormNotify->AfterSelectionChange(this);
627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ComboBox) {
629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormNotify->AfterValueChange(this);
630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_InterForm::m_bUpdateAP) {
633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    UpdateAP(NULL);
634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pForm->m_bUpdated = TRUE;
636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
637e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::IsItemDefaultSelected(int index) {
639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(GetType() == ComboBox || GetType() == ListBox);
640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index < 0 || index >= CountOptions()) {
641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iDVIndex = GetDefaultSelectedItem();
644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iDVIndex < 0) {
645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (iDVIndex == index);
648e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::GetDefaultSelectedItem() {
650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(GetType() == ComboBox || GetType() == ListBox);
651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "DV");
652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pValue) {
653e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return -1;
654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_WideString csDV = pValue->GetUnicodeText();
656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (csDV.IsEmpty()) {
657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iCount = CountOptions();
660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < iCount; i++) {
661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (csDV == GetOptionValue(i)) {
662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return i;
663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return -1;
666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_FormField::UpdateAP(CPDF_FormControl* pControl) {
668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Type == PushButton) {
669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_Type == RadioButton || m_Type == CheckBox) {
672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pForm->m_bGenerateAP) {
675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < CountControls(); i++) {
678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_FormControl* pControl = GetControl(i);
679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FPDF_GenerateAP(m_pForm->m_pDocument, pControl->m_pWidgetDict);
680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::CountOptions() {
683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt"));
684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pArray ? pArray->GetCount() : 0;
685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_FormField::GetOptionText(int index, int sub_index) {
687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt"));
688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pArray)
689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CFX_WideString();
690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pOption = pArray->GetElementValue(index);
692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pOption)
693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return CFX_WideString();
694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Array* pOptionArray = pOption->AsArray())
695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pOption = pOptionArray->GetElementValue(sub_index);
696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_String* pString = ToString(pOption);
698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pString ? pString->GetUnicodeText() : CFX_WideString();
699e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_FormField::GetOptionLabel(int index) {
701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return GetOptionText(index, 1);
702e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_FormField::GetOptionValue(int index) {
704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return GetOptionText(index, 0);
705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::FindOption(CFX_WideString csOptLabel) {
707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iCount = CountOptions();
708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < iCount; i++) {
709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString csValue = GetOptionValue(i);
710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (csValue == csOptLabel) {
711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return i;
712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return -1;
715e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::FindOptionValue(const CFX_WideString& csOptValue,
717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    int iStartIndex) {
718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iStartIndex < 0) {
719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iStartIndex = 0;
720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iCount = CountOptions();
722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (; iStartIndex < iCount; iStartIndex++) {
723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString csValue = GetOptionValue(iStartIndex);
724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (csValue == csOptValue) {
725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return iStartIndex;
726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return -1;
729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef PDF_ENABLE_XFA
731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::InsertOption(CFX_WideString csOptLabel,
732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 int index,
733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                 FX_BOOL bNotify) {
734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (csOptLabel.IsEmpty())
735e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return -1;
736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int iRet = 0;
739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ListBox)
740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csOptLabel);
741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ComboBox)
742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csOptLabel);
743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iRet < 0)
744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return -1;
745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString csStr = PDF_EncodeText(csOptLabel, csOptLabel.GetLength());
748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");
749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pOpt = ToArray(pValue);
750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pOpt) {
751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pOpt = new CPDF_Array;
752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDict->SetAt("Opt", pOpt);
753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iCount = (int)pOpt->GetCount();
756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (index < 0 || index >= iCount) {
757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pOpt->AddString(csStr);
758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    index = iCount;
759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_String* pString = new CPDF_String(csStr, FALSE);
761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pOpt->InsertAt(index, pString);
762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ListBox)
766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormNotify->AfterSelectionChange(this);
767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ComboBox)
768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormNotify->AfterValueChange(this);
769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pForm->m_bUpdated = TRUE;
771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return index;
772e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::ClearOptions(FX_BOOL bNotify) {
774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int iRet = 0;
776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString csValue;
777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int iIndex = GetSelectedIndex(0);
778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iIndex >= 0)
779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      csValue = GetOptionLabel(iIndex);
780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ListBox)
781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ComboBox)
783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iRet < 0)
785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pDict->RemoveAt("Opt");
789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pDict->RemoveAt("V");
790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pDict->RemoveAt("DV");
791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pDict->RemoveAt("I");
792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pDict->RemoveAt("TI");
793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ListBox)
796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormNotify->AfterSelectionChange(this);
797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ComboBox)
798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormNotify->AfterValueChange(this);
799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pForm->m_bUpdated = TRUE;
802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
803e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif  // PDF_ENABLE_XFA
805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::CheckControl(int iControlIndex,
806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_BOOL bChecked,
807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_BOOL bNotify) {
808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(GetType() == CheckBox || GetType() == RadioButton);
809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_FormControl* pControl = GetControl(iControlIndex);
810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pControl) {
811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bChecked && pControl->IsChecked() == bChecked) {
814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteArray statusArray;
817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    SaveCheckedFieldStatus(this, statusArray);
819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_WideString csWExport = pControl->GetExportValue();
821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString csBExport = PDF_EncodeText(csWExport);
822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iCount = CountControls();
823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bUnison = PDF_FormField_IsUnison(this);
824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < iCount; i++) {
825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_FormControl* pCtrl = GetControl(i);
826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bUnison) {
827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_WideString csEValue = pCtrl->GetExportValue();
828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (csEValue == csWExport) {
829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pCtrl->GetOnStateName() == pControl->GetOnStateName()) {
830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCtrl->CheckControl(bChecked);
831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else if (bChecked) {
832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          pCtrl->CheckControl(FALSE);
833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else if (bChecked) {
835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pCtrl->CheckControl(FALSE);
836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (i == iControlIndex) {
839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pCtrl->CheckControl(bChecked);
840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else if (bChecked) {
841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pCtrl->CheckControl(FALSE);
842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, "Opt");
846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!ToArray(pOpt)) {
847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bChecked) {
848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pDict->SetAtName("V", csBExport);
849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_ByteString csV;
851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pV) {
853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        csV = pV->GetString();
854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (csV == csBExport) {
856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pDict->SetAtName("V", "Off");
857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (bChecked) {
860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_ByteString csIndex;
861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    csIndex.Format("%d", iControlIndex);
862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDict->SetAtName("V", csIndex);
863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
865ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pForm->m_bUpdated = TRUE;
868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
869e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_WideString CPDF_FormField::GetCheckValue(FX_BOOL bDefault) {
871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(GetType() == CheckBox || GetType() == RadioButton);
872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_WideString csExport = L"Off";
873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bChecked;
874ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iCount = CountControls();
875ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < iCount; i++) {
876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_FormControl* pControl = GetControl(i);
877ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bDefault) {
878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bChecked = pControl->IsDefaultChecked();
879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
880ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bChecked = pControl->IsChecked();
881e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
882ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bChecked) {
883ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      csExport = pControl->GetExportValue();
884ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
885e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    }
886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return csExport;
888e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
889ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::SetCheckValue(const CFX_WideString& value,
890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_BOOL bDefault,
891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_BOOL bNotify) {
892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(GetType() == CheckBox || GetType() == RadioButton);
893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteArray statusArray;
894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
895ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    SaveCheckedFieldStatus(this, statusArray);
896ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
897ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iCount = CountControls();
898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < iCount; i++) {
899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPDF_FormControl* pControl = GetControl(i);
900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString csExport = pControl->GetExportValue();
901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (csExport == value) {
902ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bDefault) {
903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CheckControl(GetControlIndex(pControl), TRUE);
905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bDefault) {
909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CheckControl(GetControlIndex(pControl), FALSE);
911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pForm->m_bUpdated = TRUE;
918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
919e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::GetTopVisibleIndex() {
921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TI");
922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObj) {
923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pObj->GetInteger();
926e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
927ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::CountSelectedOptions() {
928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
929ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObj) {
930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
931ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
932ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = pObj->GetArray();
933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pArray) {
934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (int)pArray->GetCount();
937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
938ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint CPDF_FormField::GetSelectedOptionIndex(int index) {
939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObj) {
941e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return -1;
942ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = pObj->GetArray();
944ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pArray) {
945ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
946ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iCount = (int)pArray->GetCount();
948ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iCount > 0 && index < iCount) {
949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return pArray->GetInteger(index);
950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return -1;
952e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::IsOptionSelected(int iOptIndex) {
954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pObj) {
956e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    return FALSE;
957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = pObj->GetArray();
959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pArray) {
960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int iCount = (int)pArray->GetCount();
963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < iCount; i++) {
964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pArray->GetInteger(i) == iOptIndex) {
965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
969e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::SelectOption(int iOptIndex,
971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_BOOL bSelected,
972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_BOOL bNotify) {
973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Array* pArray = m_pDict->GetArray("I");
974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pArray) {
975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!bSelected) {
976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return TRUE;
977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pArray = new CPDF_Array;
979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pDict->SetAt("I", pArray);
980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bReturn = FALSE;
982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int i = 0; i < (int)pArray->GetCount(); i++) {
983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int iFind = pArray->GetInteger(i);
984ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iFind == iOptIndex) {
985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bSelected) {
986ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return TRUE;
987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
989e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        int iRet = 0;
990ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_WideString csValue = GetOptionLabel(iOptIndex);
991e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (GetType() == ListBox) {
992ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
993e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
994e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (GetType() == ComboBox) {
995ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
996e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
997e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (iRet < 0) {
998ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
999e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1000ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1001ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pArray->RemoveAt(i);
1002ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bReturn = TRUE;
1003ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1004ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (iFind > iOptIndex) {
1005ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (!bSelected) {
1006ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        continue;
1007ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1008ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bNotify && m_pForm->m_pFormNotify) {
1009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int iRet = 0;
1010ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_WideString csValue = GetOptionLabel(iOptIndex);
1011e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (GetType() == ListBox) {
1012ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
1013e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1014e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        if (GetType() == ComboBox) {
1015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
1016e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov        }
1017ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (iRet < 0) {
1018ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
1019ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1020ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPDF_Number* pNum = new CPDF_Number(iOptIndex);
1022ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pArray->InsertAt(i, pNum);
1023ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bReturn = TRUE;
1024ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1025ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1026ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1027ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bReturn) {
1028ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bSelected) {
1029ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pArray->AddInteger(iOptIndex);
1030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pArray->GetCount() == 0) {
1032ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pDict->RemoveAt("I");
1033ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1035ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
1036ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ListBox) {
1037ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormNotify->AfterSelectionChange(this);
1038ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1039ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ComboBox) {
1040ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormNotify->AfterValueChange(this);
1041ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1042ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1043ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pForm->m_bUpdated = TRUE;
1044ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
1045e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1046ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CPDF_FormField::ClearSelectedOptions(FX_BOOL bNotify) {
1047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
1048ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int iRet = 0;
1049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_WideString csValue;
1050ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int iIndex = GetSelectedIndex(0);
1051ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iIndex >= 0) {
1052ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      csValue = GetOptionLabel(iIndex);
1053ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1054ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ListBox) {
1055ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
1056ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1057ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ComboBox) {
1058ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
1059ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iRet < 0) {
1061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
1062ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1063ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pDict->RemoveAt("I");
1065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (bNotify && m_pForm->m_pFormNotify) {
1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ListBox) {
1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormNotify->AfterSelectionChange(this);
1068ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1069ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetType() == ComboBox) {
1070ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormNotify->AfterValueChange(this);
1071ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1072ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1073ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pForm->m_bUpdated = TRUE;
1074ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
1075ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1076ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPDF_FormField::LoadDA() {
1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString DA;
1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPDF_Object* pObj_t = FPDF_GetFieldAttr(m_pDict, "DA")) {
1079ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    DA = pObj_t->GetString();
1080ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1081ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (DA.IsEmpty() && m_pForm->m_pFormDict) {
1082ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    DA = m_pForm->m_pFormDict->GetString("DA");
1083ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1084ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (DA.IsEmpty()) {
1085ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1086ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1087ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_SimpleParser syntax(DA);
1088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  syntax.FindTagParam("Tf", 2);
1089ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString font_name = syntax.GetWord();
1090ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPDF_Dictionary* pFontDict = NULL;
1091ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pForm->m_pFormDict && m_pForm->m_pFormDict->GetDict("DR") &&
1092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pForm->m_pFormDict->GetDict("DR")->GetDict("Font"))
1093ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pFontDict = m_pForm->m_pFormDict->GetDict("DR")->GetDict("Font")->GetDict(
1094ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        font_name);
1095e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1096ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pFontDict) {
1097ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1098ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1099ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict);
1100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_FontSize = FX_atof(syntax.GetWord());
1101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1102