/*
 * Copyright (C) 2009, Pino Toscano <pino@kde.org>
 * Copyright (C) 2018, Albert Astals Cid <aacid@kde.org>
 * Copyright (C) 2019, Oliver Sander <oliver.sander@tu-dresden.de>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
 */

#ifndef POPPLER_TOC_PRIVATE_H
#define POPPLER_TOC_PRIVATE_H

#include "poppler-global.h"
#include "poppler-toc.h"

#include <vector>

class Outline;
class OutlineItem;

namespace poppler
{

class toc_private
{
public:
    toc_private();
    ~toc_private();

    static toc* load_from_outline(Outline *outline);

    toc_item root;
};


class toc_item_private
{
public:
    toc_item_private();
    ~toc_item_private();

    toc_item_private(const toc_item_private &) = delete;
    toc_item_private& operator=(const toc_item_private &) = delete;

    void load(const OutlineItem *item);
    void load_children(const std::vector<OutlineItem*> *items);

    std::vector<toc_item*> children;
    ustring title;
    bool is_open;
};

}

#endif
