• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #include "fpdfsdk/formfiller/cffl_formfiller.h"
8 
9 #include <utility>
10 
11 #include "core/fpdfapi/page/cpdf_page.h"
12 #include "core/fxge/cfx_renderdevice.h"
13 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
14 #include "fpdfsdk/cpdfsdk_pageview.h"
15 #include "fpdfsdk/cpdfsdk_widget.h"
16 #include "fpdfsdk/formfiller/cba_fontmap.h"
17 #include "fpdfsdk/fsdk_common.h"
18 
19 namespace {
20 
CPDFSDKAnnotToWidget(CPDFSDK_Annot * annot)21 CPDFSDK_Widget* CPDFSDKAnnotToWidget(CPDFSDK_Annot* annot) {
22   return static_cast<CPDFSDK_Widget*>(annot);
23 }
24 
25 }  // namespace
26 
CFFL_FormFiller(CPDFSDK_FormFillEnvironment * pFormFillEnv,CPDFSDK_Widget * pWidget)27 CFFL_FormFiller::CFFL_FormFiller(CPDFSDK_FormFillEnvironment* pFormFillEnv,
28                                  CPDFSDK_Widget* pWidget)
29     : m_pFormFillEnv(pFormFillEnv), m_pWidget(pWidget), m_bValid(false) {
30   ASSERT(m_pFormFillEnv);
31 }
32 
~CFFL_FormFiller()33 CFFL_FormFiller::~CFFL_FormFiller() {
34   DestroyWindows();
35 }
36 
DestroyWindows()37 void CFFL_FormFiller::DestroyWindows() {
38   for (const auto& it : m_Maps) {
39     CPWL_Wnd* pWnd = it.second;
40     auto* pData = static_cast<CFFL_PrivateData*>(pWnd->GetAttachedData());
41     pWnd->InvalidateProvider(this);
42     pWnd->Destroy();
43     delete pWnd;
44     delete pData;
45   }
46   m_Maps.clear();
47 }
48 
GetViewBBox(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)49 FX_RECT CFFL_FormFiller::GetViewBBox(CPDFSDK_PageView* pPageView,
50                                      CPDFSDK_Annot* pAnnot) {
51   ASSERT(pPageView);
52   ASSERT(pAnnot);
53 
54   CFX_FloatRect rcAnnot = m_pWidget->GetRect();
55   if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false))
56     rcAnnot = PWLtoFFL(pWnd->GetWindowRect());
57 
58   CFX_FloatRect rcWin = rcAnnot;
59   CFX_FloatRect rcFocus = GetFocusBox(pPageView);
60   if (!rcFocus.IsEmpty())
61     rcWin.Union(rcFocus);
62 
63   if (!rcWin.IsEmpty()) {
64     rcWin.Inflate(1, 1);
65     rcWin.Normalize();
66   }
67   return rcWin.GetOuterRect();
68 }
69 
OnDraw(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,const CFX_Matrix & mtUser2Device)70 void CFFL_FormFiller::OnDraw(CPDFSDK_PageView* pPageView,
71                              CPDFSDK_Annot* pAnnot,
72                              CFX_RenderDevice* pDevice,
73                              const CFX_Matrix& mtUser2Device) {
74   ASSERT(pAnnot->GetPDFAnnot()->GetSubtype() == CPDF_Annot::Subtype::WIDGET);
75 
76   if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false)) {
77     CFX_Matrix mt = GetCurMatrix();
78     mt.Concat(mtUser2Device);
79     pWnd->DrawAppearance(pDevice, mt);
80     return;
81   }
82 
83   CPDFSDK_Widget* pWidget = CPDFSDKAnnotToWidget(pAnnot);
84   if (!CFFL_InteractiveFormFiller::IsVisible(pWidget))
85     return;
86 
87   pWidget->DrawAppearance(pDevice, mtUser2Device, CPDF_Annot::Normal, nullptr);
88 }
89 
OnDrawDeactive(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,CFX_RenderDevice * pDevice,const CFX_Matrix & mtUser2Device)90 void CFFL_FormFiller::OnDrawDeactive(CPDFSDK_PageView* pPageView,
91                                      CPDFSDK_Annot* pAnnot,
92                                      CFX_RenderDevice* pDevice,
93                                      const CFX_Matrix& mtUser2Device) {
94   CPDFSDKAnnotToWidget(pAnnot)->DrawAppearance(pDevice, mtUser2Device,
95                                                CPDF_Annot::Normal, nullptr);
96 }
97 
OnMouseEnter(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)98 void CFFL_FormFiller::OnMouseEnter(CPDFSDK_PageView* pPageView,
99                                    CPDFSDK_Annot* pAnnot) {}
100 
OnMouseExit(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot)101 void CFFL_FormFiller::OnMouseExit(CPDFSDK_PageView* pPageView,
102                                   CPDFSDK_Annot* pAnnot) {
103   EndTimer();
104   ASSERT(m_pWidget);
105 }
106 
OnLButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,uint32_t nFlags,const CFX_PointF & point)107 bool CFFL_FormFiller::OnLButtonDown(CPDFSDK_PageView* pPageView,
108                                     CPDFSDK_Annot* pAnnot,
109                                     uint32_t nFlags,
110                                     const CFX_PointF& point) {
111   CPWL_Wnd* pWnd = GetPDFWindow(pPageView, true);
112   if (!pWnd)
113     return false;
114 
115   m_bValid = true;
116   FX_RECT rect = GetViewBBox(pPageView, pAnnot);
117   InvalidateRect(rect);
118   if (!rect.Contains(static_cast<int>(point.x), static_cast<int>(point.y)))
119     return false;
120   return pWnd->OnLButtonDown(WndtoPWL(pPageView, point), nFlags);
121 }
122 
OnLButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,uint32_t nFlags,const CFX_PointF & point)123 bool CFFL_FormFiller::OnLButtonUp(CPDFSDK_PageView* pPageView,
124                                   CPDFSDK_Annot* pAnnot,
125                                   uint32_t nFlags,
126                                   const CFX_PointF& point) {
127   CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false);
128   if (!pWnd)
129     return false;
130 
131   InvalidateRect(GetViewBBox(pPageView, pAnnot));
132   pWnd->OnLButtonUp(WndtoPWL(pPageView, point), nFlags);
133   return true;
134 }
135 
OnLButtonDblClk(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,uint32_t nFlags,const CFX_PointF & point)136 bool CFFL_FormFiller::OnLButtonDblClk(CPDFSDK_PageView* pPageView,
137                                       CPDFSDK_Annot* pAnnot,
138                                       uint32_t nFlags,
139                                       const CFX_PointF& point) {
140   CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false);
141   if (!pWnd)
142     return false;
143 
144   pWnd->OnLButtonDblClk(WndtoPWL(pPageView, point), nFlags);
145   return true;
146 }
147 
OnMouseMove(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,uint32_t nFlags,const CFX_PointF & point)148 bool CFFL_FormFiller::OnMouseMove(CPDFSDK_PageView* pPageView,
149                                   CPDFSDK_Annot* pAnnot,
150                                   uint32_t nFlags,
151                                   const CFX_PointF& point) {
152   CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false);
153   if (!pWnd)
154     return false;
155 
156   pWnd->OnMouseMove(WndtoPWL(pPageView, point), nFlags);
157   return true;
158 }
159 
OnMouseWheel(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,uint32_t nFlags,short zDelta,const CFX_PointF & point)160 bool CFFL_FormFiller::OnMouseWheel(CPDFSDK_PageView* pPageView,
161                                    CPDFSDK_Annot* pAnnot,
162                                    uint32_t nFlags,
163                                    short zDelta,
164                                    const CFX_PointF& point) {
165   if (!IsValid())
166     return false;
167 
168   CPWL_Wnd* pWnd = GetPDFWindow(pPageView, true);
169   return pWnd && pWnd->OnMouseWheel(zDelta, WndtoPWL(pPageView, point), nFlags);
170 }
171 
OnRButtonDown(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,uint32_t nFlags,const CFX_PointF & point)172 bool CFFL_FormFiller::OnRButtonDown(CPDFSDK_PageView* pPageView,
173                                     CPDFSDK_Annot* pAnnot,
174                                     uint32_t nFlags,
175                                     const CFX_PointF& point) {
176   CPWL_Wnd* pWnd = GetPDFWindow(pPageView, true);
177   if (!pWnd)
178     return false;
179 
180   pWnd->OnRButtonDown(WndtoPWL(pPageView, point), nFlags);
181   return true;
182 }
183 
OnRButtonUp(CPDFSDK_PageView * pPageView,CPDFSDK_Annot * pAnnot,uint32_t nFlags,const CFX_PointF & point)184 bool CFFL_FormFiller::OnRButtonUp(CPDFSDK_PageView* pPageView,
185                                   CPDFSDK_Annot* pAnnot,
186                                   uint32_t nFlags,
187                                   const CFX_PointF& point) {
188   CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false);
189   if (!pWnd)
190     return false;
191 
192   pWnd->OnRButtonUp(WndtoPWL(pPageView, point), nFlags);
193   return true;
194 }
195 
OnKeyDown(CPDFSDK_Annot * pAnnot,uint32_t nKeyCode,uint32_t nFlags)196 bool CFFL_FormFiller::OnKeyDown(CPDFSDK_Annot* pAnnot,
197                                 uint32_t nKeyCode,
198                                 uint32_t nFlags) {
199   if (!IsValid())
200     return false;
201 
202   CPDFSDK_PageView* pPageView = GetCurPageView(true);
203   ASSERT(pPageView);
204 
205   CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false);
206   return pWnd && pWnd->OnKeyDown(nKeyCode, nFlags);
207 }
208 
OnChar(CPDFSDK_Annot * pAnnot,uint32_t nChar,uint32_t nFlags)209 bool CFFL_FormFiller::OnChar(CPDFSDK_Annot* pAnnot,
210                              uint32_t nChar,
211                              uint32_t nFlags) {
212   if (!IsValid())
213     return false;
214 
215   CPDFSDK_PageView* pPageView = GetCurPageView(true);
216   ASSERT(pPageView);
217 
218   CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false);
219   return pWnd && pWnd->OnChar(nChar, nFlags);
220 }
221 
GetSelectedText(CPDFSDK_Annot * pAnnot)222 WideString CFFL_FormFiller::GetSelectedText(CPDFSDK_Annot* pAnnot) {
223   if (!IsValid())
224     return WideString();
225 
226   CPDFSDK_PageView* pPageView = GetCurPageView(true);
227   ASSERT(pPageView);
228 
229   CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false);
230   return pWnd ? pWnd->GetSelectedText() : WideString();
231 }
232 
ReplaceSelection(CPDFSDK_Annot * pAnnot,const WideString & text)233 void CFFL_FormFiller::ReplaceSelection(CPDFSDK_Annot* pAnnot,
234                                        const WideString& text) {
235   if (!IsValid())
236     return;
237 
238   CPDFSDK_PageView* pPageView = GetCurPageView(true);
239   ASSERT(pPageView);
240 
241   CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false);
242   if (!pWnd)
243     return;
244 
245   pWnd->ReplaceSelection(text);
246 }
247 
SetFocusForAnnot(CPDFSDK_Annot * pAnnot,uint32_t nFlag)248 void CFFL_FormFiller::SetFocusForAnnot(CPDFSDK_Annot* pAnnot, uint32_t nFlag) {
249   CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pAnnot;
250   UnderlyingPageType* pPage = pWidget->GetUnderlyingPage();
251   CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetPageView(pPage, true);
252   if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, true))
253     pWnd->SetFocus();
254 
255   m_bValid = true;
256   InvalidateRect(GetViewBBox(pPageView, pAnnot));
257 }
258 
KillFocusForAnnot(CPDFSDK_Annot * pAnnot,uint32_t nFlag)259 void CFFL_FormFiller::KillFocusForAnnot(CPDFSDK_Annot* pAnnot, uint32_t nFlag) {
260   if (!IsValid())
261     return;
262 
263   CPDFSDK_PageView* pPageView = GetCurPageView(false);
264   if (!pPageView || !CommitData(pPageView, nFlag))
265     return;
266   if (CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false))
267     pWnd->KillFocus();
268 
269   bool bDestroyPDFWindow;
270   switch (m_pWidget->GetFieldType()) {
271     case FormFieldType::kPushButton:
272     case FormFieldType::kCheckBox:
273     case FormFieldType::kRadioButton:
274       bDestroyPDFWindow = true;
275       break;
276     default:
277       bDestroyPDFWindow = false;
278       break;
279   }
280   EscapeFiller(pPageView, bDestroyPDFWindow);
281 }
282 
IsValid() const283 bool CFFL_FormFiller::IsValid() const {
284   return m_bValid;
285 }
286 
GetCreateParam()287 CPWL_Wnd::CreateParams CFFL_FormFiller::GetCreateParam() {
288   CPWL_Wnd::CreateParams cp;
289   cp.pParentWnd = nullptr;
290   cp.pProvider.Reset(this);
291   cp.rcRectWnd = GetPDFWindowRect();
292 
293   uint32_t dwCreateFlags = PWS_BORDER | PWS_BACKGROUND | PWS_VISIBLE;
294   uint32_t dwFieldFlag = m_pWidget->GetFieldFlags();
295   if (dwFieldFlag & FIELDFLAG_READONLY)
296     dwCreateFlags |= PWS_READONLY;
297 
298   FX_COLORREF color;
299   if (m_pWidget->GetFillColor(color))
300     cp.sBackgroundColor = CFX_Color(color);
301   if (m_pWidget->GetBorderColor(color))
302     cp.sBorderColor = CFX_Color(color);
303 
304   cp.sTextColor = CFX_Color(CFX_Color::kGray, 0);
305 
306   if (m_pWidget->GetTextColor(color))
307     cp.sTextColor = CFX_Color(color);
308 
309   cp.fFontSize = m_pWidget->GetFontSize();
310   cp.dwBorderWidth = m_pWidget->GetBorderWidth();
311 
312   cp.nBorderStyle = m_pWidget->GetBorderStyle();
313   switch (cp.nBorderStyle) {
314     case BorderStyle::DASH:
315       cp.sDash = CPWL_Dash(3, 3, 0);
316       break;
317     case BorderStyle::BEVELED:
318     case BorderStyle::INSET:
319       cp.dwBorderWidth *= 2;
320       break;
321     default:
322       break;
323   }
324 
325   if (cp.fFontSize <= 0)
326     dwCreateFlags |= PWS_AUTOFONTSIZE;
327 
328   cp.dwFlags = dwCreateFlags;
329   cp.pSystemHandler = m_pFormFillEnv->GetSysHandler();
330   return cp;
331 }
332 
GetPDFWindow(CPDFSDK_PageView * pPageView,bool bNew)333 CPWL_Wnd* CFFL_FormFiller::GetPDFWindow(CPDFSDK_PageView* pPageView,
334                                         bool bNew) {
335   ASSERT(pPageView);
336 
337   auto it = m_Maps.find(pPageView);
338   const bool found = it != m_Maps.end();
339   CPWL_Wnd* pWnd = found ? it->second : nullptr;
340   if (!bNew)
341     return pWnd;
342 
343   if (!found) {
344     CPWL_Wnd::CreateParams cp = GetCreateParam();
345     cp.pAttachedWidget.Reset(m_pWidget.Get());
346 
347     auto* pPrivateData = new CFFL_PrivateData;
348     pPrivateData->pWidget = m_pWidget.Get();
349     pPrivateData->pPageView = pPageView;
350     pPrivateData->nWidgetAppearanceAge = m_pWidget->GetAppearanceAge();
351     pPrivateData->nWidgetValueAge = 0;
352     cp.pAttachedData = pPrivateData;
353     CPWL_Wnd* pNewWnd = NewPDFWindow(cp);
354     m_Maps[pPageView] = pNewWnd;
355     return pNewWnd;
356   }
357 
358   auto* pPrivateData = static_cast<CFFL_PrivateData*>(pWnd->GetAttachedData());
359   if (pPrivateData->nWidgetAppearanceAge == m_pWidget->GetAppearanceAge())
360     return pWnd;
361 
362   return ResetPDFWindow(
363       pPageView, pPrivateData->nWidgetValueAge == m_pWidget->GetValueAge());
364 }
365 
DestroyPDFWindow(CPDFSDK_PageView * pPageView)366 void CFFL_FormFiller::DestroyPDFWindow(CPDFSDK_PageView* pPageView) {
367   auto it = m_Maps.find(pPageView);
368   if (it == m_Maps.end())
369     return;
370 
371   CPWL_Wnd* pWnd = it->second;
372   auto* pData = static_cast<CFFL_PrivateData*>(pWnd->GetAttachedData());
373   pWnd->Destroy();
374   delete pWnd;
375   delete pData;
376   m_Maps.erase(it);
377 }
378 
GetWindowMatrix(CPWL_Wnd::PrivateData * pAttached)379 CFX_Matrix CFFL_FormFiller::GetWindowMatrix(CPWL_Wnd::PrivateData* pAttached) {
380   CFX_Matrix mt;
381   auto* pPrivateData = static_cast<CFFL_PrivateData*>(pAttached);
382   if (!pPrivateData || !pPrivateData->pPageView)
383     return mt;
384 
385   CFX_Matrix mtPageView;
386   pPrivateData->pPageView->GetCurrentMatrix(mtPageView);
387   mt = GetCurMatrix();
388   mt.Concat(mtPageView);
389   return mt;
390 }
391 
GetCurMatrix()392 CFX_Matrix CFFL_FormFiller::GetCurMatrix() {
393   CFX_Matrix mt;
394   CFX_FloatRect rcDA = m_pWidget->GetPDFAnnot()->GetRect();
395   switch (m_pWidget->GetRotate()) {
396     case 90:
397       mt = CFX_Matrix(0, 1, -1, 0, rcDA.right - rcDA.left, 0);
398       break;
399     case 180:
400       mt = CFX_Matrix(-1, 0, 0, -1, rcDA.right - rcDA.left,
401                       rcDA.top - rcDA.bottom);
402       break;
403     case 270:
404       mt = CFX_Matrix(0, -1, 1, 0, 0, rcDA.top - rcDA.bottom);
405       break;
406     case 0:
407     default:
408       break;
409   }
410   mt.e += rcDA.left;
411   mt.f += rcDA.bottom;
412 
413   return mt;
414 }
415 
GetPDFWindowRect() const416 CFX_FloatRect CFFL_FormFiller::GetPDFWindowRect() const {
417   CFX_FloatRect rectAnnot = m_pWidget->GetPDFAnnot()->GetRect();
418 
419   float fWidth = rectAnnot.right - rectAnnot.left;
420   float fHeight = rectAnnot.top - rectAnnot.bottom;
421   if ((m_pWidget->GetRotate() / 90) & 0x01)
422     std::swap(fWidth, fHeight);
423   return CFX_FloatRect(0, 0, fWidth, fHeight);
424 }
425 
GetCurPageView(bool renew)426 CPDFSDK_PageView* CFFL_FormFiller::GetCurPageView(bool renew) {
427   UnderlyingPageType* pPage = m_pWidget->GetUnderlyingPage();
428   return m_pFormFillEnv->GetPageView(pPage, renew);
429 }
430 
GetFocusBox(CPDFSDK_PageView * pPageView)431 CFX_FloatRect CFFL_FormFiller::GetFocusBox(CPDFSDK_PageView* pPageView) {
432   CPWL_Wnd* pWnd = GetPDFWindow(pPageView, false);
433   if (!pWnd)
434     return CFX_FloatRect();
435 
436   CFX_FloatRect rcFocus = FFLtoWnd(pPageView, PWLtoFFL(pWnd->GetFocusRect()));
437   return pPageView->GetPDFPage()->GetPageBBox().Contains(rcFocus)
438              ? rcFocus
439              : CFX_FloatRect();
440 }
441 
FFLtoPWL(const CFX_FloatRect & rect)442 CFX_FloatRect CFFL_FormFiller::FFLtoPWL(const CFX_FloatRect& rect) {
443   return GetCurMatrix().GetInverse().TransformRect(rect);
444 }
445 
PWLtoFFL(const CFX_FloatRect & rect)446 CFX_FloatRect CFFL_FormFiller::PWLtoFFL(const CFX_FloatRect& rect) {
447   return GetCurMatrix().TransformRect(rect);
448 }
449 
FFLtoPWL(const CFX_PointF & point)450 CFX_PointF CFFL_FormFiller::FFLtoPWL(const CFX_PointF& point) {
451   return GetCurMatrix().GetInverse().Transform(point);
452 }
453 
PWLtoFFL(const CFX_PointF & point)454 CFX_PointF CFFL_FormFiller::PWLtoFFL(const CFX_PointF& point) {
455   return GetCurMatrix().Transform(point);
456 }
457 
WndtoPWL(CPDFSDK_PageView * pPageView,const CFX_PointF & pt)458 CFX_PointF CFFL_FormFiller::WndtoPWL(CPDFSDK_PageView* pPageView,
459                                      const CFX_PointF& pt) {
460   return FFLtoPWL(pt);
461 }
462 
FFLtoWnd(CPDFSDK_PageView * pPageView,const CFX_FloatRect & rect)463 CFX_FloatRect CFFL_FormFiller::FFLtoWnd(CPDFSDK_PageView* pPageView,
464                                         const CFX_FloatRect& rect) {
465   return rect;
466 }
467 
CommitData(CPDFSDK_PageView * pPageView,uint32_t nFlag)468 bool CFFL_FormFiller::CommitData(CPDFSDK_PageView* pPageView, uint32_t nFlag) {
469   if (!IsDataChanged(pPageView))
470     return true;
471 
472   CFFL_InteractiveFormFiller* pFormFiller =
473       m_pFormFillEnv->GetInteractiveFormFiller();
474   CPDFSDK_Annot::ObservedPtr pObserved(m_pWidget.Get());
475 
476   if (!pFormFiller->OnKeyStrokeCommit(&pObserved, pPageView, nFlag)) {
477     if (!pObserved)
478       return false;
479     ResetPDFWindow(pPageView, false);
480     return true;
481   }
482   if (!pObserved)
483     return false;
484 
485   if (!pFormFiller->OnValidate(&pObserved, pPageView, nFlag)) {
486     if (!pObserved)
487       return false;
488     ResetPDFWindow(pPageView, false);
489     return true;
490   }
491   if (!pObserved)
492     return false;
493 
494   SaveData(pPageView); // may invoking JS to delete this widget.
495   if (!pObserved)
496     return false;
497 
498   pFormFiller->OnCalculate(&pObserved, pPageView, nFlag);
499   if (!pObserved)
500     return false;
501 
502   pFormFiller->OnFormat(&pObserved, pPageView, nFlag);
503   if (!pObserved)
504     return false;
505 
506   return true;
507 }
508 
IsDataChanged(CPDFSDK_PageView * pPageView)509 bool CFFL_FormFiller::IsDataChanged(CPDFSDK_PageView* pPageView) {
510   return false;
511 }
512 
SaveData(CPDFSDK_PageView * pPageView)513 void CFFL_FormFiller::SaveData(CPDFSDK_PageView* pPageView) {}
514 
515 #ifdef PDF_ENABLE_XFA
IsFieldFull(CPDFSDK_PageView * pPageView)516 bool CFFL_FormFiller::IsFieldFull(CPDFSDK_PageView* pPageView) {
517   return false;
518 }
519 #endif  // PDF_ENABLE_XFA
520 
SetChangeMark()521 void CFFL_FormFiller::SetChangeMark() {
522   m_pFormFillEnv->OnChange();
523 }
524 
GetActionData(CPDFSDK_PageView * pPageView,CPDF_AAction::AActionType type,PDFSDK_FieldAction & fa)525 void CFFL_FormFiller::GetActionData(CPDFSDK_PageView* pPageView,
526                                     CPDF_AAction::AActionType type,
527                                     PDFSDK_FieldAction& fa) {
528   fa.sValue = m_pWidget->GetValue();
529 }
530 
SetActionData(CPDFSDK_PageView * pPageView,CPDF_AAction::AActionType type,const PDFSDK_FieldAction & fa)531 void CFFL_FormFiller::SetActionData(CPDFSDK_PageView* pPageView,
532                                     CPDF_AAction::AActionType type,
533                                     const PDFSDK_FieldAction& fa) {}
534 
IsActionDataChanged(CPDF_AAction::AActionType type,const PDFSDK_FieldAction & faOld,const PDFSDK_FieldAction & faNew)535 bool CFFL_FormFiller::IsActionDataChanged(CPDF_AAction::AActionType type,
536                                           const PDFSDK_FieldAction& faOld,
537                                           const PDFSDK_FieldAction& faNew) {
538   return false;
539 }
540 
SaveState(CPDFSDK_PageView * pPageView)541 void CFFL_FormFiller::SaveState(CPDFSDK_PageView* pPageView) {}
542 
RestoreState(CPDFSDK_PageView * pPageView)543 void CFFL_FormFiller::RestoreState(CPDFSDK_PageView* pPageView) {}
544 
ResetPDFWindow(CPDFSDK_PageView * pPageView,bool bRestoreValue)545 CPWL_Wnd* CFFL_FormFiller::ResetPDFWindow(CPDFSDK_PageView* pPageView,
546                                           bool bRestoreValue) {
547   return GetPDFWindow(pPageView, false);
548 }
549 
TimerProc()550 void CFFL_FormFiller::TimerProc() {}
551 
GetSystemHandler() const552 CFX_SystemHandler* CFFL_FormFiller::GetSystemHandler() const {
553   return m_pFormFillEnv->GetSysHandler();
554 }
555 
EscapeFiller(CPDFSDK_PageView * pPageView,bool bDestroyPDFWindow)556 void CFFL_FormFiller::EscapeFiller(CPDFSDK_PageView* pPageView,
557                                    bool bDestroyPDFWindow) {
558   m_bValid = false;
559 
560   InvalidateRect(GetViewBBox(pPageView, m_pWidget.Get()));
561   if (bDestroyPDFWindow)
562     DestroyPDFWindow(pPageView);
563 }
564 
InvalidateRect(const FX_RECT & rect)565 void CFFL_FormFiller::InvalidateRect(const FX_RECT& rect) {
566   m_pFormFillEnv->Invalidate(m_pWidget->GetUnderlyingPage(), rect);
567 }
568