diff --git a/fpdfsdk/pdfwindow/PWL_Note.cpp b/fpdfsdk/pdfwindow/PWL_Note.cpp
index e0f9132..964948e 100644
--- a/fpdfsdk/pdfwindow/PWL_Note.cpp
+++ b/fpdfsdk/pdfwindow/PWL_Note.cpp
@@ -137,17 +137,6 @@
 
 void CPWL_Note_Edit::OnKillFocus() {
   EnableSpellCheck(FALSE);
-
-  if (CPWL_Wnd* pParent = GetParentWindow()) {
-    if (CPWL_Wnd* pGrand = pParent->GetParentWindow()) {
-      ASSERT(pGrand->GetClassName() == "CPWL_NoteItem");
-
-      CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pGrand;
-
-      pNoteItem->OnContentsValidate();
-    }
-  }
-
   CPWL_Edit::OnKillFocus();
 }
 
@@ -388,29 +377,6 @@
   return L"";
 }
 
-CPWL_NoteItem* CPWL_Note_Contents::CreateSubItem() {
-  CPWL_NoteItem* pNoteItem = new CPWL_NoteItem;
-  PWL_CREATEPARAM icp = GetCreationParam();
-  icp.pParentWnd = this;
-  icp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND;
-  pNoteItem->Create(icp);
-
-  pNoteItem->OnCreateNoteItem();
-
-  pNoteItem->ResetSubjectName(m_aChildren.GetSize() - 1);
-
-  FX_SYSTEMTIME st;
-  if (IFX_SystemHandler* pSH = GetSystemHandler())
-    st = pSH->GetLocalTime();
-  pNoteItem->SetDateTime(st);
-
-  pNoteItem->SetContents(L"");
-
-  OnNotify(pNoteItem, PNM_NOTEEDITCHANGED, 0, 0);
-
-  return pNoteItem;
-}
-
 int32_t CPWL_Note_Contents::CountSubItems() const {
   return m_aChildren.GetSize() - 1;
 }
@@ -428,28 +394,6 @@
   return NULL;
 }
 
-void CPWL_Note_Contents::DeleteSubItem(IPWL_NoteItem* pNoteItem) {
-  int32_t nIndex = GetItemIndex((CPWL_NoteItem*)pNoteItem);
-
-  if (nIndex > 0) {
-    if (CPWL_NoteItem* pPWLNoteItem = (CPWL_NoteItem*)pNoteItem) {
-      pPWLNoteItem->KillFocus();
-      pPWLNoteItem->Destroy();
-      delete pPWLNoteItem;
-    }
-
-    for (int32_t i = nIndex, sz = m_aChildren.GetSize(); i < sz; i++) {
-      if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
-        ASSERT(pChild->GetClassName() == "CPWL_NoteItem");
-        CPWL_NoteItem* pItem = (CPWL_NoteItem*)pChild;
-        pItem->ResetSubjectName(i);
-      }
-    }
-
-    OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
-  }
-}
-
 IPWL_NoteItem* CPWL_Note_Contents::GetHitNoteItem(const CFX_FloatPoint& point) {
   CFX_FloatPoint pt = ParentToChild(point);
 
@@ -691,51 +635,11 @@
     m_pDateTime->SetTextColor(sTextColor);
 
   InvalidateRect(nullptr);
-
-  if (IPWL_NoteNotify* pNotify = GetNoteNotify()) {
-    pNotify->OnSetBkColor(this);
-  }
 }
 
 void CPWL_NoteItem::SetSubjectName(const CFX_WideString& sName) {
-  if (m_pSubject) {
+  if (m_pSubject)
     m_pSubject->SetText(sName.c_str());
-  }
-
-  if (IPWL_NoteNotify* pNotify = GetNoteNotify()) {
-    pNotify->OnSetSubjectName(this);
-  }
-}
-
-void CPWL_NoteItem::SetAuthorName(const CFX_WideString& sName) {
-  m_sAuthor = sName;
-  ResetSubjectName(-1);
-
-  if (IPWL_NoteNotify* pNotify = GetNoteNotify()) {
-    pNotify->OnSetAuthorName(this);
-  }
-}
-
-void CPWL_NoteItem::ResetSubjectName(int32_t nItemIndex) {
-  if (nItemIndex < 0) {
-    if (CPWL_Wnd* pParent = GetParentWindow()) {
-      ASSERT(pParent->GetClassName() == "CPWL_Note_Contents");
-
-      CPWL_Note_Contents* pContents = (CPWL_Note_Contents*)pParent;
-      nItemIndex = pContents->GetItemIndex(this);
-    }
-  }
-
-  const CPWL_Note* pNote = GetNote();
-  CFX_WideString sSubject;
-  sSubject.Format(pNote->GetReplyString().c_str(), nItemIndex);
-
-  if (!m_sAuthor.IsEmpty()) {
-    sSubject += L" - ";
-    sSubject += m_sAuthor;
-  }
-  SetSubjectName(sSubject);
-  RePosChildWnd();
 }
 
 void CPWL_NoteItem::SetDateTime(FX_SYSTEMTIME time) {
@@ -749,20 +653,12 @@
   }
 
   RePosChildWnd();
