Root/
Source at commit 1322 created 12 years 8 months ago. By meklort, Add doxygen to utils folder | |
---|---|
1 | /******************************************************************************␊ |
2 | *␊ |
3 | * $Id: namespacedef.cpp,v 1.27 2001/03/19 19:27:41 root Exp $␊ |
4 | *␊ |
5 | * Copyright (C) 1997-2011 by Dimitri van Heesch.␊ |
6 | *␊ |
7 | * Permission to use, copy, modify, and distribute this software and its␊ |
8 | * documentation under the terms of the GNU General Public License is hereby ␊ |
9 | * granted. No representations are made about the suitability of this software ␊ |
10 | * for any purpose. It is provided "as is" without express or implied warranty.␊ |
11 | * See the GNU General Public License for more details.␊ |
12 | *␊ |
13 | * Documents produced by Doxygen are derivative works derived from the␊ |
14 | * input used in their production; they are not affected by this license.␊ |
15 | *␊ |
16 | */␊ |
17 | ␊ |
18 | #include "qtbc.h"␊ |
19 | #include "namespacedef.h"␊ |
20 | #include "outputlist.h"␊ |
21 | #include "util.h"␊ |
22 | #include "language.h"␊ |
23 | #include "classdef.h"␊ |
24 | #include "classlist.h"␊ |
25 | #include "memberlist.h"␊ |
26 | #include "doxygen.h"␊ |
27 | #include "message.h"␊ |
28 | #include "docparser.h"␊ |
29 | #include "searchindex.h"␊ |
30 | #include "vhdldocgen.h"␊ |
31 | #include "layout.h"␊ |
32 | ␊ |
33 | //------------------------------------------------------------------␊ |
34 | ␊ |
35 | NamespaceDef::NamespaceDef(const char *df,int dl,␊ |
36 | const char *name,const char *lref,␊ |
37 | const char *fName) : ␊ |
38 | Definition(df,dl,name)␊ |
39 | {␊ |
40 | if (fName)␊ |
41 | {␊ |
42 | fileName = stripExtension(fName);␊ |
43 | }␊ |
44 | else␊ |
45 | {␊ |
46 | fileName="namespace";␊ |
47 | fileName+=name;␊ |
48 | }␊ |
49 | classSDict = new ClassSDict(17);␊ |
50 | namespaceSDict = new NamespaceSDict(17);␊ |
51 | m_innerCompounds = new SDict<Definition>(17);␊ |
52 | usingDirList = 0;␊ |
53 | usingDeclList = 0;␊ |
54 | m_allMembersDict = 0;␊ |
55 | setReference(lref);␊ |
56 | memberGroupSDict = new MemberGroupSDict;␊ |
57 | memberGroupSDict->setAutoDelete(TRUE);␊ |
58 | visited=FALSE;␊ |
59 | m_subGrouping=Config_getBool("SUBGROUPING");␊ |
60 | m_isCSharp = df && getLanguageFromFileName(df)==SrcLangExt_CSharp;␊ |
61 | }␊ |
62 | ␊ |
63 | NamespaceDef::~NamespaceDef()␊ |
64 | {␊ |
65 | delete classSDict;␊ |
66 | delete namespaceSDict;␊ |
67 | delete m_innerCompounds;␊ |
68 | delete usingDirList;␊ |
69 | delete usingDeclList;␊ |
70 | delete memberGroupSDict;␊ |
71 | }␊ |
72 | ␊ |
73 | void NamespaceDef::distributeMemberGroupDocumentation()␊ |
74 | {␊ |
75 | MemberGroupSDict::Iterator mgli(*memberGroupSDict);␊ |
76 | MemberGroup *mg;␊ |
77 | for (;(mg=mgli.current());++mgli)␊ |
78 | {␊ |
79 | mg->distributeMemberGroupDocumentation();␊ |
80 | }␊ |
81 | }␊ |
82 | ␊ |
83 | void NamespaceDef::findSectionsInDocumentation()␊ |
84 | {␊ |
85 | docFindSections(documentation(),this,0,docFile());␊ |
86 | MemberGroupSDict::Iterator mgli(*memberGroupSDict);␊ |
87 | MemberGroup *mg;␊ |
88 | for (;(mg=mgli.current());++mgli)␊ |
89 | {␊ |
90 | mg->findSectionsInDocumentation();␊ |
91 | }␊ |
92 | QListIterator<MemberList> mli(m_memberLists);␊ |
93 | MemberList *ml;␊ |
94 | for (mli.toFirst();(ml=mli.current());++mli)␊ |
95 | {␊ |
96 | if (ml->listType()&MemberList::declarationLists)␊ |
97 | {␊ |
98 | ml->findSectionsInDocumentation();␊ |
99 | }␊ |
100 | }␊ |
101 | }␊ |
102 | ␊ |
103 | void NamespaceDef::insertUsedFile(const char *f)␊ |
104 | {␊ |
105 | if (files.find(f)==-1) ␊ |
106 | {␊ |
107 | if (Config_getBool("SORT_MEMBER_DOCS"))␊ |
108 | files.inSort(f);␊ |
109 | else␊ |
110 | files.append(f);␊ |
111 | }␊ |
112 | }␊ |
113 | ␊ |
114 | void NamespaceDef::addInnerCompound(Definition *d)␊ |
115 | {␊ |
116 | m_innerCompounds->append(d->localName(),d);␊ |
117 | if (d->definitionType()==Definition::TypeNamespace)␊ |
118 | {␊ |
119 | insertNamespace((NamespaceDef *)d);␊ |
120 | }␊ |
121 | else if (d->definitionType()==Definition::TypeClass)␊ |
122 | {␊ |
123 | insertClass((ClassDef *)d);␊ |
124 | }␊ |
125 | }␊ |
126 | ␊ |
127 | void NamespaceDef::insertClass(ClassDef *cd)␊ |
128 | {␊ |
129 | if (classSDict->find(cd->name())==0)␊ |
130 | {␊ |
131 | if (Config_getBool("SORT_BRIEF_DOCS"))␊ |
132 | classSDict->inSort(cd->name(),cd);␊ |
133 | else␊ |
134 | classSDict->append(cd->name(),cd);␊ |
135 | }␊ |
136 | }␊ |
137 | ␊ |
138 | void NamespaceDef::insertNamespace(NamespaceDef *nd)␊ |
139 | {␊ |
140 | if (namespaceSDict->find(nd->name())==0)␊ |
141 | {␊ |
142 | if (Config_getBool("SORT_MEMBER_DOCS"))␊ |
143 | namespaceSDict->inSort(nd->name(),nd);␊ |
144 | else␊ |
145 | namespaceSDict->append(nd->name(),nd);␊ |
146 | }␊ |
147 | }␊ |
148 | ␊ |
149 | ␊ |
150 | void NamespaceDef::addMembersToMemberGroup()␊ |
151 | {␊ |
152 | QListIterator<MemberList> mli(m_memberLists);␊ |
153 | MemberList *ml;␊ |
154 | for (mli.toFirst();(ml=mli.current());++mli)␊ |
155 | {␊ |
156 | if (ml->listType()&MemberList::declarationLists)␊ |
157 | {␊ |
158 | ::addMembersToMemberGroup(ml,&memberGroupSDict,this);␊ |
159 | }␊ |
160 | }␊ |
161 | ␊ |
162 | // add members inside sections to their groups␊ |
163 | if (memberGroupSDict)␊ |
164 | {␊ |
165 | MemberGroupSDict::Iterator mgli(*memberGroupSDict);␊ |
166 | MemberGroup *mg;␊ |
167 | for (;(mg=mgli.current());++mgli)␊ |
168 | {␊ |
169 | if (mg->allMembersInSameSection() && m_subGrouping)␊ |
170 | {␊ |
171 | //printf("----> addToDeclarationSection(%s)\n",mg->header().data());␊ |
172 | mg->addToDeclarationSection();␊ |
173 | }␊ |
174 | }␊ |
175 | }␊ |
176 | }␊ |
177 | ␊ |
178 | void NamespaceDef::insertMember(MemberDef *md)␊ |
179 | {␊ |
180 | if (md->isHidden()) return;␊ |
181 | MemberList *allMemberList = getMemberList(MemberList::allMembersList);␊ |
182 | if (allMemberList==0)␊ |
183 | {␊ |
184 | allMemberList = new MemberList(MemberList::allMembersList);␊ |
185 | m_memberLists.append(allMemberList);␊ |
186 | }␊ |
187 | allMemberList->append(md); ␊ |
188 | if (m_allMembersDict==0)␊ |
189 | {␊ |
190 | m_allMembersDict = new MemberSDict;␊ |
191 | }␊ |
192 | //printf("%s::m_allMembersDict->append(%s)\n",name().data(),md->localName().data());␊ |
193 | m_allMembersDict->append(md->localName(),md); ␊ |
194 | //::addNamespaceMemberNameToIndex(md);␊ |
195 | //static bool sortBriefDocs=Config_getBool("SORT_BRIEF_DOCS");␊ |
196 | switch(md->memberType())␊ |
197 | {␊ |
198 | case MemberDef::Variable: ␊ |
199 | addMemberToList(MemberList::decVarMembers,md);␊ |
200 | addMemberToList(MemberList::docVarMembers,md);␊ |
201 | break;␊ |
202 | case MemberDef::Function: ␊ |
203 | addMemberToList(MemberList::decFuncMembers,md);␊ |
204 | addMemberToList(MemberList::docFuncMembers,md);␊ |
205 | break;␊ |
206 | case MemberDef::Typedef: ␊ |
207 | addMemberToList(MemberList::decTypedefMembers,md);␊ |
208 | addMemberToList(MemberList::docTypedefMembers,md);␊ |
209 | break;␊ |
210 | case MemberDef::Enumeration: ␊ |
211 | addMemberToList(MemberList::decEnumMembers,md);␊ |
212 | addMemberToList(MemberList::docEnumMembers,md);␊ |
213 | break;␊ |
214 | case MemberDef::EnumValue: ␊ |
215 | break;␊ |
216 | case MemberDef::Define: ␊ |
217 | addMemberToList(MemberList::decDefineMembers,md);␊ |
218 | addMemberToList(MemberList::docDefineMembers,md);␊ |
219 | break;␊ |
220 | default:␊ |
221 | err("NamespaceDef::insertMembers(): "␊ |
222 | "member `%s' with class scope `%s' inserted in namespace scope `%s'!\n",␊ |
223 | md->name().data(),␊ |
224 | md->getClassDef() ? md->getClassDef()->name().data() : "",␊ |
225 | name().data());␊ |
226 | }␊ |
227 | }␊ |
228 | ␊ |
229 | void NamespaceDef::computeAnchors()␊ |
230 | {␊ |
231 | MemberList *allMemberList = getMemberList(MemberList::allMembersList);␊ |
232 | if (allMemberList) setAnchors(0,'a',allMemberList);␊ |
233 | }␊ |
234 | ␊ |
235 | void NamespaceDef::writeDetailedDescription(OutputList &ol,const QCString &title)␊ |
236 | {␊ |
237 | if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) || ␊ |
238 | !documentation().isEmpty()␊ |
239 | )␊ |
240 | {␊ |
241 | ol.writeRuler();␊ |
242 | ol.pushGeneratorState();␊ |
243 | ol.disableAllBut(OutputGenerator::Html);␊ |
244 | ol.writeAnchor(0,"details"); ␊ |
245 | ol.popGeneratorState();␊ |
246 | ol.startGroupHeader();␊ |
247 | ol.parseText(title);␊ |
248 | ol.endGroupHeader();␊ |
249 | ␊ |
250 | ol.startTextBlock();␊ |
251 | if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))␊ |
252 | {␊ |
253 | ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);␊ |
254 | }␊ |
255 | if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&␊ |
256 | !documentation().isEmpty())␊ |
257 | {␊ |
258 | ol.pushGeneratorState();␊ |
259 | ol.disable(OutputGenerator::Man);␊ |
260 | ol.disable(OutputGenerator::RTF);␊ |
261 | //ol.newParagraph(); // FIXME:PARA␊ |
262 | ol.enableAll();␊ |
263 | ol.disableAllBut(OutputGenerator::Man);␊ |
264 | ol.writeString("\n\n");␊ |
265 | ol.popGeneratorState();␊ |
266 | }␊ |
267 | if (!documentation().isEmpty())␊ |
268 | {␊ |
269 | ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);␊ |
270 | }␊ |
271 | ol.endTextBlock();␊ |
272 | }␊ |
273 | }␊ |
274 | ␊ |
275 | void NamespaceDef::writeBriefDescription(OutputList &ol)␊ |
276 | {␊ |
277 | if (!briefDescription().isEmpty()) ␊ |
278 | {␊ |
279 | ol.startParagraph();␊ |
280 | ol.parseDoc(briefFile(),briefLine(),this,0,␊ |
281 | briefDescription(),TRUE,FALSE,0,TRUE,FALSE);␊ |
282 | ol.pushGeneratorState();␊ |
283 | ol.disable(OutputGenerator::RTF);␊ |
284 | ol.writeString(" \n");␊ |
285 | ol.enable(OutputGenerator::RTF);␊ |
286 | ␊ |
287 | if (Config_getBool("REPEAT_BRIEF") ||␊ |
288 | !documentation().isEmpty()␊ |
289 | )␊ |
290 | {␊ |
291 | ol.disableAllBut(OutputGenerator::Html);␊ |
292 | ol.startTextLink(0,"details");␊ |
293 | ol.parseText(theTranslator->trMore());␊ |
294 | ol.endTextLink();␊ |
295 | }␊ |
296 | ol.popGeneratorState();␊ |
297 | ol.endParagraph();␊ |
298 | ␊ |
299 | // FIXME:PARA␊ |
300 | //ol.pushGeneratorState();␊ |
301 | //ol.disable(OutputGenerator::RTF);␊ |
302 | //ol.newParagraph();␊ |
303 | //ol.popGeneratorState();␊ |
304 | }␊ |
305 | ol.writeSynopsis();␊ |
306 | }␊ |
307 | ␊ |
308 | void NamespaceDef::startMemberDeclarations(OutputList &ol)␊ |
309 | {␊ |
310 | ol.startMemberSections();␊ |
311 | }␊ |
312 | ␊ |
313 | void NamespaceDef::endMemberDeclarations(OutputList &ol)␊ |
314 | {␊ |
315 | ol.endMemberSections();␊ |
316 | }␊ |
317 | ␊ |
318 | void NamespaceDef::startMemberDocumentation(OutputList &ol)␊ |
319 | {␊ |
320 | if (Config_getBool("SEPARATE_MEMBER_PAGES"))␊ |
321 | {␊ |
322 | ol.disable(OutputGenerator::Html);␊ |
323 | Doxygen::suppressDocWarnings = TRUE;␊ |
324 | }␊ |
325 | }␊ |
326 | ␊ |
327 | void NamespaceDef::endMemberDocumentation(OutputList &ol)␊ |
328 | {␊ |
329 | if (Config_getBool("SEPARATE_MEMBER_PAGES"))␊ |
330 | {␊ |
331 | ol.enable(OutputGenerator::Html);␊ |
332 | Doxygen::suppressDocWarnings = FALSE;␊ |
333 | }␊ |
334 | }␊ |
335 | ␊ |
336 | void NamespaceDef::writeClassDeclarations(OutputList &ol,const QCString &title)␊ |
337 | {␊ |
338 | if (classSDict) classSDict->writeDeclaration(ol,0,title,TRUE);␊ |
339 | }␊ |
340 | ␊ |
341 | void NamespaceDef::writeNamespaceDeclarations(OutputList &ol,const QCString &title)␊ |
342 | {␊ |
343 | if (namespaceSDict) namespaceSDict->writeDeclaration(ol,title,TRUE);␊ |
344 | }␊ |
345 | ␊ |
346 | void NamespaceDef::writeMemberGroups(OutputList &ol)␊ |
347 | {␊ |
348 | /* write user defined member groups */␊ |
349 | if (memberGroupSDict)␊ |
350 | {␊ |
351 | memberGroupSDict->sort();␊ |
352 | MemberGroupSDict::Iterator mgli(*memberGroupSDict);␊ |
353 | MemberGroup *mg;␊ |
354 | for (;(mg=mgli.current());++mgli)␊ |
355 | {␊ |
356 | if ((!mg->allMembersInSameSection() || !m_subGrouping) ␊ |
357 | && mg->header()!="[NOHEADER]")␊ |
358 | {␊ |
359 | mg->writeDeclarations(ol,0,this,0,0);␊ |
360 | }␊ |
361 | }␊ |
362 | }␊ |
363 | }␊ |
364 | ␊ |
365 | void NamespaceDef::writeAuthorSection(OutputList &ol)␊ |
366 | {␊ |
367 | // write Author section (Man only)␊ |
368 | ol.pushGeneratorState();␊ |
369 | ol.disableAllBut(OutputGenerator::Man);␊ |
370 | ol.startGroupHeader();␊ |
371 | ol.parseText(theTranslator->trAuthor(TRUE,TRUE));␊ |
372 | ol.endGroupHeader();␊ |
373 | ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));␊ |
374 | ol.popGeneratorState();␊ |
375 | }␊ |
376 | ␊ |
377 | void NamespaceDef::writeSummaryLinks(OutputList &ol)␊ |
378 | {␊ |
379 | ol.pushGeneratorState();␊ |
380 | ol.disableAllBut(OutputGenerator::Html);␊ |
381 | QListIterator<LayoutDocEntry> eli(␊ |
382 | LayoutDocManager::instance().docEntries(LayoutDocManager::Namespace));␊ |
383 | LayoutDocEntry *lde;␊ |
384 | bool first=TRUE;␊ |
385 | for (eli.toFirst();(lde=eli.current());++eli)␊ |
386 | {␊ |
387 | if ((lde->kind()==LayoutDocEntry::NamespaceClasses && classSDict && classSDict->declVisible()) || ␊ |
388 | (lde->kind()==LayoutDocEntry::NamespaceNestedNamespaces && namespaceSDict && namespaceSDict->declVisible())␊ |
389 | )␊ |
390 | {␊ |
391 | LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;␊ |
392 | QCString label = lde->kind()==LayoutDocEntry::NamespaceClasses ? "nested-classes" : "namespaces";␊ |
393 | writeSummaryLink(ol,label,ls->title,first);␊ |
394 | }␊ |
395 | else if (lde->kind()== LayoutDocEntry::MemberDecl)␊ |
396 | {␊ |
397 | LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;␊ |
398 | MemberList * ml = getMemberList(lmd->type);␊ |
399 | if (ml && ml->declVisible())␊ |
400 | {␊ |
401 | writeSummaryLink(ol,ml->listTypeAsString(),lmd->title,first);␊ |
402 | }␊ |
403 | }␊ |
404 | }␊ |
405 | if (!first)␊ |
406 | {␊ |
407 | ol.writeString(" </div>\n");␊ |
408 | }␊ |
409 | ol.popGeneratorState();␊ |
410 | }␊ |
411 | ␊ |
412 | void NamespaceDef::writeDocumentation(OutputList &ol)␊ |
413 | {␊ |
414 | static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");␊ |
415 | static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");␊ |
416 | static bool outputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");␊ |
417 | ␊ |
418 | QCString pageTitle;␊ |
419 | if (outputJava)␊ |
420 | {␊ |
421 | pageTitle = theTranslator->trPackage(displayName());␊ |
422 | }␊ |
423 | else if (fortranOpt)␊ |
424 | {␊ |
425 | pageTitle = theTranslator->trModuleReference(displayName());␊ |
426 | }␊ |
427 | else␊ |
428 | {␊ |
429 | pageTitle = theTranslator->trNamespaceReference(displayName());␊ |
430 | }␊ |
431 | startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_NamespaceVisible,!generateTreeView);␊ |
432 | ␊ |
433 | if (!generateTreeView)␊ |
434 | {␊ |
435 | if (getOuterScope()!=Doxygen::globalScope)␊ |
436 | {␊ |
437 | writeNavigationPath(ol);␊ |
438 | }␊ |
439 | ol.endQuickIndices();␊ |
440 | }␊ |
441 | ␊ |
442 | startTitle(ol,getOutputFileBase(),this);␊ |
443 | ol.parseText(pageTitle);␊ |
444 | addGroupListToTitle(ol,this);␊ |
445 | endTitle(ol,getOutputFileBase(),displayName());␊ |
446 | ol.startContents();␊ |
447 | ␊ |
448 | if (Doxygen::searchIndex)␊ |
449 | {␊ |
450 | Doxygen::searchIndex->setCurrentDoc(pageTitle,getOutputFileBase());␊ |
451 | Doxygen::searchIndex->addWord(localName(),TRUE);␊ |
452 | }␊ |
453 | ␊ |
454 | bool generateTagFile = !Config_getString("GENERATE_TAGFILE").isEmpty();␊ |
455 | if (generateTagFile)␊ |
456 | {␊ |
457 | Doxygen::tagFile << " <compound kind=\"namespace\">" << endl;␊ |
458 | Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;␊ |
459 | Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;␊ |
460 | }␊ |
461 | ␊ |
462 | Doxygen::indexList.addIndexItem(this,0);␊ |
463 | ␊ |
464 | //---------------------------------------- start flexible part -------------------------------␊ |
465 | ␊ |
466 | QListIterator<LayoutDocEntry> eli(␊ |
467 | LayoutDocManager::instance().docEntries(LayoutDocManager::Namespace));␊ |
468 | LayoutDocEntry *lde;␊ |
469 | for (eli.toFirst();(lde=eli.current());++eli)␊ |
470 | {␊ |
471 | switch (lde->kind())␊ |
472 | {␊ |
473 | case LayoutDocEntry::BriefDesc: ␊ |
474 | writeBriefDescription(ol);␊ |
475 | break; ␊ |
476 | case LayoutDocEntry::MemberDeclStart: ␊ |
477 | startMemberDeclarations(ol);␊ |
478 | break; ␊ |
479 | case LayoutDocEntry::NamespaceClasses: ␊ |
480 | {␊ |
481 | LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;␊ |
482 | writeClassDeclarations(ol,ls->title);␊ |
483 | }␊ |
484 | break; ␊ |
485 | case LayoutDocEntry::NamespaceNestedNamespaces: ␊ |
486 | {␊ |
487 | LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;␊ |
488 | writeNamespaceDeclarations(ol,ls->title);␊ |
489 | }␊ |
490 | break; ␊ |
491 | case LayoutDocEntry::MemberGroups: ␊ |
492 | writeMemberGroups(ol);␊ |
493 | break; ␊ |
494 | case LayoutDocEntry::MemberDecl: ␊ |
495 | {␊ |
496 | LayoutDocEntryMemberDecl *lmd = (LayoutDocEntryMemberDecl*)lde;␊ |
497 | writeMemberDeclarations(ol,lmd->type,lmd->title);␊ |
498 | }␊ |
499 | break; ␊ |
500 | case LayoutDocEntry::MemberDeclEnd: ␊ |
501 | endMemberDeclarations(ol);␊ |
502 | break;␊ |
503 | case LayoutDocEntry::DetailedDesc: ␊ |
504 | {␊ |
505 | LayoutDocEntrySection *ls = (LayoutDocEntrySection*)lde;␊ |
506 | writeDetailedDescription(ol,ls->title);␊ |
507 | }␊ |
508 | break;␊ |
509 | case LayoutDocEntry::MemberDefStart: ␊ |
510 | startMemberDocumentation(ol);␊ |
511 | break; ␊ |
512 | case LayoutDocEntry::MemberDef: ␊ |
513 | {␊ |
514 | LayoutDocEntryMemberDef *lmd = (LayoutDocEntryMemberDef*)lde;␊ |
515 | writeMemberDocumentation(ol,lmd->type,lmd->title);␊ |
516 | }␊ |
517 | break;␊ |
518 | case LayoutDocEntry::MemberDefEnd: ␊ |
519 | endMemberDocumentation(ol);␊ |
520 | break;␊ |
521 | case LayoutDocEntry::AuthorSection: ␊ |
522 | writeAuthorSection(ol);␊ |
523 | break;␊ |
524 | case LayoutDocEntry::ClassIncludes:␊ |
525 | case LayoutDocEntry::ClassInheritanceGraph:␊ |
526 | case LayoutDocEntry::ClassNestedClasses:␊ |
527 | case LayoutDocEntry::ClassCollaborationGraph:␊ |
528 | case LayoutDocEntry::ClassAllMembersLink:␊ |
529 | case LayoutDocEntry::ClassUsedFiles:␊ |
530 | case LayoutDocEntry::FileClasses:␊ |
531 | case LayoutDocEntry::FileNamespaces:␊ |
532 | case LayoutDocEntry::FileIncludes:␊ |
533 | case LayoutDocEntry::FileIncludeGraph:␊ |
534 | case LayoutDocEntry::FileIncludedByGraph: ␊ |
535 | case LayoutDocEntry::FileSourceLink:␊ |
536 | case LayoutDocEntry::GroupClasses: ␊ |
537 | case LayoutDocEntry::GroupInlineClasses: ␊ |
538 | case LayoutDocEntry::GroupNamespaces:␊ |
539 | case LayoutDocEntry::GroupDirs: ␊ |
540 | case LayoutDocEntry::GroupNestedGroups: ␊ |
541 | case LayoutDocEntry::GroupFiles:␊ |
542 | case LayoutDocEntry::GroupGraph: ␊ |
543 | case LayoutDocEntry::GroupPageDocs:␊ |
544 | case LayoutDocEntry::DirSubDirs:␊ |
545 | case LayoutDocEntry::DirFiles:␊ |
546 | case LayoutDocEntry::DirGraph:␊ |
547 | err("Internal inconsistency: member %d should not be part of "␊ |
548 | "LayoutDocManager::Namespace entry list\n",lde->kind());␊ |
549 | break;␊ |
550 | }␊ |
551 | }␊ |
552 | ␊ |
553 | //---------------------------------------- end flexible part -------------------------------␊ |
554 | ␊ |
555 | ol.endContents();␊ |
556 | ␊ |
557 | if (generateTreeView)␊ |
558 | {␊ |
559 | writeNavigationPath(ol);␊ |
560 | }␊ |
561 | ␊ |
562 | endFile(ol,TRUE);␊ |
563 | ␊ |
564 | if (generateTagFile)␊ |
565 | {␊ |
566 | writeDocAnchorsToTagFile();␊ |
567 | Doxygen::tagFile << " </compound>" << endl;␊ |
568 | }␊ |
569 | ␊ |
570 | if (Config_getBool("SEPARATE_MEMBER_PAGES"))␊ |
571 | {␊ |
572 | MemberList *allMemberList = getMemberList(MemberList::allMembersList);␊ |
573 | if (allMemberList) allMemberList->sort();␊ |
574 | writeMemberPages(ol);␊ |
575 | }␊ |
576 | }␊ |
577 | ␊ |
578 | void NamespaceDef::writeMemberPages(OutputList &ol)␊ |
579 | {␊ |
580 | ol.pushGeneratorState();␊ |
581 | ol.disableAllBut(OutputGenerator::Html);␊ |
582 | ␊ |
583 | QListIterator<MemberList> mli(m_memberLists);␊ |
584 | MemberList *ml;␊ |
585 | for (mli.toFirst();(ml=mli.current());++mli)␊ |
586 | {␊ |
587 | if (ml->listType()&MemberList::documentationLists)␊ |
588 | {␊ |
589 | ml->writeDocumentationPage(ol,name(),this);␊ |
590 | }␊ |
591 | }␊ |
592 | ol.popGeneratorState();␊ |
593 | }␊ |
594 | ␊ |
595 | void NamespaceDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const␊ |
596 | {␊ |
597 | static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");␊ |
598 | ␊ |
599 | ol.writeString(" <div class=\"navtab\">\n");␊ |
600 | ol.writeString(" <table>\n");␊ |
601 | ␊ |
602 | MemberList *allMemberList = getMemberList(MemberList::allMembersList);␊ |
603 | if (allMemberList)␊ |
604 | {␊ |
605 | MemberListIterator mli(*allMemberList);␊ |
606 | MemberDef *md;␊ |
607 | for (mli.toFirst();(md=mli.current());++mli)␊ |
608 | {␊ |
609 | if (md->getNamespaceDef()==this && md->isLinkable())␊ |
610 | {␊ |
611 | ol.writeString(" <tr><td class=\"navtab\">");␊ |
612 | if (md->isLinkableInProject())␊ |
613 | {␊ |
614 | if (md==currentMd) // selected item => highlight␊ |
615 | {␊ |
616 | ol.writeString("<a class=\"qindexHL\" ");␊ |
617 | }␊ |
618 | else␊ |
619 | {␊ |
620 | ol.writeString("<a class=\"qindex\" ");␊ |
621 | }␊ |
622 | ol.writeString("href=\"");␊ |
623 | if (createSubDirs) ol.writeString("../../");␊ |
624 | ol.writeString(md->getOutputFileBase()+Doxygen::htmlFileExtension+"#"+md->anchor());␊ |
625 | ol.writeString("\">");␊ |
626 | ol.writeString(md->localName());␊ |
627 | ol.writeString("</a>");␊ |
628 | }␊ |
629 | ol.writeString("</td></tr>\n");␊ |
630 | }␊ |
631 | }␊ |
632 | }␊ |
633 | ␊ |
634 | ol.writeString(" </table>\n");␊ |
635 | ol.writeString(" </div>\n");␊ |
636 | }␊ |
637 | ␊ |
638 | int NamespaceDef::countMembers()␊ |
639 | {␊ |
640 | MemberList *allMemberList = getMemberList(MemberList::allMembersList);␊ |
641 | if (allMemberList) allMemberList->countDocMembers();␊ |
642 | return (allMemberList ? allMemberList->numDocMembers() : 0)+classSDict->count();␊ |
643 | }␊ |
644 | ␊ |
645 | void NamespaceDef::addUsingDirective(NamespaceDef *nd)␊ |
646 | {␊ |
647 | if (usingDirList==0)␊ |
648 | {␊ |
649 | usingDirList = new NamespaceSDict;␊ |
650 | }␊ |
651 | if (usingDirList->find(nd->qualifiedName())==0)␊ |
652 | {␊ |
653 | usingDirList->append(nd->qualifiedName(),nd);␊ |
654 | }␊ |
655 | //printf("%p: NamespaceDef::addUsingDirective: %s:%d\n",this,name().data(),usingDirList->count());␊ |
656 | }␊ |
657 | ␊ |
658 | NamespaceSDict *NamespaceDef::getUsedNamespaces() const ␊ |
659 | { ␊ |
660 | //printf("%p: NamespaceDef::getUsedNamespace: %s:%d\n",this,name().data(),usingDirList?usingDirList->count():0);␊ |
661 | return usingDirList; ␊ |
662 | }␊ |
663 | ␊ |
664 | void NamespaceDef::addUsingDeclaration(Definition *d)␊ |
665 | {␊ |
666 | if (usingDeclList==0)␊ |
667 | {␊ |
668 | usingDeclList = new SDict<Definition>(17);␊ |
669 | }␊ |
670 | if (usingDeclList->find(d->qualifiedName())==0)␊ |
671 | {␊ |
672 | usingDeclList->append(d->qualifiedName(),d);␊ |
673 | }␊ |
674 | }␊ |
675 | ␊ |
676 | QCString NamespaceDef::getOutputFileBase() const ␊ |
677 | { ␊ |
678 | if (isReference())␊ |
679 | {␊ |
680 | return fileName;␊ |
681 | }␊ |
682 | else␊ |
683 | {␊ |
684 | return convertNameToFile(fileName); ␊ |
685 | }␊ |
686 | }␊ |
687 | ␊ |
688 | Definition *NamespaceDef::findInnerCompound(const char *n)␊ |
689 | {␊ |
690 | if (n==0) return 0;␊ |
691 | Definition *d = m_innerCompounds->find(n);␊ |
692 | if (d==0)␊ |
693 | {␊ |
694 | if (usingDirList)␊ |
695 | {␊ |
696 | d = usingDirList->find(n);␊ |
697 | }␊ |
698 | if (d==0 && usingDeclList)␊ |
699 | {␊ |
700 | d = usingDeclList->find(n);␊ |
701 | }␊ |
702 | }␊ |
703 | return d;␊ |
704 | }␊ |
705 | ␊ |
706 | void NamespaceDef::addListReferences()␊ |
707 | {␊ |
708 | bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");␊ |
709 | {␊ |
710 | LockingPtr< QList<ListItemInfo> > xrefItems = xrefListItems();␊ |
711 | addRefItem(xrefItems.pointer(),␊ |
712 | qualifiedName(),␊ |
713 | fortranOpt?theTranslator->trModule(TRUE,TRUE):theTranslator->trNamespace(TRUE,TRUE),␊ |
714 | getOutputFileBase(),displayName(),␊ |
715 | 0␊ |
716 | );␊ |
717 | }␊ |
718 | MemberGroupSDict::Iterator mgli(*memberGroupSDict);␊ |
719 | MemberGroup *mg;␊ |
720 | for (;(mg=mgli.current());++mgli)␊ |
721 | {␊ |
722 | mg->addListReferences(this);␊ |
723 | }␊ |
724 | QListIterator<MemberList> mli(m_memberLists);␊ |
725 | MemberList *ml;␊ |
726 | for (mli.toFirst();(ml=mli.current());++mli)␊ |
727 | {␊ |
728 | if (ml->listType()&MemberList::documentationLists)␊ |
729 | {␊ |
730 | ml->addListReferences(this);␊ |
731 | }␊ |
732 | }␊ |
733 | }␊ |
734 | ␊ |
735 | QCString NamespaceDef::displayName() const␊ |
736 | {␊ |
737 | QCString result=name();␊ |
738 | if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))␊ |
739 | {␊ |
740 | result = substitute(result,"::",".");␊ |
741 | }␊ |
742 | return result; ␊ |
743 | }␊ |
744 | ␊ |
745 | void NamespaceDef::combineUsingRelations()␊ |
746 | {␊ |
747 | if (visited) return; // already done␊ |
748 | visited=TRUE;␊ |
749 | if (usingDirList)␊ |
750 | {␊ |
751 | NamespaceSDict::Iterator nli(*usingDirList);␊ |
752 | NamespaceDef *nd;␊ |
753 | for (nli.toFirst();(nd=nli.current());++nli)␊ |
754 | {␊ |
755 | nd->combineUsingRelations();␊ |
756 | }␊ |
757 | for (nli.toFirst();(nd=nli.current());++nli)␊ |
758 | {␊ |
759 | // add used namespaces of namespace nd to this namespace␊ |
760 | if (nd->getUsedNamespaces())␊ |
761 | {␊ |
762 | NamespaceSDict::Iterator unli(*nd->getUsedNamespaces());␊ |
763 | NamespaceDef *und;␊ |
764 | for (unli.toFirst();(und=unli.current());++unli)␊ |
765 | {␊ |
766 | //printf("Adding namespace %s to the using list of %s\n",und->qualifiedName().data(),qualifiedName().data());␊ |
767 | addUsingDirective(und);␊ |
768 | }␊ |
769 | }␊ |
770 | // add used classes of namespace nd to this namespace␊ |
771 | if (nd->getUsedClasses())␊ |
772 | {␊ |
773 | SDict<Definition>::Iterator cli(*nd->getUsedClasses());␊ |
774 | Definition *ucd;␊ |
775 | for (cli.toFirst();(ucd=cli.current());++cli)␊ |
776 | {␊ |
777 | //printf("Adding class %s to the using list of %s\n",cd->qualifiedName().data(),qualifiedName().data());␊ |
778 | addUsingDeclaration(ucd);␊ |
779 | }␊ |
780 | }␊ |
781 | }␊ |
782 | }␊ |
783 | }␊ |
784 | ␊ |
785 | bool NamespaceSDict::declVisible() const␊ |
786 | {␊ |
787 | SDict<NamespaceDef>::Iterator ni(*this);␊ |
788 | NamespaceDef *nd;␊ |
789 | for (ni.toFirst();(nd=ni.current());++ni)␊ |
790 | {␊ |
791 | if (nd->isLinkable())␊ |
792 | {␊ |
793 | return TRUE;␊ |
794 | }␊ |
795 | }␊ |
796 | return FALSE;␊ |
797 | }␊ |
798 | ␊ |
799 | void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool localName)␊ |
800 | {␊ |
801 | if (count()==0) return; // no namespaces in the list␊ |
802 | ␊ |
803 | SDict<NamespaceDef>::Iterator ni(*this);␊ |
804 | NamespaceDef *nd;␊ |
805 | bool found=FALSE;␊ |
806 | for (ni.toFirst();(nd=ni.current()) && !found;++ni)␊ |
807 | {␊ |
808 | if (nd->isLinkable()) found=TRUE;␊ |
809 | }␊ |
810 | if (!found) return; // no linkable namespaces in the list␊ |
811 | ␊ |
812 | // write list of namespaces␊ |
813 | ol.startMemberHeader("namespaces");␊ |
814 | bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");␊ |
815 | bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");␊ |
816 | #if 0␊ |
817 | if (javaOpt)␊ |
818 | {␊ |
819 | ol.parseText(theTranslator->trPackages());␊ |
820 | }␊ |
821 | else if (fortranOpt)␊ |
822 | {␊ |
823 | ol.parseText(theTranslator->trModules());␊ |
824 | }␊ |
825 | else␊ |
826 | {␊ |
827 | ol.parseText(theTranslator->trNamespaces());␊ |
828 | }␊ |
829 | #endif␊ |
830 | ol.parseText(title);␊ |
831 | ol.endMemberHeader();␊ |
832 | ol.startMemberList();␊ |
833 | for (ni.toFirst();(nd=ni.current());++ni)␊ |
834 | {␊ |
835 | if (nd->isLinkable())␊ |
836 | {␊ |
837 | ol.startMemberItem(0);␊ |
838 | if (javaOpt)␊ |
839 | {␊ |
840 | ol.docify("package ");␊ |
841 | }␊ |
842 | else if (fortranOpt)␊ |
843 | {␊ |
844 | ol.docify("module ");␊ |
845 | }␊ |
846 | else␊ |
847 | {␊ |
848 | ol.docify("namespace ");␊ |
849 | }␊ |
850 | ol.insertMemberAlign();␊ |
851 | QCString name;␊ |
852 | if (localName)␊ |
853 | {␊ |
854 | name = nd->localName();␊ |
855 | }␊ |
856 | else␊ |
857 | {␊ |
858 | name = nd->displayName();␊ |
859 | }␊ |
860 | ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),0,name);␊ |
861 | if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !nd->isReference()) ␊ |
862 | {␊ |
863 | Doxygen::tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>" << endl;␊ |
864 | }␊ |
865 | ol.endMemberItem();␊ |
866 | if (!nd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))␊ |
867 | {␊ |
868 | ol.startParagraph();␊ |
869 | ol.startMemberDescription();␊ |
870 | ol.parseDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE);␊ |
871 | ol.endMemberDescription();␊ |
872 | ol.endParagraph();␊ |
873 | }␊ |
874 | }␊ |
875 | }␊ |
876 | ol.endMemberList();␊ |
877 | }␊ |
878 | ␊ |
879 | MemberList *NamespaceDef::createMemberList(MemberList::ListType lt)␊ |
880 | {␊ |
881 | m_memberLists.setAutoDelete(TRUE);␊ |
882 | QListIterator<MemberList> mli(m_memberLists);␊ |
883 | MemberList *ml;␊ |
884 | for (mli.toFirst();(ml=mli.current());++mli)␊ |
885 | {␊ |
886 | if (ml->listType()==lt)␊ |
887 | {␊ |
888 | return ml;␊ |
889 | }␊ |
890 | }␊ |
891 | // not found, create a new member list␊ |
892 | ml = new MemberList(lt);␊ |
893 | m_memberLists.append(ml);␊ |
894 | return ml;␊ |
895 | }␊ |
896 | ␊ |
897 | void NamespaceDef::addMemberToList(MemberList::ListType lt,MemberDef *md)␊ |
898 | {␊ |
899 | static bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");␊ |
900 | static bool sortMemberDocs = Config_getBool("SORT_MEMBER_DOCS");␊ |
901 | MemberList *ml = createMemberList(lt);␊ |
902 | ml->setNeedsSorting(␊ |
903 | ((ml->listType()&MemberList::declarationLists) && sortBriefDocs) ||␊ |
904 | ((ml->listType()&MemberList::documentationLists) && sortMemberDocs));␊ |
905 | ml->append(md);␊ |
906 | ␊ |
907 | #if 0␊ |
908 | if (ml->needsSorting())␊ |
909 | ml->inSort(md);␊ |
910 | else␊ |
911 | ml->append(md);␊ |
912 | #endif␊ |
913 | ␊ |
914 | if (ml->listType()&MemberList::declarationLists) md->setSectionList(this,ml);␊ |
915 | }␊ |
916 | ␊ |
917 | void NamespaceDef::sortMemberLists()␊ |
918 | {␊ |
919 | MemberList *ml = m_memberLists.first();␊ |
920 | while (ml)␊ |
921 | {␊ |
922 | if (ml->needsSorting()) { ml->sort(); ml->setNeedsSorting(FALSE); }␊ |
923 | ml = m_memberLists.next();␊ |
924 | }␊ |
925 | }␊ |
926 | ␊ |
927 | ␊ |
928 | ␊ |
929 | MemberList *NamespaceDef::getMemberList(MemberList::ListType lt) const␊ |
930 | {␊ |
931 | NamespaceDef *that = (NamespaceDef*)this;␊ |
932 | MemberList *ml = that->m_memberLists.first();␊ |
933 | while (ml)␊ |
934 | {␊ |
935 | if (ml->listType()==lt)␊ |
936 | {␊ |
937 | return ml;␊ |
938 | }␊ |
939 | ml = that->m_memberLists.next();␊ |
940 | }␊ |
941 | return 0;␊ |
942 | }␊ |
943 | ␊ |
944 | void NamespaceDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title)␊ |
945 | {␊ |
946 | MemberList * ml = getMemberList(lt);␊ |
947 | if (ml) ml->writeDeclarations(ol,0,this,0,0,title,0);␊ |
948 | }␊ |
949 | ␊ |
950 | void NamespaceDef::writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title)␊ |
951 | {␊ |
952 | MemberList * ml = getMemberList(lt);␊ |
953 | if (ml) ml->writeDocumentation(ol,name(),this,title);␊ |
954 | }␊ |
955 | ␊ |
956 | ␊ |
957 | bool NamespaceDef::isLinkableInProject() const␊ |
958 | {␊ |
959 | int i = name().findRev("::");␊ |
960 | if (i==-1) i=0; else i+=2;␊ |
961 | static bool extractAnonNs = Config_getBool("EXTRACT_ANON_NSPACES");␊ |
962 | static bool showNamespaces = Config_getBool("SHOW_NAMESPACES");␊ |
963 | if (extractAnonNs && // extract anonymous ns␊ |
964 | name().mid(i,20)=="anonymous_namespace{" && // correct prefix␊ |
965 | showNamespaces) // not disabled by config␊ |
966 | {␊ |
967 | return TRUE;␊ |
968 | }␊ |
969 | return !name().isEmpty() && name().at(i)!='@' && // not anonymous␊ |
970 | (hasDocumentation() || m_isCSharp) && // documented␊ |
971 | !isReference() && // not an external reference␊ |
972 | !isHidden() && // not hidden␊ |
973 | !isArtificial() && // or artificial␊ |
974 | showNamespaces; // not disabled by config␊ |
975 | }␊ |
976 | ␊ |
977 | bool NamespaceDef::isLinkable() const␊ |
978 | {␊ |
979 | return isLinkableInProject() || isReference();␊ |
980 | }␊ |
981 | ␊ |
982 | MemberDef * NamespaceDef::getMemberByName(const QCString &n) const␊ |
983 | {␊ |
984 | MemberDef *md = 0;␊ |
985 | if (m_allMembersDict && !n.isEmpty())␊ |
986 | {␊ |
987 | md = m_allMembersDict->find(n);␊ |
988 | //printf("%s::m_allMembersDict->find(%s)=%p\n",name().data(),n.data(),md);␊ |
989 | }␊ |
990 | return md;␊ |
991 | }␊ |
992 | ␊ |
993 |