blob: b7dc0327c5115fb5eed7a59888c617a7fdeceb0b [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_wordprops.h"
Dan Sinclairaee0db02017-09-21 16:53:58 -040015#include "core/fxcrt/unowned_ptr.h"
Dan Sinclairc08dc392017-07-24 08:57:35 -040016
17#define FX_EDIT_ISLATINWORD(u) \
18 (u == 0x2D || (u <= 0x005A && u >= 0x0041) || \
19 (u <= 0x007A && u >= 0x0061) || (u <= 0x02AF && u >= 0x00C0))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070020
dsinclair8faac622016-09-15 12:41:50 -070021class CFFL_FormFiller;
Dan Sinclair6b0158f2017-07-24 09:42:55 -040022class CPWL_EditImpl;
23class CPWL_EditImpl_Iterator;
24class CPWL_EditImpl_Provider;
dsinclaire35af1e2016-07-13 11:26:20 -070025class CFX_RenderDevice;
26class CFX_SystemHandler;
dsinclair8faac622016-09-15 12:41:50 -070027class CPWL_Edit;
28class CPWL_EditCtrl;
dsinclaire35af1e2016-07-13 11:26:20 -070029class IFX_Edit_UndoItem;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070030
Dan Sinclair6b0158f2017-07-24 09:42:55 -040031struct CPWL_EditImpl_LineRect {
32 CPWL_EditImpl_LineRect(const CPVT_WordRange& wrLine,
33 const CFX_FloatRect& rcLine)
Nico Weber9d8ec5a2015-08-04 13:00:21 -070034 : m_wrLine(wrLine), m_rcLine(rcLine) {}
35
Nico Weber9d8ec5a2015-08-04 13:00:21 -070036 CPVT_WordRange m_wrLine;
Tom Sepez281a9ea2016-02-26 14:24:28 -080037 CFX_FloatRect m_rcLine;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070038};
39
Dan Sinclair6b0158f2017-07-24 09:42:55 -040040class CPWL_EditImpl_LineRectArray {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070041 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -040042 CPWL_EditImpl_LineRectArray();
43 ~CPWL_EditImpl_LineRectArray();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070044
Dan Sinclair6b0158f2017-07-24 09:42:55 -040045 void operator=(CPWL_EditImpl_LineRectArray&& rects);
weili625ad662016-06-15 11:21:33 -070046 void Add(const CPVT_WordRange& wrLine, const CFX_FloatRect& rcLine);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070047
weili625ad662016-06-15 11:21:33 -070048 int32_t GetSize() const;
Dan Sinclair6b0158f2017-07-24 09:42:55 -040049 CPWL_EditImpl_LineRect* GetAt(int32_t nIndex) const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070050
weili625ad662016-06-15 11:21:33 -070051 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -040052 std::vector<std::unique_ptr<CPWL_EditImpl_LineRect>> m_LineRects;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070053};
54
Dan Sinclair6b0158f2017-07-24 09:42:55 -040055class CPWL_EditImpl_RectArray {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070056 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -040057 CPWL_EditImpl_RectArray();
58 ~CPWL_EditImpl_RectArray();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070059
Tom Sepez3509d162017-01-30 13:22:02 -080060 void Clear();
weili625ad662016-06-15 11:21:33 -070061 void Add(const CFX_FloatRect& rect);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070062
weili625ad662016-06-15 11:21:33 -070063 int32_t GetSize() const;
64 CFX_FloatRect* GetAt(int32_t nIndex) const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070065
weili625ad662016-06-15 11:21:33 -070066 private:
Tom Sepez3509d162017-01-30 13:22:02 -080067 std::vector<std::unique_ptr<CFX_FloatRect>> m_Rects;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070068};
69
Dan Sinclair6b0158f2017-07-24 09:42:55 -040070class CPWL_EditImpl_Refresh {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070071 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -040072 CPWL_EditImpl_Refresh();
73 ~CPWL_EditImpl_Refresh();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070074
Nico Weber9d8ec5a2015-08-04 13:00:21 -070075 void BeginRefresh();
Tom Sepez281a9ea2016-02-26 14:24:28 -080076 void Push(const CPVT_WordRange& linerange, const CFX_FloatRect& rect);
Nico Weber9d8ec5a2015-08-04 13:00:21 -070077 void NoAnalyse();
Dan Sinclair6b0158f2017-07-24 09:42:55 -040078 const CPWL_EditImpl_RectArray* GetRefreshRects() const;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070079 void EndRefresh();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070080
Nico Weber9d8ec5a2015-08-04 13:00:21 -070081 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -040082 CPWL_EditImpl_LineRectArray m_NewLineRects;
83 CPWL_EditImpl_LineRectArray m_OldLineRects;
84 CPWL_EditImpl_RectArray m_RefreshRects;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070085};
86
Dan Sinclair6b0158f2017-07-24 09:42:55 -040087class CPWL_EditImpl_Select {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070088 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -040089 CPWL_EditImpl_Select();
90 explicit CPWL_EditImpl_Select(const CPVT_WordRange& range);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070091
Tom Sepez52f69b32017-03-21 13:42:38 -070092 void Reset();
weili625ad662016-06-15 11:21:33 -070093 void Set(const CPVT_WordPlace& begin, const CPVT_WordPlace& end);
weili625ad662016-06-15 11:21:33 -070094 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;
Tom Sepez52f69b32017-03-21 13:42:38 -070097 bool IsEmpty() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070098
Tom Sepez3509d162017-01-30 13:22:02 -080099 CPVT_WordPlace BeginPos;
100 CPVT_WordPlace EndPos;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700101};
102
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400103class CPWL_EditImpl_Undo {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700104 public:
Lei Zhangbff66f12017-08-15 13:26:44 -0700105 CPWL_EditImpl_Undo();
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400106 ~CPWL_EditImpl_Undo();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700107
Tom Sepez3509d162017-01-30 13:22:02 -0800108 void AddItem(std::unique_ptr<IFX_Edit_UndoItem> pItem);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700109 void Undo();
110 void Redo();
tsepez4cf55152016-11-02 14:37:54 -0700111 bool CanUndo() const;
112 bool CanRedo() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700113
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700114 private:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700115 void RemoveHeads();
116 void RemoveTails();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700117
Tom Sepez3509d162017-01-30 13:22:02 -0800118 std::deque<std::unique_ptr<IFX_Edit_UndoItem>> m_UndoItemStack;
119 size_t m_nCurUndoPos;
tsepez4cf55152016-11-02 14:37:54 -0700120 bool m_bWorking;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700121};
122
dsinclaire35af1e2016-07-13 11:26:20 -0700123class IFX_Edit_UndoItem {
124 public:
125 virtual ~IFX_Edit_UndoItem() {}
126
127 virtual void Undo() = 0;
128 virtual void Redo() = 0;
dsinclaire35af1e2016-07-13 11:26:20 -0700129};
130
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700131class CFXEU_InsertWord : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700132 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400133 CFXEU_InsertWord(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700134 const CPVT_WordPlace& wpOldPlace,
135 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700136 uint16_t word,
Dan Sinclair671a7992017-10-05 14:36:33 -0400137 int32_t charset);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700138 ~CFXEU_InsertWord() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700139
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700140 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700141 void Redo() override;
142 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700143
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700144 private:
Dan Sinclairaee0db02017-09-21 16:53:58 -0400145 UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700146
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700147 CPVT_WordPlace m_wpOld;
148 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700149 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700150 int32_t m_nCharset;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700151};
152
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700153class CFXEU_InsertReturn : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700154 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400155 CFXEU_InsertReturn(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700156 const CPVT_WordPlace& wpOldPlace,
Dan Sinclair671a7992017-10-05 14:36:33 -0400157 const CPVT_WordPlace& wpNewPlace);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700158 ~CFXEU_InsertReturn() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700159
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700160 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700161 void Redo() override;
162 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700163
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700164 private:
Dan Sinclairaee0db02017-09-21 16:53:58 -0400165 UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700166
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700167 CPVT_WordPlace m_wpOld;
168 CPVT_WordPlace m_wpNew;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700169};
170
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700171class CFXEU_Backspace : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700172 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400173 CFXEU_Backspace(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700174 const CPVT_WordPlace& wpOldPlace,
175 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700176 uint16_t word,
Dan Sinclair671a7992017-10-05 14:36:33 -0400177 int32_t charset);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700178 ~CFXEU_Backspace() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700179
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700180 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700181 void Redo() override;
182 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700183
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700184 private:
Dan Sinclairaee0db02017-09-21 16:53:58 -0400185 UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700186
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700187 CPVT_WordPlace m_wpOld;
188 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700189 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700190 int32_t m_nCharset;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700191};
192
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700193class CFXEU_Delete : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700194 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400195 CFXEU_Delete(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700196 const CPVT_WordPlace& wpOldPlace,
197 const CPVT_WordPlace& wpNewPlace,
Tom Sepez62a70f92016-03-21 15:00:20 -0700198 uint16_t word,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700199 int32_t charset,
tsepez4cf55152016-11-02 14:37:54 -0700200 bool bSecEnd);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700201 ~CFXEU_Delete() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700202
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700203 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700204 void Redo() override;
205 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700206
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700207 private:
Dan Sinclairaee0db02017-09-21 16:53:58 -0400208 UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700209
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700210 CPVT_WordPlace m_wpOld;
211 CPVT_WordPlace m_wpNew;
Tom Sepez62a70f92016-03-21 15:00:20 -0700212 uint16_t m_Word;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700213 int32_t m_nCharset;
tsepez4cf55152016-11-02 14:37:54 -0700214 bool m_bSecEnd;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700215};
216
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700217class CFXEU_Clear : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700218 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400219 CFXEU_Clear(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700220 const CPVT_WordRange& wrSel,
Ryan Harrison275e2602017-09-18 14:23:18 -0400221 const WideString& swText);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700222 ~CFXEU_Clear() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700223
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700224 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700225 void Redo() override;
226 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700227
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700228 private:
Dan Sinclairaee0db02017-09-21 16:53:58 -0400229 UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700230
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700231 CPVT_WordRange m_wrSel;
Ryan Harrison275e2602017-09-18 14:23:18 -0400232 WideString m_swText;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700233};
234
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700235class CFXEU_InsertText : public IFX_Edit_UndoItem {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700236 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400237 CFXEU_InsertText(CPWL_EditImpl* pEdit,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700238 const CPVT_WordPlace& wpOldPlace,
239 const CPVT_WordPlace& wpNewPlace,
Ryan Harrison275e2602017-09-18 14:23:18 -0400240 const WideString& swText,
dsinclairefd5a992016-07-18 10:04:07 -0700241 int32_t charset);
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700242 ~CFXEU_InsertText() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700243
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700244 // IFX_Edit_UndoItem:
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700245 void Redo() override;
246 void Undo() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700247
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700248 private:
Dan Sinclairaee0db02017-09-21 16:53:58 -0400249 UnownedPtr<CPWL_EditImpl> m_pEdit;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700250
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700251 CPVT_WordPlace m_wpOld;
252 CPVT_WordPlace m_wpNew;
Ryan Harrison275e2602017-09-18 14:23:18 -0400253 WideString m_swText;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700254 int32_t m_nCharset;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700255};
256
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400257class CPWL_EditImpl {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700258 public:
dsinclaire35af1e2016-07-13 11:26:20 -0700259 static void DrawEdit(CFX_RenderDevice* pDevice,
Lei Zhangeb14e042017-08-15 13:56:43 -0700260 const CFX_Matrix& mtUser2Device,
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400261 CPWL_EditImpl* pEdit,
dsinclaire35af1e2016-07-13 11:26:20 -0700262 FX_COLORREF crTextFill,
dsinclaire35af1e2016-07-13 11:26:20 -0700263 const CFX_FloatRect& rcClip,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500264 const CFX_PointF& ptOffset,
dsinclaire35af1e2016-07-13 11:26:20 -0700265 const CPVT_WordRange* pRange,
266 CFX_SystemHandler* pSystemHandler,
dsinclair8faac622016-09-15 12:41:50 -0700267 CFFL_FormFiller* pFFLData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700268
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400269 CPWL_EditImpl();
270 ~CPWL_EditImpl();
dsinclaire35af1e2016-07-13 11:26:20 -0700271
272 void SetFontMap(IPVT_FontMap* pFontMap);
273 void SetNotify(CPWL_EditCtrl* pNotify);
Lei Zhang5688d622017-08-12 07:04:19 -0700274 void SetOperationNotify(CPWL_Edit* pOperationNotify);
dsinclaire35af1e2016-07-13 11:26:20 -0700275
276 // Returns an iterator for the contents. Should not be released.
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400277 CPWL_EditImpl_Iterator* GetIterator();
dsinclaire35af1e2016-07-13 11:26:20 -0700278 IPVT_FontMap* GetFontMap();
279 void Initialize();
280
281 // Set the bounding box of the text area.
dsinclairefd5a992016-07-18 10:04:07 -0700282 void SetPlateRect(const CFX_FloatRect& rect);
Dan Sinclairf528eee2017-02-14 11:52:07 -0500283 void SetScrollPos(const CFX_PointF& point);
dsinclaire35af1e2016-07-13 11:26:20 -0700284
285 // Set the horizontal text alignment. (nFormat [0:left, 1:middle, 2:right])
tsepez4cf55152016-11-02 14:37:54 -0700286 void SetAlignmentH(int32_t nFormat, bool bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700287 // Set the vertical text alignment. (nFormat [0:left, 1:middle, 2:right])
tsepez4cf55152016-11-02 14:37:54 -0700288 void SetAlignmentV(int32_t nFormat, bool bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700289
290 // Set the substitution character for hidden text.
tsepez4cf55152016-11-02 14:37:54 -0700291 void SetPasswordChar(uint16_t wSubWord, bool bPaint);
dsinclaire35af1e2016-07-13 11:26:20 -0700292
293 // Set the maximum number of words in the text.
dsinclairefd5a992016-07-18 10:04:07 -0700294 void SetLimitChar(int32_t nLimitChar);
295 void SetCharArray(int32_t nCharArray);
Dan Sinclair05df0752017-03-14 14:43:42 -0400296 void SetCharSpace(float fCharSpace);
tsepez4cf55152016-11-02 14:37:54 -0700297 void SetMultiLine(bool bMultiLine, bool bPaint);
298 void SetAutoReturn(bool bAuto, bool bPaint);
299 void SetAutoFontSize(bool bAuto, bool bPaint);
300 void SetAutoScroll(bool bAuto, bool bPaint);
Dan Sinclair05df0752017-03-14 14:43:42 -0400301 void SetFontSize(float fFontSize);
tsepez4cf55152016-11-02 14:37:54 -0700302 void SetTextOverflow(bool bAllowed, bool bPaint);
Dan Sinclairf528eee2017-02-14 11:52:07 -0500303 void OnMouseDown(const CFX_PointF& point, bool bShift, bool bCtrl);
304 void OnMouseMove(const CFX_PointF& point, bool bShift, bool bCtrl);
tsepez4cf55152016-11-02 14:37:54 -0700305 void OnVK_UP(bool bShift, bool bCtrl);
306 void OnVK_DOWN(bool bShift, bool bCtrl);
307 void OnVK_LEFT(bool bShift, bool bCtrl);
308 void OnVK_RIGHT(bool bShift, bool bCtrl);
309 void OnVK_HOME(bool bShift, bool bCtrl);
310 void OnVK_END(bool bShift, bool bCtrl);
Ryan Harrison275e2602017-09-18 14:23:18 -0400311 void SetText(const WideString& sText);
tsepez4cf55152016-11-02 14:37:54 -0700312 bool InsertWord(uint16_t word, int32_t charset);
313 bool InsertReturn();
314 bool Backspace();
315 bool Delete();
Diana Gage22bf7a52017-07-21 11:33:18 -0700316 bool ClearSelection();
Ryan Harrison275e2602017-09-18 14:23:18 -0400317 bool InsertText(const WideString& sText, int32_t charset);
tsepez4cf55152016-11-02 14:37:54 -0700318 bool Redo();
319 bool Undo();
dsinclaire35af1e2016-07-13 11:26:20 -0700320 CPVT_WordPlace WordIndexToWordPlace(int32_t index) const;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500321 CPVT_WordPlace SearchWordPlace(const CFX_PointF& point) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700322 int32_t GetCaret() const;
323 CPVT_WordPlace GetCaretWordPlace() const;
Ryan Harrison275e2602017-09-18 14:23:18 -0400324 WideString GetSelectedText() const;
325 WideString GetText() const;
Dan Sinclair05df0752017-03-14 14:43:42 -0400326 float GetFontSize() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700327 uint16_t GetPasswordChar() const;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500328 CFX_PointF GetScrollPos() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700329 int32_t GetCharArray() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700330 CFX_FloatRect GetContentRect() const;
Ryan Harrison275e2602017-09-18 14:23:18 -0400331 WideString GetRangeText(const CPVT_WordRange& range) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700332 int32_t GetHorzScale() const;
Dan Sinclair05df0752017-03-14 14:43:42 -0400333 float GetCharSpace() const;
Diana Gage4d02e902017-07-20 17:20:31 -0700334 void SetSelection(int32_t nStartChar, int32_t nEndChar);
335 void GetSelection(int32_t& nStartChar, int32_t& nEndChar) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700336 void SelectAll();
337 void SelectNone();
tsepez4cf55152016-11-02 14:37:54 -0700338 bool IsSelected() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700339 void Paint();
tsepez4cf55152016-11-02 14:37:54 -0700340 void EnableRefresh(bool bRefresh);
dsinclaire35af1e2016-07-13 11:26:20 -0700341 void RefreshWordRange(const CPVT_WordRange& wr);
dsinclaire35af1e2016-07-13 11:26:20 -0700342 CPVT_WordRange GetWholeWordRange() const;
343 CPVT_WordRange GetSelectWordRange() const;
tsepez4cf55152016-11-02 14:37:54 -0700344 void EnableUndo(bool bUndo);
tsepez4cf55152016-11-02 14:37:54 -0700345 bool IsTextFull() const;
346 bool IsTextOverflow() const;
347 bool CanUndo() const;
348 bool CanRedo() const;
dsinclaire35af1e2016-07-13 11:26:20 -0700349 CPVT_WordRange GetVisibleWordRange() const;
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700350
tsepez4cf55152016-11-02 14:37:54 -0700351 bool Empty();
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700352
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700353 CPVT_WordPlace DoInsertText(const CPVT_WordPlace& place,
Ryan Harrison275e2602017-09-18 14:23:18 -0400354 const WideString& sText,
dsinclairefd5a992016-07-18 10:04:07 -0700355 int32_t charset);
Tom Sepez62a70f92016-03-21 15:00:20 -0700356 int32_t GetCharSetFromUnicode(uint16_t word, int32_t nOldCharset);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700357
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700358 int32_t GetTotalLines() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700359
Ryan Harrison275e2602017-09-18 14:23:18 -0400360 ByteString GetPDFWordString(int32_t nFontIndex,
361 uint16_t Word,
362 uint16_t SubWord);
Dan Sinclairc08dc392017-07-24 08:57:35 -0400363
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700364 private:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400365 friend class CPWL_EditImpl_Iterator;
dsinclaire35af1e2016-07-13 11:26:20 -0700366 friend class CFXEU_InsertWord;
367 friend class CFXEU_InsertReturn;
368 friend class CFXEU_Backspace;
369 friend class CFXEU_Delete;
370 friend class CFXEU_Clear;
dsinclaire35af1e2016-07-13 11:26:20 -0700371 friend class CFXEU_InsertText;
372
Diana Gage4d02e902017-07-20 17:20:31 -0700373 void SetSelection(const CPVT_WordPlace& begin, const CPVT_WordPlace& end);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700374
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700375 void RearrangeAll();
376 void RearrangePart(const CPVT_WordRange& range);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700377 void ScrollToCaret();
378 void SetScrollInfo();
Dan Sinclair05df0752017-03-14 14:43:42 -0400379 void SetScrollPosX(float fx);
380 void SetScrollPosY(float fy);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700381 void SetScrollLimit();
382 void SetContentChanged();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700383
tsepez4cf55152016-11-02 14:37:54 -0700384 bool InsertWord(uint16_t word,
385 int32_t charset,
tsepez4cf55152016-11-02 14:37:54 -0700386 bool bAddUndo,
387 bool bPaint);
Dan Sinclair671a7992017-10-05 14:36:33 -0400388 bool InsertReturn(bool bAddUndo, bool bPaint);
tsepez4cf55152016-11-02 14:37:54 -0700389 bool Backspace(bool bAddUndo, bool bPaint);
390 bool Delete(bool bAddUndo, bool bPaint);
391 bool Clear(bool bAddUndo, bool bPaint);
Ryan Harrison275e2602017-09-18 14:23:18 -0400392 bool InsertText(const WideString& sText,
tsepez4cf55152016-11-02 14:37:54 -0700393 int32_t charset,
394 bool bAddUndo,
395 bool bPaint);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700396 void PaintInsertText(const CPVT_WordPlace& wpOld,
397 const CPVT_WordPlace& wpNew);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700398
Dan Sinclairf528eee2017-02-14 11:52:07 -0500399 inline CFX_PointF VTToEdit(const CFX_PointF& point) const;
400 inline CFX_PointF EditToVT(const CFX_PointF& point) const;
Tom Sepez281a9ea2016-02-26 14:24:28 -0800401 inline CFX_FloatRect VTToEdit(const CFX_FloatRect& rect) const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700402
dsinclairefd5a992016-07-18 10:04:07 -0700403 void Refresh();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700404 void RefreshPushLineRects(const CPVT_WordRange& wr);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700405
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700406 void SetCaret(const CPVT_WordPlace& place);
407 void SetCaretInfo();
408 void SetCaretOrigin();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700409
Lei Zhangae9c5ca2017-08-12 07:15:14 -0700410 void AddEditUndoItem(std::unique_ptr<IFX_Edit_UndoItem> pEditUndoItem);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700411
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700412 private:
dsinclaire35af1e2016-07-13 11:26:20 -0700413 std::unique_ptr<CPDF_VariableText> m_pVT;
Dan Sinclairaee0db02017-09-21 16:53:58 -0400414 UnownedPtr<CPWL_EditCtrl> m_pNotify;
415 UnownedPtr<CPWL_Edit> m_pOperationNotify;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400416 std::unique_ptr<CPWL_EditImpl_Provider> m_pVTProvider;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700417 CPVT_WordPlace m_wpCaret;
418 CPVT_WordPlace m_wpOldCaret;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400419 CPWL_EditImpl_Select m_SelState;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500420 CFX_PointF m_ptScrollPos;
421 CFX_PointF m_ptRefreshScrollPos;
tsepez4cf55152016-11-02 14:37:54 -0700422 bool m_bEnableScroll;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400423 std::unique_ptr<CPWL_EditImpl_Iterator> m_pIterator;
424 CPWL_EditImpl_Refresh m_Refresh;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500425 CFX_PointF m_ptCaret;
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400426 CPWL_EditImpl_Undo m_Undo;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700427 int32_t m_nAlignment;
tsepez4cf55152016-11-02 14:37:54 -0700428 bool m_bNotifyFlag;
429 bool m_bEnableOverflow;
430 bool m_bEnableRefresh;
Tom Sepez281a9ea2016-02-26 14:24:28 -0800431 CFX_FloatRect m_rcOldContent;
tsepez4cf55152016-11-02 14:37:54 -0700432 bool m_bEnableUndo;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700433};
434
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400435class CPWL_EditImpl_Iterator {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700436 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400437 CPWL_EditImpl_Iterator(CPWL_EditImpl* pEdit,
438 CPDF_VariableText::Iterator* pVTIterator);
439 ~CPWL_EditImpl_Iterator();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700440
tsepez4cf55152016-11-02 14:37:54 -0700441 bool NextWord();
442 bool PrevWord();
443 bool GetWord(CPVT_Word& word) const;
444 bool GetLine(CPVT_Line& line) const;
dsinclaire35af1e2016-07-13 11:26:20 -0700445 void SetAt(int32_t nWordIndex);
446 void SetAt(const CPVT_WordPlace& place);
447 const CPVT_WordPlace& GetAt() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700448
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700449 private:
Dan Sinclairaee0db02017-09-21 16:53:58 -0400450 UnownedPtr<CPWL_EditImpl> m_pEdit;
dsinclairc7a73492016-04-05 12:01:42 -0700451 CPDF_VariableText::Iterator* m_pVTIterator;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700452};
453
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400454class CPWL_EditImpl_Provider : public CPDF_VariableText::Provider {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700455 public:
Dan Sinclair6b0158f2017-07-24 09:42:55 -0400456 explicit CPWL_EditImpl_Provider(IPVT_FontMap* pFontMap);
457 ~CPWL_EditImpl_Provider() override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700458
Tom Sepezd0409af2017-05-25 15:53:57 -0700459 IPVT_FontMap* GetFontMap() const;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700460
dsinclairc7a73492016-04-05 12:01:42 -0700461 // CPDF_VariableText::Provider:
npm41d6bbe2016-09-14 11:54:44 -0700462 int32_t GetCharWidth(int32_t nFontIndex, uint16_t word) override;
Lei Zhang5fd907b2015-11-19 22:20:59 -0800463 int32_t GetTypeAscent(int32_t nFontIndex) override;
464 int32_t GetTypeDescent(int32_t nFontIndex) override;
Tom Sepez62a70f92016-03-21 15:00:20 -0700465 int32_t GetWordFontIndex(uint16_t word,
Lei Zhang5fd907b2015-11-19 22:20:59 -0800466 int32_t charset,
467 int32_t nFontIndex) override;
468 int32_t GetDefaultFontIndex() override;
tsepez4cf55152016-11-02 14:37:54 -0700469 bool IsLatinWord(uint16_t word) override;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700470
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700471 private:
dsinclairc7a73492016-04-05 12:01:42 -0700472 IPVT_FontMap* m_pFontMap;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700473};
474
Dan Sinclairc411eb92017-07-25 09:39:30 -0400475#endif // FPDFSDK_PWL_CPWL_EDIT_IMPL_H_