| OLD | NEW |
| 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 "xfa/fde/cfde_txtedtengine.h" | 7 #include "xfa/fde/cfde_txtedtengine.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| 11 #include "third_party/base/ptr_util.h" |
| 11 #include "xfa/fde/cfde_txtedtbuf.h" | 12 #include "xfa/fde/cfde_txtedtbuf.h" |
| 12 #include "xfa/fde/cfde_txtedtbufiter.h" | 13 #include "xfa/fde/cfde_txtedtbufiter.h" |
| 13 #include "xfa/fde/cfde_txtedtdorecord_deleterange.h" | 14 #include "xfa/fde/cfde_txtedtdorecord_deleterange.h" |
| 14 #include "xfa/fde/cfde_txtedtdorecord_insert.h" | 15 #include "xfa/fde/cfde_txtedtdorecord_insert.h" |
| 15 #include "xfa/fde/cfde_txtedtpage.h" | 16 #include "xfa/fde/cfde_txtedtpage.h" |
| 16 #include "xfa/fde/cfde_txtedtparag.h" | 17 #include "xfa/fde/cfde_txtedtparag.h" |
| 17 #include "xfa/fde/ifx_chariter.h" | 18 #include "xfa/fde/ifx_chariter.h" |
| 18 #include "xfa/fde/tto/fde_textout.h" | 19 #include "xfa/fde/tto/fde_textout.h" |
| 19 #include "xfa/fgas/layout/fgas_textbreak.h" | 20 #include "xfa/fgas/layout/fgas_textbreak.h" |
| 20 #include "xfa/fwl/core/cfwl_edit.h" | 21 #include "xfa/fwl/core/cfwl_edit.h" |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 m_nCaret = nIndex; | 201 m_nCaret = nIndex; |
| 201 MovePage2Char(m_nCaret); | 202 MovePage2Char(m_nCaret); |
| 202 GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore); | 203 GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore); |
| 203 if (!m_bBefore) { | 204 if (!m_bBefore) { |
| 204 m_nCaret++; | 205 m_nCaret++; |
| 205 m_bBefore = true; | 206 m_bBefore = true; |
| 206 } | 207 } |
| 207 m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) | 208 m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) |
| 208 ? m_rtCaret.top | 209 ? m_rtCaret.top |
| 209 : m_rtCaret.left; | 210 : m_rtCaret.left; |
| 210 m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0); | 211 m_Param.pEventSink->OnCaretChanged(); |
| 211 m_nAnchorPos = -1; | 212 m_nAnchorPos = -1; |
| 212 return m_nCaret; | 213 return m_nCaret; |
| 213 } | 214 } |
| 214 | 215 |
| 215 int32_t CFDE_TxtEdtEngine::MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret, | 216 int32_t CFDE_TxtEdtEngine::MoveCaretPos(FDE_TXTEDTMOVECARET eMoveCaret, |
| 216 bool bShift, | 217 bool bShift, |
| 217 bool bCtrl) { | 218 bool bCtrl) { |
| 218 if (IsLocked()) { | 219 if (IsLocked()) { |
| 219 return 0; | 220 return 0; |
| 220 } | 221 } |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 break; | 317 break; |
| 317 case MC_End: | 318 case MC_End: |
| 318 MoveEnd(); | 319 MoveEnd(); |
| 319 break; | 320 break; |
| 320 default: | 321 default: |
| 321 break; | 322 break; |
| 322 } | 323 } |
| 323 if (bShift && m_nAnchorPos != -1 && (m_nAnchorPos != m_nCaret)) { | 324 if (bShift && m_nAnchorPos != -1 && (m_nAnchorPos != m_nCaret)) { |
| 324 AddSelRange(std::min(m_nAnchorPos, m_nCaret), | 325 AddSelRange(std::min(m_nAnchorPos, m_nCaret), |
| 325 FXSYS_abs(m_nAnchorPos - m_nCaret)); | 326 FXSYS_abs(m_nAnchorPos - m_nCaret)); |
| 326 m_Param.pEventSink->On_SelChanged(this); | 327 m_Param.pEventSink->OnSelChanged(); |
| 327 } | 328 } |
| 328 if (bSelChange) { | 329 if (bSelChange) |
| 329 m_Param.pEventSink->On_SelChanged(this); | 330 m_Param.pEventSink->OnSelChanged(); |
| 330 } | 331 |
| 331 return m_nCaret; | 332 return m_nCaret; |
| 332 } | 333 } |
| 333 | 334 |
| 334 void CFDE_TxtEdtEngine::Lock() { | 335 void CFDE_TxtEdtEngine::Lock() { |
| 335 m_bLock = true; | 336 m_bLock = true; |
| 336 } | 337 } |
| 337 | 338 |
| 338 void CFDE_TxtEdtEngine::Unlock() { | 339 void CFDE_TxtEdtEngine::Unlock() { |
| 339 m_bLock = false; | 340 m_bLock = false; |
| 340 } | 341 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 } | 400 } |
| 400 if (nLength == 0) { | 401 if (nLength == 0) { |
| 401 return FDE_TXTEDT_MODIFY_RET_F_Full; | 402 return FDE_TXTEDT_MODIFY_RET_F_Full; |
| 402 } | 403 } |
| 403 if (nLength < nTemp) { | 404 if (nLength < nTemp) { |
| 404 bPart = true; | 405 bPart = true; |
| 405 } | 406 } |
| 406 } | 407 } |
| 407 if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { | 408 if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { |
| 408 CFX_WideString wsText = GetPreInsertText(m_nCaret, lpBuffer, nLength); | 409 CFX_WideString wsText = GetPreInsertText(m_nCaret, lpBuffer, nLength); |
| 409 if (!m_Param.pEventSink->On_Validate(this, wsText)) { | 410 if (!m_Param.pEventSink->OnValidate(wsText)) |
| 410 return FDE_TXTEDT_MODIFY_RET_F_Invalidate; | 411 return FDE_TXTEDT_MODIFY_RET_F_Invalidate; |
| 411 } | |
| 412 } | 412 } |
| 413 if (IsSelect()) { | 413 if (IsSelect()) { |
| 414 DeleteSelect(); | 414 DeleteSelect(); |
| 415 } | 415 } |
| 416 if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) | 416 if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) |
| 417 m_Param.pEventSink->On_AddDoRecord( | 417 m_Param.pEventSink->OnAddDoRecord( |
| 418 this, | 418 pdfium::MakeUnique<CFDE_TxtEdtDoRecord_Insert>(this, m_nCaret, lpBuffer, |
| 419 new CFDE_TxtEdtDoRecord_Insert(this, m_nCaret, lpBuffer, nLength)); | 419 nLength)); |
| 420 | 420 |
| 421 m_ChangeInfo.wsPrevText = GetText(0); | 421 m_ChangeInfo.wsPrevText = GetText(0, -1); |
| 422 Inner_Insert(m_nCaret, lpBuffer, nLength); | 422 Inner_Insert(m_nCaret, lpBuffer, nLength); |
| 423 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; | 423 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert; |
| 424 m_ChangeInfo.wsInsert = CFX_WideString(lpBuffer, nLength); | 424 m_ChangeInfo.wsInsert = CFX_WideString(lpBuffer, nLength); |
| 425 nStart = m_nCaret; | 425 nStart = m_nCaret; |
| 426 nStart += nLength; | 426 nStart += nLength; |
| 427 FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1); | 427 FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1); |
| 428 bool bBefore = true; | 428 bool bBefore = true; |
| 429 if (wChar != L'\n' && wChar != L'\r') { | 429 if (wChar != L'\n' && wChar != L'\r') { |
| 430 nStart--; | 430 nStart--; |
| 431 bBefore = false; | 431 bBefore = false; |
| 432 } | 432 } |
| 433 SetCaretPos(nStart, bBefore); | 433 SetCaretPos(nStart, bBefore); |
| 434 m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); | 434 m_Param.pEventSink->OnTextChanged(m_ChangeInfo); |
| 435 return bPart ? FDE_TXTEDT_MODIFY_RET_S_Part : FDE_TXTEDT_MODIFY_RET_S_Normal; | 435 return bPart ? FDE_TXTEDT_MODIFY_RET_S_Part : FDE_TXTEDT_MODIFY_RET_S_Normal; |
| 436 } | 436 } |
| 437 | 437 |
| 438 int32_t CFDE_TxtEdtEngine::Delete(int32_t nStart, bool bBackspace) { | 438 int32_t CFDE_TxtEdtEngine::Delete(int32_t nStart, bool bBackspace) { |
| 439 if (IsLocked()) { | 439 if (IsLocked()) { |
| 440 return FDE_TXTEDT_MODIFY_RET_F_Locked; | 440 return FDE_TXTEDT_MODIFY_RET_F_Locked; |
| 441 } | 441 } |
| 442 if (IsSelect()) { | 442 if (IsSelect()) { |
| 443 DeleteSelect(); | 443 DeleteSelect(); |
| 444 return FDE_TXTEDT_MODIFY_RET_S_Normal; | 444 return FDE_TXTEDT_MODIFY_RET_S_Normal; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 460 return FDE_TXTEDT_MODIFY_RET_F_Full; | 460 return FDE_TXTEDT_MODIFY_RET_F_Full; |
| 461 } | 461 } |
| 462 if ((nStart + 1 < GetTextBufLength()) && | 462 if ((nStart + 1 < GetTextBufLength()) && |
| 463 (m_pTxtBuf->GetCharByIndex(nStart) == L'\r') && | 463 (m_pTxtBuf->GetCharByIndex(nStart) == L'\r') && |
| 464 (m_pTxtBuf->GetCharByIndex(nStart + 1) == L'\n')) { | 464 (m_pTxtBuf->GetCharByIndex(nStart + 1) == L'\n')) { |
| 465 nCount++; | 465 nCount++; |
| 466 } | 466 } |
| 467 } | 467 } |
| 468 if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { | 468 if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { |
| 469 CFX_WideString wsText = GetPreDeleteText(nStart, nCount); | 469 CFX_WideString wsText = GetPreDeleteText(nStart, nCount); |
| 470 if (!m_Param.pEventSink->On_Validate(this, wsText)) { | 470 if (!m_Param.pEventSink->OnValidate(wsText)) |
| 471 return FDE_TXTEDT_MODIFY_RET_F_Invalidate; | 471 return FDE_TXTEDT_MODIFY_RET_F_Invalidate; |
| 472 } | |
| 473 } | 472 } |
| 474 if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { | 473 if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { |
| 475 CFX_WideString wsRange = m_pTxtBuf->GetRange(nStart, nCount); | 474 CFX_WideString wsRange = m_pTxtBuf->GetRange(nStart, nCount); |
| 476 m_Param.pEventSink->On_AddDoRecord( | 475 m_Param.pEventSink->OnAddDoRecord( |
| 477 this, | 476 pdfium::MakeUnique<CFDE_TxtEdtDoRecord_DeleteRange>(this, nStart, |
| 478 new CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, wsRange)); | 477 m_nCaret, wsRange)); |
| 479 } | 478 } |
| 480 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; | 479 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; |
| 481 m_ChangeInfo.wsDelete = GetText(nStart, nCount); | 480 m_ChangeInfo.wsDelete = GetText(nStart, nCount); |
| 482 Inner_DeleteRange(nStart, nCount); | 481 Inner_DeleteRange(nStart, nCount); |
| 483 SetCaretPos(nStart + ((!bBackspace && nStart > 0) ? -1 : 0), | 482 SetCaretPos(nStart + ((!bBackspace && nStart > 0) ? -1 : 0), |
| 484 (bBackspace || nStart == 0)); | 483 (bBackspace || nStart == 0)); |
| 485 m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); | 484 m_Param.pEventSink->OnTextChanged(m_ChangeInfo); |
| 486 return FDE_TXTEDT_MODIFY_RET_S_Normal; | 485 return FDE_TXTEDT_MODIFY_RET_S_Normal; |
| 487 } | 486 } |
| 488 | 487 |
| 489 int32_t CFDE_TxtEdtEngine::DeleteRange(int32_t nStart, int32_t nCount) { | 488 int32_t CFDE_TxtEdtEngine::DeleteRange(int32_t nStart, int32_t nCount) { |
| 490 if (IsLocked()) { | 489 if (IsLocked()) |
| 491 return FDE_TXTEDT_MODIFY_RET_F_Locked; | 490 return FDE_TXTEDT_MODIFY_RET_F_Locked; |
| 492 } | 491 if (nCount == -1) |
| 493 if (nCount == -1) { | |
| 494 nCount = GetTextBufLength(); | 492 nCount = GetTextBufLength(); |
| 495 } | 493 if (nCount == 0) |
| 496 if (nCount == 0) { | |
| 497 return FDE_TXTEDT_MODIFY_RET_S_Normal; | 494 return FDE_TXTEDT_MODIFY_RET_S_Normal; |
| 498 } | |
| 499 if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { | 495 if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { |
| 500 CFX_WideString wsText = GetPreDeleteText(nStart, nCount); | 496 CFX_WideString wsText = GetPreDeleteText(nStart, nCount); |
| 501 if (!m_Param.pEventSink->On_Validate(this, wsText)) { | 497 if (!m_Param.pEventSink->OnValidate(wsText)) |
| 502 return FDE_TXTEDT_MODIFY_RET_F_Invalidate; | 498 return FDE_TXTEDT_MODIFY_RET_F_Invalidate; |
| 503 } | |
| 504 } | 499 } |
| 505 DeleteRange_DoRecord(nStart, nCount); | 500 DeleteRange_DoRecord(nStart, nCount); |
| 506 m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); | 501 m_Param.pEventSink->OnTextChanged(m_ChangeInfo); |
| 507 SetCaretPos(nStart, true); | 502 SetCaretPos(nStart, true); |
| 508 return FDE_TXTEDT_MODIFY_RET_S_Normal; | 503 return FDE_TXTEDT_MODIFY_RET_S_Normal; |
| 509 } | 504 } |
| 510 | 505 |
| 511 int32_t CFDE_TxtEdtEngine::Replace(int32_t nStart, | 506 int32_t CFDE_TxtEdtEngine::Replace(int32_t nStart, |
| 512 int32_t nLength, | 507 int32_t nLength, |
| 513 const CFX_WideString& wsReplace) { | 508 const CFX_WideString& wsReplace) { |
| 514 if (IsLocked()) { | 509 if (IsLocked()) |
| 515 return FDE_TXTEDT_MODIFY_RET_F_Locked; | 510 return FDE_TXTEDT_MODIFY_RET_F_Locked; |
| 516 } | 511 if (nStart < 0 || (nStart + nLength > GetTextBufLength())) |
| 517 if (nStart < 0 || (nStart + nLength > GetTextBufLength())) { | |
| 518 return FDE_TXTEDT_MODIFY_RET_F_Boundary; | 512 return FDE_TXTEDT_MODIFY_RET_F_Boundary; |
| 519 } | |
| 520 if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { | 513 if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) { |
| 521 CFX_WideString wsText = GetPreReplaceText( | 514 CFX_WideString wsText = GetPreReplaceText( |
| 522 nStart, nLength, wsReplace.c_str(), wsReplace.GetLength()); | 515 nStart, nLength, wsReplace.c_str(), wsReplace.GetLength()); |
| 523 if (!m_Param.pEventSink->On_Validate(this, wsText)) { | 516 if (!m_Param.pEventSink->OnValidate(wsText)) |
| 524 return FDE_TXTEDT_MODIFY_RET_F_Invalidate; | 517 return FDE_TXTEDT_MODIFY_RET_F_Invalidate; |
| 525 } | |
| 526 } | 518 } |
| 527 if (IsSelect()) { | 519 if (IsSelect()) |
| 528 ClearSelection(); | 520 ClearSelection(); |
| 529 } | 521 |
| 530 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Replace; | 522 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Replace; |
| 531 m_ChangeInfo.wsDelete = GetText(nStart, nLength); | 523 m_ChangeInfo.wsDelete = GetText(nStart, nLength); |
| 532 if (nLength > 0) { | 524 if (nLength > 0) |
| 533 Inner_DeleteRange(nStart, nLength); | 525 Inner_DeleteRange(nStart, nLength); |
| 534 } | 526 |
| 535 int32_t nTextLength = wsReplace.GetLength(); | 527 int32_t nTextLength = wsReplace.GetLength(); |
| 536 if (nTextLength > 0) { | 528 if (nTextLength > 0) |
| 537 Inner_Insert(nStart, wsReplace.c_str(), nTextLength); | 529 Inner_Insert(nStart, wsReplace.c_str(), nTextLength); |
| 538 } | 530 |
| 539 m_ChangeInfo.wsInsert = CFX_WideString(wsReplace.c_str(), nTextLength); | 531 m_ChangeInfo.wsInsert = CFX_WideString(wsReplace.c_str(), nTextLength); |
| 540 nStart += nTextLength; | 532 nStart += nTextLength; |
| 541 FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1); | 533 FX_WCHAR wChar = m_pTxtBuf->GetCharByIndex(nStart - 1); |
| 542 bool bBefore = true; | 534 bool bBefore = true; |
| 543 if (wChar != L'\n' && wChar != L'\r') { | 535 if (wChar != L'\n' && wChar != L'\r') { |
| 544 nStart--; | 536 nStart--; |
| 545 bBefore = false; | 537 bBefore = false; |
| 546 } | 538 } |
| 547 SetCaretPos(nStart, bBefore); | 539 SetCaretPos(nStart, bBefore); |
| 548 m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); | 540 m_Param.pEventSink->OnPageUnload(m_nCaretPage); |
| 549 m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); | 541 m_Param.pEventSink->OnPageLoad(m_nCaretPage); |
| 550 m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); | 542 m_Param.pEventSink->OnTextChanged(m_ChangeInfo); |
| 551 return FDE_TXTEDT_MODIFY_RET_S_Normal; | 543 return FDE_TXTEDT_MODIFY_RET_S_Normal; |
| 552 } | 544 } |
| 553 | 545 |
| 554 void CFDE_TxtEdtEngine::SetLimit(int32_t nLimit) { | 546 void CFDE_TxtEdtEngine::SetLimit(int32_t nLimit) { |
| 555 m_nLimit = nLimit; | 547 m_nLimit = nLimit; |
| 556 } | 548 } |
| 557 | 549 |
| 558 void CFDE_TxtEdtEngine::SetAliasChar(FX_WCHAR wcAlias) { | 550 void CFDE_TxtEdtEngine::SetAliasChar(FX_WCHAR wcAlias) { |
| 559 m_wcAliasChar = wcAlias; | 551 m_wcAliasChar = wcAlias; |
| 560 } | 552 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 576 void CFDE_TxtEdtEngine::AddSelRange(int32_t nStart, int32_t nCount) { | 568 void CFDE_TxtEdtEngine::AddSelRange(int32_t nStart, int32_t nCount) { |
| 577 if (nCount == -1) { | 569 if (nCount == -1) { |
| 578 nCount = GetTextLength() - nStart; | 570 nCount = GetTextLength() - nStart; |
| 579 } | 571 } |
| 580 int32_t nSize = m_SelRangePtrArr.GetSize(); | 572 int32_t nSize = m_SelRangePtrArr.GetSize(); |
| 581 if (nSize <= 0) { | 573 if (nSize <= 0) { |
| 582 FDE_TXTEDTSELRANGE* lpSelRange = new FDE_TXTEDTSELRANGE; | 574 FDE_TXTEDTSELRANGE* lpSelRange = new FDE_TXTEDTSELRANGE; |
| 583 lpSelRange->nStart = nStart; | 575 lpSelRange->nStart = nStart; |
| 584 lpSelRange->nCount = nCount; | 576 lpSelRange->nCount = nCount; |
| 585 m_SelRangePtrArr.Add(lpSelRange); | 577 m_SelRangePtrArr.Add(lpSelRange); |
| 586 m_Param.pEventSink->On_SelChanged(this); | 578 m_Param.pEventSink->OnSelChanged(); |
| 587 return; | 579 return; |
| 588 } | 580 } |
| 589 FDE_TXTEDTSELRANGE* lpTemp = nullptr; | 581 FDE_TXTEDTSELRANGE* lpTemp = nullptr; |
| 590 lpTemp = m_SelRangePtrArr[nSize - 1]; | 582 lpTemp = m_SelRangePtrArr[nSize - 1]; |
| 591 if (nStart >= lpTemp->nStart + lpTemp->nCount) { | 583 if (nStart >= lpTemp->nStart + lpTemp->nCount) { |
| 592 FDE_TXTEDTSELRANGE* lpSelRange = new FDE_TXTEDTSELRANGE; | 584 FDE_TXTEDTSELRANGE* lpSelRange = new FDE_TXTEDTSELRANGE; |
| 593 lpSelRange->nStart = nStart; | 585 lpSelRange->nStart = nStart; |
| 594 lpSelRange->nCount = nCount; | 586 lpSelRange->nCount = nCount; |
| 595 m_SelRangePtrArr.Add(lpSelRange); | 587 m_SelRangePtrArr.Add(lpSelRange); |
| 596 m_Param.pEventSink->On_SelChanged(this); | 588 m_Param.pEventSink->OnSelChanged(); |
| 597 return; | 589 return; |
| 598 } | 590 } |
| 599 int32_t nEnd = nStart + nCount - 1; | 591 int32_t nEnd = nStart + nCount - 1; |
| 600 bool bBegin = false; | 592 bool bBegin = false; |
| 601 int32_t nRangeBgn = 0; | 593 int32_t nRangeBgn = 0; |
| 602 int32_t nRangeCnt = 0; | 594 int32_t nRangeCnt = 0; |
| 603 for (int32_t i = 0; i < nSize; i++) { | 595 for (int32_t i = 0; i < nSize; i++) { |
| 604 lpTemp = m_SelRangePtrArr[i]; | 596 lpTemp = m_SelRangePtrArr[i]; |
| 605 int32_t nTempBgn = lpTemp->nStart; | 597 int32_t nTempBgn = lpTemp->nStart; |
| 606 int32_t nTempEnd = nTempBgn + lpTemp->nCount - 1; | 598 int32_t nTempEnd = nTempBgn + lpTemp->nCount - 1; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 632 lpTemp = m_SelRangePtrArr[nRangeBgn]; | 624 lpTemp = m_SelRangePtrArr[nRangeBgn]; |
| 633 lpTemp->nStart = nStart; | 625 lpTemp->nStart = nStart; |
| 634 lpTemp->nCount = nCount; | 626 lpTemp->nCount = nCount; |
| 635 nRangeCnt--; | 627 nRangeCnt--; |
| 636 nRangeBgn++; | 628 nRangeBgn++; |
| 637 while (nRangeCnt--) { | 629 while (nRangeCnt--) { |
| 638 delete m_SelRangePtrArr[nRangeBgn]; | 630 delete m_SelRangePtrArr[nRangeBgn]; |
| 639 m_SelRangePtrArr.RemoveAt(nRangeBgn); | 631 m_SelRangePtrArr.RemoveAt(nRangeBgn); |
| 640 } | 632 } |
| 641 } | 633 } |
| 642 m_Param.pEventSink->On_SelChanged(this); | 634 m_Param.pEventSink->OnSelChanged(); |
| 643 } | 635 } |
| 644 | 636 |
| 645 int32_t CFDE_TxtEdtEngine::CountSelRanges() const { | 637 int32_t CFDE_TxtEdtEngine::CountSelRanges() const { |
| 646 return m_SelRangePtrArr.GetSize(); | 638 return m_SelRangePtrArr.GetSize(); |
| 647 } | 639 } |
| 648 | 640 |
| 649 int32_t CFDE_TxtEdtEngine::GetSelRange(int32_t nIndex, int32_t& nStart) const { | 641 int32_t CFDE_TxtEdtEngine::GetSelRange(int32_t nIndex, int32_t* nStart) const { |
| 650 nStart = m_SelRangePtrArr[nIndex]->nStart; | 642 if (nStart) |
| 643 *nStart = m_SelRangePtrArr[nIndex]->nStart; |
| 651 return m_SelRangePtrArr[nIndex]->nCount; | 644 return m_SelRangePtrArr[nIndex]->nCount; |
| 652 } | 645 } |
| 653 | 646 |
| 654 void CFDE_TxtEdtEngine::ClearSelection() { | 647 void CFDE_TxtEdtEngine::ClearSelection() { |
| 655 int32_t nCount = m_SelRangePtrArr.GetSize(); | 648 int32_t nCount = m_SelRangePtrArr.GetSize(); |
| 656 for (int i = 0; i < nCount; ++i) | 649 for (int i = 0; i < nCount; ++i) |
| 657 delete m_SelRangePtrArr[i]; | 650 delete m_SelRangePtrArr[i]; |
| 658 m_SelRangePtrArr.RemoveAll(); | 651 m_SelRangePtrArr.RemoveAll(); |
| 659 if (nCount && m_Param.pEventSink) | 652 if (nCount && m_Param.pEventSink) |
| 660 m_Param.pEventSink->On_SelChanged(this); | 653 m_Param.pEventSink->OnSelChanged(); |
| 661 } | 654 } |
| 662 | 655 |
| 663 bool CFDE_TxtEdtEngine::Redo(const IFDE_TxtEdtDoRecord* pDoRecord) { | 656 bool CFDE_TxtEdtEngine::Redo(const IFDE_TxtEdtDoRecord* pDoRecord) { |
| 664 if (IsLocked()) | 657 if (IsLocked()) |
| 665 return false; | 658 return false; |
| 666 if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) | 659 if (m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo) |
| 667 return false; | 660 return false; |
| 668 return pDoRecord->Redo(); | 661 return pDoRecord->Redo(); |
| 669 } | 662 } |
| 670 | 663 |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 780 } | 773 } |
| 781 | 774 |
| 782 CFX_WideString CFDE_TxtEdtEngine::GetPreInsertText(int32_t nIndex, | 775 CFX_WideString CFDE_TxtEdtEngine::GetPreInsertText(int32_t nIndex, |
| 783 const FX_WCHAR* lpText, | 776 const FX_WCHAR* lpText, |
| 784 int32_t nLength) { | 777 int32_t nLength) { |
| 785 CFX_WideString wsText = GetText(0, GetTextBufLength()); | 778 CFX_WideString wsText = GetText(0, GetTextBufLength()); |
| 786 int32_t nSelIndex = 0; | 779 int32_t nSelIndex = 0; |
| 787 int32_t nSelLength = 0; | 780 int32_t nSelLength = 0; |
| 788 int32_t nSelCount = CountSelRanges(); | 781 int32_t nSelCount = CountSelRanges(); |
| 789 while (nSelCount--) { | 782 while (nSelCount--) { |
| 790 nSelLength = GetSelRange(nSelCount, nSelIndex); | 783 nSelLength = GetSelRange(nSelCount, &nSelIndex); |
| 791 wsText.Delete(nSelIndex, nSelLength); | 784 wsText.Delete(nSelIndex, nSelLength); |
| 792 nIndex = nSelIndex; | 785 nIndex = nSelIndex; |
| 793 } | 786 } |
| 794 CFX_WideString wsTemp; | 787 CFX_WideString wsTemp; |
| 795 int32_t nOldLength = wsText.GetLength(); | 788 int32_t nOldLength = wsText.GetLength(); |
| 796 const FX_WCHAR* pOldBuffer = wsText.c_str(); | 789 const FX_WCHAR* pOldBuffer = wsText.c_str(); |
| 797 FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nOldLength + nLength); | 790 FX_WCHAR* lpBuffer = wsTemp.GetBuffer(nOldLength + nLength); |
| 798 FXSYS_memcpy(lpBuffer, pOldBuffer, (nIndex) * sizeof(FX_WCHAR)); | 791 FXSYS_memcpy(lpBuffer, pOldBuffer, (nIndex) * sizeof(FX_WCHAR)); |
| 799 FXSYS_memcpy(lpBuffer + nIndex, lpText, nLength * sizeof(FX_WCHAR)); | 792 FXSYS_memcpy(lpBuffer + nIndex, lpText, nLength * sizeof(FX_WCHAR)); |
| 800 FXSYS_memcpy(lpBuffer + nIndex + nLength, pOldBuffer + nIndex, | 793 FXSYS_memcpy(lpBuffer + nIndex + nLength, pOldBuffer + nIndex, |
| 801 (nOldLength - nIndex) * sizeof(FX_WCHAR)); | 794 (nOldLength - nIndex) * sizeof(FX_WCHAR)); |
| 802 wsTemp.ReleaseBuffer(nOldLength + nLength); | 795 wsTemp.ReleaseBuffer(nOldLength + nLength); |
| 803 wsText = wsTemp; | 796 wsText = wsTemp; |
| 804 return wsText; | 797 return wsText; |
| 805 } | 798 } |
| 806 | 799 |
| 807 CFX_WideString CFDE_TxtEdtEngine::GetPreReplaceText(int32_t nIndex, | 800 CFX_WideString CFDE_TxtEdtEngine::GetPreReplaceText(int32_t nIndex, |
| 808 int32_t nOriginLength, | 801 int32_t nOriginLength, |
| 809 const FX_WCHAR* lpText, | 802 const FX_WCHAR* lpText, |
| 810 int32_t nLength) { | 803 int32_t nLength) { |
| 811 CFX_WideString wsText = GetText(0, GetTextBufLength()); | 804 CFX_WideString wsText = GetText(0, GetTextBufLength()); |
| 812 int32_t nSelIndex = 0; | 805 int32_t nSelIndex = 0; |
| 813 int32_t nSelLength = 0; | 806 int32_t nSelLength = 0; |
| 814 int32_t nSelCount = CountSelRanges(); | 807 int32_t nSelCount = CountSelRanges(); |
| 815 while (nSelCount--) { | 808 while (nSelCount--) { |
| 816 nSelLength = GetSelRange(nSelCount, nSelIndex); | 809 nSelLength = GetSelRange(nSelCount, &nSelIndex); |
| 817 wsText.Delete(nSelIndex, nSelLength); | 810 wsText.Delete(nSelIndex, nSelLength); |
| 818 } | 811 } |
| 819 wsText.Delete(nIndex, nOriginLength); | 812 wsText.Delete(nIndex, nOriginLength); |
| 820 int32_t i = 0; | 813 int32_t i = 0; |
| 821 for (i = 0; i < nLength; i++) | 814 for (i = 0; i < nLength; i++) |
| 822 wsText.Insert(nIndex++, lpText[i]); | 815 wsText.Insert(nIndex++, lpText[i]); |
| 823 | 816 |
| 824 return wsText; | 817 return wsText; |
| 825 } | 818 } |
| 826 | 819 |
| 827 void CFDE_TxtEdtEngine::Inner_Insert(int32_t nStart, | 820 void CFDE_TxtEdtEngine::Inner_Insert(int32_t nStart, |
| 828 const FX_WCHAR* lpText, | 821 const FX_WCHAR* lpText, |
| 829 int32_t nLength) { | 822 int32_t nLength) { |
| 830 ASSERT(nLength > 0); | 823 ASSERT(nLength > 0); |
| 831 FDE_TXTEDTPARAGPOS ParagPos; | 824 FDE_TXTEDTPARAGPOS ParagPos; |
| 832 TextPos2ParagPos(nStart, ParagPos); | 825 TextPos2ParagPos(nStart, ParagPos); |
| 833 m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); | 826 m_Param.pEventSink->OnPageUnload(m_nCaretPage); |
| 834 int32_t nParagCount = m_ParagPtrArray.GetSize(); | 827 int32_t nParagCount = m_ParagPtrArray.GetSize(); |
| 835 int32_t i = 0; | 828 int32_t i = 0; |
| 836 for (i = ParagPos.nParagIndex + 1; i < nParagCount; i++) | 829 for (i = ParagPos.nParagIndex + 1; i < nParagCount; i++) |
| 837 m_ParagPtrArray[i]->IncrementStartIndex(nLength); | 830 m_ParagPtrArray[i]->IncrementStartIndex(nLength); |
| 838 | 831 |
| 839 CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex]; | 832 CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPos.nParagIndex]; |
| 840 int32_t nReserveLineCount = pParag->GetLineCount(); | 833 int32_t nReserveLineCount = pParag->GetLineCount(); |
| 841 int32_t nReserveCharStart = pParag->GetStartIndex(); | 834 int32_t nReserveCharStart = pParag->GetStartIndex(); |
| 842 int32_t nLeavePart = ParagPos.nCharIndex; | 835 int32_t nLeavePart = ParagPos.nCharIndex; |
| 843 int32_t nCutPart = pParag->GetTextLength() - ParagPos.nCharIndex; | 836 int32_t nCutPart = pParag->GetTextLength() - ParagPos.nCharIndex; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 877 m_ParagPtrArray.InsertAt(++nParagIndex, pParag); | 870 m_ParagPtrArray.InsertAt(++nParagIndex, pParag); |
| 878 } | 871 } |
| 879 m_pTxtBuf->Insert(nStart, lpText, nLength); | 872 m_pTxtBuf->Insert(nStart, lpText, nLength); |
| 880 int32_t nTotalLineCount = 0; | 873 int32_t nTotalLineCount = 0; |
| 881 for (i = ParagPos.nParagIndex; i <= nParagIndex; i++) { | 874 for (i = ParagPos.nParagIndex; i <= nParagIndex; i++) { |
| 882 pParag = m_ParagPtrArray[i]; | 875 pParag = m_ParagPtrArray[i]; |
| 883 pParag->CalcLines(); | 876 pParag->CalcLines(); |
| 884 nTotalLineCount += pParag->GetLineCount(); | 877 nTotalLineCount += pParag->GetLineCount(); |
| 885 } | 878 } |
| 886 m_nLineCount += nTotalLineCount - nReserveLineCount; | 879 m_nLineCount += nTotalLineCount - nReserveLineCount; |
| 887 m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); | 880 m_Param.pEventSink->OnPageLoad(m_nCaretPage); |
| 888 UpdatePages(); | 881 UpdatePages(); |
| 889 } | 882 } |
| 890 | 883 |
| 891 void CFDE_TxtEdtEngine::Inner_DeleteRange(int32_t nStart, int32_t nCount) { | 884 void CFDE_TxtEdtEngine::Inner_DeleteRange(int32_t nStart, int32_t nCount) { |
| 892 if (nCount == -1) { | 885 if (nCount == -1) { |
| 893 nCount = m_pTxtBuf->GetTextLength() - nStart; | 886 nCount = m_pTxtBuf->GetTextLength() - nStart; |
| 894 } | 887 } |
| 895 int32_t nEnd = nStart + nCount - 1; | 888 int32_t nEnd = nStart + nCount - 1; |
| 896 ASSERT(nStart >= 0 && nEnd < m_pTxtBuf->GetTextLength()); | 889 ASSERT(nStart >= 0 && nEnd < m_pTxtBuf->GetTextLength()); |
| 897 m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); | 890 m_Param.pEventSink->OnPageUnload(m_nCaretPage); |
| 898 FDE_TXTEDTPARAGPOS ParagPosBgn, ParagPosEnd; | 891 FDE_TXTEDTPARAGPOS ParagPosBgn, ParagPosEnd; |
| 899 TextPos2ParagPos(nStart, ParagPosBgn); | 892 TextPos2ParagPos(nStart, ParagPosBgn); |
| 900 TextPos2ParagPos(nEnd, ParagPosEnd); | 893 TextPos2ParagPos(nEnd, ParagPosEnd); |
| 901 CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPosEnd.nParagIndex]; | 894 CFDE_TxtEdtParag* pParag = m_ParagPtrArray[ParagPosEnd.nParagIndex]; |
| 902 bool bLastParag = false; | 895 bool bLastParag = false; |
| 903 if (ParagPosEnd.nCharIndex == pParag->GetTextLength() - 1) { | 896 if (ParagPosEnd.nCharIndex == pParag->GetTextLength() - 1) { |
| 904 if (ParagPosEnd.nParagIndex < m_ParagPtrArray.GetSize() - 1) { | 897 if (ParagPosEnd.nParagIndex < m_ParagPtrArray.GetSize() - 1) { |
| 905 ParagPosEnd.nParagIndex++; | 898 ParagPosEnd.nParagIndex++; |
| 906 } else { | 899 } else { |
| 907 bLastParag = true; | 900 bLastParag = true; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 933 int32_t nParagCount = m_ParagPtrArray.GetSize(); | 926 int32_t nParagCount = m_ParagPtrArray.GetSize(); |
| 934 for (i = nNextParagIndex; i < nParagCount; i++) | 927 for (i = nNextParagIndex; i < nParagCount; i++) |
| 935 m_ParagPtrArray[i]->DecrementStartIndex(nCount); | 928 m_ParagPtrArray[i]->DecrementStartIndex(nCount); |
| 936 | 929 |
| 937 m_nLineCount -= nTotalLineCount; | 930 m_nLineCount -= nTotalLineCount; |
| 938 UpdatePages(); | 931 UpdatePages(); |
| 939 int32_t nPageCount = CountPages(); | 932 int32_t nPageCount = CountPages(); |
| 940 if (m_nCaretPage >= nPageCount) { | 933 if (m_nCaretPage >= nPageCount) { |
| 941 m_nCaretPage = nPageCount - 1; | 934 m_nCaretPage = nPageCount - 1; |
| 942 } | 935 } |
| 943 m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); | 936 m_Param.pEventSink->OnPageLoad(m_nCaretPage); |
| 944 } | 937 } |
| 945 | 938 |
| 946 void CFDE_TxtEdtEngine::DeleteRange_DoRecord(int32_t nStart, | 939 void CFDE_TxtEdtEngine::DeleteRange_DoRecord(int32_t nStart, |
| 947 int32_t nCount, | 940 int32_t nCount, |
| 948 bool bSel) { | 941 bool bSel) { |
| 949 ASSERT(nStart >= 0); | 942 ASSERT(nStart >= 0); |
| 950 if (nCount == -1) { | 943 if (nCount == -1) { |
| 951 nCount = GetTextLength() - nStart; | 944 nCount = GetTextLength() - nStart; |
| 952 } | 945 } |
| 953 ASSERT((nStart + nCount) <= m_pTxtBuf->GetTextLength()); | 946 ASSERT((nStart + nCount) <= m_pTxtBuf->GetTextLength()); |
| 954 | 947 |
| 955 if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { | 948 if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) { |
| 956 CFX_WideString wsRange = m_pTxtBuf->GetRange(nStart, nCount); | 949 CFX_WideString wsRange = m_pTxtBuf->GetRange(nStart, nCount); |
| 957 m_Param.pEventSink->On_AddDoRecord( | 950 m_Param.pEventSink->OnAddDoRecord( |
| 958 this, new CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, | 951 pdfium::MakeUnique<CFDE_TxtEdtDoRecord_DeleteRange>( |
| 959 wsRange, bSel)); | 952 this, nStart, m_nCaret, wsRange, bSel)); |
| 960 } | 953 } |
| 961 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; | 954 m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete; |
| 962 m_ChangeInfo.wsDelete = GetText(nStart, nCount); | 955 m_ChangeInfo.wsDelete = GetText(nStart, nCount); |
| 963 Inner_DeleteRange(nStart, nCount); | 956 Inner_DeleteRange(nStart, nCount); |
| 964 } | 957 } |
| 965 | 958 |
| 966 void CFDE_TxtEdtEngine::ResetEngine() { | 959 void CFDE_TxtEdtEngine::ResetEngine() { |
| 967 RemoveAllPages(); | 960 RemoveAllPages(); |
| 968 RemoveAllParags(); | 961 RemoveAllParags(); |
| 969 ClearSelection(); | 962 ClearSelection(); |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1228 *lpBuf = wc; | 1221 *lpBuf = wc; |
| 1229 } | 1222 } |
| 1230 } | 1223 } |
| 1231 } | 1224 } |
| 1232 | 1225 |
| 1233 int32_t CFDE_TxtEdtEngine::MovePage2Char(int32_t nIndex) { | 1226 int32_t CFDE_TxtEdtEngine::MovePage2Char(int32_t nIndex) { |
| 1234 ASSERT(nIndex >= 0); | 1227 ASSERT(nIndex >= 0); |
| 1235 ASSERT(nIndex <= m_pTxtBuf->GetTextLength()); | 1228 ASSERT(nIndex <= m_pTxtBuf->GetTextLength()); |
| 1236 if (m_nCaretPage >= 0) { | 1229 if (m_nCaretPage >= 0) { |
| 1237 IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; | 1230 IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; |
| 1238 m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); | 1231 m_Param.pEventSink->OnPageLoad(m_nCaretPage); |
| 1239 int32_t nPageCharStart = pPage->GetCharStart(); | 1232 int32_t nPageCharStart = pPage->GetCharStart(); |
| 1240 int32_t nPageCharCount = pPage->GetCharCount(); | 1233 int32_t nPageCharCount = pPage->GetCharCount(); |
| 1241 if (nIndex >= nPageCharStart && nIndex < nPageCharStart + nPageCharCount) { | 1234 if (nIndex >= nPageCharStart && nIndex < nPageCharStart + nPageCharCount) { |
| 1242 m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); | 1235 m_Param.pEventSink->OnPageUnload(m_nCaretPage); |
| 1243 return m_nCaretPage; | 1236 return m_nCaretPage; |
| 1244 } | 1237 } |
| 1245 m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); | 1238 m_Param.pEventSink->OnPageUnload(m_nCaretPage); |
| 1246 } | 1239 } |
| 1247 CFDE_TxtEdtParag* pParag = nullptr; | 1240 CFDE_TxtEdtParag* pParag = nullptr; |
| 1248 int32_t nLineCount = 0; | 1241 int32_t nLineCount = 0; |
| 1249 int32_t nParagCount = m_ParagPtrArray.GetSize(); | 1242 int32_t nParagCount = m_ParagPtrArray.GetSize(); |
| 1250 int32_t i = 0; | 1243 int32_t i = 0; |
| 1251 for (i = 0; i < nParagCount; i++) { | 1244 for (i = 0; i < nParagCount; i++) { |
| 1252 pParag = m_ParagPtrArray[i]; | 1245 pParag = m_ParagPtrArray[i]; |
| 1253 if (pParag->GetStartIndex() <= nIndex && | 1246 if (pParag->GetStartIndex() <= nIndex && |
| 1254 nIndex < (pParag->GetStartIndex() + pParag->GetTextLength())) { | 1247 nIndex < (pParag->GetStartIndex() + pParag->GetTextLength())) { |
| 1255 break; | 1248 break; |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1545 GetCaretRect(m_rtCaret, m_nCaretPage, nIndex, bBefore); | 1538 GetCaretRect(m_rtCaret, m_nCaretPage, nIndex, bBefore); |
| 1546 m_nCaret = nIndex; | 1539 m_nCaret = nIndex; |
| 1547 m_bBefore = bBefore; | 1540 m_bBefore = bBefore; |
| 1548 if (!m_bBefore) { | 1541 if (!m_bBefore) { |
| 1549 m_nCaret++; | 1542 m_nCaret++; |
| 1550 m_bBefore = true; | 1543 m_bBefore = true; |
| 1551 } | 1544 } |
| 1552 m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) | 1545 m_fCaretPosReserve = (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) |
| 1553 ? m_rtCaret.top | 1546 ? m_rtCaret.top |
| 1554 : m_rtCaret.left; | 1547 : m_rtCaret.left; |
| 1555 m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage, 0); | 1548 m_Param.pEventSink->OnCaretChanged(); |
| 1556 } | 1549 } |
| 1557 | 1550 |
| 1558 void CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret, | 1551 void CFDE_TxtEdtEngine::GetCaretRect(CFX_RectF& rtCaret, |
| 1559 int32_t nPageIndex, | 1552 int32_t nPageIndex, |
| 1560 int32_t nCaret, | 1553 int32_t nCaret, |
| 1561 bool bBefore) { | 1554 bool bBefore) { |
| 1562 IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; | 1555 IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; |
| 1563 m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); | 1556 m_Param.pEventSink->OnPageLoad(m_nCaretPage); |
| 1564 bool bCombText = !!(m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText); | 1557 bool bCombText = !!(m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText); |
| 1565 int32_t nIndexInpage = nCaret - pPage->GetCharStart(); | 1558 int32_t nIndexInpage = nCaret - pPage->GetCharStart(); |
| 1566 if (bBefore && bCombText && nIndexInpage > 0) { | 1559 if (bBefore && bCombText && nIndexInpage > 0) { |
| 1567 nIndexInpage--; | 1560 nIndexInpage--; |
| 1568 bBefore = false; | 1561 bBefore = false; |
| 1569 } | 1562 } |
| 1570 int32_t nBIDILevel = pPage->GetCharRect(nIndexInpage, rtCaret, bCombText); | 1563 int32_t nBIDILevel = pPage->GetCharRect(nIndexInpage, rtCaret, bCombText); |
| 1571 if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { | 1564 if (m_Param.dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) { |
| 1572 if ((!FX_IsOdd(nBIDILevel) && !bBefore) || | 1565 if ((!FX_IsOdd(nBIDILevel) && !bBefore) || |
| 1573 (FX_IsOdd(nBIDILevel) && bBefore)) { | 1566 (FX_IsOdd(nBIDILevel) && bBefore)) { |
| 1574 rtCaret.Offset(0, rtCaret.height - 1.0f); | 1567 rtCaret.Offset(0, rtCaret.height - 1.0f); |
| 1575 } | 1568 } |
| 1576 if (rtCaret.height == 0 && rtCaret.top > 1.0f) | 1569 if (rtCaret.height == 0 && rtCaret.top > 1.0f) |
| 1577 rtCaret.top -= 1.0f; | 1570 rtCaret.top -= 1.0f; |
| 1578 | 1571 |
| 1579 rtCaret.height = 1.0f; | 1572 rtCaret.height = 1.0f; |
| 1580 } else { | 1573 } else { |
| 1581 if ((!FX_IsOdd(nBIDILevel) && !bBefore) || | 1574 if ((!FX_IsOdd(nBIDILevel) && !bBefore) || |
| 1582 (FX_IsOdd(nBIDILevel) && bBefore)) { | 1575 (FX_IsOdd(nBIDILevel) && bBefore)) { |
| 1583 rtCaret.Offset(rtCaret.width - 1.0f, 0); | 1576 rtCaret.Offset(rtCaret.width - 1.0f, 0); |
| 1584 } | 1577 } |
| 1585 if (rtCaret.width == 0 && rtCaret.left > 1.0f) | 1578 if (rtCaret.width == 0 && rtCaret.left > 1.0f) |
| 1586 rtCaret.left -= 1.0f; | 1579 rtCaret.left -= 1.0f; |
| 1587 | 1580 |
| 1588 rtCaret.width = 1.0f; | 1581 rtCaret.width = 1.0f; |
| 1589 } | 1582 } |
| 1590 m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); | 1583 m_Param.pEventSink->OnPageUnload(m_nCaretPage); |
| 1591 } | 1584 } |
| 1592 | 1585 |
| 1593 void CFDE_TxtEdtEngine::UpdateCaretIndex(const CFX_PointF& ptCaret) { | 1586 void CFDE_TxtEdtEngine::UpdateCaretIndex(const CFX_PointF& ptCaret) { |
| 1594 IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; | 1587 IFDE_TxtEdtPage* pPage = m_PagePtrArray[m_nCaretPage]; |
| 1595 m_Param.pEventSink->On_PageLoad(this, m_nCaretPage, 0); | 1588 m_Param.pEventSink->OnPageLoad(m_nCaretPage); |
| 1596 m_nCaret = pPage->GetCharIndex(ptCaret, m_bBefore); | 1589 m_nCaret = pPage->GetCharIndex(ptCaret, m_bBefore); |
| 1597 GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore); | 1590 GetCaretRect(m_rtCaret, m_nCaretPage, m_nCaret, m_bBefore); |
| 1598 if (!m_bBefore) { | 1591 if (!m_bBefore) { |
| 1599 m_nCaret++; | 1592 m_nCaret++; |
| 1600 m_bBefore = true; | 1593 m_bBefore = true; |
| 1601 } | 1594 } |
| 1602 m_Param.pEventSink->On_CaretChanged(this, m_nCaretPage); | 1595 m_Param.pEventSink->OnCaretChanged(); |
| 1603 m_Param.pEventSink->On_PageUnload(this, m_nCaretPage, 0); | 1596 m_Param.pEventSink->OnPageUnload(m_nCaretPage); |
| 1604 } | 1597 } |
| 1605 | 1598 |
| 1606 bool CFDE_TxtEdtEngine::IsSelect() { | 1599 bool CFDE_TxtEdtEngine::IsSelect() { |
| 1607 return m_SelRangePtrArr.GetSize() > 0; | 1600 return m_SelRangePtrArr.GetSize() > 0; |
| 1608 } | 1601 } |
| 1609 | 1602 |
| 1610 void CFDE_TxtEdtEngine::DeleteSelect() { | 1603 void CFDE_TxtEdtEngine::DeleteSelect() { |
| 1611 int32_t nCountRange = CountSelRanges(); | 1604 int32_t nCountRange = CountSelRanges(); |
| 1612 if (nCountRange > 0) { | 1605 if (nCountRange > 0) { |
| 1613 int32_t nSelStart = 0; | 1606 int32_t nSelStart = 0; |
| 1614 while (nCountRange > 0) { | 1607 while (nCountRange > 0) { |
| 1615 int32_t nSelCount = GetSelRange(--nCountRange, nSelStart); | 1608 int32_t nSelCount = GetSelRange(--nCountRange, &nSelStart); |
| 1616 delete m_SelRangePtrArr[nCountRange]; | 1609 delete m_SelRangePtrArr[nCountRange]; |
| 1617 m_SelRangePtrArr.RemoveAt(nCountRange); | 1610 m_SelRangePtrArr.RemoveAt(nCountRange); |
| 1618 DeleteRange_DoRecord(nSelStart, nSelCount, true); | 1611 DeleteRange_DoRecord(nSelStart, nSelCount, true); |
| 1619 } | 1612 } |
| 1620 ClearSelection(); | 1613 ClearSelection(); |
| 1621 m_Param.pEventSink->On_TextChanged(this, m_ChangeInfo); | 1614 m_Param.pEventSink->OnTextChanged(m_ChangeInfo); |
| 1622 m_Param.pEventSink->On_SelChanged(this); | 1615 m_Param.pEventSink->OnSelChanged(); |
| 1623 SetCaretPos(nSelStart, true); | 1616 SetCaretPos(nSelStart, true); |
| 1624 return; | 1617 return; |
| 1625 } | 1618 } |
| 1626 } | 1619 } |
| OLD | NEW |