1// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#ifndef _FPDF_TAGGED_INT_H_
8#define _FPDF_TAGGED_INT_H_
9class CPDF_StructTreeImpl;
10class CPDF_StructElementImpl;
11class CPDF_StructTreeImpl : public CPDF_StructTree
12{
13public:
14    CPDF_StructTreeImpl(const CPDF_Document* pDoc);
15    ~CPDF_StructTreeImpl();
16    int			CountTopElements() const
17    {
18        return m_Kids.GetSize();
19    }
20    CPDF_StructElement*	GetTopElement(int i) const
21    {
22        return (CPDF_StructElement*)m_Kids.GetAt(i);
23    }
24    void		LoadDocTree();
25    void		LoadPageTree(const CPDF_Dictionary* pPageDict);
26    CPDF_StructElementImpl* AddPageNode(CPDF_Dictionary* pElement, CFX_MapPtrToPtr& map, int nLevel = 0);
27    FX_BOOL		AddTopLevelNode(CPDF_Dictionary* pDict, CPDF_StructElementImpl* pElement);
28protected:
29    const CPDF_Dictionary*	m_pTreeRoot;
30    const CPDF_Dictionary*	m_pRoleMap;
31    const CPDF_Dictionary*	m_pPage;
32    CFX_ArrayTemplate<CPDF_StructElementImpl*>	m_Kids;
33    friend class CPDF_StructElementImpl;
34};
35class CPDF_StructElementImpl : public CPDF_StructElement
36{
37public:
38    CPDF_StructElementImpl(CPDF_StructTreeImpl* pTree, CPDF_StructElementImpl* pParent, CPDF_Dictionary* pDict);
39    ~CPDF_StructElementImpl();
40    CPDF_StructTree*		GetTree() const
41    {
42        return m_pTree;
43    }
44    const CFX_ByteString&	GetType() const
45    {
46        return m_Type;
47    }
48    CPDF_StructElement*		GetParent() const
49    {
50        return m_pParent;
51    }
52    CPDF_Dictionary *		GetDict() const
53    {
54        return m_pDict;
55    }
56    int						CountKids() const
57    {
58        return m_Kids.GetSize();
59    }
60    const CPDF_StructKid&	GetKid(int index) const
61    {
62        return m_Kids.GetData()[index];
63    }
64    CFX_PtrArray*			GetObjectArray()
65    {
66        return &m_ObjectArray;
67    }
68
69    CPDF_Object*			GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable = FALSE, FX_FLOAT fLevel = 0.0F);
70
71    CFX_ByteString			GetName(FX_BSTR owner, FX_BSTR name, FX_BSTR default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
72    FX_ARGB					GetColor(FX_BSTR owner, FX_BSTR name, FX_ARGB default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
73    FX_FLOAT				GetNumber(FX_BSTR owner, FX_BSTR name, FX_FLOAT default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
74    int						GetInteger(FX_BSTR owner, FX_BSTR name, int default_value, FX_BOOL bInheritable = FALSE, int subindex = -1);
75    CFX_PtrArray			m_ObjectArray;
76    void					LoadKids(CPDF_Dictionary* pDict);
77    void					LoadKid(FX_DWORD PageObjNum, CPDF_Object* pObj, CPDF_StructKid* pKid);
78    CPDF_Object*			GetAttr(FX_BSTR owner, FX_BSTR name, FX_BOOL bInheritable, int subindex);
79    CPDF_StructElementImpl*	Retain();
80    void					Release();
81protected:
82    CPDF_StructTreeImpl*	m_pTree;
83    CFX_ByteString			m_Type;
84    CPDF_StructElementImpl*	m_pParent;
85    CPDF_Dictionary*		m_pDict;
86    CFX_ArrayTemplate<CPDF_StructKid>	m_Kids;
87
88    int			m_RefCount;
89    friend class CPDF_StructTreeImpl;
90};
91#endif
92