// 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

#ifndef CORE_SRC_REFLOW_LAYOUTPROVIDER_TAGGEDPDF_H_
#define CORE_SRC_REFLOW_LAYOUTPROVIDER_TAGGEDPDF_H_

#include "../../include/reflow/reflowengine.h"

class CPDF_LayoutElement : public IPDF_LayoutElement
{
public:
    CPDF_LayoutElement();
    ~CPDF_LayoutElement();

    LayoutType	GetType();
    void	GetRect(CFX_FloatRect& rcRect) {};

    int		CountAttrValues(LayoutAttr attr_type);

    LayoutEnum	GetEnumAttr(LayoutAttr attr_type, int index);
    FX_FLOAT	GetNumberAttr(LayoutAttr attr_type, int index);
    FX_COLORREF	GetColorAttr(LayoutAttr attr_type, int index);

    int		CountChildren();

    IPDF_LayoutElement* GetChild(int index);

    IPDF_LayoutElement* GetParent();

    int	CountObjects();
    CPDF_PageObject*	GetObject(int index);
    FX_BOOL AddObject(CPDF_PageObject* pObj);
    CPDF_StructElement* m_pTaggedElement;
    CPDF_LayoutElement* m_pParentElement;
    CFX_PtrArray	m_ChildArray;
    LayoutType ConvertLayoutType(const CFX_ByteStringC& name);
    CFX_ByteStringC ConvertLayoutType(LayoutType type);
    CFX_ByteStringC ConvertLayoutAttr(LayoutAttr attr);
    LayoutEnum ConvertLayoutEnum(CFX_ByteStringC Enum);

protected:
    FX_BOOL		IsInheritable(LayoutAttr attr_type);
    CFX_ByteStringC GetAttrOwner(LayoutAttr attr_type);
    CFX_ByteStringC GetDefaultNameValue(LayoutAttr attr_type);
    FX_FLOAT		GetDefaultFloatValue(LayoutAttr attr_type);
    FX_COLORREF		GetDefaultColorValue(LayoutAttr attr_type);
    CFX_PtrArray	m_ObjArray;
};
class CPDF_LayoutProvider_TaggedPDF : public IPDF_LayoutProvider
{
public:
    CPDF_LayoutProvider_TaggedPDF();
    ~CPDF_LayoutProvider_TaggedPDF();
    void			SetLayoutProviderStyle(LAYOUTPROVIDER_STYLE style) {};

    void	Init(CPDF_PageObjects* pPage)
    {
        m_pPage = pPage;
        m_Status = LayoutReady;
    };

    LayoutStatus	StartLoad(IFX_Pause* pPause = NULL);
    LayoutStatus	Continue();
    int		 		GetPosition();

    IPDF_LayoutElement* GetRoot()
    {
        return m_pRoot;
    };

protected:
    void ProcessElement(CPDF_LayoutElement*pParent, CPDF_StructElement* pTaggedElement);
    LayoutStatus	m_Status;
    CPDF_StructElement* m_pCurTaggedElement;
    CPDF_LayoutElement* m_pRoot;
    IFX_Pause*			m_pPause;
    CPDF_PageObjects*	m_pPage;
    CPDF_StructTree*	m_pPageTree;
    int					m_TopElementIndex;
};

#endif  // CORE_SRC_REFLOW_LAYOUTPROVIDER_TAGGEDPDF_H_
