Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Side by Side Diff: fpdfsdk/src/fxedit/fxet_edit.cpp

Issue 1265503005: clang-format all pdfium code. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: sigh Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "../../include/fxedit/fxet_stub.h" 7 #include "../../include/fxedit/fxet_stub.h"
8 #include "../../include/fxedit/fxet_edit.h" 8 #include "../../include/fxedit/fxet_edit.h"
9 9
10 #define FX_EDIT_UNDO_MAXITEM 10000 10 #define FX_EDIT_UNDO_MAXITEM 10000
11 11
12 /* ---------------------------- CFX_Edit_Iterator ---------------------------- * / 12 /* ---------------------------- CFX_Edit_Iterator ----------------------------
13 13 */
14 CFX_Edit_Iterator::CFX_Edit_Iterator(CFX_Edit * pEdit,IPDF_VariableText_Iterator * pVTIterator) : 14
15 m_pEdit(pEdit), 15 CFX_Edit_Iterator::CFX_Edit_Iterator(CFX_Edit* pEdit,
16 m_pVTIterator(pVTIterator) 16 IPDF_VariableText_Iterator* pVTIterator)
17 { 17 : m_pEdit(pEdit), m_pVTIterator(pVTIterator) {}
18 } 18
19 19 CFX_Edit_Iterator::~CFX_Edit_Iterator() {}
20 CFX_Edit_Iterator::~CFX_Edit_Iterator() 20
21 { 21 FX_BOOL CFX_Edit_Iterator::NextWord() {
22 } 22 return m_pVTIterator->NextWord();
23 23 }
24 FX_BOOL CFX_Edit_Iterator::NextWord() 24
25 { 25 FX_BOOL CFX_Edit_Iterator::NextLine() {
26 return m_pVTIterator->NextWord(); 26 return m_pVTIterator->NextLine();
27 } 27 }
28 28
29 FX_BOOL CFX_Edit_Iterator::NextLine() 29 FX_BOOL CFX_Edit_Iterator::NextSection() {
30 { 30 return m_pVTIterator->NextSection();
31 return m_pVTIterator->NextLine(); 31 }
32 } 32
33 33 FX_BOOL CFX_Edit_Iterator::PrevWord() {
34 FX_BOOL CFX_Edit_Iterator::NextSection() 34 return m_pVTIterator->PrevWord();
35 { 35 }
36 return m_pVTIterator->NextSection(); 36
37 } 37 FX_BOOL CFX_Edit_Iterator::PrevLine() {
38 38 return m_pVTIterator->PrevLine();
39 FX_BOOL CFX_Edit_Iterator::PrevWord() 39 }
40 { 40
41 return m_pVTIterator->PrevWord(); 41 FX_BOOL CFX_Edit_Iterator::PrevSection() {
42 } 42 return m_pVTIterator->PrevSection();
43 43 }
44 FX_BOOL CFX_Edit_Iterator::PrevLine() 44
45 { 45 FX_BOOL CFX_Edit_Iterator::GetWord(CPVT_Word& word) const {
46 return m_pVTIterator->PrevLine(); 46 ASSERT(m_pEdit);
47 } 47
48 48 if (m_pVTIterator->GetWord(word)) {
49 FX_BOOL CFX_Edit_Iterator::PrevSection() 49 word.ptWord = m_pEdit->VTToEdit(word.ptWord);
50 { 50 return TRUE;
51 return m_pVTIterator->PrevSection(); 51 }
52 } 52 return FALSE;
53 53 }
54 FX_BOOL CFX_Edit_Iterator::GetWord(CPVT_Word & word) const 54
55 { 55 FX_BOOL CFX_Edit_Iterator::GetLine(CPVT_Line& line) const {
56 ASSERT(m_pEdit); 56 ASSERT(m_pEdit);
57 57
58 if (m_pVTIterator->GetWord(word)) 58 if (m_pVTIterator->GetLine(line)) {
59 { 59 line.ptLine = m_pEdit->VTToEdit(line.ptLine);
60 word.ptWord = m_pEdit->VTToEdit(word.ptWord); 60 return TRUE;
61 return TRUE; 61 }
62 } 62 return FALSE;
63 return FALSE; 63 }
64 } 64
65 65 FX_BOOL CFX_Edit_Iterator::GetSection(CPVT_Section& section) const {
66 FX_BOOL CFX_Edit_Iterator::GetLine(CPVT_Line & line) const 66 ASSERT(m_pEdit);
67 { 67
68 ASSERT(m_pEdit); 68 if (m_pVTIterator->GetSection(section)) {
69 69 section.rcSection = m_pEdit->VTToEdit(section.rcSection);
70 if (m_pVTIterator->GetLine(line)) 70 return TRUE;
71 { 71 }
72 line.ptLine = m_pEdit->VTToEdit(line.ptLine); 72 return FALSE;
73 return TRUE; 73 }
74 } 74
75 return FALSE; 75 void CFX_Edit_Iterator::SetAt(int32_t nWordIndex) {
76 } 76 m_pVTIterator->SetAt(nWordIndex);
77 77 }
78 FX_BOOL CFX_Edit_Iterator::GetSection(CPVT_Section & section) const 78
79 { 79 void CFX_Edit_Iterator::SetAt(const CPVT_WordPlace& place) {
80 ASSERT(m_pEdit); 80 m_pVTIterator->SetAt(place);
81 81 }
82 if (m_pVTIterator->GetSection(section)) 82
83 { 83 const CPVT_WordPlace& CFX_Edit_Iterator::GetAt() const {
84 section.rcSection = m_pEdit->VTToEdit(section.rcSection); 84 return m_pVTIterator->GetAt();
85 return TRUE; 85 }
86 } 86
87 return FALSE; 87 IFX_Edit* CFX_Edit_Iterator::GetEdit() const {
88 } 88 return m_pEdit;
89 89 }
90 void CFX_Edit_Iterator::SetAt(int32_t nWordIndex) 90
91 { 91 /* --------------------------- CFX_Edit_Provider -------------------------------
92 m_pVTIterator->SetAt(nWordIndex); 92 */
93 } 93
94 94 CFX_Edit_Provider::CFX_Edit_Provider(IFX_Edit_FontMap* pFontMap)
95 void CFX_Edit_Iterator::SetAt(const CPVT_WordPlace & place) 95 : m_pFontMap(pFontMap) {
96 { 96 ASSERT(m_pFontMap != NULL);
97 m_pVTIterator->SetAt(place); 97 }
98 } 98
99 99 CFX_Edit_Provider::~CFX_Edit_Provider() {}
100 const CPVT_WordPlace & CFX_Edit_Iterator::GetAt() const 100
101 { 101 IFX_Edit_FontMap* CFX_Edit_Provider::GetFontMap() {
102 return m_pVTIterator->GetAt(); 102 return m_pFontMap;
103 } 103 }
104 104
105 IFX_Edit* CFX_Edit_Iterator::GetEdit() const 105 int32_t CFX_Edit_Provider::GetCharWidth(int32_t nFontIndex,
106 { 106 FX_WORD word,
107 return m_pEdit; 107 int32_t nWordStyle) {
108 } 108 if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) {
109 109 FX_DWORD charcode = word;
110 /* --------------------------- CFX_Edit_Provider ------------------------------- */ 110
111 111 if (pPDFFont->IsUnicodeCompatible())
112 CFX_Edit_Provider::CFX_Edit_Provider(IFX_Edit_FontMap * pFontMap) : m_pFontMap(p FontMap) 112 charcode = pPDFFont->CharCodeFromUnicode(word);
113 { 113 else
114 ASSERT(m_pFontMap != NULL); 114 charcode = m_pFontMap->CharCodeFromUnicode(nFontIndex, word);
115 } 115
116 116 if (charcode != -1)
117 CFX_Edit_Provider::~CFX_Edit_Provider() 117 return pPDFFont->GetCharWidthF(charcode);
118 { 118 }
119 } 119
120 120 return 0;
121 IFX_Edit_FontMap* CFX_Edit_Provider::GetFontMap() 121 }
122 { 122
123 return m_pFontMap; 123 int32_t CFX_Edit_Provider::GetTypeAscent(int32_t nFontIndex) {
124 } 124 if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
125 125 return pPDFFont->GetTypeAscent();
126 int32_t CFX_Edit_Provider::GetCharWidth(int32_t nFontIndex, FX_WORD word, int32_ t nWordStyle) 126
127 { 127 return 0;
128 if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) 128 }
129 { 129
130 FX_DWORD charcode = word; 130 int32_t CFX_Edit_Provider::GetTypeDescent(int32_t nFontIndex) {
131 131 if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex))
132 if (pPDFFont->IsUnicodeCompatible()) 132 return pPDFFont->GetTypeDescent();
133 charcode = pPDFFont->CharCodeFromUnicode(word); 133
134 else 134 return 0;
135 charcode = m_pFontMap->CharCodeFromUnicode(nFontIndex, word); 135 }
136 136
137 if (charcode != -1) 137 int32_t CFX_Edit_Provider::GetWordFontIndex(FX_WORD word,
138 return pPDFFont->GetCharWidthF(charcode); 138 int32_t charset,
139 } 139 int32_t nFontIndex) {
140 140 return m_pFontMap->GetWordFontIndex(word, charset, nFontIndex);
141 return 0; 141 }
142 } 142
143 143 int32_t CFX_Edit_Provider::GetDefaultFontIndex() {
144 int32_t CFX_Edit_Provider::GetTypeAscent(int32_t nFontIndex) 144 return 0;
145 { 145 }
146 if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) 146
147 return pPDFFont->GetTypeAscent(); 147 FX_BOOL CFX_Edit_Provider::IsLatinWord(FX_WORD word) {
148 148 return FX_EDIT_ISLATINWORD(word);
149 return 0; 149 }
150 } 150
151 151 /* --------------------------------- CFX_Edit_Refresh
152 int32_t CFX_Edit_Provider::GetTypeDescent(int32_t nFontIndex) 152 * --------------------------------- */
153 { 153
154 if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) 154 CFX_Edit_Refresh::CFX_Edit_Refresh() {}
155 return pPDFFont->GetTypeDescent(); 155
156 156 CFX_Edit_Refresh::~CFX_Edit_Refresh() {}
157 return 0; 157
158 } 158 void CFX_Edit_Refresh::BeginRefresh() {
159 159 m_RefreshRects.Empty();
160 int32_t CFX_Edit_Provider::GetWordFontIndex(FX_WORD word, int32_t charset, int32 _t nFontIndex) 160 m_OldLineRects = m_NewLineRects;
161 { 161 }
162 return m_pFontMap->GetWordFontIndex(word,charset,nFontIndex); 162
163 } 163 void CFX_Edit_Refresh::Push(const CPVT_WordRange& linerange,
164 164 const CPDF_Rect& rect) {
165 int32_t CFX_Edit_Provider::GetDefaultFontIndex() 165 m_NewLineRects.Add(linerange, rect);
166 { 166 }
167 return 0; 167
168 } 168 void CFX_Edit_Refresh::NoAnalyse() {
169 169 {
170 FX_BOOL CFX_Edit_Provider::IsLatinWord(FX_WORD word) 170 for (int32_t i = 0, sz = m_OldLineRects.GetSize(); i < sz; i++)
171 { 171 if (CFX_Edit_LineRect* pOldRect = m_OldLineRects.GetAt(i))
172 return FX_EDIT_ISLATINWORD(word); 172 m_RefreshRects.Add(pOldRect->m_rcLine);
173 } 173 }
174 174
175 /* --------------------------------- CFX_Edit_Refresh -------------------------- ------- */ 175 {
176 176 for (int32_t i = 0, sz = m_NewLineRects.GetSize(); i < sz; i++)
177 CFX_Edit_Refresh::CFX_Edit_Refresh() 177 if (CFX_Edit_LineRect* pNewRect = m_NewLineRects.GetAt(i))
178 { 178 m_RefreshRects.Add(pNewRect->m_rcLine);
179 } 179 }
180 180 }
181 CFX_Edit_Refresh::~CFX_Edit_Refresh() 181
182 { 182 void CFX_Edit_Refresh::Analyse(int32_t nAlignment) {
183 } 183 FX_BOOL bLineTopChanged = FALSE;
184 184 CPDF_Rect rcResult;
185 void CFX_Edit_Refresh::BeginRefresh() 185 FX_FLOAT fWidthDiff;
186 { 186
187 m_RefreshRects.Empty(); 187 int32_t szMax =
188 m_OldLineRects = m_NewLineRects; 188 FX_EDIT_MAX(m_OldLineRects.GetSize(), m_NewLineRects.GetSize());
189 } 189 int32_t i = 0;
190 190
191 void CFX_Edit_Refresh::Push(const CPVT_WordRange & linerange,const CPDF_Rect & r ect) 191 while (i < szMax) {
192 { 192 CFX_Edit_LineRect* pOldRect = m_OldLineRects.GetAt(i);
193 m_NewLineRects.Add(linerange,rect); 193 CFX_Edit_LineRect* pNewRect = m_NewLineRects.GetAt(i);
194 } 194
195 195 if (pOldRect) {
196 void CFX_Edit_Refresh::NoAnalyse() 196 if (pNewRect) {
197 { 197 if (bLineTopChanged) {
198 { 198 rcResult = pOldRect->m_rcLine;
199 for (int32_t i = 0, sz = m_OldLineRects.GetSize(); i < sz; i++) 199 rcResult.Union(pNewRect->m_rcLine);
200 if (CFX_Edit_LineRect * pOldRect = m_OldLineRects.GetAt(i)) 200 m_RefreshRects.Add(rcResult);
201 m_RefreshRects.Add(pOldRect->m_rcLine); 201 } else {
202 } 202 if (*pNewRect != *pOldRect) {
203 203 if (!pNewRect->IsSameTop(*pOldRect) ||
204 { 204 !pNewRect->IsSameHeight(*pOldRect)) {
205 for (int32_t i = 0, sz = m_NewLineRects.GetSize(); i < sz; i++) 205 bLineTopChanged = TRUE;
206 if (CFX_Edit_LineRect * pNewRect = m_NewLineRects.GetAt(i)) 206 continue;
207 m_RefreshRects.Add(pNewRect->m_rcLine); 207 }
208 } 208
209 } 209 if (nAlignment == 0) {
210 210 if (pNewRect->m_wrLine.BeginPos != pOldRect->m_wrLine.BeginPos) {
211 void CFX_Edit_Refresh::Analyse(int32_t nAlignment) 211 rcResult = pOldRect->m_rcLine;
212 { 212 rcResult.Union(pNewRect->m_rcLine);
213 FX_BOOL bLineTopChanged = FALSE; 213 m_RefreshRects.Add(rcResult);
214 CPDF_Rect rcResult; 214 } else {
215 FX_FLOAT fWidthDiff; 215 if (!pNewRect->IsSameLeft(*pOldRect)) {
216 216 rcResult = pOldRect->m_rcLine;
217 int32_t szMax = FX_EDIT_MAX(m_OldLineRects.GetSize(),m_NewLineRects.GetSize( )); 217 rcResult.Union(pNewRect->m_rcLine);
218 int32_t i = 0; 218 } else {
219 219 fWidthDiff =
220 while (i < szMax) 220 pNewRect->m_rcLine.Width() - pOldRect->m_rcLine.Width();
221 { 221 rcResult = pNewRect->m_rcLine;
222 CFX_Edit_LineRect * pOldRect = m_OldLineRects.GetAt(i); 222 if (fWidthDiff > 0.0f)
223 CFX_Edit_LineRect * pNewRect = m_NewLineRects.GetAt(i); 223 rcResult.left = rcResult.right - fWidthDiff;
224 224 else {
225 if (pOldRect) 225 rcResult.left = rcResult.right;
226 { 226 rcResult.right += (-fWidthDiff);
227 if (pNewRect) 227 }
228 {
229 if (bLineTopChanged)
230 {
231 rcResult = pOldRect->m_rcLine;
232 rcResult.Union(pNewRect->m_rcLine);
233 m_RefreshRects.Add(rcResult);
234 } 228 }
235 else 229 m_RefreshRects.Add(rcResult);
236 { 230 }
237 if (*pNewRect != *pOldRect) 231 } else {
238 { 232 rcResult = pOldRect->m_rcLine;
239 if (!pNewRect->IsSameTop(*pOldRect) || !pNewRect->IsSame Height(*pOldRect)) 233 rcResult.Union(pNewRect->m_rcLine);
240 { 234 m_RefreshRects.Add(rcResult);
241 bLineTopChanged = TRUE;
242 continue;
243 }
244
245 if (nAlignment == 0)
246 {
247 if (pNewRect->m_wrLine.BeginPos != pOldRect->m_wrLin e.BeginPos)
248 {
249 rcResult = pOldRect->m_rcLine;
250 rcResult.Union(pNewRect->m_rcLine);
251 m_RefreshRects.Add(rcResult);
252 }
253 else
254 {
255 if (!pNewRect->IsSameLeft(*pOldRect))
256 {
257 rcResult = pOldRect->m_rcLine;
258 rcResult.Union(pNewRect->m_rcLine);
259 }
260 else
261 {
262 fWidthDiff = pNewRect->m_rcLine.Width() - pO ldRect->m_rcLine.Width();
263 rcResult = pNewRect->m_rcLine;
264 if (fWidthDiff > 0.0f)
265 rcResult.left = rcResult.right - fWidthD iff;
266 else
267 {
268 rcResult.left = rcResult.right;
269 rcResult.right += (-fWidthDiff);
270 }
271 }
272 m_RefreshRects.Add(rcResult);
273 }
274 }
275 else
276 {
277 rcResult = pOldRect->m_rcLine;
278 rcResult.Union(pNewRect->m_rcLine);
279 m_RefreshRects.Add(rcResult);
280 }
281 }
282 else
283 {
284 //don't need to do anything
285 }
286 }
287 } 235 }
288 else 236 } else {
289 { 237 // don't need to do anything
290 m_RefreshRects.Add(pOldRect->m_rcLine); 238 }
291 }
292 } 239 }
293 else 240 } else {
294 { 241 m_RefreshRects.Add(pOldRect->m_rcLine);
295 if (pNewRect) 242 }
296 { 243 } else {
297 m_RefreshRects.Add(pNewRect->m_rcLine); 244 if (pNewRect) {
298 } 245 m_RefreshRects.Add(pNewRect->m_rcLine);
299 else 246 } else {
300 { 247 // error
301 //error 248 }
302 } 249 }
250 i++;
251 }
252 }
253
254 void CFX_Edit_Refresh::AddRefresh(const CPDF_Rect& rect) {
255 m_RefreshRects.Add(rect);
256 }
257
258 const CFX_Edit_RectArray* CFX_Edit_Refresh::GetRefreshRects() const {
259 return &m_RefreshRects;
260 }
261
262 void CFX_Edit_Refresh::EndRefresh() {
263 m_RefreshRects.Empty();
264 }
265
266 /* ------------------------------------- CFX_Edit_Undo
267 * ------------------------------------- */
268
269 CFX_Edit_Undo::CFX_Edit_Undo(int32_t nBufsize)
270 : m_nCurUndoPos(0),
271 m_nBufSize(nBufsize),
272 m_bModified(FALSE),
273 m_bVirgin(TRUE),
274 m_bWorking(FALSE) {}
275
276 CFX_Edit_Undo::~CFX_Edit_Undo() {
277 Reset();
278 }
279
280 FX_BOOL CFX_Edit_Undo::CanUndo() const {
281 return m_nCurUndoPos > 0;
282 }
283
284 void CFX_Edit_Undo::Undo() {
285 m_bWorking = TRUE;
286
287 if (m_nCurUndoPos > 0) {
288 IFX_Edit_UndoItem* pItem = m_UndoItemStack.GetAt(m_nCurUndoPos - 1);
289 ASSERT(pItem != NULL);
290
291 pItem->Undo();
292
293 m_nCurUndoPos--;
294 m_bModified = (m_nCurUndoPos != 0);
295 }
296
297 m_bWorking = FALSE;
298 }
299
300 FX_BOOL CFX_Edit_Undo::CanRedo() const {
301 return m_nCurUndoPos < m_UndoItemStack.GetSize();
302 }
303
304 void CFX_Edit_Undo::Redo() {
305 m_bWorking = TRUE;
306
307 int32_t nStackSize = m_UndoItemStack.GetSize();
308
309 if (m_nCurUndoPos < nStackSize) {
310 IFX_Edit_UndoItem* pItem = m_UndoItemStack.GetAt(m_nCurUndoPos);
311 ASSERT(pItem != NULL);
312
313 pItem->Redo();
314
315 m_nCurUndoPos++;
316 m_bModified = (m_nCurUndoPos != 0);
317 }
318
319 m_bWorking = FALSE;
320 }
321
322 FX_BOOL CFX_Edit_Undo::IsWorking() const {
323 return m_bWorking;
324 }
325
326 void CFX_Edit_Undo::AddItem(IFX_Edit_UndoItem* pItem) {
327 ASSERT(!m_bWorking);
328 ASSERT(pItem != NULL);
329 ASSERT(m_nBufSize > 1);
330
331 if (m_nCurUndoPos < m_UndoItemStack.GetSize())
332 RemoveTails();
333
334 if (m_UndoItemStack.GetSize() >= m_nBufSize) {
335 RemoveHeads();
336 m_bVirgin = FALSE;
337 }
338
339 m_UndoItemStack.Add(pItem);
340 m_nCurUndoPos = m_UndoItemStack.GetSize();
341
342 m_bModified = (m_nCurUndoPos != 0);
343 }
344
345 FX_BOOL CFX_Edit_Undo::IsModified() const {
346 return m_bVirgin ? m_bModified : TRUE;
347 }
348
349 IFX_Edit_UndoItem* CFX_Edit_Undo::GetItem(int32_t nIndex) {
350 if (nIndex >= 0 && nIndex < m_UndoItemStack.GetSize())
351 return m_UndoItemStack.GetAt(nIndex);
352
353 return NULL;
354 }
355
356 void CFX_Edit_Undo::RemoveHeads() {
357 ASSERT(m_UndoItemStack.GetSize() > 1);
358
359 delete m_UndoItemStack.GetAt(0);
360 m_UndoItemStack.RemoveAt(0);
361 }
362
363 void CFX_Edit_Undo::RemoveTails() {
364 for (int32_t i = m_UndoItemStack.GetSize() - 1; i >= m_nCurUndoPos; i--) {
365 delete m_UndoItemStack.GetAt(i);
366 m_UndoItemStack.RemoveAt(i);
367 }
368 }
369
370 void CFX_Edit_Undo::Reset() {
371 for (int32_t i = 0, sz = m_UndoItemStack.GetSize(); i < sz; i++) {
372 delete m_UndoItemStack.GetAt(i);
373 }
374 m_nCurUndoPos = 0;
375 m_UndoItemStack.RemoveAll();
376 }
377
378 /* -------------------------------- CFX_Edit_GroupUndoItem
379 * -------------------------------- */
380
381 CFX_Edit_GroupUndoItem::CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle)
382 : m_sTitle(sTitle) {}
383
384 CFX_Edit_GroupUndoItem::~CFX_Edit_GroupUndoItem() {
385 for (int i = 0, sz = m_Items.GetSize(); i < sz; i++) {
386 delete m_Items[i];
387 }
388
389 m_Items.RemoveAll();
390 }
391
392 void CFX_Edit_GroupUndoItem::AddUndoItem(CFX_Edit_UndoItem* pUndoItem) {
393 ASSERT(pUndoItem != NULL);
394
395 pUndoItem->SetFirst(FALSE);
396 pUndoItem->SetLast(FALSE);
397
398 m_Items.Add(pUndoItem);
399
400 if (m_sTitle.IsEmpty())
401 m_sTitle = pUndoItem->GetUndoTitle();
402 }
403
404 void CFX_Edit_GroupUndoItem::UpdateItems() {
405 if (m_Items.GetSize() > 0) {
406 CFX_Edit_UndoItem* pFirstItem = m_Items[0];
407 ASSERT(pFirstItem != NULL);
408 pFirstItem->SetFirst(TRUE);
409
410 CFX_Edit_UndoItem* pLastItem = m_Items[m_Items.GetSize() - 1];
411 ASSERT(pLastItem != NULL);
412 pLastItem->SetLast(TRUE);
413 }
414 }
415
416 void CFX_Edit_GroupUndoItem::Undo() {
417 for (int i = m_Items.GetSize() - 1; i >= 0; i--) {
418 CFX_Edit_UndoItem* pUndoItem = m_Items[i];
419 ASSERT(pUndoItem != NULL);
420
421 pUndoItem->Undo();
422 }
423 }
424
425 void CFX_Edit_GroupUndoItem::Redo() {
426 for (int i = 0, sz = m_Items.GetSize(); i < sz; i++) {
427 CFX_Edit_UndoItem* pUndoItem = m_Items[i];
428 ASSERT(pUndoItem != NULL);
429
430 pUndoItem->Redo();
431 }
432 }
433
434 CFX_WideString CFX_Edit_GroupUndoItem::GetUndoTitle() {
435 return m_sTitle;
436 }
437
438 /* ------------------------------------- CFX_Edit_UndoItem derived classes
439 * ------------------------------------- */
440
441 CFXEU_InsertWord::CFXEU_InsertWord(CFX_Edit* pEdit,
442 const CPVT_WordPlace& wpOldPlace,
443 const CPVT_WordPlace& wpNewPlace,
444 FX_WORD word,
445 int32_t charset,
446 const CPVT_WordProps* pWordProps)
447 : m_pEdit(pEdit),
448 m_wpOld(wpOldPlace),
449 m_wpNew(wpNewPlace),
450 m_Word(word),
451 m_nCharset(charset),
452 m_WordProps() {
453 if (pWordProps)
454 m_WordProps = *pWordProps;
455 }
456
457 CFXEU_InsertWord::~CFXEU_InsertWord() {}
458
459 void CFXEU_InsertWord::Redo() {
460 if (m_pEdit) {
461 m_pEdit->SelectNone();
462 m_pEdit->SetCaret(m_wpOld);
463 m_pEdit->InsertWord(m_Word, m_nCharset, &m_WordProps, FALSE, TRUE);
464 }
465 }
466
467 void CFXEU_InsertWord::Undo() {
468 if (m_pEdit) {
469 m_pEdit->SelectNone();
470 m_pEdit->SetCaret(m_wpNew);
471 m_pEdit->Backspace(FALSE, TRUE);
472 }
473 }
474
475 /* -------------------------------------------------------------------------- */
476
477 CFXEU_InsertReturn::CFXEU_InsertReturn(CFX_Edit* pEdit,
478 const CPVT_WordPlace& wpOldPlace,
479 const CPVT_WordPlace& wpNewPlace,
480 const CPVT_SecProps* pSecProps,
481 const CPVT_WordProps* pWordProps)
482 : m_pEdit(pEdit),
483 m_wpOld(wpOldPlace),
484 m_wpNew(wpNewPlace),
485 m_SecProps(),
486 m_WordProps() {
487 if (pSecProps)
488 m_SecProps = *pSecProps;
489 if (pWordProps)
490 m_WordProps = *pWordProps;
491 }
492
493 CFXEU_InsertReturn::~CFXEU_InsertReturn() {}
494
495 void CFXEU_InsertReturn::Redo() {
496 if (m_pEdit) {
497 m_pEdit->SelectNone();
498 m_pEdit->SetCaret(m_wpOld);
499 m_pEdit->InsertReturn(&m_SecProps, &m_WordProps, FALSE, TRUE);
500 }
501 }
502
503 void CFXEU_InsertReturn::Undo() {
504 if (m_pEdit) {
505 m_pEdit->SelectNone();
506 m_pEdit->SetCaret(m_wpNew);
507 m_pEdit->Backspace(FALSE, TRUE);
508 }
509 }
510
511 /* -------------------------------------------------------------------------- */
512 // CFXEU_Backspace
513
514 CFXEU_Backspace::CFXEU_Backspace(CFX_Edit* pEdit,
515 const CPVT_WordPlace& wpOldPlace,
516 const CPVT_WordPlace& wpNewPlace,
517 FX_WORD word,
518 int32_t charset,
519 const CPVT_SecProps& SecProps,
520 const CPVT_WordProps& WordProps)
521 : m_pEdit(pEdit),
522 m_wpOld(wpOldPlace),
523 m_wpNew(wpNewPlace),
524 m_Word(word),
525 m_nCharset(charset),
526 m_SecProps(SecProps),
527 m_WordProps(WordProps) {}
528
529 CFXEU_Backspace::~CFXEU_Backspace() {}
530
531 void CFXEU_Backspace::Redo() {
532 if (m_pEdit) {
533 m_pEdit->SelectNone();
534 m_pEdit->SetCaret(m_wpOld);
535 m_pEdit->Backspace(FALSE, TRUE);
536 }
537 }
538
539 void CFXEU_Backspace::Undo() {
540 if (m_pEdit) {
541 m_pEdit->SelectNone();
542 m_pEdit->SetCaret(m_wpNew);
543 if (m_wpNew.SecCmp(m_wpOld) != 0) {
544 m_pEdit->InsertReturn(&m_SecProps, &m_WordProps, FALSE, TRUE);
545 } else {
546 m_pEdit->InsertWord(m_Word, m_nCharset, &m_WordProps, FALSE, TRUE);
547 }
548 }
549 }
550
551 /* -------------------------------------------------------------------------- */
552 // CFXEU_Delete
553
554 CFXEU_Delete::CFXEU_Delete(CFX_Edit* pEdit,
555 const CPVT_WordPlace& wpOldPlace,
556 const CPVT_WordPlace& wpNewPlace,
557 FX_WORD word,
558 int32_t charset,
559 const CPVT_SecProps& SecProps,
560 const CPVT_WordProps& WordProps,
561 FX_BOOL bSecEnd)
562 : m_pEdit(pEdit),
563 m_wpOld(wpOldPlace),
564 m_wpNew(wpNewPlace),
565 m_Word(word),
566 m_nCharset(charset),
567 m_SecProps(SecProps),
568 m_WordProps(WordProps),
569 m_bSecEnd(bSecEnd) {}
570
571 CFXEU_Delete::~CFXEU_Delete() {}
572
573 void CFXEU_Delete::Redo() {
574 if (m_pEdit) {
575 m_pEdit->SelectNone();
576 m_pEdit->SetCaret(m_wpOld);
577 m_pEdit->Delete(FALSE, TRUE);
578 }
579 }
580
581 void CFXEU_Delete::Undo() {
582 if (m_pEdit) {
583 m_pEdit->SelectNone();
584 m_pEdit->SetCaret(m_wpNew);
585 if (m_bSecEnd) {
586 m_pEdit->InsertReturn(&m_SecProps, &m_WordProps, FALSE, TRUE);
587 } else {
588 m_pEdit->InsertWord(m_Word, m_nCharset, &m_WordProps, FALSE, TRUE);
589 }
590 }
591 }
592
593 /* -------------------------------------------------------------------------- */
594 // CFXEU_Clear
595
596 CFXEU_Clear::CFXEU_Clear(CFX_Edit* pEdit,
597 const CPVT_WordRange& wrSel,
598 const CFX_WideString& swText)
599 : m_pEdit(pEdit), m_wrSel(wrSel), m_swText(swText) {}
600
601 CFXEU_Clear::~CFXEU_Clear() {}
602
603 void CFXEU_Clear::Redo() {
604 if (m_pEdit) {
605 m_pEdit->SelectNone();
606 m_pEdit->SetSel(m_wrSel.BeginPos, m_wrSel.EndPos);
607 m_pEdit->Clear(FALSE, TRUE);
608 }
609 }
610
611 void CFXEU_Clear::Undo() {
612 if (m_pEdit) {
613 m_pEdit->SelectNone();
614 m_pEdit->SetCaret(m_wrSel.BeginPos);
615 m_pEdit->InsertText(m_swText.c_str(), DEFAULT_CHARSET, NULL, NULL, FALSE,
616 TRUE);
617 m_pEdit->SetSel(m_wrSel.BeginPos, m_wrSel.EndPos);
618 }
619 }
620
621 /* -------------------------------------------------------------------------- */
622 // CFXEU_ClearRich
623
624 CFXEU_ClearRich::CFXEU_ClearRich(CFX_Edit* pEdit,
625 const CPVT_WordPlace& wpOldPlace,
626 const CPVT_WordPlace& wpNewPlace,
627 const CPVT_WordRange& wrSel,
628 FX_WORD word,
629 int32_t charset,
630 const CPVT_SecProps& SecProps,
631 const CPVT_WordProps& WordProps)
632 : m_pEdit(pEdit),
633 m_wpOld(wpOldPlace),
634 m_wpNew(wpNewPlace),
635 m_wrSel(wrSel),
636 m_Word(word),
637 m_nCharset(charset),
638 m_SecProps(SecProps),
639 m_WordProps(WordProps) {}
640
641 CFXEU_ClearRich::~CFXEU_ClearRich() {}
642
643 void CFXEU_ClearRich::Redo() {
644 if (m_pEdit && IsLast()) {
645 m_pEdit->SelectNone();
646 m_pEdit->SetSel(m_wrSel.BeginPos, m_wrSel.EndPos);
647 m_pEdit->Clear(FALSE, TRUE);
648 }
649 }
650
651 void CFXEU_ClearRich::Undo() {
652 if (m_pEdit) {
653 m_pEdit->SelectNone();
654 m_pEdit->SetCaret(m_wpOld);
655 if (m_wpNew.SecCmp(m_wpOld) != 0) {
656 m_pEdit->InsertReturn(&m_SecProps, &m_WordProps, FALSE, FALSE);
657 } else {
658 m_pEdit->InsertWord(m_Word, m_nCharset, &m_WordProps, FALSE, FALSE);
659 }
660
661 if (IsFirst()) {
662 m_pEdit->PaintInsertText(m_wrSel.BeginPos, m_wrSel.EndPos);
663 m_pEdit->SetSel(m_wrSel.BeginPos, m_wrSel.EndPos);
664 }
665 }
666 }
667 /* -------------------------------------------------------------------------- */
668 // CFXEU_InsertText
669
670 CFXEU_InsertText::CFXEU_InsertText(CFX_Edit* pEdit,
671 const CPVT_WordPlace& wpOldPlace,
672 const CPVT_WordPlace& wpNewPlace,
673 const CFX_WideString& swText,
674 int32_t charset,
675 const CPVT_SecProps* pSecProps,
676 const CPVT_WordProps* pWordProps)
677 : m_pEdit(pEdit),
678 m_wpOld(wpOldPlace),
679 m_wpNew(wpNewPlace),
680 m_swText(swText),
681 m_nCharset(charset),
682 m_SecProps(),
683 m_WordProps() {
684 if (pSecProps)
685 m_SecProps = *pSecProps;
686 if (pWordProps)
687 m_WordProps = *pWordProps;
688 }
689
690 CFXEU_InsertText::~CFXEU_InsertText() {}
691
692 void CFXEU_InsertText::Redo() {
693 if (m_pEdit && IsLast()) {
694 m_pEdit->SelectNone();
695 m_pEdit->SetCaret(m_wpOld);
696 m_pEdit->InsertText(m_swText.c_str(), m_nCharset, &m_SecProps, &m_WordProps,
697 FALSE, TRUE);
698 }
699 }
700
701 void CFXEU_InsertText::Undo() {
702 if (m_pEdit) {
703 m_pEdit->SelectNone();
704 m_pEdit->SetSel(m_wpOld, m_wpNew);
705 m_pEdit->Clear(FALSE, TRUE);
706 }
707 }
708
709 /* -------------------------------------------------------------------------- */
710
711 CFXEU_SetSecProps::CFXEU_SetSecProps(CFX_Edit* pEdit,
712 const CPVT_WordPlace& place,
713 EDIT_PROPS_E ep,
714 const CPVT_SecProps& oldsecprops,
715 const CPVT_WordProps& oldwordprops,
716 const CPVT_SecProps& newsecprops,
717 const CPVT_WordProps& newwordprops,
718 const CPVT_WordRange& range)
719 : m_pEdit(pEdit),
720 m_wpPlace(place),
721 m_wrPlace(range),
722 m_eProps(ep),
723 m_OldSecProps(oldsecprops),
724 m_NewSecProps(newsecprops),
725 m_OldWordProps(oldwordprops),
726 m_NewWordProps(newwordprops) {}
727
728 CFXEU_SetSecProps::~CFXEU_SetSecProps() {}
729
730 void CFXEU_SetSecProps::Redo() {
731 if (m_pEdit) {
732 m_pEdit->SetSecProps(m_eProps, m_wpPlace, &m_NewSecProps, &m_NewWordProps,
733 m_wrPlace, FALSE);
734 if (IsLast()) {
735 m_pEdit->SelectNone();
736 m_pEdit->PaintSetProps(m_eProps, m_wrPlace);
737 m_pEdit->SetSel(m_wrPlace.BeginPos, m_wrPlace.EndPos);
738 }
739 }
740 }
741
742 void CFXEU_SetSecProps::Undo() {
743 if (m_pEdit) {
744 m_pEdit->SetSecProps(m_eProps, m_wpPlace, &m_OldSecProps, &m_OldWordProps,
745 m_wrPlace, FALSE);
746 if (IsFirst()) {
747 m_pEdit->SelectNone();
748 m_pEdit->PaintSetProps(m_eProps, m_wrPlace);
749 m_pEdit->SetSel(m_wrPlace.BeginPos, m_wrPlace.EndPos);
750 }
751 }
752 }
753
754 /* -------------------------------------------------------------------------- */
755
756 CFXEU_SetWordProps::CFXEU_SetWordProps(CFX_Edit* pEdit,
757 const CPVT_WordPlace& place,
758 EDIT_PROPS_E ep,
759 const CPVT_WordProps& oldprops,
760 const CPVT_WordProps& newprops,
761 const CPVT_WordRange& range)
762 : m_pEdit(pEdit),
763 m_wpPlace(place),
764 m_wrPlace(range),
765 m_eProps(ep),
766 m_OldWordProps(oldprops),
767 m_NewWordProps(newprops) {}
768
769 CFXEU_SetWordProps::~CFXEU_SetWordProps() {}
770
771 void CFXEU_SetWordProps::Redo() {
772 if (m_pEdit) {
773 m_pEdit->SetWordProps(m_eProps, m_wpPlace, &m_NewWordProps, m_wrPlace,
774 FALSE);
775 if (IsLast()) {
776 m_pEdit->SelectNone();
777 m_pEdit->PaintSetProps(m_eProps, m_wrPlace);
778 m_pEdit->SetSel(m_wrPlace.BeginPos, m_wrPlace.EndPos);
779 }
780 }
781 }
782
783 void CFXEU_SetWordProps::Undo() {
784 if (m_pEdit) {
785 m_pEdit->SetWordProps(m_eProps, m_wpPlace, &m_OldWordProps, m_wrPlace,
786 FALSE);
787 if (IsFirst()) {
788 m_pEdit->SelectNone();
789 m_pEdit->PaintSetProps(m_eProps, m_wrPlace);
790 m_pEdit->SetSel(m_wrPlace.BeginPos, m_wrPlace.EndPos);
791 }
792 }
793 }
794
795 /* ------------------------------------- CFX_Edit
796 * ------------------------------------- */
797
798 CFX_Edit::CFX_Edit(IPDF_VariableText* pVT)
799 : m_pVT(pVT),
800 m_pNotify(NULL),
801 m_pOprNotify(NULL),
802 m_pVTProvide(NULL),
803 m_wpCaret(-1, -1, -1),
804 m_wpOldCaret(-1, -1, -1),
805 m_SelState(),
806 m_ptScrollPos(0, 0),
807 m_ptRefreshScrollPos(0, 0),
808 m_bEnableScroll(FALSE),
809 m_pIterator(NULL),
810 m_ptCaret(0.0f, 0.0f),
811 m_Undo(FX_EDIT_UNDO_MAXITEM),
812 m_nAlignment(0),
813 m_bNotifyFlag(FALSE),
814 m_bEnableOverflow(FALSE),
815 m_bEnableRefresh(TRUE),
816 m_rcOldContent(0.0f, 0.0f, 0.0f, 0.0f),
817 m_bEnableUndo(TRUE),
818 m_bNotify(TRUE),
819 m_bOprNotify(FALSE),
820 m_pGroupUndoItem(NULL) {
821 ASSERT(pVT != NULL);
822 }
823
824 CFX_Edit::~CFX_Edit() {
825 delete m_pVTProvide;
826 m_pVTProvide = NULL;
827 delete m_pIterator;
828 m_pIterator = NULL;
829 ASSERT(m_pGroupUndoItem == NULL);
830 }
831
832 // public methods
833
834 void CFX_Edit::Initialize() {
835 m_pVT->Initialize();
836 SetCaret(m_pVT->GetBeginWordPlace());
837 SetCaretOrigin();
838 }
839
840 void CFX_Edit::SetFontMap(IFX_Edit_FontMap* pFontMap) {
841 delete m_pVTProvide;
842 m_pVT->SetProvider(m_pVTProvide = new CFX_Edit_Provider(pFontMap));
843 }
844
845 void CFX_Edit::SetVTProvider(IPDF_VariableText_Provider* pProvider) {
846 m_pVT->SetProvider(pProvider);
847 }
848
849 void CFX_Edit::SetNotify(IFX_Edit_Notify* pNotify) {
850 m_pNotify = pNotify;
851 }
852
853 void CFX_Edit::SetOprNotify(IFX_Edit_OprNotify* pOprNotify) {
854 m_pOprNotify = pOprNotify;
855 }
856
857 IFX_Edit_Iterator* CFX_Edit::GetIterator() {
858 if (!m_pIterator)
859 m_pIterator = new CFX_Edit_Iterator(this, m_pVT->GetIterator());
860
861 return m_pIterator;
862 }
863
864 IPDF_VariableText* CFX_Edit::GetVariableText() {
865 return m_pVT;
866 }
867
868 IFX_Edit_FontMap* CFX_Edit::GetFontMap() {
869 if (m_pVTProvide)
870 return m_pVTProvide->GetFontMap();
871
872 return NULL;
873 }
874
875 void CFX_Edit::SetPlateRect(const CPDF_Rect& rect, FX_BOOL bPaint /* = TRUE*/) {
876 m_pVT->SetPlateRect(rect);
877 m_ptScrollPos = CPDF_Point(rect.left, rect.top);
878 if (bPaint)
879 Paint();
880 }
881
882 void CFX_Edit::SetAlignmentH(int32_t nFormat /* =0 */,
883 FX_BOOL bPaint /* = TRUE*/) {
884 m_pVT->SetAlignment(nFormat);
885 if (bPaint)
886 Paint();
887 }
888
889 void CFX_Edit::SetAlignmentV(int32_t nFormat /* =0 */,
890 FX_BOOL bPaint /* = TRUE*/) {
891 m_nAlignment = nFormat;
892 if (bPaint)
893 Paint();
894 }
895
896 void CFX_Edit::SetPasswordChar(FX_WORD wSubWord /* ='*' */,
897 FX_BOOL bPaint /* = TRUE*/) {
898 m_pVT->SetPasswordChar(wSubWord);
899 if (bPaint)
900 Paint();
901 }
902
903 void CFX_Edit::SetLimitChar(int32_t nLimitChar /* =0 */,
904 FX_BOOL bPaint /* = TRUE*/) {
905 m_pVT->SetLimitChar(nLimitChar);
906 if (bPaint)
907 Paint();
908 }
909
910 void CFX_Edit::SetCharArray(int32_t nCharArray /* =0 */,
911 FX_BOOL bPaint /* = TRUE*/) {
912 m_pVT->SetCharArray(nCharArray);
913 if (bPaint)
914 Paint();
915 }
916
917 void CFX_Edit::SetCharSpace(FX_FLOAT fCharSpace /* =0.0f */,
918 FX_BOOL bPaint /* = TRUE*/) {
919 m_pVT->SetCharSpace(fCharSpace);
920 if (bPaint)
921 Paint();
922 }
923
924 void CFX_Edit::SetHorzScale(int32_t nHorzScale /* =100 */,
925 FX_BOOL bPaint /* = TRUE*/) {
926 m_pVT->SetHorzScale(nHorzScale);
927 if (bPaint)
928 Paint();
929 }
930
931 void CFX_Edit::SetMultiLine(FX_BOOL bMultiLine /* =TRUE */,
932 FX_BOOL bPaint /* = TRUE*/) {
933 m_pVT->SetMultiLine(bMultiLine);
934 if (bPaint)
935 Paint();
936 }
937
938 void CFX_Edit::SetAutoReturn(FX_BOOL bAuto /* =TRUE */,
939 FX_BOOL bPaint /* = TRUE*/) {
940 m_pVT->SetAutoReturn(bAuto);
941 if (bPaint)
942 Paint();
943 }
944
945 void CFX_Edit::SetLineLeading(FX_FLOAT fLineLeading /* =TRUE */,
946 FX_BOOL bPaint /* = TRUE*/) {
947 m_pVT->SetLineLeading(fLineLeading);
948 if (bPaint)
949 Paint();
950 }
951
952 void CFX_Edit::SetAutoFontSize(FX_BOOL bAuto /* =TRUE */,
953 FX_BOOL bPaint /* = TRUE*/) {
954 m_pVT->SetAutoFontSize(bAuto);
955 if (bPaint)
956 Paint();
957 }
958
959 void CFX_Edit::SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint /* = TRUE*/) {
960 m_pVT->SetFontSize(fFontSize);
961 if (bPaint)
962 Paint();
963 }
964
965 void CFX_Edit::SetAutoScroll(FX_BOOL bAuto /* =TRUE */,
966 FX_BOOL bPaint /* = TRUE*/) {
967 m_bEnableScroll = bAuto;
968 if (bPaint)
969 Paint();
970 }
971
972 void CFX_Edit::SetTextOverflow(FX_BOOL bAllowed /*= FALSE*/,
973 FX_BOOL bPaint /* = TRUE*/) {
974 m_bEnableOverflow = bAllowed;
975 if (bPaint)
976 Paint();
977 }
978
979 void CFX_Edit::SetSel(int32_t nStartChar, int32_t nEndChar) {
980 if (m_pVT->IsValid()) {
981 if (nStartChar == 0 && nEndChar < 0) {
982 SelectAll();
983 } else if (nStartChar < 0) {
984 SelectNone();
985 } else {
986 if (nStartChar < nEndChar) {
987 SetSel(m_pVT->WordIndexToWordPlace(nStartChar),
988 m_pVT->WordIndexToWordPlace(nEndChar));
989 } else {
990 SetSel(m_pVT->WordIndexToWordPlace(nEndChar),
991 m_pVT->WordIndexToWordPlace(nStartChar));
992 }
993 }
994 }
995 }
996
997 void CFX_Edit::SetSel(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) {
998 if (m_pVT->IsValid()) {
999 SelectNone();
1000
1001 m_SelState.Set(begin, end);
1002
1003 SetCaret(m_SelState.EndPos);
1004
1005 if (m_SelState.IsExist()) {
1006 ScrollToCaret();
1007 CPVT_WordRange wr(m_SelState.BeginPos, m_SelState.EndPos);
1008 Refresh(RP_OPTIONAL, &wr);
1009 SetCaretInfo();
1010 } else {
1011 ScrollToCaret();
1012 SetCaretInfo();
1013 }
1014 }
1015 }
1016
1017 void CFX_Edit::GetSel(int32_t& nStartChar, int32_t& nEndChar) const {
1018 nStartChar = -1;
1019 nEndChar = -1;
1020
1021 if (m_pVT->IsValid()) {
1022 if (m_SelState.IsExist()) {
1023 if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) < 0) {
1024 nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos);
1025 nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos);
1026 } else {
1027 nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos);
1028 nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos);
1029 }
1030 } else {
1031 nStartChar = m_pVT->WordPlaceToWordIndex(m_wpCaret);
1032 nEndChar = m_pVT->WordPlaceToWordIndex(m_wpCaret);
1033 }
1034 }
1035 }
1036
1037 int32_t CFX_Edit::GetCaret() const {
1038 if (m_pVT->IsValid())
1039 return m_pVT->WordPlaceToWordIndex(m_wpCaret);
1040
1041 return -1;
1042 }
1043
1044 CPVT_WordPlace CFX_Edit::GetCaretWordPlace() const {
1045 return m_wpCaret;
1046 }
1047
1048 CFX_WideString CFX_Edit::GetText() const {
1049 CFX_WideString swRet;
1050
1051 if (m_pVT->IsValid()) {
1052 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
1053 FX_BOOL bRich = m_pVT->IsRichText();
1054
1055 pIterator->SetAt(0);
1056
1057 CPVT_Word wordinfo;
1058 CPVT_WordPlace oldplace = pIterator->GetAt();
1059 while (pIterator->NextWord()) {
1060 CPVT_WordPlace place = pIterator->GetAt();
1061
1062 if (pIterator->GetWord(wordinfo)) {
1063 if (bRich) {
1064 swRet += wordinfo.Word;
1065 } else {
1066 swRet += wordinfo.Word;
1067 }
303 } 1068 }
304 i++; 1069
305 } 1070 if (oldplace.SecCmp(place) != 0) {
306 } 1071 swRet += 0x0D;
307 1072 swRet += 0x0A;
308 void CFX_Edit_Refresh::AddRefresh(const CPDF_Rect & rect)
309 {
310 m_RefreshRects.Add(rect);
311 }
312
313 const CFX_Edit_RectArray * CFX_Edit_Refresh::GetRefreshRects() const
314 {
315 return &m_RefreshRects;
316 }
317
318 void CFX_Edit_Refresh::EndRefresh()
319 {
320 m_RefreshRects.Empty();
321 }
322
323 /* ------------------------------------- CFX_Edit_Undo ------------------------- ------------ */
324
325 CFX_Edit_Undo::CFX_Edit_Undo(int32_t nBufsize) : m_nCurUndoPos(0),
326 m_nBufSize(nBufsize),
327 m_bModified(FALSE),
328 m_bVirgin(TRUE),
329 m_bWorking(FALSE)
330 {
331 }
332
333 CFX_Edit_Undo::~CFX_Edit_Undo()
334 {
335 Reset();
336 }
337
338 FX_BOOL CFX_Edit_Undo::CanUndo() const
339 {
340 return m_nCurUndoPos > 0;
341 }
342
343 void CFX_Edit_Undo::Undo()
344 {
345 m_bWorking = TRUE;
346
347 if (m_nCurUndoPos > 0)
348 {
349 IFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(m_nCurUndoPos-1);
350 ASSERT(pItem != NULL);
351
352 pItem->Undo();
353
354 m_nCurUndoPos--;
355 m_bModified = (m_nCurUndoPos != 0);
356 }
357
358 m_bWorking = FALSE;
359 }
360
361 FX_BOOL CFX_Edit_Undo::CanRedo() const
362 {
363 return m_nCurUndoPos < m_UndoItemStack.GetSize();
364 }
365
366 void CFX_Edit_Undo::Redo()
367 {
368 m_bWorking = TRUE;
369
370 int32_t nStackSize = m_UndoItemStack.GetSize();
371
372 if (m_nCurUndoPos < nStackSize)
373 {
374 IFX_Edit_UndoItem * pItem = m_UndoItemStack.GetAt(m_nCurUndoPos);
375 ASSERT(pItem != NULL);
376
377 pItem->Redo();
378
379 m_nCurUndoPos++;
380 m_bModified = (m_nCurUndoPos != 0);
381 }
382
383 m_bWorking = FALSE;
384 }
385
386 FX_BOOL CFX_Edit_Undo::IsWorking() const
387 {
388 return m_bWorking;
389 }
390
391 void CFX_Edit_Undo::AddItem(IFX_Edit_UndoItem* pItem)
392 {
393 ASSERT(!m_bWorking);
394 ASSERT(pItem != NULL);
395 ASSERT(m_nBufSize > 1);
396
397 if (m_nCurUndoPos < m_UndoItemStack.GetSize())
398 RemoveTails();
399
400 if (m_UndoItemStack.GetSize() >= m_nBufSize)
401 {
402 RemoveHeads();
403 m_bVirgin = FALSE;
404 }
405
406 m_UndoItemStack.Add(pItem);
407 m_nCurUndoPos = m_UndoItemStack.GetSize();
408
409 m_bModified = (m_nCurUndoPos != 0);
410 }
411
412 FX_BOOL CFX_Edit_Undo::IsModified() const
413 {
414 return m_bVirgin ? m_bModified : TRUE;
415 }
416
417 IFX_Edit_UndoItem* CFX_Edit_Undo::GetItem(int32_t nIndex)
418 {
419 if (nIndex>=0 && nIndex < m_UndoItemStack.GetSize())
420 return m_UndoItemStack.GetAt(nIndex);
421
422 return NULL;
423 }
424
425 void CFX_Edit_Undo::RemoveHeads()
426 {
427 ASSERT(m_UndoItemStack.GetSize() > 1);
428
429 delete m_UndoItemStack.GetAt(0);
430 m_UndoItemStack.RemoveAt(0);
431 }
432
433 void CFX_Edit_Undo::RemoveTails()
434 {
435 for (int32_t i = m_UndoItemStack.GetSize()-1; i >= m_nCurUndoPos; i--)
436 {
437 delete m_UndoItemStack.GetAt(i);
438 m_UndoItemStack.RemoveAt(i);
439 }
440 }
441
442 void CFX_Edit_Undo::Reset()
443 {
444 for (int32_t i=0, sz=m_UndoItemStack.GetSize(); i < sz; i++)
445 {
446 delete m_UndoItemStack.GetAt(i);
447 }
448 m_nCurUndoPos = 0;
449 m_UndoItemStack.RemoveAll();
450 }
451
452 /* -------------------------------- CFX_Edit_GroupUndoItem --------------------- ----------- */
453
454 CFX_Edit_GroupUndoItem::CFX_Edit_GroupUndoItem(const CFX_WideString& sTitle) : m _sTitle(sTitle)
455 {
456 }
457
458 CFX_Edit_GroupUndoItem::~CFX_Edit_GroupUndoItem()
459 {
460 for (int i=0,sz=m_Items.GetSize(); i<sz; i++)
461 {
462 delete m_Items[i];
463 }
464
465 m_Items.RemoveAll();
466 }
467
468 void CFX_Edit_GroupUndoItem::AddUndoItem(CFX_Edit_UndoItem* pUndoItem)
469 {
470 ASSERT(pUndoItem != NULL);
471
472 pUndoItem->SetFirst(FALSE);
473 pUndoItem->SetLast(FALSE);
474
475 m_Items.Add(pUndoItem);
476
477 if (m_sTitle.IsEmpty())
478 m_sTitle = pUndoItem->GetUndoTitle();
479 }
480
481 void CFX_Edit_GroupUndoItem::UpdateItems()
482 {
483 if (m_Items.GetSize() > 0)
484 {
485 CFX_Edit_UndoItem* pFirstItem = m_Items[0];
486 ASSERT(pFirstItem != NULL);
487 pFirstItem->SetFirst(TRUE);
488
489 CFX_Edit_UndoItem* pLastItem = m_Items[m_Items.GetSize() - 1];
490 ASSERT(pLastItem != NULL);
491 pLastItem->SetLast(TRUE);
492 }
493 }
494
495 void CFX_Edit_GroupUndoItem::Undo()
496 {
497 for (int i=m_Items.GetSize()-1; i>=0; i--)
498 {
499 CFX_Edit_UndoItem* pUndoItem = m_Items[i];
500 ASSERT(pUndoItem != NULL);
501
502 pUndoItem->Undo();
503 }
504 }
505
506 void CFX_Edit_GroupUndoItem::Redo()
507 {
508 for (int i=0,sz=m_Items.GetSize(); i<sz; i++)
509 {
510 CFX_Edit_UndoItem* pUndoItem = m_Items[i];
511 ASSERT(pUndoItem != NULL);
512
513 pUndoItem->Redo();
514 }
515 }
516
517 CFX_WideString CFX_Edit_GroupUndoItem::GetUndoTitle()
518 {
519 return m_sTitle;
520 }
521
522 /* ------------------------------------- CFX_Edit_UndoItem derived classes ----- -------------------------------- */
523
524 CFXEU_InsertWord::CFXEU_InsertWord(CFX_Edit * pEdit, const CPVT_WordPlace & wpOl dPlace, const CPVT_WordPlace & wpNewPlace,
525 FX_WORD word, int32_t charset, const CPVT_WordP rops * pWordProps)
526 : m_pEdit(pEdit), m_wpOld(wpOldPlace), m_wpNew(wpNewPlace), m_Word(word), m_ nCharset(charset), m_WordProps()
527 {
528 if (pWordProps)
529 m_WordProps = *pWordProps;
530 }
531
532 CFXEU_InsertWord::~CFXEU_InsertWord()
533 {
534 }
535
536 void CFXEU_InsertWord::Redo()
537 {
538 if (m_pEdit)
539 {
540 m_pEdit->SelectNone();
541 m_pEdit->SetCaret(m_wpOld);
542 m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE);
543 }
544 }
545
546 void CFXEU_InsertWord::Undo()
547 {
548 if (m_pEdit)
549 {
550 m_pEdit->SelectNone();
551 m_pEdit->SetCaret(m_wpNew);
552 m_pEdit->Backspace(FALSE,TRUE);
553 }
554 }
555
556 /* -------------------------------------------------------------------------- */
557
558 CFXEU_InsertReturn::CFXEU_InsertReturn(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
559 const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWordProps) :
560 m_pEdit(pEdit),
561 m_wpOld(wpOldPlace),
562 m_wpNew(wpNewPlace),
563 m_SecProps(),
564 m_WordProps()
565 {
566 if (pSecProps)
567 m_SecProps = *pSecProps;
568 if (pWordProps)
569 m_WordProps = *pWordProps;
570 }
571
572 CFXEU_InsertReturn::~CFXEU_InsertReturn()
573 {
574 }
575
576 void CFXEU_InsertReturn::Redo()
577 {
578 if (m_pEdit)
579 {
580 m_pEdit->SelectNone();
581 m_pEdit->SetCaret(m_wpOld);
582 m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);
583 }
584 }
585
586 void CFXEU_InsertReturn::Undo()
587 {
588 if (m_pEdit)
589 {
590 m_pEdit->SelectNone();
591 m_pEdit->SetCaret(m_wpNew);
592 m_pEdit->Backspace(FALSE,TRUE);
593 }
594 }
595
596 /* -------------------------------------------------------------------------- */
597 //CFXEU_Backspace
598
599 CFXEU_Backspace::CFXEU_Backspace(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldP lace, const CPVT_WordPlace & wpNewPlace,
600 FX_WORD word, int32_t charset,
601 const CPVT_SecProps & SecProps, const CPVT_WordPr ops & WordProps) :
602 m_pEdit(pEdit),
603 m_wpOld(wpOldPlace),
604 m_wpNew(wpNewPlace),
605 m_Word(word),
606 m_nCharset(charset),
607 m_SecProps(SecProps),
608 m_WordProps(WordProps)
609 {
610 }
611
612 CFXEU_Backspace::~CFXEU_Backspace()
613 {
614 }
615
616 void CFXEU_Backspace::Redo()
617 {
618 if (m_pEdit)
619 {
620 m_pEdit->SelectNone();
621 m_pEdit->SetCaret(m_wpOld);
622 m_pEdit->Backspace(FALSE,TRUE);
623 }
624 }
625
626 void CFXEU_Backspace::Undo()
627 {
628 if (m_pEdit)
629 {
630 m_pEdit->SelectNone();
631 m_pEdit->SetCaret(m_wpNew);
632 if (m_wpNew.SecCmp(m_wpOld) != 0)
633 {
634 m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);
635 } 1073 }
636 else 1074
637 { 1075 oldplace = place;
638 m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE); 1076 }
1077 }
1078 }
1079
1080 return swRet;
1081 }
1082
1083 CFX_WideString CFX_Edit::GetRangeText(const CPVT_WordRange& range) const {
1084 CFX_WideString swRet;
1085
1086 if (m_pVT->IsValid()) {
1087 FX_BOOL bRich = m_pVT->IsRichText();
1088
1089 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
1090 CPVT_WordRange wrTemp = range;
1091 m_pVT->UpdateWordPlace(wrTemp.BeginPos);
1092 m_pVT->UpdateWordPlace(wrTemp.EndPos);
1093 pIterator->SetAt(wrTemp.BeginPos);
1094
1095 CPVT_Word wordinfo;
1096 CPVT_WordPlace oldplace = wrTemp.BeginPos;
1097 while (pIterator->NextWord()) {
1098 CPVT_WordPlace place = pIterator->GetAt();
1099 if (place.WordCmp(wrTemp.EndPos) > 0)
1100 break;
1101
1102 if (pIterator->GetWord(wordinfo)) {
1103 if (bRich) {
1104 swRet += wordinfo.Word;
1105 } else {
1106 swRet += wordinfo.Word;
1107 }
639 } 1108 }
640 } 1109
641 } 1110 if (oldplace.SecCmp(place) != 0) {
642 1111 swRet += 0x0D;
643 /* -------------------------------------------------------------------------- */ 1112 swRet += 0x0A;
644 //CFXEU_Delete
645
646 CFXEU_Delete::CFXEU_Delete(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldPlace, const CPVT_WordPlace & wpNewPlace,
647 FX_WORD word, int32_t charset,
648 const CPVT_SecProps & SecProps, const CPVT_WordPr ops & WordProps, FX_BOOL bSecEnd) :
649 m_pEdit(pEdit),
650 m_wpOld(wpOldPlace),
651 m_wpNew(wpNewPlace),
652 m_Word(word),
653 m_nCharset(charset),
654 m_SecProps(SecProps),
655 m_WordProps(WordProps),
656 m_bSecEnd(bSecEnd)
657 {
658 }
659
660 CFXEU_Delete::~CFXEU_Delete()
661 {
662 }
663
664 void CFXEU_Delete::Redo()
665 {
666 if (m_pEdit)
667 {
668 m_pEdit->SelectNone();
669 m_pEdit->SetCaret(m_wpOld);
670 m_pEdit->Delete(FALSE,TRUE);
671 }
672 }
673
674 void CFXEU_Delete::Undo()
675 {
676 if (m_pEdit)
677 {
678 m_pEdit->SelectNone();
679 m_pEdit->SetCaret(m_wpNew);
680 if (m_bSecEnd)
681 {
682 m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,TRUE);
683 } 1113 }
684 else 1114
685 { 1115 oldplace = place;
686 m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,TRUE); 1116 }
687 } 1117 }
688 } 1118 }
689 } 1119
690 1120 return swRet;
691 /* -------------------------------------------------------------------------- */ 1121 }
692 //CFXEU_Clear 1122
693 1123 CFX_WideString CFX_Edit::GetSelText() const {
694 CFXEU_Clear::CFXEU_Clear(CFX_Edit * pEdit, const CPVT_WordRange & wrSel, const CFX_WideString & swText) : 1124 return GetRangeText(m_SelState.ConvertToWordRange());
695 m_pEdit(pEdit), 1125 }
696 m_wrSel(wrSel), 1126
697 m_swText(swText) 1127 int32_t CFX_Edit::GetTotalWords() const {
698 { 1128 return m_pVT->GetTotalWords();
699 } 1129 }
700 1130
701 CFXEU_Clear::~CFXEU_Clear() 1131 int32_t CFX_Edit::GetTotalLines() const {
702 { 1132 int32_t nLines = 0;
703 } 1133
704 1134 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
705 void CFXEU_Clear::Redo() 1135 pIterator->SetAt(0);
706 { 1136 while (pIterator->NextLine())
707 if (m_pEdit) 1137 nLines++;
708 { 1138 }
709 m_pEdit->SelectNone(); 1139
710 m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos); 1140 return nLines + 1;
711 m_pEdit->Clear(FALSE,TRUE); 1141 }
712 } 1142
713 } 1143 CPVT_WordRange CFX_Edit::GetSelectWordRange() const {
714 1144 return m_SelState.ConvertToWordRange();
715 void CFXEU_Clear::Undo() 1145 }
716 { 1146
717 if (m_pEdit) 1147 CPVT_WordRange CFX_Edit::CombineWordRange(const CPVT_WordRange& wr1,
718 { 1148 const CPVT_WordRange& wr2) {
719 m_pEdit->SelectNone(); 1149 CPVT_WordRange wrRet;
720 m_pEdit->SetCaret(m_wrSel.BeginPos); 1150
721 m_pEdit->InsertText(m_swText.c_str(), DEFAULT_CHARSET, NULL, NULL, FALSE , TRUE); 1151 if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0) {
722 m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos); 1152 wrRet.BeginPos = wr1.BeginPos;
723 } 1153 } else {
724 } 1154 wrRet.BeginPos = wr2.BeginPos;
725 1155 }
726 /* -------------------------------------------------------------------------- */ 1156
727 //CFXEU_ClearRich 1157 if (wr1.EndPos.WordCmp(wr2.EndPos) < 0) {
728 1158 wrRet.EndPos = wr2.EndPos;
729 CFXEU_ClearRich::CFXEU_ClearRich(CFX_Edit * pEdit, const CPVT_WordPlace & wpOldP lace, const CPVT_WordPlace & wpNewPlace, 1159 } else {
730 const CPVT_WordRange & wrSel, FX_WORD word, int32 _t charset, 1160 wrRet.EndPos = wr1.EndPos;
731 const CPVT_SecProps & SecProps, const CPVT_WordPr ops & WordProps) : 1161 }
732 m_pEdit(pEdit), 1162
733 m_wpOld(wpOldPlace), 1163 return wrRet;
734 m_wpNew(wpNewPlace), 1164 }
735 m_wrSel(wrSel), 1165
736 m_Word(word), 1166 FX_BOOL CFX_Edit::IsRichText() const {
737 m_nCharset(charset), 1167 return m_pVT->IsRichText();
738 m_SecProps(SecProps), 1168 }
739 m_WordProps(WordProps) 1169
740 { 1170 void CFX_Edit::SetRichText(FX_BOOL bRichText /* =TRUE */,
741 } 1171 FX_BOOL bPaint /* = TRUE*/) {
742 1172 m_pVT->SetRichText(bRichText);
743 CFXEU_ClearRich::~CFXEU_ClearRich() 1173 if (bPaint)
744 { 1174 Paint();
745 } 1175 }
746 1176
747 void CFXEU_ClearRich::Redo() 1177 FX_BOOL CFX_Edit::SetRichFontIndex(int32_t nFontIndex) {
748 { 1178 CPVT_WordProps WordProps;
749 if (m_pEdit && IsLast()) 1179 WordProps.nFontIndex = nFontIndex;
750 { 1180 return SetRichTextProps(EP_FONTINDEX, NULL, &WordProps);
751 m_pEdit->SelectNone(); 1181 }
752 m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos); 1182
753 m_pEdit->Clear(FALSE,TRUE); 1183 FX_BOOL CFX_Edit::SetRichFontSize(FX_FLOAT fFontSize) {
754 } 1184 CPVT_WordProps WordProps;
755 } 1185 WordProps.fFontSize = fFontSize;
756 1186 return SetRichTextProps(EP_FONTSIZE, NULL, &WordProps);
757 void CFXEU_ClearRich::Undo() 1187 }
758 { 1188
759 if (m_pEdit) 1189 FX_BOOL CFX_Edit::SetRichTextColor(FX_COLORREF dwColor) {
760 { 1190 CPVT_WordProps WordProps;
761 m_pEdit->SelectNone(); 1191 WordProps.dwWordColor = dwColor;
762 m_pEdit->SetCaret(m_wpOld); 1192 return SetRichTextProps(EP_WORDCOLOR, NULL, &WordProps);
763 if (m_wpNew.SecCmp(m_wpOld) != 0) 1193 }
764 { 1194
765 m_pEdit->InsertReturn(&m_SecProps,&m_WordProps,FALSE,FALSE); 1195 FX_BOOL CFX_Edit::SetRichTextScript(int32_t nScriptType) {
766 } 1196 CPVT_WordProps WordProps;
767 else 1197 WordProps.nScriptType = nScriptType;
768 { 1198 return SetRichTextProps(EP_SCRIPTTYPE, NULL, &WordProps);
769 m_pEdit->InsertWord(m_Word,m_nCharset,&m_WordProps,FALSE,FALSE); 1199 }
770 } 1200
771 1201 FX_BOOL CFX_Edit::SetRichTextBold(FX_BOOL bBold) {
772 if (IsFirst()) 1202 CPVT_WordProps WordProps;
773 { 1203 if (bBold)
774 m_pEdit->PaintInsertText(m_wrSel.BeginPos,m_wrSel.EndPos); 1204 WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
775 m_pEdit->SetSel(m_wrSel.BeginPos,m_wrSel.EndPos); 1205 return SetRichTextProps(EP_BOLD, NULL, &WordProps);
776 } 1206 }
777 } 1207
778 } 1208 FX_BOOL CFX_Edit::SetRichTextItalic(FX_BOOL bItalic) {
779 /* -------------------------------------------------------------------------- */ 1209 CPVT_WordProps WordProps;
780 //CFXEU_InsertText 1210 if (bItalic)
781 1211 WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
782 CFXEU_InsertText::CFXEU_InsertText(CFX_Edit * pEdit, const CPVT_WordPlace & wpOl dPlace, const CPVT_WordPlace & wpNewPlace, 1212 return SetRichTextProps(EP_ITALIC, NULL, &WordProps);
783 const CFX_WideString & swText, int32_t charset, 1213 }
784 const CPVT_SecProps * pSecProps, const CPVT_WordP rops * pWordProps) : 1214
785 m_pEdit(pEdit), 1215 FX_BOOL CFX_Edit::SetRichTextUnderline(FX_BOOL bUnderline) {
786 m_wpOld(wpOldPlace), 1216 CPVT_WordProps WordProps;
787 m_wpNew(wpNewPlace), 1217 if (bUnderline)
788 m_swText(swText), 1218 WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
789 m_nCharset(charset), 1219 return SetRichTextProps(EP_UNDERLINE, NULL, &WordProps);
790 m_SecProps(), 1220 }
791 m_WordProps() 1221
792 { 1222 FX_BOOL CFX_Edit::SetRichTextCrossout(FX_BOOL bCrossout) {
793 if (pSecProps) 1223 CPVT_WordProps WordProps;
794 m_SecProps = *pSecProps; 1224 if (bCrossout)
795 if (pWordProps) 1225 WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
796 m_WordProps = *pWordProps; 1226 return SetRichTextProps(EP_CROSSOUT, NULL, &WordProps);
797 } 1227 }
798 1228
799 CFXEU_InsertText::~CFXEU_InsertText() 1229 FX_BOOL CFX_Edit::SetRichTextCharSpace(FX_FLOAT fCharSpace) {
800 { 1230 CPVT_WordProps WordProps;
801 } 1231 WordProps.fCharSpace = fCharSpace;
802 1232 return SetRichTextProps(EP_CHARSPACE, NULL, &WordProps);
803 void CFXEU_InsertText::Redo() 1233 }
804 { 1234
805 if (m_pEdit && IsLast()) 1235 FX_BOOL CFX_Edit::SetRichTextHorzScale(int32_t nHorzScale /*= 100*/) {
806 { 1236 CPVT_WordProps WordProps;
807 m_pEdit->SelectNone(); 1237 WordProps.nHorzScale = nHorzScale;
808 m_pEdit->SetCaret(m_wpOld); 1238 return SetRichTextProps(EP_HORZSCALE, NULL, &WordProps);
809 m_pEdit->InsertText(m_swText.c_str(), m_nCharset, &m_SecProps, &m_WordPr ops, FALSE, TRUE); 1239 }
810 } 1240
811 } 1241 FX_BOOL CFX_Edit::SetRichTextLineLeading(FX_FLOAT fLineLeading) {
812 1242 CPVT_SecProps SecProps;
813 void CFXEU_InsertText::Undo() 1243 SecProps.fLineLeading = fLineLeading;
814 { 1244 return SetRichTextProps(EP_LINELEADING, &SecProps, NULL);
815 if (m_pEdit) 1245 }
816 { 1246
817 m_pEdit->SelectNone(); 1247 FX_BOOL CFX_Edit::SetRichTextLineIndent(FX_FLOAT fLineIndent) {
818 m_pEdit->SetSel(m_wpOld,m_wpNew); 1248 CPVT_SecProps SecProps;
819 m_pEdit->Clear(FALSE,TRUE); 1249 SecProps.fLineIndent = fLineIndent;
820 } 1250 return SetRichTextProps(EP_LINEINDENT, &SecProps, NULL);
821 } 1251 }
822 1252
823 /* -------------------------------------------------------------------------- */ 1253 FX_BOOL CFX_Edit::SetRichTextAlignment(int32_t nAlignment) {
824 1254 CPVT_SecProps SecProps;
825 CFXEU_SetSecProps::CFXEU_SetSecProps(CFX_Edit * pEdit, const CPVT_WordPlace & pl ace, EDIT_PROPS_E ep, 1255 SecProps.nAlignment = nAlignment;
826 const CPVT_SecProps & oldsecprops, const CPVT_WordProps & oldwordprops, 1256 return SetRichTextProps(EP_ALIGNMENT, &SecProps, NULL);
827 const CPVT_SecProps & newsecprops, const CPVT_WordProps & newwordprops, const CPVT_WordRange & range) 1257 }
828 : m_pEdit(pEdit), 1258
829 m_wpPlace(place), 1259 FX_BOOL CFX_Edit::SetRichTextProps(EDIT_PROPS_E eProps,
830 m_wrPlace(range), 1260 const CPVT_SecProps* pSecProps,
831 m_eProps(ep), 1261 const CPVT_WordProps* pWordProps) {
832 m_OldSecProps(oldsecprops), 1262 FX_BOOL bSet = FALSE;
833 m_NewSecProps(newsecprops), 1263 FX_BOOL bSet1, bSet2;
834 m_OldWordProps(oldwordprops), 1264 if (m_pVT->IsValid() && m_pVT->IsRichText()) {
835 m_NewWordProps(newwordprops) 1265 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
836 { 1266 CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();
837 } 1267
838 1268 m_pVT->UpdateWordPlace(wrTemp.BeginPos);
839 CFXEU_SetSecProps::~CFXEU_SetSecProps() 1269 m_pVT->UpdateWordPlace(wrTemp.EndPos);
840 { 1270 pIterator->SetAt(wrTemp.BeginPos);
841 } 1271
842 1272 BeginGroupUndo(L"");
843 void CFXEU_SetSecProps::Redo() 1273 ;
844 { 1274
845 if (m_pEdit) 1275 bSet = SetSecProps(eProps, wrTemp.BeginPos, pSecProps, pWordProps, wrTemp,
846 { 1276 TRUE);
847 m_pEdit->SetSecProps(m_eProps,m_wpPlace,&m_NewSecProps,&m_NewWordProps,m _wrPlace,FALSE); 1277
848 if (IsLast()) 1278 while (pIterator->NextWord()) {
849 { 1279 CPVT_WordPlace place = pIterator->GetAt();
850 m_pEdit->SelectNone(); 1280 if (place.WordCmp(wrTemp.EndPos) > 0)
851 m_pEdit->PaintSetProps(m_eProps,m_wrPlace); 1281 break;
852 m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos); 1282 bSet1 = SetSecProps(eProps, place, pSecProps, pWordProps, wrTemp, TRUE);
853 } 1283 bSet2 = SetWordProps(eProps, place, pWordProps, wrTemp, TRUE);
854 } 1284
855 } 1285 if (!bSet)
856 1286 bSet = (bSet1 || bSet2);
857 void CFXEU_SetSecProps::Undo() 1287 }
858 { 1288
859 if (m_pEdit) 1289 EndGroupUndo();
860 { 1290
861 m_pEdit->SetSecProps(m_eProps,m_wpPlace,&m_OldSecProps,&m_OldWordProps,m _wrPlace,FALSE); 1291 if (bSet) {
862 if (IsFirst()) 1292 PaintSetProps(eProps, wrTemp);
863 { 1293 }
864 m_pEdit->SelectNone(); 1294 }
865 m_pEdit->PaintSetProps(m_eProps,m_wrPlace); 1295 }
866 m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos); 1296
867 } 1297 return bSet;
868 } 1298 }
869 } 1299
870 1300 void CFX_Edit::PaintSetProps(EDIT_PROPS_E eProps, const CPVT_WordRange& wr) {
871 /* -------------------------------------------------------------------------- */ 1301 switch (eProps) {
872
873 CFXEU_SetWordProps::CFXEU_SetWordProps(CFX_Edit * pEdit, const CPVT_WordPlace & place, EDIT_PROPS_E ep,
874 const CPVT_WordProps & oldprops, const CPVT_WordProps & newprops, const CPVT_WordRange & range)
875 : m_pEdit(pEdit),
876 m_wpPlace(place),
877 m_wrPlace(range),
878 m_eProps(ep),
879 m_OldWordProps(oldprops),
880 m_NewWordProps(newprops)
881 {
882 }
883
884 CFXEU_SetWordProps::~CFXEU_SetWordProps()
885 {
886 }
887
888 void CFXEU_SetWordProps::Redo()
889 {
890 if (m_pEdit)
891 {
892 m_pEdit->SetWordProps(m_eProps,m_wpPlace,&m_NewWordProps,m_wrPlace,FALSE );
893 if (IsLast())
894 {
895 m_pEdit->SelectNone();
896 m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
897 m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
898 }
899 }
900 }
901
902 void CFXEU_SetWordProps::Undo()
903 {
904 if (m_pEdit)
905 {
906 m_pEdit->SetWordProps(m_eProps,m_wpPlace,&m_OldWordProps,m_wrPlace,FALSE );
907 if (IsFirst())
908 {
909 m_pEdit->SelectNone();
910 m_pEdit->PaintSetProps(m_eProps,m_wrPlace);
911 m_pEdit->SetSel(m_wrPlace.BeginPos,m_wrPlace.EndPos);
912 }
913 }
914 }
915
916 /* ------------------------------------- CFX_Edit ------------------------------ ------- */
917
918 CFX_Edit::CFX_Edit(IPDF_VariableText * pVT) :
919 m_pVT(pVT),
920 m_pNotify(NULL),
921 m_pOprNotify(NULL),
922 m_pVTProvide(NULL),
923 m_wpCaret(-1,-1,-1),
924 m_wpOldCaret(-1,-1,-1),
925 m_SelState(),
926 m_ptScrollPos(0,0),
927 m_ptRefreshScrollPos(0,0),
928 m_bEnableScroll(FALSE),
929 m_pIterator(NULL),
930 m_ptCaret(0.0f,0.0f),
931 m_Undo(FX_EDIT_UNDO_MAXITEM),
932 m_nAlignment(0),
933 m_bNotifyFlag(FALSE),
934 m_bEnableOverflow(FALSE),
935 m_bEnableRefresh(TRUE),
936 m_rcOldContent(0.0f,0.0f,0.0f,0.0f),
937 m_bEnableUndo(TRUE),
938 m_bNotify(TRUE),
939 m_bOprNotify(FALSE),
940 m_pGroupUndoItem(NULL)
941 {
942 ASSERT(pVT != NULL);
943 }
944
945 CFX_Edit::~CFX_Edit()
946 {
947 delete m_pVTProvide;
948 m_pVTProvide = NULL;
949 delete m_pIterator;
950 m_pIterator = NULL;
951 ASSERT(m_pGroupUndoItem == NULL);
952 }
953
954 // public methods
955
956 void CFX_Edit::Initialize()
957 {
958 m_pVT->Initialize();
959 SetCaret(m_pVT->GetBeginWordPlace());
960 SetCaretOrigin();
961 }
962
963 void CFX_Edit::SetFontMap(IFX_Edit_FontMap * pFontMap)
964 {
965 delete m_pVTProvide;
966 m_pVT->SetProvider(m_pVTProvide = new CFX_Edit_Provider(pFontMap));
967 }
968
969 void CFX_Edit::SetVTProvider(IPDF_VariableText_Provider* pProvider)
970 {
971 m_pVT->SetProvider(pProvider);
972 }
973
974 void CFX_Edit::SetNotify(IFX_Edit_Notify* pNotify)
975 {
976 m_pNotify = pNotify;
977 }
978
979 void CFX_Edit::SetOprNotify(IFX_Edit_OprNotify* pOprNotify)
980 {
981 m_pOprNotify = pOprNotify;
982 }
983
984 IFX_Edit_Iterator * CFX_Edit::GetIterator()
985 {
986 if (!m_pIterator)
987 m_pIterator = new CFX_Edit_Iterator(this,m_pVT->GetIterator());
988
989 return m_pIterator;
990 }
991
992 IPDF_VariableText * CFX_Edit::GetVariableText()
993 {
994 return m_pVT;
995 }
996
997 IFX_Edit_FontMap* CFX_Edit::GetFontMap()
998 {
999 if (m_pVTProvide)
1000 return m_pVTProvide->GetFontMap();
1001
1002 return NULL;
1003 }
1004
1005 void CFX_Edit::SetPlateRect(const CPDF_Rect & rect, FX_BOOL bPaint/* = TRUE*/)
1006 {
1007 m_pVT->SetPlateRect(rect);
1008 m_ptScrollPos = CPDF_Point(rect.left,rect.top);
1009 if (bPaint) Paint();
1010 }
1011
1012 void CFX_Edit::SetAlignmentH(int32_t nFormat/* =0 */, FX_BOOL bPaint/* = TRUE*/)
1013 {
1014 m_pVT->SetAlignment(nFormat);
1015 if (bPaint) Paint();
1016 }
1017
1018 void CFX_Edit::SetAlignmentV(int32_t nFormat/* =0 */, FX_BOOL bPaint/* = TRUE*/)
1019 {
1020 m_nAlignment = nFormat;
1021 if (bPaint) Paint();
1022 }
1023
1024 void CFX_Edit::SetPasswordChar(FX_WORD wSubWord/* ='*' */, FX_BOOL bPaint/* = TR UE*/)
1025 {
1026 m_pVT->SetPasswordChar(wSubWord);
1027 if (bPaint) Paint();
1028 }
1029
1030 void CFX_Edit::SetLimitChar(int32_t nLimitChar/* =0 */, FX_BOOL bPaint/* = TRUE* /)
1031 {
1032 m_pVT->SetLimitChar(nLimitChar);
1033 if (bPaint) Paint();
1034 }
1035
1036 void CFX_Edit::SetCharArray(int32_t nCharArray/* =0 */, FX_BOOL bPaint/* = TRUE* /)
1037 {
1038 m_pVT->SetCharArray(nCharArray);
1039 if (bPaint) Paint();
1040 }
1041
1042 void CFX_Edit::SetCharSpace(FX_FLOAT fCharSpace/* =0.0f */, FX_BOOL bPaint/* = T RUE*/)
1043 {
1044 m_pVT->SetCharSpace(fCharSpace);
1045 if (bPaint) Paint();
1046 }
1047
1048 void CFX_Edit::SetHorzScale(int32_t nHorzScale/* =100 */, FX_BOOL bPaint/* = TRU E*/)
1049 {
1050 m_pVT->SetHorzScale(nHorzScale);
1051 if (bPaint) Paint();
1052 }
1053
1054 void CFX_Edit::SetMultiLine(FX_BOOL bMultiLine/* =TRUE */, FX_BOOL bPaint/* = TR UE*/)
1055 {
1056 m_pVT->SetMultiLine(bMultiLine);
1057 if (bPaint) Paint();
1058 }
1059
1060 void CFX_Edit::SetAutoReturn(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/ )
1061 {
1062 m_pVT->SetAutoReturn(bAuto);
1063 if (bPaint) Paint();
1064 }
1065
1066 void CFX_Edit::SetLineLeading(FX_FLOAT fLineLeading/* =TRUE */, FX_BOOL bPaint/* = TRUE*/)
1067 {
1068 m_pVT->SetLineLeading(fLineLeading);
1069 if (bPaint) Paint();
1070 }
1071
1072 void CFX_Edit::SetAutoFontSize(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE */)
1073 {
1074 m_pVT->SetAutoFontSize(bAuto);
1075 if (bPaint) Paint();
1076 }
1077
1078 void CFX_Edit::SetFontSize(FX_FLOAT fFontSize, FX_BOOL bPaint/* = TRUE*/)
1079 {
1080 m_pVT->SetFontSize(fFontSize);
1081 if (bPaint) Paint();
1082 }
1083
1084 void CFX_Edit::SetAutoScroll(FX_BOOL bAuto/* =TRUE */, FX_BOOL bPaint/* = TRUE*/ )
1085 {
1086 m_bEnableScroll = bAuto;
1087 if (bPaint) Paint();
1088 }
1089
1090 void CFX_Edit::SetTextOverflow(FX_BOOL bAllowed /*= FALSE*/, FX_BOOL bPaint/* = TRUE*/)
1091 {
1092 m_bEnableOverflow = bAllowed;
1093 if (bPaint) Paint();
1094 }
1095
1096 void CFX_Edit::SetSel(int32_t nStartChar,int32_t nEndChar)
1097 {
1098 if (m_pVT->IsValid())
1099 {
1100 if (nStartChar == 0 && nEndChar < 0)
1101 {
1102 SelectAll();
1103 }
1104 else if (nStartChar < 0)
1105 {
1106 SelectNone();
1107 }
1108 else
1109 {
1110 if (nStartChar < nEndChar)
1111 {
1112 SetSel(m_pVT->WordIndexToWordPlace(nStartChar),m_pVT->WordIndexT oWordPlace(nEndChar));
1113 }
1114 else
1115 {
1116 SetSel(m_pVT->WordIndexToWordPlace(nEndChar),m_pVT->WordIndexToW ordPlace(nStartChar));
1117 }
1118 }
1119 }
1120 }
1121
1122 void CFX_Edit::SetSel(const CPVT_WordPlace & begin,const CPVT_WordPlace & end)
1123 {
1124 if (m_pVT->IsValid())
1125 {
1126 SelectNone();
1127
1128 m_SelState.Set(begin,end);
1129
1130 SetCaret(m_SelState.EndPos);
1131
1132 if (m_SelState.IsExist())
1133 {
1134 ScrollToCaret();
1135 CPVT_WordRange wr(m_SelState.BeginPos,m_SelState.EndPos);
1136 Refresh(RP_OPTIONAL,&wr);
1137 SetCaretInfo();
1138 }
1139 else
1140 {
1141 ScrollToCaret();
1142 SetCaretInfo();
1143 }
1144 }
1145 }
1146
1147 void CFX_Edit::GetSel(int32_t & nStartChar, int32_t & nEndChar) const
1148 {
1149 nStartChar = -1;
1150 nEndChar = -1;
1151
1152 if (m_pVT->IsValid())
1153 {
1154 if (m_SelState.IsExist())
1155 {
1156 if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)
1157 {
1158 nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos);
1159 nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos);
1160 }
1161 else
1162 {
1163 nStartChar = m_pVT->WordPlaceToWordIndex(m_SelState.EndPos);
1164 nEndChar = m_pVT->WordPlaceToWordIndex(m_SelState.BeginPos);
1165 }
1166 }
1167 else
1168 {
1169 nStartChar = m_pVT->WordPlaceToWordIndex(m_wpCaret);
1170 nEndChar = m_pVT->WordPlaceToWordIndex(m_wpCaret);
1171 }
1172 }
1173 }
1174
1175 int32_t CFX_Edit::GetCaret() const
1176 {
1177 if (m_pVT->IsValid())
1178 return m_pVT->WordPlaceToWordIndex(m_wpCaret);
1179
1180 return -1;
1181 }
1182
1183 CPVT_WordPlace CFX_Edit::GetCaretWordPlace() const
1184 {
1185 return m_wpCaret;
1186 }
1187
1188 CFX_WideString CFX_Edit::GetText() const
1189 {
1190 CFX_WideString swRet;
1191
1192 if (m_pVT->IsValid())
1193 {
1194 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
1195 {
1196 FX_BOOL bRich = m_pVT->IsRichText();
1197
1198 pIterator->SetAt(0);
1199
1200 CPVT_Word wordinfo;
1201 CPVT_WordPlace oldplace = pIterator->GetAt();
1202 while (pIterator->NextWord())
1203 {
1204 CPVT_WordPlace place = pIterator->GetAt();
1205
1206 if (pIterator->GetWord(wordinfo))
1207 {
1208 if (bRich)
1209 {
1210 swRet += wordinfo.Word;
1211 }
1212 else
1213 {
1214 swRet += wordinfo.Word;
1215 }
1216 }
1217
1218 if (oldplace.SecCmp(place) != 0)
1219 {
1220 swRet += 0x0D;
1221 swRet += 0x0A;
1222 }
1223
1224 oldplace = place;
1225 }
1226 }
1227 }
1228
1229 return swRet;
1230 }
1231
1232 CFX_WideString CFX_Edit::GetRangeText(const CPVT_WordRange & range) const
1233 {
1234 CFX_WideString swRet;
1235
1236 if (m_pVT->IsValid())
1237 {
1238 FX_BOOL bRich = m_pVT->IsRichText();
1239
1240 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
1241 {
1242 CPVT_WordRange wrTemp = range;
1243 m_pVT->UpdateWordPlace(wrTemp.BeginPos);
1244 m_pVT->UpdateWordPlace(wrTemp.EndPos);
1245 pIterator->SetAt(wrTemp.BeginPos);
1246
1247 CPVT_Word wordinfo;
1248 CPVT_WordPlace oldplace = wrTemp.BeginPos;
1249 while (pIterator->NextWord())
1250 {
1251 CPVT_WordPlace place = pIterator->GetAt();
1252 if (place.WordCmp(wrTemp.EndPos) > 0)break;
1253
1254 if (pIterator->GetWord(wordinfo))
1255 {
1256 if (bRich)
1257 {
1258 swRet += wordinfo.Word;
1259 }
1260 else
1261 {
1262 swRet += wordinfo.Word;
1263 }
1264 }
1265
1266 if (oldplace.SecCmp(place) != 0)
1267 {
1268 swRet += 0x0D;
1269 swRet += 0x0A;
1270 }
1271
1272 oldplace = place;
1273 }
1274 }
1275 }
1276
1277 return swRet;
1278 }
1279
1280 CFX_WideString CFX_Edit::GetSelText() const
1281 {
1282 return GetRangeText(m_SelState.ConvertToWordRange());
1283 }
1284
1285 int32_t CFX_Edit::GetTotalWords() const
1286 {
1287 return m_pVT->GetTotalWords();
1288 }
1289
1290 int32_t CFX_Edit::GetTotalLines() const
1291 {
1292 int32_t nLines = 0;
1293
1294 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
1295 {
1296 pIterator->SetAt(0);
1297 while (pIterator->NextLine())
1298 nLines++;
1299 }
1300
1301 return nLines+1;
1302 }
1303
1304 CPVT_WordRange CFX_Edit::GetSelectWordRange() const
1305 {
1306 return m_SelState.ConvertToWordRange();
1307 }
1308
1309 CPVT_WordRange CFX_Edit::CombineWordRange(const CPVT_WordRange & wr1, const CPVT _WordRange & wr2)
1310 {
1311 CPVT_WordRange wrRet;
1312
1313 if (wr1.BeginPos.WordCmp(wr2.BeginPos) < 0)
1314 {
1315 wrRet.BeginPos = wr1.BeginPos;
1316 }
1317 else
1318 {
1319 wrRet.BeginPos = wr2.BeginPos;
1320 }
1321
1322 if (wr1.EndPos.WordCmp(wr2.EndPos) < 0)
1323 {
1324 wrRet.EndPos = wr2.EndPos;
1325 }
1326 else
1327 {
1328 wrRet.EndPos = wr1.EndPos;
1329 }
1330
1331 return wrRet;
1332 }
1333
1334 FX_BOOL CFX_Edit::IsRichText() const
1335 {
1336 return m_pVT->IsRichText();
1337 }
1338
1339 void CFX_Edit::SetRichText(FX_BOOL bRichText/* =TRUE */, FX_BOOL bPaint/* = TRUE */)
1340 {
1341 m_pVT->SetRichText(bRichText);
1342 if (bPaint) Paint();
1343 }
1344
1345 FX_BOOL CFX_Edit::SetRichFontIndex(int32_t nFontIndex)
1346 {
1347 CPVT_WordProps WordProps;
1348 WordProps.nFontIndex = nFontIndex;
1349 return SetRichTextProps(EP_FONTINDEX,NULL,&WordProps);
1350 }
1351
1352 FX_BOOL CFX_Edit::SetRichFontSize(FX_FLOAT fFontSize)
1353 {
1354 CPVT_WordProps WordProps;
1355 WordProps.fFontSize = fFontSize;
1356 return SetRichTextProps(EP_FONTSIZE,NULL,&WordProps);
1357 }
1358
1359 FX_BOOL CFX_Edit::SetRichTextColor(FX_COLORREF dwColor)
1360 {
1361 CPVT_WordProps WordProps;
1362 WordProps.dwWordColor = dwColor;
1363 return SetRichTextProps(EP_WORDCOLOR,NULL,&WordProps);
1364 }
1365
1366 FX_BOOL CFX_Edit::SetRichTextScript(int32_t nScriptType)
1367 {
1368 CPVT_WordProps WordProps;
1369 WordProps.nScriptType = nScriptType;
1370 return SetRichTextProps(EP_SCRIPTTYPE,NULL,&WordProps);
1371 }
1372
1373 FX_BOOL CFX_Edit::SetRichTextBold(FX_BOOL bBold)
1374 {
1375 CPVT_WordProps WordProps;
1376 if (bBold)
1377 WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
1378 return SetRichTextProps(EP_BOLD,NULL,&WordProps);
1379 }
1380
1381 FX_BOOL CFX_Edit::SetRichTextItalic(FX_BOOL bItalic)
1382 {
1383 CPVT_WordProps WordProps;
1384 if (bItalic)
1385 WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
1386 return SetRichTextProps(EP_ITALIC,NULL,&WordProps);
1387 }
1388
1389 FX_BOOL CFX_Edit::SetRichTextUnderline(FX_BOOL bUnderline)
1390 {
1391 CPVT_WordProps WordProps;
1392 if (bUnderline)
1393 WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
1394 return SetRichTextProps(EP_UNDERLINE,NULL,&WordProps);
1395 }
1396
1397 FX_BOOL CFX_Edit::SetRichTextCrossout(FX_BOOL bCrossout)
1398 {
1399 CPVT_WordProps WordProps;
1400 if (bCrossout)
1401 WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
1402 return SetRichTextProps(EP_CROSSOUT,NULL,&WordProps);
1403 }
1404
1405 FX_BOOL CFX_Edit::SetRichTextCharSpace(FX_FLOAT fCharSpace)
1406 {
1407 CPVT_WordProps WordProps;
1408 WordProps.fCharSpace = fCharSpace;
1409 return SetRichTextProps(EP_CHARSPACE,NULL,&WordProps);
1410 }
1411
1412 FX_BOOL CFX_Edit::SetRichTextHorzScale(int32_t nHorzScale /*= 100*/)
1413 {
1414 CPVT_WordProps WordProps;
1415 WordProps.nHorzScale = nHorzScale;
1416 return SetRichTextProps(EP_HORZSCALE,NULL,&WordProps);
1417 }
1418
1419 FX_BOOL CFX_Edit::SetRichTextLineLeading(FX_FLOAT fLineLeading)
1420 {
1421 CPVT_SecProps SecProps;
1422 SecProps.fLineLeading = fLineLeading;
1423 return SetRichTextProps(EP_LINELEADING,&SecProps,NULL);
1424 }
1425
1426 FX_BOOL CFX_Edit::SetRichTextLineIndent(FX_FLOAT fLineIndent)
1427 {
1428 CPVT_SecProps SecProps;
1429 SecProps.fLineIndent = fLineIndent;
1430 return SetRichTextProps(EP_LINEINDENT,&SecProps,NULL);
1431 }
1432
1433 FX_BOOL CFX_Edit::SetRichTextAlignment(int32_t nAlignment)
1434 {
1435 CPVT_SecProps SecProps;
1436 SecProps.nAlignment = nAlignment;
1437 return SetRichTextProps(EP_ALIGNMENT,&SecProps,NULL);
1438 }
1439
1440 FX_BOOL CFX_Edit::SetRichTextProps(EDIT_PROPS_E eProps, const CPVT_SecProps * pS ecProps, const CPVT_WordProps * pWordProps)
1441 {
1442 FX_BOOL bSet = FALSE;
1443 FX_BOOL bSet1,bSet2;
1444 if (m_pVT->IsValid() && m_pVT->IsRichText())
1445 {
1446 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
1447 {
1448 CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();
1449
1450 m_pVT->UpdateWordPlace(wrTemp.BeginPos);
1451 m_pVT->UpdateWordPlace(wrTemp.EndPos);
1452 pIterator->SetAt(wrTemp.BeginPos);
1453
1454 BeginGroupUndo(L"");;
1455
1456 bSet = SetSecProps(eProps,wrTemp.BeginPos,pSecProps,pWordProps,wrTem p,TRUE);
1457
1458 while (pIterator->NextWord())
1459 {
1460 CPVT_WordPlace place = pIterator->GetAt();
1461 if (place.WordCmp(wrTemp.EndPos) > 0) break;
1462 bSet1 = SetSecProps(eProps,place,pSecProps,pWordProps,wrTemp,TRU E);
1463 bSet2 = SetWordProps(eProps,place,pWordProps,wrTemp,TRUE);
1464
1465 if (!bSet)
1466 bSet = (bSet1 || bSet2);
1467 }
1468
1469 EndGroupUndo();
1470
1471 if (bSet)
1472 {
1473 PaintSetProps(eProps,wrTemp);
1474 }
1475 }
1476 }
1477
1478 return bSet;
1479 }
1480
1481 void CFX_Edit::PaintSetProps(EDIT_PROPS_E eProps, const CPVT_WordRange & wr)
1482 {
1483 switch(eProps)
1484 {
1485 case EP_LINELEADING: 1302 case EP_LINELEADING:
1486 case EP_LINEINDENT: 1303 case EP_LINEINDENT:
1487 case EP_ALIGNMENT: 1304 case EP_ALIGNMENT:
1488 RearrangePart(wr); 1305 RearrangePart(wr);
1489 ScrollToCaret(); 1306 ScrollToCaret();
1490 Refresh(RP_ANALYSE); 1307 Refresh(RP_ANALYSE);
1491 SetCaretOrigin(); 1308 SetCaretOrigin();
1492 SetCaretInfo(); 1309 SetCaretInfo();
1493 break; 1310 break;
1494 case EP_WORDCOLOR: 1311 case EP_WORDCOLOR:
1495 case EP_UNDERLINE: 1312 case EP_UNDERLINE:
1496 case EP_CROSSOUT: 1313 case EP_CROSSOUT:
1497 Refresh(RP_OPTIONAL,&wr); 1314 Refresh(RP_OPTIONAL, &wr);
1498 break; 1315 break;
1499 case EP_FONTINDEX: 1316 case EP_FONTINDEX:
1500 case EP_FONTSIZE: 1317 case EP_FONTSIZE:
1501 case EP_SCRIPTTYPE: 1318 case EP_SCRIPTTYPE:
1502 case EP_CHARSPACE: 1319 case EP_CHARSPACE:
1503 case EP_HORZSCALE: 1320 case EP_HORZSCALE:
1504 case EP_BOLD: 1321 case EP_BOLD:
1505 case EP_ITALIC: 1322 case EP_ITALIC:
1506 RearrangePart(wr); 1323 RearrangePart(wr);
1507 ScrollToCaret(); 1324 ScrollToCaret();
1508 1325
1509 CPVT_WordRange wrRefresh(m_pVT->GetSectionBeginPlace(wr.BeginPos), 1326 CPVT_WordRange wrRefresh(m_pVT->GetSectionBeginPlace(wr.BeginPos),
1510 m_pVT->GetSectionEndPlace(wr.EndPos)); 1327 m_pVT->GetSectionEndPlace(wr.EndPos));
1511 Refresh(RP_ANALYSE,&wrRefresh); 1328 Refresh(RP_ANALYSE, &wrRefresh);
1512 1329
1513 SetCaretOrigin(); 1330 SetCaretOrigin();
1514 SetCaretInfo(); 1331 SetCaretInfo();
1515 break; 1332 break;
1516 } 1333 }
1517 } 1334 }
1518 1335
1519 FX_BOOL CFX_Edit::SetSecProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place, 1336 FX_BOOL CFX_Edit::SetSecProps(EDIT_PROPS_E eProps,
1520 const CPVT_SecProps * pSecProps, const CPVT_WordP rops * pWordProps, 1337 const CPVT_WordPlace& place,
1521 const CPVT_WordRange & wr, FX_BOOL bAddUndo) 1338 const CPVT_SecProps* pSecProps,
1522 { 1339 const CPVT_WordProps* pWordProps,
1523 if (m_pVT->IsValid() && m_pVT->IsRichText()) 1340 const CPVT_WordRange& wr,
1524 { 1341 FX_BOOL bAddUndo) {
1525 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator()) 1342 if (m_pVT->IsValid() && m_pVT->IsRichText()) {
1526 { 1343 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
1527 FX_BOOL bSet = FALSE; 1344 FX_BOOL bSet = FALSE;
1528 CPVT_Section secinfo; 1345 CPVT_Section secinfo;
1529 CPVT_Section OldSecinfo; 1346 CPVT_Section OldSecinfo;
1530 1347
1531 CPVT_WordPlace oldplace = pIterator->GetAt(); 1348 CPVT_WordPlace oldplace = pIterator->GetAt();
1532 1349
1533 if (eProps == EP_LINELEADING || eProps == EP_LINEINDENT || eProps == EP_ALIGNMENT) 1350 if (eProps == EP_LINELEADING || eProps == EP_LINEINDENT ||
1534 { 1351 eProps == EP_ALIGNMENT) {
1535 if (pSecProps) 1352 if (pSecProps) {
1536 { 1353 pIterator->SetAt(place);
1537 pIterator->SetAt(place); 1354 if (pIterator->GetSection(secinfo)) {
1538 if (pIterator->GetSection(secinfo)) 1355 if (bAddUndo)
1539 { 1356 OldSecinfo = secinfo;
1540 if (bAddUndo) OldSecinfo = secinfo; 1357
1541 1358 switch (eProps) {
1542 switch(eProps) 1359 case EP_LINELEADING:
1543 { 1360 if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineLeading,
1544 case EP_LINELEADING: 1361 pSecProps->fLineLeading)) {
1545 if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineLead ing,pSecProps->fLineLeading)) 1362 secinfo.SecProps.fLineLeading = pSecProps->fLineLeading;
1546 { 1363 bSet = TRUE;
1547 secinfo.SecProps.fLineLeading = pSecProps->fLine Leading; 1364 }
1548 bSet = TRUE; 1365 break;
1549 } 1366 case EP_LINEINDENT:
1550 break; 1367 if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineIndent,
1551 case EP_LINEINDENT: 1368 pSecProps->fLineIndent)) {
1552 if (!FX_EDIT_IsFloatEqual(secinfo.SecProps.fLineInde nt,pSecProps->fLineIndent)) 1369 secinfo.SecProps.fLineIndent = pSecProps->fLineIndent;
1553 { 1370 bSet = TRUE;
1554 secinfo.SecProps.fLineIndent = pSecProps->fLineI ndent; 1371 }
1555 bSet = TRUE; 1372 break;
1556 } 1373 case EP_ALIGNMENT:
1557 break; 1374 if (secinfo.SecProps.nAlignment != pSecProps->nAlignment) {
1558 case EP_ALIGNMENT: 1375 secinfo.SecProps.nAlignment = pSecProps->nAlignment;
1559 if (secinfo.SecProps.nAlignment != pSecProps->nAlign ment) 1376 bSet = TRUE;
1560 { 1377 }
1561 secinfo.SecProps.nAlignment = pSecProps->nAlignm ent; 1378 break;
1562 bSet = TRUE; 1379 default:
1563 } 1380 break;
1564 break;
1565 default:
1566 break;
1567 }
1568 }
1569 }
1570 } 1381 }
1571 else 1382 }
1572 { 1383 }
1573 if (pWordProps && place == m_pVT->GetSectionBeginPlace(place)) 1384 } else {
1574 { 1385 if (pWordProps && place == m_pVT->GetSectionBeginPlace(place)) {
1575 pIterator->SetAt(place); 1386 pIterator->SetAt(place);
1576 if (pIterator->GetSection(secinfo)) 1387 if (pIterator->GetSection(secinfo)) {
1577 { 1388 if (bAddUndo)
1578 if (bAddUndo) OldSecinfo = secinfo; 1389 OldSecinfo = secinfo;
1579 1390
1580 switch(eProps) 1391 switch (eProps) {
1581 { 1392 case EP_FONTINDEX:
1582 case EP_FONTINDEX: 1393 if (secinfo.WordProps.nFontIndex != pWordProps->nFontIndex) {
1583 if (secinfo.WordProps.nFontIndex != pWordProps->nFon tIndex) 1394 secinfo.WordProps.nFontIndex = pWordProps->nFontIndex;
1584 { 1395 bSet = TRUE;
1585 secinfo.WordProps.nFontIndex = pWordProps->nFont Index; 1396 }
1586 bSet = TRUE; 1397 break;
1587 } 1398 case EP_FONTSIZE:
1588 break; 1399 if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fFontSize,
1589 case EP_FONTSIZE: 1400 pWordProps->fFontSize)) {
1590 if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fFontSiz e,pWordProps->fFontSize)) 1401 secinfo.WordProps.fFontSize = pWordProps->fFontSize;
1591 { 1402 bSet = TRUE;
1592 secinfo.WordProps.fFontSize = pWordProps->fFontS ize; 1403 }
1593 bSet = TRUE; 1404 break;
1594 } 1405 case EP_WORDCOLOR:
1595 break; 1406 if (secinfo.WordProps.dwWordColor != pWordProps->dwWordColor) {
1596 case EP_WORDCOLOR: 1407 secinfo.WordProps.dwWordColor = pWordProps->dwWordColor;
1597 if (secinfo.WordProps.dwWordColor != pWordProps->dwW ordColor) 1408 bSet = TRUE;
1598 { 1409 }
1599 secinfo.WordProps.dwWordColor = pWordProps->dwWo rdColor; 1410 break;
1600 bSet = TRUE; 1411 case EP_SCRIPTTYPE:
1601 } 1412 if (secinfo.WordProps.nScriptType != pWordProps->nScriptType) {
1602 break; 1413 secinfo.WordProps.nScriptType = pWordProps->nScriptType;
1603 case EP_SCRIPTTYPE: 1414 bSet = TRUE;
1604 if (secinfo.WordProps.nScriptType != pWordProps->nSc riptType) 1415 }
1605 { 1416 break;
1606 secinfo.WordProps.nScriptType = pWordProps->nScr iptType; 1417 case EP_CHARSPACE:
1607 bSet = TRUE; 1418 if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fCharSpace,
1608 } 1419 pWordProps->fCharSpace)) {
1609 break; 1420 secinfo.WordProps.fCharSpace = pWordProps->fCharSpace;
1610 case EP_CHARSPACE: 1421 bSet = TRUE;
1611 if (!FX_EDIT_IsFloatEqual(secinfo.WordProps.fCharSpa ce,pWordProps->fCharSpace)) 1422 }
1612 { 1423 break;
1613 secinfo.WordProps.fCharSpace = pWordProps->fChar Space; 1424 case EP_HORZSCALE:
1614 bSet = TRUE; 1425 if (secinfo.WordProps.nHorzScale != pWordProps->nHorzScale) {
1615 } 1426 secinfo.WordProps.nHorzScale = pWordProps->nHorzScale;
1616 break; 1427 bSet = TRUE;
1617 case EP_HORZSCALE: 1428 }
1618 if (secinfo.WordProps.nHorzScale != pWordProps->nHor zScale) 1429 break;
1619 { 1430 case EP_UNDERLINE:
1620 secinfo.WordProps.nHorzScale = pWordProps->nHorz Scale; 1431 if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE) {
1621 bSet = TRUE; 1432 if ((secinfo.WordProps.nWordStyle &
1622 } 1433 PVTWORD_STYLE_UNDERLINE) == 0) {
1623 break; 1434 secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
1624 case EP_UNDERLINE: 1435 bSet = TRUE;
1625 if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE ) 1436 }
1626 { 1437 } else {
1627 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYL E_UNDERLINE) == 0) 1438 if ((secinfo.WordProps.nWordStyle &
1628 { 1439 PVTWORD_STYLE_UNDERLINE) != 0) {
1629 secinfo.WordProps.nWordStyle |= PVTWORD_STYL E_UNDERLINE; 1440 secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;
1630 bSet = TRUE; 1441 bSet = TRUE;
1631 } 1442 }
1632 } 1443 }
1633 else 1444 break;
1634 { 1445 case EP_CROSSOUT:
1635 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYL E_UNDERLINE) != 0) 1446 if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT) {
1636 { 1447 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) ==
1637 secinfo.WordProps.nWordStyle &= ~PVTWORD_STY LE_UNDERLINE; 1448 0) {
1638 bSet = TRUE; 1449 secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
1639 } 1450 bSet = TRUE;
1640 } 1451 }
1641 break; 1452 } else {
1642 case EP_CROSSOUT: 1453 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) !=
1643 if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT) 1454 0) {
1644 { 1455 secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;
1645 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYL E_CROSSOUT) == 0) 1456 bSet = TRUE;
1646 { 1457 }
1647 secinfo.WordProps.nWordStyle |= PVTWORD_STYL E_CROSSOUT; 1458 }
1648 bSet = TRUE; 1459 break;
1649 } 1460 case EP_BOLD:
1650 } 1461 if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD) {
1651 else 1462 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) ==
1652 { 1463 0) {
1653 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYL E_CROSSOUT) != 0) 1464 secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
1654 { 1465 bSet = TRUE;
1655 secinfo.WordProps.nWordStyle &= ~PVTWORD_STY LE_CROSSOUT; 1466 }
1656 bSet = TRUE; 1467 } else {
1657 } 1468 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) !=
1658 } 1469 0) {
1659 break; 1470 secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;
1660 case EP_BOLD: 1471 bSet = TRUE;
1661 if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD) 1472 }
1662 { 1473 }
1663 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYL E_BOLD) == 0) 1474 break;
1664 { 1475 case EP_ITALIC:
1665 secinfo.WordProps.nWordStyle |= PVTWORD_STYL E_BOLD; 1476 if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC) {
1666 bSet = TRUE; 1477 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) ==
1667 } 1478 0) {
1668 } 1479 secinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
1669 else 1480 bSet = TRUE;
1670 { 1481 }
1671 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYL E_BOLD) != 0) 1482 } else {
1672 { 1483 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) !=
1673 secinfo.WordProps.nWordStyle &= ~PVTWORD_STY LE_BOLD; 1484 0) {
1674 bSet = TRUE; 1485 secinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;
1675 } 1486 bSet = TRUE;
1676 } 1487 }
1677 break; 1488 }
1678 case EP_ITALIC: 1489 break;
1679 if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC) 1490 default:
1680 { 1491 break;
1681 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYL E_ITALIC) == 0)
1682 {
1683 secinfo.WordProps.nWordStyle |= PVTWORD_STYL E_ITALIC;
1684 bSet = TRUE;
1685 }
1686 }
1687 else
1688 {
1689 if ((secinfo.WordProps.nWordStyle & PVTWORD_STYL E_ITALIC) != 0)
1690 {
1691 secinfo.WordProps.nWordStyle &= ~PVTWORD_STY LE_ITALIC;
1692 bSet = TRUE;
1693 }
1694 }
1695 break;
1696 default:
1697 break;
1698 }
1699 }
1700 }
1701 } 1492 }
1702 1493 }
1703 if (bSet)
1704 {
1705 pIterator->SetSection(secinfo);
1706
1707 if (bAddUndo && m_bEnableUndo)
1708 {
1709 AddEditUndoItem(new CFXEU_SetSecProps
1710 (this,place,eProps,OldSecinfo.SecProps,OldSecinfo.WordPr ops,secinfo.SecProps,secinfo.WordProps,wr));
1711 }
1712 }
1713
1714 pIterator->SetAt(oldplace);
1715
1716 return bSet;
1717 } 1494 }
1718 } 1495 }
1719 1496
1720 return FALSE; 1497 if (bSet) {
1721 } 1498 pIterator->SetSection(secinfo);
1722 1499
1723 FX_BOOL CFX_Edit::SetWordProps(EDIT_PROPS_E eProps, const CPVT_WordPlace & place , 1500 if (bAddUndo && m_bEnableUndo) {
1724 const CPVT_WordProps * pWordProps, const CPVT_Wo rdRange & wr, FX_BOOL bAddUndo) 1501 AddEditUndoItem(new CFXEU_SetSecProps(
1725 { 1502 this, place, eProps, OldSecinfo.SecProps, OldSecinfo.WordProps,
1726 if (m_pVT->IsValid() && m_pVT->IsRichText()) 1503 secinfo.SecProps, secinfo.WordProps, wr));
1727 {
1728 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
1729 {
1730 FX_BOOL bSet = FALSE;
1731 CPVT_Word wordinfo;
1732 CPVT_Word OldWordinfo;
1733
1734 CPVT_WordPlace oldplace = pIterator->GetAt();
1735
1736 if (pWordProps)
1737 {
1738 pIterator->SetAt(place);
1739 if (pIterator->GetWord(wordinfo))
1740 {
1741 if (bAddUndo) OldWordinfo = wordinfo;
1742
1743 switch(eProps)
1744 {
1745 case EP_FONTINDEX:
1746 if (wordinfo.WordProps.nFontIndex != pWordProps->nFontIn dex)
1747 {
1748 if (IFX_Edit_FontMap* pFontMap = GetFontMap())
1749 {
1750 wordinfo.WordProps.nFontIndex = pFontMap->GetWor dFontIndex(wordinfo.Word,wordinfo.nCharset,pWordProps->nFontIndex);
1751 }
1752 bSet = TRUE;
1753 }
1754 break;
1755 case EP_FONTSIZE:
1756 if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fFontSize,p WordProps->fFontSize))
1757 {
1758 wordinfo.WordProps.fFontSize = pWordProps->fFontSize ;
1759 bSet = TRUE;
1760 }
1761 break;
1762 case EP_WORDCOLOR:
1763 if (wordinfo.WordProps.dwWordColor != pWordProps->dwWord Color)
1764 {
1765 wordinfo.WordProps.dwWordColor = pWordProps->dwWordC olor;
1766 bSet = TRUE;
1767 }
1768 break;
1769 case EP_SCRIPTTYPE:
1770 if (wordinfo.WordProps.nScriptType != pWordProps->nScrip tType)
1771 {
1772 wordinfo.WordProps.nScriptType = pWordProps->nScript Type;
1773 bSet = TRUE;
1774 }
1775 break;
1776 case EP_CHARSPACE:
1777 if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fCharSpace, pWordProps->fCharSpace))
1778 {
1779 wordinfo.WordProps.fCharSpace = pWordProps->fCharSpa ce;
1780 bSet = TRUE;
1781 }
1782 break;
1783 case EP_HORZSCALE:
1784 if (wordinfo.WordProps.nHorzScale != pWordProps->nHorzSc ale)
1785 {
1786 wordinfo.WordProps.nHorzScale = pWordProps->nHorzSca le;
1787 bSet = TRUE;
1788 }
1789 break;
1790 case EP_UNDERLINE:
1791 if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE)
1792 {
1793 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_U NDERLINE) == 0)
1794 {
1795 wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_U NDERLINE;
1796 bSet = TRUE;
1797 }
1798 }
1799 else
1800 {
1801 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_U NDERLINE) != 0)
1802 {
1803 wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ UNDERLINE;
1804 bSet = TRUE;
1805 }
1806 }
1807 break;
1808 case EP_CROSSOUT:
1809 if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT)
1810 {
1811 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_C ROSSOUT) == 0)
1812 {
1813 wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_C ROSSOUT;
1814 bSet = TRUE;
1815 }
1816 }
1817 else
1818 {
1819 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_C ROSSOUT) != 0)
1820 {
1821 wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ CROSSOUT;
1822 bSet = TRUE;
1823 }
1824 }
1825 break;
1826 case EP_BOLD:
1827 if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD)
1828 {
1829 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_B OLD) == 0)
1830 {
1831 wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_B OLD;
1832 bSet = TRUE;
1833 }
1834 }
1835 else
1836 {
1837 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_B OLD) != 0)
1838 {
1839 wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ BOLD;
1840 bSet = TRUE;
1841 }
1842 }
1843 break;
1844 case EP_ITALIC:
1845 if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC)
1846 {
1847 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_I TALIC) == 0)
1848 {
1849 wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_I TALIC;
1850 bSet = TRUE;
1851 }
1852 }
1853 else
1854 {
1855 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_I TALIC) != 0)
1856 {
1857 wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ ITALIC;
1858 bSet = TRUE;
1859 }
1860 }
1861 break;
1862 default:
1863 break;
1864 }
1865 }
1866 }
1867
1868 if (bSet)
1869 {
1870 pIterator->SetWord(wordinfo);
1871
1872 if (bAddUndo && m_bEnableUndo)
1873 {
1874 AddEditUndoItem(new CFXEU_SetWordProps
1875 (this,place,eProps,OldWordinfo.WordProps,wordinfo.WordPr ops,wr));
1876 }
1877 }
1878
1879 pIterator->SetAt(oldplace);
1880 return bSet;
1881 } 1504 }
1882 } 1505 }
1883 1506
1884 return FALSE; 1507 pIterator->SetAt(oldplace);
1885 } 1508
1886 1509 return bSet;
1887 void CFX_Edit::SetText(const FX_WCHAR* text,int32_t charset /*= DEFAULT_CHARSET* /, 1510 }
1888 const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_Wo rdProps * pWordProps /*= NULL*/) 1511 }
1889 { 1512
1890 SetText(text,charset,pSecProps,pWordProps,TRUE,TRUE); 1513 return FALSE;
1891 } 1514 }
1892 1515
1893 FX_BOOL CFX_Edit::InsertWord(FX_WORD word, int32_t charset /*= DEFAULT_CHARSET*/ , const CPVT_WordProps * pWordProps /*= NULL*/) 1516 FX_BOOL CFX_Edit::SetWordProps(EDIT_PROPS_E eProps,
1894 { 1517 const CPVT_WordPlace& place,
1895 return InsertWord(word,charset,pWordProps,TRUE,TRUE); 1518 const CPVT_WordProps* pWordProps,
1896 } 1519 const CPVT_WordRange& wr,
1897 1520 FX_BOOL bAddUndo) {
1898 FX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/) 1521 if (m_pVT->IsValid() && m_pVT->IsRichText()) {
1899 { 1522 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
1900 return InsertReturn(pSecProps,pWordProps,TRUE,TRUE); 1523 FX_BOOL bSet = FALSE;
1901 } 1524 CPVT_Word wordinfo;
1902 1525 CPVT_Word OldWordinfo;
1903 FX_BOOL CFX_Edit::Backspace() 1526
1904 { 1527 CPVT_WordPlace oldplace = pIterator->GetAt();
1905 return Backspace(TRUE,TRUE); 1528
1906 } 1529 if (pWordProps) {
1907 1530 pIterator->SetAt(place);
1908 FX_BOOL CFX_Edit::Delete() 1531 if (pIterator->GetWord(wordinfo)) {
1909 { 1532 if (bAddUndo)
1910 return Delete(TRUE,TRUE); 1533 OldWordinfo = wordinfo;
1911 } 1534
1912 1535 switch (eProps) {
1913 FX_BOOL CFX_Edit::Clear() 1536 case EP_FONTINDEX:
1914 { 1537 if (wordinfo.WordProps.nFontIndex != pWordProps->nFontIndex) {
1915 return Clear(TRUE,TRUE); 1538 if (IFX_Edit_FontMap* pFontMap = GetFontMap()) {
1916 } 1539 wordinfo.WordProps.nFontIndex = pFontMap->GetWordFontIndex(
1917 1540 wordinfo.Word, wordinfo.nCharset, pWordProps->nFontIndex);
1918 FX_BOOL CFX_Edit::InsertText(const FX_WCHAR* text, int32_t charset /*= DEFAULT_C HARSET*/, 1541 }
1919 const CPVT_SecProps * pSecProps /*= NULL*/,const CPVT_WordProps * pWordProps /*= NULL*/) 1542 bSet = TRUE;
1920 { 1543 }
1921 return InsertText(text,charset,pSecProps,pWordProps,TRUE,TRUE); 1544 break;
1922 } 1545 case EP_FONTSIZE:
1923 1546 if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fFontSize,
1924 FX_FLOAT CFX_Edit::GetFontSize() const 1547 pWordProps->fFontSize)) {
1925 { 1548 wordinfo.WordProps.fFontSize = pWordProps->fFontSize;
1926 return m_pVT->GetFontSize(); 1549 bSet = TRUE;
1927 } 1550 }
1928 1551 break;
1929 FX_WORD CFX_Edit::GetPasswordChar() const 1552 case EP_WORDCOLOR:
1930 { 1553 if (wordinfo.WordProps.dwWordColor != pWordProps->dwWordColor) {
1931 return m_pVT->GetPasswordChar(); 1554 wordinfo.WordProps.dwWordColor = pWordProps->dwWordColor;
1932 } 1555 bSet = TRUE;
1933 1556 }
1934 int32_t CFX_Edit::GetCharArray() const 1557 break;
1935 { 1558 case EP_SCRIPTTYPE:
1936 return m_pVT->GetCharArray(); 1559 if (wordinfo.WordProps.nScriptType != pWordProps->nScriptType) {
1937 } 1560 wordinfo.WordProps.nScriptType = pWordProps->nScriptType;
1938 1561 bSet = TRUE;
1939 CPDF_Rect CFX_Edit::GetPlateRect() const 1562 }
1940 { 1563 break;
1941 return m_pVT->GetPlateRect(); 1564 case EP_CHARSPACE:
1942 } 1565 if (!FX_EDIT_IsFloatEqual(wordinfo.WordProps.fCharSpace,
1943 1566 pWordProps->fCharSpace)) {
1944 CPDF_Rect CFX_Edit::GetContentRect() const 1567 wordinfo.WordProps.fCharSpace = pWordProps->fCharSpace;
1945 { 1568 bSet = TRUE;
1946 return VTToEdit(m_pVT->GetContentRect()); 1569 }
1947 } 1570 break;
1948 1571 case EP_HORZSCALE:
1949 int32_t CFX_Edit::GetHorzScale() const 1572 if (wordinfo.WordProps.nHorzScale != pWordProps->nHorzScale) {
1950 { 1573 wordinfo.WordProps.nHorzScale = pWordProps->nHorzScale;
1951 return m_pVT->GetHorzScale(); 1574 bSet = TRUE;
1952 } 1575 }
1953 1576 break;
1954 FX_FLOAT CFX_Edit::GetCharSpace() const 1577 case EP_UNDERLINE:
1955 { 1578 if (pWordProps->nWordStyle & PVTWORD_STYLE_UNDERLINE) {
1956 return m_pVT->GetCharSpace(); 1579 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) ==
1580 0) {
1581 wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_UNDERLINE;
1582 bSet = TRUE;
1583 }
1584 } else {
1585 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) !=
1586 0) {
1587 wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_UNDERLINE;
1588 bSet = TRUE;
1589 }
1590 }
1591 break;
1592 case EP_CROSSOUT:
1593 if (pWordProps->nWordStyle & PVTWORD_STYLE_CROSSOUT) {
1594 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) ==
1595 0) {
1596 wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_CROSSOUT;
1597 bSet = TRUE;
1598 }
1599 } else {
1600 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) !=
1601 0) {
1602 wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_CROSSOUT;
1603 bSet = TRUE;
1604 }
1605 }
1606 break;
1607 case EP_BOLD:
1608 if (pWordProps->nWordStyle & PVTWORD_STYLE_BOLD) {
1609 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) == 0) {
1610 wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_BOLD;
1611 bSet = TRUE;
1612 }
1613 } else {
1614 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_BOLD) != 0) {
1615 wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_BOLD;
1616 bSet = TRUE;
1617 }
1618 }
1619 break;
1620 case EP_ITALIC:
1621 if (pWordProps->nWordStyle & PVTWORD_STYLE_ITALIC) {
1622 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) ==
1623 0) {
1624 wordinfo.WordProps.nWordStyle |= PVTWORD_STYLE_ITALIC;
1625 bSet = TRUE;
1626 }
1627 } else {
1628 if ((wordinfo.WordProps.nWordStyle & PVTWORD_STYLE_ITALIC) !=
1629 0) {
1630 wordinfo.WordProps.nWordStyle &= ~PVTWORD_STYLE_ITALIC;
1631 bSet = TRUE;
1632 }
1633 }
1634 break;
1635 default:
1636 break;
1637 }
1638 }
1639 }
1640
1641 if (bSet) {
1642 pIterator->SetWord(wordinfo);
1643
1644 if (bAddUndo && m_bEnableUndo) {
1645 AddEditUndoItem(new CFXEU_SetWordProps(this, place, eProps,
1646 OldWordinfo.WordProps,
1647 wordinfo.WordProps, wr));
1648 }
1649 }
1650
1651 pIterator->SetAt(oldplace);
1652 return bSet;
1653 }
1654 }
1655
1656 return FALSE;
1657 }
1658
1659 void CFX_Edit::SetText(const FX_WCHAR* text,
1660 int32_t charset /*= DEFAULT_CHARSET*/,
1661 const CPVT_SecProps* pSecProps /*= NULL*/,
1662 const CPVT_WordProps* pWordProps /*= NULL*/) {
1663 SetText(text, charset, pSecProps, pWordProps, TRUE, TRUE);
1664 }
1665
1666 FX_BOOL CFX_Edit::InsertWord(FX_WORD word,
1667 int32_t charset /*= DEFAULT_CHARSET*/,
1668 const CPVT_WordProps* pWordProps /*= NULL*/) {
1669 return InsertWord(word, charset, pWordProps, TRUE, TRUE);
1670 }
1671
1672 FX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps* pSecProps /*= NULL*/,
1673 const CPVT_WordProps* pWordProps /*= NULL*/) {
1674 return InsertReturn(pSecProps, pWordProps, TRUE, TRUE);
1675 }
1676
1677 FX_BOOL CFX_Edit::Backspace() {
1678 return Backspace(TRUE, TRUE);
1679 }
1680
1681 FX_BOOL CFX_Edit::Delete() {
1682 return Delete(TRUE, TRUE);
1683 }
1684
1685 FX_BOOL CFX_Edit::Clear() {
1686 return Clear(TRUE, TRUE);
1687 }
1688
1689 FX_BOOL CFX_Edit::InsertText(const FX_WCHAR* text,
1690 int32_t charset /*= DEFAULT_CHARSET*/,
1691 const CPVT_SecProps* pSecProps /*= NULL*/,
1692 const CPVT_WordProps* pWordProps /*= NULL*/) {
1693 return InsertText(text, charset, pSecProps, pWordProps, TRUE, TRUE);
1694 }
1695
1696 FX_FLOAT CFX_Edit::GetFontSize() const {
1697 return m_pVT->GetFontSize();
1698 }
1699
1700 FX_WORD CFX_Edit::GetPasswordChar() const {
1701 return m_pVT->GetPasswordChar();
1702 }
1703
1704 int32_t CFX_Edit::GetCharArray() const {
1705 return m_pVT->GetCharArray();
1706 }
1707
1708 CPDF_Rect CFX_Edit::GetPlateRect() const {
1709 return m_pVT->GetPlateRect();
1710 }
1711
1712 CPDF_Rect CFX_Edit::GetContentRect() const {
1713 return VTToEdit(m_pVT->GetContentRect());
1714 }
1715
1716 int32_t CFX_Edit::GetHorzScale() const {
1717 return m_pVT->GetHorzScale();
1718 }
1719
1720 FX_FLOAT CFX_Edit::GetCharSpace() const {
1721 return m_pVT->GetCharSpace();
1957 } 1722 }
1958 1723
1959 // inner methods 1724 // inner methods
1960 1725
1961 CPVT_WordRange CFX_Edit::GetWholeWordRange() const 1726 CPVT_WordRange CFX_Edit::GetWholeWordRange() const {
1962 { 1727 if (m_pVT->IsValid())
1963 if (m_pVT->IsValid()) 1728 return CPVT_WordRange(m_pVT->GetBeginWordPlace(), m_pVT->GetEndWordPlace());
1964 return CPVT_WordRange(m_pVT->GetBeginWordPlace(),m_pVT->GetEndWordPlace( )); 1729
1965 1730 return CPVT_WordRange();
1966 return CPVT_WordRange(); 1731 }
1967 } 1732
1968 1733 CPVT_WordRange CFX_Edit::GetVisibleWordRange() const {
1969 CPVT_WordRange CFX_Edit::GetVisibleWordRange() const 1734 if (m_bEnableOverflow)
1970 { 1735 return GetWholeWordRange();
1971 if (m_bEnableOverflow) return GetWholeWordRange(); 1736
1972 1737 if (m_pVT->IsValid()) {
1973 if (m_pVT->IsValid()) 1738 CPDF_Rect rcPlate = m_pVT->GetPlateRect();
1974 { 1739
1975 CPDF_Rect rcPlate = m_pVT->GetPlateRect(); 1740 CPVT_WordPlace place1 =
1976 1741 m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPlate.left, rcPlate.top)));
1977 CPVT_WordPlace place1 = m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPla te.left,rcPlate.top))); 1742 CPVT_WordPlace place2 = m_pVT->SearchWordPlace(
1978 CPVT_WordPlace place2 = m_pVT->SearchWordPlace(EditToVT(CPDF_Point(rcPla te.right,rcPlate.bottom))); 1743 EditToVT(CPDF_Point(rcPlate.right, rcPlate.bottom)));
1979 1744
1980 return CPVT_WordRange(place1,place2); 1745 return CPVT_WordRange(place1, place2);
1981 } 1746 }
1982 1747
1983 return CPVT_WordRange(); 1748 return CPVT_WordRange();
1984 } 1749 }
1985 1750
1986 CPVT_WordPlace CFX_Edit::SearchWordPlace(const CPDF_Point& point) const 1751 CPVT_WordPlace CFX_Edit::SearchWordPlace(const CPDF_Point& point) const {
1987 { 1752 if (m_pVT->IsValid()) {
1988 if (m_pVT->IsValid()) 1753 return m_pVT->SearchWordPlace(EditToVT(point));
1989 { 1754 }
1990 return m_pVT->SearchWordPlace(EditToVT(point)); 1755
1991 } 1756 return CPVT_WordPlace();
1992 1757 }
1993 return CPVT_WordPlace(); 1758
1994 } 1759 void CFX_Edit::Paint() {
1995 1760 if (m_pVT->IsValid()) {
1996 void CFX_Edit::Paint() 1761 RearrangeAll();
1997 { 1762 ScrollToCaret();
1998 if (m_pVT->IsValid()) 1763 Refresh(RP_NOANALYSE);
1999 { 1764 SetCaretOrigin();
2000 RearrangeAll(); 1765 SetCaretInfo();
2001 ScrollToCaret(); 1766 }
2002 Refresh(RP_NOANALYSE); 1767 }
2003 SetCaretOrigin(); 1768
2004 SetCaretInfo(); 1769 void CFX_Edit::RearrangeAll() {
2005 } 1770 if (m_pVT->IsValid()) {
2006 } 1771 m_pVT->UpdateWordPlace(m_wpCaret);
2007 1772 m_pVT->RearrangeAll();
2008 void CFX_Edit::RearrangeAll() 1773 m_pVT->UpdateWordPlace(m_wpCaret);
2009 { 1774 SetScrollInfo();
2010 if (m_pVT->IsValid()) 1775 SetContentChanged();
2011 { 1776 }
2012 m_pVT->UpdateWordPlace(m_wpCaret); 1777 }
2013 m_pVT->RearrangeAll(); 1778
2014 m_pVT->UpdateWordPlace(m_wpCaret); 1779 void CFX_Edit::RearrangePart(const CPVT_WordRange& range) {
2015 SetScrollInfo(); 1780 if (m_pVT->IsValid()) {
2016 SetContentChanged(); 1781 m_pVT->UpdateWordPlace(m_wpCaret);
2017 } 1782 m_pVT->RearrangePart(range);
2018 } 1783 m_pVT->UpdateWordPlace(m_wpCaret);
2019 1784 SetScrollInfo();
2020 void CFX_Edit::RearrangePart(const CPVT_WordRange & range) 1785 SetContentChanged();
2021 { 1786 }
2022 if (m_pVT->IsValid()) 1787 }
2023 { 1788
2024 m_pVT->UpdateWordPlace(m_wpCaret); 1789 void CFX_Edit::SetContentChanged() {
2025 m_pVT->RearrangePart(range); 1790 if (m_bNotify && m_pNotify) {
2026 m_pVT->UpdateWordPlace(m_wpCaret); 1791 CPDF_Rect rcContent = m_pVT->GetContentRect();
2027 SetScrollInfo(); 1792 if (rcContent.Width() != m_rcOldContent.Width() ||
2028 SetContentChanged(); 1793 rcContent.Height() != m_rcOldContent.Height()) {
2029 } 1794 if (!m_bNotifyFlag) {
2030 } 1795 m_bNotifyFlag = TRUE;
2031 1796 m_pNotify->IOnContentChange(rcContent);
2032 void CFX_Edit::SetContentChanged() 1797 m_bNotifyFlag = FALSE;
2033 { 1798 }
2034 if (m_bNotify && m_pNotify) 1799 m_rcOldContent = rcContent;
2035 { 1800 }
2036 CPDF_Rect rcContent = m_pVT->GetContentRect(); 1801 }
2037 if (rcContent.Width() != m_rcOldContent.Width() || 1802 }
2038 rcContent.Height() != m_rcOldContent.Height()) 1803
2039 { 1804 void CFX_Edit::SelectAll() {
2040 if (!m_bNotifyFlag) 1805 if (m_pVT->IsValid()) {
2041 { 1806 m_SelState = GetWholeWordRange();
2042 m_bNotifyFlag = TRUE; 1807 SetCaret(m_SelState.EndPos);
2043 m_pNotify->IOnContentChange(rcContent); 1808
2044 m_bNotifyFlag = FALSE; 1809 ScrollToCaret();
2045 } 1810 CPVT_WordRange wrVisible = GetVisibleWordRange();
2046 m_rcOldContent = rcContent; 1811 Refresh(RP_OPTIONAL, &wrVisible);
1812 SetCaretInfo();
1813 }
1814 }
1815
1816 void CFX_Edit::SelectNone() {
1817 if (m_pVT->IsValid()) {
1818 if (m_SelState.IsExist()) {
1819 CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();
1820 m_SelState.Default();
1821 Refresh(RP_OPTIONAL, &wrTemp);
1822 }
1823 }
1824 }
1825
1826 FX_BOOL CFX_Edit::IsSelected() const {
1827 return m_SelState.IsExist();
1828 }
1829
1830 CPDF_Point CFX_Edit::VTToEdit(const CPDF_Point& point) const {
1831 CPDF_Rect rcContent = m_pVT->GetContentRect();
1832 CPDF_Rect rcPlate = m_pVT->GetPlateRect();
1833
1834 FX_FLOAT fPadding = 0.0f;
1835
1836 switch (m_nAlignment) {
1837 case 0:
1838 fPadding = 0.0f;
1839 break;
1840 case 1:
1841 fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f;
1842 break;
1843 case 2:
1844 fPadding = rcPlate.Height() - rcContent.Height();
1845 break;
1846 }
1847
1848 return CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left),
1849 point.y - (m_ptScrollPos.y + fPadding - rcPlate.top));
1850 }
1851
1852 CPDF_Point CFX_Edit::EditToVT(const CPDF_Point& point) const {
1853 CPDF_Rect rcContent = m_pVT->GetContentRect();
1854 CPDF_Rect rcPlate = m_pVT->GetPlateRect();
1855
1856 FX_FLOAT fPadding = 0.0f;
1857
1858 switch (m_nAlignment) {
1859 case 0:
1860 fPadding = 0.0f;
1861 break;
1862 case 1:
1863 fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f;
1864 break;
1865 case 2:
1866 fPadding = rcPlate.Height() - rcContent.Height();
1867 break;
1868 }
1869
1870 return CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left),
1871 point.y + (m_ptScrollPos.y + fPadding - rcPlate.top));
1872 }
1873
1874 CPDF_Rect CFX_Edit::VTToEdit(const CPDF_Rect& rect) const {
1875 CPDF_Point ptLeftBottom = VTToEdit(CPDF_Point(rect.left, rect.bottom));
1876 CPDF_Point ptRightTop = VTToEdit(CPDF_Point(rect.right, rect.top));
1877
1878 return CPDF_Rect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, ptRightTop.y);
1879 }
1880
1881 CPDF_Rect CFX_Edit::EditToVT(const CPDF_Rect& rect) const {
1882 CPDF_Point ptLeftBottom = EditToVT(CPDF_Point(rect.left, rect.bottom));
1883 CPDF_Point ptRightTop = EditToVT(CPDF_Point(rect.right, rect.top));
1884
1885 return CPDF_Rect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, ptRightTop.y);
1886 }
1887
1888 void CFX_Edit::SetScrollInfo() {
1889 if (m_bNotify && m_pNotify) {
1890 CPDF_Rect rcPlate = m_pVT->GetPlateRect();
1891 CPDF_Rect rcContent = m_pVT->GetContentRect();
1892
1893 if (!m_bNotifyFlag) {
1894 m_bNotifyFlag = TRUE;
1895 m_pNotify->IOnSetScrollInfoX(rcPlate.left, rcPlate.right, rcContent.left,
1896 rcContent.right, rcPlate.Width() / 3,
1897 rcPlate.Width());
1898
1899 m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top,
1900 rcContent.bottom, rcContent.top,
1901 rcPlate.Height() / 3, rcPlate.Height());
1902 m_bNotifyFlag = FALSE;
1903 }
1904 }
1905 }
1906
1907 void CFX_Edit::SetScrollPosX(FX_FLOAT fx) {
1908 if (!m_bEnableScroll)
1909 return;
1910
1911 if (m_pVT->IsValid()) {
1912 if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.x, fx)) {
1913 m_ptScrollPos.x = fx;
1914 Refresh(RP_NOANALYSE);
1915
1916 if (m_bNotify && m_pNotify) {
1917 if (!m_bNotifyFlag) {
1918 m_bNotifyFlag = TRUE;
1919 m_pNotify->IOnSetScrollPosX(fx);
1920 m_bNotifyFlag = FALSE;
2047 } 1921 }
2048 } 1922 }
2049 } 1923 }
2050 1924 }
2051 void CFX_Edit::SelectAll() 1925 }
2052 { 1926
2053 if (m_pVT->IsValid()) 1927 void CFX_Edit::SetScrollPosY(FX_FLOAT fy) {
2054 { 1928 if (!m_bEnableScroll)
2055 m_SelState = GetWholeWordRange(); 1929 return;
2056 SetCaret(m_SelState.EndPos); 1930
2057 1931 if (m_pVT->IsValid()) {
2058 ScrollToCaret(); 1932 if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y, fy)) {
2059 CPVT_WordRange wrVisible = GetVisibleWordRange(); 1933 m_ptScrollPos.y = fy;
2060 Refresh(RP_OPTIONAL,&wrVisible); 1934 Refresh(RP_NOANALYSE);
2061 SetCaretInfo(); 1935
2062 } 1936 if (m_bNotify && m_pNotify) {
2063 } 1937 if (!m_bNotifyFlag) {
2064 1938 m_bNotifyFlag = TRUE;
2065 void CFX_Edit::SelectNone() 1939 m_pNotify->IOnSetScrollPosY(fy);
2066 { 1940 m_bNotifyFlag = FALSE;
2067 if (m_pVT->IsValid())
2068 {
2069 if (m_SelState.IsExist())
2070 {
2071 CPVT_WordRange wrTemp = m_SelState.ConvertToWordRange();
2072 m_SelState.Default();
2073 Refresh(RP_OPTIONAL,&wrTemp);
2074 } 1941 }
2075 } 1942 }
2076 } 1943 }
2077 1944 }
2078 FX_BOOL CFX_Edit::IsSelected() const 1945 }
2079 { 1946
2080 return m_SelState.IsExist(); 1947 void CFX_Edit::SetScrollPos(const CPDF_Point& point) {
2081 } 1948 SetScrollPosX(point.x);
2082 1949 SetScrollPosY(point.y);
2083 CPDF_Point CFX_Edit::VTToEdit(const CPDF_Point & point) const 1950 SetScrollLimit();
2084 { 1951 SetCaretInfo();
1952 }
1953
1954 CPDF_Point CFX_Edit::GetScrollPos() const {
1955 return m_ptScrollPos;
1956 }
1957
1958 void CFX_Edit::SetScrollLimit() {
1959 if (m_pVT->IsValid()) {
2085 CPDF_Rect rcContent = m_pVT->GetContentRect(); 1960 CPDF_Rect rcContent = m_pVT->GetContentRect();
2086 CPDF_Rect rcPlate = m_pVT->GetPlateRect(); 1961 CPDF_Rect rcPlate = m_pVT->GetPlateRect();
2087 1962
2088 FX_FLOAT fPadding = 0.0f; 1963 if (rcPlate.Width() > rcContent.Width()) {
2089 1964 SetScrollPosX(rcPlate.left);
2090 switch (m_nAlignment) 1965 } else {
2091 { 1966 if (FX_EDIT_IsFloatSmaller(m_ptScrollPos.x, rcContent.left)) {
2092 case 0: 1967 SetScrollPosX(rcContent.left);
2093 fPadding = 0.0f; 1968 } else if (FX_EDIT_IsFloatBigger(m_ptScrollPos.x,
1969 rcContent.right - rcPlate.Width())) {
1970 SetScrollPosX(rcContent.right - rcPlate.Width());
1971 }
1972 }
1973
1974 if (rcPlate.Height() > rcContent.Height()) {
1975 SetScrollPosY(rcPlate.top);
1976 } else {
1977 if (FX_EDIT_IsFloatSmaller(m_ptScrollPos.y,
1978 rcContent.bottom + rcPlate.Height())) {
1979 SetScrollPosY(rcContent.bottom + rcPlate.Height());
1980 } else if (FX_EDIT_IsFloatBigger(m_ptScrollPos.y, rcContent.top)) {
1981 SetScrollPosY(rcContent.top);
1982 }
1983 }
1984 }
1985 }
1986
1987 void CFX_Edit::ScrollToCaret() {
1988 SetScrollLimit();
1989
1990 if (m_pVT->IsValid()) {
1991 CPDF_Point ptHead(0, 0);
1992 CPDF_Point ptFoot(0, 0);
1993
1994 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
1995 pIterator->SetAt(m_wpCaret);
1996
1997 CPVT_Word word;
1998 CPVT_Line line;
1999 if (pIterator->GetWord(word)) {
2000 ptHead.x = word.ptWord.x + word.fWidth;
2001 ptHead.y = word.ptWord.y + word.fAscent;
2002 ptFoot.x = word.ptWord.x + word.fWidth;
2003 ptFoot.y = word.ptWord.y + word.fDescent;
2004 } else if (pIterator->GetLine(line)) {
2005 ptHead.x = line.ptLine.x;
2006 ptHead.y = line.ptLine.y + line.fLineAscent;
2007 ptFoot.x = line.ptLine.x;
2008 ptFoot.y = line.ptLine.y + line.fLineDescent;
2009 }
2010 }
2011
2012 CPDF_Point ptHeadEdit = VTToEdit(ptHead);
2013 CPDF_Point ptFootEdit = VTToEdit(ptFoot);
2014
2015 CPDF_Rect rcPlate = m_pVT->GetPlateRect();
2016
2017 if (!FX_EDIT_IsFloatEqual(rcPlate.left, rcPlate.right)) {
2018 if (FX_EDIT_IsFloatSmaller(ptHeadEdit.x, rcPlate.left) ||
2019 FX_EDIT_IsFloatEqual(ptHeadEdit.x, rcPlate.left)) {
2020 SetScrollPosX(ptHead.x);
2021 } else if (FX_EDIT_IsFloatBigger(ptHeadEdit.x, rcPlate.right)) {
2022 SetScrollPosX(ptHead.x - rcPlate.Width());
2023 }
2024 }
2025
2026 if (!FX_EDIT_IsFloatEqual(rcPlate.top, rcPlate.bottom)) {
2027 if (FX_EDIT_IsFloatSmaller(ptFootEdit.y, rcPlate.bottom) ||
2028 FX_EDIT_IsFloatEqual(ptFootEdit.y, rcPlate.bottom)) {
2029 if (FX_EDIT_IsFloatSmaller(ptHeadEdit.y, rcPlate.top)) {
2030 SetScrollPosY(ptFoot.y + rcPlate.Height());
2031 }
2032 } else if (FX_EDIT_IsFloatBigger(ptHeadEdit.y, rcPlate.top)) {
2033 if (FX_EDIT_IsFloatBigger(ptFootEdit.y, rcPlate.bottom)) {
2034 SetScrollPosY(ptHead.y);
2035 }
2036 }
2037 }
2038 }
2039 }
2040
2041 void CFX_Edit::Refresh(REFRESH_PLAN_E ePlan,
2042 const CPVT_WordRange* pRange1,
2043 const CPVT_WordRange* pRange2) {
2044 if (m_bEnableRefresh && m_pVT->IsValid()) {
2045 m_Refresh.BeginRefresh();
2046 RefreshPushLineRects(GetVisibleWordRange());
2047
2048 // if (!FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.x,m_ptScrollPos.x) ||
2049 // !FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.y,m_ptScrollPos.y))
2050 // {
2051 m_Refresh.NoAnalyse();
2052 m_ptRefreshScrollPos = m_ptScrollPos;
2053 // }
2054 // else
2055 // {
2056 // switch (ePlan)
2057 // {
2058 // case RP_ANALYSE:
2059 // m_Refresh.Analyse(m_pVT->GetAlignment());
2060 //
2061 // if (pRange1) RefreshPushRandomRects(*pRange1);
2062 // if (pRange2) RefreshPushRandomRects(*pRange2);
2063 // break;
2064 // case RP_NOANALYSE:
2065 // m_Refresh.NoAnalyse();
2066 // break;
2067 // case RP_OPTIONAL:
2068 // if (pRange1) RefreshPushRandomRects(*pRange1);
2069 // if (pRange2) RefreshPushRandomRects(*pRange2);
2070 // break;
2071 // }
2072 // }
2073
2074 if (m_bNotify && m_pNotify) {
2075 if (!m_bNotifyFlag) {
2076 m_bNotifyFlag = TRUE;
2077 if (const CFX_Edit_RectArray* pRects = m_Refresh.GetRefreshRects()) {
2078 for (int32_t i = 0, sz = pRects->GetSize(); i < sz; i++)
2079 m_pNotify->IOnInvalidateRect(pRects->GetAt(i));
2080 }
2081 m_bNotifyFlag = FALSE;
2082 }
2083 }
2084
2085 m_Refresh.EndRefresh();
2086 }
2087 }
2088
2089 void CFX_Edit::RefreshPushLineRects(const CPVT_WordRange& wr) {
2090 if (m_pVT->IsValid()) {
2091 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
2092 CPVT_WordPlace wpBegin = wr.BeginPos;
2093 m_pVT->UpdateWordPlace(wpBegin);
2094 CPVT_WordPlace wpEnd = wr.EndPos;
2095 m_pVT->UpdateWordPlace(wpEnd);
2096 pIterator->SetAt(wpBegin);
2097
2098 CPVT_Line lineinfo;
2099 do {
2100 if (!pIterator->GetLine(lineinfo))
2101 break;
2102 if (lineinfo.lineplace.LineCmp(wpEnd) > 0)
2103 break;
2104
2105 CPDF_Rect rcLine(lineinfo.ptLine.x,
2106 lineinfo.ptLine.y + lineinfo.fLineDescent,
2107 lineinfo.ptLine.x + lineinfo.fLineWidth,
2108 lineinfo.ptLine.y + lineinfo.fLineAscent);
2109
2110 m_Refresh.Push(CPVT_WordRange(lineinfo.lineplace, lineinfo.lineEnd),
2111 VTToEdit(rcLine));
2112
2113 } while (pIterator->NextLine());
2114 }
2115 }
2116 }
2117
2118 void CFX_Edit::RefreshPushRandomRects(const CPVT_WordRange& wr) {
2119 if (m_pVT->IsValid()) {
2120 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
2121 CPVT_WordRange wrTemp = wr;
2122
2123 m_pVT->UpdateWordPlace(wrTemp.BeginPos);
2124 m_pVT->UpdateWordPlace(wrTemp.EndPos);
2125 pIterator->SetAt(wrTemp.BeginPos);
2126
2127 CPVT_Word wordinfo;
2128 CPVT_Line lineinfo;
2129 CPVT_WordPlace place;
2130
2131 while (pIterator->NextWord()) {
2132 place = pIterator->GetAt();
2133 if (place.WordCmp(wrTemp.EndPos) > 0)
2134 break;
2135
2136 pIterator->GetWord(wordinfo);
2137 pIterator->GetLine(lineinfo);
2138
2139 if (place.LineCmp(wrTemp.BeginPos) == 0 ||
2140 place.LineCmp(wrTemp.EndPos) == 0) {
2141 CPDF_Rect rcWord(wordinfo.ptWord.x,
2142 lineinfo.ptLine.y + lineinfo.fLineDescent,
2143 wordinfo.ptWord.x + wordinfo.fWidth,
2144 lineinfo.ptLine.y + lineinfo.fLineAscent);
2145
2146 m_Refresh.AddRefresh(VTToEdit(rcWord));
2147 } else {
2148 CPDF_Rect rcLine(lineinfo.ptLine.x,
2149 lineinfo.ptLine.y + lineinfo.fLineDescent,
2150 lineinfo.ptLine.x + lineinfo.fLineWidth,
2151 lineinfo.ptLine.y + lineinfo.fLineAscent);
2152
2153 m_Refresh.AddRefresh(VTToEdit(rcLine));
2154
2155 pIterator->NextLine();
2156 }
2157 }
2158 }
2159 }
2160 }
2161
2162 void CFX_Edit::RefreshWordRange(const CPVT_WordRange& wr) {
2163 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
2164 CPVT_WordRange wrTemp = wr;
2165
2166 m_pVT->UpdateWordPlace(wrTemp.BeginPos);
2167 m_pVT->UpdateWordPlace(wrTemp.EndPos);
2168 pIterator->SetAt(wrTemp.BeginPos);
2169
2170 CPVT_Word wordinfo;
2171 CPVT_Line lineinfo;
2172 CPVT_WordPlace place;
2173
2174 while (pIterator->NextWord()) {
2175 place = pIterator->GetAt();
2176 if (place.WordCmp(wrTemp.EndPos) > 0)
2094 break; 2177 break;
2095 case 1: 2178
2096 fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f; 2179 pIterator->GetWord(wordinfo);
2097 break; 2180 pIterator->GetLine(lineinfo);
2098 case 2: 2181
2099 fPadding = rcPlate.Height() - rcContent.Height(); 2182 if (place.LineCmp(wrTemp.BeginPos) == 0 ||
2100 break; 2183 place.LineCmp(wrTemp.EndPos) == 0) {
2101 } 2184 CPDF_Rect rcWord(wordinfo.ptWord.x,
2102 2185 lineinfo.ptLine.y + lineinfo.fLineDescent,
2103 return CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left), 2186 wordinfo.ptWord.x + wordinfo.fWidth,
2104 point.y - (m_ptScrollPos.y + fPadding - rcPlate.top)); 2187 lineinfo.ptLine.y + lineinfo.fLineAscent);
2105 } 2188
2106 2189 if (m_bNotify && m_pNotify) {
2107 CPDF_Point CFX_Edit::EditToVT(const CPDF_Point & point) const 2190 if (!m_bNotifyFlag) {
2108 {
2109 CPDF_Rect rcContent = m_pVT->GetContentRect();
2110 CPDF_Rect rcPlate = m_pVT->GetPlateRect();
2111
2112 FX_FLOAT fPadding = 0.0f;
2113
2114 switch (m_nAlignment)
2115 {
2116 case 0:
2117 fPadding = 0.0f;
2118 break;
2119 case 1:
2120 fPadding = (rcPlate.Height() - rcContent.Height()) * 0.5f;
2121 break;
2122 case 2:
2123 fPadding = rcPlate.Height() - rcContent.Height();
2124 break;
2125 }
2126
2127 return CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left),
2128 point.y + (m_ptScrollPos.y + fPadding - rcPlate.top));
2129 }
2130
2131 CPDF_Rect CFX_Edit::VTToEdit(const CPDF_Rect & rect) const
2132 {
2133 CPDF_Point ptLeftBottom = VTToEdit(CPDF_Point(rect.left,rect.bottom));
2134 CPDF_Point ptRightTop = VTToEdit(CPDF_Point(rect.right,rect.top));
2135
2136 return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
2137 }
2138
2139 CPDF_Rect CFX_Edit::EditToVT(const CPDF_Rect & rect) const
2140 {
2141 CPDF_Point ptLeftBottom = EditToVT(CPDF_Point(rect.left,rect.bottom));
2142 CPDF_Point ptRightTop = EditToVT(CPDF_Point(rect.right,rect.top));
2143
2144 return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y);
2145 }
2146
2147 void CFX_Edit::SetScrollInfo()
2148 {
2149 if (m_bNotify && m_pNotify)
2150 {
2151 CPDF_Rect rcPlate = m_pVT->GetPlateRect();
2152 CPDF_Rect rcContent = m_pVT->GetContentRect();
2153
2154 if (!m_bNotifyFlag)
2155 {
2156 m_bNotifyFlag = TRUE; 2191 m_bNotifyFlag = TRUE;
2157 m_pNotify->IOnSetScrollInfoX(rcPlate.left, rcPlate.right, 2192 CPDF_Rect rcRefresh = VTToEdit(rcWord);
2158 rcContent.left, rcContent.right, rcPlate.Width() / 3, rcPlate.Width()); 2193 m_pNotify->IOnInvalidateRect(&rcRefresh);
2159
2160 m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top,
2161 rcContent.bottom, rcContent.top, rcPlate.Height() / 3, rcPla te.Height());
2162 m_bNotifyFlag = FALSE; 2194 m_bNotifyFlag = FALSE;
2195 }
2163 } 2196 }
2164 } 2197 } else {
2165 } 2198 CPDF_Rect rcLine(lineinfo.ptLine.x,
2166 2199 lineinfo.ptLine.y + lineinfo.fLineDescent,
2167 void CFX_Edit::SetScrollPosX(FX_FLOAT fx) 2200 lineinfo.ptLine.x + lineinfo.fLineWidth,
2168 { 2201 lineinfo.ptLine.y + lineinfo.fLineAscent);
2169 if (!m_bEnableScroll) return; 2202
2170 2203 if (m_bNotify && m_pNotify) {
2171 if (m_pVT->IsValid()) 2204 if (!m_bNotifyFlag) {
2172 { 2205 m_bNotifyFlag = TRUE;
2173 if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.x,fx)) 2206 CPDF_Rect rcRefresh = VTToEdit(rcLine);
2174 { 2207 m_pNotify->IOnInvalidateRect(&rcRefresh);
2175 m_ptScrollPos.x = fx; 2208 m_bNotifyFlag = FALSE;
2176 Refresh(RP_NOANALYSE); 2209 }
2177
2178 if (m_bNotify && m_pNotify)
2179 {
2180 if (!m_bNotifyFlag)
2181 {
2182 m_bNotifyFlag = TRUE;
2183 m_pNotify->IOnSetScrollPosX(fx);
2184 m_bNotifyFlag = FALSE;
2185 }
2186 }
2187 } 2210 }
2188 } 2211
2189 } 2212 pIterator->NextLine();
2190 2213 }
2191 void CFX_Edit::SetScrollPosY(FX_FLOAT fy) 2214 }
2192 { 2215 }
2193 if (!m_bEnableScroll) return; 2216 }
2194 2217
2195 if (m_pVT->IsValid()) 2218 void CFX_Edit::SetCaret(const CPVT_WordPlace& place) {
2196 { 2219 m_wpOldCaret = m_wpCaret;
2197 if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y,fy)) 2220 m_wpCaret = place;
2198 { 2221 }
2199 m_ptScrollPos.y = fy; 2222
2200 Refresh(RP_NOANALYSE); 2223 void CFX_Edit::SetCaretInfo() {
2201 2224 if (m_bNotify && m_pNotify) {
2202 if (m_bNotify && m_pNotify) 2225 if (!m_bNotifyFlag) {
2203 { 2226 CPDF_Point ptHead(0.0f, 0.0f), ptFoot(0.0f, 0.0f);
2204 if (!m_bNotifyFlag) 2227
2205 { 2228 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
2206 m_bNotifyFlag = TRUE; 2229 pIterator->SetAt(m_wpCaret);
2207 m_pNotify->IOnSetScrollPosY(fy); 2230 CPVT_Word word;
2208 m_bNotifyFlag = FALSE; 2231 CPVT_Line line;
2209 } 2232 if (pIterator->GetWord(word)) {
2210 } 2233 ptHead.x = word.ptWord.x + word.fWidth;
2234 ptHead.y = word.ptWord.y + word.fAscent;
2235 ptFoot.x = word.ptWord.x + word.fWidth;
2236 ptFoot.y = word.ptWord.y + word.fDescent;
2237 } else if (pIterator->GetLine(line)) {
2238 ptHead.x = line.ptLine.x;
2239 ptHead.y = line.ptLine.y + line.fLineAscent;
2240 ptFoot.x = line.ptLine.x;
2241 ptFoot.y = line.ptLine.y + line.fLineDescent;
2211 } 2242 }
2212 } 2243 }
2213 } 2244
2214 2245 m_bNotifyFlag = TRUE;
2215 void CFX_Edit::SetScrollPos(const CPDF_Point & point) 2246 m_pNotify->IOnSetCaret(!m_SelState.IsExist(), VTToEdit(ptHead),
2216 { 2247 VTToEdit(ptFoot), m_wpCaret);
2217 SetScrollPosX(point.x); 2248 m_bNotifyFlag = FALSE;
2218 SetScrollPosY(point.y); 2249 }
2219 SetScrollLimit(); 2250 }
2251
2252 SetCaretChange();
2253 }
2254
2255 void CFX_Edit::SetCaretChange() {
2256 if (m_wpCaret == m_wpOldCaret)
2257 return;
2258
2259 if (m_bNotify && m_pVT->IsRichText() && m_pNotify) {
2260 CPVT_SecProps SecProps;
2261 CPVT_WordProps WordProps;
2262
2263 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
2264 pIterator->SetAt(m_wpCaret);
2265 CPVT_Word word;
2266 CPVT_Section section;
2267
2268 if (pIterator->GetSection(section)) {
2269 SecProps = section.SecProps;
2270 WordProps = section.WordProps;
2271 }
2272
2273 if (pIterator->GetWord(word)) {
2274 WordProps = word.WordProps;
2275 }
2276 }
2277
2278 if (!m_bNotifyFlag) {
2279 m_bNotifyFlag = TRUE;
2280 m_pNotify->IOnCaretChange(SecProps, WordProps);
2281 m_bNotifyFlag = FALSE;
2282 }
2283 }
2284 }
2285
2286 void CFX_Edit::SetCaret(int32_t nPos) {
2287 if (m_pVT->IsValid()) {
2288 SelectNone();
2289 SetCaret(m_pVT->WordIndexToWordPlace(nPos));
2290 m_SelState.Set(m_wpCaret, m_wpCaret);
2291
2292 ScrollToCaret();
2293 SetCaretOrigin();
2220 SetCaretInfo(); 2294 SetCaretInfo();
2221 } 2295 }
2222 2296 }
2223 CPDF_Point CFX_Edit::GetScrollPos() const 2297
2224 { 2298 void CFX_Edit::OnMouseDown(const CPDF_Point& point,
2225 return m_ptScrollPos; 2299 FX_BOOL bShift,
2226 } 2300 FX_BOOL bCtrl) {
2227 2301 if (m_pVT->IsValid()) {
2228 void CFX_Edit::SetScrollLimit() 2302 SelectNone();
2229 { 2303 SetCaret(m_pVT->SearchWordPlace(EditToVT(point)));
2230 if (m_pVT->IsValid()) 2304 m_SelState.Set(m_wpCaret, m_wpCaret);
2231 { 2305
2232 CPDF_Rect rcContent = m_pVT->GetContentRect(); 2306 ScrollToCaret();
2233 CPDF_Rect rcPlate = m_pVT->GetPlateRect(); 2307 SetCaretOrigin();
2234 2308 SetCaretInfo();
2235 if (rcPlate.Width() > rcContent.Width()) 2309 }
2236 { 2310 }
2237 SetScrollPosX(rcPlate.left); 2311
2238 } 2312 void CFX_Edit::OnMouseMove(const CPDF_Point& point,
2313 FX_BOOL bShift,
2314 FX_BOOL bCtrl) {
2315 if (m_pVT->IsValid()) {
2316 SetCaret(m_pVT->SearchWordPlace(EditToVT(point)));
2317
2318 if (m_wpCaret != m_wpOldCaret) {
2319 m_SelState.SetEndPos(m_wpCaret);
2320
2321 ScrollToCaret();
2322 CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
2323 Refresh(RP_OPTIONAL, &wr);
2324 SetCaretOrigin();
2325 SetCaretInfo();
2326 }
2327 }
2328 }
2329
2330 void CFX_Edit::OnVK_UP(FX_BOOL bShift, FX_BOOL bCtrl) {
2331 if (m_pVT->IsValid()) {
2332 SetCaret(m_pVT->GetUpWordPlace(m_wpCaret, m_ptCaret));
2333
2334 if (bShift) {
2335 if (m_SelState.IsExist())
2336 m_SelState.SetEndPos(m_wpCaret);
2337 else
2338 m_SelState.Set(m_wpOldCaret, m_wpCaret);
2339
2340 if (m_wpOldCaret != m_wpCaret) {
2341 ScrollToCaret();
2342 CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
2343 Refresh(RP_OPTIONAL, &wr);
2344 SetCaretInfo();
2345 }
2346 } else {
2347 SelectNone();
2348
2349 ScrollToCaret();
2350 SetCaretInfo();
2351 }
2352 }
2353 }
2354
2355 void CFX_Edit::OnVK_DOWN(FX_BOOL bShift, FX_BOOL bCtrl) {
2356 if (m_pVT->IsValid()) {
2357 SetCaret(m_pVT->GetDownWordPlace(m_wpCaret, m_ptCaret));
2358
2359 if (bShift) {
2360 if (m_SelState.IsExist())
2361 m_SelState.SetEndPos(m_wpCaret);
2362 else
2363 m_SelState.Set(m_wpOldCaret, m_wpCaret);
2364
2365 if (m_wpOldCaret != m_wpCaret) {
2366 ScrollToCaret();
2367 CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
2368 Refresh(RP_OPTIONAL, &wr);
2369 SetCaretInfo();
2370 }
2371 } else {
2372 SelectNone();
2373
2374 ScrollToCaret();
2375 SetCaretInfo();
2376 }
2377 }
2378 }
2379
2380 void CFX_Edit::OnVK_LEFT(FX_BOOL bShift, FX_BOOL bCtrl) {
2381 if (m_pVT->IsValid()) {
2382 if (bShift) {
2383 if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) &&
2384 m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret))
2385 SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
2386
2387 SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
2388
2389 if (m_SelState.IsExist())
2390 m_SelState.SetEndPos(m_wpCaret);
2391 else
2392 m_SelState.Set(m_wpOldCaret, m_wpCaret);
2393
2394 if (m_wpOldCaret != m_wpCaret) {
2395 ScrollToCaret();
2396 CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
2397 Refresh(RP_OPTIONAL, &wr);
2398 SetCaretInfo();
2399 }
2400 } else {
2401 if (m_SelState.IsExist()) {
2402 if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) < 0)
2403 SetCaret(m_SelState.BeginPos);
2239 else 2404 else
2240 { 2405 SetCaret(m_SelState.EndPos);
2241 if (FX_EDIT_IsFloatSmaller(m_ptScrollPos.x, rcContent.left)) 2406
2242 {
2243 SetScrollPosX(rcContent.left);
2244 }
2245 else if (FX_EDIT_IsFloatBigger(m_ptScrollPos.x, rcContent.right - rc Plate.Width()))
2246 {
2247 SetScrollPosX(rcContent.right - rcPlate.Width());
2248 }
2249 }
2250
2251 if (rcPlate.Height() > rcContent.Height())
2252 {
2253 SetScrollPosY(rcPlate.top);
2254 }
2255 else
2256 {
2257 if (FX_EDIT_IsFloatSmaller(m_ptScrollPos.y, rcContent.bottom + rcPla te.Height()))
2258 {
2259 SetScrollPosY(rcContent.bottom + rcPlate.Height());
2260 }
2261 else if (FX_EDIT_IsFloatBigger(m_ptScrollPos.y, rcContent.top))
2262 {
2263 SetScrollPosY(rcContent.top);
2264 }
2265 }
2266 }
2267 }
2268
2269 void CFX_Edit::ScrollToCaret()
2270 {
2271 SetScrollLimit();
2272
2273 if (m_pVT->IsValid())
2274 {
2275 CPDF_Point ptHead(0,0);
2276 CPDF_Point ptFoot(0,0);
2277
2278 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
2279 {
2280 pIterator->SetAt(m_wpCaret);
2281
2282 CPVT_Word word;
2283 CPVT_Line line;
2284 if (pIterator->GetWord(word))
2285 {
2286 ptHead.x = word.ptWord.x + word.fWidth;
2287 ptHead.y = word.ptWord.y + word.fAscent;
2288 ptFoot.x = word.ptWord.x + word.fWidth;
2289 ptFoot.y = word.ptWord.y + word.fDescent;
2290 }
2291 else if (pIterator->GetLine(line))
2292 {
2293 ptHead.x = line.ptLine.x;
2294 ptHead.y = line.ptLine.y + line.fLineAscent;
2295 ptFoot.x = line.ptLine.x;
2296 ptFoot.y = line.ptLine.y + line.fLineDescent;
2297 }
2298 }
2299
2300 CPDF_Point ptHeadEdit = VTToEdit(ptHead);
2301 CPDF_Point ptFootEdit = VTToEdit(ptFoot);
2302
2303 CPDF_Rect rcPlate = m_pVT->GetPlateRect();
2304
2305 if (!FX_EDIT_IsFloatEqual(rcPlate.left,rcPlate.right))
2306 {
2307 if (FX_EDIT_IsFloatSmaller(ptHeadEdit.x, rcPlate.left) ||
2308 FX_EDIT_IsFloatEqual(ptHeadEdit.x, rcPlate.left))
2309 {
2310 SetScrollPosX(ptHead.x);
2311 }
2312 else if (FX_EDIT_IsFloatBigger(ptHeadEdit.x, rcPlate.right))
2313 {
2314 SetScrollPosX(ptHead.x - rcPlate.Width());
2315 }
2316 }
2317
2318 if (!FX_EDIT_IsFloatEqual(rcPlate.top,rcPlate.bottom))
2319 {
2320 if (FX_EDIT_IsFloatSmaller(ptFootEdit.y, rcPlate.bottom) ||
2321 FX_EDIT_IsFloatEqual(ptFootEdit.y, rcPlate.bottom))
2322 {
2323 if (FX_EDIT_IsFloatSmaller(ptHeadEdit.y, rcPlate.top))
2324 {
2325 SetScrollPosY(ptFoot.y + rcPlate.Height());
2326 }
2327 }
2328 else if (FX_EDIT_IsFloatBigger(ptHeadEdit.y, rcPlate.top))
2329 {
2330 if (FX_EDIT_IsFloatBigger(ptFootEdit.y, rcPlate.bottom))
2331 {
2332 SetScrollPosY(ptHead.y);
2333 }
2334 }
2335 }
2336 }
2337 }
2338
2339 void CFX_Edit::Refresh(REFRESH_PLAN_E ePlan,const CPVT_WordRange * pRange1,const CPVT_WordRange * pRange2)
2340 {
2341 if (m_bEnableRefresh && m_pVT->IsValid())
2342 {
2343 m_Refresh.BeginRefresh();
2344 RefreshPushLineRects(GetVisibleWordRange());
2345
2346 // if (!FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.x,m_ptScrollPos.x) ||
2347 // !FX_EDIT_IsFloatEqual(m_ptRefreshScrollPos.y,m_ptScrollPos.y))
2348 // {
2349 m_Refresh.NoAnalyse();
2350 m_ptRefreshScrollPos = m_ptScrollPos;
2351 // }
2352 // else
2353 // {
2354 // switch (ePlan)
2355 // {
2356 // case RP_ANALYSE:
2357 // m_Refresh.Analyse(m_pVT->GetAlignment());
2358 //
2359 // if (pRange1) RefreshPushRandomRects(*pRange1);
2360 // if (pRange2) RefreshPushRandomRects(*pRange2);
2361 // break;
2362 // case RP_NOANALYSE:
2363 // m_Refresh.NoAnalyse();
2364 // break;
2365 // case RP_OPTIONAL:
2366 // if (pRange1) RefreshPushRandomRects(*pRange1);
2367 // if (pRange2) RefreshPushRandomRects(*pRange2);
2368 // break;
2369 // }
2370 // }
2371
2372 if (m_bNotify && m_pNotify)
2373 {
2374 if (!m_bNotifyFlag)
2375 {
2376 m_bNotifyFlag = TRUE;
2377 if (const CFX_Edit_RectArray * pRects = m_Refresh.GetRefreshRect s())
2378 {
2379 for (int32_t i = 0, sz = pRects->GetSize(); i < sz; i++)
2380 m_pNotify->IOnInvalidateRect(pRects->GetAt(i));
2381 }
2382 m_bNotifyFlag = FALSE;
2383 }
2384 }
2385
2386 m_Refresh.EndRefresh();
2387 }
2388 }
2389
2390 void CFX_Edit::RefreshPushLineRects(const CPVT_WordRange & wr)
2391 {
2392 if (m_pVT->IsValid())
2393 {
2394 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
2395 {
2396 CPVT_WordPlace wpBegin = wr.BeginPos;
2397 m_pVT->UpdateWordPlace(wpBegin);
2398 CPVT_WordPlace wpEnd = wr.EndPos;
2399 m_pVT->UpdateWordPlace(wpEnd);
2400 pIterator->SetAt(wpBegin);
2401
2402 CPVT_Line lineinfo;
2403 do
2404 {
2405 if (!pIterator->GetLine(lineinfo))break;
2406 if (lineinfo.lineplace.LineCmp(wpEnd) > 0)break;
2407
2408 CPDF_Rect rcLine(lineinfo.ptLine.x,
2409 lineinfo.ptLine.y + lineinfo.fLineDescent,
2410 lineinfo.ptLine.x + lineinfo.fLineWidth,
2411 lineinfo.ptLine.y + lineinfo.fLineAscent);
2412
2413 m_Refresh.Push(CPVT_WordRange(lineinfo.lineplace,lineinfo.lineEn d),VTToEdit(rcLine));
2414
2415 }while (pIterator->NextLine());
2416 }
2417 }
2418 }
2419
2420 void CFX_Edit::RefreshPushRandomRects(const CPVT_WordRange & wr)
2421 {
2422 if (m_pVT->IsValid())
2423 {
2424 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
2425 {
2426 CPVT_WordRange wrTemp = wr;
2427
2428 m_pVT->UpdateWordPlace(wrTemp.BeginPos);
2429 m_pVT->UpdateWordPlace(wrTemp.EndPos);
2430 pIterator->SetAt(wrTemp.BeginPos);
2431
2432 CPVT_Word wordinfo;
2433 CPVT_Line lineinfo;
2434 CPVT_WordPlace place;
2435
2436 while (pIterator->NextWord())
2437 {
2438 place = pIterator->GetAt();
2439 if (place.WordCmp(wrTemp.EndPos) > 0) break;
2440
2441 pIterator->GetWord(wordinfo);
2442 pIterator->GetLine(lineinfo);
2443
2444 if (place.LineCmp(wrTemp.BeginPos) == 0 || place.LineCmp(wrTemp. EndPos) == 0)
2445 {
2446 CPDF_Rect rcWord(wordinfo.ptWord.x,
2447 lineinfo.ptLine.y + lineinfo.fLineDescen t,
2448 wordinfo.ptWord.x + wordinfo.fWidth,
2449 lineinfo.ptLine.y + lineinfo.fLineAscent );
2450
2451 m_Refresh.AddRefresh(VTToEdit(rcWord));
2452 }
2453 else
2454 {
2455 CPDF_Rect rcLine(lineinfo.ptLine.x,
2456 lineinfo.ptLine.y + lineinfo.fLineDescen t,
2457 lineinfo.ptLine.x + lineinfo.fLineWidth,
2458 lineinfo.ptLine.y + lineinfo.fLineAscent );
2459
2460 m_Refresh.AddRefresh(VTToEdit(rcLine));
2461
2462 pIterator->NextLine();
2463 }
2464 }
2465 }
2466 }
2467 }
2468
2469 void CFX_Edit::RefreshWordRange(const CPVT_WordRange& wr)
2470 {
2471 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
2472 {
2473 CPVT_WordRange wrTemp = wr;
2474
2475 m_pVT->UpdateWordPlace(wrTemp.BeginPos);
2476 m_pVT->UpdateWordPlace(wrTemp.EndPos);
2477 pIterator->SetAt(wrTemp.BeginPos);
2478
2479 CPVT_Word wordinfo;
2480 CPVT_Line lineinfo;
2481 CPVT_WordPlace place;
2482
2483 while (pIterator->NextWord())
2484 {
2485 place = pIterator->GetAt();
2486 if (place.WordCmp(wrTemp.EndPos) > 0) break;
2487
2488 pIterator->GetWord(wordinfo);
2489 pIterator->GetLine(lineinfo);
2490
2491 if (place.LineCmp(wrTemp.BeginPos) == 0 || place.LineCmp(wrTemp.EndP os) == 0)
2492 {
2493 CPDF_Rect rcWord(wordinfo.ptWord.x,
2494 lineinfo.ptLine.y + lineinfo.fLineDescent,
2495 wordinfo.ptWord.x + wordinfo.fWidth,
2496 lineinfo.ptLine.y + lineinfo.fLineAscent);
2497
2498 if (m_bNotify && m_pNotify)
2499 {
2500 if (!m_bNotifyFlag)
2501 {
2502 m_bNotifyFlag = TRUE;
2503 CPDF_Rect rcRefresh = VTToEdit(rcWord);
2504 m_pNotify->IOnInvalidateRect(&rcRefresh);
2505 m_bNotifyFlag = FALSE;
2506 }
2507 }
2508 }
2509 else
2510 {
2511 CPDF_Rect rcLine(lineinfo.ptLine.x,
2512 lineinfo.ptLine.y + lineinfo.fLineDescent,
2513 lineinfo.ptLine.x + lineinfo.fLineWidth,
2514 lineinfo.ptLine.y + lineinfo.fLineAscent);
2515
2516 if (m_bNotify && m_pNotify)
2517 {
2518 if (!m_bNotifyFlag)
2519 {
2520 m_bNotifyFlag = TRUE;
2521 CPDF_Rect rcRefresh = VTToEdit(rcLine);
2522 m_pNotify->IOnInvalidateRect(&rcRefresh);
2523 m_bNotifyFlag = FALSE;
2524 }
2525 }
2526
2527 pIterator->NextLine();
2528 }
2529 }
2530 }
2531 }
2532
2533 void CFX_Edit::SetCaret(const CPVT_WordPlace & place)
2534 {
2535 m_wpOldCaret = m_wpCaret;
2536 m_wpCaret = place;
2537 }
2538
2539 void CFX_Edit::SetCaretInfo()
2540 {
2541 if (m_bNotify && m_pNotify)
2542 {
2543 if (!m_bNotifyFlag)
2544 {
2545 CPDF_Point ptHead(0.0f,0.0f),ptFoot(0.0f,0.0f);
2546
2547 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
2548 {
2549 pIterator->SetAt(m_wpCaret);
2550 CPVT_Word word;
2551 CPVT_Line line;
2552 if (pIterator->GetWord(word))
2553 {
2554 ptHead.x = word.ptWord.x + word.fWidth;
2555 ptHead.y = word.ptWord.y + word.fAscent;
2556 ptFoot.x = word.ptWord.x + word.fWidth;
2557 ptFoot.y = word.ptWord.y + word.fDescent;
2558 }
2559 else if (pIterator->GetLine(line))
2560 {
2561 ptHead.x = line.ptLine.x;
2562 ptHead.y = line.ptLine.y + line.fLineAscent;
2563 ptFoot.x = line.ptLine.x;
2564 ptFoot.y = line.ptLine.y + line.fLineDescent;
2565 }
2566 }
2567
2568 m_bNotifyFlag = TRUE;
2569 m_pNotify->IOnSetCaret(!m_SelState.IsExist(),VTToEdit(ptHead),VTToEd it(ptFoot), m_wpCaret);
2570 m_bNotifyFlag = FALSE;
2571 }
2572 }
2573
2574 SetCaretChange();
2575 }
2576
2577 void CFX_Edit::SetCaretChange()
2578 {
2579 if (m_wpCaret == m_wpOldCaret) return;
2580
2581 if (m_bNotify && m_pVT->IsRichText() && m_pNotify)
2582 {
2583 CPVT_SecProps SecProps;
2584 CPVT_WordProps WordProps;
2585
2586 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
2587 {
2588 pIterator->SetAt(m_wpCaret);
2589 CPVT_Word word;
2590 CPVT_Section section;
2591
2592 if (pIterator->GetSection(section))
2593 {
2594 SecProps = section.SecProps;
2595 WordProps = section.WordProps;
2596 }
2597
2598 if (pIterator->GetWord(word))
2599 {
2600 WordProps = word.WordProps;
2601 }
2602 }
2603
2604 if (!m_bNotifyFlag)
2605 {
2606 m_bNotifyFlag = TRUE;
2607 m_pNotify->IOnCaretChange(SecProps,WordProps);
2608 m_bNotifyFlag = FALSE;
2609 }
2610 }
2611 }
2612
2613 void CFX_Edit::SetCaret(int32_t nPos)
2614 {
2615 if (m_pVT->IsValid())
2616 {
2617 SelectNone(); 2407 SelectNone();
2618 SetCaret(m_pVT->WordIndexToWordPlace(nPos)); 2408 ScrollToCaret();
2619 m_SelState.Set(m_wpCaret,m_wpCaret); 2409 SetCaretInfo();
2410 } else {
2411 if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) &&
2412 m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret))
2413 SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
2414
2415 SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
2620 2416
2621 ScrollToCaret(); 2417 ScrollToCaret();
2622 SetCaretOrigin(); 2418 SetCaretOrigin();
2623 SetCaretInfo(); 2419 SetCaretInfo();
2624 } 2420 }
2625 } 2421 }
2626 2422 }
2627 void CFX_Edit::OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl ) 2423 }
2628 { 2424
2629 if (m_pVT->IsValid()) 2425 void CFX_Edit::OnVK_RIGHT(FX_BOOL bShift, FX_BOOL bCtrl) {
2630 { 2426 if (m_pVT->IsValid()) {
2427 if (bShift) {
2428 SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
2429
2430 if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) &&
2431 m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret))
2432 SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
2433
2434 if (m_SelState.IsExist())
2435 m_SelState.SetEndPos(m_wpCaret);
2436 else
2437 m_SelState.Set(m_wpOldCaret, m_wpCaret);
2438
2439 if (m_wpOldCaret != m_wpCaret) {
2440 ScrollToCaret();
2441 CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
2442 Refresh(RP_OPTIONAL, &wr);
2443 SetCaretInfo();
2444 }
2445 } else {
2446 if (m_SelState.IsExist()) {
2447 if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) > 0)
2448 SetCaret(m_SelState.BeginPos);
2449 else
2450 SetCaret(m_SelState.EndPos);
2451
2631 SelectNone(); 2452 SelectNone();
2632 SetCaret(m_pVT->SearchWordPlace(EditToVT(point))); 2453 ScrollToCaret();
2633 m_SelState.Set(m_wpCaret,m_wpCaret); 2454 SetCaretInfo();
2455 } else {
2456 SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
2457
2458 if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) &&
2459 m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret))
2460 SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
2634 2461
2635 ScrollToCaret(); 2462 ScrollToCaret();
2636 SetCaretOrigin(); 2463 SetCaretOrigin();
2637 SetCaretInfo(); 2464 SetCaretInfo();
2638 } 2465 }
2639 } 2466 }
2640 2467 }
2641 void CFX_Edit::OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl ) 2468 }
2642 { 2469
2643 if (m_pVT->IsValid()) 2470 void CFX_Edit::OnVK_HOME(FX_BOOL bShift, FX_BOOL bCtrl) {
2644 { 2471 if (m_pVT->IsValid()) {
2645 SetCaret(m_pVT->SearchWordPlace(EditToVT(point))); 2472 if (bShift) {
2646 2473 if (bCtrl)
2647 if (m_wpCaret != m_wpOldCaret) 2474 SetCaret(m_pVT->GetBeginWordPlace());
2648 { 2475 else
2649 m_SelState.SetEndPos(m_wpCaret); 2476 SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret));
2650 2477
2651 ScrollToCaret(); 2478 if (m_SelState.IsExist())
2652 CPVT_WordRange wr(m_wpOldCaret,m_wpCaret); 2479 m_SelState.SetEndPos(m_wpCaret);
2653 Refresh(RP_OPTIONAL,&wr); 2480 else
2654 SetCaretOrigin(); 2481 m_SelState.Set(m_wpOldCaret, m_wpCaret);
2655 SetCaretInfo(); 2482
2656 } 2483 ScrollToCaret();
2657 } 2484 CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
2658 } 2485 Refresh(RP_OPTIONAL, &wr);
2659 2486 SetCaretInfo();
2660 void CFX_Edit::OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl) 2487 } else {
2661 { 2488 if (m_SelState.IsExist()) {
2662 if (m_pVT->IsValid()) 2489 if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) < 0)
2663 { 2490 SetCaret(m_SelState.BeginPos);
2664 SetCaret(m_pVT->GetUpWordPlace(m_wpCaret,m_ptCaret));
2665
2666 if (bShift)
2667 {
2668 if (m_SelState.IsExist())
2669 m_SelState.SetEndPos(m_wpCaret);
2670 else
2671 m_SelState.Set(m_wpOldCaret,m_wpCaret);
2672
2673 if (m_wpOldCaret != m_wpCaret)
2674 {
2675 ScrollToCaret();
2676 CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
2677 Refresh(RP_OPTIONAL, &wr);
2678 SetCaretInfo();
2679 }
2680 }
2681 else 2491 else
2682 { 2492 SetCaret(m_SelState.EndPos);
2683 SelectNone(); 2493
2684 2494 SelectNone();
2685 ScrollToCaret(); 2495 ScrollToCaret();
2686 SetCaretInfo(); 2496 SetCaretInfo();
2687 } 2497 } else {
2688 } 2498 if (bCtrl)
2689 } 2499 SetCaret(m_pVT->GetBeginWordPlace());
2690
2691 void CFX_Edit::OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl)
2692 {
2693 if (m_pVT->IsValid())
2694 {
2695 SetCaret(m_pVT->GetDownWordPlace(m_wpCaret,m_ptCaret));
2696
2697 if (bShift)
2698 {
2699 if (m_SelState.IsExist())
2700 m_SelState.SetEndPos(m_wpCaret);
2701 else
2702 m_SelState.Set(m_wpOldCaret,m_wpCaret);
2703
2704 if (m_wpOldCaret != m_wpCaret)
2705 {
2706 ScrollToCaret();
2707 CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
2708 Refresh(RP_OPTIONAL, &wr);
2709 SetCaretInfo();
2710 }
2711 }
2712 else 2500 else
2713 { 2501 SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret));
2714 SelectNone(); 2502
2715 2503 ScrollToCaret();
2716 ScrollToCaret(); 2504 SetCaretOrigin();
2717 SetCaretInfo(); 2505 SetCaretInfo();
2718 } 2506 }
2719 } 2507 }
2720 } 2508 }
2721 2509 }
2722 void CFX_Edit::OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl) 2510
2723 { 2511 void CFX_Edit::OnVK_END(FX_BOOL bShift, FX_BOOL bCtrl) {
2724 if (m_pVT->IsValid()) 2512 if (m_pVT->IsValid()) {
2725 { 2513 if (bShift) {
2726 if (bShift) 2514 if (bCtrl)
2727 { 2515 SetCaret(m_pVT->GetEndWordPlace());
2728 if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) && 2516 else
2729 m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret)) 2517 SetCaret(m_pVT->GetLineEndPlace(m_wpCaret));
2730 SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret)); 2518
2731 2519 if (m_SelState.IsExist())
2732 SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret)); 2520 m_SelState.SetEndPos(m_wpCaret);
2733 2521 else
2734 if (m_SelState.IsExist()) 2522 m_SelState.Set(m_wpOldCaret, m_wpCaret);
2735 m_SelState.SetEndPos(m_wpCaret); 2523
2736 else 2524 ScrollToCaret();
2737 m_SelState.Set(m_wpOldCaret, m_wpCaret); 2525 CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
2738 2526 Refresh(RP_OPTIONAL, &wr);
2739 if (m_wpOldCaret != m_wpCaret) 2527 SetCaretInfo();
2740 { 2528 } else {
2741 ScrollToCaret(); 2529 if (m_SelState.IsExist()) {
2742 CPVT_WordRange wr(m_wpOldCaret,m_wpCaret); 2530 if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos) > 0)
2743 Refresh(RP_OPTIONAL,&wr); 2531 SetCaret(m_SelState.BeginPos);
2744 SetCaretInfo();
2745 }
2746 }
2747 else 2532 else
2748 { 2533 SetCaret(m_SelState.EndPos);
2749 if (m_SelState.IsExist()) 2534
2750 { 2535 SelectNone();
2751 if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0) 2536 ScrollToCaret();
2752 SetCaret(m_SelState.BeginPos); 2537 SetCaretInfo();
2753 else 2538 } else {
2754 SetCaret(m_SelState.EndPos); 2539 if (bCtrl)
2755 2540 SetCaret(m_pVT->GetEndWordPlace());
2756 SelectNone();
2757 ScrollToCaret();
2758 SetCaretInfo();
2759 }
2760 else
2761 {
2762 if (m_wpCaret == m_pVT->GetLineBeginPlace(m_wpCaret) &&
2763 m_wpCaret != m_pVT->GetSectionBeginPlace(m_wpCaret))
2764 SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
2765
2766 SetCaret(m_pVT->GetPrevWordPlace(m_wpCaret));
2767
2768 ScrollToCaret();
2769 SetCaretOrigin();
2770 SetCaretInfo();
2771 }
2772 }
2773 }
2774 }
2775
2776 void CFX_Edit::OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl)
2777 {
2778 if (m_pVT->IsValid())
2779 {
2780 if (bShift)
2781 {
2782 SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
2783
2784 if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) &&
2785 m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret))
2786 SetCaret(m_pVT->GetNextWordPlace(m_wpCaret));
2787
2788 if (m_SelState.IsExist())
2789 m_SelState.SetEndPos(m_wpCaret);
2790 else
2791 m_SelState.Set(m_wpOldCaret,m_wpCaret);
2792
2793 if (m_wpOldCaret != m_wpCaret)
2794 {
2795 ScrollToCaret();
2796 CPVT_WordRange wr(m_wpOldCaret,m_wpCaret);
2797 Refresh(RP_OPTIONAL,&wr);
2798 SetCaretInfo();
2799 }
2800 }
2801 else 2541 else
2802 { 2542 SetCaret(m_pVT->GetLineEndPlace(m_wpCaret));
2803 if (m_SelState.IsExist()) 2543
2804 { 2544 ScrollToCaret();
2805 if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)>0) 2545 SetCaretOrigin();
2806 SetCaret(m_SelState.BeginPos); 2546 SetCaretInfo();
2807 else 2547 }
2808 SetCaret(m_SelState.EndPos); 2548 }
2809 2549 }
2810 SelectNone(); 2550 }
2811 ScrollToCaret(); 2551
2812 SetCaretInfo(); 2552 void CFX_Edit::SetText(const FX_WCHAR* text,
2813 } 2553 int32_t charset,
2814 else 2554 const CPVT_SecProps* pSecProps,
2815 { 2555 const CPVT_WordProps* pWordProps,
2816 SetCaret(m_pVT->GetNextWordPlace(m_wpCaret)); 2556 FX_BOOL bAddUndo,
2817 2557 FX_BOOL bPaint) {
2818 if (m_wpCaret == m_pVT->GetLineEndPlace(m_wpCaret) && 2558 Empty();
2819 m_wpCaret != m_pVT->GetSectionEndPlace(m_wpCaret)) 2559 DoInsertText(CPVT_WordPlace(0, 0, -1), text, charset, pSecProps, pWordProps);
2820 SetCaret(m_pVT->GetNextWordPlace(m_wpCaret)); 2560 if (bPaint)
2821 2561 Paint();
2822 ScrollToCaret(); 2562 if (m_bOprNotify && m_pOprNotify)
2823 SetCaretOrigin(); 2563 m_pOprNotify->OnSetText(m_wpCaret, m_wpOldCaret);
2824 SetCaretInfo(); 2564 // if (bAddUndo)
2825 } 2565 }
2826 } 2566
2827 } 2567 FX_BOOL CFX_Edit::InsertWord(FX_WORD word,
2828 } 2568 int32_t charset,
2829 2569 const CPVT_WordProps* pWordProps,
2830 void CFX_Edit::OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl) 2570 FX_BOOL bAddUndo,
2831 { 2571 FX_BOOL bPaint) {
2832 if (m_pVT->IsValid()) 2572 if (IsTextOverflow())
2833 {
2834 if (bShift)
2835 {
2836 if (bCtrl)
2837 SetCaret(m_pVT->GetBeginWordPlace());
2838 else
2839 SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret));
2840
2841 if (m_SelState.IsExist())
2842 m_SelState.SetEndPos(m_wpCaret);
2843 else
2844 m_SelState.Set(m_wpOldCaret,m_wpCaret);
2845
2846 ScrollToCaret();
2847 CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
2848 Refresh(RP_OPTIONAL, &wr);
2849 SetCaretInfo();
2850 }
2851 else
2852 {
2853 if (m_SelState.IsExist())
2854 {
2855 if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)<0)
2856 SetCaret(m_SelState.BeginPos);
2857 else
2858 SetCaret(m_SelState.EndPos);
2859
2860 SelectNone();
2861 ScrollToCaret();
2862 SetCaretInfo();
2863 }
2864 else
2865 {
2866 if (bCtrl)
2867 SetCaret(m_pVT->GetBeginWordPlace());
2868 else
2869 SetCaret(m_pVT->GetLineBeginPlace(m_wpCaret));
2870
2871 ScrollToCaret();
2872 SetCaretOrigin();
2873 SetCaretInfo();
2874 }
2875 }
2876 }
2877 }
2878
2879 void CFX_Edit::OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl)
2880 {
2881 if (m_pVT->IsValid())
2882 {
2883 if (bShift)
2884 {
2885 if (bCtrl)
2886 SetCaret(m_pVT->GetEndWordPlace());
2887 else
2888 SetCaret(m_pVT->GetLineEndPlace(m_wpCaret));
2889
2890 if (m_SelState.IsExist())
2891 m_SelState.SetEndPos(m_wpCaret);
2892 else
2893 m_SelState.Set(m_wpOldCaret, m_wpCaret);
2894
2895 ScrollToCaret();
2896 CPVT_WordRange wr(m_wpOldCaret, m_wpCaret);
2897 Refresh(RP_OPTIONAL, &wr);
2898 SetCaretInfo();
2899 }
2900 else
2901 {
2902 if (m_SelState.IsExist())
2903 {
2904 if (m_SelState.BeginPos.WordCmp(m_SelState.EndPos)>0)
2905 SetCaret(m_SelState.BeginPos);
2906 else
2907 SetCaret(m_SelState.EndPos);
2908
2909 SelectNone();
2910 ScrollToCaret();
2911 SetCaretInfo();
2912 }
2913 else
2914 {
2915 if (bCtrl)
2916 SetCaret(m_pVT->GetEndWordPlace());
2917 else
2918 SetCaret(m_pVT->GetLineEndPlace(m_wpCaret));
2919
2920 ScrollToCaret();
2921 SetCaretOrigin();
2922 SetCaretInfo();
2923 }
2924 }
2925 }
2926 }
2927
2928 void CFX_Edit::SetText(const FX_WCHAR* text,int32_t charset,
2929 const CPVT_SecProps * pSecProps,const CPVT_WordProps * p WordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)
2930 {
2931 Empty();
2932 DoInsertText(CPVT_WordPlace(0,0,-1), text, charset, pSecProps, pWordProps);
2933 if (bPaint) Paint();
2934 if (m_bOprNotify && m_pOprNotify)
2935 m_pOprNotify->OnSetText(m_wpCaret, m_wpOldCaret);
2936 //if (bAddUndo)
2937 }
2938
2939 FX_BOOL CFX_Edit::InsertWord(FX_WORD word, int32_t charset, const CPVT_WordProps * pWordProps, FX_BOOL bAddUndo, FX_BOOL bPaint)
2940 {
2941 if (IsTextOverflow()) return FALSE;
2942
2943 if (m_pVT->IsValid())
2944 {
2945 m_pVT->UpdateWordPlace(m_wpCaret);
2946
2947 SetCaret(m_pVT->InsertWord(m_wpCaret,word,GetCharSetFromUnicode(word, ch arset),pWordProps));
2948 m_SelState.Set(m_wpCaret,m_wpCaret);
2949
2950 if (m_wpCaret != m_wpOldCaret)
2951 {
2952 if (bAddUndo && m_bEnableUndo)
2953 {
2954 AddEditUndoItem(new CFXEU_InsertWord(this,m_wpOldCaret,m_wpCaret ,word,charset,pWordProps));
2955 }
2956
2957 if (bPaint)
2958 PaintInsertText(m_wpOldCaret, m_wpCaret);
2959
2960 if (m_bOprNotify && m_pOprNotify)
2961 m_pOprNotify->OnInsertWord(m_wpCaret, m_wpOldCaret);
2962
2963 return TRUE;
2964 }
2965 }
2966
2967 return FALSE; 2573 return FALSE;
2968 } 2574
2969 2575 if (m_pVT->IsValid()) {
2970 FX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps * pSecProps,const CPVT_WordPr ops * pWordProps, 2576 m_pVT->UpdateWordPlace(m_wpCaret);
2971 FX_BOOL bAddUndo, FX_BOOL bPaint) 2577
2972 { 2578 SetCaret(m_pVT->InsertWord(
2973 if (IsTextOverflow()) return FALSE; 2579 m_wpCaret, word, GetCharSetFromUnicode(word, charset), pWordProps));
2974 2580 m_SelState.Set(m_wpCaret, m_wpCaret);
2975 if (m_pVT->IsValid()) 2581
2976 { 2582 if (m_wpCaret != m_wpOldCaret) {
2977 m_pVT->UpdateWordPlace(m_wpCaret); 2583 if (bAddUndo && m_bEnableUndo) {
2978 SetCaret(m_pVT->InsertSection(m_wpCaret,pSecProps,pWordProps)); 2584 AddEditUndoItem(new CFXEU_InsertWord(this, m_wpOldCaret, m_wpCaret,
2979 m_SelState.Set(m_wpCaret,m_wpCaret); 2585 word, charset, pWordProps));
2980 2586 }
2981 if (m_wpCaret != m_wpOldCaret) 2587
2982 { 2588 if (bPaint)
2983 if (bAddUndo && m_bEnableUndo) 2589 PaintInsertText(m_wpOldCaret, m_wpCaret);
2984 { 2590
2985 AddEditUndoItem(new CFXEU_InsertReturn(this,m_wpOldCaret,m_wpCar et,pSecProps,pWordProps)); 2591 if (m_bOprNotify && m_pOprNotify)
2986 } 2592 m_pOprNotify->OnInsertWord(m_wpCaret, m_wpOldCaret);
2987 2593
2988 if (bPaint) 2594 return TRUE;
2989 { 2595 }
2990 RearrangePart(CPVT_WordRange(m_wpOldCaret, m_wpCaret)); 2596 }
2991 ScrollToCaret(); 2597
2992 CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos); 2598 return FALSE;
2993 Refresh(RP_ANALYSE, &wr); 2599 }
2994 SetCaretOrigin(); 2600
2995 SetCaretInfo(); 2601 FX_BOOL CFX_Edit::InsertReturn(const CPVT_SecProps* pSecProps,
2996 } 2602 const CPVT_WordProps* pWordProps,
2997 2603 FX_BOOL bAddUndo,
2998 if (m_bOprNotify && m_pOprNotify) 2604 FX_BOOL bPaint) {
2999 m_pOprNotify->OnInsertReturn(m_wpCaret, m_wpOldCaret); 2605 if (IsTextOverflow())
3000
3001 return TRUE;
3002 }
3003 }
3004
3005 return FALSE; 2606 return FALSE;
3006 } 2607
3007 2608 if (m_pVT->IsValid()) {
3008 FX_BOOL CFX_Edit::Backspace(FX_BOOL bAddUndo, FX_BOOL bPaint)
3009 {
3010 if (m_pVT->IsValid())
3011 {
3012 if (m_wpCaret == m_pVT->GetBeginWordPlace()) return FALSE;
3013
3014 CPVT_Section section;
3015 CPVT_Word word;
3016
3017 if (bAddUndo)
3018 {
3019 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
3020 {
3021 pIterator->SetAt(m_wpCaret);
3022 pIterator->GetSection(section);
3023 pIterator->GetWord(word);
3024 }
3025 }
3026
3027 m_pVT->UpdateWordPlace(m_wpCaret);
3028 SetCaret(m_pVT->BackSpaceWord(m_wpCaret));
3029 m_SelState.Set(m_wpCaret,m_wpCaret);
3030
3031 if (m_wpCaret != m_wpOldCaret)
3032 {
3033 if (bAddUndo && m_bEnableUndo)
3034 {
3035 if (m_wpCaret.SecCmp(m_wpOldCaret) != 0)
3036 AddEditUndoItem(new CFXEU_Backspace(this,m_wpOldCaret,m_wpCa ret,word.Word,word.nCharset,
3037 section.SecProps,section.WordProps));
3038 else
3039 AddEditUndoItem(new CFXEU_Backspace(this,m_wpOldCaret,m_wpCa ret,word.Word,word.nCharset,
3040 section.SecProps,word.WordProps));
3041 }
3042
3043 if (bPaint)
3044 {
3045 RearrangePart(CPVT_WordRange(m_wpCaret,m_wpOldCaret));
3046 ScrollToCaret();
3047
3048 CPVT_WordRange wr;
3049 if (m_wpCaret.SecCmp(m_wpOldCaret) !=0)
3050 wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret),GetVi sibleWordRange().EndPos);
3051 else if (m_wpCaret.LineCmp(m_wpOldCaret) !=0)
3052 wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret),m_pV T->GetSectionEndPlace(m_wpCaret));
3053 else
3054 wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret),m_pVT ->GetSectionEndPlace(m_wpCaret));
3055
3056 Refresh(RP_ANALYSE, &wr);
3057
3058 SetCaretOrigin();
3059 SetCaretInfo();
3060 }
3061
3062 if (m_bOprNotify && m_pOprNotify)
3063 m_pOprNotify->OnBackSpace(m_wpCaret, m_wpOldCaret);
3064
3065 return TRUE;
3066 }
3067 }
3068
3069 return FALSE;
3070 }
3071
3072 FX_BOOL CFX_Edit::Delete(FX_BOOL bAddUndo, FX_BOOL bPaint)
3073 {
3074 if (m_pVT->IsValid())
3075 {
3076 if (m_wpCaret == m_pVT->GetEndWordPlace()) return FALSE;
3077
3078 CPVT_Section section;
3079 CPVT_Word word;
3080
3081 if (bAddUndo)
3082 {
3083 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
3084 {
3085 pIterator->SetAt(m_pVT->GetNextWordPlace(m_wpCaret));
3086 pIterator->GetSection(section);
3087 pIterator->GetWord(word);
3088 }
3089 }
3090
3091 m_pVT->UpdateWordPlace(m_wpCaret);
3092 FX_BOOL bSecEnd = (m_wpCaret == m_pVT->GetSectionEndPlace(m_wpCaret));
3093
3094 SetCaret(m_pVT->DeleteWord(m_wpCaret));
3095 m_SelState.Set(m_wpCaret,m_wpCaret);
3096
3097 if (bAddUndo && m_bEnableUndo)
3098 {
3099 if (bSecEnd)
3100 AddEditUndoItem(new CFXEU_Delete(this,m_wpOldCaret,m_wpCaret,wor d.Word,word.nCharset,
3101 section.SecProps,section.WordProps,bSecEnd));
3102 else
3103 AddEditUndoItem(new CFXEU_Delete(this,m_wpOldCaret,m_wpCaret,wor d.Word,word.nCharset,
3104 section.SecProps,word.WordProps,bSecEnd));
3105 }
3106
3107 if (bPaint)
3108 {
3109 RearrangePart(CPVT_WordRange(m_wpOldCaret,m_wpCaret));
3110 ScrollToCaret();
3111
3112 CPVT_WordRange wr;
3113 if (bSecEnd)
3114 wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret),GetVis ibleWordRange().EndPos);
3115 else if (m_wpCaret.LineCmp(m_wpOldCaret) !=0)
3116 wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret),m_pVT->G etSectionEndPlace(m_wpCaret));
3117 else
3118 wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret),m_pVT- >GetSectionEndPlace(m_wpCaret));
3119
3120 Refresh(RP_ANALYSE, &wr);
3121
3122 SetCaretOrigin();
3123 SetCaretInfo();
3124 }
3125
3126 if (m_bOprNotify && m_pOprNotify)
3127 m_pOprNotify->OnDelete(m_wpCaret, m_wpOldCaret);
3128
3129 return TRUE;
3130 }
3131
3132 return FALSE;
3133 }
3134
3135 FX_BOOL CFX_Edit::Empty()
3136 {
3137 if (m_pVT->IsValid())
3138 {
3139 m_pVT->DeleteWords(GetWholeWordRange());
3140 SetCaret(m_pVT->GetBeginWordPlace());
3141
3142 return TRUE;
3143 }
3144
3145 return FALSE;
3146 }
3147
3148 FX_BOOL CFX_Edit::Clear(FX_BOOL bAddUndo, FX_BOOL bPaint)
3149 {
3150 if (m_pVT->IsValid())
3151 {
3152 if (m_SelState.IsExist())
3153 {
3154 CPVT_WordRange range = m_SelState.ConvertToWordRange();
3155
3156 if (bAddUndo && m_bEnableUndo)
3157 {
3158 if (m_pVT->IsRichText())
3159 {
3160 BeginGroupUndo(L"");
3161
3162 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetItera tor())
3163 {
3164 pIterator->SetAt(range.EndPos);
3165
3166 CPVT_Word wordinfo;
3167 CPVT_Section secinfo;
3168 do
3169 {
3170 CPVT_WordPlace place = pIterator->GetAt();
3171 if (place.WordCmp(range.BeginPos) <= 0)break;
3172
3173 CPVT_WordPlace oldplace = m_pVT->GetPrevWordPlace(pl ace);
3174
3175 if (oldplace.SecCmp(place) != 0)
3176 {
3177 if (pIterator->GetSection(secinfo))
3178 {
3179 AddEditUndoItem(new CFXEU_ClearRich(this,old place,place,range,wordinfo.Word,
3180 wordinfo.nCharset,secinfo.SecProps,secin fo.WordProps));
3181 }
3182 }
3183 else
3184 {
3185 if (pIterator->GetWord(wordinfo))
3186 {
3187 oldplace = m_pVT->AjustLineHeader(oldplace,T RUE);
3188 place = m_pVT->AjustLineHeader(place,TRUE);
3189
3190 AddEditUndoItem(new CFXEU_ClearRich(this,old place,place,range,wordinfo.Word,
3191 wordinfo.nCharset,secinfo.SecProps,wordi nfo.WordProps));
3192 }
3193 }
3194 }while (pIterator->PrevWord());
3195 }
3196 EndGroupUndo();
3197 }
3198 else
3199 {
3200 AddEditUndoItem(new CFXEU_Clear(this,range,GetSelText()));
3201 }
3202 }
3203
3204 SelectNone();
3205 SetCaret(m_pVT->DeleteWords(range));
3206 m_SelState.Set(m_wpCaret,m_wpCaret);
3207
3208 if (bPaint)
3209 {
3210 RearrangePart(range);
3211 ScrollToCaret();
3212
3213 CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);
3214 Refresh(RP_ANALYSE, &wr);
3215
3216 SetCaretOrigin();
3217 SetCaretInfo();
3218 }
3219
3220 if (m_bOprNotify && m_pOprNotify)
3221 m_pOprNotify->OnClear(m_wpCaret, m_wpOldCaret);
3222
3223 return TRUE;
3224 }
3225 }
3226
3227 return FALSE;
3228 }
3229
3230 FX_BOOL CFX_Edit::InsertText(const FX_WCHAR* text, int32_t charset,
3231 const CPVT_SecProps * pSecProps, const CPVT_WordProps * pWor dProps, FX_BOOL bAddUndo, FX_BOOL bPaint)
3232 {
3233 if (IsTextOverflow()) return FALSE;
3234
3235 m_pVT->UpdateWordPlace(m_wpCaret); 2609 m_pVT->UpdateWordPlace(m_wpCaret);
3236 SetCaret(DoInsertText(m_wpCaret, text, charset, pSecProps, pWordProps)); 2610 SetCaret(m_pVT->InsertSection(m_wpCaret, pSecProps, pWordProps));
3237 m_SelState.Set(m_wpCaret,m_wpCaret); 2611 m_SelState.Set(m_wpCaret, m_wpCaret);
3238 2612
3239 if (m_wpCaret != m_wpOldCaret) 2613 if (m_wpCaret != m_wpOldCaret) {
3240 { 2614 if (bAddUndo && m_bEnableUndo) {
3241 if (bAddUndo && m_bEnableUndo) 2615 AddEditUndoItem(new CFXEU_InsertReturn(this, m_wpOldCaret, m_wpCaret,
3242 { 2616 pSecProps, pWordProps));
3243 AddEditUndoItem(new CFXEU_InsertText(this,m_wpOldCaret,m_wpCaret,tex t,charset,pSecProps,pWordProps)); 2617 }
3244 } 2618
3245 2619 if (bPaint) {
3246 if (bPaint) 2620 RearrangePart(CPVT_WordRange(m_wpOldCaret, m_wpCaret));
3247 PaintInsertText(m_wpOldCaret, m_wpCaret);
3248
3249 if (m_bOprNotify && m_pOprNotify)
3250 m_pOprNotify->OnInsertText(m_wpCaret, m_wpOldCaret);
3251
3252 return TRUE;
3253 }
3254 return FALSE;
3255 }
3256
3257 void CFX_Edit::PaintInsertText(const CPVT_WordPlace & wpOld, const CPVT_WordPlac e & wpNew)
3258 {
3259 if (m_pVT->IsValid())
3260 {
3261 RearrangePart(CPVT_WordRange(wpOld,wpNew));
3262 ScrollToCaret(); 2621 ScrollToCaret();
3263 2622 CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);
3264 CPVT_WordRange wr;
3265 if (m_wpCaret.LineCmp(wpOld) !=0)
3266 wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(wpOld),m_pVT->GetSectio nEndPlace(wpNew));
3267 else
3268 wr = CPVT_WordRange(wpOld,m_pVT->GetSectionEndPlace(wpNew));
3269 Refresh(RP_ANALYSE, &wr); 2623 Refresh(RP_ANALYSE, &wr);
3270 SetCaretOrigin(); 2624 SetCaretOrigin();
3271 SetCaretInfo(); 2625 SetCaretInfo();
3272 } 2626 }
3273 } 2627
3274 2628 if (m_bOprNotify && m_pOprNotify)
3275 FX_BOOL CFX_Edit::Redo() 2629 m_pOprNotify->OnInsertReturn(m_wpCaret, m_wpOldCaret);
3276 { 2630
3277 if (m_bEnableUndo) 2631 return TRUE;
3278 { 2632 }
3279 if (m_Undo.CanRedo()) 2633 }
3280 { 2634
3281 m_Undo.Redo(); 2635 return FALSE;
3282 return TRUE; 2636 }
2637
2638 FX_BOOL CFX_Edit::Backspace(FX_BOOL bAddUndo, FX_BOOL bPaint) {
2639 if (m_pVT->IsValid()) {
2640 if (m_wpCaret == m_pVT->GetBeginWordPlace())
2641 return FALSE;
2642
2643 CPVT_Section section;
2644 CPVT_Word word;
2645
2646 if (bAddUndo) {
2647 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
2648 pIterator->SetAt(m_wpCaret);
2649 pIterator->GetSection(section);
2650 pIterator->GetWord(word);
2651 }
2652 }
2653
2654 m_pVT->UpdateWordPlace(m_wpCaret);
2655 SetCaret(m_pVT->BackSpaceWord(m_wpCaret));
2656 m_SelState.Set(m_wpCaret, m_wpCaret);
2657
2658 if (m_wpCaret != m_wpOldCaret) {
2659 if (bAddUndo && m_bEnableUndo) {
2660 if (m_wpCaret.SecCmp(m_wpOldCaret) != 0)
2661 AddEditUndoItem(new CFXEU_Backspace(
2662 this, m_wpOldCaret, m_wpCaret, word.Word, word.nCharset,
2663 section.SecProps, section.WordProps));
2664 else
2665 AddEditUndoItem(new CFXEU_Backspace(
2666 this, m_wpOldCaret, m_wpCaret, word.Word, word.nCharset,
2667 section.SecProps, word.WordProps));
2668 }
2669
2670 if (bPaint) {
2671 RearrangePart(CPVT_WordRange(m_wpCaret, m_wpOldCaret));
2672 ScrollToCaret();
2673
2674 CPVT_WordRange wr;
2675 if (m_wpCaret.SecCmp(m_wpOldCaret) != 0)
2676 wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret),
2677 GetVisibleWordRange().EndPos);
2678 else if (m_wpCaret.LineCmp(m_wpOldCaret) != 0)
2679 wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret),
2680 m_pVT->GetSectionEndPlace(m_wpCaret));
2681 else
2682 wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpCaret),
2683 m_pVT->GetSectionEndPlace(m_wpCaret));
2684
2685 Refresh(RP_ANALYSE, &wr);
2686
2687 SetCaretOrigin();
2688 SetCaretInfo();
2689 }
2690
2691 if (m_bOprNotify && m_pOprNotify)
2692 m_pOprNotify->OnBackSpace(m_wpCaret, m_wpOldCaret);
2693
2694 return TRUE;
2695 }
2696 }
2697
2698 return FALSE;
2699 }
2700
2701 FX_BOOL CFX_Edit::Delete(FX_BOOL bAddUndo, FX_BOOL bPaint) {
2702 if (m_pVT->IsValid()) {
2703 if (m_wpCaret == m_pVT->GetEndWordPlace())
2704 return FALSE;
2705
2706 CPVT_Section section;
2707 CPVT_Word word;
2708
2709 if (bAddUndo) {
2710 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
2711 pIterator->SetAt(m_pVT->GetNextWordPlace(m_wpCaret));
2712 pIterator->GetSection(section);
2713 pIterator->GetWord(word);
2714 }
2715 }
2716
2717 m_pVT->UpdateWordPlace(m_wpCaret);
2718 FX_BOOL bSecEnd = (m_wpCaret == m_pVT->GetSectionEndPlace(m_wpCaret));
2719
2720 SetCaret(m_pVT->DeleteWord(m_wpCaret));
2721 m_SelState.Set(m_wpCaret, m_wpCaret);
2722
2723 if (bAddUndo && m_bEnableUndo) {
2724 if (bSecEnd)
2725 AddEditUndoItem(new CFXEU_Delete(
2726 this, m_wpOldCaret, m_wpCaret, word.Word, word.nCharset,
2727 section.SecProps, section.WordProps, bSecEnd));
2728 else
2729 AddEditUndoItem(new CFXEU_Delete(
2730 this, m_wpOldCaret, m_wpCaret, word.Word, word.nCharset,
2731 section.SecProps, word.WordProps, bSecEnd));
2732 }
2733
2734 if (bPaint) {
2735 RearrangePart(CPVT_WordRange(m_wpOldCaret, m_wpCaret));
2736 ScrollToCaret();
2737
2738 CPVT_WordRange wr;
2739 if (bSecEnd)
2740 wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret),
2741 GetVisibleWordRange().EndPos);
2742 else if (m_wpCaret.LineCmp(m_wpOldCaret) != 0)
2743 wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(m_wpCaret),
2744 m_pVT->GetSectionEndPlace(m_wpCaret));
2745 else
2746 wr = CPVT_WordRange(m_pVT->GetPrevWordPlace(m_wpOldCaret),
2747 m_pVT->GetSectionEndPlace(m_wpCaret));
2748
2749 Refresh(RP_ANALYSE, &wr);
2750
2751 SetCaretOrigin();
2752 SetCaretInfo();
2753 }
2754
2755 if (m_bOprNotify && m_pOprNotify)
2756 m_pOprNotify->OnDelete(m_wpCaret, m_wpOldCaret);
2757
2758 return TRUE;
2759 }
2760
2761 return FALSE;
2762 }
2763
2764 FX_BOOL CFX_Edit::Empty() {
2765 if (m_pVT->IsValid()) {
2766 m_pVT->DeleteWords(GetWholeWordRange());
2767 SetCaret(m_pVT->GetBeginWordPlace());
2768
2769 return TRUE;
2770 }
2771
2772 return FALSE;
2773 }
2774
2775 FX_BOOL CFX_Edit::Clear(FX_BOOL bAddUndo, FX_BOOL bPaint) {
2776 if (m_pVT->IsValid()) {
2777 if (m_SelState.IsExist()) {
2778 CPVT_WordRange range = m_SelState.ConvertToWordRange();
2779
2780 if (bAddUndo && m_bEnableUndo) {
2781 if (m_pVT->IsRichText()) {
2782 BeginGroupUndo(L"");
2783
2784 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
2785 pIterator->SetAt(range.EndPos);
2786
2787 CPVT_Word wordinfo;
2788 CPVT_Section secinfo;
2789 do {
2790 CPVT_WordPlace place = pIterator->GetAt();
2791 if (place.WordCmp(range.BeginPos) <= 0)
2792 break;
2793
2794 CPVT_WordPlace oldplace = m_pVT->GetPrevWordPlace(place);
2795
2796 if (oldplace.SecCmp(place) != 0) {
2797 if (pIterator->GetSection(secinfo)) {
2798 AddEditUndoItem(new CFXEU_ClearRich(
2799 this, oldplace, place, range, wordinfo.Word,
2800 wordinfo.nCharset, secinfo.SecProps, secinfo.WordProps));
2801 }
2802 } else {
2803 if (pIterator->GetWord(wordinfo)) {
2804 oldplace = m_pVT->AjustLineHeader(oldplace, TRUE);
2805 place = m_pVT->AjustLineHeader(place, TRUE);
2806
2807 AddEditUndoItem(new CFXEU_ClearRich(
2808 this, oldplace, place, range, wordinfo.Word,
2809 wordinfo.nCharset, secinfo.SecProps, wordinfo.WordProps));
2810 }
2811 }
2812 } while (pIterator->PrevWord());
2813 }
2814 EndGroupUndo();
2815 } else {
2816 AddEditUndoItem(new CFXEU_Clear(this, range, GetSelText()));
3283 } 2817 }
3284 } 2818 }
3285 2819
2820 SelectNone();
2821 SetCaret(m_pVT->DeleteWords(range));
2822 m_SelState.Set(m_wpCaret, m_wpCaret);
2823
2824 if (bPaint) {
2825 RearrangePart(range);
2826 ScrollToCaret();
2827
2828 CPVT_WordRange wr(m_wpOldCaret, GetVisibleWordRange().EndPos);
2829 Refresh(RP_ANALYSE, &wr);
2830
2831 SetCaretOrigin();
2832 SetCaretInfo();
2833 }
2834
2835 if (m_bOprNotify && m_pOprNotify)
2836 m_pOprNotify->OnClear(m_wpCaret, m_wpOldCaret);
2837
2838 return TRUE;
2839 }
2840 }
2841
2842 return FALSE;
2843 }
2844
2845 FX_BOOL CFX_Edit::InsertText(const FX_WCHAR* text,
2846 int32_t charset,
2847 const CPVT_SecProps* pSecProps,
2848 const CPVT_WordProps* pWordProps,
2849 FX_BOOL bAddUndo,
2850 FX_BOOL bPaint) {
2851 if (IsTextOverflow())
3286 return FALSE; 2852 return FALSE;
3287 } 2853
3288 2854 m_pVT->UpdateWordPlace(m_wpCaret);
3289 FX_BOOL CFX_Edit::Undo() 2855 SetCaret(DoInsertText(m_wpCaret, text, charset, pSecProps, pWordProps));
3290 { 2856 m_SelState.Set(m_wpCaret, m_wpCaret);
3291 if (m_bEnableUndo) 2857
3292 { 2858 if (m_wpCaret != m_wpOldCaret) {
3293 if (m_Undo.CanUndo()) 2859 if (bAddUndo && m_bEnableUndo) {
3294 { 2860 AddEditUndoItem(new CFXEU_InsertText(this, m_wpOldCaret, m_wpCaret, text,
3295 m_Undo.Undo(); 2861 charset, pSecProps, pWordProps));
3296 return TRUE; 2862 }
3297 } 2863
3298 } 2864 if (bPaint)
3299 2865 PaintInsertText(m_wpOldCaret, m_wpCaret);
3300 return FALSE; 2866
3301 }
3302
3303 void CFX_Edit::SetCaretOrigin()
3304 {
3305 if (m_pVT->IsValid())
3306 {
3307 if (IPDF_VariableText_Iterator * pIterator = m_pVT->GetIterator())
3308 {
3309 pIterator->SetAt(m_wpCaret);
3310 CPVT_Word word;
3311 CPVT_Line line;
3312 if (pIterator->GetWord(word))
3313 {
3314 m_ptCaret.x = word.ptWord.x + word.fWidth;
3315 m_ptCaret.y = word.ptWord.y;
3316 }
3317 else if (pIterator->GetLine(line))
3318 {
3319 m_ptCaret.x = line.ptLine.x;
3320 m_ptCaret.y = line.ptLine.y;
3321 }
3322 }
3323 }
3324 }
3325
3326 int32_t CFX_Edit::WordPlaceToWordIndex(const CPVT_WordPlace & place) const
3327 {
3328 if (m_pVT->IsValid())
3329 return m_pVT->WordPlaceToWordIndex(place);
3330
3331 return -1;
3332 }
3333
3334 CPVT_WordPlace CFX_Edit::WordIndexToWordPlace(int32_t index) const
3335 {
3336 if (m_pVT->IsValid())
3337 return m_pVT->WordIndexToWordPlace(index);
3338
3339 return CPVT_WordPlace();
3340 }
3341
3342 FX_BOOL CFX_Edit::IsTextFull() const
3343 {
3344 int32_t nTotalWords = m_pVT->GetTotalWords();
3345 int32_t nLimitChar = m_pVT->GetLimitChar();
3346 int32_t nCharArray = m_pVT->GetCharArray();
3347
3348 return IsTextOverflow() || (nLimitChar>0 && nTotalWords >= nLimitChar)
3349 || (nCharArray>0 && nTotalWords >= nCharArray);
3350 }
3351
3352 FX_BOOL CFX_Edit::IsTextOverflow() const
3353 {
3354 if (!m_bEnableScroll && !m_bEnableOverflow)
3355 {
3356 CPDF_Rect rcPlate = m_pVT->GetPlateRect();
3357 CPDF_Rect rcContent = m_pVT->GetContentRect();
3358
3359 if (m_pVT->IsMultiLine() && GetTotalLines() > 1)
3360 {
3361 if (FX_EDIT_IsFloatBigger(rcContent.Height(),rcPlate.Height())) retu rn TRUE;
3362 }
3363
3364 if (FX_EDIT_IsFloatBigger(rcContent.Width(),rcPlate.Width())) return TRU E;
3365 }
3366
3367 return FALSE;
3368 }
3369
3370 CPVT_WordPlace CFX_Edit::GetLineBeginPlace(const CPVT_WordPlace & place) const
3371 {
3372 return m_pVT->GetLineBeginPlace(place);
3373 }
3374
3375 CPVT_WordPlace CFX_Edit::GetLineEndPlace(const CPVT_WordPlace & place) const
3376 {
3377 return m_pVT->GetLineEndPlace(place);
3378 }
3379
3380 CPVT_WordPlace CFX_Edit::GetSectionBeginPlace(const CPVT_WordPlace & place) cons t
3381 {
3382 return m_pVT->GetSectionBeginPlace(place);
3383 }
3384
3385 CPVT_WordPlace CFX_Edit::GetSectionEndPlace(const CPVT_WordPlace & place) const
3386 {
3387 return m_pVT->GetSectionEndPlace(place);
3388 }
3389
3390 FX_BOOL CFX_Edit::CanUndo() const
3391 {
3392 if (m_bEnableUndo)
3393 {
3394 return m_Undo.CanUndo();
3395 }
3396
3397 return FALSE;
3398 }
3399
3400 FX_BOOL CFX_Edit::CanRedo() const
3401 {
3402 if (m_bEnableUndo)
3403 {
3404 return m_Undo.CanRedo();
3405 }
3406
3407 return FALSE;
3408 }
3409
3410 FX_BOOL CFX_Edit::IsModified() const
3411 {
3412 if (m_bEnableUndo)
3413 {
3414 return m_Undo.IsModified();
3415 }
3416
3417 return FALSE;
3418 }
3419
3420 void CFX_Edit::EnableRefresh(FX_BOOL bRefresh)
3421 {
3422 m_bEnableRefresh = bRefresh;
3423 }
3424
3425 void CFX_Edit::EnableUndo(FX_BOOL bUndo)
3426 {
3427 m_bEnableUndo = bUndo;
3428 }
3429
3430 void CFX_Edit::EnableNotify(FX_BOOL bNotify)
3431 {
3432 m_bNotify = bNotify;
3433 }
3434
3435 void CFX_Edit::EnableOprNotify(FX_BOOL bNotify)
3436 {
3437 m_bOprNotify = bNotify;
3438 }
3439
3440 FX_FLOAT CFX_Edit::GetLineTop(const CPVT_WordPlace& place) const
3441 {
3442 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator())
3443 {
3444 CPVT_WordPlace wpOld = pIterator->GetAt();
3445
3446 pIterator->SetAt(place);
3447 CPVT_Line line;
3448 pIterator->GetLine(line);
3449
3450 pIterator->SetAt(wpOld);
3451
3452 return line.ptLine.y + line.fLineAscent;
3453 }
3454
3455 return 0.0f;
3456 }
3457
3458 FX_FLOAT CFX_Edit::GetLineBottom(const CPVT_WordPlace& place) const
3459 {
3460 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator())
3461 {
3462 CPVT_WordPlace wpOld = pIterator->GetAt();
3463
3464 pIterator->SetAt(place);
3465 CPVT_Line line;
3466 pIterator->GetLine(line);
3467
3468 pIterator->SetAt(wpOld);
3469
3470 return line.ptLine.y + line.fLineDescent;
3471 }
3472
3473 return 0.0f;
3474 }
3475
3476 CPVT_WordPlace CFX_Edit::DoInsertText(const CPVT_WordPlace& place, const FX_WCHA R* text, int32_t charset,
3477 const CPVT_SecProps * pSecProps, const CPV T_WordProps * pWordProps)
3478 {
3479 CPVT_WordPlace wp = place;
3480
3481 if (m_pVT->IsValid())
3482 {
3483 CFX_WideString sText = text;
3484
3485 for (int32_t i = 0, sz = sText.GetLength(); i < sz; i++)
3486 {
3487 FX_WORD word = sText[i];
3488 switch (word)
3489 {
3490 case 0x0D:
3491 wp = m_pVT->InsertSection(wp,pSecProps,pWordProps);
3492 if (sText[i+1] == 0x0A)
3493 i++;
3494 break;
3495 case 0x0A:
3496 wp = m_pVT->InsertSection(wp,pSecProps,pWordProps);
3497 if (sText[i+1] == 0x0D)
3498 i++;
3499 break;
3500 case 0x09:
3501 word = 0x20;
3502 default:
3503 wp = m_pVT->InsertWord(wp,word,GetCharSetFromUnicode(word, chars et),pWordProps);
3504 break;
3505 }
3506 }
3507 }
3508
3509 return wp;
3510 }
3511
3512 int32_t CFX_Edit::GetCharSetFromUnicode(FX_WORD word, int32_t nOldCharset)
3513 {
3514 if (IFX_Edit_FontMap* pFontMap = GetFontMap())
3515 return pFontMap->CharSetFromUnicode(word, nOldCharset);
3516 return nOldCharset;
3517 }
3518
3519 void CFX_Edit::BeginGroupUndo(const CFX_WideString& sTitle)
3520 {
3521 ASSERT(m_pGroupUndoItem == NULL);
3522
3523 m_pGroupUndoItem = new CFX_Edit_GroupUndoItem(sTitle);
3524 }
3525
3526 void CFX_Edit::EndGroupUndo()
3527 {
3528 ASSERT(m_pGroupUndoItem != NULL);
3529
3530 m_pGroupUndoItem->UpdateItems();
3531 m_Undo.AddItem(m_pGroupUndoItem);
3532 if (m_bOprNotify && m_pOprNotify) 2867 if (m_bOprNotify && m_pOprNotify)
3533 m_pOprNotify->OnAddUndo(m_pGroupUndoItem); 2868 m_pOprNotify->OnInsertText(m_wpCaret, m_wpOldCaret);
3534 m_pGroupUndoItem = NULL; 2869
3535 } 2870 return TRUE;
3536 2871 }
3537 void CFX_Edit::AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem) 2872 return FALSE;
3538 { 2873 }
3539 if (m_pGroupUndoItem) 2874
3540 m_pGroupUndoItem->AddUndoItem(pEditUndoItem); 2875 void CFX_Edit::PaintInsertText(const CPVT_WordPlace& wpOld,
2876 const CPVT_WordPlace& wpNew) {
2877 if (m_pVT->IsValid()) {
2878 RearrangePart(CPVT_WordRange(wpOld, wpNew));
2879 ScrollToCaret();
2880
2881 CPVT_WordRange wr;
2882 if (m_wpCaret.LineCmp(wpOld) != 0)
2883 wr = CPVT_WordRange(m_pVT->GetLineBeginPlace(wpOld),
2884 m_pVT->GetSectionEndPlace(wpNew));
3541 else 2885 else
3542 { 2886 wr = CPVT_WordRange(wpOld, m_pVT->GetSectionEndPlace(wpNew));
3543 m_Undo.AddItem(pEditUndoItem); 2887 Refresh(RP_ANALYSE, &wr);
3544 if (m_bOprNotify && m_pOprNotify) 2888 SetCaretOrigin();
3545 m_pOprNotify->OnAddUndo(pEditUndoItem); 2889 SetCaretInfo();
3546 } 2890 }
3547 } 2891 }
3548 2892
3549 void CFX_Edit::AddUndoItem(IFX_Edit_UndoItem* pUndoItem) 2893 FX_BOOL CFX_Edit::Redo() {
3550 { 2894 if (m_bEnableUndo) {
3551 m_Undo.AddItem(pUndoItem); 2895 if (m_Undo.CanRedo()) {
2896 m_Undo.Redo();
2897 return TRUE;
2898 }
2899 }
2900
2901 return FALSE;
2902 }
2903
2904 FX_BOOL CFX_Edit::Undo() {
2905 if (m_bEnableUndo) {
2906 if (m_Undo.CanUndo()) {
2907 m_Undo.Undo();
2908 return TRUE;
2909 }
2910 }
2911
2912 return FALSE;
2913 }
2914
2915 void CFX_Edit::SetCaretOrigin() {
2916 if (m_pVT->IsValid()) {
2917 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
2918 pIterator->SetAt(m_wpCaret);
2919 CPVT_Word word;
2920 CPVT_Line line;
2921 if (pIterator->GetWord(word)) {
2922 m_ptCaret.x = word.ptWord.x + word.fWidth;
2923 m_ptCaret.y = word.ptWord.y;
2924 } else if (pIterator->GetLine(line)) {
2925 m_ptCaret.x = line.ptLine.x;
2926 m_ptCaret.y = line.ptLine.y;
2927 }
2928 }
2929 }
2930 }
2931
2932 int32_t CFX_Edit::WordPlaceToWordIndex(const CPVT_WordPlace& place) const {
2933 if (m_pVT->IsValid())
2934 return m_pVT->WordPlaceToWordIndex(place);
2935
2936 return -1;
2937 }
2938
2939 CPVT_WordPlace CFX_Edit::WordIndexToWordPlace(int32_t index) const {
2940 if (m_pVT->IsValid())
2941 return m_pVT->WordIndexToWordPlace(index);
2942
2943 return CPVT_WordPlace();
2944 }
2945
2946 FX_BOOL CFX_Edit::IsTextFull() const {
2947 int32_t nTotalWords = m_pVT->GetTotalWords();
2948 int32_t nLimitChar = m_pVT->GetLimitChar();
2949 int32_t nCharArray = m_pVT->GetCharArray();
2950
2951 return IsTextOverflow() || (nLimitChar > 0 && nTotalWords >= nLimitChar) ||
2952 (nCharArray > 0 && nTotalWords >= nCharArray);
2953 }
2954
2955 FX_BOOL CFX_Edit::IsTextOverflow() const {
2956 if (!m_bEnableScroll && !m_bEnableOverflow) {
2957 CPDF_Rect rcPlate = m_pVT->GetPlateRect();
2958 CPDF_Rect rcContent = m_pVT->GetContentRect();
2959
2960 if (m_pVT->IsMultiLine() && GetTotalLines() > 1) {
2961 if (FX_EDIT_IsFloatBigger(rcContent.Height(), rcPlate.Height()))
2962 return TRUE;
2963 }
2964
2965 if (FX_EDIT_IsFloatBigger(rcContent.Width(), rcPlate.Width()))
2966 return TRUE;
2967 }
2968
2969 return FALSE;
2970 }
2971
2972 CPVT_WordPlace CFX_Edit::GetLineBeginPlace(const CPVT_WordPlace& place) const {
2973 return m_pVT->GetLineBeginPlace(place);
2974 }
2975
2976 CPVT_WordPlace CFX_Edit::GetLineEndPlace(const CPVT_WordPlace& place) const {
2977 return m_pVT->GetLineEndPlace(place);
2978 }
2979
2980 CPVT_WordPlace CFX_Edit::GetSectionBeginPlace(
2981 const CPVT_WordPlace& place) const {
2982 return m_pVT->GetSectionBeginPlace(place);
2983 }
2984
2985 CPVT_WordPlace CFX_Edit::GetSectionEndPlace(const CPVT_WordPlace& place) const {
2986 return m_pVT->GetSectionEndPlace(place);
2987 }
2988
2989 FX_BOOL CFX_Edit::CanUndo() const {
2990 if (m_bEnableUndo) {
2991 return m_Undo.CanUndo();
2992 }
2993
2994 return FALSE;
2995 }
2996
2997 FX_BOOL CFX_Edit::CanRedo() const {
2998 if (m_bEnableUndo) {
2999 return m_Undo.CanRedo();
3000 }
3001
3002 return FALSE;
3003 }
3004
3005 FX_BOOL CFX_Edit::IsModified() const {
3006 if (m_bEnableUndo) {
3007 return m_Undo.IsModified();
3008 }
3009
3010 return FALSE;
3011 }
3012
3013 void CFX_Edit::EnableRefresh(FX_BOOL bRefresh) {
3014 m_bEnableRefresh = bRefresh;
3015 }
3016
3017 void CFX_Edit::EnableUndo(FX_BOOL bUndo) {
3018 m_bEnableUndo = bUndo;
3019 }
3020
3021 void CFX_Edit::EnableNotify(FX_BOOL bNotify) {
3022 m_bNotify = bNotify;
3023 }
3024
3025 void CFX_Edit::EnableOprNotify(FX_BOOL bNotify) {
3026 m_bOprNotify = bNotify;
3027 }
3028
3029 FX_FLOAT CFX_Edit::GetLineTop(const CPVT_WordPlace& place) const {
3030 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
3031 CPVT_WordPlace wpOld = pIterator->GetAt();
3032
3033 pIterator->SetAt(place);
3034 CPVT_Line line;
3035 pIterator->GetLine(line);
3036
3037 pIterator->SetAt(wpOld);
3038
3039 return line.ptLine.y + line.fLineAscent;
3040 }
3041
3042 return 0.0f;
3043 }
3044
3045 FX_FLOAT CFX_Edit::GetLineBottom(const CPVT_WordPlace& place) const {
3046 if (IPDF_VariableText_Iterator* pIterator = m_pVT->GetIterator()) {
3047 CPVT_WordPlace wpOld = pIterator->GetAt();
3048
3049 pIterator->SetAt(place);
3050 CPVT_Line line;
3051 pIterator->GetLine(line);
3052
3053 pIterator->SetAt(wpOld);
3054
3055 return line.ptLine.y + line.fLineDescent;
3056 }
3057
3058 return 0.0f;
3059 }
3060
3061 CPVT_WordPlace CFX_Edit::DoInsertText(const CPVT_WordPlace& place,
3062 const FX_WCHAR* text,
3063 int32_t charset,
3064 const CPVT_SecProps* pSecProps,
3065 const CPVT_WordProps* pWordProps) {
3066 CPVT_WordPlace wp = place;
3067
3068 if (m_pVT->IsValid()) {
3069 CFX_WideString sText = text;
3070
3071 for (int32_t i = 0, sz = sText.GetLength(); i < sz; i++) {
3072 FX_WORD word = sText[i];
3073 switch (word) {
3074 case 0x0D:
3075 wp = m_pVT->InsertSection(wp, pSecProps, pWordProps);
3076 if (sText[i + 1] == 0x0A)
3077 i++;
3078 break;
3079 case 0x0A:
3080 wp = m_pVT->InsertSection(wp, pSecProps, pWordProps);
3081 if (sText[i + 1] == 0x0D)
3082 i++;
3083 break;
3084 case 0x09:
3085 word = 0x20;
3086 default:
3087 wp = m_pVT->InsertWord(wp, word, GetCharSetFromUnicode(word, charset),
3088 pWordProps);
3089 break;
3090 }
3091 }
3092 }
3093
3094 return wp;
3095 }
3096
3097 int32_t CFX_Edit::GetCharSetFromUnicode(FX_WORD word, int32_t nOldCharset) {
3098 if (IFX_Edit_FontMap* pFontMap = GetFontMap())
3099 return pFontMap->CharSetFromUnicode(word, nOldCharset);
3100 return nOldCharset;
3101 }
3102
3103 void CFX_Edit::BeginGroupUndo(const CFX_WideString& sTitle) {
3104 ASSERT(m_pGroupUndoItem == NULL);
3105
3106 m_pGroupUndoItem = new CFX_Edit_GroupUndoItem(sTitle);
3107 }
3108
3109 void CFX_Edit::EndGroupUndo() {
3110 ASSERT(m_pGroupUndoItem != NULL);
3111
3112 m_pGroupUndoItem->UpdateItems();
3113 m_Undo.AddItem(m_pGroupUndoItem);
3114 if (m_bOprNotify && m_pOprNotify)
3115 m_pOprNotify->OnAddUndo(m_pGroupUndoItem);
3116 m_pGroupUndoItem = NULL;
3117 }
3118
3119 void CFX_Edit::AddEditUndoItem(CFX_Edit_UndoItem* pEditUndoItem) {
3120 if (m_pGroupUndoItem)
3121 m_pGroupUndoItem->AddUndoItem(pEditUndoItem);
3122 else {
3123 m_Undo.AddItem(pEditUndoItem);
3552 if (m_bOprNotify && m_pOprNotify) 3124 if (m_bOprNotify && m_pOprNotify)
3553 m_pOprNotify->OnAddUndo(pUndoItem); 3125 m_pOprNotify->OnAddUndo(pEditUndoItem);
3554 } 3126 }
3555 3127 }
3128
3129 void CFX_Edit::AddUndoItem(IFX_Edit_UndoItem* pUndoItem) {
3130 m_Undo.AddItem(pUndoItem);
3131 if (m_bOprNotify && m_pOprNotify)
3132 m_pOprNotify->OnAddUndo(pUndoItem);
3133 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698