// 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/fgas/crt/fgas_utils.h"

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

CFDE_VisualSetIterator::~CFDE_VisualSetIterator() {
  m_CanvasStack.RemoveAll();
}

FX_BOOL CFDE_VisualSetIterator::AttachCanvas(IFDE_CanvasSet* pCanvas) {
  ASSERT(pCanvas);

  m_CanvasStack.RemoveAll();
  FDE_CANVASITEM canvas;
  canvas.hCanvas = nullptr;
  canvas.pCanvas = pCanvas;
  canvas.hPos = pCanvas->GetFirstPosition();
  if (!canvas.hPos)
    return FALSE;

  return m_CanvasStack.Push(canvas) == 0;
}

FX_BOOL CFDE_VisualSetIterator::FilterObjects(uint32_t dwObjects) {
  if (m_CanvasStack.GetSize() == 0)
    return FALSE;

  while (m_CanvasStack.GetSize() > 1)
    m_CanvasStack.Pop();

  m_dwFilter = dwObjects;

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

  pCanvas->hPos = pCanvas->pCanvas->GetFirstPosition();
  return !!pCanvas->hPos;
}

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

FDE_TEXTEDITPIECE* CFDE_VisualSetIterator::GetNext(
    IFDE_VisualSet*& pVisualSet,
    FDE_TEXTEDITPIECE** phCanvasObj,
    IFDE_CanvasSet** ppCanvasSet) {
  while (m_CanvasStack.GetSize() > 0) {
    FDE_CANVASITEM* pCanvas = m_CanvasStack.GetTopElement();
    ASSERT(pCanvas && pCanvas->pCanvas);

    if (!pCanvas->hPos) {
      if (m_CanvasStack.GetSize() == 1)
        break;

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

      FDE_VISUALOBJTYPE eType = pVisualSet->GetType();
      if (eType == FDE_VISUALOBJ_Canvas) {
        FDE_CANVASITEM canvas;
        canvas.hCanvas = pObj;
        canvas.pCanvas = (IFDE_CanvasSet*)pVisualSet;
        canvas.hPos = 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->hPos);
  }
  if (ppCanvasSet)
    *ppCanvasSet = nullptr;
  if (phCanvasObj)
    *phCanvasObj = nullptr;

  pVisualSet = nullptr;
  return nullptr;
}
