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
14class CPWL_Caret;
15class CPWL_Edit;
16class CPWL_EditCtrl;
17class IFX_Edit;
18class IPWL_Edit_Notify;
19struct CPVT_WordPlace;
20
21enum PWL_EDIT_ALIGNFORMAT_H
22{
23	PEAH_LEFT = 0,
24	PEAH_MIDDLE,
25	PEAH_RIGHT
26};
27
28enum PWL_EDIT_ALIGNFORMAT_V
29{
30	PEAV_TOP = 0,
31	PEAV_CENTER,
32	PEAV_BOTTOM
33};
34
35class IPWL_Edit_Notify
36{
37public:
38        virtual ~IPWL_Edit_Notify() { }
39	//when the position of caret is changed in edit
40	virtual void					OnCaretMove(FX_INT32 x1, FX_INT32 y1, FX_INT32 x2, FX_INT32 y2) {}
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
49	virtual void					OnInsertWord(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
50	virtual void					OnInsertReturn(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
51	virtual void					OnBackSpace(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
52	virtual void					OnDelete(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
53	virtual void					OnClear(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
54	virtual void					OnInsertText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
55	virtual void					OnSetText(const CPVT_WordPlace& place, const CPVT_WordPlace& oldplace){}
56	virtual void					OnAddUndo(CPWL_Edit* pEdit) {}
57};
58
59class PWL_CLASS CPWL_EditCtrl : public CPWL_Wnd, public IFX_Edit_Notify
60{
61	friend class CPWL_Edit_Notify;
62
63public:
64	CPWL_EditCtrl();
65	virtual ~CPWL_EditCtrl();
66
67public:
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
83public:
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
112	void							SetEditNotify(IPWL_Edit_Notify* pNotify) {m_pEditNotify = pNotify;}
113
114	void							SetCharSet(FX_BYTE nCharSet){m_nCharSet = nCharSet;}
115	FX_INT32						GetCharSet() const;
116
117	void							SetCodePage(FX_INT32 nCodePage){m_nCodePage = nCodePage;}
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();
129protected:
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
142protected:
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
148protected:
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);
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
162private:
163	void							CreateEditCaret(const PWL_CREATEPARAM & cp);
164
165protected:
166	IFX_Edit*						m_pEdit;
167	CPWL_Caret*						m_pEditCaret;
168	FX_BOOL							m_bMouseDown;
169	IPWL_Edit_Notify*				m_pEditNotify;
170
171private:
172	FX_INT32						m_nCharSet;
173	FX_INT32						m_nCodePage;
174};
175
176#endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_EDITCTRL_H_
177