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 
CFFL_IFormFiller(CPDFDoc_Environment * pApp)23 CFFL_IFormFiller::CFFL_IFormFiller(CPDFDoc_Environment* pApp) :
24 	m_pApp(pApp),
25 	m_bNotifying(FALSE)
26 {
27 }
28 
~CFFL_IFormFiller()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 
Annot_HitTest(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CPDF_Point point)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 
GetViewBBox(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)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 
OnDraw(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device,FX_DWORD dwFlags)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 
OnCreate(CPDFSDK_Annot * pAnnot)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 
OnLoad(CPDFSDK_Annot * pAnnot)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 
OnDelete(CPDFSDK_Annot * pAnnot)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 
OnMouseEnter(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlag)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 
OnMouseExit(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlag)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 
OnLButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)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 
OnLButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)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 
OnButtonUp(CPDFSDK_Widget * pWidget,CPDFSDK_PageView * pPageView,FX_BOOL & bReset,FX_BOOL & bExit,FX_UINT nFlag)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 
OnLButtonDblClk(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)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 
OnMouseMove(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)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 
OnMouseWheel(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,short zDelta,const CPDF_Point & point)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 
OnRButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)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 
OnRButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)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 
OnRButtonDblClk(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)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 
OnKeyDown(CPDFSDK_Annot * pAnnot,FX_UINT nKeyCode,FX_UINT nFlags)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 
OnChar(CPDFSDK_Annot * pAnnot,FX_UINT nChar,FX_UINT nFlags)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 
OnDeSelected(CPDFSDK_Annot * pAnnot)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 
OnSelected(CPDFSDK_Annot * pAnnot)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 
OnSetFocus(CPDFSDK_Annot * pAnnot,FX_UINT nFlag)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 
OnKillFocus(CPDFSDK_Annot * pAnnot,FX_UINT nFlag)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 
IsVisible(CPDFSDK_Widget * pWidget)610 FX_BOOL	CFFL_IFormFiller::IsVisible(CPDFSDK_Widget* pWidget)
611 {
612 	return pWidget->IsVisible();
613 }
614 
IsReadOnly(CPDFSDK_Widget * pWidget)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 
IsFillingAllowed(CPDFSDK_Widget * pWidget)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 
GetFormFiller(CPDFSDK_Annot * pAnnot,FX_BOOL bRegister)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 
RemoveFormFiller(CPDFSDK_Annot * pAnnot)697 void CFFL_IFormFiller::RemoveFormFiller(CPDFSDK_Annot* pAnnot)
698 {
699 	if ( pAnnot != NULL )
700 	{
701 		UnRegisterFormFiller( pAnnot );
702 	}
703 }
704 
UnRegisterFormFiller(CPDFSDK_Annot * pAnnot)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 
SetFocusAnnotTab(CPDFSDK_Annot * pWidget,FX_BOOL bSameField,FX_BOOL bNext)717 void CFFL_IFormFiller::SetFocusAnnotTab(CPDFSDK_Annot* pWidget, FX_BOOL bSameField, FX_BOOL bNext)
718 {
719 
720 }
721 
QueryWherePopup(void * pPrivateData,FX_FLOAT fPopupMin,FX_FLOAT fPopupMax,FX_INT32 & nRet,FX_FLOAT & fPopupRet)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 
OnSetWindowRect(void * pPrivateData,const CPDF_Rect & rcWindow)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 
OnKeyStroke(FX_BOOL bEditOrList,void * pPrivateData,FX_INT32 nKeyCode,CFX_WideString & strChange,const CFX_WideString & strChangeEx,FX_BOOL bKeyDown,FX_BOOL & bRC,FX_BOOL & bExit)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 
OnKeyStrokeCommit(CPDFSDK_Widget * pWidget,CPDFSDK_PageView * pPageView,FX_BOOL & bRC,FX_BOOL & bExit,FX_DWORD nFlag)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 
OnValidate(CPDFSDK_Widget * pWidget,CPDFSDK_PageView * pPageView,FX_BOOL & bRC,FX_BOOL & bExit,FX_DWORD nFlag)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 
OnCalculate(CPDFSDK_Widget * pWidget,CPDFSDK_PageView * pPageView,FX_BOOL & bExit,FX_DWORD nFlag)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 
OnFormat(CPDFSDK_Widget * pWidget,CPDFSDK_PageView * pPageView,FX_BOOL & bExit,FX_DWORD nFlag)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.c_str(), 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 
GetCommitKey()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 
GetKeyDown()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 
IsValidAnnot(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)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 
BeforeUndo(CPDFSDK_Document * pDocument)1052 void CFFL_IFormFiller::BeforeUndo(CPDFSDK_Document* pDocument)
1053 {
1054 
1055 }
1056 
BeforeRedo(CPDFSDK_Document * pDocument)1057 void CFFL_IFormFiller::BeforeRedo(CPDFSDK_Document* pDocument)
1058 {
1059 	BeforeUndo(pDocument);
1060 }
1061 
AfterUndo(CPDFSDK_Document * pDocument)1062 void CFFL_IFormFiller::AfterUndo(CPDFSDK_Document* pDocument)
1063 {
1064 }
1065 
AfterRedo(CPDFSDK_Document * pDocument)1066 void CFFL_IFormFiller::AfterRedo(CPDFSDK_Document* pDocument)
1067 {
1068 }
1069 
CanCopy(CPDFSDK_Document * pDocument)1070 FX_BOOL	CFFL_IFormFiller::CanCopy(CPDFSDK_Document* pDocument)
1071 {
1072 
1073 	return FALSE;
1074 }
1075 
CanCut(CPDFSDK_Document * pDocument)1076 FX_BOOL	CFFL_IFormFiller::CanCut(CPDFSDK_Document* pDocument)
1077 {
1078 
1079 	return FALSE;
1080 }
1081 
CanPaste(CPDFSDK_Document * pDocument)1082 FX_BOOL	CFFL_IFormFiller::CanPaste(CPDFSDK_Document* pDocument)
1083 {
1084 
1085 	return FALSE;
1086 }
1087 
DoCopy(CPDFSDK_Document * pDocument)1088 void CFFL_IFormFiller::DoCopy(CPDFSDK_Document* pDocument)
1089 {
1090 }
1091 
DoCut(CPDFSDK_Document * pDocument)1092 void CFFL_IFormFiller::DoCut(CPDFSDK_Document* pDocument)
1093 {
1094 }
1095 
DoPaste(CPDFSDK_Document * pDocument)1096 void CFFL_IFormFiller::DoPaste(CPDFSDK_Document* pDocument)
1097 {
1098 
1099 }
OnBeforeKeyStroke(FX_BOOL bEditOrList,void * pPrivateData,FX_INT32 nKeyCode,CFX_WideString & strChange,const CFX_WideString & strChangeEx,int nSelStart,int nSelEnd,FX_BOOL bKeyDown,FX_BOOL & bRC,FX_BOOL & bExit,FX_DWORD nFlag)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 
OnAfterKeyStroke(FX_BOOL bEditOrList,void * pPrivateData,FX_BOOL & bExit,FX_DWORD nFlag)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