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
672 if (!pWidget->IsAppearanceValid())
673 pWidget->ResetAppearance(NULL, FALSE);
674
675 int nFieldType = pWidget->GetFieldType();
676
677 if (nFieldType == FIELDTYPE_TEXTFIELD || nFieldType == FIELDTYPE_COMBOBOX)
678 {
679 FX_BOOL bFormated = FALSE;
680 CFX_WideString sValue = pWidget->OnFormat(0, bFormated);
681
682 if (bFormated && nFieldType == FIELDTYPE_COMBOBOX)
683 {
684 pWidget->ResetAppearance(sValue, FALSE);
685 }
686 }
687
688
689 if (m_pFormFiller)
690 m_pFormFiller->OnLoad(pAnnot);
691
692 }
693 }
694
OnSetFocus(CPDFSDK_Annot * pAnnot,FX_DWORD nFlag)695 FX_BOOL CPDFSDK_BFAnnotHandler::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
696 {
697 ASSERT(pAnnot != NULL);
698 CFX_ByteString sSubType = pAnnot->GetSubType();
699
700 if (sSubType == BFFT_SIGNATURE)
701 {
702 }
703 else
704 {
705 if (m_pFormFiller)
706 return m_pFormFiller->OnSetFocus(pAnnot,nFlag);
707 }
708
709 return TRUE;
710 }
OnKillFocus(CPDFSDK_Annot * pAnnot,FX_DWORD nFlag)711 FX_BOOL CPDFSDK_BFAnnotHandler::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag)
712 {
713 ASSERT(pAnnot != NULL);
714 CFX_ByteString sSubType = pAnnot->GetSubType();
715
716 if (sSubType == BFFT_SIGNATURE)
717 {
718 }
719 else
720 {
721 if (m_pFormFiller)
722 return m_pFormFiller->OnKillFocus(pAnnot,nFlag);
723 }
724
725 return TRUE;
726 }
727
GetViewBBox(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)728 CPDF_Rect CPDFSDK_BFAnnotHandler::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
729 {
730 ASSERT(pAnnot != NULL);
731 CFX_ByteString sSubType = pAnnot->GetSubType();
732
733 if (sSubType == BFFT_SIGNATURE)
734 {
735 }
736 else
737 {
738 if (m_pFormFiller)
739 return m_pFormFiller->GetViewBBox(pPageView, pAnnot);
740
741 }
742
743 return CPDF_Rect(0,0,0,0);
744 }
745
HitTest(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,const CPDF_Point & point)746 FX_BOOL CPDFSDK_BFAnnotHandler::HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point)
747 {
748 ASSERT(pPageView);
749 ASSERT(pAnnot);
750
751 CPDF_Rect rect = GetViewBBox(pPageView, pAnnot);
752 return rect.Contains(point.x, point.y);
753 }
754
755 //CReader_AnnotIteratorEx
756
CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView,FX_BOOL bReverse,FX_BOOL bIgnoreTopmost,FX_BOOL bCircle,CFX_PtrArray * pList)757 CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView,FX_BOOL bReverse,
758 FX_BOOL bIgnoreTopmost/*=FALSE*/,
759 FX_BOOL bCircle/*=FALSE*/,
760 CFX_PtrArray *pList/*=NULL*/)
761 {
762 ASSERT(pPageView);
763 m_bReverse=bReverse;
764 m_bIgnoreTopmost= bIgnoreTopmost;
765 m_bCircle=bCircle;
766 m_pIteratorAnnotList.RemoveAll();
767 InitIteratorAnnotList(pPageView,pList);
768 }
769
NextAnnot(const CPDFSDK_Annot * pCurrent)770 CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot (const CPDFSDK_Annot* pCurrent)
771 {
772
773 int index=-1;
774 int nCount=this->m_pIteratorAnnotList.GetSize();
775 if(pCurrent){
776 for(int i=0;i<nCount;i++){
777 CPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot *)m_pIteratorAnnotList.GetAt(i);
778 if(pReaderAnnot ==pCurrent){
779 index=i;
780 break;
781 }
782 }
783 }
784 return NextAnnot(index);
785 }
PrevAnnot(const CPDFSDK_Annot * pCurrent)786 CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot (const CPDFSDK_Annot*pCurrent)
787 {
788
789 int index=-1;
790 int nCount=this->m_pIteratorAnnotList.GetSize();
791 if(pCurrent){
792 for(int i=0;i<nCount;i++){
793 CPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i);
794 if(pReaderAnnot ==pCurrent){
795 index=i;
796 break;
797 }
798 }
799 }
800 return PrevAnnot(index);
801 }
NextAnnot(int & index)802 CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot (int& index)
803 {
804
805 int nCount=m_pIteratorAnnotList.GetSize();
806 if(nCount<=0) index=-1;
807 else{
808 if(index<0){
809 index=0;
810 }
811 else{
812 if(m_bCircle){
813 index=( index <nCount-1) ? (index+1) :0;
814 }
815 else{
816 index=( index <nCount-1) ? (index+1) :-1;
817 }
818
819 }
820 }
821 return (index <0) ? NULL : (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(index);
822 }
823
824
PrevAnnot(int & index)825 CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot (int& index)
826 {
827
828 int nCount=m_pIteratorAnnotList.GetSize();
829 if(nCount<=0) index=-1;
830 else{
831 if(index<0){
832 index=nCount-1;
833 }
834 else{
835 if(m_bCircle){
836 index = ( index >0) ? (index-1) :nCount-1;
837 }
838 else{
839 index = ( index >0) ? (index-1) :-1;
840 }
841 }
842 }
843 return (index <0) ? NULL : (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(index);
844 }
845
846
Next(const CPDFSDK_Annot * pCurrent)847 CPDFSDK_Annot*CPDFSDK_AnnotIterator::Next(const CPDFSDK_Annot* pCurrent)
848 {
849
850 return (m_bReverse) ? PrevAnnot(pCurrent):NextAnnot(pCurrent);
851
852 }
853
Prev(const CPDFSDK_Annot * pCurrent)854 CPDFSDK_Annot* CPDFSDK_AnnotIterator::Prev(const CPDFSDK_Annot* pCurrent)
855 {
856
857 return (m_bReverse) ? NextAnnot(pCurrent):PrevAnnot(pCurrent);
858 }
859
Next(int & index)860 CPDFSDK_Annot*CPDFSDK_AnnotIterator::Next(int& index )
861 {
862
863 return (m_bReverse) ? PrevAnnot(index):NextAnnot(index);
864
865 }
866
Prev(int & index)867 CPDFSDK_Annot* CPDFSDK_AnnotIterator::Prev(int& index )
868 {
869
870 return (m_bReverse) ? NextAnnot(index):PrevAnnot(index);
871 }
872
873
InsertSort(CFX_PtrArray & arrayList,AI_COMPARE pCompare)874 void CPDFSDK_AnnotIterator::InsertSort(CFX_PtrArray &arrayList, AI_COMPARE pCompare)
875 {
876 for (int i = 1; i < arrayList.GetSize(); i++)
877 {
878 if (pCompare((CPDFSDK_Annot*)(arrayList[i]) , (CPDFSDK_Annot*)(arrayList[i-1])) < 0)
879 {
880 int j = i-1;
881 CPDFSDK_Annot* pTemp = (CPDFSDK_Annot*)arrayList[i];
882
883 do
884 {
885 arrayList[j + 1] = arrayList[j];
886 } while (--j >= 0 && pCompare(pTemp, (CPDFSDK_Annot*)arrayList[j]) < 0);
887
888 arrayList[j+1] = pTemp;
889 }
890 }
891 }
892
LyOrderCompare(CPDFSDK_Annot * p1,CPDFSDK_Annot * p2)893 int LyOrderCompare(CPDFSDK_Annot* p1, CPDFSDK_Annot* p2)
894 {
895 if(p1->GetLayoutOrder() < p2->GetLayoutOrder())
896 return -1;
897 else if (p1->GetLayoutOrder() == p2->GetLayoutOrder())
898 return 0;
899 else
900 return 1;
901 }
902
InitIteratorAnnotList(CPDFSDK_PageView * pPageView,CFX_PtrArray * pAnnotList)903 FX_BOOL CPDFSDK_AnnotIterator::InitIteratorAnnotList(CPDFSDK_PageView* pPageView,CFX_PtrArray * pAnnotList)
904 {
905 ASSERT(pPageView);
906
907
908
909 if(pAnnotList==NULL){
910 pAnnotList=pPageView->GetAnnotList();
911 }
912
913 this->m_pIteratorAnnotList.RemoveAll();
914 if(!pAnnotList) return FALSE;
915
916 CPDFSDK_Annot * pTopMostAnnot= (m_bIgnoreTopmost) ? NULL : pPageView->GetFocusAnnot();
917
918
919 int nCount =pAnnotList->GetSize();
920
921 for(int i = nCount- 1 ;i >= 0;i--)
922 {
923 CPDFSDK_Annot * pReaderAnnot= (CPDFSDK_Annot*)pAnnotList->GetAt(i);
924 m_pIteratorAnnotList.Add(pReaderAnnot);
925 }
926
927 InsertSort(m_pIteratorAnnotList,&LyOrderCompare);
928
929 if(pTopMostAnnot)
930 {
931 for(int i=0 ;i<nCount;i++)
932 {
933 CPDFSDK_Annot * pReaderAnnot = (CPDFSDK_Annot*)m_pIteratorAnnotList.GetAt(i);
934 if(pReaderAnnot == pTopMostAnnot)
935 {
936 m_pIteratorAnnotList.RemoveAt(i);
937 m_pIteratorAnnotList.InsertAt(0, pReaderAnnot);
938 break;
939 }
940 }
941 }
942
943 return TRUE;
944 }
945
946