Home | History | Annotate | Download | only in src
      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 	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 
    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 
    117 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 
    127 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 
    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 
    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 }
    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  }
    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 }
    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 }
    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 }
    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 }
    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 
    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 
    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 
    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 
    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 }
    279 FX_BOOL			CPDFSDK_AnnotHandlerMgr::Annot_OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)
    280 {
    281 	return FALSE;
    282 }
    283 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 
    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 }
    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 }
    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 
    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 
    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 
    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 
    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 
    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 }
    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 
    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 
    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 
    639 FX_BOOL CPDFSDK_BFAnnotHandler::OnKeyUp(CPDFSDK_Annot* pAnnot, int nKeyCode, int nFlag)
    640 {
    641 
    642 	return FALSE;
    643 }
    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 
    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 
    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 }
    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 
    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 
    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 
    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 
    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 }
    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 }
    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 
    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 
    847 CPDFSDK_Annot*CPDFSDK_AnnotIterator::Next(const CPDFSDK_Annot* pCurrent)
    848 {
    849 
    850 	return (m_bReverse) ? PrevAnnot(pCurrent):NextAnnot(pCurrent);
    851 
    852 }
    853 
    854 CPDFSDK_Annot*	CPDFSDK_AnnotIterator::Prev(const CPDFSDK_Annot* pCurrent)
    855 {
    856 
    857 	return (m_bReverse) ? NextAnnot(pCurrent):PrevAnnot(pCurrent);
    858 }
    859 
    860 CPDFSDK_Annot*CPDFSDK_AnnotIterator::Next(int& index )
    861 {
    862 
    863 	return (m_bReverse) ? PrevAnnot(index):NextAnnot(index);
    864 
    865 }
    866 
    867 CPDFSDK_Annot*	CPDFSDK_AnnotIterator::Prev(int& index )
    868 {
    869 
    870 	return (m_bReverse) ? NextAnnot(index):PrevAnnot(index);
    871 }
    872 
    873 
    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 
    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 
    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