| Index: core/fpdfdoc/doc_formfield.cpp
|
| diff --git a/core/fpdfdoc/doc_formfield.cpp b/core/fpdfdoc/doc_formfield.cpp
|
| deleted file mode 100644
|
| index cb1b0a4566001ce067a9f03667bfb57f2c5db678..0000000000000000000000000000000000000000
|
| --- a/core/fpdfdoc/doc_formfield.cpp
|
| +++ /dev/null
|
| @@ -1,987 +0,0 @@
|
| -// Copyright 2014 PDFium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
| -
|
| -#include "core/fpdfdoc/include/cpdf_formfield.h"
|
| -
|
| -#include "core/fpdfapi/fpdf_parser/include/cfdf_document.h"
|
| -#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
|
| -#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
|
| -#include "core/fpdfapi/fpdf_parser/include/cpdf_number.h"
|
| -#include "core/fpdfapi/fpdf_parser/include/cpdf_simple_parser.h"
|
| -#include "core/fpdfapi/fpdf_parser/include/cpdf_string.h"
|
| -#include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
|
| -#include "core/fpdfdoc/cpvt_generateap.h"
|
| -#include "core/fpdfdoc/doc_utils.h"
|
| -#include "core/fpdfdoc/include/cpdf_formcontrol.h"
|
| -#include "core/fpdfdoc/include/cpdf_interform.h"
|
| -
|
| -namespace {
|
| -
|
| -const int kFormListMultiSelect = 0x100;
|
| -
|
| -const int kFormComboEdit = 0x100;
|
| -
|
| -const int kFormFieldReadOnly = 0x01;
|
| -const int kFormFieldRequired = 0x02;
|
| -const int kFormFieldNoExport = 0x04;
|
| -
|
| -const int kFormRadioNoToggleOff = 0x100;
|
| -const int kFormRadioUnison = 0x200;
|
| -
|
| -const int kFormTextMultiLine = 0x100;
|
| -const int kFormTextPassword = 0x200;
|
| -const int kFormTextNoScroll = 0x400;
|
| -const int kFormTextComb = 0x800;
|
| -
|
| -bool PDF_FormField_IsUnison(CPDF_FormField* pField) {
|
| - if (pField->GetType() == CPDF_FormField::CheckBox)
|
| - return true;
|
| -
|
| - return (pField->GetFieldFlags() & 0x2000000) != 0;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict)
|
| - : m_Type(Unknown),
|
| - m_pForm(pForm),
|
| - m_pDict(pDict),
|
| - m_FontSize(0),
|
| - m_pFont(nullptr) {
|
| - SyncFieldFlags();
|
| -}
|
| -
|
| -CPDF_FormField::~CPDF_FormField() {}
|
| -
|
| -void CPDF_FormField::SyncFieldFlags() {
|
| - CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, "FT")
|
| - ? FPDF_GetFieldAttr(m_pDict, "FT")->GetString()
|
| - : CFX_ByteString();
|
| - uint32_t flags = FPDF_GetFieldAttr(m_pDict, "Ff")
|
| - ? FPDF_GetFieldAttr(m_pDict, "Ff")->GetInteger()
|
| - : 0;
|
| - m_Flags = 0;
|
| - if (flags & 1) {
|
| - m_Flags |= kFormFieldReadOnly;
|
| - }
|
| - if (flags & 2) {
|
| - m_Flags |= kFormFieldRequired;
|
| - }
|
| - if (flags & 4) {
|
| - m_Flags |= kFormFieldNoExport;
|
| - }
|
| - if (type_name == "Btn") {
|
| - if (flags & 0x8000) {
|
| - m_Type = RadioButton;
|
| - if (flags & 0x4000) {
|
| - m_Flags |= kFormRadioNoToggleOff;
|
| - }
|
| - if (flags & 0x2000000) {
|
| - m_Flags |= kFormRadioUnison;
|
| - }
|
| - } else if (flags & 0x10000) {
|
| - m_Type = PushButton;
|
| - } else {
|
| - m_Type = CheckBox;
|
| - }
|
| - } else if (type_name == "Tx") {
|
| - if (flags & 0x100000) {
|
| - m_Type = File;
|
| - } else if (flags & 0x2000000) {
|
| - m_Type = RichText;
|
| - } else {
|
| - m_Type = Text;
|
| - if (flags & 0x1000) {
|
| - m_Flags |= kFormTextMultiLine;
|
| - }
|
| - if (flags & 0x2000) {
|
| - m_Flags |= kFormTextPassword;
|
| - }
|
| - if (flags & 0x800000) {
|
| - m_Flags |= kFormTextNoScroll;
|
| - }
|
| - if (flags & 0x100000) {
|
| - m_Flags |= kFormTextComb;
|
| - }
|
| - }
|
| - LoadDA();
|
| - } else if (type_name == "Ch") {
|
| - if (flags & 0x20000) {
|
| - m_Type = ComboBox;
|
| - if (flags & 0x40000) {
|
| - m_Flags |= kFormComboEdit;
|
| - }
|
| - } else {
|
| - m_Type = ListBox;
|
| - if (flags & 0x200000) {
|
| - m_Flags |= kFormListMultiSelect;
|
| - }
|
| - }
|
| - LoadDA();
|
| - } else if (type_name == "Sig") {
|
| - m_Type = Sign;
|
| - }
|
| -}
|
| -CFX_WideString CPDF_FormField::GetFullName() const {
|
| - return ::GetFullName(m_pDict);
|
| -}
|
| -
|
| -FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify) {
|
| - switch (m_Type) {
|
| - case CPDF_FormField::CheckBox:
|
| - case CPDF_FormField::RadioButton: {
|
| - int iCount = CountControls();
|
| - if (iCount) {
|
| - // TODO(weili): Check whether anything special needs to be done for
|
| - // unison field. Otherwise, merge these branches.
|
| - if (PDF_FormField_IsUnison(this)) {
|
| - for (int i = 0; i < iCount; i++) {
|
| - CheckControl(i, GetControl(i)->IsDefaultChecked(), FALSE);
|
| - }
|
| - } else {
|
| - for (int i = 0; i < iCount; i++) {
|
| - CheckControl(i, GetControl(i)->IsDefaultChecked(), FALSE);
|
| - }
|
| - }
|
| - }
|
| - if (bNotify && m_pForm->m_pFormNotify) {
|
| - m_pForm->m_pFormNotify->AfterCheckedStatusChange(this);
|
| - }
|
| - } break;
|
| - case CPDF_FormField::ComboBox:
|
| - case CPDF_FormField::ListBox: {
|
| - CFX_WideString csValue;
|
| - ClearSelection();
|
| - int iIndex = GetDefaultSelectedItem();
|
| - if (iIndex >= 0)
|
| - csValue = GetOptionLabel(iIndex);
|
| -
|
| - if (bNotify && !NotifyListOrComboBoxBeforeChange(csValue))
|
| - return FALSE;
|
| -
|
| - SetItemSelection(iIndex, TRUE);
|
| - if (bNotify)
|
| - NotifyListOrComboBoxAfterChange();
|
| - } break;
|
| - case CPDF_FormField::Text:
|
| - case CPDF_FormField::RichText:
|
| - case CPDF_FormField::File:
|
| - default: {
|
| - CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, "DV");
|
| - CFX_WideString csDValue;
|
| - if (pDV)
|
| - csDValue = pDV->GetUnicodeText();
|
| -
|
| - CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
|
| - CFX_WideString csValue;
|
| - if (pV)
|
| - csValue = pV->GetUnicodeText();
|
| -
|
| - CPDF_Object* pRV = FPDF_GetFieldAttr(m_pDict, "RV");
|
| - if (!pRV && (csDValue == csValue))
|
| - return FALSE;
|
| -
|
| - if (bNotify && !NotifyBeforeValueChange(csDValue))
|
| - return FALSE;
|
| -
|
| - if (pDV) {
|
| - CPDF_Object* pClone = pDV->Clone();
|
| - if (!pClone)
|
| - return FALSE;
|
| -
|
| - m_pDict->SetAt("V", pClone);
|
| - if (pRV) {
|
| - CPDF_Object* pCloneR = pDV->Clone();
|
| - m_pDict->SetAt("RV", pCloneR);
|
| - }
|
| - } else {
|
| - m_pDict->RemoveAt("V");
|
| - m_pDict->RemoveAt("RV");
|
| - }
|
| - if (bNotify)
|
| - NotifyAfterValueChange();
|
| - } break;
|
| - }
|
| - return TRUE;
|
| -}
|
| -
|
| -int CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl) const {
|
| - if (!pControl)
|
| - return -1;
|
| -
|
| - for (int i = 0; i < m_ControlList.GetSize(); i++) {
|
| - if (m_ControlList.GetAt(i) == pControl)
|
| - return i;
|
| - }
|
| - return -1;
|
| -}
|
| -
|
| -int CPDF_FormField::GetFieldType() const {
|
| - switch (m_Type) {
|
| - case PushButton:
|
| - return FIELDTYPE_PUSHBUTTON;
|
| - case CheckBox:
|
| - return FIELDTYPE_CHECKBOX;
|
| - case RadioButton:
|
| - return FIELDTYPE_RADIOBUTTON;
|
| - case ComboBox:
|
| - return FIELDTYPE_COMBOBOX;
|
| - case ListBox:
|
| - return FIELDTYPE_LISTBOX;
|
| - case Text:
|
| - case RichText:
|
| - case File:
|
| - return FIELDTYPE_TEXTFIELD;
|
| - case Sign:
|
| - return FIELDTYPE_SIGNATURE;
|
| - default:
|
| - break;
|
| - }
|
| - return FIELDTYPE_UNKNOWN;
|
| -}
|
| -
|
| -CPDF_AAction CPDF_FormField::GetAdditionalAction() const {
|
| - CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "AA");
|
| - return CPDF_AAction(pObj ? pObj->GetDict() : nullptr);
|
| -}
|
| -
|
| -CFX_WideString CPDF_FormField::GetAlternateName() const {
|
| - CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TU");
|
| - if (!pObj) {
|
| - return L"";
|
| - }
|
| - return pObj->GetUnicodeText();
|
| -}
|
| -CFX_WideString CPDF_FormField::GetMappingName() const {
|
| - CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TM");
|
| - if (!pObj) {
|
| - return L"";
|
| - }
|
| - return pObj->GetUnicodeText();
|
| -}
|
| -uint32_t CPDF_FormField::GetFieldFlags() const {
|
| - CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "Ff");
|
| - if (!pObj) {
|
| - return 0;
|
| - }
|
| - return pObj->GetInteger();
|
| -}
|
| -CFX_ByteString CPDF_FormField::GetDefaultStyle() const {
|
| - CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DS");
|
| - if (!pObj) {
|
| - return "";
|
| - }
|
| - return pObj->GetString();
|
| -}
|
| -CFX_WideString CPDF_FormField::GetRichTextString() const {
|
| - CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "RV");
|
| - if (!pObj) {
|
| - return L"";
|
| - }
|
| - return pObj->GetUnicodeText();
|
| -}
|
| -CFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault) const {
|
| - if (GetType() == CheckBox || GetType() == RadioButton)
|
| - return GetCheckValue(bDefault);
|
| -
|
| - CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V");
|
| - if (!pValue) {
|
| - if (!bDefault) {
|
| - if (m_Type == RichText) {
|
| - pValue = FPDF_GetFieldAttr(m_pDict, "V");
|
| - }
|
| - if (!pValue && m_Type != Text) {
|
| - pValue = FPDF_GetFieldAttr(m_pDict, "DV");
|
| - }
|
| - }
|
| - if (!pValue)
|
| - return CFX_WideString();
|
| - }
|
| - switch (pValue->GetType()) {
|
| - case CPDF_Object::STRING:
|
| - case CPDF_Object::STREAM:
|
| - return pValue->GetUnicodeText();
|
| - case CPDF_Object::ARRAY:
|
| - pValue = pValue->AsArray()->GetDirectObjectAt(0);
|
| - if (pValue)
|
| - return pValue->GetUnicodeText();
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| - return CFX_WideString();
|
| -}
|
| -
|
| -CFX_WideString CPDF_FormField::GetValue() const {
|
| - return GetValue(FALSE);
|
| -}
|
| -
|
| -CFX_WideString CPDF_FormField::GetDefaultValue() const {
|
| - return GetValue(TRUE);
|
| -}
|
| -
|
| -FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value,
|
| - FX_BOOL bDefault,
|
| - FX_BOOL bNotify) {
|
| - switch (m_Type) {
|
| - case CheckBox:
|
| - case RadioButton: {
|
| - SetCheckValue(value, bDefault, bNotify);
|
| - return TRUE;
|
| - }
|
| - case File:
|
| - case RichText:
|
| - case Text:
|
| - case ComboBox: {
|
| - CFX_WideString csValue = value;
|
| - if (bNotify && !NotifyBeforeValueChange(csValue))
|
| - return FALSE;
|
| -
|
| - int iIndex = FindOptionValue(csValue);
|
| - if (iIndex < 0) {
|
| - CFX_ByteString bsEncodeText = PDF_EncodeText(csValue);
|
| - m_pDict->SetAtString(bDefault ? "DV" : "V", bsEncodeText);
|
| - if (m_Type == RichText && !bDefault)
|
| - m_pDict->SetAtString("RV", bsEncodeText);
|
| - m_pDict->RemoveAt("I");
|
| - } else {
|
| - m_pDict->SetAtString(bDefault ? "DV" : "V", PDF_EncodeText(csValue));
|
| - if (!bDefault) {
|
| - ClearSelection();
|
| - SetItemSelection(iIndex, TRUE);
|
| - }
|
| - }
|
| - if (bNotify)
|
| - NotifyAfterValueChange();
|
| - } break;
|
| - case ListBox: {
|
| - int iIndex = FindOptionValue(value);
|
| - if (iIndex < 0)
|
| - return FALSE;
|
| -
|
| - if (bDefault && iIndex == GetDefaultSelectedItem())
|
| - return FALSE;
|
| -
|
| - if (bNotify && !NotifyBeforeSelectionChange(value))
|
| - return FALSE;
|
| -
|
| - if (!bDefault) {
|
| - ClearSelection();
|
| - SetItemSelection(iIndex, TRUE);
|
| - }
|
| - if (bNotify)
|
| - NotifyAfterSelectionChange();
|
| - break;
|
| - }
|
| - default:
|
| - break;
|
| - }
|
| - return TRUE;
|
| -}
|
| -
|
| -FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bNotify) {
|
| - return SetValue(value, FALSE, bNotify);
|
| -}
|
| -
|
| -int CPDF_FormField::GetMaxLen() const {
|
| - if (CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "MaxLen"))
|
| - return pObj->GetInteger();
|
| -
|
| - for (int i = 0; i < m_ControlList.GetSize(); i++) {
|
| - CPDF_FormControl* pControl = m_ControlList.GetAt(i);
|
| - if (!pControl)
|
| - continue;
|
| -
|
| - CPDF_Dictionary* pWidgetDict = pControl->m_pWidgetDict;
|
| - if (pWidgetDict->KeyExist("MaxLen"))
|
| - return pWidgetDict->GetIntegerBy("MaxLen");
|
| - }
|
| - return 0;
|
| -}
|
| -
|
| -int CPDF_FormField::CountSelectedItems() const {
|
| - CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
|
| - if (!pValue) {
|
| - pValue = FPDF_GetFieldAttr(m_pDict, "I");
|
| - if (!pValue)
|
| - return 0;
|
| - }
|
| -
|
| - if (pValue->IsString() || pValue->IsNumber())
|
| - return pValue->GetString().IsEmpty() ? 0 : 1;
|
| - if (CPDF_Array* pArray = pValue->AsArray())
|
| - return pArray->GetCount();
|
| - return 0;
|
| -}
|
| -
|
| -int CPDF_FormField::GetSelectedIndex(int index) const {
|
| - CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
|
| - if (!pValue) {
|
| - pValue = FPDF_GetFieldAttr(m_pDict, "I");
|
| - if (!pValue)
|
| - return -1;
|
| - }
|
| - if (pValue->IsNumber())
|
| - return pValue->GetInteger();
|
| -
|
| - CFX_WideString sel_value;
|
| - if (pValue->IsString()) {
|
| - if (index != 0)
|
| - return -1;
|
| - sel_value = pValue->GetUnicodeText();
|
| - } else {
|
| - CPDF_Array* pArray = pValue->AsArray();
|
| - if (!pArray || index < 0)
|
| - return -1;
|
| -
|
| - CPDF_Object* elementValue = pArray->GetDirectObjectAt(index);
|
| - sel_value =
|
| - elementValue ? elementValue->GetUnicodeText() : CFX_WideString();
|
| - }
|
| - if (index < CountSelectedOptions()) {
|
| - int iOptIndex = GetSelectedOptionIndex(index);
|
| - CFX_WideString csOpt = GetOptionValue(iOptIndex);
|
| - if (csOpt == sel_value) {
|
| - return iOptIndex;
|
| - }
|
| - }
|
| - for (int i = 0; i < CountOptions(); i++) {
|
| - if (sel_value == GetOptionValue(i))
|
| - return i;
|
| - }
|
| - return -1;
|
| -}
|
| -
|
| -FX_BOOL CPDF_FormField::ClearSelection(FX_BOOL bNotify) {
|
| - if (bNotify && m_pForm->m_pFormNotify) {
|
| - CFX_WideString csValue;
|
| - int iIndex = GetSelectedIndex(0);
|
| - if (iIndex >= 0)
|
| - csValue = GetOptionLabel(iIndex);
|
| -
|
| - if (!NotifyListOrComboBoxBeforeChange(csValue))
|
| - return FALSE;
|
| - }
|
| - m_pDict->RemoveAt("V");
|
| - m_pDict->RemoveAt("I");
|
| - if (bNotify)
|
| - NotifyListOrComboBoxAfterChange();
|
| - return TRUE;
|
| -}
|
| -
|
| -FX_BOOL CPDF_FormField::IsItemSelected(int index) const {
|
| - ASSERT(GetType() == ComboBox || GetType() == ListBox);
|
| - if (index < 0 || index >= CountOptions()) {
|
| - return FALSE;
|
| - }
|
| - if (IsOptionSelected(index)) {
|
| - return TRUE;
|
| - }
|
| - CFX_WideString opt_value = GetOptionValue(index);
|
| - CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
|
| - if (!pValue) {
|
| - pValue = FPDF_GetFieldAttr(m_pDict, "I");
|
| - if (!pValue) {
|
| - return FALSE;
|
| - }
|
| - }
|
| -
|
| - if (pValue->IsString())
|
| - return pValue->GetUnicodeText() == opt_value;
|
| -
|
| - if (pValue->IsNumber()) {
|
| - if (pValue->GetString().IsEmpty())
|
| - return FALSE;
|
| - return (pValue->GetInteger() == index);
|
| - }
|
| -
|
| - CPDF_Array* pArray = pValue->AsArray();
|
| - if (!pArray)
|
| - return FALSE;
|
| -
|
| - int iPos = -1;
|
| - for (int j = 0; j < CountSelectedOptions(); j++) {
|
| - if (GetSelectedOptionIndex(j) == index) {
|
| - iPos = j;
|
| - break;
|
| - }
|
| - }
|
| - for (int i = 0; i < static_cast<int>(pArray->GetCount()); i++)
|
| - if (pArray->GetDirectObjectAt(i)->GetUnicodeText() == opt_value &&
|
| - i == iPos) {
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| -}
|
| -
|
| -FX_BOOL CPDF_FormField::SetItemSelection(int index,
|
| - FX_BOOL bSelected,
|
| - FX_BOOL bNotify) {
|
| - ASSERT(GetType() == ComboBox || GetType() == ListBox);
|
| - if (index < 0 || index >= CountOptions())
|
| - return FALSE;
|
| -
|
| - CFX_WideString opt_value = GetOptionValue(index);
|
| - if (bNotify && !NotifyListOrComboBoxBeforeChange(opt_value))
|
| - return FALSE;
|
| -
|
| - if (bSelected) {
|
| - if (GetType() == ListBox) {
|
| - SelectOption(index, TRUE);
|
| - if (!(m_Flags & kFormListMultiSelect)) {
|
| - m_pDict->SetAtString("V", PDF_EncodeText(opt_value));
|
| - } else {
|
| - CPDF_Array* pArray = new CPDF_Array;
|
| - for (int i = 0; i < CountOptions(); i++) {
|
| - if (i == index || IsItemSelected(i)) {
|
| - opt_value = GetOptionValue(i);
|
| - pArray->AddString(PDF_EncodeText(opt_value));
|
| - }
|
| - }
|
| - m_pDict->SetAt("V", pArray);
|
| - }
|
| - } else {
|
| - m_pDict->SetAtString("V", PDF_EncodeText(opt_value));
|
| - CPDF_Array* pI = new CPDF_Array;
|
| - pI->AddInteger(index);
|
| - m_pDict->SetAt("I", pI);
|
| - }
|
| - } else {
|
| - CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
|
| - if (pValue) {
|
| - if (GetType() == ListBox) {
|
| - SelectOption(index, FALSE);
|
| - if (pValue->IsString()) {
|
| - if (pValue->GetUnicodeText() == opt_value)
|
| - m_pDict->RemoveAt("V");
|
| - } else if (pValue->IsArray()) {
|
| - CPDF_Array* pArray = new CPDF_Array;
|
| - for (int i = 0; i < CountOptions(); i++) {
|
| - if (i != index && IsItemSelected(i)) {
|
| - opt_value = GetOptionValue(i);
|
| - pArray->AddString(PDF_EncodeText(opt_value));
|
| - }
|
| - }
|
| - if (pArray->GetCount() < 1)
|
| - pArray->Release();
|
| - else
|
| - m_pDict->SetAt("V", pArray);
|
| - }
|
| - } else {
|
| - m_pDict->RemoveAt("V");
|
| - m_pDict->RemoveAt("I");
|
| - }
|
| - }
|
| - }
|
| - if (bNotify)
|
| - NotifyListOrComboBoxAfterChange();
|
| - return TRUE;
|
| -}
|
| -
|
| -FX_BOOL CPDF_FormField::IsItemDefaultSelected(int index) const {
|
| - ASSERT(GetType() == ComboBox || GetType() == ListBox);
|
| - if (index < 0 || index >= CountOptions())
|
| - return FALSE;
|
| - int iDVIndex = GetDefaultSelectedItem();
|
| - return iDVIndex >= 0 && iDVIndex == index;
|
| -}
|
| -
|
| -int CPDF_FormField::GetDefaultSelectedItem() const {
|
| - ASSERT(GetType() == ComboBox || GetType() == ListBox);
|
| - CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "DV");
|
| - if (!pValue)
|
| - return -1;
|
| - CFX_WideString csDV = pValue->GetUnicodeText();
|
| - if (csDV.IsEmpty())
|
| - return -1;
|
| - for (int i = 0; i < CountOptions(); i++) {
|
| - if (csDV == GetOptionValue(i))
|
| - return i;
|
| - }
|
| - return -1;
|
| -}
|
| -
|
| -int CPDF_FormField::CountOptions() const {
|
| - CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt"));
|
| - return pArray ? pArray->GetCount() : 0;
|
| -}
|
| -
|
| -CFX_WideString CPDF_FormField::GetOptionText(int index, int sub_index) const {
|
| - CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt"));
|
| - if (!pArray)
|
| - return CFX_WideString();
|
| -
|
| - CPDF_Object* pOption = pArray->GetDirectObjectAt(index);
|
| - if (!pOption)
|
| - return CFX_WideString();
|
| - if (CPDF_Array* pOptionArray = pOption->AsArray())
|
| - pOption = pOptionArray->GetDirectObjectAt(sub_index);
|
| -
|
| - CPDF_String* pString = ToString(pOption);
|
| - return pString ? pString->GetUnicodeText() : CFX_WideString();
|
| -}
|
| -CFX_WideString CPDF_FormField::GetOptionLabel(int index) const {
|
| - return GetOptionText(index, 1);
|
| -}
|
| -CFX_WideString CPDF_FormField::GetOptionValue(int index) const {
|
| - return GetOptionText(index, 0);
|
| -}
|
| -
|
| -int CPDF_FormField::FindOption(CFX_WideString csOptLabel) const {
|
| - for (int i = 0; i < CountOptions(); i++) {
|
| - if (GetOptionValue(i) == csOptLabel)
|
| - return i;
|
| - }
|
| - return -1;
|
| -}
|
| -
|
| -int CPDF_FormField::FindOptionValue(const CFX_WideString& csOptValue) const {
|
| - for (int i = 0; i < CountOptions(); i++) {
|
| - if (GetOptionValue(i) == csOptValue)
|
| - return i;
|
| - }
|
| - return -1;
|
| -}
|
| -
|
| -#ifdef PDF_ENABLE_XFA
|
| -int CPDF_FormField::InsertOption(CFX_WideString csOptLabel,
|
| - int index,
|
| - FX_BOOL bNotify) {
|
| - if (csOptLabel.IsEmpty())
|
| - return -1;
|
| -
|
| - if (bNotify && !NotifyListOrComboBoxBeforeChange(csOptLabel))
|
| - return -1;
|
| -
|
| - CFX_ByteString csStr =
|
| - PDF_EncodeText(csOptLabel.c_str(), csOptLabel.GetLength());
|
| - CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");
|
| - CPDF_Array* pOpt = ToArray(pValue);
|
| - if (!pOpt) {
|
| - pOpt = new CPDF_Array;
|
| - m_pDict->SetAt("Opt", pOpt);
|
| - }
|
| -
|
| - int iCount = (int)pOpt->GetCount();
|
| - if (index < 0 || index >= iCount) {
|
| - pOpt->AddString(csStr);
|
| - index = iCount;
|
| - } else {
|
| - CPDF_String* pString = new CPDF_String(csStr, FALSE);
|
| - pOpt->InsertAt(index, pString);
|
| - }
|
| -
|
| - if (bNotify)
|
| - NotifyListOrComboBoxAfterChange();
|
| - return index;
|
| -}
|
| -
|
| -FX_BOOL CPDF_FormField::ClearOptions(FX_BOOL bNotify) {
|
| - if (bNotify && m_pForm->m_pFormNotify) {
|
| - CFX_WideString csValue;
|
| - int iIndex = GetSelectedIndex(0);
|
| - if (iIndex >= 0)
|
| - csValue = GetOptionLabel(iIndex);
|
| - if (!NotifyListOrComboBoxBeforeChange(csValue))
|
| - return FALSE;
|
| - }
|
| -
|
| - m_pDict->RemoveAt("Opt");
|
| - m_pDict->RemoveAt("V");
|
| - m_pDict->RemoveAt("DV");
|
| - m_pDict->RemoveAt("I");
|
| - m_pDict->RemoveAt("TI");
|
| -
|
| - if (bNotify)
|
| - NotifyListOrComboBoxAfterChange();
|
| -
|
| - return TRUE;
|
| -}
|
| -#endif // PDF_ENABLE_XFA
|
| -
|
| -FX_BOOL CPDF_FormField::CheckControl(int iControlIndex,
|
| - bool bChecked,
|
| - bool bNotify) {
|
| - ASSERT(GetType() == CheckBox || GetType() == RadioButton);
|
| - CPDF_FormControl* pControl = GetControl(iControlIndex);
|
| - if (!pControl) {
|
| - return FALSE;
|
| - }
|
| - if (!bChecked && pControl->IsChecked() == bChecked) {
|
| - return FALSE;
|
| - }
|
| - CFX_WideString csWExport = pControl->GetExportValue();
|
| - CFX_ByteString csBExport = PDF_EncodeText(csWExport);
|
| - int iCount = CountControls();
|
| - bool bUnison = PDF_FormField_IsUnison(this);
|
| - for (int i = 0; i < iCount; i++) {
|
| - CPDF_FormControl* pCtrl = GetControl(i);
|
| - if (bUnison) {
|
| - CFX_WideString csEValue = pCtrl->GetExportValue();
|
| - if (csEValue == csWExport) {
|
| - if (pCtrl->GetOnStateName() == pControl->GetOnStateName()) {
|
| - pCtrl->CheckControl(bChecked);
|
| - } else if (bChecked) {
|
| - pCtrl->CheckControl(FALSE);
|
| - }
|
| - } else if (bChecked) {
|
| - pCtrl->CheckControl(FALSE);
|
| - }
|
| - } else {
|
| - if (i == iControlIndex) {
|
| - pCtrl->CheckControl(bChecked);
|
| - } else if (bChecked) {
|
| - pCtrl->CheckControl(FALSE);
|
| - }
|
| - }
|
| - }
|
| - CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, "Opt");
|
| - if (!ToArray(pOpt)) {
|
| - if (bChecked) {
|
| - m_pDict->SetAtName("V", csBExport);
|
| - } else {
|
| - CFX_ByteString csV;
|
| - CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
|
| - if (pV) {
|
| - csV = pV->GetString();
|
| - }
|
| - if (csV == csBExport) {
|
| - m_pDict->SetAtName("V", "Off");
|
| - }
|
| - }
|
| - } else if (bChecked) {
|
| - CFX_ByteString csIndex;
|
| - csIndex.Format("%d", iControlIndex);
|
| - m_pDict->SetAtName("V", csIndex);
|
| - }
|
| - if (bNotify && m_pForm->m_pFormNotify)
|
| - m_pForm->m_pFormNotify->AfterCheckedStatusChange(this);
|
| - return TRUE;
|
| -}
|
| -
|
| -CFX_WideString CPDF_FormField::GetCheckValue(FX_BOOL bDefault) const {
|
| - ASSERT(GetType() == CheckBox || GetType() == RadioButton);
|
| - CFX_WideString csExport = L"Off";
|
| - int iCount = CountControls();
|
| - for (int i = 0; i < iCount; i++) {
|
| - CPDF_FormControl* pControl = GetControl(i);
|
| - FX_BOOL bChecked =
|
| - bDefault ? pControl->IsDefaultChecked() : pControl->IsChecked();
|
| - if (bChecked) {
|
| - csExport = pControl->GetExportValue();
|
| - break;
|
| - }
|
| - }
|
| - return csExport;
|
| -}
|
| -
|
| -FX_BOOL CPDF_FormField::SetCheckValue(const CFX_WideString& value,
|
| - FX_BOOL bDefault,
|
| - FX_BOOL bNotify) {
|
| - ASSERT(GetType() == CheckBox || GetType() == RadioButton);
|
| - int iCount = CountControls();
|
| - for (int i = 0; i < iCount; i++) {
|
| - CPDF_FormControl* pControl = GetControl(i);
|
| - CFX_WideString csExport = pControl->GetExportValue();
|
| - bool val = csExport == value;
|
| - if (!bDefault)
|
| - CheckControl(GetControlIndex(pControl), val);
|
| - if (val)
|
| - break;
|
| - }
|
| - if (bNotify && m_pForm->m_pFormNotify)
|
| - m_pForm->m_pFormNotify->AfterCheckedStatusChange(this);
|
| - return TRUE;
|
| -}
|
| -
|
| -int CPDF_FormField::GetTopVisibleIndex() const {
|
| - CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TI");
|
| - return pObj ? pObj->GetInteger() : 0;
|
| -}
|
| -
|
| -int CPDF_FormField::CountSelectedOptions() const {
|
| - CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "I"));
|
| - return pArray ? pArray->GetCount() : 0;
|
| -}
|
| -
|
| -int CPDF_FormField::GetSelectedOptionIndex(int index) const {
|
| - CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "I"));
|
| - if (!pArray)
|
| - return -1;
|
| -
|
| - int iCount = pArray->GetCount();
|
| - if (iCount < 0 || index >= iCount)
|
| - return -1;
|
| - return pArray->GetIntegerAt(index);
|
| -}
|
| -
|
| -FX_BOOL CPDF_FormField::IsOptionSelected(int iOptIndex) const {
|
| - CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "I"));
|
| - if (!pArray)
|
| - return FALSE;
|
| -
|
| - for (CPDF_Object* pObj : *pArray) {
|
| - if (pObj->GetInteger() == iOptIndex)
|
| - return TRUE;
|
| - }
|
| - return FALSE;
|
| -}
|
| -
|
| -FX_BOOL CPDF_FormField::SelectOption(int iOptIndex,
|
| - FX_BOOL bSelected,
|
| - FX_BOOL bNotify) {
|
| - CPDF_Array* pArray = m_pDict->GetArrayBy("I");
|
| - if (!pArray) {
|
| - if (!bSelected)
|
| - return TRUE;
|
| -
|
| - pArray = new CPDF_Array;
|
| - m_pDict->SetAt("I", pArray);
|
| - }
|
| -
|
| - FX_BOOL bReturn = FALSE;
|
| - for (size_t i = 0; i < pArray->GetCount(); i++) {
|
| - int iFind = pArray->GetIntegerAt(i);
|
| - if (iFind == iOptIndex) {
|
| - if (bSelected)
|
| - return TRUE;
|
| -
|
| - if (bNotify && m_pForm->m_pFormNotify) {
|
| - CFX_WideString csValue = GetOptionLabel(iOptIndex);
|
| - if (!NotifyListOrComboBoxBeforeChange(csValue))
|
| - return FALSE;
|
| - }
|
| - pArray->RemoveAt(i);
|
| - bReturn = TRUE;
|
| - break;
|
| - }
|
| -
|
| - if (iFind > iOptIndex) {
|
| - if (!bSelected)
|
| - continue;
|
| -
|
| - if (bNotify && m_pForm->m_pFormNotify) {
|
| - CFX_WideString csValue = GetOptionLabel(iOptIndex);
|
| - if (!NotifyListOrComboBoxBeforeChange(csValue))
|
| - return FALSE;
|
| - }
|
| - pArray->InsertAt(i, new CPDF_Number(iOptIndex));
|
| - bReturn = TRUE;
|
| - break;
|
| - }
|
| - }
|
| - if (!bReturn) {
|
| - if (bSelected)
|
| - pArray->AddInteger(iOptIndex);
|
| -
|
| - if (pArray->GetCount() == 0)
|
| - m_pDict->RemoveAt("I");
|
| - }
|
| - if (bNotify)
|
| - NotifyListOrComboBoxAfterChange();
|
| -
|
| - return TRUE;
|
| -}
|
| -
|
| -FX_BOOL CPDF_FormField::ClearSelectedOptions(FX_BOOL bNotify) {
|
| - if (bNotify && m_pForm->m_pFormNotify) {
|
| - CFX_WideString csValue;
|
| - int iIndex = GetSelectedIndex(0);
|
| - if (iIndex >= 0)
|
| - csValue = GetOptionLabel(iIndex);
|
| -
|
| - if (!NotifyListOrComboBoxBeforeChange(csValue))
|
| - return FALSE;
|
| - }
|
| - m_pDict->RemoveAt("I");
|
| - if (bNotify)
|
| - NotifyListOrComboBoxAfterChange();
|
| -
|
| - return TRUE;
|
| -}
|
| -
|
| -void CPDF_FormField::LoadDA() {
|
| - CPDF_Dictionary* pFormDict = m_pForm->m_pFormDict;
|
| - if (!pFormDict)
|
| - return;
|
| -
|
| - CFX_ByteString DA;
|
| - if (CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DA"))
|
| - DA = pObj->GetString();
|
| -
|
| - if (DA.IsEmpty())
|
| - DA = pFormDict->GetStringBy("DA");
|
| -
|
| - if (DA.IsEmpty())
|
| - return;
|
| -
|
| - CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR");
|
| - if (!pDR)
|
| - return;
|
| -
|
| - CPDF_Dictionary* pFont = pDR->GetDictBy("Font");
|
| - if (!pFont)
|
| - return;
|
| -
|
| - CPDF_SimpleParser syntax(DA.AsStringC());
|
| - syntax.FindTagParamFromStart("Tf", 2);
|
| - CFX_ByteString font_name(syntax.GetWord());
|
| - CPDF_Dictionary* pFontDict = pFont->GetDictBy(font_name);
|
| - if (!pFontDict)
|
| - return;
|
| -
|
| - m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict);
|
| - m_FontSize = FX_atof(syntax.GetWord());
|
| -}
|
| -
|
| -bool CPDF_FormField::NotifyBeforeSelectionChange(const CFX_WideString& value) {
|
| - if (!m_pForm->m_pFormNotify)
|
| - return true;
|
| - return m_pForm->m_pFormNotify->BeforeSelectionChange(this, value) >= 0;
|
| -}
|
| -
|
| -void CPDF_FormField::NotifyAfterSelectionChange() {
|
| - if (!m_pForm->m_pFormNotify)
|
| - return;
|
| - m_pForm->m_pFormNotify->AfterSelectionChange(this);
|
| -}
|
| -
|
| -bool CPDF_FormField::NotifyBeforeValueChange(const CFX_WideString& value) {
|
| - if (!m_pForm->m_pFormNotify)
|
| - return true;
|
| - return m_pForm->m_pFormNotify->BeforeValueChange(this, value) >= 0;
|
| -}
|
| -
|
| -void CPDF_FormField::NotifyAfterValueChange() {
|
| - if (!m_pForm->m_pFormNotify)
|
| - return;
|
| - m_pForm->m_pFormNotify->AfterValueChange(this);
|
| -}
|
| -
|
| -bool CPDF_FormField::NotifyListOrComboBoxBeforeChange(
|
| - const CFX_WideString& value) {
|
| - switch (GetType()) {
|
| - case ListBox:
|
| - return NotifyBeforeSelectionChange(value);
|
| - case ComboBox:
|
| - return NotifyBeforeValueChange(value);
|
| - default:
|
| - return true;
|
| - }
|
| -}
|
| -
|
| -void CPDF_FormField::NotifyListOrComboBoxAfterChange() {
|
| - switch (GetType()) {
|
| - case ListBox:
|
| - NotifyAfterSelectionChange();
|
| - break;
|
| - case ComboBox:
|
| - NotifyAfterValueChange();
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| -}
|
|
|