// 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 "../../include/fpdfdoc/fpdf_doc.h"
#include "doc_utils.h"

FX_BOOL PDF_FormField_IsUnison(CPDF_FormField *pField)
{
    FX_BOOL bUnison = FALSE;
    if (pField->GetType() == CPDF_FormField::CheckBox) {
        bUnison = TRUE;
    } else {
        FX_DWORD dwFlags = pField->GetFieldFlags();
        bUnison = ((dwFlags & 0x2000000) != 0);
    }
    return bUnison;
}
CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict)
{
    m_pDict = pDict;
    m_Type = Unknown;
    m_pForm = pForm;
    m_pFont = NULL;
    m_FontSize = 0;
    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();
    FX_DWORD flags = FPDF_GetFieldAttr(m_pDict, "Ff")? FPDF_GetFieldAttr(m_pDict, "Ff")->GetInteger() : 0;
    m_Flags = 0;
    if (flags & 1) {
        m_Flags |= FORMFIELD_READONLY;
    }
    if (flags & 2) {
        m_Flags |= FORMFIELD_REQUIRED;
    }
    if (flags & 4) {
        m_Flags |= FORMFIELD_NOEXPORT;
    }
    if (type_name == "Btn") {
        if (flags & 0x8000) {
            m_Type = RadioButton;
            if (flags & 0x4000) {
                m_Flags |= FORMRADIO_NOTOGGLEOFF;
            }
            if (flags & 0x2000000) {
                m_Flags |= FORMRADIO_UNISON;
            }
        } 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 |= FORMTEXT_MULTILINE;
            }
            if (flags & 0x2000) {
                m_Flags |= FORMTEXT_PASSWORD;
            }
            if (flags & 0x800000) {
                m_Flags |= FORMTEXT_NOSCROLL;
            }
            if (flags & 0x100000) {
                m_Flags |= FORMTEXT_COMB;
            }
        }
        LoadDA();
    } else if (type_name == "Ch") {
        if (flags & 0x20000) {
            m_Type = ComboBox;
            if (flags & 0x40000) {
                m_Flags |= FORMCOMBO_EDIT;
            }
        } else {
            m_Type = ListBox;
            if (flags & 0x200000) {
                m_Flags |= FORMLIST_MULTISELECT;
            }
        }
        LoadDA();
    } else if (type_name == "Sig") {
        m_Type = Sign;
    }
}
CFX_WideString CPDF_FormField::GetFullName()
{
    return ::GetFullName(m_pDict);
}
FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify)
{
    switch (m_Type) {
        case CPDF_FormField::CheckBox:
        case CPDF_FormField::RadioButton: {
                CFX_ByteArray statusArray;
                if (bNotify && m_pForm->m_pFormNotify != NULL) {
                    SaveCheckedFieldStatus(this, statusArray);
                }
                int iCount = CountControls();
                if (iCount) {
                    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 ++) {
                            CPDF_FormControl* pControl = GetControl(i);
                            FX_BOOL bChecked = pControl->IsDefaultChecked();
                            CheckControl(i, bChecked, FALSE);
                        }
                    }
                }
                if (bNotify && m_pForm->m_pFormNotify != NULL) {
                    m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
                }
            }
            break;
        case CPDF_FormField::ComboBox: {
                CFX_WideString csValue;
                ClearSelection();
                int iIndex = GetDefaultSelectedItem();
                if (iIndex >= 0) {
                    csValue = GetOptionLabel(iIndex);
                }
                if (bNotify && m_pForm->m_pFormNotify != NULL) {
                    int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
                    if (iRet < 0) {
                        return FALSE;
                    }
                }
                SetItemSelection(iIndex, TRUE);
                if (bNotify && m_pForm->m_pFormNotify != NULL) {
                    m_pForm->m_pFormNotify->AfterValueChange(this);
                }
            }
            break;
        case CPDF_FormField::ListBox: {
                CFX_WideString csValue;
                ClearSelection();
                int iIndex = GetDefaultSelectedItem();
                if (iIndex >= 0) {
                    csValue = GetOptionLabel(iIndex);
                }
                if (bNotify && m_pForm->m_pFormNotify != NULL) {
                    int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
                    if (iRet < 0) {
                        return FALSE;
                    }
                }
                SetItemSelection(iIndex, TRUE);
                if (bNotify && m_pForm->m_pFormNotify != NULL) {
                    m_pForm->m_pFormNotify->AfterSelectionChange(this);
                }
            }
            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 != NULL) {
                    csDValue = pDV->GetUnicodeText();
                }
                CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
                CFX_WideString csValue;
                if (pV != NULL) {
                    csValue = pV->GetUnicodeText();
                }
                CPDF_Object* pRV = FPDF_GetFieldAttr(m_pDict, "RV");
                if (!pRV && (csDValue == csValue)) {
                    return FALSE;
                }
                if (bNotify && m_pForm->m_pFormNotify != NULL) {
                    int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csDValue);
                    if (iRet < 0) {
                        return FALSE;
                    }
                }
                if (pDV == NULL) {
                    m_pDict->RemoveAt("V");
                    m_pDict->RemoveAt("RV");
                } else {
                    CPDF_Object* pClone = pDV->Clone();
                    if (pClone == NULL) {
                        return FALSE;
                    }
                    m_pDict->SetAt("V", pClone);
                    if(pRV) {
                        CPDF_Object* pCloneR = pDV->Clone();
                        m_pDict->SetAt("RV", pCloneR);
                    }
                }
                if (bNotify && m_pForm->m_pFormNotify != NULL) {
                    m_pForm->m_pFormNotify->AfterValueChange(this);
                }
                m_pForm->m_bUpdated = TRUE;
            }
            break;
    }
    return TRUE;
}
int CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl)
{
    if (pControl == NULL) {
        return -1;
    }
    int iCount = m_ControlList.GetSize();
    for (int i = 0; i < iCount; i ++) {
        CPDF_FormControl* pFind = (CPDF_FormControl*)m_ControlList.GetAt(i);
        if (pFind == pControl) {
            return i;
        }
    }
    return -1;
}
int CPDF_FormField::GetFieldType()
{
    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()
{
    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "AA");
    if (pObj == NULL) {
        return NULL;
    }
    return pObj->GetDict();
}
CFX_WideString CPDF_FormField::GetAlternateName()
{
    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TU");
    if (pObj == NULL) {
        return L"";
    }
    return pObj->GetUnicodeText();
}
CFX_WideString CPDF_FormField::GetMappingName()
{
    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TM");
    if (pObj == NULL) {
        return L"";
    }
    return pObj->GetUnicodeText();
}
FX_DWORD CPDF_FormField::GetFieldFlags()
{
    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "Ff");
    if (pObj == NULL) {
        return 0;
    }
    return pObj->GetInteger();
}
CFX_ByteString CPDF_FormField::GetDefaultStyle()
{
    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DS");
    if (pObj == NULL) {
        return "";
    }
    return pObj->GetString();
}
CFX_WideString CPDF_FormField::GetRichTextString()
{
    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "RV");
    if (pObj == NULL) {
        return L"";
    }
    return pObj->GetUnicodeText();
}
CFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault)
{
    if (GetType() == CheckBox || GetType() == RadioButton) {
        return GetCheckValue(bDefault);
    }
    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V");
    if (pValue == NULL) {
        if (!bDefault) {
            if (m_Type == RichText) {
                pValue = FPDF_GetFieldAttr(m_pDict, "V");
            }
            if (pValue == NULL && m_Type != Text) {
                pValue = FPDF_GetFieldAttr(m_pDict, "DV");
            }
        }
        if (pValue == NULL) {
            return CFX_WideString();
        }
    }
    switch (pValue->GetType()) {
        case PDFOBJ_STRING:
        case PDFOBJ_STREAM:
            return pValue->GetUnicodeText();
        case PDFOBJ_ARRAY:
            pValue = ((CPDF_Array*)pValue)->GetElementValue(0);
            if (pValue) {
                return pValue->GetUnicodeText();
            }
            break;
    }
    return CFX_WideString();
}
CFX_WideString CPDF_FormField::GetValue()
{
    return GetValue(FALSE);
}
CFX_WideString CPDF_FormField::GetDefaultValue()
{
    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 && m_pForm->m_pFormNotify != NULL) {
                    int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
                    if (iRet < 0) {
                        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) {
                    } else {
                        ClearSelection();
                        SetItemSelection(iIndex, TRUE);
                    }
                }
                if (bNotify && m_pForm->m_pFormNotify != NULL) {
                    m_pForm->m_pFormNotify->AfterValueChange(this);
                }
                m_pForm->m_bUpdated = TRUE;
            }
            break;
        case ListBox: {
                int iIndex = FindOptionValue(value);
                if (iIndex < 0) {
                    return FALSE;
                }
                if (bDefault && iIndex == GetDefaultSelectedItem()) {
                    return FALSE;
                }
                if (bNotify && m_pForm->m_pFormNotify != NULL) {
                    CFX_WideString csValue = value;
                    int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
                    if (iRet < 0) {
                        return FALSE;
                    }
                }
                if (bDefault) {
                } else {
                    ClearSelection();
                    SetItemSelection(iIndex, TRUE);
                }
                if (bNotify && m_pForm->m_pFormNotify != NULL) {
                    m_pForm->m_pFormNotify->AfterSelectionChange(this);
                }
                m_pForm->m_bUpdated = TRUE;
                break;
            }
        default:
            break;
    }
    if (CPDF_InterForm::m_bUpdateAP) {
        UpdateAP(NULL);
    }
    return TRUE;
}
FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bNotify)
{
    return SetValue(value, FALSE, bNotify);
}
int CPDF_FormField::GetMaxLen()
{
    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "MaxLen");
    if (pObj == NULL) {
        int iCount = m_ControlList.GetSize();
        for (int i = 0; i < iCount; i ++) {
            CPDF_FormControl* pControl = (CPDF_FormControl*)m_ControlList.GetAt(i);
            if (pControl == NULL) {
                continue;
            }
            CPDF_Dictionary* pWidgetDict = pControl->m_pWidgetDict;
            if (pWidgetDict->KeyExist("MaxLen")) {
                return pWidgetDict->GetInteger("MaxLen");
            }
        }
        return 0;
    }
    return pObj->GetInteger();
}
int CPDF_FormField::CountSelectedItems()
{
    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
    if (pValue == NULL) {
        pValue = FPDF_GetFieldAttr(m_pDict, "I");
        if (pValue == NULL) {
            return 0;
        }
    }
    if (pValue->GetType() == PDFOBJ_STRING) {
        if (pValue->GetString().IsEmpty()) {
            return 0;
        }
        return 1;
    }
    if (pValue->GetType() == PDFOBJ_NUMBER) {
        if (pValue->GetString().IsEmpty()) {
            return 0;
        }
        return 1;
    }
    if (pValue->GetType() != PDFOBJ_ARRAY) {
        return 0;
    }
    return ((CPDF_Array*)pValue)->GetCount();
}
int CPDF_FormField::GetSelectedIndex(int index)
{
    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
    if (pValue == NULL) {
        pValue = FPDF_GetFieldAttr(m_pDict, "I");
        if (pValue == NULL) {
            return -1;
        }
    }
    CFX_WideString sel_value;
    if (pValue->GetType() == PDFOBJ_STRING) {
        if (index != 0) {
            return -1;
        }
        sel_value = pValue->GetUnicodeText();
    } else if (pValue->GetType() == PDFOBJ_NUMBER) {
        return pValue->GetInteger();
    } else {
        if (pValue->GetType() != PDFOBJ_ARRAY) {
            return -1;
        }
        if (index < 0) {
            return -1;
        }
        CPDF_Object* elementValue = ((CPDF_Array*)pValue)->GetElementValue(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;
        }
    }
    int nOpts = CountOptions();
    for (int i = 0; i < nOpts; i ++) {
        if (sel_value == GetOptionValue(i)) {
            return i;
        }
    }
    return -1;
}
FX_BOOL CPDF_FormField::ClearSelection(FX_BOOL bNotify)
{
    if (bNotify && m_pForm->m_pFormNotify != NULL) {
        int iRet = 0;
        CFX_WideString csValue;
        int iIndex = GetSelectedIndex(0);
        if (iIndex >= 0) {
            csValue = GetOptionLabel(iIndex);
        }
        if (GetType() == ListBox) {
            iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
        }
        if (GetType() == ComboBox) {
            iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
        }
        if (iRet < 0) {
            return FALSE;
        }
    }
    m_pDict->RemoveAt("V");
    m_pDict->RemoveAt("I");
    if (bNotify && m_pForm->m_pFormNotify != NULL) {
        if (GetType() == ListBox) {
            m_pForm->m_pFormNotify->AfterSelectionChange(this);
        }
        if (GetType() == ComboBox) {
            m_pForm->m_pFormNotify->AfterValueChange(this);
        }
    }
    if (CPDF_InterForm::m_bUpdateAP) {
        UpdateAP(NULL);
    }
    m_pForm->m_bUpdated = TRUE;
    return TRUE;
}
FX_BOOL CPDF_FormField::IsItemSelected(int index)
{
    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 == NULL) {
        pValue = FPDF_GetFieldAttr(m_pDict, "I");
        if (pValue == NULL) {
            return FALSE;
        }
    }
    if (pValue->GetType() == PDFOBJ_STRING) {
        if (pValue->GetUnicodeText() == opt_value) {
            return TRUE;
        }
        return FALSE;
    }
    if (pValue->GetType() == PDFOBJ_NUMBER) {
        if (pValue->GetString().IsEmpty()) {
            return FALSE;
        }
        if (pValue->GetInteger() == index) {
            return TRUE;
        }
        return FALSE;
    }
    if (pValue->GetType() != PDFOBJ_ARRAY) {
        return FALSE;
    }
    CPDF_Array* pArray = (CPDF_Array*)pValue;
    int iPos = -1;
    for (int j = 0; j < CountSelectedOptions(); j ++) {
        if (GetSelectedOptionIndex(j) == index) {
            iPos = j;
            break;
        }
    }
    for (FX_DWORD i = 0; i < pArray->GetCount(); i ++)
        if (pArray->GetElementValue(i)->GetUnicodeText() == opt_value && (int)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 && m_pForm->m_pFormNotify != NULL) {
        int iRet = 0;
        if (GetType() == ListBox) {
            iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, opt_value);
        }
        if (GetType() == ComboBox) {
            iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, opt_value);
        }
        if (iRet < 0) {
            return FALSE;
        }
    }
    if (!bSelected) {
        CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
        if (pValue != NULL) {
            if (m_Type == ListBox) {
                SelectOption(index, FALSE);
                if (pValue->GetType() == PDFOBJ_STRING) {
                    if (pValue->GetUnicodeText() == opt_value) {
                        m_pDict->RemoveAt("V");
                    }
                } else if (pValue->GetType() == PDFOBJ_ARRAY) {
                    CPDF_Array* pArray = CPDF_Array::Create();
                    if (pArray == NULL) {
                        return FALSE;
                    }
                    int iCount = CountOptions();
                    for (int i = 0; i < iCount; i ++) {
                        if (i != index) {
                            if (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 if (m_Type == ComboBox) {
                m_pDict->RemoveAt("V");
                m_pDict->RemoveAt("I");
            }
        }
    } else {
        if (m_Type == ListBox) {
            SelectOption(index, TRUE);
            if (!(m_Flags & FORMLIST_MULTISELECT)) {
                m_pDict->SetAtString("V", PDF_EncodeText(opt_value));
            } else {
                CPDF_Array* pArray = CPDF_Array::Create();
                if (pArray == NULL) {
                    return FALSE;
                }
                FX_BOOL bSelected;
                int iCount = CountOptions();
                for (int i = 0; i < iCount; i ++) {
                    if (i != index) {
                        bSelected = IsItemSelected(i);
                    } else {
                        bSelected = TRUE;
                    }
                    if (bSelected) {
                        opt_value = GetOptionValue(i);
                        pArray->AddString(PDF_EncodeText(opt_value));
                    }
                }
                m_pDict->SetAt("V", pArray);
            }
        } else if (m_Type == ComboBox) {
            m_pDict->SetAtString("V", PDF_EncodeText(opt_value));
            CPDF_Array* pI = CPDF_Array::Create();
            if (pI == NULL) {
                return FALSE;
            }
            pI->AddInteger(index);
            m_pDict->SetAt("I", pI);
        }
    }
    if (bNotify && m_pForm->m_pFormNotify != NULL) {
        if (GetType() == ListBox) {
            m_pForm->m_pFormNotify->AfterSelectionChange(this);
        }
        if (GetType() == ComboBox) {
            m_pForm->m_pFormNotify->AfterValueChange(this);
        }
    }
    if (CPDF_InterForm::m_bUpdateAP) {
        UpdateAP(NULL);
    }
    m_pForm->m_bUpdated = TRUE;
    return TRUE;
}
FX_BOOL CPDF_FormField::IsItemDefaultSelected(int index)
{
    ASSERT(GetType() == ComboBox || GetType() == ListBox);
    if (index < 0 || index >= CountOptions()) {
        return FALSE;
    }
    int iDVIndex = GetDefaultSelectedItem();
    if (iDVIndex < 0) {
        return FALSE;
    }
    return (iDVIndex == index);
}
int CPDF_FormField::GetDefaultSelectedItem()
{
    ASSERT(GetType() == ComboBox || GetType() == ListBox);
    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "DV");
    if (pValue == NULL) {
        return -1;
    }
    CFX_WideString csDV = pValue->GetUnicodeText();
    if (csDV.IsEmpty()) {
        return -1;
    }
    int iCount = CountOptions();
    for (int i = 0; i < iCount; i ++) {
        if (csDV == GetOptionValue(i)) {
            return i;
        }
    }
    return -1;
}
void CPDF_FormField::UpdateAP(CPDF_FormControl* pControl)
{
    if (m_Type == PushButton) {
        return;
    }
    if (m_Type == RadioButton || m_Type == CheckBox) {
        return;
    }
    if (!m_pForm->m_bGenerateAP) {
        return;
    }
    for (int i = 0; i < CountControls(); i ++) {
        CPDF_FormControl* pControl = GetControl(i);
        FPDF_GenerateAP(m_pForm->m_pDocument, pControl->m_pWidgetDict);
    }
}
int CPDF_FormField::CountOptions()
{
    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");
    if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) {
        return 0;
    }
    return ((CPDF_Array*)pValue)->GetCount();
}
CFX_WideString CPDF_FormField::GetOptionText(int index, int sub_index)
{
    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt");
    if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) {
        return CFX_WideString();
    }
    CPDF_Object* pOption = ((CPDF_Array*)pValue)->GetElementValue(index);
    if (pOption == NULL) {
        return CFX_WideString();
    }
    if (pOption->GetType() == PDFOBJ_ARRAY) {
        pOption = ((CPDF_Array*)pOption)->GetElementValue(sub_index);
    }
    if (pOption == NULL || pOption->GetType() != PDFOBJ_STRING) {
        return CFX_WideString();
    }
    return ((CPDF_String*)pOption)->GetUnicodeText();
}
CFX_WideString CPDF_FormField::GetOptionLabel(int index)
{
    return GetOptionText(index, 1);
}
CFX_WideString CPDF_FormField::GetOptionValue(int index)
{
    return GetOptionText(index, 0);
}
int CPDF_FormField::FindOption(CFX_WideString csOptLabel)
{
    int iCount = CountOptions();
    for (int i = 0; i < iCount; i ++) {
        CFX_WideString csValue = GetOptionValue(i);
        if (csValue == csOptLabel) {
            return i;
        }
    }
    return -1;
}
int CPDF_FormField::FindOptionValue(const CFX_WideString& csOptValue, int iStartIndex)
{
    if (iStartIndex < 0) {
        iStartIndex = 0;
    }
    int iCount = CountOptions();
    for (; iStartIndex < iCount; iStartIndex ++) {
        CFX_WideString csValue = GetOptionValue(iStartIndex);
        if (csValue == csOptValue) {
            return iStartIndex;
        }
    }
    return -1;
}
FX_BOOL CPDF_FormField::CheckControl(int iControlIndex, FX_BOOL bChecked, FX_BOOL bNotify)
{
    ASSERT(GetType() == CheckBox || GetType() == RadioButton);
    CPDF_FormControl* pControl = GetControl(iControlIndex);
    if (pControl == NULL) {
        return FALSE;
    }
    if (!bChecked && pControl->IsChecked() == bChecked) {
        return FALSE;
    }
    CFX_ByteArray statusArray;
    if (bNotify && m_pForm->m_pFormNotify != NULL) {
        SaveCheckedFieldStatus(this, statusArray);
    }
    CFX_WideString csWExport = pControl->GetExportValue();
    CFX_ByteString csBExport = PDF_EncodeText(csWExport);
    int iCount = CountControls();
    FX_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 (pOpt == NULL || pOpt->GetType() != PDFOBJ_ARRAY) {
        if (bChecked) {
            m_pDict->SetAtName("V", csBExport);
        } else {
            CFX_ByteString csV;
            CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
            if (pV != NULL) {
                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 != NULL) {
        m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
    }
    m_pForm->m_bUpdated = TRUE;
    return TRUE;
}
CFX_WideString CPDF_FormField::GetCheckValue(FX_BOOL bDefault)
{
    ASSERT(GetType() == CheckBox || GetType() == RadioButton);
    CFX_WideString csExport = L"Off";
    FX_BOOL bChecked;
    int iCount = CountControls();
    for (int i = 0; i < iCount; i ++) {
        CPDF_FormControl* pControl = GetControl(i);
        if (bDefault) {
            bChecked = pControl->IsDefaultChecked();
        } else {
            bChecked = 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);
    CFX_ByteArray statusArray;
    if (bNotify && m_pForm->m_pFormNotify != NULL) {
        SaveCheckedFieldStatus(this, statusArray);
    }
    int iCount = CountControls();
    for (int i = 0; i < iCount; i ++) {
        CPDF_FormControl* pControl = GetControl(i);
        CFX_WideString csExport = pControl->GetExportValue();
        if (csExport == value) {
            if (bDefault) {
            } else {
                CheckControl(GetControlIndex(pControl), TRUE);
            }
            break;
        } else {
            if (bDefault) {
            } else {
                CheckControl(GetControlIndex(pControl), FALSE);
            }
        }
    }
    if (bNotify && m_pForm->m_pFormNotify != NULL) {
        m_pForm->m_pFormNotify->AfterCheckedStatusChange(this, statusArray);
    }
    m_pForm->m_bUpdated = TRUE;
    return TRUE;
}
int CPDF_FormField::GetTopVisibleIndex()
{
    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TI");
    if (pObj == NULL) {
        return 0;
    }
    return pObj->GetInteger();
}
int CPDF_FormField::CountSelectedOptions()
{
    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
    if (pObj == NULL) {
        return 0;
    }
    CPDF_Array* pArray = pObj->GetArray();
    if (pArray == NULL) {
        return 0;
    }
    return (int)pArray->GetCount();
}
int CPDF_FormField::GetSelectedOptionIndex(int index)
{
    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
    if (pObj == NULL) {
        return -1;
    }
    CPDF_Array* pArray = pObj->GetArray();
    if (pArray == NULL) {
        return -1;
    }
    int iCount = (int)pArray->GetCount();
    if (iCount > 0 && index < iCount) {
        return pArray->GetInteger(index);
    }
    return -1;
}
FX_BOOL CPDF_FormField::IsOptionSelected(int iOptIndex)
{
    CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "I");
    if (pObj == NULL) {
        return FALSE;
    }
    CPDF_Array* pArray = pObj->GetArray();
    if (pArray == NULL) {
        return FALSE;
    }
    int iCount = (int)pArray->GetCount();
    for (int i = 0; i < iCount; i ++) {
        if (pArray->GetInteger(i) == iOptIndex) {
            return TRUE;
        }
    }
    return FALSE;
}
FX_BOOL CPDF_FormField::SelectOption(int iOptIndex, FX_BOOL bSelected, FX_BOOL bNotify)
{
    CPDF_Array* pArray = m_pDict->GetArray("I");
    if (pArray == NULL) {
        if (!bSelected) {
            return TRUE;
        }
        pArray = CPDF_Array::Create();
        if (pArray == NULL) {
            return FALSE;
        }
        m_pDict->SetAt("I", pArray);
    }
    FX_BOOL bReturn = FALSE;
    for (int i = 0; i < (int)pArray->GetCount(); i ++) {
        int iFind = pArray->GetInteger(i);
        if (iFind == iOptIndex) {
            if (bSelected) {
                return TRUE;
            }
            if (bNotify && m_pForm->m_pFormNotify != NULL) {
                int iRet = 0;
                CFX_WideString csValue = GetOptionLabel(iOptIndex);
                if (GetType() == ListBox) {
                    iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
                }
                if (GetType() == ComboBox) {
                    iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
                }
                if (iRet < 0) {
                    return FALSE;
                }
            }
            pArray->RemoveAt(i);
            bReturn = TRUE;
            break;
        } else if (iFind > iOptIndex) {
            if (!bSelected) {
                continue;
            }
            if (bNotify && m_pForm->m_pFormNotify != NULL) {
                int iRet = 0;
                CFX_WideString csValue = GetOptionLabel(iOptIndex);
                if (GetType() == ListBox) {
                    iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
                }
                if (GetType() == ComboBox) {
                    iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
                }
                if (iRet < 0) {
                    return FALSE;
                }
            }
            CPDF_Number* pNum = CPDF_Number::Create(iOptIndex);
            if (pNum == NULL) {
                return FALSE;
            }
            pArray->InsertAt(i, pNum);
            bReturn = TRUE;
            break;
        }
    }
    if (!bReturn) {
        if (bSelected) {
            pArray->AddInteger(iOptIndex);
        }
        if (pArray->GetCount() == 0) {
            m_pDict->RemoveAt("I");
        }
    }
    if (bNotify && m_pForm->m_pFormNotify != NULL) {
        if (GetType() == ListBox) {
            m_pForm->m_pFormNotify->AfterSelectionChange(this);
        }
        if (GetType() == ComboBox) {
            m_pForm->m_pFormNotify->AfterValueChange(this);
        }
    }
    m_pForm->m_bUpdated = TRUE;
    return TRUE;
}
FX_BOOL CPDF_FormField::ClearSelectedOptions(FX_BOOL bNotify)
{
    if (bNotify && m_pForm->m_pFormNotify != NULL) {
        int iRet = 0;
        CFX_WideString csValue;
        int iIndex = GetSelectedIndex(0);
        if (iIndex >= 0) {
            csValue = GetOptionLabel(iIndex);
        }
        if (GetType() == ListBox) {
            iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
        }
        if (GetType() == ComboBox) {
            iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
        }
        if (iRet < 0) {
            return FALSE;
        }
    }
    m_pDict->RemoveAt("I");
    if (bNotify && m_pForm->m_pFormNotify != NULL) {
        if (GetType() == ListBox) {
            m_pForm->m_pFormNotify->AfterSelectionChange(this);
        }
        if (GetType() == ComboBox) {
            m_pForm->m_pFormNotify->AfterValueChange(this);
        }
    }
    m_pForm->m_bUpdated = TRUE;
    return TRUE;
}
void CPDF_FormField::LoadDA()
{
    CFX_ByteString DA;
    if (CPDF_Object* pObj_t = FPDF_GetFieldAttr(m_pDict, "DA")) {
        DA = pObj_t->GetString();
    }
    if (DA.IsEmpty() && m_pForm->m_pFormDict) {
        DA = m_pForm->m_pFormDict->GetString("DA");
    }
    if (DA.IsEmpty()) {
        return;
    }
    CPDF_SimpleParser syntax(DA);
    syntax.FindTagParam("Tf", 2);
    CFX_ByteString font_name = syntax.GetWord();
    CPDF_Dictionary* pFontDict = NULL;
    if (m_pForm->m_pFormDict && m_pForm->m_pFormDict->GetDict("DR") &&
        m_pForm->m_pFormDict->GetDict("DR")->GetDict("Font") )
    pFontDict = m_pForm->m_pFormDict->GetDict("DR")->GetDict("Font")->GetDict(font_name);

    if (pFontDict == NULL) {
        return;
    }
    m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict);
    m_FontSize = FX_atof(syntax.GetWord());
}
