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