-
-  if (IPWL_NoteNotify* pNotify = GetNoteNotify()) {
-    pNotify->OnSetDateTime(this);
-  }
 }
 
 void CPWL_NoteItem::SetContents(const CFX_WideString& sContents) {
   if (m_pContents) {
     m_pContents->SetText(sContents);
   }
-
-  if (IPWL_NoteNotify* pNotify = GetNoteNotify()) {
-    pNotify->OnSetContents(this);
-  }
 }
 
 CPWL_NoteItem* CPWL_NoteItem::GetParentNoteItem() const {
@@ -816,17 +712,6 @@
   return L"";
 }
 
-CPWL_NoteItem* CPWL_NoteItem::CreateNoteItem() {
-  if (m_pContents)
-    return m_pContents->CreateSubItem();
-
-  return NULL;
-}
-
-IPWL_NoteItem* CPWL_NoteItem::CreateSubItem() {
-  return CreateNoteItem();
-}
-
 int32_t CPWL_NoteItem::CountSubItems() const {
   if (m_pContents)
     return m_pContents->CountSubItems();
@@ -841,17 +726,6 @@
   return NULL;
 }
 
-void CPWL_NoteItem::DeleteSubItem(IPWL_NoteItem* pNoteItem) {
-  KillFocus();
-
-  if (IPWL_NoteNotify* pNotify = GetNoteNotify()) {
-    pNotify->OnItemDelete(pNoteItem);
-  }
-
-  if (m_pContents)
-    m_pContents->DeleteSubItem(pNoteItem);
-}
-
 IPWL_NoteItem* CPWL_NoteItem::GetHitNoteItem(const CFX_FloatPoint& point) {
   CFX_FloatPoint pt = ParentToChild(point);
 
@@ -969,44 +843,6 @@
 }
 
 void CPWL_NoteItem::PopupNoteItemMenu(const CFX_FloatPoint& point) {
-  if (IPWL_NoteNotify* pNotify = GetNoteNotify()) {
-    int32_t x, y;
-    PWLtoWnd(point, x, y);
-    if (IFX_SystemHandler* pSH = GetSystemHandler())
-      pSH->ClientToScreen(GetAttachedHWnd(), x, y);
-    pNotify->OnPopupMenu(this, x, y);
-  }
-}
-
-const CPWL_Note* CPWL_NoteItem::GetNote() const {
-  if (const CPWL_Wnd* pRoot = GetRootWnd()) {
-    ASSERT(pRoot->GetClassName() == "CPWL_NoteItem");
-    CPWL_NoteItem* pNoteItem = (CPWL_NoteItem*)pRoot;
-    if (pNoteItem->IsTopItem()) {
-      return (CPWL_Note*)pNoteItem;
-    }
-  }
-
-  return NULL;
-}
-
-IPWL_NoteNotify* CPWL_NoteItem::GetNoteNotify() const {
-  if (const CPWL_Note* pNote = GetNote())
-    return pNote->GetNoteNotify();
-
-  return NULL;
-}
-
-void CPWL_NoteItem::OnCreateNoteItem() {
-  if (IPWL_NoteNotify* pNotify = GetNoteNotify()) {
-    pNotify->OnItemCreate(this);
-  }
-}
-
-void CPWL_NoteItem::OnContentsValidate() {
-  if (IPWL_NoteNotify* pNotify = GetNoteNotify()) {
-    pNotify->OnSetContents(this);
-  }
 }
 
 void CPWL_NoteItem::SetNoteFocus(FX_BOOL bLast) {
@@ -1021,493 +857,3 @@
 void CPWL_NoteItem::EnableRead(FX_BOOL bEnabled) {
   m_pContents->EnableRead(bEnabled);
 }
-
-CPWL_Note::CPWL_Note(IPopup_Note* pPopupNote,
-                     IPWL_NoteNotify* pNoteNotify,
-                     IPWL_NoteHandler* pNoteHandler)
-    : m_pAuthor(NULL),
-      m_pIcon(NULL),
-      m_pCloseBox(NULL),
-      m_pLBBox(NULL),
-      m_pRBBox(NULL),
-      m_pContentsBar(NULL),
-      m_pOptions(NULL),
-      m_pNoteNotify(pNoteNotify),
-      m_bResizing(FALSE),
-      m_bEnableNotify(TRUE) {}
-
-CPWL_Note::~CPWL_Note() {}
-
-IPWL_NoteItem* CPWL_Note::Reply() {
-  return CreateNoteItem();
-}
-
-void CPWL_Note::EnableNotify(FX_BOOL bEnabled) {
-  m_bEnableNotify = bEnabled;
-}
-
-void CPWL_Note::RePosChildWnd() {
-  RePosNoteChildren();
-  m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
-  ResetScrollBar();
-  m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
-  OnNotify(this, PNM_NOTEEDITCHANGED, 0, 0);
-  if (const CPWL_Wnd* pWnd = GetFocused()) {
-    if (pWnd->GetClassName() == "CPWL_Edit") {
-      CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
-      pEdit->SetCaret(pEdit->GetCaret());
-    }
-  }
-}
-
-FX_BOOL CPWL_Note::ResetScrollBar() {
-  FX_BOOL bScrollChanged = FALSE;
-
-  if (ScrollBarShouldVisible()) {
-    if (!m_pContentsBar->IsVisible()) {
-      m_pContentsBar->SetVisible(TRUE);
-      if (m_pContentsBar->IsVisible()) {
-        m_pContentsBar->InvalidateRect(NULL);
-        bScrollChanged = TRUE;
-      }
-    }
-  } else {
-    if (m_pContentsBar->IsVisible()) {
-      m_pContentsBar->SetVisible(FALSE);
-      m_pContentsBar->InvalidateRect(NULL);
-
-      bScrollChanged = TRUE;
-    }
-  }
-
-  if (bScrollChanged) {
-    CFX_FloatRect rcNote = GetClientRect();
-    CFX_FloatRect rcContents = m_pContents->GetWindowRect();
-    rcContents.right = rcNote.right - 3.0f;
-    if (m_pContentsBar->IsVisible())
-      rcContents.right -= PWL_SCROLLBAR_WIDTH;
-    m_pContents->Move(rcContents, TRUE, TRUE);
-    m_pContents->SetScrollPos(CFX_FloatPoint(0.0f, 0.0f));
-    m_pContents->InvalidateRect(NULL);
-  }
-
-  return bScrollChanged;
-}
-
-FX_BOOL CPWL_Note::ScrollBarShouldVisible() {
-  CFX_FloatRect rcContentsFact = m_pContents->GetScrollArea();
-  CFX_FloatRect rcContentsClient = m_pContents->GetClientRect();
-
-  return rcContentsFact.Height() > rcContentsClient.Height();
-}
-
-void CPWL_Note::SetOptionsText(const CFX_WideString& sText) {
-  if (m_pOptions)
-    m_pOptions->SetText(sText);
-
-  RePosNoteChildren();
-}
-
-void CPWL_Note::RePosNoteChildren() {
-  if (m_bResizing)
-    return;
-
-  m_bResizing = TRUE;
-
-  if (IsValid()) {
-    CFX_FloatRect rcClient = GetClientRect();
-
-    CFX_FloatRect rcIcon = rcClient;
-    rcIcon.top -= 2.0f;
-    rcIcon.right = rcIcon.left + 14.0f;
-    rcIcon.bottom = rcIcon.top - 14.0f;
-    rcIcon.Normalize();
-    m_pIcon->Move(rcIcon, TRUE, FALSE);
-    m_pIcon->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcIcon));
-
-    CFX_FloatRect rcCloseBox = rcClient;
-    rcCloseBox.right -= 1.0f;
-    rcCloseBox.top -= 1.0f;
-    rcCloseBox.left = rcCloseBox.right - 14.0f;
-    rcCloseBox.bottom = rcCloseBox.top - 14.0f;
-    rcCloseBox.Normalize();
-    m_pCloseBox->Move(rcCloseBox, TRUE, FALSE);
-    m_pCloseBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcCloseBox));
-
-    CFX_FloatRect rcDate = rcClient;
-    rcDate.right = rcCloseBox.left - POPUP_ITEM_TEXT_INDENT;
-    rcDate.left =
-        PWL_MAX(rcDate.right - m_pDateTime->GetContentRect().Width() - 1.0f,
-                rcIcon.right + 1.0f);
-    rcDate.top = rcClient.top - 2.0f;
-    rcDate.bottom = rcDate.top - m_pDateTime->GetContentRect().Height();
-    rcDate.Normalize();
-    m_pDateTime->Move(rcDate, TRUE, FALSE);
-    m_pDateTime->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcDate));
-
-    CFX_FloatRect rcSubject = rcClient;
-    rcSubject.top = rcClient.top - 2.0f;
-    rcSubject.left = rcIcon.right + POPUP_ITEM_TEXT_INDENT;
-    rcSubject.right =
-        PWL_MIN(rcSubject.left + m_pSubject->GetContentRect().Width() + 1.0f,
-                rcDate.left - 1.0f);
-    rcSubject.bottom = rcSubject.top - m_pSubject->GetContentRect().Height();
-    rcSubject.Normalize();
-    m_pSubject->Move(rcSubject, TRUE, FALSE);
-    m_pSubject->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcSubject));
-
-    CFX_FloatRect rcOptions = rcClient;
-    rcOptions.left =
-        PWL_MAX(rcOptions.right - m_pOptions->GetContentRect().Width(),
-                rcIcon.right + 1.0f);
-    rcOptions.top = rcSubject.bottom - 4.0f;
-    rcOptions.bottom = rcOptions.top - m_pOptions->GetContentRect().Height();
-    rcOptions.Normalize();
-    m_pOptions->Move(rcOptions, TRUE, FALSE);
-    m_pOptions->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcOptions));
-
-    CFX_FloatRect rcAuthor = rcClient;
-    rcAuthor.top = rcSubject.bottom - 4.0f;
-    rcAuthor.left = rcSubject.left;
-    rcAuthor.right =
-        PWL_MIN(rcSubject.left + m_pAuthor->GetContentRect().Width() + 1.0f,
-                rcOptions.left - 1.0f);
-    rcAuthor.bottom = rcAuthor.top - m_pAuthor->GetContentRect().Height();
-    rcAuthor.Normalize();
-    m_pAuthor->Move(rcAuthor, TRUE, FALSE);
-    m_pAuthor->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcAuthor));
-
-    CFX_FloatRect rcLBBox = rcClient;
-    rcLBBox.top = rcLBBox.bottom + 7.0f;
-    rcLBBox.right = rcLBBox.left + 7.0f;
-    rcLBBox.Normalize();
-    m_pLBBox->Move(rcLBBox, TRUE, FALSE);
-    m_pLBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcLBBox));
-
-    CFX_FloatRect rcRBBox = rcClient;
-    rcRBBox.top = rcRBBox.bottom + 7.0f;
-    rcRBBox.left = rcRBBox.right - 7.0f;
-    rcRBBox.Normalize();
-    m_pRBBox->Move(rcRBBox, TRUE, FALSE);
-    m_pRBBox->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcRBBox));
-
-    CFX_FloatRect rcContents = rcClient;
-    rcContents.top = rcAuthor.bottom - POPUP_ITEM_HEAD_BOTTOM;
-    rcContents.left += 3.0f;
-    rcContents.right -= 3.0f;
-    if (m_pContentsBar->IsVisible())
-      rcContents.right -= PWL_SCROLLBAR_WIDTH;
-    rcContents.bottom += 14.0f;
-    rcContents.Normalize();
-    m_pContents->Move(rcContents, FALSE, FALSE);
-    m_pContents->SetVisible(CPWL_Utils::ContainsRect(rcClient, rcContents));
-
-    CFX_FloatRect rcContentsBar = rcContents;
-    rcContentsBar.right = rcClient.right - 3.0f;
-    rcContentsBar.left = rcContentsBar.right - PWL_SCROLLBAR_WIDTH;
-    rcContentsBar.Normalize();
-    m_pContentsBar->Move(rcContentsBar, TRUE, FALSE);
-  }
-
-  m_bResizing = FALSE;
-}
-
-void CPWL_Note::CreateChildWnd(const PWL_CREATEPARAM& cp) {
-  CPWL_NoteItem::CreateChildWnd(cp);
-
-  CPWL_Color sTextColor;
-
-  if (CPWL_Utils::IsBlackOrWhite(GetBackgroundColor()))
-    sTextColor = PWL_DEFAULT_WHITECOLOR;
-  else
-    sTextColor = PWL_DEFAULT_BLACKCOLOR;
-
-  m_pAuthor = new CPWL_Label;
-  PWL_CREATEPARAM acp = cp;
-  acp.pParentWnd = this;
-  acp.dwFlags = PWS_VISIBLE | PWS_CHILD | PES_LEFT | PES_TOP;
-  acp.sTextColor = sTextColor;
-  m_pAuthor->Create(acp);
-
-  m_pCloseBox = new CPWL_Note_CloseBox;
-  PWL_CREATEPARAM ccp = cp;
-  ccp.pParentWnd = this;
-  ccp.dwBorderWidth = 2;
-  ccp.nBorderStyle = PBS_BEVELED;
-  ccp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER;
-  ccp.sTextColor = sTextColor;
-  m_pCloseBox->Create(ccp);
-
-  m_pIcon = new CPWL_Note_Icon;
-  PWL_CREATEPARAM icp = cp;
-  icp.pParentWnd = this;
-  icp.dwFlags = PWS_VISIBLE | PWS_CHILD;
-  m_pIcon->Create(icp);
-
-  m_pOptions = new CPWL_Note_Options;
-  PWL_CREATEPARAM ocp = cp;
-  ocp.pParentWnd = this;
-  ocp.dwFlags = PWS_CHILD | PWS_VISIBLE;
-  ocp.sTextColor = sTextColor;
-  m_pOptions->Create(ocp);
-
-  m_pLBBox = new CPWL_Note_LBBox;
-  PWL_CREATEPARAM lcp = cp;
-  lcp.pParentWnd = this;
-  lcp.dwFlags = PWS_VISIBLE | PWS_CHILD;
-  lcp.eCursorType = FXCT_NESW;
-  lcp.sTextColor = sTextColor;
-  m_pLBBox->Create(lcp);
-
-  m_pRBBox = new CPWL_Note_RBBox;
-  PWL_CREATEPARAM rcp = cp;
-  rcp.pParentWnd = this;
-  rcp.dwFlags = PWS_VISIBLE | PWS_CHILD;
-  rcp.eCursorType = FXCT_NWSE;
-  rcp.sTextColor = sTextColor;
-  m_pRBBox->Create(rcp);
-
-  m_pContentsBar = new CPWL_ScrollBar(SBT_VSCROLL);
-  PWL_CREATEPARAM scp = cp;
-  scp.pParentWnd = this;
-  scp.sBackgroundColor =
-      CPWL_Color(COLORTYPE_RGB, 240 / 255.0f, 240 / 255.0f, 240 / 255.0f);
-  scp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_BACKGROUND;
-  m_pContentsBar->Create(scp);
-  m_pContentsBar->SetNotifyForever(TRUE);
-}
-
-void CPWL_Note::SetSubjectName(const CFX_WideString& sName) {
-  CPWL_NoteItem::SetSubjectName(sName);
-  RePosChildWnd();
-}
-
-void CPWL_Note::SetAuthorName(const CFX_WideString& sName) {
-  if (m_pAuthor) {
-    m_pAuthor->SetText(sName.c_str());
-    RePosChildWnd();
-  }
-
-  if (IPWL_NoteNotify* pNotify = GetNoteNotify()) {
-    pNotify->OnSetAuthorName(this);
-  }
-}
-
-CFX_WideString CPWL_Note::GetAuthorName() const {
-  if (m_pAuthor)
-    return m_pAuthor->GetText();
-
-  return L"";
-}
-
-FX_BOOL CPWL_Note::OnMouseWheel(short zDelta,
-                                const CFX_FloatPoint& point,
-                                uint32_t nFlag) {
-  CFX_FloatPoint ptScroll = m_pContents->GetScrollPos();
-  CFX_FloatRect rcScroll = m_pContents->GetScrollArea();
-  CFX_FloatRect rcContents = m_pContents->GetClientRect();
-
-  if (rcScroll.top - rcScroll.bottom > rcContents.Height()) {
-    CFX_FloatPoint ptNew = ptScroll;
-
-    if (zDelta > 0)
-      ptNew.y += 30;
-    else
-      ptNew.y -= 30;
-
-    if (ptNew.y > rcScroll.top)
-      ptNew.y = rcScroll.top;
-    if (ptNew.y < rcScroll.bottom + rcContents.Height())
-      ptNew.y = rcScroll.bottom + rcContents.Height();
-    if (ptNew.y < rcScroll.bottom)
-      ptNew.y = rcScroll.bottom;
-
-    if (ptNew.y != ptScroll.y) {
-      m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
-      m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL,
-                            (intptr_t)&ptNew.y);
-      m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL,
-                               (intptr_t)&ptNew.y);
-
-      return TRUE;
-    }
-  }
-
-  return FALSE;
-}
-
-void CPWL_Note::OnNotify(CPWL_Wnd* pWnd,
-                         uint32_t msg,
-                         intptr_t wParam,
-                         intptr_t lParam) {
-  switch (msg) {
-    case PNM_NOTEEDITCHANGED: {
-      CFX_FloatRect rcScroll = m_pContents->GetScrollArea();
-
-      PWL_SCROLL_INFO sInfo;
-      sInfo.fContentMin = rcScroll.bottom;
-      sInfo.fContentMax = rcScroll.top;
-      sInfo.fPlateWidth = m_pContents->GetClientRect().Height();
-      sInfo.fSmallStep = 13.0f;
-      sInfo.fBigStep = sInfo.fPlateWidth;
-
-      if (FXSYS_memcmp(&m_OldScrollInfo, &sInfo, sizeof(PWL_SCROLL_INFO)) !=
-          0) {
-        FX_BOOL bScrollChanged = FALSE;
-
-        if (lParam < 3) {
-          bScrollChanged = ResetScrollBar();
-          if (bScrollChanged) {
-            lParam++;
-            m_pContents->OnNotify(this, PNM_NOTERESET, 0, 0);
-            OnNotify(this, PNM_NOTEEDITCHANGED, 0, lParam);
-          }
-        }
-
-        if (!bScrollChanged) {
-          if (m_pContentsBar->IsVisible()) {
-            m_pContentsBar->OnNotify(pWnd, PNM_SETSCROLLINFO, SBT_VSCROLL,
-                                     (intptr_t)&sInfo);
-            m_OldScrollInfo = sInfo;
-
-            CFX_FloatPoint ptScroll = m_pContents->GetScrollPos();
-            CFX_FloatPoint ptOld = ptScroll;
-
-            if (ptScroll.y > sInfo.fContentMax)
-              ptScroll.y = sInfo.fContentMax;
-            if (ptScroll.y < sInfo.fContentMin + sInfo.fPlateWidth)
-              ptScroll.y = sInfo.fContentMin + sInfo.fPlateWidth;
-            if (ptScroll.y < sInfo.fContentMin)
-              ptScroll.y = sInfo.fContentMin;
-
-            if (ptOld.y != ptScroll.y) {
-              m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL,
-                                       (intptr_t)&ptScroll.y);
-              m_pContentsBar->InvalidateRect(NULL);
-              m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL,
-                                    (intptr_t)&ptScroll.y);
-            }
-          }
-        }
-      }
-    }
-
-      m_pContents->InvalidateRect(NULL);
-
-      return;
-    case PNM_SCROLLWINDOW:
-      if (m_pContents)
-        m_pContents->OnNotify(pWnd, msg, wParam, lParam);
-      return;
-    case PNM_SETSCROLLPOS:
-      if (m_pContentsBar)
-        m_pContentsBar->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam);
-      return;
-  }
-
-  if (msg == PNM_SETCARETINFO && IsValid()) {
-    if (PWL_CARET_INFO* pInfo = (PWL_CARET_INFO*)wParam) {
-      if (m_pContents) {
-        CFX_FloatRect rcClient = m_pContents->GetClientRect();
-        if (pInfo->ptHead.y > rcClient.top) {
-          CFX_FloatPoint pt = m_pContents->OutToIn(pInfo->ptHead);
-          m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL,
-                                (intptr_t)&pt.y);
-
-          CFX_FloatPoint ptScroll = m_pContents->GetScrollPos();
-          m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL,
-                                   (intptr_t)&ptScroll.y);
-
-          return;
-        }
-
-        if (pInfo->ptFoot.y < rcClient.bottom) {
-          CFX_FloatPoint pt = m_pContents->OutToIn(pInfo->ptFoot);
-          pt.y += rcClient.Height();
-          m_pContents->OnNotify(this, PNM_SCROLLWINDOW, SBT_VSCROLL,
-                                (intptr_t)&pt.y);
-
-          CFX_FloatPoint ptScroll = m_pContents->GetScrollPos();
-          m_pContentsBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL,
-                                   (intptr_t)&ptScroll.y);
-
-          return;
-        }
-      }
-    }
-  }
-
-  CPWL_NoteItem::OnNotify(pWnd, msg, wParam, lParam);
-}
-
-void CPWL_Note::SetBkColor(const CPWL_Color& color) {
-  CPWL_NoteItem::SetBkColor(color);
-
-  CPWL_Color sBK = color;
-  CPWL_Color sTextColor;
-  if (CPWL_Utils::IsBlackOrWhite(sBK))
-    sTextColor = PWL_DEFAULT_WHITECOLOR;
-  else
-    sTextColor = PWL_DEFAULT_BLACKCOLOR;
-
-  if (m_pCloseBox)
-    m_pCloseBox->SetTextColor(sTextColor);
-  if (m_pAuthor)
-    m_pAuthor->SetTextColor(sTextColor);
-  if (m_pOptions)
-    m_pOptions->SetTextColor(sTextColor);
-  if (m_pLBBox)
-    m_pLBBox->SetTextColor(sTextColor);
-  if (m_pRBBox)
-    m_pRBBox->SetTextColor(sTextColor);
-}
-
-FX_BOOL CPWL_Note::OnLButtonDown(const CFX_FloatPoint& point, uint32_t nFlag) {
-  if (m_pOptions->WndHitTest(m_pOptions->ParentToChild(point))) {
-    if (IPWL_NoteNotify* pNotify = GetNoteNotify()) {
-      int32_t x, y;
-      PWLtoWnd(point, x, y);
-      if (IFX_SystemHandler* pSH = GetSystemHandler())
-        pSH->ClientToScreen(GetAttachedHWnd(), x, y);
-      KillFocus();
-      pNotify->OnPopupMenu(x, y);
-
-      return TRUE;
-    }
-  }
-
-  return CPWL_Wnd::OnLButtonDown(point, nFlag);
-}
-
-FX_BOOL CPWL_Note::OnRButtonUp(const CFX_FloatPoint& point, uint32_t nFlag) {
-  return CPWL_Wnd::OnRButtonUp(point, nFlag);
-}
-
-const CPWL_Note* CPWL_Note::GetNote() const {
-  return this;
-}
-
-IPWL_NoteNotify* CPWL_Note::GetNoteNotify() const {
-  return m_bEnableNotify ? m_pNoteNotify : nullptr;
-}
-
-void CPWL_Note::SetIconType(int32_t nType) {
-  if (m_pIcon)
-    m_pIcon->SetIconType(nType);
-}
-
-void CPWL_Note::EnableModify(FX_BOOL bEnabled) {
-  m_pContents->EnableModify(bEnabled);
-}
-
-void CPWL_Note::EnableRead(FX_BOOL bEnabled) {
-  m_pContents->EnableRead(bEnabled);
-}
-
-CFX_WideString CPWL_Note::GetReplyString() const {
-  return m_sReplyString;
-}
-
-void CPWL_Note::SetReplyString(const CFX_WideString& str) {
-  m_sReplyString = str;
-}
diff --git a/fpdfsdk/pdfwindow/PWL_Note.h b/fpdfsdk/pdfwindow/PWL_Note.h
index 1068999..e741f0f 100644
--- a/fpdfsdk/pdfwindow/PWL_Note.h
+++ b/fpdfsdk/pdfwindow/PWL_Note.h
@@ -25,27 +25,8 @@
 class CPWL_Note_RBBox;
 class IPWL_NoteHandler;
 class IPWL_NoteItem;
