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_PDFWINDOW_PWL_EDIT_H_
8#define FPDFSDK_INCLUDE_PDFWINDOW_PWL_EDIT_H_
9
10#include "core/include/fxcrt/fx_basic.h"
11#include "fpdfsdk/include/fxedit/fx_edit.h"
12#include "fpdfsdk/include/pdfwindow/PWL_EditCtrl.h"
13#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h"
14
15class IPWL_SpellCheck;
16
17class IPWL_Filler_Notify {
18 public:
19  virtual ~IPWL_Filler_Notify() {}
20  virtual void QueryWherePopup(
21      void* pPrivateData,
22      FX_FLOAT fPopupMin,
23      FX_FLOAT fPopupMax,
24      int32_t& nRet,
25      FX_FLOAT& fPopupRet) = 0;  // nRet: (0:bottom 1:top)
26  virtual void OnBeforeKeyStroke(void* pPrivateData,
27                                 CFX_WideString& strChange,
28                                 const CFX_WideString& strChangeEx,
29                                 int nSelStart,
30                                 int nSelEnd,
31                                 FX_BOOL bKeyDown,
32                                 FX_BOOL& bRC,
33                                 FX_BOOL& bExit,
34                                 FX_DWORD nFlag) = 0;
35#ifdef PDF_ENABLE_XFA
36  virtual void OnPopupPreOpen(void* pPrivateData,
37                              FX_BOOL& bExit,
38                              FX_DWORD nFlag) = 0;
39  virtual void OnPopupPostOpen(void* pPrivateData,
40                               FX_BOOL& bExit,
41                               FX_DWORD nFlag) = 0;
42#endif  // PDF_ENABLE_XFA
43};
44
45class CPWL_Edit : public CPWL_EditCtrl, public IFX_Edit_OprNotify {
46 public:
47  CPWL_Edit();
48  ~CPWL_Edit() override;
49
50  // CPWL_EditCtrl
51  CFX_ByteString GetClassName() const override;
52  void OnDestroy() override;
53  void OnCreated() override;
54  void RePosChildWnd() override;
55  CPDF_Rect GetClientRect() const override;
56  void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override;
57  void DrawThisAppearance(CFX_RenderDevice* pDevice,
58                          CFX_Matrix* pUser2Device) override;
59  FX_BOOL OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag) override;
60  FX_BOOL OnLButtonDblClk(const CPDF_Point& point, FX_DWORD nFlag) override;
61  FX_BOOL OnRButtonUp(const CPDF_Point& point, FX_DWORD nFlag) override;
62  FX_BOOL OnMouseWheel(short zDelta,
63                       const CPDF_Point& point,
64                       FX_DWORD nFlag) override;
65  FX_BOOL OnKeyDown(FX_WORD nChar, FX_DWORD nFlag) override;
66  FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag) override;
67  CPDF_Rect GetFocusRect() const override;
68  void OnSetFocus() override;
69  void OnKillFocus() override;
70
71  void SetAlignFormatH(PWL_EDIT_ALIGNFORMAT_H nFormat = PEAH_LEFT,
72                       FX_BOOL bPaint = TRUE);  // 0:left 1:right 2:middle
73  void SetAlignFormatV(PWL_EDIT_ALIGNFORMAT_V nFormat = PEAV_TOP,
74                       FX_BOOL bPaint = TRUE);  // 0:top 1:bottom 2:center
75
76  void SetCharArray(int32_t nCharArray);
77  void SetLimitChar(int32_t nLimitChar);
78
79  void SetHorzScale(int32_t nHorzScale, FX_BOOL bPaint = TRUE);
80  void SetCharSpace(FX_FLOAT fCharSpace, FX_BOOL bPaint = TRUE);
81
82  void SetLineLeading(FX_FLOAT fLineLeading, FX_BOOL bPaint = TRUE);
83
84  void EnableSpellCheck(FX_BOOL bEnabled);
85
86  FX_BOOL CanSelectAll() const;
87  FX_BOOL CanClear() const;
88  FX_BOOL CanCopy() const;
89  FX_BOOL CanCut() const;
90  FX_BOOL CanPaste() const;
91
92  virtual void CopyText();
93  virtual void PasteText();
94  virtual void CutText();
95
96  virtual void SetText(const FX_WCHAR* csText);
97  void ReplaceSel(const FX_WCHAR* csText);
98
99  CFX_ByteString GetTextAppearanceStream(const CPDF_Point& ptOffset) const;
100  CFX_ByteString GetCaretAppearanceStream(const CPDF_Point& ptOffset) const;
101  CFX_ByteString GetSelectAppearanceStream(const CPDF_Point& ptOffset) const;
102
103  FX_BOOL IsTextFull() const;
104
105  static FX_FLOAT GetCharArrayAutoFontSize(CPDF_Font* pFont,
106                                           const CPDF_Rect& rcPlate,
107                                           int32_t nCharArray);
108
109  void SetFillerNotify(IPWL_Filler_Notify* pNotify) {
110    m_pFillerNotify = pNotify;
111  }
112
113  void GeneratePageObjects(CPDF_PageObjects* pPageObjects,
114                           const CPDF_Point& ptOffset,
115                           CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);
116  void GeneratePageObjects(CPDF_PageObjects* pPageObjects,
117                           const CPDF_Point& ptOffset);
118
119 protected:
120  // IFX_Edit_OprNotify
121  void OnInsertWord(const CPVT_WordPlace& place,
122                    const CPVT_WordPlace& oldplace) override;
123  void OnInsertReturn(const CPVT_WordPlace& place,
124                      const CPVT_WordPlace& oldplace) override;
125  void OnBackSpace(const CPVT_WordPlace& place,
126                   const CPVT_WordPlace& oldplace) override;
127  void OnDelete(const CPVT_WordPlace& place,
128                const CPVT_WordPlace& oldplace) override;
129  void OnClear(const CPVT_WordPlace& place,
130               const CPVT_WordPlace& oldplace) override;
131  void OnSetText(const CPVT_WordPlace& place,
132                 const CPVT_WordPlace& oldplace) override;
133  void OnInsertText(const CPVT_WordPlace& place,
134                    const CPVT_WordPlace& oldplace) override;
135  void OnAddUndo(IFX_Edit_UndoItem* pUndoItem) override;
136
137 private:
138  CPVT_WordRange GetSelectWordRange() const;
139  virtual void ShowVScrollBar(FX_BOOL bShow);
140  FX_BOOL IsVScrollBarVisible() const;
141  void SetParamByFlag();
142
143  FX_FLOAT GetCharArrayAutoFontSize(int32_t nCharArray);
144  CPDF_Point GetWordRightBottomPoint(const CPVT_WordPlace& wpWord);
145
146  CPVT_WordRange CombineWordRange(const CPVT_WordRange& wr1,
147                                  const CPVT_WordRange& wr2);
148  CPVT_WordRange GetLatinWordsRange(const CPDF_Point& point) const;
149  CPVT_WordRange GetLatinWordsRange(const CPVT_WordPlace& place) const;
150  CPVT_WordRange GetArabicWordsRange(const CPVT_WordPlace& place) const;
151  CPVT_WordRange GetSameWordsRange(const CPVT_WordPlace& place,
152                                   FX_BOOL bLatin,
153                                   FX_BOOL bArabic) const;
154
155 public:
156  FX_BOOL IsProceedtoOnChar(FX_WORD nKeyCode, FX_DWORD nFlag);
157
158 private:
159  IPWL_Filler_Notify* m_pFillerNotify;
160  IPWL_SpellCheck* m_pSpellCheck;
161  FX_BOOL m_bFocus;
162  CPDF_Rect m_rcOldWindow;
163
164 public:
165  void AttachFFLData(void* pData) { m_pFormFiller = pData; }
166
167 private:
168  void* m_pFormFiller;
169};
170
171#endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_EDIT_H_
172