blob: f2c997b7f1fc5dc6e8a2456c13e91d96c557d30e [file] [log] [blame]
// 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/cpdfsdk_annotiterator.h"
#include <algorithm>
#include "fpdfsdk/cpdfsdk_annot.h"
#include "fpdfsdk/cpdfsdk_pageview.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();
}