1 /******************************************************************************
3 * Copyright (C) 1997-2015 by Dimitri van Heesch.
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.
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
22 #include "classlist.h"
24 #include "namespacedef.h"
32 #include "vhdldocgen.h"
35 #include "docparser.h"
37 #include "htmldocvisitor.h"
40 #include "latexdocvisitor.h"
44 #include "membername.h"
45 #include "parserintf.h"
47 #include "arguments.h"
49 #include "searchindex.h"
50 #include "resourcemgr.h"
52 // TODO: pass the current file to Dot*::writeGraph, so the user can put dot graphs in other
55 enum ContextOutputFormat
57 ContextOutputFormat_Unspecified=0,
58 ContextOutputFormat_Html,
59 ContextOutputFormat_Latex,
60 ContextOutputFormat_Rtf,
61 ContextOutputFormat_ManPage,
62 ContextOutputFormat_DocBook,
63 ContextOutputFormat_Xml,
64 ContextOutputFormat_TagFile
71 ContextOutputFormat outputFormat;
74 /** @brief Scoped smart pointer */
75 template<class T> class ScopedPtr
79 ScopedPtr(const ScopedPtr &);
80 ScopedPtr &operator=(const ScopedPtr &);
81 void operator==(const ScopedPtr &) const;
82 void operator!=(const ScopedPtr &) const;
86 explicit ScopedPtr(T *p=0) : m_ptr(p) {}
87 ~ScopedPtr() { delete m_ptr; };
88 T &operator*() const { return *m_ptr; }
89 T *operator->() const { return m_ptr; }
90 T *get() const { return m_ptr; }
91 operator bool() const { return m_ptr!=0; }
92 void reset(T *p=0) { if (p!=m_ptr) { delete m_ptr; m_ptr = p; } }
95 /** @brief Reference counting smart pointer */
96 template<class T> class SharedPtr
100 SharedPtr(const SharedPtr &);
101 SharedPtr &operator=(const SharedPtr &p);
102 void operator==(const SharedPtr &) const;
103 void operator!=(const SharedPtr &) const;
107 explicit SharedPtr(T *p=0) : m_ptr(p) { if (m_ptr) m_ptr->addRef(); }
108 ~SharedPtr() { if (m_ptr) m_ptr->release(); };
109 T &operator*() const { return *m_ptr; }
110 T *operator->() const { return m_ptr; }
111 T *get() const { return m_ptr; }
112 operator bool() const { return m_ptr!=0; }
116 if (m_ptr) m_ptr->release();
121 /** @brief Template List iterator support */
122 class GenericConstIterator : public TemplateListIntf::ConstIterator
125 GenericConstIterator(const QList<TemplateVariant> &list)
127 virtual ~GenericConstIterator() {}
138 if (m_it.current()) ++m_it;
142 if (m_it.current()) --m_it;
144 bool current(TemplateVariant &v) const
153 v = TemplateVariant();
158 QListIterator<TemplateVariant> m_it;
161 //------------------------------------------------------------------------
163 /** @brief standard template list implementation */
164 class GenericNodeListContext : public TemplateListIntf
167 GenericNodeListContext() : m_refCount(0)
169 m_children.setAutoDelete(TRUE);
171 static GenericNodeListContext *alloc()
173 return new GenericNodeListContext;
176 // TemplateListIntf methods
179 return (int)m_children.count();
181 TemplateVariant at(int index) const
183 TemplateVariant result;
184 if (index>=0 && index<count())
186 result = *m_children.at(index);
190 TemplateListIntf::ConstIterator *createIterator() const
192 return new GenericConstIterator(m_children);
195 void append(const TemplateVariant &ctn)
197 m_children.append(new TemplateVariant(ctn));
201 return m_children.isEmpty();
209 int count = --m_refCount;
217 mutable QList<TemplateVariant> m_children;
221 //------------------------------------------------------------------------
223 /** @brief Helper class to map a property name to a handler member function */
228 struct PropertyFuncIntf
230 virtual ~PropertyFuncIntf() {}
231 virtual TemplateVariant operator()(const T *obj) const = 0;
233 struct PropertyFunc : public PropertyFuncIntf
235 typedef TemplateVariant (T::*Handler)() const;
236 PropertyFunc(Handler h) : handler(h) {}
237 TemplateVariant operator()(const T *obj) const
239 return (obj->*handler)();
245 PropertyMapper() : m_map(63) { m_map.setAutoDelete(TRUE); }
247 /** Add a property to the map
248 * @param[in] name The name of the property to add.
249 * @param[in] handle The method to call when the property is accessed.
251 void addProperty(const char *name,typename PropertyFunc::Handler handle)
253 if (m_map.find(name))
255 err("Error: adding property '%s' more than once",name);
259 m_map.insert(name,new PropertyFunc(handle));
263 /** Gets the value of a property.
264 * @param[in] obj The object handling access to the property.
265 * @param[in] name The name of the property.
266 * @returns A variant representing the properties value or an
267 * invalid variant if it was not found.
269 TemplateVariant get(const T *obj,const char *name) const
271 //printf("PropertyMapper::get(%s)\n",name);
272 TemplateVariant result;
273 PropertyFuncIntf *func = m_map.find(name);
276 result = (*func)(obj);
282 QDict<PropertyFuncIntf> m_map;
286 //------------------------------------------------------------------------
288 //%% struct Config : configuration options
290 class ConfigContext::Private
293 Private() { m_cachedLists.setAutoDelete(TRUE); }
294 virtual ~Private() { }
295 TemplateVariant fetchList(const QCString &name,const QStrList *list)
297 TemplateVariant *v = m_cachedLists.find(name);
300 TemplateList *tlist = TemplateList::alloc();
301 m_cachedLists.insert(name,new TemplateVariant(tlist));
302 QStrListIterator li(*list);
304 for (li.toFirst();(s=li.current());++li)
316 QDict<TemplateVariant> m_cachedLists;
320 ConfigContext::ConfigContext() : RefCountedContext("ConfigContext")
325 ConfigContext::~ConfigContext()
330 TemplateVariant ConfigContext::get(const char *name) const
332 TemplateVariant result;
335 const ConfigValues::Info *option = ConfigValues::instance().get(name);
338 switch (option->type)
340 case ConfigValues::Info::Bool:
342 bool b = ConfigValues::instance().*((ConfigValues::InfoBool*)option)->item;
343 return TemplateVariant(b);
345 case ConfigValues::Info::Int:
347 int i = ConfigValues::instance().*((ConfigValues::InfoInt*)option)->item;
348 return TemplateVariant(i);
350 case ConfigValues::Info::String:
352 QCString s = ConfigValues::instance().*((ConfigValues::InfoString*)option)->item;
353 return TemplateVariant(s);
355 case ConfigValues::Info::List:
357 const QStrList &l = ConfigValues::instance().*((ConfigValues::InfoList*)option)->item;
358 return p->fetchList(name,&l);
368 //------------------------------------------------------------------------
370 //%% struct Doxygen: global information
372 class DoxygenContext::Private
375 TemplateVariant version() const
377 return versionString;
379 TemplateVariant date() const
381 return dateToString(TRUE);
383 TemplateVariant maxJaxCodeFile() const
385 return m_cache.maxJaxCodeFile;
389 static bool init=FALSE;
393 s_inst.addProperty("version", &Private::version);
395 s_inst.addProperty("date", &Private::date);
396 //%% string maxJaxCodeFile
397 s_inst.addProperty("mathJaxCodeFile", &Private::maxJaxCodeFile);
401 TemplateVariant get(const char *n) const
403 return s_inst.get(this,n);
408 Cachable() { maxJaxCodeFile=fileToString(Config_getString(MATHJAX_CODEFILE)); }
409 QCString maxJaxCodeFile;
411 mutable Cachable m_cache;
412 static PropertyMapper<DoxygenContext::Private> s_inst;
416 PropertyMapper<DoxygenContext::Private> DoxygenContext::Private::s_inst;
417 // (PropertyMapper<DoxygenContext::Private>::instance());
419 DoxygenContext::DoxygenContext() : RefCountedContext("DoxygenContext")
424 DoxygenContext::~DoxygenContext()
429 TemplateVariant DoxygenContext::get(const char *n) const
434 //------------------------------------------------------------------------
436 //%% struct Translator: translation methods
438 class TranslateContext::Private
442 TemplateVariant handleGeneratedAt(const QValueList<TemplateVariant> &args) const
446 return theTranslator->trGeneratedAt(args[0].toString(),args[1].toString());
450 err("tr.generateAt should take two arguments, got %d!\n",args.count());
452 return TemplateVariant();
454 TemplateVariant handleInheritanceDiagramFor(const QValueList<TemplateVariant> &args) const
458 return theTranslator->trClassDiagram(args[0].toString());
462 err("tr.inheritanceDiagramFor should take one argument, got %d!\n",args.count());
464 return TemplateVariant();
466 TemplateVariant handleCollaborationDiagramFor(const QValueList<TemplateVariant> &args) const
470 return theTranslator->trCollaborationDiagram(args[0].toString());
474 err("tr.collaborationDiagramFor should take one argument, got %d!\n",args.count());
476 return TemplateVariant();
478 TemplateVariant handleDirDependencyGraphFor(const QValueList<TemplateVariant> &args) const
482 return theTranslator->trDirDepGraph(args[0].toString());
486 err("tr.dirDependencyGraphFor should take one argument, got %d!\n",args.count());
488 return TemplateVariant();
490 TemplateVariant handleInheritsList(const QValueList<TemplateVariant> &args) const
494 return theTranslator->trInheritsList(args[0].toInt());
498 err("tr.inheritsList should take one integer argument, got %d!\n",args.count());
500 return TemplateVariant();
502 TemplateVariant handleInheritedByList(const QValueList<TemplateVariant> &args) const
506 return theTranslator->trInheritedByList(args[0].toInt());
510 err("tr.inheritedByList should take one integer argument, got %d!\n",args.count());
512 return TemplateVariant();
514 TemplateVariant handleWriteList(const QValueList<TemplateVariant> &args) const
518 return theTranslator->trWriteList(args[0].toInt());
522 err("tr.*List should take one integer argument, got %d!\n",args.count());
524 return TemplateVariant();
526 TemplateVariant handleImplementedBy(const QValueList<TemplateVariant> &args) const
530 return theTranslator->trImplementedInList(args[0].toInt());
534 err("tr.implementedBy should take one integer argument, got %d!\n",args.count());
536 return TemplateVariant();
538 TemplateVariant handleReimplementedBy(const QValueList<TemplateVariant> &args) const
542 return theTranslator->trReimplementedInList(args[0].toInt());
546 err("tr.reimplementedBy should take one integer argument, got %d!\n",args.count());
548 return TemplateVariant();
550 TemplateVariant handleSourceRefs(const QValueList<TemplateVariant> &args) const
554 return theTranslator->trReferences()+" "+theTranslator->trWriteList(args[0].toInt())+".";
558 err("tr.sourceRefs should take one integer argument, got %d\n",args.count());
560 return TemplateVariant();
562 TemplateVariant handleSourceRefBys(const QValueList<TemplateVariant> &args) const
566 return theTranslator->trReferencedBy()+" "+theTranslator->trWriteList(args[0].toInt())+".";
570 err("tr.sourceRefBys should take one integer argument, got %d\n",args.count());
572 return TemplateVariant();
574 TemplateVariant handleIncludeDependencyGraph(const QValueList<TemplateVariant> &args) const
578 return theTranslator->trInclDepGraph(args[0].toString());
582 err("tr.includeDependencyGraph should take one string argument, got %d\n",args.count());
584 return TemplateVariant();
589 TemplateVariant generatedBy() const
591 return theTranslator->trGeneratedBy();
593 TemplateVariant generatedAt() const
595 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleGeneratedAt>(this);
597 TemplateVariant inheritanceDiagramFor() const
599 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritanceDiagramFor>(this);
601 TemplateVariant collaborationDiagramFor() const
603 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleCollaborationDiagramFor>(this);
605 TemplateVariant dirDependencyGraphFor() const
607 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleDirDependencyGraphFor>(this);
609 TemplateVariant search() const
611 return theTranslator->trSearch();
613 TemplateVariant mainPage() const
615 return theTranslator->trMainPage();
617 TemplateVariant classes() const
619 return theTranslator->trClasses();
620 // TODO: VHDL: theTranslator->trVhdlType(VhdlDocGen::ENTITY,FALSE)
621 // TODO: Fortran: trDataTypes()
623 TemplateVariant classList() const
625 return theTranslator->trCompoundList();
627 TemplateVariant classListDescription() const
629 return theTranslator->trCompoundListDescription();
631 TemplateVariant classIndex() const
633 return theTranslator->trCompoundIndex();
635 TemplateVariant namespaceIndex() const
637 return theTranslator->trNamespaceIndex();
639 TemplateVariant classHierarchy() const
641 return theTranslator->trClassHierarchy();
643 TemplateVariant classMembers() const
645 return theTranslator->trCompoundMembers();
647 TemplateVariant modules() const
649 return theTranslator->trModules();
651 TemplateVariant moduleIndex() const
653 return theTranslator->trModuleIndex();
655 TemplateVariant namespaces() const
657 if (m_javaOpt || m_vhdlOpt)
659 return theTranslator->trPackages();
661 else if (m_fortranOpt || m_sliceOpt)
663 return theTranslator->trModules();
667 return theTranslator->trNamespaces();
670 TemplateVariant files() const
672 return theTranslator->trFile(TRUE,FALSE);
674 TemplateVariant fileIndex() const
676 return theTranslator->trFileIndex();
678 TemplateVariant pages() const
680 return theTranslator->trRelatedPages();
682 TemplateVariant examples() const
684 return theTranslator->trExamples();
686 TemplateVariant namespaceList() const
688 if (m_javaOpt || m_vhdlOpt)
690 return theTranslator->trPackages();
692 else if (m_fortranOpt || m_sliceOpt)
694 return theTranslator->trModulesList();
698 return theTranslator->trNamespaceList();
701 TemplateVariant namespaceMembers() const
703 if (m_javaOpt || m_vhdlOpt)
705 return theTranslator->trPackageMembers();
707 else if (m_fortranOpt || m_sliceOpt)
709 return theTranslator->trModulesMembers();
713 return theTranslator->trNamespaceMembers();
716 TemplateVariant moduleDocumentation() const
718 return theTranslator->trModuleDocumentation();
720 TemplateVariant fileDocumentation() const
722 return theTranslator->trFileDocumentation();
724 TemplateVariant fileList() const
726 return theTranslator->trFileList();
728 TemplateVariant fileMembers() const
730 return theTranslator->trFileMembers();
732 TemplateVariant fileMembersDescription() const
734 static bool extractAll = Config_getBool(EXTRACT_ALL);
735 return theTranslator->trFileMembersDescription(extractAll);
737 TemplateVariant namespaceMembersDescription() const
739 static bool extractAll = Config_getBool(EXTRACT_ALL);
740 return theTranslator->trNamespaceMemberDescription(extractAll);
742 TemplateVariant classHierarchyDescription() const
744 return theTranslator->trClassHierarchyDescription();
746 TemplateVariant gotoGraphicalHierarchy() const
748 return theTranslator->trGotoGraphicalHierarchy();
750 TemplateVariant gotoTextualHierarchy() const
752 return theTranslator->trGotoTextualHierarchy();
754 TemplateVariant classMembersDescription() const
756 static bool extractAll = Config_getBool(EXTRACT_ALL);
757 static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
760 return theTranslator->trCompoundMembersDescriptionFortran(extractAll);
764 return theTranslator->trCompoundMembersDescription(extractAll);
767 TemplateVariant relatedPagesDesc() const
769 return theTranslator->trRelatedPagesDescription();
771 TemplateVariant more() const
773 return theTranslator->trMore();
775 TemplateVariant detailedDesc() const
777 return theTranslator->trDetailedDescription();
779 TemplateVariant inheritsList() const
781 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritsList>(this);
783 TemplateVariant inheritedByList() const
785 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritedByList>(this);
787 TemplateVariant definedAtLineInSourceFile() const
789 return theTranslator->trDefinedAtLineInSourceFile();
791 TemplateVariant typeConstraints() const
793 return theTranslator->trTypeConstraints();
795 TemplateVariant exampleList() const
797 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleWriteList>(this);
799 TemplateVariant listOfAllMembers() const
801 return theTranslator->trListOfAllMembers();
803 TemplateVariant memberList() const
805 return theTranslator->trMemberList();
807 TemplateVariant theListOfAllMembers() const
809 return theTranslator->trThisIsTheListOfAllMembers();
811 TemplateVariant incInheritedMembers() const
813 return theTranslator->trIncludingInheritedMembers();
815 TemplateVariant defineValue() const
817 return theTranslator->trDefineValue();
819 TemplateVariant initialValue() const
821 return theTranslator->trInitialValue();
823 TemplateVariant enumerationValues() const
825 return theTranslator->trEnumerationValues();
827 TemplateVariant implements() const
829 return theTranslator->trImplementedFromList(1);
831 TemplateVariant reimplements() const
833 return theTranslator->trReimplementedFromList(1);
835 TemplateVariant implementedBy() const
837 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleImplementedBy>(this);
839 TemplateVariant reimplementedBy() const
841 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleReimplementedBy>(this);
843 TemplateVariant sourceRefs() const
845 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleSourceRefs>(this);
847 TemplateVariant sourceRefBys() const
849 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleSourceRefBys>(this);
851 TemplateVariant callGraph() const
853 return theTranslator->trCallGraph();
855 TemplateVariant callerGraph() const
857 return theTranslator->trCallerGraph();
859 TemplateVariant referencedByRelation() const
861 return theTranslator->trReferencedBy();
863 TemplateVariant referencesRelation() const
865 return theTranslator->trReferences();
867 TemplateVariant inheritedFrom() const
869 return theTranslator->trInheritedFrom("@0","@1");
871 TemplateVariant additionalInheritedMembers() const
873 return theTranslator->trAdditionalInheritedMembers();
875 TemplateVariant includeDependencyGraph() const
877 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleIncludeDependencyGraph>(this);
879 TemplateVariant includedByDependencyGraph() const
881 return theTranslator->trInclByDepGraph();
883 TemplateVariant gotoSourceCode() const
885 return theTranslator->trGotoSourceCode();
887 TemplateVariant gotoDocumentation() const
889 return theTranslator->trGotoDocumentation();
891 TemplateVariant constantgroups() const
893 return theTranslator->trConstantGroups();
895 TemplateVariant classDocumentation() const
897 return theTranslator->trClassDocumentation();
899 TemplateVariant namespaceDocumentation() const
901 return theTranslator->trNamespaceDocumentation();
903 TemplateVariant compoundMembers() const
905 return theTranslator->trCompoundMembers();
907 TemplateVariant detailLevel() const
909 return theTranslator->trDetailLevel();
911 TemplateVariant fileListDescription() const
913 bool extractAll = Config_getBool(EXTRACT_ALL);
914 return theTranslator->trFileListDescription(extractAll);
916 TemplateVariant modulesDescription() const
918 bool extractAll = Config_getBool(EXTRACT_ALL);
919 return theTranslator->trModulesListDescription(extractAll);
921 TemplateVariant namespaceListDescription() const
923 bool extractAll = Config_getBool(EXTRACT_ALL);
924 return theTranslator->trNamespaceListDescription(extractAll);
926 TemplateVariant directories() const
928 return theTranslator->trDirectories();
930 TemplateVariant all() const
932 return theTranslator->trAll();
934 TemplateVariant functions() const
936 static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
937 static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
938 return fortranOpt ? theTranslator->trSubprograms() :
939 vhdlOpt ? theTranslator->trFunctionAndProc() :
940 theTranslator->trFunctions();
942 TemplateVariant variables() const
944 static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
945 return sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables();
947 TemplateVariant typedefs() const
949 return theTranslator->trTypedefs();
951 TemplateVariant enums() const
953 return theTranslator->trEnumerations();
955 TemplateVariant properties() const
957 return theTranslator->trProperties();
959 TemplateVariant events() const
961 return theTranslator->trEvents();
963 TemplateVariant related() const
965 return theTranslator->trRelatedFunctions();
967 TemplateVariant macros() const
969 return theTranslator->trDefines();
971 TemplateVariant loading() const
973 return theTranslator->trLoading();
975 TemplateVariant searching() const
977 return theTranslator->trSearching();
979 TemplateVariant noMatches() const
981 return theTranslator->trNoMatches();
983 TemplateVariant enumName() const
985 return theTranslator->trEnumName();
987 TemplateVariant enumValue() const
989 return theTranslator->trEnumValue();
991 TemplateVariant referenceManual() const
993 return theTranslator->trReferenceManual();
995 TemplateVariant index() const
997 return theTranslator->trRTFGeneralIndex();
999 TemplateVariant panelSyncOn() const
1001 return theTranslator->trPanelSynchronisationTooltip(FALSE);
1003 TemplateVariant panelSyncOff() const
1005 return theTranslator->trPanelSynchronisationTooltip(TRUE);
1007 TemplateVariant providedByCategory() const
1009 return theTranslator->trProvidedByCategory();
1011 TemplateVariant extendsClass() const
1013 return theTranslator->trExtendsClass();
1015 TemplateVariant examplesDescription() const
1017 return theTranslator->trExamplesDescription();
1019 TemplateVariant langString() const
1021 return HtmlHelp::getLanguageString();
1025 static bool init=FALSE;
1028 //%% string generatedBy
1029 s_inst.addProperty("generatedBy", &Private::generatedBy);
1030 //%% string generatedAt
1031 s_inst.addProperty("generatedAt", &Private::generatedAt);
1033 s_inst.addProperty("search", &Private::search);
1034 //%% string mainPage
1035 s_inst.addProperty("mainPage", &Private::mainPage);
1037 s_inst.addProperty("classes", &Private::classes);
1038 //%% string classList
1039 s_inst.addProperty("classList", &Private::classList);
1040 //%% string classListDescription
1041 s_inst.addProperty("classListDescription", &Private::classListDescription);
1042 //%% string classIndex
1043 s_inst.addProperty("classIndex", &Private::classIndex);
1044 //%% string namespaceIndex
1045 s_inst.addProperty("namespaceIndex", &Private::namespaceIndex);
1046 //%% string classHierarchy
1047 s_inst.addProperty("classHierarchy", &Private::classHierarchy);
1048 //%% string classMembers
1049 s_inst.addProperty("classMembers", &Private::classMembers);
1050 //%% string classMembersDescription
1051 s_inst.addProperty("classMembersDescription",&Private::classMembersDescription);
1053 s_inst.addProperty("modules", &Private::modules);
1054 //%% string moduleIndex
1055 s_inst.addProperty("moduleIndex", &Private::moduleIndex);
1056 //%% string namespaces
1057 s_inst.addProperty("namespaces", &Private::namespaces);
1058 //%% string fileIndex
1059 s_inst.addProperty("fileIndex", &Private::fileIndex);
1061 s_inst.addProperty("files", &Private::files);
1063 s_inst.addProperty("pages", &Private::pages);
1064 //%% string examples
1065 s_inst.addProperty("examples", &Private::examples);
1066 //%% string namespaceList
1067 s_inst.addProperty("namespaceList", &Private::namespaceList);
1068 //%% string namespaceMembers
1069 s_inst.addProperty("namespaceMembers", &Private::namespaceMembers);
1070 //%% srting fileList
1071 s_inst.addProperty("fileList", &Private::fileList);
1072 //%% string fileMembers
1073 s_inst.addProperty("fileMembers", &Private::fileMembers);
1074 //%% string fileMembersDescription
1075 s_inst.addProperty("fileMembersDescription", &Private::fileMembersDescription);
1076 //%% string relatedPagesDescripiton
1077 s_inst.addProperty("relatedPagesDesc", &Private::relatedPagesDesc);
1079 s_inst.addProperty("more", &Private::more);
1080 //%% string detailedDescription
1081 s_inst.addProperty("detailedDesc", &Private::detailedDesc);
1082 //%% string inheritanceDiagramFor
1083 s_inst.addProperty("inheritanceDiagramFor", &Private::inheritanceDiagramFor);
1084 //%% string collaborationDiagramFor
1085 s_inst.addProperty("collaborationDiagramFor", &Private::collaborationDiagramFor);
1086 //%% markerstring inheritsList
1087 s_inst.addProperty("inheritsList", &Private::inheritsList);
1088 //%% markerstring inheritedByList
1089 s_inst.addProperty("inheritedByList", &Private::inheritedByList);
1090 //%% markerstring definedAtLineInSourceFile
1091 s_inst.addProperty("definedAtLineInSourceFile", &Private::definedAtLineInSourceFile);
1092 //%% string typeConstraints
1093 s_inst.addProperty("typeConstraints", &Private::typeConstraints);
1094 //%% string exampleList
1095 s_inst.addProperty("exampleList", &Private::exampleList);
1096 //%% string listOfAllMembers
1097 s_inst.addProperty("listOfAllMembers", &Private::listOfAllMembers);
1098 //%% string memberList
1099 s_inst.addProperty("memberList", &Private::memberList);
1100 //%% string theListOfAllMembers
1101 s_inst.addProperty("theListOfAllMembers",&Private::theListOfAllMembers);
1102 //%% string incInheritedMembers
1103 s_inst.addProperty("incInheritedMembers",&Private::incInheritedMembers);
1104 //%% string defineValue
1105 s_inst.addProperty("defineValue", &Private::defineValue);
1106 //%% string initialValue
1107 s_inst.addProperty("initialValue", &Private::initialValue);
1108 //%% markerstring implements
1109 s_inst.addProperty("implements", &Private::implements);
1110 //%% markerstring reimplements
1111 s_inst.addProperty("reimplements", &Private::reimplements);
1112 //%% markerstring implementedBy
1113 s_inst.addProperty("implementedBy", &Private::implementedBy);
1114 //%% markerstring reimplementedBy
1115 s_inst.addProperty("reimplementedBy", &Private::reimplementedBy);
1116 //%% markerstring sourceRefs
1117 s_inst.addProperty("sourceRefs", &Private::sourceRefs);
1118 //%% markerstring sourceRefBys
1119 s_inst.addProperty("sourceRefBys", &Private::sourceRefBys);
1120 //%% string callGraph
1121 s_inst.addProperty("callGraph", &Private::callGraph);
1122 //%% string callerGraph
1123 s_inst.addProperty("callerGraph", &Private::callerGraph);
1124 //%% string referencedByRelation
1125 s_inst.addProperty("referencedByRelation", &Private::referencedByRelation);
1126 //%% string referencesRelation
1127 s_inst.addProperty("referencesRelation", &Private::referencesRelation);
1128 //%% markerstring inheritedFrom
1129 s_inst.addProperty("inheritedFrom", &Private::inheritedFrom);
1130 //%% string addtionalInheritedMembers
1131 s_inst.addProperty("additionalInheritedMembers",&Private::additionalInheritedMembers);
1132 //%% string includeDependencyGraph:container_name
1133 s_inst.addProperty("includeDependencyGraph",&Private::includeDependencyGraph);
1134 //%% string includedByDependencyGraph
1135 s_inst.addProperty("includedByDependencyGraph",&Private::includedByDependencyGraph);
1136 //%% string gotoSourceCode
1137 s_inst.addProperty("gotoSourceCode", &Private::gotoSourceCode);
1138 //%% string gotoDocumentation
1139 s_inst.addProperty("gotoDocumentation", &Private::gotoDocumentation);
1140 //%% string constantgroups
1141 s_inst.addProperty("constantgroups", &Private::constantgroups);
1142 //%% string classDocumentation
1143 s_inst.addProperty("classDocumentation", &Private::classDocumentation);
1144 //%% string namespaceDocumentation
1145 s_inst.addProperty("namespaceDocumentation", &Private::namespaceDocumentation);
1146 //%% string moduleDocumentation
1147 s_inst.addProperty("moduleDocumentation",&Private::moduleDocumentation);
1148 //%% string fileDocumentation
1149 s_inst.addProperty("fileDocumentation", &Private::fileDocumentation);
1150 //%% string compoundMembers
1151 s_inst.addProperty("compoundMembers", &Private::compoundMembers);
1152 //%% string detailLevel
1153 s_inst.addProperty("detailLevel", &Private::detailLevel);
1154 //%% string fileListDescription
1155 s_inst.addProperty("fileListDescription",&Private::fileListDescription);
1156 //%% string namespaceListDescription
1157 s_inst.addProperty("namespaceListDescription",&Private::namespaceListDescription);
1158 //%% string directories
1159 s_inst.addProperty("directories", &Private::directories);
1160 //%% string moduleDescription
1161 s_inst.addProperty("modulesDescription", &Private::modulesDescription);
1163 s_inst.addProperty("all", &Private::all);
1164 //%% string functions
1165 s_inst.addProperty("functions", &Private::functions);
1166 //%% string variables
1167 s_inst.addProperty("variables", &Private::variables);
1168 //%% string typedefs
1169 s_inst.addProperty("typedefs", &Private::typedefs);
1171 s_inst.addProperty("enums", &Private::enums);
1172 //%% string enumValues
1173 s_inst.addProperty("enumValues", &Private::enumerationValues);
1174 //%% string properties
1175 s_inst.addProperty("properties", &Private::properties);
1177 s_inst.addProperty("events", &Private::events);
1179 s_inst.addProperty("related", &Private::related);
1181 s_inst.addProperty("macros", &Private::macros);
1182 //%% string namespaceMembersDescription
1183 s_inst.addProperty("namespaceMembersDescription",&Private::namespaceMembersDescription);
1184 //%% string classHierarchyDescription
1185 s_inst.addProperty("classHierarchyDescription",&Private::classHierarchyDescription);
1186 //%% string gotoGraphicalHierarchy
1187 s_inst.addProperty("gotoGraphicalHierarchy",&Private::gotoGraphicalHierarchy);
1188 //%% string gotoTextualHierarchy
1189 s_inst.addProperty("gotoTextualHierarchy",&Private::gotoTextualHierarchy);
1191 s_inst.addProperty("loading", &Private::loading);
1192 //%% string searching
1193 s_inst.addProperty("searching", &Private::searching);
1194 //%% string noMatches
1195 s_inst.addProperty("noMatches", &Private::noMatches);
1196 //%% string enumValue
1197 s_inst.addProperty("enumValue", &Private::enumValue);
1198 //%% string enumName
1199 s_inst.addProperty("enumName", &Private::enumName);
1200 //%% string referenceManual
1201 s_inst.addProperty("referenceManual", &Private::referenceManual);
1203 s_inst.addProperty("index", &Private::index);
1204 //%% string panelSyncOn
1205 s_inst.addProperty("panelSyncOn", &Private::panelSyncOn);
1206 //%% string panelSyncOff
1207 s_inst.addProperty("panelSyncOff", &Private::panelSyncOff);
1208 //%% string dirDependencyGraph
1209 s_inst.addProperty("dirDependencyGraphFor", &Private::dirDependencyGraphFor);
1210 //%% string providedByCategory
1211 s_inst.addProperty("providedByCategory", &Private::providedByCategory);
1212 //%% string extendsClass
1213 s_inst.addProperty("extendsClass", &Private::extendsClass);
1214 //%% string examplesDescription
1215 s_inst.addProperty("examplesDescription",&Private::examplesDescription);
1216 //%% string langstring
1217 s_inst.addProperty("langString", &Private::langString);
1222 m_javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
1223 m_fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
1224 m_vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
1225 m_sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
1227 TemplateVariant get(const char *n) const
1229 return s_inst.get(this,n);
1236 static PropertyMapper<TranslateContext::Private> s_inst;
1240 PropertyMapper<TranslateContext::Private> TranslateContext::Private::s_inst;
1242 TranslateContext::TranslateContext() : RefCountedContext("TranslateContext")
1247 TranslateContext::~TranslateContext()
1252 TemplateVariant TranslateContext::get(const char *n) const
1257 static TemplateVariant parseDoc(Definition *def,const QCString &file,int line,
1258 const QCString &relPath,const QCString &docStr,bool isBrief)
1260 TemplateVariant result;
1261 DocRoot *root = validatingParseDoc(file,line,def,0,docStr,TRUE,FALSE,0,isBrief,FALSE);
1264 FTextStream ts(&docs);
1265 switch (g_globals.outputFormat)
1267 case ContextOutputFormat_Html:
1269 HtmlCodeGenerator codeGen(ts,relPath);
1270 HtmlDocVisitor visitor(ts,codeGen,def);
1271 root->accept(&visitor);
1274 case ContextOutputFormat_Latex:
1276 LatexCodeGenerator codeGen(ts,relPath,file);
1277 LatexDocVisitor visitor(ts,codeGen,def->getDefFileExtension(),FALSE);
1278 root->accept(&visitor);
1281 // TODO: support other generators
1283 err("context.cpp: output format not yet supported");
1287 bool isEmpty = root->isEmpty();
1291 result = TemplateVariant(docs,TRUE);
1296 static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const QCString &relPath,
1297 const QCString &code,int startLine=-1,int endLine=-1,bool showLineNumbers=FALSE)
1299 ParserInterface *pIntf = Doxygen::parserManager->getParser(md->getDefFileExtension());
1300 pIntf->resetCodeParserState();
1303 switch (g_globals.outputFormat)
1305 case ContextOutputFormat_Html:
1307 HtmlCodeGenerator codeGen(t,relPath);
1308 pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
1309 startLine,endLine,TRUE,md,showLineNumbers,md);
1312 case ContextOutputFormat_Latex:
1314 LatexCodeGenerator codeGen(t,relPath,md->docFile());
1315 pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
1316 startLine,endLine,TRUE,md,showLineNumbers,md);
1319 // TODO: support other generators
1321 err("context.cpp: output format not yet supported");
1324 return TemplateVariant(s.data(),TRUE);
1327 static TemplateVariant parseCode(FileDef *fd,const QCString &relPath)
1329 static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
1330 ParserInterface *pIntf = Doxygen::parserManager->getParser(fd->getDefFileExtension());
1331 pIntf->resetCodeParserState();
1334 switch (g_globals.outputFormat)
1336 case ContextOutputFormat_Html:
1338 HtmlCodeGenerator codeGen(t,relPath);
1339 pIntf->parseCode(codeGen,0,
1340 fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources
1341 fd->getLanguage(), // lang
1342 FALSE, // isExampleBlock
1347 FALSE, // inlineFragment
1349 TRUE, // showLineNumbers
1351 TRUE // collectXRefs, TODO: should become FALSE
1355 case ContextOutputFormat_Latex:
1357 LatexCodeGenerator codeGen(t,relPath,fd->docFile());
1358 pIntf->parseCode(codeGen,0,
1359 fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources
1360 fd->getLanguage(), // lang
1361 FALSE, // isExampleBlock
1366 FALSE, // inlineFragment
1368 TRUE, // showLineNumbers
1370 TRUE // collectXRefs, TODO: should become FALSE
1374 // TODO: support other generators
1376 err("context.cpp: output format not yet supported");
1379 return TemplateVariant(s.data(),TRUE);
1382 //------------------------------------------------------------------------
1384 //%% struct Symbol: shared info for all symbols
1386 template<typename T>
1387 class DefinitionContext
1390 DefinitionContext(Definition *d) : m_def(d)
1394 void addBaseProperties(PropertyMapper<T> &inst)
1396 //%% string name: the name of the symbol
1397 inst.addProperty("name",&DefinitionContext::name);
1398 //%% string bareName: the bare name of the symbol with scope info
1399 inst.addProperty("bareName",&DefinitionContext::bareName);
1400 //%% string relPath: the relative path to the root of the output (CREATE_SUBDIRS)
1401 inst.addProperty("relPath",&DefinitionContext::relPath);
1402 //%% string fileName: the file name of the output file associated with the symbol (without extension)
1403 inst.addProperty("fileName",&DefinitionContext::fileName);
1404 //%% string anchor: anchor within the page
1405 inst.addProperty("anchor",&DefinitionContext::anchor);
1406 //%% string details: the detailed documentation for this symbol
1407 inst.addProperty("details",&DefinitionContext::details);
1408 //%% string brief: the brief description for this symbol
1409 inst.addProperty("brief",&DefinitionContext::brief);
1410 //%% string inbodyDocs: the documentation found in the body
1411 inst.addProperty("inbodyDocs",&DefinitionContext::inbodyDocs);
1412 //%% string sourceFileName: the file name of the source file (without extension)
1413 inst.addProperty("sourceFileName",&DefinitionContext::sourceFileName);
1414 //%% bool isLinkable: can the symbol be linked to?
1415 inst.addProperty("isLinkable",&DefinitionContext::isLinkable);
1416 //%% bool isLinkableInProject: can the symbol be linked within this project?
1417 inst.addProperty("isLinkableInProject",&DefinitionContext::isLinkableInProject);
1418 //%% int dynSectionId: identifier that can be used for collapsible sections
1419 inst.addProperty("dynSectionId",&DefinitionContext::dynSectionId);
1420 //%% string language: the programming language in which the symbol is written
1421 inst.addProperty("language",&DefinitionContext::language);
1422 //%% string sourceDef: A link to the source definition
1423 inst.addProperty("sourceDef",&DefinitionContext::sourceDef);
1424 //%% list[Definition] navigationPath: Breadcrumb navigation path to this item
1425 inst.addProperty("navigationPath",&DefinitionContext::navigationPath);
1426 //%% string kind: Kind of compound object: class, namespace, module, package, page, dir
1427 inst.addProperty("compoundKind",&DefinitionContext::compoundKind);
1428 //%% bool isReference: is this definition imported via a tag file
1429 inst.addProperty("isReference",&DefinitionContext::isReference);
1430 //%% string externalReference: the link to the element in the remote documentation
1431 inst.addProperty("externalReference",&DefinitionContext::externalReference);
1433 TemplateVariant fileName() const
1435 return m_def->getOutputFileBase();
1437 TemplateVariant anchor() const
1439 return m_def->anchor();
1441 TemplateVariant sourceFileName() const
1443 return m_def->getSourceFileBase();
1445 TemplateVariant isLinkable() const
1447 return m_def->isLinkable();
1449 TemplateVariant isLinkableInProject() const
1451 return m_def->isLinkableInProject();
1453 TemplateVariant name() const
1455 return m_def->displayName(TRUE);
1457 TemplateVariant bareName() const
1459 return m_def->displayName(FALSE);
1461 QCString relPathAsString() const
1463 static bool createSubdirs = Config_getBool(CREATE_SUBDIRS);
1464 return createSubdirs ? QCString("../../") : QCString("");
1466 virtual TemplateVariant relPath() const
1468 return relPathAsString();
1470 TemplateVariant details() const
1472 Cachable &cache = getCache();
1473 if (!cache.details || g_globals.outputFormat!=cache.detailsOutputFormat)
1475 cache.details.reset(new TemplateVariant(parseDoc(m_def,m_def->docFile(),m_def->docLine(),
1476 relPathAsString(),m_def->documentation(),FALSE)));
1477 cache.detailsOutputFormat = g_globals.outputFormat;
1479 return *cache.details;
1481 TemplateVariant brief() const
1483 Cachable &cache = getCache();
1484 if (!cache.brief || g_globals.outputFormat!=cache.briefOutputFormat)
1486 if (m_def->hasBriefDescription())
1488 cache.brief.reset(new TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(),
1489 relPathAsString(),m_def->briefDescription(),TRUE)));
1490 cache.briefOutputFormat = g_globals.outputFormat;
1494 cache.brief.reset(new TemplateVariant(""));
1497 return *cache.brief;
1499 TemplateVariant inbodyDocs() const
1501 Cachable &cache = getCache();
1502 if (!cache.inbodyDocs || g_globals.outputFormat!=cache.inbodyDocsOutputFormat)
1504 if (!m_def->inbodyDocumentation().isEmpty())
1506 cache.inbodyDocs.reset(new TemplateVariant(parseDoc(m_def,m_def->inbodyFile(),m_def->inbodyLine(),
1507 relPathAsString(),m_def->inbodyDocumentation(),FALSE)));
1508 cache.inbodyDocsOutputFormat = g_globals.outputFormat;
1512 cache.inbodyDocs.reset(new TemplateVariant(""));
1515 return *cache.inbodyDocs;
1517 TemplateVariant dynSectionId() const
1519 return g_globals.dynSectionId;
1521 TemplateVariant language() const
1523 SrcLangExt lang = m_def->getLanguage();
1524 QCString result = "unknown";
1527 case SrcLangExt_Unknown: break;
1528 case SrcLangExt_IDL: result="idl"; break;
1529 case SrcLangExt_Java: result="java"; break;
1530 case SrcLangExt_CSharp: result="csharp"; break;
1531 case SrcLangExt_D: result="d"; break;
1532 case SrcLangExt_PHP: result="php"; break;
1533 case SrcLangExt_ObjC: result="objc"; break;
1534 case SrcLangExt_Cpp: result="cpp"; break;
1535 case SrcLangExt_JS: result="js"; break;
1536 case SrcLangExt_Python: result="python"; break;
1537 case SrcLangExt_Fortran: result="fortran"; break;
1538 case SrcLangExt_VHDL: result="vhdl"; break;
1539 case SrcLangExt_XML: result="xml"; break;
1540 case SrcLangExt_SQL: result="sql"; break;
1541 case SrcLangExt_Tcl: result="tcl"; break;
1542 case SrcLangExt_Markdown: result="markdown"; break;
1543 case SrcLangExt_Slice: result="slice"; break;
1547 TemplateVariant compoundKind() const
1549 QCString result = "unspecified";
1550 switch (m_def->definitionType())
1552 case DefinitionIntf::TypeClass: result="class"; break;
1553 case DefinitionIntf::TypeFile: result="file"; break;
1554 case DefinitionIntf::TypeNamespace: result="namespace"; break;
1555 case DefinitionIntf::TypeGroup: result="module"; break;
1556 case DefinitionIntf::TypePackage: result="package"; break;
1557 case DefinitionIntf::TypePage: result="page"; break;
1558 case DefinitionIntf::TypeDir: result="dir"; break;
1559 case DefinitionIntf::TypeMember: // fall through
1560 case DefinitionIntf::TypeSymbolList:
1565 TemplateVariant sourceDef() const
1567 Cachable &cache = getCache();
1568 if (cache.sourceDef->count()==2)
1570 return cache.sourceDef.get();
1577 void fillPath(Definition *def,TemplateList *list) const
1579 Definition *outerScope = def->getOuterScope();
1580 Definition::DefType type = def->definitionType();
1581 if (outerScope && outerScope!=Doxygen::globalScope)
1583 fillPath(outerScope,list);
1585 else if (type==Definition::TypeFile && ((const FileDef*)def)->getDirDef())
1587 fillPath(((const FileDef*)def)->getDirDef(),list);
1589 list->append(NavPathElemContext::alloc(def));
1591 TemplateVariant navigationPath() const
1593 Cachable &cache = getCache();
1596 TemplateList *list = TemplateList::alloc();
1597 if (m_def->getOuterScope() && m_def->getOuterScope()!=Doxygen::globalScope)
1599 fillPath(m_def->getOuterScope(),list);
1601 else if (m_def->definitionType()==Definition::TypeFile && ((const FileDef *)m_def)->getDirDef())
1603 fillPath(((const FileDef *)m_def)->getDirDef(),list);
1605 cache.navPath.reset(list);
1607 return cache.navPath.get();
1609 TemplateVariant isReference() const
1611 return m_def->isReference();
1613 TemplateVariant externalReference() const
1615 return m_def->externalReference(relPathAsString());
1619 struct Cachable : public Definition::Cookie
1621 Cachable(Definition *def) : detailsOutputFormat(ContextOutputFormat_Unspecified),
1622 briefOutputFormat(ContextOutputFormat_Unspecified),
1623 inbodyDocsOutputFormat(ContextOutputFormat_Unspecified)
1625 sourceDef.reset(TemplateList::alloc());
1626 lineLink.reset(TemplateStruct::alloc());
1627 fileLink.reset(TemplateStruct::alloc());
1629 if (def && !def->getSourceFileBase().isEmpty())
1631 lineLink->set("text",def->getStartBodyLine());
1632 lineLink->set("isLinkable",TRUE);
1633 lineLink->set("fileName",def->getSourceFileBase());
1634 lineLink->set("anchor",def->getSourceAnchor());
1635 lineLink->set("isReference",FALSE);
1636 lineLink->set("externalReference","");
1637 if (def->definitionType()==Definition::TypeFile)
1639 fileLink->set("text",def->name());
1641 else if (def->getBodyDef())
1643 fileLink->set("text",def->getBodyDef()->name());
1647 fileLink->set("text",def->displayName(TRUE));
1649 fileLink->set("isLinkable",TRUE);
1650 fileLink->set("fileName",def->getSourceFileBase());
1651 fileLink->set("anchor",QCString());
1652 fileLink->set("isReference",FALSE);
1653 fileLink->set("externalReference","");
1654 sourceDef->append(lineLink.get());
1655 sourceDef->append(fileLink.get());
1658 ScopedPtr<TemplateVariant> details;
1659 ContextOutputFormat detailsOutputFormat;
1660 ScopedPtr<TemplateVariant> brief;
1661 ContextOutputFormat briefOutputFormat;
1662 ScopedPtr<TemplateVariant> inbodyDocs;
1663 ContextOutputFormat inbodyDocsOutputFormat;
1664 SharedPtr<TemplateList> navPath;
1665 SharedPtr<TemplateList> sourceDef;
1666 SharedPtr<TemplateStruct> fileLink;
1667 SharedPtr<TemplateStruct> lineLink;
1672 Cachable &getCache() const
1674 Cachable *c = static_cast<Cachable*>(m_def->cookie());
1682 //------------------------------------------------------------------------
1684 //%% struct IncludeInfo: include file information
1686 class IncludeInfoContext::Private
1689 Private(const IncludeInfo *info,SrcLangExt lang) :
1693 static bool init=FALSE;
1696 s_inst.addProperty("file",&Private::file);
1697 s_inst.addProperty("name",&Private::name);
1698 s_inst.addProperty("isImport",&Private::isImport);
1699 s_inst.addProperty("isLocal",&Private::isLocal);
1703 TemplateVariant get(const char *n) const
1705 return s_inst.get(this,n);
1707 TemplateVariant isLocal() const
1709 bool isIDLorJava = m_lang==SrcLangExt_IDL || m_lang==SrcLangExt_Java;
1710 return m_info->local || isIDLorJava;
1712 TemplateVariant isImport() const
1714 return m_info->imported || m_lang==SrcLangExt_ObjC;
1716 TemplateVariant file() const
1718 if (!m_fileContext && m_info && m_info->fileDef)
1720 m_fileContext.reset(FileContext::alloc(m_info->fileDef));
1724 return m_fileContext.get();
1731 TemplateVariant name() const
1733 return m_info->includeName;
1736 const IncludeInfo *m_info;
1737 mutable SharedPtr<FileContext> m_fileContext;
1739 static PropertyMapper<IncludeInfoContext::Private> s_inst;
1742 PropertyMapper<IncludeInfoContext::Private> IncludeInfoContext::Private::s_inst;
1744 IncludeInfoContext::IncludeInfoContext(const IncludeInfo *info,SrcLangExt lang) : RefCountedContext("IncludeContext")
1746 p = new Private(info,lang);
1749 IncludeInfoContext::~IncludeInfoContext()
1754 TemplateVariant IncludeInfoContext::get(const char *n) const
1760 //------------------------------------------------------------------------
1762 //%% list IncludeInfoList[Class] : list of nested classes
1763 class IncludeInfoListContext::Private : public GenericNodeListContext
1766 Private(const QList<IncludeInfo> &list,SrcLangExt lang)
1768 QListIterator<IncludeInfo> li(list);
1770 for (li.toFirst();(ii=li.current());++li)
1774 append(IncludeInfoContext::alloc(ii,lang));
1780 IncludeInfoListContext::IncludeInfoListContext(const QList<IncludeInfo> &list,SrcLangExt lang) : RefCountedContext("IncludeListContext")
1782 p = new Private(list,lang);
1785 IncludeInfoListContext::~IncludeInfoListContext()
1791 int IncludeInfoListContext::count() const
1796 TemplateVariant IncludeInfoListContext::at(int index) const
1798 return p->at(index);
1801 TemplateListIntf::ConstIterator *IncludeInfoListContext::createIterator() const
1803 return p->createIterator();
1806 //------------------------------------------------------------------------
1808 //%% struct Class(Symbol): class information
1810 class ClassContext::Private : public DefinitionContext<ClassContext::Private>
1813 Private(ClassDef *cd) : DefinitionContext<ClassContext::Private>(cd),
1816 static bool init=FALSE;
1819 addBaseProperties(s_inst);
1820 s_inst.addProperty("title", &Private::title);
1821 s_inst.addProperty("highlight", &Private::highlight);
1822 s_inst.addProperty("subhighlight", &Private::subHighlight);
1823 s_inst.addProperty("hasDetails", &Private::hasDetails);
1824 s_inst.addProperty("generatedFromFiles", &Private::generatedFromFiles);
1825 s_inst.addProperty("usedFiles", &Private::usedFiles);
1826 s_inst.addProperty("hasInheritanceDiagram", &Private::hasInheritanceDiagram);
1827 s_inst.addProperty("inheritanceDiagram", &Private::inheritanceDiagram);
1828 s_inst.addProperty("hasCollaborationDiagram", &Private::hasCollaborationDiagram);
1829 s_inst.addProperty("collaborationDiagram", &Private::collaborationDiagram);
1830 s_inst.addProperty("includeInfo", &Private::includeInfo);
1831 s_inst.addProperty("inherits", &Private::inherits);
1832 s_inst.addProperty("inheritedBy", &Private::inheritedBy);
1833 s_inst.addProperty("unoIDLServices", &Private::unoIDLServices);
1834 s_inst.addProperty("unoIDLInterfaces", &Private::unoIDLInterfaces);
1835 s_inst.addProperty("signals", &Private::signals);
1836 s_inst.addProperty("publicTypes", &Private::publicTypes);
1837 s_inst.addProperty("publicMethods", &Private::publicMethods);
1838 s_inst.addProperty("publicStaticMethods", &Private::publicStaticMethods);
1839 s_inst.addProperty("publicAttributes", &Private::publicAttributes);
1840 s_inst.addProperty("publicStaticAttributes", &Private::publicStaticAttributes);
1841 s_inst.addProperty("publicSlots", &Private::publicSlots);
1842 s_inst.addProperty("protectedTypes", &Private::protectedTypes);
1843 s_inst.addProperty("protectedMethods", &Private::protectedMethods);
1844 s_inst.addProperty("protectedStaticMethods", &Private::protectedStaticMethods);
1845 s_inst.addProperty("protectedAttributes", &Private::protectedAttributes);
1846 s_inst.addProperty("protectedStaticAttributes", &Private::protectedStaticAttributes);
1847 s_inst.addProperty("protectedSlots", &Private::protectedSlots);
1848 s_inst.addProperty("privateTypes", &Private::privateTypes);
1849 s_inst.addProperty("privateMethods", &Private::privateMethods);
1850 s_inst.addProperty("privateStaticMethods", &Private::privateStaticMethods);
1851 s_inst.addProperty("privateAttributes", &Private::privateAttributes);
1852 s_inst.addProperty("privateStaticAttributes", &Private::privateStaticAttributes);
1853 s_inst.addProperty("privateSlots", &Private::privateSlots);
1854 s_inst.addProperty("packageTypes", &Private::packageTypes);
1855 s_inst.addProperty("packageMethods", &Private::packageMethods);
1856 s_inst.addProperty("packageStaticMethods", &Private::packageStaticMethods);
1857 s_inst.addProperty("packageAttributes", &Private::packageAttributes);
1858 s_inst.addProperty("packageStaticAttributes", &Private::packageStaticAttributes);
1859 s_inst.addProperty("properties", &Private::properties);
1860 s_inst.addProperty("events", &Private::events);
1861 s_inst.addProperty("friends", &Private::friends);
1862 s_inst.addProperty("related", &Private::related);
1863 s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
1864 s_inst.addProperty("detailedEnums", &Private::detailedEnums);
1865 s_inst.addProperty("detailedServices", &Private::detailedServices);
1866 s_inst.addProperty("detailedInterfaces", &Private::detailedInterfaces);
1867 s_inst.addProperty("detailedConstructors", &Private::detailedConstructors);
1868 s_inst.addProperty("detailedMethods", &Private::detailedMethods);
1869 s_inst.addProperty("detailedRelated", &Private::detailedRelated);
1870 s_inst.addProperty("detailedVariables", &Private::detailedVariables);
1871 s_inst.addProperty("detailedProperties", &Private::detailedProperties);
1872 s_inst.addProperty("detailedEvents", &Private::detailedEvents);
1873 s_inst.addProperty("classes", &Private::classes);
1874 s_inst.addProperty("innerClasses", &Private::innerClasses);
1875 s_inst.addProperty("compoundType", &Private::compoundType);
1876 s_inst.addProperty("templateDecls", &Private::templateDecls);
1877 s_inst.addProperty("typeConstraints", &Private::typeConstraints);
1878 s_inst.addProperty("examples", &Private::examples);
1879 s_inst.addProperty("members", &Private::members);
1880 s_inst.addProperty("allMembersList", &Private::allMembersList);
1881 s_inst.addProperty("allMembersFileName", &Private::allMembersFileName);
1882 s_inst.addProperty("memberGroups", &Private::memberGroups);
1883 s_inst.addProperty("additionalInheritedMembers",&Private::additionalInheritedMembers);
1884 s_inst.addProperty("isSimple", &Private::isSimple);
1885 s_inst.addProperty("categoryOf", &Private::categoryOf);
1888 if (!cd->cookie()) { cd->setCookie(new ClassContext::Private::Cachable(cd)); }
1890 virtual ~Private() {}
1891 TemplateVariant get(const char *n) const
1893 return s_inst.get(this,n);
1895 TemplateVariant title() const
1897 return TemplateVariant(m_classDef->title());
1899 TemplateVariant highlight() const
1901 return TemplateVariant("classes");
1903 TemplateVariant subHighlight() const
1905 return TemplateVariant("");
1907 TemplateVariant hasDetails() const
1909 return m_classDef->hasDetailedDescription();
1911 TemplateVariant generatedFromFiles() const
1913 return m_classDef->generatedFromFiles();
1915 TemplateVariant usedFiles() const
1917 Cachable &cache = getCache();
1918 if (!cache.usedFiles)
1920 cache.usedFiles.reset(UsedFilesContext::alloc(m_classDef));
1922 return cache.usedFiles.get();
1924 DotClassGraph *getClassGraph() const
1926 Cachable &cache = getCache();
1927 if (!cache.classGraph)
1929 cache.classGraph.reset(new DotClassGraph(m_classDef,DotNode::Inheritance));
1931 return cache.classGraph.get();
1933 int numInheritanceNodes() const
1935 Cachable &cache = getCache();
1936 if (cache.inheritanceNodes==-1)
1938 cache.inheritanceNodes=m_classDef->countInheritanceNodes();
1940 return cache.inheritanceNodes>0;
1942 TemplateVariant hasInheritanceDiagram() const
1945 static bool haveDot = Config_getBool(HAVE_DOT);
1946 static bool classDiagrams = Config_getBool(CLASS_DIAGRAMS);
1947 static bool classGraph = Config_getBool(CLASS_GRAPH);
1948 if (haveDot && (classDiagrams || classGraph))
1950 DotClassGraph *cg = getClassGraph();
1951 result = !cg->isTrivial() && !cg->isTooBig();
1953 else if (classDiagrams)
1955 result = numInheritanceNodes()>0;
1959 TemplateVariant inheritanceDiagram() const
1962 static bool haveDot = Config_getBool(HAVE_DOT);
1963 static bool classDiagrams = Config_getBool(CLASS_DIAGRAMS);
1964 static bool classGraph = Config_getBool(CLASS_GRAPH);
1965 if (haveDot && (classDiagrams || classGraph))
1967 DotClassGraph *cg = getClassGraph();
1968 FTextStream t(&result);
1969 switch (g_globals.outputFormat)
1971 case ContextOutputFormat_Html:
1973 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
1974 g_globals.outputDir,
1975 g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension,
1976 relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
1980 case ContextOutputFormat_Latex:
1982 cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
1983 g_globals.outputDir,
1984 g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+".tex",
1985 relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
1989 // TODO: support other generators
1991 err("context.cpp: output format not yet supported");
1994 g_globals.dynSectionId++;
1996 else if (classDiagrams)
1998 ClassDiagram d(m_classDef);
1999 FTextStream t(&result);
2000 switch (g_globals.outputFormat)
2002 case ContextOutputFormat_Html:
2005 FTextStream tt(&result);
2007 QCString name = convertToHtml(m_classDef->displayName());
2008 d.writeImage(tt,g_globals.outputDir,
2010 m_classDef->getOutputFileBase());
2011 if (!result.isEmpty())
2013 t << "<div class=\"center\">" << endl;
2014 t << " <img src=\"";
2015 t << relPathAsString() << m_classDef->getOutputFileBase();
2016 t << ".png\" usemap=\"#" << convertToId(name) << "_map\" alt=\"\"/>" << endl;
2017 t << " <map id=\"" << convertToId(name) << "_map\" name=\"" << convertToId(name) << "_map\">" << endl;
2019 t << " </map>" << endl;
2024 t << "<div class=\"center\">" << endl;
2025 t << " <img src=\"";
2026 t << relPathAsString() << m_classDef->getOutputFileBase();
2027 t << ".png\" alt=\"\"/>" << endl;
2032 case ContextOutputFormat_Latex:
2034 d.writeFigure(t,g_globals.outputDir,m_classDef->getOutputFileBase());
2037 // TODO: support other generators
2039 err("context.cpp: output format not yet supported");
2042 g_globals.dynSectionId++;
2044 return TemplateVariant(result.data(),TRUE);
2046 DotClassGraph *getCollaborationGraph() const
2048 Cachable &cache = getCache();
2049 if (!cache.collaborationGraph)
2051 cache.collaborationGraph.reset(new DotClassGraph(m_classDef,DotNode::Collaboration));
2053 return cache.collaborationGraph.get();
2055 TemplateVariant hasCollaborationDiagram() const
2057 static bool haveDot = Config_getBool(HAVE_DOT);
2058 return haveDot && !getCollaborationGraph()->isTrivial();
2060 TemplateVariant collaborationDiagram() const
2062 static bool haveDot = Config_getBool(HAVE_DOT);
2066 DotClassGraph *cg = getCollaborationGraph();
2067 FTextStream t(&result);
2068 switch (g_globals.outputFormat)
2070 case ContextOutputFormat_Html:
2072 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
2073 g_globals.outputDir,
2074 g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension,
2075 relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
2079 case ContextOutputFormat_Latex:
2081 cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
2082 g_globals.outputDir,
2083 g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+".tex",
2084 relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
2088 // TODO: support other generators
2090 err("context.cpp: output format not yet supported");
2093 g_globals.dynSectionId++;
2095 return TemplateVariant(result.data(),TRUE);
2098 TemplateVariant includeInfo() const
2100 Cachable &cache = getCache();
2101 if (!cache.includeInfo && m_classDef->includeInfo())
2103 cache.includeInfo.reset(IncludeInfoContext::alloc(m_classDef->includeInfo(),m_classDef->getLanguage()));
2105 if (cache.includeInfo)
2107 return cache.includeInfo.get();
2111 return TemplateVariant(FALSE);
2114 TemplateVariant inherits() const
2116 Cachable &cache = getCache();
2117 if (!cache.inheritsList)
2119 cache.inheritsList.reset(InheritanceListContext::alloc(m_classDef->baseClasses(),TRUE));
2121 return cache.inheritsList.get();
2123 TemplateVariant inheritedBy() const
2125 Cachable &cache = getCache();
2126 if (!cache.inheritedByList)
2128 cache.inheritedByList.reset(InheritanceListContext::alloc(m_classDef->subClasses(),FALSE));
2130 return cache.inheritedByList.get();
2132 TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
2133 MemberListType type,const char *title,bool detailed=FALSE) const
2137 MemberList *ml = m_classDef->getMemberList(type);
2140 list.reset(MemberListInfoContext::alloc(m_classDef,relPathAsString(),ml,title,""));
2149 return TemplateVariant(FALSE);
2152 TemplateVariant unoIDLServices() const
2154 return getMemberList(getCache().unoIDLServices,MemberListType_services,theTranslator->trServices());
2156 TemplateVariant unoIDLInterfaces() const
2158 return getMemberList(getCache().unoIDLInterfaces,MemberListType_interfaces,theTranslator->trInterfaces());
2160 TemplateVariant signals() const
2162 return getMemberList(getCache().signals,MemberListType_signals,theTranslator->trSignals());
2164 TemplateVariant publicTypes() const
2166 return getMemberList(getCache().publicTypes,MemberListType_pubTypes,theTranslator->trPublicTypes());
2168 TemplateVariant publicMethods() const
2170 return getMemberList(getCache().publicMethods,MemberListType_pubMethods,
2171 m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trInstanceMethods()
2172 : theTranslator->trPublicMembers());
2174 TemplateVariant publicStaticMethods() const
2176 return getMemberList(getCache().publicStaticMethods,MemberListType_pubStaticMethods,
2177 m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trClassMethods()
2178 : theTranslator->trStaticPublicMembers());
2180 TemplateVariant publicAttributes() const
2182 return getMemberList(getCache().publicAttributes,MemberListType_pubAttribs,theTranslator->trPublicAttribs());
2184 TemplateVariant publicStaticAttributes() const
2186 return getMemberList(getCache().publicStaticAttributes,MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs());
2188 TemplateVariant publicSlots() const
2190 return getMemberList(getCache().publicSlots,MemberListType_pubSlots,theTranslator->trPublicSlots());
2192 TemplateVariant protectedTypes() const
2194 return getMemberList(getCache().protectedTypes,MemberListType_proTypes,theTranslator->trProtectedTypes());
2196 TemplateVariant protectedMethods() const
2198 return getMemberList(getCache().protectedMethods,MemberListType_proMethods,theTranslator->trProtectedMembers());
2200 TemplateVariant protectedStaticMethods() const
2202 return getMemberList(getCache().protectedStaticMethods,MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers());
2204 TemplateVariant protectedAttributes() const
2206 return getMemberList(getCache().protectedAttributes,MemberListType_proAttribs,theTranslator->trProtectedAttribs());
2208 TemplateVariant protectedStaticAttributes() const
2210 return getMemberList(getCache().protectedStaticAttributes,MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs());
2212 TemplateVariant protectedSlots() const
2214 return getMemberList(getCache().protectedSlots,MemberListType_proSlots,theTranslator->trProtectedSlots());
2216 TemplateVariant privateTypes() const
2218 return getMemberList(getCache().privateTypes,MemberListType_priTypes,theTranslator->trPrivateTypes());
2220 TemplateVariant privateSlots() const
2222 return getMemberList(getCache().privateSlots,MemberListType_priSlots,theTranslator->trPrivateSlots());
2224 TemplateVariant privateMethods() const
2226 return getMemberList(getCache().privateMethods,MemberListType_priMethods,theTranslator->trPrivateMembers());
2228 TemplateVariant privateStaticMethods() const
2230 return getMemberList(getCache().privateStaticMethods,MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers());
2232 TemplateVariant privateAttributes() const
2234 return getMemberList(getCache().privateAttributes,MemberListType_priAttribs,theTranslator->trPrivateAttribs());
2236 TemplateVariant privateStaticAttributes() const
2238 return getMemberList(getCache().privateStaticAttributes,MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs());
2240 TemplateVariant packageTypes() const
2242 return getMemberList(getCache().packageTypes,MemberListType_pacTypes,theTranslator->trPackageTypes());
2244 TemplateVariant packageMethods() const
2246 return getMemberList(getCache().packageMethods,MemberListType_pacMethods,theTranslator->trPackageMembers());
2248 TemplateVariant packageStaticMethods() const
2250 return getMemberList(getCache().packageStaticMethods,MemberListType_pacStaticMethods,theTranslator->trStaticPackageMembers());
2252 TemplateVariant packageAttributes() const
2254 return getMemberList(getCache().packageAttributes,MemberListType_pacAttribs,theTranslator->trPackageAttribs());
2256 TemplateVariant packageStaticAttributes() const
2258 return getMemberList(getCache().packageStaticAttributes,MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs());
2260 TemplateVariant properties() const
2262 return getMemberList(getCache().properties,MemberListType_properties,theTranslator->trProperties());
2264 TemplateVariant events() const
2266 return getMemberList(getCache().events,MemberListType_events,theTranslator->trEvents());
2268 TemplateVariant friends() const
2270 return getMemberList(getCache().friends,MemberListType_friends,theTranslator->trFriends());
2272 TemplateVariant related() const
2274 return getMemberList(getCache().related,MemberListType_related,theTranslator->trRelatedFunctions());
2276 TemplateVariant detailedTypedefs() const
2278 return getMemberList(getCache().detailedTypedefs,MemberListType_typedefMembers,theTranslator->trMemberTypedefDocumentation(),TRUE);
2280 TemplateVariant detailedEnums() const
2282 return getMemberList(getCache().detailedEnums,MemberListType_enumMembers,theTranslator->trMemberEnumerationDocumentation(),TRUE);
2284 TemplateVariant detailedServices() const
2286 return getMemberList(getCache().detailedServices,MemberListType_serviceMembers,theTranslator->trServices(),TRUE);
2288 TemplateVariant detailedInterfaces() const
2290 return getMemberList(getCache().detailedInterfaces,MemberListType_interfaceMembers,theTranslator->trInterfaces(),TRUE);
2292 TemplateVariant detailedConstructors() const
2294 return getMemberList(getCache().detailedConstructors,MemberListType_constructors,theTranslator->trConstructorDocumentation(),TRUE);
2296 TemplateVariant detailedMethods() const
2298 return getMemberList(getCache().detailedMethods,MemberListType_functionMembers,theTranslator->trMemberFunctionDocumentation(),TRUE);
2300 TemplateVariant detailedRelated() const
2302 return getMemberList(getCache().detailedRelated,MemberListType_relatedMembers,theTranslator->trRelatedFunctionDocumentation(),TRUE);
2304 TemplateVariant detailedVariables() const
2306 return getMemberList(getCache().detailedVariables,MemberListType_variableMembers,theTranslator->trMemberDataDocumentation(),TRUE);
2308 TemplateVariant detailedProperties() const
2310 return getMemberList(getCache().detailedProperties,MemberListType_propertyMembers,theTranslator->trPropertyDocumentation(),TRUE);
2312 TemplateVariant detailedEvents() const
2314 return getMemberList(getCache().detailedEvents,MemberListType_eventMembers,theTranslator->trEventDocumentation(),TRUE);
2316 TemplateVariant classes() const
2318 Cachable &cache = getCache();
2321 TemplateList *classList = TemplateList::alloc();
2322 if (m_classDef->getClassSDict())
2324 ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
2326 for (sdi.toFirst();(cd=sdi.current());++sdi)
2328 if (cd->visibleInParentsDeclList())
2330 classList->append(ClassContext::alloc(cd));
2334 cache.classes.reset(classList);
2336 return cache.classes.get();
2338 TemplateVariant innerClasses() const
2340 Cachable &cache = getCache();
2341 if (!cache.innerClasses)
2343 TemplateList *classList = TemplateList::alloc();
2344 if (m_classDef->getClassSDict())
2346 ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
2348 for (sdi.toFirst();(cd=sdi.current());++sdi)
2350 if (cd->name().find('@')==-1 &&
2351 cd->isLinkableInProject() &&
2352 cd->isEmbeddedInOuterScope() &&
2353 cd->partOfGroups()==0
2356 classList->append(ClassContext::alloc(cd));
2360 cache.innerClasses.reset(classList);
2362 return cache.innerClasses.get();
2364 TemplateVariant compoundType() const
2366 return m_classDef->compoundTypeString();
2368 void addTemplateDecls(Definition *d,TemplateList *tl) const
2370 if (d->definitionType()==Definition::TypeClass)
2372 Definition *parent = d->getOuterScope();
2375 addTemplateDecls(parent,tl);
2377 ClassDef *cd=(ClassDef *)d;
2378 if (cd->templateArguments())
2380 ArgumentListContext *al = ArgumentListContext::alloc(cd->templateArguments(),cd,relPathAsString());
2381 // since a TemplateVariant does take ownership of the object, we add it
2382 // a separate list just to be able to delete it and avoid a memory leak
2387 void addExamples(TemplateList *list) const
2389 if (m_classDef->hasExamples())
2391 ExampleSDict::Iterator it(*m_classDef->exampleList());
2393 for (it.toFirst();(ex=it.current());++it)
2395 TemplateStruct *s = TemplateStruct::alloc();
2396 s->set("text",ex->name);
2397 s->set("isLinkable",TRUE);
2398 s->set("anchor",ex->anchor);
2399 s->set("fileName",ex->file);
2400 s->set("isReference",FALSE);
2401 s->set("externalReference","");
2406 TemplateVariant templateDecls() const
2408 Cachable &cache = getCache();
2409 if (!cache.templateDecls)
2411 TemplateList *tl = TemplateList::alloc();
2412 addTemplateDecls(m_classDef,tl);
2413 cache.templateDecls.reset(tl);
2415 return cache.templateDecls.get();
2417 TemplateVariant typeConstraints() const
2419 if (m_classDef->typeConstraints())
2421 Cachable &cache = getCache();
2422 if (!cache.typeConstraints && m_classDef->typeConstraints())
2424 cache.typeConstraints.reset(ArgumentListContext::alloc(m_classDef->typeConstraints(),m_classDef,relPathAsString()));
2426 return cache.typeConstraints.get();
2430 TemplateVariant examples() const
2432 Cachable &cache = getCache();
2433 if (!cache.examples)
2435 TemplateList *exampleList = TemplateList::alloc();
2436 addExamples(exampleList);
2437 cache.examples.reset(exampleList);
2439 return cache.examples.get();
2441 void addMembers(ClassDef *cd,MemberListType lt) const
2443 MemberList *ml = cd->getMemberList(lt);
2446 Cachable &cache = getCache();
2447 MemberListIterator li(*ml);
2448 const MemberDef *md;
2449 for (li.toFirst();(md=li.current());++li)
2451 if (md->isBriefSectionVisible())
2453 cache.allMembers.append(md);
2458 TemplateVariant members() const
2460 Cachable &cache = getCache();
2463 addMembers(m_classDef,MemberListType_pubTypes);
2464 addMembers(m_classDef,MemberListType_services);
2465 addMembers(m_classDef,MemberListType_interfaces);
2466 addMembers(m_classDef,MemberListType_pubSlots);
2467 addMembers(m_classDef,MemberListType_signals);
2468 addMembers(m_classDef,MemberListType_pubMethods);
2469 addMembers(m_classDef,MemberListType_pubStaticMethods);
2470 addMembers(m_classDef,MemberListType_pubAttribs);
2471 addMembers(m_classDef,MemberListType_pubStaticAttribs);
2472 addMembers(m_classDef,MemberListType_proTypes);
2473 addMembers(m_classDef,MemberListType_proSlots);
2474 addMembers(m_classDef,MemberListType_proMethods);
2475 addMembers(m_classDef,MemberListType_proStaticMethods);
2476 addMembers(m_classDef,MemberListType_proAttribs);
2477 addMembers(m_classDef,MemberListType_proStaticAttribs);
2478 addMembers(m_classDef,MemberListType_pacTypes);
2479 addMembers(m_classDef,MemberListType_pacMethods);
2480 addMembers(m_classDef,MemberListType_pacStaticMethods);
2481 addMembers(m_classDef,MemberListType_pacAttribs);
2482 addMembers(m_classDef,MemberListType_pacStaticAttribs);
2483 addMembers(m_classDef,MemberListType_properties);
2484 addMembers(m_classDef,MemberListType_events);
2485 addMembers(m_classDef,MemberListType_priTypes);
2486 addMembers(m_classDef,MemberListType_priSlots);
2487 addMembers(m_classDef,MemberListType_priMethods);
2488 addMembers(m_classDef,MemberListType_priStaticMethods);
2489 addMembers(m_classDef,MemberListType_priAttribs);
2490 addMembers(m_classDef,MemberListType_priStaticAttribs);
2491 addMembers(m_classDef,MemberListType_related);
2492 cache.members.reset(MemberListContext::alloc(&cache.allMembers));
2494 return cache.members.get();
2496 TemplateVariant allMembersList() const
2498 Cachable &cache = getCache();
2499 if (!cache.allMembersList)
2501 if (m_classDef->memberNameInfoSDict())
2503 AllMembersListContext *ml = AllMembersListContext::alloc(m_classDef->memberNameInfoSDict());
2504 cache.allMembersList.reset(ml);
2508 cache.allMembersList.reset(AllMembersListContext::alloc());
2511 return cache.allMembersList.get();
2513 TemplateVariant allMembersFileName() const
2515 return m_classDef->getMemberListFileName();
2517 TemplateVariant memberGroups() const
2519 Cachable &cache = getCache();
2520 if (!cache.memberGroups)
2522 if (m_classDef->getMemberGroupSDict())
2524 cache.memberGroups.reset(MemberGroupListContext::alloc(m_classDef,relPathAsString(),m_classDef->getMemberGroupSDict(),m_classDef->subGrouping()));
2528 cache.memberGroups.reset(MemberGroupListContext::alloc());
2531 return cache.memberGroups.get();
2533 TemplateVariant additionalInheritedMembers() const
2535 Cachable &cache = getCache();
2536 if (!cache.additionalInheritedMembers)
2538 InheritedMemberInfoListContext *ctx = InheritedMemberInfoListContext::alloc();
2539 ctx->addMemberList(m_classDef,MemberListType_pubTypes,theTranslator->trPublicTypes());
2540 ctx->addMemberList(m_classDef,MemberListType_services,theTranslator->trServices());
2541 ctx->addMemberList(m_classDef,MemberListType_interfaces,theTranslator->trInterfaces());
2542 ctx->addMemberList(m_classDef,MemberListType_pubSlots,theTranslator->trPublicSlots());
2543 ctx->addMemberList(m_classDef,MemberListType_signals,theTranslator->trSignals());
2544 ctx->addMemberList(m_classDef,MemberListType_pubMethods,
2545 m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trInstanceMethods()
2546 : theTranslator->trPublicMembers());
2547 ctx->addMemberList(m_classDef,MemberListType_pubStaticMethods,
2548 m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trClassMethods()
2549 : theTranslator->trStaticPublicMembers());
2550 ctx->addMemberList(m_classDef,MemberListType_pubAttribs,theTranslator->trPublicAttribs());
2551 ctx->addMemberList(m_classDef,MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs());
2552 ctx->addMemberList(m_classDef,MemberListType_proTypes,theTranslator->trProtectedTypes());
2553 ctx->addMemberList(m_classDef,MemberListType_proSlots,theTranslator->trProtectedSlots());
2554 ctx->addMemberList(m_classDef,MemberListType_proMethods,theTranslator->trProtectedMembers());
2555 ctx->addMemberList(m_classDef,MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers());
2556 ctx->addMemberList(m_classDef,MemberListType_proAttribs,theTranslator->trProtectedAttribs());
2557 ctx->addMemberList(m_classDef,MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs());
2558 ctx->addMemberList(m_classDef,MemberListType_pacTypes,theTranslator->trPackageTypes());
2559 ctx->addMemberList(m_classDef,MemberListType_pacMethods,theTranslator->trPackageMembers());
2560 ctx->addMemberList(m_classDef,MemberListType_pacStaticMethods,theTranslator->trStaticPackageMembers());
2561 ctx->addMemberList(m_classDef,MemberListType_pacAttribs,theTranslator->trPackageAttribs());
2562 ctx->addMemberList(m_classDef,MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs());
2563 ctx->addMemberList(m_classDef,MemberListType_properties,theTranslator->trProperties());
2564 ctx->addMemberList(m_classDef,MemberListType_events,theTranslator->trEvents());
2565 ctx->addMemberList(m_classDef,MemberListType_priTypes,theTranslator->trPrivateTypes());
2566 ctx->addMemberList(m_classDef,MemberListType_priSlots,theTranslator->trPrivateSlots());
2567 ctx->addMemberList(m_classDef,MemberListType_priMethods,theTranslator->trPrivateMembers());
2568 ctx->addMemberList(m_classDef,MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers());
2569 ctx->addMemberList(m_classDef,MemberListType_priAttribs,theTranslator->trPrivateAttribs());
2570 ctx->addMemberList(m_classDef,MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs());
2571 ctx->addMemberList(m_classDef,MemberListType_related,theTranslator->trRelatedFunctions());
2572 cache.additionalInheritedMembers.reset(ctx);
2574 return cache.additionalInheritedMembers.get();
2576 TemplateVariant isSimple() const
2578 return m_classDef->isSimple();
2580 TemplateVariant categoryOf() const
2582 Cachable &cache = getCache();
2583 if (!cache.categoryOf && m_classDef->categoryOf())
2585 cache.categoryOf.reset(ClassContext::alloc(m_classDef->categoryOf()));
2587 if (cache.categoryOf)
2589 return cache.categoryOf.get();
2593 return TemplateVariant(FALSE);
2598 ClassDef *m_classDef;
2599 struct Cachable : public DefinitionContext<ClassContext::Private>::Cachable
2601 Cachable(ClassDef *cd) : DefinitionContext<ClassContext::Private>::Cachable(cd),
2602 inheritanceNodes(-1) { }
2603 SharedPtr<IncludeInfoContext> includeInfo;
2604 SharedPtr<InheritanceListContext> inheritsList;
2605 SharedPtr<InheritanceListContext> inheritedByList;
2606 ScopedPtr<DotClassGraph> classGraph;
2607 ScopedPtr<DotClassGraph> collaborationGraph;
2608 SharedPtr<TemplateList> classes;
2609 SharedPtr<TemplateList> innerClasses;
2610 SharedPtr<MemberListInfoContext> publicTypes;
2611 SharedPtr<MemberListInfoContext> publicMethods;
2612 SharedPtr<MemberListInfoContext> publicStaticMethods;
2613 SharedPtr<MemberListInfoContext> publicAttributes;
2614 SharedPtr<MemberListInfoContext> publicStaticAttributes;
2615 SharedPtr<MemberListInfoContext> publicSlots;
2616 SharedPtr<MemberListInfoContext> protectedTypes;
2617 SharedPtr<MemberListInfoContext> protectedMethods;
2618 SharedPtr<MemberListInfoContext> protectedStaticMethods;
2619 SharedPtr<MemberListInfoContext> protectedAttributes;
2620 SharedPtr<MemberListInfoContext> protectedStaticAttributes;
2621 SharedPtr<MemberListInfoContext> protectedSlots;
2622 SharedPtr<MemberListInfoContext> privateTypes;
2623 SharedPtr<MemberListInfoContext> privateMethods;
2624 SharedPtr<MemberListInfoContext> privateStaticMethods;
2625 SharedPtr<MemberListInfoContext> privateAttributes;
2626 SharedPtr<MemberListInfoContext> privateStaticAttributes;
2627 SharedPtr<MemberListInfoContext> privateSlots;
2628 SharedPtr<MemberListInfoContext> packageTypes;
2629 SharedPtr<MemberListInfoContext> packageMethods;
2630 SharedPtr<MemberListInfoContext> packageStaticMethods;
2631 SharedPtr<MemberListInfoContext> packageAttributes;
2632 SharedPtr<MemberListInfoContext> packageStaticAttributes;
2633 SharedPtr<MemberListInfoContext> unoIDLServices;
2634 SharedPtr<MemberListInfoContext> unoIDLInterfaces;
2635 SharedPtr<MemberListInfoContext> signals;
2636 SharedPtr<MemberListInfoContext> properties;
2637 SharedPtr<MemberListInfoContext> events;
2638 SharedPtr<MemberListInfoContext> friends;
2639 SharedPtr<MemberListInfoContext> related;
2640 SharedPtr<MemberListInfoContext> detailedTypedefs;
2641 SharedPtr<MemberListInfoContext> detailedEnums;
2642 SharedPtr<MemberListInfoContext> detailedServices;
2643 SharedPtr<MemberListInfoContext> detailedInterfaces;
2644 SharedPtr<MemberListInfoContext> detailedConstructors;
2645 SharedPtr<MemberListInfoContext> detailedMethods;
2646 SharedPtr<MemberListInfoContext> detailedRelated;
2647 SharedPtr<MemberListInfoContext> detailedVariables;
2648 SharedPtr<MemberListInfoContext> detailedProperties;
2649 SharedPtr<MemberListInfoContext> detailedEvents;
2650 SharedPtr<MemberGroupListContext> memberGroups;
2651 SharedPtr<AllMembersListContext> allMembersList;
2652 SharedPtr<ArgumentListContext> typeConstraints;
2653 SharedPtr<TemplateList> examples;
2654 SharedPtr<TemplateList> templateDecls;
2655 SharedPtr<InheritedMemberInfoListContext> additionalInheritedMembers;
2656 SharedPtr<MemberListContext> members;
2657 SharedPtr<UsedFilesContext> usedFiles;
2658 SharedPtr<TemplateList> exampleList;
2659 SharedPtr<ClassContext> categoryOf;
2660 int inheritanceNodes;
2661 MemberList allMembers;
2663 Cachable &getCache() const
2665 Cachable *c = static_cast<Cachable*>(m_classDef->cookie());
2669 static PropertyMapper<ClassContext::Private> s_inst;
2673 PropertyMapper<ClassContext::Private> ClassContext::Private::s_inst;
2675 ClassContext::ClassContext(ClassDef *cd) : RefCountedContext("ClassContext")
2677 //printf("ClassContext::ClassContext(%s)\n",cd?cd->name().data():"<none>");
2678 p = new Private(cd);
2681 ClassContext::~ClassContext()
2686 TemplateVariant ClassContext::get(const char *n) const
2691 //------------------------------------------------------------------------
2693 //%% struct Namespace(Symbol): namespace information
2695 class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Private>
2698 Private(NamespaceDef *nd) : DefinitionContext<NamespaceContext::Private>(nd),
2701 static bool init=FALSE;
2704 addBaseProperties(s_inst);
2705 s_inst.addProperty("title", &Private::title);
2706 s_inst.addProperty("highlight", &Private::highlight);
2707 s_inst.addProperty("subhighlight", &Private::subHighlight);
2708 s_inst.addProperty("compoundType", &Private::compoundType);
2709 s_inst.addProperty("hasDetails", &Private::hasDetails);
2710 s_inst.addProperty("classes", &Private::classes);
2711 //s_inst.addProperty("interfaces", &Private::interfaces);
2712 s_inst.addProperty("namespaces", &Private::namespaces);
2713 s_inst.addProperty("constantgroups", &Private::constantgroups);
2714 s_inst.addProperty("typedefs", &Private::typedefs);
2715 s_inst.addProperty("sequences", &Private::sequences);
2716 s_inst.addProperty("dictionaries", &Private::dictionaries);
2717 s_inst.addProperty("enums", &Private::enums);
2718 s_inst.addProperty("functions", &Private::functions);
2719 s_inst.addProperty("variables", &Private::variables);
2720 s_inst.addProperty("memberGroups", &Private::memberGroups);
2721 s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
2722 s_inst.addProperty("detailedSequences", &Private::detailedSequences);
2723 s_inst.addProperty("detailedDictionaries", &Private::detailedDictionaries);
2724 s_inst.addProperty("detailedEnums", &Private::detailedEnums);
2725 s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
2726 s_inst.addProperty("detailedVariables", &Private::detailedVariables);
2727 s_inst.addProperty("inlineClasses", &Private::inlineClasses);
2730 if (!nd->cookie()) { nd->setCookie(new NamespaceContext::Private::Cachable(nd)); }
2732 virtual ~Private() {}
2733 TemplateVariant get(const char *n) const
2735 return s_inst.get(this,n);
2737 TemplateVariant title() const
2739 return TemplateVariant(m_namespaceDef->title());
2741 TemplateVariant highlight() const
2743 return TemplateVariant("namespaces");
2745 TemplateVariant subHighlight() const
2747 return TemplateVariant("");
2749 TemplateVariant compoundType() const
2751 return m_namespaceDef->compoundTypeString();
2753 TemplateVariant hasDetails() const
2755 return m_namespaceDef->hasDetailedDescription();
2757 TemplateVariant classes() const
2759 Cachable &cache = getCache();
2762 static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
2763 TemplateList *classList = TemplateList::alloc();
2764 if (m_namespaceDef->getClassSDict())
2766 ClassSDict::Iterator sdi(*m_namespaceDef->getClassSDict());
2768 for (sdi.toFirst();(cd=sdi.current());++sdi)
2770 if (sliceOpt && (cd->compoundType()==ClassDef::Struct ||
2771 cd->compoundType()==ClassDef::Interface ||
2772 cd->compoundType()==ClassDef::Exception))
2774 continue; // These types appear in their own sections.
2776 if (cd->visibleInParentsDeclList())
2778 classList->append(ClassContext::alloc(cd));
2782 cache.classes.reset(classList);
2784 return cache.classes.get();
2786 TemplateVariant namespaces() const
2788 Cachable &cache = getCache();
2789 if (!cache.namespaces)
2791 TemplateList *namespaceList = TemplateList::alloc();
2792 if (m_namespaceDef->getNamespaceSDict())
2794 NamespaceSDict::Iterator sdi(*m_namespaceDef->getNamespaceSDict());
2796 for (sdi.toFirst();(nd=sdi.current());++sdi)
2798 if (nd->isLinkable() && !nd->isConstantGroup())
2800 namespaceList->append(NamespaceContext::alloc(nd));
2804 cache.namespaces.reset(namespaceList);
2806 return cache.namespaces.get();
2808 TemplateVariant constantgroups() const
2810 Cachable &cache = getCache();
2811 if (!cache.constantgroups)
2813 TemplateList *namespaceList = TemplateList::alloc();
2814 if (m_namespaceDef->getNamespaceSDict())
2816 NamespaceSDict::Iterator sdi(*m_namespaceDef->getNamespaceSDict());
2818 for (sdi.toFirst();(nd=sdi.current());++sdi)
2820 if (nd->isLinkable() && nd->isConstantGroup())
2822 namespaceList->append(NamespaceContext::alloc(nd));
2826 cache.constantgroups.reset(namespaceList);
2828 return cache.constantgroups.get();
2830 TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
2831 MemberListType type,const char *title,bool detailed=FALSE) const
2835 MemberList *ml = m_namespaceDef->getMemberList(type);
2838 list.reset(MemberListInfoContext::alloc(m_namespaceDef,relPathAsString(),ml,title,""));
2847 return TemplateVariant(FALSE);
2850 TemplateVariant typedefs() const
2852 return getMemberList(getCache().typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
2854 TemplateVariant sequences() const
2856 return getMemberList(getCache().sequences,MemberListType_decSequenceMembers,theTranslator->trSequences());
2858 TemplateVariant dictionaries() const
2860 return getMemberList(getCache().dictionaries,MemberListType_decDictionaryMembers,theTranslator->trDictionaries());
2862 TemplateVariant enums() const
2864 return getMemberList(getCache().enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
2866 TemplateVariant functions() const
2868 QCString title = theTranslator->trFunctions();
2869 SrcLangExt lang = m_namespaceDef->getLanguage();
2870 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
2871 else if (lang==SrcLangExt_VHDL) title=theTranslator->trFunctionAndProc();
2872 return getMemberList(getCache().functions,MemberListType_decFuncMembers,title);
2874 TemplateVariant variables() const
2876 static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
2877 return getMemberList(getCache().variables,MemberListType_decVarMembers,
2878 sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables());
2880 TemplateVariant memberGroups() const
2882 Cachable &cache = getCache();
2883 if (!cache.memberGroups)
2885 if (m_namespaceDef->getMemberGroupSDict())
2887 cache.memberGroups.reset(MemberGroupListContext::alloc(m_namespaceDef,relPathAsString(),m_namespaceDef->getMemberGroupSDict(),m_namespaceDef->subGrouping()));
2891 cache.memberGroups.reset(MemberGroupListContext::alloc());
2894 return cache.memberGroups.get();
2896 TemplateVariant detailedTypedefs() const
2898 return getMemberList(getCache().detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
2900 TemplateVariant detailedSequences() const
2902 return getMemberList(getCache().detailedSequences,MemberListType_docSequenceMembers,theTranslator->trSequenceDocumentation());
2904 TemplateVariant detailedDictionaries() const
2906 return getMemberList(getCache().detailedDictionaries,MemberListType_docDictionaryMembers,theTranslator->trDictionaryDocumentation());
2908 TemplateVariant detailedEnums() const
2910 return getMemberList(getCache().detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
2912 TemplateVariant detailedFunctions() const
2914 QCString title = theTranslator->trFunctionDocumentation();
2915 SrcLangExt lang = m_namespaceDef->getLanguage();
2916 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation();
2917 return getMemberList(getCache().detailedFunctions,MemberListType_docFuncMembers,title);
2919 TemplateVariant detailedVariables() const
2921 static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
2922 return getMemberList(getCache().detailedVariables,MemberListType_docVarMembers,
2923 sliceOpt ? theTranslator->trConstantDocumentation() :
2924 theTranslator->trVariableDocumentation());
2926 TemplateVariant inlineClasses() const
2928 Cachable &cache = getCache();
2929 if (!cache.inlineClasses)
2931 TemplateList *classList = TemplateList::alloc();
2932 if (m_namespaceDef->getClassSDict())
2934 ClassSDict::Iterator sdi(*m_namespaceDef->getClassSDict());
2936 for (sdi.toFirst();(cd=sdi.current());++sdi)
2938 if (cd->name().find('@')==-1 &&
2939 cd->isLinkableInProject() &&
2940 cd->isEmbeddedInOuterScope() &&
2941 cd->partOfGroups()==0)
2943 classList->append(ClassContext::alloc(cd));
2947 cache.inlineClasses.reset(classList);
2949 return cache.inlineClasses.get();
2952 NamespaceDef *m_namespaceDef;
2953 struct Cachable : public DefinitionContext<NamespaceContext::Private>::Cachable
2955 Cachable(NamespaceDef *nd) : DefinitionContext<NamespaceContext::Private>::Cachable(nd) {}
2956 SharedPtr<TemplateList> classes;
2957 SharedPtr<TemplateList> interfaces;
2958 SharedPtr<TemplateList> namespaces;
2959 SharedPtr<TemplateList> constantgroups;
2960 SharedPtr<MemberListInfoContext> typedefs;
2961 SharedPtr<MemberListInfoContext> sequences;
2962 SharedPtr<MemberListInfoContext> dictionaries;
2963 SharedPtr<MemberListInfoContext> enums;
2964 SharedPtr<MemberListInfoContext> functions;
2965 SharedPtr<MemberListInfoContext> variables;
2966 SharedPtr<MemberGroupListContext> memberGroups;
2967 SharedPtr<MemberListInfoContext> detailedTypedefs;
2968 SharedPtr<MemberListInfoContext> detailedSequences;
2969 SharedPtr<MemberListInfoContext> detailedDictionaries;
2970 SharedPtr<MemberListInfoContext> detailedEnums;
2971 SharedPtr<MemberListInfoContext> detailedFunctions;
2972 SharedPtr<MemberListInfoContext> detailedVariables;
2973 SharedPtr<TemplateList> inlineClasses;
2975 Cachable &getCache() const
2977 Cachable *c = static_cast<Cachable*>(m_namespaceDef->cookie());
2981 static PropertyMapper<NamespaceContext::Private> s_inst;
2985 PropertyMapper<NamespaceContext::Private> NamespaceContext::Private::s_inst;
2987 NamespaceContext::NamespaceContext(NamespaceDef *nd) : RefCountedContext("NamespaceContext")
2989 p = new Private(nd);
2992 NamespaceContext::~NamespaceContext()
2997 TemplateVariant NamespaceContext::get(const char *n) const
3002 //------------------------------------------------------------------------
3004 //%% struct File(Symbol): file information
3006 class FileContext::Private : public DefinitionContext<FileContext::Private>
3009 Private(FileDef *fd) : DefinitionContext<FileContext::Private>(fd) , m_fileDef(fd)
3012 static bool init=FALSE;
3015 addBaseProperties(s_inst);
3016 s_inst.addProperty("title", &Private::title);
3017 s_inst.addProperty("highlight", &Private::highlight);
3018 s_inst.addProperty("subhighlight", &Private::subHighlight);
3019 s_inst.addProperty("versionInfo", &Private::versionInfo);
3020 s_inst.addProperty("includeList", &Private::includeList);
3021 s_inst.addProperty("hasIncludeGraph", &Private::hasIncludeGraph);
3022 s_inst.addProperty("hasIncludedByGraph", &Private::hasIncludedByGraph);
3023 s_inst.addProperty("includeGraph", &Private::includeGraph);
3024 s_inst.addProperty("includedByGraph", &Private::includedByGraph);
3025 s_inst.addProperty("hasDetails", &Private::hasDetails);
3026 s_inst.addProperty("hasSourceFile", &Private::hasSourceFile);
3027 s_inst.addProperty("sources", &Private::sources);
3028 s_inst.addProperty("version", &Private::version);
3029 s_inst.addProperty("classes", &Private::classes);
3030 s_inst.addProperty("namespaces", &Private::namespaces);
3031 s_inst.addProperty("constantgroups", &Private::constantgroups);
3032 s_inst.addProperty("macros", &Private::macros);
3033 s_inst.addProperty("typedefs", &Private::typedefs);
3034 s_inst.addProperty("sequences", &Private::sequences);
3035 s_inst.addProperty("dictionaries", &Private::dictionaries);
3036 s_inst.addProperty("enums", &Private::enums);
3037 s_inst.addProperty("functions", &Private::functions);
3038 s_inst.addProperty("variables", &Private::variables);
3039 s_inst.addProperty("memberGroups", &Private::memberGroups);
3040 s_inst.addProperty("detailedMacros", &Private::detailedMacros);
3041 s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
3042 s_inst.addProperty("detailedSequences", &Private::detailedSequences);
3043 s_inst.addProperty("detailedDictionaries", &Private::detailedDictionaries);
3044 s_inst.addProperty("detailedEnums", &Private::detailedEnums);
3045 s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
3046 s_inst.addProperty("detailedVariables", &Private::detailedVariables);
3047 s_inst.addProperty("inlineClasses", &Private::inlineClasses);
3048 s_inst.addProperty("compoundType", &Private::compoundType);
3051 if (!fd->cookie()) { fd->setCookie(new FileContext::Private::Cachable(fd)); }
3053 virtual ~Private() {}
3054 TemplateVariant get(const char *n) const
3056 return s_inst.get(this,n);
3058 TemplateVariant title() const
3060 return m_fileDef->title();
3062 TemplateVariant highlight() const
3064 return TemplateVariant("files");
3066 TemplateVariant subHighlight() const
3068 return TemplateVariant("");
3070 TemplateVariant versionInfo() const
3072 return m_fileDef->getVersion();
3074 TemplateVariant includeList() const
3076 Cachable &cache = getCache();
3077 if (!cache.includeInfoList && m_fileDef->includeFileList())
3079 cache.includeInfoList.reset(IncludeInfoListContext::alloc(
3080 *m_fileDef->includeFileList(),m_fileDef->getLanguage()));
3082 if (cache.includeInfoList)
3084 return cache.includeInfoList.get();
3088 return TemplateVariant(FALSE);
3091 DotInclDepGraph *getIncludeGraph() const
3093 Cachable &cache = getCache();
3094 if (!cache.includeGraph)
3096 cache.includeGraph.reset(new DotInclDepGraph(m_fileDef,FALSE));
3098 return cache.includeGraph.get();
3100 TemplateVariant hasIncludeGraph() const
3102 static bool haveDot = Config_getBool(HAVE_DOT);
3103 DotInclDepGraph *incGraph = getIncludeGraph();
3104 return (haveDot && !incGraph->isTooBig() && !incGraph->isTrivial());
3106 TemplateVariant includeGraph() const
3108 static bool haveDot = Config_getBool(HAVE_DOT);
3112 DotInclDepGraph *cg = getIncludeGraph();
3113 FTextStream t(&result);
3114 switch (g_globals.outputFormat)
3116 case ContextOutputFormat_Html:
3118 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
3119 g_globals.outputDir,
3120 g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
3121 relPathAsString(),TRUE,g_globals.dynSectionId
3125 case ContextOutputFormat_Latex:
3127 cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
3128 g_globals.outputDir,
3129 g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+".tex",
3130 relPathAsString(),TRUE,g_globals.dynSectionId
3134 // TODO: support other generators
3136 err("context.cpp: output format not yet supported");
3139 g_globals.dynSectionId++;
3141 return TemplateVariant(result.data(),TRUE);
3143 DotInclDepGraph *getIncludedByGraph() const
3145 Cachable &cache = getCache();
3146 if (!cache.includedByGraph)
3148 cache.includedByGraph.reset(new DotInclDepGraph(m_fileDef,TRUE));
3150 return cache.includedByGraph.get();
3152 TemplateVariant hasIncludedByGraph() const
3154 static bool haveDot = Config_getBool(HAVE_DOT);
3155 DotInclDepGraph *incGraph = getIncludedByGraph();
3156 return (haveDot && !incGraph->isTooBig() && !incGraph->isTrivial());
3158 TemplateVariant includedByGraph() const
3160 static bool haveDot = Config_getBool(HAVE_DOT);
3164 DotInclDepGraph *cg = getIncludedByGraph();
3165 FTextStream t(&result);
3166 switch (g_globals.outputFormat)
3168 case ContextOutputFormat_Html:
3170 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
3171 g_globals.outputDir,
3172 g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
3173 relPathAsString(),TRUE,g_globals.dynSectionId
3177 case ContextOutputFormat_Latex:
3179 cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
3180 g_globals.outputDir,
3181 g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+".tex",
3182 relPathAsString(),TRUE,g_globals.dynSectionId
3186 // TODO: support other generators
3188 err("context.cpp: output format not yet supported");
3191 g_globals.dynSectionId++;
3193 return TemplateVariant(result.data(),TRUE);
3195 TemplateVariant hasDetails() const
3197 return m_fileDef->hasDetailedDescription();
3199 TemplateVariant hasSourceFile() const
3201 return m_fileDef->generateSourceFile();
3203 TemplateVariant sources() const
3205 Cachable &cache = getCache();
3208 if (m_fileDef->generateSourceFile())
3210 cache.sources.reset(new TemplateVariant(parseCode(m_fileDef,relPathAsString())));
3214 cache.sources.reset(new TemplateVariant(""));
3217 return *cache.sources;
3219 TemplateVariant version() const
3221 return m_fileDef->fileVersion();
3223 TemplateVariant classes() const
3225 Cachable &cache = getCache();
3228 TemplateList *classList = TemplateList::alloc();
3229 if (m_fileDef->getClassSDict())
3231 ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
3233 for (sdi.toFirst();(cd=sdi.current());++sdi)
3235 if (cd->visibleInParentsDeclList())
3237 classList->append(ClassContext::alloc(cd));
3241 cache.classes.reset(classList);
3243 return cache.classes.get();
3245 TemplateVariant namespaces() const
3247 Cachable &cache = getCache();
3248 if (!cache.namespaces)
3250 TemplateList *namespaceList = TemplateList::alloc();
3251 if (m_fileDef->getNamespaceSDict())
3253 NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict());
3255 for (sdi.toFirst();(nd=sdi.current());++sdi)
3257 if (nd->isLinkable() && !nd->isConstantGroup())
3259 namespaceList->append(NamespaceContext::alloc(nd));
3263 cache.namespaces.reset(namespaceList);
3265 return cache.namespaces.get();
3267 TemplateVariant constantgroups() const
3269 Cachable &cache = getCache();
3270 if (!cache.constantgroups)
3272 TemplateList *namespaceList = TemplateList::alloc();
3273 if (m_fileDef->getNamespaceSDict())
3275 NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict());
3277 for (sdi.toFirst();(nd=sdi.current());++sdi)
3279 if (nd->isLinkable() && nd->isConstantGroup())
3281 namespaceList->append(NamespaceContext::alloc(nd));
3285 cache.constantgroups.reset(namespaceList);
3287 return cache.constantgroups.get();
3289 TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
3290 MemberListType type,const char *title,bool detailed=FALSE) const
3294 MemberList *ml = m_fileDef->getMemberList(type);
3297 list.reset(MemberListInfoContext::alloc(m_fileDef,relPathAsString(),ml,title,""));
3306 return TemplateVariant(FALSE);
3309 TemplateVariant macros() const
3311 return getMemberList(getCache().macros,MemberListType_decDefineMembers,theTranslator->trDefines());
3313 TemplateVariant typedefs() const
3315 return getMemberList(getCache().typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
3317 TemplateVariant sequences() const
3319 return getMemberList(getCache().sequences,MemberListType_decSequenceMembers,theTranslator->trSequences());
3321 TemplateVariant dictionaries() const
3323 return getMemberList(getCache().dictionaries,MemberListType_decDictionaryMembers,theTranslator->trDictionaries());
3325 TemplateVariant enums() const
3327 return getMemberList(getCache().enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
3329 TemplateVariant functions() const
3331 QCString title = theTranslator->trFunctions();
3332 SrcLangExt lang = m_fileDef->getLanguage();
3333 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
3334 else if (lang==SrcLangExt_VHDL) title=theTranslator->trFunctionAndProc();
3335 return getMemberList(getCache().functions,MemberListType_decFuncMembers,title);
3337 TemplateVariant variables() const
3339 static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
3340 return getMemberList(getCache().variables,MemberListType_decVarMembers,
3341 sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables());
3343 TemplateVariant memberGroups() const
3345 Cachable &cache = getCache();
3346 if (!cache.memberGroups)
3348 if (m_fileDef->getMemberGroupSDict())
3350 cache.memberGroups.reset(MemberGroupListContext::alloc(m_fileDef,relPathAsString(),m_fileDef->getMemberGroupSDict(),m_fileDef->subGrouping()));
3354 cache.memberGroups.reset(MemberGroupListContext::alloc());
3357 return cache.memberGroups.get();
3359 TemplateVariant detailedMacros() const
3361 return getMemberList(getCache().detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation());
3363 TemplateVariant detailedTypedefs() const
3365 return getMemberList(getCache().detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
3367 TemplateVariant detailedSequences() const
3369 return getMemberList(getCache().detailedSequences,MemberListType_docSequenceMembers,theTranslator->trSequenceDocumentation());
3371 TemplateVariant detailedDictionaries() const
3373 return getMemberList(getCache().detailedDictionaries,MemberListType_docDictionaryMembers,theTranslator->trDictionaryDocumentation());
3375 TemplateVariant detailedEnums() const
3377 return getMemberList(getCache().detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
3379 TemplateVariant detailedFunctions() const
3381 QCString title = theTranslator->trFunctionDocumentation();
3382 SrcLangExt lang = m_fileDef->getLanguage();
3383 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation();
3384 return getMemberList(getCache().detailedFunctions,MemberListType_docFuncMembers,title);
3386 TemplateVariant detailedVariables() const
3388 return getMemberList(getCache().detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
3390 TemplateVariant inlineClasses() const
3392 Cachable &cache = getCache();
3393 if (!cache.inlineClasses)
3395 TemplateList *classList = TemplateList::alloc();
3396 if (m_fileDef->getClassSDict())
3398 ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
3400 for (sdi.toFirst();(cd=sdi.current());++sdi)
3402 if (cd->name().find('@')==-1 &&
3403 cd->isLinkableInProject() &&
3404 cd->isEmbeddedInOuterScope() &&
3405 cd->partOfGroups()==0)
3407 classList->append(ClassContext::alloc(cd));
3411 cache.inlineClasses.reset(classList);
3413 return cache.inlineClasses.get();
3415 TemplateVariant compoundType() const
3417 return theTranslator->trFile(FALSE,TRUE);
3422 struct Cachable : public DefinitionContext<FileContext::Private>::Cachable
3424 Cachable(FileDef *fd) : DefinitionContext<FileContext::Private>::Cachable(fd) {}
3425 SharedPtr<IncludeInfoListContext> includeInfoList;
3426 ScopedPtr<DotInclDepGraph> includeGraph;
3427 ScopedPtr<DotInclDepGraph> includedByGraph;
3428 ScopedPtr<TemplateVariant> sources;
3429 SharedPtr<TemplateList> classes;
3430 SharedPtr<TemplateList> namespaces;
3431 SharedPtr<TemplateList> constantgroups;
3432 SharedPtr<MemberListInfoContext> macros;
3433 SharedPtr<MemberListInfoContext> typedefs;
3434 SharedPtr<MemberListInfoContext> sequences;
3435 SharedPtr<MemberListInfoContext> dictionaries;
3436 SharedPtr<MemberListInfoContext> enums;
3437 SharedPtr<MemberListInfoContext> functions;
3438 SharedPtr<MemberListInfoContext> variables;
3439 SharedPtr<MemberGroupListContext> memberGroups;
3440 SharedPtr<MemberListInfoContext> detailedMacros;
3441 SharedPtr<MemberListInfoContext> detailedTypedefs;
3442 SharedPtr<MemberListInfoContext> detailedSequences;
3443 SharedPtr<MemberListInfoContext> detailedDictionaries;
3444 SharedPtr<MemberListInfoContext> detailedEnums;
3445 SharedPtr<MemberListInfoContext> detailedFunctions;
3446 SharedPtr<MemberListInfoContext> detailedVariables;
3447 SharedPtr<TemplateList> inlineClasses;
3449 Cachable &getCache() const
3451 Cachable *c = static_cast<Cachable*>(m_fileDef->cookie());
3455 static PropertyMapper<FileContext::Private> s_inst;
3459 PropertyMapper<FileContext::Private> FileContext::Private::s_inst;
3461 FileContext::FileContext(FileDef *fd) : RefCountedContext("FileContext")
3463 p = new Private(fd);
3466 FileContext::~FileContext()
3471 TemplateVariant FileContext::get(const char *n) const
3476 //------------------------------------------------------------------------
3478 //%% struct Dir(Symbol): directory information
3480 class DirContext::Private : public DefinitionContext<DirContext::Private>
3483 Private(DirDef *dd) : DefinitionContext<DirContext::Private>(dd) , m_dirDef(dd)
3485 static bool init=FALSE;
3488 addBaseProperties(s_inst);
3489 s_inst.addProperty("title", &Private::title);
3490 s_inst.addProperty("highlight", &Private::highlight);
3491 s_inst.addProperty("subhighlight", &Private::subHighlight);
3492 s_inst.addProperty("dirName", &Private::dirName);
3493 s_inst.addProperty("dirs", &Private::dirs);
3494 s_inst.addProperty("files", &Private::files);
3495 s_inst.addProperty("hasDetails", &Private::hasDetails);
3496 s_inst.addProperty("hasDirGraph", &Private::hasDirGraph);
3497 s_inst.addProperty("dirGraph", &Private::dirGraph);
3498 s_inst.addProperty("compoundType", &Private::compoundType);
3501 if (!dd->cookie()) { dd->setCookie(new DirContext::Private::Cachable(dd)); }
3503 virtual ~Private() {}
3504 TemplateVariant get(const char *n) const
3506 return s_inst.get(this,n);
3508 TemplateVariant title() const
3510 return TemplateVariant(m_dirDef->shortTitle());
3512 TemplateVariant highlight() const
3514 return TemplateVariant("files");
3516 TemplateVariant subHighlight() const
3518 return TemplateVariant("");
3520 TemplateVariant dirName() const
3522 return TemplateVariant(m_dirDef->shortName());
3524 TemplateVariant dirs() const
3526 Cachable &cache = getCache();
3529 cache.dirs.reset(TemplateList::alloc());
3530 const DirList &subDirs = m_dirDef->subDirs();
3531 QListIterator<DirDef> it(subDirs);
3533 for (it.toFirst();(dd=it.current());++it)
3535 DirContext *dc = new DirContext(dd);
3536 cache.dirs->append(dc);
3539 return cache.dirs.get();
3541 TemplateVariant files() const
3543 Cachable &cache = getCache();
3546 cache.files.reset(TemplateList::alloc());
3547 FileList *files = m_dirDef->getFiles();
3550 QListIterator<FileDef> it(*files);
3552 for (it.toFirst();(fd=it.current());++it)
3554 FileContext *fc = FileContext::alloc(fd);
3555 cache.files->append(fc);
3559 return cache.files.get();
3561 TemplateVariant hasDetails() const
3563 return m_dirDef->hasDetailedDescription();
3565 TemplateVariant compoundType() const
3567 return theTranslator->trDir(FALSE,TRUE);
3569 TemplateVariant relPath() const
3573 DotDirDeps *getDirDepsGraph() const
3575 Cachable &cache = getCache();
3576 if (!cache.dirDepsGraph)
3578 cache.dirDepsGraph.reset(new DotDirDeps(m_dirDef));
3580 return cache.dirDepsGraph.get();
3582 TemplateVariant hasDirGraph() const
3585 static bool haveDot = Config_getBool(HAVE_DOT);
3586 static bool dirGraph = Config_getBool(DIRECTORY_GRAPH);
3587 if (haveDot && dirGraph)
3589 DotDirDeps *graph = getDirDepsGraph();
3590 result = !graph->isTrivial();
3594 TemplateVariant dirGraph() const
3597 static bool haveDot = Config_getBool(HAVE_DOT);
3598 static bool dirGraph = Config_getBool(DIRECTORY_GRAPH);
3599 if (haveDot && dirGraph)
3601 DotDirDeps *graph = getDirDepsGraph();
3602 FTextStream t(&result);
3603 switch (g_globals.outputFormat)
3605 case ContextOutputFormat_Html:
3607 graph->writeGraph(t,GOF_BITMAP,
3609 g_globals.outputDir,
3610 g_globals.outputDir+portable_pathSeparator()+m_dirDef->getOutputFileBase()+Doxygen::htmlFileExtension,
3613 g_globals.dynSectionId,
3617 case ContextOutputFormat_Latex:
3619 graph->writeGraph(t,GOF_EPS,
3621 g_globals.outputDir,
3622 g_globals.outputDir+portable_pathSeparator()+m_dirDef->getOutputFileBase()+".tex",
3625 g_globals.dynSectionId,
3629 // TODO: support other generators
3631 err("context.cpp: output format not yet supported");
3634 g_globals.dynSectionId++;
3636 return TemplateVariant(result.data(),TRUE);
3641 struct Cachable : public DefinitionContext<DirContext::Private>::Cachable
3643 Cachable(DirDef *dd) : DefinitionContext<DirContext::Private>::Cachable(dd) {}
3644 SharedPtr<TemplateList> dirs;
3645 SharedPtr<TemplateList> files;
3646 ScopedPtr<DotDirDeps> dirDepsGraph;
3648 Cachable &getCache() const
3650 Cachable *c = static_cast<Cachable*>(m_dirDef->cookie());
3654 static PropertyMapper<DirContext::Private> s_inst;
3658 PropertyMapper<DirContext::Private> DirContext::Private::s_inst;
3660 DirContext::DirContext(DirDef *fd) : RefCountedContext("DirContext")
3662 p = new Private(fd);
3665 DirContext::~DirContext()
3670 TemplateVariant DirContext::get(const char *n) const
3675 //------------------------------------------------------------------------
3677 //%% struct Page(Symbol): page information
3679 class PageContext::Private : public DefinitionContext<PageContext::Private>
3682 Private(PageDef *pd,bool isMainPage,bool isExample)
3683 : DefinitionContext<PageContext::Private>(pd) , m_pageDef(pd), m_isMainPage(isMainPage),
3684 m_isExample(isExample)
3686 static bool init=FALSE;
3689 addBaseProperties(s_inst);
3690 s_inst.addProperty("title", &Private::title);
3691 s_inst.addProperty("highlight", &Private::highlight);
3692 s_inst.addProperty("subhighlight",&Private::subHighlight);
3693 s_inst.addProperty("example", &Private::example);
3696 if (!pd->cookie()) { pd->setCookie(new PageContext::Private::Cachable(pd)); }
3698 virtual ~Private() {}
3699 TemplateVariant get(const char *n) const
3701 return s_inst.get(this,n);
3703 TemplateVariant title() const
3707 if (mainPageHasTitle())
3709 return m_pageDef->title();
3713 return theTranslator->trMainPage();
3716 else if (m_isExample)
3718 return m_pageDef->name();
3722 return m_pageDef->title();
3725 TemplateVariant relPath() const
3733 return DefinitionContext<PageContext::Private>::relPath();
3736 TemplateVariant highlight() const
3747 TemplateVariant subHighlight() const
3751 TemplateVariant example() const
3755 Cachable &cache = getCache();
3756 if (!cache.example || g_globals.outputFormat!=cache.exampleOutputFormat)
3758 cache.example.reset(new TemplateVariant(
3759 parseDoc(m_pageDef,m_pageDef->docFile(),m_pageDef->docLine(),
3760 relPathAsString(),"\\include "+m_pageDef->name(),FALSE)));
3761 cache.exampleOutputFormat = g_globals.outputFormat;
3763 return *cache.example;
3767 return TemplateVariant("");
3772 struct Cachable : public DefinitionContext<PageContext::Private>::Cachable
3774 Cachable(PageDef *pd) : DefinitionContext<PageContext::Private>::Cachable(pd),
3775 exampleOutputFormat(ContextOutputFormat_Unspecified) { }
3776 ScopedPtr<TemplateVariant> example;
3777 ContextOutputFormat exampleOutputFormat;
3779 Cachable &getCache() const
3781 Cachable *c = static_cast<Cachable*>(m_pageDef->cookie());
3787 static PropertyMapper<PageContext::Private> s_inst;
3791 PropertyMapper<PageContext::Private> PageContext::Private::s_inst;
3793 PageContext::PageContext(PageDef *pd,bool isMainPage,bool isExample) : RefCountedContext("PageContext")
3795 p = new Private(pd,isMainPage,isExample);
3798 PageContext::~PageContext()
3803 TemplateVariant PageContext::get(const char *n) const
3808 //------------------------------------------------------------------------
3810 class TextGeneratorHtml : public TextGeneratorIntf
3813 TextGeneratorHtml(FTextStream &ts,const QCString &relPath)
3814 : m_ts(ts), m_relPath(relPath) {}
3815 void writeString(const char *s,bool keepSpaces) const
3826 case '<': m_ts << "<"; break;
3827 case '>': m_ts << ">"; break;
3828 case '\'': m_ts << "'"; break;
3829 case '"': m_ts << """; break;
3830 case '&': m_ts << "&"; break;
3831 case ' ': m_ts << " "; break;
3837 m_ts << convertToHtml(s);
3841 void writeBreak(int indent) const
3844 for (int i=0;i<indent;i++)
3850 void writeLink(const char *ref,const char *f,
3851 const char *anchor,const char *name
3856 m_ts << "<a class=\"elRef\" ";
3857 m_ts << externalLinkTarget() << externalRef(m_relPath,ref,FALSE);
3861 m_ts << "<a class=\"el\" ";
3864 m_ts << externalRef(m_relPath,ref,TRUE);
3865 if (f) m_ts << f << Doxygen::htmlFileExtension;
3866 if (anchor) m_ts << "#" << anchor;
3868 m_ts << convertToHtml(name);
3877 //------------------------------------------------------------------------
3879 class TextGeneratorLatex : public TextGeneratorIntf
3882 TextGeneratorLatex(FTextStream &ts) : m_ts(ts) {}
3883 void writeString(const char *s,bool keepSpaces) const
3886 m_ts << convertToLaTeX(s,FALSE,keepSpaces);
3888 void writeBreak(int indent) const
3891 for (int i=0;i<indent;i++)
3896 void writeLink(const char *ref,const char *f,
3897 const char *anchor,const char *text
3900 static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
3901 if (!ref && pdfHyperlinks)
3903 m_ts << "\\mbox{\\hyperlink{";
3904 if (f) m_ts << stripPath(f);
3905 if (f && anchor) m_ts << "_";
3906 if (anchor) m_ts << anchor;
3908 filterLatexString(m_ts,text);
3913 m_ts << "\\textbf{ ";
3914 filterLatexString(m_ts,text);
3923 //------------------------------------------------------------------------
3925 class TextGeneratorFactory
3928 static TextGeneratorFactory *instance()
3930 static TextGeneratorFactory *instance = 0;
3931 if (instance==0) instance = new TextGeneratorFactory;
3934 TextGeneratorIntf *create(FTextStream &ts,const QCString &relPath)
3936 switch (g_globals.outputFormat)
3938 case ContextOutputFormat_Html:
3939 return new TextGeneratorHtml(ts,relPath);
3940 case ContextOutputFormat_Latex:
3941 return new TextGeneratorLatex(ts);
3948 TextGeneratorFactory() {}
3949 virtual ~TextGeneratorFactory() {}
3952 TemplateVariant createLinkedText(Definition *def,const QCString &relPath,const QCString &text)
3956 TextGeneratorIntf *tg = TextGeneratorFactory::instance()->create(ts,relPath);
3959 linkifyText(*tg,def->getOuterScope(),def->getBodyDef(),def,text);
3961 return TemplateVariant(s.data(),TRUE);
3969 //%% struct Member(Symbol): member information
3971 class MemberContext::Private : public DefinitionContext<MemberContext::Private>
3974 Private(MemberDef *md) : DefinitionContext<MemberContext::Private>(md) , m_memberDef(md)
3976 static bool init=FALSE;
3979 addBaseProperties(s_inst);
3980 s_inst.addProperty("isSignal", &Private::isSignal);
3981 s_inst.addProperty("isSlot", &Private::isSlot);
3982 s_inst.addProperty("isVariable", &Private::isVariable);
3983 s_inst.addProperty("isEnumeration", &Private::isEnumeration);
3984 s_inst.addProperty("isEnumValue", &Private::isEnumValue);
3985 s_inst.addProperty("isTypedef", &Private::isTypedef);
3986 s_inst.addProperty("isFunction", &Private::isFunction);
3987 s_inst.addProperty("isFunctionPtr", &Private::isFunctionPtr);
3988 s_inst.addProperty("isDefine", &Private::isDefine);
3989 s_inst.addProperty("isFriend", &Private::isFriend);
3990 s_inst.addProperty("isProperty", &Private::isProperty);
3991 s_inst.addProperty("isEvent", &Private::isEvent);
3992 s_inst.addProperty("isRelated", &Private::isRelated);
3993 s_inst.addProperty("isForeign", &Private::isForeign);
3994 s_inst.addProperty("isStatic", &Private::isStatic);
3995 s_inst.addProperty("isInline", &Private::isInline);
3996 s_inst.addProperty("isExplicit", &Private::isExplicit);
3997 s_inst.addProperty("isMutable", &Private::isMutable);
3998 s_inst.addProperty("isGettable", &Private::isGettable);
3999 s_inst.addProperty("isPrivateGettable", &Private::isPrivateGettable);
4000 s_inst.addProperty("isProtectedGettable", &Private::isProtectedGettable);
4001 s_inst.addProperty("isSettable", &Private::isSettable);
4002 s_inst.addProperty("isPrivateSettable", &Private::isPrivateSettable);
4003 s_inst.addProperty("isProtectedSettable", &Private::isProtectedSettable);
4004 s_inst.addProperty("isReadable", &Private::isReadable);
4005 s_inst.addProperty("isWritable", &Private::isWritable);
4006 s_inst.addProperty("isAddable", &Private::isAddable);
4007 s_inst.addProperty("isRemovable", &Private::isRemovable);
4008 s_inst.addProperty("isRaisable", &Private::isRaisable);
4009 s_inst.addProperty("isFinal", &Private::isFinal);
4010 s_inst.addProperty("isAbstract", &Private::isAbstract);
4011 s_inst.addProperty("isOverride", &Private::isOverride);
4012 s_inst.addProperty("isInitonly", &Private::isInitonly);
4013 s_inst.addProperty("isOptional", &Private::isOptional);
4014 s_inst.addProperty("isRequired", &Private::isRequired);
4015 s_inst.addProperty("isNonAtomic", &Private::isNonAtomic);
4016 s_inst.addProperty("isCopy", &Private::isCopy);
4017 s_inst.addProperty("isAssign", &Private::isAssign);
4018 s_inst.addProperty("isRetain", &Private::isRetain);
4019 s_inst.addProperty("isWeak", &Private::isWeak);
4020 s_inst.addProperty("isStrong", &Private::isStrong);
4021 s_inst.addProperty("isUnretained", &Private::isUnretained);
4022 s_inst.addProperty("isNew", &Private::isNew);
4023 s_inst.addProperty("isSealed", &Private::isSealed);
4024 s_inst.addProperty("isImplementation", &Private::isImplementation);
4025 s_inst.addProperty("isExternal", &Private::isExternal);
4026 s_inst.addProperty("isAlias", &Private::isAlias);
4027 s_inst.addProperty("isDefault", &Private::isDefault);
4028 s_inst.addProperty("isDelete", &Private::isDelete);
4029 s_inst.addProperty("isNoExcept", &Private::isNoExcept);
4030 s_inst.addProperty("isAttribute", &Private::isAttribute);
4031 s_inst.addProperty("isUNOProperty", &Private::isUNOProperty);
4032 s_inst.addProperty("isReadonly", &Private::isReadonly);
4033 s_inst.addProperty("isBound", &Private::isBound);
4034 s_inst.addProperty("isConstrained", &Private::isConstrained);
4035 s_inst.addProperty("isTransient", &Private::isTransient);
4036 s_inst.addProperty("isMaybeVoid", &Private::isMaybeVoid);
4037 s_inst.addProperty("isMaybeDefault", &Private::isMaybeDefault);
4038 s_inst.addProperty("isMaybeAmbiguous", &Private::isMaybeAmbiguous);
4039 s_inst.addProperty("isPublished", &Private::isPublished);
4040 s_inst.addProperty("isTemplateSpecialization",&Private::isTemplateSpecialization);
4041 s_inst.addProperty("isObjCMethod", &Private::isObjCMethod);
4042 s_inst.addProperty("isObjCProperty", &Private::isObjCProperty);
4043 s_inst.addProperty("isAnonymous", &Private::isAnonymous);
4044 s_inst.addProperty("hasParameters", &Private::hasParameters);
4045 s_inst.addProperty("declType", &Private::declType);
4046 s_inst.addProperty("declArgs", &Private::declArgs);
4047 s_inst.addProperty("anonymousType", &Private::anonymousType);
4048 s_inst.addProperty("anonymousMember", &Private::anonymousMember);
4049 s_inst.addProperty("hasDetails", &Private::hasDetails);
4050 s_inst.addProperty("exception", &Private::exception);
4051 s_inst.addProperty("bitfields", &Private::bitfields);
4052 s_inst.addProperty("initializer", &Private::initializer);
4053 s_inst.addProperty("initializerAsCode", &Private::initializerAsCode);
4054 s_inst.addProperty("hasOneLineInitializer", &Private::hasOneLineInitializer);
4055 s_inst.addProperty("hasMultiLineInitializer", &Private::hasMultiLineInitializer);
4056 s_inst.addProperty("templateArgs", &Private::templateArgs);
4057 s_inst.addProperty("templateAlias", &Private::templateAlias);
4058 s_inst.addProperty("propertyAttrs", &Private::propertyAttrs);
4059 s_inst.addProperty("eventAttrs", &Private::eventAttrs);
4060 s_inst.addProperty("category", &Private::category);
4061 s_inst.addProperty("categoryRelation", &Private::categoryRelation);
4062 s_inst.addProperty("class", &Private::getClass);
4063 s_inst.addProperty("file", &Private::getFile);
4064 s_inst.addProperty("namespace", &Private::getNamespace);
4065 s_inst.addProperty("definition", &Private::definition);
4066 s_inst.addProperty("parameters", &Private::parameters);
4067 s_inst.addProperty("hasConstQualifier", &Private::hasConstQualifier);
4068 s_inst.addProperty("hasVolatileQualifier",&Private::hasVolatileQualifier);
4069 s_inst.addProperty("hasRefQualifierLValue", &Private::hasRefQualifierLValue);
4070 s_inst.addProperty("hasRefQualifierRValue", &Private::hasRefQualifierRValue);
4071 s_inst.addProperty("trailingReturnType", &Private::trailingReturnType);
4072 s_inst.addProperty("extraTypeChars", &Private::extraTypeChars);
4073 s_inst.addProperty("templateDecls", &Private::templateDecls);
4074 s_inst.addProperty("labels", &Private::labels);
4075 s_inst.addProperty("enumBaseType", &Private::enumBaseType);
4076 s_inst.addProperty("enumValues", &Private::enumValues);
4077 s_inst.addProperty("paramDocs", &Private::paramDocs);
4078 s_inst.addProperty("reimplements", &Private::reimplements);
4079 s_inst.addProperty("implements", &Private::implements);
4080 s_inst.addProperty("reimplementedBy", &Private::reimplementedBy);
4081 s_inst.addProperty("implementedBy", &Private::implementedBy);
4082 s_inst.addProperty("examples", &Private::examples);
4083 s_inst.addProperty("typeConstraints", &Private::typeConstraints);
4084 s_inst.addProperty("functionQualifier", &Private::functionQualifier);
4085 s_inst.addProperty("sourceRefs", &Private::sourceRefs);
4086 s_inst.addProperty("sourceRefBys", &Private::sourceRefBys);
4087 s_inst.addProperty("hasSources", &Private::hasSources);
4088 s_inst.addProperty("sourceCode", &Private::sourceCode);
4089 s_inst.addProperty("hasCallGraph", &Private::hasCallGraph);
4090 s_inst.addProperty("callGraph", &Private::callGraph);
4091 s_inst.addProperty("hasCallerGraph", &Private::hasCallerGraph);
4092 s_inst.addProperty("callerGraph", &Private::callerGraph);
4093 s_inst.addProperty("hasReferencedByRelation", &Private::hasReferencedByRelation);
4094 s_inst.addProperty("referencedByRelation", &Private::referencedByRelation);
4095 s_inst.addProperty("hasReferencesRelation", &Private::hasReferencesRelation);
4096 s_inst.addProperty("referencesRelation", &Private::referencesRelation);
4097 s_inst.addProperty("fieldType", &Private::fieldType);
4098 s_inst.addProperty("type", &Private::type);
4099 s_inst.addProperty("detailsVisibleFor", &Private::detailsVisibleFor);
4100 s_inst.addProperty("nameWithContextFor", &Private::nameWithContextFor);
4103 if (!md->cookie()) { md->setCookie(new MemberContext::Private::Cachable(md)); }
4105 Cachable &cache = getCache();
4106 cache.propertyAttrs.reset(TemplateList::alloc());
4107 if (md && md->isProperty())
4109 if (md->isGettable()) cache.propertyAttrs->append("get");
4110 if (md->isPrivateGettable()) cache.propertyAttrs->append("private get");
4111 if (md->isProtectedGettable()) cache.propertyAttrs->append("protected get");
4112 if (md->isSettable()) cache.propertyAttrs->append("set");
4113 if (md->isPrivateSettable()) cache.propertyAttrs->append("private set");
4114 if (md->isProtectedSettable()) cache.propertyAttrs->append("protected set");
4116 cache.eventAttrs.reset(TemplateList::alloc());
4117 if (md && md->isEvent())
4119 if (md->isAddable()) cache.eventAttrs->append("add");
4120 if (md->isRemovable()) cache.eventAttrs->append("remove");
4121 if (md->isRaisable()) cache.eventAttrs->append("raise");
4124 virtual ~Private() {}
4125 TemplateVariant get(const char *n) const
4127 return s_inst.get(this,n);
4129 TemplateVariant fieldType() const
4131 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->fieldType());
4133 TemplateVariant declType() const
4135 Cachable &cache = getCache();
4136 if (!cache.declTypeParsed)
4138 cache.declType=createLinkedText(m_memberDef,relPathAsString(),m_memberDef->getDeclType());
4139 cache.declTypeParsed = TRUE;
4140 return cache.declType;
4144 return cache.declType;
4147 TemplateVariant declArgs() const
4149 Cachable &cache = getCache();
4150 if (!cache.declArgsParsed)
4152 cache.declArgs=createLinkedText(m_memberDef,relPathAsString(),m_memberDef->argsString());
4153 cache.declArgsParsed = TRUE;
4154 return cache.declArgs;
4158 return cache.declArgs;
4161 TemplateVariant exception() const
4163 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->excpString());
4165 TemplateVariant bitfields() const
4167 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->bitfieldString());
4169 TemplateVariant isStatic() const
4171 return m_memberDef->isStatic();
4173 TemplateVariant isObjCMethod() const
4175 return m_memberDef->isObjCMethod();
4177 TemplateVariant isObjCProperty() const
4179 return m_memberDef->isObjCProperty();
4181 TemplateVariant isImplementation() const
4183 return m_memberDef->isImplementation();
4185 TemplateVariant isSignal() const
4187 return m_memberDef->isSignal();
4189 TemplateVariant isSlot() const
4191 return m_memberDef->isSlot();
4193 TemplateVariant isTypedef() const
4195 return m_memberDef->isTypedef();
4197 TemplateVariant isFunction() const
4199 return m_memberDef->isFunction();
4201 TemplateVariant isFunctionPtr() const
4203 return m_memberDef->isFunctionPtr();
4205 TemplateVariant isFriend() const
4207 return m_memberDef->isFriend();
4209 TemplateVariant isForeign() const
4211 return m_memberDef->isForeign();
4213 TemplateVariant isEvent() const
4215 return m_memberDef->isEvent();
4217 TemplateVariant isInline() const
4219 return m_memberDef->isInline();
4221 TemplateVariant isExplicit() const
4223 return m_memberDef->isExplicit();
4225 TemplateVariant isMutable() const
4227 return m_memberDef->isMutable();
4229 TemplateVariant isGettable() const
4231 return m_memberDef->isGettable();
4233 TemplateVariant isPrivateGettable() const
4235 return m_memberDef->isPrivateGettable();
4237 TemplateVariant isProtectedGettable() const
4239 return m_memberDef->isProtectedGettable();
4241 TemplateVariant isSettable() const
4243 return m_memberDef->isSettable();
4245 TemplateVariant isPrivateSettable() const
4247 return m_memberDef->isPrivateSettable();
4249 TemplateVariant isProtectedSettable() const
4251 return m_memberDef->isProtectedSettable();
4253 TemplateVariant isReadable() const
4255 return m_memberDef->isReadable();
4257 TemplateVariant isWritable() const
4259 return m_memberDef->isWritable();
4261 TemplateVariant isAddable() const
4263 return m_memberDef->isAddable();
4265 TemplateVariant isRemovable() const
4267 return m_memberDef->isRemovable();
4269 TemplateVariant isRaisable() const
4271 return m_memberDef->isRaisable();
4273 TemplateVariant isFinal() const
4275 return m_memberDef->isFinal();
4277 TemplateVariant isAbstract() const
4279 return m_memberDef->isAbstract();
4281 TemplateVariant isOverride() const
4283 return m_memberDef->isOverride();
4285 TemplateVariant isInitonly() const
4287 return m_memberDef->isInitonly();
4289 TemplateVariant isOptional() const
4291 return m_memberDef->isOptional();
4293 TemplateVariant isRequired() const
4295 return m_memberDef->isRequired();
4297 TemplateVariant isNonAtomic() const
4299 return m_memberDef->isNonAtomic();
4301 TemplateVariant isCopy() const
4303 return m_memberDef->isCopy();
4305 TemplateVariant isAssign() const
4307 return m_memberDef->isAssign();
4309 TemplateVariant isRetain() const
4311 return m_memberDef->isRetain();
4313 TemplateVariant isWeak() const
4315 return m_memberDef->isWeak();
4317 TemplateVariant isStrong() const
4319 return m_memberDef->isStrong();
4321 TemplateVariant isUnretained() const
4323 return m_memberDef->isUnretained();
4325 TemplateVariant isNew() const
4327 return m_memberDef->isNew();
4329 TemplateVariant isSealed() const
4331 return m_memberDef->isSealed();
4333 TemplateVariant isExternal() const
4335 return m_memberDef->isExternal();
4337 TemplateVariant isAlias() const
4339 return m_memberDef->isAlias();
4341 TemplateVariant isDefault() const
4343 return m_memberDef->isDefault();
4345 TemplateVariant isDelete() const
4347 return m_memberDef->isDelete();
4349 TemplateVariant isNoExcept() const
4351 return m_memberDef->isNoExcept();
4353 TemplateVariant isAttribute() const
4355 return m_memberDef->isAttribute();
4357 TemplateVariant isUNOProperty() const
4359 return m_memberDef->isUNOProperty();
4361 TemplateVariant isReadonly() const
4363 return m_memberDef->isReadonly();
4365 TemplateVariant isBound() const
4367 return m_memberDef->isBound();
4369 TemplateVariant isConstrained() const
4371 return m_memberDef->isConstrained();
4373 TemplateVariant isTransient() const
4375 return m_memberDef->isTransient();
4377 TemplateVariant isMaybeVoid() const
4379 return m_memberDef->isMaybeVoid();
4381 TemplateVariant isMaybeDefault() const
4383 return m_memberDef->isMaybeDefault();
4385 TemplateVariant isMaybeAmbiguous() const
4387 return m_memberDef->isMaybeAmbiguous();
4389 TemplateVariant isPublished() const
4391 return m_memberDef->isPublished();
4393 TemplateVariant isTemplateSpecialization() const
4395 return m_memberDef->isTemplateSpecialization();
4397 TemplateVariant isProperty() const
4399 return m_memberDef->isProperty();
4401 TemplateVariant isEnumValue() const
4403 return m_memberDef->isEnumValue();
4405 TemplateVariant isVariable() const
4407 return m_memberDef->isVariable();
4409 TemplateVariant isEnumeration() const
4411 return m_memberDef->isEnumerate();
4413 TemplateVariant hasDetails() const
4415 return m_memberDef->isDetailedSectionLinkable();
4417 TemplateVariant initializer() const
4419 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->initializer());
4421 TemplateVariant initializerAsCode() const
4423 Cachable &cache = getCache();
4424 if (!cache.initializerParsed)
4427 if (m_memberDef->getClassDef())
4429 scopeName = m_memberDef->getClassDef()->name();
4431 else if (m_memberDef->getNamespaceDef())
4433 scopeName = m_memberDef->getNamespaceDef()->name();
4435 cache.initializer = parseCode(m_memberDef,scopeName,relPathAsString(),
4436 m_memberDef->initializer());
4437 cache.initializerParsed = TRUE;
4439 return cache.initializer;
4441 TemplateVariant isDefine() const
4443 return m_memberDef->isDefine();
4445 TemplateVariant isAnonymous() const
4447 QCString name = m_memberDef->name();
4448 return !name.isEmpty() && name.at(0)=='@';
4450 TemplateVariant anonymousType() const
4452 Cachable &cache = getCache();
4453 if (!cache.anonymousType)
4455 ClassDef *cd = m_memberDef->getClassDefOfAnonymousType();
4458 cache.anonymousType.reset(ClassContext::alloc(cd));
4461 if (cache.anonymousType)
4463 return cache.anonymousType.get();
4470 TemplateVariant anonymousMember() const
4472 Cachable &cache = getCache();
4473 if (!cache.anonymousMember)
4475 MemberDef *md = m_memberDef->fromAnonymousMember();
4478 cache.anonymousMember.reset(MemberContext::alloc(md));
4481 if (cache.anonymousMember)
4483 return cache.anonymousMember.get();
4490 TemplateVariant isRelated() const
4492 return m_memberDef->isRelated();
4494 TemplateVariant enumBaseType() const
4496 return m_memberDef->enumBaseType();
4498 TemplateVariant hasOneLineInitializer() const
4500 return m_memberDef->hasOneLineInitializer();
4502 TemplateVariant hasMultiLineInitializer() const
4504 return m_memberDef->hasMultiLineInitializer();
4506 TemplateVariant enumValues() const
4508 Cachable &cache = getCache();
4509 if (!cache.enumValues)
4511 MemberList *ml = m_memberDef->enumFieldList();
4514 cache.enumValues.reset(MemberListContext::alloc(ml));
4518 cache.enumValues.reset(MemberListContext::alloc());
4521 return cache.enumValues.get();
4523 TemplateVariant templateArgs() const
4525 Cachable &cache = getCache();
4526 if (!cache.templateArgs && m_memberDef->templateArguments())
4528 cache.templateArgs.reset(ArgumentListContext::alloc(m_memberDef->templateArguments(),m_memberDef,relPathAsString()));
4530 if (cache.templateArgs)
4532 return cache.templateArgs.get();
4536 return TemplateVariant(FALSE);
4539 TemplateVariant templateAlias() const
4541 if (m_memberDef->isAlias())
4543 return createLinkedText(m_memberDef,relPathAsString(),
4544 QCString(" = ")+m_memberDef->typeString());
4548 TemplateVariant propertyAttrs() const
4550 return getCache().propertyAttrs.get();
4552 TemplateVariant eventAttrs() const
4554 return getCache().eventAttrs.get();
4556 TemplateVariant getClass() const
4558 Cachable &cache = getCache();
4559 if (!cache.classDef && m_memberDef->getClassDef())
4561 cache.classDef.reset(ClassContext::alloc(m_memberDef->getClassDef()));
4565 return cache.classDef.get();
4569 return TemplateVariant(FALSE);
4572 TemplateVariant category() const
4574 Cachable &cache = getCache();
4575 if (!cache.category && m_memberDef->category())
4577 cache.category.reset(ClassContext::alloc(m_memberDef->category()));
4581 return cache.category.get();
4585 return TemplateVariant(FALSE);
4588 TemplateVariant categoryRelation() const
4590 Cachable &cache = getCache();
4591 if (!cache.categoryRelation && m_memberDef->categoryRelation())
4593 cache.categoryRelation.reset(MemberContext::alloc(m_memberDef->categoryRelation()));
4595 if (cache.categoryRelation)
4597 return cache.categoryRelation.get();
4601 return TemplateVariant(FALSE);
4604 TemplateVariant getFile() const
4606 Cachable &cache = getCache();
4607 if (!cache.fileDef && m_memberDef->getFileDef())
4609 cache.fileDef.reset(FileContext::alloc(m_memberDef->getFileDef()));
4613 return cache.fileDef.get();
4617 return TemplateVariant(FALSE);
4620 TemplateVariant getNamespace() const
4622 Cachable &cache = getCache();
4623 if (!cache.namespaceDef && m_memberDef->getNamespaceDef())
4625 cache.namespaceDef.reset(NamespaceContext::alloc(m_memberDef->getNamespaceDef()));
4627 if (cache.namespaceDef)
4629 return cache.namespaceDef.get();
4633 return TemplateVariant(FALSE);
4636 TemplateVariant definition() const
4638 return createLinkedText(m_memberDef,relPathAsString(),
4639 m_memberDef->displayDefinition());
4641 ArgumentList *getDefArgList() const
4643 return (m_memberDef->isDocsForDefinition()) ?
4644 m_memberDef->argumentList() : m_memberDef->declArgumentList();
4646 TemplateVariant parameters() const
4648 Cachable &cache = getCache();
4649 if (!cache.arguments)
4651 ArgumentList *defArgList = getDefArgList();
4652 if (defArgList && !m_memberDef->isProperty())
4654 cache.arguments.reset(ArgumentListContext::alloc(defArgList,m_memberDef,relPathAsString()));
4658 cache.arguments.reset(ArgumentListContext::alloc());
4661 return cache.arguments.get();
4663 TemplateVariant hasParameters() const
4665 return getDefArgList()!=0;
4667 TemplateVariant hasConstQualifier() const
4669 ArgumentList *al = getDefArgList();
4670 return al ? al->constSpecifier : FALSE;
4672 TemplateVariant hasVolatileQualifier() const
4674 ArgumentList *al = getDefArgList();
4675 return al ? al->volatileSpecifier : FALSE;
4677 TemplateVariant hasRefQualifierLValue() const
4679 ArgumentList *al = getDefArgList();
4680 return al ? al->refQualifier==RefQualifierLValue : FALSE;
4682 TemplateVariant hasRefQualifierRValue() const
4684 ArgumentList *al = getDefArgList();
4685 return al ? al->refQualifier==RefQualifierRValue : FALSE;
4687 TemplateVariant trailingReturnType() const
4689 ArgumentList *al = getDefArgList();
4690 if (al && !al->trailingReturnType.isEmpty())
4692 return createLinkedText(m_memberDef,relPathAsString(),
4693 al->trailingReturnType);
4700 TemplateVariant extraTypeChars() const
4702 return m_memberDef->extraTypeChars();
4704 void addTemplateDecls(TemplateList *tl) const
4706 ClassDef *cd=m_memberDef->getClassDef();
4707 if (m_memberDef->definitionTemplateParameterLists())
4709 QListIterator<ArgumentList> ali(*m_memberDef->definitionTemplateParameterLists());
4711 for (ali.toFirst();(tal=ali.current());++ali)
4715 ArgumentListContext *al = ArgumentListContext::alloc(tal,m_memberDef,relPathAsString());
4722 if (cd && !m_memberDef->isRelated() && !m_memberDef->isTemplateSpecialization())
4724 QList<ArgumentList> tempParamLists;
4725 cd->getTemplateParameterLists(tempParamLists);
4726 //printf("#tempParamLists=%d\n",tempParamLists.count());
4727 QListIterator<ArgumentList> ali(tempParamLists);
4729 for (ali.toFirst();(tal=ali.current());++ali)
4733 ArgumentListContext *al = ArgumentListContext::alloc(tal,m_memberDef,relPathAsString());
4738 if (m_memberDef->templateArguments()) // function template prefix
4740 ArgumentListContext *al = ArgumentListContext::alloc(
4741 m_memberDef->templateArguments(),m_memberDef,relPathAsString());
4746 TemplateVariant templateDecls() const
4748 Cachable &cache = getCache();
4749 if (!cache.templateDecls)
4751 TemplateList *tl = TemplateList::alloc();
4752 addTemplateDecls(tl);
4753 cache.templateDecls.reset(tl);
4755 return cache.templateDecls.get();
4757 TemplateVariant labels() const
4759 Cachable &cache = getCache();
4763 m_memberDef->getLabels(sl,m_memberDef->getOuterScope());
4764 TemplateList *tl = TemplateList::alloc();
4767 QStrListIterator it(sl);
4768 for (;it.current();++it)
4773 cache.labels.reset(tl);
4775 return cache.labels.get();
4777 TemplateVariant paramDocs() const
4779 Cachable &cache = getCache();
4780 if (!cache.paramDocs)
4782 if (m_memberDef->argumentList() && m_memberDef->argumentList()->hasDocumentation())
4785 ArgumentListIterator ali(*m_memberDef->argumentList());
4787 // convert the parameter documentation into a list of @param commands
4788 for (ali.toFirst();(a=ali.current());++ali)
4790 if (a->hasDocumentation())
4792 QCString direction = extractDirection(a->docs);
4793 paramDocs+="@param"+direction+" "+a->name+" "+a->docs;
4796 cache.paramDocs.reset(new TemplateVariant(parseDoc(m_memberDef,
4797 m_memberDef->docFile(),m_memberDef->docLine(),
4798 relPathAsString(),paramDocs,FALSE)));
4802 cache.paramDocs.reset(new TemplateVariant(""));
4805 return *cache.paramDocs;
4807 TemplateVariant implements() const
4809 Cachable &cache = getCache();
4810 if (!cache.implements)
4812 MemberDef *md = m_memberDef->reimplements();
4813 cache.implements.reset(TemplateList::alloc());
4816 ClassDef *cd = md->getClassDef();
4817 if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
4819 MemberContext *mc = MemberContext::alloc(md);
4820 cache.implements->append(mc);
4824 return cache.implements.get();
4826 TemplateVariant reimplements() const
4828 Cachable &cache = getCache();
4829 if (!cache.reimplements)
4831 MemberDef *md = m_memberDef->reimplements();
4832 cache.reimplements.reset(TemplateList::alloc());
4835 ClassDef *cd = md->getClassDef();
4836 if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
4838 MemberContext *mc = MemberContext::alloc(md);
4839 cache.reimplements->append(mc);
4843 return cache.reimplements.get();
4845 TemplateVariant implementedBy() const
4847 Cachable &cache = getCache();
4848 if (!cache.implementedBy)
4850 MemberList *ml = m_memberDef->reimplementedBy();
4851 cache.implementedBy.reset(TemplateList::alloc());
4854 MemberListIterator mli(*ml);
4856 for (mli.toFirst();(md=mli.current());++mli)
4858 ClassDef *cd = md->getClassDef();
4859 if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
4861 MemberContext *mc = new MemberContext(md);
4862 cache.implementedBy->append(mc);
4867 return cache.implementedBy.get();
4869 TemplateVariant reimplementedBy() const
4871 Cachable &cache = getCache();
4872 if (!cache.reimplementedBy)
4874 cache.reimplementedBy.reset(TemplateList::alloc());
4875 MemberList *ml = m_memberDef->reimplementedBy();
4878 MemberListIterator mli(*ml);
4880 for (mli.toFirst();(md=mli.current());++mli)
4882 ClassDef *cd = md->getClassDef();
4883 if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
4885 MemberContext *mc = new MemberContext(md);
4886 cache.reimplementedBy->append(mc);
4891 return cache.reimplementedBy.get();
4893 void addExamples(TemplateList *list) const
4895 if (m_memberDef->hasExamples())
4897 ExampleSDict::Iterator it(*m_memberDef->getExamples());
4899 for (it.toFirst();(ex=it.current());++it)
4901 TemplateStruct *s = TemplateStruct::alloc();
4902 s->set("text",ex->name);
4903 s->set("isLinkable",TRUE);
4904 s->set("anchor",ex->anchor);
4905 s->set("fileName",ex->file);
4906 s->set("isReference",FALSE);
4907 s->set("externalReference","");
4912 TemplateVariant examples() const
4914 Cachable &cache = getCache();
4915 if (!cache.examples)
4917 TemplateList *exampleList = TemplateList::alloc();
4918 addExamples(exampleList);
4919 cache.examples.reset(exampleList);
4921 return cache.examples.get();
4923 TemplateVariant typeConstraints() const
4925 Cachable &cache = getCache();
4926 if (!cache.typeConstraints && m_memberDef->typeConstraints())
4928 cache.typeConstraints.reset(ArgumentListContext::alloc(m_memberDef->typeConstraints(),m_memberDef,relPathAsString()));
4932 cache.typeConstraints.reset(ArgumentListContext::alloc());
4934 return cache.typeConstraints.get();
4936 TemplateVariant functionQualifier() const
4938 if (!m_memberDef->isObjCMethod() &&
4939 (m_memberDef->isFunction() || m_memberDef->isSlot() ||
4940 m_memberDef->isPrototype() || m_memberDef->isSignal()
4951 TemplateVariant sourceRefs() const
4953 Cachable &cache = getCache();
4954 if (!cache.sourceRefs)
4956 cache.sourceRefs.reset(MemberListContext::alloc(m_memberDef->getReferencesMembers(),TRUE));
4958 return cache.sourceRefs.get();
4960 TemplateVariant sourceRefBys() const
4962 Cachable &cache = getCache();
4963 if (!cache.sourceRefBys)
4965 cache.sourceRefBys.reset(MemberListContext::alloc(m_memberDef->getReferencedByMembers(),TRUE));
4967 return cache.sourceRefBys.get();
4969 TemplateVariant hasSources() const
4971 return TemplateVariant(m_memberDef->hasSources());
4973 TemplateVariant sourceCode() const
4975 Cachable &cache = getCache();
4976 if (!cache.sourceCodeParsed)
4978 QCString codeFragment;
4979 FileDef *fd = m_memberDef->getBodyDef();
4980 int startLine = m_memberDef->getStartBodyLine();
4981 int endLine = m_memberDef->getEndBodyLine();
4982 if (fd && readCodeFragment(fd->absFilePath(),
4983 startLine,endLine,codeFragment)
4987 if (m_memberDef->getClassDef())
4989 scopeName = m_memberDef->getClassDef()->name();
4991 else if (m_memberDef->getNamespaceDef())
4993 scopeName = m_memberDef->getNamespaceDef()->name();
4995 cache.sourceCode = parseCode(m_memberDef,scopeName,relPathAsString(),codeFragment,startLine,endLine,TRUE);
4996 cache.sourceCodeParsed = TRUE;
4999 return cache.sourceCode;
5001 DotCallGraph *getCallGraph() const
5003 Cachable &cache = getCache();
5004 if (!cache.callGraph)
5006 cache.callGraph.reset(new DotCallGraph(m_memberDef,FALSE));
5008 return cache.callGraph.get();
5010 TemplateVariant hasCallGraph() const
5012 static bool haveDot = Config_getBool(HAVE_DOT);
5013 if (m_memberDef->hasCallGraph() && haveDot &&
5014 (m_memberDef->isFunction() || m_memberDef->isSlot() || m_memberDef->isSignal()))
5016 DotCallGraph *cg = getCallGraph();
5017 return !cg->isTooBig() && !cg->isTrivial();
5019 return TemplateVariant(FALSE);
5021 TemplateVariant hasReferencedByRelation() const
5023 return TemplateVariant(m_memberDef->hasReferencedByRelation());
5025 TemplateVariant callGraph() const
5027 if (hasCallGraph().toBool())
5029 DotCallGraph *cg = getCallGraph();
5031 FTextStream t(&result);
5032 switch (g_globals.outputFormat)
5034 case ContextOutputFormat_Html:
5036 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
5037 g_globals.outputDir,
5038 g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
5039 relPathAsString(),TRUE,g_globals.dynSectionId
5043 case ContextOutputFormat_Latex:
5045 cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
5046 g_globals.outputDir,
5047 g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+".tex",
5048 relPathAsString(),TRUE,g_globals.dynSectionId
5052 // TODO: support other generators
5054 err("context.cpp: output format not yet supported");
5057 g_globals.dynSectionId++;
5058 return TemplateVariant(result.data(),TRUE);
5062 return TemplateVariant("");
5065 TemplateVariant referencedByRelation() const
5067 if (hasReferencedByRelation().toBool())
5069 err("context.cpp: output format not yet supported");
5071 return TemplateVariant("");
5073 DotCallGraph *getCallerGraph() const
5075 Cachable &cache = getCache();
5076 if (!cache.callerGraph)
5078 cache.callerGraph.reset(new DotCallGraph(m_memberDef,TRUE));
5080 return cache.callerGraph.get();
5082 TemplateVariant hasCallerGraph() const
5084 static bool haveDot = Config_getBool(HAVE_DOT);
5085 if (m_memberDef->hasCallerGraph() && haveDot &&
5086 (m_memberDef->isFunction() || m_memberDef->isSlot() || m_memberDef->isSignal()))
5088 DotCallGraph *cg = getCallerGraph();
5089 return !cg->isTooBig() && !cg->isTrivial();
5091 return TemplateVariant(FALSE);
5093 TemplateVariant hasReferencesRelation() const
5095 return TemplateVariant(m_memberDef->hasReferencesRelation());
5097 TemplateVariant callerGraph() const
5099 if (hasCallerGraph().toBool())
5101 DotCallGraph *cg = getCallerGraph();
5103 FTextStream t(&result);
5104 switch (g_globals.outputFormat)
5106 case ContextOutputFormat_Html:
5108 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
5109 g_globals.outputDir,
5110 g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
5111 relPathAsString(),TRUE,g_globals.dynSectionId
5115 case ContextOutputFormat_Latex:
5117 cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
5118 g_globals.outputDir,
5119 g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+".tex",
5120 relPathAsString(),TRUE,g_globals.dynSectionId
5124 // TODO: support other generators
5126 err("context.cpp: output format not yet supported");
5129 g_globals.dynSectionId++;
5130 return TemplateVariant(result.data(),TRUE);
5134 return TemplateVariant("");
5137 TemplateVariant referencesRelation() const
5139 if (hasReferencesRelation().toBool())
5141 err("context.cpp: output format not yet supported");
5143 return TemplateVariant("");
5145 TemplateVariant type() const
5147 return m_memberDef->typeString();
5149 TemplateVariant handleDetailsVisibleFor(const QValueList<TemplateVariant> &args) const
5151 if (args.count()==1)
5153 return m_memberDef->isDetailedSectionVisible(args[0].toString()=="module",args[0].toString()=="file");
5157 err(".detailsVisibleFor should take one string argument, got %d\n",args.count());
5159 return TemplateVariant();
5161 TemplateVariant detailsVisibleFor() const
5163 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleDetailsVisibleFor>(this);
5165 TemplateVariant handleNameWithContextFor(const QValueList<TemplateVariant> &args) const
5167 if (args.count()==1)
5169 SrcLangExt lang = m_memberDef->getLanguage();
5170 QCString n = m_memberDef->name();
5171 QCString ctx = args[0].toString();
5172 QCString sep = getLanguageSpecificSeparator(lang,TRUE);
5173 if (m_memberDef->getEnumScope() && m_memberDef->livesInsideEnum())
5175 n.prepend(m_memberDef->getEnumScope()->displayName()+sep);
5177 if (ctx=="module" && m_memberDef->getClassDef() && !m_memberDef->isRelated())
5179 n.prepend(m_memberDef->getClassDef()->displayName()+sep);
5181 else if ((ctx=="module" || ctx=="file") && m_memberDef->getNamespaceDef())
5183 n.prepend(m_memberDef->getNamespaceDef()->displayName()+sep);
5189 err(".nameWithContextFor should take one string argument, got %d\n",args.count());
5191 return TemplateVariant();
5193 TemplateVariant nameWithContextFor() const
5195 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleNameWithContextFor>(this);
5198 MemberDef *m_memberDef;
5199 struct Cachable : public DefinitionContext<MemberContext::Private>::Cachable
5201 Cachable(MemberDef *md) : DefinitionContext<MemberContext::Private>::Cachable(md),
5202 initializerParsed(FALSE), sourceCodeParsed(FALSE),
5203 declArgsParsed(FALSE), declTypeParsed(FALSE) { }
5204 SharedPtr<ArgumentListContext> templateArgs;
5205 SharedPtr<ArgumentListContext> arguments;
5206 SharedPtr<MemberListContext> enumValues;
5207 SharedPtr<FileContext> fileDef;
5208 SharedPtr<NamespaceContext> namespaceDef;
5209 SharedPtr<ClassContext> category;
5210 SharedPtr<MemberContext> categoryRelation;
5211 SharedPtr<ClassContext> classDef;
5212 SharedPtr<ClassContext> anonymousType;
5213 SharedPtr<TemplateList> templateDecls;
5214 ScopedPtr<TemplateVariant> paramDocs;
5215 SharedPtr<TemplateList> implements;
5216 SharedPtr<TemplateList> reimplements;
5217 SharedPtr<TemplateList> implementedBy;
5218 SharedPtr<MemberListContext> sourceRefs;
5219 SharedPtr<MemberListContext> sourceRefBys;
5220 ScopedPtr<DotCallGraph> callGraph;
5221 ScopedPtr<DotCallGraph> callerGraph;
5222 SharedPtr<MemberContext> anonymousMember;
5223 SharedPtr<TemplateList> reimplementedBy;
5224 SharedPtr<TemplateList> labels;
5225 TemplateVariant initializer;
5226 bool initializerParsed;
5227 TemplateVariant sourceCode;
5228 bool sourceCodeParsed;
5229 TemplateVariant declArgs;
5230 bool declArgsParsed;
5231 TemplateVariant declType;
5232 bool declTypeParsed;
5233 SharedPtr<TemplateList> examples;
5234 SharedPtr<TemplateList> exampleList;
5235 SharedPtr<ArgumentListContext> typeConstraints;
5236 SharedPtr<TemplateList> propertyAttrs;
5237 SharedPtr<TemplateList> eventAttrs;
5239 Cachable &getCache() const
5241 Cachable *c = static_cast<Cachable*>(m_memberDef->cookie());
5245 static PropertyMapper<MemberContext::Private> s_inst;
5249 PropertyMapper<MemberContext::Private> MemberContext::Private::s_inst;
5251 MemberContext::MemberContext(MemberDef *md) : RefCountedContext("MemberContext")
5253 p = new Private(md);
5256 MemberContext::~MemberContext()
5261 TemplateVariant MemberContext::get(const char *n) const
5267 //------------------------------------------------------------------------
5269 //%% struct Module(Symbol): group information
5271 class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
5274 Private(GroupDef *gd) : DefinitionContext<ModuleContext::Private>(gd) , m_groupDef(gd)
5276 static bool init=FALSE;
5279 addBaseProperties(s_inst);
5280 s_inst.addProperty("title", &Private::title);
5281 s_inst.addProperty("highlight", &Private::highlight);
5282 s_inst.addProperty("subhighlight", &Private::subHighlight);
5283 s_inst.addProperty("hasGroupGraph", &Private::hasGroupGraph);
5284 s_inst.addProperty("groupGraph", &Private::groupGraph);
5285 s_inst.addProperty("hasDetails", &Private::hasDetails);
5286 s_inst.addProperty("modules", &Private::modules);
5287 s_inst.addProperty("dirs", &Private::dirs);
5288 s_inst.addProperty("files", &Private::files);
5289 s_inst.addProperty("namespaces", &Private::namespaces);
5290 s_inst.addProperty("classes", &Private::classes);
5291 s_inst.addProperty("constantgroups", &Private::constantgroups);
5292 s_inst.addProperty("examples", &Private::examples);
5293 s_inst.addProperty("macros", &Private::macros);
5294 s_inst.addProperty("typedefs", &Private::typedefs);
5295 s_inst.addProperty("enums", &Private::enums);
5296 s_inst.addProperty("enumvalues", &Private::enumValues);
5297 s_inst.addProperty("functions", &Private::functions);
5298 s_inst.addProperty("variables", &Private::variables);
5299 s_inst.addProperty("signals", &Private::signals);
5300 s_inst.addProperty("publicSlots", &Private::publicSlots);
5301 s_inst.addProperty("protectedSlots", &Private::protectedSlots);
5302 s_inst.addProperty("privateSlots", &Private::privateSlots);
5303 s_inst.addProperty("events", &Private::events);
5304 s_inst.addProperty("properties", &Private::properties);
5305 s_inst.addProperty("friends", &Private::friends);
5306 s_inst.addProperty("memberGroups", &Private::memberGroups);
5307 s_inst.addProperty("detailedMacros", &Private::detailedMacros);
5308 s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
5309 s_inst.addProperty("detailedEnums", &Private::detailedEnums);
5310 s_inst.addProperty("detailedEnumValues", &Private::detailedEnumValues);
5311 s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
5312 s_inst.addProperty("detailedVariables", &Private::detailedVariables);
5313 s_inst.addProperty("detailedSignals", &Private::detailedSignals);
5314 s_inst.addProperty("detailedPublicSlots", &Private::detailedPublicSlots);
5315 s_inst.addProperty("detailedProtectedSlots", &Private::detailedProtectedSlots);
5316 s_inst.addProperty("detailedPrivateSlots", &Private::detailedPrivateSlots);
5317 s_inst.addProperty("detailedEvents", &Private::detailedEvents);
5318 s_inst.addProperty("detailedProperties", &Private::detailedProperties);
5319 s_inst.addProperty("detailedFriends", &Private::detailedFriends);
5320 s_inst.addProperty("inlineClasses", &Private::inlineClasses);
5321 s_inst.addProperty("compoundType", &Private::compoundType);
5324 if (!gd->cookie()) { gd->setCookie(new ModuleContext::Private::Cachable(gd)); }
5326 virtual ~Private() {}
5327 TemplateVariant get(const char *n) const
5329 return s_inst.get(this,n);
5331 TemplateVariant title() const
5333 return TemplateVariant(m_groupDef->groupTitle());
5335 TemplateVariant highlight() const
5337 return TemplateVariant("modules");
5339 TemplateVariant subHighlight() const
5341 return TemplateVariant("");
5343 DotGroupCollaboration *getGroupGraph() const
5345 Cachable &cache = getCache();
5346 if (!cache.groupGraph)
5348 cache.groupGraph.reset(new DotGroupCollaboration(m_groupDef));
5350 return cache.groupGraph.get();
5352 TemplateVariant hasGroupGraph() const
5355 static bool haveDot = Config_getBool(HAVE_DOT);
5356 static bool groupGraphs = Config_getBool(GROUP_GRAPHS);
5357 if (haveDot && groupGraphs)
5359 DotGroupCollaboration *graph = getGroupGraph();
5360 result = !graph->isTrivial();
5364 TemplateVariant groupGraph() const
5367 static bool haveDot = Config_getBool(HAVE_DOT);
5368 static bool groupGraphs = Config_getBool(GROUP_GRAPHS);
5369 if (haveDot && groupGraphs)
5371 DotGroupCollaboration *graph = getGroupGraph();
5372 FTextStream t(&result);
5373 switch (g_globals.outputFormat)
5375 case ContextOutputFormat_Html:
5377 graph->writeGraph(t,GOF_BITMAP,
5379 g_globals.outputDir,
5380 g_globals.outputDir+portable_pathSeparator()+m_groupDef->getOutputFileBase()+Doxygen::htmlFileExtension,
5383 g_globals.dynSectionId);
5386 case ContextOutputFormat_Latex:
5388 graph->writeGraph(t,GOF_EPS,
5390 g_globals.outputDir,
5391 g_globals.outputDir+portable_pathSeparator()+m_groupDef->getOutputFileBase()+".tex",
5394 g_globals.dynSectionId);
5397 // TODO: support other generators
5399 err("context.cpp: output format not yet supported");
5402 g_globals.dynSectionId++;
5404 return TemplateVariant(result.data(),TRUE);
5406 TemplateVariant hasDetails() const
5408 return m_groupDef->hasDetailedDescription();
5410 TemplateVariant modules() const
5412 Cachable &cache = getCache();
5415 TemplateList *moduleList = TemplateList::alloc();
5416 if (m_groupDef->getSubGroups())
5418 GroupListIterator gli(*m_groupDef->getSubGroups());
5420 for (gli.toFirst();(gd=gli.current());++gli)
5422 if (gd->isVisible())
5424 moduleList->append(ModuleContext::alloc(gd));
5428 cache.modules.reset(moduleList);
5430 return cache.modules.get();
5432 TemplateVariant examples() const
5434 Cachable &cache = getCache();
5435 if (!cache.examples)
5437 TemplateList *exampleList = TemplateList::alloc();
5438 if (m_groupDef->getExamples())
5440 PageSDict::Iterator eli(*m_groupDef->getExamples());
5442 for (eli.toFirst();(ex=eli.current());++eli)
5444 exampleList->append(PageContext::alloc(ex,FALSE,TRUE));
5447 cache.examples.reset(exampleList);
5449 return cache.examples.get();
5451 TemplateVariant pages() const
5453 Cachable &cache = getCache();
5456 TemplateList *pageList = TemplateList::alloc();
5457 if (m_groupDef->getExamples())
5459 PageSDict::Iterator eli(*m_groupDef->getPages());
5461 for (eli.toFirst();(ex=eli.current());++eli)
5463 pageList->append(PageContext::alloc(ex,FALSE,TRUE));
5466 cache.pages.reset(pageList);
5468 return cache.pages.get();
5470 TemplateVariant dirs() const
5472 Cachable &cache = getCache();
5475 TemplateList *dirList = TemplateList::alloc();
5476 if (m_groupDef->getDirs())
5478 QListIterator<DirDef> it(*m_groupDef->getDirs());
5480 for (it.toFirst();(dd=it.current());++it)
5482 dirList->append(DirContext::alloc(dd));
5485 cache.dirs.reset(dirList);
5487 return cache.dirs.get();
5489 TemplateVariant files() const
5491 Cachable &cache = getCache();
5494 TemplateList *fileList = TemplateList::alloc();
5495 if (m_groupDef->getFiles())
5497 QListIterator<FileDef> it(*m_groupDef->getFiles());
5499 for (it.toFirst();(fd=it.current());++it)
5501 fileList->append(FileContext::alloc(fd));
5504 cache.files.reset(fileList);
5506 return cache.files.get();
5508 TemplateVariant classes() const
5510 Cachable &cache = getCache();
5513 TemplateList *classList = TemplateList::alloc();
5514 if (m_groupDef->getClasses())
5516 ClassSDict::Iterator sdi(*m_groupDef->getClasses());
5518 for (sdi.toFirst();(cd=sdi.current());++sdi)
5520 if (cd->visibleInParentsDeclList())
5522 classList->append(ClassContext::alloc(cd));
5526 cache.classes.reset(classList);
5528 return cache.classes.get();
5530 TemplateVariant namespaces() const
5532 Cachable &cache = getCache();
5533 if (!cache.namespaces)
5535 TemplateList *namespaceList = TemplateList::alloc();
5536 if (m_groupDef->getNamespaces())
5538 NamespaceSDict::Iterator sdi(*m_groupDef->getNamespaces());
5540 for (sdi.toFirst();(nd=sdi.current());++sdi)
5542 if (nd->isLinkable() && !nd->isConstantGroup())
5544 namespaceList->append(NamespaceContext::alloc(nd));
5548 cache.namespaces.reset(namespaceList);
5550 return cache.namespaces.get();
5552 TemplateVariant constantgroups() const
5554 Cachable &cache = getCache();
5555 if (!cache.constantgroups)
5557 TemplateList *namespaceList = TemplateList::alloc();
5558 if (m_groupDef->getNamespaces())
5560 NamespaceSDict::Iterator sdi(*m_groupDef->getNamespaces());
5562 for (sdi.toFirst();(nd=sdi.current());++sdi)
5564 if (nd->isLinkable() && nd->isConstantGroup())
5566 namespaceList->append(NamespaceContext::alloc(nd));
5570 cache.constantgroups.reset(namespaceList);
5572 return cache.constantgroups.get();
5575 TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
5576 MemberListType type,const char *title,bool detailed=FALSE) const
5580 MemberList *ml = m_groupDef->getMemberList(type);
5583 list.reset(MemberListInfoContext::alloc(m_groupDef,relPathAsString(),ml,title,""));
5592 return TemplateVariant(FALSE);
5595 TemplateVariant macros() const
5597 return getMemberList(getCache().macros,MemberListType_decDefineMembers,theTranslator->trDefines());
5599 TemplateVariant typedefs() const
5601 return getMemberList(getCache().typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
5603 TemplateVariant enums() const
5605 return getMemberList(getCache().enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
5607 TemplateVariant enumValues() const
5609 return getMemberList(getCache().enums,MemberListType_decEnumValMembers,theTranslator->trEnumerationValues());
5611 TemplateVariant functions() const
5613 QCString title = theTranslator->trFunctions();
5614 SrcLangExt lang = m_groupDef->getLanguage();
5615 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
5616 else if (lang==SrcLangExt_VHDL) title=theTranslator->trFunctionAndProc();
5617 return getMemberList(getCache().functions,MemberListType_decFuncMembers,title);
5619 TemplateVariant variables() const
5621 static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
5622 return getMemberList(getCache().variables,MemberListType_decVarMembers,
5623 sliceOpt ? theTranslator->trConstants() : theTranslator->trVariables());
5625 TemplateVariant signals() const
5627 return getMemberList(getCache().signals,MemberListType_signals,theTranslator->trSignals());
5629 TemplateVariant publicSlots() const
5631 return getMemberList(getCache().publicSlots,MemberListType_pubSlots,theTranslator->trPublicSlots());
5633 TemplateVariant protectedSlots() const
5635 return getMemberList(getCache().protectedSlots,MemberListType_proSlots,theTranslator->trProtectedSlots());
5637 TemplateVariant privateSlots() const
5639 return getMemberList(getCache().privateSlots,MemberListType_priSlots,theTranslator->trPrivateSlots());
5641 TemplateVariant events() const
5643 return getMemberList(getCache().events,MemberListType_events,theTranslator->trEvents());
5645 TemplateVariant properties() const
5647 return getMemberList(getCache().properties,MemberListType_properties,theTranslator->trProperties());
5649 TemplateVariant friends() const
5651 return getMemberList(getCache().friends,MemberListType_friends,theTranslator->trFriends());
5653 TemplateVariant memberGroups() const
5655 Cachable &cache = getCache();
5656 if (!cache.memberGroups)
5658 if (m_groupDef->getMemberGroupSDict())
5660 cache.memberGroups.reset(MemberGroupListContext::alloc(m_groupDef,relPathAsString(),m_groupDef->getMemberGroupSDict(),m_groupDef->subGrouping()));
5664 cache.memberGroups.reset(MemberGroupListContext::alloc());
5667 return cache.memberGroups.get();
5669 TemplateVariant detailedMacros() const
5671 return getMemberList(getCache().detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation());
5673 TemplateVariant detailedTypedefs() const
5675 return getMemberList(getCache().detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
5677 TemplateVariant detailedEnums() const
5679 return getMemberList(getCache().detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
5681 TemplateVariant detailedEnumValues() const
5683 return getMemberList(getCache().detailedEnumValues,MemberListType_docEnumValMembers,theTranslator->trEnumerationValueDocumentation());
5685 TemplateVariant detailedFunctions() const
5687 QCString title = theTranslator->trFunctionDocumentation();
5688 SrcLangExt lang = m_groupDef->getLanguage();
5689 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation();
5690 return getMemberList(getCache().detailedFunctions,MemberListType_docFuncMembers,title);
5692 TemplateVariant detailedVariables() const
5694 return getMemberList(getCache().detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
5696 TemplateVariant detailedSignals() const
5698 return getMemberList(getCache().detailedSignals,MemberListType_docSignalMembers,theTranslator->trSignals());
5700 TemplateVariant detailedPublicSlots() const
5702 return getMemberList(getCache().detailedPublicSlots,MemberListType_docPubSlotMembers,theTranslator->trPublicSlots());
5704 TemplateVariant detailedProtectedSlots() const
5706 return getMemberList(getCache().detailedProtectedSlots,MemberListType_docProSlotMembers,theTranslator->trProtectedSlots());
5708 TemplateVariant detailedPrivateSlots() const
5710 return getMemberList(getCache().detailedPrivateSlots,MemberListType_docPriSlotMembers,theTranslator->trPrivateSlots());
5712 TemplateVariant detailedEvents() const
5714 return getMemberList(getCache().detailedEvents,MemberListType_docEventMembers,theTranslator->trEventDocumentation(),TRUE);
5716 TemplateVariant detailedProperties() const
5718 return getMemberList(getCache().detailedProperties,MemberListType_docPropMembers,theTranslator->trPropertyDocumentation(),TRUE);
5720 TemplateVariant detailedFriends() const
5722 return getMemberList(getCache().detailedFriends,MemberListType_docFriendMembers,theTranslator->trFriends(),TRUE);
5724 TemplateVariant inlineClasses() const
5726 Cachable &cache = getCache();
5727 if (!cache.inlineClasses)
5729 TemplateList *classList = TemplateList::alloc();
5730 if (m_groupDef->getClasses())
5732 ClassSDict::Iterator sdi(*m_groupDef->getClasses());
5734 for (sdi.toFirst();(cd=sdi.current());++sdi)
5736 if (cd->name().find('@')==-1 &&
5737 cd->isLinkableInProject() &&
5738 cd->isEmbeddedInOuterScope() &&
5739 cd->partOfGroups()==0)
5741 classList->append(ClassContext::alloc(cd));
5745 cache.inlineClasses.reset(classList);
5747 return cache.inlineClasses.get();
5749 TemplateVariant compoundType() const
5751 return "module"; //theTranslator->trGroup(FALSE,TRUE);
5754 GroupDef *m_groupDef;
5755 struct Cachable : public DefinitionContext<ModuleContext::Private>::Cachable
5757 Cachable(GroupDef *gd) : DefinitionContext<ModuleContext::Private>::Cachable(gd) {}
5758 SharedPtr<TemplateList> modules;
5759 SharedPtr<TemplateList> dirs;
5760 SharedPtr<TemplateList> files;
5761 SharedPtr<TemplateList> classes;
5762 SharedPtr<TemplateList> namespaces;
5763 SharedPtr<TemplateList> constantgroups;
5764 SharedPtr<TemplateList> examples;
5765 SharedPtr<TemplateList> pages;
5766 SharedPtr<MemberListInfoContext> macros;
5767 SharedPtr<MemberListInfoContext> typedefs;
5768 SharedPtr<MemberListInfoContext> enums;
5769 SharedPtr<MemberListInfoContext> enumValues;
5770 SharedPtr<MemberListInfoContext> functions;
5771 SharedPtr<MemberListInfoContext> variables;
5772 SharedPtr<MemberListInfoContext> signals;
5773 SharedPtr<MemberListInfoContext> publicSlots;
5774 SharedPtr<MemberListInfoContext> protectedSlots;
5775 SharedPtr<MemberListInfoContext> privateSlots;
5776 SharedPtr<MemberListInfoContext> events;
5777 SharedPtr<MemberListInfoContext> properties;
5778 SharedPtr<MemberListInfoContext> friends;
5779 SharedPtr<MemberGroupListContext> memberGroups;
5780 SharedPtr<MemberListInfoContext> detailedMacros;
5781 SharedPtr<MemberListInfoContext> detailedTypedefs;
5782 SharedPtr<MemberListInfoContext> detailedEnums;
5783 SharedPtr<MemberListInfoContext> detailedEnumValues;
5784 SharedPtr<MemberListInfoContext> detailedFunctions;
5785 SharedPtr<MemberListInfoContext> detailedVariables;
5786 SharedPtr<MemberListInfoContext> detailedSignals;
5787 SharedPtr<MemberListInfoContext> detailedPublicSlots;
5788 SharedPtr<MemberListInfoContext> detailedProtectedSlots;
5789 SharedPtr<MemberListInfoContext> detailedPrivateSlots;
5790 SharedPtr<MemberListInfoContext> detailedEvents;
5791 SharedPtr<MemberListInfoContext> detailedProperties;
5792 SharedPtr<MemberListInfoContext> detailedFriends;
5793 SharedPtr<TemplateList> inlineClasses;
5794 ScopedPtr<DotGroupCollaboration> groupGraph;
5796 Cachable &getCache() const
5798 Cachable *c = static_cast<Cachable*>(m_groupDef->cookie());
5802 static PropertyMapper<ModuleContext::Private> s_inst;
5806 PropertyMapper<ModuleContext::Private> ModuleContext::Private::s_inst;
5808 ModuleContext::ModuleContext(GroupDef *gd) : RefCountedContext("ModuleContext")
5810 p = new Private(gd);
5813 ModuleContext::~ModuleContext()
5818 TemplateVariant ModuleContext::get(const char *n) const
5823 //------------------------------------------------------------------------
5825 //%% list ClassList[Class] : list of classes
5826 class ClassListContext::Private : public GenericNodeListContext
5829 void addClasses(const ClassSDict &classSDict)
5831 ClassSDict::Iterator cli(classSDict);
5833 for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
5835 if (cd->getLanguage()==SrcLangExt_VHDL &&
5836 ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
5837 (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
5838 ) // no architecture
5842 if (cd->isLinkableInProject() && cd->templateMaster()==0 &&
5843 !cd->isHidden() && !cd->isEmbeddedInOuterScope())
5845 append(ClassContext::alloc(cd));
5851 ClassListContext::ClassListContext() : RefCountedContext("ClassListContext")
5854 p->addClasses(*Doxygen::classSDict);
5855 p->addClasses(*Doxygen::hiddenClasses);
5858 ClassListContext::~ClassListContext()
5864 int ClassListContext::count() const
5869 TemplateVariant ClassListContext::at(int index) const
5871 return p->at(index);
5874 TemplateListIntf::ConstIterator *ClassListContext::createIterator() const
5876 return p->createIterator();
5879 //------------------------------------------------------------------------
5881 //%% list ClassIndex[Class] : list of classes
5882 class ClassIndexContext::Private
5887 static bool init=FALSE;
5890 s_inst.addProperty("list", &Private::list);
5891 s_inst.addProperty("fileName", &Private::fileName);
5892 s_inst.addProperty("relPath", &Private::relPath);
5893 s_inst.addProperty("highlight", &Private::highlight);
5894 s_inst.addProperty("subhighlight",&Private::subhighlight);
5895 s_inst.addProperty("title", &Private::title);
5899 TemplateVariant get(const char *n) const
5901 return s_inst.get(this,n);
5903 TemplateVariant list() const
5905 if (!m_cache.classes)
5907 TemplateList *classList = TemplateList::alloc();
5908 if (Doxygen::classSDict)
5910 ClassSDict::Iterator cli(*Doxygen::classSDict);
5912 for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
5914 if (cd->getLanguage()==SrcLangExt_VHDL &&
5915 ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
5916 (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
5917 ) // no architecture
5921 if (cd->isLinkableInProject() && cd->templateMaster()==0)
5923 classList->append(ClassContext::alloc(cd));
5927 m_cache.classes.reset(classList);
5929 return m_cache.classes.get();
5931 TemplateVariant fileName() const
5935 TemplateVariant relPath() const
5939 TemplateVariant highlight() const
5943 TemplateVariant subhighlight() const
5945 return "classindex";
5947 TemplateVariant title() const
5949 static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
5950 static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
5953 return theTranslator->trDataTypes();
5957 return theTranslator->trDesignUnits();
5961 return theTranslator->trCompoundIndex();
5967 SharedPtr<TemplateList> classes;
5969 mutable Cachable m_cache;
5970 static PropertyMapper<ClassIndexContext::Private> s_inst;
5973 PropertyMapper<ClassIndexContext::Private> ClassIndexContext::Private::s_inst;
5975 ClassIndexContext::ClassIndexContext() : RefCountedContext("ClassIndexContext")
5978 //p->addClasses(*Doxygen::hiddenClasses);
5981 ClassIndexContext::~ClassIndexContext()
5986 // TemplateStructIntf
5987 TemplateVariant ClassIndexContext::get(const char *n) const
5992 //------------------------------------------------------------------------
5994 static int computeMaxDepth(const TemplateListIntf *list)
5999 TemplateListIntf::ConstIterator *it = list->createIterator();
6001 for (it->toFirst();it->current(v);it->toNext())
6003 const TemplateStructIntf *s = v.toStruct();
6004 TemplateVariant child = s->get("children");
6005 int d = computeMaxDepth(child.toList())+1;
6006 if (d>maxDepth) maxDepth=d;
6013 static int computeNumNodesAtLevel(const TemplateStructIntf *s,int level,int maxLevel)
6019 TemplateVariant child = s->get("children");
6022 TemplateListIntf::ConstIterator *it = child.toList()->createIterator();
6024 for (it->toFirst();it->current(v);it->toNext())
6026 num+=computeNumNodesAtLevel(v.toStruct(),level+1,maxLevel);
6034 static int computePreferredDepth(const TemplateListIntf *list,int maxDepth)
6036 int preferredNumEntries = Config_getInt(HTML_INDEX_NUM_ENTRIES);
6037 int preferredDepth=1;
6038 if (preferredNumEntries>0)
6040 int depth = maxDepth;
6041 for (int i=1;i<=depth;i++)
6044 TemplateListIntf::ConstIterator *it = list->createIterator();
6046 for (it->toFirst();it->current(v);it->toNext())
6048 num+=computeNumNodesAtLevel(v.toStruct(),0,i);
6051 if (num<=preferredNumEntries)
6061 return preferredDepth;
6064 //------------------------------------------------------------------------
6066 //%% struct ClassHierarchy: inheritance tree
6068 class ClassHierarchyContext::Private
6073 m_classTree.reset(NestingContext::alloc(0,0));
6074 initClassHierarchy(Doxygen::classSDict);
6075 initClassHierarchy(Doxygen::hiddenClasses);
6076 m_classTree->addClassHierarchy(*Doxygen::classSDict,TRUE);
6077 m_classTree->addClassHierarchy(*Doxygen::hiddenClasses,TRUE);
6078 //%% ClassInheritance tree
6079 static bool init=FALSE;
6082 s_inst.addProperty("tree", &Private::tree);
6083 s_inst.addProperty("fileName", &Private::fileName);
6084 s_inst.addProperty("relPath", &Private::relPath);
6085 s_inst.addProperty("highlight", &Private::highlight);
6086 s_inst.addProperty("subhighlight", &Private::subhighlight);
6087 s_inst.addProperty("title", &Private::title);
6088 s_inst.addProperty("preferredDepth", &Private::preferredDepth);
6089 s_inst.addProperty("maxDepth", &Private::maxDepth);
6090 s_inst.addProperty("diagrams", &Private::diagrams);
6094 TemplateVariant get(const char *n) const
6096 return s_inst.get(this,n);
6098 TemplateVariant tree() const
6100 return m_classTree.get();
6102 TemplateVariant fileName() const
6106 TemplateVariant relPath() const
6110 TemplateVariant highlight() const
6114 TemplateVariant subhighlight() const
6116 return "classhierarchy";
6118 DotGfxHierarchyTable *getHierarchy() const
6120 if (!m_cache.hierarchy)
6122 m_cache.hierarchy.reset(new DotGfxHierarchyTable());
6124 return m_cache.hierarchy.get();
6126 TemplateVariant diagrams() const
6128 if (!m_cache.diagrams)
6130 TemplateList *diagrams = TemplateList::alloc();
6131 DotGfxHierarchyTable *hierarchy = getHierarchy();
6132 if (hierarchy->subGraphs())
6135 QListIterator<DotNode> li(*hierarchy->subGraphs());
6137 for (li.toFirst();(n=li.current());++li)
6139 diagrams->append(InheritanceGraphContext::alloc(hierarchy,n,id++));
6142 m_cache.diagrams.reset(diagrams);
6144 return m_cache.diagrams.get();
6146 TemplateVariant title() const
6148 static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
6151 return theTranslator->trDesignUnitHierarchy();
6155 return theTranslator->trClassHierarchy();
6158 TemplateVariant maxDepth() const
6160 if (!m_cache.maxDepthComputed)
6162 m_cache.maxDepth = computeMaxDepth(m_classTree.get());
6163 m_cache.maxDepthComputed=TRUE;
6165 return m_cache.maxDepth;
6167 TemplateVariant preferredDepth() const
6169 if (!m_cache.preferredDepthComputed)
6171 m_cache.preferredDepth = computePreferredDepth(m_classTree.get(),maxDepth().toInt());
6172 m_cache.preferredDepthComputed=TRUE;
6174 return m_cache.preferredDepth;
6177 SharedPtr<NestingContext> m_classTree;
6180 Cachable() : maxDepth(0), maxDepthComputed(FALSE),
6181 preferredDepth(0), preferredDepthComputed(FALSE), hierarchy(0) {}
6183 bool maxDepthComputed;
6185 bool preferredDepthComputed;
6186 SharedPtr<TemplateList> diagrams;
6187 ScopedPtr<DotGfxHierarchyTable> hierarchy;
6189 mutable Cachable m_cache;
6190 static PropertyMapper<ClassHierarchyContext::Private> s_inst;
6194 PropertyMapper<ClassHierarchyContext::Private> ClassHierarchyContext::Private::s_inst;
6196 ClassHierarchyContext::ClassHierarchyContext() : RefCountedContext("ClassHierarchyContext")
6201 ClassHierarchyContext::~ClassHierarchyContext()
6206 TemplateVariant ClassHierarchyContext::get(const char *name) const
6208 return p->get(name);
6211 //------------------------------------------------------------------------
6213 //%% struct NestingNode: node is a nesting relation tree
6215 class NestingNodeContext::Private
6218 Private(const NestingNodeContext *parent,const NestingNodeContext *thisNode,
6219 Definition *d,int index,int level,bool addCls,bool inherit, bool hideSuper)
6220 : m_parent(parent), m_def(d), m_level(level), m_index(index)
6222 m_children.reset(NestingContext::alloc(thisNode,level+1));
6223 static bool init=FALSE;
6226 //%% bool is_leaf_node: true if this node does not have any children
6227 s_inst.addProperty("is_leaf_node",&Private::isLeafNode);
6228 //%% Nesting children: list of nested classes/namespaces
6229 s_inst.addProperty("children",&Private::children);
6230 //%% [optional] Class class: class info (if this node represents a class)
6231 s_inst.addProperty("class",&Private::getClass);
6232 //%% [optional] Namespace namespace: namespace info (if this node represents a namespace)
6233 s_inst.addProperty("namespace",&Private::getNamespace);
6234 //%% [optional] File file: file info (if this node represents a file)
6235 s_inst.addProperty("file",&Private::getFile);
6236 //%% [optional] Dir dir: directory info (if this node represents a directory)
6237 s_inst.addProperty("dir",&Private::getDir);
6238 //%% [optional] Page page: page info (if this node represents a page)
6239 s_inst.addProperty("page",&Private::getPage);
6240 //%% [optional] Module module: module info (if this node represents a module)
6241 s_inst.addProperty("module",&Private::getModule);
6243 s_inst.addProperty("id",&Private::id);
6245 s_inst.addProperty("level",&Private::level);
6247 s_inst.addProperty("name",&Private::name);
6249 s_inst.addProperty("brief",&Private::brief);
6250 //%% bool isLinkable
6251 s_inst.addProperty("isLinkable",&Private::isLinkable);
6252 s_inst.addProperty("anchor",&Private::anchor);
6253 s_inst.addProperty("fileName",&Private::fileName);
6254 s_inst.addProperty("isReference",&Private::isReference);
6255 s_inst.addProperty("externalReference",&Private::externalReference);
6259 addNamespaces(addCls);
6260 addClasses(inherit,hideSuper);
6265 TemplateVariant get(const char *n) const
6267 return s_inst.get(this,n);
6269 TemplateVariant isLeafNode() const
6271 return m_children->count()==0;
6273 TemplateVariant children() const
6275 return m_children.get();
6277 TemplateVariant getClass() const
6279 if (!m_cache.classContext && m_def->definitionType()==Definition::TypeClass)
6281 m_cache.classContext.reset(ClassContext::alloc((ClassDef*)m_def));
6283 if (m_cache.classContext)
6285 return m_cache.classContext.get();
6289 return TemplateVariant(FALSE);
6292 TemplateVariant getNamespace() const
6294 if (!m_cache.namespaceContext && m_def->definitionType()==Definition::TypeNamespace)
6296 m_cache.namespaceContext.reset(NamespaceContext::alloc((NamespaceDef*)m_def));
6298 if (m_cache.namespaceContext)
6300 return m_cache.namespaceContext.get();
6304 return TemplateVariant(FALSE);
6307 TemplateVariant getDir() const
6309 if (!m_cache.dirContext && m_def->definitionType()==Definition::TypeDir)
6311 m_cache.dirContext.reset(DirContext::alloc((DirDef*)m_def));
6313 if (m_cache.dirContext)
6315 return m_cache.dirContext.get();
6319 return TemplateVariant(FALSE);
6322 TemplateVariant getFile() const
6324 if (!m_cache.fileContext && m_def->definitionType()==Definition::TypeFile)
6326 m_cache.fileContext.reset(FileContext::alloc((FileDef*)m_def));
6328 if (m_cache.fileContext)
6330 return m_cache.fileContext.get();
6334 return TemplateVariant(FALSE);
6337 TemplateVariant getPage() const
6339 if (!m_cache.pageContext && m_def->definitionType()==Definition::TypePage)
6341 m_cache.pageContext.reset(PageContext::alloc((PageDef*)m_def,FALSE,FALSE));
6343 if (m_cache.pageContext)
6345 return m_cache.pageContext.get();
6349 return TemplateVariant(FALSE);
6352 TemplateVariant getModule() const
6354 if (!m_cache.moduleContext && m_def->definitionType()==Definition::TypeGroup)
6356 m_cache.moduleContext.reset(ModuleContext::alloc((GroupDef*)m_def));
6358 if (m_cache.moduleContext)
6360 return m_cache.moduleContext.get();
6364 return TemplateVariant(FALSE);
6367 TemplateVariant level() const
6371 TemplateVariant id() const
6374 if (m_parent) result=m_parent->id();
6375 result+=QCString().setNum(m_index)+"_";
6378 TemplateVariant name() const
6380 return m_def->displayName(FALSE);
6382 QCString relPathAsString() const
6384 static bool createSubdirs = Config_getBool(CREATE_SUBDIRS);
6385 return createSubdirs ? QCString("../../") : QCString("");
6387 TemplateVariant brief() const
6391 if (m_def->hasBriefDescription())
6393 m_cache.brief.reset(new TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(),
6394 "",m_def->briefDescription(),TRUE)));
6398 m_cache.brief.reset(new TemplateVariant(""));
6401 return *m_cache.brief;
6403 TemplateVariant isLinkable() const
6405 return m_def->isLinkable();
6407 TemplateVariant anchor() const
6409 return m_def->anchor();
6411 TemplateVariant fileName() const
6413 return m_def->getOutputFileBase();
6415 TemplateVariant isReference() const
6417 return m_def->isReference();
6419 TemplateVariant externalReference() const
6421 return m_def->externalReference(relPathAsString());
6424 //------------------------------------------------------------------
6426 void addClasses(bool inherit, bool hideSuper)
6428 ClassDef *cd = m_def->definitionType()==Definition::TypeClass ? (ClassDef*)m_def : 0;
6431 bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd);
6434 bool wasVisited=cd->visited;
6436 if (cd->getLanguage()==SrcLangExt_VHDL)
6438 m_children->addDerivedClasses(cd->baseClasses(),wasVisited);
6442 m_children->addDerivedClasses(cd->subClasses(),wasVisited);
6448 if (cd && cd->getClassSDict())
6450 m_children->addClasses(*cd->getClassSDict(),FALSE);
6454 void addNamespaces(bool addClasses)
6456 NamespaceDef *nd = m_def->definitionType()==Definition::TypeNamespace ? (NamespaceDef*)m_def : 0;
6457 if (nd && nd->getNamespaceSDict())
6459 m_children->addNamespaces(*nd->getNamespaceSDict(),FALSE,addClasses);
6461 if (addClasses && nd && nd->getClassSDict())
6463 m_children->addClasses(*nd->getClassSDict(),FALSE);
6468 DirDef *dd = m_def->definitionType()==Definition::TypeDir ? (DirDef*)m_def : 0;
6471 m_children->addDirs(dd->subDirs());
6472 if (dd && dd->getFiles())
6474 m_children->addFiles(*dd->getFiles());
6480 PageDef *pd = m_def->definitionType()==Definition::TypePage ? (PageDef*)m_def : 0;
6481 if (pd && pd->getSubPages())
6483 m_children->addPages(*pd->getSubPages(),FALSE);
6488 GroupDef *gd = m_def->definitionType()==Definition::TypeGroup ? (GroupDef*)m_def : 0;
6489 if (gd && gd->getSubGroups())
6491 m_children->addModules(*gd->getSubGroups());
6495 const NestingNodeContext *m_parent;
6497 SharedPtr<NestingContext> m_children;
6502 SharedPtr<ClassContext> classContext;
6503 SharedPtr<NamespaceContext> namespaceContext;
6504 SharedPtr<DirContext> dirContext;
6505 SharedPtr<FileContext> fileContext;
6506 SharedPtr<PageContext> pageContext;
6507 SharedPtr<ModuleContext> moduleContext;
6508 ScopedPtr<TemplateVariant> brief;
6510 mutable Cachable m_cache;
6511 static PropertyMapper<NestingNodeContext::Private> s_inst;
6515 PropertyMapper<NestingNodeContext::Private> NestingNodeContext::Private::s_inst;
6517 NestingNodeContext::NestingNodeContext(const NestingNodeContext *parent,
6518 Definition *d,int index,int level,bool addClass,bool inherit,bool hideSuper)
6519 : RefCountedContext("NestingNodeContext")
6521 p = new Private(parent,this,d,index,level,addClass,inherit,hideSuper);
6524 NestingNodeContext::~NestingNodeContext()
6529 TemplateVariant NestingNodeContext::get(const char *n) const
6534 QCString NestingNodeContext::id() const
6536 return p->id().toString();
6539 //------------------------------------------------------------------------
6541 //%% list Nesting[NestingNode]: namespace and class nesting relations
6542 class NestingContext::Private : public GenericNodeListContext
6545 Private(const NestingNodeContext *parent,int level)
6546 : m_parent(parent), m_level(level), m_index(0) {}
6548 void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses)
6550 NamespaceSDict::Iterator nli(nsDict);
6552 for (nli.toFirst();(nd=nli.current());++nli)
6554 if (nd->localName().find('@')==-1 &&
6555 (!rootOnly || nd->getOuterScope()==Doxygen::globalScope))
6557 bool hasChildren = namespaceHasVisibleChild(nd,addClasses,false,ClassDef::Class);
6558 bool isLinkable = nd->isLinkableInProject();
6559 if (isLinkable || hasChildren)
6561 NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,nd,m_index,m_level,addClasses,FALSE,FALSE);
6568 void addClasses(const ClassSDict &clDict,bool rootOnly)
6570 ClassSDict::Iterator cli(clDict);
6572 for (;(cd=cli.current());++cli)
6574 if (cd->getLanguage()==SrcLangExt_VHDL)
6576 if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
6577 (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS
6584 cd->getOuterScope()==0 ||
6585 cd->getOuterScope()==Doxygen::globalScope
6588 if (classVisibleInIndex(cd) && cd->templateMaster()==0)
6590 NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,FALSE,FALSE);
6597 void addDirs(const DirSDict &dirDict)
6599 SDict<DirDef>::Iterator dli(dirDict);
6601 for (dli.toFirst();(dd=dli.current());++dli)
6603 if (dd->getOuterScope()==Doxygen::globalScope)
6605 append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE,FALSE,FALSE));
6610 void addDirs(const DirList &dirList)
6612 QListIterator<DirDef> li(dirList);
6614 for (li.toFirst();(dd=li.current());++li)
6616 append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE,FALSE,FALSE));
6620 void addFiles(const FileNameList &fnList)
6622 FileNameListIterator fnli(fnList);
6624 for (fnli.toFirst();(fn=fnli.current());++fnli)
6626 FileNameIterator fni(*fn);
6628 for (;(fd=fni.current());++fni)
6630 if (fd->getDirDef()==0) // top level file
6632 append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE,FALSE,FALSE));
6638 void addFiles(const FileList &fList)
6640 QListIterator<FileDef> li(fList);
6642 for (li.toFirst();(fd=li.current());++li)
6644 append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE,FALSE,FALSE));
6648 void addPages(const PageSDict &pages,bool rootOnly)
6650 SDict<PageDef>::Iterator pli(pages);
6652 for (pli.toFirst();(pd=pli.current());++pli)
6655 pd->getOuterScope()==0 ||
6656 pd->getOuterScope()->definitionType()!=Definition::TypePage)
6658 append(NestingNodeContext::alloc(m_parent,pd,m_index,m_level,FALSE,FALSE,FALSE));
6663 void addModules(const GroupSDict &groups)
6665 GroupSDict::Iterator gli(groups);
6667 for (gli.toFirst();(gd=gli.current());++gli)
6669 static bool externalGroups = Config_getBool(EXTERNAL_GROUPS);
6670 if (!gd->isASubGroup() && gd->isVisible() &&
6671 (!gd->isReference() || externalGroups)
6674 append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE,FALSE,FALSE));
6679 void addModules(const GroupList &list)
6681 GroupListIterator gli(list);
6683 for (gli.toFirst();(gd=gli.current());++gli)
6685 if (gd->isVisible())
6687 append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE,FALSE,FALSE));
6692 void addDerivedClasses(const BaseClassList *bcl,bool hideSuper)
6695 BaseClassListIterator bcli(*bcl);
6697 for (bcli.toFirst() ; (bcd=bcli.current()) ; ++bcli)
6699 ClassDef *cd=bcd->classDef;
6700 if (cd->getLanguage()==SrcLangExt_VHDL && (VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
6706 if (cd->getLanguage()==SrcLangExt_VHDL)
6708 b=hasVisibleRoot(cd->subClasses());
6712 b=hasVisibleRoot(cd->baseClasses());
6715 if (cd->isVisibleInHierarchy() && b)
6717 NestingNodeContext *tnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,TRUE,hideSuper);
6723 void addClassHierarchy(const ClassSDict &classSDict,bool)
6725 ClassSDict::Iterator cli(classSDict);
6727 for (cli.toFirst();(cd=cli.current());++cli)
6730 if (cd->getLanguage()==SrcLangExt_VHDL)
6732 if ((VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
6736 b=!hasVisibleRoot(cd->subClasses());
6740 b=!hasVisibleRoot(cd->baseClasses());
6744 if (cd->isVisibleInHierarchy()) // should it be visible
6746 // new root level class
6747 NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,TRUE,cd->visited);
6756 const NestingNodeContext *m_parent;
6761 NestingContext::NestingContext(const NestingNodeContext *parent,int level) : RefCountedContext("NestingContext")
6763 p = new Private(parent,level);
6766 NestingContext::~NestingContext()
6772 int NestingContext::count() const
6777 TemplateVariant NestingContext::at(int index) const
6779 return p->at(index);
6782 TemplateListIntf::ConstIterator *NestingContext::createIterator() const
6784 return p->createIterator();
6787 void NestingContext::addClasses(const ClassSDict &clDict,bool rootOnly)
6789 p->addClasses(clDict,rootOnly);
6792 void NestingContext::addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses)
6794 p->addNamespaces(nsDict,rootOnly,addClasses);
6797 void NestingContext::addDirs(const DirSDict &dirs)
6802 void NestingContext::addDirs(const DirList &dirs)
6807 void NestingContext::addFiles(const FileNameList &files)
6812 void NestingContext::addFiles(const FileList &files)
6817 void NestingContext::addPages(const PageSDict &pages,bool rootOnly)
6819 p->addPages(pages,rootOnly);
6822 void NestingContext::addModules(const GroupSDict &modules)
6824 p->addModules(modules);
6827 void NestingContext::addModules(const GroupList &modules)
6829 p->addModules(modules);
6832 void NestingContext::addClassHierarchy(const ClassSDict &classSDict,bool rootOnly)
6834 p->addClassHierarchy(classSDict,rootOnly);
6837 void NestingContext::addDerivedClasses(const BaseClassList *bcl,bool hideSuper)
6839 p->addDerivedClasses(bcl,hideSuper);
6842 //------------------------------------------------------------------------
6844 //%% struct ClassTree: Class nesting relations
6846 class ClassTreeContext::Private
6851 m_classTree.reset(NestingContext::alloc(0,0));
6852 if (Doxygen::namespaceSDict)
6854 m_classTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,TRUE);
6856 if (Doxygen::classSDict)
6858 m_classTree->addClasses(*Doxygen::classSDict,TRUE);
6861 static bool init=FALSE;
6864 s_inst.addProperty("tree", &Private::tree);
6865 s_inst.addProperty("fileName", &Private::fileName);
6866 s_inst.addProperty("relPath", &Private::relPath);
6867 s_inst.addProperty("highlight", &Private::highlight);
6868 s_inst.addProperty("subhighlight", &Private::subhighlight);
6869 s_inst.addProperty("title", &Private::title);
6870 s_inst.addProperty("preferredDepth",&Private::preferredDepth);
6871 s_inst.addProperty("maxDepth", &Private::maxDepth);
6875 TemplateVariant get(const char *n) const
6877 return s_inst.get(this,n);
6879 TemplateVariant tree() const
6881 return m_classTree.get();
6883 TemplateVariant fileName() const
6887 TemplateVariant relPath() const
6891 TemplateVariant highlight() const
6895 TemplateVariant subhighlight() const
6899 TemplateVariant title() const
6901 static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
6902 static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
6905 return theTranslator->trCompoundListFortran();
6909 return theTranslator->trDesignUnitList();
6913 return theTranslator->trClasses();
6916 TemplateVariant maxDepth() const
6918 if (!m_cache.maxDepthComputed)
6920 m_cache.maxDepth = computeMaxDepth(m_classTree.get());
6921 m_cache.maxDepthComputed=TRUE;
6923 return m_cache.maxDepth;
6925 TemplateVariant preferredDepth() const
6927 if (!m_cache.preferredDepthComputed)
6929 m_cache.preferredDepth = computePreferredDepth(m_classTree.get(),maxDepth().toInt());
6930 m_cache.preferredDepthComputed=TRUE;
6932 return m_cache.preferredDepth;
6935 SharedPtr<NestingContext> m_classTree;
6938 Cachable() : maxDepth(0), maxDepthComputed(FALSE),
6939 preferredDepth(0), preferredDepthComputed(FALSE) {}
6941 bool maxDepthComputed;
6943 bool preferredDepthComputed;
6945 mutable Cachable m_cache;
6946 static PropertyMapper<ClassTreeContext::Private> s_inst;
6950 PropertyMapper<ClassTreeContext::Private> ClassTreeContext::Private::s_inst;
6952 ClassTreeContext::ClassTreeContext() : RefCountedContext("ClassTreeContext")
6957 ClassTreeContext::~ClassTreeContext()
6962 TemplateVariant ClassTreeContext::get(const char *name) const
6964 return p->get(name);
6967 //------------------------------------------------------------------------
6969 //%% list NamespaceList[Namespace] : list of namespaces
6970 class NamespaceListContext::Private : public GenericNodeListContext
6973 void addNamespaces(const NamespaceSDict &nsDict)
6975 NamespaceSDict::Iterator nli(nsDict);
6977 for (nli.toFirst();(nd=nli.current());++nli)
6979 if (nd->isLinkableInProject())
6981 append(NamespaceContext::alloc(nd));
6987 NamespaceListContext::NamespaceListContext() : RefCountedContext("NamespaceListContext")
6990 p->addNamespaces(*Doxygen::namespaceSDict);
6993 NamespaceListContext::~NamespaceListContext()
6999 int NamespaceListContext::count() const
7004 TemplateVariant NamespaceListContext::at(int index) const
7006 return p->at(index);
7009 TemplateListIntf::ConstIterator *NamespaceListContext::createIterator() const
7011 return p->createIterator();
7014 //------------------------------------------------------------------------
7016 //%% struct NamespaceTree: tree of nested namespace
7018 class NamespaceTreeContext::Private
7023 m_namespaceTree.reset(NestingContext::alloc(0,0));
7024 if (Doxygen::namespaceSDict)
7026 m_namespaceTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,FALSE);
7029 static bool init=FALSE;
7032 s_inst.addProperty("tree", &Private::tree);
7033 s_inst.addProperty("fileName", &Private::fileName);
7034 s_inst.addProperty("relPath", &Private::relPath);
7035 s_inst.addProperty("highlight", &Private::highlight);
7036 s_inst.addProperty("subhighlight", &Private::subhighlight);
7037 s_inst.addProperty("title", &Private::title);
7038 s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7039 s_inst.addProperty("maxDepth", &Private::maxDepth);
7043 TemplateVariant get(const char *n) const
7045 return s_inst.get(this,n);
7047 TemplateVariant tree() const
7049 return m_namespaceTree.get();
7051 TemplateVariant fileName() const
7053 return "namespaces";
7055 TemplateVariant relPath() const
7059 TemplateVariant highlight() const
7061 return "namespaces";
7063 TemplateVariant subhighlight() const
7065 return "namespacelist";
7067 TemplateVariant title() const
7069 static bool javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
7070 static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
7071 static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
7072 static bool sliceOpt = Config_getBool(OPTIMIZE_OUTPUT_SLICE);
7073 if (javaOpt || vhdlOpt)
7075 return theTranslator->trPackages();
7077 else if (fortranOpt || sliceOpt)
7079 return theTranslator->trModulesList();
7083 return theTranslator->trNamespaceList();
7086 TemplateVariant maxDepth() const
7088 if (!m_cache.maxDepthComputed)
7090 m_cache.maxDepth = computeMaxDepth(m_namespaceTree.get());
7091 m_cache.maxDepthComputed=TRUE;
7093 return m_cache.maxDepth;
7095 TemplateVariant preferredDepth() const
7097 if (!m_cache.preferredDepthComputed)
7099 m_cache.preferredDepth = computePreferredDepth(m_namespaceTree.get(),maxDepth().toInt());
7100 m_cache.preferredDepthComputed=TRUE;
7102 return m_cache.preferredDepth;
7105 SharedPtr<NestingContext> m_namespaceTree;
7108 Cachable() : maxDepth(0), maxDepthComputed(FALSE),
7109 preferredDepth(0), preferredDepthComputed(FALSE) {}
7111 bool maxDepthComputed;
7113 bool preferredDepthComputed;
7115 mutable Cachable m_cache;
7116 static PropertyMapper<NamespaceTreeContext::Private> s_inst;
7120 PropertyMapper<NamespaceTreeContext::Private> NamespaceTreeContext::Private::s_inst;
7122 NamespaceTreeContext::NamespaceTreeContext() : RefCountedContext("NamespaceTreeContext")
7127 NamespaceTreeContext::~NamespaceTreeContext()
7132 TemplateVariant NamespaceTreeContext::get(const char *name) const
7134 return p->get(name);
7137 //------------------------------------------------------------------------
7139 //%% list FileList[File] : list of files
7140 class FileListContext::Private : public GenericNodeListContext
7143 void addFiles(const FileNameList &fnList)
7145 // TODO: if FULL_PATH_NAMES is enabled, the ordering should be dir+file
7146 FileNameListIterator fnli(fnList);
7148 for (fnli.toFirst();(fn=fnli.current());++fnli)
7150 FileNameIterator fni(*fn);
7152 for (fni.toFirst();(fd=fni.current());++fni)
7154 bool doc = fd->isLinkableInProject();
7155 bool src = fd->generateSourceFile();
7156 bool nameOk = !fd->isDocumentationFile();
7157 if (nameOk && (doc || src) && !fd->isReference())
7159 append(FileContext::alloc(fd));
7166 FileListContext::FileListContext() : RefCountedContext("FileListContext")
7169 if (Doxygen::inputNameList) p->addFiles(*Doxygen::inputNameList);
7172 FileListContext::~FileListContext()
7178 int FileListContext::count() const
7183 TemplateVariant FileListContext::at(int index) const
7185 return p->at(index);
7188 TemplateListIntf::ConstIterator *FileListContext::createIterator() const
7190 return p->createIterator();
7193 //------------------------------------------------------------------------
7195 //%% list DirList[Dir] : list of files
7196 class DirListContext::Private : public GenericNodeListContext
7202 DirSDict::Iterator sdi(*Doxygen::directories);
7203 for (sdi.toFirst();(dir=sdi.current());++sdi)
7205 append(DirContext::alloc(dir));
7210 DirListContext::DirListContext() : RefCountedContext("DirListContext")
7215 DirListContext::~DirListContext()
7221 int DirListContext::count() const
7226 TemplateVariant DirListContext::at(int index) const
7228 return p->at(index);
7231 TemplateListIntf::ConstIterator *DirListContext::createIterator() const
7233 return p->createIterator();
7237 //------------------------------------------------------------------------
7239 //%% list UsedFiles[File] : list of files
7240 class UsedFilesContext::Private : public GenericNodeListContext
7243 void addFile(FileDef *fd)
7245 append(FileContext::alloc(fd));
7249 UsedFilesContext::UsedFilesContext(ClassDef *cd) : RefCountedContext("UsedFilesContext")
7254 QListIterator<FileDef> li(cd->usedFiles());
7256 for (li.toFirst();(fd=li.current());++li)
7263 UsedFilesContext::~UsedFilesContext()
7269 int UsedFilesContext::count() const
7274 TemplateVariant UsedFilesContext::at(int index) const
7276 return p->at(index);
7279 TemplateListIntf::ConstIterator *UsedFilesContext::createIterator() const
7281 return p->createIterator();
7284 void UsedFilesContext::addFile(FileDef *fd)
7289 //------------------------------------------------------------------------
7291 //%% struct FileTree: tree of directories and files
7293 class FileTreeContext::Private
7299 m_dirFileTree.reset(NestingContext::alloc(0,0));
7300 if (Doxygen::directories)
7302 m_dirFileTree->addDirs(*Doxygen::directories);
7304 if (Doxygen::inputNameList)
7306 m_dirFileTree->addFiles(*Doxygen::inputNameList);
7309 static bool init=FALSE;
7312 s_inst.addProperty("tree", &Private::tree);
7313 s_inst.addProperty("fileName", &Private::fileName);
7314 s_inst.addProperty("relPath", &Private::relPath);
7315 s_inst.addProperty("highlight", &Private::highlight);
7316 s_inst.addProperty("subhighlight", &Private::subhighlight);
7317 s_inst.addProperty("title", &Private::title);
7318 s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7319 s_inst.addProperty("maxDepth", &Private::maxDepth);
7323 TemplateVariant get(const char *n) const
7325 return s_inst.get(this,n);
7327 TemplateVariant tree() const
7329 return m_dirFileTree.get();
7331 TemplateVariant fileName() const
7335 TemplateVariant relPath() const
7339 TemplateVariant highlight() const
7343 TemplateVariant subhighlight() const
7347 TemplateVariant title() const
7349 return theTranslator->trFileList();
7351 TemplateVariant maxDepth() const
7353 if (!m_cache.maxDepthComputed)
7355 m_cache.maxDepth = computeMaxDepth(m_dirFileTree.get());
7356 m_cache.maxDepthComputed=TRUE;
7358 return m_cache.maxDepth;
7360 TemplateVariant preferredDepth() const
7362 if (!m_cache.preferredDepthComputed)
7364 m_cache.preferredDepth = computePreferredDepth(m_dirFileTree.get(),maxDepth().toInt());
7365 m_cache.preferredDepthComputed=TRUE;
7367 return m_cache.preferredDepth;
7370 SharedPtr<NestingContext> m_dirFileTree;
7373 Cachable() : maxDepth(0), maxDepthComputed(FALSE),
7374 preferredDepth(0), preferredDepthComputed(FALSE) {}
7376 bool maxDepthComputed;
7378 bool preferredDepthComputed;
7380 mutable Cachable m_cache;
7381 static PropertyMapper<FileTreeContext::Private> s_inst;
7385 PropertyMapper<FileTreeContext::Private> FileTreeContext::Private::s_inst;
7387 FileTreeContext::FileTreeContext() : RefCountedContext("FileTreeContext")
7392 FileTreeContext::~FileTreeContext()
7397 TemplateVariant FileTreeContext::get(const char *name) const
7399 return p->get(name);
7402 //------------------------------------------------------------------------
7404 //%% struct PageTree: tree of related pages
7406 class PageTreeContext::Private
7409 Private(const PageSDict *pages)
7411 m_pageTree.reset(NestingContext::alloc(0,0));
7415 m_pageTree->addPages(*pages,TRUE);
7418 //%% PageNodeList tree:
7419 static bool init=FALSE;
7422 s_inst.addProperty("tree", &Private::tree);
7423 s_inst.addProperty("fileName", &Private::fileName);
7424 s_inst.addProperty("relPath", &Private::relPath);
7425 s_inst.addProperty("highlight", &Private::highlight);
7426 s_inst.addProperty("subhighlight", &Private::subhighlight);
7427 s_inst.addProperty("title", &Private::title);
7428 s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7429 s_inst.addProperty("maxDepth", &Private::maxDepth);
7433 TemplateVariant get(const char *n) const
7435 return s_inst.get(this,n);
7437 TemplateVariant tree() const
7439 return m_pageTree.get();
7441 TemplateVariant fileName() const
7445 TemplateVariant relPath() const
7449 TemplateVariant highlight() const
7453 TemplateVariant subhighlight() const
7457 TemplateVariant title() const
7459 return theTranslator->trRelatedPages();
7461 TemplateVariant maxDepth() const
7463 if (!m_cache.maxDepthComputed)
7465 m_cache.maxDepth = computeMaxDepth(m_pageTree.get());
7466 m_cache.maxDepthComputed=TRUE;
7468 return m_cache.maxDepth;
7470 TemplateVariant preferredDepth() const
7472 if (!m_cache.preferredDepthComputed)
7474 m_cache.preferredDepth = computePreferredDepth(m_pageTree.get(),maxDepth().toInt());
7475 m_cache.preferredDepthComputed=TRUE;
7477 return m_cache.preferredDepth;
7480 SharedPtr<NestingContext> m_pageTree;
7483 Cachable() : maxDepth(0), maxDepthComputed(FALSE),
7484 preferredDepth(0), preferredDepthComputed(FALSE) {}
7486 bool maxDepthComputed;
7488 bool preferredDepthComputed;
7490 mutable Cachable m_cache;
7491 static PropertyMapper<PageTreeContext::Private> s_inst;
7495 PropertyMapper<PageTreeContext::Private> PageTreeContext::Private::s_inst;
7497 PageTreeContext::PageTreeContext(const PageSDict *pages) : RefCountedContext("PageTreeContext")
7499 p = new Private(pages);
7502 PageTreeContext::~PageTreeContext()
7507 TemplateVariant PageTreeContext::get(const char *name) const
7509 return p->get(name);
7512 //------------------------------------------------------------------------
7514 //%% list PageList[Page]: list of pages
7515 class PageListContext::Private : public GenericNodeListContext
7518 void addPages(const PageSDict &pages)
7520 PageSDict::Iterator pdi(pages);
7522 for (pdi.toFirst();(pd=pdi.current());++pdi)
7524 if (!pd->getGroupDef() && !pd->isReference())
7526 append(PageContext::alloc(pd,FALSE,FALSE));
7532 PageListContext::PageListContext(const PageSDict *pages) : RefCountedContext("PageListContext")
7535 if (pages) p->addPages(*pages);
7538 PageListContext::~PageListContext()
7544 int PageListContext::count() const
7549 TemplateVariant PageListContext::at(int index) const
7551 return p->at(index);
7554 TemplateListIntf::ConstIterator *PageListContext::createIterator() const
7556 return p->createIterator();
7559 //------------------------------------------------------------------------
7561 //%% list ExampleList[Page]: list of pages
7562 class ExampleListContext::Private : public GenericNodeListContext
7567 if (Doxygen::exampleSDict)
7569 PageSDict::Iterator pdi(*Doxygen::exampleSDict);
7571 for (pdi.toFirst();(pd=pdi.current());++pdi)
7573 if (!pd->getGroupDef() && !pd->isReference())
7575 append(PageContext::alloc(pd,FALSE,TRUE));
7582 ExampleListContext::ExampleListContext() : RefCountedContext("ExampleListContext")
7587 ExampleListContext::~ExampleListContext()
7593 int ExampleListContext::count() const
7598 TemplateVariant ExampleListContext::at(int index) const
7600 return p->at(index);
7603 TemplateListIntf::ConstIterator *ExampleListContext::createIterator() const
7605 return p->createIterator();
7608 //------------------------------------------------------------------------
7610 //%% list ModuleList[ModuleNode]: list of directories and/or files
7611 class ModuleListContext::Private : public GenericNodeListContext
7616 GroupSDict::Iterator gli(*Doxygen::groupSDict);
7618 for (gli.toFirst();(gd=gli.current());++gli)
7620 if (!gd->isReference())
7622 append(ModuleContext::alloc(gd));
7628 ModuleListContext::ModuleListContext() : RefCountedContext("ModuleListContext")
7634 ModuleListContext::~ModuleListContext()
7640 int ModuleListContext::count() const
7645 TemplateVariant ModuleListContext::at(int index) const
7647 return p->at(index);
7650 TemplateListIntf::ConstIterator *ModuleListContext::createIterator() const
7652 return p->createIterator();
7655 //------------------------------------------------------------------------
7657 //%% struct ModuleTree: tree of modules
7659 class ModuleTreeContext::Private
7664 m_moduleTree.reset(NestingContext::alloc(0,0));
7666 if (Doxygen::groupSDict)
7668 m_moduleTree->addModules(*Doxygen::groupSDict);
7671 //%% ModuleList tree:
7672 static bool init=FALSE;
7675 s_inst.addProperty("tree", &Private::tree);
7676 s_inst.addProperty("fileName", &Private::fileName);
7677 s_inst.addProperty("relPath", &Private::relPath);
7678 s_inst.addProperty("highlight", &Private::highlight);
7679 s_inst.addProperty("subhighlight", &Private::subhighlight);
7680 s_inst.addProperty("title", &Private::title);
7681 s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7682 s_inst.addProperty("maxDepth", &Private::maxDepth);
7686 TemplateVariant get(const char *n) const
7688 return s_inst.get(this,n);
7690 TemplateVariant tree() const
7692 return m_moduleTree.get();
7694 TemplateVariant fileName() const
7698 TemplateVariant relPath() const
7702 TemplateVariant highlight() const
7706 TemplateVariant subhighlight() const
7710 TemplateVariant title() const
7712 return theTranslator->trModules();
7714 TemplateVariant maxDepth() const
7716 if (!m_cache.maxDepthComputed)
7718 m_cache.maxDepth = computeMaxDepth(m_moduleTree.get());
7719 m_cache.maxDepthComputed=TRUE;
7721 return m_cache.maxDepth;
7723 TemplateVariant preferredDepth() const
7725 if (!m_cache.preferredDepthComputed)
7727 m_cache.preferredDepth = computePreferredDepth(m_moduleTree.get(),maxDepth().toInt());
7728 m_cache.preferredDepthComputed=TRUE;
7730 return m_cache.preferredDepth;
7733 SharedPtr<NestingContext> m_moduleTree;
7736 Cachable() : maxDepth(0), maxDepthComputed(FALSE),
7737 preferredDepth(0), preferredDepthComputed(FALSE) {}
7739 bool maxDepthComputed;
7741 bool preferredDepthComputed;
7743 mutable Cachable m_cache;
7744 static PropertyMapper<ModuleTreeContext::Private> s_inst;
7748 PropertyMapper<ModuleTreeContext::Private> ModuleTreeContext::Private::s_inst;
7750 ModuleTreeContext::ModuleTreeContext() : RefCountedContext("ModuleTreeContext")
7755 ModuleTreeContext::~ModuleTreeContext()
7760 TemplateVariant ModuleTreeContext::get(const char *name) const
7762 return p->get(name);
7765 //------------------------------------------------------------------------
7767 //%% struct NavPathElem: list of examples page
7769 class NavPathElemContext::Private
7772 Private(Definition *def) : m_def(def)
7774 static bool init=FALSE;
7777 s_inst.addProperty("isLinkable", &Private::isLinkable);
7778 s_inst.addProperty("fileName", &Private::fileName);
7779 s_inst.addProperty("anchor", &Private::anchor);
7780 s_inst.addProperty("text", &Private::text);
7781 s_inst.addProperty("isReference", &Private::isReference);
7782 s_inst.addProperty("externalReference",&Private::externalReference);
7786 TemplateVariant get(const char *n) const
7788 return s_inst.get(this,n);
7790 TemplateVariant isLinkable() const
7792 return m_def->isLinkable();
7794 TemplateVariant anchor() const
7796 return m_def->anchor();
7798 TemplateVariant fileName() const
7800 return m_def->getOutputFileBase();
7802 TemplateVariant text() const
7804 Definition::DefType type = m_def->definitionType();
7805 QCString text = m_def->localName();
7806 if (type==Definition::TypeGroup)
7808 text = ((const GroupDef*)m_def)->groupTitle();
7810 else if (type==Definition::TypePage && !(((const PageDef*)m_def)->title().isEmpty()))
7812 text = ((const PageDef*)m_def)->title();
7814 else if (type==Definition::TypeClass)
7816 if (text.right(2)=="-p")
7818 text = text.left(text.length()-2);
7823 TemplateVariant isReference() const
7825 return m_def->isReference();
7827 QCString relPathAsString() const
7829 static bool createSubdirs = Config_getBool(CREATE_SUBDIRS);
7830 return createSubdirs ? QCString("../../") : QCString("");
7832 TemplateVariant externalReference() const
7834 return m_def->externalReference(relPathAsString());
7838 static PropertyMapper<NavPathElemContext::Private> s_inst;
7842 PropertyMapper<NavPathElemContext::Private> NavPathElemContext::Private::s_inst;
7844 NavPathElemContext::NavPathElemContext(Definition *def) : RefCountedContext("NavPathElemContext")
7846 p = new Private(def);
7849 NavPathElemContext::~NavPathElemContext()
7854 TemplateVariant NavPathElemContext::get(const char *name) const
7856 return p->get(name);
7860 //------------------------------------------------------------------------
7862 //%% struct ExampleList: list of examples page
7864 class ExampleTreeContext::Private
7869 m_exampleTree.reset(NestingContext::alloc(0,0));
7871 if (Doxygen::exampleSDict)
7873 m_exampleTree->addPages(*Doxygen::exampleSDict,TRUE);
7876 static bool init=FALSE;
7879 s_inst.addProperty("tree", &Private::tree);
7880 s_inst.addProperty("fileName", &Private::fileName);
7881 s_inst.addProperty("relPath", &Private::relPath);
7882 s_inst.addProperty("highlight", &Private::highlight);
7883 s_inst.addProperty("subhighlight", &Private::subhighlight);
7884 s_inst.addProperty("title", &Private::title);
7885 s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7886 s_inst.addProperty("maxDepth", &Private::maxDepth);
7890 TemplateVariant get(const char *n) const
7892 return s_inst.get(this,n);
7894 TemplateVariant tree() const
7896 return m_exampleTree.get();
7898 TemplateVariant fileName() const
7902 TemplateVariant relPath() const
7906 TemplateVariant highlight() const
7910 TemplateVariant subhighlight() const
7914 TemplateVariant title() const
7916 return theTranslator->trExamples();
7918 TemplateVariant maxDepth() const
7920 if (!m_cache.maxDepthComputed)
7922 m_cache.maxDepth = computeMaxDepth(m_exampleTree.get());
7923 m_cache.maxDepthComputed=TRUE;
7925 return m_cache.maxDepth;
7927 TemplateVariant preferredDepth() const
7929 if (!m_cache.preferredDepthComputed)
7931 m_cache.preferredDepth = computePreferredDepth(m_exampleTree.get(),maxDepth().toInt());
7932 m_cache.preferredDepthComputed=TRUE;
7934 return m_cache.preferredDepth;
7937 SharedPtr<NestingContext> m_exampleTree;
7940 Cachable() : maxDepth(0), maxDepthComputed(FALSE),
7941 preferredDepth(0), preferredDepthComputed(FALSE) {}
7943 bool maxDepthComputed;
7945 bool preferredDepthComputed;
7947 mutable Cachable m_cache;
7948 static PropertyMapper<ExampleTreeContext::Private> s_inst;
7952 PropertyMapper<ExampleTreeContext::Private> ExampleTreeContext::Private::s_inst;
7954 ExampleTreeContext::ExampleTreeContext() : RefCountedContext("ExampleTreeContext")
7959 ExampleTreeContext::~ExampleTreeContext()
7964 TemplateVariant ExampleTreeContext::get(const char *name) const
7966 return p->get(name);
7969 //------------------------------------------------------------------------
7971 //%% struct GlobalsIndex: list of examples page
7973 class GlobalsIndexContext::Private
7978 static bool init=FALSE;
7981 s_inst.addProperty("all", &Private::all);
7982 s_inst.addProperty("functions", &Private::functions);
7983 s_inst.addProperty("variables", &Private::variables);
7984 s_inst.addProperty("typedefs", &Private::typedefs);
7985 s_inst.addProperty("enums", &Private::enums);
7986 s_inst.addProperty("enumValues", &Private::enumValues);
7987 s_inst.addProperty("macros", &Private::macros);
7988 s_inst.addProperty("properties", &Private::properties);
7989 s_inst.addProperty("events", &Private::events);
7990 s_inst.addProperty("related", &Private::related);
7991 s_inst.addProperty("fileName", &Private::fileName);
7992 s_inst.addProperty("relPath", &Private::relPath);
7993 s_inst.addProperty("highlight", &Private::highlight);
7994 s_inst.addProperty("subhighlight",&Private::subhighlight);
7995 s_inst.addProperty("title", &Private::title);
7999 TemplateVariant get(const char *n) const
8001 return s_inst.get(this,n);
8003 typedef bool (MemberDef::*MemberFunc)() const;
8004 TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const
8008 TemplateList *list = TemplateList::alloc();
8010 MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
8011 for (fnli.toFirst();(mn=fnli.current());++fnli)
8014 MemberNameIterator mni(*mn);
8015 for (mni.toFirst();(md=mni.current());++mni)
8017 FileDef *fd=md->getFileDef();
8018 if (fd && fd->isLinkableInProject() &&
8019 !md->name().isEmpty() && !md->getNamespaceDef() && md->isLinkableInProject())
8021 if (filter==0 || (md->*filter)())
8023 list->append(MemberContext::alloc(md));
8028 listRef.reset(list);
8030 return listRef.get();
8032 TemplateVariant all() const
8034 return getMembersFiltered(m_cache.all,0);
8036 TemplateVariant functions() const
8038 return getMembersFiltered(m_cache.functions,&MemberDef::isFunction);
8040 TemplateVariant variables() const
8042 return getMembersFiltered(m_cache.variables,&MemberDef::isVariable);
8044 TemplateVariant typedefs() const
8046 return getMembersFiltered(m_cache.typedefs,&MemberDef::isTypedef);
8048 TemplateVariant enums() const
8050 return getMembersFiltered(m_cache.enums,&MemberDef::isEnumerate);
8052 TemplateVariant enumValues() const
8054 return getMembersFiltered(m_cache.enumValues,&MemberDef::isEnumValue);
8056 TemplateVariant macros() const
8058 return getMembersFiltered(m_cache.macros,&MemberDef::isDefine);
8060 TemplateVariant properties() const
8064 TemplateVariant events() const
8068 TemplateVariant related() const
8072 TemplateVariant fileName() const
8076 TemplateVariant relPath() const
8080 TemplateVariant highlight() const
8084 TemplateVariant subhighlight() const
8086 return "filemembers";
8088 TemplateVariant title() const
8090 return theTranslator->trFileMembers();
8096 SharedPtr<TemplateList> all;
8097 SharedPtr<TemplateList> functions;
8098 SharedPtr<TemplateList> variables;
8099 SharedPtr<TemplateList> typedefs;
8100 SharedPtr<TemplateList> enums;
8101 SharedPtr<TemplateList> enumValues;
8102 SharedPtr<TemplateList> macros;
8104 mutable Cachable m_cache;
8105 static PropertyMapper<GlobalsIndexContext::Private> s_inst;
8109 PropertyMapper<GlobalsIndexContext::Private> GlobalsIndexContext::Private::s_inst;
8111 GlobalsIndexContext::GlobalsIndexContext() : RefCountedContext("GlobalsIndexContext")
8116 GlobalsIndexContext::~GlobalsIndexContext()
8121 TemplateVariant GlobalsIndexContext::get(const char *name) const
8123 return p->get(name);
8126 //------------------------------------------------------------------------
8128 //%% struct ClassMembersIndex: list of examples page
8130 class ClassMembersIndexContext::Private
8135 static bool init=FALSE;
8138 s_inst.addProperty("all", &Private::all);
8139 s_inst.addProperty("functions", &Private::functions);
8140 s_inst.addProperty("variables", &Private::variables);
8141 s_inst.addProperty("typedefs", &Private::typedefs);
8142 s_inst.addProperty("enums", &Private::enums);
8143 s_inst.addProperty("enumValues", &Private::enumValues);
8144 s_inst.addProperty("macros", &Private::macros);
8145 s_inst.addProperty("properties", &Private::properties);
8146 s_inst.addProperty("events", &Private::events);
8147 s_inst.addProperty("related", &Private::related);
8148 s_inst.addProperty("fileName", &Private::fileName);
8149 s_inst.addProperty("relPath", &Private::relPath);
8150 s_inst.addProperty("highlight", &Private::highlight);
8151 s_inst.addProperty("subhighlight",&Private::subhighlight);
8152 s_inst.addProperty("title", &Private::title);
8156 TemplateVariant get(const char *n) const
8158 return s_inst.get(this,n);
8160 typedef bool (MemberDef::*MemberFunc)() const;
8161 TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const
8165 TemplateList *list = TemplateList::alloc();
8167 MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
8168 for (mnli.toFirst();(mn=mnli.current());++mnli)
8171 MemberNameIterator mni(*mn);
8172 for (mni.toFirst();(md=mni.current());++mni)
8174 ClassDef *cd = md->getClassDef();
8175 if (cd && cd->isLinkableInProject() && cd->templateMaster()==0 &&
8176 md->isLinkableInProject() && !md->name().isEmpty())
8178 if (filter==0 || (md->*filter)())
8180 list->append(MemberContext::alloc(md));
8185 listRef.reset(list);
8187 return listRef.get();
8189 TemplateVariant all() const
8191 return getMembersFiltered(m_cache.all,&MemberDef::isNotFriend);
8193 TemplateVariant functions() const
8195 return getMembersFiltered(m_cache.functions,&MemberDef::isFunctionOrSignalSlot);
8197 TemplateVariant variables() const
8199 return getMembersFiltered(m_cache.variables,&MemberDef::isVariable);
8201 TemplateVariant typedefs() const
8203 return getMembersFiltered(m_cache.typedefs,&MemberDef::isTypedef);
8205 TemplateVariant enums() const
8207 return getMembersFiltered(m_cache.enums,&MemberDef::isEnumerate);
8209 TemplateVariant enumValues() const
8211 return getMembersFiltered(m_cache.enumValues,&MemberDef::isEnumValue);
8213 TemplateVariant macros() const
8217 TemplateVariant properties() const
8219 return getMembersFiltered(m_cache.properties,&MemberDef::isProperty);
8221 TemplateVariant events() const
8223 return getMembersFiltered(m_cache.events,&MemberDef::isEvent);
8225 TemplateVariant related() const
8227 return getMembersFiltered(m_cache.related,&MemberDef::isRelated);
8229 TemplateVariant fileName() const
8233 TemplateVariant relPath() const
8237 TemplateVariant highlight() const
8241 TemplateVariant subhighlight() const
8243 return "classmembers";
8245 TemplateVariant title() const
8247 return theTranslator->trCompoundMembers();
8253 SharedPtr<TemplateList> all;
8254 SharedPtr<TemplateList> functions;
8255 SharedPtr<TemplateList> variables;
8256 SharedPtr<TemplateList> typedefs;
8257 SharedPtr<TemplateList> enums;
8258 SharedPtr<TemplateList> enumValues;
8259 SharedPtr<TemplateList> properties;
8260 SharedPtr<TemplateList> events;
8261 SharedPtr<TemplateList> related;
8263 mutable Cachable m_cache;
8264 static PropertyMapper<ClassMembersIndexContext::Private> s_inst;
8268 PropertyMapper<ClassMembersIndexContext::Private> ClassMembersIndexContext::Private::s_inst;
8270 ClassMembersIndexContext::ClassMembersIndexContext() : RefCountedContext("ClassMembersIndexContext")
8275 ClassMembersIndexContext::~ClassMembersIndexContext()
8280 TemplateVariant ClassMembersIndexContext::get(const char *name) const
8282 return p->get(name);
8285 //------------------------------------------------------------------------
8287 //%% struct NamespaceMembersIndex: list of examples page
8289 class NamespaceMembersIndexContext::Private
8294 static bool init=FALSE;
8297 s_inst.addProperty("all", &Private::all);
8298 s_inst.addProperty("functions", &Private::functions);
8299 s_inst.addProperty("variables", &Private::variables);
8300 s_inst.addProperty("typedefs", &Private::typedefs);
8301 s_inst.addProperty("enums", &Private::enums);
8302 s_inst.addProperty("enumValues", &Private::enumValues);
8303 s_inst.addProperty("macros", &Private::macros);
8304 s_inst.addProperty("properties", &Private::properties);
8305 s_inst.addProperty("events", &Private::events);
8306 s_inst.addProperty("related", &Private::related);
8307 s_inst.addProperty("fileName", &Private::fileName);
8308 s_inst.addProperty("relPath", &Private::relPath);
8309 s_inst.addProperty("highlight", &Private::highlight);
8310 s_inst.addProperty("subhighlight",&Private::subhighlight);
8311 s_inst.addProperty("title", &Private::title);
8315 TemplateVariant get(const char *n) const
8317 return s_inst.get(this,n);
8319 typedef bool (MemberDef::*MemberFunc)() const;
8320 TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const
8324 TemplateList *list = TemplateList::alloc();
8326 MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
8327 for (fnli.toFirst();(mn=fnli.current());++fnli)
8330 MemberNameIterator mni(*mn);
8331 for (mni.toFirst();(md=mni.current());++mni)
8333 NamespaceDef *nd=md->getNamespaceDef();
8334 if (nd && nd->isLinkableInProject() &&
8335 !md->name().isEmpty() && md->isLinkableInProject())
8337 if (filter==0 || (md->*filter)())
8339 list->append(MemberContext::alloc(md));
8344 listRef.reset(list);
8346 return listRef.get();
8348 TemplateVariant all() const
8350 return getMembersFiltered(m_cache.all,0);
8352 TemplateVariant functions() const
8354 return getMembersFiltered(m_cache.functions,&MemberDef::isFunction);
8356 TemplateVariant variables() const
8358 return getMembersFiltered(m_cache.variables,&MemberDef::isVariable);
8360 TemplateVariant typedefs() const
8362 return getMembersFiltered(m_cache.typedefs,&MemberDef::isTypedef);
8364 TemplateVariant enums() const
8366 return getMembersFiltered(m_cache.enums,&MemberDef::isEnumerate);
8368 TemplateVariant enumValues() const
8370 return getMembersFiltered(m_cache.enumValues,&MemberDef::isEnumValue);
8372 TemplateVariant macros() const
8376 TemplateVariant properties() const
8380 TemplateVariant events() const
8384 TemplateVariant related() const
8388 TemplateVariant fileName() const
8390 return "namespacemembers";
8392 TemplateVariant relPath() const
8396 TemplateVariant highlight() const
8398 return "namespaces";
8400 TemplateVariant subhighlight() const
8402 return "namespacemembers";
8404 TemplateVariant title() const
8406 return theTranslator->trNamespaceMembers();
8412 SharedPtr<TemplateList> all;
8413 SharedPtr<TemplateList> functions;
8414 SharedPtr<TemplateList> variables;
8415 SharedPtr<TemplateList> typedefs;
8416 SharedPtr<TemplateList> enums;
8417 SharedPtr<TemplateList> enumValues;
8419 mutable Cachable m_cache;
8420 static PropertyMapper<NamespaceMembersIndexContext::Private> s_inst;
8424 PropertyMapper<NamespaceMembersIndexContext::Private> NamespaceMembersIndexContext::Private::s_inst;
8426 NamespaceMembersIndexContext::NamespaceMembersIndexContext() : RefCountedContext("NamespaceMembersIndexContext")
8431 NamespaceMembersIndexContext::~NamespaceMembersIndexContext()
8436 TemplateVariant NamespaceMembersIndexContext::get(const char *name) const
8438 return p->get(name);
8441 //------------------------------------------------------------------------
8443 //%% struct InheritanceGraph: a connected graph reprenting part of the overall interitance tree
8445 class InheritanceGraphContext::Private
8448 Private(DotGfxHierarchyTable *hierarchy,DotNode *n,int id) : m_hierarchy(hierarchy), m_node(n), m_id(id)
8450 static bool init=FALSE;
8453 s_inst.addProperty("graph",&Private::graph);
8457 TemplateVariant get(const char *n) const
8459 return s_inst.get(this,n);
8461 TemplateVariant graph() const
8464 static bool haveDot = Config_getBool(HAVE_DOT);
8465 static bool graphicalHierarchy = Config_getBool(GRAPHICAL_HIERARCHY);
8466 if (haveDot && graphicalHierarchy)
8468 FTextStream t(&result);
8469 m_hierarchy->createGraph(m_node,t,
8472 g_globals.outputDir,
8473 g_globals.outputDir+portable_pathSeparator()+"inherits"+Doxygen::htmlFileExtension,
8476 return TemplateVariant(result.data(),TRUE);
8479 DotGfxHierarchyTable *m_hierarchy;
8482 static PropertyMapper<InheritanceGraphContext::Private> s_inst;
8485 PropertyMapper<InheritanceGraphContext::Private> InheritanceGraphContext::Private::s_inst;
8487 InheritanceGraphContext::InheritanceGraphContext(DotGfxHierarchyTable *hierarchy,DotNode *n,int id)
8488 : RefCountedContext("InheritanceGraphContext")
8490 p = new Private(hierarchy,n,id);
8493 InheritanceGraphContext::~InheritanceGraphContext()
8498 TemplateVariant InheritanceGraphContext::get(const char *name) const
8500 return p->get(name);
8504 //------------------------------------------------------------------------
8506 //%% struct InheritanceNode: a class in the inheritance list
8508 class InheritanceNodeContext::Private
8511 Private(ClassDef *cd,const QCString &name) : m_classDef(cd), m_name(name)
8513 static bool init=FALSE;
8516 s_inst.addProperty("class",&Private::getClass);
8517 s_inst.addProperty("name", &Private::name);
8521 TemplateVariant get(const char *n) const
8523 return s_inst.get(this,n);
8525 TemplateVariant getClass() const
8527 if (!m_classContext)
8529 m_classContext.reset(ClassContext::alloc(m_classDef));
8531 return m_classContext.get();
8533 TemplateVariant name() const
8538 ClassDef *m_classDef;
8539 mutable SharedPtr<ClassContext> m_classContext;
8541 static PropertyMapper<InheritanceNodeContext::Private> s_inst;
8545 PropertyMapper<InheritanceNodeContext::Private> InheritanceNodeContext::Private::s_inst;
8547 InheritanceNodeContext::InheritanceNodeContext(ClassDef *cd,const QCString &name) : RefCountedContext("InheritanceNodeContext")
8549 p = new Private(cd,name);
8552 InheritanceNodeContext::~InheritanceNodeContext()
8557 TemplateVariant InheritanceNodeContext::get(const char *name) const
8559 return p->get(name);
8562 //------------------------------------------------------------------------
8564 //%% list InheritanceList[InheritanceNode] : list of inherited classes
8565 class InheritanceListContext::Private : public GenericNodeListContext
8568 void addClass(ClassDef *cd,const QCString &name)
8570 append(InheritanceNodeContext::alloc(cd,name));
8574 InheritanceListContext::InheritanceListContext(const BaseClassList *list, bool baseClasses) : RefCountedContext("InheritanceListContext")
8579 BaseClassListIterator li(*list);
8581 for (li.toFirst();(bcd=li.current());++li)
8583 ClassDef *cd=bcd->classDef;
8587 name = insertTemplateSpecifierInScope(
8588 cd->displayName(),bcd->templSpecifiers);
8592 name = cd->displayName();
8594 //printf("InheritanceListContext: adding %s baseClass=%d\n",name.data(),baseClasses);
8595 p->addClass(cd,name);
8600 InheritanceListContext::~InheritanceListContext()
8606 int InheritanceListContext::count() const
8611 TemplateVariant InheritanceListContext::at(int index) const
8613 return p->at(index);
8616 TemplateListIntf::ConstIterator *InheritanceListContext::createIterator() const
8618 return p->createIterator();
8621 //------------------------------------------------------------------------
8623 //%% list MemberList[Member] : list of inherited classes
8624 class MemberListContext::Private : public GenericNodeListContext
8627 void addMember(MemberDef *md)
8629 append(MemberContext::alloc(md));
8633 MemberListContext::MemberListContext() : RefCountedContext("MemberListContext")
8638 MemberListContext::MemberListContext(const MemberList *list) : RefCountedContext("MemberListContext")
8643 bool details = list->listType()&MemberListType_detailedLists;
8644 MemberListIterator mli(*list);
8646 for (mli.toFirst();(md=mli.current());++mli)
8648 if ((md->isBriefSectionVisible() && !details) ||
8649 (md->isDetailedSectionLinkable() && details)
8658 MemberListContext::MemberListContext(MemberSDict *list,bool doSort) : RefCountedContext("MemberListContext")
8667 MemberSDict::Iterator it(*list);
8669 for (it.toFirst();(md=it.current());++it)
8676 MemberListContext::~MemberListContext()
8682 int MemberListContext::count() const
8687 TemplateVariant MemberListContext::at(int index) const
8689 return p->at(index);
8692 TemplateListIntf::ConstIterator *MemberListContext::createIterator() const
8694 return p->createIterator();
8697 //------------------------------------------------------------------------
8699 //%% struct MemberInfo: member information
8701 class MemberInfoContext::Private
8704 Private(const MemberInfo *mi) : m_memberInfo(mi)
8706 static bool init=FALSE;
8709 //%% string protection
8710 s_inst.addProperty("protection", &Private::protection);
8711 //%% string virtualness
8712 s_inst.addProperty("virtualness", &Private::virtualness);
8713 //%% string ambiguityScope
8714 s_inst.addProperty("ambiguityScope",&Private::ambiguityScope);
8716 s_inst.addProperty("member", &Private::member);
8720 TemplateVariant get(const char *n) const
8722 return s_inst.get(this,n);
8724 TemplateVariant protection() const
8726 switch (m_memberInfo->prot)
8728 case ::Public: return "public";
8729 case ::Protected: return "protected";
8730 case ::Private: return "private";
8731 case ::Package: return "package";
8735 TemplateVariant virtualness() const
8737 switch (m_memberInfo->virt)
8739 case ::Normal: return "normal";
8740 case ::Virtual: return "virtual";
8741 case ::Pure: return "pure";
8745 TemplateVariant ambiguityScope() const
8747 return m_memberInfo->ambiguityResolutionScope;
8749 TemplateVariant member() const
8751 if (!m_member && m_memberInfo->memberDef)
8753 m_member.reset(MemberContext::alloc(m_memberInfo->memberDef));
8757 return m_member.get();
8761 return TemplateVariant(FALSE);
8765 const MemberInfo *m_memberInfo;
8766 mutable SharedPtr<MemberContext> m_member;
8767 static PropertyMapper<MemberInfoContext::Private> s_inst;
8771 PropertyMapper<MemberInfoContext::Private> MemberInfoContext::Private::s_inst;
8773 MemberInfoContext::MemberInfoContext(const MemberInfo *mi) : RefCountedContext("MemberInfoContext")
8775 p = new Private(mi);
8778 MemberInfoContext::~MemberInfoContext()
8783 TemplateVariant MemberInfoContext::get(const char *name) const
8785 return p->get(name);
8789 //------------------------------------------------------------------------
8791 //%% list AllMembersList[MemberList] : list of inherited classes
8792 class AllMembersListContext::Private : public GenericNodeListContext
8795 Private(const MemberNameInfoSDict *ml)
8799 static bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
8800 MemberNameInfoSDict::Iterator mnii(*ml);
8801 MemberNameInfo *mni;
8802 for (mnii.toFirst();(mni=mnii.current());++mnii)
8804 MemberNameInfoIterator mnii2(*mni);
8806 for (mnii2.toFirst();(mi=mnii2.current());++mnii2)
8808 MemberDef *md=mi->memberDef;
8809 ClassDef *cd=md->getClassDef();
8810 if (cd && !md->name().isEmpty() && md->name()[0]!='@')
8812 if ((cd->isLinkable() && md->isLinkable()) ||
8813 (!cd->isArtificial() && !hideUndocMembers &&
8814 (protectionLevelVisible(md->protection()) || md->isFriend())
8818 append(MemberInfoContext::alloc(mi));
8827 AllMembersListContext::AllMembersListContext() : RefCountedContext("AllMembersListContext")
8832 AllMembersListContext::AllMembersListContext(const MemberNameInfoSDict *ml) : RefCountedContext("AllMembersListContext")
8834 p = new Private(ml);
8837 AllMembersListContext::~AllMembersListContext()
8843 int AllMembersListContext::count() const
8848 TemplateVariant AllMembersListContext::at(int index) const
8850 return p->at(index);
8853 TemplateListIntf::ConstIterator *AllMembersListContext::createIterator() const
8855 return p->createIterator();
8858 //------------------------------------------------------------------------
8860 //%% struct MemberGroupInfo: member group information
8862 class MemberGroupInfoContext::Private
8865 Private(Definition *def,const QCString &relPath,const MemberGroup *mg) :
8870 static bool init=FALSE;
8873 s_inst.addProperty("members", &Private::members);
8874 s_inst.addProperty("title", &Private::groupTitle);
8875 s_inst.addProperty("subtitle", &Private::groupSubtitle);
8876 s_inst.addProperty("anchor", &Private::groupAnchor);
8877 s_inst.addProperty("memberGroups", &Private::memberGroups);
8878 s_inst.addProperty("docs", &Private::docs);
8879 s_inst.addProperty("inherited", &Private::inherited);
8883 TemplateVariant get(const char *n) const
8885 return s_inst.get(this,n);
8887 TemplateVariant members() const
8889 if (!m_cache.memberListContext)
8891 m_cache.memberListContext.reset(MemberListContext::alloc(m_memberGroup->members()));
8893 return m_cache.memberListContext.get();
8895 TemplateVariant groupTitle() const
8897 return m_memberGroup->header();
8899 TemplateVariant groupSubtitle() const
8903 TemplateVariant groupAnchor() const
8905 return m_memberGroup->anchor();
8907 TemplateVariant memberGroups() const
8909 if (!m_cache.memberGroups)
8911 m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_def,m_relPath,0));
8913 return m_cache.memberGroups.get();
8915 TemplateVariant docs() const
8919 QCString docs = m_memberGroup->documentation();
8920 if (!docs.isEmpty())
8922 m_cache.docs.reset(new TemplateVariant(
8923 parseDoc(m_def,"[@name docs]",-1, // TODO store file & line
8925 m_memberGroup->documentation()+"\n",FALSE)));
8929 m_cache.docs.reset(new TemplateVariant(""));
8932 return *m_cache.docs;
8934 TemplateVariant inherited() const
8941 const MemberGroup *m_memberGroup;
8944 SharedPtr<MemberListContext> memberListContext;
8945 SharedPtr<MemberGroupListContext> memberGroups;
8946 ScopedPtr<TemplateVariant> docs;
8948 mutable Cachable m_cache;
8949 static PropertyMapper<MemberGroupInfoContext::Private> s_inst;
8953 PropertyMapper<MemberGroupInfoContext::Private> MemberGroupInfoContext::Private::s_inst;
8955 MemberGroupInfoContext::MemberGroupInfoContext(Definition *def,
8956 const QCString &relPath,const MemberGroup *mg) : RefCountedContext("MemberGroupInfoContext")
8958 p = new Private(def,relPath,mg);
8961 MemberGroupInfoContext::~MemberGroupInfoContext()
8966 TemplateVariant MemberGroupInfoContext::get(const char *name) const
8968 return p->get(name);
8971 //------------------------------------------------------------------------
8973 //%% list MemberGroupList[MemberGroupInfo] : list of member groups
8974 class MemberGroupListContext::Private : public GenericNodeListContext
8977 void addMemberGroup(Definition *def,const QCString &relPath,const MemberGroup *mg)
8979 append(MemberGroupInfoContext::alloc(def,relPath,mg));
8983 MemberGroupListContext::MemberGroupListContext() : RefCountedContext("MemberGroupListContext")
8988 MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list) : RefCountedContext("MemberGroupListContext")
8993 MemberGroupListIterator mgli(*list);
8995 for (;(mg=mgli.current());++mgli)
8997 p->addMemberGroup(def,relPath,mg);
9002 MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping) : RefCountedContext("MemberGroupListContext")
9007 MemberGroupSDict::Iterator di(*dict);
9008 const MemberGroup *mg;
9009 for (di.toFirst();(mg=di.current());++di)
9011 if (!mg->allMembersInSameSection() || !subGrouping)
9013 p->addMemberGroup(def,relPath,mg);
9019 MemberGroupListContext::~MemberGroupListContext()
9025 int MemberGroupListContext::count() const
9030 TemplateVariant MemberGroupListContext::at(int index) const
9032 return p->at(index);
9035 TemplateListIntf::ConstIterator *MemberGroupListContext::createIterator() const
9037 return p->createIterator();
9041 //------------------------------------------------------------------------
9043 //%% struct MemberListInfo: member list information
9045 class MemberListInfoContext::Private
9048 Private(Definition *def,const QCString &relPath,const MemberList *ml,const QCString &title,const QCString &subtitle) :
9053 m_subtitle(subtitle)
9055 static bool init=FALSE;
9058 s_inst.addProperty("members", &Private::members);
9059 s_inst.addProperty("title", &Private::title);
9060 s_inst.addProperty("subtitle", &Private::subtitle);
9061 s_inst.addProperty("anchor", &Private::anchor);
9062 s_inst.addProperty("memberGroups", &Private::memberGroups);
9063 s_inst.addProperty("inherited", &Private::inherited);
9067 TemplateVariant get(const char *n) const
9069 return s_inst.get(this,n);
9071 TemplateVariant members() const
9073 if (!m_cache.memberListContext)
9075 m_cache.memberListContext.reset(MemberListContext::alloc(m_memberList));
9077 return m_cache.memberListContext.get();
9079 TemplateVariant title() const
9083 TemplateVariant subtitle() const
9087 TemplateVariant anchor() const
9089 return MemberList::listTypeAsString(m_memberList->listType());
9091 TemplateVariant memberGroups() const
9093 if (!m_cache.memberGroups)
9095 m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_def,m_relPath,m_memberList->getMemberGroupList()));
9097 return m_cache.memberGroups.get();
9099 TemplateVariant inherited() const
9101 if (!m_cache.inherited && (m_memberList->listType()&MemberListType_detailedLists)==0 &&
9102 m_def->definitionType()==Definition::TypeClass)
9104 InheritedMemberInfoListContext *ctx = InheritedMemberInfoListContext::alloc();
9105 ctx->addMemberList((ClassDef*)m_def,m_memberList->listType(),m_title,FALSE);
9106 m_cache.inherited.reset(ctx);
9108 if (m_cache.inherited)
9110 return m_cache.inherited.get();
9114 return TemplateVariant(FALSE);
9119 const MemberList *m_memberList;
9122 QCString m_subtitle;
9125 SharedPtr<MemberListContext> memberListContext;
9126 SharedPtr<MemberGroupListContext> memberGroups;
9127 SharedPtr<InheritedMemberInfoListContext> inherited;
9129 mutable Cachable m_cache;
9130 static PropertyMapper<MemberListInfoContext::Private> s_inst;
9134 PropertyMapper<MemberListInfoContext::Private> MemberListInfoContext::Private::s_inst;
9136 MemberListInfoContext::MemberListInfoContext(
9137 Definition *def,const QCString &relPath,const MemberList *ml,
9138 const QCString &title,const QCString &subtitle) : RefCountedContext("MemberListInfoContext")
9140 p = new Private(def,relPath,ml,title,subtitle);
9143 MemberListInfoContext::~MemberListInfoContext()
9148 TemplateVariant MemberListInfoContext::get(const char *name) const
9150 return p->get(name);
9153 //------------------------------------------------------------------------
9155 //%% struct InheritedMemberInfo: inherited member information
9157 class InheritedMemberInfoContext::Private
9160 Private(ClassDef *cd,MemberList *ml,const QCString &title)
9161 : m_class(cd), m_memberList(ml), m_title(title)
9163 static bool init=FALSE;
9166 s_inst.addProperty("class", &Private::getClass);
9167 s_inst.addProperty("title", &Private::title);
9168 s_inst.addProperty("members", &Private::members);
9169 s_inst.addProperty("id", &Private::id);
9170 s_inst.addProperty("inheritedFrom", &Private::inheritedFrom);
9174 TemplateVariant get(const char *n) const
9176 return s_inst.get(this,n);
9180 delete m_memberList;
9182 TemplateVariant getClass() const
9186 m_classCtx.reset(ClassContext::alloc(m_class));
9188 return m_classCtx.get();
9190 TemplateVariant title() const
9194 TemplateVariant members() const
9196 if (!m_memberListCtx)
9198 m_memberListCtx.reset(MemberListContext::alloc(m_memberList));
9200 return m_memberListCtx.get();
9202 TemplateVariant id() const
9204 return substitute(MemberList::listTypeAsString(m_memberList->listType()),"-","_")+"_"+
9205 stripPath(m_class->getOutputFileBase());
9207 TemplateVariant inheritedFrom() const
9209 if (!m_inheritedFrom)
9211 m_inheritedFrom.reset(TemplateList::alloc());
9212 m_inheritedFrom->append(title());
9213 m_inheritedFrom->append(getClass());
9215 return m_inheritedFrom.get();
9220 MemberList *m_memberList;
9222 mutable SharedPtr<ClassContext> m_classCtx;
9223 mutable SharedPtr<MemberListContext> m_memberListCtx;
9224 mutable SharedPtr<TemplateList> m_inheritedFrom;
9225 static PropertyMapper<InheritedMemberInfoContext::Private> s_inst;
9229 PropertyMapper<InheritedMemberInfoContext::Private> InheritedMemberInfoContext::Private::s_inst;
9231 InheritedMemberInfoContext::InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,
9232 const QCString &title) : RefCountedContext("InheritedMemberInfoContext")
9234 p = new Private(cd,ml,title);
9237 InheritedMemberInfoContext::~InheritedMemberInfoContext()
9242 TemplateVariant InheritedMemberInfoContext::get(const char *name) const
9244 return p->get(name);
9247 //------------------------------------------------------------------------
9249 //%% list InheritedMemberList[InheritedMemberInfo] : list of inherited classes
9250 class InheritedMemberInfoListContext::Private : public GenericNodeListContext
9253 void addMemberList(ClassDef *inheritedFrom,MemberList *ml,MemberList *combinedList)
9257 MemberListIterator li(*ml);
9259 for (li.toFirst();(md=li.current());++li)
9261 if (md->isBriefSectionVisible() && !md->isReimplementedBy(inheritedFrom))
9263 combinedList->append(md);
9268 void addMemberListIncludingGrouped(ClassDef *inheritedFrom,MemberList *ml,MemberList *combinedList)
9272 addMemberList(inheritedFrom,ml,combinedList);
9273 if (ml->getMemberGroupList())
9275 MemberGroupListIterator mgli(*ml->getMemberGroupList());
9277 for (mgli.toFirst();(mg=mgli.current());++mgli)
9279 addMemberList(inheritedFrom,mg->members(),combinedList);
9284 void addMemberGroupsOfClass(ClassDef *inheritedFrom,
9285 ClassDef *cd,MemberListType lt,MemberList *combinedList)
9287 if (cd->getMemberGroupSDict())
9289 MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
9291 for (;(mg=mgli.current());++mgli)
9293 if (mg->members() && (!mg->allMembersInSameSection() || !cd->subGrouping())) // group is in its own section
9295 MemberListIterator li(*mg->members());
9297 for (li.toFirst();(md=li.current());++li)
9299 if (lt==md->getSectionList(mg->parent())->listType() &&
9300 !md->isReimplementedBy(inheritedFrom) &&
9301 md->isBriefSectionVisible())
9303 combinedList->append(md);
9310 void addInheritedMembers(ClassDef *inheritedFrom,ClassDef *cd,MemberListType lt,
9311 MemberListType lt1,int lt2,const QCString &title,bool additionalList)
9313 int count = cd->countMembersIncludingGrouped(lt1,inheritedFrom,additionalList);
9314 if (lt2!=-1) count += cd->countMembersIncludingGrouped((MemberListType)lt2,inheritedFrom,additionalList);
9317 MemberList *ml = cd->getMemberList(lt1);
9318 MemberList *ml2 = lt2!=-1 ? cd->getMemberList((MemberListType)lt2) : 0;
9319 MemberList *combinedList = new MemberList(lt);
9320 addMemberListIncludingGrouped(inheritedFrom,ml,combinedList);
9321 addMemberListIncludingGrouped(inheritedFrom,ml2,combinedList);
9322 addMemberGroupsOfClass(inheritedFrom,cd,lt,combinedList);
9323 if (lt2!=-1) addMemberGroupsOfClass(inheritedFrom,cd,(MemberListType)lt2,combinedList);
9324 append(InheritedMemberInfoContext::alloc(cd,combinedList,title));
9327 void findInheritedMembers(ClassDef *inheritedFrom,ClassDef *cd,MemberListType lt,
9328 int lt2, const QCString &title,bool additionalList,
9329 QPtrDict<void> *visitedClasses)
9331 if (cd->baseClasses())
9333 BaseClassListIterator it(*cd->baseClasses());
9335 for (it.toFirst();(ibcd=it.current());++it)
9337 ClassDef *icd=ibcd->classDef;
9338 if (icd->isLinkable())
9341 convertProtectionLevel(lt,ibcd->prot,<1,<3);
9342 if (lt2==-1 && lt3!=-1)
9346 if (visitedClasses->find(icd)==0)
9348 visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
9351 // add member info for members of cd with list type lt
9352 addInheritedMembers(inheritedFrom,icd,lt,(MemberListType)lt1,lt2,title,additionalList);
9353 // recurse down the inheritance tree
9354 findInheritedMembers(inheritedFrom,icd,(MemberListType)lt1,lt2,title,additionalList,visitedClasses);
9363 InheritedMemberInfoListContext::InheritedMemberInfoListContext() : RefCountedContext("InheritedMemberInfoListContext")
9368 void InheritedMemberInfoListContext::addMemberList(
9369 ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList)
9371 QPtrDict<void> visited(17);
9372 bool memberInSection = cd->countMembersIncludingGrouped(lt,cd,FALSE)>0;
9373 bool show = (additionalList && !memberInSection) || // inherited member to show in the additional inherited members list
9374 (!additionalList && memberInSection); // inherited member to show in a member list of the class
9375 //printf("%s:%s show=%d\n",cd->name().data(),MemberList::listTypeAsString(lt).data(),show);
9378 p->findInheritedMembers(cd,cd,lt,-1,title,additionalList,&visited);
9382 InheritedMemberInfoListContext::~InheritedMemberInfoListContext()
9388 int InheritedMemberInfoListContext::count() const
9393 TemplateVariant InheritedMemberInfoListContext::at(int index) const
9395 return p->at(index);
9398 TemplateListIntf::ConstIterator *InheritedMemberInfoListContext::createIterator() const
9400 return p->createIterator();
9403 //------------------------------------------------------------------------
9405 //%% struct Argument: parameter information
9407 class ArgumentContext::Private
9410 Private(const Argument *arg,Definition *def,const QCString &relPath) :
9411 m_argument(arg), m_def(def), m_relPath(relPath)
9413 static bool init=FALSE;
9416 s_inst.addProperty("type", &Private::type);
9417 s_inst.addProperty("name", &Private::name);
9418 s_inst.addProperty("defVal", &Private::defVal);
9419 s_inst.addProperty("docs", &Private::docs);
9420 s_inst.addProperty("attrib", &Private::attrib);
9421 s_inst.addProperty("array", &Private::array);
9422 s_inst.addProperty("namePart", &Private::namePart);
9426 TemplateVariant get(const char *n) const
9428 return s_inst.get(this,n);
9430 TemplateVariant type() const
9432 return createLinkedText(m_def,m_relPath,m_argument->type);
9434 TemplateVariant attrib() const
9436 return m_argument->attrib;
9438 TemplateVariant name() const
9440 return m_argument->name;
9442 TemplateVariant defVal() const
9444 return createLinkedText(m_def,m_relPath,m_argument->defval);
9446 TemplateVariant array() const
9448 return m_argument->array;
9450 TemplateVariant docs() const
9452 if (!m_cache.docs && m_def)
9454 if (!m_argument->docs.isEmpty())
9456 m_cache.docs.reset(new TemplateVariant(
9457 parseDoc(m_def,m_def->docFile(),m_def->docLine(),
9458 m_relPath,m_argument->docs,TRUE)));
9462 m_cache.docs.reset(new TemplateVariant(""));
9465 return *m_cache.docs;
9467 TemplateVariant namePart() const
9469 QCString result = m_argument->attrib;
9470 int l = result.length();
9471 if (l>2 && result.at(0)=='[' && result.at(l-1)==']')
9473 result = result.mid(1,l-2);
9474 if (result!=",") result+=":"; // for normal keywords add colon
9479 const Argument *m_argument;
9484 ScopedPtr<TemplateVariant> docs;
9486 mutable Cachable m_cache;
9487 static PropertyMapper<ArgumentContext::Private> s_inst;
9491 PropertyMapper<ArgumentContext::Private> ArgumentContext::Private::s_inst;
9493 ArgumentContext::ArgumentContext(const Argument *al,Definition *def,const QCString &relPath) : RefCountedContext("ArgumentContext")
9495 p = new Private(al,def,relPath);
9498 ArgumentContext::~ArgumentContext()
9503 TemplateVariant ArgumentContext::get(const char *name) const
9505 return p->get(name);
9508 //------------------------------------------------------------------------
9510 //%% list ArgumentList[Argument] : list of inherited classes
9511 class ArgumentListContext::Private : public GenericNodeListContext
9514 void addArgument(const Argument *arg,Definition *def,const QCString &relPath)
9516 append(ArgumentContext::alloc(arg,def,relPath));
9520 ArgumentListContext::ArgumentListContext() : RefCountedContext("ArgumentListContext")
9525 ArgumentListContext::ArgumentListContext(const ArgumentList *list,
9526 Definition *def,const QCString &relPath) : RefCountedContext("ArgumentListContext")
9531 ArgumentListIterator ali(*list);
9532 const Argument *arg;
9533 for (ali.toFirst();(arg=ali.current());++ali)
9535 p->addArgument(arg,def,relPath);
9540 ArgumentListContext::~ArgumentListContext()
9546 int ArgumentListContext::count() const
9551 TemplateVariant ArgumentListContext::at(int index) const
9553 return p->at(index);
9556 TemplateListIntf::ConstIterator *ArgumentListContext::createIterator() const
9558 return p->createIterator();
9561 //------------------------------------------------------------------------
9566 // - symbolGroups: SymbolGroupList
9567 // SymbolGroupList: list of SymbolGroups
9571 // - symbols: SymbolList
9572 // SymbolList: list of Symbols
9578 //------------------------------------------------------------------------
9580 //%% struct SymbolGroup: search group of similar symbols
9582 class SymbolContext::Private
9585 Private(const Definition *d,const Definition *prev,
9586 const Definition *next) : m_def(d), m_prevDef(prev), m_nextDef(next)
9588 static bool init=FALSE;
9591 s_inst.addProperty("fileName",&Private::fileName);
9592 s_inst.addProperty("anchor", &Private::anchor);
9593 s_inst.addProperty("scope", &Private::scope);
9594 s_inst.addProperty("relPath", &Private::relPath);
9598 TemplateVariant get(const char *n) const
9600 return s_inst.get(this,n);
9602 TemplateVariant fileName() const
9604 return m_def->getOutputFileBase();
9606 TemplateVariant anchor() const
9608 return m_def->anchor();
9610 TemplateVariant scope() const
9612 const Definition *scope = m_def->getOuterScope();
9613 const Definition *next = m_nextDef;
9614 const Definition *prev = m_prevDef;
9615 const Definition *nextScope = next ? next->getOuterScope() : 0;
9616 const Definition *prevScope = prev ? prev->getOuterScope() : 0;
9617 bool isMemberDef = m_def->definitionType()==Definition::TypeMember;
9618 const MemberDef *md = isMemberDef ? (const MemberDef*)m_def : 0;
9619 bool isFunctionLike = md && (md->isFunction() || md->isSlot() || md->isSignal());
9620 bool overloadedFunction = isFunctionLike &&
9621 ((prevScope!=0 && scope==prevScope) || (scope && scope==nextScope));
9623 if (md) prefix=md->localName();
9624 if (overloadedFunction) // overloaded member function
9626 prefix+=md->argsString();
9627 // show argument list to disambiguate overloaded functions
9629 else if (md && isFunctionLike) // unique member function
9631 prefix+="()"; // only to show it is a function
9635 if (m_def->definitionType()==Definition::TypeClass)
9637 name = m_def->displayName();
9640 else if (m_def->definitionType()==Definition::TypeNamespace)
9642 name = m_def->displayName();
9645 else if (scope==0 || scope==Doxygen::globalScope) // in global scope
9649 FileDef *fd = md->getBodyDef();
9650 if (fd==0) fd = md->getFileDef();
9653 if (!prefix.isEmpty()) prefix+=": ";
9654 name = prefix + convertToXML(fd->localName());
9659 else if (md && (md->getClassDef() || md->getNamespaceDef()))
9660 // member in class or namespace scope
9662 SrcLangExt lang = md->getLanguage();
9663 name = m_def->getOuterScope()->qualifiedName()
9664 + getLanguageSpecificSeparator(lang) + prefix;
9667 else if (scope) // some thing else? -> show scope
9669 name = prefix + convertToXML(scope->name());
9672 if (!found) // fallback
9674 name = prefix + "("+theTranslator->trGlobalNamespace()+")";
9678 TemplateVariant relPath() const
9680 return externalRef("../",m_def->getReference(),TRUE);
9683 const Definition *m_def;
9684 const Definition *m_prevDef;
9685 const Definition *m_nextDef;
9686 static PropertyMapper<SymbolContext::Private> s_inst;
9690 PropertyMapper<SymbolContext::Private> SymbolContext::Private::s_inst;
9692 SymbolContext::SymbolContext(const Definition *def,const Definition *prevDef,const Definition *nextDef)
9693 : RefCountedContext("SymbolContext")
9695 p = new Private(def,prevDef,nextDef);
9698 SymbolContext::~SymbolContext()
9703 TemplateVariant SymbolContext::get(const char *name) const
9705 return p->get(name);
9708 //------------------------------------------------------------------------
9710 //%% list SymbolList[Symbol] : list of search symbols with the same name
9711 class SymbolListContext::Private : public GenericNodeListContext
9714 Private(const SearchDefinitionList *sdl)
9716 QListIterator<Definition> li(*sdl);
9718 Definition *prev = 0;
9719 for (li.toFirst();(def=li.current());)
9722 const Definition *next = li.current();
9723 append(SymbolContext::alloc(def,prev,next));
9729 SymbolListContext::SymbolListContext(const SearchDefinitionList *sdl)
9730 : RefCountedContext("SymbolListContext")
9732 p = new Private(sdl);
9735 SymbolListContext::~SymbolListContext()
9741 int SymbolListContext::count() const
9746 TemplateVariant SymbolListContext::at(int index) const
9748 return p->at(index);
9751 TemplateListIntf::ConstIterator *SymbolListContext::createIterator() const
9753 return p->createIterator();
9756 //------------------------------------------------------------------------
9758 //%% struct SymbolGroup: search group of similar symbols
9760 class SymbolGroupContext::Private
9763 Private(const SearchDefinitionList *sdl) : m_sdl(sdl)
9765 static bool init=FALSE;
9768 s_inst.addProperty("id", &Private::id);
9769 s_inst.addProperty("name", &Private::name);
9770 s_inst.addProperty("symbols",&Private::symbolList);
9774 TemplateVariant get(const char *n) const
9776 return s_inst.get(this,n);
9778 TemplateVariant id() const
9782 TemplateVariant name() const
9784 return m_sdl->name();
9786 TemplateVariant symbolList() const
9788 if (!m_cache.symbolList)
9790 m_cache.symbolList.reset(SymbolListContext::alloc(m_sdl));
9792 return m_cache.symbolList.get();
9795 const SearchDefinitionList *m_sdl;
9798 SharedPtr<SymbolListContext> symbolList;
9800 mutable Cachable m_cache;
9801 static PropertyMapper<SymbolGroupContext::Private> s_inst;
9805 PropertyMapper<SymbolGroupContext::Private> SymbolGroupContext::Private::s_inst;
9807 SymbolGroupContext::SymbolGroupContext(const SearchDefinitionList *sdl)
9808 : RefCountedContext("SymbolGroupContext")
9810 p = new Private(sdl);
9813 SymbolGroupContext::~SymbolGroupContext()
9818 TemplateVariant SymbolGroupContext::get(const char *name) const
9820 return p->get(name);
9823 //------------------------------------------------------------------------
9825 //%% list SymbolGroupList[SymbolGroup] : list of search groups one per by name
9826 class SymbolGroupListContext::Private : public GenericNodeListContext
9829 Private(const SearchIndexList *sil)
9831 SDict<SearchDefinitionList>::Iterator li(*sil);
9832 SearchDefinitionList *dl;
9833 for (li.toFirst();(dl=li.current());++li)
9835 append(SymbolGroupContext::alloc(dl));
9840 SymbolGroupListContext::SymbolGroupListContext(const SearchIndexList *sil)
9841 : RefCountedContext("SymbolGroupListContext")
9843 p = new Private(sil);
9846 SymbolGroupListContext::~SymbolGroupListContext()
9852 int SymbolGroupListContext::count() const
9857 TemplateVariant SymbolGroupListContext::at(int index) const
9859 return p->at(index);
9862 TemplateListIntf::ConstIterator *SymbolGroupListContext::createIterator() const
9864 return p->createIterator();
9867 //------------------------------------------------------------------------
9869 //%% struct SymbolIndex: search index
9871 class SymbolIndexContext::Private
9874 Private(const SearchIndexList *sl,const QCString &name) : m_searchList(sl), m_name(name)
9876 static bool init=FALSE;
9879 s_inst.addProperty("name", &Private::name);
9880 s_inst.addProperty("letter", &Private::letter);
9881 s_inst.addProperty("symbolGroups",&Private::symbolGroups);
9885 TemplateVariant get(const char *n) const
9887 return s_inst.get(this,n);
9889 TemplateVariant name() const
9893 TemplateVariant letter() const
9895 return QString(QChar(m_searchList->letter())).utf8();
9897 TemplateVariant symbolGroups() const
9899 if (!m_cache.symbolGroups)
9901 m_cache.symbolGroups.reset(SymbolGroupListContext::alloc(m_searchList));
9903 return m_cache.symbolGroups.get();
9906 const SearchIndexList *m_searchList;
9910 SharedPtr<SymbolGroupListContext> symbolGroups;
9912 mutable Cachable m_cache;
9913 static PropertyMapper<SymbolIndexContext::Private> s_inst;
9917 PropertyMapper<SymbolIndexContext::Private> SymbolIndexContext::Private::s_inst;
9919 SymbolIndexContext::SymbolIndexContext(const SearchIndexList *sl,const QCString &name)
9920 : RefCountedContext("SymbolIndexContext")
9922 p = new Private(sl,name);
9925 SymbolIndexContext::~SymbolIndexContext()
9930 TemplateVariant SymbolIndexContext::get(const char *name) const
9932 return p->get(name);
9935 //------------------------------------------------------------------------
9937 //%% list SymbolIndices[SymbolIndex] : list of search indices one per by type
9938 class SymbolIndicesContext::Private : public GenericNodeListContext
9941 Private(const SearchIndexInfo *info)
9943 // use info->symbolList to populate the list
9944 SIntDict<SearchIndexList>::Iterator it(info->symbolList);
9945 const SearchIndexList *sl;
9946 for (it.toFirst();(sl=it.current());++it) // for each letter
9948 append(SymbolIndexContext::alloc(sl,info->name));
9953 SymbolIndicesContext::SymbolIndicesContext(const SearchIndexInfo *info) : RefCountedContext("SymbolIndicesContext")
9955 p = new Private(info);
9958 SymbolIndicesContext::~SymbolIndicesContext()
9964 int SymbolIndicesContext::count() const
9969 TemplateVariant SymbolIndicesContext::at(int index) const
9971 return p->at(index);
9974 TemplateListIntf::ConstIterator *SymbolIndicesContext::createIterator() const
9976 return p->createIterator();
9979 //------------------------------------------------------------------------
9981 //%% struct SearchIndex: search index
9983 class SearchIndexContext::Private
9986 Private(const SearchIndexInfo *info) : m_info(info)
9988 static bool init=FALSE;
9991 s_inst.addProperty("name", &Private::name);
9992 s_inst.addProperty("text", &Private::text);
9993 s_inst.addProperty("symbolIndices",&Private::symbolIndices);
9997 TemplateVariant get(const char *n) const
9999 return s_inst.get(this,n);
10001 TemplateVariant name() const
10003 return m_info->name;
10005 TemplateVariant text() const
10007 return m_info->text;
10009 TemplateVariant symbolIndices() const
10011 if (!m_cache.symbolIndices)
10013 m_cache.symbolIndices.reset(SymbolIndicesContext::alloc(m_info));
10015 return m_cache.symbolIndices.get();
10018 const SearchIndexInfo *m_info;
10021 SharedPtr<SymbolIndicesContext> symbolIndices;
10023 mutable Cachable m_cache;
10024 static PropertyMapper<SearchIndexContext::Private> s_inst;
10028 PropertyMapper<SearchIndexContext::Private> SearchIndexContext::Private::s_inst;
10030 SearchIndexContext::SearchIndexContext(const SearchIndexInfo *info)
10031 : RefCountedContext("SearchIndexContext")
10033 p = new Private(info);
10036 SearchIndexContext::~SearchIndexContext()
10041 TemplateVariant SearchIndexContext::get(const char *name) const
10043 return p->get(name);
10046 //------------------------------------------------------------------------
10048 //%% list SearchIndices[SearchIndex] : list of search indices one per by type
10049 class SearchIndicesContext::Private : public GenericNodeListContext
10054 const SearchIndexInfo *indices = getSearchIndices();
10055 for (int i=0;i<NUM_SEARCH_INDICES;i++)
10057 append(SearchIndexContext::alloc(&indices[i]));
10062 SearchIndicesContext::SearchIndicesContext() : RefCountedContext("SearchIndicesContext")
10067 SearchIndicesContext::~SearchIndicesContext()
10072 // TemplateListIntf
10073 int SearchIndicesContext::count() const
10078 TemplateVariant SearchIndicesContext::at(int index) const
10080 return p->at(index);
10083 TemplateListIntf::ConstIterator *SearchIndicesContext::createIterator() const
10085 return p->createIterator();
10089 //------------------------------------------------------------------------
10091 class HtmlEscaper : public TemplateEscapeIntf
10094 QCString escape(const QCString &s)
10096 return convertToHtml(s,TRUE);
10098 void enableTabbing(bool) {}
10101 //------------------------------------------------------------------------
10103 class LatexSpaceless : public TemplateSpacelessIntf
10106 LatexSpaceless() { reset(); }
10108 QCString remove(const QCString &s)
10111 const char *p = s.data();
10117 case '\t': case ' ': case '\n':
10125 return result.data();
10130 //------------------------------------------------------------------------
10132 class HtmlSpaceless : public TemplateSpacelessIntf
10135 HtmlSpaceless() { reset(); }
10138 m_insideTag = FALSE;
10139 m_insideString = '\0';
10140 m_removeSpaces = TRUE;
10142 QCString remove(const QCString &s)
10145 const char *p = s.data();
10151 case '<': // start of a tag
10152 if (!m_insideString) m_insideTag=TRUE,m_removeSpaces=FALSE;
10155 case '>': // end of a tag
10156 if (!m_insideString) m_insideTag=FALSE,m_removeSpaces=TRUE;
10159 case '\\': // escaped character in a string
10161 if (m_insideString && *p) result+=*p++;
10163 case '"': case '\'':
10166 if (m_insideString==c) // end of string
10168 m_insideString='\0';
10170 else if (m_insideString=='\0') // start of string
10177 case ' ': case '\t': case '\n': // whitespace
10178 if (!m_insideTag) // outside tags strip consecutive whitespace
10180 m_removeSpaces=TRUE;
10188 //if (m_removeSpaces) result+=' ';
10190 m_removeSpaces=FALSE;
10195 //printf("HtmlSpaceless::remove({%s})={%s} m_insideTag=%d m_insideString=%c (%d) removeSpaces=%d\n",s.data(),result.data(),
10196 // m_insideTag,m_insideString,m_insideString,m_removeSpaces);
10197 return result.data();
10201 char m_insideString;
10202 bool m_removeSpaces;
10205 //------------------------------------------------------------------------
10207 class LatexEscaper : public TemplateEscapeIntf
10210 LatexEscaper() : m_tabbing(FALSE) {}
10211 QCString escape(const QCString &s)
10213 return convertToLaTeX(s,m_tabbing);
10215 void enableTabbing(bool b) { m_tabbing=b; }
10221 //------------------------------------------------------------------------
10224 int RefCountedContext::s_totalCount;
10227 void generateOutputViaTemplate()
10229 msg("Generating output via template engine...\n");
10232 TemplateContext *ctx = e.createContext();
10235 SharedPtr<DoxygenContext> doxygen (DoxygenContext::alloc());
10236 SharedPtr<ConfigContext> config (ConfigContext::alloc());
10237 SharedPtr<TranslateContext> tr (TranslateContext::alloc());
10238 SharedPtr<ClassListContext> classList (ClassListContext::alloc());
10239 SharedPtr<ClassIndexContext> classIndex (ClassIndexContext::alloc());
10240 SharedPtr<ClassTreeContext> classTree (ClassTreeContext::alloc());
10241 SharedPtr<ClassHierarchyContext> classHierarchy (ClassHierarchyContext::alloc());
10242 SharedPtr<NamespaceListContext> namespaceList (NamespaceListContext::alloc());
10243 SharedPtr<NamespaceTreeContext> namespaceTree (NamespaceTreeContext::alloc());
10244 SharedPtr<DirListContext> dirList (DirListContext::alloc());
10245 SharedPtr<FileListContext> fileList (FileListContext::alloc());
10246 SharedPtr<FileTreeContext> fileTree (FileTreeContext::alloc());
10247 SharedPtr<PageTreeContext> pageTree (PageTreeContext::alloc(Doxygen::pageSDict));
10248 SharedPtr<PageListContext> pageList (PageListContext::alloc(Doxygen::pageSDict));
10249 SharedPtr<ExampleTreeContext> exampleTree (ExampleTreeContext::alloc());
10250 SharedPtr<ExampleListContext> exampleList (ExampleListContext::alloc());
10251 SharedPtr<ModuleTreeContext> moduleTree (ModuleTreeContext::alloc());
10252 SharedPtr<ModuleListContext> moduleList (ModuleListContext::alloc());
10253 SharedPtr<GlobalsIndexContext> globalsIndex (GlobalsIndexContext::alloc());
10254 SharedPtr<ClassMembersIndexContext> classMembersIndex (ClassMembersIndexContext::alloc());
10255 SharedPtr<NamespaceMembersIndexContext> namespaceMembersIndex(NamespaceMembersIndexContext::alloc());
10256 SharedPtr<SearchIndicesContext> searchIndices (SearchIndicesContext::alloc());
10258 //%% Doxygen doxygen:
10259 ctx->set("doxygen",doxygen.get());
10260 //%% Translator tr:
10261 ctx->set("tr",tr.get());
10262 //%% Config config:
10263 ctx->set("config",config.get());
10264 //%% ClassList classList:
10265 ctx->set("classList",classList.get()); // not used for standard HTML
10266 //%% ClassTree classTree:
10267 ctx->set("classTree",classTree.get());
10268 //%% ClassIndex classIndex:
10269 ctx->set("classIndex",classIndex.get());
10270 //%% ClassHierarchy classHierarchy:
10271 ctx->set("classHierarchy",classHierarchy.get());
10272 //%% NamespaceList namespaceList:
10273 ctx->set("namespaceList",namespaceList.get());
10274 //%% NamespaceTree namespaceTree:
10275 ctx->set("namespaceTree",namespaceTree.get());
10276 //%% FileList fileList:
10277 ctx->set("fileList",fileList.get());
10278 //%% FileTree fileTree:
10279 ctx->set("fileTree",fileTree.get());
10280 //%% PageList pageList
10281 ctx->set("pageList",pageList.get());
10282 //%% PageTree pageTree
10283 ctx->set("pageTree",pageTree.get());
10284 //%% ExampleTree exampleTree
10285 ctx->set("exampleTree",exampleTree.get());
10286 //%% ExampleList exampleList
10287 ctx->set("exampleList",exampleList.get());
10288 //%% ModuleTree moduleTree
10289 ctx->set("moduleTree",moduleTree.get());
10290 //%% ModuleList moduleList
10291 ctx->set("moduleList",moduleList.get());
10292 //%% DirList dirList
10293 ctx->set("dirList",dirList.get());
10295 if (Doxygen::mainPage)
10297 SharedPtr<PageContext> mainPage(PageContext::alloc(Doxygen::mainPage,TRUE,FALSE));
10298 ctx->set("mainPage",mainPage.get());
10302 // TODO: for LaTeX output index should be main... => solve in template
10303 Doxygen::mainPage = new PageDef("[generated]",1,"index","",theTranslator->trMainPage());
10304 Doxygen::mainPage->setFileName("index");
10305 SharedPtr<PageContext> mainPage(PageContext::alloc(Doxygen::mainPage,TRUE,FALSE));
10306 ctx->set("mainPage",mainPage.get());
10308 //%% GlobalsIndex globalsIndex:
10309 ctx->set("globalsIndex",globalsIndex.get());
10310 //%% ClassMembersIndex classMembersIndex:
10311 ctx->set("classMembersIndex",classMembersIndex.get());
10312 //%% NamespaceMembersIndex namespaceMembersIndex:
10313 ctx->set("namespaceMembersIndex",namespaceMembersIndex.get());
10314 //%% SearchIndicaes searchindicaes
10315 ctx->set("searchIndices",searchIndices.get());
10317 ctx->set("space"," ");
10319 //if (Config_getBool(GENERATE_HTML))
10320 { // render HTML output
10321 e.setTemplateDir("templates/html"); // TODO: make template part user configurable
10322 Template *tpl = e.loadByName("htmllayout.tpl",1);
10325 g_globals.outputFormat = ContextOutputFormat_Html;
10326 g_globals.dynSectionId = 0;
10327 g_globals.outputDir = Config_getString(HTML_OUTPUT);
10328 QDir dir(g_globals.outputDir);
10329 createSubDirs(dir);
10330 HtmlEscaper htmlEsc;
10331 ctx->setEscapeIntf(Config_getString(HTML_FILE_EXTENSION),&htmlEsc);
10333 ctx->setSpacelessIntf(&spl);
10334 ctx->setOutputDirectory(g_globals.outputDir);
10336 tpl->render(ts,ctx);
10341 // TODO: clean index before each run...
10343 //if (Config_getBool(GENERATE_LATEX))
10345 { // render LaTeX output
10346 e.setTemplateDir("templates/latex"); // TODO: make template part user configurable
10347 Template *tpl = e.loadByName("latexlayout.tpl",1);
10350 g_globals.outputFormat = ContextOutputFormat_Latex;
10351 g_globals.dynSectionId = 0;
10352 g_globals.outputDir = Config_getString(LATEX_OUTPUT);
10353 QDir dir(g_globals.outputDir);
10354 createSubDirs(dir);
10355 LatexEscaper latexEsc;
10356 ctx->setEscapeIntf(".tex",&latexEsc);
10357 LatexSpaceless spl;
10358 ctx->setSpacelessIntf(&spl);
10359 ctx->setOutputDirectory(g_globals.outputDir);
10361 tpl->render(ts,ctx);
10366 // clear all cached data in Definition objects.
10367 QDictIterator<DefinitionIntf> di(*Doxygen::symbolMap);
10368 DefinitionIntf *intf;
10369 for (;(intf=di.current());++di)
10371 if (intf->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
10373 DefinitionListIterator dli(*(DefinitionList*)intf);
10376 for (dli.toFirst();(d=dli.current());++dli)
10381 else // single symbol
10383 Definition *d = (Definition *)intf;
10388 e.destroyContext(ctx);
10391 #if DEBUG_REF // should be 0, i.e. all objects are deleted
10392 printf("==== total ref count %d\n",RefCountedContext::s_totalCount);
10396 void generateTemplateFiles(const char *templateDir)
10398 if (!templateDir) return;
10400 if (!thisDir.exists(templateDir) && !thisDir.mkdir(templateDir))
10402 err("Failed to create output directory '%s'\n",templateDir);
10405 QCString outDir = QCString(templateDir)+"/html";
10406 if (!thisDir.exists(outDir) && !thisDir.mkdir(outDir))
10408 err("Failed to create output directory '%s'\n",templateDir);
10411 ResourceMgr::instance().writeCategory("html",outDir);