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 
15 class IPWL_SpellCheck;
16 
17 class IPWL_Filler_Notify {
18  public:
~IPWL_Filler_Notify()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 
45 class 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 
SetFillerNotify(IPWL_Filler_Notify * pNotify)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:
AttachFFLData(void * pData)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