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
20CFFL_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
29CFFL_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
50void 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
58CPDF_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
68FX_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
93void 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
113void 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
125void CFFL_FormFiller::OnCreate(CPDFSDK_Annot* pAnnot)
126{
127}
128
129void CFFL_FormFiller::OnLoad(CPDFSDK_Annot* pAnnot)
130{
131}
132
133void CFFL_FormFiller::OnDelete(CPDFSDK_Annot* pAnnot)
134{
135}
136
137void CFFL_FormFiller::OnMouseEnter(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
138{
139}
140
141void CFFL_FormFiller::OnMouseExit(CPDFSDK_PageView *pPageView, CPDFSDK_Annot* pAnnot)
142{
143	EndTimer();
144	ASSERT(m_pWidget != NULL);
145}
146
147FX_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
164FX_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
177FX_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
188FX_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
204FX_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
216FX_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
227FX_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
238FX_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
249FX_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
265FX_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
281void CFFL_FormFiller::OnDeSelected(CPDFSDK_Annot* pAnnot)
282{
283	ASSERT(FALSE);
284}
285
286void CFFL_FormFiller::OnSelected(CPDFSDK_Annot* pAnnot)
287{
288	ASSERT(FALSE);
289}
290
291FX_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
320FX_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
350FX_BOOL	CFFL_FormFiller::IsValid() const
351{
352	return m_bValid;
353}
354
355PWL_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
432CPWL_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
477void 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
494CPDF_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
511CPDF_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
543CFX_WideString CFFL_FormFiller::LoadPopupMenuString(int nIndex)
544{
545	ASSERT(m_pApp != NULL);
546
547	return L"";
548}
549
550CPDF_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
567CPDFSDK_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
579CPDF_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
594CPDF_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
605CPDF_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
615CPDF_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
626CPDF_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
636CPDF_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
647CPDF_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
658void CFFL_FormFiller::FFL_FreeData(void* pData)
659{
660	ASSERT(pData != NULL);
661
662	delete (CFFL_PrivateData*)pData;
663}
664
665FX_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
703FX_BOOL	CFFL_FormFiller::IsDataChanged(CPDFSDK_PageView* pPageView)
704{
705	return FALSE;
706}
707
708void CFFL_FormFiller::SaveData(CPDFSDK_PageView* pPageView)
709{
710}
711
712void CFFL_FormFiller::GetKeyStrokeData(CPDFSDK_PageView* pPageView, FFL_KeyStrokeData& data)
713{
714}
715
716void CFFL_FormFiller::SetChangeMark()
717{
718	m_pApp->FFI_OnChange();
719}
720
721void CFFL_FormFiller::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
722							PDFSDK_FieldAction& fa)
723{
724	fa.sValue = m_pWidget->GetValue();
725}
726
727void CFFL_FormFiller::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
728									const PDFSDK_FieldAction& fa)
729{
730}
731
732FX_BOOL	CFFL_FormFiller::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
733									const PDFSDK_FieldAction& faNew)
734{
735	return FALSE;
736}
737
738void CFFL_FormFiller::SaveState(CPDFSDK_PageView* pPageView)
739{
740}
741
742void CFFL_FormFiller::RestoreState(CPDFSDK_PageView* pPageView)
743{
744}
745
746CPWL_Wnd*  CFFL_FormFiller::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
747{
748	return GetPDFWindow(pPageView, FALSE);
749}
750
751void CFFL_FormFiller::TimerProc()
752{
753
754}
755
756IFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const
757{
758	return m_pApp->GetSysHandler();
759//	return NULL;
760}
761
762void CFFL_FormFiller::OnKeyStroke(FX_BOOL bKeyDown)
763{
764}
765
766void 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
777FX_BOOL CFFL_FormFiller::CanCopy(CPDFSDK_Document* pDocument)
778{
779	return FALSE;
780}
781
782FX_BOOL CFFL_FormFiller::CanCut(CPDFSDK_Document* pDocument)
783{
784	return FALSE;
785}
786
787FX_BOOL	CFFL_FormFiller::CanPaste(CPDFSDK_Document* pDocument)
788{
789	return FALSE;
790}
791
792void CFFL_FormFiller::DoCopy(CPDFSDK_Document* pDocument)
793{
794}
795
796void CFFL_FormFiller::DoCut(CPDFSDK_Document* pDocument)
797{
798}
799
800void CFFL_FormFiller::DoPaste(CPDFSDK_Document* pDocument)
801{
802}
803
804void 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
812CFFL_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
819CFFL_Button::~CFFL_Button()
820{
821}
822
823void 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
831void 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
843FX_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
857FX_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
873FX_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
880void 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
920void 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