Home | History | Annotate | Download | only in formfiller
      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/formfiller/FFL_FormFiller.h"
      8 #include "../../include/formfiller/FFL_IFormFiller.h"
      9 #include "../../include/formfiller/FFL_CheckBox.h"
     10 #include "../../include/formfiller/FFL_ComboBox.h"
     11 #include "../../include/formfiller/FFL_ListBox.h"
     12 #include "../../include/formfiller/FFL_PushButton.h"
     13 #include "../../include/formfiller/FFL_RadioButton.h"
     14 #include "../../include/formfiller/FFL_TextField.h"
     15 
     16 #define FFL_MAXLISTBOXHEIGHT		140.0f
     17 
     18 // HHOOK CFFL_IFormFiller::m_hookSheet = NULL;
     19 // MSG CFFL_IFormFiller::g_Msg;
     20 
     21 /* ----------------------------- CFFL_IFormFiller ----------------------------- */
     22 
     23 CFFL_IFormFiller::CFFL_IFormFiller(CPDFDoc_Environment* pApp) :
     24 	m_pApp(pApp),
     25 	m_bNotifying(FALSE)
     26 {
     27 }
     28 
     29 CFFL_IFormFiller::~CFFL_IFormFiller()
     30 {
     31 	FX_POSITION pos = m_Maps.GetStartPosition();
     32 	while (pos)
     33 	{
     34 		CPDFSDK_Annot * pAnnot = NULL;
     35 		CFFL_FormFiller * pFormFiller = NULL;
     36 		m_Maps.GetNextAssoc(pos,pAnnot,pFormFiller);
     37 		delete pFormFiller;
     38 	}
     39 	m_Maps.RemoveAll();
     40 }
     41 
     42 FX_BOOL	CFFL_IFormFiller::Annot_HitTest(CPDFSDK_PageView* pPageView,CPDFSDK_Annot* pAnnot, CPDF_Point point)
     43 {
     44 	CPDF_Rect rc = pAnnot->GetRect();
     45 	if(rc.Contains(point.x, point.y))
     46 		return TRUE;
     47 	return FALSE;
     48 }
     49 
     50 FX_RECT CFFL_IFormFiller::GetViewBBox(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot)
     51 {
     52 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
     53 	{
     54 		return pFormFiller->GetViewBBox(pPageView, pAnnot);
     55 	}
     56 	else
     57 	{
     58 		ASSERT(pPageView != NULL);
     59 		ASSERT(pAnnot != NULL);
     60 
     61 		CPDF_Annot* pPDFAnnot = pAnnot->GetPDFAnnot();
     62 		ASSERT(pPDFAnnot != NULL);
     63 
     64 		CPDF_Rect rcAnnot;
     65 		pPDFAnnot->GetRect(rcAnnot);
     66 
     67 // 		CRect rcWin;
     68 // 		pPageView->DocToWindow(rcAnnot, rcWin);
     69 		CPDF_Rect rcWin = CPWL_Utils::InflateRect(rcAnnot,1);
     70 //		rcWin.InflateRect(1, 1);
     71 
     72 		return rcWin.GetOutterRect();
     73 	}
     74 }
     75 
     76 void CFFL_IFormFiller::OnDraw(CPDFSDK_PageView* pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
     77 						CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
     78 						/*const CRect& rcWindow,*/ FX_DWORD dwFlags)
     79 {
     80 	ASSERT(pPageView != NULL);
     81 	CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
     82 
     83 	if (IsVisible(pWidget))
     84 	{
     85 		if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
     86 		{
     87  			if (pFormFiller->IsValid())
     88  			{
     89 				pFormFiller->OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
     90 
     91 				pAnnot->GetPDFPage();
     92 
     93 
     94 				CPDFSDK_Document* pDocument = m_pApp->GetCurrentDoc();
     95 				ASSERT(pDocument != NULL);
     96 
     97 				if (pDocument->GetFocusAnnot() == pAnnot)
     98 				{
     99 					CPDF_Rect rcFocus = pFormFiller->GetFocusBox(pPageView);
    100 					if (!rcFocus.IsEmpty())
    101 					{
    102 						CFX_PathData path;
    103 
    104 						path.SetPointCount(5);
    105 						path.SetPoint(0, rcFocus.left,  rcFocus.top, FXPT_MOVETO);
    106 						path.SetPoint(1, rcFocus.left,  rcFocus.bottom, FXPT_LINETO);
    107 						path.SetPoint(2, rcFocus.right,  rcFocus.bottom, FXPT_LINETO);
    108 						path.SetPoint(3, rcFocus.right,  rcFocus.top, FXPT_LINETO);
    109 						path.SetPoint(4, rcFocus.left,  rcFocus.top, FXPT_LINETO);
    110 
    111 						CFX_GraphStateData gsd;
    112 						gsd.SetDashCount(1);
    113 						gsd.m_DashArray[0] = 1.0f;
    114 						gsd.m_DashPhase = 0;
    115 
    116 						gsd.m_LineWidth = 1.0f;
    117 						pDevice->DrawPath(&path, pUser2Device, &gsd, 0, ArgbEncode(255,0,0,0), FXFILL_ALTERNATE);
    118 
    119 					//	::DrawFocusRect(hDC, &rcFocus);
    120 					}
    121 				}
    122 
    123 				return;
    124 			}
    125 		}
    126 
    127 		if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    128 			pFormFiller->OnDrawDeactive(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
    129 		else
    130 			pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
    131 
    132 		if (!IsReadOnly(pWidget) && IsFillingAllowed(pWidget))
    133 		{
    134 			pWidget->DrawShadow(pDevice, pPageView);
    135 		}
    136 
    137 	}
    138 }
    139 
    140 void CFFL_IFormFiller::OnCreate(CPDFSDK_Annot* pAnnot)
    141 {
    142 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    143 	{
    144 		pFormFiller->OnCreate(pAnnot);
    145 	}
    146 }
    147 
    148 void CFFL_IFormFiller::OnLoad(CPDFSDK_Annot* pAnnot)
    149 {
    150 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    151 	{
    152 		pFormFiller->OnLoad(pAnnot);
    153 	}
    154 }
    155 
    156 void CFFL_IFormFiller::OnDelete(CPDFSDK_Annot* pAnnot)
    157 {
    158 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    159 	{
    160 		pFormFiller->OnDelete(pAnnot);
    161 	}
    162 
    163 	UnRegisterFormFiller(pAnnot);
    164 }
    165 
    166 void CFFL_IFormFiller::OnMouseEnter(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
    167 {
    168 	ASSERT(pAnnot != NULL);
    169 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    170 
    171 	if (!m_bNotifying)
    172 	{
    173 		CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
    174 		if (pWidget->GetAAction(CPDF_AAction::CursorEnter))
    175 		{
    176 			m_bNotifying = TRUE;
    177 
    178 			int nValueAge = pWidget->GetValueAge();
    179 
    180 			pWidget->ClearAppModified();
    181 
    182 			ASSERT(pPageView != NULL);
    183 
    184 
    185 
    186 			PDFSDK_FieldAction fa;
    187 			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
    188  			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
    189 			pWidget->OnAAction(CPDF_AAction::CursorEnter, fa, pPageView );
    190 			m_bNotifying = FALSE;
    191 
    192 			//if ( !IsValidAnnot(pPageView, pAnnot) ) return;
    193 
    194 			if (pWidget->IsAppModified())
    195 			{
    196 				if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
    197 				{
    198 					pFormFiller->ResetPDFWindow(pPageView, pWidget->GetValueAge() == nValueAge);
    199 				}
    200 			}
    201 		}
    202 	}
    203 
    204 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
    205 	{
    206 		pFormFiller->OnMouseEnter(pPageView, pAnnot);
    207 	}
    208 }
    209 
    210 void CFFL_IFormFiller::OnMouseExit(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
    211 {
    212 	ASSERT(pAnnot != NULL);
    213 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    214 
    215 	if (!m_bNotifying)
    216 	{
    217 		CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
    218 		if (pWidget->GetAAction(CPDF_AAction::CursorExit))
    219 		{
    220 			m_bNotifying = TRUE;
    221 			pWidget->GetAppearanceAge();
    222 			int nValueAge = pWidget->GetValueAge();
    223 			pWidget->ClearAppModified();
    224 
    225 			ASSERT(pPageView != NULL);
    226 
    227 
    228 
    229 			PDFSDK_FieldAction fa;
    230 			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
    231  			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
    232 
    233 			pWidget->OnAAction(CPDF_AAction::CursorExit, fa, pPageView);
    234 			m_bNotifying = FALSE;
    235 
    236 			//if (!IsValidAnnot(pPageView, pAnnot)) return;
    237 
    238 			if (pWidget->IsAppModified())
    239 			{
    240 				if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
    241 				{
    242 					pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
    243 				}
    244 			}
    245 		}
    246 	}
    247 
    248 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    249 	{
    250 		pFormFiller->OnMouseExit(pPageView, pAnnot);
    251 	}
    252 }
    253 
    254 FX_BOOL	CFFL_IFormFiller::OnLButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
    255 {
    256 	ASSERT(pAnnot != NULL);
    257 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    258 
    259 	if (!m_bNotifying)
    260 	{
    261 		CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
    262 		if (Annot_HitTest(pPageView, pAnnot, point) && pWidget->GetAAction(CPDF_AAction::ButtonDown))
    263 		{
    264 			m_bNotifying = TRUE;
    265 			pWidget->GetAppearanceAge();
    266 			int nValueAge = pWidget->GetValueAge();
    267 			pWidget->ClearAppModified();
    268 
    269 			ASSERT(pPageView != NULL);
    270 
    271 
    272 
    273 			PDFSDK_FieldAction fa;
    274 			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlags);
    275  			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlags);
    276 			pWidget->OnAAction(CPDF_AAction::ButtonDown, fa, pPageView);
    277 			m_bNotifying = FALSE;
    278 
    279 			if (!IsValidAnnot(pPageView, pAnnot)) return TRUE;
    280 
    281 			if (pWidget->IsAppModified())
    282 			{
    283 				if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
    284 				{
    285 					pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
    286 				}
    287 			}
    288 		}
    289 	}
    290 
    291 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    292 	{
    293 		return pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point);
    294 	}
    295 
    296 	return FALSE;
    297 }
    298 
    299 FX_BOOL	CFFL_IFormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
    300 {
    301 	ASSERT(pAnnot != NULL);
    302 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    303 
    304 	CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
    305 	// 	CReader_Page* pPage = pAnnot->GetPage();
    306 	// 	ASSERT(pPage != NULL);
    307 	CPDFSDK_Document* pDocument = m_pApp->GetCurrentDoc();
    308 	ASSERT(pDocument != NULL);
    309 
    310 	switch (pWidget->GetFieldType())
    311 	{
    312 	case FIELDTYPE_PUSHBUTTON:
    313 	case FIELDTYPE_CHECKBOX:
    314 	case FIELDTYPE_RADIOBUTTON:
    315 		if (GetViewBBox(pPageView, pAnnot).Contains((int)point.x, (int)point.y))
    316 		{
    317 			pDocument->SetFocusAnnot(pAnnot);
    318 		}
    319 		break;
    320 	default:
    321 		pDocument->SetFocusAnnot(pAnnot);
    322 		break;
    323 	}
    324 
    325 	FX_BOOL bRet = FALSE;
    326 
    327 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    328 	{
    329 		bRet = pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point);
    330 	}
    331 
    332 	if (pDocument->GetFocusAnnot() == pAnnot)
    333 	{
    334 		FX_BOOL bExit = FALSE;
    335 		FX_BOOL bReset = FALSE;
    336 		OnButtonUp(pWidget, pPageView, bReset, bExit,nFlags);
    337 		if (bExit) return TRUE;
    338 	}
    339 	return bRet;
    340 }
    341 
    342 void CFFL_IFormFiller::OnButtonUp(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bReset, FX_BOOL& bExit,FX_UINT nFlag)
    343 {
    344 	ASSERT(pWidget != NULL);
    345 
    346 	if (!m_bNotifying)
    347 	{
    348 		if (pWidget->GetAAction(CPDF_AAction::ButtonUp))
    349 		{
    350 			m_bNotifying = TRUE;
    351 			int nAge = pWidget->GetAppearanceAge();
    352 			int nValueAge = pWidget->GetValueAge();
    353 
    354 			ASSERT(pPageView != NULL);
    355 // 			CReader_DocView* pDocView = pPageView->GetDocView();
    356 // 			ASSERT(pDocView != NULL);
    357 
    358 
    359 
    360 			PDFSDK_FieldAction fa;
    361 			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
    362  			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
    363 
    364 			pWidget->OnAAction(CPDF_AAction::ButtonUp, fa, pPageView);
    365 			m_bNotifying = FALSE;
    366 
    367 			if (!IsValidAnnot(pPageView, pWidget))
    368 			{
    369 				bExit = TRUE;
    370 				return;
    371 			}
    372 
    373 			if (nAge != pWidget->GetAppearanceAge())
    374 			{
    375 				if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
    376 				{
    377 					pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
    378 				}
    379 
    380 				bReset = TRUE;
    381 			}
    382 		}
    383 	}
    384 }
    385 
    386 FX_BOOL	CFFL_IFormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
    387 {
    388 	ASSERT(pAnnot != NULL);
    389 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    390 
    391 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    392 	{
    393 		return pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
    394 	}
    395 
    396 	return FALSE;
    397 }
    398 
    399 FX_BOOL	CFFL_IFormFiller::OnMouseMove(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
    400 {
    401 	ASSERT(pAnnot != NULL);
    402 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    403 
    404 	//change cursor
    405 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
    406 	{
    407 		return pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point);
    408 	}
    409 
    410 	return FALSE;
    411 }
    412 
    413 FX_BOOL	CFFL_IFormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point)
    414 {
    415 	ASSERT(pAnnot != NULL);
    416 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    417 
    418 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    419 	{
    420 		return pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, zDelta, point);
    421 	}
    422 
    423 	return FALSE;
    424 }
    425 
    426 FX_BOOL	CFFL_IFormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
    427 {
    428 	ASSERT(pAnnot != NULL);
    429 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    430 
    431 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    432 	{
    433 		return pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point);
    434 	}
    435 
    436 	return FALSE;
    437 }
    438 
    439 FX_BOOL	CFFL_IFormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
    440 {
    441 	ASSERT(pAnnot != NULL);
    442 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    443 
    444 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    445 	{
    446 		return pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point);
    447 	}
    448 
    449 	return FALSE;
    450 }
    451 
    452 FX_BOOL	CFFL_IFormFiller::OnRButtonDblClk(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
    453 {
    454 	ASSERT(pAnnot != NULL);
    455 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    456 
    457 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    458 	{
    459 		return pFormFiller->OnRButtonDblClk(pPageView, pAnnot, nFlags, point);
    460 	}
    461 
    462 	return FALSE;
    463 }
    464 
    465 FX_BOOL	CFFL_IFormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)
    466 {
    467 	ASSERT(pAnnot != NULL);
    468 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    469 
    470 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    471 	{
    472 		return pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlags);
    473 	}
    474 
    475 	return FALSE;
    476 }
    477 
    478 FX_BOOL	CFFL_IFormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
    479 {
    480 	ASSERT(pAnnot != NULL);
    481 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    482 
    483 	if (nChar == FWL_VKEY_Tab) return TRUE;
    484 
    485 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    486 	{
    487 		return pFormFiller->OnChar(pAnnot, nChar, nFlags);
    488 	}
    489 
    490 	return FALSE;
    491 }
    492 
    493 void CFFL_IFormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot)
    494 {
    495 	ASSERT(pAnnot != NULL);
    496 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    497 
    498 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    499 	{
    500 		pFormFiller->OnDeSelected(pAnnot);
    501 	}
    502 }
    503 
    504 void CFFL_IFormFiller::OnSelected(CPDFSDK_Annot* pAnnot)
    505 {
    506 	ASSERT(pAnnot != NULL);
    507 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    508 
    509 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    510 	{
    511 		pFormFiller->OnSelected(pAnnot);
    512 	}
    513 }
    514 
    515 FX_BOOL CFFL_IFormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)
    516 {
    517 	if(!pAnnot) return FALSE;
    518 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    519 
    520 	if (!m_bNotifying)
    521 	{
    522 		CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
    523  		if (pWidget->GetAAction(CPDF_AAction::GetFocus))
    524  		{
    525   			m_bNotifying = TRUE;
    526 			pWidget->GetAppearanceAge();
    527 			int nValueAge = pWidget->GetValueAge();
    528  			pWidget->ClearAppModified();
    529 
    530 
    531  			CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
    532  			ASSERT(pPageView != NULL);
    533 
    534  			PDFSDK_FieldAction fa;
    535 			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
    536  			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
    537 
    538 
    539  			CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, TRUE);
    540  			if(!pFormFiller) return FALSE;
    541  			pFormFiller->GetActionData(pPageView, CPDF_AAction::GetFocus, fa);
    542 
    543  			pWidget->OnAAction(CPDF_AAction::GetFocus, fa, pPageView);
    544  			m_bNotifying = FALSE;
    545 
    546  //			if (!IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pAnnot)) return FALSE;
    547 
    548  			if (pWidget->IsAppModified())
    549  			{
    550  				if (CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE))
    551  				{
    552  					pFormFiller->ResetPDFWindow(pPageView, nValueAge == pWidget->GetValueAge());
    553  				}
    554  			}
    555 		}
    556 	}
    557 
    558 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, TRUE))
    559 	{
    560 		if (pFormFiller->OnSetFocus(pAnnot, nFlag))
    561 		{
    562 			return TRUE;
    563 		}
    564 		else
    565 			return FALSE;
    566 	}
    567 
    568 	return TRUE;
    569 }
    570 
    571 FX_BOOL	CFFL_IFormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot,FX_UINT nFlag)
    572 {
    573 	if(!pAnnot) return FALSE;
    574 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    575 
    576 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pAnnot, FALSE))
    577 	{
    578 		if (pFormFiller->OnKillFocus(pAnnot, nFlag))
    579 		{
    580  			if (!m_bNotifying)
    581  			{
    582  				CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
    583  				if (pWidget->GetAAction(CPDF_AAction::LoseFocus))
    584  				{
    585  					m_bNotifying = TRUE;
    586  					pWidget->ClearAppModified();
    587 
    588  					CPDFSDK_PageView* pPageView = pWidget->GetPageView();
    589  					ASSERT(pPageView != NULL);
    590 
    591  					PDFSDK_FieldAction fa;
    592 					fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
    593  					fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
    594 
    595  					pFormFiller->GetActionData(pPageView, CPDF_AAction::LoseFocus, fa);
    596 
    597  					pWidget->OnAAction(CPDF_AAction::LoseFocus, fa, pPageView);
    598  					m_bNotifying = FALSE;
    599 
    600  				}
    601  			}
    602 		}
    603 		else
    604 			return FALSE;
    605 	}
    606 
    607 	return TRUE;
    608 }
    609 
    610 FX_BOOL	CFFL_IFormFiller::IsVisible(CPDFSDK_Widget* pWidget)
    611 {
    612 	return pWidget->IsVisible();
    613 }
    614 
    615 FX_BOOL	CFFL_IFormFiller::IsReadOnly(CPDFSDK_Widget* pWidget)
    616 {
    617 	ASSERT(pWidget != NULL);
    618 
    619 	int nFieldFlags = pWidget->GetFieldFlags();
    620 
    621 	return (nFieldFlags & FIELDFLAG_READONLY) == FIELDFLAG_READONLY;
    622 }
    623 
    624 FX_BOOL	CFFL_IFormFiller::IsFillingAllowed(CPDFSDK_Widget* pWidget)
    625 {
    626 	ASSERT(pWidget != NULL);
    627 
    628 	if (pWidget->GetFieldType() == FIELDTYPE_PUSHBUTTON)
    629 		return TRUE;
    630  	else
    631  	{
    632  		CPDF_Page* pPage = pWidget->GetPDFPage();
    633  		ASSERT(pPage != NULL);
    634 
    635  		CPDF_Document* pDocument = pPage->m_pDocument;
    636  		ASSERT(pDocument != NULL);
    637 
    638 		FX_DWORD dwPermissions = pDocument->GetUserPermissions();
    639  		return (dwPermissions&FPDFPERM_FILL_FORM) ||
    640  				(dwPermissions&FPDFPERM_ANNOT_FORM) ||
    641  			(dwPermissions&FPDFPERM_MODIFY);
    642  	}
    643 	return TRUE;
    644 }
    645 
    646 CFFL_FormFiller* CFFL_IFormFiller::GetFormFiller(CPDFSDK_Annot* pAnnot, FX_BOOL bRegister)
    647 {
    648 // 	ASSERT(pAnnot != NULL);
    649 // 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
    650 
    651 	CFFL_FormFiller * pFormFiller = NULL;
    652 	m_Maps.Lookup(pAnnot, pFormFiller);
    653 
    654 	if (pFormFiller)
    655 		return pFormFiller;
    656 
    657 	if (bRegister)
    658 	{
    659 		CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
    660 
    661 		int nFieldType = pWidget->GetFieldType();
    662 		switch(nFieldType)
    663 		{
    664  		case FIELDTYPE_PUSHBUTTON:
    665  			pFormFiller = new CFFL_PushButton(m_pApp, pWidget);
    666  			break;
    667 		case FIELDTYPE_CHECKBOX:
    668 			pFormFiller = new CFFL_CheckBox(m_pApp, pWidget);
    669 			break;
    670  		case FIELDTYPE_RADIOBUTTON:
    671  			pFormFiller = new CFFL_RadioButton(m_pApp, pWidget);
    672  			break;
    673  		case FIELDTYPE_TEXTFIELD:
    674 			pFormFiller = new CFFL_TextField(m_pApp, pWidget);
    675 			break;
    676 		case FIELDTYPE_LISTBOX:
    677 			pFormFiller = new CFFL_ListBox(m_pApp, pWidget);
    678 			break;
    679 		case FIELDTYPE_COMBOBOX:
    680 			pFormFiller = new CFFL_ComboBox(m_pApp, pWidget);
    681 			break;
    682 		case FIELDTYPE_UNKNOWN:
    683 		default:
    684 			pFormFiller = NULL;
    685 			break;
    686 		}
    687 
    688 		if (pFormFiller)
    689 		{
    690 			m_Maps.SetAt(pAnnot, pFormFiller);
    691 		}
    692 	}
    693 
    694 	return pFormFiller;
    695 }
    696 
    697 void CFFL_IFormFiller::RemoveFormFiller(CPDFSDK_Annot* pAnnot)
    698 {
    699 	if ( pAnnot != NULL )
    700 	{
    701 		UnRegisterFormFiller( pAnnot );
    702 	}
    703 }
    704 
    705 void CFFL_IFormFiller::UnRegisterFormFiller(CPDFSDK_Annot* pAnnot)
    706 {
    707 	CFFL_FormFiller * pFormFiller = NULL;
    708 
    709 	if (m_Maps.Lookup(pAnnot,pFormFiller))
    710 	{
    711 		if (pFormFiller)
    712 			delete pFormFiller;
    713 		m_Maps.RemoveKey(pAnnot);
    714 	}
    715 }
    716 
    717 void CFFL_IFormFiller::SetFocusAnnotTab(CPDFSDK_Annot* pWidget, FX_BOOL bSameField, FX_BOOL bNext)
    718 {
    719 
    720 }
    721 
    722 void CFFL_IFormFiller::QueryWherePopup(void* pPrivateData, FX_FLOAT fPopupMin,FX_FLOAT fPopupMax, FX_INT32 & nRet, FX_FLOAT & fPopupRet)
    723 {
    724 	ASSERT(pPrivateData != NULL);
    725 
    726 	CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
    727 
    728 
    729 
    730 
    731 	CPDF_Rect rcPageView(0,0,0,0);
    732 	rcPageView.right = pData->pWidget->GetPDFPage()->GetPageWidth();
    733 	rcPageView.bottom = pData->pWidget->GetPDFPage()->GetPageHeight();
    734 	rcPageView.Normalize();
    735 
    736 
    737 	ASSERT(pData->pWidget != NULL);
    738 	CPDF_Rect rcAnnot = pData->pWidget->GetRect();
    739 
    740 	FX_FLOAT fTop = 0.0f;
    741 	FX_FLOAT fBottom = 0.0f;
    742 
    743 	CPDFSDK_Widget * pWidget = (CPDFSDK_Widget*)pData->pWidget;
    744 	switch (pWidget->GetRotate() / 90)
    745 	{
    746 	default:
    747 	case 0:
    748 		fTop = rcPageView.top - rcAnnot.top;
    749 		fBottom = rcAnnot.bottom - rcPageView.bottom;
    750 		break;
    751 	case 1:
    752 		fTop = rcAnnot.left - rcPageView.left;
    753 		fBottom = rcPageView.right - rcAnnot.right;
    754 		break;
    755 	case 2:
    756 		fTop = rcAnnot.bottom - rcPageView.bottom;
    757 		fBottom = rcPageView.top - rcAnnot.top;
    758 		break;
    759 	case 3:
    760 		fTop = rcPageView.right - rcAnnot.right;
    761 		fBottom = rcAnnot.left - rcPageView.left;
    762 		break;
    763 	}
    764 
    765 	FX_FLOAT fFactHeight = 0;
    766 	FX_BOOL bBottom = TRUE;
    767 	FX_FLOAT fMaxListBoxHeight = 0;
    768 	if (fPopupMax > FFL_MAXLISTBOXHEIGHT)
    769 	{
    770 		if (fPopupMin > FFL_MAXLISTBOXHEIGHT)
    771 		{
    772 			fMaxListBoxHeight = fPopupMin;
    773 		}
    774 		else
    775 		{
    776 			fMaxListBoxHeight = FFL_MAXLISTBOXHEIGHT;
    777 		}
    778 	}
    779 	else
    780 		fMaxListBoxHeight = fPopupMax;
    781 
    782 	if (fBottom > fMaxListBoxHeight)
    783 	{
    784 		fFactHeight = fMaxListBoxHeight;
    785 		bBottom = TRUE;
    786 	}
    787 	else
    788 	{
    789 		if (fTop > fMaxListBoxHeight)
    790 		{
    791 			fFactHeight = fMaxListBoxHeight;
    792 			bBottom = FALSE;
    793 		}
    794 		else
    795 		{
    796 			if (fTop > fBottom)
    797 			{
    798 				fFactHeight = fTop;
    799 				bBottom = FALSE;
    800 			}
    801 			else
    802 			{
    803 				fFactHeight = fBottom;
    804 				bBottom = TRUE;
    805 			}
    806 		}
    807 	}
    808 
    809 	nRet = bBottom ? 0 : 1;
    810 	fPopupRet = fFactHeight;
    811 }
    812 
    813 void CFFL_IFormFiller::OnSetWindowRect(void* pPrivateData, const CPDF_Rect & rcWindow)
    814 {
    815 	ASSERT(pPrivateData != NULL);
    816 
    817 	CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
    818 
    819 	if (CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, TRUE))
    820 	{
    821 
    822 		CPDF_Rect rcOld = pFormFiller->PWLtoFFL(pFormFiller->GetWindowRect(pData->pPageView));
    823 		CPDF_Rect rcNew = pFormFiller->PWLtoFFL(rcWindow);
    824 		pFormFiller->SetWindowRect(pData->pPageView, rcWindow);
    825 
    826 		CPDF_Rect unRect = rcOld;
    827 		unRect.Union(rcNew);
    828 		//FX_RECT rcRect = unRect.GetOutterRect();
    829 		unRect.left = (FX_FLOAT)(unRect.left - 0.5);
    830 		unRect.right = (FX_FLOAT)(unRect.right + 0.5);
    831 		unRect.top = (FX_FLOAT)(unRect.top + 0.5);
    832 		unRect.bottom = (FX_FLOAT)(unRect.bottom -0.5);
    833 		m_pApp->FFI_Invalidate(pData->pWidget->GetPDFPage(), unRect.left, unRect.top, unRect.right, unRect.bottom);
    834 	}
    835 }
    836 
    837 void CFFL_IFormFiller::OnKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode, CFX_WideString& strChange,
    838 								   const CFX_WideString& strChangeEx, FX_BOOL bKeyDown,
    839 								   FX_BOOL & bRC, FX_BOOL & bExit)
    840 {
    841 	ASSERT(pPrivateData != NULL);
    842 	CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
    843 	ASSERT(pData->pWidget != NULL);
    844 
    845 	CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
    846 	ASSERT(pFormFiller != NULL);
    847 
    848 	pFormFiller->OnKeyStroke(bKeyDown);
    849 }
    850 
    851 void CFFL_IFormFiller::OnKeyStrokeCommit(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag)
    852 {
    853 	if (!m_bNotifying)
    854 	{
    855 		ASSERT(pWidget != NULL);
    856 		if (pWidget->GetAAction(CPDF_AAction::KeyStroke))
    857 		{
    858 			m_bNotifying = TRUE;
    859 			pWidget->ClearAppModified();
    860 
    861 			ASSERT(pPageView != NULL);
    862 // 			CReader_DocView* pDocView = pPageView->GetDocView();
    863 // 			ASSERT(pDocView != NULL);
    864 
    865 
    866 
    867 			PDFSDK_FieldAction fa;
    868 			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
    869  			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
    870 			fa.bWillCommit = TRUE;
    871 			fa.nCommitKey = GetCommitKey();
    872 			fa.bKeyDown = GetKeyDown();
    873 			fa.bRC = TRUE;
    874 
    875 			CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);
    876 			ASSERT(pFormFiller != NULL);
    877 
    878 			pFormFiller->GetActionData(pPageView, CPDF_AAction::KeyStroke, fa);
    879 			pFormFiller->SaveState(pPageView);
    880 
    881 			PDFSDK_FieldAction faOld = fa;
    882 			pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pPageView);
    883 
    884 			bRC = fa.bRC;
    885 //			bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
    886 
    887 			m_bNotifying = FALSE;
    888 		}
    889 	}
    890 }
    891 
    892 void CFFL_IFormFiller::OnValidate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bRC, FX_BOOL& bExit, FX_DWORD nFlag)
    893 {
    894 	if (!m_bNotifying)
    895 	{
    896 		ASSERT(pWidget != NULL);
    897 		if (pWidget->GetAAction(CPDF_AAction::Validate))
    898 		{
    899 			m_bNotifying = TRUE;
    900 			pWidget->ClearAppModified();
    901 
    902 			ASSERT(pPageView != NULL);
    903 // 			CReader_DocView* pDocView = pPageView->GetDocView();
    904 // 			ASSERT(pDocView != NULL);
    905 
    906 
    907 
    908 			PDFSDK_FieldAction fa;
    909 			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
    910  			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
    911 			fa.bKeyDown = GetKeyDown();
    912 			fa.bRC = TRUE;
    913 
    914 			CFFL_FormFiller* pFormFiller = GetFormFiller(pWidget, FALSE);
    915 			ASSERT(pFormFiller != NULL);
    916 
    917 			pFormFiller->GetActionData(pPageView, CPDF_AAction::Validate, fa);
    918 			pFormFiller->SaveState(pPageView);
    919 
    920 			PDFSDK_FieldAction faOld = fa;
    921 			pWidget->OnAAction(CPDF_AAction::Validate, fa, pPageView);
    922 
    923 			bRC = fa.bRC;
    924 //			bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
    925 
    926 			m_bNotifying = FALSE;
    927 		}
    928 	}
    929 }
    930 
    931 void CFFL_IFormFiller::OnCalculate(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag)
    932 {
    933 	if (!m_bNotifying)
    934 	{
    935 		ASSERT(pWidget != NULL);
    936 		ASSERT(pPageView != NULL);
    937 // 		CReader_DocView* pDocView = pPageView->GetDocView();
    938 // 		ASSERT(pDocView != NULL);
    939 		CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
    940 		ASSERT(pDocument != NULL);
    941 
    942 		CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
    943 		ASSERT(pInterForm != NULL);
    944 
    945 		pInterForm->OnCalculate(pWidget->GetFormField());
    946 
    947 //		bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
    948 
    949 		m_bNotifying = FALSE;
    950 	}
    951 }
    952 
    953 void CFFL_IFormFiller::OnFormat(CPDFSDK_Widget* pWidget, CPDFSDK_PageView* pPageView, FX_BOOL& bExit, FX_DWORD nFlag)
    954 {
    955 	if (!m_bNotifying)
    956 	{
    957 		ASSERT(pWidget != NULL);
    958 		ASSERT(pPageView != NULL);
    959 // 		CReader_DocView* pDocView = pPageView->GetDocView();
    960 // 		ASSERT(pDocView != NULL);
    961 		CPDFSDK_Document* pDocument = pPageView->GetSDKDocument();
    962 		ASSERT(pDocument != NULL);
    963 
    964 		CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
    965 		ASSERT(pInterForm != NULL);
    966 
    967 		FX_BOOL bFormated = FALSE;
    968 		CFX_WideString sValue = pInterForm->OnFormat(pWidget->GetFormField(), GetCommitKey(), bFormated);
    969 
    970 //		bExit = !IsValidAnnot(m_pApp, pDocument, pDocView, pPageView, pWidget);
    971 
    972 		if (bExit) return;
    973 
    974 		if (bFormated)
    975 		{
    976 			pInterForm->ResetFieldAppearance(pWidget->GetFormField(), sValue, TRUE);
    977 			pInterForm->UpdateField(pWidget->GetFormField());
    978 		}
    979 
    980 		m_bNotifying = FALSE;
    981 	}
    982 }
    983 
    984 // LRESULT CALLBACK CFFL_IFormFiller::FFL_WndProc(
    985 // 									  int code,       // hook code
    986 // 									  WPARAM wParam,  // virtual-key code
    987 // 									  LPARAM lParam   // keystroke-message information
    988 // 										)
    989 // {
    990 // 	if (code != HC_ACTION)
    991 // 	{
    992 // 		return CallNextHookEx (m_hookSheet, code, wParam, lParam);
    993 // 	}
    994 //
    995 // 	FXSYS_memcpy(&g_Msg, (void*)lParam, sizeof(MSG));
    996 //
    997 // 	return 0;
    998 // }
    999 
   1000 // MSG	CFFL_IFormFiller::GetLastMessage()
   1001 // {
   1002 // 	return g_Msg;
   1003 // }
   1004 
   1005 int CFFL_IFormFiller::GetCommitKey()
   1006 {
   1007 //	MSG msg = CFFL_IFormFiller::GetLastMessage();
   1008 
   1009 	int nCommitKey = 0;
   1010 // 	switch (msg.message)
   1011 // 	{
   1012 // 	case WM_LBUTTONDOWN:
   1013 // 	case WM_LBUTTONUP:
   1014 // 		nCommitKey = 1;
   1015 // 		break;
   1016 // 	case WM_KEYDOWN:
   1017 // 		switch (msg.wParam)
   1018 // 		{
   1019 // 		case VK_RETURN:
   1020 // 			nCommitKey = 2;
   1021 // 			break;
   1022 // 		case VK_TAB:
   1023 // 			nCommitKey = 3;
   1024 // 			break;
   1025 // 		}
   1026 // 		break;
   1027 // 	}
   1028 
   1029 	return nCommitKey;
   1030 }
   1031 
   1032 FX_BOOL CFFL_IFormFiller::GetKeyDown()
   1033 {
   1034 	return TRUE;
   1035 // 	MSG msg = CFFL_IFormFiller::GetLastMessage();
   1036 //
   1037 // 	return msg.message == WM_KEYDOWN || msg.message == WM_CHAR;
   1038 }
   1039 
   1040 FX_BOOL	CFFL_IFormFiller::IsValidAnnot(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot)
   1041 {
   1042 
   1043 	ASSERT(pPageView != NULL);
   1044 	ASSERT(pAnnot != NULL);
   1045 
   1046 	if(pPageView)
   1047 		return pPageView->IsValidAnnot(pAnnot->GetPDFAnnot());
   1048 	else
   1049 		return FALSE;
   1050 }
   1051 
   1052 void CFFL_IFormFiller::BeforeUndo(CPDFSDK_Document* pDocument)
   1053 {
   1054 
   1055 }
   1056 
   1057 void CFFL_IFormFiller::BeforeRedo(CPDFSDK_Document* pDocument)
   1058 {
   1059 	BeforeUndo(pDocument);
   1060 }
   1061 
   1062 void CFFL_IFormFiller::AfterUndo(CPDFSDK_Document* pDocument)
   1063 {
   1064 }
   1065 
   1066 void CFFL_IFormFiller::AfterRedo(CPDFSDK_Document* pDocument)
   1067 {
   1068 }
   1069 
   1070 FX_BOOL	CFFL_IFormFiller::CanCopy(CPDFSDK_Document* pDocument)
   1071 {
   1072 
   1073 	return FALSE;
   1074 }
   1075 
   1076 FX_BOOL	CFFL_IFormFiller::CanCut(CPDFSDK_Document* pDocument)
   1077 {
   1078 
   1079 	return FALSE;
   1080 }
   1081 
   1082 FX_BOOL	CFFL_IFormFiller::CanPaste(CPDFSDK_Document* pDocument)
   1083 {
   1084 
   1085 	return FALSE;
   1086 }
   1087 
   1088 void CFFL_IFormFiller::DoCopy(CPDFSDK_Document* pDocument)
   1089 {
   1090 }
   1091 
   1092 void CFFL_IFormFiller::DoCut(CPDFSDK_Document* pDocument)
   1093 {
   1094 }
   1095 
   1096 void CFFL_IFormFiller::DoPaste(CPDFSDK_Document* pDocument)
   1097 {
   1098 
   1099 }
   1100 void CFFL_IFormFiller::OnBeforeKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_INT32 nKeyCode,
   1101 											  CFX_WideString & strChange, const CFX_WideString& strChangeEx,
   1102 											  int nSelStart, int nSelEnd,
   1103 										FX_BOOL bKeyDown, FX_BOOL & bRC, FX_BOOL & bExit, FX_DWORD nFlag)
   1104 {
   1105 	ASSERT(pPrivateData != NULL);
   1106 	CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
   1107 	ASSERT(pData->pWidget != NULL);
   1108 
   1109 	CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
   1110 	ASSERT(pFormFiller != NULL);
   1111 
   1112 	if (!m_bNotifying)
   1113 	{
   1114 		if (pData->pWidget->GetAAction(CPDF_AAction::KeyStroke))
   1115 		{
   1116 			m_bNotifying = TRUE;
   1117 			int nAge = pData->pWidget->GetAppearanceAge();
   1118 			int nValueAge = pData->pWidget->GetValueAge();
   1119 
   1120 			ASSERT(pData->pPageView != NULL);
   1121 			CPDFSDK_Document* pDocument  = pData->pPageView->GetSDKDocument();
   1122 
   1123 			PDFSDK_FieldAction fa;
   1124  			fa.bModifier = m_pApp->FFI_IsCTRLKeyDown(nFlag);
   1125  			fa.bShift = m_pApp->FFI_IsSHIFTKeyDown(nFlag);
   1126 			fa.sChange = strChange;
   1127 			fa.sChangeEx = strChangeEx;
   1128 			fa.bKeyDown = bKeyDown;
   1129 			fa.bWillCommit = FALSE;
   1130 			fa.bRC = TRUE;
   1131 			fa.nSelStart = nSelStart;
   1132 			fa.nSelEnd = nSelEnd;
   1133 
   1134 
   1135 			pFormFiller->GetActionData(pData->pPageView, CPDF_AAction::KeyStroke, fa);
   1136 			pFormFiller->SaveState(pData->pPageView);
   1137 
   1138 			if (pData->pWidget->OnAAction(CPDF_AAction::KeyStroke, fa, pData->pPageView))
   1139 			{
   1140 				if (!IsValidAnnot(pData->pPageView, pData->pWidget))
   1141 				{
   1142 					bExit = TRUE;
   1143 					m_bNotifying = FALSE;
   1144 					return;
   1145 				}
   1146 
   1147 				if (nAge != pData->pWidget->GetAppearanceAge())
   1148 				{
   1149 					CPWL_Wnd* pWnd = pFormFiller->ResetPDFWindow(pData->pPageView, nValueAge == pData->pWidget->GetValueAge());
   1150 					pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
   1151 					bExit = TRUE;
   1152 				}
   1153 
   1154 				if (fa.bRC)
   1155 				{
   1156 					pFormFiller->SetActionData(pData->pPageView, CPDF_AAction::KeyStroke, fa);
   1157 					bRC = FALSE;
   1158 				}
   1159 				else
   1160 				{
   1161 					pFormFiller->RestoreState(pData->pPageView);
   1162 					bRC = FALSE;
   1163 				}
   1164 
   1165 				if (pDocument->GetFocusAnnot() != pData->pWidget)
   1166 				{
   1167 					pFormFiller->CommitData(pData->pPageView,nFlag);
   1168 					bExit = TRUE;
   1169 				}
   1170 			}
   1171 			else
   1172 			{
   1173 				if (!IsValidAnnot(pData->pPageView, pData->pWidget))
   1174 				{
   1175 					bExit = TRUE;
   1176 					m_bNotifying = FALSE;
   1177 					return;
   1178 				}
   1179 			}
   1180 
   1181 			m_bNotifying = FALSE;
   1182 		}
   1183 	}
   1184 }
   1185 
   1186 void	CFFL_IFormFiller::OnAfterKeyStroke(FX_BOOL bEditOrList, void* pPrivateData, FX_BOOL & bExit,FX_DWORD nFlag)
   1187 {
   1188 	ASSERT(pPrivateData != NULL);
   1189 	CFFL_PrivateData* pData = (CFFL_PrivateData*)pPrivateData;
   1190 	ASSERT(pData->pWidget != NULL);
   1191 
   1192 	CFFL_FormFiller* pFormFiller = GetFormFiller(pData->pWidget, FALSE);
   1193 	ASSERT(pFormFiller != NULL);
   1194 
   1195 	if (!bEditOrList)
   1196 		pFormFiller->OnKeyStroke(bExit);
   1197 }
   1198