OLD | NEW |
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 "../../include/fpdfdoc/fpdf_doc.h" | 7 #include "../../include/fpdfdoc/fpdf_doc.h" |
8 #include "doc_utils.h" | 8 #include "doc_utils.h" |
9 | 9 |
10 FX_BOOL PDF_FormField_IsUnison(CPDF_FormField* pField) { | 10 FX_BOOL PDF_FormField_IsUnison(CPDF_FormField* pField) { |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 } | 300 } |
301 if (pValue == NULL) { | 301 if (pValue == NULL) { |
302 return CFX_WideString(); | 302 return CFX_WideString(); |
303 } | 303 } |
304 } | 304 } |
305 switch (pValue->GetType()) { | 305 switch (pValue->GetType()) { |
306 case PDFOBJ_STRING: | 306 case PDFOBJ_STRING: |
307 case PDFOBJ_STREAM: | 307 case PDFOBJ_STREAM: |
308 return pValue->GetUnicodeText(); | 308 return pValue->GetUnicodeText(); |
309 case PDFOBJ_ARRAY: | 309 case PDFOBJ_ARRAY: |
310 pValue = ((CPDF_Array*)pValue)->GetElementValue(0); | 310 pValue = pValue->AsArray()->GetElementValue(0); |
311 if (pValue) { | 311 if (pValue) |
312 return pValue->GetUnicodeText(); | 312 return pValue->GetUnicodeText(); |
313 } | |
314 break; | 313 break; |
315 } | 314 } |
316 return CFX_WideString(); | 315 return CFX_WideString(); |
317 } | 316 } |
318 CFX_WideString CPDF_FormField::GetValue() { | 317 CFX_WideString CPDF_FormField::GetValue() { |
319 return GetValue(FALSE); | 318 return GetValue(FALSE); |
320 } | 319 } |
321 CFX_WideString CPDF_FormField::GetDefaultValue() { | 320 CFX_WideString CPDF_FormField::GetDefaultValue() { |
322 return GetValue(TRUE); | 321 return GetValue(TRUE); |
323 } | 322 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 if (pWidgetDict->KeyExist("MaxLen")) { | 411 if (pWidgetDict->KeyExist("MaxLen")) { |
413 return pWidgetDict->GetInteger("MaxLen"); | 412 return pWidgetDict->GetInteger("MaxLen"); |
414 } | 413 } |
415 } | 414 } |
416 return 0; | 415 return 0; |
417 } | 416 } |
418 return pObj->GetInteger(); | 417 return pObj->GetInteger(); |
419 } | 418 } |
420 int CPDF_FormField::CountSelectedItems() { | 419 int CPDF_FormField::CountSelectedItems() { |
421 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); | 420 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); |
422 if (pValue == NULL) { | 421 if (!pValue) { |
423 pValue = FPDF_GetFieldAttr(m_pDict, "I"); | 422 pValue = FPDF_GetFieldAttr(m_pDict, "I"); |
424 if (pValue == NULL) { | 423 if (!pValue) |
425 return 0; | 424 return 0; |
426 } | |
427 } | 425 } |
428 | 426 |
429 if (pValue->IsString() || pValue->IsNumber()) | 427 if (pValue->IsString() || pValue->IsNumber()) |
430 return pValue->GetString().IsEmpty() ? 0 : 1; | 428 return pValue->GetString().IsEmpty() ? 0 : 1; |
431 | 429 if (CPDF_Array* pArray = pValue->AsArray()) |
432 if (pValue->GetType() != PDFOBJ_ARRAY) { | 430 return pArray->GetCount(); |
433 return 0; | 431 return 0; |
434 } | |
435 return ((CPDF_Array*)pValue)->GetCount(); | |
436 } | 432 } |
437 int CPDF_FormField::GetSelectedIndex(int index) { | 433 int CPDF_FormField::GetSelectedIndex(int index) { |
438 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); | 434 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); |
439 if (pValue == NULL) { | 435 if (!pValue) { |
440 pValue = FPDF_GetFieldAttr(m_pDict, "I"); | 436 pValue = FPDF_GetFieldAttr(m_pDict, "I"); |
441 if (pValue == NULL) { | 437 if (!pValue) |
442 return -1; | 438 return -1; |
443 } | |
444 } | 439 } |
445 if (pValue->IsNumber()) | 440 if (pValue->IsNumber()) |
446 return pValue->GetInteger(); | 441 return pValue->GetInteger(); |
447 | 442 |
448 CFX_WideString sel_value; | 443 CFX_WideString sel_value; |
449 if (pValue->IsString()) { | 444 if (pValue->IsString()) { |
450 if (index != 0) | 445 if (index != 0) |
451 return -1; | 446 return -1; |
452 | |
453 sel_value = pValue->GetUnicodeText(); | 447 sel_value = pValue->GetUnicodeText(); |
454 } else { | 448 } else { |
455 if (pValue->GetType() != PDFOBJ_ARRAY) { | 449 CPDF_Array* pArray = pValue->AsArray(); |
| 450 if (!pArray || index < 0) |
456 return -1; | 451 return -1; |
457 } | 452 |
458 if (index < 0) { | 453 CPDF_Object* elementValue = pArray->GetElementValue(index); |
459 return -1; | |
460 } | |
461 CPDF_Object* elementValue = ((CPDF_Array*)pValue)->GetElementValue(index); | |
462 sel_value = | 454 sel_value = |
463 elementValue ? elementValue->GetUnicodeText() : CFX_WideString(); | 455 elementValue ? elementValue->GetUnicodeText() : CFX_WideString(); |
464 } | 456 } |
465 if (index < CountSelectedOptions()) { | 457 if (index < CountSelectedOptions()) { |
466 int iOptIndex = GetSelectedOptionIndex(index); | 458 int iOptIndex = GetSelectedOptionIndex(index); |
467 CFX_WideString csOpt = GetOptionValue(iOptIndex); | 459 CFX_WideString csOpt = GetOptionValue(iOptIndex); |
468 if (csOpt == sel_value) { | 460 if (csOpt == sel_value) { |
469 return iOptIndex; | 461 return iOptIndex; |
470 } | 462 } |
471 } | 463 } |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 | 522 |
531 if (pValue->IsString()) | 523 if (pValue->IsString()) |
532 return pValue->GetUnicodeText() == opt_value; | 524 return pValue->GetUnicodeText() == opt_value; |
533 | 525 |
534 if (pValue->IsNumber()) { | 526 if (pValue->IsNumber()) { |
535 if (pValue->GetString().IsEmpty()) | 527 if (pValue->GetString().IsEmpty()) |
536 return FALSE; | 528 return FALSE; |
537 return (pValue->GetInteger() == index); | 529 return (pValue->GetInteger() == index); |
538 } | 530 } |
539 | 531 |
540 if (pValue->GetType() != PDFOBJ_ARRAY) { | 532 CPDF_Array* pArray = pValue->AsArray(); |
| 533 if (!pArray) |
541 return FALSE; | 534 return FALSE; |
542 } | 535 |
543 CPDF_Array* pArray = (CPDF_Array*)pValue; | |
544 int iPos = -1; | 536 int iPos = -1; |
545 for (int j = 0; j < CountSelectedOptions(); j++) { | 537 for (int j = 0; j < CountSelectedOptions(); j++) { |
546 if (GetSelectedOptionIndex(j) == index) { | 538 if (GetSelectedOptionIndex(j) == index) { |
547 iPos = j; | 539 iPos = j; |
548 break; | 540 break; |
549 } | 541 } |
550 } | 542 } |
551 for (FX_DWORD i = 0; i < pArray->GetCount(); i++) | 543 for (FX_DWORD i = 0; i < pArray->GetCount(); i++) |
552 if (pArray->GetElementValue(i)->GetUnicodeText() == opt_value && | 544 if (pArray->GetElementValue(i)->GetUnicodeText() == opt_value && |
553 (int)i == iPos) { | 545 (int)i == iPos) { |
(...skipping 23 matching lines...) Expand all Loading... |
577 } | 569 } |
578 if (!bSelected) { | 570 if (!bSelected) { |
579 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); | 571 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V"); |
580 if (pValue != NULL) { | 572 if (pValue != NULL) { |
581 if (m_Type == ListBox) { | 573 if (m_Type == ListBox) { |
582 SelectOption(index, FALSE); | 574 SelectOption(index, FALSE); |
583 if (pValue->IsString()) { | 575 if (pValue->IsString()) { |
584 if (pValue->GetUnicodeText() == opt_value) { | 576 if (pValue->GetUnicodeText() == opt_value) { |
585 m_pDict->RemoveAt("V"); | 577 m_pDict->RemoveAt("V"); |
586 } | 578 } |
587 } else if (pValue->GetType() == PDFOBJ_ARRAY) { | 579 } else if (pValue->IsArray()) { |
588 CPDF_Array* pArray = CPDF_Array::Create(); | 580 CPDF_Array* pArray = CPDF_Array::Create(); |
589 if (pArray == NULL) { | |
590 return FALSE; | |
591 } | |
592 int iCount = CountOptions(); | 581 int iCount = CountOptions(); |
593 for (int i = 0; i < iCount; i++) { | 582 for (int i = 0; i < iCount; i++) { |
594 if (i != index) { | 583 if (i != index) { |
595 if (IsItemSelected(i)) { | 584 if (IsItemSelected(i)) { |
596 opt_value = GetOptionValue(i); | 585 opt_value = GetOptionValue(i); |
597 pArray->AddString(PDF_EncodeText(opt_value)); | 586 pArray->AddString(PDF_EncodeText(opt_value)); |
598 } | 587 } |
599 } | 588 } |
600 } | 589 } |
601 if (pArray->GetCount() < 1) { | 590 if (pArray->GetCount() < 1) { |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
696 } | 685 } |
697 if (!m_pForm->m_bGenerateAP) { | 686 if (!m_pForm->m_bGenerateAP) { |
698 return; | 687 return; |
699 } | 688 } |
700 for (int i = 0; i < CountControls(); i++) { | 689 for (int i = 0; i < CountControls(); i++) { |
701 CPDF_FormControl* pControl = GetControl(i); | 690 CPDF_FormControl* pControl = GetControl(i); |
702 FPDF_GenerateAP(m_pForm->m_pDocument, pControl->m_pWidgetDict); | 691 FPDF_GenerateAP(m_pForm->m_pDocument, pControl->m_pWidgetDict); |
703 } | 692 } |
704 } | 693 } |
705 int CPDF_FormField::CountOptions() { | 694 int CPDF_FormField::CountOptions() { |
706 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt"); | 695 CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt")); |
707 if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) { | 696 return pArray ? pArray->GetCount() : 0; |
708 return 0; | |
709 } | |
710 return ((CPDF_Array*)pValue)->GetCount(); | |
711 } | 697 } |
712 CFX_WideString CPDF_FormField::GetOptionText(int index, int sub_index) { | 698 CFX_WideString CPDF_FormField::GetOptionText(int index, int sub_index) { |
713 CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "Opt"); | 699 CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt")); |
714 if (pValue == NULL || pValue->GetType() != PDFOBJ_ARRAY) { | 700 if (!pArray) |
715 return CFX_WideString(); | 701 return CFX_WideString(); |
716 } | 702 |
717 CPDF_Object* pOption = ((CPDF_Array*)pValue)->GetElementValue(index); | 703 CPDF_Object* pOption = pArray->GetElementValue(index); |
718 if (pOption == NULL) { | 704 if (!pOption) |
719 return CFX_WideString(); | 705 return CFX_WideString(); |
720 } | 706 if (CPDF_Array* pOptionArray = pOption->AsArray()) |
721 if (pOption->GetType() == PDFOBJ_ARRAY) { | 707 pOption = pOptionArray->GetElementValue(sub_index); |
722 pOption = ((CPDF_Array*)pOption)->GetElementValue(sub_index); | |
723 } | |
724 | 708 |
725 CPDF_String* pString = ToString(pOption); | 709 CPDF_String* pString = ToString(pOption); |
726 return pString ? pString->GetUnicodeText() : CFX_WideString(); | 710 return pString ? pString->GetUnicodeText() : CFX_WideString(); |
727 } | 711 } |
728 CFX_WideString CPDF_FormField::GetOptionLabel(int index) { | 712 CFX_WideString CPDF_FormField::GetOptionLabel(int index) { |
729 return GetOptionText(index, 1); | 713 return GetOptionText(index, 1); |
730 } | 714 } |
731 CFX_WideString CPDF_FormField::GetOptionValue(int index) { | 715 CFX_WideString CPDF_FormField::GetOptionValue(int index) { |
732 return GetOptionText(index, 0); | 716 return GetOptionText(index, 0); |
733 } | 717 } |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
866 } | 850 } |
867 } else { | 851 } else { |
868 if (i == iControlIndex) { | 852 if (i == iControlIndex) { |
869 pCtrl->CheckControl(bChecked); | 853 pCtrl->CheckControl(bChecked); |
870 } else if (bChecked) { | 854 } else if (bChecked) { |
871 pCtrl->CheckControl(FALSE); | 855 pCtrl->CheckControl(FALSE); |
872 } | 856 } |
873 } | 857 } |
874 } | 858 } |
875 CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, "Opt"); | 859 CPDF_Object* pOpt = FPDF_GetFieldAttr(m_pDict, "Opt"); |
876 if (pOpt == NULL || pOpt->GetType() != PDFOBJ_ARRAY) { | 860 if (!ToArray(pOpt)) { |
877 if (bChecked) { | 861 if (bChecked) { |
878 m_pDict->SetAtName("V", csBExport); | 862 m_pDict->SetAtName("V", csBExport); |
879 } else { | 863 } else { |
880 CFX_ByteString csV; | 864 CFX_ByteString csV; |
881 CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V"); | 865 CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V"); |
882 if (pV != NULL) { | 866 if (pV != NULL) { |
883 csV = pV->GetString(); | 867 csV = pV->GetString(); |
884 } | 868 } |
885 if (csV == csBExport) { | 869 if (csV == csBExport) { |
886 m_pDict->SetAtName("V", "Off"); | 870 m_pDict->SetAtName("V", "Off"); |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1128 m_pForm->m_pFormDict->GetDict("DR")->GetDict("Font")) | 1112 m_pForm->m_pFormDict->GetDict("DR")->GetDict("Font")) |
1129 pFontDict = m_pForm->m_pFormDict->GetDict("DR")->GetDict("Font")->GetDict( | 1113 pFontDict = m_pForm->m_pFormDict->GetDict("DR")->GetDict("Font")->GetDict( |
1130 font_name); | 1114 font_name); |
1131 | 1115 |
1132 if (pFontDict == NULL) { | 1116 if (pFontDict == NULL) { |
1133 return; | 1117 return; |
1134 } | 1118 } |
1135 m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict); | 1119 m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict); |
1136 m_FontSize = FX_atof(syntax.GetWord()); | 1120 m_FontSize = FX_atof(syntax.GetWord()); |
1137 } | 1121 } |
OLD | NEW |