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_EDITCTRL_H_
8 #define FPDFSDK_INCLUDE_PDFWINDOW_PWL_EDITCTRL_H_
9 
10 #include "../../../core/include/fxcrt/fx_string.h"
11 #include "../fxedit/fx_edit.h"
12 #include "PWL_Wnd.h"
13 
14 class CPWL_Caret;
15 class CPWL_Edit;
16 class CPWL_EditCtrl;
17 class IFX_Edit;
18 class IPWL_Edit_Notify;
19 struct CPVT_WordPlace;
20 
21 enum PWL_EDIT_ALIGNFORMAT_H
22 {
23 	PEAH_LEFT = 0,
24 	PEAH_MIDDLE,
25 	PEAH_RIGHT
26 };
27 
28 enum PWL_EDIT_ALIGNFORMAT_V
29 {
30 	PEAV_TOP = 0,
31 	PEAV_CENTER,
32 	PEAV_BOTTOM
33 };
34 
35 class IPWL_Edit_Notify
36 {
37 public:
~IPWL_Edit_Notify()38         virtual ~IPWL_Edit_Notify() { }
39 	//when the position of caret is changed in edit
OnCaretMove(FX_INT32 x1,FX_INT32 y1,FX_INT32 x2,FX_INT32 y2)40 	virtual void					OnCaretMove(FX_INT32 x1, FX_INT32 y1, FX_INT32 x2, FX_INT32 y2) {}
OnContentChange(const CPDF_Rect & rcContent)41 	virtual void					OnContentChange(const CPDF_Rect& rcContent){}
42 	//OprType: 0 InsertWord
43 	//1 InsertReturn
44 	//2 BackSpace
45 	//3 Delete
46 	//4 Clear
47 	//5 InsertText
48 	//6 SetText
OnInsertWord(const CPVT_WordPlace & place,const CPVT_WordPlace & oldplace)49 	virtual void					OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
OnInsertReturn(const CPVT_WordPlace & place,const CPVT_WordPlace & oldplace)50 	virtual void					OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
OnBackSpace(const CPVT_WordPlace & place,const CPVT_WordPlace & oldplace)51 	virtual void					OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
OnDelete(const CPVT_WordPlace & place,const CPVT_WordPlace & oldplace)52 	virtual void					OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
OnClear(const CPVT_WordPlace & place,const CPVT_WordPlace & oldplace)53 	virtual void					OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
OnInsertText(const CPVT_WordPlace & place,const CPVT_WordPlace & oldplace)54 	virtual void					OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
OnSetText(const CPVT_WordPlace & place,const CPVT_WordPlace & oldplace)55 	virtual void					OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
OnAddUndo(CPWL_Edit * pEdit)56 	virtual void					OnAddUndo(CPWL_Edit* pEdit) {}
57 };
58 
59 class PWL_CLASS CPWL_EditCtrl : public CPWL_Wnd, public IFX_Edit_Notify
60 {
61 	friend class CPWL_Edit_Notify;
62 
63 public:
64 	CPWL_EditCtrl();
65 	virtual ~CPWL_EditCtrl();
66 
67 public:
68 	virtual void					OnCreate(PWL_CREATEPARAM & cp);
69 	virtual void					OnCreated();
70 
71 	virtual FX_BOOL					OnKeyDown(FX_WORD nChar, FX_DWORD nFlag);
72 	virtual FX_BOOL					OnChar(FX_WORD nChar, FX_DWORD nFlag);
73 	virtual FX_BOOL					OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag);
74 	virtual FX_BOOL					OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag);
75 	virtual FX_BOOL					OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag);
76 	virtual void					OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam = 0, FX_INTPTR lParam = 0);
77 
78 	virtual void					CreateChildWnd(const PWL_CREATEPARAM & cp);
79 	virtual void					RePosChildWnd();
80 	virtual void					SetFontSize(FX_FLOAT fFontSize);
81 	virtual FX_FLOAT				GetFontSize() const;
82 
83 public:
84 	virtual void					SetText(FX_LPCWSTR csText);
85 
86 	virtual void					CopyText();
87 	virtual void					PasteText();
88 	virtual void 					CutText();
89 
90 	CPDF_Rect						GetContentRect() const;
91 	void							GetCaretPos(FX_INT32& x, FX_INT32& y) const;
92 	FX_BOOL							IsModified() const;
93 
94 	CFX_WideString					GetText() const;
95 	void							SetSel(FX_INT32 nStartChar,FX_INT32 nEndChar);
96 	void							GetSel(FX_INT32 & nStartChar, FX_INT32 & nEndChar ) const;
97 	void							GetTextRange(const CPDF_Rect& rect, FX_INT32 & nStartChar, FX_INT32 & nEndChar) const;
98 	CFX_WideString					GetText(FX_INT32 & nStartChar, FX_INT32 & nEndChar) const;
99 	void							Clear();
100 	void							SelectAll();
101 
102 	FX_INT32						GetCaret() const;
103 	void							SetCaret(FX_INT32 nPos);
104 	FX_INT32						GetTotalWords() const;
105 
106 	void							Paint();
107 
108 	void							EnableRefresh(FX_BOOL bRefresh);
109 	CPDF_Point						GetScrollPos() const;
110 	void							SetScrollPos(const CPDF_Point& point);
111 
SetEditNotify(IPWL_Edit_Notify * pNotify)112 	void							SetEditNotify(IPWL_Edit_Notify* pNotify) {m_pEditNotify = pNotify;}
113 
SetCharSet(FX_BYTE nCharSet)114 	void							SetCharSet(FX_BYTE nCharSet){m_nCharSet = nCharSet;}
115 	FX_INT32						GetCharSet() const;
116 
SetCodePage(FX_INT32 nCodePage)117 	void							SetCodePage(FX_INT32 nCodePage){m_nCodePage = nCodePage;}
GetCodePage()118 	FX_INT32						GetCodePage() const {return m_nCodePage;}
119 
120 	CPDF_Font *						GetCaretFont() const;
121 	FX_FLOAT						GetCaretFontSize() const;
122 
123 	FX_BOOL							CanUndo() const;
124 	FX_BOOL							CanRedo() const;
125 	void							Redo();
126 	void							Undo();
127 
128 	void							SetReadyToInput();
129 protected:
130 	virtual void					ShowVScrollBar(FX_BOOL bShow);
131 
132 	virtual void					InsertWord(FX_WORD word, FX_INT32 nCharset);
133 	virtual void					InsertReturn();
134 	virtual void					InsertText(FX_LPCWSTR csText);
135 
136 	virtual void					SetCursor();
137 	FX_BOOL							IsWndHorV();
138 
139 	void							Delete();
140 	void							Backspace();
141 
142 protected:
143 	void							GetCaretInfo(CPDF_Point & ptHead, CPDF_Point & ptFoot) const;
144 	void							SetCaret(FX_BOOL bVisible, const CPDF_Point & ptHead, const CPDF_Point & ptFoot);
145 
146 	void							SetEditCaret(FX_BOOL bVisible);
147 
148 protected:
IOnSetScrollInfoX(FX_FLOAT fPlateMin,FX_FLOAT fPlateMax,FX_FLOAT fContentMin,FX_FLOAT fContentMax,FX_FLOAT fSmallStep,FX_FLOAT fBigStep)149 	virtual void					IOnSetScrollInfoX(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
150 												FX_FLOAT fContentMin, FX_FLOAT fContentMax,
151 												FX_FLOAT fSmallStep, FX_FLOAT fBigStep){}
152 	virtual void					IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
153 												FX_FLOAT fContentMin, FX_FLOAT fContentMax,
154 												FX_FLOAT fSmallStep, FX_FLOAT fBigStep);
IOnSetScrollPosX(FX_FLOAT fx)155 	virtual void					IOnSetScrollPosX(FX_FLOAT fx){}
156 	virtual void					IOnSetScrollPosY(FX_FLOAT fy);
157 	virtual void					IOnSetCaret(FX_BOOL bVisible,const CPDF_Point & ptHead,const CPDF_Point & ptFoot, const CPVT_WordPlace& place);
158 	virtual void					IOnCaretChange(const CPVT_SecProps & secProps, const CPVT_WordProps & wordProps);
159 	virtual void					IOnContentChange(const CPDF_Rect& rcContent);
160 	virtual void					IOnInvalidateRect(CPDF_Rect * pRect);
161 
162 private:
163 	void							CreateEditCaret(const PWL_CREATEPARAM & cp);
164 
165 protected:
166 	IFX_Edit*						m_pEdit;
167 	CPWL_Caret*						m_pEditCaret;
168 	FX_BOOL							m_bMouseDown;
169 	IPWL_Edit_Notify*				m_pEditNotify;
170 
171 private:
172 	FX_INT32						m_nCharSet;
173 	FX_INT32						m_nCodePage;
174 };
175 
176 #endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_EDITCTRL_H_
177