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_FORMFILLER_CFFL_INTERACTIVEFORMFILLER_H_
8#define FPDFSDK_FORMFILLER_CFFL_INTERACTIVEFORMFILLER_H_
9
10#include <map>
11#include <memory>
12#include <utility>
13
14#include "core/fxcrt/unowned_ptr.h"
15#include "fpdfsdk/cpdfsdk_annot.h"
16#include "fpdfsdk/fsdk_define.h"
17#include "fpdfsdk/pwl/cpwl_edit.h"
18
19class CFFL_FormFiller;
20class CPDFSDK_FormFillEnvironment;
21class CPDFSDK_PageView;
22class CPDFSDK_Widget;
23
24class CFFL_InteractiveFormFiller : public IPWL_Filler_Notify {
25 public:
26  explicit CFFL_InteractiveFormFiller(
27      CPDFSDK_FormFillEnvironment* pFormFillEnv);
28  ~CFFL_InteractiveFormFiller() override;
29
30  bool Annot_HitTest(CPDFSDK_PageView* pPageView,
31                     CPDFSDK_Annot* pAnnot,
32                     const CFX_PointF& point);
33  FX_RECT GetViewBBox(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot);
34  void OnDraw(CPDFSDK_PageView* pPageView,
35              CPDFSDK_Annot* pAnnot,
36              CFX_RenderDevice* pDevice,
37              CFX_Matrix* pUser2Device);
38
39  void OnDelete(CPDFSDK_Annot* pAnnot);
40
41  void OnMouseEnter(CPDFSDK_PageView* pPageView,
42                    CPDFSDK_Annot::ObservedPtr* pAnnot,
43                    uint32_t nFlag);
44  void OnMouseExit(CPDFSDK_PageView* pPageView,
45                   CPDFSDK_Annot::ObservedPtr* pAnnot,
46                   uint32_t nFlag);
47  bool OnLButtonDown(CPDFSDK_PageView* pPageView,
48                     CPDFSDK_Annot::ObservedPtr* pAnnot,
49                     uint32_t nFlags,
50                     const CFX_PointF& point);
51  bool OnLButtonUp(CPDFSDK_PageView* pPageView,
52                   CPDFSDK_Annot::ObservedPtr* pAnnot,
53                   uint32_t nFlags,
54                   const CFX_PointF& point);
55  bool OnLButtonDblClk(CPDFSDK_PageView* pPageView,
56                       CPDFSDK_Annot::ObservedPtr* pAnnot,
57                       uint32_t nFlags,
58                       const CFX_PointF& point);
59  bool OnMouseMove(CPDFSDK_PageView* pPageView,
60                   CPDFSDK_Annot::ObservedPtr* pAnnot,
61                   uint32_t nFlags,
62                   const CFX_PointF& point);
63  bool OnMouseWheel(CPDFSDK_PageView* pPageView,
64                    CPDFSDK_Annot::ObservedPtr* pAnnot,
65                    uint32_t nFlags,
66                    short zDelta,
67                    const CFX_PointF& point);
68  bool OnRButtonDown(CPDFSDK_PageView* pPageView,
69                     CPDFSDK_Annot::ObservedPtr* pAnnot,
70                     uint32_t nFlags,
71                     const CFX_PointF& point);
72  bool OnRButtonUp(CPDFSDK_PageView* pPageView,
73                   CPDFSDK_Annot::ObservedPtr* pAnnot,
74                   uint32_t nFlags,
75                   const CFX_PointF& point);
76
77  bool OnKeyDown(CPDFSDK_Annot* pAnnot, uint32_t nKeyCode, uint32_t nFlags);
78  bool OnChar(CPDFSDK_Annot* pAnnot, uint32_t nChar, uint32_t nFlags);
79
80  bool OnSetFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, uint32_t nFlag);
81  bool OnKillFocus(CPDFSDK_Annot::ObservedPtr* pAnnot, uint32_t nFlag);
82
83  CFFL_FormFiller* GetFormFiller(CPDFSDK_Annot* pAnnot, bool bRegister);
84
85  WideString GetSelectedText(CPDFSDK_Annot* pAnnot);
86  void ReplaceSelection(CPDFSDK_Annot* pAnnot, const WideString& text);
87
88  static bool IsVisible(CPDFSDK_Widget* pWidget);
89  static bool IsReadOnly(CPDFSDK_Widget* pWidget);
90  static bool IsFillingAllowed(CPDFSDK_Widget* pWidget);
91  static bool IsValidAnnot(CPDFSDK_PageView* pPageView, CPDFSDK_Annot* pAnnot);
92
93  bool OnKeyStrokeCommit(CPDFSDK_Annot::ObservedPtr* pWidget,
94                         CPDFSDK_PageView* pPageView,
95                         uint32_t nFlag);
96  bool OnValidate(CPDFSDK_Annot::ObservedPtr* pAnnot,
97                  CPDFSDK_PageView* pPageView,
98                  uint32_t nFlag);
99  void OnCalculate(CPDFSDK_Annot::ObservedPtr* pAnnot,
100                   CPDFSDK_PageView* pPageView,
101                   uint32_t nFlag);
102  void OnFormat(CPDFSDK_Annot::ObservedPtr* pAnnot,
103                CPDFSDK_PageView* pPageView,
104                uint32_t nFlag);
105  bool OnButtonUp(CPDFSDK_Annot::ObservedPtr* pAnnot,
106                  CPDFSDK_PageView* pPageView,
107                  uint32_t nFlag);
108#ifdef PDF_ENABLE_XFA
109  bool OnClick(CPDFSDK_Annot::ObservedPtr* pAnnot,
110               CPDFSDK_PageView* pPageView,
111               uint32_t nFlag);
112  bool OnFull(CPDFSDK_Annot::ObservedPtr* pAnnot,
113              CPDFSDK_PageView* pPageView,
114              uint32_t nFlag);
115  bool OnPreOpen(CPDFSDK_Annot::ObservedPtr* pAnnot,
116                 CPDFSDK_PageView* pPageView,
117                 uint32_t nFlag);
118  bool OnPostOpen(CPDFSDK_Annot::ObservedPtr* pAnnot,
119                  CPDFSDK_PageView* pPageView,
120                  uint32_t nFlag);
121#endif  // PDF_ENABLE_XFA
122
123 private:
124  using CFFL_Widget2Filler =
125      std::map<CPDFSDK_Annot*, std::unique_ptr<CFFL_FormFiller>>;
126
127  // IPWL_Filler_Notify:
128  void QueryWherePopup(CPWL_Wnd::PrivateData* pAttached,
129                       float fPopupMin,
130                       float fPopupMax,
131                       bool* bBottom,
132                       float* fPopupRet) override;
133  // Returns {bRC, bExit}.
134  std::pair<bool, bool> OnBeforeKeyStroke(CPWL_Wnd::PrivateData* pAttached,
135                                          WideString& strChange,
136                                          const WideString& strChangeEx,
137                                          int nSelStart,
138                                          int nSelEnd,
139                                          bool bKeyDown,
140                                          uint32_t nFlag) override;
141#ifdef PDF_ENABLE_XFA
142  bool OnPopupPreOpen(CPWL_Wnd::PrivateData* pAttached,
143                      uint32_t nFlag) override;
144  bool OnPopupPostOpen(CPWL_Wnd::PrivateData* pAttached,
145                       uint32_t nFlag) override;
146  void SetFocusAnnotTab(CPDFSDK_Annot* pWidget, bool bSameField, bool bNext);
147#endif  // PDF_ENABLE_XFA
148  void UnRegisterFormFiller(CPDFSDK_Annot* pAnnot);
149
150  UnownedPtr<CPDFSDK_FormFillEnvironment> const m_pFormFillEnv;
151  CFFL_Widget2Filler m_Maps;
152  bool m_bNotifying;
153};
154
155class CFFL_PrivateData : public CPWL_Wnd::PrivateData {
156 public:
157  CPDFSDK_Widget* pWidget;
158  CPDFSDK_PageView* pPageView;
159  uint32_t nWidgetAppearanceAge;
160  uint32_t nWidgetValueAge;
161};
162
163#endif  // FPDFSDK_FORMFILLER_CFFL_INTERACTIVEFORMFILLER_H_
164