|
1 /****************************************************************************** |
|
2 * |
|
3 * |
|
4 * |
|
5 * |
|
6 * Copyright (C) 1997-2008 by Dimitri van Heesch. |
|
7 * |
|
8 * Permission to use, copy, modify, and distribute this software and its |
|
9 * documentation under the terms of the GNU General Public License is hereby |
|
10 * granted. No representations are made about the suitability of this software |
|
11 * for any purpose. It is provided "as is" without express or implied warranty. |
|
12 * See the GNU General Public License for more details. |
|
13 * |
|
14 * Documents produced by Doxygen are derivative works derived from the |
|
15 * input used in their production; they are not affected by this license. |
|
16 * |
|
17 */ |
|
18 |
|
19 #include "layout.h" |
|
20 #include "message.h" |
|
21 #include "language.h" |
|
22 #include "vhdldocgen.h" |
|
23 #include "util.h" |
|
24 |
|
25 #include <qxml.h> |
|
26 #include <qfile.h> |
|
27 #include <qstring.h> |
|
28 #include <qfileinfo.h> |
|
29 #include <qtextstream.h> |
|
30 |
|
31 static const char layout_default[] = |
|
32 #include "layout_default.h" |
|
33 ; |
|
34 |
|
35 static bool elemIsVisible(const QXmlAttributes &attrib,bool defVal=TRUE) |
|
36 { |
|
37 QCString visible = convertToQCString(attrib.value("visible")); |
|
38 if (visible.isEmpty()) return defVal; |
|
39 if (visible.at(0)=='$' && visible.length()>1) |
|
40 { |
|
41 QCString id = visible.mid(1); |
|
42 ConfigOption *opt = Config::instance()->get(id); |
|
43 if (opt && opt->kind()==ConfigOption::O_Bool) |
|
44 { |
|
45 return *((ConfigBool *)opt)->valueRef(); |
|
46 } |
|
47 else if (!opt) |
|
48 { |
|
49 err("Warning: found unsupported value %s for visible attribute in layout file\n", |
|
50 visible.data()); |
|
51 } |
|
52 } |
|
53 return visible!="no" && visible!="0"; |
|
54 } |
|
55 |
|
56 //--------------------------------------------------------------------------------- |
|
57 |
|
58 LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind) const |
|
59 { |
|
60 LayoutNavEntry *result=0; |
|
61 QListIterator<LayoutNavEntry> li(m_children); |
|
62 LayoutNavEntry *entry; |
|
63 for (li.toFirst();(entry=li.current());++li) |
|
64 { |
|
65 // depth first search, needed to find the entry furthest from the |
|
66 // root in case an entry is in the tree twice |
|
67 result = entry->find(kind); |
|
68 if (result) return result; |
|
69 if (entry->kind()==kind) |
|
70 { |
|
71 return entry; |
|
72 } |
|
73 } |
|
74 return result; |
|
75 } |
|
76 |
|
77 //--------------------------------------------------------------------------------- |
|
78 |
|
79 class LayoutParser : public QXmlDefaultHandler |
|
80 { |
|
81 private: |
|
82 class StartElementHandler |
|
83 { |
|
84 typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib); |
|
85 public: |
|
86 StartElementHandler(LayoutParser *parent, Handler h) |
|
87 : m_parent(parent), m_handler(h) {} |
|
88 virtual ~StartElementHandler() {} |
|
89 virtual void operator()(const QXmlAttributes &attrib) |
|
90 { |
|
91 (m_parent->*m_handler)(attrib); |
|
92 } |
|
93 protected: |
|
94 StartElementHandler() : m_parent(0), m_handler(0) {} |
|
95 private: |
|
96 LayoutParser *m_parent; |
|
97 Handler m_handler; |
|
98 }; |
|
99 |
|
100 class StartElementHandlerKind : public StartElementHandler |
|
101 { |
|
102 typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind, |
|
103 const QXmlAttributes &attrib); |
|
104 public: |
|
105 StartElementHandlerKind(LayoutParser *parent, LayoutDocEntry::Kind k,Handler h) |
|
106 : m_parent(parent), m_kind(k), m_handler(h) {} |
|
107 void operator()(const QXmlAttributes &attrib) |
|
108 { |
|
109 (m_parent->*m_handler)(m_kind,attrib); |
|
110 } |
|
111 private: |
|
112 LayoutParser *m_parent; |
|
113 LayoutDocEntry::Kind m_kind; |
|
114 Handler m_handler; |
|
115 }; |
|
116 |
|
117 class StartElementHandlerSection : public StartElementHandler |
|
118 { |
|
119 typedef void (LayoutParser::*Handler)(LayoutDocEntry::Kind kind, |
|
120 const QXmlAttributes &attrib, |
|
121 const QCString &title); |
|
122 public: |
|
123 StartElementHandlerSection(LayoutParser *parent, LayoutDocEntry::Kind k,Handler h, |
|
124 const QCString &title) |
|
125 : m_parent(parent), m_kind(k), m_handler(h), m_title(title) {} |
|
126 void operator()(const QXmlAttributes &attrib) |
|
127 { |
|
128 (m_parent->*m_handler)(m_kind,attrib,m_title); |
|
129 } |
|
130 private: |
|
131 LayoutParser *m_parent; |
|
132 LayoutDocEntry::Kind m_kind; |
|
133 Handler m_handler; |
|
134 QCString m_title; |
|
135 }; |
|
136 |
|
137 class StartElementHandlerMember : public StartElementHandler |
|
138 { |
|
139 typedef void (LayoutParser::*Handler)(const QXmlAttributes &attrib, |
|
140 MemberList::ListType type, |
|
141 const QCString &title, |
|
142 const QCString &subtitle); |
|
143 public: |
|
144 StartElementHandlerMember(LayoutParser *parent, |
|
145 Handler h, |
|
146 MemberList::ListType type, |
|
147 const QCString &tl, |
|
148 const QCString &ss = QCString() |
|
149 ) |
|
150 : m_parent(parent), m_handler(h), m_type(type), |
|
151 m_title(tl), m_subscript(ss) {} |
|
152 void operator()(const QXmlAttributes &attrib) |
|
153 { |
|
154 (m_parent->*m_handler)(attrib,m_type,m_title,m_subscript); |
|
155 } |
|
156 private: |
|
157 LayoutParser *m_parent; |
|
158 Handler m_handler; |
|
159 MemberList::ListType m_type; |
|
160 QCString m_title; |
|
161 QCString m_subscript; |
|
162 }; |
|
163 |
|
164 class StartElementHandlerNavEntry : public StartElementHandler |
|
165 { |
|
166 typedef void (LayoutParser::*Handler)(LayoutNavEntry::Kind kind, |
|
167 const QXmlAttributes &attrib, |
|
168 const QCString &title); |
|
169 public: |
|
170 StartElementHandlerNavEntry(LayoutParser *parent, |
|
171 LayoutNavEntry::Kind kind, |
|
172 Handler h, |
|
173 const QCString &tl |
|
174 ) |
|
175 : m_parent(parent), m_kind(kind), m_handler(h), m_title(tl) {} |
|
176 void operator()(const QXmlAttributes &attrib) |
|
177 { |
|
178 (m_parent->*m_handler)(m_kind,attrib,m_title); |
|
179 } |
|
180 private: |
|
181 LayoutParser *m_parent; |
|
182 LayoutNavEntry::Kind m_kind; |
|
183 Handler m_handler; |
|
184 QCString m_title; |
|
185 }; |
|
186 |
|
187 class EndElementHandler |
|
188 { |
|
189 typedef void (LayoutParser::*Handler)(); |
|
190 public: |
|
191 EndElementHandler(LayoutParser *parent, Handler h) : m_parent(parent), m_handler(h) {} |
|
192 void operator()() { (m_parent->*m_handler)(); } |
|
193 private: |
|
194 LayoutParser *m_parent; |
|
195 Handler m_handler; |
|
196 }; |
|
197 |
|
198 |
|
199 public: |
|
200 static LayoutParser &instance() |
|
201 { |
|
202 static LayoutParser *theInstance = new LayoutParser; |
|
203 return *theInstance; |
|
204 } |
|
205 void init() |
|
206 { |
|
207 m_sHandler.setAutoDelete(TRUE); |
|
208 m_eHandler.setAutoDelete(TRUE); |
|
209 m_part = -1; // invalid |
|
210 m_rootNav = 0; |
|
211 |
|
212 bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); |
|
213 bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); |
|
214 bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); |
|
215 |
|
216 // start & end handlers |
|
217 m_sHandler.insert("doxygenlayout", |
|
218 new StartElementHandler(this,&LayoutParser::startLayout)); |
|
219 m_eHandler.insert("doxygenlayout", |
|
220 new EndElementHandler(this,&LayoutParser::endLayout)); |
|
221 |
|
222 // class layout handlers |
|
223 m_sHandler.insert("navindex", |
|
224 new StartElementHandler(this,&LayoutParser::startNavIndex)); |
|
225 m_sHandler.insert("navindex/tab", |
|
226 new StartElementHandler(this,&LayoutParser::startNavEntry)); |
|
227 m_eHandler.insert("navindex/tab", |
|
228 new EndElementHandler(this,&LayoutParser::endNavEntry)); |
|
229 m_eHandler.insert("navindex", |
|
230 new EndElementHandler(this,&LayoutParser::endNavIndex)); |
|
231 |
|
232 // class layout handlers |
|
233 m_sHandler.insert("class", |
|
234 new StartElementHandler(this,&LayoutParser::startClass)); |
|
235 m_sHandler.insert("class/briefdescription", |
|
236 new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry)); |
|
237 m_sHandler.insert("class/detaileddescription", |
|
238 new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry, |
|
239 theTranslator->trDetailedDescription())); |
|
240 m_sHandler.insert("class/authorsection", |
|
241 new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry)); |
|
242 m_sHandler.insert("class/includes", |
|
243 new StartElementHandlerKind(this,LayoutDocEntry::ClassIncludes,&LayoutParser::startSimpleEntry)); |
|
244 m_sHandler.insert("class/inheritancegraph", |
|
245 new StartElementHandlerKind(this,LayoutDocEntry::ClassInheritanceGraph,&LayoutParser::startSimpleEntry)); |
|
246 m_sHandler.insert("class/collaborationgraph", |
|
247 new StartElementHandlerKind(this,LayoutDocEntry::ClassCollaborationGraph,&LayoutParser::startSimpleEntry)); |
|
248 m_sHandler.insert("class/allmemberslink", |
|
249 new StartElementHandlerKind(this,LayoutDocEntry::ClassAllMembersLink,&LayoutParser::startSimpleEntry)); |
|
250 m_sHandler.insert("class/usedfiles", |
|
251 new StartElementHandlerKind(this,LayoutDocEntry::ClassUsedFiles,&LayoutParser::startSimpleEntry)); |
|
252 m_sHandler.insert("class/memberdecl", |
|
253 new StartElementHandler(this,&LayoutParser::startMemberDecl)); |
|
254 m_sHandler.insert("class/memberdecl/membergroups", |
|
255 new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry)); |
|
256 m_sHandler.insert("class/memberdecl/nestedclasses", |
|
257 new StartElementHandlerSection(this,LayoutDocEntry::ClassNestedClasses,&LayoutParser::startSectionEntry, |
|
258 vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) : |
|
259 fortranOpt ? theTranslator->trDataTypes() : |
|
260 theTranslator->trCompounds() |
|
261 )); |
|
262 m_sHandler.insert("class/memberdecl/publictypes", |
|
263 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
264 MemberList::pubTypes,theTranslator->trPublicTypes())); |
|
265 m_sHandler.insert("class/memberdecl/publicslots", |
|
266 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
267 MemberList::pubSlots,theTranslator->trPublicSlots())); |
|
268 m_sHandler.insert("class/memberdecl/signals", |
|
269 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
270 MemberList::signals,theTranslator->trSignals())); |
|
271 m_sHandler.insert("class/memberdecl/publicmethods", |
|
272 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
273 MemberList::pubMethods,theTranslator->trPublicMembers())); |
|
274 m_sHandler.insert("class/memberdecl/publicstaticmethods", |
|
275 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
276 MemberList::pubStaticMethods,theTranslator->trStaticPublicMembers())); |
|
277 m_sHandler.insert("class/memberdecl/publicattributes", |
|
278 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
279 MemberList::pubAttribs,theTranslator->trPublicAttribs())); |
|
280 m_sHandler.insert("class/memberdecl/publicstaticattributes", |
|
281 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
282 MemberList::pubStaticAttribs,theTranslator->trStaticPublicAttribs())); |
|
283 m_sHandler.insert("class/memberdecl/protectedtypes", |
|
284 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
285 MemberList::proTypes,theTranslator->trProtectedTypes())); |
|
286 m_sHandler.insert("class/memberdecl/protectedslots", |
|
287 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
288 MemberList::proSlots,theTranslator->trProtectedSlots())); |
|
289 m_sHandler.insert("class/memberdecl/protectedmethods", |
|
290 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
291 MemberList::proMethods,theTranslator->trProtectedMembers())); |
|
292 m_sHandler.insert("class/memberdecl/protectedstaticmethods", |
|
293 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
294 MemberList::proStaticMethods,theTranslator->trStaticProtectedMembers())); |
|
295 m_sHandler.insert("class/memberdecl/protectedattributes", |
|
296 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
297 MemberList::proAttribs,theTranslator->trProtectedAttribs())); |
|
298 m_sHandler.insert("class/memberdecl/protectedstaticattributes", |
|
299 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
300 MemberList::proStaticAttribs,theTranslator->trStaticProtectedAttribs())); |
|
301 m_sHandler.insert("class/memberdecl/packagetypes", |
|
302 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
303 MemberList::pacTypes,theTranslator->trPackageTypes())); |
|
304 m_sHandler.insert("class/memberdecl/packagemethods", |
|
305 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
306 MemberList::pacMethods,theTranslator->trPackageMembers())); |
|
307 m_sHandler.insert("class/memberdecl/packagestaticmethods", |
|
308 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
309 MemberList::pacStaticMethods,theTranslator->trStaticPackageMembers())); |
|
310 m_sHandler.insert("class/memberdecl/packageattributes", |
|
311 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
312 MemberList::pacAttribs,theTranslator->trPackageAttribs())); |
|
313 m_sHandler.insert("class/memberdecl/packagestaticattributes", |
|
314 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
315 MemberList::pacStaticAttribs,theTranslator->trStaticPackageAttribs())); |
|
316 m_sHandler.insert("class/memberdecl/properties", |
|
317 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
318 MemberList::properties,theTranslator->trProperties())); |
|
319 m_sHandler.insert("class/memberdecl/events", |
|
320 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
321 MemberList::events,theTranslator->trEvents())); |
|
322 m_sHandler.insert("class/memberdecl/privatetypes", |
|
323 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
324 MemberList::priTypes,theTranslator->trPrivateTypes())); |
|
325 m_sHandler.insert("class/memberdecl/privateslots", |
|
326 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
327 MemberList::priSlots,theTranslator->trPrivateSlots())); |
|
328 m_sHandler.insert("class/memberdecl/privatemethods", |
|
329 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
330 MemberList::priMethods,theTranslator->trPrivateMembers())); |
|
331 m_sHandler.insert("class/memberdecl/privatestaticmethods", |
|
332 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
333 MemberList::priStaticMethods,theTranslator->trStaticPrivateMembers())); |
|
334 m_sHandler.insert("class/memberdecl/privateattributes", |
|
335 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
336 MemberList::priAttribs,theTranslator->trPrivateAttribs())); |
|
337 m_sHandler.insert("class/memberdecl/privatestaticattributes", |
|
338 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
339 MemberList::priStaticAttribs,theTranslator->trStaticPrivateAttribs())); |
|
340 m_sHandler.insert("class/memberdecl/friends", |
|
341 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
342 MemberList::friends,theTranslator->trFriends())); |
|
343 m_sHandler.insert("class/memberdecl/related", |
|
344 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
345 MemberList::related,theTranslator->trRelatedFunctions(), |
|
346 theTranslator->trRelatedSubscript())); |
|
347 m_eHandler.insert("class/memberdecl", |
|
348 new EndElementHandler(this,&LayoutParser::endMemberDecl)); |
|
349 m_sHandler.insert("class/memberdef", |
|
350 new StartElementHandler(this,&LayoutParser::startMemberDef)); |
|
351 m_sHandler.insert("class/memberdef/typedefs", |
|
352 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
353 MemberList::typedefMembers,theTranslator->trMemberTypedefDocumentation())); |
|
354 m_sHandler.insert("class/memberdef/enums", |
|
355 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
356 MemberList::enumMembers,theTranslator->trMemberEnumerationDocumentation())); |
|
357 m_sHandler.insert("class/memberdef/constructors", |
|
358 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
359 MemberList::constructors,theTranslator->trConstructorDocumentation())); |
|
360 m_sHandler.insert("class/memberdef/functions", |
|
361 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
362 MemberList::functionMembers, |
|
363 fortranOpt ? |
|
364 theTranslator->trMemberFunctionDocumentationFortran() : |
|
365 theTranslator->trMemberFunctionDocumentation())); |
|
366 m_sHandler.insert("class/memberdef/related", |
|
367 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
368 MemberList::relatedMembers,theTranslator->trRelatedFunctionDocumentation())); |
|
369 m_sHandler.insert("class/memberdef/variables", |
|
370 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
371 MemberList::variableMembers,theTranslator->trMemberDataDocumentation())); |
|
372 m_sHandler.insert("class/memberdef/properties", |
|
373 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
374 MemberList::propertyMembers,theTranslator->trPropertyDocumentation())); |
|
375 m_sHandler.insert("class/memberdef/events", |
|
376 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
377 MemberList::eventMembers,theTranslator->trEventDocumentation())); |
|
378 m_eHandler.insert("class/memberdef", |
|
379 new EndElementHandler(this,&LayoutParser::endMemberDef)); |
|
380 m_eHandler.insert("class", |
|
381 new EndElementHandler(this,&LayoutParser::endClass)); |
|
382 |
|
383 |
|
384 // namespace layout handlers |
|
385 m_sHandler.insert("namespace", |
|
386 new StartElementHandler(this,&LayoutParser::startNamespace)); |
|
387 m_sHandler.insert("namespace/briefdescription", |
|
388 new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry)); |
|
389 m_sHandler.insert("namespace/detaileddescription", |
|
390 new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry, |
|
391 theTranslator->trDetailedDescription())); |
|
392 m_sHandler.insert("namespace/authorsection", |
|
393 new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry)); |
|
394 m_sHandler.insert("namespace/memberdecl", |
|
395 new StartElementHandler(this,&LayoutParser::startMemberDecl)); |
|
396 m_sHandler.insert("namespace/memberdecl/nestednamespaces", |
|
397 new StartElementHandlerSection(this,LayoutDocEntry::NamespaceNestedNamespaces,&LayoutParser::startSectionEntry, |
|
398 javaOpt ? theTranslator->trPackages() : |
|
399 fortranOpt ? theTranslator->trModules() : |
|
400 theTranslator->trNamespaces() |
|
401 )); |
|
402 m_sHandler.insert("namespace/memberdecl/classes", |
|
403 new StartElementHandlerSection(this,LayoutDocEntry::NamespaceClasses,&LayoutParser::startSectionEntry, |
|
404 vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) : |
|
405 fortranOpt ? theTranslator->trDataTypes() : |
|
406 theTranslator->trCompounds() |
|
407 )); |
|
408 m_sHandler.insert("namespace/memberdecl/membergroups", |
|
409 new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry)); |
|
410 m_sHandler.insert("namespace/memberdecl/typedefs", |
|
411 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
412 MemberList::decTypedefMembers,theTranslator->trTypedefs())); |
|
413 m_sHandler.insert("namespace/memberdecl/enums", |
|
414 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
415 MemberList::decEnumMembers,theTranslator->trEnumerations())); |
|
416 m_sHandler.insert("namespace/memberdecl/functions", |
|
417 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
418 MemberList::decFuncMembers, |
|
419 fortranOpt ? theTranslator->trSubprograms() : |
|
420 vhdlOpt ? VhdlDocGen::trFunctionAndProc() : |
|
421 theTranslator->trFunctions())); |
|
422 m_sHandler.insert("namespace/memberdecl/variables", |
|
423 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
424 MemberList::decVarMembers,theTranslator->trVariables())); |
|
425 m_eHandler.insert("namespace/memberdecl", |
|
426 new EndElementHandler(this,&LayoutParser::endMemberDecl)); |
|
427 m_sHandler.insert("namespace/memberdef", |
|
428 new StartElementHandler(this,&LayoutParser::startMemberDef)); |
|
429 m_sHandler.insert("namespace/memberdef/typedefs", |
|
430 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
431 MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation())); |
|
432 m_sHandler.insert("namespace/memberdef/enums", |
|
433 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
434 MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation())); |
|
435 m_sHandler.insert("namespace/memberdef/functions", |
|
436 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
437 MemberList::docFuncMembers, |
|
438 fortranOpt ? |
|
439 theTranslator->trSubprogramDocumentation() : |
|
440 theTranslator->trFunctionDocumentation())); |
|
441 m_sHandler.insert("namespace/memberdef/variables", |
|
442 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
443 MemberList::docVarMembers,theTranslator->trVariableDocumentation())); |
|
444 m_eHandler.insert("namespace/memberdef", |
|
445 new EndElementHandler(this,&LayoutParser::endMemberDef)); |
|
446 m_eHandler.insert("namespace", |
|
447 new EndElementHandler(this,&LayoutParser::endNamespace)); |
|
448 |
|
449 // file layout handlers |
|
450 m_sHandler.insert("file", |
|
451 new StartElementHandler(this,&LayoutParser::startFile)); |
|
452 m_sHandler.insert("file/briefdescription", |
|
453 new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry)); |
|
454 m_sHandler.insert("file/detaileddescription", |
|
455 new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry, |
|
456 theTranslator->trDetailedDescription())); |
|
457 m_sHandler.insert("file/authorsection", |
|
458 new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry)); |
|
459 m_sHandler.insert("file/includes", |
|
460 new StartElementHandlerKind(this,LayoutDocEntry::FileIncludes,&LayoutParser::startSimpleEntry)); |
|
461 m_sHandler.insert("file/includegraph", |
|
462 new StartElementHandlerKind(this,LayoutDocEntry::FileIncludeGraph,&LayoutParser::startSimpleEntry)); |
|
463 m_sHandler.insert("file/includedbygraph", |
|
464 new StartElementHandlerKind(this,LayoutDocEntry::FileIncludedByGraph,&LayoutParser::startSimpleEntry)); |
|
465 m_sHandler.insert("file/sourcelink", |
|
466 new StartElementHandlerKind(this,LayoutDocEntry::FileSourceLink,&LayoutParser::startSimpleEntry)); |
|
467 m_sHandler.insert("file/memberdecl/membergroups", |
|
468 new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry)); |
|
469 m_sHandler.insert("file/memberdecl", |
|
470 new StartElementHandler(this,&LayoutParser::startMemberDecl)); |
|
471 m_sHandler.insert("file/memberdecl/classes", |
|
472 new StartElementHandlerSection(this,LayoutDocEntry::FileClasses,&LayoutParser::startSectionEntry, |
|
473 vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) : |
|
474 fortranOpt ? theTranslator->trDataTypes() : |
|
475 theTranslator->trCompounds() |
|
476 )); |
|
477 m_sHandler.insert("file/memberdecl/namespaces", |
|
478 new StartElementHandlerSection(this,LayoutDocEntry::FileNamespaces,&LayoutParser::startSectionEntry, |
|
479 javaOpt ? theTranslator->trPackages() : |
|
480 fortranOpt ? theTranslator->trModules() : |
|
481 theTranslator->trNamespaces() |
|
482 )); |
|
483 m_sHandler.insert("file/memberdecl/defines", |
|
484 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
485 MemberList::decDefineMembers,theTranslator->trDefines())); |
|
486 m_sHandler.insert("file/memberdecl/typedefs", |
|
487 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
488 MemberList::decTypedefMembers,theTranslator->trTypedefs())); |
|
489 m_sHandler.insert("file/memberdecl/enums", |
|
490 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
491 MemberList::decEnumMembers,theTranslator->trEnumerations())); |
|
492 m_sHandler.insert("file/memberdecl/functions", |
|
493 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
494 MemberList::decFuncMembers, |
|
495 fortranOpt ? theTranslator->trSubprograms() : |
|
496 vhdlOpt ? VhdlDocGen::trFunctionAndProc() : |
|
497 theTranslator->trFunctions())) ; |
|
498 m_sHandler.insert("file/memberdecl/variables", |
|
499 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
500 MemberList::decVarMembers,theTranslator->trVariables())); |
|
501 |
|
502 m_eHandler.insert("file/memberdecl", |
|
503 new EndElementHandler(this,&LayoutParser::endMemberDecl)); |
|
504 m_sHandler.insert("file/memberdef", |
|
505 new StartElementHandler(this,&LayoutParser::startMemberDef)); |
|
506 m_sHandler.insert("file/memberdef/defines", |
|
507 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
508 MemberList::docDefineMembers,theTranslator->trDefineDocumentation())); |
|
509 m_sHandler.insert("file/memberdef/typedefs", |
|
510 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
511 MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation())); |
|
512 m_sHandler.insert("file/memberdef/enums", |
|
513 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
514 MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation())); |
|
515 m_sHandler.insert("file/memberdef/functions", |
|
516 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
517 MemberList::docFuncMembers,theTranslator->trFunctionDocumentation())); |
|
518 m_sHandler.insert("file/memberdef/variables", |
|
519 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
520 MemberList::docVarMembers,theTranslator->trVariableDocumentation())); |
|
521 m_eHandler.insert("file/memberdef", |
|
522 new EndElementHandler(this,&LayoutParser::endMemberDef)); |
|
523 m_eHandler.insert("file", |
|
524 new EndElementHandler(this,&LayoutParser::endFile)); |
|
525 |
|
526 // group layout handlers |
|
527 m_sHandler.insert("group", |
|
528 new StartElementHandler(this,&LayoutParser::startGroup)); |
|
529 m_sHandler.insert("group/briefdescription", |
|
530 new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry)); |
|
531 m_sHandler.insert("group/detaileddescription", |
|
532 new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry, |
|
533 theTranslator->trDetailedDescription())); |
|
534 m_sHandler.insert("group/authorsection", |
|
535 new StartElementHandlerKind(this,LayoutDocEntry::AuthorSection,&LayoutParser::startSimpleEntry)); |
|
536 m_sHandler.insert("group/groupgraph", |
|
537 new StartElementHandlerKind(this,LayoutDocEntry::GroupGraph,&LayoutParser::startSimpleEntry)); |
|
538 m_sHandler.insert("group/memberdecl/membergroups", |
|
539 new StartElementHandlerKind(this,LayoutDocEntry::MemberGroups,&LayoutParser::startSimpleEntry)); |
|
540 m_sHandler.insert("group/memberdecl", |
|
541 new StartElementHandler(this,&LayoutParser::startMemberDecl)); |
|
542 m_sHandler.insert("group/memberdecl/classes", |
|
543 new StartElementHandlerSection(this,LayoutDocEntry::GroupClasses,&LayoutParser::startSectionEntry, |
|
544 vhdlOpt ? VhdlDocGen::trVhdlType(VhdlDocGen::ARCHITECTURE,FALSE) : |
|
545 fortranOpt ? theTranslator->trDataTypes() : |
|
546 theTranslator->trCompounds() |
|
547 )); |
|
548 m_sHandler.insert("group/memberdecl/namespaces", |
|
549 new StartElementHandlerSection(this,LayoutDocEntry::GroupNamespaces,&LayoutParser::startSectionEntry, |
|
550 javaOpt ? theTranslator->trPackages() : |
|
551 fortranOpt ? theTranslator->trModules() : |
|
552 theTranslator->trNamespaces() |
|
553 )); |
|
554 m_sHandler.insert("group/memberdecl/dirs", |
|
555 new StartElementHandlerSection(this,LayoutDocEntry::GroupDirs,&LayoutParser::startSectionEntry, |
|
556 theTranslator->trDirectories() |
|
557 )); |
|
558 m_sHandler.insert("group/memberdecl/nestedgroups", |
|
559 new StartElementHandlerSection(this,LayoutDocEntry::GroupNestedGroups,&LayoutParser::startSectionEntry, |
|
560 theTranslator->trModules() |
|
561 )); |
|
562 m_sHandler.insert("group/memberdecl/files", |
|
563 new StartElementHandlerSection(this,LayoutDocEntry::GroupFiles,&LayoutParser::startSectionEntry, |
|
564 theTranslator->trFile(TRUE,FALSE) |
|
565 )); |
|
566 |
|
567 m_sHandler.insert("group/memberdecl/defines", |
|
568 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
569 MemberList::decDefineMembers,theTranslator->trDefines())); |
|
570 m_sHandler.insert("group/memberdecl/typedefs", |
|
571 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
572 MemberList::decTypedefMembers,theTranslator->trTypedefs())); |
|
573 m_sHandler.insert("group/memberdecl/enums", |
|
574 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
575 MemberList::decEnumMembers,theTranslator->trEnumerations())); |
|
576 m_sHandler.insert("group/memberdecl/enumvalues", |
|
577 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
578 MemberList::decEnumValMembers,theTranslator->trEnumerationValues())); |
|
579 m_sHandler.insert("group/memberdecl/functions", |
|
580 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
581 MemberList::decFuncMembers, |
|
582 fortranOpt ? theTranslator->trSubprograms() : |
|
583 vhdlOpt ? VhdlDocGen::trFunctionAndProc() : |
|
584 theTranslator->trFunctions())); |
|
585 m_sHandler.insert("group/memberdecl/variables", |
|
586 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
587 MemberList::decVarMembers,theTranslator->trVariables())); |
|
588 m_sHandler.insert("group/memberdecl/signals", |
|
589 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
590 MemberList::decSignalMembers,theTranslator->trSignals())); |
|
591 m_sHandler.insert("group/memberdecl/publicslots", |
|
592 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
593 MemberList::decPubSlotMembers,theTranslator->trPublicSlots())); |
|
594 m_sHandler.insert("group/memberdecl/protectedslots", |
|
595 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
596 MemberList::decProSlotMembers,theTranslator->trProtectedSlots())); |
|
597 m_sHandler.insert("group/memberdecl/privateslots", |
|
598 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
599 MemberList::decPriSlotMembers,theTranslator->trPrivateSlots())); |
|
600 m_sHandler.insert("group/memberdecl/events", |
|
601 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
602 MemberList::decEventMembers,theTranslator->trEvents())); |
|
603 m_sHandler.insert("group/memberdecl/properties", |
|
604 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
605 MemberList::decPropMembers,theTranslator->trProperties())); |
|
606 m_sHandler.insert("group/memberdecl/friends", |
|
607 new StartElementHandlerMember(this,&LayoutParser::startMemberDeclEntry, |
|
608 MemberList::decFriendMembers,theTranslator->trFriends())); |
|
609 m_eHandler.insert("group/memberdecl", |
|
610 new EndElementHandler(this,&LayoutParser::endMemberDecl)); |
|
611 m_sHandler.insert("group/memberdef", |
|
612 new StartElementHandler(this,&LayoutParser::startMemberDef)); |
|
613 m_sHandler.insert("group/memberdef/pagedocs", |
|
614 new StartElementHandlerKind(this,LayoutDocEntry::GroupPageDocs,&LayoutParser::startSimpleEntry)); |
|
615 m_sHandler.insert("group/memberdef/defines", |
|
616 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
617 MemberList::docDefineMembers,theTranslator->trDefineDocumentation())); |
|
618 m_sHandler.insert("group/memberdef/typedefs", |
|
619 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
620 MemberList::docTypedefMembers,theTranslator->trTypedefDocumentation())); |
|
621 m_sHandler.insert("group/memberdef/enums", |
|
622 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
623 MemberList::docEnumMembers,theTranslator->trEnumerationTypeDocumentation())); |
|
624 m_sHandler.insert("group/memberdef/enumvalues", |
|
625 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
626 MemberList::docEnumValMembers,theTranslator->trEnumerationValueDocumentation())); |
|
627 m_sHandler.insert("group/memberdef/functions", |
|
628 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
629 MemberList::docFuncMembers, |
|
630 fortranOpt? |
|
631 theTranslator->trSubprogramDocumentation(): |
|
632 theTranslator->trFunctionDocumentation())); |
|
633 m_sHandler.insert("group/memberdef/variables", |
|
634 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
635 MemberList::docVarMembers,theTranslator->trVariableDocumentation())); |
|
636 m_sHandler.insert("group/memberdef/signals", |
|
637 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
638 MemberList::docSignalMembers,theTranslator->trSignals())); |
|
639 m_sHandler.insert("group/memberdef/publicslots", |
|
640 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
641 MemberList::docPubSlotMembers,theTranslator->trPublicSlots())); |
|
642 m_sHandler.insert("group/memberdef/protectedslots", |
|
643 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
644 MemberList::docProSlotMembers,theTranslator->trProtectedSlots())); |
|
645 m_sHandler.insert("group/memberdef/privateslots", |
|
646 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
647 MemberList::docPriSlotMembers,theTranslator->trPrivateSlots())); |
|
648 m_sHandler.insert("group/memberdef/events", |
|
649 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
650 MemberList::docEventMembers,theTranslator->trEvents())); |
|
651 m_sHandler.insert("group/memberdef/properties", |
|
652 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
653 MemberList::docPropMembers,theTranslator->trProperties())); |
|
654 m_sHandler.insert("group/memberdef/friends", |
|
655 new StartElementHandlerMember(this,&LayoutParser::startMemberDefEntry, |
|
656 MemberList::docFriendMembers,theTranslator->trFriends())); |
|
657 m_eHandler.insert("group/memberdef", |
|
658 new EndElementHandler(this,&LayoutParser::endMemberDef)); |
|
659 m_eHandler.insert("group", |
|
660 new EndElementHandler(this,&LayoutParser::endGroup)); |
|
661 |
|
662 // directory layout handlers |
|
663 m_sHandler.insert("directory", |
|
664 new StartElementHandler(this,&LayoutParser::startDirectory)); |
|
665 m_sHandler.insert("directory/briefdescription", |
|
666 new StartElementHandlerKind(this,LayoutDocEntry::BriefDesc,&LayoutParser::startSimpleEntry)); |
|
667 m_sHandler.insert("directory/detaileddescription", |
|
668 new StartElementHandlerSection(this,LayoutDocEntry::DetailedDesc,&LayoutParser::startSectionEntry, |
|
669 theTranslator->trDetailedDescription())); |
|
670 m_sHandler.insert("directory/directorygraph", |
|
671 new StartElementHandlerKind(this,LayoutDocEntry::DirGraph,&LayoutParser::startSimpleEntry)); |
|
672 m_sHandler.insert("directory/memberdecl", |
|
673 new StartElementHandler(this,&LayoutParser::startMemberDecl)); |
|
674 m_sHandler.insert("directory/memberdecl/dirs", |
|
675 new StartElementHandlerKind(this,LayoutDocEntry::DirSubDirs,&LayoutParser::startSimpleEntry)); |
|
676 m_sHandler.insert("directory/memberdecl/files", |
|
677 new StartElementHandlerKind(this,LayoutDocEntry::DirFiles,&LayoutParser::startSimpleEntry)); |
|
678 m_eHandler.insert("directory/memberdecl", |
|
679 new EndElementHandler(this,&LayoutParser::endMemberDecl)); |
|
680 m_eHandler.insert("directory", |
|
681 new EndElementHandler(this,&LayoutParser::endDirectory)); |
|
682 } |
|
683 |
|
684 void startSimpleEntry(LayoutDocEntry::Kind k,const QXmlAttributes &attrib) |
|
685 { |
|
686 bool isVisible = elemIsVisible(attrib); |
|
687 if (m_part!=-1 && isVisible) |
|
688 { |
|
689 LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, |
|
690 new LayoutDocEntrySimple(k)); |
|
691 } |
|
692 } |
|
693 |
|
694 void startSectionEntry(LayoutDocEntry::Kind k,const QXmlAttributes &attrib, |
|
695 const QCString &title) |
|
696 { |
|
697 bool isVisible = elemIsVisible(attrib); |
|
698 QCString userTitle = convertToQCString(attrib.value("title")); |
|
699 //printf("startSectionEntry: title='%s' userTitle='%s'\n", |
|
700 // title.data(),userTitle.data()); |
|
701 if (userTitle.isEmpty()) userTitle = title; |
|
702 if (m_part!=-1 && isVisible) |
|
703 { |
|
704 LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, |
|
705 new LayoutDocEntrySection(k,userTitle)); |
|
706 } |
|
707 } |
|
708 |
|
709 |
|
710 void startMemberDeclEntry(const QXmlAttributes &attrib,MemberList::ListType type, |
|
711 const QCString &title,const QCString &subscript) |
|
712 { |
|
713 //QCString visible = convertToQCString(attrib.value("visible")); |
|
714 //bool isVisible = visible.isEmpty() || (visible!="no" && visible!="0"); |
|
715 QCString userTitle = convertToQCString(attrib.value("title")); |
|
716 QCString userSubscript = convertToQCString(attrib.value("subtitle")); |
|
717 if (userTitle.isEmpty()) userTitle = title; |
|
718 if (userSubscript.isEmpty()) userSubscript = subscript; |
|
719 //printf("memberdecl: %s\n",userTitle.data()); |
|
720 if (m_part!=-1 /*&& isVisible*/) |
|
721 { |
|
722 LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, |
|
723 new LayoutDocEntryMemberDecl(type,userTitle,userSubscript)); |
|
724 } |
|
725 } |
|
726 |
|
727 void startMemberDefEntry(const QXmlAttributes &attrib,MemberList::ListType type, |
|
728 const QCString &title,const QCString &) |
|
729 { |
|
730 QCString userTitle = convertToQCString(attrib.value("title")); |
|
731 if (userTitle.isEmpty()) userTitle = title; |
|
732 //printf("memberdef: %s\n",userTitle.data()); |
|
733 if (m_part!=-1 /*&& isVisible*/) |
|
734 { |
|
735 LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, |
|
736 new LayoutDocEntryMemberDef(type,userTitle)); |
|
737 } |
|
738 } |
|
739 |
|
740 void startLayout(const QXmlAttributes &) |
|
741 { |
|
742 } |
|
743 |
|
744 void endLayout() |
|
745 { |
|
746 } |
|
747 |
|
748 void startNavIndex(const QXmlAttributes &) |
|
749 { |
|
750 m_scope="navindex/"; |
|
751 m_rootNav = LayoutDocManager::instance().rootNavEntry(); |
|
752 m_rootNav->clear(); |
|
753 } |
|
754 |
|
755 void endNavIndex() |
|
756 { |
|
757 m_scope=""; |
|
758 if (!m_rootNav->find(LayoutNavEntry::MainPage)) |
|
759 { |
|
760 // no MainPage node... add one the first item of the root node... |
|
761 new LayoutNavEntry(m_rootNav,LayoutNavEntry::MainPage, TRUE, |
|
762 Config_getBool("GENERATE_TREEVIEW") ? "main" : "index", |
|
763 theTranslator->trMainPage(),TRUE); |
|
764 } |
|
765 } |
|
766 |
|
767 void startNavEntry(const QXmlAttributes &attrib) |
|
768 { |
|
769 bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); |
|
770 bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); |
|
771 bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); |
|
772 static struct NavEntryMap |
|
773 { |
|
774 const char *typeStr; // type attribute name in the XML file |
|
775 LayoutNavEntry::Kind kind; // corresponding enum name |
|
776 QCString mainName; // default title for an item if it has children |
|
777 QCString subName; // optional name for an item if it is rendered as a child |
|
778 QCString baseFile; // base name of the file containing the index page |
|
779 } mapping[] = |
|
780 { |
|
781 { "mainpage", LayoutNavEntry::MainPage, theTranslator->trMainPage(), QCString(), Config_getBool("GENERATE_TREEVIEW") ? "main" : "index" }, |
|
782 { "pages", LayoutNavEntry::Pages, theTranslator->trRelatedPages(), QCString(), "pages" }, |
|
783 { "modules", LayoutNavEntry::Modules, theTranslator->trModules(), QCString(), "modules" }, |
|
784 { "namespaces", LayoutNavEntry::Namespaces, javaOpt ? theTranslator->trPackages() : |
|
785 fortranOpt ? theTranslator->trModules() : |
|
786 theTranslator->trNamespaces(), |
|
787 javaOpt ? theTranslator->trPackages() : |
|
788 fortranOpt ? theTranslator->trModulesList() : |
|
789 theTranslator->trNamespaceList(), "namespaces" }, |
|
790 { "namespacemembers", LayoutNavEntry::NamespaceMembers, javaOpt ? theTranslator->trPackageMembers() : |
|
791 fortranOpt ? theTranslator->trModulesMembers() : |
|
792 theTranslator->trNamespaceMembers(), QCString(), "namespacemembers" }, |
|
793 { "classindex", LayoutNavEntry::Classes, fortranOpt ? theTranslator->trDataTypes() : |
|
794 vhdlOpt ? VhdlDocGen::trDesignUnits() : |
|
795 theTranslator->trCompoundIndex(), |
|
796 QCString(), "classes" }, |
|
797 { "classes", LayoutNavEntry::ClassAnnotated, fortranOpt ? theTranslator->trCompoundListFortran() : |
|
798 vhdlOpt ? VhdlDocGen::trDesignUnitList() : |
|
799 theTranslator->trClasses(), |
|
800 theTranslator->trCompoundList(), "annotated" }, |
|
801 { "hierarchy", LayoutNavEntry::ClassHierarchy, vhdlOpt ? VhdlDocGen::trDesignUnitHierarchy() : |
|
802 theTranslator->trClassHierarchy(), QCString(), "hierarchy" }, |
|
803 { "classmembers", LayoutNavEntry::ClassMembers, fortranOpt ? theTranslator->trCompoundMembersFortran() : |
|
804 vhdlOpt ? VhdlDocGen::trDesignUnitMembers() : |
|
805 theTranslator->trCompoundMembers(), QCString(), "functions" }, |
|
806 { "files", LayoutNavEntry::Files, theTranslator->trFile(TRUE,FALSE), |
|
807 theTranslator->trFileList(), "files" }, |
|
808 { "globals", LayoutNavEntry::FileGlobals, theTranslator->trFileMembers(), QCString(), "globals" }, |
|
809 { "dirs", LayoutNavEntry::Dirs, theTranslator->trDirectories(), QCString(), "dirs" }, |
|
810 { "examples", LayoutNavEntry::Examples, theTranslator->trExamples(), QCString(), "examples" }, |
|
811 { 0, (LayoutNavEntry::Kind)0, QCString(), QCString(), QCString() } |
|
812 }; |
|
813 LayoutNavEntry::Kind kind; |
|
814 // find type in the table |
|
815 int i=0; |
|
816 QString type = attrib.value("type"); |
|
817 while (mapping[i].typeStr) |
|
818 { |
|
819 if (mapping[i].typeStr==type) |
|
820 { |
|
821 kind = mapping[i].kind; |
|
822 break; |
|
823 } |
|
824 i++; |
|
825 } |
|
826 if (mapping[i].typeStr==0) |
|
827 { |
|
828 if (type.isEmpty()) |
|
829 { |
|
830 err("Warning: an entry tag within a navindex has no type attribute! Check your layout file!\n"); |
|
831 } |
|
832 else |
|
833 { |
|
834 err("Warning: the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n"); |
|
835 } |
|
836 return; |
|
837 } |
|
838 QCString baseFile = mapping[i].baseFile; |
|
839 QCString title = convertToQCString(attrib.value("title")); |
|
840 bool isVisible = elemIsVisible(attrib); |
|
841 if (title.isEmpty()) // use default title |
|
842 { |
|
843 title = mapping[i].mainName; // use title for main row |
|
844 if (m_rootNav!=LayoutDocManager::instance().rootNavEntry() && !mapping[i].subName.isEmpty()) |
|
845 { |
|
846 title = mapping[i].subName; // if this is a child of another row, use the subName if available |
|
847 // this is mainly done to get compatible naming with older versions. |
|
848 } |
|
849 } |
|
850 // create new item and make it the new root |
|
851 m_rootNav = new LayoutNavEntry(m_rootNav,kind,kind==LayoutNavEntry::MainPage?TRUE:isVisible,baseFile,title); |
|
852 } |
|
853 |
|
854 void endNavEntry() |
|
855 { |
|
856 // set the root back to the parent |
|
857 m_rootNav = m_rootNav->parent(); |
|
858 } |
|
859 |
|
860 void startClass(const QXmlAttributes &) |
|
861 { |
|
862 LayoutDocManager::instance().clear(LayoutDocManager::Class); |
|
863 m_scope="class/"; |
|
864 m_part = (int)LayoutDocManager::Class; |
|
865 } |
|
866 |
|
867 void endClass() |
|
868 { |
|
869 m_scope=""; |
|
870 m_part = -1; |
|
871 } |
|
872 |
|
873 void startNamespace(const QXmlAttributes &) |
|
874 { |
|
875 LayoutDocManager::instance().clear(LayoutDocManager::Namespace); |
|
876 m_scope="namespace/"; |
|
877 m_part = (int)LayoutDocManager::Namespace; |
|
878 } |
|
879 |
|
880 void endNamespace() |
|
881 { |
|
882 m_scope=""; |
|
883 m_part = -1; |
|
884 } |
|
885 |
|
886 void startFile(const QXmlAttributes &) |
|
887 { |
|
888 LayoutDocManager::instance().clear(LayoutDocManager::File); |
|
889 m_scope="file/"; |
|
890 m_part = (int)LayoutDocManager::File; |
|
891 } |
|
892 |
|
893 void endFile() |
|
894 { |
|
895 m_scope=""; |
|
896 m_part = -1; |
|
897 } |
|
898 |
|
899 void startGroup(const QXmlAttributes &) |
|
900 { |
|
901 LayoutDocManager::instance().clear(LayoutDocManager::Group); |
|
902 m_scope="group/"; |
|
903 m_part = (int)LayoutDocManager::Group; |
|
904 } |
|
905 |
|
906 void endGroup() |
|
907 { |
|
908 m_scope=""; |
|
909 m_part = -1; |
|
910 } |
|
911 |
|
912 void startDirectory(const QXmlAttributes &) |
|
913 { |
|
914 LayoutDocManager::instance().clear(LayoutDocManager::Directory); |
|
915 m_scope="directory/"; |
|
916 m_part = (int)LayoutDocManager::Directory; |
|
917 } |
|
918 |
|
919 void endDirectory() |
|
920 { |
|
921 m_scope=""; |
|
922 m_part = -1; |
|
923 } |
|
924 |
|
925 void startMemberDef(const QXmlAttributes &) |
|
926 { |
|
927 m_scope+="memberdef/"; |
|
928 if (m_part!=-1) |
|
929 { |
|
930 LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, |
|
931 new LayoutDocEntrySimple(LayoutDocEntry::MemberDefStart)); |
|
932 } |
|
933 } |
|
934 |
|
935 void endMemberDef() |
|
936 { |
|
937 int i=m_scope.findRev("memberdef/"); |
|
938 if (i!=-1) |
|
939 { |
|
940 m_scope=m_scope.left(i); |
|
941 if (m_part!=-1) |
|
942 { |
|
943 LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, |
|
944 new LayoutDocEntrySimple(LayoutDocEntry::MemberDefEnd)); |
|
945 } |
|
946 } |
|
947 } |
|
948 |
|
949 void startMemberDecl(const QXmlAttributes &) |
|
950 { |
|
951 m_scope+="memberdecl/"; |
|
952 if (m_part!=-1) |
|
953 { |
|
954 LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, |
|
955 new LayoutDocEntrySimple(LayoutDocEntry::MemberDeclStart)); |
|
956 } |
|
957 } |
|
958 |
|
959 void endMemberDecl() |
|
960 { |
|
961 int i=m_scope.findRev("memberdecl/"); |
|
962 if (i!=-1) |
|
963 { |
|
964 m_scope=m_scope.left(i); |
|
965 if (m_part!=-1) |
|
966 { |
|
967 LayoutDocManager::instance().addEntry((LayoutDocManager::LayoutPart)m_part, |
|
968 new LayoutDocEntrySimple(LayoutDocEntry::MemberDeclEnd)); |
|
969 } |
|
970 } |
|
971 } |
|
972 |
|
973 // reimplemented from QXmlDefaultHandler |
|
974 bool startElement( const QString&, const QString&, |
|
975 const QString& name, const QXmlAttributes& attrib ) |
|
976 { |
|
977 //printf("startElement [%s]::[%s]\n",m_scope.data(),name.data()); |
|
978 StartElementHandler *handler = m_sHandler[m_scope+name]; |
|
979 if (handler) |
|
980 { |
|
981 (*handler)(attrib); |
|
982 } |
|
983 else |
|
984 { |
|
985 err("Warning: Unexpected start tag `%s' found in scope='%s'!\n", |
|
986 name.data(),m_scope.data()); |
|
987 } |
|
988 return TRUE; |
|
989 } |
|
990 bool endElement( const QString&, const QString&, const QString& name ) |
|
991 { |
|
992 //printf("endElement [%s]::[%s]\n",m_scope.data(),name.data()); |
|
993 EndElementHandler *handler; |
|
994 if (!m_scope.isEmpty() && m_scope.right(name.length()+1)==name+"/") |
|
995 { // element ends current scope |
|
996 handler = m_eHandler[m_scope.left(m_scope.length()-1)]; |
|
997 } |
|
998 else // continue with current scope |
|
999 { |
|
1000 handler = m_eHandler[m_scope+name]; |
|
1001 } |
|
1002 if (handler) |
|
1003 { |
|
1004 (*handler)(); |
|
1005 } |
|
1006 return TRUE; |
|
1007 } |
|
1008 bool startDocument() |
|
1009 { |
|
1010 return TRUE; |
|
1011 } |
|
1012 |
|
1013 private: |
|
1014 LayoutParser() : m_sHandler(163), m_eHandler(17) { } |
|
1015 |
|
1016 QDict<StartElementHandler> m_sHandler; |
|
1017 QDict<EndElementHandler> m_eHandler; |
|
1018 QString m_scope; |
|
1019 int m_part; |
|
1020 LayoutNavEntry *m_rootNav; |
|
1021 }; |
|
1022 |
|
1023 //--------------------------------------------------------------------------------- |
|
1024 |
|
1025 class LayoutErrorHandler : public QXmlErrorHandler |
|
1026 { |
|
1027 public: |
|
1028 bool warning( const QXmlParseException &exception ) |
|
1029 { |
|
1030 err("Warning at line %d column %d: %s\n", |
|
1031 exception.lineNumber(),exception.columnNumber(), |
|
1032 exception.message().data()); |
|
1033 return FALSE; |
|
1034 } |
|
1035 bool error( const QXmlParseException &exception ) |
|
1036 { |
|
1037 err("Error at line %d column %d: %s\n", |
|
1038 exception.lineNumber(),exception.columnNumber(), |
|
1039 exception.message().data()); |
|
1040 return FALSE; |
|
1041 } |
|
1042 bool fatalError( const QXmlParseException &exception ) |
|
1043 { |
|
1044 err("Fatal error at line %d column %d: %s\n", |
|
1045 exception.lineNumber(),exception.columnNumber(), |
|
1046 exception.message().data()); |
|
1047 return FALSE; |
|
1048 } |
|
1049 QString errorString() { return ""; } |
|
1050 |
|
1051 private: |
|
1052 QString errorMsg; |
|
1053 }; |
|
1054 |
|
1055 //--------------------------------------------------------------------------------- |
|
1056 |
|
1057 class LayoutDocManager::Private |
|
1058 { |
|
1059 public: |
|
1060 QList<LayoutDocEntry> docEntries[LayoutDocManager::NrParts]; |
|
1061 LayoutNavEntry *rootNav; |
|
1062 }; |
|
1063 |
|
1064 LayoutDocManager::LayoutDocManager() |
|
1065 { |
|
1066 d = new Private; |
|
1067 int i; |
|
1068 for (i=0;i<LayoutDocManager::NrParts;i++) |
|
1069 { |
|
1070 d->docEntries[i].setAutoDelete(TRUE); |
|
1071 } |
|
1072 d->rootNav = new LayoutNavEntry; |
|
1073 LayoutParser::instance().init(); |
|
1074 } |
|
1075 |
|
1076 |
|
1077 void LayoutDocManager::init() |
|
1078 { |
|
1079 // parse the default layout |
|
1080 LayoutErrorHandler errorHandler; |
|
1081 QXmlInputSource source; |
|
1082 source.setData( layout_default ); |
|
1083 QXmlSimpleReader reader; |
|
1084 reader.setContentHandler( &LayoutParser::instance() ); |
|
1085 reader.setErrorHandler( &errorHandler ); |
|
1086 reader.parse( source ); |
|
1087 } |
|
1088 |
|
1089 LayoutDocManager::~LayoutDocManager() |
|
1090 { |
|
1091 delete d->rootNav; |
|
1092 delete d; |
|
1093 } |
|
1094 |
|
1095 LayoutDocManager & LayoutDocManager::instance() |
|
1096 { |
|
1097 static LayoutDocManager *theInstance = new LayoutDocManager; |
|
1098 return *theInstance; |
|
1099 } |
|
1100 |
|
1101 const QList<LayoutDocEntry> &LayoutDocManager::docEntries(LayoutDocManager::LayoutPart part) const |
|
1102 { |
|
1103 return d->docEntries[(int)part]; |
|
1104 } |
|
1105 |
|
1106 LayoutNavEntry* LayoutDocManager::rootNavEntry() const |
|
1107 { |
|
1108 return d->rootNav; |
|
1109 } |
|
1110 |
|
1111 void LayoutDocManager::addEntry(LayoutDocManager::LayoutPart p,LayoutDocEntry *e) |
|
1112 { |
|
1113 d->docEntries[(int)p].append(e); |
|
1114 } |
|
1115 |
|
1116 void LayoutDocManager::clear(LayoutDocManager::LayoutPart p) |
|
1117 { |
|
1118 d->docEntries[(int)p].clear(); |
|
1119 } |
|
1120 |
|
1121 void LayoutDocManager::parse(QTextStream &t) |
|
1122 { |
|
1123 LayoutErrorHandler errorHandler; |
|
1124 QXmlInputSource source( t ); |
|
1125 QXmlSimpleReader reader; |
|
1126 reader.setContentHandler( &LayoutParser::instance() ); |
|
1127 reader.setErrorHandler( &errorHandler ); |
|
1128 reader.parse( source ); |
|
1129 } |
|
1130 |
|
1131 //--------------------------------------------------------------------------------- |
|
1132 |
|
1133 void writeDefaultLayoutFile(const char *fileName) |
|
1134 { |
|
1135 QFile f(fileName); |
|
1136 if (!f.open(IO_WriteOnly)) |
|
1137 { |
|
1138 err("Failed to open file %s for writing!\n",fileName); |
|
1139 return; |
|
1140 } |
|
1141 QTextStream t(&f); |
|
1142 t << layout_default; |
|
1143 } |