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 "fpdfsdk/pdfwindow/PWL_Edit.h" | 7 #include "fpdfsdk/pdfwindow/PWL_Edit.h" |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" | 11 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" |
12 #include "core/fpdfdoc/include/cpvt_word.h" | 12 #include "core/fpdfdoc/include/cpvt_word.h" |
13 #include "core/fxcrt/include/fx_safe_types.h" | 13 #include "core/fxcrt/include/fx_safe_types.h" |
14 #include "core/fxcrt/include/fx_xml.h" | 14 #include "core/fxcrt/include/fx_xml.h" |
15 #include "core/fxge/include/fx_ge.h" | 15 #include "core/fxge/include/fx_ge.h" |
| 16 #include "fpdfsdk/fxedit/include/fxet_edit.h" |
16 #include "fpdfsdk/pdfwindow/PWL_Caret.h" | 17 #include "fpdfsdk/pdfwindow/PWL_Caret.h" |
17 #include "fpdfsdk/pdfwindow/PWL_EditCtrl.h" | 18 #include "fpdfsdk/pdfwindow/PWL_EditCtrl.h" |
18 #include "fpdfsdk/pdfwindow/PWL_FontMap.h" | 19 #include "fpdfsdk/pdfwindow/PWL_FontMap.h" |
19 #include "fpdfsdk/pdfwindow/PWL_ScrollBar.h" | 20 #include "fpdfsdk/pdfwindow/PWL_ScrollBar.h" |
20 #include "fpdfsdk/pdfwindow/PWL_Utils.h" | 21 #include "fpdfsdk/pdfwindow/PWL_Utils.h" |
21 #include "fpdfsdk/pdfwindow/PWL_Wnd.h" | 22 #include "fpdfsdk/pdfwindow/PWL_Wnd.h" |
22 #include "public/fpdf_fwlevent.h" | 23 #include "public/fpdf_fwlevent.h" |
23 #include "third_party/base/stl_util.h" | 24 #include "third_party/base/stl_util.h" |
24 | 25 |
25 CPWL_Edit::CPWL_Edit() | 26 CPWL_Edit::CPWL_Edit() |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 CPVT_WordRange wrWhole = m_pEdit->GetWholeWordRange(); | 252 CPVT_WordRange wrWhole = m_pEdit->GetWholeWordRange(); |
252 CPVT_WordRange wrSelect = GetSelectWordRange(); | 253 CPVT_WordRange wrSelect = GetSelectWordRange(); |
253 CPVT_WordRange wrVisible = | 254 CPVT_WordRange wrVisible = |
254 (HasFlag(PES_TEXTOVERFLOW) ? wrWhole : m_pEdit->GetVisibleWordRange()); | 255 (HasFlag(PES_TEXTOVERFLOW) ? wrWhole : m_pEdit->GetVisibleWordRange()); |
255 CPVT_WordRange wrSelBefore(wrWhole.BeginPos, wrSelect.BeginPos); | 256 CPVT_WordRange wrSelBefore(wrWhole.BeginPos, wrSelect.BeginPos); |
256 CPVT_WordRange wrSelAfter(wrSelect.EndPos, wrWhole.EndPos); | 257 CPVT_WordRange wrSelAfter(wrSelect.EndPos, wrWhole.EndPos); |
257 | 258 |
258 CPVT_WordRange wrTemp = | 259 CPVT_WordRange wrTemp = |
259 CPWL_Utils::OverlapWordRange(GetSelectWordRange(), wrVisible); | 260 CPWL_Utils::OverlapWordRange(GetSelectWordRange(), wrVisible); |
260 CFX_ByteString sEditSel = | 261 CFX_ByteString sEditSel = |
261 CPWL_Utils::GetEditSelAppStream(m_pEdit, ptOffset, &wrTemp); | 262 CPWL_Utils::GetEditSelAppStream(m_pEdit.get(), ptOffset, &wrTemp); |
262 | 263 |
263 if (sEditSel.GetLength() > 0) | 264 if (sEditSel.GetLength() > 0) |
264 sText << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELBACKCOLOR).AsStringC() | 265 sText << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELBACKCOLOR).AsStringC() |
265 << sEditSel.AsStringC(); | 266 << sEditSel.AsStringC(); |
266 | 267 |
267 wrTemp = CPWL_Utils::OverlapWordRange(wrVisible, wrSelBefore); | 268 wrTemp = CPWL_Utils::OverlapWordRange(wrVisible, wrSelBefore); |
268 CFX_ByteString sEditBefore = CPWL_Utils::GetEditAppStream( | 269 CFX_ByteString sEditBefore = CPWL_Utils::GetEditAppStream( |
269 m_pEdit, ptOffset, &wrTemp, !HasFlag(PES_CHARARRAY), | 270 m_pEdit.get(), ptOffset, &wrTemp, !HasFlag(PES_CHARARRAY), |
270 m_pEdit->GetPasswordChar()); | 271 m_pEdit->GetPasswordChar()); |
271 | 272 |
272 if (sEditBefore.GetLength() > 0) | 273 if (sEditBefore.GetLength() > 0) |
273 sText << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()).AsStringC() | 274 sText << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()).AsStringC() |
274 << sEditBefore.AsStringC() << "ET\n"; | 275 << sEditBefore.AsStringC() << "ET\n"; |
275 | 276 |
276 wrTemp = CPWL_Utils::OverlapWordRange(wrVisible, wrSelect); | 277 wrTemp = CPWL_Utils::OverlapWordRange(wrVisible, wrSelect); |
277 CFX_ByteString sEditMid = CPWL_Utils::GetEditAppStream( | 278 CFX_ByteString sEditMid = CPWL_Utils::GetEditAppStream( |
278 m_pEdit, ptOffset, &wrTemp, !HasFlag(PES_CHARARRAY), | 279 m_pEdit.get(), ptOffset, &wrTemp, !HasFlag(PES_CHARARRAY), |
279 m_pEdit->GetPasswordChar()); | 280 m_pEdit->GetPasswordChar()); |
280 | 281 |
281 if (sEditMid.GetLength() > 0) | 282 if (sEditMid.GetLength() > 0) |
282 sText << "BT\n" | 283 sText << "BT\n" |
283 << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY, 1)) | 284 << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY, 1)) |
284 .AsStringC() | 285 .AsStringC() |
285 << sEditMid.AsStringC() << "ET\n"; | 286 << sEditMid.AsStringC() << "ET\n"; |
286 | 287 |
287 wrTemp = CPWL_Utils::OverlapWordRange(wrVisible, wrSelAfter); | 288 wrTemp = CPWL_Utils::OverlapWordRange(wrVisible, wrSelAfter); |
288 CFX_ByteString sEditAfter = CPWL_Utils::GetEditAppStream( | 289 CFX_ByteString sEditAfter = CPWL_Utils::GetEditAppStream( |
289 m_pEdit, ptOffset, &wrTemp, !HasFlag(PES_CHARARRAY), | 290 m_pEdit.get(), ptOffset, &wrTemp, !HasFlag(PES_CHARARRAY), |
290 m_pEdit->GetPasswordChar()); | 291 m_pEdit->GetPasswordChar()); |
291 | 292 |
292 if (sEditAfter.GetLength() > 0) | 293 if (sEditAfter.GetLength() > 0) |
293 sText << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()).AsStringC() | 294 sText << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()).AsStringC() |
294 << sEditAfter.AsStringC() << "ET\n"; | 295 << sEditAfter.AsStringC() << "ET\n"; |
295 | 296 |
296 if (sText.GetLength() > 0) { | 297 if (sText.GetLength() > 0) { |
297 CFX_FloatRect rect = GetClientRect(); | 298 CFX_FloatRect rect = GetClientRect(); |
298 sAppStream << "q\n/Tx BMC\n"; | 299 sAppStream << "q\n/Tx BMC\n"; |
299 | 300 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 | 389 |
389 CFX_FloatRect rcClip; | 390 CFX_FloatRect rcClip; |
390 CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange(); | 391 CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange(); |
391 CPVT_WordRange* pRange = nullptr; | 392 CPVT_WordRange* pRange = nullptr; |
392 | 393 |
393 if (!HasFlag(PES_TEXTOVERFLOW)) { | 394 if (!HasFlag(PES_TEXTOVERFLOW)) { |
394 rcClip = GetClientRect(); | 395 rcClip = GetClientRect(); |
395 pRange = &wrRange; | 396 pRange = &wrRange; |
396 } | 397 } |
397 CFX_SystemHandler* pSysHandler = GetSystemHandler(); | 398 CFX_SystemHandler* pSysHandler = GetSystemHandler(); |
398 IFX_Edit::DrawEdit( | 399 CFX_Edit::DrawEdit( |
399 pDevice, pUser2Device, m_pEdit, | 400 pDevice, pUser2Device, m_pEdit.get(), |
400 CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), | 401 CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), |
401 CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), GetTransparency()), | 402 CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), GetTransparency()), |
402 rcClip, CFX_FloatPoint(0.0f, 0.0f), pRange, pSysHandler, m_pFormFiller); | 403 rcClip, CFX_FloatPoint(0.0f, 0.0f), pRange, pSysHandler, m_pFormFiller); |
403 } | 404 } |
404 | 405 |
405 FX_BOOL CPWL_Edit::OnLButtonDown(const CFX_FloatPoint& point, uint32_t nFlag) { | 406 FX_BOOL CPWL_Edit::OnLButtonDown(const CFX_FloatPoint& point, uint32_t nFlag) { |
406 CPWL_Wnd::OnLButtonDown(point, nFlag); | 407 CPWL_Wnd::OnLButtonDown(point, nFlag); |
407 | 408 |
408 if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point)) { | 409 if (HasFlag(PES_TEXTOVERFLOW) || ClientHitTest(point)) { |
409 if (m_bMouseDown) | 410 if (m_bMouseDown) |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 } | 484 } |
484 | 485 |
485 void CPWL_Edit::SetLineLeading(FX_FLOAT fLineLeading, | 486 void CPWL_Edit::SetLineLeading(FX_FLOAT fLineLeading, |
486 FX_BOOL bPaint /* = TRUE*/) { | 487 FX_BOOL bPaint /* = TRUE*/) { |
487 m_pEdit->SetLineLeading(fLineLeading, bPaint); | 488 m_pEdit->SetLineLeading(fLineLeading, bPaint); |
488 } | 489 } |
489 | 490 |
490 CFX_ByteString CPWL_Edit::GetSelectAppearanceStream( | 491 CFX_ByteString CPWL_Edit::GetSelectAppearanceStream( |
491 const CFX_FloatPoint& ptOffset) const { | 492 const CFX_FloatPoint& ptOffset) const { |
492 CPVT_WordRange wr = GetSelectWordRange(); | 493 CPVT_WordRange wr = GetSelectWordRange(); |
493 return CPWL_Utils::GetEditSelAppStream(m_pEdit, ptOffset, &wr); | 494 return CPWL_Utils::GetEditSelAppStream(m_pEdit.get(), ptOffset, &wr); |
494 } | 495 } |
495 | 496 |
496 CPVT_WordRange CPWL_Edit::GetSelectWordRange() const { | 497 CPVT_WordRange CPWL_Edit::GetSelectWordRange() const { |
497 if (m_pEdit->IsSelected()) { | 498 if (m_pEdit->IsSelected()) { |
498 int32_t nStart = -1; | 499 int32_t nStart = -1; |
499 int32_t nEnd = -1; | 500 int32_t nEnd = -1; |
500 | 501 |
501 m_pEdit->GetSel(nStart, nEnd); | 502 m_pEdit->GetSel(nStart, nEnd); |
502 | 503 |
503 CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStart); | 504 CPVT_WordPlace wpStart = m_pEdit->WordIndexToWordPlace(nStart); |
504 CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEnd); | 505 CPVT_WordPlace wpEnd = m_pEdit->WordIndexToWordPlace(nEnd); |
505 | 506 |
506 return CPVT_WordRange(wpStart, wpEnd); | 507 return CPVT_WordRange(wpStart, wpEnd); |
507 } | 508 } |
508 | 509 |
509 return CPVT_WordRange(); | 510 return CPVT_WordRange(); |
510 } | 511 } |
511 | 512 |
512 CFX_ByteString CPWL_Edit::GetTextAppearanceStream( | 513 CFX_ByteString CPWL_Edit::GetTextAppearanceStream( |
513 const CFX_FloatPoint& ptOffset) const { | 514 const CFX_FloatPoint& ptOffset) const { |
514 CFX_ByteTextBuf sRet; | 515 CFX_ByteTextBuf sRet; |
515 CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset); | 516 CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit.get(), ptOffset); |
516 if (sEdit.GetLength() > 0) { | 517 if (sEdit.GetLength() > 0) { |
517 sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()).AsStringC() | 518 sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()).AsStringC() |
518 << sEdit.AsStringC() << "ET\n"; | 519 << sEdit.AsStringC() << "ET\n"; |
519 } | 520 } |
520 return sRet.MakeString(); | 521 return sRet.MakeString(); |
521 } | 522 } |
522 | 523 |
523 CFX_ByteString CPWL_Edit::GetCaretAppearanceStream( | 524 CFX_ByteString CPWL_Edit::GetCaretAppearanceStream( |
524 const CFX_FloatPoint& ptOffset) const { | 525 const CFX_FloatPoint& ptOffset) const { |
525 if (m_pEditCaret) | 526 if (m_pEditCaret) |
526 return m_pEditCaret->GetCaretAppearanceStream(ptOffset); | 527 return m_pEditCaret->GetCaretAppearanceStream(ptOffset); |
527 | 528 |
528 return CFX_ByteString(); | 529 return CFX_ByteString(); |
529 } | 530 } |
530 | 531 |
531 CFX_FloatPoint CPWL_Edit::GetWordRightBottomPoint( | 532 CFX_FloatPoint CPWL_Edit::GetWordRightBottomPoint( |
532 const CPVT_WordPlace& wpWord) { | 533 const CPVT_WordPlace& wpWord) { |
533 CFX_FloatPoint pt(0.0f, 0.0f); | 534 CFX_FloatPoint pt(0.0f, 0.0f); |
534 | 535 |
535 IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator(); | 536 CFX_Edit_Iterator* pIterator = m_pEdit->GetIterator(); |
536 CPVT_WordPlace wpOld = pIterator->GetAt(); | 537 CPVT_WordPlace wpOld = pIterator->GetAt(); |
537 pIterator->SetAt(wpWord); | 538 pIterator->SetAt(wpWord); |
538 CPVT_Word word; | 539 CPVT_Word word; |
539 if (pIterator->GetWord(word)) { | 540 if (pIterator->GetWord(word)) { |
540 pt = CFX_FloatPoint(word.ptWord.x + word.fWidth, | 541 pt = CFX_FloatPoint(word.ptWord.x + word.fWidth, |
541 word.ptWord.y + word.fDescent); | 542 word.ptWord.y + word.fDescent); |
542 } | 543 } |
543 | 544 |
544 pIterator->SetAt(wpOld); | 545 pIterator->SetAt(wpOld); |
545 | 546 |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
816 if (HasFlag(PES_SPELLCHECK)) { | 817 if (HasFlag(PES_SPELLCHECK)) { |
817 m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), | 818 m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), |
818 GetLatinWordsRange(place))); | 819 GetLatinWordsRange(place))); |
819 } | 820 } |
820 | 821 |
821 if (m_pEditNotify) { | 822 if (m_pEditNotify) { |
822 m_pEditNotify->OnInsertWord(place, oldplace); | 823 m_pEditNotify->OnInsertWord(place, oldplace); |
823 } | 824 } |
824 } | 825 } |
825 | 826 |
826 void CPWL_Edit::OnSetText(const CPVT_WordPlace& place, | |
827 const CPVT_WordPlace& oldplace) {} | |
828 | |
829 void CPWL_Edit::OnInsertText(const CPVT_WordPlace& place, | 827 void CPWL_Edit::OnInsertText(const CPVT_WordPlace& place, |
830 const CPVT_WordPlace& oldplace) { | 828 const CPVT_WordPlace& oldplace) { |
831 if (HasFlag(PES_SPELLCHECK)) { | 829 if (HasFlag(PES_SPELLCHECK)) { |
832 m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), | 830 m_pEdit->RefreshWordRange(CombineWordRange(GetLatinWordsRange(oldplace), |
833 GetLatinWordsRange(place))); | 831 GetLatinWordsRange(place))); |
834 } | 832 } |
835 | 833 |
836 if (m_pEditNotify) { | 834 if (m_pEditNotify) { |
837 m_pEditNotify->OnInsertText(place, oldplace); | 835 m_pEditNotify->OnInsertText(place, oldplace); |
838 } | 836 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
879 } | 877 } |
880 | 878 |
881 #define PWL_ISARABICWORD(word) \ | 879 #define PWL_ISARABICWORD(word) \ |
882 ((word >= 0x0600 && word <= 0x06FF) || (word >= 0xFB50 && word <= 0xFEFC)) | 880 ((word >= 0x0600 && word <= 0x06FF) || (word >= 0xFB50 && word <= 0xFEFC)) |
883 | 881 |
884 CPVT_WordRange CPWL_Edit::GetSameWordsRange(const CPVT_WordPlace& place, | 882 CPVT_WordRange CPWL_Edit::GetSameWordsRange(const CPVT_WordPlace& place, |
885 FX_BOOL bLatin, | 883 FX_BOOL bLatin, |
886 FX_BOOL bArabic) const { | 884 FX_BOOL bArabic) const { |
887 CPVT_WordRange range; | 885 CPVT_WordRange range; |
888 | 886 |
889 IFX_Edit_Iterator* pIterator = m_pEdit->GetIterator(); | 887 CFX_Edit_Iterator* pIterator = m_pEdit->GetIterator(); |
890 CPVT_Word wordinfo; | 888 CPVT_Word wordinfo; |
891 CPVT_WordPlace wpStart(place), wpEnd(place); | 889 CPVT_WordPlace wpStart(place), wpEnd(place); |
892 pIterator->SetAt(place); | 890 pIterator->SetAt(place); |
893 | 891 |
894 if (bLatin) { | 892 if (bLatin) { |
895 while (pIterator->NextWord()) { | 893 while (pIterator->NextWord()) { |
896 if (!pIterator->GetWord(wordinfo) || | 894 if (!pIterator->GetWord(wordinfo) || |
897 !FX_EDIT_ISLATINWORD(wordinfo.Word)) { | 895 !FX_EDIT_ISLATINWORD(wordinfo.Word)) { |
898 break; | 896 break; |
899 } | 897 } |
(...skipping 30 matching lines...) Expand all Loading... |
930 } | 928 } |
931 | 929 |
932 range.Set(wpStart, wpEnd); | 930 range.Set(wpStart, wpEnd); |
933 return range; | 931 return range; |
934 } | 932 } |
935 | 933 |
936 void CPWL_Edit::GeneratePageObjects( | 934 void CPWL_Edit::GeneratePageObjects( |
937 CPDF_PageObjectHolder* pObjectHolder, | 935 CPDF_PageObjectHolder* pObjectHolder, |
938 const CFX_FloatPoint& ptOffset, | 936 const CFX_FloatPoint& ptOffset, |
939 CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray) { | 937 CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray) { |
940 IFX_Edit::GeneratePageObjects( | 938 CFX_Edit::GeneratePageObjects( |
941 pObjectHolder, m_pEdit, ptOffset, nullptr, | 939 pObjectHolder, m_pEdit.get(), ptOffset, nullptr, |
942 CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), | 940 CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), |
943 ObjArray); | 941 ObjArray); |
944 } | 942 } |
945 | 943 |
946 void CPWL_Edit::GeneratePageObjects(CPDF_PageObjectHolder* pObjectHolder, | 944 void CPWL_Edit::GeneratePageObjects(CPDF_PageObjectHolder* pObjectHolder, |
947 const CFX_FloatPoint& ptOffset) { | 945 const CFX_FloatPoint& ptOffset) { |
948 CFX_ArrayTemplate<CPDF_TextObject*> ObjArray; | 946 CFX_ArrayTemplate<CPDF_TextObject*> ObjArray; |
949 IFX_Edit::GeneratePageObjects( | 947 CFX_Edit::GeneratePageObjects( |
950 pObjectHolder, m_pEdit, ptOffset, nullptr, | 948 pObjectHolder, m_pEdit.get(), ptOffset, nullptr, |
951 CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), | 949 CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()), |
952 ObjArray); | 950 ObjArray); |
953 } | 951 } |
OLD | NEW |