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