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