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 "../include/fsdk_define.h"
8 #include "../include/fsdk_mgr.h"
9 #include "../include/formfiller/FFL_FormFiller.h"
10 #include "../include/fsdk_annothandler.h"
11
12
CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment * pApp)13 CPDFSDK_AnnotHandlerMgr::CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp)
14 {
15 m_pApp = pApp;
16
17 CPDFSDK_BFAnnotHandler* pHandler = new CPDFSDK_BFAnnotHandler(m_pApp);
18 pHandler->SetFormFiller(m_pApp->GetIFormFiller());
19 RegisterAnnotHandler(pHandler);
20 }
21
~CPDFSDK_AnnotHandlerMgr()22 CPDFSDK_AnnotHandlerMgr::~CPDFSDK_AnnotHandlerMgr()
23 {
24 for(int i=0; i<m_Handlers.GetSize(); i++)
25 {
26 IPDFSDK_AnnotHandler* pHandler = m_Handlers.GetAt(i);
27 delete pHandler;
28 }
29 m_Handlers.RemoveAll();
30 m_mapType2Handler.RemoveAll();
31 }
32
RegisterAnnotHandler(IPDFSDK_AnnotHandler * pAnnotHandler)33 void CPDFSDK_AnnotHandlerMgr::RegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler)
34 {
35 ASSERT(pAnnotHandler != NULL);
36
37 ASSERT(GetAnnotHandler(pAnnotHandler->GetType()) == NULL);
38
39 m_Handlers.Add(pAnnotHandler);
40 m_mapType2Handler.SetAt(pAnnotHandler->GetType(), (void*)pAnnotHandler);
41 }
42
UnRegisterAnnotHandler(IPDFSDK_AnnotHandler * pAnnotHandler)43 void CPDFSDK_AnnotHandlerMgr::UnRegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler)
44 {
45 ASSERT(pAnnotHandler != NULL);
46
47 m_mapType2Handler.RemoveKey(pAnnotHandler->GetType());
48
49 for (int i=0, sz=m_Handlers.GetSize(); i<sz; i++)
50 {
51 if (m_Handlers.GetAt(i) == pAnnotHandler)
52 {
53 m_Handlers.RemoveAt(i);
54 break;
55 }
56 }
57 }
58
NewAnnot(CPDF_Annot * pAnnot,CPDFSDK_PageView * pPageView)59 CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::NewAnnot(CPDF_Annot * pAnnot, CPDFSDK_PageView *pPageView)
60 {
61 ASSERT(pAnnot != NULL);
62 ASSERT(pPageView != NULL);
63
64 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot->GetSubType()))
65 {
66 return pAnnotHandler->NewAnnot(pAnnot, pPageView);
67 }
68
69 return new CPDFSDK_Annot(pAnnot, pPageView);
70 }
71
ReleaseAnnot(CPDFSDK_Annot * pAnnot)72 void CPDFSDK_AnnotHandlerMgr::ReleaseAnnot(CPDFSDK_Annot* pAnnot)
73 {
74 ASSERT(pAnnot != NULL);
75
76 pAnnot->GetPDFPage();
77
78 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
79 {
80 pAnnotHandler->OnRelease(pAnnot);
81 pAnnotHandler->ReleaseAnnot(pAnnot);
82 }
83 else
84 {
85 delete (CPDFSDK_Annot*)pAnnot;
86 }
87 }
88
Annot_OnCreate(CPDFSDK_Annot * pAnnot)89 void CPDFSDK_AnnotHandlerMgr::Annot_OnCreate(CPDFSDK_Annot* pAnnot)
90 {
91 ASSERT(pAnnot != NULL);
92
93 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
94 ASSERT(pPDFAnnot != NULL);
95 ASSERT(pPDFAnnot->m_pAnnotDict != NULL);
96
97 CPDFSDK_DateTime curTime;
98 pPDFAnnot->m_pAnnotDict->SetAtString("M", curTime.ToPDFDateTimeString());
99 pPDFAnnot->m_pAnnotDict->SetAtNumber("F", (int)0);
100
101 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
102 {
103 pAnnotHandler->OnCreate(pAnnot);
104 }
105 }
106
Annot_OnLoad(CPDFSDK_Annot * pAnnot)107 void CPDFSDK_AnnotHandlerMgr::Annot_OnLoad(CPDFSDK_Annot* pAnnot)
108 {
109 ASSERT(pAnnot != NULL);
110
111 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
112 {
113 pAnnotHandler->OnLoad(pAnnot);
114 }
115 }
116
GetAnnotHandler(CPDFSDK_Annot * pAnnot) const117 IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(CPDFSDK_Annot* pAnnot) const
118 {
119 ASSERT(pAnnot != NULL);
120
121 CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
122 ASSERT(pPDFAnnot != NULL);
123
124 return GetAnnotHandler(pPDFAnnot->GetSubType());
125 }
126
GetAnnotHandler(const CFX_ByteString & sType) const127 IPDFSDK_AnnotHandler* CPDFSDK_AnnotHandlerMgr::GetAnnotHandler(const CFX_ByteString& sType) const
128 {
129 void* pRet = NULL;
130 m_mapType2Handler.Lookup(sType, pRet);
131 return (IPDFSDK_AnnotHandler*)pRet;
132 }
133
Annot_OnDraw(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device,FX_DWORD dwFlags)134 void CPDFSDK_AnnotHandlerMgr::Annot_OnDraw(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,FX_DWORD dwFlags)
135 {
136 ASSERT(pAnnot != NULL);
137
138 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
139 {
140 pAnnotHandler->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
141 }
142 else
143 {
144 pAnnot->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
145 }
146 }
147
148
Annot_OnLButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,const CPDF_Point & point)149 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
150 {
151 ASSERT(pAnnot != NULL);
152
153 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
154 {
155 return pAnnotHandler->OnLButtonDown(pPageView, pAnnot, nFlags, point);
156 }
157 return FALSE;
158 }
Annot_OnLButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,const CPDF_Point & point)159 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
160 {
161 ASSERT(pAnnot != NULL);
162
163 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
164 {
165 return pAnnotHandler->OnLButtonUp(pPageView, pAnnot, nFlags, point);
166 }
167 return FALSE;
168 }
Annot_OnLButtonDblClk(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,const CPDF_Point & point)169 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnLButtonDblClk(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
170 {
171 ASSERT(pAnnot != NULL);
172
173 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
174 {
175 return pAnnotHandler->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
176 }
177 return FALSE;
178 }
Annot_OnMouseMove(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,const CPDF_Point & point)179 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseMove(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
180 {
181 ASSERT(pAnnot != NULL);
182
183 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
184 {
185 return pAnnotHandler->OnMouseMove(pPageView, pAnnot, nFlags, point);
186 }
187 return FALSE;
188 }
Annot_OnMouseWheel(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,short zDelta,const CPDF_Point & point)189 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnMouseWheel(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point)
190 {
191 ASSERT(pAnnot != NULL);
192
193 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
194 {
195 return pAnnotHandler->OnMouseWheel(pPageView, pAnnot,nFlags,zDelta, point);
196 }
197 return FALSE;
198 }
Annot_OnRButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,const CPDF_Point & point)199 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
200 {
201 ASSERT(pAnnot != NULL);
202
203 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
204 {
205 return pAnnotHandler->OnRButtonDown(pPageView, pAnnot, nFlags, point);
206 }
207 return FALSE;
208 }
Annot_OnRButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,const CPDF_Point & point)209 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnRButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
210 {
211 ASSERT(pAnnot != NULL);
212
213 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
214 {
215 return pAnnotHandler->OnRButtonUp(pPageView, pAnnot, nFlags, point);
216 }
217 return FALSE;
218 }
219
Annot_OnMouseEnter(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlag)220 void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseEnter(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
221 {
222 ASSERT(pAnnot != NULL);
223
224 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
225 {
226 pAnnotHandler->OnMouseEnter(pPageView, pAnnot, nFlag);
227 }
228 return ;
229 }
230
Annot_OnMouseExit(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlag)231 void CPDFSDK_AnnotHandlerMgr::Annot_OnMouseExit(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
232 {
233 ASSERT(pAnnot != NULL);
234
235 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
236 {
237 pAnnotHandler->OnMouseExit(pPageView, pAnnot, nFlag);
238 }
239 return;
240 }
241
Annot_OnChar(CPDFSDK_Annot * pAnnot,FX_DWORD nChar,FX_DWORD nFlags)242 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags)
243 {
244
245 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
246 {
247 return pAnnotHandler->OnChar(pAnnot,nChar, nFlags);
248 }
249 return FALSE;
250
251 }
252
Annot_OnKeyDown(CPDFSDK_Annot * pAnnot,int nKeyCode,int nFlag)253 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)
254 {
255
256 if (!m_pApp->FFI_IsCTRLKeyDown(nFlag) && !m_pApp->FFI_IsALTKeyDown(nFlag))
257 {
258 CPDFSDK_PageView* pPage = pAnnot->GetPageView();
259 CPDFSDK_Annot* pFocusAnnot = pPage->GetFocusAnnot();
260 if (pFocusAnnot && (nKeyCode == FWL_VKEY_Tab))
261 {
262 CPDFSDK_Annot* pNext = GetNextAnnot(pFocusAnnot, !m_pApp->FFI_IsSHIFTKeyDown(nFlag));
263
264 if(pNext && pNext != pFocusAnnot)
265 {
266 CPDFSDK_Document* pDocument = pPage->GetSDKDocument();
267 pDocument->SetFocusAnnot(pNext);
268 return TRUE;
269 }
270 }
271 }
272
273 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
274 {
275 return pAnnotHandler->OnKeyDown(pAnnot,nKeyCode, nFlag);
276 }
277 return FALSE;
278 }
Annot_OnKeyUp(CPDFSDK_Annot * pAnnot,int nKeyCode,int nFlag)279 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)
280 {
281 return FALSE;
282 }
283
Annot_OnSetFocus(CPDFSDK_Annot * pAnnot,FX_DWORD nFlag)284 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
285 {
286 ASSERT(pAnnot != NULL);
287
288 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
289 {
290 if (pAnnotHandler->OnSetFocus(pAnnot, nFlag))
291 {
292 CPDFSDK_PageView* pPage = pAnnot->GetPageView();
293 ASSERT(pPage != NULL);
294
295 pPage->GetSDKDocument();
296 // pDocument->SetTopmostAnnot(pAnnot);
297
298 return TRUE;
299 }
300 else
301 {
302 return FALSE;
303 }
304 }
305
306 return FALSE;
307 }
308
Annot_OnKillFocus(CPDFSDK_Annot * pAnnot,FX_DWORD nFlag)309 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
310 {
311 ASSERT(pAnnot != NULL);
312
313 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
314 {
315 if (pAnnotHandler->OnKillFocus(pAnnot, nFlag))
316 {
317 return TRUE;
318 }
319 else
320 return FALSE;
321 }
322
323 return FALSE;
324 }
325
Annot_OnGetViewBBox(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)326 CPDF_Rect CPDFSDK_AnnotHandlerMgr::Annot_OnGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
327 {
328 ASSERT(pAnnot);
329 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
330 {
331 return pAnnotHandler->GetViewBBox(pPageView, pAnnot);
332 }
333 return pAnnot->GetRect();
334 }
335
Annot_OnHitTest(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,const CPDF_Point & point)336 FX_BOOL CPDFSDK_AnnotHandlerMgr::Annot_OnHitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point)
337 {
338 ASSERT(pAnnot);
339 if (IPDFSDK_AnnotHandler* pAnnotHandler = GetAnnotHandler(pAnnot))
340 {
341 if(pAnnotHandler->CanAnswer(pAnnot))
342 return pAnnotHandler->HitTest(pPageView, pAnnot, point);
343 }
344 return FALSE;
345 }
346
GetNextAnnot(CPDFSDK_Annot * pSDKAnnot,FX_BOOL bNext)347 CPDFSDK_Annot* CPDFSDK_AnnotHandlerMgr::GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,FX_BOOL bNext)
348 {
349 CBA_AnnotIterator ai(pSDKAnnot->GetPageView(), "Widget", "");
350
351 CPDFSDK_Annot* pNext = bNext ?
352 ai.GetNextAnnot(pSDKAnnot) :
353 ai.GetPrevAnnot(pSDKAnnot);
354
355 return pNext;
356 }
357
CanAnswer(CPDFSDK_Annot * pAnnot)358 FX_BOOL CPDFSDK_BFAnnotHandler::CanAnswer(CPDFSDK_Annot* pAnnot)
359 {
360 ASSERT(pAnnot);
361 ASSERT(pAnnot->GetType() == "Widget");
362 CFX_ByteString sSubType = pAnnot->GetSubType();
363
364 if (sSubType == BFFT_SIGNATURE)
365 {
366 }
367 else
368 {
369 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
370 if (!pWidget->IsVisible()) return FALSE;
371
372 int nFieldFlags = pWidget->GetFieldFlags();
373 if ((nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY) return FALSE;
374 if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)
375 return TRUE;
376 else
377 {
378 CPDF_Page* pPage = pWidget->GetPDFPage();
379 ASSERT(pPage != NULL);
380
381 CPDF_Document* pDocument = pPage->m_pDocument;
382 ASSERT(pDocument != NULL);
383
384 FX_DWORD dwPermissions = pDocument->GetUserPermissions();
385 return (dwPermissions&FPDFPERM_FILL_FORM) ||
386 (dwPermissions&FPDFPERM_ANNOT_FORM) ||
387 (dwPermissions&FPDFPERM_ANNOT_FORM);
388 }
389 }
390
391 return FALSE;
392 }
393
NewAnnot(CPDF_Annot * pAnnot,CPDFSDK_PageView * pPage)394 CPDFSDK_Annot* CPDFSDK_BFAnnotHandler::NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage)
395 {
396 ASSERT(pPage != NULL);
397 pPage->GetPDFDocument();
398
399 CPDFSDK_Document* pSDKDoc = m_pApp->GetCurrentDoc();
400 ASSERT(pSDKDoc);
401 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pSDKDoc->GetInterForm();
402 ASSERT(pInterForm != NULL);
403
404 CPDFSDK_Widget* pWidget = NULL;
405 if (CPDF_FormControl* pCtrl = CPDFSDK_Widget::GetFormControl(pInterForm->GetInterForm(), pAnnot->m_pAnnotDict))
406 {
407 pWidget = new CPDFSDK_Widget(pAnnot, pPage, pInterForm);
408 pInterForm->AddMap(pCtrl, pWidget);
409 CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
410 if(pPDFInterForm && pPDFInterForm->NeedConstructAP())
411 pWidget->ResetAppearance(NULL,FALSE);
412 }
413
414 return pWidget;
415 }
416
ReleaseAnnot(CPDFSDK_Annot * pAnnot)417 void CPDFSDK_BFAnnotHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot)
418 {
419 ASSERT(pAnnot != NULL);
420
421 if (m_pFormFiller)
422 m_pFormFiller->OnDelete(pAnnot);
423
424 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
425 CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm();
426 ASSERT(pInterForm != NULL);
427
428 CPDF_FormControl* pCtrol = pWidget->GetFormControl();
429 pInterForm->RemoveMap(pCtrol);
430
431
432 delete pWidget;
433 }
434
435
OnDraw(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device,FX_DWORD dwFlags)436 void CPDFSDK_BFAnnotHandler::OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, FX_DWORD dwFlags)
437 {
438 ASSERT(pAnnot != NULL);
439 CFX_ByteString sSubType = pAnnot->GetSubType();
440
441 if (sSubType == BFFT_SIGNATURE)
442 {
443 pAnnot->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
444 }
445 else
446 {
447 if (m_pFormFiller)
448 {
449 m_pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
450 }
451 }
452 }
453
OnMouseEnter(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlag)454 void CPDFSDK_BFAnnotHandler::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
455 {
456 ASSERT(pAnnot != NULL);
457 CFX_ByteString sSubType = pAnnot->GetSubType();
458
459 if (sSubType == BFFT_SIGNATURE)
460 {
461 }
462 else
463 {
464 if (m_pFormFiller)
465 m_pFormFiller->OnMouseEnter(pPageView, pAnnot, nFlag);
466 }
467
468
469 }
OnMouseExit(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlag)470 void CPDFSDK_BFAnnotHandler::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
471 {
472 ASSERT(pAnnot != NULL);
473 CFX_ByteString sSubType = pAnnot->GetSubType();
474
475 if (sSubType == BFFT_SIGNATURE)
476 {
477 }
478 else
479 {
480 if (m_pFormFiller)
481 m_pFormFiller->OnMouseExit(pPageView, pAnnot, nFlag);
482 }
483
484 }
OnLButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,const CPDF_Point & point)485 FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
486 {
487 ASSERT(pAnnot != NULL);
488 CFX_ByteString sSubType = pAnnot->GetSubType();
489
490 if (sSubType == BFFT_SIGNATURE)
491 {
492 }
493 else
494 {
495 if (m_pFormFiller)
496 return m_pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point);
497 }
498
499 return FALSE;
500 }
501
OnLButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,const CPDF_Point & point)502 FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
503 {
504 ASSERT(pAnnot != NULL);
505 CFX_ByteString sSubType = pAnnot->GetSubType();
506
507 if (sSubType == BFFT_SIGNATURE)
508 {
509 }
510 else
511 {
512 if (m_pFormFiller)
513 return m_pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point);
514 }
515
516 return FALSE;
517 }
518
OnLButtonDblClk(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,const CPDF_Point & point)519 FX_BOOL CPDFSDK_BFAnnotHandler::OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
520 {
521 ASSERT(pAnnot != NULL);
522 CFX_ByteString sSubType = pAnnot->GetSubType();
523
524 if (sSubType == BFFT_SIGNATURE)
525 {
526 }
527 else
528 {
529 if (m_pFormFiller)
530 return m_pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
531 }
532
533 return FALSE;
534 }
535
OnMouseMove(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,const CPDF_Point & point)536 FX_BOOL CPDFSDK_BFAnnotHandler::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
537 {
538 ASSERT(pAnnot != NULL);
539 CFX_ByteString sSubType = pAnnot->GetSubType();
540
541 if (sSubType == BFFT_SIGNATURE)
542 {
543 }
544 else
545 {
546 if (m_pFormFiller)
547 return m_pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point);
548 }
549
550 return FALSE;
551
552 }
553
554
OnMouseWheel(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,short zDelta,const CPDF_Point & point)555 FX_BOOL CPDFSDK_BFAnnotHandler::OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point)
556 {
557 ASSERT(pAnnot != NULL);
558 CFX_ByteString sSubType = pAnnot->GetSubType();
559
560 if (sSubType == BFFT_SIGNATURE)
561 {
562 }
563 else
564 {
565 if (m_pFormFiller)
566 return m_pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta,point);
567 }
568
569 return FALSE;
570 }
571
OnRButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,const CPDF_Point & point)572 FX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
573 {
574 ASSERT(pAnnot != NULL);
575 CFX_ByteString sSubType = pAnnot->GetSubType();
576
577 if (sSubType == BFFT_SIGNATURE)
578 {
579 }
580 else
581 {
582 if (m_pFormFiller)
583 return m_pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point);
584 }
585
586 return FALSE;
587 }
OnRButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_DWORD nFlags,const CPDF_Point & point)588 FX_BOOL CPDFSDK_BFAnnotHandler::OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point)
589 {
590 ASSERT(pAnnot != NULL);
591 CFX_ByteString sSubType = pAnnot->GetSubType();
592
593 if (sSubType == BFFT_SIGNATURE)
594 {
595 }
596 else
597 {
598 if (m_pFormFiller)
599 return m_pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point);
600 }
601
602 return FALSE;
603 }
604
OnChar(CPDFSDK_Annot * pAnnot,FX_DWORD nChar,FX_DWORD nFlags)605 FX_BOOL CPDFSDK_BFAnnotHandler::OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags)
606 {
607 ASSERT(pAnnot != NULL);
608 CFX_ByteString sSubType = pAnnot->GetSubType();
609
610 if (sSubType == BFFT_SIGNATURE)
611 {
612 }
613 else
614 {
615 if (m_pFormFiller)
616 return m_pFormFiller->OnChar(pAnnot,nChar, nFlags);
617 }
618
619 return FALSE;
620 }
621
OnKeyDown(CPDFSDK_Annot * pAnnot,int nKeyCode,int nFlag)622 FX_BOOL CPDFSDK_BFAnnotHandler::OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)
623 {
624 ASSERT(pAnnot != NULL);
625 CFX_ByteString sSubType = pAnnot->GetSubType();
626
627 if (sSubType == BFFT_SIGNATURE)
628 {
629 }
630 else
631 {
632 if (m_pFormFiller)
633 return m_pFormFiller->OnKeyDown(pAnnot,nKeyCode, nFlag);
634 }
635
636 return FALSE;
637 }
638
OnKeyUp(CPDFSDK_Annot * pAnnot,int nKeyCode,int nFlag)639 FX_BOOL CPDFSDK_BFAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)
640 {
641
642 return FALSE;
643 }
OnCreate(CPDFSDK_Annot * pAnnot)644 void CPDFSDK_BFAnnotHandler::OnCreate(CPDFSDK_Annot* pAnnot)
645 {
646 ASSERT(pAnnot != NULL);
647 CFX_ByteString sSubType = pAnnot->GetSubType();
648
649 if (sSubType == BFFT_SIGNATURE)
650 {
651 }
652 else
653 {
654 if (m_pFormFiller)
655 m_pFormFiller->OnCreate(pAnnot);
656 }
657 }
658
OnLoad(CPDFSDK_Annot * pAnnot)659 void CPDFSDK_BFAnnotHandler::OnLoad(CPDFSDK_Annot* pAnnot)
660 {
661 ASSERT(pAnnot != NULL);
662
663 CFX_ByteString sSubType = pAnnot->GetSubType();
664
665 if (sSubType == BFFT_SIGNATURE)
666 {
667 }
668 else
669 {
670 CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
671 if (!pWidget->IsAppearanceValid())
672 pWidget->ResetAppearance(NULL, FALSE);
673
674 int nFieldType = pWidget->GetFieldType();
675 if (nFieldType == FIELDTYPE_TEXTFIELD || nFieldType == FIELDTYPE_COMBOBOX)
676 {
677 FX_BOOL bFormated = FALSE;
678 CFX_WideString sValue = pWidget->OnFormat(0, bFormated);
679 if (bFormated && nFieldType == FIELDTYPE_COMBOBOX)
680 {
681 pWidget->ResetAppearance(sValue.c_str(), FALSE);
682 }
683 }
684
685 if (m_pFormFiller)
686 m_pFormFiller->OnLoad(pAnnot);
687 }
688 }
689
OnSetFocus(CPDFSDK_Annot * pAnnot,FX_DWORD nFlag)690 FX_BOOL CPDFSDK_BFAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
691 {
692 ASSERT(pAnnot != NULL);
693 CFX_ByteString sSubType = pAnnot->GetSubType();
694
695 if (sSubType == BFFT_SIGNATURE)
696 {
697 }
698 else
699 {
700 if (m_pFormFiller)
701 return m_pFormFiller->OnSetFocus(pAnnot,nFlag);
702 }
703
704 return TRUE;
705 }
OnKillFocus(CPDFSDK_Annot * pAnnot,FX_DWORD nFlag)706 FX_BOOL CPDFSDK_BFAnnotHandler::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
707 {
708 ASSERT(pAnnot != NULL);
709 CFX_ByteString sSubType = pAnnot->GetSubType();
710
711 if (sSubType == BFFT_SIGNATURE)
712 {
713 }
714 else
715 {
716 if (m_pFormFiller)
717 return m_pFormFiller->OnKillFocus(pAnnot,nFlag);
718 }
719
720 return TRUE;
721 }
722
GetViewBBox(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)723 CPDF_Rect CPDFSDK_BFAnnotHandler::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
724 {
725 ASSERT(pAnnot != NULL);
726 CFX_ByteString sSubType = pAnnot->GetSubType();
727
728 if (sSubType == BFFT_SIGNATURE)
729 {
730 }
731 else
732 {
733 if (m_pFormFiller)
734 return m_pFormFiller->GetViewBBox(pPageView, pAnnot);
735
736 }
737
738 return CPDF_Rect(0,0,0,0);
739 }
740
HitTest(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,const CPDF_Point & point)741 FX_BOOL CPDFSDK_BFAnnotHandler::HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point)
742 {
743 ASSERT(pPageView);
744 ASSERT(pAnnot);
745
746 CPDF_Rect rect = GetViewBBox(pPageView, pAnnot);
747 return rect.Contains(point.x, point.y);
748 }
749
750 //CReader_AnnotIteratorEx
751
CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView,FX_BOOL bReverse,FX_BOOL bIgnoreTopmost,FX_BOOL bCircle,CFX_PtrArray * pList)752 CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView,FX_BOOL bReverse,
753 FX_BOOL bIgnoreTopmost/*=FALSE*/,
754 FX_BOOL bCircle/*=FALSE*/,
755 CFX_PtrArray *pList/*=NULL*/)
756 {
757 ASSERT(pPageView);
758 m_bReverse=bReverse;
759 m_bIgnoreTopmost= bIgnoreTopmost;
760 m_bCircle=bCircle;
761 m_pIteratorAnnotList.RemoveAll();
762 InitIteratorAnnotList(pPageView,pList);
763 }
764
NextAnnot(const CPDFSDK_Annot * pCurrent)765 CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot (const CPDFSDK_Annot* pCurrent)
766 {
767
768 int index=-1;
769 int nCount=this->m_pIteratorAnnotList.GetSize();
770 if(pCurrent){
771 for(int i=0;i<nCount;i++){
772 CPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot *)m_pIteratorAnnotList.GetAt(i);
773 if(pReaderAnnot ==pCurrent){
774 index=i;
775 break;
776 }
777 }
778 }
779 return NextAnnot(index);
780 }
PrevAnnot(const CPDFSDK_Annot * pCurrent)781 CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot (const CPDFSDK_Annot*pCurrent)
782 {
783
784 int index=-1;
785 int nCount=this->m_pIteratorAnnotList.GetSize();
786 if(pCurrent){
787 for(int i=0;i<nCount;i++){
788 CPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i);
789 if(pReaderAnnot ==pCurrent){
790 index=i;
791 break;
792 }
793 }
794 }
795 return PrevAnnot(index);
796 }
NextAnnot(int & index)797 CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot (int& index)
798 {
799
800 int nCount=m_pIteratorAnnotList.GetSize();
801 if(nCount<=0) index=-1;
802 else{
803 if(index<0){
804 index=0;
805 }
806 else{
807 if(m_bCircle){
808 index=( index <nCount-1) ? (index+1) :0;
809 }
810 else{
811 index=( index <nCount-1) ? (index+1) :-1;
812 }
813
814 }
815 }
816 return (index <0) ? NULL : (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(index);
817 }
818
819
PrevAnnot(int & index)820 CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot (int& index)
821 {
822
823 int nCount=m_pIteratorAnnotList.GetSize();
824 if(nCount<=0) index=-1;
825 else{
826 if(index<0){
827 index=nCount-1;
828 }
829 else{
830 if(m_bCircle){
831 index = ( index >0) ? (index-1) :nCount-1;
832 }
833 else{
834 index = ( index >0) ? (index-1) :-1;
835 }
836 }
837 }
838 return (index <0) ? NULL : (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(index);
839 }
840
841
Next(const CPDFSDK_Annot * pCurrent)842 CPDFSDK_Annot*CPDFSDK_AnnotIterator::Next(const CPDFSDK_Annot* pCurrent)
843 {
844
845 return (m_bReverse) ? PrevAnnot(pCurrent):NextAnnot(pCurrent);
846
847 }
848
Prev(const CPDFSDK_Annot * pCurrent)849 CPDFSDK_Annot* CPDFSDK_AnnotIterator::Prev(const CPDFSDK_Annot* pCurrent)
850 {
851
852 return (m_bReverse) ? NextAnnot(pCurrent):PrevAnnot(pCurrent);
853 }
854
Next(int & index)855 CPDFSDK_Annot*CPDFSDK_AnnotIterator::Next(int& index )
856 {
857
858 return (m_bReverse) ? PrevAnnot(index):NextAnnot(index);
859
860 }
861
Prev(int & index)862 CPDFSDK_Annot* CPDFSDK_AnnotIterator::Prev(int& index )
863 {
864
865 return (m_bReverse) ? NextAnnot(index):PrevAnnot(index);
866 }
867
868
InsertSort(CFX_PtrArray & arrayList,AI_COMPARE pCompare)869 void CPDFSDK_AnnotIterator::InsertSort(CFX_PtrArray &arrayList, AI_COMPARE pCompare)
870 {
871 for (int i = 1; i < arrayList.GetSize(); i++)
872 {
873 if (pCompare((CPDFSDK_Annot*)(arrayList[i]) , (CPDFSDK_Annot*)(arrayList[i-1])) < 0)
874 {
875 int j = i-1;
876 CPDFSDK_Annot* pTemp = (CPDFSDK_Annot*)arrayList[i];
877
878 do
879 {
880 arrayList[j + 1] = arrayList[j];
881 } while (--j >= 0 && pCompare(pTemp, (CPDFSDK_Annot*)arrayList[j]) < 0);
882
883 arrayList[j+1] = pTemp;
884 }
885 }
886 }
887
LyOrderCompare(CPDFSDK_Annot * p1,CPDFSDK_Annot * p2)888 int LyOrderCompare(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)
889 {
890 if(p1->GetLayoutOrder() < p2->GetLayoutOrder())
891 return -1;
892 else if (p1->GetLayoutOrder() == p2->GetLayoutOrder())
893 return 0;
894 else
895 return 1;
896 }
897
InitIteratorAnnotList(CPDFSDK_PageView * pPageView,CFX_PtrArray * pAnnotList)898 FX_BOOL CPDFSDK_AnnotIterator::InitIteratorAnnotList(CPDFSDK_PageView* pPageView,CFX_PtrArray * pAnnotList)
899 {
900 ASSERT(pPageView);
901
902
903
904 if(pAnnotList==NULL){
905 pAnnotList=pPageView->GetAnnotList();
906 }
907
908 this->m_pIteratorAnnotList.RemoveAll();
909 if(!pAnnotList) return FALSE;
910
911 CPDFSDK_Annot * pTopMostAnnot= (m_bIgnoreTopmost) ? NULL : pPageView->GetFocusAnnot();
912
913
914 int nCount =pAnnotList->GetSize();
915
916 for(int i = nCount- 1 ;i >= 0;i--)
917 {
918 CPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot*)pAnnotList->GetAt(i);
919 m_pIteratorAnnotList.Add(pReaderAnnot);
920 }
921
922 InsertSort(m_pIteratorAnnotList,&LyOrderCompare);
923
924 if(pTopMostAnnot)
925 {
926 for(int i=0 ;i<nCount;i++)
927 {
928 CPDFSDK_Annot * pReaderAnnot = (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i);
929 if(pReaderAnnot == pTopMostAnnot)
930 {
931 m_pIteratorAnnotList.RemoveAt(i);
932 m_pIteratorAnnotList.InsertAt(0, pReaderAnnot);
933 break;
934 }
935 }
936 }
937
938 return TRUE;
939 }
940
941