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 "fpdfsdk/include/fsdk_baseform.h" | 7 #include "fpdfsdk/include/fsdk_baseform.h" |
8 | 8 |
| 9 #include <algorithm> |
9 #include <memory> | 10 #include <memory> |
10 | 11 |
11 #include "fpdfsdk/include/formfiller/FFL_FormFiller.h" | 12 #include "fpdfsdk/include/formfiller/FFL_FormFiller.h" |
12 #include "fpdfsdk/include/fsdk_actionhandler.h" | 13 #include "fpdfsdk/include/fsdk_actionhandler.h" |
13 #include "fpdfsdk/include/fsdk_baseannot.h" | 14 #include "fpdfsdk/include/fsdk_baseannot.h" |
14 #include "fpdfsdk/include/fsdk_define.h" | 15 #include "fpdfsdk/include/fsdk_define.h" |
15 #include "fpdfsdk/include/fsdk_mgr.h" | 16 #include "fpdfsdk/include/fsdk_mgr.h" |
16 #include "fpdfsdk/include/javascript/IJavaScript.h" | 17 #include "fpdfsdk/include/javascript/IJavaScript.h" |
17 #include "fpdfsdk/include/pdfwindow/PWL_Utils.h" | 18 #include "fpdfsdk/include/pdfwindow/PWL_Utils.h" |
18 | 19 |
(...skipping 2715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2734 if (nFieldType < 0 || nFieldType > kNumFieldTypes) | 2735 if (nFieldType < 0 || nFieldType > kNumFieldTypes) |
2735 return FXSYS_RGB(255, 255, 255); | 2736 return FXSYS_RGB(255, 255, 255); |
2736 if (nFieldType == 0) | 2737 if (nFieldType == 0) |
2737 return m_aHighlightColor[0]; | 2738 return m_aHighlightColor[0]; |
2738 return m_aHighlightColor[nFieldType - 1]; | 2739 return m_aHighlightColor[nFieldType - 1]; |
2739 } | 2740 } |
2740 | 2741 |
2741 CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, | 2742 CBA_AnnotIterator::CBA_AnnotIterator(CPDFSDK_PageView* pPageView, |
2742 const CFX_ByteString& sType, | 2743 const CFX_ByteString& sType, |
2743 const CFX_ByteString& sSubType) | 2744 const CFX_ByteString& sSubType) |
2744 : m_pPageView(pPageView), | 2745 : m_eTabOrder(STRUCTURE), |
| 2746 m_pPageView(pPageView), |
2745 m_sType(sType), | 2747 m_sType(sType), |
2746 m_sSubType(sSubType), | 2748 m_sSubType(sSubType) { |
2747 m_nTabs(BAI_STRUCTURE) { | |
2748 CPDF_Page* pPDFPage = m_pPageView->GetPDFPage(); | 2749 CPDF_Page* pPDFPage = m_pPageView->GetPDFPage(); |
2749 CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetStringBy("Tabs"); | 2750 CFX_ByteString sTabs = pPDFPage->m_pFormDict->GetStringBy("Tabs"); |
2750 | 2751 if (sTabs == "R") |
2751 if (sTabs == "R") { | 2752 m_eTabOrder = ROW; |
2752 m_nTabs = BAI_ROW; | 2753 else if (sTabs == "C") |
2753 } else if (sTabs == "C") { | 2754 m_eTabOrder = COLUMN; |
2754 m_nTabs = BAI_COLUMN; | |
2755 } else { | |
2756 m_nTabs = BAI_STRUCTURE; | |
2757 } | |
2758 | 2755 |
2759 GenerateResults(); | 2756 GenerateResults(); |
2760 } | 2757 } |
2761 | 2758 |
2762 CBA_AnnotIterator::~CBA_AnnotIterator() { | 2759 CBA_AnnotIterator::~CBA_AnnotIterator() { |
2763 m_Annots.RemoveAll(); | |
2764 } | 2760 } |
2765 | 2761 |
2766 CPDFSDK_Annot* CBA_AnnotIterator::GetFirstAnnot() { | 2762 CPDFSDK_Annot* CBA_AnnotIterator::GetFirstAnnot() { |
2767 if (m_Annots.GetSize() > 0) | 2763 return m_Annots.empty() ? nullptr : m_Annots.front(); |
2768 return m_Annots[0]; | |
2769 | |
2770 return NULL; | |
2771 } | 2764 } |
2772 | 2765 |
2773 CPDFSDK_Annot* CBA_AnnotIterator::GetLastAnnot() { | 2766 CPDFSDK_Annot* CBA_AnnotIterator::GetLastAnnot() { |
2774 if (m_Annots.GetSize() > 0) | 2767 return m_Annots.empty() ? nullptr : m_Annots.back(); |
2775 return m_Annots[m_Annots.GetSize() - 1]; | |
2776 | |
2777 return NULL; | |
2778 } | 2768 } |
2779 | 2769 |
2780 CPDFSDK_Annot* CBA_AnnotIterator::GetNextAnnot(CPDFSDK_Annot* pAnnot) { | 2770 CPDFSDK_Annot* CBA_AnnotIterator::GetNextAnnot(CPDFSDK_Annot* pAnnot) { |
2781 for (int i = 0, sz = m_Annots.GetSize(); i < sz; ++i) { | 2771 auto iter = std::find(m_Annots.begin(), m_Annots.end(), pAnnot); |
2782 if (m_Annots[i] == pAnnot) | 2772 if (iter == m_Annots.end()) |
2783 return (i + 1 < sz) ? m_Annots[i + 1] : m_Annots[0]; | 2773 return nullptr; |
2784 } | 2774 ++iter; |
2785 return NULL; | 2775 if (iter == m_Annots.end()) |
| 2776 iter = m_Annots.begin(); |
| 2777 return *iter; |
2786 } | 2778 } |
2787 | 2779 |
2788 CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot) { | 2780 CPDFSDK_Annot* CBA_AnnotIterator::GetPrevAnnot(CPDFSDK_Annot* pAnnot) { |
2789 for (int i = 0, sz = m_Annots.GetSize(); i < sz; ++i) { | 2781 auto iter = std::find(m_Annots.begin(), m_Annots.end(), pAnnot); |
2790 if (m_Annots[i] == pAnnot) | 2782 if (iter == m_Annots.end()) |
2791 return (i - 1 >= 0) ? m_Annots[i - 1] : m_Annots[sz - 1]; | 2783 return nullptr; |
2792 } | 2784 if (iter == m_Annots.begin()) |
2793 return NULL; | 2785 iter = m_Annots.end(); |
| 2786 return *(--iter); |
2794 } | 2787 } |
2795 | 2788 |
2796 int CBA_AnnotIterator::CompareByLeft(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) { | 2789 // static |
2797 ASSERT(p1); | 2790 bool CBA_AnnotIterator::CompareByLeftAscending(const CPDFSDK_Annot* p1, |
2798 ASSERT(p2); | 2791 const CPDFSDK_Annot* p2) { |
2799 | 2792 return GetAnnotRect(p1).left < GetAnnotRect(p2).left; |
2800 CPDF_Rect rcAnnot1 = GetAnnotRect(p1); | |
2801 CPDF_Rect rcAnnot2 = GetAnnotRect(p2); | |
2802 | |
2803 if (rcAnnot1.left < rcAnnot2.left) | |
2804 return -1; | |
2805 if (rcAnnot1.left > rcAnnot2.left) | |
2806 return 1; | |
2807 return 0; | |
2808 } | 2793 } |
2809 | 2794 |
2810 int CBA_AnnotIterator::CompareByTop(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) { | 2795 // static |
2811 ASSERT(p1); | 2796 bool CBA_AnnotIterator::CompareByTopDescending(const CPDFSDK_Annot* p1, |
2812 ASSERT(p2); | 2797 const CPDFSDK_Annot* p2) { |
2813 | 2798 return GetAnnotRect(p1).top > GetAnnotRect(p2).top; |
2814 CPDF_Rect rcAnnot1 = GetAnnotRect(p1); | |
2815 CPDF_Rect rcAnnot2 = GetAnnotRect(p2); | |
2816 | |
2817 if (rcAnnot1.top < rcAnnot2.top) | |
2818 return -1; | |
2819 if (rcAnnot1.top > rcAnnot2.top) | |
2820 return 1; | |
2821 return 0; | |
2822 } | 2799 } |
2823 | 2800 |
2824 void CBA_AnnotIterator::GenerateResults() { | 2801 void CBA_AnnotIterator::GenerateResults() { |
2825 switch (m_nTabs) { | 2802 switch (m_eTabOrder) { |
2826 case BAI_STRUCTURE: { | 2803 case STRUCTURE: { |
2827 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { | 2804 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
2828 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | 2805 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
2829 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) | 2806 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) |
2830 m_Annots.Add(pAnnot); | 2807 m_Annots.push_back(pAnnot); |
2831 } | 2808 } |
2832 break; | 2809 } break; |
2833 } | 2810 case ROW: { |
2834 case BAI_ROW: { | 2811 std::vector<CPDFSDK_Annot*> sa; |
2835 CPDFSDK_SortAnnots sa; | |
2836 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { | 2812 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
2837 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | 2813 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
2838 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) | 2814 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) |
2839 sa.Add(pAnnot); | 2815 sa.push_back(pAnnot); |
2840 } | 2816 } |
2841 | 2817 |
2842 if (sa.GetSize() > 0) | 2818 std::sort(sa.begin(), sa.end(), CompareByLeftAscending); |
2843 sa.Sort(CBA_AnnotIterator::CompareByLeft); | 2819 while (!sa.empty()) { |
2844 | |
2845 while (sa.GetSize() > 0) { | |
2846 int nLeftTopIndex = -1; | 2820 int nLeftTopIndex = -1; |
2847 FX_FLOAT fTop = 0.0f; | 2821 FX_FLOAT fTop = 0.0f; |
2848 | 2822 for (int i = sa.size() - 1; i >= 0; i--) { |
2849 for (int i = sa.GetSize() - 1; i >= 0; i--) { | 2823 CPDF_Rect rcAnnot = GetAnnotRect(sa[i]); |
2850 CPDFSDK_Annot* pAnnot = sa.GetAt(i); | |
2851 ASSERT(pAnnot); | |
2852 | |
2853 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); | |
2854 | |
2855 if (rcAnnot.top > fTop) { | 2824 if (rcAnnot.top > fTop) { |
2856 nLeftTopIndex = i; | 2825 nLeftTopIndex = i; |
2857 fTop = rcAnnot.top; | 2826 fTop = rcAnnot.top; |
2858 } | 2827 } |
2859 } | 2828 } |
| 2829 if (nLeftTopIndex >= 0) { |
| 2830 CPDFSDK_Annot* pLeftTopAnnot = sa[nLeftTopIndex]; |
| 2831 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); |
| 2832 m_Annots.push_back(pLeftTopAnnot); |
| 2833 sa.erase(sa.begin() + nLeftTopIndex); |
2860 | 2834 |
2861 if (nLeftTopIndex >= 0) { | 2835 std::vector<int> aSelect; |
2862 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); | 2836 for (int i = 0; i < sa.size(); ++i) { |
2863 ASSERT(pLeftTopAnnot); | 2837 CPDF_Rect rcAnnot = GetAnnotRect(sa[i]); |
2864 | |
2865 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); | |
2866 | |
2867 m_Annots.Add(pLeftTopAnnot); | |
2868 sa.RemoveAt(nLeftTopIndex); | |
2869 | |
2870 CFX_ArrayTemplate<int> aSelect; | |
2871 | |
2872 for (int i = 0, sz = sa.GetSize(); i < sz; ++i) { | |
2873 CPDFSDK_Annot* pAnnot = sa.GetAt(i); | |
2874 ASSERT(pAnnot); | |
2875 | |
2876 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); | |
2877 FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; | 2838 FX_FLOAT fCenterY = (rcAnnot.top + rcAnnot.bottom) / 2.0f; |
2878 if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top) | 2839 if (fCenterY > rcLeftTop.bottom && fCenterY < rcLeftTop.top) |
2879 aSelect.Add(i); | 2840 aSelect.push_back(i); |
2880 } | 2841 } |
| 2842 for (int i = 0; i < aSelect.size(); ++i) |
| 2843 m_Annots.push_back(sa[aSelect[i]]); |
2881 | 2844 |
2882 for (int i = 0, sz = aSelect.GetSize(); i < sz; ++i) | 2845 for (int i = aSelect.size() - 1; i >= 0; --i) |
2883 m_Annots.Add(sa[aSelect[i]]); | 2846 sa.erase(sa.begin() + aSelect[i]); |
2884 | |
2885 for (int i = aSelect.GetSize() - 1; i >= 0; --i) | |
2886 sa.RemoveAt(aSelect[i]); | |
2887 | |
2888 aSelect.RemoveAll(); | |
2889 } | 2847 } |
2890 } | 2848 } |
2891 sa.RemoveAll(); | 2849 } break; |
2892 break; | 2850 case COLUMN: { |
2893 } | 2851 std::vector<CPDFSDK_Annot*> sa; |
2894 case BAI_COLUMN: { | |
2895 CPDFSDK_SortAnnots sa; | |
2896 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { | 2852 for (size_t i = 0; i < m_pPageView->CountAnnots(); ++i) { |
2897 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); | 2853 CPDFSDK_Annot* pAnnot = m_pPageView->GetAnnot(i); |
2898 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) | 2854 if (pAnnot->GetType() == m_sType && pAnnot->GetSubType() == m_sSubType) |
2899 sa.Add(pAnnot); | 2855 sa.push_back(pAnnot); |
2900 } | 2856 } |
2901 | 2857 |
2902 if (sa.GetSize() > 0) | 2858 std::sort(sa.begin(), sa.end(), CompareByTopDescending); |
2903 sa.Sort(CBA_AnnotIterator::CompareByTop, FALSE); | 2859 while (!sa.empty()) { |
2904 | |
2905 while (sa.GetSize() > 0) { | |
2906 int nLeftTopIndex = -1; | 2860 int nLeftTopIndex = -1; |
2907 FX_FLOAT fLeft = -1.0f; | 2861 FX_FLOAT fLeft = -1.0f; |
2908 | 2862 for (int i = sa.size() - 1; i >= 0; --i) { |
2909 for (int i = sa.GetSize() - 1; i >= 0; --i) { | 2863 CPDF_Rect rcAnnot = GetAnnotRect(sa[i]); |
2910 CPDFSDK_Annot* pAnnot = sa.GetAt(i); | |
2911 ASSERT(pAnnot); | |
2912 | |
2913 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); | |
2914 | |
2915 if (fLeft < 0) { | 2864 if (fLeft < 0) { |
2916 nLeftTopIndex = 0; | 2865 nLeftTopIndex = 0; |
2917 fLeft = rcAnnot.left; | 2866 fLeft = rcAnnot.left; |
2918 } else if (rcAnnot.left < fLeft) { | 2867 } else if (rcAnnot.left < fLeft) { |
2919 nLeftTopIndex = i; | 2868 nLeftTopIndex = i; |
2920 fLeft = rcAnnot.left; | 2869 fLeft = rcAnnot.left; |
2921 } | 2870 } |
2922 } | 2871 } |
2923 | 2872 |
2924 if (nLeftTopIndex >= 0) { | 2873 if (nLeftTopIndex >= 0) { |
2925 CPDFSDK_Annot* pLeftTopAnnot = sa.GetAt(nLeftTopIndex); | 2874 CPDFSDK_Annot* pLeftTopAnnot = sa[nLeftTopIndex]; |
2926 ASSERT(pLeftTopAnnot); | 2875 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); |
| 2876 m_Annots.push_back(pLeftTopAnnot); |
| 2877 sa.erase(sa.begin() + nLeftTopIndex); |
2927 | 2878 |
2928 CPDF_Rect rcLeftTop = GetAnnotRect(pLeftTopAnnot); | 2879 std::vector<int> aSelect; |
2929 | 2880 for (int i = 0; i < sa.size(); ++i) { |
2930 m_Annots.Add(pLeftTopAnnot); | 2881 CPDF_Rect rcAnnot = GetAnnotRect(sa[i]); |
2931 sa.RemoveAt(nLeftTopIndex); | |
2932 | |
2933 CFX_ArrayTemplate<int> aSelect; | |
2934 for (int i = 0, sz = sa.GetSize(); i < sz; ++i) { | |
2935 CPDFSDK_Annot* pAnnot = sa.GetAt(i); | |
2936 ASSERT(pAnnot); | |
2937 | |
2938 CPDF_Rect rcAnnot = GetAnnotRect(pAnnot); | |
2939 FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f; | 2882 FX_FLOAT fCenterX = (rcAnnot.left + rcAnnot.right) / 2.0f; |
2940 if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right) | 2883 if (fCenterX > rcLeftTop.left && fCenterX < rcLeftTop.right) |
2941 aSelect.Add(i); | 2884 aSelect.push_back(i); |
2942 } | 2885 } |
| 2886 for (int i = 0; i < aSelect.size(); ++i) |
| 2887 m_Annots.push_back(sa[aSelect[i]]); |
2943 | 2888 |
2944 for (int i = 0, sz = aSelect.GetSize(); i < sz; ++i) | 2889 for (int i = aSelect.size() - 1; i >= 0; --i) |
2945 m_Annots.Add(sa[aSelect[i]]); | 2890 sa.erase(sa.begin() + aSelect[i]); |
2946 | |
2947 for (int i = aSelect.GetSize() - 1; i >= 0; --i) | |
2948 sa.RemoveAt(aSelect[i]); | |
2949 | |
2950 aSelect.RemoveAll(); | |
2951 } | 2891 } |
2952 } | 2892 } |
2953 sa.RemoveAll(); | |
2954 break; | 2893 break; |
2955 } | 2894 } |
2956 } | 2895 } |
2957 } | 2896 } |
2958 | 2897 |
2959 CPDF_Rect CBA_AnnotIterator::GetAnnotRect(CPDFSDK_Annot* pAnnot) { | 2898 CPDF_Rect CBA_AnnotIterator::GetAnnotRect(const CPDFSDK_Annot* pAnnot) { |
2960 CPDF_Rect rcAnnot; | 2899 CPDF_Rect rcAnnot; |
2961 pAnnot->GetPDFAnnot()->GetRect(rcAnnot); | 2900 pAnnot->GetPDFAnnot()->GetRect(rcAnnot); |
2962 return rcAnnot; | 2901 return rcAnnot; |
2963 } | 2902 } |
OLD | NEW |