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