blob: 53ed8da0c2a83e1d28ec4cebc360964a87f173f8 [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
Dan Sinclair6b0158f2017-07-24 09:42:55 -04007#ifndef FPDFSDK_PDFWINDOW_CPWL_EDIT_IMPL_H_
8#define FPDFSDK_PDFWINDOW_CPWL_EDIT_IMPL_H_
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07009
Tom Sepez3509d162017-01-30 13:22:02 -080010#include <deque>
thestig821d59e2016-05-11 12:59:22 -070011#include <memory>
tsepez6745f962017-01-04 10:09:45 -080012#include <vector>
thestig821d59e2016-05-11 12:59:22 -070013
dsinclair1727aee2016-09-29 13:12:56 -070014#include "core/fpdfdoc/cpvt_secprops.h"
15#include "core/fpdfdoc/cpvt_wordprops.h"
Tom Sepezd0409af2017-05-25 15:53:57 -070016#include "core/fxcrt/cfx_unowned_ptr.h"
Dan Sinclairc08dc392017-07-24 08:57:35 -040017
18#define FX_EDIT_ISLATINWORD(u) \
19 (u == 0x2D || (u <= 0x005A && u >= 0x0041) || \
20 (u <= 0x007A && u >= 0x0061) || (u <= 0x02AF && u >= 0x00C0))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070021
dsinclair8faac622016-09-15 12:41:50 -070022class CFFL_FormFiller;
Dan Sinclair6b0158f2017-07-24 09:42:55 -040023class CPWL_EditImpl;
24class CPWL_EditImpl_Iterator;
25class CPWL_EditImpl_Provider;
dsinclaire35af1e2016-07-13 11:26:20 -070026class CFX_RenderDevice;
27class CFX_SystemHandler;
dsinclair8faac622016-09-15 12:41:50 -070028class CPWL_Edit;
29class CPWL_EditCtrl;
dsinclaire35af1e2016-07-13 11:26:20 -070030class IFX_Edit_UndoItem;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070031
Dan Sinclair6b0158f2017-07-24 09:42:55 -040032struct CPWL_EditImpl_LineRect {
33 CPWL_EditImpl_LineRect(const CPVT_WordRange& wrLine,
34 const CFX_FloatRect& rcLine)
Nico Weber9d8ec5a2015-08-04 13:00:21 -070035 : m_wrLine(wrLine), m_rcLine(rcLine) {}
36
Nico Weber9d8ec5a2015-08-04 13:00:21 -070037 CPVT_WordRange m_wrLine;
Tom Sepez281a9ea2016-02-26 14:24:28 -080038 CFX_FloatRect m_rcLine;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070039};
40
Dan Sinclair6b0158f2017-07-24 09:42:55 -040041class CPWL_EditImpl_LineRectArray {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070042 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -040043 CPWL_EditImpl_LineRectArray();
44 ~CPWL_EditImpl_LineRectArray();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070045
Dan Sinclair6b0158f2017-07-24 09:42:55 -040046 void operator=(CPWL_EditImpl_LineRectArray&& rects);
weili625ad662016-06-15 11:21:33 -070047 void Add(const CPVT_WordRange& wrLine, const CFX_FloatRect& rcLine);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070048
weili625ad662016-06-15 11:21:33 -070049 int32_t GetSize() const;
Dan Sinclair6b0158f2017-07-24 09:42:55 -040050 CPWL_EditImpl_LineRect* GetAt(int32_t nIndex) const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070051
weili625ad662016-06-15 11:21:33 -070052 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -040053 std::vector<std::unique_ptr<CPWL_EditImpl_LineRect>> m_LineRects;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070054};
55
Dan Sinclair6b0158f2017-07-24 09:42:55 -040056class CPWL_EditImpl_RectArray {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070057 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -040058 CPWL_EditImpl_RectArray();
59 ~CPWL_EditImpl_RectArray();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070060
Tom Sepez3509d162017-01-30 13:22:02 -080061 void Clear();
weili625ad662016-06-15 11:21:33 -070062 void Add(const CFX_FloatRect& rect);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070063
weili625ad662016-06-15 11:21:33 -070064 int32_t GetSize() const;
65 CFX_FloatRect* GetAt(int32_t nIndex) const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070066
weili625ad662016-06-15 11:21:33 -070067 private:
Tom Sepez3509d162017-01-30 13:22:02 -080068 std::vector<std::unique_ptr<CFX_FloatRect>> m_Rects;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070069};
70
Dan Sinclair6b0158f2017-07-24 09:42:55 -040071class CPWL_EditImpl_Refresh {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070072 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -040073 CPWL_EditImpl_Refresh();
74 ~CPWL_EditImpl_Refresh();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070075
Nico Weber9d8ec5a2015-08-04 13:00:21 -070076 void BeginRefresh();
Tom Sepez281a9ea2016-02-26 14:24:28 -080077 void Push(const CPVT_WordRange& linerange, const CFX_FloatRect& rect);
Nico Weber9d8ec5a2015-08-04 13:00:21 -070078 void NoAnalyse();
Dan Sinclair6b0158f2017-07-24 09:42:55 -040079 const CPWL_EditImpl_RectArray* GetRefreshRects() const;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070080 void EndRefresh();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070081
Nico Weber9d8ec5a2015-08-04 13:00:21 -070082 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -040083 CPWL_EditImpl_LineRectArray m_NewLineRects;
84 CPWL_EditImpl_LineRectArray m_OldLineRects;
85 CPWL_EditImpl_RectArray m_RefreshRects;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070086};
87
Dan Sinclair6b0158f2017-07-24 09:42:55 -040088class CPWL_EditImpl_Select {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070089 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -040090 CPWL_EditImpl_Select();
91 explicit CPWL_EditImpl_Select(const CPVT_WordRange& range);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070092
Tom Sepez52f69b32017-03-21 13:42:38 -070093 void Reset();
weili625ad662016-06-15 11:21:33 -070094 void Set(const CPVT_WordPlace& begin, const CPVT_WordPlace& end);
weili625ad662016-06-15 11:21:33 -070095 void SetEndPos(const CPVT_WordPlace& end);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070096
weili625ad662016-06-15 11:21:33 -070097 CPVT_WordRange ConvertToWordRange() const;
Tom Sepez52f69b32017-03-21 13:42:38 -070098 bool IsEmpty() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070099
Tom Sepez3509d162017-01-30 13:22:02 -0800100 CPVT_WordPlace BeginPos;
101 CPVT_WordPlace EndPos;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700102};
103
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400104class CPWL_EditImpl_Undo {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700105 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400106 explicit CPWL_EditImpl_Undo(int32_t nBufsize);
107 ~CPWL_EditImpl_Undo();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700108
Tom Sepez3509d162017-01-30 13:22:02 -0800109 void AddItem(std::unique_ptr<IFX_Edit_UndoItem> pItem);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700110 void Undo();
111 void Redo();
tsepez4cf55152016-11-02 14:37:54 -0700112 bool CanUndo() const;
113 bool CanRedo() const;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700114 void Reset();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700115
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700116 private:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700117 void RemoveHeads();
118 void RemoveTails();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700119
Tom Sepez3509d162017-01-30 13:22:02 -0800120 std::deque<std::unique_ptr<IFX_Edit_UndoItem>> m_UndoItemStack;
121 size_t m_nCurUndoPos;
122 size_t m_nBufSize;
tsepez4cf55152016-11-02 14:37:54 -0700123 bool m_bWorking;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700124};
125
dsinclaire35af1e2016-07-13 11:26:20 -0700126class IFX_Edit_UndoItem {
127 public:
128 virtual ~IFX_Edit_UndoItem() {}
129
130 virtual void Undo() = 0;
131 virtual void Redo() = 0;
Tom Sepez3509d162017-01-30 13:22:02 -0800132 virtual CFX_WideString GetUndoTitle() const = 0;
dsinclaire35af1e2016-07-13 11:26:20 -0700133};
134
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400135class CPWL_EditImpl_UndoItem : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700136 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400137 CPWL_EditImpl_UndoItem();
138 ~CPWL_EditImpl_UndoItem() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700139
Tom Sepez3509d162017-01-30 13:22:02 -0800140 CFX_WideString GetUndoTitle() const override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700141
tsepez4cf55152016-11-02 14:37:54 -0700142 void SetFirst(bool bFirst);
143 void SetLast(bool bLast);
144 bool IsLast();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700145
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700146 private:
tsepez4cf55152016-11-02 14:37:54 -0700147 bool m_bFirst;
148 bool m_bLast;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700149};
150
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400151class CFXEU_InsertWord : public CPWL_EditImpl_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700152 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400153 CFXEU_InsertWord(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700154 const CPVT_WordPlace& wpOldPlace,
155 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700156 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700157 int32_t charset,
158 const CPVT_WordProps* pWordProps);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700159 ~CFXEU_InsertWord() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700160
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400161 // CPWL_EditImpl_UndoItem
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700162 void Redo() override;
163 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700164
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700165 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400166 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700167
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700168 CPVT_WordPlace m_wpOld;
169 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700170 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700171 int32_t m_nCharset;
172 CPVT_WordProps m_WordProps;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700173};
174
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400175class CFXEU_InsertReturn : public CPWL_EditImpl_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700176 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400177 CFXEU_InsertReturn(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700178 const CPVT_WordPlace& wpOldPlace,
179 const CPVT_WordPlace& wpNewPlace,
180 const CPVT_SecProps* pSecProps,
181 const CPVT_WordProps* pWordProps);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700182 ~CFXEU_InsertReturn() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700183
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400184 // CPWL_EditImpl_UndoItem
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700185 void Redo() override;
186 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700187
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700188 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400189 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700190
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700191 CPVT_WordPlace m_wpOld;
192 CPVT_WordPlace m_wpNew;
193 CPVT_SecProps m_SecProps;
194 CPVT_WordProps m_WordProps;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700195};
196
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400197class CFXEU_Backspace : public CPWL_EditImpl_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700198 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400199 CFXEU_Backspace(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700200 const CPVT_WordPlace& wpOldPlace,
201 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700202 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700203 int32_t charset,
204 const CPVT_SecProps& SecProps,
205 const CPVT_WordProps& WordProps);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700206 ~CFXEU_Backspace() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700207
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400208 // CPWL_EditImpl_UndoItem
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700209 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:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400213 CFX_UnownedPtr<CPWL_EditImpl> 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;
Tom Sepez62a70f92016-03-21 15:00:20 -0700217 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700218 int32_t m_nCharset;
219 CPVT_SecProps m_SecProps;
220 CPVT_WordProps m_WordProps;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700221};
222
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400223class CFXEU_Delete : public CPWL_EditImpl_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700224 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400225 CFXEU_Delete(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700226 const CPVT_WordPlace& wpOldPlace,
227 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700228 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700229 int32_t charset,
230 const CPVT_SecProps& SecProps,
231 const CPVT_WordProps& WordProps,
tsepez4cf55152016-11-02 14:37:54 -0700232 bool bSecEnd);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700233 ~CFXEU_Delete() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700234
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400235 // CPWL_EditImpl_UndoItem
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700236 void Redo() override;
237 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700238
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700239 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400240 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700241
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700242 CPVT_WordPlace m_wpOld;
243 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700244 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700245 int32_t m_nCharset;
246 CPVT_SecProps m_SecProps;
247 CPVT_WordProps m_WordProps;
tsepez4cf55152016-11-02 14:37:54 -0700248 bool m_bSecEnd;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700249};
250
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400251class CFXEU_Clear : public CPWL_EditImpl_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700252 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400253 CFXEU_Clear(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700254 const CPVT_WordRange& wrSel,
255 const CFX_WideString& swText);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700256 ~CFXEU_Clear() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700257
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400258 // CPWL_EditImpl_UndoItem
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700259 void Redo() override;
260 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700261
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700262 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400263 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700264
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700265 CPVT_WordRange m_wrSel;
266 CFX_WideString m_swText;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700267};
268
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400269class CFXEU_InsertText : public CPWL_EditImpl_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700270 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400271 CFXEU_InsertText(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700272 const CPVT_WordPlace& wpOldPlace,
273 const CPVT_WordPlace& wpNewPlace,
274 const CFX_WideString& swText,
dsinclairefd5a992016-07-18 10:04:07 -0700275 int32_t charset);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700276 ~CFXEU_InsertText() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700277
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400278 // CPWL_EditImpl_UndoItem
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700279 void Redo() override;
280 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700281
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700282 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400283 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700284
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700285 CPVT_WordPlace m_wpOld;
286 CPVT_WordPlace m_wpNew;
287 CFX_WideString m_swText;
288 int32_t m_nCharset;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700289};
290
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400291class CPWL_EditImpl {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700292 public:
dsinclaire35af1e2016-07-13 11:26:20 -0700293 static void DrawEdit(CFX_RenderDevice* pDevice,
294 CFX_Matrix* pUser2Device,
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400295 CPWL_EditImpl* pEdit,
dsinclaire35af1e2016-07-13 11:26:20 -0700296 FX_COLORREF crTextFill,
dsinclaire35af1e2016-07-13 11:26:20 -0700297 const CFX_FloatRect& rcClip,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500298 const CFX_PointF& ptOffset,
dsinclaire35af1e2016-07-13 11:26:20 -0700299 const CPVT_WordRange* pRange,
300 CFX_SystemHandler* pSystemHandler,
dsinclair8faac622016-09-15 12:41:50 -0700301 CFFL_FormFiller* pFFLData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700302
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400303 CPWL_EditImpl();
304 ~CPWL_EditImpl();
dsinclaire35af1e2016-07-13 11:26:20 -0700305
306 void SetFontMap(IPVT_FontMap* pFontMap);
307 void SetNotify(CPWL_EditCtrl* pNotify);
308 void SetOprNotify(CPWL_Edit* pOprNotify);
309
310 // Returns an iterator for the contents. Should not be released.
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400311 CPWL_EditImpl_Iterator* GetIterator();
dsinclaire35af1e2016-07-13 11:26:20 -0700312 IPVT_FontMap* GetFontMap();
313 void Initialize();
314
315 // Set the bounding box of the text area.
dsinclairefd5a992016-07-18 10:04:07 -0700316 void SetPlateRect(const CFX_FloatRect& rect);
Dan Sinclairf528eee2017-02-14 11:52:07 -0500317 void SetScrollPos(const CFX_PointF& point);
dsinclaire35af1e2016-07-13 11:26:20 -0700318
319 // Set the horizontal text alignment. (nFormat [0:left, 1:middle, 2:right])
tsepez4cf55152016-11-02 14:37:54 -0700320 void SetAlignmentH(int32_t nFormat, bool bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700321 // Set the vertical text alignment. (nFormat [0:left, 1:middle, 2:right])
tsepez4cf55152016-11-02 14:37:54 -0700322 void SetAlignmentV(int32_t nFormat, bool bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700323
324 // Set the substitution character for hidden text.
tsepez4cf55152016-11-02 14:37:54 -0700325 void SetPasswordChar(uint16_t wSubWord, bool bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700326
327 // Set the maximum number of words in the text.
dsinclairefd5a992016-07-18 10:04:07 -0700328 void SetLimitChar(int32_t nLimitChar);
329 void SetCharArray(int32_t nCharArray);
Dan Sinclair05df0752017-03-14 14:43:42 -0400330 void SetCharSpace(float fCharSpace);
tsepez4cf55152016-11-02 14:37:54 -0700331 void SetMultiLine(bool bMultiLine, bool bPaint);
332 void SetAutoReturn(bool bAuto, bool bPaint);
333 void SetAutoFontSize(bool bAuto, bool bPaint);
334 void SetAutoScroll(bool bAuto, bool bPaint);
Dan Sinclair05df0752017-03-14 14:43:42 -0400335 void SetFontSize(float fFontSize);
tsepez4cf55152016-11-02 14:37:54 -0700336 void SetTextOverflow(bool bAllowed, bool bPaint);
Dan Sinclairf528eee2017-02-14 11:52:07 -0500337 void OnMouseDown(const CFX_PointF& point, bool bShift, bool bCtrl);
338 void OnMouseMove(const CFX_PointF& point, bool bShift, bool bCtrl);
tsepez4cf55152016-11-02 14:37:54 -0700339 void OnVK_UP(bool bShift, bool bCtrl);
340 void OnVK_DOWN(bool bShift, bool bCtrl);
341 void OnVK_LEFT(bool bShift, bool bCtrl);
342 void OnVK_RIGHT(bool bShift, bool bCtrl);
343 void OnVK_HOME(bool bShift, bool bCtrl);
344 void OnVK_END(bool bShift, bool bCtrl);
tsepeza31da742016-09-08 11:28:14 -0700345 void SetText(const CFX_WideString& sText);
tsepez4cf55152016-11-02 14:37:54 -0700346 bool InsertWord(uint16_t word, int32_t charset);
347 bool InsertReturn();
348 bool Backspace();
349 bool Delete();
Diana Gage22bf7a52017-07-21 11:33:18 -0700350 bool ClearSelection();
tsepez4cf55152016-11-02 14:37:54 -0700351 bool InsertText(const CFX_WideString& sText, int32_t charset);
352 bool Redo();
353 bool Undo();
dsinclaire35af1e2016-07-13 11:26:20 -0700354 CPVT_WordPlace WordIndexToWordPlace(int32_t index) const;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500355 CPVT_WordPlace SearchWordPlace(const CFX_PointF& point) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700356 int32_t GetCaret() const;
357 CPVT_WordPlace GetCaretWordPlace() const;
Diana Gage89e65622017-07-20 18:09:31 -0700358 CFX_WideString GetSelectedText() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700359 CFX_WideString GetText() const;
Dan Sinclair05df0752017-03-14 14:43:42 -0400360 float GetFontSize() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700361 uint16_t GetPasswordChar() const;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500362 CFX_PointF GetScrollPos() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700363 int32_t GetCharArray() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700364 CFX_FloatRect GetContentRect() const;
365 CFX_WideString GetRangeText(const CPVT_WordRange& range) const;
366 int32_t GetHorzScale() const;
Dan Sinclair05df0752017-03-14 14:43:42 -0400367 float GetCharSpace() const;
Diana Gage4d02e902017-07-20 17:20:31 -0700368 void SetSelection(int32_t nStartChar, int32_t nEndChar);
369 void GetSelection(int32_t& nStartChar, int32_t& nEndChar) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700370 void SelectAll();
371 void SelectNone();
tsepez4cf55152016-11-02 14:37:54 -0700372 bool IsSelected() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700373 void Paint();
tsepez4cf55152016-11-02 14:37:54 -0700374 void EnableRefresh(bool bRefresh);
dsinclaire35af1e2016-07-13 11:26:20 -0700375 void RefreshWordRange(const CPVT_WordRange& wr);
dsinclaire35af1e2016-07-13 11:26:20 -0700376 CPVT_WordRange GetWholeWordRange() const;
377 CPVT_WordRange GetSelectWordRange() const;
tsepez4cf55152016-11-02 14:37:54 -0700378 void EnableUndo(bool bUndo);
379 void EnableOprNotify(bool bNotify);
380 bool IsTextFull() const;
381 bool IsTextOverflow() const;
382 bool CanUndo() const;
383 bool CanRedo() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700384 CPVT_WordRange GetVisibleWordRange() const;
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700385
tsepez4cf55152016-11-02 14:37:54 -0700386 bool Empty();
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700387
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700388 CPVT_WordPlace DoInsertText(const CPVT_WordPlace& place,
tsepeza31da742016-09-08 11:28:14 -0700389 const CFX_WideString& sText,
dsinclairefd5a992016-07-18 10:04:07 -0700390 int32_t charset);
Tom Sepez62a70f92016-03-21 15:00:20 -0700391 int32_t GetCharSetFromUnicode(uint16_t word, int32_t nOldCharset);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700392
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700393 int32_t GetTotalLines() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700394
Dan Sinclairc08dc392017-07-24 08:57:35 -0400395 CFX_ByteString GetPDFWordString(int32_t nFontIndex,
396 uint16_t Word,
397 uint16_t SubWord);
398
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700399 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400400 friend class CPWL_EditImpl_Iterator;
dsinclaire35af1e2016-07-13 11:26:20 -0700401 friend class CFXEU_InsertWord;
402 friend class CFXEU_InsertReturn;
403 friend class CFXEU_Backspace;
404 friend class CFXEU_Delete;
405 friend class CFXEU_Clear;
dsinclaire35af1e2016-07-13 11:26:20 -0700406 friend class CFXEU_InsertText;
407
Diana Gage4d02e902017-07-20 17:20:31 -0700408 void SetSelection(const CPVT_WordPlace& begin, const CPVT_WordPlace& end);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700409
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700410 void RearrangeAll();
411 void RearrangePart(const CPVT_WordRange& range);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700412 void ScrollToCaret();
413 void SetScrollInfo();
Dan Sinclair05df0752017-03-14 14:43:42 -0400414 void SetScrollPosX(float fx);
415 void SetScrollPosY(float fy);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700416 void SetScrollLimit();
417 void SetContentChanged();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700418
tsepez4cf55152016-11-02 14:37:54 -0700419 bool InsertWord(uint16_t word,
420 int32_t charset,
421 const CPVT_WordProps* pWordProps,
422 bool bAddUndo,
423 bool bPaint);
424 bool InsertReturn(const CPVT_SecProps* pSecProps,
425 const CPVT_WordProps* pWordProps,
426 bool bAddUndo,
427 bool bPaint);
428 bool Backspace(bool bAddUndo, bool bPaint);
429 bool Delete(bool bAddUndo, bool bPaint);
430 bool Clear(bool bAddUndo, bool bPaint);
431 bool InsertText(const CFX_WideString& sText,
432 int32_t charset,
433 bool bAddUndo,
434 bool bPaint);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700435 void PaintInsertText(const CPVT_WordPlace& wpOld,
436 const CPVT_WordPlace& wpNew);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700437
Dan Sinclairf528eee2017-02-14 11:52:07 -0500438 inline CFX_PointF VTToEdit(const CFX_PointF& point) const;
439 inline CFX_PointF EditToVT(const CFX_PointF& point) const;
Tom Sepez281a9ea2016-02-26 14:24:28 -0800440 inline CFX_FloatRect VTToEdit(const CFX_FloatRect& rect) const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700441
dsinclairefd5a992016-07-18 10:04:07 -0700442 void Refresh();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700443 void RefreshPushLineRects(const CPVT_WordRange& wr);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700444
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700445 void SetCaret(const CPVT_WordPlace& place);
446 void SetCaretInfo();
447 void SetCaretOrigin();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700448
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400449 void AddEditUndoItem(std::unique_ptr<CPWL_EditImpl_UndoItem> pEditUndoItem);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700450
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700451 private:
dsinclaire35af1e2016-07-13 11:26:20 -0700452 std::unique_ptr<CPDF_VariableText> m_pVT;
Tom Sepezd0409af2017-05-25 15:53:57 -0700453 CFX_UnownedPtr<CPWL_EditCtrl> m_pNotify;
454 CFX_UnownedPtr<CPWL_Edit> m_pOprNotify;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400455 std::unique_ptr<CPWL_EditImpl_Provider> m_pVTProvider;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700456 CPVT_WordPlace m_wpCaret;
457 CPVT_WordPlace m_wpOldCaret;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400458 CPWL_EditImpl_Select m_SelState;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500459 CFX_PointF m_ptScrollPos;
460 CFX_PointF m_ptRefreshScrollPos;
tsepez4cf55152016-11-02 14:37:54 -0700461 bool m_bEnableScroll;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400462 std::unique_ptr<CPWL_EditImpl_Iterator> m_pIterator;
463 CPWL_EditImpl_Refresh m_Refresh;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500464 CFX_PointF m_ptCaret;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400465 CPWL_EditImpl_Undo m_Undo;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700466 int32_t m_nAlignment;
tsepez4cf55152016-11-02 14:37:54 -0700467 bool m_bNotifyFlag;
468 bool m_bEnableOverflow;
469 bool m_bEnableRefresh;
Tom Sepez281a9ea2016-02-26 14:24:28 -0800470 CFX_FloatRect m_rcOldContent;
tsepez4cf55152016-11-02 14:37:54 -0700471 bool m_bEnableUndo;
472 bool m_bOprNotify;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700473};
474
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400475class CPWL_EditImpl_Iterator {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700476 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400477 CPWL_EditImpl_Iterator(CPWL_EditImpl* pEdit,
478 CPDF_VariableText::Iterator* pVTIterator);
479 ~CPWL_EditImpl_Iterator();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700480
tsepez4cf55152016-11-02 14:37:54 -0700481 bool NextWord();
482 bool PrevWord();
483 bool GetWord(CPVT_Word& word) const;
484 bool GetLine(CPVT_Line& line) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700485 void SetAt(int32_t nWordIndex);
486 void SetAt(const CPVT_WordPlace& place);
487 const CPVT_WordPlace& GetAt() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700488
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700489 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400490 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
dsinclairc7a73492016-04-05 12:01:42 -0700491 CPDF_VariableText::Iterator* m_pVTIterator;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700492};
493
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400494class CPWL_EditImpl_Provider : public CPDF_VariableText::Provider {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700495 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400496 explicit CPWL_EditImpl_Provider(IPVT_FontMap* pFontMap);
497 ~CPWL_EditImpl_Provider() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700498
Tom Sepezd0409af2017-05-25 15:53:57 -0700499 IPVT_FontMap* GetFontMap() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700500
dsinclairc7a73492016-04-05 12:01:42 -0700501 // CPDF_VariableText::Provider:
npm41d6bbe2016-09-14 11:54:44 -0700502 int32_t GetCharWidth(int32_t nFontIndex, uint16_t word) override;
Lei Zhang5fd907b2015-11-19 22:20:59 -0800503 int32_t GetTypeAscent(int32_t nFontIndex) override;
504 int32_t GetTypeDescent(int32_t nFontIndex) override;
Tom Sepez62a70f92016-03-21 15:00:20 -0700505 int32_t GetWordFontIndex(uint16_t word,
Lei Zhang5fd907b2015-11-19 22:20:59 -0800506 int32_t charset,
507 int32_t nFontIndex) override;
508 int32_t GetDefaultFontIndex() override;
tsepez4cf55152016-11-02 14:37:54 -0700509 bool IsLatinWord(uint16_t word) override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700510
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700511 private:
dsinclairc7a73492016-04-05 12:01:42 -0700512 IPVT_FontMap* m_pFontMap;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700513};
514
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400515#endif // FPDFSDK_PDFWINDOW_CPWL_EDIT_IMPL_H_