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#ifndef FPDFSDK_INCLUDE_FORMFILLER_FFL_FORMFILLER_H_
8#define FPDFSDK_INCLUDE_FORMFILLER_FFL_FORMFILLER_H_
9
10#include "fpdfsdk/include/formfiller/FFL_CBA_Fontmap.h"
11#include "fpdfsdk/include/formfiller/FFL_IFormFiller.h"
12#include "fpdfsdk/include/fsdk_baseform.h"
13
14class CPDFDoc_Environment;
15class CPDFSDK_Annot;
16class CPDFSDK_Document;
17class CPDFSDK_PageView;
18class CPDFSDK_Widget;
19
20class CFFL_FormFiller : public IPWL_Provider, public CPWL_TimerHandler {
21 public:
22  CFFL_FormFiller(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot);
23  ~CFFL_FormFiller() override;
24
25  virtual FX_RECT GetViewBBox(CPDFSDK_PageView* pPageView,
26                              CPDFSDK_Annot* pAnnot);
27  virtual void OnDraw(CPDFSDK_PageView* pPageView,
28                      CPDFSDK_Annot* pAnnot,
29                      CFX_RenderDevice* pDevice,
30                      CFX_Matrix* pUser2Device,
31                      FX_DWORD dwFlags);
32  virtual void OnDrawDeactive(CPDFSDK_PageView* pPageView,
33                              CPDFSDK_Annot* pAnnot,
34                              CFX_RenderDevice* pDevice,
35                              CFX_Matrix* pUser2Device,
36                              FX_DWORD dwFlags);
37
38  virtual void OnCreate(CPDFSDK_Annot* pAnnot);
39  virtual void OnLoad(CPDFSDK_Annot* pAnnot);
40  virtual void OnDelete(CPDFSDK_Annot* pAnnot);
41
42  virtual void OnMouseEnter(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot);
43  virtual void OnMouseExit(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot);
44
45  virtual FX_BOOL OnLButtonDown(CPDFSDK_PageView* pPageView,
46                                CPDFSDK_Annot* pAnnot,
47                                FX_UINT nFlags,
48                                const CPDF_Point& point);
49  virtual FX_BOOL OnLButtonUp(CPDFSDK_PageView* pPageView,
50                              CPDFSDK_Annot* pAnnot,
51                              FX_UINT nFlags,
52                              const CPDF_Point& point);
53  virtual FX_BOOL OnLButtonDblClk(CPDFSDK_PageView* pPageView,
54                                  CPDFSDK_Annot* pAnnot,
55                                  FX_UINT nFlags,
56                                  const CPDF_Point& point);
57  virtual FX_BOOL OnMouseMove(CPDFSDK_PageView* pPageView,
58                              CPDFSDK_Annot* pAnnot,
59                              FX_UINT nFlags,
60                              const CPDF_Point& point);
61  virtual FX_BOOL OnMouseWheel(CPDFSDK_PageView* pPageView,
62                               CPDFSDK_Annot* pAnnot,
63                               FX_UINT nFlags,
64                               short zDelta,
65                               const CPDF_Point& point);
66  virtual FX_BOOL OnRButtonDown(CPDFSDK_PageView* pPageView,
67                                CPDFSDK_Annot* pAnnot,
68                                FX_UINT nFlags,
69                                const CPDF_Point& point);
70  virtual FX_BOOL OnRButtonUp(CPDFSDK_PageView* pPageView,
71                              CPDFSDK_Annot* pAnnot,
72                              FX_UINT nFlags,
73                              const CPDF_Point& point);
74
75  virtual FX_BOOL OnKeyDown(CPDFSDK_Annot* pAnnot,
76                            FX_UINT nKeyCode,
77                            FX_UINT nFlags);
78  virtual FX_BOOL OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags);
79
80  void SetFocusForAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
81  void KillFocusForAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag);
82
83  // CPWL_TimerHandler
84  void TimerProc() override;
85  IFX_SystemHandler* GetSystemHandler() const override;
86
87  // IPWL_Provider
88  CFX_Matrix GetWindowMatrix(void* pAttachedData) override;
89  CFX_WideString LoadPopupMenuString(int nIndex) override;
90
91  virtual void GetActionData(CPDFSDK_PageView* pPageView,
92                             CPDF_AAction::AActionType type,
93                             PDFSDK_FieldAction& fa);
94  virtual void SetActionData(CPDFSDK_PageView* pPageView,
95                             CPDF_AAction::AActionType type,
96                             const PDFSDK_FieldAction& fa);
97  virtual FX_BOOL IsActionDataChanged(CPDF_AAction::AActionType type,
98                                      const PDFSDK_FieldAction& faOld,
99                                      const PDFSDK_FieldAction& faNew);
100
101  virtual void SaveState(CPDFSDK_PageView* pPageView);
102  virtual void RestoreState(CPDFSDK_PageView* pPageView);
103
104  virtual CPWL_Wnd* ResetPDFWindow(CPDFSDK_PageView* pPageView,
105                                   FX_BOOL bRestoreValue);
106
107  CFX_Matrix GetCurMatrix();
108
109  CPDF_Rect FFLtoPWL(const CPDF_Rect& rect);
110  CPDF_Rect PWLtoFFL(const CPDF_Rect& rect);
111  CPDF_Point FFLtoPWL(const CPDF_Point& point);
112  CPDF_Point PWLtoFFL(const CPDF_Point& point);
113
114  CPDF_Point WndtoPWL(CPDFSDK_PageView* pPageView, const CPDF_Point& pt);
115  CPDF_Rect FFLtoWnd(CPDFSDK_PageView* pPageView, const CPDF_Rect& rect);
116
117  void SetWindowRect(CPDFSDK_PageView* pPageView, const CPDF_Rect& rcWindow);
118  CPDF_Rect GetWindowRect(CPDFSDK_PageView* pPageView);
119
120  FX_BOOL CommitData(CPDFSDK_PageView* pPageView, FX_UINT nFlag);
121  virtual FX_BOOL IsDataChanged(CPDFSDK_PageView* pPageView);
122  virtual void SaveData(CPDFSDK_PageView* pPageView);
123
124#ifdef PDF_ENABLE_XFA
125  virtual FX_BOOL IsFieldFull(CPDFSDK_PageView* pPageView);
126#endif  // PDF_ENABLE_XFA
127
128  CPWL_Wnd* GetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bNew);
129  void DestroyPDFWindow(CPDFSDK_PageView* pPageView);
130  void EscapeFiller(CPDFSDK_PageView* pPageView, FX_BOOL bDestroyPDFWindow);
131
132  virtual PWL_CREATEPARAM GetCreateParam();
133  virtual CPWL_Wnd* NewPDFWindow(const PWL_CREATEPARAM& cp,
134                                 CPDFSDK_PageView* pPageView) = 0;
135  virtual CPDF_Rect GetFocusBox(CPDFSDK_PageView* pPageView);
136
137  FX_BOOL IsValid() const;
138  CPDF_Rect GetPDFWindowRect() const;
139
140  CPDFSDK_PageView* GetCurPageView();
141  void SetChangeMark();
142
143  virtual void InvalidateRect(double left,
144                              double top,
145                              double right,
146                              double bottom);
147  CPDFDoc_Environment* GetApp() { return m_pApp; }
148  CPDFSDK_Annot* GetSDKAnnot() { return m_pAnnot; }
149
150 protected:
151  using CFFL_PageView2PDFWindow = std::map<CPDFSDK_PageView*, CPWL_Wnd*>;
152
153  CPDFDoc_Environment* m_pApp;
154  CPDFSDK_Widget* m_pWidget;
155  CPDFSDK_Annot* m_pAnnot;
156
157  FX_BOOL m_bValid;
158  CFFL_PageView2PDFWindow m_Maps;
159  CPDF_Point m_ptOldPos;
160};
161
162class CFFL_Button : public CFFL_FormFiller {
163 public:
164  CFFL_Button(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget);
165  ~CFFL_Button() override;
166
167  // CFFL_FormFiller
168  void OnMouseEnter(CPDFSDK_PageView* pPageView,
169                    CPDFSDK_Annot* pAnnot) override;
170  void OnMouseExit(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot) override;
171  FX_BOOL OnLButtonDown(CPDFSDK_PageView* pPageView,
172                        CPDFSDK_Annot* pAnnot,
173                        FX_UINT nFlags,
174                        const CPDF_Point& point) override;
175  FX_BOOL OnLButtonUp(CPDFSDK_PageView* pPageView,
176                      CPDFSDK_Annot* pAnnot,
177                      FX_UINT nFlags,
178                      const CPDF_Point& point) override;
179  FX_BOOL OnMouseMove(CPDFSDK_PageView* pPageView,
180                      CPDFSDK_Annot* pAnnot,
181                      FX_UINT nFlags,
182                      const CPDF_Point& point) override;
183  void OnDraw(CPDFSDK_PageView* pPageView,
184              CPDFSDK_Annot* pAnnot,
185              CFX_RenderDevice* pDevice,
186              CFX_Matrix* pUser2Device,
187              FX_DWORD dwFlags) override;
188  void OnDrawDeactive(CPDFSDK_PageView* pPageView,
189                      CPDFSDK_Annot* pAnnot,
190                      CFX_RenderDevice* pDevice,
191                      CFX_Matrix* pUser2Device,
192                      FX_DWORD dwFlags) override;
193
194 protected:
195  FX_BOOL m_bMouseIn;
196  FX_BOOL m_bMouseDown;
197};
198
199#endif  // FPDFSDK_INCLUDE_FORMFILLER_FFL_FORMFILLER_H_
200