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 
8 #include "../../include/formfiller/FFL_FormFiller.h"
9 #include "../../include/formfiller/FFL_Notify.h"
10 #include "../../include/formfiller/FFL_CBA_Fontmap.h"
11 
12 #define GetRed(rgb)			((FX_BYTE)(rgb))
13 #define GetGreen(rgb)		((FX_BYTE)(((FX_WORD)(rgb)) >> 8))
14 #define GetBlue(rgb)		((FX_BYTE)((rgb)>>16))
15 
16 #define FFL_HINT_ELAPSE		800
17 
18 /* ------------------------- CFFL_FormFiller ------------------------- */
19 
CFFL_FormFiller(CPDFDoc_Environment * pApp,CPDFSDK_Annot * pAnnot)20 CFFL_FormFiller::CFFL_FormFiller(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot)
21 	:m_pApp(pApp),
22 	m_pAnnot(pAnnot),
23 	m_bValid(FALSE),
24 	m_ptOldPos(0,0)
25 {
26 	m_pWidget = (CPDFSDK_Widget*) pAnnot;
27 }
28 
~CFFL_FormFiller()29 CFFL_FormFiller::~CFFL_FormFiller()
30 {
31 	FX_POSITION pos = m_Maps.GetStartPosition();
32 	while (pos)
33 	{
34 		CPDFSDK_PageView * pPageView = NULL;
35 		CPWL_Wnd* pWnd = NULL;
36 		m_Maps.GetNextAssoc(pos, pPageView, pWnd);
37 
38 		if (pWnd)
39 		{
40 			CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
41 			pWnd->Destroy();
42 			delete pWnd;
43 			delete pData;
44 		}
45 	}
46 	m_Maps.RemoveAll();
47 
48 }
49 
SetWindowRect(CPDFSDK_PageView * pPageView,const CPDF_Rect & rcWindow)50 void CFFL_FormFiller::SetWindowRect(CPDFSDK_PageView* pPageView, const CPDF_Rect& rcWindow)
51 {
52 	if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))
53 	{
54 		pWnd->Move(CPDF_Rect(rcWindow), TRUE, FALSE);
55 	}
56 }
57 
GetWindowRect(CPDFSDK_PageView * pPageView)58 CPDF_Rect CFFL_FormFiller::GetWindowRect(CPDFSDK_PageView* pPageView)
59 {
60 	if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))
61 	{
62 		return pWnd->GetWindowRect();
63 	}
64 
65 	return CPDF_Rect(0,0,0,0);
66 }
67 
GetViewBBox(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)68 FX_RECT CFFL_FormFiller::GetViewBBox(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
69 {
70 	ASSERT(pPageView != NULL);
71 	ASSERT(pAnnot != NULL);
72 
73 	CPDF_Rect rcAnnot = m_pWidget->GetRect();
74 
75 	if (CPWL_Wnd* pWnd = this->GetPDFWindow(pPageView, FALSE))
76 	{
77 		CPDF_Rect rcWindow = pWnd->GetWindowRect();
78 		rcAnnot = PWLtoFFL(rcWindow);
79 	}
80 
81 	CPDF_Rect rcWin = rcAnnot;
82 //	pPageView->DocToWindow(rcAnnot, rcWin);
83 
84 	CPDF_Rect rcFocus = this->GetFocusBox(pPageView);
85 	if (!rcFocus.IsEmpty())
86 		rcWin.Union(rcFocus);
87 
88 	CPDF_Rect rect = CPWL_Utils::InflateRect(rcWin,1);
89 
90 	return rect.GetOutterRect();
91 }
92 
OnDraw(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device,FX_DWORD dwFlags)93 void CFFL_FormFiller::OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
94 						CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
95 						/*const CRect& rcWindow,*/ FX_DWORD dwFlags)
96 {
97 	ASSERT(pAnnot->GetPDFAnnot()->GetSubType() == "Widget");
98 
99 	if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
100 	{
101 		CPDF_Matrix mt = this->GetCurMatrix();
102 		mt.Concat(*pUser2Device);
103 		pWnd->DrawAppearance(pDevice,&mt);
104 	}
105 	else
106 	{
107 		CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
108 		if (CFFL_IFormFiller::IsVisible(pWidget))
109 			pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
110 	}
111 }
112 
OnDrawDeactive(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device,FX_DWORD dwFlags)113 void CFFL_FormFiller::OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
114 						CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
115 						/*const CRect& rcWindow,*/ FX_DWORD dwFlags)
116 {
117 	ASSERT(pAnnot != NULL);
118 
119 	CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
120 
121 	pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
122 }
123 
124 
OnCreate(CPDFSDK_Annot * pAnnot)125 void CFFL_FormFiller::OnCreate(CPDFSDK_Annot* pAnnot)
126 {
127 }
128 
OnLoad(CPDFSDK_Annot * pAnnot)129 void CFFL_FormFiller::OnLoad(CPDFSDK_Annot* pAnnot)
130 {
131 }
132 
OnDelete(CPDFSDK_Annot * pAnnot)133 void CFFL_FormFiller::OnDelete(CPDFSDK_Annot* pAnnot)
134 {
135 }
136 
OnMouseEnter(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)137 void CFFL_FormFiller::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
138 {
139 }
140 
OnMouseExit(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)141 void CFFL_FormFiller::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
142 {
143 	EndTimer();
144 	ASSERT(m_pWidget != NULL);
145 }
146 
OnLButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)147 FX_BOOL CFFL_FormFiller::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
148 {
149 	if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
150 	{
151 		m_bValid = TRUE;
152 		FX_RECT rect = this->GetViewBBox(pPageView,pAnnot);
153 		this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
154 
155  		if(!rect.Contains((int)point.x, (int)point.y))
156   			return FALSE;
157 
158 		return pWnd->OnLButtonDown(WndtoPWL(pPageView, point),nFlags);
159 	}
160 
161 	return FALSE;
162 }
163 
OnLButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)164 FX_BOOL	CFFL_FormFiller::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
165 {
166 	if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
167 	{
168 		FX_RECT rcFFL =  this->GetViewBBox(pPageView, pAnnot);
169 		this->InvalidateRect(rcFFL.left, rcFFL.top, rcFFL.right, rcFFL.bottom);
170 		pWnd->OnLButtonUp(WndtoPWL(pPageView, point),nFlags);
171 		return TRUE;
172 	}
173 
174 	return FALSE;
175 }
176 
OnLButtonDblClk(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)177 FX_BOOL	CFFL_FormFiller::OnLButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
178 {
179 	if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
180 	{
181 		pWnd->OnLButtonDblClk(WndtoPWL(pPageView, point),nFlags);
182 		return TRUE;
183 	}
184 
185 	return FALSE;
186 }
187 
OnMouseMove(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)188 FX_BOOL CFFL_FormFiller::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
189 {
190 	if ((m_ptOldPos.x != point.x) || (m_ptOldPos.y != point.y))
191 	{
192 		m_ptOldPos = point;
193 	}
194 
195 	if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
196 	{
197 		pWnd->OnMouseMove(WndtoPWL(pPageView, point),nFlags);
198 		return TRUE;
199 	}
200 
201 	return FALSE;
202 }
203 
OnMouseWheel(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,short zDelta,const CPDF_Point & point)204 FX_BOOL CFFL_FormFiller::OnMouseWheel(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, short zDelta, const CPDF_Point& point)
205 {
206 	if (!IsValid()) return FALSE;
207 
208 	if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
209 	{
210 		return pWnd->OnMouseWheel(zDelta, WndtoPWL(pPageView, point),nFlags);
211 	}
212 
213 	return FALSE;
214 }
215 
OnRButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)216 FX_BOOL CFFL_FormFiller::OnRButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
217 {
218 	if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, TRUE))
219 	{
220 		pWnd->OnRButtonDown(WndtoPWL(pPageView, point),nFlags);
221 		return TRUE;
222 	}
223 
224 	return FALSE;
225 }
226 
OnRButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)227 FX_BOOL	CFFL_FormFiller::OnRButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
228 {
229 	if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
230 	{
231 		pWnd->OnRButtonUp(WndtoPWL(pPageView, point),nFlags);
232 		return TRUE;
233 	}
234 
235 	return FALSE;
236 }
237 
OnRButtonDblClk(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)238 FX_BOOL	CFFL_FormFiller::OnRButtonDblClk(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
239 {
240 	if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
241 	{
242 		pWnd->OnRButtonDblClk(WndtoPWL(pPageView, point),nFlags);
243 		return TRUE;
244 	}
245 
246 	return FALSE;
247 }
248 
OnKeyDown(CPDFSDK_Annot * pAnnot,FX_UINT nKeyCode,FX_UINT nFlags)249 FX_BOOL CFFL_FormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot, FX_UINT nKeyCode, FX_UINT nFlags)
250 {
251 	if (IsValid())
252 	{
253 		CPDFSDK_PageView* pPageView = this->GetCurPageView();
254 		ASSERT(pPageView != NULL);
255 
256 		if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
257 		{
258 			return pWnd->OnKeyDown(nKeyCode,nFlags);
259 		}
260 	}
261 
262 	return FALSE;
263 }
264 
OnChar(CPDFSDK_Annot * pAnnot,FX_UINT nChar,FX_UINT nFlags)265 FX_BOOL	CFFL_FormFiller::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
266 {
267 	if (IsValid())
268 	{
269 		CPDFSDK_PageView* pPageView = this->GetCurPageView();
270 		ASSERT(pPageView != NULL);
271 
272 		if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
273 		{
274 			return pWnd->OnChar(nChar,nFlags);
275 		}
276 	}
277 
278 	return FALSE;
279 }
280 
OnDeSelected(CPDFSDK_Annot * pAnnot)281 void CFFL_FormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot)
282 {
283 	ASSERT(FALSE);
284 }
285 
OnSelected(CPDFSDK_Annot * pAnnot)286 void CFFL_FormFiller::OnSelected(CPDFSDK_Annot* pAnnot)
287 {
288 	ASSERT(FALSE);
289 }
290 
OnSetFocus(CPDFSDK_Annot * pAnnot,FX_UINT nFlag)291 FX_BOOL	CFFL_FormFiller::OnSetFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
292 {
293 	CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
294 
295 	CPDF_Page * pPage = pWidget->GetPDFPage();
296  	CPDFSDK_Document * pDoc = m_pApp->GetCurrentDoc();
297 	CPDFSDK_PageView* pPageView = pDoc->GetPageView(pPage);
298  	ASSERT(pPageView != NULL);
299 
300 
301 
302 	CPWL_Wnd * pWnd = NULL;
303 	if ( (pWnd = GetPDFWindow(pPageView, TRUE)))
304 	{
305 		pWnd->SetFocus();
306 	}
307 
308 	m_bValid = TRUE;
309 
310 
311 
312 
313 	m_bValid = TRUE;
314 	FX_RECT rcRect = this->GetViewBBox(pPageView,pAnnot);
315 	this->InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
316 
317 	return TRUE;
318 }
319 
OnKillFocus(CPDFSDK_Annot * pAnnot,FX_UINT nFlag)320 FX_BOOL	CFFL_FormFiller::OnKillFocus(CPDFSDK_Annot* pAnnot, FX_UINT nFlag)
321 {
322 	if (IsValid())
323 	{
324 		CPDFSDK_PageView* pPageView = this->GetCurPageView();
325 		ASSERT(pPageView != NULL);
326 
327 		CommitData(pPageView, nFlag);
328 
329 		if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, FALSE))
330 		{
331 			pWnd->KillFocus();
332 		}
333 
334 		switch (m_pWidget->GetFieldType())
335 		{
336 		case FIELDTYPE_PUSHBUTTON:
337 		case FIELDTYPE_CHECKBOX:
338 		case FIELDTYPE_RADIOBUTTON:
339 			EscapeFiller(pPageView, TRUE);
340 			break;
341 		default:
342 			EscapeFiller(pPageView, FALSE);
343 			break;
344 		}
345 	}
346 
347 	return TRUE;
348 }
349 
IsValid() const350 FX_BOOL	CFFL_FormFiller::IsValid() const
351 {
352 	return m_bValid;
353 }
354 
GetCreateParam()355 PWL_CREATEPARAM	CFFL_FormFiller::GetCreateParam()
356 {
357 	ASSERT(m_pApp != NULL);
358 
359 	PWL_CREATEPARAM cp;
360 
361 	cp.pParentWnd = NULL;
362 	cp.pProvider = this;
363 	cp.rcRectWnd = GetPDFWindowRect();
364 
365 	FX_DWORD dwCreateFlags = PWS_BORDER | PWS_BACKGROUND | PWS_VISIBLE;
366 
367 	ASSERT(m_pWidget != NULL);
368 
369 
370 	FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags();
371 
372 	if (dwFieldFlag & FIELDFLAG_READONLY)
373 	{
374 		dwCreateFlags |= PWS_READONLY;
375 	}
376 
377 	FX_COLORREF color;
378 	if (m_pWidget->GetFillColor(color))
379 	{
380 		cp.sBackgroundColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));
381 	}
382 
383 	if (m_pWidget->GetBorderColor(color))
384 	{
385 		cp.sBorderColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));
386 	}
387 
388 	cp.sTextColor = CPWL_Color(COLORTYPE_GRAY,0);
389 
390 	if (m_pWidget->GetTextColor(color))
391 	{
392 		cp.sTextColor = CPWL_Color(GetRed(color), GetGreen(color), GetBlue(color));
393 	}
394 
395 	cp.fFontSize = m_pWidget->GetFontSize();
396 	cp.dwBorderWidth = m_pWidget->GetBorderWidth();
397 
398 	int nBorderStyle = m_pWidget->GetBorderStyle();
399 
400 	switch (nBorderStyle)
401 	{
402 	case BBS_SOLID:
403 		cp.nBorderStyle = PBS_SOLID;
404 		break;
405 	case BBS_DASH:
406 		cp.nBorderStyle = PBS_DASH;
407 		cp.sDash = CPWL_Dash(3,3,0);
408 		break;
409 	case BBS_BEVELED:
410 		cp.nBorderStyle = PBS_BEVELED;
411 		cp.dwBorderWidth *= 2;
412 		break;
413 	case BBS_INSET:
414 		cp.nBorderStyle = PBS_INSET;
415 		cp.dwBorderWidth *= 2;
416 		break;
417 	case BBS_UNDERLINE:
418 		cp.nBorderStyle = PBS_UNDERLINED;
419 		break;
420 	}
421 
422 	if (cp.fFontSize <= 0)
423 	{
424 		dwCreateFlags |= PWS_AUTOFONTSIZE;
425 	}
426 
427 	cp.dwFlags = dwCreateFlags;
428 	cp.pSystemHandler = m_pApp->GetSysHandler();
429 	return cp;
430 }
431 
GetPDFWindow(CPDFSDK_PageView * pPageView,FX_BOOL bNew)432 CPWL_Wnd* CFFL_FormFiller::GetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bNew)
433 {
434 	ASSERT(pPageView != NULL);
435 	ASSERT(m_pWidget != NULL);
436 
437 	CPWL_Wnd* pWnd = NULL;
438 	m_Maps.Lookup(pPageView, pWnd);
439 
440 	if (bNew)
441 	{
442 		if (pWnd)
443 		{
444 			CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pWnd->GetAttachedData();
445 			ASSERT(pPrivateData != NULL);
446 
447 			if (pPrivateData->nWidgetAge != m_pWidget->GetAppearanceAge())
448 			{
449 				return this->ResetPDFWindow(pPageView, m_pWidget->GetValueAge() == pPrivateData->nValueAge);
450 			}
451 		}
452 		else
453 		{
454 			PWL_CREATEPARAM cp = GetCreateParam();
455 			cp.hAttachedWnd = (FX_HWND)m_pWidget;
456 
457 			CFFL_PrivateData* pPrivateData = new CFFL_PrivateData;
458 			pPrivateData->pWidget = m_pWidget;
459 			pPrivateData->pPageView = pPageView;
460 			pPrivateData->nWidgetAge = m_pWidget->GetAppearanceAge();
461                         pPrivateData->nValueAge = 0;
462 
463 			cp.pAttachedData = pPrivateData;
464 
465 			pWnd = NewPDFWindow(cp, pPageView);
466 
467 			if (pWnd)
468 			{
469 				m_Maps.SetAt(pPageView, pWnd);
470 			}
471 		}
472 	}
473 
474 	return pWnd;
475 }
476 
DestroyPDFWindow(CPDFSDK_PageView * pPageView)477 void CFFL_FormFiller::DestroyPDFWindow(CPDFSDK_PageView* pPageView)
478 {
479 	CPWL_Wnd* pWnd = NULL;
480 	m_Maps.Lookup(pPageView, pWnd);
481 
482 	if (pWnd)
483 	{
484 		CFFL_PrivateData* pData = (CFFL_PrivateData*)pWnd->GetAttachedData();
485 		pData->pPageView = NULL;
486 		pWnd->Destroy();
487 		delete pWnd;
488 		delete pData;
489 	}
490 
491 	m_Maps.RemoveKey(pPageView);
492 }
493 
GetWindowMatrix(void * pAttachedData)494 CPDF_Matrix	CFFL_FormFiller::GetWindowMatrix(void* pAttachedData)
495 {
496 	if (CFFL_PrivateData* pPrivateData = (CFFL_PrivateData*)pAttachedData)
497 	{
498 		if (pPrivateData->pPageView)
499 		{
500 			CPDF_Matrix mtPageView;
501 			pPrivateData->pPageView->GetCurrentMatrix(mtPageView);
502 			CPDF_Matrix mt = GetCurMatrix();
503 			mt.Concat(mtPageView);
504 
505 			return mt;
506 		}
507 	}
508 	return CPDF_Matrix(1,0,0,1,0,0);
509 }
510 
GetCurMatrix()511 CPDF_Matrix	CFFL_FormFiller::GetCurMatrix()
512 {
513 	CPDF_Matrix mt;
514 
515 	ASSERT(m_pWidget != NULL);
516 
517 	CPDF_Rect rcDA ;
518 	m_pWidget->GetPDFAnnot()->GetRect(rcDA);
519 
520 
521 	switch (m_pWidget->GetRotate())
522 	{
523 	default:
524 	case 0:
525 		mt = CPDF_Matrix(1,0,0,1,0,0);
526 		break;
527 	case 90:
528 		mt = CPDF_Matrix(0,1,-1,0,rcDA.right - rcDA.left,0);
529 		break;
530 	case 180:
531 		mt = CPDF_Matrix(-1,0,0,-1,rcDA.right - rcDA.left,rcDA.top - rcDA.bottom);
532 		break;
533 	case 270:
534 		mt = CPDF_Matrix(0,-1,1,0,0,rcDA.top - rcDA.bottom);
535 		break;
536 	}
537 	mt.e += rcDA.left;
538 	mt.f += rcDA.bottom;
539 
540 	return mt;
541 }
542 
LoadPopupMenuString(int nIndex)543 CFX_WideString CFFL_FormFiller::LoadPopupMenuString(int nIndex)
544 {
545 	ASSERT(m_pApp != NULL);
546 
547 	return L"";
548 }
549 
GetPDFWindowRect() const550 CPDF_Rect CFFL_FormFiller::GetPDFWindowRect() const
551 {
552 	ASSERT(m_pWidget != NULL);
553 
554 	CPDF_Rect rectAnnot;
555 	m_pWidget->GetPDFAnnot()->GetRect(rectAnnot);
556 
557 	FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;
558 	FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;
559 
560 
561 	if ((m_pWidget->GetRotate() / 90) & 0x01)
562 		return CPDF_Rect(0,0,fHeight,fWidth);
563 	else
564 		return CPDF_Rect(0,0,fWidth,fHeight);
565 }
566 
GetCurPageView()567 CPDFSDK_PageView* CFFL_FormFiller::GetCurPageView()
568 {
569 
570 	CPDF_Page* pPage = m_pAnnot->GetPDFPage();
571 	CPDFSDK_Document* pSDKDoc = m_pApp->GetCurrentDoc();
572 	if(pSDKDoc)
573 	{
574 		return pSDKDoc->GetPageView(pPage);
575 	}
576 	return NULL;
577 }
578 
GetFocusBox(CPDFSDK_PageView * pPageView)579 CPDF_Rect CFFL_FormFiller::GetFocusBox(CPDFSDK_PageView* pPageView)
580 {
581 	if (CPWL_Wnd * pWnd = GetPDFWindow(pPageView, FALSE))
582 	{
583 		CPDF_Rect rcFocus =  FFLtoWnd(pPageView, PWLtoFFL(pWnd->GetFocusRect()));
584 		ASSERT(pPageView);
585 		CPDF_Rect rcPage = pPageView->GetPDFPage()->GetPageBBox();
586 		if(rcPage.Contains(rcFocus))
587 			return rcFocus;
588 		else
589 			return CPDF_Rect(0,0,0,0);
590 	}
591 	return CPDF_Rect(0,0,0,0);
592 }
593 
FFLtoPWL(const CPDF_Rect & rect)594 CPDF_Rect CFFL_FormFiller::FFLtoPWL(const CPDF_Rect& rect)
595 {
596 	CPDF_Matrix mt;
597 	mt.SetReverse(GetCurMatrix());
598 
599 	CPDF_Rect temp = rect;
600 	mt.TransformRect(temp);
601 
602 	return temp;
603 }
604 
PWLtoFFL(const CPDF_Rect & rect)605 CPDF_Rect CFFL_FormFiller::PWLtoFFL(const CPDF_Rect& rect)
606 {
607 	CPDF_Matrix mt = GetCurMatrix();
608 
609 	CPDF_Rect temp = rect;
610 	mt.TransformRect(temp);
611 
612 	return temp;
613 }
614 
FFLtoPWL(const CPDF_Point & point)615 CPDF_Point CFFL_FormFiller::FFLtoPWL(const CPDF_Point& point)
616 {
617 	CPDF_Matrix mt;
618 	mt.SetReverse(GetCurMatrix());
619 
620 	CPDF_Point pt = point;
621 	mt.Transform(pt.x,pt.y);
622 
623 	return pt;
624 }
625 
PWLtoFFL(const CPDF_Point & point)626 CPDF_Point CFFL_FormFiller::PWLtoFFL(const CPDF_Point & point)
627 {
628 	CPDF_Matrix mt = GetCurMatrix();
629 
630 	CPDF_Point pt = point;
631 	mt.Transform(pt.x,pt.y);
632 
633 	return pt;
634 }
635 
WndtoPWL(CPDFSDK_PageView * pPageView,const CPDF_Point & pt)636 CPDF_Point CFFL_FormFiller::WndtoPWL(CPDFSDK_PageView* pPageView, const CPDF_Point& pt)
637 {
638 // 	ASSERT(pPageView != NULL);
639 //
640 // 	CPDF_Point point(0.0f, 0.0f);
641 // 	pPageView->WindowToDoc(pt.x, pt.y, point.x, point.y);
642 //
643  	return FFLtoPWL(pt);
644 //	return CPDF_Point(0, 0);
645 }
646 
FFLtoWnd(CPDFSDK_PageView * pPageView,const CPDF_Rect & rect)647 CPDF_Rect CFFL_FormFiller::FFLtoWnd(CPDFSDK_PageView* pPageView, const CPDF_Rect & rect)
648 {
649 // 	FX_RECT rcRet(0,0,0,0);
650 //
651 // 	ASSERT(pPageView != NULL);
652 // 	pPageView->DocToWindow(rect, rcRet);
653 //
654  	return rect;
655 
656 }
657 
FFL_FreeData(void * pData)658 void CFFL_FormFiller::FFL_FreeData(void* pData)
659 {
660 	ASSERT(pData != NULL);
661 
662 	delete (CFFL_PrivateData*)pData;
663 }
664 
CommitData(CPDFSDK_PageView * pPageView,FX_UINT nFlag)665 FX_BOOL CFFL_FormFiller::CommitData(CPDFSDK_PageView* pPageView, FX_UINT nFlag)
666 {
667 	if (IsDataChanged(pPageView))
668 	{
669 		//CFFL_IFormFiller* pIFormFiller = CFFL_Module::GetFormFiller(m_pApp);
670 		CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();//NULL;
671 		ASSERT(pIFormFiller != NULL);
672 
673 		FX_BOOL bRC = TRUE;
674 		FX_BOOL bExit = FALSE;
675 
676 		pIFormFiller->OnKeyStrokeCommit(m_pWidget, pPageView, bRC, bExit, nFlag);
677 		if (bExit) return TRUE;
678 		if (!bRC)
679 		{
680 			this->ResetPDFWindow(pPageView, FALSE);
681 			return TRUE;
682 		}
683 
684 		pIFormFiller->OnValidate(m_pWidget, pPageView, bRC, bExit, nFlag);
685 		if (bExit) return TRUE;
686 		if (!bRC)
687 		{
688 			this->ResetPDFWindow(pPageView, FALSE);
689 			return TRUE;
690 		}
691 
692 		SaveData(pPageView);
693 
694 		pIFormFiller->OnCalculate(m_pWidget, pPageView, bExit,nFlag);
695 		if (bExit) return TRUE;
696 
697 		pIFormFiller->OnFormat(m_pWidget, pPageView, bExit,nFlag);
698 	}
699 
700 	return TRUE;
701 }
702 
IsDataChanged(CPDFSDK_PageView * pPageView)703 FX_BOOL	CFFL_FormFiller::IsDataChanged(CPDFSDK_PageView* pPageView)
704 {
705 	return FALSE;
706 }
707 
SaveData(CPDFSDK_PageView * pPageView)708 void CFFL_FormFiller::SaveData(CPDFSDK_PageView* pPageView)
709 {
710 }
711 
GetKeyStrokeData(CPDFSDK_PageView * pPageView,FFL_KeyStrokeData & data)712 void CFFL_FormFiller::GetKeyStrokeData(CPDFSDK_PageView* pPageView, FFL_KeyStrokeData& data)
713 {
714 }
715 
SetChangeMark()716 void CFFL_FormFiller::SetChangeMark()
717 {
718 	m_pApp->FFI_OnChange();
719 }
720 
GetActionData(CPDFSDK_PageView * pPageView,CPDF_AAction::AActionType type,PDFSDK_FieldAction & fa)721 void CFFL_FormFiller::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
722 							PDFSDK_FieldAction& fa)
723 {
724 	fa.sValue = m_pWidget->GetValue();
725 }
726 
SetActionData(CPDFSDK_PageView * pPageView,CPDF_AAction::AActionType type,const PDFSDK_FieldAction & fa)727 void CFFL_FormFiller::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
728 									const PDFSDK_FieldAction& fa)
729 {
730 }
731 
IsActionDataChanged(CPDF_AAction::AActionType type,const PDFSDK_FieldAction & faOld,const PDFSDK_FieldAction & faNew)732 FX_BOOL	CFFL_FormFiller::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
733 									const PDFSDK_FieldAction& faNew)
734 {
735 	return FALSE;
736 }
737 
SaveState(CPDFSDK_PageView * pPageView)738 void CFFL_FormFiller::SaveState(CPDFSDK_PageView* pPageView)
739 {
740 }
741 
RestoreState(CPDFSDK_PageView * pPageView)742 void CFFL_FormFiller::RestoreState(CPDFSDK_PageView* pPageView)
743 {
744 }
745 
ResetPDFWindow(CPDFSDK_PageView * pPageView,FX_BOOL bRestoreValue)746 CPWL_Wnd*  CFFL_FormFiller::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
747 {
748 	return GetPDFWindow(pPageView, FALSE);
749 }
750 
TimerProc()751 void CFFL_FormFiller::TimerProc()
752 {
753 
754 }
755 
GetSystemHandler() const756 IFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const
757 {
758 	return m_pApp->GetSysHandler();
759 //	return NULL;
760 }
761 
OnKeyStroke(FX_BOOL bKeyDown)762 void CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown)
763 {
764 }
765 
EscapeFiller(CPDFSDK_PageView * pPageView,FX_BOOL bDestroyPDFWindow)766 void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView, FX_BOOL bDestroyPDFWindow)
767 {
768 	m_bValid = FALSE;
769 
770 	FX_RECT rcRect = this->GetViewBBox(pPageView, m_pWidget);
771 	this->InvalidateRect(rcRect.left, rcRect.top, rcRect.right, rcRect.bottom);
772 
773 	if(bDestroyPDFWindow)
774  		DestroyPDFWindow(pPageView);
775 }
776 
CanCopy(CPDFSDK_Document * pDocument)777 FX_BOOL CFFL_FormFiller::CanCopy(CPDFSDK_Document* pDocument)
778 {
779 	return FALSE;
780 }
781 
CanCut(CPDFSDK_Document * pDocument)782 FX_BOOL CFFL_FormFiller::CanCut(CPDFSDK_Document* pDocument)
783 {
784 	return FALSE;
785 }
786 
CanPaste(CPDFSDK_Document * pDocument)787 FX_BOOL	CFFL_FormFiller::CanPaste(CPDFSDK_Document* pDocument)
788 {
789 	return FALSE;
790 }
791 
DoCopy(CPDFSDK_Document * pDocument)792 void CFFL_FormFiller::DoCopy(CPDFSDK_Document* pDocument)
793 {
794 }
795 
DoCut(CPDFSDK_Document * pDocument)796 void CFFL_FormFiller::DoCut(CPDFSDK_Document* pDocument)
797 {
798 }
799 
DoPaste(CPDFSDK_Document * pDocument)800 void CFFL_FormFiller::DoPaste(CPDFSDK_Document* pDocument)
801 {
802 }
803 
InvalidateRect(double left,double top,double right,double bottom)804 void CFFL_FormFiller::InvalidateRect(double left, double top, double right, double bottom)
805 {
806 	CPDF_Page * pPage = m_pWidget->GetPDFPage();
807 	m_pApp->FFI_Invalidate(pPage, left, top, right, bottom);
808 }
809 
810 /* ------------------------- CFFL_Button ------------------------- */
811 
CFFL_Button(CPDFDoc_Environment * pApp,CPDFSDK_Annot * pWidget)812 CFFL_Button::CFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) :
813 	CFFL_FormFiller(pApp, pWidget),
814 	m_bMouseIn(FALSE),
815 	m_bMouseDown(FALSE)
816 {
817 }
818 
~CFFL_Button()819 CFFL_Button::~CFFL_Button()
820 {
821 }
822 
OnMouseEnter(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)823 void CFFL_Button::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
824 {
825 	m_bMouseIn = TRUE;
826 	FX_RECT rect = this->GetViewBBox(pPageView,pAnnot);
827 	this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
828 //	::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
829 }
830 
OnMouseExit(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)831 void CFFL_Button::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
832 {
833 	m_bMouseIn = FALSE;
834 
835 	FX_RECT rect = this->GetViewBBox(pPageView,pAnnot);
836 	this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
837 //	::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
838 	EndTimer();
839 	ASSERT(m_pWidget != NULL);
840 //	m_pWidget->HideHint();
841 }
842 
OnLButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)843 FX_BOOL CFFL_Button::OnLButtonDown(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
844 {
845 	CPDF_Rect rcAnnot = pAnnot->GetRect();
846 	if(!rcAnnot.Contains(point.x, point.y))
847 		return FALSE;
848 
849 	m_bMouseDown = TRUE;
850 	m_bValid = TRUE;
851 	FX_RECT rect = this->GetViewBBox(pPageView, pAnnot);
852 	this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
853 //	::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
854 	return TRUE;
855 }
856 
OnLButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)857 FX_BOOL	CFFL_Button::OnLButtonUp(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
858 {
859 	CPDF_Rect rcAnnot = pAnnot->GetRect();
860 	if(!rcAnnot.Contains(point.x, point.y))
861 		return FALSE;
862 
863 	m_bMouseDown = FALSE;
864 	m_pWidget->GetPDFPage();
865 
866 
867 	FX_RECT rect = this->GetViewBBox(pPageView, pAnnot);
868 	this->InvalidateRect(rect.left, rect.top, rect.right, rect.bottom);
869 // 	::InvalidateRect(pPageView->GetPageViewWnd(), &this->GetViewBBox(pPageView, pAnnot), TRUE);
870 	return TRUE;
871 }
872 
OnMouseMove(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,FX_UINT nFlags,const CPDF_Point & point)873 FX_BOOL	CFFL_Button::OnMouseMove(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot, FX_UINT nFlags, const CPDF_Point& point)
874 {
875 	ASSERT(m_pApp != NULL);
876 
877 	return TRUE;
878 }
879 
OnDraw(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device,FX_DWORD dwFlags)880 void CFFL_Button::OnDraw(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
881 							CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
882 							/*const CRect& rcWindow,*/ FX_DWORD dwFlags)
883 {
884 	ASSERT(pPageView != NULL);
885 	ASSERT(pAnnot != NULL);
886 
887 	CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
888 
889 	CPDF_FormControl* pCtrl = pWidget->GetFormControl();
890 	ASSERT(pCtrl != NULL);
891 
892 	CPDF_FormControl::HighlightingMode eHM = pCtrl->GetHighlightingMode();
893 
894 	if (eHM == CPDF_FormControl::Push)
895 	{
896 		if (m_bMouseDown)
897 		{
898 			if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Down))
899 				pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Down, NULL);
900 			else
901 				pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
902 		}
903 		else if (m_bMouseIn)
904 		{
905 			if (pWidget->IsWidgetAppearanceValid(CPDF_Annot::Rollover))
906 				pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Rollover, NULL);
907 			else
908 				pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
909 		}
910 		else
911 		{
912 			pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
913 		}
914 	}
915 	else
916 		pWidget->DrawAppearance(pDevice, pUser2Device, CPDF_Annot::Normal, NULL);
917 }
918 
919 
OnDrawDeactive(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,CPDF_Matrix * pUser2Device,FX_DWORD dwFlags)920 void CFFL_Button::OnDrawDeactive(CPDFSDK_PageView *pPageView, /*HDC hDC,*/ CPDFSDK_Annot* pAnnot,
921 								 CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device,
922 								 /*const CRect& rcWindow, */FX_DWORD dwFlags)
923 {
924 	OnDraw(pPageView, pAnnot, pDevice, pUser2Device, dwFlags);
925 }
926