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#ifndef _FSDK_ANNOTHANDLER_H_ 8#define _FSDK_ANNOTHANDLER_H_ 9 10 11class CPDFDoc_Environment; 12class CFFL_IFormFiller; 13class CPDFSDK_PageView; 14class IPDFSDK_AnnotHandler 15{ 16 17public: 18 virtual ~IPDFSDK_AnnotHandler() {}; 19 20 virtual CFX_ByteString GetType() = 0; 21 22 virtual CFX_ByteString GetName() = 0; 23 24 virtual FX_BOOL CanAnswer(CPDFSDK_Annot* pAnnot) = 0; 25 26 27 virtual CPDFSDK_Annot* NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage) = 0; 28 29 virtual void ReleaseAnnot(CPDFSDK_Annot* pAnnot) = 0; 30 31 virtual void DeleteAnnot(CPDFSDK_Annot* pAnnot) = 0; 32 33 34 virtual CPDF_Rect GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) = 0; 35 36 virtual FX_BOOL HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point) = 0; 37 38 39 virtual void OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, 40 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, 41 FX_DWORD dwFlags) = 0; 42 43 virtual void OnDrawSleep(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, 44 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, 45 const CPDF_Rect& rcWindow, FX_DWORD dwFlags) = 0; 46 47 48 49 50 virtual void OnCreate(CPDFSDK_Annot* pAnnot) = 0; 51 52 virtual void OnLoad(CPDFSDK_Annot* pAnnot) = 0; 53 54 virtual void OnDelete(CPDFSDK_Annot* pAnnot) = 0; 55 56 virtual void OnRelease(CPDFSDK_Annot* pAnnot) = 0; 57 58 59 virtual void OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0; 60 virtual void OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0; 61 62 63 virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0; 64 virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0; 65 virtual FX_BOOL OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0; 66 virtual FX_BOOL OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0; 67 virtual FX_BOOL OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point) = 0; 68 virtual FX_BOOL OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0; 69 virtual FX_BOOL OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0; 70 virtual FX_BOOL OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) = 0; 71//by wjm. 72 virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags) = 0; 73 virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) = 0; 74 virtual FX_BOOL OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag) =0 ; 75 76 virtual void OnDeSelected(CPDFSDK_Annot* pAnnot) = 0; 77 virtual void OnSelected(CPDFSDK_Annot* pAnnot) = 0; 78 79 virtual FX_BOOL OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0; 80 virtual FX_BOOL OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) = 0; 81 82}; 83 84 85class CPDFSDK_BFAnnotHandler:public IPDFSDK_AnnotHandler 86{ 87public: 88 CPDFSDK_BFAnnotHandler(CPDFDoc_Environment* pApp):m_pFormFiller(NULL),m_pApp(pApp) {} 89 virtual ~CPDFSDK_BFAnnotHandler() {} 90public: 91 92 virtual CFX_ByteString GetType() {return CFX_ByteString("Widget");} 93 94 virtual CFX_ByteString GetName() {return CFX_ByteString("WidgetHandler");} 95 96 virtual FX_BOOL CanAnswer(CPDFSDK_Annot* pAnnot); 97 98 virtual CPDFSDK_Annot* NewAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPage); 99 100 virtual void ReleaseAnnot(CPDFSDK_Annot* pAnnot) ; 101 102 virtual void DeleteAnnot(CPDFSDK_Annot* pAnnot) {} 103 104 105 virtual CPDF_Rect GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot) ; 106 107 virtual FX_BOOL HitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point); 108 109 110 virtual void OnDraw(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, 111 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, 112 FX_DWORD dwFlags) ; 113 114 virtual void OnDrawSleep(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, 115 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, 116 const CPDF_Rect& rcWindow, FX_DWORD dwFlags) {} 117 118 119 virtual void OnCreate(CPDFSDK_Annot* pAnnot) ; 120 121 virtual void OnLoad(CPDFSDK_Annot* pAnnot) ; 122 123 virtual void OnDelete(CPDFSDK_Annot* pAnnot) {} 124 125 virtual void OnRelease(CPDFSDK_Annot* pAnnot) {} 126 127 128 virtual void OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) ; 129 virtual void OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlag) ; 130 131 132 virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ; 133 virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ; 134 virtual FX_BOOL OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ; 135 virtual FX_BOOL OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ; 136 virtual FX_BOOL OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point) ; 137 virtual FX_BOOL OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ; 138 virtual FX_BOOL OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) ; 139 virtual FX_BOOL OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point) {return FALSE;} 140 141//by wjm. 142 virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags); 143 virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag); 144 virtual FX_BOOL OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag); 145 146 virtual void OnDeSelected(CPDFSDK_Annot* pAnnot) {} 147 virtual void OnSelected(CPDFSDK_Annot* pAnnot) {} 148 149 virtual FX_BOOL OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag); 150 virtual FX_BOOL OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag); 151 152 void SetFormFiller(CFFL_IFormFiller* pFiller){m_pFormFiller = pFiller;} 153 CFFL_IFormFiller* GetFormFiller() {return m_pFormFiller;} 154private: 155 156 CPDFDoc_Environment* m_pApp; 157 CFFL_IFormFiller* m_pFormFiller; 158}; 159 160#define CBA_AnnotHandlerArray CFX_ArrayTemplate<IPDFSDK_AnnotHandler*> 161class CPDFSDK_AnnotHandlerMgr 162{ 163public: 164 // Destroy the handler 165 CPDFSDK_AnnotHandlerMgr(CPDFDoc_Environment* pApp); 166 virtual ~CPDFSDK_AnnotHandlerMgr() ; 167 168public: 169 void RegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler); 170 void UnRegisterAnnotHandler(IPDFSDK_AnnotHandler* pAnnotHandler); 171 172 virtual CPDFSDK_Annot* NewAnnot(CPDF_Annot * pAnnot, CPDFSDK_PageView *pPageView); 173 virtual void ReleaseAnnot(CPDFSDK_Annot * pAnnot); 174 175 virtual void Annot_OnCreate(CPDFSDK_Annot* pAnnot); 176 virtual void Annot_OnLoad(CPDFSDK_Annot* pAnnot); 177public: 178 IPDFSDK_AnnotHandler* GetAnnotHandler(CPDFSDK_Annot* pAnnot) const; 179 virtual void Annot_OnDraw(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, 180 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,FX_DWORD dwFlags); 181 182 virtual void Annot_OnMouseEnter(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags); 183 virtual void Annot_OnMouseExit(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags); 184 185 virtual FX_BOOL Annot_OnLButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point); 186 virtual FX_BOOL Annot_OnLButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point); 187 virtual FX_BOOL Annot_OnLButtonDblClk(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point); 188 189 virtual FX_BOOL Annot_OnMouseMove(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point); 190 virtual FX_BOOL Annot_OnMouseWheel(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, short zDelta, const CPDF_Point& point); 191 virtual FX_BOOL Annot_OnRButtonDown(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point); 192 virtual FX_BOOL Annot_OnRButtonUp(CPDFSDK_PageView * pPageView, CPDFSDK_Annot* pAnnot, FX_DWORD nFlags, const CPDF_Point& point); 193 194 195 virtual FX_BOOL Annot_OnChar(CPDFSDK_Annot* pAnnot, FX_DWORD nChar, FX_DWORD nFlags); 196 virtual FX_BOOL Annot_OnKeyDown(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag); 197 virtual FX_BOOL Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag); 198 199 virtual FX_BOOL Annot_OnSetFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag); 200 virtual FX_BOOL Annot_OnKillFocus(CPDFSDK_Annot* pAnnot, FX_DWORD nFlag); 201 202 virtual CPDF_Rect Annot_OnGetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot); 203 virtual FX_BOOL Annot_OnHitTest(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, const CPDF_Point& point); 204 205private: 206 IPDFSDK_AnnotHandler* GetAnnotHandler(const CFX_ByteString& sType) const; 207 CPDFSDK_Annot* GetNextAnnot(CPDFSDK_Annot* pSDKAnnot,FX_BOOL bNext); 208private: 209 CBA_AnnotHandlerArray m_Handlers; 210 CFX_MapByteStringToPtr m_mapType2Handler; 211 CPDFDoc_Environment* m_pApp; 212}; 213 214//#define CBF_Page2Accessible CFX_MapPtrTemplate<CPDFSDK_PageView*, IAccessible*> 215 216typedef int (*AI_COMPARE) (CPDFSDK_Annot* p1, CPDFSDK_Annot* p2); 217 218class CPDFSDK_AnnotIterator 219{ 220protected: 221 CPDFSDK_Annot* NextAnnot (const CPDFSDK_Annot* pCurrent) ; 222 CPDFSDK_Annot* PrevAnnot (const CPDFSDK_Annot* pCurrent) ; 223 CPDFSDK_Annot* NextAnnot(int& index ) ; 224 CPDFSDK_Annot* PrevAnnot(int& index ) ; 225public: 226 CPDFSDK_AnnotIterator(CPDFSDK_PageView * pPageView, FX_BOOL bReverse, 227 FX_BOOL bIgnoreTopmost=FALSE,FX_BOOL bCircle=FALSE,CFX_PtrArray* pList=NULL); 228 virtual CPDFSDK_Annot* Next (const CPDFSDK_Annot* pCurrent) ; 229 virtual CPDFSDK_Annot* Prev (const CPDFSDK_Annot* pCurrent) ; 230 virtual CPDFSDK_Annot* Next(int& index ) ; 231 virtual CPDFSDK_Annot* Prev(int& index ) ; 232 virtual int Count(){return m_pIteratorAnnotList.GetSize();} 233 234 virtual FX_BOOL InitIteratorAnnotList(CPDFSDK_PageView * pPageView,CFX_PtrArray* pList=NULL); 235 236 void InsertSort(CFX_PtrArray &arrayList, AI_COMPARE pCompare); 237protected: 238 // CFX_PtrList m_pIteratorAnnotList; 239 CFX_PtrArray m_pIteratorAnnotList; 240 FX_BOOL m_bReverse; 241 FX_BOOL m_bIgnoreTopmost; 242 FX_BOOL m_bCircle; 243}; 244 245 246 247#endif 248 249