| // Copyright 2016 PDFium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
| #include "fpdfsdk/include/cpdfsdk_annotiterator.h" | |
| #include <algorithm> | |
| #include "fpdfsdk/include/cpdfsdk_annot.h" | |
| #include "fpdfsdk/include/fsdk_mgr.h" | |
| CPDFSDK_AnnotIterator::CPDFSDK_AnnotIterator(CPDFSDK_PageView* pPageView, | |
| bool bReverse) | |
| : m_bReverse(bReverse), m_pos(0) { | |
| const std::vector<CPDFSDK_Annot*>& annots = pPageView->GetAnnotList(); | |
| m_iteratorAnnotList.insert(m_iteratorAnnotList.begin(), annots.rbegin(), | |
| annots.rend()); | |
| std::stable_sort(m_iteratorAnnotList.begin(), m_iteratorAnnotList.end(), | |
| [](CPDFSDK_Annot* p1, CPDFSDK_Annot* p2) { | |
| return p1->GetLayoutOrder() < p2->GetLayoutOrder(); | |
| }); | |
| CPDFSDK_Annot* pTopMostAnnot = pPageView->GetFocusAnnot(); | |
| if (!pTopMostAnnot) | |
| return; | |
| auto it = std::find(m_iteratorAnnotList.begin(), m_iteratorAnnotList.end(), | |
| pTopMostAnnot); | |
| if (it != m_iteratorAnnotList.end()) { | |
| CPDFSDK_Annot* pReaderAnnot = *it; | |
| m_iteratorAnnotList.erase(it); | |
| m_iteratorAnnotList.insert(m_iteratorAnnotList.begin(), pReaderAnnot); | |
| } | |
| } | |
| CPDFSDK_AnnotIterator::~CPDFSDK_AnnotIterator() {} | |
| CPDFSDK_Annot* CPDFSDK_AnnotIterator::NextAnnot() { | |
| if (m_pos < m_iteratorAnnotList.size()) | |
| return m_iteratorAnnotList[m_pos++]; | |
| return nullptr; | |
| } | |
| CPDFSDK_Annot* CPDFSDK_AnnotIterator::PrevAnnot() { | |
| if (m_pos < m_iteratorAnnotList.size()) | |
| return m_iteratorAnnotList[m_iteratorAnnotList.size() - ++m_pos]; | |
| return nullptr; | |
| } | |
| CPDFSDK_Annot* CPDFSDK_AnnotIterator::Next() { | |
| return m_bReverse ? PrevAnnot() : NextAnnot(); | |
| } |