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