blob: f808b8412beae46687de44c4f27ae250b0dc3c61 [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"
jaepark35512aa2016-08-29 17:15:08 -070013#include "fpdfsdk/include/cpdfsdk_baannothandler.h"
jaepark98e10192016-08-15 10:51:11 -070014#include "fpdfsdk/include/cpdfsdk_datetime.h"
dsinclairf34518b2016-09-13 12:03:48 -070015#include "fpdfsdk/include/cpdfsdk_document.h"
dsinclair79db6092016-09-14 07:27:21 -070016#include "fpdfsdk/include/cpdfsdk_environment.h"
dsinclairf34518b2016-09-13 12:03:48 -070017#include "fpdfsdk/include/cpdfsdk_pageview.h"
jaepark8c541822016-08-30 13:43:05 -070018#include "fpdfsdk/include/cpdfsdk_widgethandler.h"
jaepark98e10192016-08-15 10:51:11 -070019
20#ifdef PDF_ENABLE_XFA
jaepark98e10192016-08-15 10:51:11 -070021#include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h"
dsinclair2ca2da52016-09-13 18:10:34 -070022#include "fpdfsdk/include/cpdfsdk_xfawidgethandler.h"
jaepark98e10192016-08-15 10:51:11 -070023#include "xfa/fxfa/include/xfa_ffpageview.h"
24#include "xfa/fxfa/include/xfa_ffwidget.h"
25#endif // PDF_ENABLE_XFA
26
dsinclair79db6092016-09-14 07:27:21 -070027CPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr(CPDFSDK_Environment* pApp)
jaepark35512aa2016-08-29 17:15:08 -070028 : m_pBAAnnotHandler(new CPDFSDK_BAAnnotHandler()),
jaepark8c541822016-08-30 13:43:05 -070029 m_pWidgetHandler(new CPDFSDK_WidgetHandler(pApp)),
jaepark98e10192016-08-15 10:51:11 -070030#ifdef PDF_ENABLE_XFA
jaepark8c541822016-08-30 13:43:05 -070031 m_pXFAWidgetHandler(new CPDFSDK_XFAWidgetHandler(pApp)),
jaepark98e10192016-08-15 10:51:11 -070032#endif // PDF_ENABLE_XFA
jaepark35512aa2016-08-29 17:15:08 -070033 m_pApp(pApp) {
jaepark8c541822016-08-30 13:43:05 -070034 m_pWidgetHandler->SetFormFiller(m_pApp->GetIFormFiller());
jaepark98e10192016-08-15 10:51:11 -070035}
36
37CPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr() {}
38
jaepark98e10192016-08-15 10:51:11 -070039CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot* pAnnot,
40 CPDFSDK_PageView* pPageView) {
41 ASSERT(pPageView);
jaepark35512aa2016-08-29 17:15:08 -070042 return GetAnnotHandler(pAnnot->GetSubtype())->NewAnnot(pAnnot, pPageView);
jaepark98e10192016-08-15 10:51:11 -070043}
44
45#ifdef PDF_ENABLE_XFA
46CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CXFA_FFWidget* pAnnot,
47 CPDFSDK_PageView* pPageView) {
48 ASSERT(pAnnot);
49 ASSERT(pPageView);
50
jaepark956553e2016-08-31 06:49:27 -070051 return GetAnnotHandler(CPDF_Annot::Subtype::XFAWIDGET)
52 ->NewAnnot(pAnnot, pPageView);
jaepark98e10192016-08-15 10:51:11 -070053}
54#endif // PDF_ENABLE_XFA
55
56void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot) {
jaepark35512aa2016-08-29 17:15:08 -070057 IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot);
58 pAnnotHandler->OnRelease(pAnnot);
59 pAnnotHandler->ReleaseAnnot(pAnnot);
jaepark98e10192016-08-15 10:51:11 -070060}
61
62void CPDFSDK_AnnotHandlerMgr::Annot_OnCreate(CPDFSDK_Annot* pAnnot) {
63 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
64
65 CPDFSDK_DateTime curTime;
dsinclair38fd8442016-09-15 10:15:32 -070066 pPDFAnnot->GetAnnotDict()->SetStringFor("M", curTime.ToPDFDateTimeString());
67 pPDFAnnot->GetAnnotDict()->SetNumberFor("F", 0);
jaepark98e10192016-08-15 10:51:11 -070068
jaepark35512aa2016-08-29 17:15:08 -070069 GetAnnotHandler(pAnnot)->OnCreate(pAnnot);
jaepark98e10192016-08-15 10:51:11 -070070}
71
72void CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot) {
73 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -070074 GetAnnotHandler(pAnnot)->OnLoad(pAnnot);
jaepark98e10192016-08-15 10:51:11 -070075}
76
77IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(
78 CPDFSDK_Annot* pAnnot) const {
jaepark35512aa2016-08-29 17:15:08 -070079 return GetAnnotHandler(pAnnot->GetAnnotSubtype());
jaepark98e10192016-08-15 10:51:11 -070080}
81
82IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(
jaepark956553e2016-08-31 06:49:27 -070083 CPDF_Annot::Subtype nAnnotSubtype) const {
84 if (nAnnotSubtype == CPDF_Annot::Subtype::WIDGET)
jaepark8c541822016-08-30 13:43:05 -070085 return m_pWidgetHandler.get();
jaepark35512aa2016-08-29 17:15:08 -070086
87#ifdef PDF_ENABLE_XFA
jaepark956553e2016-08-31 06:49:27 -070088 if (nAnnotSubtype == CPDF_Annot::Subtype::XFAWIDGET)
jaepark8c541822016-08-30 13:43:05 -070089 return m_pXFAWidgetHandler.get();
jaepark35512aa2016-08-29 17:15:08 -070090#endif // PDF_ENABLE_XFA
91
92 return m_pBAAnnotHandler.get();
jaepark98e10192016-08-15 10:51:11 -070093}
94
95void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView,
96 CPDFSDK_Annot* pAnnot,
97 CFX_RenderDevice* pDevice,
jaepark75f84a52016-09-09 15:39:09 -070098 CFX_Matrix* pUser2Device,
99 bool bDrawAnnots) {
jaepark98e10192016-08-15 10:51:11 -0700100 ASSERT(pAnnot);
jaepark75f84a52016-09-09 15:39:09 -0700101 GetAnnotHandler(pAnnot)->OnDraw(pPageView, pAnnot, pDevice, pUser2Device,
102 bDrawAnnots);
jaepark98e10192016-08-15 10:51:11 -0700103}
104
105FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown(
106 CPDFSDK_PageView* pPageView,
107 CPDFSDK_Annot* pAnnot,
108 uint32_t nFlags,
109 const CFX_FloatPoint& point) {
110 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700111 return GetAnnotHandler(pAnnot)->OnLButtonDown(pPageView, pAnnot, nFlags,
112 point);
jaepark98e10192016-08-15 10:51:11 -0700113}
114
115FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonUp(
116 CPDFSDK_PageView* pPageView,
117 CPDFSDK_Annot* pAnnot,
118 uint32_t nFlags,
119 const CFX_FloatPoint& point) {
120 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700121 return GetAnnotHandler(pAnnot)->OnLButtonUp(pPageView, pAnnot, nFlags, point);
jaepark98e10192016-08-15 10:51:11 -0700122}
123
124FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDblClk(
125 CPDFSDK_PageView* pPageView,
126 CPDFSDK_Annot* pAnnot,
127 uint32_t nFlags,
128 const CFX_FloatPoint& point) {
129 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700130 return GetAnnotHandler(pAnnot)->OnLButtonDblClk(pPageView, pAnnot, nFlags,
131 point);
jaepark98e10192016-08-15 10:51:11 -0700132}
133
134FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseMove(
135 CPDFSDK_PageView* pPageView,
136 CPDFSDK_Annot* pAnnot,
137 uint32_t nFlags,
138 const CFX_FloatPoint& point) {
139 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700140 return GetAnnotHandler(pAnnot)->OnMouseMove(pPageView, pAnnot, nFlags, point);
jaepark98e10192016-08-15 10:51:11 -0700141}
142
143FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseWheel(
144 CPDFSDK_PageView* pPageView,
145 CPDFSDK_Annot* pAnnot,
146 uint32_t nFlags,
147 short zDelta,
148 const CFX_FloatPoint& point) {
149 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700150 return GetAnnotHandler(pAnnot)->OnMouseWheel(pPageView, pAnnot, nFlags,
151 zDelta, point);
jaepark98e10192016-08-15 10:51:11 -0700152}
153
154FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonDown(
155 CPDFSDK_PageView* pPageView,
156 CPDFSDK_Annot* pAnnot,
157 uint32_t nFlags,
158 const CFX_FloatPoint& point) {
159 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700160 return GetAnnotHandler(pAnnot)->OnRButtonDown(pPageView, pAnnot, nFlags,
161 point);
jaepark98e10192016-08-15 10:51:11 -0700162}
163
164FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonUp(
165 CPDFSDK_PageView* pPageView,
166 CPDFSDK_Annot* pAnnot,
167 uint32_t nFlags,
168 const CFX_FloatPoint& point) {
169 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700170 return GetAnnotHandler(pAnnot)->OnRButtonUp(pPageView, pAnnot, nFlags, point);
jaepark98e10192016-08-15 10:51:11 -0700171}
172
173void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseEnter(CPDFSDK_PageView* pPageView,
174 CPDFSDK_Annot* pAnnot,
175 uint32_t nFlag) {
176 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700177 GetAnnotHandler(pAnnot)->OnMouseEnter(pPageView, pAnnot, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700178}
179
180void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit(CPDFSDK_PageView* pPageView,
181 CPDFSDK_Annot* pAnnot,
182 uint32_t nFlag) {
183 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700184 GetAnnotHandler(pAnnot)->OnMouseExit(pPageView, pAnnot, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700185}
186
187FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChar(CPDFSDK_Annot* pAnnot,
188 uint32_t nChar,
189 uint32_t nFlags) {
jaepark35512aa2016-08-29 17:15:08 -0700190 return GetAnnotHandler(pAnnot)->OnChar(pAnnot, nChar, nFlags);
jaepark98e10192016-08-15 10:51:11 -0700191}
192
193FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyDown(CPDFSDK_Annot* pAnnot,
194 int nKeyCode,
195 int nFlag) {
dsinclair1f248902016-09-14 10:38:17 -0700196 if (m_pApp->IsCTRLKeyDown(nFlag) || m_pApp->IsALTKeyDown(nFlag))
jaepark35512aa2016-08-29 17:15:08 -0700197 return GetAnnotHandler(pAnnot)->OnKeyDown(pAnnot, nKeyCode, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700198
jaepark35512aa2016-08-29 17:15:08 -0700199 CPDFSDK_PageView* pPage = pAnnot->GetPageView();
200 CPDFSDK_Annot* pFocusAnnot = pPage->GetFocusAnnot();
201 if (pFocusAnnot && (nKeyCode == FWL_VKEY_Tab)) {
202 CPDFSDK_Annot* pNext =
dsinclair1f248902016-09-14 10:38:17 -0700203 GetNextAnnot(pFocusAnnot, !m_pApp->IsSHIFTKeyDown(nFlag));
jaepark35512aa2016-08-29 17:15:08 -0700204
205 if (pNext && pNext != pFocusAnnot) {
206 CPDFSDK_Document* pDocument = pPage->GetSDKDocument();
207 pDocument->SetFocusAnnot(pNext);
208 return TRUE;
jaepark98e10192016-08-15 10:51:11 -0700209 }
210 }
211
jaepark98e10192016-08-15 10:51:11 -0700212 return FALSE;
213}
214
215FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot,
216 int nKeyCode,
217 int nFlag) {
218 return FALSE;
219}
220
221FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnSetFocus(CPDFSDK_Annot* pAnnot,
222 uint32_t nFlag) {
223 ASSERT(pAnnot);
224
jaepark35512aa2016-08-29 17:15:08 -0700225 if (!GetAnnotHandler(pAnnot)->OnSetFocus(pAnnot, nFlag))
226 return FALSE;
227
228 CPDFSDK_PageView* pPage = pAnnot->GetPageView();
229 pPage->GetSDKDocument();
230 return TRUE;
jaepark98e10192016-08-15 10:51:11 -0700231}
232
233FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot,
234 uint32_t nFlag) {
235 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700236 return GetAnnotHandler(pAnnot)->OnKillFocus(pAnnot, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700237}
238
239#ifdef PDF_ENABLE_XFA
240FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChangeFocus(
241 CPDFSDK_Annot* pSetAnnot,
242 CPDFSDK_Annot* pKillAnnot) {
243 FX_BOOL bXFA = (pSetAnnot && pSetAnnot->GetXFAWidget()) ||
244 (pKillAnnot && pKillAnnot->GetXFAWidget());
245
246 if (bXFA) {
247 if (IPDFSDK_AnnotHandler* pXFAAnnotHandler =
jaepark956553e2016-08-31 06:49:27 -0700248 GetAnnotHandler(CPDF_Annot::Subtype::XFAWIDGET))
jaepark98e10192016-08-15 10:51:11 -0700249 return pXFAAnnotHandler->OnXFAChangedFocus(pKillAnnot, pSetAnnot);
250 }
251
252 return TRUE;
253}
254#endif // PDF_ENABLE_XFA
255
256CFX_FloatRect CPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox(
257 CPDFSDK_PageView* pPageView,
258 CPDFSDK_Annot* pAnnot) {
259 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700260 return GetAnnotHandler(pAnnot)->GetViewBBox(pPageView, pAnnot);
jaepark98e10192016-08-15 10:51:11 -0700261}
262
263FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView* pPageView,
264 CPDFSDK_Annot* pAnnot,
265 const CFX_FloatPoint& point) {
266 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700267 IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot);
268 if (pAnnotHandler->CanAnswer(pAnnot))
269 return pAnnotHandler->HitTest(pPageView, pAnnot, point);
270
jaepark98e10192016-08-15 10:51:11 -0700271 return FALSE;
272}
273
274CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,
275 FX_BOOL bNext) {
276#ifdef PDF_ENABLE_XFA
277 CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView();
278 CPDFXFA_Page* pPage = pPageView->GetPDFXFAPage();
279 if (!pPage)
280 return nullptr;
281 if (pPage->GetPDFPage()) { // for pdf annots.
jaepark9ed91372016-08-26 16:16:10 -0700282 CBA_AnnotIterator ai(pSDKAnnot->GetPageView(),
283 pSDKAnnot->GetAnnotSubtype());
jaepark98e10192016-08-15 10:51:11 -0700284 CPDFSDK_Annot* pNext =
285 bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot);
286 return pNext;
287 }
288 // for xfa annots
289 std::unique_ptr<IXFA_WidgetIterator> pWidgetIterator(
290 pPage->GetXFAPageView()->CreateWidgetIterator(
291 XFA_TRAVERSEWAY_Tranvalse, XFA_WidgetStatus_Visible |
292 XFA_WidgetStatus_Viewable |
293 XFA_WidgetStatus_Focused));
294 if (!pWidgetIterator)
295 return nullptr;
296 if (pWidgetIterator->GetCurrentWidget() != pSDKAnnot->GetXFAWidget())
297 pWidgetIterator->SetCurrentWidget(pSDKAnnot->GetXFAWidget());
298 CXFA_FFWidget* hNextFocus =
299 bNext ? pWidgetIterator->MoveToNext() : pWidgetIterator->MoveToPrevious();
300 if (!hNextFocus && pSDKAnnot)
301 hNextFocus = pWidgetIterator->MoveToFirst();
302
303 return pPageView->GetAnnotByXFAWidget(hNextFocus);
304#else // PDF_ENABLE_XFA
jaepark956553e2016-08-31 06:49:27 -0700305 CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), CPDF_Annot::Subtype::WIDGET);
jaepark98e10192016-08-15 10:51:11 -0700306 return bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot);
307#endif // PDF_ENABLE_XFA
308}