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