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