// 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_INCLUDE_FPDFDOC_FPDF_TAGGED_H_
#define CORE_INCLUDE_FPDFDOC_FPDF_TAGGED_H_

class CPDF_Document;
class CPDF_Page;
class CPDF_StructElement;
class CPDF_StructTree;
class IPDF_ReflowedPage;
struct CPDF_StructKid;

class CPDF_StructTree
{
public:

    static CPDF_StructTree* LoadDoc(const CPDF_Document* pDoc);

    static CPDF_StructTree* LoadPage(const CPDF_Document* pDoc, const CPDF_Dictionary* pPageDict);

    virtual ~CPDF_StructTree() {}

    virtual int			CountTopElements() const = 0;

    virtual CPDF_StructElement*	GetTopElement(int i) const = 0;
};
struct CPDF_StructKid {
    enum {
        Invalid,
        Element,
        PageContent,
        StreamContent,
        Object
    } m_Type;

    union {
        struct {

            CPDF_StructElement*	m_pElement;

            CPDF_Dictionary*	m_pDict;
        } m_Element;
        struct {

            FX_DWORD			m_PageObjNum;

            FX_DWORD			m_ContentId;
        } m_PageContent;
        struct {

            FX_DWORD			m_PageObjNum;

            FX_DWORD			m_ContentId;

            FX_DWORD			m_RefObjNum;
        } m_StreamContent;
        struct {

            FX_DWORD			m_PageObjNum;

            FX_DWORD			m_RefObjNum;
        } m_Object;
    };
};
class CPDF_StructElement
{
public:
    virtual ~CPDF_StructElement() { }

    virtual CPDF_StructTree*	GetTree() const = 0;

    virtual const CFX_ByteString&	GetType() const = 0;

    virtual CPDF_StructElement*	GetParent() const = 0;

    virtual CPDF_Dictionary *	GetDict() const = 0;

    virtual int					CountKids() const = 0;

    virtual const CPDF_StructKid&	GetKid(int index) const = 0;

    virtual CFX_PtrArray*		GetObjectArray() = 0;

    virtual CPDF_Object*		GetAttr(const CFX_ByteStringC& owner, const CFX_ByteStringC& name, bool bInheritable = false, FX_FLOAT fLevel = 0.0F) = 0;



    virtual CFX_ByteString		GetName(const CFX_ByteStringC& owner, const CFX_ByteStringC& name, const CFX_ByteStringC& default_value, bool bInheritable = false, int subindex = -1) = 0;

    virtual FX_ARGB				GetColor(const CFX_ByteStringC& owner, const CFX_ByteStringC& name, FX_ARGB default_value, bool bInheritable = false, int subindex = -1) = 0;

    virtual FX_FLOAT			GetNumber(const CFX_ByteStringC& owner, const CFX_ByteStringC& name, FX_FLOAT default_value, bool bInheritable = false, int subindex = -1) = 0;

    virtual int					GetInteger(const CFX_ByteStringC& owner, const CFX_ByteStringC& name, int default_value, bool bInheritable = false, int subindex = -1) = 0;

};

#endif  // CORE_INCLUDE_FPDFDOC_FPDF_TAGGED_H_