-class IPWL_NoteNotify;
 class IPopup_Note;
 
-class IPWL_NoteNotify {
- public:
-  virtual ~IPWL_NoteNotify() {}
-  virtual void OnNoteMove(const FX_RECT& rtWin) = 0;
-  virtual void OnNoteShow(FX_BOOL bShow) = 0;
-  virtual void OnNoteActivate(FX_BOOL bActive) = 0;
-  virtual void OnNoteClose() = 0;
-  virtual void OnItemCreate(IPWL_NoteItem* pItem) = 0;
-  virtual void OnItemDelete(IPWL_NoteItem* pItem) = 0;
-  virtual void OnSetAuthorName(IPWL_NoteItem* pItem) = 0;
-  virtual void OnSetBkColor(IPWL_NoteItem* pItem) = 0;
-  virtual void OnSetContents(IPWL_NoteItem* pItem) = 0;
-  virtual void OnSetDateTime(IPWL_NoteItem* pItem) = 0;
-  virtual void OnSetSubjectName(IPWL_NoteItem* pItem) = 0;
-  virtual void OnPopupMenu(int32_t x, int32_t y) = 0;
-  virtual void OnPopupMenu(IPWL_NoteItem* pItem, int32_t x, int32_t y) = 0;
-};
-
 class IPWL_NoteHandler {
  public:
   virtual ~IPWL_NoteHandler() {}
@@ -58,14 +39,11 @@
   virtual void SetPrivateData(void* pData) = 0;
   virtual void SetBkColor(const CPWL_Color& color) = 0;
   virtual void SetSubjectName(const CFX_WideString& sName) = 0;
-  virtual void SetAuthorName(const CFX_WideString& sName) = 0;
   virtual void SetDateTime(FX_SYSTEMTIME time) = 0;
   virtual void SetContents(const CFX_WideString& sContents) = 0;
 
-  virtual IPWL_NoteItem* CreateSubItem() = 0;
   virtual int32_t CountSubItems() const = 0;
   virtual IPWL_NoteItem* GetSubItems(int32_t index) const = 0;
-  virtual void DeleteSubItem(IPWL_NoteItem* pNoteItem) = 0;
   virtual void SetFocus() = 0;
 
   virtual IPWL_NoteItem* GetParentItem() const = 0;
@@ -191,8 +169,6 @@
   void SetText(const CFX_WideString& sText);
   CFX_WideString GetText() const;
 
-  CPWL_NoteItem* CreateSubItem();
-  void DeleteSubItem(IPWL_NoteItem* pNoteItem);
   int32_t CountSubItems() const;
   IPWL_NoteItem* GetSubItems(int32_t index) const;
 
@@ -223,24 +199,17 @@
 
   virtual FX_BOOL IsTopItem() const { return FALSE; }
 
-  virtual void ResetSubjectName(int32_t nItemIndex);
   void EnableRead(FX_BOOL bEnabled);
   void EnableModify(FX_BOOL bEnabled);
 
-  void OnContentsValidate();
-  void OnCreateNoteItem();
-
   // IPWL_NoteItem
   void SetPrivateData(void* pData) override;
   void SetBkColor(const CPWL_Color& color) override;
   void SetSubjectName(const CFX_WideString& sName) override;
-  void SetAuthorName(const CFX_WideString& sName) override;
   void SetDateTime(FX_SYSTEMTIME time) override;
   void SetContents(const CFX_WideString& sContents) override;
-  IPWL_NoteItem* CreateSubItem() override;
   int32_t CountSubItems() const override;
   IPWL_NoteItem* GetSubItems(int32_t index) const override;
-  void DeleteSubItem(IPWL_NoteItem* pNoteItem) override;
   void SetFocus() override { SetNoteFocus(FALSE); }
   IPWL_NoteItem* GetParentItem() const override;
   void* GetPrivateData() const override;
@@ -266,15 +235,11 @@
   FX_FLOAT GetItemLeftMargin() override;
   FX_FLOAT GetItemRightMargin() override;
 
-  CPWL_NoteItem* CreateNoteItem();
   CPWL_NoteItem* GetParentNoteItem() const;
 
   void SetNoteFocus(FX_BOOL bLast);
   void PopupNoteItemMenu(const CFX_FloatPoint& point);
 
-  virtual const CPWL_Note* GetNote() const;
-  virtual IPWL_NoteNotify* GetNoteNotify() const;
-
  protected:
   CPWL_Label* m_pSubject;
   CPWL_Label* m_pDateTime;
@@ -290,62 +255,4 @@
   FX_BOOL m_bAllowModify;
 };
 
