Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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 <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" | 9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" |
| 10 #include "core/fpdfapi/fpdf_font/include/cpdf_fontencoding.h" | 10 #include "core/fpdfapi/fpdf_font/include/cpdf_fontencoding.h" |
| (...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 530 strcpy(lf.lfFaceName, pcsFontName); | 530 strcpy(lf.lfFaceName, pcsFontName); |
| 531 } | 531 } |
| 532 return RetrieveSpecificFont(lf); | 532 return RetrieveSpecificFont(lf); |
| 533 } | 533 } |
| 534 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 534 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
| 535 | 535 |
| 536 } // namespace | 536 } // namespace |
| 537 | 537 |
| 538 class CFieldTree { | 538 class CFieldTree { |
| 539 public: | 539 public: |
| 540 struct Node { | 540 class Node { |
| 541 Node* parent; | 541 public: |
| 542 CFX_ArrayTemplate<Node*> children; | 542 Node() : field_ptr_(nullptr) {} |
| 543 CFX_WideString short_name; | 543 Node(const CFX_WideString& short_name, CPDF_FormField* field_ptr) |
| 544 CPDF_FormField* field_ptr; | 544 : short_name_(short_name), field_ptr_(field_ptr) {} |
| 545 ~Node() {} | |
| 546 | |
| 547 void AddChildNode(Node* pNode) { children_.push_back(pNode); } | |
| 548 | |
| 549 size_t GetChildrenCount() const { return children_.size(); } | |
| 550 | |
| 551 Node* GetChildAt(size_t i) { return children_[i]; } | |
|
Tom Sepez
2016/09/28 00:10:01
nit: is this a const method?
Lei Zhang
2016/09/28 00:22:54
Added a const version.
| |
| 552 | |
| 545 int CountFields(int nLevel = 0) { | 553 int CountFields(int nLevel = 0) { |
| 546 if (nLevel > nMaxRecursion) | 554 if (nLevel > nMaxRecursion) |
| 547 return 0; | 555 return 0; |
| 548 if (field_ptr) | 556 if (field_ptr_) |
| 549 return 1; | 557 return 1; |
| 550 | 558 |
| 551 int count = 0; | 559 int count = 0; |
| 552 for (int i = 0; i < children.GetSize(); i++) | 560 for (size_t i = 0; i < GetChildrenCount(); ++i) |
| 553 count += children.GetAt(i)->CountFields(nLevel + 1); | 561 count += GetChildAt(i)->CountFields(nLevel + 1); |
| 554 return count; | 562 return count; |
| 555 } | 563 } |
| 556 | 564 |
| 557 CPDF_FormField* GetField(int* fields_to_go) { | 565 CPDF_FormField* GetField(int* fields_to_go) { |
| 558 if (field_ptr) { | 566 if (field_ptr_) { |
| 559 if (*fields_to_go == 0) | 567 if (*fields_to_go == 0) |
| 560 return field_ptr; | 568 return field_ptr_; |
| 561 | 569 |
| 562 --*fields_to_go; | 570 --*fields_to_go; |
| 563 return nullptr; | 571 return nullptr; |
| 564 } | 572 } |
| 565 for (int i = 0; i < children.GetSize(); i++) { | 573 for (size_t i = 0; i < GetChildrenCount(); ++i) { |
| 566 if (CPDF_FormField* pField = children.GetAt(i)->GetField(fields_to_go)) | 574 if (CPDF_FormField* pField = GetChildAt(i)->GetField(fields_to_go)) |
| 567 return pField; | 575 return pField; |
| 568 } | 576 } |
| 569 return nullptr; | 577 return nullptr; |
| 570 } | 578 } |
| 571 | 579 |
| 572 CPDF_FormField* GetField(int index) { | 580 CPDF_FormField* GetField(int index) { |
| 573 int fields_to_go = index; | 581 int fields_to_go = index; |
| 574 return GetField(&fields_to_go); | 582 return GetField(&fields_to_go); |
| 575 } | 583 } |
| 584 | |
| 585 void set_field_ptr(CPDF_FormField* field) { field_ptr_ = field; } | |
|
Tom Sepez
2016/09/28 00:10:01
nit: not sure time to go full chromium naming.
Se
Lei Zhang
2016/09/28 00:22:54
Done.
| |
| 586 CPDF_FormField* field() { return field_ptr_; } | |
|
Tom Sepez
2016/09/28 00:10:01
nit: const method?
Lei Zhang
2016/09/28 00:22:54
Added const version.
| |
| 587 const CFX_WideString& short_name() const { return short_name_; } | |
| 588 | |
| 589 private: | |
| 590 std::vector<Node*> children_; | |
|
Tom Sepez
2016/09/28 00:10:01
nit: not sure now is the time to go full chromium
Lei Zhang
2016/09/28 00:22:55
Oh, they started out looking like chromium naming
| |
| 591 CFX_WideString short_name_; | |
| 592 CPDF_FormField* field_ptr_; | |
| 576 }; | 593 }; |
| 577 | 594 |
| 578 CFieldTree(); | 595 CFieldTree(); |
| 579 ~CFieldTree(); | 596 ~CFieldTree(); |
| 580 | 597 |
| 581 void SetField(const CFX_WideString& full_name, CPDF_FormField* field_ptr); | 598 void SetField(const CFX_WideString& full_name, CPDF_FormField* field_ptr); |
| 582 CPDF_FormField* GetField(const CFX_WideString& full_name); | 599 CPDF_FormField* GetField(const CFX_WideString& full_name); |
| 583 CPDF_FormField* RemoveField(const CFX_WideString& full_name); | |
| 584 void RemoveAll(); | 600 void RemoveAll(); |
| 585 | 601 |
| 586 Node* FindNode(const CFX_WideString& full_name); | 602 Node* FindNode(const CFX_WideString& full_name); |
| 587 Node* AddChild(Node* pParent, | 603 Node* AddChild(Node* pParent, |
| 588 const CFX_WideString& short_name, | 604 const CFX_WideString& short_name, |
| 589 CPDF_FormField* field_ptr); | 605 CPDF_FormField* field_ptr); |
| 590 void RemoveNode(Node* pNode, int nLevel = 0); | 606 void RemoveNode(Node* pNode, int nLevel = 0); |
| 591 | 607 |
| 592 Node* Lookup(Node* pParent, const CFX_WideString& short_name); | 608 Node* Lookup(Node* pParent, const CFX_WideString& short_name); |
| 593 | 609 |
| 594 Node m_Root; | 610 Node m_Root; |
| 595 }; | 611 }; |
| 596 | 612 |
| 597 CFieldTree::CFieldTree() { | 613 CFieldTree::CFieldTree() {} |
| 598 m_Root.parent = nullptr; | |
| 599 m_Root.field_ptr = nullptr; | |
| 600 } | |
| 601 | 614 |
| 602 CFieldTree::~CFieldTree() { | 615 CFieldTree::~CFieldTree() { |
| 603 RemoveAll(); | 616 RemoveAll(); |
| 604 } | 617 } |
| 605 | 618 |
| 606 CFieldTree::Node* CFieldTree::AddChild(Node* pParent, | 619 CFieldTree::Node* CFieldTree::AddChild(Node* pParent, |
| 607 const CFX_WideString& short_name, | 620 const CFX_WideString& short_name, |
| 608 CPDF_FormField* field_ptr) { | 621 CPDF_FormField* field_ptr) { |
| 609 if (!pParent) | 622 if (!pParent) |
| 610 return nullptr; | 623 return nullptr; |
| 611 | 624 |
| 612 Node* pNode = new Node; | 625 Node* pNode = new Node(short_name, field_ptr); |
| 613 pNode->parent = pParent; | 626 pParent->AddChildNode(pNode); |
| 614 pNode->short_name = short_name; | |
| 615 pNode->field_ptr = field_ptr; | |
| 616 pParent->children.Add(pNode); | |
| 617 return pNode; | 627 return pNode; |
| 618 } | 628 } |
| 619 | 629 |
| 620 void CFieldTree::RemoveNode(Node* pNode, int nLevel) { | 630 void CFieldTree::RemoveNode(Node* pNode, int nLevel) { |
| 621 if (!pNode) | 631 if (!pNode) |
| 622 return; | 632 return; |
| 633 | |
| 623 if (nLevel <= nMaxRecursion) { | 634 if (nLevel <= nMaxRecursion) { |
| 624 for (int i = 0; i < pNode->children.GetSize(); i++) | 635 for (size_t i = 0; i < pNode->GetChildrenCount(); ++i) |
| 625 RemoveNode(pNode->children[i], nLevel + 1); | 636 RemoveNode(pNode->GetChildAt(i), nLevel + 1); |
| 626 } | 637 } |
| 627 delete pNode; | 638 delete pNode; |
| 628 } | 639 } |
| 629 | 640 |
| 630 CFieldTree::Node* CFieldTree::Lookup(Node* pParent, | 641 CFieldTree::Node* CFieldTree::Lookup(Node* pParent, |
| 631 const CFX_WideString& short_name) { | 642 const CFX_WideString& short_name) { |
| 632 if (!pParent) | 643 if (!pParent) |
| 633 return nullptr; | 644 return nullptr; |
| 634 | 645 |
| 635 for (int i = 0; i < pParent->children.GetSize(); i++) { | 646 for (size_t i = 0; i < pParent->GetChildrenCount(); ++i) { |
| 636 Node* pNode = pParent->children[i]; | 647 Node* pNode = pParent->GetChildAt(i); |
| 637 if (pNode->short_name == short_name) | 648 if (pNode->short_name() == short_name) |
| 638 return pNode; | 649 return pNode; |
| 639 } | 650 } |
| 640 return nullptr; | 651 return nullptr; |
| 641 } | 652 } |
| 642 | 653 |
| 643 void CFieldTree::RemoveAll() { | 654 void CFieldTree::RemoveAll() { |
| 644 for (int i = 0; i < m_Root.children.GetSize(); i++) | 655 for (size_t i = 0; i < m_Root.GetChildrenCount(); ++i) |
| 645 RemoveNode(m_Root.children[i]); | 656 RemoveNode(m_Root.GetChildAt(i)); |
| 646 } | 657 } |
| 647 | 658 |
| 648 void CFieldTree::SetField(const CFX_WideString& full_name, | 659 void CFieldTree::SetField(const CFX_WideString& full_name, |
| 649 CPDF_FormField* field_ptr) { | 660 CPDF_FormField* field_ptr) { |
| 650 if (full_name == L"") | 661 if (full_name == L"") |
| 651 return; | 662 return; |
| 652 | 663 |
| 653 CFieldNameExtractor name_extractor(full_name); | 664 CFieldNameExtractor name_extractor(full_name); |
| 654 const FX_WCHAR* pName; | 665 const FX_WCHAR* pName; |
| 655 FX_STRSIZE nLength; | 666 FX_STRSIZE nLength; |
| 656 name_extractor.GetNext(pName, nLength); | 667 name_extractor.GetNext(pName, nLength); |
| 657 Node* pNode = &m_Root; | 668 Node* pNode = &m_Root; |
| 658 Node* pLast = nullptr; | 669 Node* pLast = nullptr; |
| 659 while (nLength > 0) { | 670 while (nLength > 0) { |
| 660 pLast = pNode; | 671 pLast = pNode; |
| 661 CFX_WideString name = CFX_WideString(pName, nLength); | 672 CFX_WideString name = CFX_WideString(pName, nLength); |
| 662 pNode = Lookup(pLast, name); | 673 pNode = Lookup(pLast, name); |
| 663 if (!pNode) | 674 if (!pNode) |
| 664 pNode = AddChild(pLast, name, nullptr); | 675 pNode = AddChild(pLast, name, nullptr); |
| 665 | 676 |
| 666 name_extractor.GetNext(pName, nLength); | 677 name_extractor.GetNext(pName, nLength); |
| 667 } | 678 } |
| 668 if (pNode != &m_Root) | 679 if (pNode != &m_Root) |
| 669 pNode->field_ptr = field_ptr; | 680 pNode->set_field_ptr(field_ptr); |
| 670 } | 681 } |
| 671 | 682 |
| 672 CPDF_FormField* CFieldTree::GetField(const CFX_WideString& full_name) { | 683 CPDF_FormField* CFieldTree::GetField(const CFX_WideString& full_name) { |
| 673 if (full_name == L"") | 684 if (full_name == L"") |
| 674 return nullptr; | 685 return nullptr; |
| 675 | 686 |
| 676 CFieldNameExtractor name_extractor(full_name); | 687 CFieldNameExtractor name_extractor(full_name); |
| 677 const FX_WCHAR* pName; | 688 const FX_WCHAR* pName; |
| 678 FX_STRSIZE nLength; | 689 FX_STRSIZE nLength; |
| 679 name_extractor.GetNext(pName, nLength); | 690 name_extractor.GetNext(pName, nLength); |
| 680 Node* pNode = &m_Root; | 691 Node* pNode = &m_Root; |
| 681 Node* pLast = nullptr; | 692 Node* pLast = nullptr; |
| 682 while (nLength > 0 && pNode) { | 693 while (nLength > 0 && pNode) { |
| 683 pLast = pNode; | 694 pLast = pNode; |
| 684 CFX_WideString name = CFX_WideString(pName, nLength); | 695 CFX_WideString name = CFX_WideString(pName, nLength); |
| 685 pNode = Lookup(pLast, name); | 696 pNode = Lookup(pLast, name); |
| 686 name_extractor.GetNext(pName, nLength); | 697 name_extractor.GetNext(pName, nLength); |
| 687 } | 698 } |
| 688 return pNode ? pNode->field_ptr : nullptr; | 699 return pNode ? pNode->field() : nullptr; |
| 689 } | |
| 690 | |
| 691 CPDF_FormField* CFieldTree::RemoveField(const CFX_WideString& full_name) { | |
| 692 if (full_name == L"") | |
| 693 return nullptr; | |
| 694 | |
| 695 CFieldNameExtractor name_extractor(full_name); | |
| 696 const FX_WCHAR* pName; | |
| 697 FX_STRSIZE nLength; | |
| 698 name_extractor.GetNext(pName, nLength); | |
| 699 Node* pNode = &m_Root; | |
| 700 Node* pLast = nullptr; | |
| 701 while (nLength > 0 && pNode) { | |
| 702 pLast = pNode; | |
| 703 CFX_WideString name = CFX_WideString(pName, nLength); | |
| 704 pNode = Lookup(pLast, name); | |
| 705 name_extractor.GetNext(pName, nLength); | |
| 706 } | |
| 707 | |
| 708 if (pNode && pNode != &m_Root) { | |
| 709 for (int i = 0; i < pLast->children.GetSize(); i++) { | |
| 710 if (pNode == pLast->children[i]) { | |
| 711 pLast->children.RemoveAt(i); | |
| 712 break; | |
| 713 } | |
| 714 } | |
| 715 CPDF_FormField* pField = pNode->field_ptr; | |
| 716 RemoveNode(pNode); | |
| 717 return pField; | |
| 718 } | |
| 719 return nullptr; | |
| 720 } | 700 } |
| 721 | 701 |
| 722 CFieldTree::Node* CFieldTree::FindNode(const CFX_WideString& full_name) { | 702 CFieldTree::Node* CFieldTree::FindNode(const CFX_WideString& full_name) { |
| 723 if (full_name == L"") | 703 if (full_name == L"") |
| 724 return nullptr; | 704 return nullptr; |
| 725 | 705 |
| 726 CFieldNameExtractor name_extractor(full_name); | 706 CFieldNameExtractor name_extractor(full_name); |
| 727 const FX_WCHAR* pName; | 707 const FX_WCHAR* pName; |
| 728 FX_STRSIZE nLength; | 708 FX_STRSIZE nLength; |
| 729 name_extractor.GetNext(pName, nLength); | 709 name_extractor.GetNext(pName, nLength); |
| (...skipping 894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1624 FDF_ImportField(pField, L"", bNotify); | 1604 FDF_ImportField(pField, L"", bNotify); |
| 1625 } | 1605 } |
| 1626 if (bNotify && m_pFormNotify) | 1606 if (bNotify && m_pFormNotify) |
| 1627 m_pFormNotify->AfterFormImportData(this); | 1607 m_pFormNotify->AfterFormImportData(this); |
| 1628 return TRUE; | 1608 return TRUE; |
| 1629 } | 1609 } |
| 1630 | 1610 |
| 1631 void CPDF_InterForm::SetFormNotify(IPDF_FormNotify* pNotify) { | 1611 void CPDF_InterForm::SetFormNotify(IPDF_FormNotify* pNotify) { |
| 1632 m_pFormNotify = pNotify; | 1612 m_pFormNotify = pNotify; |
| 1633 } | 1613 } |
| OLD | NEW |