CPDFDoc_Environment::GetAnnotHandlerMgr() never returns nullptr.
[pdfium.git] / fpdfsdk / src / fsdk_mgr.cpp
index 4cf05a2..60fd0ef 100644 (file)
@@ -4,6 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
+#include <algorithm>
+
 #include "../../public/fpdf_ext.h"
 #include "../../third_party/base/nonstd_unique_ptr.h"
 #include "../include/formfiller/FFL_FormFiller.h"
@@ -19,7 +21,8 @@
 
 class CFX_SystemHandler : public IFX_SystemHandler {
  public:
-  CFX_SystemHandler(CPDFDoc_Environment* pEnv) : m_pEnv(pEnv), m_nCharSet(-1) {}
+  explicit CFX_SystemHandler(CPDFDoc_Environment* pEnv)
+      : m_pEnv(pEnv), m_nCharSet(-1) {}
   ~CFX_SystemHandler() override {}
 
  public:
@@ -145,20 +148,22 @@ FX_BOOL CFX_SystemHandler::FindNativeTrueTypeFont(
     int32_t nCharset,
     CFX_ByteString sFontFaceName) {
   CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
-  if (pFontMgr) {
-    CFX_FontMapper* pFontMapper = pFontMgr->m_pBuiltinMapper;
-    if (pFontMapper) {
-      int nSize = pFontMapper->m_InstalledTTFonts.GetSize();
-      if (nSize == 0) {
-        pFontMapper->LoadInstalledFonts();
-        nSize = pFontMapper->m_InstalledTTFonts.GetSize();
-      }
+  if (!pFontMgr)
+    return FALSE;
 
-      for (int i = 0; i < nSize; i++) {
-        if (pFontMapper->m_InstalledTTFonts[i].Compare(sFontFaceName))
-          return TRUE;
-      }
-    }
+  CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
+  if (!pFontMapper)
+    return FALSE;
+
+  int nSize = pFontMapper->m_InstalledTTFonts.GetSize();
+  if (nSize == 0) {
+    pFontMapper->LoadInstalledFonts();
+    nSize = pFontMapper->m_InstalledTTFonts.GetSize();
+  }
+
+  for (int i = 0; i < nSize; ++i) {
+    if (pFontMapper->m_InstalledTTFonts[i].Compare(sFontFaceName))
+      return TRUE;
   }
 
   return FALSE;
@@ -403,9 +408,16 @@ CPDFSDK_Document::CPDFSDK_Document(CPDF_Document* pDoc,
       m_pFocusAnnot(nullptr),
       m_pEnv(pEnv),
       m_pOccontent(nullptr),
-      m_bChangeMask(FALSE) {}
+      m_bChangeMask(FALSE),
+      m_bBeingDestroyed(FALSE) {
+}
 
 CPDFSDK_Document::~CPDFSDK_Document() {
+  m_bBeingDestroyed = TRUE;
+
+  for (auto& it : m_pageMap)
+    it.second->KillFocusAnnotIfNeeded();
+
   for (auto& it : m_pageMap)
     delete it.second;
   m_pageMap.clear();
@@ -477,7 +489,7 @@ FX_BOOL CPDFSDK_Document::ProcOpenAction() {
   if (!pOpenAction)
     return FALSE;
 
-  if (pOpenAction->GetType() == PDFOBJ_ARRAY)
+  if (pOpenAction->IsArray())
     return TRUE;
 
   if (CPDF_Dictionary* pDict = pOpenAction->AsDictionary()) {
@@ -504,6 +516,7 @@ void CPDFSDK_Document::ReMovePageView(CPDF_Page* pPDFPage) {
   if (pPageView->IsLocked())
     return;
 
+  pPageView->KillFocusAnnotIfNeeded();
   delete pPageView;
   m_pageMap.erase(it);
 }
@@ -536,6 +549,9 @@ CPDFSDK_Annot* CPDFSDK_Document::GetFocusAnnot() {
 }
 
 FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
+  if (m_bBeingDestroyed)
+    return FALSE;
+
   if (m_pFocusAnnot == pAnnot)
     return TRUE;
 
@@ -546,8 +562,7 @@ FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
   CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
   if (pAnnot && pPageView->IsValid()) {
     CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr();
-
-    if (pAnnotHandler && !m_pFocusAnnot) {
+    if (!m_pFocusAnnot) {
       if (!pAnnotHandler->Annot_OnSetFocus(pAnnot, nFlag))
         return FALSE;
       if (!m_pFocusAnnot) {
@@ -562,23 +577,22 @@ FX_BOOL CPDFSDK_Document::SetFocusAnnot(CPDFSDK_Annot* pAnnot, FX_UINT nFlag) {
 FX_BOOL CPDFSDK_Document::KillFocusAnnot(FX_UINT nFlag) {
   if (m_pFocusAnnot) {
     CPDFSDK_AnnotHandlerMgr* pAnnotHandler = m_pEnv->GetAnnotHandlerMgr();
-    if (pAnnotHandler) {
-      CPDFSDK_Annot* pFocusAnnot = m_pFocusAnnot;
-      m_pFocusAnnot = NULL;
-      if (pAnnotHandler->Annot_OnKillFocus(pFocusAnnot, nFlag)) {
-        if (pFocusAnnot->GetType() == FX_BSTRC("Widget")) {
-          CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pFocusAnnot;
-          int nFieldType = pWidget->GetFieldType();
-          if (FIELDTYPE_TEXTFIELD == nFieldType ||
-              FIELDTYPE_COMBOBOX == nFieldType)
-            m_pEnv->FFI_OnSetFieldInputFocus(NULL, NULL, 0, FALSE);
+    CPDFSDK_Annot* pFocusAnnot = m_pFocusAnnot;
+    m_pFocusAnnot = nullptr;
+    if (pAnnotHandler->Annot_OnKillFocus(pFocusAnnot, nFlag)) {
+      if (pFocusAnnot->GetType() == FX_BSTRC("Widget")) {
+        CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)pFocusAnnot;
+        int nFieldType = pWidget->GetFieldType();
+        if (FIELDTYPE_TEXTFIELD == nFieldType ||
+            FIELDTYPE_COMBOBOX == nFieldType) {
+          m_pEnv->FFI_OnSetFieldInputFocus(NULL, NULL, 0, FALSE);
         }
-
-        if (!m_pFocusAnnot)
-          return TRUE;
-      } else {
-        m_pFocusAnnot = pFocusAnnot;
       }
+
+      if (!m_pFocusAnnot)
+        return TRUE;
+    } else {
+      m_pFocusAnnot = pFocusAnnot;
     }
   }
   return FALSE;
@@ -604,47 +618,31 @@ CFX_WideString CPDFSDK_Document::GetPath() {
 }
 
 CPDFSDK_PageView::CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc, CPDF_Page* page)
-    : m_page(page), m_pSDKDoc(pSDKDoc) {
+    : m_page(page),
+      m_pSDKDoc(pSDKDoc),
+      m_CaptureWidget(nullptr),
+      m_bEnterWidget(FALSE),
+      m_bExitWidget(FALSE),
+      m_bOnWidget(FALSE),
+      m_bValid(FALSE),
+      m_bLocked(FALSE),
+      m_bTakeOverPage(FALSE) {
   CPDFSDK_InterForm* pInterForm = pSDKDoc->GetInterForm();
   if (pInterForm) {
     CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
     pPDFInterForm->FixPageFields(page);
   }
-  m_page->SetPrivateData((void*)m_page, (void*)this, NULL);
-  m_fxAnnotArray.RemoveAll();
-
-  m_bEnterWidget = FALSE;
-  m_bExitWidget = FALSE;
-  m_bOnWidget = FALSE;
-  m_CaptureWidget = NULL;
-  m_bValid = FALSE;
-  m_bLocked = FALSE;
-  m_bTakeOverPage = FALSE;
+  m_page->SetPrivateData((void*)m_page, (void*)this, nullptr);
 }
 
 CPDFSDK_PageView::~CPDFSDK_PageView() {
-  // if there is a focused annot on the page, we should kill the focus first.
-  if (CPDFSDK_Annot* focusedAnnot = m_pSDKDoc->GetFocusAnnot()) {
-    for (int i = 0, count = m_fxAnnotArray.GetSize(); i < count; i++) {
-      CPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);
-      if (pAnnot == focusedAnnot) {
-        KillFocusAnnot();
-        break;
-      }
-    }
-  }
-
   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
   CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-  ASSERT(pAnnotHandlerMgr);
-  for (int i = 0, count = m_fxAnnotArray.GetSize(); i < count; i++) {
-    CPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);
+  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray)
     pAnnotHandlerMgr->ReleaseAnnot(pAnnot);
-  }
-  m_fxAnnotArray.RemoveAll();
+  m_fxAnnotArray.clear();
 
-  delete m_pAnnotList;
-  m_pAnnotList = NULL;
+  m_pAnnotList.reset();
 
   m_page->RemovePrivateData((void*)m_page);
   if (m_bTakeOverPage) {
@@ -658,9 +656,8 @@ void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice,
   m_curMatrix = *pUser2Device;
 
   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
-  CPDFSDK_AnnotIterator annotIterator(this, TRUE);
-  int index = -1;
-  while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next(index)) {
+  CPDFSDK_AnnotIterator annotIterator(this, true);
+  while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
     CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
     pAnnotHandlerMgr->Annot_OnDraw(this, pSDKAnnot, pDevice, pUser2Device, 0);
   }
@@ -668,21 +665,21 @@ void CPDFSDK_PageView::PageView_OnDraw(CFX_RenderDevice* pDevice,
 
 CPDF_Annot* CPDFSDK_PageView::GetPDFAnnotAtPoint(FX_FLOAT pageX,
                                                  FX_FLOAT pageY) {
-  int nCount = m_pAnnotList->Count();
-  for (int i = 0; i < nCount; i++) {
+  const int nCount = m_pAnnotList->Count();
+  for (int i = 0; i < nCount; ++i) {
     CPDF_Annot* pAnnot = m_pAnnotList->GetAt(i);
     CFX_FloatRect annotRect;
     pAnnot->GetRect(annotRect);
     if (annotRect.Contains(pageX, pageY))
       return pAnnot;
   }
-  return NULL;
+  return nullptr;
 }
 
 CPDF_Annot* CPDFSDK_PageView::GetPDFWidgetAtPoint(FX_FLOAT pageX,
                                                   FX_FLOAT pageY) {
-  int nCount = m_pAnnotList->Count();
-  for (int i = 0; i < nCount; i++) {
+  const int nCount = m_pAnnotList->Count();
+  for (int i = 0; i < nCount; ++i) {
     CPDF_Annot* pAnnot = m_pAnnotList->GetAt(i);
     if (pAnnot->GetSubType() == "Widget") {
       CFX_FloatRect annotRect;
@@ -691,33 +688,29 @@ CPDF_Annot* CPDFSDK_PageView::GetPDFWidgetAtPoint(FX_FLOAT pageX,
         return pAnnot;
     }
   }
-  return NULL;
+  return nullptr;
 }
 
 CPDFSDK_Annot* CPDFSDK_PageView::GetFXAnnotAtPoint(FX_FLOAT pageX,
                                                    FX_FLOAT pageY) {
-  CPDFSDK_AnnotIterator annotIterator(this, FALSE);
   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
   CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
-  CPDFSDK_Annot* pSDKAnnot = NULL;
-  int index = -1;
-  while ((pSDKAnnot = annotIterator.Next(index))) {
+  CPDFSDK_AnnotIterator annotIterator(this, false);
+  while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
     CPDF_Rect rc = pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
     if (rc.Contains(pageX, pageY))
       return pSDKAnnot;
   }
 
-  return NULL;
+  return nullptr;
 }
 
 CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(FX_FLOAT pageX,
                                                     FX_FLOAT pageY) {
-  CPDFSDK_AnnotIterator annotIterator(this, FALSE);
   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
   CPDFSDK_AnnotHandlerMgr* pAnnotMgr = pEnv->GetAnnotHandlerMgr();
-  CPDFSDK_Annot* pSDKAnnot = NULL;
-  int index = -1;
-  while ((pSDKAnnot = annotIterator.Next(index))) {
+  CPDFSDK_AnnotIterator annotIterator(this, false);
+  while (CPDFSDK_Annot* pSDKAnnot = annotIterator.Next()) {
     if (pSDKAnnot->GetType() == "Widget") {
       pAnnotMgr->Annot_OnGetViewBBox(this, pSDKAnnot);
       CPDF_Point point(pageX, pageY);
@@ -726,7 +719,17 @@ CPDFSDK_Annot* CPDFSDK_PageView::GetFXWidgetAtPoint(FX_FLOAT pageX,
     }
   }
 
-  return NULL;
+  return nullptr;
+}
+
+void CPDFSDK_PageView::KillFocusAnnotIfNeeded() {
+  // if there is a focused annot on the page, we should kill the focus first.
+  if (CPDFSDK_Annot* focusedAnnot = m_pSDKDoc->GetFocusAnnot()) {
+    auto it =
+        std::find(m_fxAnnotArray.begin(), m_fxAnnotArray.end(), focusedAnnot);
+    if (it != m_fxAnnotArray.end())
+      KillFocusAnnot();
+  }
 }
 
 FX_BOOL CPDFSDK_PageView::Annot_HasAppearance(CPDF_Annot* pAnnot) {
@@ -740,21 +743,12 @@ CPDFSDK_Annot* CPDFSDK_PageView::AddAnnot(CPDF_Annot* pPDFAnnot) {
   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
   ASSERT(pEnv);
   CPDFSDK_AnnotHandlerMgr* pAnnotHandler = pEnv->GetAnnotHandlerMgr();
-
-  CPDFSDK_Annot* pSDKAnnot = NULL;
-
-  if (pAnnotHandler) {
-    pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
-  }
+  CPDFSDK_Annot* pSDKAnnot = pAnnotHandler->NewAnnot(pPDFAnnot, this);
   if (!pSDKAnnot)
-    return NULL;
-
-  m_fxAnnotArray.Add(pSDKAnnot);
-
-  if (pAnnotHandler) {
-    pAnnotHandler->Annot_OnCreate(pSDKAnnot);
-  }
+    return nullptr;
 
+  m_fxAnnotArray.push_back(pSDKAnnot);
+  pAnnotHandler->Annot_OnCreate(pSDKAnnot);
   return pSDKAnnot;
 }
 
@@ -778,27 +772,20 @@ CPDF_Document* CPDFSDK_PageView::GetPDFDocument() {
   return NULL;
 }
 
-int CPDFSDK_PageView::CountAnnots() {
-  return m_pAnnotList->Count();
+size_t CPDFSDK_PageView::CountAnnots() const {
+  return m_fxAnnotArray.size();
 }
 
-CPDFSDK_Annot* CPDFSDK_PageView::GetAnnot(int nIndex) {
-  int nCount = m_fxAnnotArray.GetSize();
-  if (nIndex < 0 || nIndex >= nCount) {
-    return NULL;
-  }
-
-  return (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(nIndex);
+CPDFSDK_Annot* CPDFSDK_PageView::GetAnnot(size_t nIndex) {
+  return nIndex < m_fxAnnotArray.size() ? m_fxAnnotArray[nIndex] : nullptr;
 }
 
 CPDFSDK_Annot* CPDFSDK_PageView::GetAnnotByDict(CPDF_Dictionary* pDict) {
-  int nCount = m_fxAnnotArray.GetSize();
-  for (int i = 0; i < nCount; i++) {
-    CPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);
-    if (pDict == pAnnot->GetPDFAnnot()->GetAnnotDict())
+  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
+    if (pAnnot->GetPDFAnnot()->GetAnnotDict() == pDict)
       return pAnnot;
   }
-  return NULL;
+  return nullptr;
 }
 
 FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CPDF_Point& point,
@@ -808,25 +795,21 @@ FX_BOOL CPDFSDK_PageView::OnLButtonDown(const CPDF_Point& point,
   CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
   if (!pFXAnnot) {
     KillFocusAnnot(nFlag);
-  } else {
-    CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-    ASSERT(pAnnotHandlerMgr);
-
-    FX_BOOL bRet =
-        pAnnotHandlerMgr->Annot_OnLButtonDown(this, pFXAnnot, nFlag, point);
-    if (bRet) {
-      SetFocusAnnot(pFXAnnot);
-    }
-    return bRet;
+    return FALSE;
   }
-  return FALSE;
+
+  CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
+  FX_BOOL bRet =
+      pAnnotHandlerMgr->Annot_OnLButtonDown(this, pFXAnnot, nFlag, point);
+  if (bRet)
+    SetFocusAnnot(pFXAnnot);
+  return bRet;
 }
 
 FX_BOOL CPDFSDK_PageView::OnLButtonUp(const CPDF_Point& point, FX_UINT nFlag) {
   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
   ASSERT(pEnv);
   CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-  ASSERT(pAnnotHandlerMgr);
   CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y);
   CPDFSDK_Annot* pFocusAnnot = GetFocusAnnot();
   FX_BOOL bRet = FALSE;
@@ -834,17 +817,14 @@ FX_BOOL CPDFSDK_PageView::OnLButtonUp(const CPDF_Point& point, FX_UINT nFlag) {
     // Last focus Annot gets a chance to handle the event.
     bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFocusAnnot, nFlag, point);
   }
-  if (pFXAnnot && !bRet) {
+  if (pFXAnnot && !bRet)
     bRet = pAnnotHandlerMgr->Annot_OnLButtonUp(this, pFXAnnot, nFlag, point);
-    return bRet;
-  }
   return bRet;
 }
 
 FX_BOOL CPDFSDK_PageView::OnMouseMove(const CPDF_Point& point, int nFlag) {
   CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
   CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-  ASSERT(pAnnotHandlerMgr);
   if (CPDFSDK_Annot* pFXAnnot = GetFXWidgetAtPoint(point.x, point.y)) {
     if (m_CaptureWidget && m_CaptureWidget != pFXAnnot) {
       m_bExitWidget = TRUE;
@@ -880,7 +860,6 @@ FX_BOOL CPDFSDK_PageView::OnMouseWheel(double deltaX,
   if (CPDFSDK_Annot* pAnnot = GetFXWidgetAtPoint(point.x, point.y)) {
     CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
     CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-    ASSERT(pAnnotHandlerMgr);
     return pAnnotHandlerMgr->Annot_OnMouseWheel(this, pAnnot, nFlag,
                                                 (int)deltaY, point);
   }
@@ -891,7 +870,6 @@ FX_BOOL CPDFSDK_PageView::OnChar(int nChar, FX_UINT nFlag) {
   if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) {
     CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
     CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-    ASSERT(pAnnotHandlerMgr);
     return pAnnotHandlerMgr->Annot_OnChar(pAnnot, nChar, nFlag);
   }
 
@@ -902,7 +880,6 @@ FX_BOOL CPDFSDK_PageView::OnKeyDown(int nKeyCode, int nFlag) {
   if (CPDFSDK_Annot* pAnnot = GetFocusAnnot()) {
     CPDFDoc_Environment* pEnv = m_pSDKDoc->GetEnv();
     CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-    ASSERT(pAnnotHandlerMgr);
     return pAnnotHandlerMgr->Annot_OnKeyDown(pAnnot, nKeyCode, nFlag);
   }
   return FALSE;
@@ -918,27 +895,23 @@ void CPDFSDK_PageView::LoadFXAnnots() {
   FX_BOOL enableAPUpdate = CPDF_InterForm::UpdatingAPEnabled();
   // Disable the default AP construction.
   CPDF_InterForm::EnableUpdateAP(FALSE);
-  m_pAnnotList = new CPDF_AnnotList(m_page);
+  m_pAnnotList.reset(new CPDF_AnnotList(m_page));
   CPDF_InterForm::EnableUpdateAP(enableAPUpdate);
-  int nCount = m_pAnnotList->Count();
+  const int nCount = m_pAnnotList->Count();
   SetLock(TRUE);
-  for (int i = 0; i < nCount; i++) {
+  for (int i = 0; i < nCount; ++i) {
     CPDF_Annot* pPDFAnnot = m_pAnnotList->GetAt(i);
     CPDF_Document* pDoc = GetPDFDocument();
 
     CheckUnSupportAnnot(pDoc, pPDFAnnot);
 
     CPDFSDK_AnnotHandlerMgr* pAnnotHandlerMgr = pEnv->GetAnnotHandlerMgr();
-    ASSERT(pAnnotHandlerMgr != NULL);
-
-    if (pAnnotHandlerMgr) {
-      CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this);
-      if (!pAnnot)
-        continue;
-      m_fxAnnotArray.Add(pAnnot);
+    CPDFSDK_Annot* pAnnot = pAnnotHandlerMgr->NewAnnot(pPDFAnnot, this);
+    if (!pAnnot)
+      continue;
+    m_fxAnnotArray.push_back(pAnnot);
 
-      pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
-    }
+    pAnnotHandlerMgr->Annot_OnLoad(pAnnot);
   }
   SetLock(FALSE);
 }
@@ -969,11 +942,12 @@ int CPDFSDK_PageView::GetPageIndex() {
   return -1;
 }
 
-FX_BOOL CPDFSDK_PageView::IsValidAnnot(void* p) {
-  if (p == NULL)
+FX_BOOL CPDFSDK_PageView::IsValidAnnot(CPDF_Annot* p) const {
+  if (!p)
     return FALSE;
-  int iCount = m_pAnnotList->Count();
-  for (int i = 0; i < iCount; i++) {
+
+  const int nCount = m_pAnnotList->Count();
+  for (int i = 0; i < nCount; ++i) {
     if (m_pAnnotList->GetAt(i) == p)
       return TRUE;
   }
@@ -983,12 +957,11 @@ FX_BOOL CPDFSDK_PageView::IsValidAnnot(void* p) {
 CPDFSDK_Annot* CPDFSDK_PageView::GetFocusAnnot() {
   CPDFSDK_Annot* pFocusAnnot = m_pSDKDoc->GetFocusAnnot();
   if (!pFocusAnnot)
-    return NULL;
+    return nullptr;
 
-  for (int i = 0; i < m_fxAnnotArray.GetSize(); i++) {
-    CPDFSDK_Annot* pAnnot = (CPDFSDK_Annot*)m_fxAnnotArray.GetAt(i);
+  for (CPDFSDK_Annot* pAnnot : m_fxAnnotArray) {
     if (pAnnot == pFocusAnnot)
       return pAnnot;
   }
-  return NULL;
+  return nullptr;
 }