• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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