blob: 3b1f3c844215c8c1b385133e5e0c180c8af79957 [file] [log] [blame]
//========================================================================
//
// StructTreeRoot.h
//
// This file is licensed under the GPLv2 or later
//
// Copyright 2013, 2014 Igalia S.L.
//
//========================================================================
#ifndef STRUCTTREEROOT_H
#define STRUCTTREEROOT_H
#ifdef USE_GCC_PRAGMAS
#pragma interface
#endif
#include "goo/gtypes.h"
#include "Object.h"
#include "StructElement.h"
#include <vector>
class Dict;
class PDFDoc;
class StructTreeRoot
{
public:
StructTreeRoot(PDFDoc *docA, Dict *rootDict);
~StructTreeRoot();
PDFDoc *getDoc() { return doc; }
Dict *getRoleMap() { return roleMap.isDict() ? roleMap.getDict() : NULL; }
Dict *getClassMap() { return classMap.isDict() ? classMap.getDict() : NULL; }
unsigned getNumChildren() const { return elements.size(); }
const StructElement *getChild(int i) const { return elements.at(i); }
StructElement *getChild(int i) { return elements.at(i); }
void appendChild(StructElement *element) {
if (element && element->isOk()) {
elements.push_back(element);
}
}
const StructElement *findParentElement(unsigned index) const {
if (index < parentTree.size() && parentTree[index].size() == 1) {
return parentTree[index][0].element;
}
return NULL;
}
private:
typedef std::vector<StructElement*> ElemPtrArray;
// Structure for items in /ParentTree, it keeps a mapping of
// object references and pointers to StructElement objects.
struct Parent {
Ref ref;
StructElement *element;
Parent(): element(NULL) { ref.num = ref.gen = -1; }
Parent(const Parent &p): element(p.element) {
ref.num = p.ref.num;
ref.gen = p.ref.gen;
}
~Parent() {}
};
PDFDoc *doc;
Object roleMap;
Object classMap;
ElemPtrArray elements;
std::vector< std::vector<Parent> > parentTree;
void parse(Dict *rootDict);
void parentTreeAdd(const Ref &objectRef, StructElement *element);
friend class StructElement;
};
#endif