blob: 7ea301c0e43fea5e016bd049ba1afe9e12ec11f3 [file] [log] [blame]
jaepark98e10192016-08-15 10:51:11 -07001// Copyright 2016 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
dsinclair114e46a2016-09-29 17:18:21 -07007#include "fpdfsdk/cpdfsdk_annothandlermgr.h"
jaepark98e10192016-08-15 10:51:11 -07008
tsepez0e606b52016-11-18 16:22:41 -08009#include "core/fpdfapi/parser/cpdf_number.h"
10#include "core/fpdfapi/parser/cpdf_string.h"
dsinclair1727aee2016-09-29 13:12:56 -070011#include "core/fpdfdoc/cpdf_annot.h"
dsinclair114e46a2016-09-29 17:18:21 -070012#include "fpdfsdk/cba_annotiterator.h"
13#include "fpdfsdk/cpdfsdk_annot.h"
14#include "fpdfsdk/cpdfsdk_baannot.h"
15#include "fpdfsdk/cpdfsdk_baannothandler.h"
16#include "fpdfsdk/cpdfsdk_datetime.h"
dsinclair735606d2016-10-05 15:47:02 -070017#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
dsinclair114e46a2016-09-29 17:18:21 -070018#include "fpdfsdk/cpdfsdk_pageview.h"
19#include "fpdfsdk/cpdfsdk_widgethandler.h"
Tom Sepezfe91c6c2017-05-16 15:33:20 -070020#include "third_party/base/ptr_util.h"
jaepark98e10192016-08-15 10:51:11 -070021
22#ifdef PDF_ENABLE_XFA
dsinclair114e46a2016-09-29 17:18:21 -070023#include "fpdfsdk/cpdfsdk_xfawidgethandler.h"
dsinclair4d29e782016-10-04 14:02:47 -070024#include "fpdfsdk/fpdfxfa/cpdfxfa_page.h"
Dan Sinclair80c48782017-03-23 12:11:20 -040025#include "xfa/fxfa/cxfa_ffpageview.h"
26#include "xfa/fxfa/cxfa_ffwidget.h"
jaepark98e10192016-08-15 10:51:11 -070027#endif // PDF_ENABLE_XFA
28
dsinclair735606d2016-10-05 15:47:02 -070029CPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr(
dsinclair8779fa82016-10-12 12:05:44 -070030 CPDFSDK_FormFillEnvironment* pFormFillEnv)
Tom Sepezfe91c6c2017-05-16 15:33:20 -070031 : m_pBAAnnotHandler(pdfium::MakeUnique<CPDFSDK_BAAnnotHandler>()),
32 m_pWidgetHandler(pdfium::MakeUnique<CPDFSDK_WidgetHandler>(pFormFillEnv)),
jaepark98e10192016-08-15 10:51:11 -070033#ifdef PDF_ENABLE_XFA
Tom Sepezfe91c6c2017-05-16 15:33:20 -070034 m_pXFAWidgetHandler(
35 pdfium::MakeUnique<CPDFSDK_XFAWidgetHandler>(pFormFillEnv)),
jaepark98e10192016-08-15 10:51:11 -070036#endif // PDF_ENABLE_XFA
dsinclair8779fa82016-10-12 12:05:44 -070037 m_pFormFillEnv(pFormFillEnv) {
38 m_pWidgetHandler->SetFormFiller(m_pFormFillEnv->GetInteractiveFormFiller());
jaepark98e10192016-08-15 10:51:11 -070039}
40
41CPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr() {}
42
jaepark98e10192016-08-15 10:51:11 -070043CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot* pAnnot,
44 CPDFSDK_PageView* pPageView) {
45 ASSERT(pPageView);
jaepark35512aa2016-08-29 17:15:08 -070046 return GetAnnotHandler(pAnnot->GetSubtype())->NewAnnot(pAnnot, pPageView);
jaepark98e10192016-08-15 10:51:11 -070047}
48
49#ifdef PDF_ENABLE_XFA
50CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CXFA_FFWidget* pAnnot,
51 CPDFSDK_PageView* pPageView) {
52 ASSERT(pAnnot);
53 ASSERT(pPageView);
54
jaepark956553e2016-08-31 06:49:27 -070055 return GetAnnotHandler(CPDF_Annot::Subtype::XFAWIDGET)
56 ->NewAnnot(pAnnot, pPageView);
jaepark98e10192016-08-15 10:51:11 -070057}
58#endif // PDF_ENABLE_XFA
59
60void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot) {
jaepark35512aa2016-08-29 17:15:08 -070061 IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -070062 pAnnotHandler->ReleaseAnnot(pAnnot);
jaepark98e10192016-08-15 10:51:11 -070063}
64
65void CPDFSDK_AnnotHandlerMgr::Annot_OnCreate(CPDFSDK_Annot* pAnnot) {
66 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
67
68 CPDFSDK_DateTime curTime;
tsepez0e606b52016-11-18 16:22:41 -080069 pPDFAnnot->GetAnnotDict()->SetNewFor<CPDF_String>(
70 "M", curTime.ToPDFDateTimeString(), false);
71 pPDFAnnot->GetAnnotDict()->SetNewFor<CPDF_Number>("F", 0);
jaepark98e10192016-08-15 10:51:11 -070072}
73
74void CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot) {
75 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -070076 GetAnnotHandler(pAnnot)->OnLoad(pAnnot);
jaepark98e10192016-08-15 10:51:11 -070077}
78
79IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(
80 CPDFSDK_Annot* pAnnot) const {
jaepark35512aa2016-08-29 17:15:08 -070081 return GetAnnotHandler(pAnnot->GetAnnotSubtype());
jaepark98e10192016-08-15 10:51:11 -070082}
83
84IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(
jaepark956553e2016-08-31 06:49:27 -070085 CPDF_Annot::Subtype nAnnotSubtype) const {
86 if (nAnnotSubtype == CPDF_Annot::Subtype::WIDGET)
jaepark8c541822016-08-30 13:43:05 -070087 return m_pWidgetHandler.get();
jaepark35512aa2016-08-29 17:15:08 -070088
89#ifdef PDF_ENABLE_XFA
jaepark956553e2016-08-31 06:49:27 -070090 if (nAnnotSubtype == CPDF_Annot::Subtype::XFAWIDGET)
jaepark8c541822016-08-30 13:43:05 -070091 return m_pXFAWidgetHandler.get();
jaepark35512aa2016-08-29 17:15:08 -070092#endif // PDF_ENABLE_XFA
93
94 return m_pBAAnnotHandler.get();
jaepark98e10192016-08-15 10:51:11 -070095}
96
97void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView,
98 CPDFSDK_Annot* pAnnot,
99 CFX_RenderDevice* pDevice,
jaepark75f84a52016-09-09 15:39:09 -0700100 CFX_Matrix* pUser2Device,
101 bool bDrawAnnots) {
jaepark98e10192016-08-15 10:51:11 -0700102 ASSERT(pAnnot);
jaepark75f84a52016-09-09 15:39:09 -0700103 GetAnnotHandler(pAnnot)->OnDraw(pPageView, pAnnot, pDevice, pUser2Device,
104 bDrawAnnots);
jaepark98e10192016-08-15 10:51:11 -0700105}
106
tsepez4cf55152016-11-02 14:37:54 -0700107bool CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown(
jaepark98e10192016-08-15 10:51:11 -0700108 CPDFSDK_PageView* pPageView,
tsepezf8074ce2016-09-27 14:29:57 -0700109 CPDFSDK_Annot::ObservedPtr* pAnnot,
jaepark98e10192016-08-15 10:51:11 -0700110 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500111 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700112 ASSERT(*pAnnot);
113 return GetAnnotHandler(pAnnot->Get())
114 ->OnLButtonDown(pPageView, pAnnot, nFlags, point);
jaepark98e10192016-08-15 10:51:11 -0700115}
116
tsepez4cf55152016-11-02 14:37:54 -0700117bool CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonUp(
jaepark98e10192016-08-15 10:51:11 -0700118 CPDFSDK_PageView* pPageView,
tsepezf8074ce2016-09-27 14:29:57 -0700119 CPDFSDK_Annot::ObservedPtr* pAnnot,
jaepark98e10192016-08-15 10:51:11 -0700120 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500121 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700122 ASSERT(*pAnnot);
123 return GetAnnotHandler(pAnnot->Get())
124 ->OnLButtonUp(pPageView, pAnnot, nFlags, point);
jaepark98e10192016-08-15 10:51:11 -0700125}
126
tsepez4cf55152016-11-02 14:37:54 -0700127bool CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDblClk(
jaepark98e10192016-08-15 10:51:11 -0700128 CPDFSDK_PageView* pPageView,
tsepezf8074ce2016-09-27 14:29:57 -0700129 CPDFSDK_Annot::ObservedPtr* pAnnot,
jaepark98e10192016-08-15 10:51:11 -0700130 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500131 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700132 ASSERT(*pAnnot);
133 return GetAnnotHandler(pAnnot->Get())
134 ->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
jaepark98e10192016-08-15 10:51:11 -0700135}
136
tsepez4cf55152016-11-02 14:37:54 -0700137bool CPDFSDK_AnnotHandlerMgr::Annot_OnMouseMove(
jaepark98e10192016-08-15 10:51:11 -0700138 CPDFSDK_PageView* pPageView,
tsepezf8074ce2016-09-27 14:29:57 -0700139 CPDFSDK_Annot::ObservedPtr* pAnnot,
jaepark98e10192016-08-15 10:51:11 -0700140 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500141 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700142 ASSERT(*pAnnot);
143 return GetAnnotHandler(pAnnot->Get())
144 ->OnMouseMove(pPageView, pAnnot, nFlags, point);
jaepark98e10192016-08-15 10:51:11 -0700145}
146
tsepez4cf55152016-11-02 14:37:54 -0700147bool CPDFSDK_AnnotHandlerMgr::Annot_OnMouseWheel(
jaepark98e10192016-08-15 10:51:11 -0700148 CPDFSDK_PageView* pPageView,
tsepezf8074ce2016-09-27 14:29:57 -0700149 CPDFSDK_Annot::ObservedPtr* pAnnot,
jaepark98e10192016-08-15 10:51:11 -0700150 uint32_t nFlags,
151 short zDelta,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500152 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700153 ASSERT(*pAnnot);
154 return GetAnnotHandler(pAnnot->Get())
155 ->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, point);
jaepark98e10192016-08-15 10:51:11 -0700156}
157
tsepez4cf55152016-11-02 14:37:54 -0700158bool CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonDown(
jaepark98e10192016-08-15 10:51:11 -0700159 CPDFSDK_PageView* pPageView,
tsepezf8074ce2016-09-27 14:29:57 -0700160 CPDFSDK_Annot::ObservedPtr* pAnnot,
jaepark98e10192016-08-15 10:51:11 -0700161 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500162 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700163 ASSERT(*pAnnot);
164 return GetAnnotHandler(pAnnot->Get())
165 ->OnRButtonDown(pPageView, pAnnot, nFlags, point);
jaepark98e10192016-08-15 10:51:11 -0700166}
167
tsepez4cf55152016-11-02 14:37:54 -0700168bool CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonUp(
jaepark98e10192016-08-15 10:51:11 -0700169 CPDFSDK_PageView* pPageView,
tsepezf8074ce2016-09-27 14:29:57 -0700170 CPDFSDK_Annot::ObservedPtr* pAnnot,
jaepark98e10192016-08-15 10:51:11 -0700171 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500172 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700173 ASSERT(*pAnnot);
174 return GetAnnotHandler(pAnnot->Get())
175 ->OnRButtonUp(pPageView, pAnnot, nFlags, point);
jaepark98e10192016-08-15 10:51:11 -0700176}
177
tsepezf8074ce2016-09-27 14:29:57 -0700178void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseEnter(
179 CPDFSDK_PageView* pPageView,
180 CPDFSDK_Annot::ObservedPtr* pAnnot,
181 uint32_t nFlag) {
182 ASSERT(*pAnnot);
183 GetAnnotHandler(pAnnot->Get())->OnMouseEnter(pPageView, pAnnot, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700184}
185
tsepezf8074ce2016-09-27 14:29:57 -0700186void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit(
187 CPDFSDK_PageView* pPageView,
188 CPDFSDK_Annot::ObservedPtr* pAnnot,
189 uint32_t nFlag) {
190 ASSERT(*pAnnot);
191 GetAnnotHandler(pAnnot->Get())->OnMouseExit(pPageView, pAnnot, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700192}
193
tsepez4cf55152016-11-02 14:37:54 -0700194bool CPDFSDK_AnnotHandlerMgr::Annot_OnChar(CPDFSDK_Annot* pAnnot,
195 uint32_t nChar,
196 uint32_t nFlags) {
jaepark35512aa2016-08-29 17:15:08 -0700197 return GetAnnotHandler(pAnnot)->OnChar(pAnnot, nChar, nFlags);
jaepark98e10192016-08-15 10:51:11 -0700198}
199
tsepez4cf55152016-11-02 14:37:54 -0700200bool CPDFSDK_AnnotHandlerMgr::Annot_OnKeyDown(CPDFSDK_Annot* pAnnot,
201 int nKeyCode,
202 int nFlag) {
dsinclair8779fa82016-10-12 12:05:44 -0700203 if (m_pFormFillEnv->IsCTRLKeyDown(nFlag) ||
thestig7b3252f2016-11-08 21:30:11 -0800204 m_pFormFillEnv->IsALTKeyDown(nFlag)) {
jaepark35512aa2016-08-29 17:15:08 -0700205 return GetAnnotHandler(pAnnot)->OnKeyDown(pAnnot, nKeyCode, nFlag);
thestig7b3252f2016-11-08 21:30:11 -0800206 }
jaepark98e10192016-08-15 10:51:11 -0700207
jaepark35512aa2016-08-29 17:15:08 -0700208 CPDFSDK_PageView* pPage = pAnnot->GetPageView();
209 CPDFSDK_Annot* pFocusAnnot = pPage->GetFocusAnnot();
210 if (pFocusAnnot && (nKeyCode == FWL_VKEY_Tab)) {
tsepezf8074ce2016-09-27 14:29:57 -0700211 CPDFSDK_Annot::ObservedPtr pNext(
dsinclair8779fa82016-10-12 12:05:44 -0700212 GetNextAnnot(pFocusAnnot, !m_pFormFillEnv->IsSHIFTKeyDown(nFlag)));
tsepezf8074ce2016-09-27 14:29:57 -0700213 if (pNext && pNext.Get() != pFocusAnnot) {
dsinclair7cbe68e2016-10-12 11:56:23 -0700214 pPage->GetFormFillEnv()->SetFocusAnnot(&pNext);
tsepez4cf55152016-11-02 14:37:54 -0700215 return true;
jaepark98e10192016-08-15 10:51:11 -0700216 }
217 }
218
thestig7b3252f2016-11-08 21:30:11 -0800219 return GetAnnotHandler(pAnnot)->OnKeyDown(pAnnot, nKeyCode, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700220}
221
tsepez4cf55152016-11-02 14:37:54 -0700222bool CPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot,
223 int nKeyCode,
224 int nFlag) {
225 return false;
jaepark98e10192016-08-15 10:51:11 -0700226}
227
tsepez4cf55152016-11-02 14:37:54 -0700228bool CPDFSDK_AnnotHandlerMgr::Annot_OnSetFocus(
tsepezf8074ce2016-09-27 14:29:57 -0700229 CPDFSDK_Annot::ObservedPtr* pAnnot,
230 uint32_t nFlag) {
231 ASSERT(*pAnnot);
dsinclairb402b172016-10-11 09:26:32 -0700232 return GetAnnotHandler(pAnnot->Get())->OnSetFocus(pAnnot, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700233}
234
tsepez4cf55152016-11-02 14:37:54 -0700235bool CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(
tsepezf8074ce2016-09-27 14:29:57 -0700236 CPDFSDK_Annot::ObservedPtr* pAnnot,
237 uint32_t nFlag) {
238 ASSERT(*pAnnot);
239 return GetAnnotHandler(pAnnot->Get())->OnKillFocus(pAnnot, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700240}
241
242#ifdef PDF_ENABLE_XFA
tsepez4cf55152016-11-02 14:37:54 -0700243bool CPDFSDK_AnnotHandlerMgr::Annot_OnChangeFocus(
tsepezf8074ce2016-09-27 14:29:57 -0700244 CPDFSDK_Annot::ObservedPtr* pSetAnnot,
245 CPDFSDK_Annot::ObservedPtr* pKillAnnot) {
tsepez4cf55152016-11-02 14:37:54 -0700246 bool bXFA = (*pSetAnnot && (*pSetAnnot)->GetXFAWidget()) ||
247 (*pKillAnnot && (*pKillAnnot)->GetXFAWidget());
jaepark98e10192016-08-15 10:51:11 -0700248
249 if (bXFA) {
250 if (IPDFSDK_AnnotHandler* pXFAAnnotHandler =
jaepark956553e2016-08-31 06:49:27 -0700251 GetAnnotHandler(CPDF_Annot::Subtype::XFAWIDGET))
jaepark98e10192016-08-15 10:51:11 -0700252 return pXFAAnnotHandler->OnXFAChangedFocus(pKillAnnot, pSetAnnot);
253 }
254
tsepez4cf55152016-11-02 14:37:54 -0700255 return true;
jaepark98e10192016-08-15 10:51:11 -0700256}
257#endif // PDF_ENABLE_XFA
258
259CFX_FloatRect CPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox(
260 CPDFSDK_PageView* pPageView,
261 CPDFSDK_Annot* pAnnot) {
262 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700263 return GetAnnotHandler(pAnnot)->GetViewBBox(pPageView, pAnnot);
jaepark98e10192016-08-15 10:51:11 -0700264}
265
tsepez4cf55152016-11-02 14:37:54 -0700266bool CPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView* pPageView,
267 CPDFSDK_Annot* pAnnot,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500268 const CFX_PointF& point) {
jaepark98e10192016-08-15 10:51:11 -0700269 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700270 IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot);
271 if (pAnnotHandler->CanAnswer(pAnnot))
272 return pAnnotHandler->HitTest(pPageView, pAnnot, point);
273
tsepez4cf55152016-11-02 14:37:54 -0700274 return false;
jaepark98e10192016-08-15 10:51:11 -0700275}
276
277CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,
tsepez4cf55152016-11-02 14:37:54 -0700278 bool bNext) {
jaepark98e10192016-08-15 10:51:11 -0700279#ifdef PDF_ENABLE_XFA
280 CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView();
281 CPDFXFA_Page* pPage = pPageView->GetPDFXFAPage();
282 if (!pPage)
283 return nullptr;
284 if (pPage->GetPDFPage()) { // for pdf annots.
jaepark9ed91372016-08-26 16:16:10 -0700285 CBA_AnnotIterator ai(pSDKAnnot->GetPageView(),
286 pSDKAnnot->GetAnnotSubtype());
jaepark98e10192016-08-15 10:51:11 -0700287 CPDFSDK_Annot* pNext =
288 bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot);
289 return pNext;
290 }
291 // for xfa annots
292 std::unique_ptr<IXFA_WidgetIterator> pWidgetIterator(
293 pPage->GetXFAPageView()->CreateWidgetIterator(
294 XFA_TRAVERSEWAY_Tranvalse, XFA_WidgetStatus_Visible |
295 XFA_WidgetStatus_Viewable |
296 XFA_WidgetStatus_Focused));
297 if (!pWidgetIterator)
298 return nullptr;
299 if (pWidgetIterator->GetCurrentWidget() != pSDKAnnot->GetXFAWidget())
300 pWidgetIterator->SetCurrentWidget(pSDKAnnot->GetXFAWidget());
301 CXFA_FFWidget* hNextFocus =
302 bNext ? pWidgetIterator->MoveToNext() : pWidgetIterator->MoveToPrevious();
303 if (!hNextFocus && pSDKAnnot)
304 hNextFocus = pWidgetIterator->MoveToFirst();
305
306 return pPageView->GetAnnotByXFAWidget(hNextFocus);
307#else // PDF_ENABLE_XFA
jaepark956553e2016-08-31 06:49:27 -0700308 CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), CPDF_Annot::Subtype::WIDGET);
jaepark98e10192016-08-15 10:51:11 -0700309 return bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot);
310#endif // PDF_ENABLE_XFA
311}