| Index: fpdfsdk/cpdfsdk_annotiterator.cpp
|
| diff --git a/fpdfsdk/cpdfsdk_annotiterator.cpp b/fpdfsdk/cpdfsdk_annotiterator.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..01a4e15379aee71c9ed3cf28c2a5a043d5e5b232
|
| --- /dev/null
|
| +++ b/fpdfsdk/cpdfsdk_annotiterator.cpp
|
| @@ -0,0 +1,54 @@
|
| +// 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();
|
| +}
|
|
|