Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Side by Side Diff: core/fpdfdoc/cpdf_formfield.cpp

Issue 2190983002: Splitting fpdfdoc/doc_* part III. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@fpdf_doc_IV
Patch Set: move cb Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/fpdfdoc/cpdf_formcontrol.cpp ('k') | core/fpdfdoc/cpdf_iconfit.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "core/fpdfdoc/include/cpdf_formfield.h" 7 #include "core/fpdfdoc/include/cpdf_formfield.h"
8 8
9 #include "core/fpdfapi/fpdf_parser/include/cfdf_document.h" 9 #include "core/fpdfapi/fpdf_parser/include/cfdf_document.h"
10 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
11 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" 11 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
12 #include "core/fpdfapi/fpdf_parser/include/cpdf_number.h" 12 #include "core/fpdfapi/fpdf_parser/include/cpdf_number.h"
13 #include "core/fpdfapi/fpdf_parser/include/cpdf_simple_parser.h" 13 #include "core/fpdfapi/fpdf_parser/include/cpdf_simple_parser.h"
14 #include "core/fpdfapi/fpdf_parser/include/cpdf_string.h" 14 #include "core/fpdfapi/fpdf_parser/include/cpdf_string.h"
15 #include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h" 15 #include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
16 #include "core/fpdfdoc/cpvt_generateap.h" 16 #include "core/fpdfdoc/cpvt_generateap.h"
17 #include "core/fpdfdoc/doc_utils.h"
18 #include "core/fpdfdoc/include/cpdf_formcontrol.h" 17 #include "core/fpdfdoc/include/cpdf_formcontrol.h"
19 #include "core/fpdfdoc/include/cpdf_interform.h" 18 #include "core/fpdfdoc/include/cpdf_interform.h"
20 19
21 namespace { 20 namespace {
22 21
22 const int kMaxRecursion = 32;
23
23 const int kFormListMultiSelect = 0x100; 24 const int kFormListMultiSelect = 0x100;
24 25
25 const int kFormComboEdit = 0x100; 26 const int kFormComboEdit = 0x100;
26 27
27 const int kFormFieldReadOnly = 0x01; 28 const int kFormFieldReadOnly = 0x01;
28 const int kFormFieldRequired = 0x02; 29 const int kFormFieldRequired = 0x02;
29 const int kFormFieldNoExport = 0x04; 30 const int kFormFieldNoExport = 0x04;
30 31
31 const int kFormRadioNoToggleOff = 0x100; 32 const int kFormRadioNoToggleOff = 0x100;
32 const int kFormRadioUnison = 0x200; 33 const int kFormRadioUnison = 0x200;
33 34
34 const int kFormTextMultiLine = 0x100; 35 const int kFormTextMultiLine = 0x100;
35 const int kFormTextPassword = 0x200; 36 const int kFormTextPassword = 0x200;
36 const int kFormTextNoScroll = 0x400; 37 const int kFormTextNoScroll = 0x400;
37 const int kFormTextComb = 0x800; 38 const int kFormTextComb = 0x800;
38 39
39 bool PDF_FormField_IsUnison(CPDF_FormField* pField) { 40 bool IsUnison(CPDF_FormField* pField) {
40 if (pField->GetType() == CPDF_FormField::CheckBox) 41 if (pField->GetType() == CPDF_FormField::CheckBox)
41 return true; 42 return true;
42
43 return (pField->GetFieldFlags() & 0x2000000) != 0; 43 return (pField->GetFieldFlags() & 0x2000000) != 0;
44 } 44 }
45 45
46 } // namespace 46 } // namespace
47 47
48 CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict,
49 const FX_CHAR* name,
50 int nLevel) {
51 if (nLevel > kMaxRecursion)
52 return nullptr;
53 if (!pFieldDict)
54 return nullptr;
55
56 CPDF_Object* pAttr = pFieldDict->GetDirectObjectBy(name);
57 if (pAttr)
58 return pAttr;
59
60 CPDF_Dictionary* pParent = pFieldDict->GetDictBy("Parent");
61 if (!pParent)
62 return nullptr;
63 return FPDF_GetFieldAttr(pParent, name, nLevel + 1);
64 }
65
66 CFX_WideString FPDF_GetFullName(CPDF_Dictionary* pFieldDict) {
67 CFX_WideString full_name;
68 CPDF_Dictionary* pLevel = pFieldDict;
69 while (pLevel) {
70 CFX_WideString short_name = pLevel->GetUnicodeTextBy("T");
71 if (short_name != L"") {
72 if (full_name == L"")
73 full_name = short_name;
74 else
75 full_name = short_name + L"." + full_name;
76 }
77 pLevel = pLevel->GetDictBy("Parent");
78 }
79 return full_name;
80 }
81
48 CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict) 82 CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict)
49 : m_Type(Unknown), 83 : m_Type(Unknown),
50 m_pForm(pForm), 84 m_pForm(pForm),
51 m_pDict(pDict), 85 m_pDict(pDict),
52 m_FontSize(0), 86 m_FontSize(0),
53 m_pFont(nullptr) { 87 m_pFont(nullptr) {
54 SyncFieldFlags(); 88 SyncFieldFlags();
55 } 89 }
56 90
57 CPDF_FormField::~CPDF_FormField() {} 91 CPDF_FormField::~CPDF_FormField() {}
58 92
59 void CPDF_FormField::SyncFieldFlags() { 93 void CPDF_FormField::SyncFieldFlags() {
60 CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, "FT") 94 CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, "FT")
61 ? FPDF_GetFieldAttr(m_pDict, "FT")->GetString() 95 ? FPDF_GetFieldAttr(m_pDict, "FT")->GetString()
62 : CFX_ByteString(); 96 : CFX_ByteString();
63 uint32_t flags = FPDF_GetFieldAttr(m_pDict, "Ff") 97 uint32_t flags = FPDF_GetFieldAttr(m_pDict, "Ff")
64 ? FPDF_GetFieldAttr(m_pDict, "Ff")->GetInteger() 98 ? FPDF_GetFieldAttr(m_pDict, "Ff")->GetInteger()
65 : 0; 99 : 0;
66 m_Flags = 0; 100 m_Flags = 0;
67 if (flags & 1) { 101 if (flags & 1)
68 m_Flags |= kFormFieldReadOnly; 102 m_Flags |= kFormFieldReadOnly;
69 } 103 if (flags & 2)
70 if (flags & 2) {
71 m_Flags |= kFormFieldRequired; 104 m_Flags |= kFormFieldRequired;
72 } 105 if (flags & 4)
73 if (flags & 4) {
74 m_Flags |= kFormFieldNoExport; 106 m_Flags |= kFormFieldNoExport;
75 } 107
76 if (type_name == "Btn") { 108 if (type_name == "Btn") {
77 if (flags & 0x8000) { 109 if (flags & 0x8000) {
78 m_Type = RadioButton; 110 m_Type = RadioButton;
79 if (flags & 0x4000) { 111 if (flags & 0x4000)
80 m_Flags |= kFormRadioNoToggleOff; 112 m_Flags |= kFormRadioNoToggleOff;
81 } 113 if (flags & 0x2000000)
82 if (flags & 0x2000000) {
83 m_Flags |= kFormRadioUnison; 114 m_Flags |= kFormRadioUnison;
84 }
85 } else if (flags & 0x10000) { 115 } else if (flags & 0x10000) {
86 m_Type = PushButton; 116 m_Type = PushButton;
87 } else { 117 } else {
88 m_Type = CheckBox; 118 m_Type = CheckBox;
89 } 119 }
90 } else if (type_name == "Tx") { 120 } else if (type_name == "Tx") {
91 if (flags & 0x100000) { 121 if (flags & 0x100000) {
92 m_Type = File; 122 m_Type = File;
93 } else if (flags & 0x2000000) { 123 } else if (flags & 0x2000000) {
94 m_Type = RichText; 124 m_Type = RichText;
95 } else { 125 } else {
96 m_Type = Text; 126 m_Type = Text;
97 if (flags & 0x1000) { 127 if (flags & 0x1000)
98 m_Flags |= kFormTextMultiLine; 128 m_Flags |= kFormTextMultiLine;
99 } 129 if (flags & 0x2000)
100 if (flags & 0x2000) {
101 m_Flags |= kFormTextPassword; 130 m_Flags |= kFormTextPassword;
102 } 131 if (flags & 0x800000)
103 if (flags & 0x800000) {
104 m_Flags |= kFormTextNoScroll; 132 m_Flags |= kFormTextNoScroll;
105 } 133 if (flags & 0x100000)
106 if (flags & 0x100000) {
107 m_Flags |= kFormTextComb; 134 m_Flags |= kFormTextComb;
108 }
109 } 135 }
110 LoadDA(); 136 LoadDA();
111 } else if (type_name == "Ch") { 137 } else if (type_name == "Ch") {
112 if (flags & 0x20000) { 138 if (flags & 0x20000) {
113 m_Type = ComboBox; 139 m_Type = ComboBox;
114 if (flags & 0x40000) { 140 if (flags & 0x40000)
115 m_Flags |= kFormComboEdit; 141 m_Flags |= kFormComboEdit;
116 }
117 } else { 142 } else {
118 m_Type = ListBox; 143 m_Type = ListBox;
119 if (flags & 0x200000) { 144 if (flags & 0x200000)
120 m_Flags |= kFormListMultiSelect; 145 m_Flags |= kFormListMultiSelect;
121 }
122 } 146 }
123 LoadDA(); 147 LoadDA();
124 } else if (type_name == "Sig") { 148 } else if (type_name == "Sig") {
125 m_Type = Sign; 149 m_Type = Sign;
126 } 150 }
127 } 151 }
152
128 CFX_WideString CPDF_FormField::GetFullName() const { 153 CFX_WideString CPDF_FormField::GetFullName() const {
129 return ::GetFullName(m_pDict); 154 return FPDF_GetFullName(m_pDict);
130 } 155 }
131 156
132 FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify) { 157 FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify) {
133 switch (m_Type) { 158 switch (m_Type) {
134 case CPDF_FormField::CheckBox: 159 case CPDF_FormField::CheckBox:
135 case CPDF_FormField::RadioButton: { 160 case CPDF_FormField::RadioButton: {
136 int iCount = CountControls(); 161 int iCount = CountControls();
137 if (iCount) { 162 if (iCount) {
138 // TODO(weili): Check whether anything special needs to be done for 163 // TODO(weili): Check whether anything special needs to be done for
139 // unison field. Otherwise, merge these branches. 164 // unison field. Otherwise, merge these branches.
140 if (PDF_FormField_IsUnison(this)) { 165 if (IsUnison(this)) {
141 for (int i = 0; i < iCount; i++) { 166 for (int i = 0; i < iCount; i++)
142 CheckControl(i, GetControl(i)->IsDefaultChecked(), FALSE); 167 CheckControl(i, GetControl(i)->IsDefaultChecked(), FALSE);
143 }
144 } else { 168 } else {
145 for (int i = 0; i < iCount; i++) { 169 for (int i = 0; i < iCount; i++)
146 CheckControl(i, GetControl(i)->IsDefaultChecked(), FALSE); 170 CheckControl(i, GetControl(i)->IsDefaultChecked(), FALSE);
147 }
148 } 171 }
149 } 172 }
150 if (bNotify && m_pForm->m_pFormNotify) { 173 if (bNotify && m_pForm->m_pFormNotify)
151 m_pForm->m_pFormNotify->AfterCheckedStatusChange(this); 174 m_pForm->m_pFormNotify->AfterCheckedStatusChange(this);
152 } 175 break;
153 } break; 176 }
154 case CPDF_FormField::ComboBox: 177 case CPDF_FormField::ComboBox:
155 case CPDF_FormField::ListBox: { 178 case CPDF_FormField::ListBox: {
156 CFX_WideString csValue; 179 CFX_WideString csValue;
157 ClearSelection(); 180 ClearSelection();
158 int iIndex = GetDefaultSelectedItem(); 181 int iIndex = GetDefaultSelectedItem();
159 if (iIndex >= 0) 182 if (iIndex >= 0)
160 csValue = GetOptionLabel(iIndex); 183 csValue = GetOptionLabel(iIndex);
161 184
162 if (bNotify && !NotifyListOrComboBoxBeforeChange(csValue)) 185 if (bNotify && !NotifyListOrComboBoxBeforeChange(csValue))
163 return FALSE; 186 return FALSE;
164 187
165 SetItemSelection(iIndex, TRUE); 188 SetItemSelection(iIndex, TRUE);
166 if (bNotify) 189 if (bNotify)
167 NotifyListOrComboBoxAfterChange(); 190 NotifyListOrComboBoxAfterChange();
168 } break; 191 break;
192 }
169 case CPDF_FormField::Text: 193 case CPDF_FormField::Text:
170 case CPDF_FormField::RichText: 194 case CPDF_FormField::RichText:
171 case CPDF_FormField::File: 195 case CPDF_FormField::File:
172 default: { 196 default: {
173 CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, "DV"); 197 CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, "DV");
174 CFX_WideString csDValue; 198 CFX_WideString csDValue;
175 if (pDV) 199 if (pDV)
176 csDValue = pDV->GetUnicodeText(); 200 csDValue = pDV->GetUnicodeText();
177 201
178 CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V"); 202 CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
(...skipping 17 matching lines...) Expand all
196 if (pRV) { 220 if (pRV) {
197 CPDF_Object* pCloneR = pDV->Clone(); 221 CPDF_Object* pCloneR = pDV->Clone();
198 m_pDict->SetAt("RV", pCloneR); 222 m_pDict->SetAt("RV", pCloneR);
199 } 223 }
200 } else { 224 } else {
201 m_pDict->RemoveAt("V"); 225 m_pDict->RemoveAt("V");
202 m_pDict->RemoveAt("RV"); 226 m_pDict->RemoveAt("RV");
203 } 227 }
204 if (bNotify) 228 if (bNotify)
205 NotifyAfterValueChange(); 229 NotifyAfterValueChange();
206 } break; 230 break;
231 }
207 } 232 }
208 return TRUE; 233 return TRUE;
209 } 234 }
210 235
211 int CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl) const { 236 int CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl) const {
212 if (!pControl) 237 if (!pControl)
213 return -1; 238 return -1;
214 239
215 for (int i = 0; i < m_ControlList.GetSize(); i++) { 240 for (int i = 0; i < m_ControlList.GetSize(); i++) {
216 if (m_ControlList.GetAt(i) == pControl) 241 if (m_ControlList.GetAt(i) == pControl)
(...skipping 26 matching lines...) Expand all
243 return FIELDTYPE_UNKNOWN; 268 return FIELDTYPE_UNKNOWN;
244 } 269 }
245 270
246 CPDF_AAction CPDF_FormField::GetAdditionalAction() const { 271 CPDF_AAction CPDF_FormField::GetAdditionalAction() const {
247 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "AA"); 272 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "AA");
248 return CPDF_AAction(pObj ? pObj->GetDict() : nullptr); 273 return CPDF_AAction(pObj ? pObj->GetDict() : nullptr);
249 } 274 }
250 275
251 CFX_WideString CPDF_FormField::GetAlternateName() const { 276 CFX_WideString CPDF_FormField::GetAlternateName() const {
252 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TU"); 277 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TU");
253 if (!pObj) { 278 return pObj ? pObj->GetUnicodeText() : L"";
254 return L"";
255 }
256 return pObj->GetUnicodeText();
257 } 279 }
280
258 CFX_WideString CPDF_FormField::GetMappingName() const { 281 CFX_WideString CPDF_FormField::GetMappingName() const {
259 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TM"); 282 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "TM");
260 if (!pObj) { 283 return pObj ? pObj->GetUnicodeText() : L"";
261 return L"";
262 }
263 return pObj->GetUnicodeText();
264 } 284 }
285
265 uint32_t CPDF_FormField::GetFieldFlags() const { 286 uint32_t CPDF_FormField::GetFieldFlags() const {
266 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "Ff"); 287 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "Ff");
267 if (!pObj) { 288 return pObj ? pObj->GetInteger() : 0;
268 return 0;
269 }
270 return pObj->GetInteger();
271 } 289 }
290
272 CFX_ByteString CPDF_FormField::GetDefaultStyle() const { 291 CFX_ByteString CPDF_FormField::GetDefaultStyle() const {
273 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DS"); 292 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DS");
274 if (!pObj) { 293 return pObj ? pObj->GetString() : "";
275 return "";
276 }
277 return pObj->GetString();
278 } 294 }
295
279 CFX_WideString CPDF_FormField::GetRichTextString() const { 296 CFX_WideString CPDF_FormField::GetRichTextString() const {
280 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "RV"); 297 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "RV");
281 if (!pObj) { 298 return pObj ? pObj->GetUnicodeText() : L"";
282 return L"";
283 }
284 return pObj->GetUnicodeText();
285 } 299 }
300
286 CFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault) const { 301 CFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault) const {
287 if (GetType() == CheckBox || GetType() == RadioButton) 302 if (GetType() == CheckBox || GetType() == RadioButton)
288 return GetCheckValue(bDefault); 303 return GetCheckValue(bDefault);
289 304
290 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V"); 305 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V");
291 if (!pValue) { 306 if (!pValue) {
292 if (!bDefault) { 307 if (!bDefault) {
293 if (m_Type == RichText) { 308 if (m_Type == RichText)
294 pValue = FPDF_GetFieldAttr(m_pDict, "V"); 309 pValue = FPDF_GetFieldAttr(m_pDict, "V");
295 } 310 if (!pValue && m_Type != Text)
296 if (!pValue && m_Type != Text) {
297 pValue = FPDF_GetFieldAttr(m_pDict, "DV"); 311 pValue = FPDF_GetFieldAttr(m_pDict, "DV");
298 }
299 } 312 }
300 if (!pValue) 313 if (!pValue)
301 return CFX_WideString(); 314 return CFX_WideString();
302 } 315 }
316
303 switch (pValue->GetType()) { 317 switch (pValue->GetType()) {
304 case CPDF_Object::STRING: 318 case CPDF_Object::STRING:
305 case CPDF_Object::STREAM: 319 case CPDF_Object::STREAM:
306 return pValue->GetUnicodeText(); 320 return pValue->GetUnicodeText();
307 case CPDF_Object::ARRAY: 321 case CPDF_Object::ARRAY:
308 pValue = pValue->AsArray()->GetDirectObjectAt(0); 322 pValue = pValue->AsArray()->GetDirectObjectAt(0);
309 if (pValue) 323 if (pValue)
310 return pValue->GetUnicodeText(); 324 return pValue->GetUnicodeText();
311 break; 325 break;
312 default: 326 default:
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 m_pDict->RemoveAt("I"); 363 m_pDict->RemoveAt("I");
350 } else { 364 } else {
351 m_pDict->SetAtString(bDefault ? "DV" : "V", PDF_EncodeText(csValue)); 365 m_pDict->SetAtString(bDefault ? "DV" : "V", PDF_EncodeText(csValue));
352 if (!bDefault) { 366 if (!bDefault) {
353 ClearSelection(); 367 ClearSelection();
354 SetItemSelection(iIndex, TRUE); 368 SetItemSelection(iIndex, TRUE);
355 } 369 }
356 } 370 }
357 if (bNotify) 371 if (bNotify)
358 NotifyAfterValueChange(); 372 NotifyAfterValueChange();
359 } break; 373 break;
374 }
360 case ListBox: { 375 case ListBox: {
361 int iIndex = FindOptionValue(value); 376 int iIndex = FindOptionValue(value);
362 if (iIndex < 0) 377 if (iIndex < 0)
363 return FALSE; 378 return FALSE;
364 379
365 if (bDefault && iIndex == GetDefaultSelectedItem()) 380 if (bDefault && iIndex == GetDefaultSelectedItem())
366 return FALSE; 381 return FALSE;
367 382
368 if (bNotify && !NotifyBeforeSelectionChange(value)) 383 if (bNotify && !NotifyBeforeSelectionChange(value))
369 return FALSE; 384 return FALSE;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 if (!pArray || index < 0) 452 if (!pArray || index < 0)
438 return -1; 453 return -1;
439 454
440 CPDF_Object* elementValue = pArray->GetDirectObjectAt(index); 455 CPDF_Object* elementValue = pArray->GetDirectObjectAt(index);
441 sel_value = 456 sel_value =
442 elementValue ? elementValue->GetUnicodeText() : CFX_WideString(); 457 elementValue ? elementValue->GetUnicodeText() : CFX_WideString();
443 } 458 }
444 if (index < CountSelectedOptions()) { 459 if (index < CountSelectedOptions()) {
445 int iOptIndex = GetSelectedOptionIndex(index); 460 int iOptIndex = GetSelectedOptionIndex(index);
446 CFX_WideString csOpt = GetOptionValue(iOptIndex); 461 CFX_WideString csOpt = GetOptionValue(iOptIndex);
447 if (csOpt == sel_value) { 462 if (csOpt == sel_value)
448 return iOptIndex; 463 return iOptIndex;
449 }
450 } 464 }
451 for (int i = 0; i < CountOptions(); i++) { 465 for (int i = 0; i < CountOptions(); i++) {
452 if (sel_value == GetOptionValue(i)) 466 if (sel_value == GetOptionValue(i))
453 return i; 467 return i;
454 } 468 }
455 return -1; 469 return -1;
456 } 470 }
457 471
458 FX_BOOL CPDF_FormField::ClearSelection(FX_BOOL bNotify) { 472 FX_BOOL CPDF_FormField::ClearSelection(FX_BOOL bNotify) {
459 if (bNotify && m_pForm->m_pFormNotify) { 473 if (bNotify && m_pForm->m_pFormNotify) {
460 CFX_WideString csValue; 474 CFX_WideString csValue;
461 int iIndex = GetSelectedIndex(0); 475 int iIndex = GetSelectedIndex(0);
462 if (iIndex >= 0) 476 if (iIndex >= 0)
463 csValue = GetOptionLabel(iIndex); 477 csValue = GetOptionLabel(iIndex);
464 478
465 if (!NotifyListOrComboBoxBeforeChange(csValue)) 479 if (!NotifyListOrComboBoxBeforeChange(csValue))
466 return FALSE; 480 return FALSE;
467 } 481 }
468 m_pDict->RemoveAt("V"); 482 m_pDict->RemoveAt("V");
469 m_pDict->RemoveAt("I"); 483 m_pDict->RemoveAt("I");
470 if (bNotify) 484 if (bNotify)
471 NotifyListOrComboBoxAfterChange(); 485 NotifyListOrComboBoxAfterChange();
472 return TRUE; 486 return TRUE;
473 } 487 }
474 488
475 FX_BOOL CPDF_FormField::IsItemSelected(int index) const { 489 FX_BOOL CPDF_FormField::IsItemSelected(int index) const {
476 ASSERT(GetType() == ComboBox || GetType() == ListBox); 490 ASSERT(GetType() == ComboBox || GetType() == ListBox);
477 if (index < 0 || index >= CountOptions()) { 491 if (index < 0 || index >= CountOptions())
478 return FALSE; 492 return FALSE;
479 } 493 if (IsOptionSelected(index))
480 if (IsOptionSelected(index)) {
481 return TRUE; 494 return TRUE;
482 } 495
483 CFX_WideString opt_value = GetOptionValue(index); 496 CFX_WideString opt_value = GetOptionValue(index);
484 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); 497 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
485 if (!pValue) { 498 if (!pValue) {
486 pValue = FPDF_GetFieldAttr(m_pDict, "I"); 499 pValue = FPDF_GetFieldAttr(m_pDict, "I");
487 if (!pValue) { 500 if (!pValue)
488 return FALSE; 501 return FALSE;
489 }
490 } 502 }
491 503
492 if (pValue->IsString()) 504 if (pValue->IsString())
493 return pValue->GetUnicodeText() == opt_value; 505 return pValue->GetUnicodeText() == opt_value;
494 506
495 if (pValue->IsNumber()) { 507 if (pValue->IsNumber()) {
496 if (pValue->GetString().IsEmpty()) 508 if (pValue->GetString().IsEmpty())
497 return FALSE; 509 return FALSE;
498 return (pValue->GetInteger() == index); 510 return (pValue->GetInteger() == index);
499 } 511 }
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 628
617 CPDF_Object* pOption = pArray->GetDirectObjectAt(index); 629 CPDF_Object* pOption = pArray->GetDirectObjectAt(index);
618 if (!pOption) 630 if (!pOption)
619 return CFX_WideString(); 631 return CFX_WideString();
620 if (CPDF_Array* pOptionArray = pOption->AsArray()) 632 if (CPDF_Array* pOptionArray = pOption->AsArray())
621 pOption = pOptionArray->GetDirectObjectAt(sub_index); 633 pOption = pOptionArray->GetDirectObjectAt(sub_index);
622 634
623 CPDF_String* pString = ToString(pOption); 635 CPDF_String* pString = ToString(pOption);
624 return pString ? pString->GetUnicodeText() : CFX_WideString(); 636 return pString ? pString->GetUnicodeText() : CFX_WideString();
625 } 637 }
638
626 CFX_WideString CPDF_FormField::GetOptionLabel(int index) const { 639 CFX_WideString CPDF_FormField::GetOptionLabel(int index) const {
627 return GetOptionText(index, 1); 640 return GetOptionText(index, 1);
628 } 641 }
642
629 CFX_WideString CPDF_FormField::GetOptionValue(int index) const { 643 CFX_WideString CPDF_FormField::GetOptionValue(int index) const {
630 return GetOptionText(index, 0); 644 return GetOptionText(index, 0);
631 } 645 }
632 646
633 int CPDF_FormField::FindOption(CFX_WideString csOptLabel) const { 647 int CPDF_FormField::FindOption(CFX_WideString csOptLabel) const {
634 for (int i = 0; i < CountOptions(); i++) { 648 for (int i = 0; i < CountOptions(); i++) {
635 if (GetOptionValue(i) == csOptLabel) 649 if (GetOptionValue(i) == csOptLabel)
636 return i; 650 return i;
637 } 651 }
638 return -1; 652 return -1;
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 714
701 return TRUE; 715 return TRUE;
702 } 716 }
703 #endif // PDF_ENABLE_XFA 717 #endif // PDF_ENABLE_XFA
704 718
705 FX_BOOL CPDF_FormField::CheckControl(int iControlIndex, 719 FX_BOOL CPDF_FormField::CheckControl(int iControlIndex,
706 bool bChecked, 720 bool bChecked,
707 bool bNotify) { 721 bool bNotify) {
708 ASSERT(GetType() == CheckBox || GetType() == RadioButton); 722 ASSERT(GetType() == CheckBox || GetType() == RadioButton);
709 CPDF_FormControl* pControl = GetControl(iControlIndex); 723 CPDF_FormControl* pControl = GetControl(iControlIndex);
710 if (!pControl) { 724 if (!pControl)
711 return FALSE; 725 return FALSE;
712 } 726 if (!bChecked && pControl->IsChecked() == bChecked)
713 if (!bChecked && pControl->IsChecked() == bChecked) {
714 return FALSE; 727 return FALSE;
715 } 728
716 CFX_WideString csWExport = pControl->GetExportValue(); 729 CFX_WideString csWExport = pControl->GetExportValue();
717 CFX_ByteString csBExport = PDF_EncodeText(csWExport); 730 CFX_ByteString csBExport = PDF_EncodeText(csWExport);
718 int iCount = CountControls(); 731 int iCount = CountControls();
719 bool bUnison = PDF_FormField_IsUnison(this); 732 bool bUnison = IsUnison(this);
720 for (int i = 0; i < iCount; i++) { 733 for (int i = 0; i < iCount; i++) {
721 CPDF_FormControl* pCtrl = GetControl(i); 734 CPDF_FormControl* pCtrl = GetControl(i);
722 if (bUnison) { 735 if (bUnison) {
723 CFX_WideString csEValue = pCtrl->GetExportValue(); 736 CFX_WideString csEValue = pCtrl->GetExportValue();
724 if (csEValue == csWExport) { 737 if (csEValue == csWExport) {
725 if (pCtrl->GetOnStateName() == pControl->GetOnStateName()) { 738 if (pCtrl->GetOnStateName() == pControl->GetOnStateName())
726 pCtrl->CheckControl(bChecked); 739 pCtrl->CheckControl(bChecked);
727 } else if (bChecked) { 740 else if (bChecked)
728 pCtrl->CheckControl(FALSE); 741 pCtrl->CheckControl(FALSE);
729 }
730 } else if (bChecked) { 742 } else if (bChecked) {
731 pCtrl->CheckControl(FALSE); 743 pCtrl->CheckControl(FALSE);
732 } 744 }
733 } else { 745 } else {
734 if (i == iControlIndex) { 746 if (i == iControlIndex)
735 pCtrl->CheckControl(bChecked); 747 pCtrl->CheckControl(bChecked);
736 } else if (bChecked) { 748 else if (bChecked)
737 pCtrl->CheckControl(FALSE); 749 pCtrl->CheckControl(FALSE);
738 }
739 } 750 }
740 } 751 }
752
741 CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, "Opt"); 753 CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, "Opt");
742 if (!ToArray(pOpt)) { 754 if (!ToArray(pOpt)) {
743 if (bChecked) { 755 if (bChecked) {
744 m_pDict->SetAtName("V", csBExport); 756 m_pDict->SetAtName("V", csBExport);
745 } else { 757 } else {
746 CFX_ByteString csV; 758 CFX_ByteString csV;
747 CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V"); 759 CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
748 if (pV) { 760 if (pV)
749 csV = pV->GetString(); 761 csV = pV->GetString();
750 } 762 if (csV == csBExport)
751 if (csV == csBExport) {
752 m_pDict->SetAtName("V", "Off"); 763 m_pDict->SetAtName("V", "Off");
753 }
754 } 764 }
755 } else if (bChecked) { 765 } else if (bChecked) {
756 CFX_ByteString csIndex; 766 CFX_ByteString csIndex;
757 csIndex.Format("%d", iControlIndex); 767 csIndex.Format("%d", iControlIndex);
758 m_pDict->SetAtName("V", csIndex); 768 m_pDict->SetAtName("V", csIndex);
759 } 769 }
760 if (bNotify && m_pForm->m_pFormNotify) 770 if (bNotify && m_pForm->m_pFormNotify)
761 m_pForm->m_pFormNotify->AfterCheckedStatusChange(this); 771 m_pForm->m_pFormNotify->AfterCheckedStatusChange(this);
762 return TRUE; 772 return TRUE;
763 } 773 }
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 case ListBox: 988 case ListBox:
979 NotifyAfterSelectionChange(); 989 NotifyAfterSelectionChange();
980 break; 990 break;
981 case ComboBox: 991 case ComboBox:
982 NotifyAfterValueChange(); 992 NotifyAfterValueChange();
983 break; 993 break;
984 default: 994 default:
985 break; 995 break;
986 } 996 }
987 } 997 }
OLDNEW
« no previous file with comments | « core/fpdfdoc/cpdf_formcontrol.cpp ('k') | core/fpdfdoc/cpdf_iconfit.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698