blob: c1b000012f019e8be194ada933b9b1c7073d65e8 [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// 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.
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
dsinclair89bdd082016-04-06 10:47:54 -07007#ifndef FPDFSDK_FXEDIT_INCLUDE_FXET_EDIT_H_
8#define FPDFSDK_FXEDIT_INCLUDE_FXET_EDIT_H_
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07009
thestig821d59e2016-05-11 12:59:22 -070010#include <memory>
11
dsinclairc7a73492016-04-05 12:01:42 -070012#include "core/fpdfdoc/include/cpvt_secprops.h"
13#include "core/fpdfdoc/include/cpvt_wordprops.h"
dsinclair89bdd082016-04-06 10:47:54 -070014#include "fpdfsdk/fxedit/include/fx_edit.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070015
dsinclaire35af1e2016-07-13 11:26:20 -070016class CPDF_PageObjectHolder;
17class CPDF_TextObject;
18class CPWL_Edit;
19class CPWL_EditCtrl;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070020class CFX_Edit;
21class CFX_Edit_Iterator;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070022class CFX_Edit_Provider;
dsinclaire35af1e2016-07-13 11:26:20 -070023class CFX_RenderDevice;
24class CFX_SystemHandler;
25class IFX_Edit_UndoItem;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070026
Nico Weber9d8ec5a2015-08-04 13:00:21 -070027struct CFX_Edit_LineRect {
Tom Sepez281a9ea2016-02-26 14:24:28 -080028 CFX_Edit_LineRect(const CPVT_WordRange& wrLine, const CFX_FloatRect& rcLine)
Nico Weber9d8ec5a2015-08-04 13:00:21 -070029 : m_wrLine(wrLine), m_rcLine(rcLine) {}
30
Nico Weber9d8ec5a2015-08-04 13:00:21 -070031 CPVT_WordRange m_wrLine;
Tom Sepez281a9ea2016-02-26 14:24:28 -080032 CFX_FloatRect m_rcLine;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070033};
34
Nico Weber9d8ec5a2015-08-04 13:00:21 -070035class CFX_Edit_LineRectArray {
36 public:
weili625ad662016-06-15 11:21:33 -070037 CFX_Edit_LineRectArray();
38 virtual ~CFX_Edit_LineRectArray();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070039
weili625ad662016-06-15 11:21:33 -070040 void Empty();
41 void RemoveAll();
42 void operator=(CFX_Edit_LineRectArray& rects);
43 void Add(const CPVT_WordRange& wrLine, const CFX_FloatRect& rcLine);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070044
weili625ad662016-06-15 11:21:33 -070045 int32_t GetSize() const;
46 CFX_Edit_LineRect* GetAt(int32_t nIndex) const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070047
weili625ad662016-06-15 11:21:33 -070048 private:
Nico Weber9d8ec5a2015-08-04 13:00:21 -070049 CFX_ArrayTemplate<CFX_Edit_LineRect*> m_LineRects;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070050};
51
Nico Weber9d8ec5a2015-08-04 13:00:21 -070052class CFX_Edit_RectArray {
53 public:
weili625ad662016-06-15 11:21:33 -070054 CFX_Edit_RectArray();
55 virtual ~CFX_Edit_RectArray();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070056
weili625ad662016-06-15 11:21:33 -070057 void Empty();
58 void Add(const CFX_FloatRect& rect);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070059
weili625ad662016-06-15 11:21:33 -070060 int32_t GetSize() const;
61 CFX_FloatRect* GetAt(int32_t nIndex) const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070062
weili625ad662016-06-15 11:21:33 -070063 private:
Tom Sepez281a9ea2016-02-26 14:24:28 -080064 CFX_ArrayTemplate<CFX_FloatRect*> m_Rects;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070065};
66
Nico Weber9d8ec5a2015-08-04 13:00:21 -070067class CFX_Edit_Refresh {
68 public:
69 CFX_Edit_Refresh();
70 virtual ~CFX_Edit_Refresh();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070071
Nico Weber9d8ec5a2015-08-04 13:00:21 -070072 void BeginRefresh();
Tom Sepez281a9ea2016-02-26 14:24:28 -080073 void Push(const CPVT_WordRange& linerange, const CFX_FloatRect& rect);
Nico Weber9d8ec5a2015-08-04 13:00:21 -070074 void NoAnalyse();
Tom Sepez281a9ea2016-02-26 14:24:28 -080075 void AddRefresh(const CFX_FloatRect& rect);
Nico Weber9d8ec5a2015-08-04 13:00:21 -070076 const CFX_Edit_RectArray* GetRefreshRects() const;
77 void EndRefresh();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070078
Nico Weber9d8ec5a2015-08-04 13:00:21 -070079 private:
80 CFX_Edit_LineRectArray m_NewLineRects;
81 CFX_Edit_LineRectArray m_OldLineRects;
82 CFX_Edit_RectArray m_RefreshRects;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070083};
84
Nico Weber9d8ec5a2015-08-04 13:00:21 -070085class CFX_Edit_Select {
86 public:
weili625ad662016-06-15 11:21:33 -070087 CFX_Edit_Select();
88 CFX_Edit_Select(const CPVT_WordPlace& begin, const CPVT_WordPlace& end);
89 explicit CFX_Edit_Select(const CPVT_WordRange& range);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070090
weili625ad662016-06-15 11:21:33 -070091 void Default();
92 void Set(const CPVT_WordPlace& begin, const CPVT_WordPlace& end);
93 void SetBeginPos(const CPVT_WordPlace& begin);
94 void SetEndPos(const CPVT_WordPlace& end);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070095
weili625ad662016-06-15 11:21:33 -070096 CPVT_WordRange ConvertToWordRange() const;
97 FX_BOOL IsExist() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070098
Nico Weber9d8ec5a2015-08-04 13:00:21 -070099 CPVT_WordPlace BeginPos, EndPos;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700100};
101
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700102class CFX_Edit_Undo {
103 public:
Lei Zhang375a8642016-01-11 11:59:17 -0800104 explicit CFX_Edit_Undo(int32_t nBufsize);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700105 virtual ~CFX_Edit_Undo();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700106
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700107 void Undo();
108 void Redo();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700109
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700110 void AddItem(IFX_Edit_UndoItem* pItem);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700111
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700112 FX_BOOL CanUndo() const;
113 FX_BOOL CanRedo() const;
114 FX_BOOL IsModified() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700115
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700116 void Reset();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700117
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700118 private:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700119 void RemoveHeads();
120 void RemoveTails();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700121
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700122 private:
123 CFX_ArrayTemplate<IFX_Edit_UndoItem*> m_UndoItemStack;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700124
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700125 int32_t m_nCurUndoPos;
126 int32_t m_nBufSize;
127 FX_BOOL m_bModified;
128 FX_BOOL m_bVirgin;
129 FX_BOOL m_bWorking;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700130};
131
dsinclaire35af1e2016-07-13 11:26:20 -0700132class IFX_Edit_UndoItem {
133 public:
134 virtual ~IFX_Edit_UndoItem() {}
135
136 virtual void Undo() = 0;
137 virtual void Redo() = 0;
138 virtual CFX_WideString GetUndoTitle() = 0;
139};
140
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700141class CFX_Edit_UndoItem : public IFX_Edit_UndoItem {
142 public:
weili625ad662016-06-15 11:21:33 -0700143 CFX_Edit_UndoItem();
144 ~CFX_Edit_UndoItem() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700145
weili625ad662016-06-15 11:21:33 -0700146 CFX_WideString GetUndoTitle() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700147
weili625ad662016-06-15 11:21:33 -0700148 void SetFirst(FX_BOOL bFirst);
weili625ad662016-06-15 11:21:33 -0700149 void SetLast(FX_BOOL bLast);
150 FX_BOOL IsLast();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700151
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700152 private:
153 FX_BOOL m_bFirst;
154 FX_BOOL m_bLast;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700155};
156
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700157class CFX_Edit_GroupUndoItem : public IFX_Edit_UndoItem {
158 public:
Lei Zhang375a8642016-01-11 11:59:17 -0800159 explicit CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700160 ~CFX_Edit_GroupUndoItem() override;
Tom Sepezced4c2b2015-04-20 16:33:30 -0700161
weili625ad662016-06-15 11:21:33 -0700162 // IFX_Edit_UndoItem
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700163 void Undo() override;
164 void Redo() override;
165 CFX_WideString GetUndoTitle() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700166
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700167 void AddUndoItem(CFX_Edit_UndoItem* pUndoItem);
168 void UpdateItems();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700169
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700170 private:
171 CFX_WideString m_sTitle;
172 CFX_ArrayTemplate<CFX_Edit_UndoItem*> m_Items;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700173};
174
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700175class CFXEU_InsertWord : public CFX_Edit_UndoItem {
176 public:
177 CFXEU_InsertWord(CFX_Edit* pEdit,
178 const CPVT_WordPlace& wpOldPlace,
179 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700180 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700181 int32_t charset,
182 const CPVT_WordProps* pWordProps);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700183 ~CFXEU_InsertWord() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700184
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700185 // CFX_Edit_UndoItem
186 void Redo() override;
187 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700188
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700189 private:
190 CFX_Edit* m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700191
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700192 CPVT_WordPlace m_wpOld;
193 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700194 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700195 int32_t m_nCharset;
196 CPVT_WordProps m_WordProps;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700197};
198
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700199class CFXEU_InsertReturn : public CFX_Edit_UndoItem {
200 public:
201 CFXEU_InsertReturn(CFX_Edit* pEdit,
202 const CPVT_WordPlace& wpOldPlace,
203 const CPVT_WordPlace& wpNewPlace,
204 const CPVT_SecProps* pSecProps,
205 const CPVT_WordProps* pWordProps);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700206 ~CFXEU_InsertReturn() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700207
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700208 // CFX_Edit_UndoItem
209 void Redo() override;
210 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700211
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700212 private:
213 CFX_Edit* m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700214
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700215 CPVT_WordPlace m_wpOld;
216 CPVT_WordPlace m_wpNew;
217 CPVT_SecProps m_SecProps;
218 CPVT_WordProps m_WordProps;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700219};
220
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700221class CFXEU_Backspace : public CFX_Edit_UndoItem {
222 public:
223 CFXEU_Backspace(CFX_Edit* pEdit,
224 const CPVT_WordPlace& wpOldPlace,
225 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700226 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700227 int32_t charset,
228 const CPVT_SecProps& SecProps,
229 const CPVT_WordProps& WordProps);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700230 ~CFXEU_Backspace() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700231
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700232 // CFX_Edit_UndoItem
233 void Redo() override;
234 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700235
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700236 private:
237 CFX_Edit* m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700238
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700239 CPVT_WordPlace m_wpOld;
240 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700241 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700242 int32_t m_nCharset;
243 CPVT_SecProps m_SecProps;
244 CPVT_WordProps m_WordProps;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700245};
246
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700247class CFXEU_Delete : public CFX_Edit_UndoItem {
248 public:
249 CFXEU_Delete(CFX_Edit* pEdit,
250 const CPVT_WordPlace& wpOldPlace,
251 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700252 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700253 int32_t charset,
254 const CPVT_SecProps& SecProps,
255 const CPVT_WordProps& WordProps,
256 FX_BOOL bSecEnd);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700257 ~CFXEU_Delete() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700258
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700259 // CFX_Edit_UndoItem
260 void Redo() override;
261 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700262
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700263 private:
264 CFX_Edit* m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700265
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700266 CPVT_WordPlace m_wpOld;
267 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700268 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700269 int32_t m_nCharset;
270 CPVT_SecProps m_SecProps;
271 CPVT_WordProps m_WordProps;
272 FX_BOOL m_bSecEnd;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700273};
274
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700275class CFXEU_Clear : public CFX_Edit_UndoItem {
276 public:
277 CFXEU_Clear(CFX_Edit* pEdit,
278 const CPVT_WordRange& wrSel,
279 const CFX_WideString& swText);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700280 ~CFXEU_Clear() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700281
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700282 // CFX_Edit_UndoItem
283 void Redo() override;
284 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700285
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700286 private:
287 CFX_Edit* m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700288
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700289 CPVT_WordRange m_wrSel;
290 CFX_WideString m_swText;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700291};
292
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700293class CFXEU_InsertText : public CFX_Edit_UndoItem {
294 public:
295 CFXEU_InsertText(CFX_Edit* pEdit,
296 const CPVT_WordPlace& wpOldPlace,
297 const CPVT_WordPlace& wpNewPlace,
298 const CFX_WideString& swText,
dsinclairefd5a992016-07-18 10:04:07 -0700299 int32_t charset);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700300 ~CFXEU_InsertText() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700301
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700302 // CFX_Edit_UndoItem
303 void Redo() override;
304 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700305
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700306 private:
307 CFX_Edit* m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700308
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700309 CPVT_WordPlace m_wpOld;
310 CPVT_WordPlace m_wpNew;
311 CFX_WideString m_swText;
312 int32_t m_nCharset;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700313};
314
dsinclaire35af1e2016-07-13 11:26:20 -0700315class CFX_Edit {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700316 public:
dsinclairefd5a992016-07-18 10:04:07 -0700317 static CFX_ByteString GetEditAppearanceStream(CFX_Edit* pEdit,
318 const CFX_FloatPoint& ptOffset,
319 const CPVT_WordRange* pRange,
320 FX_BOOL bContinuous,
321 uint16_t SubWord);
dsinclaire35af1e2016-07-13 11:26:20 -0700322 static CFX_ByteString GetSelectAppearanceStream(
323 CFX_Edit* pEdit,
324 const CFX_FloatPoint& ptOffset,
dsinclairefd5a992016-07-18 10:04:07 -0700325 const CPVT_WordRange* pRange);
dsinclaire35af1e2016-07-13 11:26:20 -0700326 static void DrawEdit(CFX_RenderDevice* pDevice,
327 CFX_Matrix* pUser2Device,
328 CFX_Edit* pEdit,
329 FX_COLORREF crTextFill,
330 FX_COLORREF crTextStroke,
331 const CFX_FloatRect& rcClip,
332 const CFX_FloatPoint& ptOffset,
333 const CPVT_WordRange* pRange,
334 CFX_SystemHandler* pSystemHandler,
335 void* pFFLData);
dsinclaire35af1e2016-07-13 11:26:20 -0700336 static void GeneratePageObjects(
337 CPDF_PageObjectHolder* pObjectHolder,
338 CFX_Edit* pEdit,
339 const CFX_FloatPoint& ptOffset,
340 const CPVT_WordRange* pRange,
341 FX_COLORREF crText,
342 CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700343
dsinclaire35af1e2016-07-13 11:26:20 -0700344 CFX_Edit();
345 ~CFX_Edit();
346
347 void SetFontMap(IPVT_FontMap* pFontMap);
348 void SetNotify(CPWL_EditCtrl* pNotify);
349 void SetOprNotify(CPWL_Edit* pOprNotify);
350
351 // Returns an iterator for the contents. Should not be released.
352 CFX_Edit_Iterator* GetIterator();
dsinclaire35af1e2016-07-13 11:26:20 -0700353 IPVT_FontMap* GetFontMap();
354 void Initialize();
355
356 // Set the bounding box of the text area.
dsinclairefd5a992016-07-18 10:04:07 -0700357 void SetPlateRect(const CFX_FloatRect& rect);
dsinclaire35af1e2016-07-13 11:26:20 -0700358 void SetScrollPos(const CFX_FloatPoint& point);
359
360 // Set the horizontal text alignment. (nFormat [0:left, 1:middle, 2:right])
dsinclairefd5a992016-07-18 10:04:07 -0700361 void SetAlignmentH(int32_t nFormat, FX_BOOL bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700362 // Set the vertical text alignment. (nFormat [0:left, 1:middle, 2:right])
dsinclairefd5a992016-07-18 10:04:07 -0700363 void SetAlignmentV(int32_t nFormat, FX_BOOL bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700364
365 // Set the substitution character for hidden text.
dsinclairefd5a992016-07-18 10:04:07 -0700366 void SetPasswordChar(uint16_t wSubWord, FX_BOOL bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700367
368 // Set the maximum number of words in the text.
dsinclairefd5a992016-07-18 10:04:07 -0700369 void SetLimitChar(int32_t nLimitChar);
370 void SetCharArray(int32_t nCharArray);
371 void SetCharSpace(FX_FLOAT fCharSpace);
372 void SetMultiLine(FX_BOOL bMultiLine, FX_BOOL bPaint);
373 void SetAutoReturn(FX_BOOL bAuto, FX_BOOL bPaint);
374 void SetAutoFontSize(FX_BOOL bAuto, FX_BOOL bPaint);
375 void SetAutoScroll(FX_BOOL bAuto, FX_BOOL bPaint);
376 void SetFontSize(FX_FLOAT fFontSize);
377 void SetTextOverflow(FX_BOOL bAllowed, FX_BOOL bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700378 void OnMouseDown(const CFX_FloatPoint& point, FX_BOOL bShift, FX_BOOL bCtrl);
379 void OnMouseMove(const CFX_FloatPoint& point, FX_BOOL bShift, FX_BOOL bCtrl);
380 void OnVK_UP(FX_BOOL bShift, FX_BOOL bCtrl);
381 void OnVK_DOWN(FX_BOOL bShift, FX_BOOL bCtrl);
382 void OnVK_LEFT(FX_BOOL bShift, FX_BOOL bCtrl);
383 void OnVK_RIGHT(FX_BOOL bShift, FX_BOOL bCtrl);
384 void OnVK_HOME(FX_BOOL bShift, FX_BOOL bCtrl);
385 void OnVK_END(FX_BOOL bShift, FX_BOOL bCtrl);
tsepeza31da742016-09-08 11:28:14 -0700386 void SetText(const CFX_WideString& sText);
dsinclairefd5a992016-07-18 10:04:07 -0700387 FX_BOOL InsertWord(uint16_t word, int32_t charset);
388 FX_BOOL InsertReturn();
dsinclaire35af1e2016-07-13 11:26:20 -0700389 FX_BOOL Backspace();
390 FX_BOOL Delete();
391 FX_BOOL Clear();
tsepeza31da742016-09-08 11:28:14 -0700392 FX_BOOL InsertText(const CFX_WideString& sText, int32_t charset);
dsinclaire35af1e2016-07-13 11:26:20 -0700393 FX_BOOL Redo();
394 FX_BOOL Undo();
395 int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const;
396 CPVT_WordPlace WordIndexToWordPlace(int32_t index) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700397 CPVT_WordPlace SearchWordPlace(const CFX_FloatPoint& point) const;
398 int32_t GetCaret() const;
399 CPVT_WordPlace GetCaretWordPlace() const;
400 CFX_WideString GetSelText() const;
401 CFX_WideString GetText() const;
402 FX_FLOAT GetFontSize() const;
403 uint16_t GetPasswordChar() const;
404 CFX_FloatPoint GetScrollPos() const;
405 int32_t GetCharArray() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700406 CFX_FloatRect GetContentRect() const;
407 CFX_WideString GetRangeText(const CPVT_WordRange& range) const;
408 int32_t GetHorzScale() const;
409 FX_FLOAT GetCharSpace() const;
410 int32_t GetTotalWords() const;
411 void SetSel(int32_t nStartChar, int32_t nEndChar);
412 void GetSel(int32_t& nStartChar, int32_t& nEndChar) const;
413 void SelectAll();
414 void SelectNone();
415 FX_BOOL IsSelected() const;
416 void Paint();
dsinclaire35af1e2016-07-13 11:26:20 -0700417 void EnableRefresh(FX_BOOL bRefresh);
418 void RefreshWordRange(const CPVT_WordRange& wr);
419 void SetCaret(int32_t nPos);
420 CPVT_WordRange GetWholeWordRange() const;
421 CPVT_WordRange GetSelectWordRange() const;
422 void EnableUndo(FX_BOOL bUndo);
423 void EnableOprNotify(FX_BOOL bNotify);
424 FX_BOOL IsTextFull() const;
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700425 FX_BOOL IsTextOverflow() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700426 FX_BOOL CanUndo() const;
427 FX_BOOL CanRedo() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700428 CPVT_WordRange GetVisibleWordRange() const;
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700429
430 FX_BOOL Empty();
431
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700432 CPVT_WordPlace DoInsertText(const CPVT_WordPlace& place,
tsepeza31da742016-09-08 11:28:14 -0700433 const CFX_WideString& sText,
dsinclairefd5a992016-07-18 10:04:07 -0700434 int32_t charset);
Tom Sepez62a70f92016-03-21 15:00:20 -0700435 int32_t GetCharSetFromUnicode(uint16_t word, int32_t nOldCharset);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700436
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700437 int32_t GetTotalLines() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700438
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700439 private:
dsinclaire35af1e2016-07-13 11:26:20 -0700440 friend class CFX_Edit_Iterator;
441 friend class CFXEU_InsertWord;
442 friend class CFXEU_InsertReturn;
443 friend class CFXEU_Backspace;
444 friend class CFXEU_Delete;
445 friend class CFXEU_Clear;
dsinclaire35af1e2016-07-13 11:26:20 -0700446 friend class CFXEU_InsertText;
447
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700448 void SetSel(const CPVT_WordPlace& begin, const CPVT_WordPlace& end);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700449
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700450 void RearrangeAll();
451 void RearrangePart(const CPVT_WordRange& range);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700452 void ScrollToCaret();
453 void SetScrollInfo();
454 void SetScrollPosX(FX_FLOAT fx);
455 void SetScrollPosY(FX_FLOAT fy);
456 void SetScrollLimit();
457 void SetContentChanged();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700458
Tom Sepez62a70f92016-03-21 15:00:20 -0700459 FX_BOOL InsertWord(uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700460 int32_t charset,
461 const CPVT_WordProps* pWordProps,
462 FX_BOOL bAddUndo,
463 FX_BOOL bPaint);
464 FX_BOOL InsertReturn(const CPVT_SecProps* pSecProps,
465 const CPVT_WordProps* pWordProps,
466 FX_BOOL bAddUndo,
467 FX_BOOL bPaint);
468 FX_BOOL Backspace(FX_BOOL bAddUndo, FX_BOOL bPaint);
469 FX_BOOL Delete(FX_BOOL bAddUndo, FX_BOOL bPaint);
470 FX_BOOL Clear(FX_BOOL bAddUndo, FX_BOOL bPaint);
tsepeza31da742016-09-08 11:28:14 -0700471 FX_BOOL InsertText(const CFX_WideString& sText,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700472 int32_t charset,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700473 FX_BOOL bAddUndo,
474 FX_BOOL bPaint);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700475 void PaintInsertText(const CPVT_WordPlace& wpOld,
476 const CPVT_WordPlace& wpNew);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700477
Tom Sepez281a9ea2016-02-26 14:24:28 -0800478 inline CFX_FloatPoint VTToEdit(const CFX_FloatPoint& point) const;
479 inline CFX_FloatPoint EditToVT(const CFX_FloatPoint& point) const;
480 inline CFX_FloatRect VTToEdit(const CFX_FloatRect& rect) const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700481
dsinclairefd5a992016-07-18 10:04:07 -0700482 void Refresh();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700483 void RefreshPushLineRects(const CPVT_WordRange& wr);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700484
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700485 void SetCaret(const CPVT_WordPlace& place);
486 void SetCaretInfo();
487 void SetCaretOrigin();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700488
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700489 void AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700490
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700491 private:
dsinclaire35af1e2016-07-13 11:26:20 -0700492 std::unique_ptr<CPDF_VariableText> m_pVT;
493 CPWL_EditCtrl* m_pNotify;
494 CPWL_Edit* m_pOprNotify;
thestig821d59e2016-05-11 12:59:22 -0700495 std::unique_ptr<CFX_Edit_Provider> m_pVTProvider;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700496
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700497 CPVT_WordPlace m_wpCaret;
498 CPVT_WordPlace m_wpOldCaret;
499 CFX_Edit_Select m_SelState;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700500
Tom Sepez281a9ea2016-02-26 14:24:28 -0800501 CFX_FloatPoint m_ptScrollPos;
502 CFX_FloatPoint m_ptRefreshScrollPos;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700503 FX_BOOL m_bEnableScroll;
dsinclaire35af1e2016-07-13 11:26:20 -0700504 std::unique_ptr<CFX_Edit_Iterator> m_pIterator;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700505 CFX_Edit_Refresh m_Refresh;
Tom Sepez281a9ea2016-02-26 14:24:28 -0800506 CFX_FloatPoint m_ptCaret;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700507 CFX_Edit_Undo m_Undo;
508 int32_t m_nAlignment;
509 FX_BOOL m_bNotifyFlag;
510 FX_BOOL m_bEnableOverflow;
511 FX_BOOL m_bEnableRefresh;
Tom Sepez281a9ea2016-02-26 14:24:28 -0800512 CFX_FloatRect m_rcOldContent;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700513 FX_BOOL m_bEnableUndo;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700514 FX_BOOL m_bOprNotify;
515 CFX_Edit_GroupUndoItem* m_pGroupUndoItem;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700516};
517
dsinclaire35af1e2016-07-13 11:26:20 -0700518class CFX_Edit_Iterator {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700519 public:
dsinclairc7a73492016-04-05 12:01:42 -0700520 CFX_Edit_Iterator(CFX_Edit* pEdit, CPDF_VariableText::Iterator* pVTIterator);
dsinclaire35af1e2016-07-13 11:26:20 -0700521 ~CFX_Edit_Iterator();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700522
dsinclaire35af1e2016-07-13 11:26:20 -0700523 FX_BOOL NextWord();
dsinclaire35af1e2016-07-13 11:26:20 -0700524 FX_BOOL PrevWord();
dsinclaire35af1e2016-07-13 11:26:20 -0700525 FX_BOOL GetWord(CPVT_Word& word) const;
526 FX_BOOL GetLine(CPVT_Line& line) const;
527 FX_BOOL GetSection(CPVT_Section& section) const;
528 void SetAt(int32_t nWordIndex);
529 void SetAt(const CPVT_WordPlace& place);
530 const CPVT_WordPlace& GetAt() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700531
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700532 private:
533 CFX_Edit* m_pEdit;
dsinclairc7a73492016-04-05 12:01:42 -0700534 CPDF_VariableText::Iterator* m_pVTIterator;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700535};
536
dsinclairc7a73492016-04-05 12:01:42 -0700537class CFX_Edit_Provider : public CPDF_VariableText::Provider {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700538 public:
dsinclairc7a73492016-04-05 12:01:42 -0700539 explicit CFX_Edit_Provider(IPVT_FontMap* pFontMap);
Lei Zhang5fd907b2015-11-19 22:20:59 -0800540 ~CFX_Edit_Provider() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700541
dsinclairc7a73492016-04-05 12:01:42 -0700542 IPVT_FontMap* GetFontMap();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700543
dsinclairc7a73492016-04-05 12:01:42 -0700544 // CPDF_VariableText::Provider:
npm41d6bbe2016-09-14 11:54:44 -0700545 int32_t GetCharWidth(int32_t nFontIndex, uint16_t word) override;
Lei Zhang5fd907b2015-11-19 22:20:59 -0800546 int32_t GetTypeAscent(int32_t nFontIndex) override;
547 int32_t GetTypeDescent(int32_t nFontIndex) override;
Tom Sepez62a70f92016-03-21 15:00:20 -0700548 int32_t GetWordFontIndex(uint16_t word,
Lei Zhang5fd907b2015-11-19 22:20:59 -0800549 int32_t charset,
550 int32_t nFontIndex) override;
551 int32_t GetDefaultFontIndex() override;
Tom Sepez62a70f92016-03-21 15:00:20 -0700552 FX_BOOL IsLatinWord(uint16_t word) override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700553
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700554 private:
dsinclairc7a73492016-04-05 12:01:42 -0700555 IPVT_FontMap* m_pFontMap;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700556};
557
dsinclair89bdd082016-04-06 10:47:54 -0700558#endif // FPDFSDK_FXEDIT_INCLUDE_FXET_EDIT_H_