Doxygen
Loading...
Searching...
No Matches
layout.h
Go to the documentation of this file.
1/******************************************************************************
2 *
3 * Copyright (C) 1997-2024 by Dimitri van Heesch.
4 *
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
10 *
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
13 *
14 */
15
16#ifndef LAYOUT_H
17#define LAYOUT_H
18
19#include <memory>
20#include <utility>
21#include <vector>
22
23#include "construct.h"
24#include "types.h"
25
26class LayoutParser;
27struct LayoutNavEntry;
28
29/** @brief Base class representing a piece of a documentation page */
31{
33
34#define ENTRY_SPECIFICATIONS \
35 /* Generic items for all pages */ \
36 ESPEC(MemberGroups) \
37 ESPEC(MemberDeclStart) ESPEC(MemberDeclEnd) ESPEC(MemberDecl) \
38 ESPEC(MemberDefStart) ESPEC(MemberDefEnd) ESPEC(MemberDef) \
39 ESPEC(BriefDesc) ESPEC(DetailedDesc) \
40 ESPEC(AuthorSection) \
41 /* Class specific items */ \
42 ESPEC(ClassIncludes) ESPEC(ClassInlineClasses) \
43 ESPEC(ClassInheritanceGraph) ESPEC(ClassNestedClasses) \
44 ESPEC(ClassCollaborationGraph) ESPEC(ClassAllMembersLink) \
45 ESPEC(ClassUsedFiles) \
46 /* Concept specific items */ \
47 ESPEC(ConceptDefinition) \
48 /* Namespace specific items */ \
49 ESPEC(NamespaceNestedNamespaces) ESPEC(NamespaceNestedConstantGroups) \
50 ESPEC(NamespaceClasses) ESPEC(NamespaceConcepts) ESPEC(NamespaceInterfaces) ESPEC(NamespaceStructs) ESPEC(NamespaceExceptions) \
51 ESPEC(NamespaceInlineClasses) \
52 /* File specific items */ \
53 ESPEC(FileClasses) ESPEC(FileConcepts) ESPEC(FileInterfaces) ESPEC(FileStructs) ESPEC(FileExceptions) ESPEC(FileConstantGroups) ESPEC(FileNamespaces) \
54 ESPEC(FileIncludes) ESPEC(FileIncludeGraph) \
55 ESPEC(FileIncludedByGraph) ESPEC(FileSourceLink) \
56 ESPEC(FileInlineClasses) \
57 /* C++20 Modules */ \
58 ESPEC(ModuleExports) ESPEC(ModuleClasses) ESPEC(ModuleConcepts) ESPEC(ModuleUsedFiles) \
59 /* Group specific items */ \
60 ESPEC(GroupClasses) ESPEC(GroupConcepts) ESPEC(GroupModules) ESPEC(GroupInlineClasses) ESPEC(GroupNamespaces) \
61 ESPEC(GroupDirs) ESPEC(GroupNestedGroups) ESPEC(GroupFiles) \
62 ESPEC(GroupGraph) ESPEC(GroupPageDocs) \
63 /* Directory specific items */ \
64 ESPEC(DirSubDirs) ESPEC(DirFiles) ESPEC(DirGraph)
65
66 enum Kind {
67#define ESPEC(x) x,
69#undef ESPEC
70 };
71 virtual Kind kind() const = 0;
72 std::string entryToString() const
73 {
74 switch (kind())
75 {
76#define ESPEC(x) case x: return #x; break;
78#undef ESPEC
79 default: return "unknown"; // to satisfy compiler
80 }
81 }
82 virtual std::string id() const = 0;
83 virtual bool visible() const = 0;
84};
85
86/** @brief Represents of a piece of a documentation page without configurable parts */
88{
89 public:
90 LayoutDocEntrySimple(Kind k,const std::string &id, bool v) : m_kind(k), m_id(id), m_visible(v) {}
91 Kind kind() const override { return m_kind; }
92 bool visible() const override { return m_visible; }
93 std::string id() const override { return m_id; }
94 private:
96 std::string m_id;
98};
99
101{
102 LayoutDocEntrySection(Kind k,const std::string &id,const DString &tl,bool v) :
103 LayoutDocEntrySimple(k,id,v), m_title(tl) {}
104 DString title(SrcLangExt lang) const;
105private:
107};
108
109/** @brief Represents of a member declaration list with configurable title and subtitle. */
111{
112 LayoutDocEntryMemberDecl(MemberListType tp,const std::string &id,
113 const DString &tl,const DString &ss, bool v)
114 : type(tp), m_id(id), m_title(tl), m_subscript(ss), m_visible(v) {}
115
116 Kind kind() const override { return MemberDecl; }
118 DString title(SrcLangExt lang) const;
119 DString subtitle(SrcLangExt lang) const;
120 bool visible() const override { return m_visible; }
121 std::string id() const override { return m_id; }
122private:
123 std::string m_id;
127};
128
129/** @brief Represents of a member definition list with configurable title. */
131{
132 LayoutDocEntryMemberDef(MemberListType tp,const std::string &id, const DString &tl,bool v)
133 : type(tp), m_id(id), m_title(tl), m_visible(v) {}
134
135 Kind kind() const override { return MemberDef; }
137 DString title(SrcLangExt lang) const;
138 bool visible() const override { return m_visible; }
139 std::string id() const override { return m_id; }
140private:
141 std::string m_id;
144};
145
146using LayoutDocEntryPtr = std::unique_ptr<LayoutDocEntry>;
147using LayoutDocEntryList = std::vector<LayoutDocEntryPtr>;
148
149//-------------------------------------------------------------------------------------------------
150
151using LayoutNavEntryList = std::vector< std::unique_ptr<LayoutNavEntry> >;
152
153/** @brief Base class for the layout of a navigation item at the top of the HTML pages. */
155{
156#define NAV_SPECIFICATIONS \
157 NSPEC(None, = -1) \
158 NSPEC(MainPage,) \
159 NSPEC(Pages,) \
160 NSPEC(Modules,) \
161 NSPEC(ModuleList,) \
162 NSPEC(ModuleMembers,) \
163 NSPEC(Topics,) \
164 NSPEC(Namespaces,) \
165 NSPEC(NamespaceList,) \
166 NSPEC(NamespaceMembers,) \
167 NSPEC(Concepts,) \
168 NSPEC(Classes,) \
169 NSPEC(ClassList,) \
170 NSPEC(ClassIndex,) \
171 NSPEC(ClassHierarchy,) \
172 NSPEC(ClassMembers,) \
173 NSPEC(Interfaces,) \
174 NSPEC(InterfaceList,) \
175 NSPEC(InterfaceIndex,) \
176 NSPEC(InterfaceHierarchy,) \
177 NSPEC(Structs,) \
178 NSPEC(StructList,) \
179 NSPEC(StructIndex,) \
180 NSPEC(Exceptions,) \
181 NSPEC(ExceptionList,) \
182 NSPEC(ExceptionIndex,) \
183 NSPEC(ExceptionHierarchy,) \
184 NSPEC(Files,) \
185 NSPEC(FileList,) \
186 NSPEC(FileGlobals,) \
187 NSPEC(Examples,) \
188 NSPEC(User,) \
189 NSPEC(UserGroup,)
190
191 public:
192 enum Kind {
193#define NSPEC(x,y) x y,
195#undef NSPEC
196 };
197 std::string navToString() const
198 {
199 switch (kind())
200 {
201#define NSPEC(x,y) case x: return #x; break;
203#undef NSPEC
204 default: return "unknown"; // to satisfy compiler
205 }
206 }
207
209 const DString &tl,const DString &intro)
210 : m_parent(parent), m_kind(k), m_visible(vs), m_baseFile(bf), m_title(tl), m_intro(intro) {}
211 LayoutNavEntry *parent() const { return m_parent; }
212 Kind kind() const { return m_kind; }
213 DString baseFile() const { return m_baseFile; }
214 std::string id() const { return navToString()+":"+m_baseFile.str(); }
215 DString title() const { return m_title; }
216 DString intro() const { return m_intro; }
217 DString url() const;
218 const LayoutNavEntryList &children() const { return m_children; }
220 void setVisible(bool v) { m_visible = v; }
221 bool visible() const { return m_visible; }
222 void insertChild(size_t pos,std::unique_ptr<LayoutNavEntry> &&e);
223 void appendChild(std::unique_ptr<LayoutNavEntry> &&e);
226 void swap(LayoutNavEntry &other)
227 {
228 std::swap(m_parent,other.m_parent);
229 std::swap(m_kind,other.m_kind);
230 std::swap(m_visible,other.m_visible);
231 std::swap(m_baseFile,other.m_baseFile);
232 std::swap(m_title,other.m_title);
233 std::swap(m_intro,other.m_intro);
234 std::swap(m_children,other.m_children);
235 // reparent children
236 for (auto &child : m_children)
237 {
238 child->m_parent = this;
239 }
240 }
241
242 private:
243 LayoutNavEntry() : m_parent(nullptr), m_kind(None), m_visible(true) {}
251 friend class LayoutDocManager;
252};
253
254#define PART_SPECIFICATIONS \
255 PSPEC(Undefined, = -1) \
256 PSPEC(Class,) PSPEC(Concept,) PSPEC(Namespace,) PSPEC(File,) PSPEC(Group,) PSPEC(Directory,) PSPEC(Module,) \
257 PSPEC(NrParts,)
258/** @brief Singleton providing access to the (user configurable) layout of the documentation */
260{
261 class Private;
262 public:
264 {
265#define PSPEC(x,y) x y,
267#undef PSPEC
268 };
269 /** Returns a reference to this singleton. */
270 static LayoutDocManager &instance();
271 static std::string partToString(int k)
272 {
273 switch (k)
274 {
275#define PSPEC(x,y) case x: return #x; break;
277#undef PSPEC
278 default: return "unknown"; // to satisfy compiler
279 }
280 }
281 /** Returns the list of LayoutDocEntry's in representation order for a given page identified by @a part. */
282 const LayoutDocEntryList &docEntries(LayoutPart part) const;
283
284 /** returns the (invisible) root of the navigation tree. */
286 /** append a new node as a child to root. */
288 LayoutNavEntry::Kind k,bool vs,const DString &bf,const DString &tl,const DString &intro);
289
290 /** Parses a user provided layout */
291 void parse(const DString &fileName, const char* data = nullptr);
292 void init();
293 int majorVersion() const;
294 int minorVersion() const;
295 private:
297 void mergeNavEntries(LayoutDocManager &manager);
298 void mergeDocEntries(const DString &fileName,LayoutDocManager &manager);
303 std::unique_ptr<Private> d;
304 friend class LayoutParser;
305};
306
307void writeDefaultLayoutFile(const DString &fileName);
308void printLayout();
309
310#endif
311
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:88
DString()=default
const std::string & str() const
Definition dstring.h:649
Singleton providing access to the (user configurable) layout of the documentation.
Definition layout.h:260
void mergeNavEntries(LayoutDocManager &manager)
Definition layout.cpp:1634
static std::string partToString(int k)
Definition layout.h:271
void parse(const DString &fileName, const char *data=nullptr)
Parses a user provided layout.
Definition layout.cpp:1469
std::unique_ptr< Private > d
Definition layout.h:303
LayoutNavEntry * createChildNavEntry(LayoutNavEntry *root, LayoutNavEntry::Kind k, bool vs, const DString &bf, const DString &tl, const DString &intro)
append a new node as a child to root.
Definition layout.cpp:1452
static LayoutDocManager & instance()
Returns a reference to this singleton.
Definition layout.cpp:1436
int majorVersion() const
Definition layout.cpp:1530
int minorVersion() const
Definition layout.cpp:1535
friend class LayoutParser
Definition layout.h:304
void mergeDocEntries(const DString &fileName, LayoutDocManager &manager)
Definition layout.cpp:1722
void addEntry(LayoutPart p, LayoutDocEntryPtr &&e)
Definition layout.cpp:1463
LayoutNavEntry * rootNavEntry() const
returns the (invisible) root of the navigation tree.
Definition layout.cpp:1447
void removeInvisibleDocEntries()
Definition layout.cpp:1510
const LayoutDocEntryList & docEntries(LayoutPart part) const
Returns the list of LayoutDocEntry's in representation order for a given page identified by part.
Definition layout.cpp:1442
A model of a class/file/namespace member symbol.
Definition memberdef.h:45
Wrapper class for the MemberListType type.
Definition types.h:346
#define NON_COPYABLE(cls)
Macro to help implementing the rule of 5 for a non-copyable & movable class.
Definition construct.h:37
#define ABSTRACT_BASE_CLASS(cls)
Macro to implement rule of 5 for an abstract base class.
Definition construct.h:20
constexpr DocNodeVariant * parent(DocNodeVariant *n)
returns the parent node of a given node n or nullptr if the node has no parent.
Definition docnode.h:1335
std::unique_ptr< LayoutDocEntry > LayoutDocEntryPtr
Definition layout.h:146
std::vector< std::unique_ptr< LayoutNavEntry > > LayoutNavEntryList
Definition layout.h:151
void writeDefaultLayoutFile(const DString &fileName)
Definition layout.cpp:1733
std::vector< LayoutDocEntryPtr > LayoutDocEntryList
Definition layout.h:147
void printLayout()
Definition layout.cpp:1821
Definition dstring.h:917
Base class representing a piece of a documentation page.
Definition layout.h:31
std::string entryToString() const
Definition layout.h:72
virtual Kind kind() const =0
virtual std::string id() const =0
virtual bool visible() const =0
Kind
Definition layout.h:66
@ ENTRY_SPECIFICATIONS
Definition layout.h:68
std::string m_id
Definition layout.h:123
DString m_title
Definition layout.h:124
DString subtitle(SrcLangExt lang) const
Definition layout.cpp:1792
bool m_visible
Definition layout.h:126
DString m_subscript
Definition layout.h:125
std::string id() const override
Definition layout.h:121
LayoutDocEntryMemberDecl(MemberListType tp, const std::string &id, const DString &tl, const DString &ss, bool v)
Definition layout.h:112
MemberListType type
Definition layout.h:117
DString title(SrcLangExt lang) const
Definition layout.cpp:1787
Kind kind() const override
Definition layout.h:116
bool visible() const override
Definition layout.h:120
std::string id() const override
Definition layout.h:139
MemberListType type
Definition layout.h:136
bool m_visible
Definition layout.h:143
Kind kind() const override
Definition layout.h:135
std::string m_id
Definition layout.h:141
DString m_title
Definition layout.h:142
DString title(SrcLangExt lang) const
Definition layout.cpp:1799
bool visible() const override
Definition layout.h:138
LayoutDocEntryMemberDef(MemberListType tp, const std::string &id, const DString &tl, bool v)
Definition layout.h:132
DString title(SrcLangExt lang) const
Definition layout.cpp:1780
DString m_title
Definition layout.h:106
LayoutDocEntrySection(Kind k, const std::string &id, const DString &tl, bool v)
Definition layout.h:102
Kind kind() const override
Definition layout.h:91
bool m_visible
Definition layout.h:97
Kind m_kind
Definition layout.h:95
bool visible() const override
Definition layout.h:92
LayoutDocEntrySimple(Kind k, const std::string &id, bool v)
Definition layout.h:90
std::string id() const override
Definition layout.h:93
std::string m_id
Definition layout.h:96
Base class for the layout of a navigation item at the top of the HTML pages.
Definition layout.h:155
bool m_visible
Definition layout.h:246
void setVisible(bool v)
Definition layout.h:220
LayoutNavEntryList m_children
Definition layout.h:250
const LayoutNavEntryList & children() const
Definition layout.h:218
LayoutNavEntryList & children()
Definition layout.h:219
LayoutNavEntry * find(LayoutNavEntry::Kind k, const DString &file=DString()) const
Definition layout.cpp:134
DString m_title
Definition layout.h:248
std::string id() const
Definition layout.h:214
void updateVisibility(LayoutNavEntry *parent)
Definition layout.cpp:117
void appendChild(std::unique_ptr< LayoutNavEntry > &&e)
Definition layout.cpp:122
void insertChild(size_t pos, std::unique_ptr< LayoutNavEntry > &&e)
Definition layout.cpp:128
LayoutNavEntry * parent() const
Definition layout.h:211
DString intro() const
Definition layout.h:216
DString title() const
Definition layout.h:215
DString url() const
Definition layout.cpp:152
LayoutNavEntry()
Definition layout.h:243
DString m_baseFile
Definition layout.h:247
Kind m_kind
Definition layout.h:245
void swap(LayoutNavEntry &other)
Definition layout.h:226
DString baseFile() const
Definition layout.h:213
Kind kind() const
Definition layout.h:212
bool visible() const
Definition layout.h:221
LayoutNavEntry(LayoutNavEntry *parent, Kind k, bool vs, const DString &bf, const DString &tl, const DString &intro)
Definition layout.h:208
Kind
Definition layout.h:192
@ NAV_SPECIFICATIONS
Definition layout.h:194
LayoutNavEntry * m_parent
Definition layout.h:244
friend class LayoutDocManager
Definition layout.h:251
std::string navToString() const
Definition layout.h:197
DString m_intro
Definition layout.h:249
This file contains a number of basic enums and types.
SrcLangExt
Definition types.h:207