blob: e7744bfa46c0fc26b3775f8c99095da5c95e01ec [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
7#include "fpdfsdk/include/cpdfsdk_annothandlermgr.h"
8
9#include "core/fpdfdoc/include/cpdf_annot.h"
jaepark611adb82016-08-17 11:34:36 -070010#include "fpdfsdk/include/cba_annotiterator.h"
jaepark98e10192016-08-15 10:51:11 -070011#include "fpdfsdk/include/cpdfsdk_annot.h"
12#include "fpdfsdk/include/cpdfsdk_baannot.h"
13#include "fpdfsdk/include/cpdfsdk_bfannothandler.h"
14#include "fpdfsdk/include/cpdfsdk_datetime.h"
15#include "fpdfsdk/include/fsdk_mgr.h"
16
17#ifdef PDF_ENABLE_XFA
18#include "fpdfsdk/include/cpdfsdk_xfaannothandler.h"
19#include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h"
20#include "xfa/fxfa/include/xfa_ffpageview.h"
21#include "xfa/fxfa/include/xfa_ffwidget.h"
22#endif // PDF_ENABLE_XFA
23
24CPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp) {
25 m_pApp = pApp;
26
27 CPDFSDK_BFAnnotHandler* pHandler = new CPDFSDK_BFAnnotHandler(m_pApp);
28 pHandler->SetFormFiller(m_pApp->GetIFormFiller());
29 RegisterAnnotHandler(pHandler);
30#ifdef PDF_ENABLE_XFA
31 CPDFSDK_XFAAnnotHandler* pXFAAnnotHandler =
32 new CPDFSDK_XFAAnnotHandler(m_pApp);
33 RegisterAnnotHandler(pXFAAnnotHandler);
34#endif // PDF_ENABLE_XFA
35}
36
37CPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr() {}
38
39void CPDFSDK_AnnotHandlerMgr::RegisterAnnotHandler(
40 IPDFSDK_AnnotHandler* pAnnotHandler) {
41 ASSERT(!GetAnnotHandler(pAnnotHandler->GetType()));
42
43 m_mapType2Handler[pAnnotHandler->GetType()].reset(pAnnotHandler);
44}
45
46void CPDFSDK_AnnotHandlerMgr::UnRegisterAnnotHandler(
47 IPDFSDK_AnnotHandler* pAnnotHandler) {
48 m_mapType2Handler.erase(pAnnotHandler->GetType());
49}
50
51CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot* pAnnot,
52 CPDFSDK_PageView* pPageView) {
53 ASSERT(pPageView);
54
55 if (IPDFSDK_AnnotHandler* pAnnotHandler =
jaepark9ed91372016-08-26 16:16:10 -070056 GetAnnotHandler(pAnnot->GetSubtype())) {
jaepark98e10192016-08-15 10:51:11 -070057 return pAnnotHandler->NewAnnot(pAnnot, pPageView);
58 }
59
60 return new CPDFSDK_BAAnnot(pAnnot, pPageView);
61}
62
63#ifdef PDF_ENABLE_XFA
64CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CXFA_FFWidget* pAnnot,
65 CPDFSDK_PageView* pPageView) {
66 ASSERT(pAnnot);
67 ASSERT(pPageView);
68
69 if (IPDFSDK_AnnotHandler* pAnnotHandler =
70 GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME)) {
71 return pAnnotHandler->NewAnnot(pAnnot, pPageView);
72 }
73
74 return nullptr;
75}
76#endif // PDF_ENABLE_XFA
77
78void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot) {
79 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
80 pAnnotHandler->OnRelease(pAnnot);
81 pAnnotHandler->ReleaseAnnot(pAnnot);
82 } else {
83 delete pAnnot;
84 }
85}
86
87void CPDFSDK_AnnotHandlerMgr::Annot_OnCreate(CPDFSDK_Annot* pAnnot) {
88 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
89
90 CPDFSDK_DateTime curTime;
91 pPDFAnnot->GetAnnotDict()->SetAtString("M", curTime.ToPDFDateTimeString());
92 pPDFAnnot->GetAnnotDict()->SetAtNumber("F", 0);
93
94 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
95 pAnnotHandler->OnCreate(pAnnot);
96}
97
98void CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot) {
99 ASSERT(pAnnot);
100
101 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
102 pAnnotHandler->OnLoad(pAnnot);
103}
104
105IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(
106 CPDFSDK_Annot* pAnnot) const {
107 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
108 if (pPDFAnnot)
jaepark9ed91372016-08-26 16:16:10 -0700109 return GetAnnotHandler(pPDFAnnot->GetSubtype());
jaepark98e10192016-08-15 10:51:11 -0700110#ifdef PDF_ENABLE_XFA
111 if (pAnnot->GetXFAWidget())
112 return GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME);
113#endif // PDF_ENABLE_XFA
114 return nullptr;
115}
116
117IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(
118 const CFX_ByteString& sType) const {
119 auto it = m_mapType2Handler.find(sType);
120 return it != m_mapType2Handler.end() ? it->second.get() : nullptr;
121}
122
123void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView,
124 CPDFSDK_Annot* pAnnot,
125 CFX_RenderDevice* pDevice,
126 CFX_Matrix* pUser2Device,
127 uint32_t dwFlags) {
128 ASSERT(pAnnot);
129
130 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
131 pAnnotHandler->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
132 } else {
133#ifdef PDF_ENABLE_XFA
134 if (pAnnot->IsXFAField())
135 return;
136#endif // PDF_ENABLE_XFA
137 static_cast<CPDFSDK_BAAnnot*>(pAnnot)->DrawAppearance(
138 pDevice, pUser2Device, CPDF_Annot::Normal, nullptr);
139 }
140}
141
142FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown(
143 CPDFSDK_PageView* pPageView,
144 CPDFSDK_Annot* pAnnot,
145 uint32_t nFlags,
146 const CFX_FloatPoint& point) {
147 ASSERT(pAnnot);
148
149 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
150 return pAnnotHandler->OnLButtonDown(pPageView, pAnnot, nFlags, point);
151
152 return FALSE;
153}
154
155FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonUp(
156 CPDFSDK_PageView* pPageView,
157 CPDFSDK_Annot* pAnnot,
158 uint32_t nFlags,
159 const CFX_FloatPoint& point) {
160 ASSERT(pAnnot);
161
162 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
163 return pAnnotHandler->OnLButtonUp(pPageView, pAnnot, nFlags, point);
164
165 return FALSE;
166}
167
168FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDblClk(
169 CPDFSDK_PageView* pPageView,
170 CPDFSDK_Annot* pAnnot,
171 uint32_t nFlags,
172 const CFX_FloatPoint& point) {
173 ASSERT(pAnnot);
174
175 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
176 return pAnnotHandler->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
177
178 return FALSE;
179}
180
181FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseMove(
182 CPDFSDK_PageView* pPageView,
183 CPDFSDK_Annot* pAnnot,
184 uint32_t nFlags,
185 const CFX_FloatPoint& point) {
186 ASSERT(pAnnot);
187
188 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
189 return pAnnotHandler->OnMouseMove(pPageView, pAnnot, nFlags, point);
190
191 return FALSE;
192}
193
194FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseWheel(
195 CPDFSDK_PageView* pPageView,
196 CPDFSDK_Annot* pAnnot,
197 uint32_t nFlags,
198 short zDelta,
199 const CFX_FloatPoint& point) {
200 ASSERT(pAnnot);
201
202 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
203 return pAnnotHandler->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta,
204 point);
205 }
206 return FALSE;
207}
208
209FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonDown(
210 CPDFSDK_PageView* pPageView,
211 CPDFSDK_Annot* pAnnot,
212 uint32_t nFlags,
213 const CFX_FloatPoint& point) {
214 ASSERT(pAnnot);
215
216 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
217 return pAnnotHandler->OnRButtonDown(pPageView, pAnnot, nFlags, point);
218
219 return FALSE;
220}
221
222FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonUp(
223 CPDFSDK_PageView* pPageView,
224 CPDFSDK_Annot* pAnnot,
225 uint32_t nFlags,
226 const CFX_FloatPoint& point) {
227 ASSERT(pAnnot);
228
229 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
230 return pAnnotHandler->OnRButtonUp(pPageView, pAnnot, nFlags, point);
231
232 return FALSE;
233}
234
235void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseEnter(CPDFSDK_PageView* pPageView,
236 CPDFSDK_Annot* pAnnot,
237 uint32_t nFlag) {
238 ASSERT(pAnnot);
239
240 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
241 pAnnotHandler->OnMouseEnter(pPageView, pAnnot, nFlag);
242}
243
244void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit(CPDFSDK_PageView* pPageView,
245 CPDFSDK_Annot* pAnnot,
246 uint32_t nFlag) {
247 ASSERT(pAnnot);
248
249 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
250 pAnnotHandler->OnMouseExit(pPageView, pAnnot, nFlag);
251}
252
253FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChar(CPDFSDK_Annot* pAnnot,
254 uint32_t nChar,
255 uint32_t nFlags) {
256 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
257 return pAnnotHandler->OnChar(pAnnot, nChar, nFlags);
258
259 return FALSE;
260}
261
262FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyDown(CPDFSDK_Annot* pAnnot,
263 int nKeyCode,
264 int nFlag) {
265 if (!m_pApp->FFI_IsCTRLKeyDown(nFlag) && !m_pApp->FFI_IsALTKeyDown(nFlag)) {
266 CPDFSDK_PageView* pPage = pAnnot->GetPageView();
267 CPDFSDK_Annot* pFocusAnnot = pPage->GetFocusAnnot();
268 if (pFocusAnnot && (nKeyCode == FWL_VKEY_Tab)) {
269 CPDFSDK_Annot* pNext =
270 GetNextAnnot(pFocusAnnot, !m_pApp->FFI_IsSHIFTKeyDown(nFlag));
271
272 if (pNext && pNext != pFocusAnnot) {
273 CPDFSDK_Document* pDocument = pPage->GetSDKDocument();
274 pDocument->SetFocusAnnot(pNext);
275 return TRUE;
276 }
277 }
278 }
279
280 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
281 return pAnnotHandler->OnKeyDown(pAnnot, nKeyCode, nFlag);
282
283 return FALSE;
284}
285
286FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot,
287 int nKeyCode,
288 int nFlag) {
289 return FALSE;
290}
291
292FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnSetFocus(CPDFSDK_Annot* pAnnot,
293 uint32_t nFlag) {
294 ASSERT(pAnnot);
295
296 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
297 if (pAnnotHandler->OnSetFocus(pAnnot, nFlag)) {
298 CPDFSDK_PageView* pPage = pAnnot->GetPageView();
299 pPage->GetSDKDocument();
300 return TRUE;
301 }
302 }
303 return FALSE;
304}
305
306FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot,
307 uint32_t nFlag) {
308 ASSERT(pAnnot);
309
310 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
311 return pAnnotHandler->OnKillFocus(pAnnot, nFlag);
312
313 return FALSE;
314}
315
316#ifdef PDF_ENABLE_XFA
317FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChangeFocus(
318 CPDFSDK_Annot* pSetAnnot,
319 CPDFSDK_Annot* pKillAnnot) {
320 FX_BOOL bXFA = (pSetAnnot && pSetAnnot->GetXFAWidget()) ||
321 (pKillAnnot && pKillAnnot->GetXFAWidget());
322
323 if (bXFA) {
324 if (IPDFSDK_AnnotHandler* pXFAAnnotHandler =
325 GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME))
326 return pXFAAnnotHandler->OnXFAChangedFocus(pKillAnnot, pSetAnnot);
327 }
328
329 return TRUE;
330}
331#endif // PDF_ENABLE_XFA
332
333CFX_FloatRect CPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox(
334 CPDFSDK_PageView* pPageView,
335 CPDFSDK_Annot* pAnnot) {
336 ASSERT(pAnnot);
337 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
338 return pAnnotHandler->GetViewBBox(pPageView, pAnnot);
339
340 return pAnnot->GetRect();
341}
342
343FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView* pPageView,
344 CPDFSDK_Annot* pAnnot,
345 const CFX_FloatPoint& point) {
346 ASSERT(pAnnot);
347 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) {
348 if (pAnnotHandler->CanAnswer(pAnnot))
349 return pAnnotHandler->HitTest(pPageView, pAnnot, point);
350 }
351 return FALSE;
352}
353
354CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,
355 FX_BOOL bNext) {
356#ifdef PDF_ENABLE_XFA
357 CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView();
358 CPDFXFA_Page* pPage = pPageView->GetPDFXFAPage();
359 if (!pPage)
360 return nullptr;
361 if (pPage->GetPDFPage()) { // for pdf annots.
jaepark9ed91372016-08-26 16:16:10 -0700362 CBA_AnnotIterator ai(pSDKAnnot->GetPageView(),
363 pSDKAnnot->GetAnnotSubtype());
jaepark98e10192016-08-15 10:51:11 -0700364 CPDFSDK_Annot* pNext =
365 bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot);
366 return pNext;
367 }
368 // for xfa annots
369 std::unique_ptr<IXFA_WidgetIterator> pWidgetIterator(
370 pPage->GetXFAPageView()->CreateWidgetIterator(
371 XFA_TRAVERSEWAY_Tranvalse, XFA_WidgetStatus_Visible |
372 XFA_WidgetStatus_Viewable |
373 XFA_WidgetStatus_Focused));
374 if (!pWidgetIterator)
375 return nullptr;
376 if (pWidgetIterator->GetCurrentWidget() != pSDKAnnot->GetXFAWidget())
377 pWidgetIterator->SetCurrentWidget(pSDKAnnot->GetXFAWidget());
378 CXFA_FFWidget* hNextFocus =
379 bNext ? pWidgetIterator->MoveToNext() : pWidgetIterator->MoveToPrevious();
380 if (!hNextFocus && pSDKAnnot)
381 hNextFocus = pWidgetIterator->MoveToFirst();
382
383 return pPageView->GetAnnotByXFAWidget(hNextFocus);
384#else // PDF_ENABLE_XFA
jaepark9ed91372016-08-26 16:16:10 -0700385 CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), "Widget");
jaepark98e10192016-08-15 10:51:11 -0700386 return bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot);
387#endif // PDF_ENABLE_XFA
388}