-class CPWL_Note : public CPWL_NoteItem {
- public:
-  CPWL_Note(IPopup_Note* pPopupNote,
-            IPWL_NoteNotify* pNoteNotify,
-            IPWL_NoteHandler* pNoteHandler);
-  ~CPWL_Note() override;
-
-  IPWL_NoteItem* Reply();
-  void EnableNotify(FX_BOOL bEnabled);
-  void SetIconType(int32_t nType);
-  void SetOptionsText(const CFX_WideString& sText);
-  void EnableRead(FX_BOOL bEnabled);
-  void EnableModify(FX_BOOL bEnabled);
-
-  CFX_WideString GetReplyString() const;
-  void SetReplyString(const CFX_WideString& str);
-
-  // CPWL_NoteItem
-  void SetSubjectName(const CFX_WideString& sName) override;
-  void SetAuthorName(const CFX_WideString& sName) override;
-  CFX_WideString GetAuthorName() const override;
-  void SetBkColor(const CPWL_Color& color) override;
-  void ResetSubjectName(int32_t nItemIndex) override {}
-  FX_BOOL IsTopItem() const override { return TRUE; }
-  const CPWL_Note* GetNote() const override;
-  IPWL_NoteNotify* GetNoteNotify() const override;
-  FX_BOOL OnLButtonDown(const CFX_FloatPoint& point, uint32_t nFlag) override;
-  FX_BOOL OnRButtonUp(const CFX_FloatPoint& point, uint32_t nFlag) override;
-  FX_BOOL OnMouseWheel(short zDelta,
-                       const CFX_FloatPoint& point,
-                       uint32_t nFlag) override;
-  void RePosChildWnd() override;
-  void CreateChildWnd(const PWL_CREATEPARAM& cp) override;
-  void OnNotify(CPWL_Wnd* pWnd,
-                uint32_t msg,
-                intptr_t wParam = 0,
-                intptr_t lParam = 0) override;
-
- protected:
-  FX_BOOL ResetScrollBar();
-  void RePosNoteChildren();
-  FX_BOOL ScrollBarShouldVisible();
-
- private:
-  CPWL_Label* m_pAuthor;
-  CPWL_Note_Icon* m_pIcon;
-  CPWL_Note_CloseBox* m_pCloseBox;
-  CPWL_Note_LBBox* m_pLBBox;
-  CPWL_Note_RBBox* m_pRBBox;
-  CPWL_ScrollBar* m_pContentsBar;
-  CPWL_Note_Options* m_pOptions;
-  IPWL_NoteNotify* m_pNoteNotify;
-  FX_BOOL m_bResizing;
-  PWL_SCROLL_INFO m_OldScrollInfo;
-  FX_BOOL m_bEnableNotify;
-  CFX_WideString m_sReplyString;
-};
-
 #endif  // FPDFSDK_PDFWINDOW_PWL_NOTE_H_
