blob: 80c68050f5f38dbe09447c1446e2d809e46e7406 [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:
Lei Zhangbff66f12017-08-15 13:26:44 -0700106 CPWL_EditImpl_Undo();
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400107 ~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;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700114
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700115 private:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700116 void RemoveHeads();
117 void RemoveTails();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700118
Tom Sepez3509d162017-01-30 13:22:02 -0800119 std::deque<std::unique_ptr<IFX_Edit_UndoItem>> m_UndoItemStack;
120 size_t m_nCurUndoPos;
tsepez4cf55152016-11-02 14:37:54 -0700121 bool m_bWorking;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700122};
123
dsinclaire35af1e2016-07-13 11:26:20 -0700124class IFX_Edit_UndoItem {
125 public:
126 virtual ~IFX_Edit_UndoItem() {}
127
128 virtual void Undo() = 0;
129 virtual void Redo() = 0;
dsinclaire35af1e2016-07-13 11:26:20 -0700130};
131
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700132class CFXEU_InsertWord : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700133 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400134 CFXEU_InsertWord(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700135 const CPVT_WordPlace& wpOldPlace,
136 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700137 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700138 int32_t charset,
139 const CPVT_WordProps* pWordProps);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700140 ~CFXEU_InsertWord() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700141
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700142 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700143 void Redo() override;
144 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700145
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700146 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400147 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700148
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700149 CPVT_WordPlace m_wpOld;
150 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700151 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700152 int32_t m_nCharset;
153 CPVT_WordProps m_WordProps;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700154};
155
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700156class CFXEU_InsertReturn : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700157 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400158 CFXEU_InsertReturn(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700159 const CPVT_WordPlace& wpOldPlace,
160 const CPVT_WordPlace& wpNewPlace,
161 const CPVT_SecProps* pSecProps,
162 const CPVT_WordProps* pWordProps);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700163 ~CFXEU_InsertReturn() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700164
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700165 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700166 void Redo() override;
167 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700168
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700169 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400170 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700171
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700172 CPVT_WordPlace m_wpOld;
173 CPVT_WordPlace m_wpNew;
174 CPVT_SecProps m_SecProps;
175 CPVT_WordProps m_WordProps;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700176};
177
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700178class CFXEU_Backspace : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700179 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400180 CFXEU_Backspace(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700181 const CPVT_WordPlace& wpOldPlace,
182 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700183 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700184 int32_t charset,
185 const CPVT_SecProps& SecProps,
186 const CPVT_WordProps& WordProps);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700187 ~CFXEU_Backspace() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700188
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700189 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700190 void Redo() override;
191 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700192
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700193 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400194 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700195
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700196 CPVT_WordPlace m_wpOld;
197 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700198 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700199 int32_t m_nCharset;
200 CPVT_SecProps m_SecProps;
201 CPVT_WordProps m_WordProps;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700202};
203
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700204class CFXEU_Delete : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700205 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400206 CFXEU_Delete(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700207 const CPVT_WordPlace& wpOldPlace,
208 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700209 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700210 int32_t charset,
211 const CPVT_SecProps& SecProps,
212 const CPVT_WordProps& WordProps,
tsepez4cf55152016-11-02 14:37:54 -0700213 bool bSecEnd);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700214 ~CFXEU_Delete() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700215
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700216 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700217 void Redo() override;
218 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700219
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700220 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400221 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700222
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700223 CPVT_WordPlace m_wpOld;
224 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700225 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700226 int32_t m_nCharset;
227 CPVT_SecProps m_SecProps;
228 CPVT_WordProps m_WordProps;
tsepez4cf55152016-11-02 14:37:54 -0700229 bool m_bSecEnd;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700230};
231
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700232class CFXEU_Clear : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700233 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400234 CFXEU_Clear(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700235 const CPVT_WordRange& wrSel,
236 const CFX_WideString& swText);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700237 ~CFXEU_Clear() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700238
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700239 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700240 void Redo() override;
241 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700242
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700243 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400244 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700245
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700246 CPVT_WordRange m_wrSel;
247 CFX_WideString m_swText;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700248};
249
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700250class CFXEU_InsertText : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700251 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400252 CFXEU_InsertText(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700253 const CPVT_WordPlace& wpOldPlace,
254 const CPVT_WordPlace& wpNewPlace,
255 const CFX_WideString& swText,
dsinclairefd5a992016-07-18 10:04:07 -0700256 int32_t charset);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700257 ~CFXEU_InsertText() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700258
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700259 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700260 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:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400264 CFX_UnownedPtr<CPWL_EditImpl> 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;
268 CFX_WideString m_swText;
269 int32_t m_nCharset;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700270};
271
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400272class CPWL_EditImpl {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700273 public:
dsinclaire35af1e2016-07-13 11:26:20 -0700274 static void DrawEdit(CFX_RenderDevice* pDevice,
275 CFX_Matrix* pUser2Device,
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400276 CPWL_EditImpl* pEdit,
dsinclaire35af1e2016-07-13 11:26:20 -0700277 FX_COLORREF crTextFill,
dsinclaire35af1e2016-07-13 11:26:20 -0700278 const CFX_FloatRect& rcClip,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500279 const CFX_PointF& ptOffset,
dsinclaire35af1e2016-07-13 11:26:20 -0700280 const CPVT_WordRange* pRange,
281 CFX_SystemHandler* pSystemHandler,
dsinclair8faac622016-09-15 12:41:50 -0700282 CFFL_FormFiller* pFFLData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700283
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400284 CPWL_EditImpl();
285 ~CPWL_EditImpl();
dsinclaire35af1e2016-07-13 11:26:20 -0700286
287 void SetFontMap(IPVT_FontMap* pFontMap);
288 void SetNotify(CPWL_EditCtrl* pNotify);
Lei Zhang5688d622017-08-12 07:04:19 -0700289 void SetOperationNotify(CPWL_Edit* pOperationNotify);
dsinclaire35af1e2016-07-13 11:26:20 -0700290
291 // Returns an iterator for the contents. Should not be released.
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400292 CPWL_EditImpl_Iterator* GetIterator();
dsinclaire35af1e2016-07-13 11:26:20 -0700293 IPVT_FontMap* GetFontMap();
294 void Initialize();
295
296 // Set the bounding box of the text area.
dsinclairefd5a992016-07-18 10:04:07 -0700297 void SetPlateRect(const CFX_FloatRect& rect);
Dan Sinclairf528eee2017-02-14 11:52:07 -0500298 void SetScrollPos(const CFX_PointF& point);
dsinclaire35af1e2016-07-13 11:26:20 -0700299
300 // Set the horizontal text alignment. (nFormat [0:left, 1:middle, 2:right])
tsepez4cf55152016-11-02 14:37:54 -0700301 void SetAlignmentH(int32_t nFormat, bool bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700302 // Set the vertical text alignment. (nFormat [0:left, 1:middle, 2:right])
tsepez4cf55152016-11-02 14:37:54 -0700303 void SetAlignmentV(int32_t nFormat, bool bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700304
305 // Set the substitution character for hidden text.
tsepez4cf55152016-11-02 14:37:54 -0700306 void SetPasswordChar(uint16_t wSubWord, bool bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700307
308 // Set the maximum number of words in the text.
dsinclairefd5a992016-07-18 10:04:07 -0700309 void SetLimitChar(int32_t nLimitChar);
310 void SetCharArray(int32_t nCharArray);
Dan Sinclair05df0752017-03-14 14:43:42 -0400311 void SetCharSpace(float fCharSpace);
tsepez4cf55152016-11-02 14:37:54 -0700312 void SetMultiLine(bool bMultiLine, bool bPaint);
313 void SetAutoReturn(bool bAuto, bool bPaint);
314 void SetAutoFontSize(bool bAuto, bool bPaint);
315 void SetAutoScroll(bool bAuto, bool bPaint);
Dan Sinclair05df0752017-03-14 14:43:42 -0400316 void SetFontSize(float fFontSize);
tsepez4cf55152016-11-02 14:37:54 -0700317 void SetTextOverflow(bool bAllowed, bool bPaint);
Dan Sinclairf528eee2017-02-14 11:52:07 -0500318 void OnMouseDown(const CFX_PointF& point, bool bShift, bool bCtrl);
319 void OnMouseMove(const CFX_PointF& point, bool bShift, bool bCtrl);
tsepez4cf55152016-11-02 14:37:54 -0700320 void OnVK_UP(bool bShift, bool bCtrl);
321 void OnVK_DOWN(bool bShift, bool bCtrl);
322 void OnVK_LEFT(bool bShift, bool bCtrl);
323 void OnVK_RIGHT(bool bShift, bool bCtrl);
324 void OnVK_HOME(bool bShift, bool bCtrl);
325 void OnVK_END(bool bShift, bool bCtrl);
tsepeza31da742016-09-08 11:28:14 -0700326 void SetText(const CFX_WideString& sText);
tsepez4cf55152016-11-02 14:37:54 -0700327 bool InsertWord(uint16_t word, int32_t charset);
328 bool InsertReturn();
329 bool Backspace();
330 bool Delete();
Diana Gage22bf7a52017-07-21 11:33:18 -0700331 bool ClearSelection();
tsepez4cf55152016-11-02 14:37:54 -0700332 bool InsertText(const CFX_WideString& sText, int32_t charset);
333 bool Redo();
334 bool Undo();
dsinclaire35af1e2016-07-13 11:26:20 -0700335 CPVT_WordPlace WordIndexToWordPlace(int32_t index) const;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500336 CPVT_WordPlace SearchWordPlace(const CFX_PointF& point) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700337 int32_t GetCaret() const;
338 CPVT_WordPlace GetCaretWordPlace() const;
Diana Gage89e65622017-07-20 18:09:31 -0700339 CFX_WideString GetSelectedText() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700340 CFX_WideString GetText() const;
Dan Sinclair05df0752017-03-14 14:43:42 -0400341 float GetFontSize() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700342 uint16_t GetPasswordChar() const;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500343 CFX_PointF GetScrollPos() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700344 int32_t GetCharArray() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700345 CFX_FloatRect GetContentRect() const;
346 CFX_WideString GetRangeText(const CPVT_WordRange& range) const;
347 int32_t GetHorzScale() const;
Dan Sinclair05df0752017-03-14 14:43:42 -0400348 float GetCharSpace() const;
Diana Gage4d02e902017-07-20 17:20:31 -0700349 void SetSelection(int32_t nStartChar, int32_t nEndChar);
350 void GetSelection(int32_t& nStartChar, int32_t& nEndChar) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700351 void SelectAll();
352 void SelectNone();
tsepez4cf55152016-11-02 14:37:54 -0700353 bool IsSelected() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700354 void Paint();
tsepez4cf55152016-11-02 14:37:54 -0700355 void EnableRefresh(bool bRefresh);
dsinclaire35af1e2016-07-13 11:26:20 -0700356 void RefreshWordRange(const CPVT_WordRange& wr);
dsinclaire35af1e2016-07-13 11:26:20 -0700357 CPVT_WordRange GetWholeWordRange() const;
358 CPVT_WordRange GetSelectWordRange() const;
tsepez4cf55152016-11-02 14:37:54 -0700359 void EnableUndo(bool bUndo);
tsepez4cf55152016-11-02 14:37:54 -0700360 bool IsTextFull() const;
361 bool IsTextOverflow() const;
362 bool CanUndo() const;
363 bool CanRedo() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700364 CPVT_WordRange GetVisibleWordRange() const;
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700365
tsepez4cf55152016-11-02 14:37:54 -0700366 bool Empty();
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700367
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700368 CPVT_WordPlace DoInsertText(const CPVT_WordPlace& place,
tsepeza31da742016-09-08 11:28:14 -0700369 const CFX_WideString& sText,
dsinclairefd5a992016-07-18 10:04:07 -0700370 int32_t charset);
Tom Sepez62a70f92016-03-21 15:00:20 -0700371 int32_t GetCharSetFromUnicode(uint16_t word, int32_t nOldCharset);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700372
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700373 int32_t GetTotalLines() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700374
Dan Sinclairc08dc392017-07-24 08:57:35 -0400375 CFX_ByteString GetPDFWordString(int32_t nFontIndex,
376 uint16_t Word,
377 uint16_t SubWord);
378
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700379 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400380 friend class CPWL_EditImpl_Iterator;
dsinclaire35af1e2016-07-13 11:26:20 -0700381 friend class CFXEU_InsertWord;
382 friend class CFXEU_InsertReturn;
383 friend class CFXEU_Backspace;
384 friend class CFXEU_Delete;
385 friend class CFXEU_Clear;
dsinclaire35af1e2016-07-13 11:26:20 -0700386 friend class CFXEU_InsertText;
387
Diana Gage4d02e902017-07-20 17:20:31 -0700388 void SetSelection(const CPVT_WordPlace& begin, const CPVT_WordPlace& end);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700389
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700390 void RearrangeAll();
391 void RearrangePart(const CPVT_WordRange& range);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700392 void ScrollToCaret();
393 void SetScrollInfo();
Dan Sinclair05df0752017-03-14 14:43:42 -0400394 void SetScrollPosX(float fx);
395 void SetScrollPosY(float fy);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700396 void SetScrollLimit();
397 void SetContentChanged();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700398
tsepez4cf55152016-11-02 14:37:54 -0700399 bool InsertWord(uint16_t word,
400 int32_t charset,
401 const CPVT_WordProps* pWordProps,
402 bool bAddUndo,
403 bool bPaint);
404 bool InsertReturn(const CPVT_SecProps* pSecProps,
405 const CPVT_WordProps* pWordProps,
406 bool bAddUndo,
407 bool bPaint);
408 bool Backspace(bool bAddUndo, bool bPaint);
409 bool Delete(bool bAddUndo, bool bPaint);
410 bool Clear(bool bAddUndo, bool bPaint);
411 bool InsertText(const CFX_WideString& sText,
412 int32_t charset,
413 bool bAddUndo,
414 bool bPaint);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700415 void PaintInsertText(const CPVT_WordPlace& wpOld,
416 const CPVT_WordPlace& wpNew);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700417
Dan Sinclairf528eee2017-02-14 11:52:07 -0500418 inline CFX_PointF VTToEdit(const CFX_PointF& point) const;
419 inline CFX_PointF EditToVT(const CFX_PointF& point) const;
Tom Sepez281a9ea2016-02-26 14:24:28 -0800420 inline CFX_FloatRect VTToEdit(const CFX_FloatRect& rect) const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700421
dsinclairefd5a992016-07-18 10:04:07 -0700422 void Refresh();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700423 void RefreshPushLineRects(const CPVT_WordRange& wr);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700424
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700425 void SetCaret(const CPVT_WordPlace& place);
426 void SetCaretInfo();
427 void SetCaretOrigin();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700428
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700429 void AddEditUndoItem(std::unique_ptr<IFX_Edit_UndoItem> pEditUndoItem);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700430
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700431 private:
dsinclaire35af1e2016-07-13 11:26:20 -0700432 std::unique_ptr<CPDF_VariableText> m_pVT;
Tom Sepezd0409af2017-05-25 15:53:57 -0700433 CFX_UnownedPtr<CPWL_EditCtrl> m_pNotify;
Lei Zhang5688d622017-08-12 07:04:19 -0700434 CFX_UnownedPtr<CPWL_Edit> m_pOperationNotify;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400435 std::unique_ptr<CPWL_EditImpl_Provider> m_pVTProvider;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700436 CPVT_WordPlace m_wpCaret;
437 CPVT_WordPlace m_wpOldCaret;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400438 CPWL_EditImpl_Select m_SelState;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500439 CFX_PointF m_ptScrollPos;
440 CFX_PointF m_ptRefreshScrollPos;
tsepez4cf55152016-11-02 14:37:54 -0700441 bool m_bEnableScroll;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400442 std::unique_ptr<CPWL_EditImpl_Iterator> m_pIterator;
443 CPWL_EditImpl_Refresh m_Refresh;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500444 CFX_PointF m_ptCaret;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400445 CPWL_EditImpl_Undo m_Undo;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700446 int32_t m_nAlignment;
tsepez4cf55152016-11-02 14:37:54 -0700447 bool m_bNotifyFlag;
448 bool m_bEnableOverflow;
449 bool m_bEnableRefresh;
Tom Sepez281a9ea2016-02-26 14:24:28 -0800450 CFX_FloatRect m_rcOldContent;
tsepez4cf55152016-11-02 14:37:54 -0700451 bool m_bEnableUndo;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700452};
453
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400454class CPWL_EditImpl_Iterator {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700455 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400456 CPWL_EditImpl_Iterator(CPWL_EditImpl* pEdit,
457 CPDF_VariableText::Iterator* pVTIterator);
458 ~CPWL_EditImpl_Iterator();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700459
tsepez4cf55152016-11-02 14:37:54 -0700460 bool NextWord();
461 bool PrevWord();
462 bool GetWord(CPVT_Word& word) const;
463 bool GetLine(CPVT_Line& line) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700464 void SetAt(int32_t nWordIndex);
465 void SetAt(const CPVT_WordPlace& place);
466 const CPVT_WordPlace& GetAt() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700467
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700468 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400469 CFX_UnownedPtr<CPWL_EditImpl> m_pEdit;
dsinclairc7a73492016-04-05 12:01:42 -0700470 CPDF_VariableText::Iterator* m_pVTIterator;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700471};
472
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400473class CPWL_EditImpl_Provider : public CPDF_VariableText::Provider {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700474 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400475 explicit CPWL_EditImpl_Provider(IPVT_FontMap* pFontMap);
476 ~CPWL_EditImpl_Provider() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700477
Tom Sepezd0409af2017-05-25 15:53:57 -0700478 IPVT_FontMap* GetFontMap() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700479
dsinclairc7a73492016-04-05 12:01:42 -0700480 // CPDF_VariableText::Provider:
npm41d6bbe2016-09-14 11:54:44 -0700481 int32_t GetCharWidth(int32_t nFontIndex, uint16_t word) override;
Lei Zhang5fd907b2015-11-19 22:20:59 -0800482 int32_t GetTypeAscent(int32_t nFontIndex) override;
483 int32_t GetTypeDescent(int32_t nFontIndex) override;
Tom Sepez62a70f92016-03-21 15:00:20 -0700484 int32_t GetWordFontIndex(uint16_t word,
Lei Zhang5fd907b2015-11-19 22:20:59 -0800485 int32_t charset,
486 int32_t nFontIndex) override;
487 int32_t GetDefaultFontIndex() override;
tsepez4cf55152016-11-02 14:37:54 -0700488 bool IsLatinWord(uint16_t word) override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700489
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700490 private:
dsinclairc7a73492016-04-05 12:01:42 -0700491 IPVT_FontMap* m_pFontMap;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700492};
493
Dan Sinclairc411eb92017-07-25 09:39:30 -0400494#endif // FPDFSDK_PWL_CPWL_EDIT_IMPL_H_