// Copyright 2014 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 "xfa/fde/fde_iterator.h"

#include "xfa/fde/cfde_txtedtpage.h"

CFDE_VisualSetIterator::CFDE_VisualSetIterator() : m_dwFilter(0) {}

CFDE_VisualSetIterator::~CFDE_VisualSetIterator() {}

bool CFDE_VisualSetIterator::AttachCanvas(CFDE_TxtEdtPage* pCanvas) {
  ASSERT(pCanvas);
  m_CanvasStack = std::stack<FDE_CANVASITEM>();

  FDE_CANVASITEM canvas;
  canvas.hCanvas = nullptr;
  canvas.pCanvas = pCanvas;
  canvas.pos = pCanvas->GetFirstPosition();
  if (canvas.pos == 0)
    return false;

  m_CanvasStack.push(canvas);
  return true;
}

bool CFDE_VisualSetIterator::FilterObjects(uint32_t dwObjects) {
  if (m_CanvasStack.empty())
    return false;

  while (m_CanvasStack.size() > 1)
    m_CanvasStack.pop();

  m_dwFilter = dwObjects;

  FDE_CANVASITEM* pCanvas = &m_CanvasStack.top();
  ASSERT(pCanvas && pCanvas->pCanvas);

  pCanvas->pos = pCanvas->pCanvas->GetFirstPosition();
  return pCanvas->pos != 0;
}

void CFDE_VisualSetIterator::Reset() {
  FilterObjects(m_dwFilter);
}

FDE_TEXTEDITPIECE* CFDE_VisualSetIterator::GetNext(
    IFDE_VisualSet*& pVisualSet,
    FDE_TEXTEDITPIECE** phCanvasObj,
    CFDE_TxtEdtPage** ppCanvasSet) {
  while (!m_CanvasStack.empty()) {
    FDE_CANVASITEM* pCanvas = &m_CanvasStack.top();
    if (pCanvas->pos == 0) {
      if (m_CanvasStack.size() == 1)
        break;

      m_CanvasStack.pop();
      continue;
    }
    do {
      FDE_TEXTEDITPIECE* pObj =
          pCanvas->pCanvas->GetNext(&pCanvas->pos, pVisualSet);
      ASSERT(pObj);

      FDE_VISUALOBJTYPE eType = pVisualSet->GetType();
      if (eType == FDE_VISUALOBJ_Canvas) {
        FDE_CANVASITEM canvas;
        canvas.hCanvas = pObj;
        canvas.pCanvas = static_cast<CFDE_TxtEdtPage*>(pVisualSet);
        canvas.pos = canvas.pCanvas->GetFirstPosition();
        m_CanvasStack.push(canvas);
        break;
      }
      uint32_t dwObj = (uint32_t)eType;
      if ((m_dwFilter & dwObj) != 0) {
        if (ppCanvasSet)
          *ppCanvasSet = pCanvas->pCanvas;
        if (phCanvasObj)
          *phCanvasObj = pCanvas->hCanvas;
        return pObj;
      }
    } while (pCanvas->pos != 0);
  }
  if (ppCanvasSet)
    *ppCanvasSet = nullptr;
  if (phCanvasObj)
    *phCanvasObj = nullptr;

  pVisualSet = nullptr;
  return nullptr;
}
