blob: d65610dc43d3df6a4deb0507a9281fded7c9775d [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 Sinclairc411eb92017-07-25 09:39:30 -04007#ifndef FPDFSDK_PWL_CPWL_EDIT_IMPL_H_
8#define FPDFSDK_PWL_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;
dsinclaire35af1e2016-07-13 11:26:20 -0700132};
133
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700134class CFXEU_InsertWord : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700135 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400136 CFXEU_InsertWord(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700137 const CPVT_WordPlace& wpOldPlace,
138 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700139 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700140 int32_t charset,
141 const CPVT_WordProps* pWordProps);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700142 ~CFXEU_InsertWord() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700143
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700144 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700145 void Redo() override;
146 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700147
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700148 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400149 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700150
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700151 CPVT_WordPlace m_wpOld;
152 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700153 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700154 int32_t m_nCharset;
155 CPVT_WordProps m_WordProps;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700156};
157
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700158class CFXEU_InsertReturn : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700159 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400160 CFXEU_InsertReturn(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700161 const CPVT_WordPlace& wpOldPlace,
162 const CPVT_WordPlace& wpNewPlace,
163 const CPVT_SecProps* pSecProps,
164 const CPVT_WordProps* pWordProps);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700165 ~CFXEU_InsertReturn() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700166
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700167 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700168 void Redo() override;
169 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700170
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700171 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400172 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700173
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700174 CPVT_WordPlace m_wpOld;
175 CPVT_WordPlace m_wpNew;
176 CPVT_SecProps m_SecProps;
177 CPVT_WordProps m_WordProps;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700178};
179
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700180class CFXEU_Backspace : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700181 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400182 CFXEU_Backspace(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700183 const CPVT_WordPlace& wpOldPlace,
184 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700185 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700186 int32_t charset,
187 const CPVT_SecProps& SecProps,
188 const CPVT_WordProps& WordProps);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700189 ~CFXEU_Backspace() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700190
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700191 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700192 void Redo() override;
193 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700194
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700195 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400196 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700197
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700198 CPVT_WordPlace m_wpOld;
199 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700200 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700201 int32_t m_nCharset;
202 CPVT_SecProps m_SecProps;
203 CPVT_WordProps m_WordProps;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700204};
205
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700206class CFXEU_Delete : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700207 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400208 CFXEU_Delete(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700209 const CPVT_WordPlace& wpOldPlace,
210 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700211 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700212 int32_t charset,
213 const CPVT_SecProps& SecProps,
214 const CPVT_WordProps& WordProps,
tsepez4cf55152016-11-02 14:37:54 -0700215 bool bSecEnd);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700216 ~CFXEU_Delete() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700217
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700218 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700219 void Redo() override;
220 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700221
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700222 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400223 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700224
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700225 CPVT_WordPlace m_wpOld;
226 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700227 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700228 int32_t m_nCharset;
229 CPVT_SecProps m_SecProps;
230 CPVT_WordProps m_WordProps;
tsepez4cf55152016-11-02 14:37:54 -0700231 bool m_bSecEnd;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700232};
233
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700234class CFXEU_Clear : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700235 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400236 CFXEU_Clear(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700237 const CPVT_WordRange& wrSel,
238 const CFX_WideString& swText);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700239 ~CFXEU_Clear() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700240
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700241 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700242 void Redo() override;
243 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700244
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700245 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400246 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700247
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700248 CPVT_WordRange m_wrSel;
249 CFX_WideString m_swText;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700250};
251
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700252class CFXEU_InsertText : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700253 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400254 CFXEU_InsertText(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700255 const CPVT_WordPlace& wpOldPlace,
256 const CPVT_WordPlace& wpNewPlace,
257 const CFX_WideString& swText,
dsinclairefd5a992016-07-18 10:04:07 -0700258 int32_t charset);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700259 ~CFXEU_InsertText() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700260
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700261 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700262 void Redo() override;
263 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700264
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700265 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400266 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700267
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700268 CPVT_WordPlace m_wpOld;
269 CPVT_WordPlace m_wpNew;
270 CFX_WideString m_swText;
271 int32_t m_nCharset;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700272};
273
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400274class CPWL_EditImpl {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700275 public:
dsinclaire35af1e2016-07-13 11:26:20 -0700276 static void DrawEdit(CFX_RenderDevice* pDevice,
277 CFX_Matrix* pUser2Device,
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400278 CPWL_EditImpl* pEdit,
dsinclaire35af1e2016-07-13 11:26:20 -0700279 FX_COLORREF crTextFill,
dsinclaire35af1e2016-07-13 11:26:20 -0700280 const CFX_FloatRect& rcClip,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500281 const CFX_PointF& ptOffset,
dsinclaire35af1e2016-07-13 11:26:20 -0700282 const CPVT_WordRange* pRange,
283 CFX_SystemHandler* pSystemHandler,
dsinclair8faac622016-09-15 12:41:50 -0700284 CFFL_FormFiller* pFFLData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700285
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400286 CPWL_EditImpl();
287 ~CPWL_EditImpl();
dsinclaire35af1e2016-07-13 11:26:20 -0700288
289 void SetFontMap(IPVT_FontMap* pFontMap);
290 void SetNotify(CPWL_EditCtrl* pNotify);
Lei Zhang5688d622017-08-12 07:04:19 -0700291 void SetOperationNotify(CPWL_Edit* pOperationNotify);
dsinclaire35af1e2016-07-13 11:26:20 -0700292
293 // Returns an iterator for the contents. Should not be released.
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400294 CPWL_EditImpl_Iterator* GetIterator();
dsinclaire35af1e2016-07-13 11:26:20 -0700295 IPVT_FontMap* GetFontMap();
296 void Initialize();
297
298 // Set the bounding box of the text area.
dsinclairefd5a992016-07-18 10:04:07 -0700299 void SetPlateRect(const CFX_FloatRect& rect);
Dan Sinclairf528eee2017-02-14 11:52:07 -0500300 void SetScrollPos(const CFX_PointF& point);
dsinclaire35af1e2016-07-13 11:26:20 -0700301
302 // Set the horizontal text alignment. (nFormat [0:left, 1:middle, 2:right])
tsepez4cf55152016-11-02 14:37:54 -0700303 void SetAlignmentH(int32_t nFormat, bool bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700304 // Set the vertical text alignment. (nFormat [0:left, 1:middle, 2:right])
tsepez4cf55152016-11-02 14:37:54 -0700305 void SetAlignmentV(int32_t nFormat, bool bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700306
307 // Set the substitution character for hidden text.
tsepez4cf55152016-11-02 14:37:54 -0700308 void SetPasswordChar(uint16_t wSubWord, bool bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700309
310 // Set the maximum number of words in the text.
dsinclairefd5a992016-07-18 10:04:07 -0700311 void SetLimitChar(int32_t nLimitChar);
312 void SetCharArray(int32_t nCharArray);
Dan Sinclair05df0752017-03-14 14:43:42 -0400313 void SetCharSpace(float fCharSpace);
tsepez4cf55152016-11-02 14:37:54 -0700314 void SetMultiLine(bool bMultiLine, bool bPaint);
315 void SetAutoReturn(bool bAuto, bool bPaint);
316 void SetAutoFontSize(bool bAuto, bool bPaint);
317 void SetAutoScroll(bool bAuto, bool bPaint);
Dan Sinclair05df0752017-03-14 14:43:42 -0400318 void SetFontSize(float fFontSize);
tsepez4cf55152016-11-02 14:37:54 -0700319 void SetTextOverflow(bool bAllowed, bool bPaint);
Dan Sinclairf528eee2017-02-14 11:52:07 -0500320 void OnMouseDown(const CFX_PointF& point, bool bShift, bool bCtrl);
321 void OnMouseMove(const CFX_PointF& point, bool bShift, bool bCtrl);
tsepez4cf55152016-11-02 14:37:54 -0700322 void OnVK_UP(bool bShift, bool bCtrl);
323 void OnVK_DOWN(bool bShift, bool bCtrl);
324 void OnVK_LEFT(bool bShift, bool bCtrl);
325 void OnVK_RIGHT(bool bShift, bool bCtrl);
326 void OnVK_HOME(bool bShift, bool bCtrl);
327 void OnVK_END(bool bShift, bool bCtrl);
tsepeza31da742016-09-08 11:28:14 -0700328 void SetText(const CFX_WideString& sText);
tsepez4cf55152016-11-02 14:37:54 -0700329 bool InsertWord(uint16_t word, int32_t charset);
330 bool InsertReturn();
331 bool Backspace();
332 bool Delete();
Diana Gage22bf7a52017-07-21 11:33:18 -0700333 bool ClearSelection();
tsepez4cf55152016-11-02 14:37:54 -0700334 bool InsertText(const CFX_WideString& sText, int32_t charset);
335 bool Redo();
336 bool Undo();
dsinclaire35af1e2016-07-13 11:26:20 -0700337 CPVT_WordPlace WordIndexToWordPlace(int32_t index) const;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500338 CPVT_WordPlace SearchWordPlace(const CFX_PointF& point) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700339 int32_t GetCaret() const;
340 CPVT_WordPlace GetCaretWordPlace() const;
Diana Gage89e65622017-07-20 18:09:31 -0700341 CFX_WideString GetSelectedText() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700342 CFX_WideString GetText() const;
Dan Sinclair05df0752017-03-14 14:43:42 -0400343 float GetFontSize() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700344 uint16_t GetPasswordChar() const;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500345 CFX_PointF GetScrollPos() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700346 int32_t GetCharArray() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700347 CFX_FloatRect GetContentRect() const;
348 CFX_WideString GetRangeText(const CPVT_WordRange& range) const;
349 int32_t GetHorzScale() const;
Dan Sinclair05df0752017-03-14 14:43:42 -0400350 float GetCharSpace() const;
Diana Gage4d02e902017-07-20 17:20:31 -0700351 void SetSelection(int32_t nStartChar, int32_t nEndChar);
352 void GetSelection(int32_t& nStartChar, int32_t& nEndChar) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700353 void SelectAll();
354 void SelectNone();
tsepez4cf55152016-11-02 14:37:54 -0700355 bool IsSelected() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700356 void Paint();
tsepez4cf55152016-11-02 14:37:54 -0700357 void EnableRefresh(bool bRefresh);
dsinclaire35af1e2016-07-13 11:26:20 -0700358 void RefreshWordRange(const CPVT_WordRange& wr);
dsinclaire35af1e2016-07-13 11:26:20 -0700359 CPVT_WordRange GetWholeWordRange() const;
360 CPVT_WordRange GetSelectWordRange() const;
tsepez4cf55152016-11-02 14:37:54 -0700361 void EnableUndo(bool bUndo);
tsepez4cf55152016-11-02 14:37:54 -0700362 bool IsTextFull() const;
363 bool IsTextOverflow() const;
364 bool CanUndo() const;
365 bool CanRedo() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700366 CPVT_WordRange GetVisibleWordRange() const;
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700367
tsepez4cf55152016-11-02 14:37:54 -0700368 bool Empty();
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700369
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700370 CPVT_WordPlace DoInsertText(const CPVT_WordPlace& place,
tsepeza31da742016-09-08 11:28:14 -0700371 const CFX_WideString& sText,
dsinclairefd5a992016-07-18 10:04:07 -0700372 int32_t charset);
Tom Sepez62a70f92016-03-21 15:00:20 -0700373 int32_t GetCharSetFromUnicode(uint16_t word, int32_t nOldCharset);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700374
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700375 int32_t GetTotalLines() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700376
Dan Sinclairc08dc392017-07-24 08:57:35 -0400377 CFX_ByteString GetPDFWordString(int32_t nFontIndex,
378 uint16_t Word,
379 uint16_t SubWord);
380
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700381 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400382 friend class CPWL_EditImpl_Iterator;
dsinclaire35af1e2016-07-13 11:26:20 -0700383 friend class CFXEU_InsertWord;
384 friend class CFXEU_InsertReturn;
385 friend class CFXEU_Backspace;
386 friend class CFXEU_Delete;
387 friend class CFXEU_Clear;
dsinclaire35af1e2016-07-13 11:26:20 -0700388 friend class CFXEU_InsertText;
389
Diana Gage4d02e902017-07-20 17:20:31 -0700390 void SetSelection(const CPVT_WordPlace& begin, const CPVT_WordPlace& end);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700391
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700392 void RearrangeAll();
393 void RearrangePart(const CPVT_WordRange& range);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700394 void ScrollToCaret();
395 void SetScrollInfo();
Dan Sinclair05df0752017-03-14 14:43:42 -0400396 void SetScrollPosX(float fx);
397 void SetScrollPosY(float fy);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700398 void SetScrollLimit();
399 void SetContentChanged();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700400
tsepez4cf55152016-11-02 14:37:54 -0700401 bool InsertWord(uint16_t word,
402 int32_t charset,
403 const CPVT_WordProps* pWordProps,
404 bool bAddUndo,
405 bool bPaint);
406 bool InsertReturn(const CPVT_SecProps* pSecProps,
407 const CPVT_WordProps* pWordProps,
408 bool bAddUndo,
409 bool bPaint);
410 bool Backspace(bool bAddUndo, bool bPaint);
411 bool Delete(bool bAddUndo, bool bPaint);
412 bool Clear(bool bAddUndo, bool bPaint);
413 bool InsertText(const CFX_WideString& sText,
414 int32_t charset,
415 bool bAddUndo,
416 bool bPaint);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700417 void PaintInsertText(const CPVT_WordPlace& wpOld,
418 const CPVT_WordPlace& wpNew);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700419
Dan Sinclairf528eee2017-02-14 11:52:07 -0500420 inline CFX_PointF VTToEdit(const CFX_PointF& point) const;
421 inline CFX_PointF EditToVT(const CFX_PointF& point) const;
Tom Sepez281a9ea2016-02-26 14:24:28 -0800422 inline CFX_FloatRect VTToEdit(const CFX_FloatRect& rect) const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700423
dsinclairefd5a992016-07-18 10:04:07 -0700424 void Refresh();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700425 void RefreshPushLineRects(const CPVT_WordRange& wr);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700426
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700427 void SetCaret(const CPVT_WordPlace& place);
428 void SetCaretInfo();
429 void SetCaretOrigin();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700430
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700431 void AddEditUndoItem(std::unique_ptr<IFX_Edit_UndoItem> pEditUndoItem);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700432
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700433 private:
dsinclaire35af1e2016-07-13 11:26:20 -0700434 std::unique_ptr<CPDF_VariableText> m_pVT;
Tom Sepezd0409af2017-05-25 15:53:57 -0700435 CFX_UnownedPtr<CPWL_EditCtrl> m_pNotify;
Lei Zhang5688d622017-08-12 07:04:19 -0700436 CFX_UnownedPtr<CPWL_Edit> m_pOperationNotify;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400437 std::unique_ptr<CPWL_EditImpl_Provider> m_pVTProvider;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700438 CPVT_WordPlace m_wpCaret;
439 CPVT_WordPlace m_wpOldCaret;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400440 CPWL_EditImpl_Select m_SelState;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500441 CFX_PointF m_ptScrollPos;
442 CFX_PointF m_ptRefreshScrollPos;
tsepez4cf55152016-11-02 14:37:54 -0700443 bool m_bEnableScroll;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400444 std::unique_ptr<CPWL_EditImpl_Iterator> m_pIterator;
445 CPWL_EditImpl_Refresh m_Refresh;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500446 CFX_PointF m_ptCaret;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400447 CPWL_EditImpl_Undo m_Undo;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700448 int32_t m_nAlignment;
tsepez4cf55152016-11-02 14:37:54 -0700449 bool m_bNotifyFlag;
450 bool m_bEnableOverflow;
451 bool m_bEnableRefresh;
Tom Sepez281a9ea2016-02-26 14:24:28 -0800452 CFX_FloatRect m_rcOldContent;
tsepez4cf55152016-11-02 14:37:54 -0700453 bool m_bEnableUndo;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700454};
455
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400456class CPWL_EditImpl_Iterator {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700457 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400458 CPWL_EditImpl_Iterator(CPWL_EditImpl* pEdit,
459 CPDF_VariableText::Iterator* pVTIterator);
460 ~CPWL_EditImpl_Iterator();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700461
tsepez4cf55152016-11-02 14:37:54 -0700462 bool NextWord();
463 bool PrevWord();
464 bool GetWord(CPVT_Word& word) const;
465 bool GetLine(CPVT_Line& line) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700466 void SetAt(int32_t nWordIndex);
467 void SetAt(const CPVT_WordPlace& place);
468 const CPVT_WordPlace& GetAt() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700469
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700470 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400471 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
dsinclairc7a73492016-04-05 12:01:42 -0700472 CPDF_VariableText::Iterator* m_pVTIterator;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700473};
474
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400475class CPWL_EditImpl_Provider : public CPDF_VariableText::Provider {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700476 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400477 explicit CPWL_EditImpl_Provider(IPVT_FontMap* pFontMap);
478 ~CPWL_EditImpl_Provider() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700479
Tom Sepezd0409af2017-05-25 15:53:57 -0700480 IPVT_FontMap* GetFontMap() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700481
dsinclairc7a73492016-04-05 12:01:42 -0700482 // CPDF_VariableText::Provider:
npm41d6bbe2016-09-14 11:54:44 -0700483 int32_t GetCharWidth(int32_t nFontIndex, uint16_t word) override;
Lei Zhang5fd907b2015-11-19 22:20:59 -0800484 int32_t GetTypeAscent(int32_t nFontIndex) override;
485 int32_t GetTypeDescent(int32_t nFontIndex) override;
Tom Sepez62a70f92016-03-21 15:00:20 -0700486 int32_t GetWordFontIndex(uint16_t word,
Lei Zhang5fd907b2015-11-19 22:20:59 -0800487 int32_t charset,
488 int32_t nFontIndex) override;
489 int32_t GetDefaultFontIndex() override;
tsepez4cf55152016-11-02 14:37:54 -0700490 bool IsLatinWord(uint16_t word) override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700491
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700492 private:
dsinclairc7a73492016-04-05 12:01:42 -0700493 IPVT_FontMap* m_pFontMap;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700494};
495
Dan Sinclairc411eb92017-07-25 09:39:30 -0400496#endif // FPDFSDK_PWL_CPWL_EDIT_IMPL_H_