blob: 0fd48d2aa0c0aa6f19f5121242d6e5020e695b4b [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"
jaepark8c541822016-08-30 13:43:05 -070015#include "fpdfsdk/include/cpdfsdk_widgethandler.h"
jaepark98e10192016-08-15 10:51:11 -070016#include "fpdfsdk/include/fsdk_mgr.h"
17
18#ifdef PDF_ENABLE_XFA
jaepark8c541822016-08-30 13:43:05 -070019#include "fpdfsdk/include/cpdfsdk_xfawidgethandler.h"
jaepark98e10192016-08-15 10:51:11 -070020#include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h"
21#include "xfa/fxfa/include/xfa_ffpageview.h"
22#include "xfa/fxfa/include/xfa_ffwidget.h"
23#endif // PDF_ENABLE_XFA
24
jaepark35512aa2016-08-29 17:15:08 -070025CPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp)
26 : m_pBAAnnotHandler(new CPDFSDK_BAAnnotHandler()),
jaepark8c541822016-08-30 13:43:05 -070027 m_pWidgetHandler(new CPDFSDK_WidgetHandler(pApp)),
jaepark98e10192016-08-15 10:51:11 -070028#ifdef PDF_ENABLE_XFA
jaepark8c541822016-08-30 13:43:05 -070029 m_pXFAWidgetHandler(new CPDFSDK_XFAWidgetHandler(pApp)),
jaepark98e10192016-08-15 10:51:11 -070030#endif // PDF_ENABLE_XFA
jaepark35512aa2016-08-29 17:15:08 -070031 m_pApp(pApp) {
jaepark8c541822016-08-30 13:43:05 -070032 m_pWidgetHandler->SetFormFiller(m_pApp->GetIFormFiller());
jaepark98e10192016-08-15 10:51:11 -070033}
34
35CPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr() {}
36
jaepark98e10192016-08-15 10:51:11 -070037CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot* pAnnot,
38 CPDFSDK_PageView* pPageView) {
39 ASSERT(pPageView);
jaepark35512aa2016-08-29 17:15:08 -070040 return GetAnnotHandler(pAnnot->GetSubtype())->NewAnnot(pAnnot, pPageView);
jaepark98e10192016-08-15 10:51:11 -070041}
42
43#ifdef PDF_ENABLE_XFA
44CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CXFA_FFWidget* pAnnot,
45 CPDFSDK_PageView* pPageView) {
46 ASSERT(pAnnot);
47 ASSERT(pPageView);
48
jaepark956553e2016-08-31 06:49:27 -070049 return GetAnnotHandler(CPDF_Annot::Subtype::XFAWIDGET)
50 ->NewAnnot(pAnnot, pPageView);
jaepark98e10192016-08-15 10:51:11 -070051}
52#endif // PDF_ENABLE_XFA
53
54void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot) {
jaepark35512aa2016-08-29 17:15:08 -070055 IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot);
56 pAnnotHandler->OnRelease(pAnnot);
57 pAnnotHandler->ReleaseAnnot(pAnnot);
jaepark98e10192016-08-15 10:51:11 -070058}
59
60void CPDFSDK_AnnotHandlerMgr::Annot_OnCreate(CPDFSDK_Annot* pAnnot) {
61 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
62
63 CPDFSDK_DateTime curTime;
64 pPDFAnnot->GetAnnotDict()->SetAtString("M", curTime.ToPDFDateTimeString());
65 pPDFAnnot->GetAnnotDict()->SetAtNumber("F", 0);
66
jaepark35512aa2016-08-29 17:15:08 -070067 GetAnnotHandler(pAnnot)->OnCreate(pAnnot);
jaepark98e10192016-08-15 10:51:11 -070068}
69
70void CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot) {
71 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -070072 GetAnnotHandler(pAnnot)->OnLoad(pAnnot);
jaepark98e10192016-08-15 10:51:11 -070073}
74
75IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(
76 CPDFSDK_Annot* pAnnot) const {
jaepark35512aa2016-08-29 17:15:08 -070077 return GetAnnotHandler(pAnnot->GetAnnotSubtype());
jaepark98e10192016-08-15 10:51:11 -070078}
79
80IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(
jaepark956553e2016-08-31 06:49:27 -070081 CPDF_Annot::Subtype nAnnotSubtype) const {
82 if (nAnnotSubtype == CPDF_Annot::Subtype::WIDGET)
jaepark8c541822016-08-30 13:43:05 -070083 return m_pWidgetHandler.get();
jaepark35512aa2016-08-29 17:15:08 -070084
85#ifdef PDF_ENABLE_XFA
jaepark956553e2016-08-31 06:49:27 -070086 if (nAnnotSubtype == CPDF_Annot::Subtype::XFAWIDGET)
jaepark8c541822016-08-30 13:43:05 -070087 return m_pXFAWidgetHandler.get();
jaepark35512aa2016-08-29 17:15:08 -070088#endif // PDF_ENABLE_XFA
89
90 return m_pBAAnnotHandler.get();
jaepark98e10192016-08-15 10:51:11 -070091}
92
93void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView,
94 CPDFSDK_Annot* pAnnot,
95 CFX_RenderDevice* pDevice,
jaepark75f84a52016-09-09 15:39:09 -070096 CFX_Matrix* pUser2Device,
97 bool bDrawAnnots) {
jaepark98e10192016-08-15 10:51:11 -070098 ASSERT(pAnnot);
jaepark75f84a52016-09-09 15:39:09 -070099 GetAnnotHandler(pAnnot)->OnDraw(pPageView, pAnnot, pDevice, pUser2Device,
100 bDrawAnnots);
jaepark98e10192016-08-15 10:51:11 -0700101}
102
103FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown(
104 CPDFSDK_PageView* pPageView,
105 CPDFSDK_Annot* pAnnot,
106 uint32_t nFlags,
107 const CFX_FloatPoint& point) {
108 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700109 return GetAnnotHandler(pAnnot)->OnLButtonDown(pPageView, pAnnot, nFlags,
110 point);
jaepark98e10192016-08-15 10:51:11 -0700111}
112
113FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonUp(
114 CPDFSDK_PageView* pPageView,
115 CPDFSDK_Annot* pAnnot,
116 uint32_t nFlags,
117 const CFX_FloatPoint& point) {
118 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700119 return GetAnnotHandler(pAnnot)->OnLButtonUp(pPageView, pAnnot, nFlags, point);
jaepark98e10192016-08-15 10:51:11 -0700120}
121
122FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDblClk(
123 CPDFSDK_PageView* pPageView,
124 CPDFSDK_Annot* pAnnot,
125 uint32_t nFlags,
126 const CFX_FloatPoint& point) {
127 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700128 return GetAnnotHandler(pAnnot)->OnLButtonDblClk(pPageView, pAnnot, nFlags,
129 point);
jaepark98e10192016-08-15 10:51:11 -0700130}
131
132FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseMove(
133 CPDFSDK_PageView* pPageView,
134 CPDFSDK_Annot* pAnnot,
135 uint32_t nFlags,
136 const CFX_FloatPoint& point) {
137 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700138 return GetAnnotHandler(pAnnot)->OnMouseMove(pPageView, pAnnot, nFlags, point);
jaepark98e10192016-08-15 10:51:11 -0700139}
140
141FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseWheel(
142 CPDFSDK_PageView* pPageView,
143 CPDFSDK_Annot* pAnnot,
144 uint32_t nFlags,
145 short zDelta,
146 const CFX_FloatPoint& point) {
147 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700148 return GetAnnotHandler(pAnnot)->OnMouseWheel(pPageView, pAnnot, nFlags,
149 zDelta, point);
jaepark98e10192016-08-15 10:51:11 -0700150}
151
152FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonDown(
153 CPDFSDK_PageView* pPageView,
154 CPDFSDK_Annot* pAnnot,
155 uint32_t nFlags,
156 const CFX_FloatPoint& point) {
157 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700158 return GetAnnotHandler(pAnnot)->OnRButtonDown(pPageView, pAnnot, nFlags,
159 point);
jaepark98e10192016-08-15 10:51:11 -0700160}
161
162FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonUp(
163 CPDFSDK_PageView* pPageView,
164 CPDFSDK_Annot* pAnnot,
165 uint32_t nFlags,
166 const CFX_FloatPoint& point) {
167 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700168 return GetAnnotHandler(pAnnot)->OnRButtonUp(pPageView, pAnnot, nFlags, point);
jaepark98e10192016-08-15 10:51:11 -0700169}
170
171void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseEnter(CPDFSDK_PageView* pPageView,
172 CPDFSDK_Annot* pAnnot,
173 uint32_t nFlag) {
174 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700175 GetAnnotHandler(pAnnot)->OnMouseEnter(pPageView, pAnnot, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700176}
177
178void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit(CPDFSDK_PageView* pPageView,
179 CPDFSDK_Annot* pAnnot,
180 uint32_t nFlag) {
181 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700182 GetAnnotHandler(pAnnot)->OnMouseExit(pPageView, pAnnot, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700183}
184
185FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChar(CPDFSDK_Annot* pAnnot,
186 uint32_t nChar,
187 uint32_t nFlags) {
jaepark35512aa2016-08-29 17:15:08 -0700188 return GetAnnotHandler(pAnnot)->OnChar(pAnnot, nChar, nFlags);
jaepark98e10192016-08-15 10:51:11 -0700189}
190
191FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyDown(CPDFSDK_Annot* pAnnot,
192 int nKeyCode,
193 int nFlag) {
jaepark35512aa2016-08-29 17:15:08 -0700194 if (m_pApp->FFI_IsCTRLKeyDown(nFlag) || m_pApp->FFI_IsALTKeyDown(nFlag))
195 return GetAnnotHandler(pAnnot)->OnKeyDown(pAnnot, nKeyCode, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700196
jaepark35512aa2016-08-29 17:15:08 -0700197 CPDFSDK_PageView* pPage = pAnnot->GetPageView();
198 CPDFSDK_Annot* pFocusAnnot = pPage->GetFocusAnnot();
199 if (pFocusAnnot && (nKeyCode == FWL_VKEY_Tab)) {
200 CPDFSDK_Annot* pNext =
201 GetNextAnnot(pFocusAnnot, !m_pApp->FFI_IsSHIFTKeyDown(nFlag));
202
203 if (pNext && pNext != pFocusAnnot) {
204 CPDFSDK_Document* pDocument = pPage->GetSDKDocument();
205 pDocument->SetFocusAnnot(pNext);
206 return TRUE;
jaepark98e10192016-08-15 10:51:11 -0700207 }
208 }
209
jaepark98e10192016-08-15 10:51:11 -0700210 return FALSE;
211}
212
213FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot,
214 int nKeyCode,
215 int nFlag) {
216 return FALSE;
217}
218
219FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnSetFocus(CPDFSDK_Annot* pAnnot,
220 uint32_t nFlag) {
221 ASSERT(pAnnot);
222
jaepark35512aa2016-08-29 17:15:08 -0700223 if (!GetAnnotHandler(pAnnot)->OnSetFocus(pAnnot, nFlag))
224 return FALSE;
225
226 CPDFSDK_PageView* pPage = pAnnot->GetPageView();
227 pPage->GetSDKDocument();
228 return TRUE;
jaepark98e10192016-08-15 10:51:11 -0700229}
230
231FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot,
232 uint32_t nFlag) {
233 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700234 return GetAnnotHandler(pAnnot)->OnKillFocus(pAnnot, nFlag);
jaepark98e10192016-08-15 10:51:11 -0700235}
236
237#ifdef PDF_ENABLE_XFA
238FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChangeFocus(
239 CPDFSDK_Annot* pSetAnnot,
240 CPDFSDK_Annot* pKillAnnot) {
241 FX_BOOL bXFA = (pSetAnnot && pSetAnnot->GetXFAWidget()) ||
242 (pKillAnnot && pKillAnnot->GetXFAWidget());
243
244 if (bXFA) {
245 if (IPDFSDK_AnnotHandler* pXFAAnnotHandler =
jaepark956553e2016-08-31 06:49:27 -0700246 GetAnnotHandler(CPDF_Annot::Subtype::XFAWIDGET))
jaepark98e10192016-08-15 10:51:11 -0700247 return pXFAAnnotHandler->OnXFAChangedFocus(pKillAnnot, pSetAnnot);
248 }
249
250 return TRUE;
251}
252#endif // PDF_ENABLE_XFA
253
254CFX_FloatRect CPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox(
255 CPDFSDK_PageView* pPageView,
256 CPDFSDK_Annot* pAnnot) {
257 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700258 return GetAnnotHandler(pAnnot)->GetViewBBox(pPageView, pAnnot);
jaepark98e10192016-08-15 10:51:11 -0700259}
260
261FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView* pPageView,
262 CPDFSDK_Annot* pAnnot,
263 const CFX_FloatPoint& point) {
264 ASSERT(pAnnot);
jaepark35512aa2016-08-29 17:15:08 -0700265 IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot);
266 if (pAnnotHandler->CanAnswer(pAnnot))
267 return pAnnotHandler->HitTest(pPageView, pAnnot, point);
268
jaepark98e10192016-08-15 10:51:11 -0700269 return FALSE;
270}
271
272CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,
273 FX_BOOL bNext) {
274#ifdef PDF_ENABLE_XFA
275 CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView();
276 CPDFXFA_Page* pPage = pPageView->GetPDFXFAPage();
277 if (!pPage)
278 return nullptr;
279 if (pPage->GetPDFPage()) { // for pdf annots.
jaepark9ed91372016-08-26 16:16:10 -0700280 CBA_AnnotIterator ai(pSDKAnnot->GetPageView(),
281 pSDKAnnot->GetAnnotSubtype());
jaepark98e10192016-08-15 10:51:11 -0700282 CPDFSDK_Annot* pNext =
283 bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot);
284 return pNext;
285 }
286 // for xfa annots
287 std::unique_ptr<IXFA_WidgetIterator> pWidgetIterator(
288 pPage->GetXFAPageView()->CreateWidgetIterator(
289 XFA_TRAVERSEWAY_Tranvalse, XFA_WidgetStatus_Visible |
290 XFA_WidgetStatus_Viewable |
291 XFA_WidgetStatus_Focused));
292 if (!pWidgetIterator)
293 return nullptr;
294 if (pWidgetIterator->GetCurrentWidget() != pSDKAnnot->GetXFAWidget())
295 pWidgetIterator->SetCurrentWidget(pSDKAnnot->GetXFAWidget());
296 CXFA_FFWidget* hNextFocus =
297 bNext ? pWidgetIterator->MoveToNext() : pWidgetIterator->MoveToPrevious();
298 if (!hNextFocus && pSDKAnnot)
299 hNextFocus = pWidgetIterator->MoveToFirst();
300
301 return pPageView->GetAnnotByXFAWidget(hNextFocus);
302#else // PDF_ENABLE_XFA
jaepark956553e2016-08-31 06:49:27 -0700303 CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), CPDF_Annot::Subtype::WIDGET);
jaepark98e10192016-08-15 10:51:11 -0700304 return bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot);
305#endif // PDF_ENABLE_XFA
306}