/****************************************************************************** * * * * * Copyright (C) 1997-2015 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its * documentation under the terms of the GNU General Public License is hereby * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * */ #ifndef LAYOUT_H #define LAYOUT_H #include #include "types.h" class LayoutParser; class MemberList; class QTextStream; /** @brief Base class representing a piece of a documentation page */ struct LayoutDocEntry { virtual ~LayoutDocEntry() {} enum Kind { // Generic items for all pages MemberGroups, MemberDeclStart, MemberDeclEnd, MemberDecl, MemberDefStart, MemberDefEnd, MemberDef, BriefDesc, DetailedDesc, AuthorSection, // Class specific items ClassIncludes, ClassInlineClasses, ClassInheritanceGraph, ClassNestedClasses, ClassCollaborationGraph, ClassAllMembersLink, ClassUsedFiles, // Namespace specific items NamespaceNestedNamespaces, NamespaceNestedConstantGroups, NamespaceClasses, NamespaceInlineClasses, // File specific items FileClasses, FileNamespaces, FileConstantGroups, FileIncludes, FileIncludeGraph, FileIncludedByGraph, FileSourceLink, FileInlineClasses, // Group specific items GroupClasses, GroupInlineClasses, GroupNamespaces, GroupDirs, GroupNestedGroups, GroupFiles, GroupGraph, GroupPageDocs, // Directory specific items DirSubDirs, DirFiles, DirGraph }; virtual Kind kind() const = 0; }; /** @brief Represents of a piece of a documentation page without configurable parts */ struct LayoutDocEntrySimple : LayoutDocEntry { public: LayoutDocEntrySimple(Kind k) : m_kind(k) {} Kind kind() const { return m_kind; } private: Kind m_kind; }; struct LayoutDocEntrySection: public LayoutDocEntrySimple { LayoutDocEntrySection(Kind k,const QCString &tl) : LayoutDocEntrySimple(k), m_title(tl) {} QCString title(SrcLangExt lang) const; private: QCString m_title; }; /** @brief Represents of a member declaration list with configurable title and subtitle. */ struct LayoutDocEntryMemberDecl: public LayoutDocEntry { LayoutDocEntryMemberDecl(MemberListType tp, const QCString &tl,const QCString &ss) : type(tp), m_title(tl), m_subscript(ss) {} Kind kind() const { return MemberDecl; } MemberListType type; QCString title(SrcLangExt lang) const; QCString subtitle(SrcLangExt lang) const; private: QCString m_title; QCString m_subscript; }; /** @brief Represents of a member definition list with configurable title. */ struct LayoutDocEntryMemberDef: public LayoutDocEntry { LayoutDocEntryMemberDef(MemberListType tp,const QCString &tl) : type(tp), m_title(tl) {} Kind kind() const { return MemberDef; } MemberListType type; QCString title(SrcLangExt lang) const; private: QCString m_title; }; /** @brief Base class for the layout of a navigation item at the top of the HTML pages. */ struct LayoutNavEntry { public: enum Kind { MainPage, Pages, Modules, Namespaces, NamespaceList, NamespaceMembers, Classes, ClassList, ClassIndex, ClassHierarchy, ClassMembers, Files, FileList, FileGlobals, //Dirs, Examples, User, UserGroup }; LayoutNavEntry(LayoutNavEntry *parent,Kind k,bool vs,const QCString &bf, const QCString &tl,const QCString &intro,bool prepend=FALSE) : m_parent(parent), m_kind(k), m_visible(vs), m_baseFile(bf), m_title(tl), m_intro(intro) { m_children.setAutoDelete(TRUE); if (parent) { if (prepend) parent->prependChild(this); else parent->addChild(this); } } LayoutNavEntry *parent() const { return m_parent; } Kind kind() const { return m_kind; } QCString baseFile() const { return m_baseFile; } QCString title() const { return m_title; } QCString intro() const { return m_intro; } QCString url() const; bool visible() { return m_visible; } void clear() { m_children.clear(); } void addChild(LayoutNavEntry *e) { m_children.append(e); } void prependChild(LayoutNavEntry *e) { m_children.prepend(e); } const QList &children() const { return m_children; } LayoutNavEntry *find(LayoutNavEntry::Kind k,const char *file=0) const; private: LayoutNavEntry() : m_parent(0) {} LayoutNavEntry *m_parent; Kind m_kind; bool m_visible; QCString m_baseFile; QCString m_title; QCString m_intro; QList m_children; friend class LayoutDocManager; }; /** @brief Singleton providing access to the (user configurable) layout of the documentation */ class LayoutDocManager { class Private; public: enum LayoutPart { Class, Namespace, File, Group, Directory, NrParts }; /** Returns a reference to this singleton. */ static LayoutDocManager &instance(); /** Returns the list of LayoutDocEntry's in representation order for a given page identified by @a part. */ const QList &docEntries(LayoutPart part) const; /** returns the (invisible) root of the navigation tree. */ LayoutNavEntry *rootNavEntry() const; /** Parses a user provided layout */ void parse(QTextStream &t,const char *fileName); void init(); private: void addEntry(LayoutPart p,LayoutDocEntry*e); void clear(LayoutPart p); LayoutDocManager(); ~LayoutDocManager(); Private *d; friend class LayoutParser; }; void writeDefaultLayoutFile(const char *fileName); #endif