OLD | NEW |
| (Empty) |
1 // Copyright 2014 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/fsdk_annothandler.h" | |
8 | |
9 #include <algorithm> | |
10 #include <vector> | |
11 | |
12 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h" | |
13 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" | |
14 #include "core/fpdfdoc/include/cpdf_interform.h" | |
15 #include "core/fxge/include/cfx_renderdevice.h" | |
16 #include "fpdfsdk/formfiller/cffl_formfiller.h" | |
17 #include "fpdfsdk/include/cpdfsdk_datetime.h" | |
18 #include "fpdfsdk/include/fsdk_define.h" | |
19 #include "fpdfsdk/include/fsdk_mgr.h" | |
20 | |
21 #ifdef PDF_ENABLE_XFA | |
22 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h" | |
23 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_page.h" | |
24 #include "fpdfsdk/fpdfxfa/include/fpdfxfa_util.h" | |
25 #include "xfa/fwl/core/include/fwl_widgethit.h" | |
26 #include "xfa/fxfa/include/xfa_ffwidget.h" | |
27 #include "xfa/fxfa/include/xfa_ffdocview.h" | |
28 #include "xfa/fxfa/include/xfa_ffpageview.h" | |
29 #include "xfa/fxfa/include/xfa_ffwidgethandler.h" | |
30 #include "xfa/fxgraphics/include/cfx_graphics.h" | |
31 #endif // PDF_ENABLE_XFA | |
32 | |
33 CPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp) { | |
34 m_pApp = pApp; | |
35 | |
36 CPDFSDK_BFAnnotHandler* pHandler = new CPDFSDK_BFAnnotHandler(m_pApp); | |
37 pHandler->SetFormFiller(m_pApp->GetIFormFiller()); | |
38 RegisterAnnotHandler(pHandler); | |
39 #ifdef PDF_ENABLE_XFA | |
40 CPDFSDK_XFAAnnotHandler* pXFAAnnotHandler = | |
41 new CPDFSDK_XFAAnnotHandler(m_pApp); | |
42 RegisterAnnotHandler(pXFAAnnotHandler); | |
43 #endif // PDF_ENABLE_XFA | |
44 } | |
45 | |
46 CPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr() {} | |
47 | |
48 void CPDFSDK_AnnotHandlerMgr::RegisterAnnotHandler( | |
49 IPDFSDK_AnnotHandler* pAnnotHandler) { | |
50 ASSERT(!GetAnnotHandler(pAnnotHandler->GetType())); | |
51 | |
52 m_mapType2Handler[pAnnotHandler->GetType()].reset(pAnnotHandler); | |
53 } | |
54 | |
55 void CPDFSDK_AnnotHandlerMgr::UnRegisterAnnotHandler( | |
56 IPDFSDK_AnnotHandler* pAnnotHandler) { | |
57 m_mapType2Handler.erase(pAnnotHandler->GetType()); | |
58 } | |
59 | |
60 CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot* pAnnot, | |
61 CPDFSDK_PageView* pPageView) { | |
62 ASSERT(pPageView); | |
63 | |
64 if (IPDFSDK_AnnotHandler* pAnnotHandler = | |
65 GetAnnotHandler(pAnnot->GetSubType())) { | |
66 return pAnnotHandler->NewAnnot(pAnnot, pPageView); | |
67 } | |
68 | |
69 return new CPDFSDK_BAAnnot(pAnnot, pPageView); | |
70 } | |
71 | |
72 #ifdef PDF_ENABLE_XFA | |
73 CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CXFA_FFWidget* pAnnot, | |
74 CPDFSDK_PageView* pPageView) { | |
75 ASSERT(pAnnot); | |
76 ASSERT(pPageView); | |
77 | |
78 if (IPDFSDK_AnnotHandler* pAnnotHandler = | |
79 GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME)) { | |
80 return pAnnotHandler->NewAnnot(pAnnot, pPageView); | |
81 } | |
82 | |
83 return nullptr; | |
84 } | |
85 #endif // PDF_ENABLE_XFA | |
86 | |
87 void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { | |
88 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
89 pAnnotHandler->OnRelease(pAnnot); | |
90 pAnnotHandler->ReleaseAnnot(pAnnot); | |
91 } else { | |
92 delete pAnnot; | |
93 } | |
94 } | |
95 | |
96 void CPDFSDK_AnnotHandlerMgr::Annot_OnCreate(CPDFSDK_Annot* pAnnot) { | |
97 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); | |
98 | |
99 CPDFSDK_DateTime curTime; | |
100 pPDFAnnot->GetAnnotDict()->SetAtString("M", curTime.ToPDFDateTimeString()); | |
101 pPDFAnnot->GetAnnotDict()->SetAtNumber("F", 0); | |
102 | |
103 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
104 pAnnotHandler->OnCreate(pAnnot); | |
105 } | |
106 } | |
107 | |
108 void CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot) { | |
109 ASSERT(pAnnot); | |
110 | |
111 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
112 pAnnotHandler->OnLoad(pAnnot); | |
113 } | |
114 } | |
115 | |
116 IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler( | |
117 CPDFSDK_Annot* pAnnot) const { | |
118 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot(); | |
119 if (pPDFAnnot) | |
120 return GetAnnotHandler(pPDFAnnot->GetSubType()); | |
121 #ifdef PDF_ENABLE_XFA | |
122 if (pAnnot->GetXFAWidget()) | |
123 return GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME); | |
124 #endif // PDF_ENABLE_XFA | |
125 return nullptr; | |
126 } | |
127 | |
128 IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler( | |
129 const CFX_ByteString& sType) const { | |
130 auto it = m_mapType2Handler.find(sType); | |
131 return it != m_mapType2Handler.end() ? it->second.get() : nullptr; | |
132 } | |
133 | |
134 void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView, | |
135 CPDFSDK_Annot* pAnnot, | |
136 CFX_RenderDevice* pDevice, | |
137 CFX_Matrix* pUser2Device, | |
138 uint32_t dwFlags) { | |
139 ASSERT(pAnnot); | |
140 | |
141 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
142 pAnnotHandler->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags); | |
143 } else { | |
144 #ifdef PDF_ENABLE_XFA | |
145 if (pAnnot->IsXFAField()) | |
146 return; | |
147 #endif // PDF_ENABLE_XFA | |
148 static_cast<CPDFSDK_BAAnnot*>(pAnnot) | |
149 ->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, nullptr); | |
150 } | |
151 } | |
152 | |
153 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown( | |
154 CPDFSDK_PageView* pPageView, | |
155 CPDFSDK_Annot* pAnnot, | |
156 uint32_t nFlags, | |
157 const CFX_FloatPoint& point) { | |
158 ASSERT(pAnnot); | |
159 | |
160 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
161 return pAnnotHandler->OnLButtonDown(pPageView, pAnnot, nFlags, point); | |
162 } | |
163 return FALSE; | |
164 } | |
165 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonUp( | |
166 CPDFSDK_PageView* pPageView, | |
167 CPDFSDK_Annot* pAnnot, | |
168 uint32_t nFlags, | |
169 const CFX_FloatPoint& point) { | |
170 ASSERT(pAnnot); | |
171 | |
172 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
173 return pAnnotHandler->OnLButtonUp(pPageView, pAnnot, nFlags, point); | |
174 } | |
175 return FALSE; | |
176 } | |
177 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDblClk( | |
178 CPDFSDK_PageView* pPageView, | |
179 CPDFSDK_Annot* pAnnot, | |
180 uint32_t nFlags, | |
181 const CFX_FloatPoint& point) { | |
182 ASSERT(pAnnot); | |
183 | |
184 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
185 return pAnnotHandler->OnLButtonDblClk(pPageView, pAnnot, nFlags, point); | |
186 } | |
187 return FALSE; | |
188 } | |
189 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseMove( | |
190 CPDFSDK_PageView* pPageView, | |
191 CPDFSDK_Annot* pAnnot, | |
192 uint32_t nFlags, | |
193 const CFX_FloatPoint& point) { | |
194 ASSERT(pAnnot); | |
195 | |
196 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
197 return pAnnotHandler->OnMouseMove(pPageView, pAnnot, nFlags, point); | |
198 } | |
199 return FALSE; | |
200 } | |
201 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseWheel( | |
202 CPDFSDK_PageView* pPageView, | |
203 CPDFSDK_Annot* pAnnot, | |
204 uint32_t nFlags, | |
205 short zDelta, | |
206 const CFX_FloatPoint& point) { | |
207 ASSERT(pAnnot); | |
208 | |
209 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
210 return pAnnotHandler->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, | |
211 point); | |
212 } | |
213 return FALSE; | |
214 } | |
215 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonDown( | |
216 CPDFSDK_PageView* pPageView, | |
217 CPDFSDK_Annot* pAnnot, | |
218 uint32_t nFlags, | |
219 const CFX_FloatPoint& point) { | |
220 ASSERT(pAnnot); | |
221 | |
222 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
223 return pAnnotHandler->OnRButtonDown(pPageView, pAnnot, nFlags, point); | |
224 } | |
225 return FALSE; | |
226 } | |
227 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonUp( | |
228 CPDFSDK_PageView* pPageView, | |
229 CPDFSDK_Annot* pAnnot, | |
230 uint32_t nFlags, | |
231 const CFX_FloatPoint& point) { | |
232 ASSERT(pAnnot); | |
233 | |
234 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
235 return pAnnotHandler->OnRButtonUp(pPageView, pAnnot, nFlags, point); | |
236 } | |
237 return FALSE; | |
238 } | |
239 | |
240 void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseEnter(CPDFSDK_PageView* pPageView, | |
241 CPDFSDK_Annot* pAnnot, | |
242 uint32_t nFlag) { | |
243 ASSERT(pAnnot); | |
244 | |
245 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) | |
246 pAnnotHandler->OnMouseEnter(pPageView, pAnnot, nFlag); | |
247 } | |
248 | |
249 void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit(CPDFSDK_PageView* pPageView, | |
250 CPDFSDK_Annot* pAnnot, | |
251 uint32_t nFlag) { | |
252 ASSERT(pAnnot); | |
253 | |
254 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) | |
255 pAnnotHandler->OnMouseExit(pPageView, pAnnot, nFlag); | |
256 } | |
257 | |
258 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChar(CPDFSDK_Annot* pAnnot, | |
259 uint32_t nChar, | |
260 uint32_t nFlags) { | |
261 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
262 return pAnnotHandler->OnChar(pAnnot, nChar, nFlags); | |
263 } | |
264 return FALSE; | |
265 } | |
266 | |
267 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyDown(CPDFSDK_Annot* pAnnot, | |
268 int nKeyCode, | |
269 int nFlag) { | |
270 if (!m_pApp->FFI_IsCTRLKeyDown(nFlag) && !m_pApp->FFI_IsALTKeyDown(nFlag)) { | |
271 CPDFSDK_PageView* pPage = pAnnot->GetPageView(); | |
272 CPDFSDK_Annot* pFocusAnnot = pPage->GetFocusAnnot(); | |
273 if (pFocusAnnot && (nKeyCode == FWL_VKEY_Tab)) { | |
274 CPDFSDK_Annot* pNext = | |
275 GetNextAnnot(pFocusAnnot, !m_pApp->FFI_IsSHIFTKeyDown(nFlag)); | |
276 | |
277 if (pNext && pNext != pFocusAnnot) { | |
278 CPDFSDK_Document* pDocument = pPage->GetSDKDocument(); | |
279 pDocument->SetFocusAnnot(pNext); | |
280 return TRUE; | |
281 } | |
282 } | |
283 } | |
284 | |
285 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
286 return pAnnotHandler->OnKeyDown(pAnnot, nKeyCode, nFlag); | |
287 } | |
288 return FALSE; | |
289 } | |
290 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, | |
291 int nKeyCode, | |
292 int nFlag) { | |
293 return FALSE; | |
294 } | |
295 | |
296 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnSetFocus(CPDFSDK_Annot* pAnnot, | |
297 uint32_t nFlag) { | |
298 ASSERT(pAnnot); | |
299 | |
300 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
301 if (pAnnotHandler->OnSetFocus(pAnnot, nFlag)) { | |
302 CPDFSDK_PageView* pPage = pAnnot->GetPageView(); | |
303 pPage->GetSDKDocument(); | |
304 return TRUE; | |
305 } | |
306 } | |
307 return FALSE; | |
308 } | |
309 | |
310 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, | |
311 uint32_t nFlag) { | |
312 ASSERT(pAnnot); | |
313 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) | |
314 return pAnnotHandler->OnKillFocus(pAnnot, nFlag); | |
315 | |
316 return FALSE; | |
317 } | |
318 | |
319 #ifdef PDF_ENABLE_XFA | |
320 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChangeFocus( | |
321 CPDFSDK_Annot* pSetAnnot, | |
322 CPDFSDK_Annot* pKillAnnot) { | |
323 FX_BOOL bXFA = (pSetAnnot && pSetAnnot->GetXFAWidget()) || | |
324 (pKillAnnot && pKillAnnot->GetXFAWidget()); | |
325 | |
326 if (bXFA) { | |
327 if (IPDFSDK_AnnotHandler* pXFAAnnotHandler = | |
328 GetAnnotHandler(FSDK_XFAWIDGET_TYPENAME)) | |
329 return pXFAAnnotHandler->OnXFAChangedFocus(pKillAnnot, pSetAnnot); | |
330 } | |
331 | |
332 return TRUE; | |
333 } | |
334 #endif // PDF_ENABLE_XFA | |
335 | |
336 CFX_FloatRect CPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox( | |
337 CPDFSDK_PageView* pPageView, | |
338 CPDFSDK_Annot* pAnnot) { | |
339 ASSERT(pAnnot); | |
340 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) | |
341 return pAnnotHandler->GetViewBBox(pPageView, pAnnot); | |
342 | |
343 return pAnnot->GetRect(); | |
344 } | |
345 | |
346 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView* pPageView, | |
347 CPDFSDK_Annot* pAnnot, | |
348 const CFX_FloatPoint& point) { | |
349 ASSERT(pAnnot); | |
350 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot)) { | |
351 if (pAnnotHandler->CanAnswer(pAnnot)) | |
352 return pAnnotHandler->HitTest(pPageView, pAnnot, point); | |
353 } | |
354 return FALSE; | |
355 } | |
356 | |
357 CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot, | |
358 FX_BOOL bNext) { | |
359 #ifdef PDF_ENABLE_XFA | |
360 CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView(); | |
361 CPDFXFA_Page* pPage = pPageView->GetPDFXFAPage(); | |
362 if (!pPage) | |
363 return nullptr; | |
364 if (pPage->GetPDFPage()) { // for pdf annots. | |
365 CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), pSDKAnnot->GetType(), ""); | |
366 CPDFSDK_Annot* pNext = | |
367 bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot); | |
368 return pNext; | |
369 } | |
370 // for xfa annots | |
371 std::unique_ptr<IXFA_WidgetIterator> pWidgetIterator( | |
372 pPage->GetXFAPageView()->CreateWidgetIterator( | |
373 XFA_TRAVERSEWAY_Tranvalse, XFA_WidgetStatus_Visible | | |
374 XFA_WidgetStatus_Viewable | | |
375 XFA_WidgetStatus_Focused)); | |
376 if (!pWidgetIterator) | |
377 return nullptr; | |
378 if (pWidgetIterator->GetCurrentWidget() != pSDKAnnot->GetXFAWidget()) | |
379 pWidgetIterator->SetCurrentWidget(pSDKAnnot->GetXFAWidget()); | |
380 CXFA_FFWidget* hNextFocus = | |
381 bNext ? pWidgetIterator->MoveToNext() : pWidgetIterator->MoveToPrevious(); | |
382 if (!hNextFocus && pSDKAnnot) | |
383 hNextFocus = pWidgetIterator->MoveToFirst(); | |
384 | |
385 return pPageView->GetAnnotByXFAWidget(hNextFocus); | |
386 #else // PDF_ENABLE_XFA | |
387 CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), "Widget", ""); | |
388 return bNext ? ai.GetNextAnnot(pSDKAnnot) : ai.GetPrevAnnot(pSDKAnnot); | |
389 #endif // PDF_ENABLE_XFA | |
390 } | |
391 | |
392 CPDFSDK_BFAnnotHandler::CPDFSDK_BFAnnotHandler(CPDFDoc_Environment* pApp) | |
393 : m_pApp(pApp), m_pFormFiller(nullptr) {} | |
394 | |
395 CPDFSDK_BFAnnotHandler::~CPDFSDK_BFAnnotHandler() {} | |
396 | |
397 CFX_ByteString CPDFSDK_BFAnnotHandler::GetType() { | |
398 return CFX_ByteString("Widget"); | |
399 } | |
400 | |
401 CFX_ByteString CPDFSDK_BFAnnotHandler::GetName() { | |
402 return CFX_ByteString("WidgetHandler"); | |
403 } | |
404 | |
405 FX_BOOL CPDFSDK_BFAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot) { | |
406 ASSERT(pAnnot->GetType() == "Widget"); | |
407 if (pAnnot->GetSubType() == BFFT_SIGNATURE) | |
408 return FALSE; | |
409 | |
410 CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pAnnot); | |
411 if (!pWidget->IsVisible()) | |
412 return FALSE; | |
413 | |
414 int nFieldFlags = pWidget->GetFieldFlags(); | |
415 if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY) | |
416 return FALSE; | |
417 | |
418 if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON) | |
419 return TRUE; | |
420 | |
421 CPDF_Page* pPage = pWidget->GetPDFPage(); | |
422 CPDF_Document* pDocument = pPage->m_pDocument; | |
423 uint32_t dwPermissions = pDocument->GetUserPermissions(); | |
424 return (dwPermissions & FPDFPERM_FILL_FORM) || | |
425 (dwPermissions & FPDFPERM_ANNOT_FORM); | |
426 } | |
427 | |
428 CPDFSDK_Annot* CPDFSDK_BFAnnotHandler::NewAnnot(CPDF_Annot* pAnnot, | |
429 CPDFSDK_PageView* pPage) { | |
430 CPDFSDK_Document* pSDKDoc = m_pApp->GetSDKDocument(); | |
431 CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm(); | |
432 CPDF_FormControl* pCtrl = CPDFSDK_Widget::GetFormControl( | |
433 pInterForm->GetInterForm(), pAnnot->GetAnnotDict()); | |
434 if (!pCtrl) | |
435 return nullptr; | |
436 | |
437 CPDFSDK_Widget* pWidget = new CPDFSDK_Widget(pAnnot, pPage, pInterForm); | |
438 pInterForm->AddMap(pCtrl, pWidget); | |
439 CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm(); | |
440 if (pPDFInterForm && pPDFInterForm->NeedConstructAP()) | |
441 pWidget->ResetAppearance(nullptr, FALSE); | |
442 | |
443 return pWidget; | |
444 } | |
445 | |
446 #ifdef PDF_ENABLE_XFA | |
447 CPDFSDK_Annot* CPDFSDK_BFAnnotHandler::NewAnnot(CXFA_FFWidget* hWidget, | |
448 CPDFSDK_PageView* pPage) { | |
449 return nullptr; | |
450 } | |
451 #endif // PDF_ENABLE_XFA | |
452 | |
453 void CPDFSDK_BFAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { | |
454 ASSERT(pAnnot); | |
455 | |
456 if (m_pFormFiller) | |
457 m_pFormFiller->OnDelete(pAnnot); | |
458 | |
459 std::unique_ptr<CPDFSDK_Widget> pWidget(static_cast<CPDFSDK_Widget*>(pAnnot)); | |
460 CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm(); | |
461 CPDF_FormControl* pControl = pWidget->GetFormControl(); | |
462 pInterForm->RemoveMap(pControl); | |
463 } | |
464 | |
465 void CPDFSDK_BFAnnotHandler::DeleteAnnot(CPDFSDK_Annot* pAnnot) {} | |
466 | |
467 void CPDFSDK_BFAnnotHandler::OnDraw(CPDFSDK_PageView* pPageView, | |
468 CPDFSDK_Annot* pAnnot, | |
469 CFX_RenderDevice* pDevice, | |
470 CFX_Matrix* pUser2Device, | |
471 uint32_t dwFlags) { | |
472 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
473 | |
474 if (sSubType == BFFT_SIGNATURE) { | |
475 static_cast<CPDFSDK_BAAnnot*>(pAnnot) | |
476 ->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, nullptr); | |
477 } else { | |
478 if (m_pFormFiller) { | |
479 m_pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags); | |
480 } | |
481 } | |
482 } | |
483 | |
484 void CPDFSDK_BFAnnotHandler::OnDrawSleep(CPDFSDK_PageView* pPageView, | |
485 CPDFSDK_Annot* pAnnot, | |
486 CFX_RenderDevice* pDevice, | |
487 CFX_Matrix* pUser2Device, | |
488 const CFX_FloatRect& rcWindow, | |
489 uint32_t dwFlags) {} | |
490 | |
491 void CPDFSDK_BFAnnotHandler::OnDelete(CPDFSDK_Annot* pAnnot) {} | |
492 | |
493 void CPDFSDK_BFAnnotHandler::OnRelease(CPDFSDK_Annot* pAnnot) {} | |
494 | |
495 void CPDFSDK_BFAnnotHandler::OnMouseEnter(CPDFSDK_PageView* pPageView, | |
496 CPDFSDK_Annot* pAnnot, | |
497 uint32_t nFlag) { | |
498 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
499 | |
500 if (sSubType == BFFT_SIGNATURE) { | |
501 } else { | |
502 if (m_pFormFiller) | |
503 m_pFormFiller->OnMouseEnter(pPageView, pAnnot, nFlag); | |
504 } | |
505 } | |
506 void CPDFSDK_BFAnnotHandler::OnMouseExit(CPDFSDK_PageView* pPageView, | |
507 CPDFSDK_Annot* pAnnot, | |
508 uint32_t nFlag) { | |
509 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
510 | |
511 if (sSubType == BFFT_SIGNATURE) { | |
512 } else { | |
513 if (m_pFormFiller) | |
514 m_pFormFiller->OnMouseExit(pPageView, pAnnot, nFlag); | |
515 } | |
516 } | |
517 FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonDown(CPDFSDK_PageView* pPageView, | |
518 CPDFSDK_Annot* pAnnot, | |
519 uint32_t nFlags, | |
520 const CFX_FloatPoint& point) { | |
521 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
522 | |
523 if (sSubType == BFFT_SIGNATURE) { | |
524 } else { | |
525 if (m_pFormFiller) | |
526 return m_pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point); | |
527 } | |
528 | |
529 return FALSE; | |
530 } | |
531 | |
532 FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonUp(CPDFSDK_PageView* pPageView, | |
533 CPDFSDK_Annot* pAnnot, | |
534 uint32_t nFlags, | |
535 const CFX_FloatPoint& point) { | |
536 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
537 | |
538 if (sSubType == BFFT_SIGNATURE) { | |
539 } else { | |
540 if (m_pFormFiller) | |
541 return m_pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point); | |
542 } | |
543 | |
544 return FALSE; | |
545 } | |
546 | |
547 FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonDblClk(CPDFSDK_PageView* pPageView, | |
548 CPDFSDK_Annot* pAnnot, | |
549 uint32_t nFlags, | |
550 const CFX_FloatPoint& point) { | |
551 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
552 | |
553 if (sSubType == BFFT_SIGNATURE) { | |
554 } else { | |
555 if (m_pFormFiller) | |
556 return m_pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point); | |
557 } | |
558 | |
559 return FALSE; | |
560 } | |
561 | |
562 FX_BOOL CPDFSDK_BFAnnotHandler::OnMouseMove(CPDFSDK_PageView* pPageView, | |
563 CPDFSDK_Annot* pAnnot, | |
564 uint32_t nFlags, | |
565 const CFX_FloatPoint& point) { | |
566 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
567 | |
568 if (sSubType == BFFT_SIGNATURE) { | |
569 } else { | |
570 if (m_pFormFiller) | |
571 return m_pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point); | |
572 } | |
573 | |
574 return FALSE; | |
575 } | |
576 | |
577 FX_BOOL CPDFSDK_BFAnnotHandler::OnMouseWheel(CPDFSDK_PageView* pPageView, | |
578 CPDFSDK_Annot* pAnnot, | |
579 uint32_t nFlags, | |
580 short zDelta, | |
581 const CFX_FloatPoint& point) { | |
582 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
583 | |
584 if (sSubType == BFFT_SIGNATURE) { | |
585 } else { | |
586 if (m_pFormFiller) | |
587 return m_pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, | |
588 point); | |
589 } | |
590 | |
591 return FALSE; | |
592 } | |
593 | |
594 FX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonDown(CPDFSDK_PageView* pPageView, | |
595 CPDFSDK_Annot* pAnnot, | |
596 uint32_t nFlags, | |
597 const CFX_FloatPoint& point) { | |
598 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
599 | |
600 if (sSubType == BFFT_SIGNATURE) { | |
601 } else { | |
602 if (m_pFormFiller) | |
603 return m_pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point); | |
604 } | |
605 | |
606 return FALSE; | |
607 } | |
608 FX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonUp(CPDFSDK_PageView* pPageView, | |
609 CPDFSDK_Annot* pAnnot, | |
610 uint32_t nFlags, | |
611 const CFX_FloatPoint& point) { | |
612 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
613 | |
614 if (sSubType == BFFT_SIGNATURE) { | |
615 } else { | |
616 if (m_pFormFiller) | |
617 return m_pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point); | |
618 } | |
619 | |
620 return FALSE; | |
621 } | |
622 | |
623 FX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonDblClk(CPDFSDK_PageView* pPageView, | |
624 CPDFSDK_Annot* pAnnot, | |
625 uint32_t nFlags, | |
626 const CFX_FloatPoint& point) { | |
627 return FALSE; | |
628 } | |
629 | |
630 FX_BOOL CPDFSDK_BFAnnotHandler::OnChar(CPDFSDK_Annot* pAnnot, | |
631 uint32_t nChar, | |
632 uint32_t nFlags) { | |
633 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
634 | |
635 if (sSubType == BFFT_SIGNATURE) { | |
636 } else { | |
637 if (m_pFormFiller) | |
638 return m_pFormFiller->OnChar(pAnnot, nChar, nFlags); | |
639 } | |
640 | |
641 return FALSE; | |
642 } | |
643 | |
644 FX_BOOL CPDFSDK_BFAnnotHandler::OnKeyDown(CPDFSDK_Annot* pAnnot, | |
645 int nKeyCode, | |
646 int nFlag) { | |
647 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
648 | |
649 if (sSubType == BFFT_SIGNATURE) { | |
650 } else { | |
651 if (m_pFormFiller) | |
652 return m_pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlag); | |
653 } | |
654 | |
655 return FALSE; | |
656 } | |
657 | |
658 FX_BOOL CPDFSDK_BFAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, | |
659 int nKeyCode, | |
660 int nFlag) { | |
661 return FALSE; | |
662 } | |
663 void CPDFSDK_BFAnnotHandler::OnCreate(CPDFSDK_Annot* pAnnot) { | |
664 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
665 | |
666 if (sSubType == BFFT_SIGNATURE) { | |
667 } else { | |
668 if (m_pFormFiller) | |
669 m_pFormFiller->OnCreate(pAnnot); | |
670 } | |
671 } | |
672 | |
673 void CPDFSDK_BFAnnotHandler::OnLoad(CPDFSDK_Annot* pAnnot) { | |
674 if (pAnnot->GetSubType() == BFFT_SIGNATURE) | |
675 return; | |
676 | |
677 CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pAnnot); | |
678 if (!pWidget->IsAppearanceValid()) | |
679 pWidget->ResetAppearance(nullptr, FALSE); | |
680 | |
681 int nFieldType = pWidget->GetFieldType(); | |
682 if (nFieldType == FIELDTYPE_TEXTFIELD || nFieldType == FIELDTYPE_COMBOBOX) { | |
683 FX_BOOL bFormated = FALSE; | |
684 CFX_WideString sValue = pWidget->OnFormat(bFormated); | |
685 if (bFormated && nFieldType == FIELDTYPE_COMBOBOX) { | |
686 pWidget->ResetAppearance(sValue.c_str(), FALSE); | |
687 } | |
688 } | |
689 | |
690 #ifdef PDF_ENABLE_XFA | |
691 CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); | |
692 CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); | |
693 CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); | |
694 if (pDoc->GetDocType() == DOCTYPE_STATIC_XFA) { | |
695 if (!pWidget->IsAppearanceValid() && !pWidget->GetValue().IsEmpty()) | |
696 pWidget->ResetAppearance(FALSE); | |
697 } | |
698 #endif // PDF_ENABLE_XFA | |
699 if (m_pFormFiller) | |
700 m_pFormFiller->OnLoad(pAnnot); | |
701 } | |
702 | |
703 FX_BOOL CPDFSDK_BFAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot, | |
704 uint32_t nFlag) { | |
705 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
706 | |
707 if (sSubType == BFFT_SIGNATURE) { | |
708 } else { | |
709 if (m_pFormFiller) | |
710 return m_pFormFiller->OnSetFocus(pAnnot, nFlag); | |
711 } | |
712 | |
713 return TRUE; | |
714 } | |
715 FX_BOOL CPDFSDK_BFAnnotHandler::OnKillFocus(CPDFSDK_Annot* pAnnot, | |
716 uint32_t nFlag) { | |
717 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
718 | |
719 if (sSubType == BFFT_SIGNATURE) { | |
720 } else { | |
721 if (m_pFormFiller) | |
722 return m_pFormFiller->OnKillFocus(pAnnot, nFlag); | |
723 } | |
724 | |
725 return TRUE; | |
726 } | |
727 | |
728 #ifdef PDF_ENABLE_XFA | |
729 | |
730 FX_BOOL CPDFSDK_BFAnnotHandler::OnXFAChangedFocus(CPDFSDK_Annot* pOldAnnot, | |
731 CPDFSDK_Annot* pNewAnnot) { | |
732 return TRUE; | |
733 } | |
734 | |
735 #endif // PDF_ENABLE_XFA | |
736 | |
737 CFX_FloatRect CPDFSDK_BFAnnotHandler::GetViewBBox(CPDFSDK_PageView* pPageView, | |
738 CPDFSDK_Annot* pAnnot) { | |
739 CFX_ByteString sSubType = pAnnot->GetSubType(); | |
740 if (sSubType != BFFT_SIGNATURE && m_pFormFiller) | |
741 return CFX_FloatRect(m_pFormFiller->GetViewBBox(pPageView, pAnnot)); | |
742 | |
743 return CFX_FloatRect(0, 0, 0, 0); | |
744 } | |
745 | |
746 FX_BOOL CPDFSDK_BFAnnotHandler::HitTest(CPDFSDK_PageView* pPageView, | |
747 CPDFSDK_Annot* pAnnot, | |
748 const CFX_FloatPoint& point) { | |
749 ASSERT(pPageView); | |
750 ASSERT(pAnnot); | |
751 | |
752 CFX_FloatRect rect = GetViewBBox(pPageView, pAnnot); | |
753 return rect.Contains(point.x, point.y); | |
754 } | |
755 | |
756 #ifdef PDF_ENABLE_XFA | |
757 | |
758 CPDFSDK_XFAAnnotHandler::CPDFSDK_XFAAnnotHandler(CPDFDoc_Environment* pApp) | |
759 : m_pApp(pApp) {} | |
760 | |
761 CPDFSDK_XFAAnnotHandler::~CPDFSDK_XFAAnnotHandler() {} | |
762 | |
763 CFX_ByteString CPDFSDK_XFAAnnotHandler::GetType() { | |
764 return FSDK_XFAWIDGET_TYPENAME; | |
765 } | |
766 | |
767 CFX_ByteString CPDFSDK_XFAAnnotHandler::GetName() { | |
768 return "XFAWidgetHandler"; | |
769 } | |
770 | |
771 FX_BOOL CPDFSDK_XFAAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot) { | |
772 return !!pAnnot->GetXFAWidget(); | |
773 } | |
774 | |
775 CPDFSDK_Annot* CPDFSDK_XFAAnnotHandler::NewAnnot(CPDF_Annot* pAnnot, | |
776 CPDFSDK_PageView* pPage) { | |
777 return nullptr; | |
778 } | |
779 | |
780 CPDFSDK_Annot* CPDFSDK_XFAAnnotHandler::NewAnnot(CXFA_FFWidget* pAnnot, | |
781 CPDFSDK_PageView* pPage) { | |
782 CPDFSDK_Document* pSDKDoc = m_pApp->GetSDKDocument(); | |
783 CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm(); | |
784 CPDFSDK_XFAWidget* pWidget = new CPDFSDK_XFAWidget(pAnnot, pPage, pInterForm); | |
785 pInterForm->AddXFAMap(pAnnot, pWidget); | |
786 return pWidget; | |
787 } | |
788 | |
789 void CPDFSDK_XFAAnnotHandler::OnDraw(CPDFSDK_PageView* pPageView, | |
790 CPDFSDK_Annot* pAnnot, | |
791 CFX_RenderDevice* pDevice, | |
792 CFX_Matrix* pUser2Device, | |
793 uint32_t dwFlags) { | |
794 ASSERT(pPageView); | |
795 ASSERT(pAnnot); | |
796 | |
797 CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); | |
798 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
799 | |
800 CFX_Graphics gs; | |
801 gs.Create(pDevice); | |
802 | |
803 CFX_Matrix mt; | |
804 mt = *(CFX_Matrix*)pUser2Device; | |
805 | |
806 FX_BOOL bIsHighlight = FALSE; | |
807 if (pSDKDoc->GetFocusAnnot() != pAnnot) | |
808 bIsHighlight = TRUE; | |
809 | |
810 pWidgetHandler->RenderWidget(pAnnot->GetXFAWidget(), &gs, &mt, bIsHighlight); | |
811 | |
812 // to do highlight and shadow | |
813 } | |
814 | |
815 void CPDFSDK_XFAAnnotHandler::OnDrawSleep(CPDFSDK_PageView* pPageView, | |
816 CPDFSDK_Annot* pAnnot, | |
817 CFX_RenderDevice* pDevice, | |
818 CFX_Matrix* pUser2Device, | |
819 const CFX_FloatRect& rcWindow, | |
820 uint32_t dwFlags) {} | |
821 | |
822 void CPDFSDK_XFAAnnotHandler::OnCreate(CPDFSDK_Annot* pAnnot) {} | |
823 | |
824 void CPDFSDK_XFAAnnotHandler::OnLoad(CPDFSDK_Annot* pAnnot) {} | |
825 | |
826 void CPDFSDK_XFAAnnotHandler::OnDelete(CPDFSDK_Annot* pAnnot) {} | |
827 | |
828 void CPDFSDK_XFAAnnotHandler::OnRelease(CPDFSDK_Annot* pAnnot) {} | |
829 | |
830 void CPDFSDK_XFAAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) { | |
831 CPDFSDK_XFAWidget* pWidget = (CPDFSDK_XFAWidget*)pAnnot; | |
832 CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm(); | |
833 pInterForm->RemoveXFAMap(pWidget->GetXFAWidget()); | |
834 | |
835 delete pWidget; | |
836 } | |
837 | |
838 void CPDFSDK_XFAAnnotHandler::DeleteAnnot(CPDFSDK_Annot* pAnnot) {} | |
839 | |
840 CFX_FloatRect CPDFSDK_XFAAnnotHandler::GetViewBBox(CPDFSDK_PageView* pPageView, | |
841 CPDFSDK_Annot* pAnnot) { | |
842 ASSERT(pAnnot); | |
843 | |
844 CFX_RectF rcBBox; | |
845 XFA_Element eType = pAnnot->GetXFAWidget()->GetDataAcc()->GetUIType(); | |
846 if (eType == XFA_Element::Signature) | |
847 pAnnot->GetXFAWidget()->GetBBox(rcBBox, XFA_WidgetStatus_Visible, TRUE); | |
848 else | |
849 pAnnot->GetXFAWidget()->GetBBox(rcBBox, XFA_WidgetStatus_None); | |
850 | |
851 CFX_FloatRect rcWidget(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width, | |
852 rcBBox.top + rcBBox.height); | |
853 rcWidget.left -= 1.0f; | |
854 rcWidget.right += 1.0f; | |
855 rcWidget.bottom -= 1.0f; | |
856 rcWidget.top += 1.0f; | |
857 | |
858 return rcWidget; | |
859 } | |
860 | |
861 FX_BOOL CPDFSDK_XFAAnnotHandler::HitTest(CPDFSDK_PageView* pPageView, | |
862 CPDFSDK_Annot* pAnnot, | |
863 const CFX_FloatPoint& point) { | |
864 if (!pPageView || !pAnnot) | |
865 return FALSE; | |
866 | |
867 CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); | |
868 if (!pSDKDoc) | |
869 return FALSE; | |
870 | |
871 CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); | |
872 if (!pDoc) | |
873 return FALSE; | |
874 | |
875 CXFA_FFDocView* pDocView = pDoc->GetXFADocView(); | |
876 if (!pDocView) | |
877 return FALSE; | |
878 | |
879 CXFA_FFWidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler(); | |
880 if (!pWidgetHandler) | |
881 return FALSE; | |
882 | |
883 FWL_WidgetHit dwHitTest = | |
884 pWidgetHandler->OnHitTest(pAnnot->GetXFAWidget(), point.x, point.y); | |
885 return dwHitTest != FWL_WidgetHit::Unknown; | |
886 } | |
887 | |
888 void CPDFSDK_XFAAnnotHandler::OnMouseEnter(CPDFSDK_PageView* pPageView, | |
889 CPDFSDK_Annot* pAnnot, | |
890 uint32_t nFlag) { | |
891 if (!pPageView || !pAnnot) | |
892 return; | |
893 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
894 pWidgetHandler->OnMouseEnter(pAnnot->GetXFAWidget()); | |
895 } | |
896 | |
897 void CPDFSDK_XFAAnnotHandler::OnMouseExit(CPDFSDK_PageView* pPageView, | |
898 CPDFSDK_Annot* pAnnot, | |
899 uint32_t nFlag) { | |
900 if (!pPageView || !pAnnot) | |
901 return; | |
902 | |
903 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
904 pWidgetHandler->OnMouseExit(pAnnot->GetXFAWidget()); | |
905 } | |
906 | |
907 FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonDown(CPDFSDK_PageView* pPageView, | |
908 CPDFSDK_Annot* pAnnot, | |
909 uint32_t nFlags, | |
910 const CFX_FloatPoint& point) { | |
911 if (!pPageView || !pAnnot) | |
912 return FALSE; | |
913 | |
914 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
915 return pWidgetHandler->OnLButtonDown(pAnnot->GetXFAWidget(), | |
916 GetFWLFlags(nFlags), point.x, point.y); | |
917 } | |
918 | |
919 FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonUp(CPDFSDK_PageView* pPageView, | |
920 CPDFSDK_Annot* pAnnot, | |
921 uint32_t nFlags, | |
922 const CFX_FloatPoint& point) { | |
923 if (!pPageView || !pAnnot) | |
924 return FALSE; | |
925 | |
926 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
927 return pWidgetHandler->OnLButtonUp(pAnnot->GetXFAWidget(), | |
928 GetFWLFlags(nFlags), point.x, point.y); | |
929 } | |
930 | |
931 FX_BOOL CPDFSDK_XFAAnnotHandler::OnLButtonDblClk(CPDFSDK_PageView* pPageView, | |
932 CPDFSDK_Annot* pAnnot, | |
933 uint32_t nFlags, | |
934 const CFX_FloatPoint& point) { | |
935 if (!pPageView || !pAnnot) | |
936 return FALSE; | |
937 | |
938 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
939 return pWidgetHandler->OnLButtonDblClk(pAnnot->GetXFAWidget(), | |
940 GetFWLFlags(nFlags), point.x, point.y); | |
941 } | |
942 | |
943 FX_BOOL CPDFSDK_XFAAnnotHandler::OnMouseMove(CPDFSDK_PageView* pPageView, | |
944 CPDFSDK_Annot* pAnnot, | |
945 uint32_t nFlags, | |
946 const CFX_FloatPoint& point) { | |
947 if (!pPageView || !pAnnot) | |
948 return FALSE; | |
949 | |
950 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
951 return pWidgetHandler->OnMouseMove(pAnnot->GetXFAWidget(), | |
952 GetFWLFlags(nFlags), point.x, point.y); | |
953 } | |
954 | |
955 FX_BOOL CPDFSDK_XFAAnnotHandler::OnMouseWheel(CPDFSDK_PageView* pPageView, | |
956 CPDFSDK_Annot* pAnnot, | |
957 uint32_t nFlags, | |
958 short zDelta, | |
959 const CFX_FloatPoint& point) { | |
960 if (!pPageView || !pAnnot) | |
961 return FALSE; | |
962 | |
963 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
964 return pWidgetHandler->OnMouseWheel( | |
965 pAnnot->GetXFAWidget(), GetFWLFlags(nFlags), zDelta, point.x, point.y); | |
966 } | |
967 | |
968 FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonDown(CPDFSDK_PageView* pPageView, | |
969 CPDFSDK_Annot* pAnnot, | |
970 uint32_t nFlags, | |
971 const CFX_FloatPoint& point) { | |
972 if (!pPageView || !pAnnot) | |
973 return FALSE; | |
974 | |
975 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
976 return pWidgetHandler->OnRButtonDown(pAnnot->GetXFAWidget(), | |
977 GetFWLFlags(nFlags), point.x, point.y); | |
978 } | |
979 | |
980 FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonUp(CPDFSDK_PageView* pPageView, | |
981 CPDFSDK_Annot* pAnnot, | |
982 uint32_t nFlags, | |
983 const CFX_FloatPoint& point) { | |
984 if (!pPageView || !pAnnot) | |
985 return FALSE; | |
986 | |
987 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
988 return pWidgetHandler->OnRButtonUp(pAnnot->GetXFAWidget(), | |
989 GetFWLFlags(nFlags), point.x, point.y); | |
990 } | |
991 | |
992 FX_BOOL CPDFSDK_XFAAnnotHandler::OnRButtonDblClk(CPDFSDK_PageView* pPageView, | |
993 CPDFSDK_Annot* pAnnot, | |
994 uint32_t nFlags, | |
995 const CFX_FloatPoint& point) { | |
996 if (!pPageView || !pAnnot) | |
997 return FALSE; | |
998 | |
999 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
1000 return pWidgetHandler->OnRButtonDblClk(pAnnot->GetXFAWidget(), | |
1001 GetFWLFlags(nFlags), point.x, point.y); | |
1002 } | |
1003 | |
1004 FX_BOOL CPDFSDK_XFAAnnotHandler::OnChar(CPDFSDK_Annot* pAnnot, | |
1005 uint32_t nChar, | |
1006 uint32_t nFlags) { | |
1007 if (!pAnnot) | |
1008 return FALSE; | |
1009 | |
1010 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
1011 return pWidgetHandler->OnChar(pAnnot->GetXFAWidget(), nChar, | |
1012 GetFWLFlags(nFlags)); | |
1013 } | |
1014 | |
1015 FX_BOOL CPDFSDK_XFAAnnotHandler::OnKeyDown(CPDFSDK_Annot* pAnnot, | |
1016 int nKeyCode, | |
1017 int nFlag) { | |
1018 if (!pAnnot) | |
1019 return FALSE; | |
1020 | |
1021 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
1022 return pWidgetHandler->OnKeyDown(pAnnot->GetXFAWidget(), nKeyCode, | |
1023 GetFWLFlags(nFlag)); | |
1024 } | |
1025 | |
1026 FX_BOOL CPDFSDK_XFAAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, | |
1027 int nKeyCode, | |
1028 int nFlag) { | |
1029 if (!pAnnot) | |
1030 return FALSE; | |
1031 | |
1032 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot); | |
1033 return pWidgetHandler->OnKeyUp(pAnnot->GetXFAWidget(), nKeyCode, | |
1034 GetFWLFlags(nFlag)); | |
1035 } | |
1036 | |
1037 void CPDFSDK_XFAAnnotHandler::OnDeSelected(CPDFSDK_Annot* pAnnot) {} | |
1038 | |
1039 void CPDFSDK_XFAAnnotHandler::OnSelected(CPDFSDK_Annot* pAnnot) {} | |
1040 | |
1041 FX_BOOL CPDFSDK_XFAAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot, | |
1042 uint32_t nFlag) { | |
1043 return TRUE; | |
1044 } | |
1045 | |
1046 FX_BOOL CPDFSDK_XFAAnnotHandler::OnKillFocus(CPDFSDK_Annot* pAnnot, | |
1047 uint32_t nFlag) { | |
1048 return TRUE; | |
1049 } | |
1050 | |
1051 FX_BOOL CPDFSDK_XFAAnnotHandler::OnXFAChangedFocus(CPDFSDK_Annot* pOldAnnot, | |
1052 CPDFSDK_Annot* pNewAnnot) { | |
1053 CXFA_FFWidgetHandler* pWidgetHandler = nullptr; | |
1054 | |
1055 if (pOldAnnot) | |
1056 pWidgetHandler = GetXFAWidgetHandler(pOldAnnot); | |
1057 else if (pNewAnnot) | |
1058 pWidgetHandler = GetXFAWidgetHandler(pNewAnnot); | |
1059 | |
1060 if (pWidgetHandler) { | |
1061 FX_BOOL bRet = TRUE; | |
1062 CXFA_FFWidget* hWidget = pNewAnnot ? pNewAnnot->GetXFAWidget() : nullptr; | |
1063 if (hWidget) { | |
1064 CXFA_FFPageView* pXFAPageView = hWidget->GetPageView(); | |
1065 if (pXFAPageView) { | |
1066 bRet = pXFAPageView->GetDocView()->SetFocus(hWidget); | |
1067 if (pXFAPageView->GetDocView()->GetFocusWidget() == hWidget) | |
1068 bRet = TRUE; | |
1069 } | |
1070 } | |
1071 return bRet; | |
1072 } | |
1073 | |
1074 return TRUE; | |
1075 } | |
1076 | |
1077 CXFA_FFWidgetHandler* CPDFSDK_XFAAnnotHandler::GetXFAWidgetHandler( | |
1078 CPDFSDK_Annot* pAnnot) { | |
1079 if (!pAnnot) | |
1080 return nullptr; | |
1081 | |
1082 CPDFSDK_PageView* pPageView = pAnnot->GetPageView(); | |
1083 if (!pPageView) | |
1084 return nullptr; | |
1085 | |
1086 CPDFSDK_Document* pSDKDoc = pPageView->GetSDKDocument(); | |
1087 if (!pSDKDoc) | |
1088 return nullptr; | |
1089 | |
1090 CPDFXFA_Document* pDoc = pSDKDoc->GetXFADocument(); | |
1091 if (!pDoc) | |
1092 return nullptr; | |
1093 | |
1094 CXFA_FFDocView* pDocView = pDoc->GetXFADocView(); | |
1095 if (!pDocView) | |
1096 return nullptr; | |
1097 | |
1098 return pDocView->GetWidgetHandler(); | |
1099 } | |
1100 | |
1101 #define FWL_KEYFLAG_Ctrl (1 << 0) | |
1102 #define FWL_KEYFLAG_Alt (1 << 1) | |
1103 #define FWL_KEYFLAG_Shift (1 << 2) | |
1104 #define FWL_KEYFLAG_LButton (1 << 3) | |
1105 #define FWL_KEYFLAG_RButton (1 << 4) | |
1106 #define FWL_KEYFLAG_MButton (1 << 5) | |
1107 | |
1108 uint32_t CPDFSDK_XFAAnnotHandler::GetFWLFlags(uint32_t dwFlag) { | |
1109 uint32_t dwFWLFlag = 0; | |
1110 | |
1111 if (dwFlag & FWL_EVENTFLAG_ControlKey) | |
1112 dwFWLFlag |= FWL_KEYFLAG_Ctrl; | |
1113 if (dwFlag & FWL_EVENTFLAG_LeftButtonDown) | |
1114 dwFWLFlag |= FWL_KEYFLAG_LButton; | |
1115 if (dwFlag & FWL_EVENTFLAG_MiddleButtonDown) | |
1116 dwFWLFlag |= FWL_KEYFLAG_MButton; | |
1117 if (dwFlag & FWL_EVENTFLAG_RightButtonDown) | |
1118 dwFWLFlag |= FWL_KEYFLAG_RButton; | |
1119 if (dwFlag & FWL_EVENTFLAG_ShiftKey) | |
1120 dwFWLFlag |= FWL_KEYFLAG_Shift; | |
1121 if (dwFlag & FWL_EVENTFLAG_AltKey) | |
1122 dwFWLFlag |= FWL_KEYFLAG_Alt; | |
1123 | |
1124 return dwFWLFlag; | |
1125 } | |
1126 #endif // PDF_ENABLE_XFA | |
1127 | |
1128 CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView* pPageView, | |
1129 bool bReverse) | |
1130 : m_bReverse(bReverse), m_pos(0) { | |
1131 const std::vector<CPDFSDK_Annot*>& annots = pPageView->GetAnnotList(); | |
1132 m_iteratorAnnotList.insert(m_iteratorAnnotList.begin(), annots.rbegin(), | |
1133 annots.rend()); | |
1134 std::stable_sort(m_iteratorAnnotList.begin(), m_iteratorAnnotList.end(), | |
1135 [](CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) { | |
1136 return p1->GetLayoutOrder() < p2->GetLayoutOrder(); | |
1137 }); | |
1138 | |
1139 CPDFSDK_Annot* pTopMostAnnot = pPageView->GetFocusAnnot(); | |
1140 if (!pTopMostAnnot) | |
1141 return; | |
1142 | |
1143 auto it = std::find(m_iteratorAnnotList.begin(), m_iteratorAnnotList.end(), | |
1144 pTopMostAnnot); | |
1145 if (it != m_iteratorAnnotList.end()) { | |
1146 CPDFSDK_Annot* pReaderAnnot = *it; | |
1147 m_iteratorAnnotList.erase(it); | |
1148 m_iteratorAnnotList.insert(m_iteratorAnnotList.begin(), pReaderAnnot); | |
1149 } | |
1150 } | |
1151 | |
1152 CPDFSDK_AnnotIterator::~CPDFSDK_AnnotIterator() {} | |
1153 | |
1154 CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot() { | |
1155 if (m_pos < m_iteratorAnnotList.size()) | |
1156 return m_iteratorAnnotList[m_pos++]; | |
1157 return nullptr; | |
1158 } | |
1159 | |
1160 CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot() { | |
1161 if (m_pos < m_iteratorAnnotList.size()) | |
1162 return m_iteratorAnnotList[m_iteratorAnnotList.size() - ++m_pos]; | |
1163 return nullptr; | |
1164 } | |
1165 | |
1166 CPDFSDK_Annot* CPDFSDK_AnnotIterator::Next() { | |
1167 return m_bReverse ? PrevAnnot() : NextAnnot(); | |
1168 } | |
OLD | NEW |