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

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

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

Powered by Google App Engine
This is Rietveld 408576698