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