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_Note.h" | 7 #include "fpdfsdk/pdfwindow/PWL_Note.h" |
8 | 8 |
9 #include "core/fxge/include/fx_ge.h" | 9 #include "core/fxge/include/fx_ge.h" |
10 #include "fpdfsdk/pdfwindow/PWL_Button.h" | 10 #include "fpdfsdk/pdfwindow/PWL_Button.h" |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 void CPWL_Note_Edit::OnSetFocus() { | 130 void CPWL_Note_Edit::OnSetFocus() { |
131 m_bEnableNotify = FALSE; | 131 m_bEnableNotify = FALSE; |
132 CPWL_Edit::OnSetFocus(); | 132 CPWL_Edit::OnSetFocus(); |
133 m_bEnableNotify = TRUE; | 133 m_bEnableNotify = TRUE; |
134 | 134 |
135 EnableSpellCheck(TRUE); | 135 EnableSpellCheck(TRUE); |
136 } | 136 } |
137 | 137 |
138 void CPWL_Note_Edit::OnKillFocus() { | 138 void CPWL_Note_Edit::OnKillFocus() { |
139 EnableSpellCheck(FALSE); | 139 EnableSpellCheck(FALSE); |
140 | |
141 if (CPWL_Wnd* pParent = GetParentWindow()) { | |
142 if (CPWL_Wnd* pGrand = pParent->GetParentWindow()) { | |
143 ASSERT(pGrand->GetClassName() == "CPWL_NoteItem"); | |
144 | |
145 CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pGrand; | |
146 | |
147 pNoteItem->OnContentsValidate(); | |
148 } | |
149 } | |
150 | |
151 CPWL_Edit::OnKillFocus(); | 140 CPWL_Edit::OnKillFocus(); |
152 } | 141 } |
153 | 142 |
154 void CPWL_Note_Edit::OnNotify(CPWL_Wnd* pWnd, | 143 void CPWL_Note_Edit::OnNotify(CPWL_Wnd* pWnd, |
155 uint32_t msg, | 144 uint32_t msg, |
156 intptr_t wParam, | 145 intptr_t wParam, |
157 intptr_t lParam) { | 146 intptr_t lParam) { |
158 if (m_bEnableNotify) { | 147 if (m_bEnableNotify) { |
159 if (wParam == SBT_VSCROLL) { | 148 if (wParam == SBT_VSCROLL) { |
160 switch (msg) { | 149 switch (msg) { |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 } | 370 } |
382 } | 371 } |
383 | 372 |
384 CFX_WideString CPWL_Note_Contents::GetText() const { | 373 CFX_WideString CPWL_Note_Contents::GetText() const { |
385 if (m_pEdit) | 374 if (m_pEdit) |
386 return m_pEdit->GetText(); | 375 return m_pEdit->GetText(); |
387 | 376 |
388 return L""; | 377 return L""; |
389 } | 378 } |
390 | 379 |
391 CPWL_NoteItem* CPWL_Note_Contents::CreateSubItem() { | |
392 CPWL_NoteItem* pNoteItem = new CPWL_NoteItem; | |
393 PWL_CREATEPARAM icp = GetCreationParam(); | |
394 icp.pParentWnd = this; | |
395 icp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND; | |
396 pNoteItem->Create(icp); | |
397 | |
398 pNoteItem->OnCreateNoteItem(); | |
399 | |
400 pNoteItem->ResetSubjectName(m_aChildren.GetSize() - 1); | |
401 | |
402 FX_SYSTEMTIME st; | |
403 if (IFX_SystemHandler* pSH = GetSystemHandler()) | |
404 st = pSH->GetLocalTime(); | |
405 pNoteItem->SetDateTime(st); | |
406 | |
407 pNoteItem->SetContents(L""); | |
408 | |
409 OnNotify(pNoteItem, PNM_NOTEEDITCHANGED, 0, 0); | |
410 | |
411 return pNoteItem; | |
412 } | |
413 | |
414 int32_t CPWL_Note_Contents::CountSubItems() const { | 380 int32_t CPWL_Note_Contents::CountSubItems() const { |
415 return m_aChildren.GetSize() - 1; | 381 return m_aChildren.GetSize() - 1; |
416 } | 382 } |
417 | 383 |
418 IPWL_NoteItem* CPWL_Note_Contents::GetSubItems(int32_t index) const { | 384 IPWL_NoteItem* CPWL_Note_Contents::GetSubItems(int32_t index) const { |
419 int32_t nIndex = index + 1; | 385 int32_t nIndex = index + 1; |
420 | 386 |
421 if (nIndex > 0 && nIndex < m_aChildren.GetSize()) { | 387 if (nIndex > 0 && nIndex < m_aChildren.GetSize()) { |
422 if (CPWL_Wnd* pChild = m_aChildren.GetAt(nIndex)) { | 388 if (CPWL_Wnd* pChild = m_aChildren.GetAt(nIndex)) { |
423 ASSERT(pChild->GetClassName() == "CPWL_NoteItem"); | 389 ASSERT(pChild->GetClassName() == "CPWL_NoteItem"); |
424 CPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild; | 390 CPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild; |
425 return pItem; | 391 return pItem; |
426 } | 392 } |
427 } | 393 } |
428 return NULL; | 394 return NULL; |
429 } | 395 } |
430 | 396 |
431 void CPWL_Note_Contents::DeleteSubItem(IPWL_NoteItem* pNoteItem) { | |
432 int32_t nIndex = GetItemIndex((CPWL_NoteItem*)pNoteItem); | |
433 | |
434 if (nIndex > 0) { | |
435 if (CPWL_NoteItem* pPWLNoteItem = (CPWL_NoteItem*)pNoteItem) { | |
436 pPWLNoteItem->KillFocus(); | |
437 pPWLNoteItem->Destroy(); | |
438 delete pPWLNoteItem; | |
439 } | |
440 | |
441 for (int32_t i = nIndex, sz = m_aChildren.GetSize(); i < sz; i++) { | |
442 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { | |
443 ASSERT(pChild->GetClassName() == "CPWL_NoteItem"); | |
444 CPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild; | |
445 pItem->ResetSubjectName(i); | |
446 } | |
447 } | |
448 | |
449 OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0); | |
450 } | |
451 } | |
452 | |
453 IPWL_NoteItem* CPWL_Note_Contents::GetHitNoteItem(const CFX_FloatPoint& point) { | 397 IPWL_NoteItem* CPWL_Note_Contents::GetHitNoteItem(const CFX_FloatPoint& point) { |
454 CFX_FloatPoint pt = ParentToChild(point); | 398 CFX_FloatPoint pt = ParentToChild(point); |
455 | 399 |
456 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { | 400 for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) { |
457 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { | 401 if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) { |
458 if (pChild->GetClassName() == "CPWL_NoteItem") { | 402 if (pChild->GetClassName() == "CPWL_NoteItem") { |
459 CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild; | 403 CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pChild; |
460 if (IPWL_NoteItem* pRet = pNoteItem->GetHitNoteItem(pt)) | 404 if (IPWL_NoteItem* pRet = pNoteItem->GetHitNoteItem(pt)) |
461 return pRet; | 405 return pRet; |
462 } | 406 } |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 else | 628 else |
685 sTextColor = PWL_DEFAULT_BLACKCOLOR; | 629 sTextColor = PWL_DEFAULT_BLACKCOLOR; |
686 | 630 |
687 SetTextColor(sTextColor); | 631 SetTextColor(sTextColor); |
688 if (m_pSubject) | 632 if (m_pSubject) |
689 m_pSubject->SetTextColor(sTextColor); | 633 m_pSubject->SetTextColor(sTextColor); |
690 if (m_pDateTime) | 634 if (m_pDateTime) |
691 m_pDateTime->SetTextColor(sTextColor); | 635 m_pDateTime->SetTextColor(sTextColor); |
692 | 636 |
693 InvalidateRect(nullptr); | 637 InvalidateRect(nullptr); |
694 | |
695 if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { | |
696 pNotify->OnSetBkColor(this); | |
697 } | |
698 } | 638 } |
699 | 639 |
700 void CPWL_NoteItem::SetSubjectName(const CFX_WideString& sName) { | 640 void CPWL_NoteItem::SetSubjectName(const CFX_WideString& sName) { |
701 if (m_pSubject) { | 641 if (m_pSubject) |
702 m_pSubject->SetText(sName.c_str()); | 642 m_pSubject->SetText(sName.c_str()); |
703 } | |
704 | |
705 if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { | |
706 pNotify->OnSetSubjectName(this); | |
707 } | |
708 } | |
709 | |
710 void CPWL_NoteItem::SetAuthorName(const CFX_WideString& sName) { | |
711 m_sAuthor = sName; | |
712 ResetSubjectName(-1); | |
713 | |
714 if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { | |
715 pNotify->OnSetAuthorName(this); | |
716 } | |
717 } | |
718 | |
719 void CPWL_NoteItem::ResetSubjectName(int32_t nItemIndex) { | |
720 if (nItemIndex < 0) { | |
721 if (CPWL_Wnd* pParent = GetParentWindow()) { | |
722 ASSERT(pParent->GetClassName() == "CPWL_Note_Contents"); | |
723 | |
724 CPWL_Note_Contents* pContents = (CPWL_Note_Contents*)pParent; | |
725 nItemIndex = pContents->GetItemIndex(this); | |
726 } | |
727 } | |
728 | |
729 const CPWL_Note* pNote = GetNote(); | |
730 CFX_WideString sSubject; | |
731 sSubject.Format(pNote->GetReplyString().c_str(), nItemIndex); | |
732 | |
733 if (!m_sAuthor.IsEmpty()) { | |
734 sSubject += L" - "; | |
735 sSubject += m_sAuthor; | |
736 } | |
737 SetSubjectName(sSubject); | |
738 RePosChildWnd(); | |
739 } | 643 } |
740 | 644 |
741 void CPWL_NoteItem::SetDateTime(FX_SYSTEMTIME time) { | 645 void CPWL_NoteItem::SetDateTime(FX_SYSTEMTIME time) { |
742 m_dtNote = time; | 646 m_dtNote = time; |
743 | 647 |
744 CFX_WideString swTime; | 648 CFX_WideString swTime; |
745 swTime.Format(L"%04d-%02d-%02d %02d:%02d:%02d", time.wYear, time.wMonth, | 649 swTime.Format(L"%04d-%02d-%02d %02d:%02d:%02d", time.wYear, time.wMonth, |
746 time.wDay, time.wHour, time.wMinute, time.wSecond); | 650 time.wDay, time.wHour, time.wMinute, time.wSecond); |
747 if (m_pDateTime) { | 651 if (m_pDateTime) { |
748 m_pDateTime->SetText(swTime.c_str()); | 652 m_pDateTime->SetText(swTime.c_str()); |
749 } | 653 } |
750 | 654 |
751 RePosChildWnd(); | 655 RePosChildWnd(); |
752 | |
753 if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { | |
754 pNotify->OnSetDateTime(this); | |
755 } | |
756 } | 656 } |
757 | 657 |
758 void CPWL_NoteItem::SetContents(const CFX_WideString& sContents) { | 658 void CPWL_NoteItem::SetContents(const CFX_WideString& sContents) { |
759 if (m_pContents) { | 659 if (m_pContents) { |
760 m_pContents->SetText(sContents); | 660 m_pContents->SetText(sContents); |
761 } | 661 } |
762 | |
763 if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { | |
764 pNotify->OnSetContents(this); | |
765 } | |
766 } | 662 } |
767 | 663 |
768 CPWL_NoteItem* CPWL_NoteItem::GetParentNoteItem() const { | 664 CPWL_NoteItem* CPWL_NoteItem::GetParentNoteItem() const { |
769 if (CPWL_Wnd* pParent = GetParentWindow()) { | 665 if (CPWL_Wnd* pParent = GetParentWindow()) { |
770 if (CPWL_Wnd* pGrand = pParent->GetParentWindow()) { | 666 if (CPWL_Wnd* pGrand = pParent->GetParentWindow()) { |
771 ASSERT(pGrand->GetClassName() == "CPWL_NoteItem"); | 667 ASSERT(pGrand->GetClassName() == "CPWL_NoteItem"); |
772 return (CPWL_NoteItem*)pGrand; | 668 return (CPWL_NoteItem*)pGrand; |
773 } | 669 } |
774 } | 670 } |
775 | 671 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
809 return m_dtNote; | 705 return m_dtNote; |
810 } | 706 } |
811 | 707 |
812 CFX_WideString CPWL_NoteItem::GetSubjectName() const { | 708 CFX_WideString CPWL_NoteItem::GetSubjectName() const { |
813 if (m_pSubject) | 709 if (m_pSubject) |
814 return m_pSubject->GetText(); | 710 return m_pSubject->GetText(); |
815 | 711 |
816 return L""; | 712 return L""; |
817 } | 713 } |
818 | 714 |
819 CPWL_NoteItem* CPWL_NoteItem::CreateNoteItem() { | |
820 if (m_pContents) | |
821 return m_pContents->CreateSubItem(); | |
822 | |
823 return NULL; | |
824 } | |
825 | |
826 IPWL_NoteItem* CPWL_NoteItem::CreateSubItem() { | |
827 return CreateNoteItem(); | |
828 } | |
829 | |
830 int32_t CPWL_NoteItem::CountSubItems() const { | 715 int32_t CPWL_NoteItem::CountSubItems() const { |
831 if (m_pContents) | 716 if (m_pContents) |
832 return m_pContents->CountSubItems(); | 717 return m_pContents->CountSubItems(); |
833 | 718 |
834 return 0; | 719 return 0; |
835 } | 720 } |
836 | 721 |
837 IPWL_NoteItem* CPWL_NoteItem::GetSubItems(int32_t index) const { | 722 IPWL_NoteItem* CPWL_NoteItem::GetSubItems(int32_t index) const { |
838 if (m_pContents) | 723 if (m_pContents) |
839 return m_pContents->GetSubItems(index); | 724 return m_pContents->GetSubItems(index); |
840 | 725 |
841 return NULL; | 726 return NULL; |
842 } | 727 } |
843 | 728 |
844 void CPWL_NoteItem::DeleteSubItem(IPWL_NoteItem* pNoteItem) { | |
845 KillFocus(); | |
846 | |
847 if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { | |
848 pNotify->OnItemDelete(pNoteItem); | |
849 } | |
850 | |
851 if (m_pContents) | |
852 m_pContents->DeleteSubItem(pNoteItem); | |
853 } | |
854 | |
855 IPWL_NoteItem* CPWL_NoteItem::GetHitNoteItem(const CFX_FloatPoint& point) { | 729 IPWL_NoteItem* CPWL_NoteItem::GetHitNoteItem(const CFX_FloatPoint& point) { |
856 CFX_FloatPoint pt = ParentToChild(point); | 730 CFX_FloatPoint pt = ParentToChild(point); |
857 | 731 |
858 if (WndHitTest(pt)) { | 732 if (WndHitTest(pt)) { |
859 if (m_pContents) { | 733 if (m_pContents) { |
860 if (IPWL_NoteItem* pNoteItem = m_pContents->GetHitNoteItem(pt)) | 734 if (IPWL_NoteItem* pNoteItem = m_pContents->GetHitNoteItem(pt)) |
861 return pNoteItem; | 735 return pNoteItem; |
862 } | 736 } |
863 | 737 |
864 return this; | 738 return this; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
962 m_bSizeChanged = TRUE; | 836 m_bSizeChanged = TRUE; |
963 m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); | 837 m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); |
964 | 838 |
965 return; | 839 return; |
966 } | 840 } |
967 | 841 |
968 CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); | 842 CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); |
969 } | 843 } |
970 | 844 |
971 void CPWL_NoteItem::PopupNoteItemMenu(const CFX_FloatPoint& point) { | 845 void CPWL_NoteItem::PopupNoteItemMenu(const CFX_FloatPoint& point) { |
972 if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { | |
973 int32_t x, y; | |
974 PWLtoWnd(point, x, y); | |
975 if (IFX_SystemHandler* pSH = GetSystemHandler()) | |
976 pSH->ClientToScreen(GetAttachedHWnd(), x, y); | |
977 pNotify->OnPopupMenu(this, x, y); | |
978 } | |
979 } | |
980 | |
981 const CPWL_Note* CPWL_NoteItem::GetNote() const { | |
982 if (const CPWL_Wnd* pRoot = GetRootWnd()) { | |
983 ASSERT(pRoot->GetClassName() == "CPWL_NoteItem"); | |
984 CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pRoot; | |
985 if (pNoteItem->IsTopItem()) { | |
986 return (CPWL_Note*)pNoteItem; | |
987 } | |
988 } | |
989 | |
990 return NULL; | |
991 } | |
992 | |
993 IPWL_NoteNotify* CPWL_NoteItem::GetNoteNotify() const { | |
994 if (const CPWL_Note* pNote = GetNote()) | |
995 return pNote->GetNoteNotify(); | |
996 | |
997 return NULL; | |
998 } | |
999 | |
1000 void CPWL_NoteItem::OnCreateNoteItem() { | |
1001 if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { | |
1002 pNotify->OnItemCreate(this); | |
1003 } | |
1004 } | |
1005 | |
1006 void CPWL_NoteItem::OnContentsValidate() { | |
1007 if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { | |
1008 pNotify->OnSetContents(this); | |
1009 } | |
1010 } | 846 } |
1011 | 847 |
1012 void CPWL_NoteItem::SetNoteFocus(FX_BOOL bLast) { | 848 void CPWL_NoteItem::SetNoteFocus(FX_BOOL bLast) { |
1013 m_pContents->SetEditFocus(bLast); | 849 m_pContents->SetEditFocus(bLast); |
1014 } | 850 } |
1015 | 851 |
1016 void CPWL_NoteItem::EnableModify(FX_BOOL bEnabled) { | 852 void CPWL_NoteItem::EnableModify(FX_BOOL bEnabled) { |
1017 m_pContents->EnableModify(bEnabled); | 853 m_pContents->EnableModify(bEnabled); |
1018 m_bAllowModify = bEnabled; | 854 m_bAllowModify = bEnabled; |
1019 } | 855 } |
1020 | 856 |
1021 void CPWL_NoteItem::EnableRead(FX_BOOL bEnabled) { | 857 void CPWL_NoteItem::EnableRead(FX_BOOL bEnabled) { |
1022 m_pContents->EnableRead(bEnabled); | 858 m_pContents->EnableRead(bEnabled); |
1023 } | 859 } |
1024 | |
1025 CPWL_Note::CPWL_Note(IPopup_Note* pPopupNote, | |
1026 IPWL_NoteNotify* pNoteNotify, | |
1027 IPWL_NoteHandler* pNoteHandler) | |
1028 : m_pAuthor(NULL), | |
1029 m_pIcon(NULL), | |
1030 m_pCloseBox(NULL), | |
1031 m_pLBBox(NULL), | |
1032 m_pRBBox(NULL), | |
1033 m_pContentsBar(NULL), | |
1034 m_pOptions(NULL), | |
1035 m_pNoteNotify(pNoteNotify), | |
1036 m_bResizing(FALSE), | |
1037 m_bEnableNotify(TRUE) {} | |
1038 | |
1039 CPWL_Note::~CPWL_Note() {} | |
1040 | |
1041 IPWL_NoteItem* CPWL_Note::Reply() { | |
1042 return CreateNoteItem(); | |
1043 } | |
1044 | |
1045 void CPWL_Note::EnableNotify(FX_BOOL bEnabled) { | |
1046 m_bEnableNotify = bEnabled; | |
1047 } | |
1048 | |
1049 void CPWL_Note::RePosChildWnd() { | |
1050 RePosNoteChildren(); | |
1051 m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); | |
1052 ResetScrollBar(); | |
1053 m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); | |
1054 OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0); | |
1055 if (const CPWL_Wnd* pWnd = GetFocused()) { | |
1056 if (pWnd->GetClassName() == "CPWL_Edit") { | |
1057 CPWL_Edit* pEdit = (CPWL_Edit*)pWnd; | |
1058 pEdit->SetCaret(pEdit->GetCaret()); | |
1059 } | |
1060 } | |
1061 } | |
1062 | |
1063 FX_BOOL CPWL_Note::ResetScrollBar() { | |
1064 FX_BOOL bScrollChanged = FALSE; | |
1065 | |
1066 if (ScrollBarShouldVisible()) { | |
1067 if (!m_pContentsBar->IsVisible()) { | |
1068 m_pContentsBar->SetVisible(TRUE); | |
1069 if (m_pContentsBar->IsVisible()) { | |
1070 m_pContentsBar->InvalidateRect(NULL); | |
1071 bScrollChanged = TRUE; | |
1072 } | |
1073 } | |
1074 } else { | |
1075 if (m_pContentsBar->IsVisible()) { | |
1076 m_pContentsBar->SetVisible(FALSE); | |
1077 m_pContentsBar->InvalidateRect(NULL); | |
1078 | |
1079 bScrollChanged = TRUE; | |
1080 } | |
1081 } | |
1082 | |
1083 if (bScrollChanged) { | |
1084 CFX_FloatRect rcNote = GetClientRect(); | |
1085 CFX_FloatRect rcContents = m_pContents->GetWindowRect(); | |
1086 rcContents.right = rcNote.right - 3.0f; | |
1087 if (m_pContentsBar->IsVisible()) | |
1088 rcContents.right -= PWL_SCROLLBAR_WIDTH; | |
1089 m_pContents->Move(rcContents, TRUE, TRUE); | |
1090 m_pContents->SetScrollPos(CFX_FloatPoint(0.0f, 0.0f)); | |
1091 m_pContents->InvalidateRect(NULL); | |
1092 } | |
1093 | |
1094 return bScrollChanged; | |
1095 } | |
1096 | |
1097 FX_BOOL CPWL_Note::ScrollBarShouldVisible() { | |
1098 CFX_FloatRect rcContentsFact = m_pContents->GetScrollArea(); | |
1099 CFX_FloatRect rcContentsClient = m_pContents->GetClientRect(); | |
1100 | |
1101 return rcContentsFact.Height() > rcContentsClient.Height(); | |
1102 } | |
1103 | |
1104 void CPWL_Note::SetOptionsText(const CFX_WideString& sText) { | |
1105 if (m_pOptions) | |
1106 m_pOptions->SetText(sText); | |
1107 | |
1108 RePosNoteChildren(); | |
1109 } | |
1110 | |
1111 void CPWL_Note::RePosNoteChildren() { | |
1112 if (m_bResizing) | |
1113 return; | |
1114 | |
1115 m_bResizing = TRUE; | |
1116 | |
1117 if (IsValid()) { | |
1118 CFX_FloatRect rcClient = GetClientRect(); | |
1119 | |
1120 CFX_FloatRect rcIcon = rcClient; | |
1121 rcIcon.top -= 2.0f; | |
1122 rcIcon.right = rcIcon.left + 14.0f; | |
1123 rcIcon.bottom = rcIcon.top - 14.0f; | |
1124 rcIcon.Normalize(); | |
1125 m_pIcon->Move(rcIcon, TRUE, FALSE); | |
1126 m_pIcon->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcIcon)); | |
1127 | |
1128 CFX_FloatRect rcCloseBox = rcClient; | |
1129 rcCloseBox.right -= 1.0f; | |
1130 rcCloseBox.top -= 1.0f; | |
1131 rcCloseBox.left = rcCloseBox.right - 14.0f; | |
1132 rcCloseBox.bottom = rcCloseBox.top - 14.0f; | |
1133 rcCloseBox.Normalize(); | |
1134 m_pCloseBox->Move(rcCloseBox, TRUE, FALSE); | |
1135 m_pCloseBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcCloseBox)); | |
1136 | |
1137 CFX_FloatRect rcDate = rcClient; | |
1138 rcDate.right = rcCloseBox.left - POPUP_ITEM_TEXT_INDENT; | |
1139 rcDate.left = | |
1140 PWL_MAX(rcDate.right - m_pDateTime->GetContentRect().Width() - 1.0f, | |
1141 rcIcon.right + 1.0f); | |
1142 rcDate.top = rcClient.top - 2.0f; | |
1143 rcDate.bottom = rcDate.top - m_pDateTime->GetContentRect().Height(); | |
1144 rcDate.Normalize(); | |
1145 m_pDateTime->Move(rcDate, TRUE, FALSE); | |
1146 m_pDateTime->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcDate)); | |
1147 | |
1148 CFX_FloatRect rcSubject = rcClient; | |
1149 rcSubject.top = rcClient.top - 2.0f; | |
1150 rcSubject.left = rcIcon.right + POPUP_ITEM_TEXT_INDENT; | |
1151 rcSubject.right = | |
1152 PWL_MIN(rcSubject.left + m_pSubject->GetContentRect().Width() + 1.0f, | |
1153 rcDate.left - 1.0f); | |
1154 rcSubject.bottom = rcSubject.top - m_pSubject->GetContentRect().Height(); | |
1155 rcSubject.Normalize(); | |
1156 m_pSubject->Move(rcSubject, TRUE, FALSE); | |
1157 m_pSubject->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcSubject)); | |
1158 | |
1159 CFX_FloatRect rcOptions = rcClient; | |
1160 rcOptions.left = | |
1161 PWL_MAX(rcOptions.right - m_pOptions->GetContentRect().Width(), | |
1162 rcIcon.right + 1.0f); | |
1163 rcOptions.top = rcSubject.bottom - 4.0f; | |
1164 rcOptions.bottom = rcOptions.top - m_pOptions->GetContentRect().Height(); | |
1165 rcOptions.Normalize(); | |
1166 m_pOptions->Move(rcOptions, TRUE, FALSE); | |
1167 m_pOptions->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcOptions)); | |
1168 | |
1169 CFX_FloatRect rcAuthor = rcClient; | |
1170 rcAuthor.top = rcSubject.bottom - 4.0f; | |
1171 rcAuthor.left = rcSubject.left; | |
1172 rcAuthor.right = | |
1173 PWL_MIN(rcSubject.left + m_pAuthor->GetContentRect().Width() + 1.0f, | |
1174 rcOptions.left - 1.0f); | |
1175 rcAuthor.bottom = rcAuthor.top - m_pAuthor->GetContentRect().Height(); | |
1176 rcAuthor.Normalize(); | |
1177 m_pAuthor->Move(rcAuthor, TRUE, FALSE); | |
1178 m_pAuthor->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcAuthor)); | |
1179 | |
1180 CFX_FloatRect rcLBBox = rcClient; | |
1181 rcLBBox.top = rcLBBox.bottom + 7.0f; | |
1182 rcLBBox.right = rcLBBox.left + 7.0f; | |
1183 rcLBBox.Normalize(); | |
1184 m_pLBBox->Move(rcLBBox, TRUE, FALSE); | |
1185 m_pLBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcLBBox)); | |
1186 | |
1187 CFX_FloatRect rcRBBox = rcClient; | |
1188 rcRBBox.top = rcRBBox.bottom + 7.0f; | |
1189 rcRBBox.left = rcRBBox.right - 7.0f; | |
1190 rcRBBox.Normalize(); | |
1191 m_pRBBox->Move(rcRBBox, TRUE, FALSE); | |
1192 m_pRBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcRBBox)); | |
1193 | |
1194 CFX_FloatRect rcContents = rcClient; | |
1195 rcContents.top = rcAuthor.bottom - POPUP_ITEM_HEAD_BOTTOM; | |
1196 rcContents.left += 3.0f; | |
1197 rcContents.right -= 3.0f; | |
1198 if (m_pContentsBar->IsVisible()) | |
1199 rcContents.right -= PWL_SCROLLBAR_WIDTH; | |
1200 rcContents.bottom += 14.0f; | |
1201 rcContents.Normalize(); | |
1202 m_pContents->Move(rcContents, FALSE, FALSE); | |
1203 m_pContents->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcContents)); | |
1204 | |
1205 CFX_FloatRect rcContentsBar = rcContents; | |
1206 rcContentsBar.right = rcClient.right - 3.0f; | |
1207 rcContentsBar.left = rcContentsBar.right - PWL_SCROLLBAR_WIDTH; | |
1208 rcContentsBar.Normalize(); | |
1209 m_pContentsBar->Move(rcContentsBar, TRUE, FALSE); | |
1210 } | |
1211 | |
1212 m_bResizing = FALSE; | |
1213 } | |
1214 | |
1215 void CPWL_Note::CreateChildWnd(const PWL_CREATEPARAM& cp) { | |
1216 CPWL_NoteItem::CreateChildWnd(cp); | |
1217 | |
1218 CPWL_Color sTextColor; | |
1219 | |
1220 if (CPWL_Utils::IsBlackOrWhite(GetBackgroundColor())) | |
1221 sTextColor = PWL_DEFAULT_WHITECOLOR; | |
1222 else | |
1223 sTextColor = PWL_DEFAULT_BLACKCOLOR; | |
1224 | |
1225 m_pAuthor = new CPWL_Label; | |
1226 PWL_CREATEPARAM acp = cp; | |
1227 acp.pParentWnd = this; | |
1228 acp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_LEFT | PES_TOP; | |
1229 acp.sTextColor = sTextColor; | |
1230 m_pAuthor->Create(acp); | |
1231 | |
1232 m_pCloseBox = new CPWL_Note_CloseBox; | |
1233 PWL_CREATEPARAM ccp = cp; | |
1234 ccp.pParentWnd = this; | |
1235 ccp.dwBorderWidth = 2; | |
1236 ccp.nBorderStyle = PBS_BEVELED; | |
1237 ccp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER; | |
1238 ccp.sTextColor = sTextColor; | |
1239 m_pCloseBox->Create(ccp); | |
1240 | |
1241 m_pIcon = new CPWL_Note_Icon; | |
1242 PWL_CREATEPARAM icp = cp; | |
1243 icp.pParentWnd = this; | |
1244 icp.dwFlags = PWS_VISIBLE | PWS_CHILD; | |
1245 m_pIcon->Create(icp); | |
1246 | |
1247 m_pOptions = new CPWL_Note_Options; | |
1248 PWL_CREATEPARAM ocp = cp; | |
1249 ocp.pParentWnd = this; | |
1250 ocp.dwFlags = PWS_CHILD | PWS_VISIBLE; | |
1251 ocp.sTextColor = sTextColor; | |
1252 m_pOptions->Create(ocp); | |
1253 | |
1254 m_pLBBox = new CPWL_Note_LBBox; | |
1255 PWL_CREATEPARAM lcp = cp; | |
1256 lcp.pParentWnd = this; | |
1257 lcp.dwFlags = PWS_VISIBLE | PWS_CHILD; | |
1258 lcp.eCursorType = FXCT_NESW; | |
1259 lcp.sTextColor = sTextColor; | |
1260 m_pLBBox->Create(lcp); | |
1261 | |
1262 m_pRBBox = new CPWL_Note_RBBox; | |
1263 PWL_CREATEPARAM rcp = cp; | |
1264 rcp.pParentWnd = this; | |
1265 rcp.dwFlags = PWS_VISIBLE | PWS_CHILD; | |
1266 rcp.eCursorType = FXCT_NWSE; | |
1267 rcp.sTextColor = sTextColor; | |
1268 m_pRBBox->Create(rcp); | |
1269 | |
1270 m_pContentsBar = new CPWL_ScrollBar(SBT_VSCROLL); | |
1271 PWL_CREATEPARAM scp = cp; | |
1272 scp.pParentWnd = this; | |
1273 scp.sBackgroundColor = | |
1274 CPWL_Color(COLORTYPE_RGB, 240 / 255.0f, 240 / 255.0f, 240 / 255.0f); | |
1275 scp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND; | |
1276 m_pContentsBar->Create(scp); | |
1277 m_pContentsBar->SetNotifyForever(TRUE); | |
1278 } | |
1279 | |
1280 void CPWL_Note::SetSubjectName(const CFX_WideString& sName) { | |
1281 CPWL_NoteItem::SetSubjectName(sName); | |
1282 RePosChildWnd(); | |
1283 } | |
1284 | |
1285 void CPWL_Note::SetAuthorName(const CFX_WideString& sName) { | |
1286 if (m_pAuthor) { | |
1287 m_pAuthor->SetText(sName.c_str()); | |
1288 RePosChildWnd(); | |
1289 } | |
1290 | |
1291 if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { | |
1292 pNotify->OnSetAuthorName(this); | |
1293 } | |
1294 } | |
1295 | |
1296 CFX_WideString CPWL_Note::GetAuthorName() const { | |
1297 if (m_pAuthor) | |
1298 return m_pAuthor->GetText(); | |
1299 | |
1300 return L""; | |
1301 } | |
1302 | |
1303 FX_BOOL CPWL_Note::OnMouseWheel(short zDelta, | |
1304 const CFX_FloatPoint& point, | |
1305 uint32_t nFlag) { | |
1306 CFX_FloatPoint ptScroll = m_pContents->GetScrollPos(); | |
1307 CFX_FloatRect rcScroll = m_pContents->GetScrollArea(); | |
1308 CFX_FloatRect rcContents = m_pContents->GetClientRect(); | |
1309 | |
1310 if (rcScroll.top - rcScroll.bottom > rcContents.Height()) { | |
1311 CFX_FloatPoint ptNew = ptScroll; | |
1312 | |
1313 if (zDelta > 0) | |
1314 ptNew.y += 30; | |
1315 else | |
1316 ptNew.y -= 30; | |
1317 | |
1318 if (ptNew.y > rcScroll.top) | |
1319 ptNew.y = rcScroll.top; | |
1320 if (ptNew.y < rcScroll.bottom + rcContents.Height()) | |
1321 ptNew.y = rcScroll.bottom + rcContents.Height(); | |
1322 if (ptNew.y < rcScroll.bottom) | |
1323 ptNew.y = rcScroll.bottom; | |
1324 | |
1325 if (ptNew.y != ptScroll.y) { | |
1326 m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); | |
1327 m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, | |
1328 (intptr_t)&ptNew.y); | |
1329 m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, | |
1330 (intptr_t)&ptNew.y); | |
1331 | |
1332 return TRUE; | |
1333 } | |
1334 } | |
1335 | |
1336 return FALSE; | |
1337 } | |
1338 | |
1339 void CPWL_Note::OnNotify(CPWL_Wnd* pWnd, | |
1340 uint32_t msg, | |
1341 intptr_t wParam, | |
1342 intptr_t lParam) { | |
1343 switch (msg) { | |
1344 case PNM_NOTEEDITCHANGED: { | |
1345 CFX_FloatRect rcScroll = m_pContents->GetScrollArea(); | |
1346 | |
1347 PWL_SCROLL_INFO sInfo; | |
1348 sInfo.fContentMin = rcScroll.bottom; | |
1349 sInfo.fContentMax = rcScroll.top; | |
1350 sInfo.fPlateWidth = m_pContents->GetClientRect().Height(); | |
1351 sInfo.fSmallStep = 13.0f; | |
1352 sInfo.fBigStep = sInfo.fPlateWidth; | |
1353 | |
1354 if (FXSYS_memcmp(&m_OldScrollInfo, &sInfo, sizeof(PWL_SCROLL_INFO)) != | |
1355 0) { | |
1356 FX_BOOL bScrollChanged = FALSE; | |
1357 | |
1358 if (lParam < 3) { | |
1359 bScrollChanged = ResetScrollBar(); | |
1360 if (bScrollChanged) { | |
1361 lParam++; | |
1362 m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0); | |
1363 OnNotify(this, PNM_NOTEEDITCHANGED, 0, lParam); | |
1364 } | |
1365 } | |
1366 | |
1367 if (!bScrollChanged) { | |
1368 if (m_pContentsBar->IsVisible()) { | |
1369 m_pContentsBar->OnNotify(pWnd, PNM_SETSCROLLINFO, SBT_VSCROLL, | |
1370 (intptr_t)&sInfo); | |
1371 m_OldScrollInfo = sInfo; | |
1372 | |
1373 CFX_FloatPoint ptScroll = m_pContents->GetScrollPos(); | |
1374 CFX_FloatPoint ptOld = ptScroll; | |
1375 | |
1376 if (ptScroll.y > sInfo.fContentMax) | |
1377 ptScroll.y = sInfo.fContentMax; | |
1378 if (ptScroll.y < sInfo.fContentMin + sInfo.fPlateWidth) | |
1379 ptScroll.y = sInfo.fContentMin + sInfo.fPlateWidth; | |
1380 if (ptScroll.y < sInfo.fContentMin) | |
1381 ptScroll.y = sInfo.fContentMin; | |
1382 | |
1383 if (ptOld.y != ptScroll.y) { | |
1384 m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, | |
1385 (intptr_t)&ptScroll.y); | |
1386 m_pContentsBar->InvalidateRect(NULL); | |
1387 m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, | |
1388 (intptr_t)&ptScroll.y); | |
1389 } | |
1390 } | |
1391 } | |
1392 } | |
1393 } | |
1394 | |
1395 m_pContents->InvalidateRect(NULL); | |
1396 | |
1397 return; | |
1398 case PNM_SCROLLWINDOW: | |
1399 if (m_pContents) | |
1400 m_pContents->OnNotify(pWnd, msg, wParam, lParam); | |
1401 return; | |
1402 case PNM_SETSCROLLPOS: | |
1403 if (m_pContentsBar) | |
1404 m_pContentsBar->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam); | |
1405 return; | |
1406 } | |
1407 | |
1408 if (msg == PNM_SETCARETINFO && IsValid()) { | |
1409 if (PWL_CARET_INFO* pInfo = (PWL_CARET_INFO*)wParam) { | |
1410 if (m_pContents) { | |
1411 CFX_FloatRect rcClient = m_pContents->GetClientRect(); | |
1412 if (pInfo->ptHead.y > rcClient.top) { | |
1413 CFX_FloatPoint pt = m_pContents->OutToIn(pInfo->ptHead); | |
1414 m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, | |
1415 (intptr_t)&pt.y); | |
1416 | |
1417 CFX_FloatPoint ptScroll = m_pContents->GetScrollPos(); | |
1418 m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, | |
1419 (intptr_t)&ptScroll.y); | |
1420 | |
1421 return; | |
1422 } | |
1423 | |
1424 if (pInfo->ptFoot.y < rcClient.bottom) { | |
1425 CFX_FloatPoint pt = m_pContents->OutToIn(pInfo->ptFoot); | |
1426 pt.y += rcClient.Height(); | |
1427 m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL, | |
1428 (intptr_t)&pt.y); | |
1429 | |
1430 CFX_FloatPoint ptScroll = m_pContents->GetScrollPos(); | |
1431 m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL, | |
1432 (intptr_t)&ptScroll.y); | |
1433 | |
1434 return; | |
1435 } | |
1436 } | |
1437 } | |
1438 } | |
1439 | |
1440 CPWL_NoteItem::OnNotify(pWnd, msg, wParam, lParam); | |
1441 } | |
1442 | |
1443 void CPWL_Note::SetBkColor(const CPWL_Color& color) { | |
1444 CPWL_NoteItem::SetBkColor(color); | |
1445 | |
1446 CPWL_Color sBK = color; | |
1447 CPWL_Color sTextColor; | |
1448 if (CPWL_Utils::IsBlackOrWhite(sBK)) | |
1449 sTextColor = PWL_DEFAULT_WHITECOLOR; | |
1450 else | |
1451 sTextColor = PWL_DEFAULT_BLACKCOLOR; | |
1452 | |
1453 if (m_pCloseBox) | |
1454 m_pCloseBox->SetTextColor(sTextColor); | |
1455 if (m_pAuthor) | |
1456 m_pAuthor->SetTextColor(sTextColor); | |
1457 if (m_pOptions) | |
1458 m_pOptions->SetTextColor(sTextColor); | |
1459 if (m_pLBBox) | |
1460 m_pLBBox->SetTextColor(sTextColor); | |
1461 if (m_pRBBox) | |
1462 m_pRBBox->SetTextColor(sTextColor); | |
1463 } | |
1464 | |
1465 FX_BOOL CPWL_Note::OnLButtonDown(const CFX_FloatPoint& point, uint32_t nFlag) { | |
1466 if (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point))) { | |
1467 if (IPWL_NoteNotify* pNotify = GetNoteNotify()) { | |
1468 int32_t x, y; | |
1469 PWLtoWnd(point, x, y); | |
1470 if (IFX_SystemHandler* pSH = GetSystemHandler()) | |
1471 pSH->ClientToScreen(GetAttachedHWnd(), x, y); | |
1472 KillFocus(); | |
1473 pNotify->OnPopupMenu(x, y); | |
1474 | |
1475 return TRUE; | |
1476 } | |
1477 } | |
1478 | |
1479 return CPWL_Wnd::OnLButtonDown(point, nFlag); | |
1480 } | |
1481 | |
1482 FX_BOOL CPWL_Note::OnRButtonUp(const CFX_FloatPoint& point, uint32_t nFlag) { | |
1483 return CPWL_Wnd::OnRButtonUp(point, nFlag); | |
1484 } | |
1485 | |
1486 const CPWL_Note* CPWL_Note::GetNote() const { | |
1487 return this; | |
1488 } | |
1489 | |
1490 IPWL_NoteNotify* CPWL_Note::GetNoteNotify() const { | |
1491 return m_bEnableNotify ? m_pNoteNotify : nullptr; | |
1492 } | |
1493 | |
1494 void CPWL_Note::SetIconType(int32_t nType) { | |
1495 if (m_pIcon) | |
1496 m_pIcon->SetIconType(nType); | |
1497 } | |
1498 | |
1499 void CPWL_Note::EnableModify(FX_BOOL bEnabled) { | |
1500 m_pContents->EnableModify(bEnabled); | |
1501 } | |
1502 | |
1503 void CPWL_Note::EnableRead(FX_BOOL bEnabled) { | |
1504 m_pContents->EnableRead(bEnabled); | |
1505 } | |
1506 | |
1507 CFX_WideString CPWL_Note::GetReplyString() const { | |
1508 return m_sReplyString; | |
1509 } | |
1510 | |
1511 void CPWL_Note::SetReplyString(const CFX_WideString& str) { | |
1512 m_sReplyString = str; | |
1513 } | |
OLD | NEW |