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] obj The object handling access to the property.
250 * @param[in] handle The method to call when the property is accessed.
252 void addProperty(const char *name,typename PropertyFunc::Handler handle)
254 if (m_map.find(name))
256 err("Error: adding property '%s' more than once",name);
260 m_map.insert(name,new PropertyFunc(handle));
264 /** Gets the value of a 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: 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)
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)
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)
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 inheritedFrom() const
861 return theTranslator->trInheritedFrom("@0","@1");
863 TemplateVariant additionalInheritedMembers() const
865 return theTranslator->trAdditionalInheritedMembers();
867 TemplateVariant includeDependencyGraph() const
869 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleIncludeDependencyGraph>(this);
871 TemplateVariant includedByDependencyGraph() const
873 return theTranslator->trInclByDepGraph();
875 TemplateVariant gotoSourceCode() const
877 return theTranslator->trGotoSourceCode();
879 TemplateVariant gotoDocumentation() const
881 return theTranslator->trGotoDocumentation();
883 TemplateVariant constantgroups() const
885 return theTranslator->trConstantGroups();
887 TemplateVariant classDocumentation() const
889 return theTranslator->trClassDocumentation();
891 TemplateVariant namespaceDocumentation() const
893 return theTranslator->trNamespaceDocumentation();
895 TemplateVariant compoundMembers() const
897 return theTranslator->trCompoundMembers();
899 TemplateVariant detailLevel() const
901 return theTranslator->trDetailLevel();
903 TemplateVariant fileListDescription() const
905 bool extractAll = Config_getBool(EXTRACT_ALL);
906 return theTranslator->trFileListDescription(extractAll);
908 TemplateVariant modulesDescription() const
910 bool extractAll = Config_getBool(EXTRACT_ALL);
911 return theTranslator->trModulesListDescription(extractAll);
913 TemplateVariant namespaceListDescription() const
915 bool extractAll = Config_getBool(EXTRACT_ALL);
916 return theTranslator->trNamespaceListDescription(extractAll);
918 TemplateVariant directories() const
920 return theTranslator->trDirectories();
922 TemplateVariant all() const
924 return theTranslator->trAll();
926 TemplateVariant functions() const
928 static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
929 static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
930 return fortranOpt ? theTranslator->trSubprograms() :
931 vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
932 theTranslator->trFunctions();
934 TemplateVariant variables() const
936 return theTranslator->trVariables();
938 TemplateVariant typedefs() const
940 return theTranslator->trTypedefs();
942 TemplateVariant enums() const
944 return theTranslator->trEnumerations();
946 TemplateVariant properties() const
948 return theTranslator->trProperties();
950 TemplateVariant events() const
952 return theTranslator->trEvents();
954 TemplateVariant related() const
956 return theTranslator->trRelatedFunctions();
958 TemplateVariant macros() const
960 return theTranslator->trDefines();
962 TemplateVariant loading() const
964 return theTranslator->trLoading();
966 TemplateVariant searching() const
968 return theTranslator->trSearching();
970 TemplateVariant noMatches() const
972 return theTranslator->trNoMatches();
974 TemplateVariant enumName() const
976 return theTranslator->trEnumName();
978 TemplateVariant enumValue() const
980 return theTranslator->trEnumValue();
982 TemplateVariant referenceManual() const
984 return theTranslator->trReferenceManual();
986 TemplateVariant index() const
988 return theTranslator->trRTFGeneralIndex();
990 TemplateVariant panelSyncOn() const
992 return theTranslator->trPanelSynchronisationTooltip(FALSE);
994 TemplateVariant panelSyncOff() const
996 return theTranslator->trPanelSynchronisationTooltip(TRUE);
998 TemplateVariant providedByCategory() const
1000 return theTranslator->trProvidedByCategory();
1002 TemplateVariant extendsClass() const
1004 return theTranslator->trExtendsClass();
1006 TemplateVariant examplesDescription() const
1008 return theTranslator->trExamplesDescription();
1010 TemplateVariant langString() const
1012 return HtmlHelp::getLanguageString();
1016 static bool init=FALSE;
1019 //%% string generatedBy
1020 s_inst.addProperty("generatedBy", &Private::generatedBy);
1021 //%% string generatedAt
1022 s_inst.addProperty("generatedAt", &Private::generatedAt);
1024 s_inst.addProperty("search", &Private::search);
1025 //%% string mainPage
1026 s_inst.addProperty("mainPage", &Private::mainPage);
1028 s_inst.addProperty("classes", &Private::classes);
1029 //%% string classList
1030 s_inst.addProperty("classList", &Private::classList);
1031 //%% string classListDescription
1032 s_inst.addProperty("classListDescription", &Private::classListDescription);
1033 //%% string classIndex
1034 s_inst.addProperty("classIndex", &Private::classIndex);
1035 //%% string namespaceIndex
1036 s_inst.addProperty("namespaceIndex", &Private::namespaceIndex);
1037 //%% string classHierarchy
1038 s_inst.addProperty("classHierarchy", &Private::classHierarchy);
1039 //%% string classMembers
1040 s_inst.addProperty("classMembers", &Private::classMembers);
1041 //%% string classMembersDescription
1042 s_inst.addProperty("classMembersDescription",&Private::classMembersDescription);
1044 s_inst.addProperty("modules", &Private::modules);
1045 //%% string moduleIndex
1046 s_inst.addProperty("moduleIndex", &Private::moduleIndex);
1047 //%% string namespaces
1048 s_inst.addProperty("namespaces", &Private::namespaces);
1049 //%% string fileIndex
1050 s_inst.addProperty("fileIndex", &Private::fileIndex);
1052 s_inst.addProperty("files", &Private::files);
1054 s_inst.addProperty("pages", &Private::pages);
1055 //%% string examples
1056 s_inst.addProperty("examples", &Private::examples);
1057 //%% string namespaceList
1058 s_inst.addProperty("namespaceList", &Private::namespaceList);
1059 //%% string namespaceMembers
1060 s_inst.addProperty("namespaceMembers", &Private::namespaceMembers);
1061 //%% srting fileList
1062 s_inst.addProperty("fileList", &Private::fileList);
1063 //%% string fileMembers
1064 s_inst.addProperty("fileMembers", &Private::fileMembers);
1065 //%% string fileMembersDescription
1066 s_inst.addProperty("fileMembersDescription", &Private::fileMembersDescription);
1067 //%% string relatedPagesDescripiton
1068 s_inst.addProperty("relatedPagesDesc", &Private::relatedPagesDesc);
1070 s_inst.addProperty("more", &Private::more);
1071 //%% string detailedDescription
1072 s_inst.addProperty("detailedDesc", &Private::detailedDesc);
1073 //%% string inheritanceDiagramFor
1074 s_inst.addProperty("inheritanceDiagramFor", &Private::inheritanceDiagramFor);
1075 //%% string collaborationDiagramFor
1076 s_inst.addProperty("collaborationDiagramFor", &Private::collaborationDiagramFor);
1077 //%% markerstring inheritsList
1078 s_inst.addProperty("inheritsList", &Private::inheritsList);
1079 //%% markerstring inheritedByList
1080 s_inst.addProperty("inheritedByList", &Private::inheritedByList);
1081 //%% markerstring definedAtLineInSourceFile
1082 s_inst.addProperty("definedAtLineInSourceFile", &Private::definedAtLineInSourceFile);
1083 //%% string typeConstraints
1084 s_inst.addProperty("typeConstraints", &Private::typeConstraints);
1085 //%% string exampleList
1086 s_inst.addProperty("exampleList", &Private::exampleList);
1087 //%% string listOfAllMembers
1088 s_inst.addProperty("listOfAllMembers", &Private::listOfAllMembers);
1089 //%% string memberList
1090 s_inst.addProperty("memberList", &Private::memberList);
1091 //%% string theListOfAllMembers
1092 s_inst.addProperty("theListOfAllMembers",&Private::theListOfAllMembers);
1093 //%% string incInheritedMembers
1094 s_inst.addProperty("incInheritedMembers",&Private::incInheritedMembers);
1095 //%% string defineValue
1096 s_inst.addProperty("defineValue", &Private::defineValue);
1097 //%% string initialValue
1098 s_inst.addProperty("initialValue", &Private::initialValue);
1099 //%% markerstring implements
1100 s_inst.addProperty("implements", &Private::implements);
1101 //%% markerstring reimplements
1102 s_inst.addProperty("reimplements", &Private::reimplements);
1103 //%% markerstring implementedBy
1104 s_inst.addProperty("implementedBy", &Private::implementedBy);
1105 //%% markerstring reimplementedBy
1106 s_inst.addProperty("reimplementedBy", &Private::reimplementedBy);
1107 //%% markerstring sourceRefs
1108 s_inst.addProperty("sourceRefs", &Private::sourceRefs);
1109 //%% markerstring sourceRefBys
1110 s_inst.addProperty("sourceRefBys", &Private::sourceRefBys);
1111 //%% string callGraph
1112 s_inst.addProperty("callGraph", &Private::callGraph);
1113 //%% string callerGraph
1114 s_inst.addProperty("callerGraph", &Private::callerGraph);
1115 //%% markerstring inheritedFrom
1116 s_inst.addProperty("inheritedFrom", &Private::inheritedFrom);
1117 //%% string addtionalInheritedMembers
1118 s_inst.addProperty("additionalInheritedMembers",&Private::additionalInheritedMembers);
1119 //%% string includeDependencyGraph:container_name
1120 s_inst.addProperty("includeDependencyGraph",&Private::includeDependencyGraph);
1121 //%% string includedByDependencyGraph
1122 s_inst.addProperty("includedByDependencyGraph",&Private::includedByDependencyGraph);
1123 //%% string gotoSourceCode
1124 s_inst.addProperty("gotoSourceCode", &Private::gotoSourceCode);
1125 //%% string gotoDocumentation
1126 s_inst.addProperty("gotoDocumentation", &Private::gotoDocumentation);
1127 //%% string constantgroups
1128 s_inst.addProperty("constantgroups", &Private::constantgroups);
1129 //%% string classDocumentation
1130 s_inst.addProperty("classDocumentation", &Private::classDocumentation);
1131 //%% string namespaceDocumentation
1132 s_inst.addProperty("namespaceDocumentation", &Private::namespaceDocumentation);
1133 //%% string moduleDocumentation
1134 s_inst.addProperty("moduleDocumentation",&Private::moduleDocumentation);
1135 //%% string fileDocumentation
1136 s_inst.addProperty("fileDocumentation", &Private::fileDocumentation);
1137 //%% string compoundMembers
1138 s_inst.addProperty("compoundMembers", &Private::compoundMembers);
1139 //%% string detailLevel
1140 s_inst.addProperty("detailLevel", &Private::detailLevel);
1141 //%% string fileListDescription
1142 s_inst.addProperty("fileListDescription",&Private::fileListDescription);
1143 //%% string namespaceListDescription
1144 s_inst.addProperty("namespaceListDescription",&Private::namespaceListDescription);
1145 //%% string directories
1146 s_inst.addProperty("directories", &Private::directories);
1147 //%% string moduleDescription
1148 s_inst.addProperty("modulesDescription", &Private::modulesDescription);
1150 s_inst.addProperty("all", &Private::all);
1151 //%% string functions
1152 s_inst.addProperty("functions", &Private::functions);
1153 //%% string variables
1154 s_inst.addProperty("variables", &Private::variables);
1155 //%% string typedefs
1156 s_inst.addProperty("typedefs", &Private::typedefs);
1158 s_inst.addProperty("enums", &Private::enums);
1159 //%% string enumValues
1160 s_inst.addProperty("enumValues", &Private::enumerationValues);
1161 //%% string properties
1162 s_inst.addProperty("properties", &Private::properties);
1164 s_inst.addProperty("events", &Private::events);
1166 s_inst.addProperty("related", &Private::related);
1168 s_inst.addProperty("macros", &Private::macros);
1169 //%% string namespaceMembersDescription
1170 s_inst.addProperty("namespaceMembersDescription",&Private::namespaceMembersDescription);
1171 //%% string classHierarchyDescription
1172 s_inst.addProperty("classHierarchyDescription",&Private::classHierarchyDescription);
1173 //%% string gotoGraphicalHierarchy
1174 s_inst.addProperty("gotoGraphicalHierarchy",&Private::gotoGraphicalHierarchy);
1175 //%% string gotoTextualHierarchy
1176 s_inst.addProperty("gotoTextualHierarchy",&Private::gotoTextualHierarchy);
1178 s_inst.addProperty("loading", &Private::loading);
1179 //%% string searching
1180 s_inst.addProperty("searching", &Private::searching);
1181 //%% string noMatches
1182 s_inst.addProperty("noMatches", &Private::noMatches);
1183 //%% string enumValue
1184 s_inst.addProperty("enumValue", &Private::enumValue);
1185 //%% string enumName
1186 s_inst.addProperty("enumName", &Private::enumName);
1187 //%% string referenceManual
1188 s_inst.addProperty("referenceManual", &Private::referenceManual);
1190 s_inst.addProperty("index", &Private::index);
1191 //%% string panelSyncOn
1192 s_inst.addProperty("panelSyncOn", &Private::panelSyncOn);
1193 //%% string panelSyncOff
1194 s_inst.addProperty("panelSyncOff", &Private::panelSyncOff);
1195 //%% string dirDependencyGraph
1196 s_inst.addProperty("dirDependencyGraphFor", &Private::dirDependencyGraphFor);
1197 //%% string providedByCategory
1198 s_inst.addProperty("providedByCategory", &Private::providedByCategory);
1199 //%% string extendsClass
1200 s_inst.addProperty("extendsClass", &Private::extendsClass);
1201 //%% string examplesDescription
1202 s_inst.addProperty("examplesDescription",&Private::examplesDescription);
1203 //%% string langstring
1204 s_inst.addProperty("langString", &Private::langString);
1209 m_javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
1210 m_fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
1211 m_vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
1213 TemplateVariant get(const char *n) const
1215 return s_inst.get(this,n);
1221 static PropertyMapper<TranslateContext::Private> s_inst;
1225 PropertyMapper<TranslateContext::Private> TranslateContext::Private::s_inst;
1227 TranslateContext::TranslateContext() : RefCountedContext("TranslateContext")
1232 TranslateContext::~TranslateContext()
1237 TemplateVariant TranslateContext::get(const char *n) const
1242 static TemplateVariant parseDoc(Definition *def,const QCString &file,int line,
1243 const QCString &relPath,const QCString &docStr,bool isBrief)
1245 TemplateVariant result;
1246 DocRoot *root = validatingParseDoc(file,line,def,0,docStr,TRUE,FALSE,0,isBrief,FALSE);
1249 FTextStream ts(&docs);
1250 switch (g_globals.outputFormat)
1252 case ContextOutputFormat_Html:
1254 HtmlCodeGenerator codeGen(ts,relPath);
1255 HtmlDocVisitor visitor(ts,codeGen,def);
1256 root->accept(&visitor);
1259 case ContextOutputFormat_Latex:
1261 LatexCodeGenerator codeGen(ts,relPath,file);
1262 LatexDocVisitor visitor(ts,codeGen,def->getDefFileExtension(),FALSE);
1263 root->accept(&visitor);
1266 // TODO: support other generators
1268 err("context.cpp: output format not yet supported");
1272 bool isEmpty = root->isEmpty();
1276 result = TemplateVariant(docs,TRUE);
1281 static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const QCString &relPath,
1282 const QCString &code,int startLine=-1,int endLine=-1,bool showLineNumbers=FALSE)
1284 ParserInterface *pIntf = Doxygen::parserManager->getParser(md->getDefFileExtension());
1285 pIntf->resetCodeParserState();
1288 switch (g_globals.outputFormat)
1290 case ContextOutputFormat_Html:
1292 HtmlCodeGenerator codeGen(t,relPath);
1293 pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
1294 startLine,endLine,TRUE,md,showLineNumbers,md);
1297 case ContextOutputFormat_Latex:
1299 LatexCodeGenerator codeGen(t,relPath,md->docFile());
1300 pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
1301 startLine,endLine,TRUE,md,showLineNumbers,md);
1304 // TODO: support other generators
1306 err("context.cpp: output format not yet supported");
1309 return TemplateVariant(s.data(),TRUE);
1312 static TemplateVariant parseCode(FileDef *fd,const QCString &relPath)
1314 static bool filterSourceFiles = Config_getBool(FILTER_SOURCE_FILES);
1315 ParserInterface *pIntf = Doxygen::parserManager->getParser(fd->getDefFileExtension());
1316 pIntf->resetCodeParserState();
1319 switch (g_globals.outputFormat)
1321 case ContextOutputFormat_Html:
1323 HtmlCodeGenerator codeGen(t,relPath);
1324 pIntf->parseCode(codeGen,0,
1325 fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources
1326 fd->getLanguage(), // lang
1327 FALSE, // isExampleBlock
1332 FALSE, // inlineFragment
1334 TRUE, // showLineNumbers
1336 TRUE // collectXRefs, TODO: should become FALSE
1340 case ContextOutputFormat_Latex:
1342 LatexCodeGenerator codeGen(t,relPath,fd->docFile());
1343 pIntf->parseCode(codeGen,0,
1344 fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources
1345 fd->getLanguage(), // lang
1346 FALSE, // isExampleBlock
1351 FALSE, // inlineFragment
1353 TRUE, // showLineNumbers
1355 TRUE // collectXRefs, TODO: should become FALSE
1359 // TODO: support other generators
1361 err("context.cpp: output format not yet supported");
1364 return TemplateVariant(s.data(),TRUE);
1367 //------------------------------------------------------------------------
1369 //%% struct Symbol: shared info for all symbols
1371 template<typename T>
1372 class DefinitionContext
1375 DefinitionContext(Definition *d) : m_def(d)
1379 void addBaseProperties(PropertyMapper<T> &inst)
1381 //%% string name: the name of the symbol
1382 inst.addProperty("name",&DefinitionContext::name);
1383 //%% string bareName: the bare name of the symbol with scope info
1384 inst.addProperty("bareName",&DefinitionContext::bareName);
1385 //%% string relPath: the relative path to the root of the output (CREATE_SUBDIRS)
1386 inst.addProperty("relPath",&DefinitionContext::relPath);
1387 //%% string fileName: the file name of the output file associated with the symbol (without extension)
1388 inst.addProperty("fileName",&DefinitionContext::fileName);
1389 //%% string anchor: anchor within the page
1390 inst.addProperty("anchor",&DefinitionContext::anchor);
1391 //%% string details: the detailed documentation for this symbol
1392 inst.addProperty("details",&DefinitionContext::details);
1393 //%% string brief: the brief description for this symbol
1394 inst.addProperty("brief",&DefinitionContext::brief);
1395 //%% string inbodyDocs: the documentation found in the body
1396 inst.addProperty("inbodyDocs",&DefinitionContext::inbodyDocs);
1397 //%% string sourceFileName: the file name of the source file (without extension)
1398 inst.addProperty("sourceFileName",&DefinitionContext::sourceFileName);
1399 //%% bool isLinkable: can the symbol be linked to?
1400 inst.addProperty("isLinkable",&DefinitionContext::isLinkable);
1401 //%% bool isLinkableInProject: can the symbol be linked within this project?
1402 inst.addProperty("isLinkableInProject",&DefinitionContext::isLinkableInProject);
1403 //%% int dynSectionId: identifier that can be used for collapsible sections
1404 inst.addProperty("dynSectionId",&DefinitionContext::dynSectionId);
1405 //%% string language: the programming language in which the symbol is written
1406 inst.addProperty("language",&DefinitionContext::language);
1407 //%% string sourceDef: A link to the source definition
1408 inst.addProperty("sourceDef",&DefinitionContext::sourceDef);
1409 //%% list[Definition] navigationPath: Breadcrumb navigation path to this item
1410 inst.addProperty("navigationPath",&DefinitionContext::navigationPath);
1411 //%% string kind: Kind of compound object: class, namespace, module, package, page, dir
1412 inst.addProperty("compoundKind",&DefinitionContext::compoundKind);
1413 //%% bool isReference: is this definition imported via a tag file
1414 inst.addProperty("isReference",&DefinitionContext::isReference);
1415 //%% string externalReference: the link to the element in the remote documentation
1416 inst.addProperty("externalReference",&DefinitionContext::externalReference);
1418 TemplateVariant fileName() const
1420 return m_def->getOutputFileBase();
1422 TemplateVariant anchor() const
1424 return m_def->anchor();
1426 TemplateVariant sourceFileName() const
1428 return m_def->getSourceFileBase();
1430 TemplateVariant isLinkable() const
1432 return m_def->isLinkable();
1434 TemplateVariant isLinkableInProject() const
1436 return m_def->isLinkableInProject();
1438 TemplateVariant name() const
1440 return m_def->displayName(TRUE);
1442 TemplateVariant bareName() const
1444 return m_def->displayName(FALSE);
1446 QCString relPathAsString() const
1448 static bool createSubdirs = Config_getBool(CREATE_SUBDIRS);
1449 return createSubdirs ? QCString("../../") : QCString("");
1451 virtual TemplateVariant relPath() const
1453 return relPathAsString();
1455 TemplateVariant details() const
1457 Cachable &cache = getCache();
1458 if (!cache.details || g_globals.outputFormat!=cache.detailsOutputFormat)
1460 cache.details.reset(new TemplateVariant(parseDoc(m_def,m_def->docFile(),m_def->docLine(),
1461 relPathAsString(),m_def->documentation(),FALSE)));
1462 cache.detailsOutputFormat = g_globals.outputFormat;
1464 return *cache.details;
1466 TemplateVariant brief() const
1468 Cachable &cache = getCache();
1469 if (!cache.brief || g_globals.outputFormat!=cache.briefOutputFormat)
1471 if (m_def->hasBriefDescription())
1473 cache.brief.reset(new TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(),
1474 relPathAsString(),m_def->briefDescription(),TRUE)));
1475 cache.briefOutputFormat = g_globals.outputFormat;
1479 cache.brief.reset(new TemplateVariant(""));
1482 return *cache.brief;
1484 TemplateVariant inbodyDocs() const
1486 Cachable &cache = getCache();
1487 if (!cache.inbodyDocs || g_globals.outputFormat!=cache.inbodyDocsOutputFormat)
1489 if (!m_def->inbodyDocumentation().isEmpty())
1491 cache.inbodyDocs.reset(new TemplateVariant(parseDoc(m_def,m_def->inbodyFile(),m_def->inbodyLine(),
1492 relPathAsString(),m_def->inbodyDocumentation(),FALSE)));
1493 cache.inbodyDocsOutputFormat = g_globals.outputFormat;
1497 cache.inbodyDocs.reset(new TemplateVariant(""));
1500 return *cache.inbodyDocs;
1502 TemplateVariant dynSectionId() const
1504 return g_globals.dynSectionId;
1506 TemplateVariant language() const
1508 SrcLangExt lang = m_def->getLanguage();
1509 QCString result = "unknown";
1512 case SrcLangExt_Unknown: break;
1513 case SrcLangExt_IDL: result="idl"; break;
1514 case SrcLangExt_Java: result="java"; break;
1515 case SrcLangExt_CSharp: result="csharp"; break;
1516 case SrcLangExt_D: result="d"; break;
1517 case SrcLangExt_PHP: result="php"; break;
1518 case SrcLangExt_ObjC: result="objc"; break;
1519 case SrcLangExt_Cpp: result="cpp"; break;
1520 case SrcLangExt_JS: result="js"; break;
1521 case SrcLangExt_Python: result="python"; break;
1522 case SrcLangExt_Fortran: result="fortran"; break;
1523 case SrcLangExt_VHDL: result="vhdl"; break;
1524 case SrcLangExt_XML: result="xml"; break;
1525 case SrcLangExt_SQL: result="sql"; break;
1526 case SrcLangExt_Tcl: result="tcl"; break;
1527 case SrcLangExt_Markdown: result="markdown"; break;
1531 TemplateVariant compoundKind() const
1533 QCString result = "unspecified";
1534 switch (m_def->definitionType())
1536 case DefinitionIntf::TypeClass: result="class"; break;
1537 case DefinitionIntf::TypeFile: result="file"; break;
1538 case DefinitionIntf::TypeNamespace: result="namespace"; break;
1539 case DefinitionIntf::TypeGroup: result="module"; break;
1540 case DefinitionIntf::TypePackage: result="package"; break;
1541 case DefinitionIntf::TypePage: result="page"; break;
1542 case DefinitionIntf::TypeDir: result="dir"; break;
1543 case DefinitionIntf::TypeMember: // fall through
1544 case DefinitionIntf::TypeSymbolList:
1549 TemplateVariant sourceDef() const
1551 Cachable &cache = getCache();
1552 if (cache.sourceDef->count()==2)
1554 return cache.sourceDef.get();
1561 void fillPath(Definition *def,TemplateList *list) const
1563 Definition *outerScope = def->getOuterScope();
1564 Definition::DefType type = def->definitionType();
1565 if (outerScope && outerScope!=Doxygen::globalScope)
1567 fillPath(outerScope,list);
1569 else if (type==Definition::TypeFile && ((const FileDef*)def)->getDirDef())
1571 fillPath(((const FileDef*)def)->getDirDef(),list);
1573 list->append(NavPathElemContext::alloc(def));
1575 TemplateVariant navigationPath() const
1577 Cachable &cache = getCache();
1580 TemplateList *list = TemplateList::alloc();
1581 if (m_def->getOuterScope() && m_def->getOuterScope()!=Doxygen::globalScope)
1583 fillPath(m_def->getOuterScope(),list);
1585 else if (m_def->definitionType()==Definition::TypeFile && ((const FileDef *)m_def)->getDirDef())
1587 fillPath(((const FileDef *)m_def)->getDirDef(),list);
1589 cache.navPath.reset(list);
1591 return cache.navPath.get();
1593 TemplateVariant isReference() const
1595 return m_def->isReference();
1597 TemplateVariant externalReference() const
1599 return m_def->externalReference(relPathAsString());
1603 struct Cachable : public Definition::Cookie
1605 Cachable(Definition *def) : detailsOutputFormat(ContextOutputFormat_Unspecified),
1606 briefOutputFormat(ContextOutputFormat_Unspecified),
1607 inbodyDocsOutputFormat(ContextOutputFormat_Unspecified)
1609 sourceDef.reset(TemplateList::alloc());
1610 lineLink.reset(TemplateStruct::alloc());
1611 fileLink.reset(TemplateStruct::alloc());
1613 if (def && !def->getSourceFileBase().isEmpty())
1615 lineLink->set("text",def->getStartBodyLine());
1616 lineLink->set("isLinkable",TRUE);
1617 lineLink->set("fileName",def->getSourceFileBase());
1618 lineLink->set("anchor",def->getSourceAnchor());
1619 lineLink->set("isReference",FALSE);
1620 lineLink->set("externalReference","");
1621 if (def->definitionType()==Definition::TypeFile)
1623 fileLink->set("text",def->name());
1625 else if (def->getBodyDef())
1627 fileLink->set("text",def->getBodyDef()->name());
1631 fileLink->set("text",def->displayName(TRUE));
1633 fileLink->set("isLinkable",TRUE);
1634 fileLink->set("fileName",def->getSourceFileBase());
1635 fileLink->set("anchor",QCString());
1636 fileLink->set("isReference",FALSE);
1637 fileLink->set("externalReference","");
1638 sourceDef->append(lineLink.get());
1639 sourceDef->append(fileLink.get());
1642 ScopedPtr<TemplateVariant> details;
1643 ContextOutputFormat detailsOutputFormat;
1644 ScopedPtr<TemplateVariant> brief;
1645 ContextOutputFormat briefOutputFormat;
1646 ScopedPtr<TemplateVariant> inbodyDocs;
1647 ContextOutputFormat inbodyDocsOutputFormat;
1648 SharedPtr<TemplateList> navPath;
1649 SharedPtr<TemplateList> sourceDef;
1650 SharedPtr<TemplateStruct> fileLink;
1651 SharedPtr<TemplateStruct> lineLink;
1656 Cachable &getCache() const
1658 Cachable *c = static_cast<Cachable*>(m_def->cookie());
1666 //------------------------------------------------------------------------
1668 //%% struct IncludeInfo: include file information
1670 class IncludeInfoContext::Private
1673 Private(const IncludeInfo *info,SrcLangExt lang) :
1677 static bool init=FALSE;
1680 s_inst.addProperty("file",&Private::file);
1681 s_inst.addProperty("name",&Private::name);
1682 s_inst.addProperty("isImport",&Private::isImport);
1683 s_inst.addProperty("isLocal",&Private::isLocal);
1687 TemplateVariant get(const char *n) const
1689 return s_inst.get(this,n);
1691 TemplateVariant isLocal() const
1693 bool isIDLorJava = m_lang==SrcLangExt_IDL || m_lang==SrcLangExt_Java;
1694 return m_info->local || isIDLorJava;
1696 TemplateVariant isImport() const
1698 return m_info->imported || m_lang==SrcLangExt_ObjC;
1700 TemplateVariant file() const
1702 if (!m_fileContext && m_info && m_info->fileDef)
1704 m_fileContext.reset(FileContext::alloc(m_info->fileDef));
1708 return m_fileContext.get();
1715 TemplateVariant name() const
1717 return m_info->includeName;
1720 const IncludeInfo *m_info;
1721 mutable SharedPtr<FileContext> m_fileContext;
1723 static PropertyMapper<IncludeInfoContext::Private> s_inst;
1726 PropertyMapper<IncludeInfoContext::Private> IncludeInfoContext::Private::s_inst;
1728 IncludeInfoContext::IncludeInfoContext(const IncludeInfo *info,SrcLangExt lang) : RefCountedContext("IncludeContext")
1730 p = new Private(info,lang);
1733 IncludeInfoContext::~IncludeInfoContext()
1738 TemplateVariant IncludeInfoContext::get(const char *n) const
1744 //------------------------------------------------------------------------
1746 //%% list IncludeInfoList[Class] : list of nested classes
1747 class IncludeInfoListContext::Private : public GenericNodeListContext
1750 Private(const QList<IncludeInfo> &list,SrcLangExt lang)
1752 QListIterator<IncludeInfo> li(list);
1754 for (li.toFirst();(ii=li.current());++li)
1758 append(IncludeInfoContext::alloc(ii,lang));
1764 IncludeInfoListContext::IncludeInfoListContext(const QList<IncludeInfo> &list,SrcLangExt lang) : RefCountedContext("IncludeListContext")
1766 p = new Private(list,lang);
1769 IncludeInfoListContext::~IncludeInfoListContext()
1775 int IncludeInfoListContext::count() const
1780 TemplateVariant IncludeInfoListContext::at(int index) const
1782 return p->at(index);
1785 TemplateListIntf::ConstIterator *IncludeInfoListContext::createIterator() const
1787 return p->createIterator();
1790 //------------------------------------------------------------------------
1792 //%% struct Class(Symbol): class information
1794 class ClassContext::Private : public DefinitionContext<ClassContext::Private>
1797 Private(ClassDef *cd) : DefinitionContext<ClassContext::Private>(cd),
1800 static bool init=FALSE;
1803 addBaseProperties(s_inst);
1804 s_inst.addProperty("title", &Private::title);
1805 s_inst.addProperty("highlight", &Private::highlight);
1806 s_inst.addProperty("subhighlight", &Private::subHighlight);
1807 s_inst.addProperty("hasDetails", &Private::hasDetails);
1808 s_inst.addProperty("generatedFromFiles", &Private::generatedFromFiles);
1809 s_inst.addProperty("usedFiles", &Private::usedFiles);
1810 s_inst.addProperty("hasInheritanceDiagram", &Private::hasInheritanceDiagram);
1811 s_inst.addProperty("inheritanceDiagram", &Private::inheritanceDiagram);
1812 s_inst.addProperty("hasCollaborationDiagram", &Private::hasCollaborationDiagram);
1813 s_inst.addProperty("collaborationDiagram", &Private::collaborationDiagram);
1814 s_inst.addProperty("includeInfo", &Private::includeInfo);
1815 s_inst.addProperty("inherits", &Private::inherits);
1816 s_inst.addProperty("inheritedBy", &Private::inheritedBy);
1817 s_inst.addProperty("unoIDLServices", &Private::unoIDLServices);
1818 s_inst.addProperty("unoIDLInterfaces", &Private::unoIDLInterfaces);
1819 s_inst.addProperty("signals", &Private::signals);
1820 s_inst.addProperty("publicTypes", &Private::publicTypes);
1821 s_inst.addProperty("publicMethods", &Private::publicMethods);
1822 s_inst.addProperty("publicStaticMethods", &Private::publicStaticMethods);
1823 s_inst.addProperty("publicAttributes", &Private::publicAttributes);
1824 s_inst.addProperty("publicStaticAttributes", &Private::publicStaticAttributes);
1825 s_inst.addProperty("publicSlots", &Private::publicSlots);
1826 s_inst.addProperty("protectedTypes", &Private::protectedTypes);
1827 s_inst.addProperty("protectedMethods", &Private::protectedMethods);
1828 s_inst.addProperty("protectedStaticMethods", &Private::protectedStaticMethods);
1829 s_inst.addProperty("protectedAttributes", &Private::protectedAttributes);
1830 s_inst.addProperty("protectedStaticAttributes", &Private::protectedStaticAttributes);
1831 s_inst.addProperty("protectedSlots", &Private::protectedSlots);
1832 s_inst.addProperty("privateTypes", &Private::privateTypes);
1833 s_inst.addProperty("privateMethods", &Private::privateMethods);
1834 s_inst.addProperty("privateStaticMethods", &Private::privateStaticMethods);
1835 s_inst.addProperty("privateAttributes", &Private::privateAttributes);
1836 s_inst.addProperty("privateStaticAttributes", &Private::privateStaticAttributes);
1837 s_inst.addProperty("privateSlots", &Private::privateSlots);
1838 s_inst.addProperty("packageTypes", &Private::packageTypes);
1839 s_inst.addProperty("packageMethods", &Private::packageMethods);
1840 s_inst.addProperty("packageStaticMethods", &Private::packageStaticMethods);
1841 s_inst.addProperty("packageAttributes", &Private::packageAttributes);
1842 s_inst.addProperty("packageStaticAttributes", &Private::packageStaticAttributes);
1843 s_inst.addProperty("properties", &Private::properties);
1844 s_inst.addProperty("events", &Private::events);
1845 s_inst.addProperty("friends", &Private::friends);
1846 s_inst.addProperty("related", &Private::related);
1847 s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
1848 s_inst.addProperty("detailedEnums", &Private::detailedEnums);
1849 s_inst.addProperty("detailedServices", &Private::detailedServices);
1850 s_inst.addProperty("detailedInterfaces", &Private::detailedInterfaces);
1851 s_inst.addProperty("detailedConstructors", &Private::detailedConstructors);
1852 s_inst.addProperty("detailedMethods", &Private::detailedMethods);
1853 s_inst.addProperty("detailedRelated", &Private::detailedRelated);
1854 s_inst.addProperty("detailedVariables", &Private::detailedVariables);
1855 s_inst.addProperty("detailedProperties", &Private::detailedProperties);
1856 s_inst.addProperty("detailedEvents", &Private::detailedEvents);
1857 s_inst.addProperty("classes", &Private::classes);
1858 s_inst.addProperty("innerClasses", &Private::innerClasses);
1859 s_inst.addProperty("compoundType", &Private::compoundType);
1860 s_inst.addProperty("templateDecls", &Private::templateDecls);
1861 s_inst.addProperty("typeConstraints", &Private::typeConstraints);
1862 s_inst.addProperty("examples", &Private::examples);
1863 s_inst.addProperty("members", &Private::members);
1864 s_inst.addProperty("allMembersList", &Private::allMembersList);
1865 s_inst.addProperty("allMembersFileName", &Private::allMembersFileName);
1866 s_inst.addProperty("memberGroups", &Private::memberGroups);
1867 s_inst.addProperty("additionalInheritedMembers",&Private::additionalInheritedMembers);
1868 s_inst.addProperty("isSimple", &Private::isSimple);
1869 s_inst.addProperty("categoryOf", &Private::categoryOf);
1872 if (!cd->cookie()) { cd->setCookie(new ClassContext::Private::Cachable(cd)); }
1874 virtual ~Private() {}
1875 TemplateVariant get(const char *n) const
1877 return s_inst.get(this,n);
1879 TemplateVariant title() const
1881 return TemplateVariant(m_classDef->title());
1883 TemplateVariant highlight() const
1885 return TemplateVariant("classes");
1887 TemplateVariant subHighlight() const
1889 return TemplateVariant("");
1891 TemplateVariant hasDetails() const
1893 return m_classDef->hasDetailedDescription();
1895 TemplateVariant generatedFromFiles() const
1897 return m_classDef->generatedFromFiles();
1899 TemplateVariant usedFiles() const
1901 Cachable &cache = getCache();
1902 if (!cache.usedFiles)
1904 cache.usedFiles.reset(UsedFilesContext::alloc(m_classDef));
1906 return cache.usedFiles.get();
1908 DotClassGraph *getClassGraph() const
1910 Cachable &cache = getCache();
1911 if (!cache.classGraph)
1913 cache.classGraph.reset(new DotClassGraph(m_classDef,DotNode::Inheritance));
1915 return cache.classGraph.get();
1917 int numInheritanceNodes() const
1919 Cachable &cache = getCache();
1920 if (cache.inheritanceNodes==-1)
1922 cache.inheritanceNodes=m_classDef->countInheritanceNodes();
1924 return cache.inheritanceNodes>0;
1926 TemplateVariant hasInheritanceDiagram() const
1929 static bool haveDot = Config_getBool(HAVE_DOT);
1930 static bool classDiagrams = Config_getBool(CLASS_DIAGRAMS);
1931 static bool classGraph = Config_getBool(CLASS_GRAPH);
1932 if (haveDot && (classDiagrams || classGraph))
1934 DotClassGraph *cg = getClassGraph();
1935 result = !cg->isTrivial() && !cg->isTooBig();
1937 else if (classDiagrams)
1939 result = numInheritanceNodes()>0;
1943 TemplateVariant inheritanceDiagram() const
1946 static bool haveDot = Config_getBool(HAVE_DOT);
1947 static bool classDiagrams = Config_getBool(CLASS_DIAGRAMS);
1948 static bool classGraph = Config_getBool(CLASS_GRAPH);
1949 if (haveDot && (classDiagrams || classGraph))
1951 DotClassGraph *cg = getClassGraph();
1952 FTextStream t(&result);
1953 switch (g_globals.outputFormat)
1955 case ContextOutputFormat_Html:
1957 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
1958 g_globals.outputDir,
1959 g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension,
1960 relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
1964 case ContextOutputFormat_Latex:
1966 cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
1967 g_globals.outputDir,
1968 g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+".tex",
1969 relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
1973 // TODO: support other generators
1975 err("context.cpp: output format not yet supported");
1978 g_globals.dynSectionId++;
1980 else if (classDiagrams)
1982 ClassDiagram d(m_classDef);
1983 FTextStream t(&result);
1984 switch (g_globals.outputFormat)
1986 case ContextOutputFormat_Html:
1988 QCString name = convertToHtml(m_classDef->displayName());
1989 t << "<div class=\"center\">" << endl;
1991 t << relPathAsString() << m_classDef->getOutputFileBase();
1992 t << ".png\" usemap=\"#" << convertToId(name) << "_map\" alt=\"\"/>" << endl;
1993 t << "<map id=\"" << convertToId(name) << "_map\" name=\"" << convertToId(name) << "_map\">" << endl;
1994 d.writeImage(t,g_globals.outputDir,
1996 m_classDef->getOutputFileBase());
2000 case ContextOutputFormat_Latex:
2002 d.writeFigure(t,g_globals.outputDir,m_classDef->getOutputFileBase());
2005 // TODO: support other generators
2007 err("context.cpp: output format not yet supported");
2010 g_globals.dynSectionId++;
2012 return TemplateVariant(result.data(),TRUE);
2014 DotClassGraph *getCollaborationGraph() const
2016 Cachable &cache = getCache();
2017 if (!cache.collaborationGraph)
2019 cache.collaborationGraph.reset(new DotClassGraph(m_classDef,DotNode::Collaboration));
2021 return cache.collaborationGraph.get();
2023 TemplateVariant hasCollaborationDiagram() const
2025 static bool haveDot = Config_getBool(HAVE_DOT);
2026 return haveDot && !getCollaborationGraph()->isTrivial();
2028 TemplateVariant collaborationDiagram() const
2030 static bool haveDot = Config_getBool(HAVE_DOT);
2034 DotClassGraph *cg = getCollaborationGraph();
2035 FTextStream t(&result);
2036 switch (g_globals.outputFormat)
2038 case ContextOutputFormat_Html:
2040 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
2041 g_globals.outputDir,
2042 g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension,
2043 relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
2047 case ContextOutputFormat_Latex:
2049 cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
2050 g_globals.outputDir,
2051 g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+".tex",
2052 relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
2056 // TODO: support other generators
2058 err("context.cpp: output format not yet supported");
2061 g_globals.dynSectionId++;
2063 return TemplateVariant(result.data(),TRUE);
2066 TemplateVariant includeInfo() const
2068 Cachable &cache = getCache();
2069 if (!cache.includeInfo && m_classDef->includeInfo())
2071 cache.includeInfo.reset(IncludeInfoContext::alloc(m_classDef->includeInfo(),m_classDef->getLanguage()));
2073 if (cache.includeInfo)
2075 return cache.includeInfo.get();
2079 return TemplateVariant(FALSE);
2082 TemplateVariant inherits() const
2084 Cachable &cache = getCache();
2085 if (!cache.inheritsList)
2087 cache.inheritsList.reset(InheritanceListContext::alloc(m_classDef->baseClasses(),TRUE));
2089 return cache.inheritsList.get();
2091 TemplateVariant inheritedBy() const
2093 Cachable &cache = getCache();
2094 if (!cache.inheritedByList)
2096 cache.inheritedByList.reset(InheritanceListContext::alloc(m_classDef->subClasses(),FALSE));
2098 return cache.inheritedByList.get();
2100 TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
2101 MemberListType type,const char *title,bool detailed=FALSE) const
2105 MemberList *ml = m_classDef->getMemberList(type);
2108 list.reset(MemberListInfoContext::alloc(m_classDef,relPathAsString(),ml,title,""));
2117 return TemplateVariant(FALSE);
2120 TemplateVariant unoIDLServices() const
2122 return getMemberList(getCache().unoIDLServices,MemberListType_services,theTranslator->trServices());
2124 TemplateVariant unoIDLInterfaces() const
2126 return getMemberList(getCache().unoIDLInterfaces,MemberListType_interfaces,theTranslator->trInterfaces());
2128 TemplateVariant signals() const
2130 return getMemberList(getCache().signals,MemberListType_signals,theTranslator->trSignals());
2132 TemplateVariant publicTypes() const
2134 return getMemberList(getCache().publicTypes,MemberListType_pubTypes,theTranslator->trPublicTypes());
2136 TemplateVariant publicMethods() const
2138 return getMemberList(getCache().publicMethods,MemberListType_pubMethods,
2139 m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trInstanceMethods()
2140 : theTranslator->trPublicMembers());
2142 TemplateVariant publicStaticMethods() const
2144 return getMemberList(getCache().publicStaticMethods,MemberListType_pubStaticMethods,
2145 m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trClassMethods()
2146 : theTranslator->trStaticPublicMembers());
2148 TemplateVariant publicAttributes() const
2150 return getMemberList(getCache().publicAttributes,MemberListType_pubAttribs,theTranslator->trPublicAttribs());
2152 TemplateVariant publicStaticAttributes() const
2154 return getMemberList(getCache().publicStaticAttributes,MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs());
2156 TemplateVariant publicSlots() const
2158 return getMemberList(getCache().publicSlots,MemberListType_pubSlots,theTranslator->trPublicSlots());
2160 TemplateVariant protectedTypes() const
2162 return getMemberList(getCache().protectedTypes,MemberListType_proTypes,theTranslator->trProtectedTypes());
2164 TemplateVariant protectedMethods() const
2166 return getMemberList(getCache().protectedMethods,MemberListType_proMethods,theTranslator->trProtectedMembers());
2168 TemplateVariant protectedStaticMethods() const
2170 return getMemberList(getCache().protectedStaticMethods,MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers());
2172 TemplateVariant protectedAttributes() const
2174 return getMemberList(getCache().protectedAttributes,MemberListType_proAttribs,theTranslator->trProtectedAttribs());
2176 TemplateVariant protectedStaticAttributes() const
2178 return getMemberList(getCache().protectedStaticAttributes,MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs());
2180 TemplateVariant protectedSlots() const
2182 return getMemberList(getCache().protectedSlots,MemberListType_proSlots,theTranslator->trProtectedSlots());
2184 TemplateVariant privateTypes() const
2186 return getMemberList(getCache().privateTypes,MemberListType_priTypes,theTranslator->trPrivateTypes());
2188 TemplateVariant privateSlots() const
2190 return getMemberList(getCache().privateSlots,MemberListType_priSlots,theTranslator->trPrivateSlots());
2192 TemplateVariant privateMethods() const
2194 return getMemberList(getCache().privateMethods,MemberListType_priMethods,theTranslator->trPrivateMembers());
2196 TemplateVariant privateStaticMethods() const
2198 return getMemberList(getCache().privateStaticMethods,MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers());
2200 TemplateVariant privateAttributes() const
2202 return getMemberList(getCache().privateAttributes,MemberListType_priAttribs,theTranslator->trPrivateAttribs());
2204 TemplateVariant privateStaticAttributes() const
2206 return getMemberList(getCache().privateStaticAttributes,MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs());
2208 TemplateVariant packageTypes() const
2210 return getMemberList(getCache().packageTypes,MemberListType_pacTypes,theTranslator->trPackageTypes());
2212 TemplateVariant packageMethods() const
2214 return getMemberList(getCache().packageMethods,MemberListType_pacMethods,theTranslator->trPackageMembers());
2216 TemplateVariant packageStaticMethods() const
2218 return getMemberList(getCache().packageStaticMethods,MemberListType_pacStaticMethods,theTranslator->trStaticPackageMembers());
2220 TemplateVariant packageAttributes() const
2222 return getMemberList(getCache().packageAttributes,MemberListType_pacAttribs,theTranslator->trPackageAttribs());
2224 TemplateVariant packageStaticAttributes() const
2226 return getMemberList(getCache().packageStaticAttributes,MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs());
2228 TemplateVariant properties() const
2230 return getMemberList(getCache().properties,MemberListType_properties,theTranslator->trProperties());
2232 TemplateVariant events() const
2234 return getMemberList(getCache().events,MemberListType_events,theTranslator->trEvents());
2236 TemplateVariant friends() const
2238 return getMemberList(getCache().friends,MemberListType_friends,theTranslator->trFriends());
2240 TemplateVariant related() const
2242 return getMemberList(getCache().related,MemberListType_related,theTranslator->trRelatedFunctions());
2244 TemplateVariant detailedTypedefs() const
2246 return getMemberList(getCache().detailedTypedefs,MemberListType_typedefMembers,theTranslator->trMemberTypedefDocumentation(),TRUE);
2248 TemplateVariant detailedEnums() const
2250 return getMemberList(getCache().detailedEnums,MemberListType_enumMembers,theTranslator->trMemberEnumerationDocumentation(),TRUE);
2252 TemplateVariant detailedServices() const
2254 return getMemberList(getCache().detailedServices,MemberListType_serviceMembers,theTranslator->trServices(),TRUE);
2256 TemplateVariant detailedInterfaces() const
2258 return getMemberList(getCache().detailedInterfaces,MemberListType_interfaceMembers,theTranslator->trInterfaces(),TRUE);
2260 TemplateVariant detailedConstructors() const
2262 return getMemberList(getCache().detailedConstructors,MemberListType_constructors,theTranslator->trConstructorDocumentation(),TRUE);
2264 TemplateVariant detailedMethods() const
2266 return getMemberList(getCache().detailedMethods,MemberListType_functionMembers,theTranslator->trMemberFunctionDocumentation(),TRUE);
2268 TemplateVariant detailedRelated() const
2270 return getMemberList(getCache().detailedRelated,MemberListType_relatedMembers,theTranslator->trRelatedFunctionDocumentation(),TRUE);
2272 TemplateVariant detailedVariables() const
2274 return getMemberList(getCache().detailedVariables,MemberListType_variableMembers,theTranslator->trMemberDataDocumentation(),TRUE);
2276 TemplateVariant detailedProperties() const
2278 return getMemberList(getCache().detailedProperties,MemberListType_propertyMembers,theTranslator->trPropertyDocumentation(),TRUE);
2280 TemplateVariant detailedEvents() const
2282 return getMemberList(getCache().detailedEvents,MemberListType_eventMembers,theTranslator->trEventDocumentation(),TRUE);
2284 TemplateVariant classes() const
2286 Cachable &cache = getCache();
2289 TemplateList *classList = TemplateList::alloc();
2290 if (m_classDef->getClassSDict())
2292 ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
2294 for (sdi.toFirst();(cd=sdi.current());++sdi)
2296 if (cd->visibleInParentsDeclList())
2298 classList->append(ClassContext::alloc(cd));
2302 cache.classes.reset(classList);
2304 return cache.classes.get();
2306 TemplateVariant innerClasses() const
2308 Cachable &cache = getCache();
2309 if (!cache.innerClasses)
2311 TemplateList *classList = TemplateList::alloc();
2312 if (m_classDef->getClassSDict())
2314 ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
2316 for (sdi.toFirst();(cd=sdi.current());++sdi)
2318 if (cd->name().find('@')==-1 &&
2319 cd->isLinkableInProject() &&
2320 cd->isEmbeddedInOuterScope() &&
2321 cd->partOfGroups()==0
2324 classList->append(ClassContext::alloc(cd));
2328 cache.innerClasses.reset(classList);
2330 return cache.innerClasses.get();
2332 TemplateVariant compoundType() const
2334 return m_classDef->compoundTypeString();
2336 void addTemplateDecls(Definition *d,TemplateList *tl) const
2338 if (d->definitionType()==Definition::TypeClass)
2340 Definition *parent = d->getOuterScope();
2343 addTemplateDecls(parent,tl);
2345 ClassDef *cd=(ClassDef *)d;
2346 if (cd->templateArguments())
2348 ArgumentListContext *al = ArgumentListContext::alloc(cd->templateArguments(),cd,relPathAsString());
2349 // since a TemplateVariant does take ownership of the object, we add it
2350 // a separate list just to be able to delete it and avoid a memory leak
2355 void addExamples(TemplateList *list) const
2357 if (m_classDef->hasExamples())
2359 ExampleSDict::Iterator it(*m_classDef->exampleList());
2361 for (it.toFirst();(ex=it.current());++it)
2363 TemplateStruct *s = TemplateStruct::alloc();
2364 s->set("text",ex->name);
2365 s->set("isLinkable",TRUE);
2366 s->set("anchor",ex->anchor);
2367 s->set("fileName",ex->file);
2368 s->set("isReference",FALSE);
2369 s->set("externalReference","");
2374 TemplateVariant templateDecls() const
2376 Cachable &cache = getCache();
2377 if (!cache.templateDecls)
2379 TemplateList *tl = TemplateList::alloc();
2380 addTemplateDecls(m_classDef,tl);
2381 cache.templateDecls.reset(tl);
2383 return cache.templateDecls.get();
2385 TemplateVariant typeConstraints() const
2387 if (m_classDef->typeConstraints())
2389 Cachable &cache = getCache();
2390 if (!cache.typeConstraints && m_classDef->typeConstraints())
2392 cache.typeConstraints.reset(ArgumentListContext::alloc(m_classDef->typeConstraints(),m_classDef,relPathAsString()));
2394 return cache.typeConstraints.get();
2398 TemplateVariant examples() const
2400 Cachable &cache = getCache();
2401 if (!cache.examples)
2403 TemplateList *exampleList = TemplateList::alloc();
2404 addExamples(exampleList);
2405 cache.examples.reset(exampleList);
2407 return cache.examples.get();
2409 void addMembers(ClassDef *cd,MemberListType lt) const
2411 MemberList *ml = cd->getMemberList(lt);
2414 Cachable &cache = getCache();
2415 MemberListIterator li(*ml);
2416 const MemberDef *md;
2417 for (li.toFirst();(md=li.current());++li)
2419 if (md->isBriefSectionVisible())
2421 cache.allMembers.append(md);
2426 TemplateVariant members() const
2428 Cachable &cache = getCache();
2431 addMembers(m_classDef,MemberListType_pubTypes);
2432 addMembers(m_classDef,MemberListType_services);
2433 addMembers(m_classDef,MemberListType_interfaces);
2434 addMembers(m_classDef,MemberListType_pubSlots);
2435 addMembers(m_classDef,MemberListType_signals);
2436 addMembers(m_classDef,MemberListType_pubMethods);
2437 addMembers(m_classDef,MemberListType_pubStaticMethods);
2438 addMembers(m_classDef,MemberListType_pubAttribs);
2439 addMembers(m_classDef,MemberListType_pubStaticAttribs);
2440 addMembers(m_classDef,MemberListType_proTypes);
2441 addMembers(m_classDef,MemberListType_proSlots);
2442 addMembers(m_classDef,MemberListType_proMethods);
2443 addMembers(m_classDef,MemberListType_proStaticMethods);
2444 addMembers(m_classDef,MemberListType_proAttribs);
2445 addMembers(m_classDef,MemberListType_proStaticAttribs);
2446 addMembers(m_classDef,MemberListType_pacTypes);
2447 addMembers(m_classDef,MemberListType_pacMethods);
2448 addMembers(m_classDef,MemberListType_pacStaticMethods);
2449 addMembers(m_classDef,MemberListType_pacAttribs);
2450 addMembers(m_classDef,MemberListType_pacStaticAttribs);
2451 addMembers(m_classDef,MemberListType_properties);
2452 addMembers(m_classDef,MemberListType_events);
2453 addMembers(m_classDef,MemberListType_priTypes);
2454 addMembers(m_classDef,MemberListType_priSlots);
2455 addMembers(m_classDef,MemberListType_priMethods);
2456 addMembers(m_classDef,MemberListType_priStaticMethods);
2457 addMembers(m_classDef,MemberListType_priAttribs);
2458 addMembers(m_classDef,MemberListType_priStaticAttribs);
2459 addMembers(m_classDef,MemberListType_related);
2460 cache.members.reset(MemberListContext::alloc(&cache.allMembers));
2462 return cache.members.get();
2464 TemplateVariant allMembersList() const
2466 Cachable &cache = getCache();
2467 if (!cache.allMembersList)
2469 if (m_classDef->memberNameInfoSDict())
2471 AllMembersListContext *ml = AllMembersListContext::alloc(m_classDef->memberNameInfoSDict());
2472 cache.allMembersList.reset(ml);
2476 cache.allMembersList.reset(AllMembersListContext::alloc());
2479 return cache.allMembersList.get();
2481 TemplateVariant allMembersFileName() const
2483 return m_classDef->getMemberListFileName();
2485 TemplateVariant memberGroups() const
2487 Cachable &cache = getCache();
2488 if (!cache.memberGroups)
2490 if (m_classDef->getMemberGroupSDict())
2492 cache.memberGroups.reset(MemberGroupListContext::alloc(m_classDef,relPathAsString(),m_classDef->getMemberGroupSDict(),m_classDef->subGrouping()));
2496 cache.memberGroups.reset(MemberGroupListContext::alloc());
2499 return cache.memberGroups.get();
2501 TemplateVariant additionalInheritedMembers() const
2503 Cachable &cache = getCache();
2504 if (!cache.additionalInheritedMembers)
2506 InheritedMemberInfoListContext *ctx = InheritedMemberInfoListContext::alloc();
2507 ctx->addMemberList(m_classDef,MemberListType_pubTypes,theTranslator->trPublicTypes());
2508 ctx->addMemberList(m_classDef,MemberListType_services,theTranslator->trServices());
2509 ctx->addMemberList(m_classDef,MemberListType_interfaces,theTranslator->trInterfaces());
2510 ctx->addMemberList(m_classDef,MemberListType_pubSlots,theTranslator->trPublicSlots());
2511 ctx->addMemberList(m_classDef,MemberListType_signals,theTranslator->trSignals());
2512 ctx->addMemberList(m_classDef,MemberListType_pubMethods,
2513 m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trInstanceMethods()
2514 : theTranslator->trPublicMembers());
2515 ctx->addMemberList(m_classDef,MemberListType_pubStaticMethods,
2516 m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trClassMethods()
2517 : theTranslator->trStaticPublicMembers());
2518 ctx->addMemberList(m_classDef,MemberListType_pubAttribs,theTranslator->trPublicAttribs());
2519 ctx->addMemberList(m_classDef,MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs());
2520 ctx->addMemberList(m_classDef,MemberListType_proTypes,theTranslator->trProtectedTypes());
2521 ctx->addMemberList(m_classDef,MemberListType_proSlots,theTranslator->trProtectedSlots());
2522 ctx->addMemberList(m_classDef,MemberListType_proMethods,theTranslator->trProtectedMembers());
2523 ctx->addMemberList(m_classDef,MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers());
2524 ctx->addMemberList(m_classDef,MemberListType_proAttribs,theTranslator->trProtectedAttribs());
2525 ctx->addMemberList(m_classDef,MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs());
2526 ctx->addMemberList(m_classDef,MemberListType_pacTypes,theTranslator->trPackageTypes());
2527 ctx->addMemberList(m_classDef,MemberListType_pacMethods,theTranslator->trPackageMembers());
2528 ctx->addMemberList(m_classDef,MemberListType_pacStaticMethods,theTranslator->trStaticPackageMembers());
2529 ctx->addMemberList(m_classDef,MemberListType_pacAttribs,theTranslator->trPackageAttribs());
2530 ctx->addMemberList(m_classDef,MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs());
2531 ctx->addMemberList(m_classDef,MemberListType_properties,theTranslator->trProperties());
2532 ctx->addMemberList(m_classDef,MemberListType_events,theTranslator->trEvents());
2533 ctx->addMemberList(m_classDef,MemberListType_priTypes,theTranslator->trPrivateTypes());
2534 ctx->addMemberList(m_classDef,MemberListType_priSlots,theTranslator->trPrivateSlots());
2535 ctx->addMemberList(m_classDef,MemberListType_priMethods,theTranslator->trPrivateMembers());
2536 ctx->addMemberList(m_classDef,MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers());
2537 ctx->addMemberList(m_classDef,MemberListType_priAttribs,theTranslator->trPrivateAttribs());
2538 ctx->addMemberList(m_classDef,MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs());
2539 ctx->addMemberList(m_classDef,MemberListType_related,theTranslator->trRelatedFunctions());
2540 cache.additionalInheritedMembers.reset(ctx);
2542 return cache.additionalInheritedMembers.get();
2544 TemplateVariant isSimple() const
2546 return m_classDef->isSimple();
2548 TemplateVariant categoryOf() const
2550 Cachable &cache = getCache();
2551 if (!cache.categoryOf && m_classDef->categoryOf())
2553 cache.categoryOf.reset(ClassContext::alloc(m_classDef->categoryOf()));
2555 if (cache.categoryOf)
2557 return cache.categoryOf.get();
2561 return TemplateVariant(FALSE);
2566 ClassDef *m_classDef;
2567 struct Cachable : public DefinitionContext<ClassContext::Private>::Cachable
2569 Cachable(ClassDef *cd) : DefinitionContext<ClassContext::Private>::Cachable(cd),
2570 inheritanceNodes(-1) { }
2571 SharedPtr<IncludeInfoContext> includeInfo;
2572 SharedPtr<InheritanceListContext> inheritsList;
2573 SharedPtr<InheritanceListContext> inheritedByList;
2574 ScopedPtr<DotClassGraph> classGraph;
2575 ScopedPtr<DotClassGraph> collaborationGraph;
2576 SharedPtr<TemplateList> classes;
2577 SharedPtr<TemplateList> innerClasses;
2578 SharedPtr<MemberListInfoContext> publicTypes;
2579 SharedPtr<MemberListInfoContext> publicMethods;
2580 SharedPtr<MemberListInfoContext> publicStaticMethods;
2581 SharedPtr<MemberListInfoContext> publicAttributes;
2582 SharedPtr<MemberListInfoContext> publicStaticAttributes;
2583 SharedPtr<MemberListInfoContext> publicSlots;
2584 SharedPtr<MemberListInfoContext> protectedTypes;
2585 SharedPtr<MemberListInfoContext> protectedMethods;
2586 SharedPtr<MemberListInfoContext> protectedStaticMethods;
2587 SharedPtr<MemberListInfoContext> protectedAttributes;
2588 SharedPtr<MemberListInfoContext> protectedStaticAttributes;
2589 SharedPtr<MemberListInfoContext> protectedSlots;
2590 SharedPtr<MemberListInfoContext> privateTypes;
2591 SharedPtr<MemberListInfoContext> privateMethods;
2592 SharedPtr<MemberListInfoContext> privateStaticMethods;
2593 SharedPtr<MemberListInfoContext> privateAttributes;
2594 SharedPtr<MemberListInfoContext> privateStaticAttributes;
2595 SharedPtr<MemberListInfoContext> privateSlots;
2596 SharedPtr<MemberListInfoContext> packageTypes;
2597 SharedPtr<MemberListInfoContext> packageMethods;
2598 SharedPtr<MemberListInfoContext> packageStaticMethods;
2599 SharedPtr<MemberListInfoContext> packageAttributes;
2600 SharedPtr<MemberListInfoContext> packageStaticAttributes;
2601 SharedPtr<MemberListInfoContext> unoIDLServices;
2602 SharedPtr<MemberListInfoContext> unoIDLInterfaces;
2603 SharedPtr<MemberListInfoContext> signals;
2604 SharedPtr<MemberListInfoContext> properties;
2605 SharedPtr<MemberListInfoContext> events;
2606 SharedPtr<MemberListInfoContext> friends;
2607 SharedPtr<MemberListInfoContext> related;
2608 SharedPtr<MemberListInfoContext> detailedTypedefs;
2609 SharedPtr<MemberListInfoContext> detailedEnums;
2610 SharedPtr<MemberListInfoContext> detailedServices;
2611 SharedPtr<MemberListInfoContext> detailedInterfaces;
2612 SharedPtr<MemberListInfoContext> detailedConstructors;
2613 SharedPtr<MemberListInfoContext> detailedMethods;
2614 SharedPtr<MemberListInfoContext> detailedRelated;
2615 SharedPtr<MemberListInfoContext> detailedVariables;
2616 SharedPtr<MemberListInfoContext> detailedProperties;
2617 SharedPtr<MemberListInfoContext> detailedEvents;
2618 SharedPtr<MemberGroupListContext> memberGroups;
2619 SharedPtr<AllMembersListContext> allMembersList;
2620 SharedPtr<ArgumentListContext> typeConstraints;
2621 SharedPtr<TemplateList> examples;
2622 SharedPtr<TemplateList> templateDecls;
2623 SharedPtr<InheritedMemberInfoListContext> additionalInheritedMembers;
2624 SharedPtr<MemberListContext> members;
2625 SharedPtr<UsedFilesContext> usedFiles;
2626 SharedPtr<TemplateList> exampleList;
2627 SharedPtr<ClassContext> categoryOf;
2628 int inheritanceNodes;
2629 MemberList allMembers;
2631 Cachable &getCache() const
2633 Cachable *c = static_cast<Cachable*>(m_classDef->cookie());
2637 static PropertyMapper<ClassContext::Private> s_inst;
2641 PropertyMapper<ClassContext::Private> ClassContext::Private::s_inst;
2643 ClassContext::ClassContext(ClassDef *cd) : RefCountedContext("ClassContext")
2645 //printf("ClassContext::ClassContext(%s)\n",cd?cd->name().data():"<none>");
2646 p = new Private(cd);
2649 ClassContext::~ClassContext()
2654 TemplateVariant ClassContext::get(const char *n) const
2659 //------------------------------------------------------------------------
2661 //%% struct Namespace(Symbol): namespace information
2663 class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Private>
2666 Private(NamespaceDef *nd) : DefinitionContext<NamespaceContext::Private>(nd),
2669 static bool init=FALSE;
2672 addBaseProperties(s_inst);
2673 s_inst.addProperty("title", &Private::title);
2674 s_inst.addProperty("highlight", &Private::highlight);
2675 s_inst.addProperty("subhighlight", &Private::subHighlight);
2676 s_inst.addProperty("compoundType", &Private::compoundType);
2677 s_inst.addProperty("hasDetails", &Private::hasDetails);
2678 s_inst.addProperty("classes", &Private::classes);
2679 s_inst.addProperty("namespaces", &Private::namespaces);
2680 s_inst.addProperty("constantgroups", &Private::constantgroups);
2681 s_inst.addProperty("typedefs", &Private::typedefs);
2682 s_inst.addProperty("enums", &Private::enums);
2683 s_inst.addProperty("functions", &Private::functions);
2684 s_inst.addProperty("variables", &Private::variables);
2685 s_inst.addProperty("memberGroups", &Private::memberGroups);
2686 s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
2687 s_inst.addProperty("detailedEnums", &Private::detailedEnums);
2688 s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
2689 s_inst.addProperty("detailedVariables", &Private::detailedVariables);
2690 s_inst.addProperty("inlineClasses", &Private::inlineClasses);
2693 if (!nd->cookie()) { nd->setCookie(new NamespaceContext::Private::Cachable(nd)); }
2695 virtual ~Private() {}
2696 TemplateVariant get(const char *n) const
2698 return s_inst.get(this,n);
2700 TemplateVariant title() const
2702 return TemplateVariant(m_namespaceDef->title());
2704 TemplateVariant highlight() const
2706 return TemplateVariant("namespaces");
2708 TemplateVariant subHighlight() const
2710 return TemplateVariant("");
2712 TemplateVariant compoundType() const
2714 return m_namespaceDef->compoundTypeString();
2716 TemplateVariant hasDetails() const
2718 return m_namespaceDef->hasDetailedDescription();
2720 TemplateVariant classes() const
2722 Cachable &cache = getCache();
2725 TemplateList *classList = TemplateList::alloc();
2726 if (m_namespaceDef->getClassSDict())
2728 ClassSDict::Iterator sdi(*m_namespaceDef->getClassSDict());
2730 for (sdi.toFirst();(cd=sdi.current());++sdi)
2732 if (cd->visibleInParentsDeclList())
2734 classList->append(ClassContext::alloc(cd));
2738 cache.classes.reset(classList);
2740 return cache.classes.get();
2742 TemplateVariant namespaces() const
2744 Cachable &cache = getCache();
2745 if (!cache.namespaces)
2747 TemplateList *namespaceList = TemplateList::alloc();
2748 if (m_namespaceDef->getNamespaceSDict())
2750 NamespaceSDict::Iterator sdi(*m_namespaceDef->getNamespaceSDict());
2752 for (sdi.toFirst();(nd=sdi.current());++sdi)
2754 if (nd->isLinkable() && !nd->isConstantGroup())
2756 namespaceList->append(NamespaceContext::alloc(nd));
2760 cache.namespaces.reset(namespaceList);
2762 return cache.namespaces.get();
2764 TemplateVariant constantgroups() const
2766 Cachable &cache = getCache();
2767 if (!cache.constantgroups)
2769 TemplateList *namespaceList = TemplateList::alloc();
2770 if (m_namespaceDef->getNamespaceSDict())
2772 NamespaceSDict::Iterator sdi(*m_namespaceDef->getNamespaceSDict());
2774 for (sdi.toFirst();(nd=sdi.current());++sdi)
2776 if (nd->isLinkable() && nd->isConstantGroup())
2778 namespaceList->append(NamespaceContext::alloc(nd));
2782 cache.constantgroups.reset(namespaceList);
2784 return cache.constantgroups.get();
2786 TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
2787 MemberListType type,const char *title,bool detailed=FALSE) const
2791 MemberList *ml = m_namespaceDef->getMemberList(type);
2794 list.reset(MemberListInfoContext::alloc(m_namespaceDef,relPathAsString(),ml,title,""));
2803 return TemplateVariant(FALSE);
2806 TemplateVariant typedefs() const
2808 return getMemberList(getCache().typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
2810 TemplateVariant enums() const
2812 return getMemberList(getCache().enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
2814 TemplateVariant functions() const
2816 QCString title = theTranslator->trFunctions();
2817 SrcLangExt lang = m_namespaceDef->getLanguage();
2818 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
2819 else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc();
2820 return getMemberList(getCache().functions,MemberListType_decFuncMembers,title);
2822 TemplateVariant variables() const
2824 return getMemberList(getCache().variables,MemberListType_decVarMembers,theTranslator->trVariables());
2826 TemplateVariant memberGroups() const
2828 Cachable &cache = getCache();
2829 if (!cache.memberGroups)
2831 if (m_namespaceDef->getMemberGroupSDict())
2833 cache.memberGroups.reset(MemberGroupListContext::alloc(m_namespaceDef,relPathAsString(),m_namespaceDef->getMemberGroupSDict(),m_namespaceDef->subGrouping()));
2837 cache.memberGroups.reset(MemberGroupListContext::alloc());
2840 return cache.memberGroups.get();
2842 TemplateVariant detailedTypedefs() const
2844 return getMemberList(getCache().detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
2846 TemplateVariant detailedEnums() const
2848 return getMemberList(getCache().detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
2850 TemplateVariant detailedFunctions() const
2852 QCString title = theTranslator->trFunctionDocumentation();
2853 SrcLangExt lang = m_namespaceDef->getLanguage();
2854 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation();
2855 return getMemberList(getCache().detailedFunctions,MemberListType_docFuncMembers,title);
2857 TemplateVariant detailedVariables() const
2859 return getMemberList(getCache().detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
2861 TemplateVariant inlineClasses() const
2863 Cachable &cache = getCache();
2864 if (!cache.inlineClasses)
2866 TemplateList *classList = TemplateList::alloc();
2867 if (m_namespaceDef->getClassSDict())
2869 ClassSDict::Iterator sdi(*m_namespaceDef->getClassSDict());
2871 for (sdi.toFirst();(cd=sdi.current());++sdi)
2873 if (cd->name().find('@')==-1 &&
2874 cd->isLinkableInProject() &&
2875 cd->isEmbeddedInOuterScope() &&
2876 cd->partOfGroups()==0)
2878 classList->append(ClassContext::alloc(cd));
2882 cache.inlineClasses.reset(classList);
2884 return cache.inlineClasses.get();
2887 NamespaceDef *m_namespaceDef;
2888 struct Cachable : public DefinitionContext<NamespaceContext::Private>::Cachable
2890 Cachable(NamespaceDef *nd) : DefinitionContext<NamespaceContext::Private>::Cachable(nd) {}
2891 SharedPtr<TemplateList> classes;
2892 SharedPtr<TemplateList> namespaces;
2893 SharedPtr<TemplateList> constantgroups;
2894 SharedPtr<MemberListInfoContext> typedefs;
2895 SharedPtr<MemberListInfoContext> enums;
2896 SharedPtr<MemberListInfoContext> functions;
2897 SharedPtr<MemberListInfoContext> variables;
2898 SharedPtr<MemberGroupListContext> memberGroups;
2899 SharedPtr<MemberListInfoContext> detailedTypedefs;
2900 SharedPtr<MemberListInfoContext> detailedEnums;
2901 SharedPtr<MemberListInfoContext> detailedFunctions;
2902 SharedPtr<MemberListInfoContext> detailedVariables;
2903 SharedPtr<TemplateList> inlineClasses;
2905 Cachable &getCache() const
2907 Cachable *c = static_cast<Cachable*>(m_namespaceDef->cookie());
2911 static PropertyMapper<NamespaceContext::Private> s_inst;
2915 PropertyMapper<NamespaceContext::Private> NamespaceContext::Private::s_inst;
2917 NamespaceContext::NamespaceContext(NamespaceDef *nd) : RefCountedContext("NamespaceContext")
2919 p = new Private(nd);
2922 NamespaceContext::~NamespaceContext()
2927 TemplateVariant NamespaceContext::get(const char *n) const
2932 //------------------------------------------------------------------------
2934 //%% struct File(Symbol): file information
2936 class FileContext::Private : public DefinitionContext<FileContext::Private>
2939 Private(FileDef *fd) : DefinitionContext<FileContext::Private>(fd) , m_fileDef(fd)
2942 static bool init=FALSE;
2945 addBaseProperties(s_inst);
2946 s_inst.addProperty("title", &Private::title);
2947 s_inst.addProperty("highlight", &Private::highlight);
2948 s_inst.addProperty("subhighlight", &Private::subHighlight);
2949 s_inst.addProperty("versionInfo", &Private::versionInfo);
2950 s_inst.addProperty("includeList", &Private::includeList);
2951 s_inst.addProperty("hasIncludeGraph", &Private::hasIncludeGraph);
2952 s_inst.addProperty("hasIncludedByGraph", &Private::hasIncludedByGraph);
2953 s_inst.addProperty("includeGraph", &Private::includeGraph);
2954 s_inst.addProperty("includedByGraph", &Private::includedByGraph);
2955 s_inst.addProperty("hasDetails", &Private::hasDetails);
2956 s_inst.addProperty("hasSourceFile", &Private::hasSourceFile);
2957 s_inst.addProperty("sources", &Private::sources);
2958 s_inst.addProperty("version", &Private::version);
2959 s_inst.addProperty("classes", &Private::classes);
2960 s_inst.addProperty("namespaces", &Private::namespaces);
2961 s_inst.addProperty("constantgroups", &Private::constantgroups);
2962 s_inst.addProperty("macros", &Private::macros);
2963 s_inst.addProperty("typedefs", &Private::typedefs);
2964 s_inst.addProperty("enums", &Private::enums);
2965 s_inst.addProperty("functions", &Private::functions);
2966 s_inst.addProperty("variables", &Private::variables);
2967 s_inst.addProperty("memberGroups", &Private::memberGroups);
2968 s_inst.addProperty("detailedMacros", &Private::detailedMacros);
2969 s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
2970 s_inst.addProperty("detailedEnums", &Private::detailedEnums);
2971 s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
2972 s_inst.addProperty("detailedVariables", &Private::detailedVariables);
2973 s_inst.addProperty("inlineClasses", &Private::inlineClasses);
2974 s_inst.addProperty("compoundType", &Private::compoundType);
2977 if (!fd->cookie()) { fd->setCookie(new FileContext::Private::Cachable(fd)); }
2979 virtual ~Private() {}
2980 TemplateVariant get(const char *n) const
2982 return s_inst.get(this,n);
2984 TemplateVariant title() const
2986 return m_fileDef->title();
2988 TemplateVariant highlight() const
2990 return TemplateVariant("files");
2992 TemplateVariant subHighlight() const
2994 return TemplateVariant("");
2996 TemplateVariant versionInfo() const
2998 return m_fileDef->getVersion();
3000 TemplateVariant includeList() const
3002 Cachable &cache = getCache();
3003 if (!cache.includeInfoList && m_fileDef->includeFileList())
3005 cache.includeInfoList.reset(IncludeInfoListContext::alloc(
3006 *m_fileDef->includeFileList(),m_fileDef->getLanguage()));
3008 if (cache.includeInfoList)
3010 return cache.includeInfoList.get();
3014 return TemplateVariant(FALSE);
3017 DotInclDepGraph *getIncludeGraph() const
3019 Cachable &cache = getCache();
3020 if (!cache.includeGraph)
3022 cache.includeGraph.reset(new DotInclDepGraph(m_fileDef,FALSE));
3024 return cache.includeGraph.get();
3026 TemplateVariant hasIncludeGraph() const
3028 static bool haveDot = Config_getBool(HAVE_DOT);
3029 DotInclDepGraph *incGraph = getIncludeGraph();
3030 return (haveDot && !incGraph->isTooBig() && !incGraph->isTrivial());
3032 TemplateVariant includeGraph() const
3034 static bool haveDot = Config_getBool(HAVE_DOT);
3038 DotInclDepGraph *cg = getIncludeGraph();
3039 FTextStream t(&result);
3040 switch (g_globals.outputFormat)
3042 case ContextOutputFormat_Html:
3044 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
3045 g_globals.outputDir,
3046 g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
3047 relPathAsString(),TRUE,g_globals.dynSectionId
3051 case ContextOutputFormat_Latex:
3053 cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
3054 g_globals.outputDir,
3055 g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+".tex",
3056 relPathAsString(),TRUE,g_globals.dynSectionId
3060 // TODO: support other generators
3062 err("context.cpp: output format not yet supported");
3065 g_globals.dynSectionId++;
3067 return TemplateVariant(result.data(),TRUE);
3069 DotInclDepGraph *getIncludedByGraph() const
3071 Cachable &cache = getCache();
3072 if (!cache.includedByGraph)
3074 cache.includedByGraph.reset(new DotInclDepGraph(m_fileDef,TRUE));
3076 return cache.includedByGraph.get();
3078 TemplateVariant hasIncludedByGraph() const
3080 static bool haveDot = Config_getBool(HAVE_DOT);
3081 DotInclDepGraph *incGraph = getIncludedByGraph();
3082 return (haveDot && !incGraph->isTooBig() && !incGraph->isTrivial());
3084 TemplateVariant includedByGraph() const
3086 static bool haveDot = Config_getBool(HAVE_DOT);
3090 DotInclDepGraph *cg = getIncludedByGraph();
3091 FTextStream t(&result);
3092 switch (g_globals.outputFormat)
3094 case ContextOutputFormat_Html:
3096 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
3097 g_globals.outputDir,
3098 g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
3099 relPathAsString(),TRUE,g_globals.dynSectionId
3103 case ContextOutputFormat_Latex:
3105 cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
3106 g_globals.outputDir,
3107 g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+".tex",
3108 relPathAsString(),TRUE,g_globals.dynSectionId
3112 // TODO: support other generators
3114 err("context.cpp: output format not yet supported");
3117 g_globals.dynSectionId++;
3119 return TemplateVariant(result.data(),TRUE);
3121 TemplateVariant hasDetails() const
3123 return m_fileDef->hasDetailedDescription();
3125 TemplateVariant hasSourceFile() const
3127 return m_fileDef->generateSourceFile();
3129 TemplateVariant sources() const
3131 Cachable &cache = getCache();
3134 if (m_fileDef->generateSourceFile())
3136 cache.sources.reset(new TemplateVariant(parseCode(m_fileDef,relPathAsString())));
3140 cache.sources.reset(new TemplateVariant(""));
3143 return *cache.sources;
3145 TemplateVariant version() const
3147 return m_fileDef->fileVersion();
3149 TemplateVariant classes() const
3151 Cachable &cache = getCache();
3154 TemplateList *classList = TemplateList::alloc();
3155 if (m_fileDef->getClassSDict())
3157 ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
3159 for (sdi.toFirst();(cd=sdi.current());++sdi)
3161 if (cd->visibleInParentsDeclList())
3163 classList->append(ClassContext::alloc(cd));
3167 cache.classes.reset(classList);
3169 return cache.classes.get();
3171 TemplateVariant namespaces() const
3173 Cachable &cache = getCache();
3174 if (!cache.namespaces)
3176 TemplateList *namespaceList = TemplateList::alloc();
3177 if (m_fileDef->getNamespaceSDict())
3179 NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict());
3181 for (sdi.toFirst();(nd=sdi.current());++sdi)
3183 if (nd->isLinkable() && !nd->isConstantGroup())
3185 namespaceList->append(NamespaceContext::alloc(nd));
3189 cache.namespaces.reset(namespaceList);
3191 return cache.namespaces.get();
3193 TemplateVariant constantgroups() const
3195 Cachable &cache = getCache();
3196 if (!cache.constantgroups)
3198 TemplateList *namespaceList = TemplateList::alloc();
3199 if (m_fileDef->getNamespaceSDict())
3201 NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict());
3203 for (sdi.toFirst();(nd=sdi.current());++sdi)
3205 if (nd->isLinkable() && nd->isConstantGroup())
3207 namespaceList->append(NamespaceContext::alloc(nd));
3211 cache.constantgroups.reset(namespaceList);
3213 return cache.constantgroups.get();
3215 TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
3216 MemberListType type,const char *title,bool detailed=FALSE) const
3220 MemberList *ml = m_fileDef->getMemberList(type);
3223 list.reset(MemberListInfoContext::alloc(m_fileDef,relPathAsString(),ml,title,""));
3232 return TemplateVariant(FALSE);
3235 TemplateVariant macros() const
3237 return getMemberList(getCache().macros,MemberListType_decDefineMembers,theTranslator->trDefines());
3239 TemplateVariant typedefs() const
3241 return getMemberList(getCache().typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
3243 TemplateVariant enums() const
3245 return getMemberList(getCache().enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
3247 TemplateVariant functions() const
3249 QCString title = theTranslator->trFunctions();
3250 SrcLangExt lang = m_fileDef->getLanguage();
3251 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
3252 else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc();
3253 return getMemberList(getCache().functions,MemberListType_decFuncMembers,title);
3255 TemplateVariant variables() const
3257 return getMemberList(getCache().variables,MemberListType_decVarMembers,theTranslator->trVariables());
3259 TemplateVariant memberGroups() const
3261 Cachable &cache = getCache();
3262 if (!cache.memberGroups)
3264 if (m_fileDef->getMemberGroupSDict())
3266 cache.memberGroups.reset(MemberGroupListContext::alloc(m_fileDef,relPathAsString(),m_fileDef->getMemberGroupSDict(),m_fileDef->subGrouping()));
3270 cache.memberGroups.reset(MemberGroupListContext::alloc());
3273 return cache.memberGroups.get();
3275 TemplateVariant detailedMacros() const
3277 return getMemberList(getCache().detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation());
3279 TemplateVariant detailedTypedefs() const
3281 return getMemberList(getCache().detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
3283 TemplateVariant detailedEnums() const
3285 return getMemberList(getCache().detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
3287 TemplateVariant detailedFunctions() const
3289 QCString title = theTranslator->trFunctionDocumentation();
3290 SrcLangExt lang = m_fileDef->getLanguage();
3291 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation();
3292 return getMemberList(getCache().detailedFunctions,MemberListType_docFuncMembers,title);
3294 TemplateVariant detailedVariables() const
3296 return getMemberList(getCache().detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
3298 TemplateVariant inlineClasses() const
3300 Cachable &cache = getCache();
3301 if (!cache.inlineClasses)
3303 TemplateList *classList = TemplateList::alloc();
3304 if (m_fileDef->getClassSDict())
3306 ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
3308 for (sdi.toFirst();(cd=sdi.current());++sdi)
3310 if (cd->name().find('@')==-1 &&
3311 cd->isLinkableInProject() &&
3312 cd->isEmbeddedInOuterScope() &&
3313 cd->partOfGroups()==0)
3315 classList->append(ClassContext::alloc(cd));
3319 cache.inlineClasses.reset(classList);
3321 return cache.inlineClasses.get();
3323 TemplateVariant compoundType() const
3325 return theTranslator->trFile(FALSE,TRUE);
3330 struct Cachable : public DefinitionContext<FileContext::Private>::Cachable
3332 Cachable(FileDef *fd) : DefinitionContext<FileContext::Private>::Cachable(fd) {}
3333 SharedPtr<IncludeInfoListContext> includeInfoList;
3334 ScopedPtr<DotInclDepGraph> includeGraph;
3335 ScopedPtr<DotInclDepGraph> includedByGraph;
3336 ScopedPtr<TemplateVariant> sources;
3337 SharedPtr<TemplateList> classes;
3338 SharedPtr<TemplateList> namespaces;
3339 SharedPtr<TemplateList> constantgroups;
3340 SharedPtr<MemberListInfoContext> macros;
3341 SharedPtr<MemberListInfoContext> typedefs;
3342 SharedPtr<MemberListInfoContext> enums;
3343 SharedPtr<MemberListInfoContext> functions;
3344 SharedPtr<MemberListInfoContext> variables;
3345 SharedPtr<MemberGroupListContext> memberGroups;
3346 SharedPtr<MemberListInfoContext> detailedMacros;
3347 SharedPtr<MemberListInfoContext> detailedTypedefs;
3348 SharedPtr<MemberListInfoContext> detailedEnums;
3349 SharedPtr<MemberListInfoContext> detailedFunctions;
3350 SharedPtr<MemberListInfoContext> detailedVariables;
3351 SharedPtr<TemplateList> inlineClasses;
3353 Cachable &getCache() const
3355 Cachable *c = static_cast<Cachable*>(m_fileDef->cookie());
3359 static PropertyMapper<FileContext::Private> s_inst;
3363 PropertyMapper<FileContext::Private> FileContext::Private::s_inst;
3365 FileContext::FileContext(FileDef *fd) : RefCountedContext("FileContext")
3367 p = new Private(fd);
3370 FileContext::~FileContext()
3375 TemplateVariant FileContext::get(const char *n) const
3380 //------------------------------------------------------------------------
3382 //%% struct Dir(Symbol): directory information
3384 class DirContext::Private : public DefinitionContext<DirContext::Private>
3387 Private(DirDef *dd) : DefinitionContext<DirContext::Private>(dd) , m_dirDef(dd)
3389 static bool init=FALSE;
3392 addBaseProperties(s_inst);
3393 s_inst.addProperty("title", &Private::title);
3394 s_inst.addProperty("highlight", &Private::highlight);
3395 s_inst.addProperty("subhighlight", &Private::subHighlight);
3396 s_inst.addProperty("dirName", &Private::dirName);
3397 s_inst.addProperty("dirs", &Private::dirs);
3398 s_inst.addProperty("files", &Private::files);
3399 s_inst.addProperty("hasDetails", &Private::hasDetails);
3400 s_inst.addProperty("hasDirGraph", &Private::hasDirGraph);
3401 s_inst.addProperty("dirGraph", &Private::dirGraph);
3402 s_inst.addProperty("compoundType", &Private::compoundType);
3405 if (!dd->cookie()) { dd->setCookie(new DirContext::Private::Cachable(dd)); }
3407 virtual ~Private() {}
3408 TemplateVariant get(const char *n) const
3410 return s_inst.get(this,n);
3412 TemplateVariant title() const
3414 return TemplateVariant(m_dirDef->shortTitle());
3416 TemplateVariant highlight() const
3418 return TemplateVariant("files");
3420 TemplateVariant subHighlight() const
3422 return TemplateVariant("");
3424 TemplateVariant dirName() const
3426 return TemplateVariant(m_dirDef->shortName());
3428 TemplateVariant dirs() const
3430 Cachable &cache = getCache();
3433 cache.dirs.reset(TemplateList::alloc());
3434 const DirList &subDirs = m_dirDef->subDirs();
3435 QListIterator<DirDef> it(subDirs);
3437 for (it.toFirst();(dd=it.current());++it)
3439 DirContext *dc = new DirContext(dd);
3440 cache.dirs->append(dc);
3443 return cache.dirs.get();
3445 TemplateVariant files() const
3447 Cachable &cache = getCache();
3450 cache.files.reset(TemplateList::alloc());
3451 FileList *files = m_dirDef->getFiles();
3454 QListIterator<FileDef> it(*files);
3456 for (it.toFirst();(fd=it.current());++it)
3458 FileContext *fc = FileContext::alloc(fd);
3459 cache.files->append(fc);
3463 return cache.files.get();
3465 TemplateVariant hasDetails() const
3467 return m_dirDef->hasDetailedDescription();
3469 TemplateVariant compoundType() const
3471 return theTranslator->trDir(FALSE,TRUE);
3473 TemplateVariant relPath() const
3477 DotDirDeps *getDirDepsGraph() const
3479 Cachable &cache = getCache();
3480 if (!cache.dirDepsGraph)
3482 cache.dirDepsGraph.reset(new DotDirDeps(m_dirDef));
3484 return cache.dirDepsGraph.get();
3486 TemplateVariant hasDirGraph() const
3489 static bool haveDot = Config_getBool(HAVE_DOT);
3490 static bool dirGraph = Config_getBool(DIRECTORY_GRAPH);
3491 if (haveDot && dirGraph)
3493 DotDirDeps *graph = getDirDepsGraph();
3494 result = !graph->isTrivial();
3498 TemplateVariant dirGraph() const
3501 static bool haveDot = Config_getBool(HAVE_DOT);
3502 static bool dirGraph = Config_getBool(DIRECTORY_GRAPH);
3503 if (haveDot && dirGraph)
3505 DotDirDeps *graph = getDirDepsGraph();
3506 FTextStream t(&result);
3507 switch (g_globals.outputFormat)
3509 case ContextOutputFormat_Html:
3511 graph->writeGraph(t,GOF_BITMAP,
3513 g_globals.outputDir,
3514 g_globals.outputDir+portable_pathSeparator()+m_dirDef->getOutputFileBase()+Doxygen::htmlFileExtension,
3517 g_globals.dynSectionId,
3521 case ContextOutputFormat_Latex:
3523 graph->writeGraph(t,GOF_EPS,
3525 g_globals.outputDir,
3526 g_globals.outputDir+portable_pathSeparator()+m_dirDef->getOutputFileBase()+".tex",
3529 g_globals.dynSectionId,
3533 // TODO: support other generators
3535 err("context.cpp: output format not yet supported");
3538 g_globals.dynSectionId++;
3540 return TemplateVariant(result.data(),TRUE);
3545 struct Cachable : public DefinitionContext<DirContext::Private>::Cachable
3547 Cachable(DirDef *dd) : DefinitionContext<DirContext::Private>::Cachable(dd) {}
3548 SharedPtr<TemplateList> dirs;
3549 SharedPtr<TemplateList> files;
3550 ScopedPtr<DotDirDeps> dirDepsGraph;
3552 Cachable &getCache() const
3554 Cachable *c = static_cast<Cachable*>(m_dirDef->cookie());
3558 static PropertyMapper<DirContext::Private> s_inst;
3562 PropertyMapper<DirContext::Private> DirContext::Private::s_inst;
3564 DirContext::DirContext(DirDef *fd) : RefCountedContext("DirContext")
3566 p = new Private(fd);
3569 DirContext::~DirContext()
3574 TemplateVariant DirContext::get(const char *n) const
3579 //------------------------------------------------------------------------
3581 //%% struct Page(Symbol): page information
3583 class PageContext::Private : public DefinitionContext<PageContext::Private>
3586 Private(PageDef *pd,bool isMainPage,bool isExample)
3587 : DefinitionContext<PageContext::Private>(pd) , m_pageDef(pd), m_isMainPage(isMainPage),
3588 m_isExample(isExample)
3590 static bool init=FALSE;
3593 addBaseProperties(s_inst);
3594 s_inst.addProperty("title", &Private::title);
3595 s_inst.addProperty("highlight", &Private::highlight);
3596 s_inst.addProperty("subhighlight",&Private::subHighlight);
3597 s_inst.addProperty("example", &Private::example);
3600 if (!pd->cookie()) { pd->setCookie(new PageContext::Private::Cachable(pd)); }
3602 virtual ~Private() {}
3603 TemplateVariant get(const char *n) const
3605 return s_inst.get(this,n);
3607 TemplateVariant title() const
3611 if (mainPageHasTitle())
3613 return m_pageDef->title();
3617 return theTranslator->trMainPage();
3620 else if (m_isExample)
3622 return m_pageDef->name();
3626 return m_pageDef->title();
3629 TemplateVariant relPath() const
3637 return DefinitionContext<PageContext::Private>::relPath();
3640 TemplateVariant highlight() const
3651 TemplateVariant subHighlight() const
3655 TemplateVariant example() const
3659 Cachable &cache = getCache();
3660 if (!cache.example || g_globals.outputFormat!=cache.exampleOutputFormat)
3662 cache.example.reset(new TemplateVariant(
3663 parseDoc(m_pageDef,m_pageDef->docFile(),m_pageDef->docLine(),
3664 relPathAsString(),"\\include "+m_pageDef->name(),FALSE)));
3665 cache.exampleOutputFormat = g_globals.outputFormat;
3667 return *cache.example;
3671 return TemplateVariant("");
3676 struct Cachable : public DefinitionContext<PageContext::Private>::Cachable
3678 Cachable(PageDef *pd) : DefinitionContext<PageContext::Private>::Cachable(pd),
3679 exampleOutputFormat(ContextOutputFormat_Unspecified) { }
3680 ScopedPtr<TemplateVariant> example;
3681 ContextOutputFormat exampleOutputFormat;
3683 Cachable &getCache() const
3685 Cachable *c = static_cast<Cachable*>(m_pageDef->cookie());
3691 static PropertyMapper<PageContext::Private> s_inst;
3695 PropertyMapper<PageContext::Private> PageContext::Private::s_inst;
3697 PageContext::PageContext(PageDef *pd,bool isMainPage,bool isExample) : RefCountedContext("PageContext")
3699 p = new Private(pd,isMainPage,isExample);
3702 PageContext::~PageContext()
3707 TemplateVariant PageContext::get(const char *n) const
3712 //------------------------------------------------------------------------
3714 class TextGeneratorHtml : public TextGeneratorIntf
3717 TextGeneratorHtml(FTextStream &ts,const QCString &relPath)
3718 : m_ts(ts), m_relPath(relPath) {}
3719 void writeString(const char *s,bool keepSpaces) const
3730 case '<': m_ts << "<"; break;
3731 case '>': m_ts << ">"; break;
3732 case '\'': m_ts << "'"; break;
3733 case '"': m_ts << """; break;
3734 case '&': m_ts << "&"; break;
3735 case ' ': m_ts << " "; break;
3741 m_ts << convertToHtml(s);
3745 void writeBreak(int indent) const
3748 for (int i=0;i<indent;i++)
3754 void writeLink(const char *ref,const char *f,
3755 const char *anchor,const char *name
3760 m_ts << "<a class=\"elRef\" ";
3761 m_ts << externalLinkTarget() << externalRef(m_relPath,ref,FALSE);
3765 m_ts << "<a class=\"el\" ";
3768 m_ts << externalRef(m_relPath,ref,TRUE);
3769 if (f) m_ts << f << Doxygen::htmlFileExtension;
3770 if (anchor) m_ts << "#" << anchor;
3772 m_ts << convertToHtml(name);
3781 //------------------------------------------------------------------------
3783 class TextGeneratorLatex : public TextGeneratorIntf
3786 TextGeneratorLatex(FTextStream &ts) : m_ts(ts) {}
3787 void writeString(const char *s,bool keepSpaces) const
3790 m_ts << convertToLaTeX(s,FALSE,keepSpaces);
3792 void writeBreak(int indent) const
3795 for (int i=0;i<indent;i++)
3800 void writeLink(const char *ref,const char *f,
3801 const char *anchor,const char *text
3804 static bool pdfHyperlinks = Config_getBool(PDF_HYPERLINKS);
3805 if (!ref && pdfHyperlinks)
3807 m_ts << "\\mbox{\\hyperlink{";
3808 if (f) m_ts << stripPath(f);
3809 if (f && anchor) m_ts << "_";
3810 if (anchor) m_ts << anchor;
3812 filterLatexString(m_ts,text);
3817 m_ts << "\\textbf{ ";
3818 filterLatexString(m_ts,text);
3827 //------------------------------------------------------------------------
3829 class TextGeneratorFactory
3832 static TextGeneratorFactory *instance()
3834 static TextGeneratorFactory *instance = 0;
3835 if (instance==0) instance = new TextGeneratorFactory;
3838 TextGeneratorIntf *create(FTextStream &ts,const QCString &relPath)
3840 switch (g_globals.outputFormat)
3842 case ContextOutputFormat_Html:
3843 return new TextGeneratorHtml(ts,relPath);
3844 case ContextOutputFormat_Latex:
3845 return new TextGeneratorLatex(ts);
3852 TextGeneratorFactory() {}
3853 virtual ~TextGeneratorFactory() {}
3856 TemplateVariant createLinkedText(Definition *def,const QCString &relPath,const QCString &text)
3860 TextGeneratorIntf *tg = TextGeneratorFactory::instance()->create(ts,relPath);
3863 linkifyText(*tg,def->getOuterScope(),def->getBodyDef(),def,text);
3865 return TemplateVariant(s.data(),TRUE);
3873 //%% struct Member(Symbol): member information
3875 class MemberContext::Private : public DefinitionContext<MemberContext::Private>
3878 Private(MemberDef *md) : DefinitionContext<MemberContext::Private>(md) , m_memberDef(md)
3880 static bool init=FALSE;
3883 addBaseProperties(s_inst);
3884 s_inst.addProperty("isSignal", &Private::isSignal);
3885 s_inst.addProperty("isSlot", &Private::isSlot);
3886 s_inst.addProperty("isVariable", &Private::isVariable);
3887 s_inst.addProperty("isEnumeration", &Private::isEnumeration);
3888 s_inst.addProperty("isEnumValue", &Private::isEnumValue);
3889 s_inst.addProperty("isTypedef", &Private::isTypedef);
3890 s_inst.addProperty("isFunction", &Private::isFunction);
3891 s_inst.addProperty("isFunctionPtr", &Private::isFunctionPtr);
3892 s_inst.addProperty("isDefine", &Private::isDefine);
3893 s_inst.addProperty("isFriend", &Private::isFriend);
3894 s_inst.addProperty("isProperty", &Private::isProperty);
3895 s_inst.addProperty("isEvent", &Private::isEvent);
3896 s_inst.addProperty("isRelated", &Private::isRelated);
3897 s_inst.addProperty("isForeign", &Private::isForeign);
3898 s_inst.addProperty("isStatic", &Private::isStatic);
3899 s_inst.addProperty("isInline", &Private::isInline);
3900 s_inst.addProperty("isExplicit", &Private::isExplicit);
3901 s_inst.addProperty("isMutable", &Private::isMutable);
3902 s_inst.addProperty("isGettable", &Private::isGettable);
3903 s_inst.addProperty("isPrivateGettable", &Private::isPrivateGettable);
3904 s_inst.addProperty("isProtectedGettable", &Private::isProtectedGettable);
3905 s_inst.addProperty("isSettable", &Private::isSettable);
3906 s_inst.addProperty("isPrivateSettable", &Private::isPrivateSettable);
3907 s_inst.addProperty("isProtectedSettable", &Private::isProtectedSettable);
3908 s_inst.addProperty("isReadable", &Private::isReadable);
3909 s_inst.addProperty("isWritable", &Private::isWritable);
3910 s_inst.addProperty("isAddable", &Private::isAddable);
3911 s_inst.addProperty("isRemovable", &Private::isRemovable);
3912 s_inst.addProperty("isRaisable", &Private::isRaisable);
3913 s_inst.addProperty("isFinal", &Private::isFinal);
3914 s_inst.addProperty("isAbstract", &Private::isAbstract);
3915 s_inst.addProperty("isOverride", &Private::isOverride);
3916 s_inst.addProperty("isInitonly", &Private::isInitonly);
3917 s_inst.addProperty("isOptional", &Private::isOptional);
3918 s_inst.addProperty("isRequired", &Private::isRequired);
3919 s_inst.addProperty("isNonAtomic", &Private::isNonAtomic);
3920 s_inst.addProperty("isCopy", &Private::isCopy);
3921 s_inst.addProperty("isAssign", &Private::isAssign);
3922 s_inst.addProperty("isRetain", &Private::isRetain);
3923 s_inst.addProperty("isWeak", &Private::isWeak);
3924 s_inst.addProperty("isStrong", &Private::isStrong);
3925 s_inst.addProperty("isUnretained", &Private::isUnretained);
3926 s_inst.addProperty("isNew", &Private::isNew);
3927 s_inst.addProperty("isSealed", &Private::isSealed);
3928 s_inst.addProperty("isImplementation", &Private::isImplementation);
3929 s_inst.addProperty("isExternal", &Private::isExternal);
3930 s_inst.addProperty("isAlias", &Private::isAlias);
3931 s_inst.addProperty("isDefault", &Private::isDefault);
3932 s_inst.addProperty("isDelete", &Private::isDelete);
3933 s_inst.addProperty("isNoExcept", &Private::isNoExcept);
3934 s_inst.addProperty("isAttribute", &Private::isAttribute);
3935 s_inst.addProperty("isUNOProperty", &Private::isUNOProperty);
3936 s_inst.addProperty("isReadonly", &Private::isReadonly);
3937 s_inst.addProperty("isBound", &Private::isBound);
3938 s_inst.addProperty("isConstrained", &Private::isConstrained);
3939 s_inst.addProperty("isTransient", &Private::isTransient);
3940 s_inst.addProperty("isMaybeVoid", &Private::isMaybeVoid);
3941 s_inst.addProperty("isMaybeDefault", &Private::isMaybeDefault);
3942 s_inst.addProperty("isMaybeAmbiguous", &Private::isMaybeAmbiguous);
3943 s_inst.addProperty("isPublished", &Private::isPublished);
3944 s_inst.addProperty("isTemplateSpecialization",&Private::isTemplateSpecialization);
3945 s_inst.addProperty("isObjCMethod", &Private::isObjCMethod);
3946 s_inst.addProperty("isObjCProperty", &Private::isObjCProperty);
3947 s_inst.addProperty("isAnonymous", &Private::isAnonymous);
3948 s_inst.addProperty("hasParameters", &Private::hasParameters);
3949 s_inst.addProperty("declType", &Private::declType);
3950 s_inst.addProperty("declArgs", &Private::declArgs);
3951 s_inst.addProperty("anonymousType", &Private::anonymousType);
3952 s_inst.addProperty("anonymousMember", &Private::anonymousMember);
3953 s_inst.addProperty("hasDetails", &Private::hasDetails);
3954 s_inst.addProperty("exception", &Private::exception);
3955 s_inst.addProperty("bitfields", &Private::bitfields);
3956 s_inst.addProperty("initializer", &Private::initializer);
3957 s_inst.addProperty("initializerAsCode", &Private::initializerAsCode);
3958 s_inst.addProperty("hasOneLineInitializer", &Private::hasOneLineInitializer);
3959 s_inst.addProperty("hasMultiLineInitializer", &Private::hasMultiLineInitializer);
3960 s_inst.addProperty("templateArgs", &Private::templateArgs);
3961 s_inst.addProperty("templateAlias", &Private::templateAlias);
3962 s_inst.addProperty("propertyAttrs", &Private::propertyAttrs);
3963 s_inst.addProperty("eventAttrs", &Private::eventAttrs);
3964 s_inst.addProperty("category", &Private::category);
3965 s_inst.addProperty("categoryRelation", &Private::categoryRelation);
3966 s_inst.addProperty("class", &Private::getClass);
3967 s_inst.addProperty("file", &Private::getFile);
3968 s_inst.addProperty("namespace", &Private::getNamespace);
3969 s_inst.addProperty("definition", &Private::definition);
3970 s_inst.addProperty("parameters", &Private::parameters);
3971 s_inst.addProperty("hasConstQualifier", &Private::hasConstQualifier);
3972 s_inst.addProperty("hasVolatileQualifier",&Private::hasVolatileQualifier);
3973 s_inst.addProperty("hasRefQualifierLValue", &Private::hasRefQualifierLValue);
3974 s_inst.addProperty("hasRefQualifierRValue", &Private::hasRefQualifierRValue);
3975 s_inst.addProperty("trailingReturnType", &Private::trailingReturnType);
3976 s_inst.addProperty("extraTypeChars", &Private::extraTypeChars);
3977 s_inst.addProperty("templateDecls", &Private::templateDecls);
3978 s_inst.addProperty("labels", &Private::labels);
3979 s_inst.addProperty("enumBaseType", &Private::enumBaseType);
3980 s_inst.addProperty("enumValues", &Private::enumValues);
3981 s_inst.addProperty("paramDocs", &Private::paramDocs);
3982 s_inst.addProperty("reimplements", &Private::reimplements);
3983 s_inst.addProperty("implements", &Private::implements);
3984 s_inst.addProperty("reimplementedBy", &Private::reimplementedBy);
3985 s_inst.addProperty("implementedBy", &Private::implementedBy);
3986 s_inst.addProperty("examples", &Private::examples);
3987 s_inst.addProperty("typeConstraints", &Private::typeConstraints);
3988 s_inst.addProperty("functionQualifier", &Private::functionQualifier);
3989 s_inst.addProperty("sourceRefs", &Private::sourceRefs);
3990 s_inst.addProperty("sourceRefBys", &Private::sourceRefBys);
3991 s_inst.addProperty("hasSources", &Private::hasSources);
3992 s_inst.addProperty("sourceCode", &Private::sourceCode);
3993 s_inst.addProperty("hasCallGraph", &Private::hasCallGraph);
3994 s_inst.addProperty("callGraph", &Private::callGraph);
3995 s_inst.addProperty("hasCallerGraph", &Private::hasCallerGraph);
3996 s_inst.addProperty("callerGraph", &Private::callerGraph);
3997 s_inst.addProperty("fieldType", &Private::fieldType);
3998 s_inst.addProperty("type", &Private::type);
3999 s_inst.addProperty("detailsVisibleFor", &Private::detailsVisibleFor);
4000 s_inst.addProperty("nameWithContextFor", &Private::nameWithContextFor);
4003 if (!md->cookie()) { md->setCookie(new MemberContext::Private::Cachable(md)); }
4005 Cachable &cache = getCache();
4006 cache.propertyAttrs.reset(TemplateList::alloc());
4007 if (md && md->isProperty())
4009 if (md->isGettable()) cache.propertyAttrs->append("get");
4010 if (md->isPrivateGettable()) cache.propertyAttrs->append("private get");
4011 if (md->isProtectedGettable()) cache.propertyAttrs->append("protected get");
4012 if (md->isSettable()) cache.propertyAttrs->append("set");
4013 if (md->isPrivateSettable()) cache.propertyAttrs->append("private set");
4014 if (md->isProtectedSettable()) cache.propertyAttrs->append("protected set");
4016 cache.eventAttrs.reset(TemplateList::alloc());
4017 if (md && md->isEvent())
4019 if (md->isAddable()) cache.eventAttrs->append("add");
4020 if (md->isRemovable()) cache.eventAttrs->append("remove");
4021 if (md->isRaisable()) cache.eventAttrs->append("raise");
4024 virtual ~Private() {}
4025 TemplateVariant get(const char *n) const
4027 return s_inst.get(this,n);
4029 TemplateVariant fieldType() const
4031 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->fieldType());
4033 TemplateVariant declType() const
4035 Cachable &cache = getCache();
4036 if (!cache.declTypeParsed)
4038 cache.declType=createLinkedText(m_memberDef,relPathAsString(),m_memberDef->getDeclType());
4039 cache.declTypeParsed = TRUE;
4040 return cache.declType;
4044 return cache.declType;
4047 TemplateVariant declArgs() const
4049 Cachable &cache = getCache();
4050 if (!cache.declArgsParsed)
4052 cache.declArgs=createLinkedText(m_memberDef,relPathAsString(),m_memberDef->argsString());
4053 cache.declArgsParsed = TRUE;
4054 return cache.declArgs;
4058 return cache.declArgs;
4061 TemplateVariant exception() const
4063 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->excpString());
4065 TemplateVariant bitfields() const
4067 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->bitfieldString());
4069 TemplateVariant isStatic() const
4071 return m_memberDef->isStatic();
4073 TemplateVariant isObjCMethod() const
4075 return m_memberDef->isObjCMethod();
4077 TemplateVariant isObjCProperty() const
4079 return m_memberDef->isObjCProperty();
4081 TemplateVariant isImplementation() const
4083 return m_memberDef->isImplementation();
4085 TemplateVariant isSignal() const
4087 return m_memberDef->isSignal();
4089 TemplateVariant isSlot() const
4091 return m_memberDef->isSlot();
4093 TemplateVariant isTypedef() const
4095 return m_memberDef->isTypedef();
4097 TemplateVariant isFunction() const
4099 return m_memberDef->isFunction();
4101 TemplateVariant isFunctionPtr() const
4103 return m_memberDef->isFunctionPtr();
4105 TemplateVariant isFriend() const
4107 return m_memberDef->isFriend();
4109 TemplateVariant isForeign() const
4111 return m_memberDef->isForeign();
4113 TemplateVariant isEvent() const
4115 return m_memberDef->isEvent();
4117 TemplateVariant isInline() const
4119 return m_memberDef->isInline();
4121 TemplateVariant isExplicit() const
4123 return m_memberDef->isExplicit();
4125 TemplateVariant isMutable() const
4127 return m_memberDef->isMutable();
4129 TemplateVariant isGettable() const
4131 return m_memberDef->isGettable();
4133 TemplateVariant isPrivateGettable() const
4135 return m_memberDef->isPrivateGettable();
4137 TemplateVariant isProtectedGettable() const
4139 return m_memberDef->isProtectedGettable();
4141 TemplateVariant isSettable() const
4143 return m_memberDef->isSettable();
4145 TemplateVariant isPrivateSettable() const
4147 return m_memberDef->isPrivateSettable();
4149 TemplateVariant isProtectedSettable() const
4151 return m_memberDef->isProtectedSettable();
4153 TemplateVariant isReadable() const
4155 return m_memberDef->isReadable();
4157 TemplateVariant isWritable() const
4159 return m_memberDef->isWritable();
4161 TemplateVariant isAddable() const
4163 return m_memberDef->isAddable();
4165 TemplateVariant isRemovable() const
4167 return m_memberDef->isRemovable();
4169 TemplateVariant isRaisable() const
4171 return m_memberDef->isRaisable();
4173 TemplateVariant isFinal() const
4175 return m_memberDef->isFinal();
4177 TemplateVariant isAbstract() const
4179 return m_memberDef->isAbstract();
4181 TemplateVariant isOverride() const
4183 return m_memberDef->isOverride();
4185 TemplateVariant isInitonly() const
4187 return m_memberDef->isInitonly();
4189 TemplateVariant isOptional() const
4191 return m_memberDef->isOptional();
4193 TemplateVariant isRequired() const
4195 return m_memberDef->isRequired();
4197 TemplateVariant isNonAtomic() const
4199 return m_memberDef->isNonAtomic();
4201 TemplateVariant isCopy() const
4203 return m_memberDef->isCopy();
4205 TemplateVariant isAssign() const
4207 return m_memberDef->isAssign();
4209 TemplateVariant isRetain() const
4211 return m_memberDef->isRetain();
4213 TemplateVariant isWeak() const
4215 return m_memberDef->isWeak();
4217 TemplateVariant isStrong() const
4219 return m_memberDef->isStrong();
4221 TemplateVariant isUnretained() const
4223 return m_memberDef->isUnretained();
4225 TemplateVariant isNew() const
4227 return m_memberDef->isNew();
4229 TemplateVariant isSealed() const
4231 return m_memberDef->isSealed();
4233 TemplateVariant isExternal() const
4235 return m_memberDef->isExternal();
4237 TemplateVariant isAlias() const
4239 return m_memberDef->isAlias();
4241 TemplateVariant isDefault() const
4243 return m_memberDef->isDefault();
4245 TemplateVariant isDelete() const
4247 return m_memberDef->isDelete();
4249 TemplateVariant isNoExcept() const
4251 return m_memberDef->isNoExcept();
4253 TemplateVariant isAttribute() const
4255 return m_memberDef->isAttribute();
4257 TemplateVariant isUNOProperty() const
4259 return m_memberDef->isUNOProperty();
4261 TemplateVariant isReadonly() const
4263 return m_memberDef->isReadonly();
4265 TemplateVariant isBound() const
4267 return m_memberDef->isBound();
4269 TemplateVariant isConstrained() const
4271 return m_memberDef->isConstrained();
4273 TemplateVariant isTransient() const
4275 return m_memberDef->isTransient();
4277 TemplateVariant isMaybeVoid() const
4279 return m_memberDef->isMaybeVoid();
4281 TemplateVariant isMaybeDefault() const
4283 return m_memberDef->isMaybeDefault();
4285 TemplateVariant isMaybeAmbiguous() const
4287 return m_memberDef->isMaybeAmbiguous();
4289 TemplateVariant isPublished() const
4291 return m_memberDef->isPublished();
4293 TemplateVariant isTemplateSpecialization() const
4295 return m_memberDef->isTemplateSpecialization();
4297 TemplateVariant isProperty() const
4299 return m_memberDef->isProperty();
4301 TemplateVariant isEnumValue() const
4303 return m_memberDef->isEnumValue();
4305 TemplateVariant isVariable() const
4307 return m_memberDef->isVariable();
4309 TemplateVariant isEnumeration() const
4311 return m_memberDef->isEnumerate();
4313 TemplateVariant hasDetails() const
4315 return m_memberDef->isDetailedSectionLinkable();
4317 TemplateVariant initializer() const
4319 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->initializer());
4321 TemplateVariant initializerAsCode() const
4323 Cachable &cache = getCache();
4324 if (!cache.initializerParsed)
4327 if (m_memberDef->getClassDef())
4329 scopeName = m_memberDef->getClassDef()->name();
4331 else if (m_memberDef->getNamespaceDef())
4333 scopeName = m_memberDef->getNamespaceDef()->name();
4335 cache.initializer = parseCode(m_memberDef,scopeName,relPathAsString(),
4336 m_memberDef->initializer());
4337 cache.initializerParsed = TRUE;
4339 return cache.initializer;
4341 TemplateVariant isDefine() const
4343 return m_memberDef->isDefine();
4345 TemplateVariant isAnonymous() const
4347 QCString name = m_memberDef->name();
4348 return !name.isEmpty() && name.at(0)=='@';
4350 TemplateVariant anonymousType() const
4352 Cachable &cache = getCache();
4353 if (!cache.anonymousType)
4355 ClassDef *cd = m_memberDef->getClassDefOfAnonymousType();
4358 cache.anonymousType.reset(ClassContext::alloc(cd));
4361 if (cache.anonymousType)
4363 return cache.anonymousType.get();
4370 TemplateVariant anonymousMember() const
4372 Cachable &cache = getCache();
4373 if (!cache.anonymousMember)
4375 MemberDef *md = m_memberDef->fromAnonymousMember();
4378 cache.anonymousMember.reset(MemberContext::alloc(md));
4381 if (cache.anonymousMember)
4383 return cache.anonymousMember.get();
4390 TemplateVariant isRelated() const
4392 return m_memberDef->isRelated();
4394 TemplateVariant enumBaseType() const
4396 return m_memberDef->enumBaseType();
4398 TemplateVariant hasOneLineInitializer() const
4400 return m_memberDef->hasOneLineInitializer();
4402 TemplateVariant hasMultiLineInitializer() const
4404 return m_memberDef->hasMultiLineInitializer();
4406 TemplateVariant enumValues() const
4408 Cachable &cache = getCache();
4409 if (!cache.enumValues)
4411 MemberList *ml = m_memberDef->enumFieldList();
4414 cache.enumValues.reset(MemberListContext::alloc(ml));
4418 cache.enumValues.reset(MemberListContext::alloc());
4421 return cache.enumValues.get();
4423 TemplateVariant templateArgs() const
4425 Cachable &cache = getCache();
4426 if (!cache.templateArgs && m_memberDef->templateArguments())
4428 cache.templateArgs.reset(ArgumentListContext::alloc(m_memberDef->templateArguments(),m_memberDef,relPathAsString()));
4430 if (cache.templateArgs)
4432 return cache.templateArgs.get();
4436 return TemplateVariant(FALSE);
4439 TemplateVariant templateAlias() const
4441 if (m_memberDef->isAlias())
4443 return createLinkedText(m_memberDef,relPathAsString(),
4444 QCString(" = ")+m_memberDef->typeString());
4448 TemplateVariant propertyAttrs() const
4450 return getCache().propertyAttrs.get();
4452 TemplateVariant eventAttrs() const
4454 return getCache().eventAttrs.get();
4456 TemplateVariant getClass() const
4458 Cachable &cache = getCache();
4459 if (!cache.classDef && m_memberDef->getClassDef())
4461 cache.classDef.reset(ClassContext::alloc(m_memberDef->getClassDef()));
4465 return cache.classDef.get();
4469 return TemplateVariant(FALSE);
4472 TemplateVariant category() const
4474 Cachable &cache = getCache();
4475 if (!cache.category && m_memberDef->category())
4477 cache.category.reset(ClassContext::alloc(m_memberDef->category()));
4481 return cache.category.get();
4485 return TemplateVariant(FALSE);
4488 TemplateVariant categoryRelation() const
4490 Cachable &cache = getCache();
4491 if (!cache.categoryRelation && m_memberDef->categoryRelation())
4493 cache.categoryRelation.reset(MemberContext::alloc(m_memberDef->categoryRelation()));
4495 if (cache.categoryRelation)
4497 return cache.categoryRelation.get();
4501 return TemplateVariant(FALSE);
4504 TemplateVariant getFile() const
4506 Cachable &cache = getCache();
4507 if (!cache.fileDef && m_memberDef->getFileDef())
4509 cache.fileDef.reset(FileContext::alloc(m_memberDef->getFileDef()));
4513 return cache.fileDef.get();
4517 return TemplateVariant(FALSE);
4520 TemplateVariant getNamespace() const
4522 Cachable &cache = getCache();
4523 if (!cache.namespaceDef && m_memberDef->getNamespaceDef())
4525 cache.namespaceDef.reset(NamespaceContext::alloc(m_memberDef->getNamespaceDef()));
4527 if (cache.namespaceDef)
4529 return cache.namespaceDef.get();
4533 return TemplateVariant(FALSE);
4536 TemplateVariant definition() const
4538 return createLinkedText(m_memberDef,relPathAsString(),
4539 m_memberDef->displayDefinition());
4541 ArgumentList *getDefArgList() const
4543 return (m_memberDef->isDocsForDefinition()) ?
4544 m_memberDef->argumentList() : m_memberDef->declArgumentList();
4546 TemplateVariant parameters() const
4548 Cachable &cache = getCache();
4549 if (!cache.arguments)
4551 ArgumentList *defArgList = getDefArgList();
4552 if (defArgList && !m_memberDef->isProperty())
4554 cache.arguments.reset(ArgumentListContext::alloc(defArgList,m_memberDef,relPathAsString()));
4558 cache.arguments.reset(ArgumentListContext::alloc());
4561 return cache.arguments.get();
4563 TemplateVariant hasParameters() const
4565 return getDefArgList()!=0;
4567 TemplateVariant hasConstQualifier() const
4569 ArgumentList *al = getDefArgList();
4570 return al ? al->constSpecifier : FALSE;
4572 TemplateVariant hasVolatileQualifier() const
4574 ArgumentList *al = getDefArgList();
4575 return al ? al->volatileSpecifier : FALSE;
4577 TemplateVariant hasRefQualifierLValue() const
4579 ArgumentList *al = getDefArgList();
4580 return al ? al->refQualifier==RefQualifierLValue : FALSE;
4582 TemplateVariant hasRefQualifierRValue() const
4584 ArgumentList *al = getDefArgList();
4585 return al ? al->refQualifier==RefQualifierRValue : FALSE;
4587 TemplateVariant trailingReturnType() const
4589 ArgumentList *al = getDefArgList();
4590 if (al && !al->trailingReturnType.isEmpty())
4592 return createLinkedText(m_memberDef,relPathAsString(),
4593 al->trailingReturnType);
4600 TemplateVariant extraTypeChars() const
4602 return m_memberDef->extraTypeChars();
4604 void addTemplateDecls(TemplateList *tl) const
4606 ClassDef *cd=m_memberDef->getClassDef();
4607 if (m_memberDef->definitionTemplateParameterLists())
4609 QListIterator<ArgumentList> ali(*m_memberDef->definitionTemplateParameterLists());
4611 for (ali.toFirst();(tal=ali.current());++ali)
4615 ArgumentListContext *al = ArgumentListContext::alloc(tal,m_memberDef,relPathAsString());
4622 if (cd && !m_memberDef->isRelated() && !m_memberDef->isTemplateSpecialization())
4624 QList<ArgumentList> tempParamLists;
4625 cd->getTemplateParameterLists(tempParamLists);
4626 //printf("#tempParamLists=%d\n",tempParamLists.count());
4627 QListIterator<ArgumentList> ali(tempParamLists);
4629 for (ali.toFirst();(tal=ali.current());++ali)
4633 ArgumentListContext *al = ArgumentListContext::alloc(tal,m_memberDef,relPathAsString());
4638 if (m_memberDef->templateArguments()) // function template prefix
4640 ArgumentListContext *al = ArgumentListContext::alloc(
4641 m_memberDef->templateArguments(),m_memberDef,relPathAsString());
4646 TemplateVariant templateDecls() const
4648 Cachable &cache = getCache();
4649 if (!cache.templateDecls)
4651 TemplateList *tl = TemplateList::alloc();
4652 addTemplateDecls(tl);
4653 cache.templateDecls.reset(tl);
4655 return cache.templateDecls.get();
4657 TemplateVariant labels() const
4659 Cachable &cache = getCache();
4663 m_memberDef->getLabels(sl,m_memberDef->getOuterScope());
4664 TemplateList *tl = TemplateList::alloc();
4667 QStrListIterator it(sl);
4668 for (;it.current();++it)
4673 cache.labels.reset(tl);
4675 return cache.labels.get();
4677 TemplateVariant paramDocs() const
4679 Cachable &cache = getCache();
4680 if (!cache.paramDocs)
4682 if (m_memberDef->argumentList() && m_memberDef->argumentList()->hasDocumentation())
4685 ArgumentListIterator ali(*m_memberDef->argumentList());
4687 // convert the parameter documentation into a list of @param commands
4688 for (ali.toFirst();(a=ali.current());++ali)
4690 if (a->hasDocumentation())
4692 QCString direction = extractDirection(a->docs);
4693 paramDocs+="@param"+direction+" "+a->name+" "+a->docs;
4696 cache.paramDocs.reset(new TemplateVariant(parseDoc(m_memberDef,
4697 m_memberDef->docFile(),m_memberDef->docLine(),
4698 relPathAsString(),paramDocs,FALSE)));
4702 cache.paramDocs.reset(new TemplateVariant(""));
4705 return *cache.paramDocs;
4707 TemplateVariant implements() const
4709 Cachable &cache = getCache();
4710 if (!cache.implements)
4712 MemberDef *md = m_memberDef->reimplements();
4713 cache.implements.reset(TemplateList::alloc());
4716 ClassDef *cd = md->getClassDef();
4717 if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
4719 MemberContext *mc = MemberContext::alloc(md);
4720 cache.implements->append(mc);
4724 return cache.implements.get();
4726 TemplateVariant reimplements() const
4728 Cachable &cache = getCache();
4729 if (!cache.reimplements)
4731 MemberDef *md = m_memberDef->reimplements();
4732 cache.reimplements.reset(TemplateList::alloc());
4735 ClassDef *cd = md->getClassDef();
4736 if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
4738 MemberContext *mc = MemberContext::alloc(md);
4739 cache.reimplements->append(mc);
4743 return cache.reimplements.get();
4745 TemplateVariant implementedBy() const
4747 Cachable &cache = getCache();
4748 if (!cache.implementedBy)
4750 MemberList *ml = m_memberDef->reimplementedBy();
4751 cache.implementedBy.reset(TemplateList::alloc());
4754 MemberListIterator mli(*ml);
4756 for (mli.toFirst();(md=mli.current());++mli)
4758 ClassDef *cd = md->getClassDef();
4759 if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
4761 MemberContext *mc = new MemberContext(md);
4762 cache.implementedBy->append(mc);
4767 return cache.implementedBy.get();
4769 TemplateVariant reimplementedBy() const
4771 Cachable &cache = getCache();
4772 if (!cache.reimplementedBy)
4774 cache.reimplementedBy.reset(TemplateList::alloc());
4775 MemberList *ml = m_memberDef->reimplementedBy();
4778 MemberListIterator mli(*ml);
4780 for (mli.toFirst();(md=mli.current());++mli)
4782 ClassDef *cd = md->getClassDef();
4783 if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
4785 MemberContext *mc = new MemberContext(md);
4786 cache.reimplementedBy->append(mc);
4791 return cache.reimplementedBy.get();
4793 void addExamples(TemplateList *list) const
4795 if (m_memberDef->hasExamples())
4797 ExampleSDict::Iterator it(*m_memberDef->getExamples());
4799 for (it.toFirst();(ex=it.current());++it)
4801 TemplateStruct *s = TemplateStruct::alloc();
4802 s->set("text",ex->name);
4803 s->set("isLinkable",TRUE);
4804 s->set("anchor",ex->anchor);
4805 s->set("fileName",ex->file);
4806 s->set("isReference",FALSE);
4807 s->set("externalReference","");
4812 TemplateVariant examples() const
4814 Cachable &cache = getCache();
4815 if (!cache.examples)
4817 TemplateList *exampleList = TemplateList::alloc();
4818 addExamples(exampleList);
4819 cache.examples.reset(exampleList);
4821 return cache.examples.get();
4823 TemplateVariant typeConstraints() const
4825 Cachable &cache = getCache();
4826 if (!cache.typeConstraints && m_memberDef->typeConstraints())
4828 cache.typeConstraints.reset(ArgumentListContext::alloc(m_memberDef->typeConstraints(),m_memberDef,relPathAsString()));
4832 cache.typeConstraints.reset(ArgumentListContext::alloc());
4834 return cache.typeConstraints.get();
4836 TemplateVariant functionQualifier() const
4838 if (!m_memberDef->isObjCMethod() &&
4839 (m_memberDef->isFunction() || m_memberDef->isSlot() ||
4840 m_memberDef->isPrototype() || m_memberDef->isSignal()
4851 TemplateVariant sourceRefs() const
4853 Cachable &cache = getCache();
4854 if (!cache.sourceRefs)
4856 cache.sourceRefs.reset(MemberListContext::alloc(m_memberDef->getReferencesMembers(),TRUE));
4858 return cache.sourceRefs.get();
4860 TemplateVariant sourceRefBys() const
4862 Cachable &cache = getCache();
4863 if (!cache.sourceRefBys)
4865 cache.sourceRefBys.reset(MemberListContext::alloc(m_memberDef->getReferencedByMembers(),TRUE));
4867 return cache.sourceRefBys.get();
4869 TemplateVariant hasSources() const
4871 return TemplateVariant(m_memberDef->hasSources());
4873 TemplateVariant sourceCode() const
4875 Cachable &cache = getCache();
4876 if (!cache.sourceCodeParsed)
4878 QCString codeFragment;
4879 FileDef *fd = m_memberDef->getBodyDef();
4880 int startLine = m_memberDef->getStartBodyLine();
4881 int endLine = m_memberDef->getEndBodyLine();
4882 if (fd && readCodeFragment(fd->absFilePath(),
4883 startLine,endLine,codeFragment)
4887 if (m_memberDef->getClassDef())
4889 scopeName = m_memberDef->getClassDef()->name();
4891 else if (m_memberDef->getNamespaceDef())
4893 scopeName = m_memberDef->getNamespaceDef()->name();
4895 cache.sourceCode = parseCode(m_memberDef,scopeName,relPathAsString(),codeFragment,startLine,endLine,TRUE);
4896 cache.sourceCodeParsed = TRUE;
4899 return cache.sourceCode;
4901 DotCallGraph *getCallGraph() const
4903 Cachable &cache = getCache();
4904 if (!cache.callGraph)
4906 cache.callGraph.reset(new DotCallGraph(m_memberDef,FALSE));
4908 return cache.callGraph.get();
4910 TemplateVariant hasCallGraph() const
4912 static bool haveDot = Config_getBool(HAVE_DOT);
4913 if (m_memberDef->hasCallGraph() && haveDot &&
4914 (m_memberDef->isFunction() || m_memberDef->isSlot() || m_memberDef->isSignal()))
4916 DotCallGraph *cg = getCallGraph();
4917 return !cg->isTooBig() && !cg->isTrivial();
4919 return TemplateVariant(FALSE);
4921 TemplateVariant callGraph() const
4923 if (hasCallGraph().toBool())
4925 DotCallGraph *cg = getCallGraph();
4927 FTextStream t(&result);
4928 switch (g_globals.outputFormat)
4930 case ContextOutputFormat_Html:
4932 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
4933 g_globals.outputDir,
4934 g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
4935 relPathAsString(),TRUE,g_globals.dynSectionId
4939 case ContextOutputFormat_Latex:
4941 cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
4942 g_globals.outputDir,
4943 g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+".tex",
4944 relPathAsString(),TRUE,g_globals.dynSectionId
4948 // TODO: support other generators
4950 err("context.cpp: output format not yet supported");
4953 g_globals.dynSectionId++;
4954 return TemplateVariant(result.data(),TRUE);
4958 return TemplateVariant("");
4961 DotCallGraph *getCallerGraph() const
4963 Cachable &cache = getCache();
4964 if (!cache.callerGraph)
4966 cache.callerGraph.reset(new DotCallGraph(m_memberDef,TRUE));
4968 return cache.callerGraph.get();
4970 TemplateVariant hasCallerGraph() const
4972 static bool haveDot = Config_getBool(HAVE_DOT);
4973 if (m_memberDef->hasCallerGraph() && haveDot &&
4974 (m_memberDef->isFunction() || m_memberDef->isSlot() || m_memberDef->isSignal()))
4976 DotCallGraph *cg = getCallerGraph();
4977 return !cg->isTooBig() && !cg->isTrivial();
4979 return TemplateVariant(FALSE);
4981 TemplateVariant callerGraph() const
4983 if (hasCallerGraph().toBool())
4985 DotCallGraph *cg = getCallerGraph();
4987 FTextStream t(&result);
4988 switch (g_globals.outputFormat)
4990 case ContextOutputFormat_Html:
4992 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
4993 g_globals.outputDir,
4994 g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
4995 relPathAsString(),TRUE,g_globals.dynSectionId
4999 case ContextOutputFormat_Latex:
5001 cg->writeGraph(t,GOF_EPS,EOF_LaTeX,
5002 g_globals.outputDir,
5003 g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+".tex",
5004 relPathAsString(),TRUE,g_globals.dynSectionId
5008 // TODO: support other generators
5010 err("context.cpp: output format not yet supported");
5013 g_globals.dynSectionId++;
5014 return TemplateVariant(result.data(),TRUE);
5018 return TemplateVariant("");
5021 TemplateVariant type() const
5023 return m_memberDef->typeString();
5025 TemplateVariant handleDetailsVisibleFor(const QValueList<TemplateVariant> &args) const
5027 if (args.count()==1)
5029 return m_memberDef->isDetailedSectionVisible(args[0].toString()=="module",args[0].toString()=="file");
5033 err(".detailsVisibleFor should take one string argument, got %d\n",args.count());
5035 return TemplateVariant();
5037 TemplateVariant detailsVisibleFor() const
5039 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleDetailsVisibleFor>(this);
5041 TemplateVariant handleNameWithContextFor(const QValueList<TemplateVariant> &args) const
5043 if (args.count()==1)
5045 SrcLangExt lang = m_memberDef->getLanguage();
5046 QCString n = m_memberDef->name();
5047 QCString ctx = args[0].toString();
5048 QCString sep = getLanguageSpecificSeparator(lang,TRUE);
5049 if (m_memberDef->getEnumScope() && m_memberDef->livesInsideEnum())
5051 n.prepend(m_memberDef->getEnumScope()->displayName()+sep);
5053 if (ctx=="module" && m_memberDef->getClassDef() && !m_memberDef->isRelated())
5055 n.prepend(m_memberDef->getClassDef()->displayName()+sep);
5057 else if ((ctx=="module" || ctx=="file") && m_memberDef->getNamespaceDef())
5059 n.prepend(m_memberDef->getNamespaceDef()->displayName()+sep);
5065 err(".nameWithContextFor should take one string argument, got %d\n",args.count());
5067 return TemplateVariant();
5069 TemplateVariant nameWithContextFor() const
5071 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleNameWithContextFor>(this);
5074 MemberDef *m_memberDef;
5075 struct Cachable : public DefinitionContext<MemberContext::Private>::Cachable
5077 Cachable(MemberDef *md) : DefinitionContext<MemberContext::Private>::Cachable(md),
5078 initializerParsed(FALSE), sourceCodeParsed(FALSE),
5079 declArgsParsed(FALSE), declTypeParsed(FALSE) { }
5080 SharedPtr<ArgumentListContext> templateArgs;
5081 SharedPtr<ArgumentListContext> arguments;
5082 SharedPtr<MemberListContext> enumValues;
5083 SharedPtr<FileContext> fileDef;
5084 SharedPtr<NamespaceContext> namespaceDef;
5085 SharedPtr<ClassContext> category;
5086 SharedPtr<MemberContext> categoryRelation;
5087 SharedPtr<ClassContext> classDef;
5088 SharedPtr<ClassContext> anonymousType;
5089 SharedPtr<TemplateList> templateDecls;
5090 ScopedPtr<TemplateVariant> paramDocs;
5091 SharedPtr<TemplateList> implements;
5092 SharedPtr<TemplateList> reimplements;
5093 SharedPtr<TemplateList> implementedBy;
5094 SharedPtr<MemberListContext> sourceRefs;
5095 SharedPtr<MemberListContext> sourceRefBys;
5096 ScopedPtr<DotCallGraph> callGraph;
5097 ScopedPtr<DotCallGraph> callerGraph;
5098 SharedPtr<MemberContext> anonymousMember;
5099 SharedPtr<TemplateList> reimplementedBy;
5100 SharedPtr<TemplateList> labels;
5101 TemplateVariant initializer;
5102 bool initializerParsed;
5103 TemplateVariant sourceCode;
5104 bool sourceCodeParsed;
5105 TemplateVariant declArgs;
5106 bool declArgsParsed;
5107 TemplateVariant declType;
5108 bool declTypeParsed;
5109 SharedPtr<TemplateList> examples;
5110 SharedPtr<TemplateList> exampleList;
5111 SharedPtr<ArgumentListContext> typeConstraints;
5112 SharedPtr<TemplateList> propertyAttrs;
5113 SharedPtr<TemplateList> eventAttrs;
5115 Cachable &getCache() const
5117 Cachable *c = static_cast<Cachable*>(m_memberDef->cookie());
5121 static PropertyMapper<MemberContext::Private> s_inst;
5125 PropertyMapper<MemberContext::Private> MemberContext::Private::s_inst;
5127 MemberContext::MemberContext(MemberDef *md) : RefCountedContext("MemberContext")
5129 p = new Private(md);
5132 MemberContext::~MemberContext()
5137 TemplateVariant MemberContext::get(const char *n) const
5143 //------------------------------------------------------------------------
5145 //%% struct Module(Symbol): group information
5147 class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
5150 Private(GroupDef *gd) : DefinitionContext<ModuleContext::Private>(gd) , m_groupDef(gd)
5152 static bool init=FALSE;
5155 addBaseProperties(s_inst);
5156 s_inst.addProperty("title", &Private::title);
5157 s_inst.addProperty("highlight", &Private::highlight);
5158 s_inst.addProperty("subhighlight", &Private::subHighlight);
5159 s_inst.addProperty("hasGroupGraph", &Private::hasGroupGraph);
5160 s_inst.addProperty("groupGraph", &Private::groupGraph);
5161 s_inst.addProperty("hasDetails", &Private::hasDetails);
5162 s_inst.addProperty("modules", &Private::modules);
5163 s_inst.addProperty("dirs", &Private::dirs);
5164 s_inst.addProperty("files", &Private::files);
5165 s_inst.addProperty("namespaces", &Private::namespaces);
5166 s_inst.addProperty("classes", &Private::classes);
5167 s_inst.addProperty("constantgroups", &Private::constantgroups);
5168 s_inst.addProperty("examples", &Private::examples);
5169 s_inst.addProperty("macros", &Private::macros);
5170 s_inst.addProperty("typedefs", &Private::typedefs);
5171 s_inst.addProperty("enums", &Private::enums);
5172 s_inst.addProperty("enumvalues", &Private::enumValues);
5173 s_inst.addProperty("functions", &Private::functions);
5174 s_inst.addProperty("variables", &Private::variables);
5175 s_inst.addProperty("signals", &Private::signals);
5176 s_inst.addProperty("publicSlots", &Private::publicSlots);
5177 s_inst.addProperty("protectedSlots", &Private::protectedSlots);
5178 s_inst.addProperty("privateSlots", &Private::privateSlots);
5179 s_inst.addProperty("events", &Private::events);
5180 s_inst.addProperty("properties", &Private::properties);
5181 s_inst.addProperty("friends", &Private::friends);
5182 s_inst.addProperty("memberGroups", &Private::memberGroups);
5183 s_inst.addProperty("detailedMacros", &Private::detailedMacros);
5184 s_inst.addProperty("detailedTypedefs", &Private::detailedTypedefs);
5185 s_inst.addProperty("detailedEnums", &Private::detailedEnums);
5186 s_inst.addProperty("detailedEnumValues", &Private::detailedEnumValues);
5187 s_inst.addProperty("detailedFunctions", &Private::detailedFunctions);
5188 s_inst.addProperty("detailedVariables", &Private::detailedVariables);
5189 s_inst.addProperty("detailedSignals", &Private::detailedSignals);
5190 s_inst.addProperty("detailedPublicSlots", &Private::detailedPublicSlots);
5191 s_inst.addProperty("detailedProtectedSlots", &Private::detailedProtectedSlots);
5192 s_inst.addProperty("detailedPrivateSlots", &Private::detailedPrivateSlots);
5193 s_inst.addProperty("detailedEvents", &Private::detailedEvents);
5194 s_inst.addProperty("detailedProperties", &Private::detailedProperties);
5195 s_inst.addProperty("detailedFriends", &Private::detailedFriends);
5196 s_inst.addProperty("inlineClasses", &Private::inlineClasses);
5197 s_inst.addProperty("compoundType", &Private::compoundType);
5200 if (!gd->cookie()) { gd->setCookie(new ModuleContext::Private::Cachable(gd)); }
5202 virtual ~Private() {}
5203 TemplateVariant get(const char *n) const
5205 return s_inst.get(this,n);
5207 TemplateVariant title() const
5209 return TemplateVariant(m_groupDef->groupTitle());
5211 TemplateVariant highlight() const
5213 return TemplateVariant("modules");
5215 TemplateVariant subHighlight() const
5217 return TemplateVariant("");
5219 DotGroupCollaboration *getGroupGraph() const
5221 Cachable &cache = getCache();
5222 if (!cache.groupGraph)
5224 cache.groupGraph.reset(new DotGroupCollaboration(m_groupDef));
5226 return cache.groupGraph.get();
5228 TemplateVariant hasGroupGraph() const
5231 static bool haveDot = Config_getBool(HAVE_DOT);
5232 static bool groupGraphs = Config_getBool(GROUP_GRAPHS);
5233 if (haveDot && groupGraphs)
5235 DotGroupCollaboration *graph = getGroupGraph();
5236 result = !graph->isTrivial();
5240 TemplateVariant groupGraph() const
5243 static bool haveDot = Config_getBool(HAVE_DOT);
5244 static bool groupGraphs = Config_getBool(GROUP_GRAPHS);
5245 if (haveDot && groupGraphs)
5247 DotGroupCollaboration *graph = getGroupGraph();
5248 FTextStream t(&result);
5249 switch (g_globals.outputFormat)
5251 case ContextOutputFormat_Html:
5253 graph->writeGraph(t,GOF_BITMAP,
5255 g_globals.outputDir,
5256 g_globals.outputDir+portable_pathSeparator()+m_groupDef->getOutputFileBase()+Doxygen::htmlFileExtension,
5259 g_globals.dynSectionId);
5262 case ContextOutputFormat_Latex:
5264 graph->writeGraph(t,GOF_EPS,
5266 g_globals.outputDir,
5267 g_globals.outputDir+portable_pathSeparator()+m_groupDef->getOutputFileBase()+".tex",
5270 g_globals.dynSectionId);
5273 // TODO: support other generators
5275 err("context.cpp: output format not yet supported");
5278 g_globals.dynSectionId++;
5280 return TemplateVariant(result.data(),TRUE);
5282 TemplateVariant hasDetails() const
5284 return m_groupDef->hasDetailedDescription();
5286 TemplateVariant modules() const
5288 Cachable &cache = getCache();
5291 TemplateList *moduleList = TemplateList::alloc();
5292 if (m_groupDef->getSubGroups())
5294 GroupListIterator gli(*m_groupDef->getSubGroups());
5296 for (gli.toFirst();(gd=gli.current());++gli)
5298 if (gd->isVisible())
5300 moduleList->append(ModuleContext::alloc(gd));
5304 cache.modules.reset(moduleList);
5306 return cache.modules.get();
5308 TemplateVariant examples() const
5310 Cachable &cache = getCache();
5311 if (!cache.examples)
5313 TemplateList *exampleList = TemplateList::alloc();
5314 if (m_groupDef->getExamples())
5316 PageSDict::Iterator eli(*m_groupDef->getExamples());
5318 for (eli.toFirst();(ex=eli.current());++eli)
5320 exampleList->append(PageContext::alloc(ex,FALSE,TRUE));
5323 cache.examples.reset(exampleList);
5325 return cache.examples.get();
5327 TemplateVariant pages() const
5329 Cachable &cache = getCache();
5332 TemplateList *pageList = TemplateList::alloc();
5333 if (m_groupDef->getExamples())
5335 PageSDict::Iterator eli(*m_groupDef->getPages());
5337 for (eli.toFirst();(ex=eli.current());++eli)
5339 pageList->append(PageContext::alloc(ex,FALSE,TRUE));
5342 cache.pages.reset(pageList);
5344 return cache.pages.get();
5346 TemplateVariant dirs() const
5348 Cachable &cache = getCache();
5351 TemplateList *dirList = TemplateList::alloc();
5352 if (m_groupDef->getDirs())
5354 QListIterator<DirDef> it(*m_groupDef->getDirs());
5356 for (it.toFirst();(dd=it.current());++it)
5358 dirList->append(DirContext::alloc(dd));
5361 cache.dirs.reset(dirList);
5363 return cache.dirs.get();
5365 TemplateVariant files() const
5367 Cachable &cache = getCache();
5370 TemplateList *fileList = TemplateList::alloc();
5371 if (m_groupDef->getFiles())
5373 QListIterator<FileDef> it(*m_groupDef->getFiles());
5375 for (it.toFirst();(fd=it.current());++it)
5377 fileList->append(FileContext::alloc(fd));
5380 cache.files.reset(fileList);
5382 return cache.files.get();
5384 TemplateVariant classes() const
5386 Cachable &cache = getCache();
5389 TemplateList *classList = TemplateList::alloc();
5390 if (m_groupDef->getClasses())
5392 ClassSDict::Iterator sdi(*m_groupDef->getClasses());
5394 for (sdi.toFirst();(cd=sdi.current());++sdi)
5396 if (cd->visibleInParentsDeclList())
5398 classList->append(ClassContext::alloc(cd));
5402 cache.classes.reset(classList);
5404 return cache.classes.get();
5406 TemplateVariant namespaces() const
5408 Cachable &cache = getCache();
5409 if (!cache.namespaces)
5411 TemplateList *namespaceList = TemplateList::alloc();
5412 if (m_groupDef->getNamespaces())
5414 NamespaceSDict::Iterator sdi(*m_groupDef->getNamespaces());
5416 for (sdi.toFirst();(nd=sdi.current());++sdi)
5418 if (nd->isLinkable() && !nd->isConstantGroup())
5420 namespaceList->append(NamespaceContext::alloc(nd));
5424 cache.namespaces.reset(namespaceList);
5426 return cache.namespaces.get();
5428 TemplateVariant constantgroups() const
5430 Cachable &cache = getCache();
5431 if (!cache.constantgroups)
5433 TemplateList *namespaceList = TemplateList::alloc();
5434 if (m_groupDef->getNamespaces())
5436 NamespaceSDict::Iterator sdi(*m_groupDef->getNamespaces());
5438 for (sdi.toFirst();(nd=sdi.current());++sdi)
5440 if (nd->isLinkable() && nd->isConstantGroup())
5442 namespaceList->append(NamespaceContext::alloc(nd));
5446 cache.constantgroups.reset(namespaceList);
5448 return cache.constantgroups.get();
5451 TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
5452 MemberListType type,const char *title,bool detailed=FALSE) const
5456 MemberList *ml = m_groupDef->getMemberList(type);
5459 list.reset(MemberListInfoContext::alloc(m_groupDef,relPathAsString(),ml,title,""));
5468 return TemplateVariant(FALSE);
5471 TemplateVariant macros() const
5473 return getMemberList(getCache().macros,MemberListType_decDefineMembers,theTranslator->trDefines());
5475 TemplateVariant typedefs() const
5477 return getMemberList(getCache().typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
5479 TemplateVariant enums() const
5481 return getMemberList(getCache().enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
5483 TemplateVariant enumValues() const
5485 return getMemberList(getCache().enums,MemberListType_decEnumValMembers,theTranslator->trEnumerationValues());
5487 TemplateVariant functions() const
5489 QCString title = theTranslator->trFunctions();
5490 SrcLangExt lang = m_groupDef->getLanguage();
5491 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
5492 else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc();
5493 return getMemberList(getCache().functions,MemberListType_decFuncMembers,title);
5495 TemplateVariant variables() const
5497 return getMemberList(getCache().variables,MemberListType_decVarMembers,theTranslator->trVariables());
5499 TemplateVariant signals() const
5501 return getMemberList(getCache().signals,MemberListType_signals,theTranslator->trSignals());
5503 TemplateVariant publicSlots() const
5505 return getMemberList(getCache().publicSlots,MemberListType_pubSlots,theTranslator->trPublicSlots());
5507 TemplateVariant protectedSlots() const
5509 return getMemberList(getCache().protectedSlots,MemberListType_proSlots,theTranslator->trProtectedSlots());
5511 TemplateVariant privateSlots() const
5513 return getMemberList(getCache().privateSlots,MemberListType_priSlots,theTranslator->trPrivateSlots());
5515 TemplateVariant events() const
5517 return getMemberList(getCache().events,MemberListType_events,theTranslator->trEvents());
5519 TemplateVariant properties() const
5521 return getMemberList(getCache().properties,MemberListType_properties,theTranslator->trProperties());
5523 TemplateVariant friends() const
5525 return getMemberList(getCache().friends,MemberListType_friends,theTranslator->trFriends());
5527 TemplateVariant memberGroups() const
5529 Cachable &cache = getCache();
5530 if (!cache.memberGroups)
5532 if (m_groupDef->getMemberGroupSDict())
5534 cache.memberGroups.reset(MemberGroupListContext::alloc(m_groupDef,relPathAsString(),m_groupDef->getMemberGroupSDict(),m_groupDef->subGrouping()));
5538 cache.memberGroups.reset(MemberGroupListContext::alloc());
5541 return cache.memberGroups.get();
5543 TemplateVariant detailedMacros() const
5545 return getMemberList(getCache().detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation());
5547 TemplateVariant detailedTypedefs() const
5549 return getMemberList(getCache().detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
5551 TemplateVariant detailedEnums() const
5553 return getMemberList(getCache().detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
5555 TemplateVariant detailedEnumValues() const
5557 return getMemberList(getCache().detailedEnumValues,MemberListType_docEnumValMembers,theTranslator->trEnumerationValueDocumentation());
5559 TemplateVariant detailedFunctions() const
5561 QCString title = theTranslator->trFunctionDocumentation();
5562 SrcLangExt lang = m_groupDef->getLanguage();
5563 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation();
5564 return getMemberList(getCache().detailedFunctions,MemberListType_docFuncMembers,title);
5566 TemplateVariant detailedVariables() const
5568 return getMemberList(getCache().detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
5570 TemplateVariant detailedSignals() const
5572 return getMemberList(getCache().detailedSignals,MemberListType_docSignalMembers,theTranslator->trSignals());
5574 TemplateVariant detailedPublicSlots() const
5576 return getMemberList(getCache().detailedPublicSlots,MemberListType_docPubSlotMembers,theTranslator->trPublicSlots());
5578 TemplateVariant detailedProtectedSlots() const
5580 return getMemberList(getCache().detailedProtectedSlots,MemberListType_docProSlotMembers,theTranslator->trProtectedSlots());
5582 TemplateVariant detailedPrivateSlots() const
5584 return getMemberList(getCache().detailedPrivateSlots,MemberListType_docPriSlotMembers,theTranslator->trPrivateSlots());
5586 TemplateVariant detailedEvents() const
5588 return getMemberList(getCache().detailedEvents,MemberListType_docEventMembers,theTranslator->trEventDocumentation(),TRUE);
5590 TemplateVariant detailedProperties() const
5592 return getMemberList(getCache().detailedProperties,MemberListType_docPropMembers,theTranslator->trPropertyDocumentation(),TRUE);
5594 TemplateVariant detailedFriends() const
5596 return getMemberList(getCache().detailedFriends,MemberListType_docFriendMembers,theTranslator->trFriends(),TRUE);
5598 TemplateVariant inlineClasses() const
5600 Cachable &cache = getCache();
5601 if (!cache.inlineClasses)
5603 TemplateList *classList = TemplateList::alloc();
5604 if (m_groupDef->getClasses())
5606 ClassSDict::Iterator sdi(*m_groupDef->getClasses());
5608 for (sdi.toFirst();(cd=sdi.current());++sdi)
5610 if (cd->name().find('@')==-1 &&
5611 cd->isLinkableInProject() &&
5612 cd->isEmbeddedInOuterScope() &&
5613 cd->partOfGroups()==0)
5615 classList->append(ClassContext::alloc(cd));
5619 cache.inlineClasses.reset(classList);
5621 return cache.inlineClasses.get();
5623 TemplateVariant compoundType() const
5625 return "module"; //theTranslator->trGroup(FALSE,TRUE);
5628 GroupDef *m_groupDef;
5629 struct Cachable : public DefinitionContext<ModuleContext::Private>::Cachable
5631 Cachable(GroupDef *gd) : DefinitionContext<ModuleContext::Private>::Cachable(gd) {}
5632 SharedPtr<TemplateList> modules;
5633 SharedPtr<TemplateList> dirs;
5634 SharedPtr<TemplateList> files;
5635 SharedPtr<TemplateList> classes;
5636 SharedPtr<TemplateList> namespaces;
5637 SharedPtr<TemplateList> constantgroups;
5638 SharedPtr<TemplateList> examples;
5639 SharedPtr<TemplateList> pages;
5640 SharedPtr<MemberListInfoContext> macros;
5641 SharedPtr<MemberListInfoContext> typedefs;
5642 SharedPtr<MemberListInfoContext> enums;
5643 SharedPtr<MemberListInfoContext> enumValues;
5644 SharedPtr<MemberListInfoContext> functions;
5645 SharedPtr<MemberListInfoContext> variables;
5646 SharedPtr<MemberListInfoContext> signals;
5647 SharedPtr<MemberListInfoContext> publicSlots;
5648 SharedPtr<MemberListInfoContext> protectedSlots;
5649 SharedPtr<MemberListInfoContext> privateSlots;
5650 SharedPtr<MemberListInfoContext> events;
5651 SharedPtr<MemberListInfoContext> properties;
5652 SharedPtr<MemberListInfoContext> friends;
5653 SharedPtr<MemberGroupListContext> memberGroups;
5654 SharedPtr<MemberListInfoContext> detailedMacros;
5655 SharedPtr<MemberListInfoContext> detailedTypedefs;
5656 SharedPtr<MemberListInfoContext> detailedEnums;
5657 SharedPtr<MemberListInfoContext> detailedEnumValues;
5658 SharedPtr<MemberListInfoContext> detailedFunctions;
5659 SharedPtr<MemberListInfoContext> detailedVariables;
5660 SharedPtr<MemberListInfoContext> detailedSignals;
5661 SharedPtr<MemberListInfoContext> detailedPublicSlots;
5662 SharedPtr<MemberListInfoContext> detailedProtectedSlots;
5663 SharedPtr<MemberListInfoContext> detailedPrivateSlots;
5664 SharedPtr<MemberListInfoContext> detailedEvents;
5665 SharedPtr<MemberListInfoContext> detailedProperties;
5666 SharedPtr<MemberListInfoContext> detailedFriends;
5667 SharedPtr<TemplateList> inlineClasses;
5668 ScopedPtr<DotGroupCollaboration> groupGraph;
5670 Cachable &getCache() const
5672 Cachable *c = static_cast<Cachable*>(m_groupDef->cookie());
5676 static PropertyMapper<ModuleContext::Private> s_inst;
5680 PropertyMapper<ModuleContext::Private> ModuleContext::Private::s_inst;
5682 ModuleContext::ModuleContext(GroupDef *gd) : RefCountedContext("ModuleContext")
5684 p = new Private(gd);
5687 ModuleContext::~ModuleContext()
5692 TemplateVariant ModuleContext::get(const char *n) const
5697 //------------------------------------------------------------------------
5699 //%% list ClassList[Class] : list of classes
5700 class ClassListContext::Private : public GenericNodeListContext
5703 void addClasses(const ClassSDict &classSDict)
5705 ClassSDict::Iterator cli(classSDict);
5707 for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
5709 if (cd->getLanguage()==SrcLangExt_VHDL &&
5710 ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
5711 (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
5712 ) // no architecture
5716 if (cd->isLinkableInProject() && cd->templateMaster()==0 &&
5717 !cd->isHidden() && !cd->isEmbeddedInOuterScope())
5719 append(ClassContext::alloc(cd));
5725 ClassListContext::ClassListContext() : RefCountedContext("ClassListContext")
5728 p->addClasses(*Doxygen::classSDict);
5729 p->addClasses(*Doxygen::hiddenClasses);
5732 ClassListContext::~ClassListContext()
5738 int ClassListContext::count() const
5743 TemplateVariant ClassListContext::at(int index) const
5745 return p->at(index);
5748 TemplateListIntf::ConstIterator *ClassListContext::createIterator() const
5750 return p->createIterator();
5753 //------------------------------------------------------------------------
5755 //%% list ClassIndex[Class] : list of classes
5756 class ClassIndexContext::Private
5761 static bool init=FALSE;
5764 s_inst.addProperty("list", &Private::list);
5765 s_inst.addProperty("fileName", &Private::fileName);
5766 s_inst.addProperty("relPath", &Private::relPath);
5767 s_inst.addProperty("highlight", &Private::highlight);
5768 s_inst.addProperty("subhighlight",&Private::subhighlight);
5769 s_inst.addProperty("title", &Private::title);
5773 TemplateVariant get(const char *n) const
5775 return s_inst.get(this,n);
5777 TemplateVariant list() const
5779 if (!m_cache.classes)
5781 TemplateList *classList = TemplateList::alloc();
5782 if (Doxygen::classSDict)
5784 ClassSDict::Iterator cli(*Doxygen::classSDict);
5786 for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
5788 if (cd->getLanguage()==SrcLangExt_VHDL &&
5789 ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
5790 (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
5791 ) // no architecture
5795 if (cd->isLinkableInProject() && cd->templateMaster()==0)
5797 classList->append(ClassContext::alloc(cd));
5801 m_cache.classes.reset(classList);
5803 return m_cache.classes.get();
5805 TemplateVariant fileName() const
5809 TemplateVariant relPath() const
5813 TemplateVariant highlight() const
5817 TemplateVariant subhighlight() const
5819 return "classindex";
5821 TemplateVariant title() const
5823 static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
5824 static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
5827 return theTranslator->trDataTypes();
5831 return VhdlDocGen::trDesignUnits();
5835 return theTranslator->trCompoundIndex();
5841 SharedPtr<TemplateList> classes;
5843 mutable Cachable m_cache;
5844 static PropertyMapper<ClassIndexContext::Private> s_inst;
5847 PropertyMapper<ClassIndexContext::Private> ClassIndexContext::Private::s_inst;
5849 ClassIndexContext::ClassIndexContext() : RefCountedContext("ClassIndexContext")
5852 //p->addClasses(*Doxygen::hiddenClasses);
5855 ClassIndexContext::~ClassIndexContext()
5860 // TemplateStructIntf
5861 TemplateVariant ClassIndexContext::get(const char *n) const
5866 //------------------------------------------------------------------------
5868 static int computeMaxDepth(const TemplateListIntf *list)
5873 TemplateListIntf::ConstIterator *it = list->createIterator();
5875 for (it->toFirst();it->current(v);it->toNext())
5877 const TemplateStructIntf *s = v.toStruct();
5878 TemplateVariant child = s->get("children");
5879 int d = computeMaxDepth(child.toList())+1;
5880 if (d>maxDepth) maxDepth=d;
5887 static int computeNumNodesAtLevel(const TemplateStructIntf *s,int level,int maxLevel)
5893 TemplateVariant child = s->get("children");
5896 TemplateListIntf::ConstIterator *it = child.toList()->createIterator();
5898 for (it->toFirst();it->current(v);it->toNext())
5900 num+=computeNumNodesAtLevel(v.toStruct(),level+1,maxLevel);
5908 static int computePreferredDepth(const TemplateListIntf *list,int maxDepth)
5910 int preferredNumEntries = Config_getInt(HTML_INDEX_NUM_ENTRIES);
5911 int preferredDepth=1;
5912 if (preferredNumEntries>0)
5914 int depth = maxDepth;
5915 for (int i=1;i<=depth;i++)
5918 TemplateListIntf::ConstIterator *it = list->createIterator();
5920 for (it->toFirst();it->current(v);it->toNext())
5922 num+=computeNumNodesAtLevel(v.toStruct(),0,i);
5925 if (num<=preferredNumEntries)
5935 return preferredDepth;
5938 //------------------------------------------------------------------------
5940 //%% struct ClassHierarchy: inheritance tree
5942 class ClassHierarchyContext::Private
5947 m_classTree.reset(NestingContext::alloc(0,0));
5948 initClassHierarchy(Doxygen::classSDict);
5949 initClassHierarchy(Doxygen::hiddenClasses);
5950 m_classTree->addClassHierarchy(*Doxygen::classSDict,TRUE);
5951 m_classTree->addClassHierarchy(*Doxygen::hiddenClasses,TRUE);
5952 //%% ClassInheritance tree
5953 static bool init=FALSE;
5956 s_inst.addProperty("tree", &Private::tree);
5957 s_inst.addProperty("fileName", &Private::fileName);
5958 s_inst.addProperty("relPath", &Private::relPath);
5959 s_inst.addProperty("highlight", &Private::highlight);
5960 s_inst.addProperty("subhighlight", &Private::subhighlight);
5961 s_inst.addProperty("title", &Private::title);
5962 s_inst.addProperty("preferredDepth", &Private::preferredDepth);
5963 s_inst.addProperty("maxDepth", &Private::maxDepth);
5964 s_inst.addProperty("diagrams", &Private::diagrams);
5968 TemplateVariant get(const char *n) const
5970 return s_inst.get(this,n);
5972 TemplateVariant tree() const
5974 return m_classTree.get();
5976 TemplateVariant fileName() const
5980 TemplateVariant relPath() const
5984 TemplateVariant highlight() const
5988 TemplateVariant subhighlight() const
5990 return "classhierarchy";
5992 DotGfxHierarchyTable *getHierarchy() const
5994 if (!m_cache.hierarchy)
5996 m_cache.hierarchy.reset(new DotGfxHierarchyTable());
5998 return m_cache.hierarchy.get();
6000 TemplateVariant diagrams() const
6002 if (!m_cache.diagrams)
6004 TemplateList *diagrams = TemplateList::alloc();
6005 DotGfxHierarchyTable *hierarchy = getHierarchy();
6006 if (hierarchy->subGraphs())
6009 QListIterator<DotNode> li(*hierarchy->subGraphs());
6011 for (li.toFirst();(n=li.current());++li)
6013 diagrams->append(InheritanceGraphContext::alloc(hierarchy,n,id++));
6016 m_cache.diagrams.reset(diagrams);
6018 return m_cache.diagrams.get();
6020 TemplateVariant title() const
6022 static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
6025 return VhdlDocGen::trDesignUnitHierarchy();
6029 return theTranslator->trClassHierarchy();
6032 TemplateVariant maxDepth() const
6034 if (!m_cache.maxDepthComputed)
6036 m_cache.maxDepth = computeMaxDepth(m_classTree.get());
6037 m_cache.maxDepthComputed=TRUE;
6039 return m_cache.maxDepth;
6041 TemplateVariant preferredDepth() const
6043 if (!m_cache.preferredDepthComputed)
6045 m_cache.preferredDepth = computePreferredDepth(m_classTree.get(),maxDepth().toInt());
6046 m_cache.preferredDepthComputed=TRUE;
6048 return m_cache.preferredDepth;
6051 SharedPtr<NestingContext> m_classTree;
6054 Cachable() : maxDepth(0), maxDepthComputed(FALSE),
6055 preferredDepth(0), preferredDepthComputed(FALSE), hierarchy(0) {}
6057 bool maxDepthComputed;
6059 bool preferredDepthComputed;
6060 SharedPtr<TemplateList> diagrams;
6061 ScopedPtr<DotGfxHierarchyTable> hierarchy;
6063 mutable Cachable m_cache;
6064 static PropertyMapper<ClassHierarchyContext::Private> s_inst;
6068 PropertyMapper<ClassHierarchyContext::Private> ClassHierarchyContext::Private::s_inst;
6070 ClassHierarchyContext::ClassHierarchyContext() : RefCountedContext("ClassHierarchyContext")
6075 ClassHierarchyContext::~ClassHierarchyContext()
6080 TemplateVariant ClassHierarchyContext::get(const char *name) const
6082 return p->get(name);
6085 //------------------------------------------------------------------------
6087 //%% struct NestingNode: node is a nesting relation tree
6089 class NestingNodeContext::Private
6092 Private(const NestingNodeContext *parent,const NestingNodeContext *thisNode,
6093 Definition *d,int index,int level,bool addCls,bool inherit, bool hideSuper)
6094 : m_parent(parent), m_def(d), m_level(level), m_index(index)
6096 m_children.reset(NestingContext::alloc(thisNode,level+1));
6097 static bool init=FALSE;
6100 //%% bool is_leaf_node: true if this node does not have any children
6101 s_inst.addProperty("is_leaf_node",&Private::isLeafNode);
6102 //%% Nesting children: list of nested classes/namespaces
6103 s_inst.addProperty("children",&Private::children);
6104 //%% [optional] Class class: class info (if this node represents a class)
6105 s_inst.addProperty("class",&Private::getClass);
6106 //%% [optional] Namespace namespace: namespace info (if this node represents a namespace)
6107 s_inst.addProperty("namespace",&Private::getNamespace);
6108 //%% [optional] File file: file info (if this node represents a file)
6109 s_inst.addProperty("file",&Private::getFile);
6110 //%% [optional] Dir dir: directory info (if this node represents a directory)
6111 s_inst.addProperty("dir",&Private::getDir);
6112 //%% [optional] Page page: page info (if this node represents a page)
6113 s_inst.addProperty("page",&Private::getPage);
6114 //%% [optional] Module module: module info (if this node represents a module)
6115 s_inst.addProperty("module",&Private::getModule);
6117 s_inst.addProperty("id",&Private::id);
6119 s_inst.addProperty("level",&Private::level);
6121 s_inst.addProperty("name",&Private::name);
6123 s_inst.addProperty("brief",&Private::brief);
6124 //%% bool isLinkable
6125 s_inst.addProperty("isLinkable",&Private::isLinkable);
6126 s_inst.addProperty("anchor",&Private::anchor);
6127 s_inst.addProperty("fileName",&Private::fileName);
6128 s_inst.addProperty("isReference",&Private::isReference);
6129 s_inst.addProperty("externalReference",&Private::externalReference);
6133 addNamespaces(addCls);
6134 addClasses(inherit,hideSuper);
6139 TemplateVariant get(const char *n) const
6141 return s_inst.get(this,n);
6143 TemplateVariant isLeafNode() const
6145 return m_children->count()==0;
6147 TemplateVariant children() const
6149 return m_children.get();
6151 TemplateVariant getClass() const
6153 if (!m_cache.classContext && m_def->definitionType()==Definition::TypeClass)
6155 m_cache.classContext.reset(ClassContext::alloc((ClassDef*)m_def));
6157 if (m_cache.classContext)
6159 return m_cache.classContext.get();
6163 return TemplateVariant(FALSE);
6166 TemplateVariant getNamespace() const
6168 if (!m_cache.namespaceContext && m_def->definitionType()==Definition::TypeNamespace)
6170 m_cache.namespaceContext.reset(NamespaceContext::alloc((NamespaceDef*)m_def));
6172 if (m_cache.namespaceContext)
6174 return m_cache.namespaceContext.get();
6178 return TemplateVariant(FALSE);
6181 TemplateVariant getDir() const
6183 if (!m_cache.dirContext && m_def->definitionType()==Definition::TypeDir)
6185 m_cache.dirContext.reset(DirContext::alloc((DirDef*)m_def));
6187 if (m_cache.dirContext)
6189 return m_cache.dirContext.get();
6193 return TemplateVariant(FALSE);
6196 TemplateVariant getFile() const
6198 if (!m_cache.fileContext && m_def->definitionType()==Definition::TypeFile)
6200 m_cache.fileContext.reset(FileContext::alloc((FileDef*)m_def));
6202 if (m_cache.fileContext)
6204 return m_cache.fileContext.get();
6208 return TemplateVariant(FALSE);
6211 TemplateVariant getPage() const
6213 if (!m_cache.pageContext && m_def->definitionType()==Definition::TypePage)
6215 m_cache.pageContext.reset(PageContext::alloc((PageDef*)m_def,FALSE,FALSE));
6217 if (m_cache.pageContext)
6219 return m_cache.pageContext.get();
6223 return TemplateVariant(FALSE);
6226 TemplateVariant getModule() const
6228 if (!m_cache.moduleContext && m_def->definitionType()==Definition::TypeGroup)
6230 m_cache.moduleContext.reset(ModuleContext::alloc((GroupDef*)m_def));
6232 if (m_cache.moduleContext)
6234 return m_cache.moduleContext.get();
6238 return TemplateVariant(FALSE);
6241 TemplateVariant level() const
6245 TemplateVariant id() const
6248 if (m_parent) result=m_parent->id();
6249 result+=QCString().setNum(m_index)+"_";
6252 TemplateVariant name() const
6254 return m_def->displayName(FALSE);
6256 QCString relPathAsString() const
6258 static bool createSubdirs = Config_getBool(CREATE_SUBDIRS);
6259 return createSubdirs ? QCString("../../") : QCString("");
6261 TemplateVariant brief() const
6265 if (m_def->hasBriefDescription())
6267 m_cache.brief.reset(new TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(),
6268 "",m_def->briefDescription(),TRUE)));
6272 m_cache.brief.reset(new TemplateVariant(""));
6275 return *m_cache.brief;
6277 TemplateVariant isLinkable() const
6279 return m_def->isLinkable();
6281 TemplateVariant anchor() const
6283 return m_def->anchor();
6285 TemplateVariant fileName() const
6287 return m_def->getOutputFileBase();
6289 TemplateVariant isReference() const
6291 return m_def->isReference();
6293 TemplateVariant externalReference() const
6295 return m_def->externalReference(relPathAsString());
6298 //------------------------------------------------------------------
6300 void addClasses(bool inherit, bool hideSuper)
6302 ClassDef *cd = m_def->definitionType()==Definition::TypeClass ? (ClassDef*)m_def : 0;
6305 bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd);
6308 bool wasVisited=cd->visited;
6310 if (cd->getLanguage()==SrcLangExt_VHDL)
6312 m_children->addDerivedClasses(cd->baseClasses(),wasVisited);
6316 m_children->addDerivedClasses(cd->subClasses(),wasVisited);
6322 if (cd && cd->getClassSDict())
6324 m_children->addClasses(*cd->getClassSDict(),FALSE);
6328 void addNamespaces(bool addClasses)
6330 NamespaceDef *nd = m_def->definitionType()==Definition::TypeNamespace ? (NamespaceDef*)m_def : 0;
6331 if (nd && nd->getNamespaceSDict())
6333 m_children->addNamespaces(*nd->getNamespaceSDict(),FALSE,addClasses);
6335 if (addClasses && nd && nd->getClassSDict())
6337 m_children->addClasses(*nd->getClassSDict(),FALSE);
6342 DirDef *dd = m_def->definitionType()==Definition::TypeDir ? (DirDef*)m_def : 0;
6345 m_children->addDirs(dd->subDirs());
6346 if (dd && dd->getFiles())
6348 m_children->addFiles(*dd->getFiles());
6354 PageDef *pd = m_def->definitionType()==Definition::TypePage ? (PageDef*)m_def : 0;
6355 if (pd && pd->getSubPages())
6357 m_children->addPages(*pd->getSubPages(),FALSE);
6362 GroupDef *gd = m_def->definitionType()==Definition::TypeGroup ? (GroupDef*)m_def : 0;
6363 if (gd && gd->getSubGroups())
6365 m_children->addModules(*gd->getSubGroups());
6369 const NestingNodeContext *m_parent;
6371 SharedPtr<NestingContext> m_children;
6376 SharedPtr<ClassContext> classContext;
6377 SharedPtr<NamespaceContext> namespaceContext;
6378 SharedPtr<DirContext> dirContext;
6379 SharedPtr<FileContext> fileContext;
6380 SharedPtr<PageContext> pageContext;
6381 SharedPtr<ModuleContext> moduleContext;
6382 ScopedPtr<TemplateVariant> brief;
6384 mutable Cachable m_cache;
6385 static PropertyMapper<NestingNodeContext::Private> s_inst;
6389 PropertyMapper<NestingNodeContext::Private> NestingNodeContext::Private::s_inst;
6391 NestingNodeContext::NestingNodeContext(const NestingNodeContext *parent,
6392 Definition *d,int index,int level,bool addClass,bool inherit,bool hideSuper)
6393 : RefCountedContext("NestingNodeContext")
6395 p = new Private(parent,this,d,index,level,addClass,inherit,hideSuper);
6398 NestingNodeContext::~NestingNodeContext()
6403 TemplateVariant NestingNodeContext::get(const char *n) const
6408 QCString NestingNodeContext::id() const
6410 return p->id().toString();
6413 //------------------------------------------------------------------------
6415 //%% list Nesting[NestingNode]: namespace and class nesting relations
6416 class NestingContext::Private : public GenericNodeListContext
6419 Private(const NestingNodeContext *parent,int level)
6420 : m_parent(parent), m_level(level), m_index(0) {}
6422 void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses)
6424 NamespaceSDict::Iterator nli(nsDict);
6426 for (nli.toFirst();(nd=nli.current());++nli)
6428 if (nd->localName().find('@')==-1 &&
6429 (!rootOnly || nd->getOuterScope()==Doxygen::globalScope))
6431 bool hasChildren = namespaceHasVisibleChild(nd,addClasses);
6432 bool isLinkable = nd->isLinkableInProject();
6433 if (isLinkable || hasChildren)
6435 NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,nd,m_index,m_level,addClasses,FALSE,FALSE);
6442 void addClasses(const ClassSDict &clDict,bool rootOnly)
6444 ClassSDict::Iterator cli(clDict);
6446 for (;(cd=cli.current());++cli)
6448 if (cd->getLanguage()==SrcLangExt_VHDL)
6450 if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
6451 (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS
6458 cd->getOuterScope()==0 ||
6459 cd->getOuterScope()==Doxygen::globalScope
6462 if (classVisibleInIndex(cd) && cd->templateMaster()==0)
6464 NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,FALSE,FALSE);
6471 void addDirs(const DirSDict &dirDict)
6473 SDict<DirDef>::Iterator dli(dirDict);
6475 for (dli.toFirst();(dd=dli.current());++dli)
6477 if (dd->getOuterScope()==Doxygen::globalScope)
6479 append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE,FALSE,FALSE));
6484 void addDirs(const DirList &dirList)
6486 QListIterator<DirDef> li(dirList);
6488 for (li.toFirst();(dd=li.current());++li)
6490 append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE,FALSE,FALSE));
6494 void addFiles(const FileNameList &fnList)
6496 FileNameListIterator fnli(fnList);
6498 for (fnli.toFirst();(fn=fnli.current());++fnli)
6500 FileNameIterator fni(*fn);
6502 for (;(fd=fni.current());++fni)
6504 if (fd->getDirDef()==0) // top level file
6506 append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE,FALSE,FALSE));
6512 void addFiles(const FileList &fList)
6514 QListIterator<FileDef> li(fList);
6516 for (li.toFirst();(fd=li.current());++li)
6518 append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE,FALSE,FALSE));
6522 void addPages(const PageSDict &pages,bool rootOnly)
6524 SDict<PageDef>::Iterator pli(pages);
6526 for (pli.toFirst();(pd=pli.current());++pli)
6529 pd->getOuterScope()==0 ||
6530 pd->getOuterScope()->definitionType()!=Definition::TypePage)
6532 append(NestingNodeContext::alloc(m_parent,pd,m_index,m_level,FALSE,FALSE,FALSE));
6537 void addModules(const GroupSDict &groups)
6539 GroupSDict::Iterator gli(groups);
6541 for (gli.toFirst();(gd=gli.current());++gli)
6543 static bool externalGroups = Config_getBool(EXTERNAL_GROUPS);
6544 if (!gd->isASubGroup() && gd->isVisible() &&
6545 (!gd->isReference() || externalGroups)
6548 append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE,FALSE,FALSE));
6553 void addModules(const GroupList &list)
6555 GroupListIterator gli(list);
6557 for (gli.toFirst();(gd=gli.current());++gli)
6559 if (gd->isVisible())
6561 append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE,FALSE,FALSE));
6566 void addDerivedClasses(const BaseClassList *bcl,bool hideSuper)
6569 BaseClassListIterator bcli(*bcl);
6571 for (bcli.toFirst() ; (bcd=bcli.current()) ; ++bcli)
6573 ClassDef *cd=bcd->classDef;
6574 if (cd->getLanguage()==SrcLangExt_VHDL && (VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
6580 if (cd->getLanguage()==SrcLangExt_VHDL)
6582 b=hasVisibleRoot(cd->subClasses());
6586 b=hasVisibleRoot(cd->baseClasses());
6589 if (cd->isVisibleInHierarchy() && b)
6591 NestingNodeContext *tnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,TRUE,hideSuper);
6597 void addClassHierarchy(const ClassSDict &classSDict,bool)
6599 ClassSDict::Iterator cli(classSDict);
6601 for (cli.toFirst();(cd=cli.current());++cli)
6604 if (cd->getLanguage()==SrcLangExt_VHDL)
6606 if ((VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
6610 b=!hasVisibleRoot(cd->subClasses());
6614 b=!hasVisibleRoot(cd->baseClasses());
6618 if (cd->isVisibleInHierarchy()) // should it be visible
6620 // new root level class
6621 NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE,TRUE,cd->visited);
6630 const NestingNodeContext *m_parent;
6635 NestingContext::NestingContext(const NestingNodeContext *parent,int level) : RefCountedContext("NestingContext")
6637 p = new Private(parent,level);
6640 NestingContext::~NestingContext()
6646 int NestingContext::count() const
6651 TemplateVariant NestingContext::at(int index) const
6653 return p->at(index);
6656 TemplateListIntf::ConstIterator *NestingContext::createIterator() const
6658 return p->createIterator();
6661 void NestingContext::addClasses(const ClassSDict &clDict,bool rootOnly)
6663 p->addClasses(clDict,rootOnly);
6666 void NestingContext::addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses)
6668 p->addNamespaces(nsDict,rootOnly,addClasses);
6671 void NestingContext::addDirs(const DirSDict &dirs)
6676 void NestingContext::addDirs(const DirList &dirs)
6681 void NestingContext::addFiles(const FileNameList &files)
6686 void NestingContext::addFiles(const FileList &files)
6691 void NestingContext::addPages(const PageSDict &pages,bool rootOnly)
6693 p->addPages(pages,rootOnly);
6696 void NestingContext::addModules(const GroupSDict &modules)
6698 p->addModules(modules);
6701 void NestingContext::addModules(const GroupList &modules)
6703 p->addModules(modules);
6706 void NestingContext::addClassHierarchy(const ClassSDict &classSDict,bool rootOnly)
6708 p->addClassHierarchy(classSDict,rootOnly);
6711 void NestingContext::addDerivedClasses(const BaseClassList *bcl,bool hideSuper)
6713 p->addDerivedClasses(bcl,hideSuper);
6716 //------------------------------------------------------------------------
6718 //%% struct ClassTree: Class nesting relations
6720 class ClassTreeContext::Private
6725 m_classTree.reset(NestingContext::alloc(0,0));
6726 if (Doxygen::namespaceSDict)
6728 m_classTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,TRUE);
6730 if (Doxygen::classSDict)
6732 m_classTree->addClasses(*Doxygen::classSDict,TRUE);
6735 static bool init=FALSE;
6738 s_inst.addProperty("tree", &Private::tree);
6739 s_inst.addProperty("fileName", &Private::fileName);
6740 s_inst.addProperty("relPath", &Private::relPath);
6741 s_inst.addProperty("highlight", &Private::highlight);
6742 s_inst.addProperty("subhighlight", &Private::subhighlight);
6743 s_inst.addProperty("title", &Private::title);
6744 s_inst.addProperty("preferredDepth",&Private::preferredDepth);
6745 s_inst.addProperty("maxDepth", &Private::maxDepth);
6749 TemplateVariant get(const char *n) const
6751 return s_inst.get(this,n);
6753 TemplateVariant tree() const
6755 return m_classTree.get();
6757 TemplateVariant fileName() const
6761 TemplateVariant relPath() const
6765 TemplateVariant highlight() const
6769 TemplateVariant subhighlight() const
6773 TemplateVariant title() const
6775 static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
6776 static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
6779 return theTranslator->trCompoundListFortran();
6783 return VhdlDocGen::trDesignUnitList();
6787 return theTranslator->trClasses();
6790 TemplateVariant maxDepth() const
6792 if (!m_cache.maxDepthComputed)
6794 m_cache.maxDepth = computeMaxDepth(m_classTree.get());
6795 m_cache.maxDepthComputed=TRUE;
6797 return m_cache.maxDepth;
6799 TemplateVariant preferredDepth() const
6801 if (!m_cache.preferredDepthComputed)
6803 m_cache.preferredDepth = computePreferredDepth(m_classTree.get(),maxDepth().toInt());
6804 m_cache.preferredDepthComputed=TRUE;
6806 return m_cache.preferredDepth;
6809 SharedPtr<NestingContext> m_classTree;
6812 Cachable() : maxDepth(0), maxDepthComputed(FALSE),
6813 preferredDepth(0), preferredDepthComputed(FALSE) {}
6815 bool maxDepthComputed;
6817 bool preferredDepthComputed;
6819 mutable Cachable m_cache;
6820 static PropertyMapper<ClassTreeContext::Private> s_inst;
6824 PropertyMapper<ClassTreeContext::Private> ClassTreeContext::Private::s_inst;
6826 ClassTreeContext::ClassTreeContext() : RefCountedContext("ClassTreeContext")
6831 ClassTreeContext::~ClassTreeContext()
6836 TemplateVariant ClassTreeContext::get(const char *name) const
6838 return p->get(name);
6841 //------------------------------------------------------------------------
6843 //%% list NamespaceList[Namespace] : list of namespaces
6844 class NamespaceListContext::Private : public GenericNodeListContext
6847 void addNamespaces(const NamespaceSDict &nsDict)
6849 NamespaceSDict::Iterator nli(nsDict);
6851 for (nli.toFirst();(nd=nli.current());++nli)
6853 if (nd->isLinkableInProject())
6855 append(NamespaceContext::alloc(nd));
6861 NamespaceListContext::NamespaceListContext() : RefCountedContext("NamespaceListContext")
6864 p->addNamespaces(*Doxygen::namespaceSDict);
6867 NamespaceListContext::~NamespaceListContext()
6873 int NamespaceListContext::count() const
6878 TemplateVariant NamespaceListContext::at(int index) const
6880 return p->at(index);
6883 TemplateListIntf::ConstIterator *NamespaceListContext::createIterator() const
6885 return p->createIterator();
6888 //------------------------------------------------------------------------
6890 //%% struct NamespaceTree: tree of nested namespace
6892 class NamespaceTreeContext::Private
6897 m_namespaceTree.reset(NestingContext::alloc(0,0));
6898 if (Doxygen::namespaceSDict)
6900 m_namespaceTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,FALSE);
6903 static bool init=FALSE;
6906 s_inst.addProperty("tree", &Private::tree);
6907 s_inst.addProperty("fileName", &Private::fileName);
6908 s_inst.addProperty("relPath", &Private::relPath);
6909 s_inst.addProperty("highlight", &Private::highlight);
6910 s_inst.addProperty("subhighlight", &Private::subhighlight);
6911 s_inst.addProperty("title", &Private::title);
6912 s_inst.addProperty("preferredDepth",&Private::preferredDepth);
6913 s_inst.addProperty("maxDepth", &Private::maxDepth);
6917 TemplateVariant get(const char *n) const
6919 return s_inst.get(this,n);
6921 TemplateVariant tree() const
6923 return m_namespaceTree.get();
6925 TemplateVariant fileName() const
6927 return "namespaces";
6929 TemplateVariant relPath() const
6933 TemplateVariant highlight() const
6935 return "namespaces";
6937 TemplateVariant subhighlight() const
6939 return "namespacelist";
6941 TemplateVariant title() const
6943 static bool javaOpt = Config_getBool(OPTIMIZE_OUTPUT_JAVA);
6944 static bool fortranOpt = Config_getBool(OPTIMIZE_FOR_FORTRAN);
6945 static bool vhdlOpt = Config_getBool(OPTIMIZE_OUTPUT_VHDL);
6946 if (javaOpt || vhdlOpt)
6948 return theTranslator->trPackages();
6950 else if (fortranOpt)
6952 return theTranslator->trModulesList();
6956 return theTranslator->trNamespaceList();
6959 TemplateVariant maxDepth() const
6961 if (!m_cache.maxDepthComputed)
6963 m_cache.maxDepth = computeMaxDepth(m_namespaceTree.get());
6964 m_cache.maxDepthComputed=TRUE;
6966 return m_cache.maxDepth;
6968 TemplateVariant preferredDepth() const
6970 if (!m_cache.preferredDepthComputed)
6972 m_cache.preferredDepth = computePreferredDepth(m_namespaceTree.get(),maxDepth().toInt());
6973 m_cache.preferredDepthComputed=TRUE;
6975 return m_cache.preferredDepth;
6978 SharedPtr<NestingContext> m_namespaceTree;
6981 Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
6983 bool maxDepthComputed;
6985 bool preferredDepthComputed;
6987 mutable Cachable m_cache;
6988 static PropertyMapper<NamespaceTreeContext::Private> s_inst;
6992 PropertyMapper<NamespaceTreeContext::Private> NamespaceTreeContext::Private::s_inst;
6994 NamespaceTreeContext::NamespaceTreeContext() : RefCountedContext("NamespaceTreeContext")
6999 NamespaceTreeContext::~NamespaceTreeContext()
7004 TemplateVariant NamespaceTreeContext::get(const char *name) const
7006 return p->get(name);
7009 //------------------------------------------------------------------------
7011 //%% list FileList[File] : list of files
7012 class FileListContext::Private : public GenericNodeListContext
7015 void addFiles(const FileNameList &fnList)
7017 // TODO: if FULL_PATH_NAMES is enabled, the ordering should be dir+file
7018 FileNameListIterator fnli(fnList);
7020 for (fnli.toFirst();(fn=fnli.current());++fnli)
7022 FileNameIterator fni(*fn);
7024 for (fni.toFirst();(fd=fni.current());++fni)
7026 bool doc = fd->isLinkableInProject();
7027 bool src = fd->generateSourceFile();
7028 bool nameOk = !fd->isDocumentationFile();
7029 if (nameOk && (doc || src) && !fd->isReference())
7031 append(FileContext::alloc(fd));
7038 FileListContext::FileListContext() : RefCountedContext("FileListContext")
7041 if (Doxygen::inputNameList) p->addFiles(*Doxygen::inputNameList);
7044 FileListContext::~FileListContext()
7050 int FileListContext::count() const
7055 TemplateVariant FileListContext::at(int index) const
7057 return p->at(index);
7060 TemplateListIntf::ConstIterator *FileListContext::createIterator() const
7062 return p->createIterator();
7065 //------------------------------------------------------------------------
7067 //%% list DirList[Dir] : list of files
7068 class DirListContext::Private : public GenericNodeListContext
7074 DirSDict::Iterator sdi(*Doxygen::directories);
7075 for (sdi.toFirst();(dir=sdi.current());++sdi)
7077 append(DirContext::alloc(dir));
7082 DirListContext::DirListContext() : RefCountedContext("DirListContext")
7087 DirListContext::~DirListContext()
7093 int DirListContext::count() const
7098 TemplateVariant DirListContext::at(int index) const
7100 return p->at(index);
7103 TemplateListIntf::ConstIterator *DirListContext::createIterator() const
7105 return p->createIterator();
7109 //------------------------------------------------------------------------
7111 //%% list UsedFiles[File] : list of files
7112 class UsedFilesContext::Private : public GenericNodeListContext
7115 void addFile(FileDef *fd)
7117 append(FileContext::alloc(fd));
7121 UsedFilesContext::UsedFilesContext(ClassDef *cd) : RefCountedContext("UsedFilesContext")
7126 QListIterator<FileDef> li(cd->usedFiles());
7128 for (li.toFirst();(fd=li.current());++li)
7135 UsedFilesContext::~UsedFilesContext()
7141 int UsedFilesContext::count() const
7146 TemplateVariant UsedFilesContext::at(int index) const
7148 return p->at(index);
7151 TemplateListIntf::ConstIterator *UsedFilesContext::createIterator() const
7153 return p->createIterator();
7156 void UsedFilesContext::addFile(FileDef *fd)
7161 //------------------------------------------------------------------------
7163 //%% struct FileTree: tree of directories and files
7165 class FileTreeContext::Private
7171 m_dirFileTree.reset(NestingContext::alloc(0,0));
7172 if (Doxygen::directories)
7174 m_dirFileTree->addDirs(*Doxygen::directories);
7176 if (Doxygen::inputNameList)
7178 m_dirFileTree->addFiles(*Doxygen::inputNameList);
7181 static bool init=FALSE;
7184 s_inst.addProperty("tree", &Private::tree);
7185 s_inst.addProperty("fileName", &Private::fileName);
7186 s_inst.addProperty("relPath", &Private::relPath);
7187 s_inst.addProperty("highlight", &Private::highlight);
7188 s_inst.addProperty("subhighlight", &Private::subhighlight);
7189 s_inst.addProperty("title", &Private::title);
7190 s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7191 s_inst.addProperty("maxDepth", &Private::maxDepth);
7195 TemplateVariant get(const char *n) const
7197 return s_inst.get(this,n);
7199 TemplateVariant tree() const
7201 return m_dirFileTree.get();
7203 TemplateVariant fileName() const
7207 TemplateVariant relPath() const
7211 TemplateVariant highlight() const
7215 TemplateVariant subhighlight() const
7219 TemplateVariant title() const
7221 return theTranslator->trFileList();
7223 TemplateVariant maxDepth() const
7225 if (!m_cache.maxDepthComputed)
7227 m_cache.maxDepth = computeMaxDepth(m_dirFileTree.get());
7228 m_cache.maxDepthComputed=TRUE;
7230 return m_cache.maxDepth;
7232 TemplateVariant preferredDepth() const
7234 if (!m_cache.preferredDepthComputed)
7236 m_cache.preferredDepth = computePreferredDepth(m_dirFileTree.get(),maxDepth().toInt());
7237 m_cache.preferredDepthComputed=TRUE;
7239 return m_cache.preferredDepth;
7242 SharedPtr<NestingContext> m_dirFileTree;
7245 Cachable() : maxDepth(0), maxDepthComputed(FALSE),
7246 preferredDepth(0), preferredDepthComputed(FALSE) {}
7248 bool maxDepthComputed;
7250 bool preferredDepthComputed;
7252 mutable Cachable m_cache;
7253 static PropertyMapper<FileTreeContext::Private> s_inst;
7257 PropertyMapper<FileTreeContext::Private> FileTreeContext::Private::s_inst;
7259 FileTreeContext::FileTreeContext() : RefCountedContext("FileTreeContext")
7264 FileTreeContext::~FileTreeContext()
7269 TemplateVariant FileTreeContext::get(const char *name) const
7271 return p->get(name);
7274 //------------------------------------------------------------------------
7276 //%% struct PageTree: tree of related pages
7278 class PageTreeContext::Private
7281 Private(const PageSDict *pages)
7283 m_pageTree.reset(NestingContext::alloc(0,0));
7287 m_pageTree->addPages(*pages,TRUE);
7290 //%% PageNodeList tree:
7291 static bool init=FALSE;
7294 s_inst.addProperty("tree", &Private::tree);
7295 s_inst.addProperty("fileName", &Private::fileName);
7296 s_inst.addProperty("relPath", &Private::relPath);
7297 s_inst.addProperty("highlight", &Private::highlight);
7298 s_inst.addProperty("subhighlight", &Private::subhighlight);
7299 s_inst.addProperty("title", &Private::title);
7300 s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7301 s_inst.addProperty("maxDepth", &Private::maxDepth);
7305 TemplateVariant get(const char *n) const
7307 return s_inst.get(this,n);
7309 TemplateVariant tree() const
7311 return m_pageTree.get();
7313 TemplateVariant fileName() const
7317 TemplateVariant relPath() const
7321 TemplateVariant highlight() const
7325 TemplateVariant subhighlight() const
7329 TemplateVariant title() const
7331 return theTranslator->trRelatedPages();
7333 TemplateVariant maxDepth() const
7335 if (!m_cache.maxDepthComputed)
7337 m_cache.maxDepth = computeMaxDepth(m_pageTree.get());
7338 m_cache.maxDepthComputed=TRUE;
7340 return m_cache.maxDepth;
7342 TemplateVariant preferredDepth() const
7344 if (!m_cache.preferredDepthComputed)
7346 m_cache.preferredDepth = computePreferredDepth(m_pageTree.get(),maxDepth().toInt());
7347 m_cache.preferredDepthComputed=TRUE;
7349 return m_cache.preferredDepth;
7352 SharedPtr<NestingContext> m_pageTree;
7355 Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
7357 bool maxDepthComputed;
7359 bool preferredDepthComputed;
7361 mutable Cachable m_cache;
7362 static PropertyMapper<PageTreeContext::Private> s_inst;
7366 PropertyMapper<PageTreeContext::Private> PageTreeContext::Private::s_inst;
7368 PageTreeContext::PageTreeContext(const PageSDict *pages) : RefCountedContext("PageTreeContext")
7370 p = new Private(pages);
7373 PageTreeContext::~PageTreeContext()
7378 TemplateVariant PageTreeContext::get(const char *name) const
7380 return p->get(name);
7383 //------------------------------------------------------------------------
7385 //%% list PageList[Page]: list of pages
7386 class PageListContext::Private : public GenericNodeListContext
7389 void addPages(const PageSDict &pages)
7391 PageSDict::Iterator pdi(pages);
7393 for (pdi.toFirst();(pd=pdi.current());++pdi)
7395 if (!pd->getGroupDef() && !pd->isReference())
7397 append(PageContext::alloc(pd,FALSE,FALSE));
7403 PageListContext::PageListContext(const PageSDict *pages) : RefCountedContext("PageListContext")
7406 if (pages) p->addPages(*pages);
7409 PageListContext::~PageListContext()
7415 int PageListContext::count() const
7420 TemplateVariant PageListContext::at(int index) const
7422 return p->at(index);
7425 TemplateListIntf::ConstIterator *PageListContext::createIterator() const
7427 return p->createIterator();
7430 //------------------------------------------------------------------------
7432 //%% list ExampleList[Page]: list of pages
7433 class ExampleListContext::Private : public GenericNodeListContext
7438 if (Doxygen::exampleSDict)
7440 PageSDict::Iterator pdi(*Doxygen::exampleSDict);
7442 for (pdi.toFirst();(pd=pdi.current());++pdi)
7444 if (!pd->getGroupDef() && !pd->isReference())
7446 append(PageContext::alloc(pd,FALSE,TRUE));
7453 ExampleListContext::ExampleListContext() : RefCountedContext("ExampleListContext")
7458 ExampleListContext::~ExampleListContext()
7464 int ExampleListContext::count() const
7469 TemplateVariant ExampleListContext::at(int index) const
7471 return p->at(index);
7474 TemplateListIntf::ConstIterator *ExampleListContext::createIterator() const
7476 return p->createIterator();
7479 //------------------------------------------------------------------------
7481 //%% list ModuleList[ModuleNode]: list of directories and/or files
7482 class ModuleListContext::Private : public GenericNodeListContext
7487 GroupSDict::Iterator gli(*Doxygen::groupSDict);
7489 for (gli.toFirst();(gd=gli.current());++gli)
7491 if (!gd->isReference())
7493 append(ModuleContext::alloc(gd));
7499 ModuleListContext::ModuleListContext() : RefCountedContext("ModuleListContext")
7505 ModuleListContext::~ModuleListContext()
7511 int ModuleListContext::count() const
7516 TemplateVariant ModuleListContext::at(int index) const
7518 return p->at(index);
7521 TemplateListIntf::ConstIterator *ModuleListContext::createIterator() const
7523 return p->createIterator();
7526 //------------------------------------------------------------------------
7528 //%% struct ModuleTree: tree of modules
7530 class ModuleTreeContext::Private
7535 m_moduleTree.reset(NestingContext::alloc(0,0));
7537 if (Doxygen::groupSDict)
7539 m_moduleTree->addModules(*Doxygen::groupSDict);
7542 //%% ModuleList tree:
7543 static bool init=FALSE;
7546 s_inst.addProperty("tree", &Private::tree);
7547 s_inst.addProperty("fileName", &Private::fileName);
7548 s_inst.addProperty("relPath", &Private::relPath);
7549 s_inst.addProperty("highlight", &Private::highlight);
7550 s_inst.addProperty("subhighlight", &Private::subhighlight);
7551 s_inst.addProperty("title", &Private::title);
7552 s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7553 s_inst.addProperty("maxDepth", &Private::maxDepth);
7557 TemplateVariant get(const char *n) const
7559 return s_inst.get(this,n);
7561 TemplateVariant tree() const
7563 return m_moduleTree.get();
7565 TemplateVariant fileName() const
7569 TemplateVariant relPath() const
7573 TemplateVariant highlight() const
7577 TemplateVariant subhighlight() const
7581 TemplateVariant title() const
7583 return theTranslator->trModules();
7585 TemplateVariant maxDepth() const
7587 if (!m_cache.maxDepthComputed)
7589 m_cache.maxDepth = computeMaxDepth(m_moduleTree.get());
7590 m_cache.maxDepthComputed=TRUE;
7592 return m_cache.maxDepth;
7594 TemplateVariant preferredDepth() const
7596 if (!m_cache.preferredDepthComputed)
7598 m_cache.preferredDepth = computePreferredDepth(m_moduleTree.get(),maxDepth().toInt());
7599 m_cache.preferredDepthComputed=TRUE;
7601 return m_cache.preferredDepth;
7604 SharedPtr<NestingContext> m_moduleTree;
7607 Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
7609 bool maxDepthComputed;
7611 bool preferredDepthComputed;
7613 mutable Cachable m_cache;
7614 static PropertyMapper<ModuleTreeContext::Private> s_inst;
7618 PropertyMapper<ModuleTreeContext::Private> ModuleTreeContext::Private::s_inst;
7620 ModuleTreeContext::ModuleTreeContext() : RefCountedContext("ModuleTreeContext")
7625 ModuleTreeContext::~ModuleTreeContext()
7630 TemplateVariant ModuleTreeContext::get(const char *name) const
7632 return p->get(name);
7635 //------------------------------------------------------------------------
7637 //%% struct NavPathElem: list of examples page
7639 class NavPathElemContext::Private
7642 Private(Definition *def) : m_def(def)
7644 static bool init=FALSE;
7647 s_inst.addProperty("isLinkable", &Private::isLinkable);
7648 s_inst.addProperty("fileName", &Private::fileName);
7649 s_inst.addProperty("anchor", &Private::anchor);
7650 s_inst.addProperty("text", &Private::text);
7651 s_inst.addProperty("isReference", &Private::isReference);
7652 s_inst.addProperty("externalReference",&Private::externalReference);
7656 TemplateVariant get(const char *n) const
7658 return s_inst.get(this,n);
7660 TemplateVariant isLinkable() const
7662 return m_def->isLinkable();
7664 TemplateVariant anchor() const
7666 return m_def->anchor();
7668 TemplateVariant fileName() const
7670 return m_def->getOutputFileBase();
7672 TemplateVariant text() const
7674 Definition::DefType type = m_def->definitionType();
7675 QCString text = m_def->localName();
7676 if (type==Definition::TypeGroup)
7678 text = ((const GroupDef*)m_def)->groupTitle();
7680 else if (type==Definition::TypePage && !(((const PageDef*)m_def)->title().isEmpty()))
7682 text = ((const PageDef*)m_def)->title();
7684 else if (type==Definition::TypeClass)
7686 if (text.right(2)=="-p")
7688 text = text.left(text.length()-2);
7693 TemplateVariant isReference() const
7695 return m_def->isReference();
7697 QCString relPathAsString() const
7699 static bool createSubdirs = Config_getBool(CREATE_SUBDIRS);
7700 return createSubdirs ? QCString("../../") : QCString("");
7702 TemplateVariant externalReference() const
7704 return m_def->externalReference(relPathAsString());
7708 static PropertyMapper<NavPathElemContext::Private> s_inst;
7712 PropertyMapper<NavPathElemContext::Private> NavPathElemContext::Private::s_inst;
7714 NavPathElemContext::NavPathElemContext(Definition *def) : RefCountedContext("NavPathElemContext")
7716 p = new Private(def);
7719 NavPathElemContext::~NavPathElemContext()
7724 TemplateVariant NavPathElemContext::get(const char *name) const
7726 return p->get(name);
7730 //------------------------------------------------------------------------
7732 //%% struct ExampleList: list of examples page
7734 class ExampleTreeContext::Private
7739 m_exampleTree.reset(NestingContext::alloc(0,0));
7741 if (Doxygen::exampleSDict)
7743 m_exampleTree->addPages(*Doxygen::exampleSDict,TRUE);
7746 static bool init=FALSE;
7749 s_inst.addProperty("tree", &Private::tree);
7750 s_inst.addProperty("fileName", &Private::fileName);
7751 s_inst.addProperty("relPath", &Private::relPath);
7752 s_inst.addProperty("highlight", &Private::highlight);
7753 s_inst.addProperty("subhighlight", &Private::subhighlight);
7754 s_inst.addProperty("title", &Private::title);
7755 s_inst.addProperty("preferredDepth",&Private::preferredDepth);
7756 s_inst.addProperty("maxDepth", &Private::maxDepth);
7760 TemplateVariant get(const char *n) const
7762 return s_inst.get(this,n);
7764 TemplateVariant tree() const
7766 return m_exampleTree.get();
7768 TemplateVariant fileName() const
7772 TemplateVariant relPath() const
7776 TemplateVariant highlight() const
7780 TemplateVariant subhighlight() const
7784 TemplateVariant title() const
7786 return theTranslator->trExamples();
7788 TemplateVariant maxDepth() const
7790 if (!m_cache.maxDepthComputed)
7792 m_cache.maxDepth = computeMaxDepth(m_exampleTree.get());
7793 m_cache.maxDepthComputed=TRUE;
7795 return m_cache.maxDepth;
7797 TemplateVariant preferredDepth() const
7799 if (!m_cache.preferredDepthComputed)
7801 m_cache.preferredDepth = computePreferredDepth(m_exampleTree.get(),maxDepth().toInt());
7802 m_cache.preferredDepthComputed=TRUE;
7804 return m_cache.preferredDepth;
7807 SharedPtr<NestingContext> m_exampleTree;
7810 Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
7812 bool maxDepthComputed;
7814 bool preferredDepthComputed;
7816 mutable Cachable m_cache;
7817 static PropertyMapper<ExampleTreeContext::Private> s_inst;
7821 PropertyMapper<ExampleTreeContext::Private> ExampleTreeContext::Private::s_inst;
7823 ExampleTreeContext::ExampleTreeContext() : RefCountedContext("ExampleTreeContext")
7828 ExampleTreeContext::~ExampleTreeContext()
7833 TemplateVariant ExampleTreeContext::get(const char *name) const
7835 return p->get(name);
7838 //------------------------------------------------------------------------
7840 //%% struct GlobalsIndex: list of examples page
7842 class GlobalsIndexContext::Private
7847 static bool init=FALSE;
7850 s_inst.addProperty("all", &Private::all);
7851 s_inst.addProperty("functions", &Private::functions);
7852 s_inst.addProperty("variables", &Private::variables);
7853 s_inst.addProperty("typedefs", &Private::typedefs);
7854 s_inst.addProperty("enums", &Private::enums);
7855 s_inst.addProperty("enumValues", &Private::enumValues);
7856 s_inst.addProperty("macros", &Private::macros);
7857 s_inst.addProperty("properties", &Private::properties);
7858 s_inst.addProperty("events", &Private::events);
7859 s_inst.addProperty("related", &Private::related);
7860 s_inst.addProperty("fileName", &Private::fileName);
7861 s_inst.addProperty("relPath", &Private::relPath);
7862 s_inst.addProperty("highlight", &Private::highlight);
7863 s_inst.addProperty("subhighlight",&Private::subhighlight);
7864 s_inst.addProperty("title", &Private::title);
7868 TemplateVariant get(const char *n) const
7870 return s_inst.get(this,n);
7872 typedef bool (MemberDef::*MemberFunc)() const;
7873 TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const
7877 TemplateList *list = TemplateList::alloc();
7879 MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
7880 for (fnli.toFirst();(mn=fnli.current());++fnli)
7883 MemberNameIterator mni(*mn);
7884 for (mni.toFirst();(md=mni.current());++mni)
7886 FileDef *fd=md->getFileDef();
7887 if (fd && fd->isLinkableInProject() &&
7888 !md->name().isEmpty() && !md->getNamespaceDef() && md->isLinkableInProject())
7890 if (filter==0 || (md->*filter)())
7892 list->append(MemberContext::alloc(md));
7897 listRef.reset(list);
7899 return listRef.get();
7901 TemplateVariant all() const
7903 return getMembersFiltered(m_cache.all,0);
7905 TemplateVariant functions() const
7907 return getMembersFiltered(m_cache.functions,&MemberDef::isFunction);
7909 TemplateVariant variables() const
7911 return getMembersFiltered(m_cache.variables,&MemberDef::isVariable);
7913 TemplateVariant typedefs() const
7915 return getMembersFiltered(m_cache.typedefs,&MemberDef::isTypedef);
7917 TemplateVariant enums() const
7919 return getMembersFiltered(m_cache.enums,&MemberDef::isEnumerate);
7921 TemplateVariant enumValues() const
7923 return getMembersFiltered(m_cache.enumValues,&MemberDef::isEnumValue);
7925 TemplateVariant macros() const
7927 return getMembersFiltered(m_cache.macros,&MemberDef::isDefine);
7929 TemplateVariant properties() const
7933 TemplateVariant events() const
7937 TemplateVariant related() const
7941 TemplateVariant fileName() const
7945 TemplateVariant relPath() const
7949 TemplateVariant highlight() const
7953 TemplateVariant subhighlight() const
7955 return "filemembers";
7957 TemplateVariant title() const
7959 return theTranslator->trFileMembers();
7965 SharedPtr<TemplateList> all;
7966 SharedPtr<TemplateList> functions;
7967 SharedPtr<TemplateList> variables;
7968 SharedPtr<TemplateList> typedefs;
7969 SharedPtr<TemplateList> enums;
7970 SharedPtr<TemplateList> enumValues;
7971 SharedPtr<TemplateList> macros;
7973 mutable Cachable m_cache;
7974 static PropertyMapper<GlobalsIndexContext::Private> s_inst;
7978 PropertyMapper<GlobalsIndexContext::Private> GlobalsIndexContext::Private::s_inst;
7980 GlobalsIndexContext::GlobalsIndexContext() : RefCountedContext("GlobalsIndexContext")
7985 GlobalsIndexContext::~GlobalsIndexContext()
7990 TemplateVariant GlobalsIndexContext::get(const char *name) const
7992 return p->get(name);
7995 //------------------------------------------------------------------------
7997 //%% struct ClassMembersIndex: list of examples page
7999 class ClassMembersIndexContext::Private
8004 static bool init=FALSE;
8007 s_inst.addProperty("all", &Private::all);
8008 s_inst.addProperty("functions", &Private::functions);
8009 s_inst.addProperty("variables", &Private::variables);
8010 s_inst.addProperty("typedefs", &Private::typedefs);
8011 s_inst.addProperty("enums", &Private::enums);
8012 s_inst.addProperty("enumValues", &Private::enumValues);
8013 s_inst.addProperty("macros", &Private::macros);
8014 s_inst.addProperty("properties", &Private::properties);
8015 s_inst.addProperty("events", &Private::events);
8016 s_inst.addProperty("related", &Private::related);
8017 s_inst.addProperty("fileName", &Private::fileName);
8018 s_inst.addProperty("relPath", &Private::relPath);
8019 s_inst.addProperty("highlight", &Private::highlight);
8020 s_inst.addProperty("subhighlight",&Private::subhighlight);
8021 s_inst.addProperty("title", &Private::title);
8025 TemplateVariant get(const char *n) const
8027 return s_inst.get(this,n);
8029 typedef bool (MemberDef::*MemberFunc)() const;
8030 TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const
8034 TemplateList *list = TemplateList::alloc();
8036 MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
8037 for (mnli.toFirst();(mn=mnli.current());++mnli)
8040 MemberNameIterator mni(*mn);
8041 for (mni.toFirst();(md=mni.current());++mni)
8043 ClassDef *cd = md->getClassDef();
8044 if (cd && cd->isLinkableInProject() && cd->templateMaster()==0 &&
8045 md->isLinkableInProject() && !md->name().isEmpty())
8047 if (filter==0 || (md->*filter)())
8049 list->append(MemberContext::alloc(md));
8054 listRef.reset(list);
8056 return listRef.get();
8058 TemplateVariant all() const
8060 return getMembersFiltered(m_cache.all,&MemberDef::isNotFriend);
8062 TemplateVariant functions() const
8064 return getMembersFiltered(m_cache.functions,&MemberDef::isFunctionOrSignalSlot);
8066 TemplateVariant variables() const
8068 return getMembersFiltered(m_cache.variables,&MemberDef::isVariable);
8070 TemplateVariant typedefs() const
8072 return getMembersFiltered(m_cache.typedefs,&MemberDef::isTypedef);
8074 TemplateVariant enums() const
8076 return getMembersFiltered(m_cache.enums,&MemberDef::isEnumerate);
8078 TemplateVariant enumValues() const
8080 return getMembersFiltered(m_cache.enumValues,&MemberDef::isEnumValue);
8082 TemplateVariant macros() const
8086 TemplateVariant properties() const
8088 return getMembersFiltered(m_cache.properties,&MemberDef::isProperty);
8090 TemplateVariant events() const
8092 return getMembersFiltered(m_cache.events,&MemberDef::isEvent);
8094 TemplateVariant related() const
8096 return getMembersFiltered(m_cache.related,&MemberDef::isRelated);
8098 TemplateVariant fileName() const
8102 TemplateVariant relPath() const
8106 TemplateVariant highlight() const
8110 TemplateVariant subhighlight() const
8112 return "classmembers";
8114 TemplateVariant title() const
8116 return theTranslator->trCompoundMembers();
8122 SharedPtr<TemplateList> all;
8123 SharedPtr<TemplateList> functions;
8124 SharedPtr<TemplateList> variables;
8125 SharedPtr<TemplateList> typedefs;
8126 SharedPtr<TemplateList> enums;
8127 SharedPtr<TemplateList> enumValues;
8128 SharedPtr<TemplateList> properties;
8129 SharedPtr<TemplateList> events;
8130 SharedPtr<TemplateList> related;
8132 mutable Cachable m_cache;
8133 static PropertyMapper<ClassMembersIndexContext::Private> s_inst;
8137 PropertyMapper<ClassMembersIndexContext::Private> ClassMembersIndexContext::Private::s_inst;
8139 ClassMembersIndexContext::ClassMembersIndexContext() : RefCountedContext("ClassMembersIndexContext")
8144 ClassMembersIndexContext::~ClassMembersIndexContext()
8149 TemplateVariant ClassMembersIndexContext::get(const char *name) const
8151 return p->get(name);
8154 //------------------------------------------------------------------------
8156 //%% struct NamespaceMembersIndex: list of examples page
8158 class NamespaceMembersIndexContext::Private
8163 static bool init=FALSE;
8166 s_inst.addProperty("all", &Private::all);
8167 s_inst.addProperty("functions", &Private::functions);
8168 s_inst.addProperty("variables", &Private::variables);
8169 s_inst.addProperty("typedefs", &Private::typedefs);
8170 s_inst.addProperty("enums", &Private::enums);
8171 s_inst.addProperty("enumValues", &Private::enumValues);
8172 s_inst.addProperty("macros", &Private::macros);
8173 s_inst.addProperty("properties", &Private::properties);
8174 s_inst.addProperty("events", &Private::events);
8175 s_inst.addProperty("related", &Private::related);
8176 s_inst.addProperty("fileName", &Private::fileName);
8177 s_inst.addProperty("relPath", &Private::relPath);
8178 s_inst.addProperty("highlight", &Private::highlight);
8179 s_inst.addProperty("subhighlight",&Private::subhighlight);
8180 s_inst.addProperty("title", &Private::title);
8184 TemplateVariant get(const char *n) const
8186 return s_inst.get(this,n);
8188 typedef bool (MemberDef::*MemberFunc)() const;
8189 TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const
8193 TemplateList *list = TemplateList::alloc();
8195 MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
8196 for (fnli.toFirst();(mn=fnli.current());++fnli)
8199 MemberNameIterator mni(*mn);
8200 for (mni.toFirst();(md=mni.current());++mni)
8202 NamespaceDef *nd=md->getNamespaceDef();
8203 if (nd && nd->isLinkableInProject() &&
8204 !md->name().isEmpty() && md->isLinkableInProject())
8206 if (filter==0 || (md->*filter)())
8208 list->append(MemberContext::alloc(md));
8213 listRef.reset(list);
8215 return listRef.get();
8217 TemplateVariant all() const
8219 return getMembersFiltered(m_cache.all,0);
8221 TemplateVariant functions() const
8223 return getMembersFiltered(m_cache.functions,&MemberDef::isFunction);
8225 TemplateVariant variables() const
8227 return getMembersFiltered(m_cache.variables,&MemberDef::isVariable);
8229 TemplateVariant typedefs() const
8231 return getMembersFiltered(m_cache.typedefs,&MemberDef::isTypedef);
8233 TemplateVariant enums() const
8235 return getMembersFiltered(m_cache.enums,&MemberDef::isEnumerate);
8237 TemplateVariant enumValues() const
8239 return getMembersFiltered(m_cache.enumValues,&MemberDef::isEnumValue);
8241 TemplateVariant macros() const
8245 TemplateVariant properties() const
8249 TemplateVariant events() const
8253 TemplateVariant related() const
8257 TemplateVariant fileName() const
8259 return "namespacemembers";
8261 TemplateVariant relPath() const
8265 TemplateVariant highlight() const
8267 return "namespaces";
8269 TemplateVariant subhighlight() const
8271 return "namespacemembers";
8273 TemplateVariant title() const
8275 return theTranslator->trNamespaceMembers();
8281 SharedPtr<TemplateList> all;
8282 SharedPtr<TemplateList> functions;
8283 SharedPtr<TemplateList> variables;
8284 SharedPtr<TemplateList> typedefs;
8285 SharedPtr<TemplateList> enums;
8286 SharedPtr<TemplateList> enumValues;
8288 mutable Cachable m_cache;
8289 static PropertyMapper<NamespaceMembersIndexContext::Private> s_inst;
8293 PropertyMapper<NamespaceMembersIndexContext::Private> NamespaceMembersIndexContext::Private::s_inst;
8295 NamespaceMembersIndexContext::NamespaceMembersIndexContext() : RefCountedContext("NamespaceMembersIndexContext")
8300 NamespaceMembersIndexContext::~NamespaceMembersIndexContext()
8305 TemplateVariant NamespaceMembersIndexContext::get(const char *name) const
8307 return p->get(name);
8310 //------------------------------------------------------------------------
8312 //%% struct InheritanceGraph: a connected graph reprenting part of the overall interitance tree
8314 class InheritanceGraphContext::Private
8317 Private(DotGfxHierarchyTable *hierarchy,DotNode *n,int id) : m_hierarchy(hierarchy), m_node(n), m_id(id)
8319 static bool init=FALSE;
8322 s_inst.addProperty("graph",&Private::graph);
8326 TemplateVariant get(const char *n) const
8328 return s_inst.get(this,n);
8330 TemplateVariant graph() const
8333 static bool haveDot = Config_getBool(HAVE_DOT);
8334 static bool graphicalHierarchy = Config_getBool(GRAPHICAL_HIERARCHY);
8335 if (haveDot && graphicalHierarchy)
8337 FTextStream t(&result);
8338 m_hierarchy->createGraph(m_node,t,
8341 g_globals.outputDir,
8342 g_globals.outputDir+portable_pathSeparator()+"inherits"+Doxygen::htmlFileExtension,
8345 return TemplateVariant(result.data(),TRUE);
8348 DotGfxHierarchyTable *m_hierarchy;
8351 static PropertyMapper<InheritanceGraphContext::Private> s_inst;
8354 PropertyMapper<InheritanceGraphContext::Private> InheritanceGraphContext::Private::s_inst;
8356 InheritanceGraphContext::InheritanceGraphContext(DotGfxHierarchyTable *hierarchy,DotNode *n,int id)
8357 : RefCountedContext("InheritanceGraphContext")
8359 p = new Private(hierarchy,n,id);
8362 InheritanceGraphContext::~InheritanceGraphContext()
8367 TemplateVariant InheritanceGraphContext::get(const char *name) const
8369 return p->get(name);
8373 //------------------------------------------------------------------------
8375 //%% struct InheritanceNode: a class in the inheritance list
8377 class InheritanceNodeContext::Private
8380 Private(ClassDef *cd,const QCString &name) : m_classDef(cd), m_name(name)
8382 static bool init=FALSE;
8385 s_inst.addProperty("class",&Private::getClass);
8386 s_inst.addProperty("name", &Private::name);
8390 TemplateVariant get(const char *n) const
8392 return s_inst.get(this,n);
8394 TemplateVariant getClass() const
8396 if (!m_classContext)
8398 m_classContext.reset(ClassContext::alloc(m_classDef));
8400 return m_classContext.get();
8402 TemplateVariant name() const
8407 ClassDef *m_classDef;
8408 mutable SharedPtr<ClassContext> m_classContext;
8410 static PropertyMapper<InheritanceNodeContext::Private> s_inst;
8414 PropertyMapper<InheritanceNodeContext::Private> InheritanceNodeContext::Private::s_inst;
8416 InheritanceNodeContext::InheritanceNodeContext(ClassDef *cd,const QCString &name) : RefCountedContext("InheritanceNodeContext")
8418 p = new Private(cd,name);
8421 InheritanceNodeContext::~InheritanceNodeContext()
8426 TemplateVariant InheritanceNodeContext::get(const char *name) const
8428 return p->get(name);
8431 //------------------------------------------------------------------------
8433 //%% list InheritanceList[InheritanceNode] : list of inherited classes
8434 class InheritanceListContext::Private : public GenericNodeListContext
8437 void addClass(ClassDef *cd,const QCString &name)
8439 append(InheritanceNodeContext::alloc(cd,name));
8443 InheritanceListContext::InheritanceListContext(const BaseClassList *list, bool baseClasses) : RefCountedContext("InheritanceListContext")
8448 BaseClassListIterator li(*list);
8450 for (li.toFirst();(bcd=li.current());++li)
8452 ClassDef *cd=bcd->classDef;
8456 name = insertTemplateSpecifierInScope(
8457 cd->displayName(),bcd->templSpecifiers);
8461 name = cd->displayName();
8463 //printf("InheritanceListContext: adding %s baseClass=%d\n",name.data(),baseClasses);
8464 p->addClass(cd,name);
8469 InheritanceListContext::~InheritanceListContext()
8475 int InheritanceListContext::count() const
8480 TemplateVariant InheritanceListContext::at(int index) const
8482 return p->at(index);
8485 TemplateListIntf::ConstIterator *InheritanceListContext::createIterator() const
8487 return p->createIterator();
8490 //------------------------------------------------------------------------
8492 //%% list MemberList[Member] : list of inherited classes
8493 class MemberListContext::Private : public GenericNodeListContext
8496 void addMember(MemberDef *md)
8498 append(MemberContext::alloc(md));
8502 MemberListContext::MemberListContext() : RefCountedContext("MemberListContext")
8507 MemberListContext::MemberListContext(const MemberList *list) : RefCountedContext("MemberListContext")
8512 bool details = list->listType()&MemberListType_detailedLists;
8513 MemberListIterator mli(*list);
8515 for (mli.toFirst();(md=mli.current());++mli)
8517 if ((md->isBriefSectionVisible() && !details) ||
8518 (md->isDetailedSectionLinkable() && details)
8527 MemberListContext::MemberListContext(MemberSDict *list,bool doSort) : RefCountedContext("MemberListContext")
8536 MemberSDict::Iterator it(*list);
8538 for (it.toFirst();(md=it.current());++it)
8545 MemberListContext::~MemberListContext()
8551 int MemberListContext::count() const
8556 TemplateVariant MemberListContext::at(int index) const
8558 return p->at(index);
8561 TemplateListIntf::ConstIterator *MemberListContext::createIterator() const
8563 return p->createIterator();
8566 //------------------------------------------------------------------------
8568 //%% struct MemberInfo: member information
8570 class MemberInfoContext::Private
8573 Private(const MemberInfo *mi) : m_memberInfo(mi)
8575 static bool init=FALSE;
8578 //%% string protection
8579 s_inst.addProperty("protection", &Private::protection);
8580 //%% string virtualness
8581 s_inst.addProperty("virtualness", &Private::virtualness);
8582 //%% string ambiguityScope
8583 s_inst.addProperty("ambiguityScope",&Private::ambiguityScope);
8585 s_inst.addProperty("member", &Private::member);
8589 TemplateVariant get(const char *n) const
8591 return s_inst.get(this,n);
8593 TemplateVariant protection() const
8595 switch (m_memberInfo->prot)
8597 case ::Public: return "public";
8598 case ::Protected: return "protected";
8599 case ::Private: return "private";
8600 case ::Package: return "package";
8604 TemplateVariant virtualness() const
8606 switch (m_memberInfo->virt)
8608 case ::Normal: return "normal";
8609 case ::Virtual: return "virtual";
8610 case ::Pure: return "pure";
8614 TemplateVariant ambiguityScope() const
8616 return m_memberInfo->ambiguityResolutionScope;
8618 TemplateVariant member() const
8620 if (!m_member && m_memberInfo->memberDef)
8622 m_member.reset(MemberContext::alloc(m_memberInfo->memberDef));
8626 return m_member.get();
8630 return TemplateVariant(FALSE);
8634 const MemberInfo *m_memberInfo;
8635 mutable SharedPtr<MemberContext> m_member;
8636 static PropertyMapper<MemberInfoContext::Private> s_inst;
8640 PropertyMapper<MemberInfoContext::Private> MemberInfoContext::Private::s_inst;
8642 MemberInfoContext::MemberInfoContext(const MemberInfo *mi) : RefCountedContext("MemberInfoContext")
8644 p = new Private(mi);
8647 MemberInfoContext::~MemberInfoContext()
8652 TemplateVariant MemberInfoContext::get(const char *name) const
8654 return p->get(name);
8658 //------------------------------------------------------------------------
8660 //%% list AllMembersList[MemberList] : list of inherited classes
8661 class AllMembersListContext::Private : public GenericNodeListContext
8664 Private(const MemberNameInfoSDict *ml)
8668 static bool hideUndocMembers = Config_getBool(HIDE_UNDOC_MEMBERS);
8669 MemberNameInfoSDict::Iterator mnii(*ml);
8670 MemberNameInfo *mni;
8671 for (mnii.toFirst();(mni=mnii.current());++mnii)
8673 MemberNameInfoIterator mnii2(*mni);
8675 for (mnii2.toFirst();(mi=mnii2.current());++mnii2)
8677 MemberDef *md=mi->memberDef;
8678 ClassDef *cd=md->getClassDef();
8679 if (cd && !md->name().isEmpty() && md->name()[0]!='@')
8681 if ((cd->isLinkable() && md->isLinkable()) ||
8682 (!cd->isArtificial() && !hideUndocMembers &&
8683 (protectionLevelVisible(md->protection()) || md->isFriend())
8687 append(MemberInfoContext::alloc(mi));
8696 AllMembersListContext::AllMembersListContext() : RefCountedContext("AllMembersListContext")
8701 AllMembersListContext::AllMembersListContext(const MemberNameInfoSDict *ml) : RefCountedContext("AllMembersListContext")
8703 p = new Private(ml);
8706 AllMembersListContext::~AllMembersListContext()
8712 int AllMembersListContext::count() const
8717 TemplateVariant AllMembersListContext::at(int index) const
8719 return p->at(index);
8722 TemplateListIntf::ConstIterator *AllMembersListContext::createIterator() const
8724 return p->createIterator();
8727 //------------------------------------------------------------------------
8729 //%% struct MemberGroupInfo: member group information
8731 class MemberGroupInfoContext::Private
8734 Private(Definition *def,const QCString &relPath,const MemberGroup *mg) :
8739 static bool init=FALSE;
8742 s_inst.addProperty("members", &Private::members);
8743 s_inst.addProperty("title", &Private::groupTitle);
8744 s_inst.addProperty("subtitle", &Private::groupSubtitle);
8745 s_inst.addProperty("anchor", &Private::groupAnchor);
8746 s_inst.addProperty("memberGroups", &Private::memberGroups);
8747 s_inst.addProperty("docs", &Private::docs);
8748 s_inst.addProperty("inherited", &Private::inherited);
8752 TemplateVariant get(const char *n) const
8754 return s_inst.get(this,n);
8756 TemplateVariant members() const
8758 if (!m_cache.memberListContext)
8760 m_cache.memberListContext.reset(MemberListContext::alloc(m_memberGroup->members()));
8762 return m_cache.memberListContext.get();
8764 TemplateVariant groupTitle() const
8766 return m_memberGroup->header();
8768 TemplateVariant groupSubtitle() const
8772 TemplateVariant groupAnchor() const
8774 return m_memberGroup->anchor();
8776 TemplateVariant memberGroups() const
8778 if (!m_cache.memberGroups)
8780 m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_def,m_relPath,0));
8782 return m_cache.memberGroups.get();
8784 TemplateVariant docs() const
8788 QCString docs = m_memberGroup->documentation();
8789 if (!docs.isEmpty())
8791 m_cache.docs.reset(new TemplateVariant(
8792 parseDoc(m_def,"[@name docs]",-1, // TODO store file & line
8794 m_memberGroup->documentation()+"\n",FALSE)));
8798 m_cache.docs.reset(new TemplateVariant(""));
8801 return *m_cache.docs;
8803 TemplateVariant inherited() const
8810 const MemberGroup *m_memberGroup;
8813 SharedPtr<MemberListContext> memberListContext;
8814 SharedPtr<MemberGroupListContext> memberGroups;
8815 ScopedPtr<TemplateVariant> docs;
8817 mutable Cachable m_cache;
8818 static PropertyMapper<MemberGroupInfoContext::Private> s_inst;
8822 PropertyMapper<MemberGroupInfoContext::Private> MemberGroupInfoContext::Private::s_inst;
8824 MemberGroupInfoContext::MemberGroupInfoContext(Definition *def,
8825 const QCString &relPath,const MemberGroup *mg) : RefCountedContext("MemberGroupInfoContext")
8827 p = new Private(def,relPath,mg);
8830 MemberGroupInfoContext::~MemberGroupInfoContext()
8835 TemplateVariant MemberGroupInfoContext::get(const char *name) const
8837 return p->get(name);
8840 //------------------------------------------------------------------------
8842 //%% list MemberGroupList[MemberGroupInfo] : list of member groups
8843 class MemberGroupListContext::Private : public GenericNodeListContext
8846 void addMemberGroup(Definition *def,const QCString &relPath,const MemberGroup *mg)
8848 append(MemberGroupInfoContext::alloc(def,relPath,mg));
8852 MemberGroupListContext::MemberGroupListContext() : RefCountedContext("MemberGroupListContext")
8857 MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list) : RefCountedContext("MemberGroupListContext")
8862 MemberGroupListIterator mgli(*list);
8864 for (;(mg=mgli.current());++mgli)
8866 p->addMemberGroup(def,relPath,mg);
8871 MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping) : RefCountedContext("MemberGroupListContext")
8876 MemberGroupSDict::Iterator di(*dict);
8877 const MemberGroup *mg;
8878 for (di.toFirst();(mg=di.current());++di)
8880 if (!mg->allMembersInSameSection() || !subGrouping)
8882 p->addMemberGroup(def,relPath,mg);
8888 MemberGroupListContext::~MemberGroupListContext()
8894 int MemberGroupListContext::count() const
8899 TemplateVariant MemberGroupListContext::at(int index) const
8901 return p->at(index);
8904 TemplateListIntf::ConstIterator *MemberGroupListContext::createIterator() const
8906 return p->createIterator();
8910 //------------------------------------------------------------------------
8912 //%% struct MemberListInfo: member list information
8914 class MemberListInfoContext::Private
8917 Private(Definition *def,const QCString &relPath,const MemberList *ml,const QCString &title,const QCString &subtitle) :
8922 m_subtitle(subtitle)
8924 static bool init=FALSE;
8927 s_inst.addProperty("members", &Private::members);
8928 s_inst.addProperty("title", &Private::title);
8929 s_inst.addProperty("subtitle", &Private::subtitle);
8930 s_inst.addProperty("anchor", &Private::anchor);
8931 s_inst.addProperty("memberGroups", &Private::memberGroups);
8932 s_inst.addProperty("inherited", &Private::inherited);
8936 TemplateVariant get(const char *n) const
8938 return s_inst.get(this,n);
8940 TemplateVariant members() const
8942 if (!m_cache.memberListContext)
8944 m_cache.memberListContext.reset(MemberListContext::alloc(m_memberList));
8946 return m_cache.memberListContext.get();
8948 TemplateVariant title() const
8952 TemplateVariant subtitle() const
8956 TemplateVariant anchor() const
8958 return MemberList::listTypeAsString(m_memberList->listType());
8960 TemplateVariant memberGroups() const
8962 if (!m_cache.memberGroups)
8964 m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_def,m_relPath,m_memberList->getMemberGroupList()));
8966 return m_cache.memberGroups.get();
8968 TemplateVariant inherited() const
8970 if (!m_cache.inherited && (m_memberList->listType()&MemberListType_detailedLists)==0 &&
8971 m_def->definitionType()==Definition::TypeClass)
8973 InheritedMemberInfoListContext *ctx = InheritedMemberInfoListContext::alloc();
8974 ctx->addMemberList((ClassDef*)m_def,m_memberList->listType(),m_title,FALSE);
8975 m_cache.inherited.reset(ctx);
8977 if (m_cache.inherited)
8979 return m_cache.inherited.get();
8983 return TemplateVariant(FALSE);
8988 const MemberList *m_memberList;
8991 QCString m_subtitle;
8994 SharedPtr<MemberListContext> memberListContext;
8995 SharedPtr<MemberGroupListContext> memberGroups;
8996 SharedPtr<InheritedMemberInfoListContext> inherited;
8998 mutable Cachable m_cache;
8999 static PropertyMapper<MemberListInfoContext::Private> s_inst;
9003 PropertyMapper<MemberListInfoContext::Private> MemberListInfoContext::Private::s_inst;
9005 MemberListInfoContext::MemberListInfoContext(
9006 Definition *def,const QCString &relPath,const MemberList *ml,
9007 const QCString &title,const QCString &subtitle) : RefCountedContext("MemberListInfoContext")
9009 p = new Private(def,relPath,ml,title,subtitle);
9012 MemberListInfoContext::~MemberListInfoContext()
9017 TemplateVariant MemberListInfoContext::get(const char *name) const
9019 return p->get(name);
9022 //------------------------------------------------------------------------
9024 //%% struct InheritedMemberInfo: inherited member information
9026 class InheritedMemberInfoContext::Private
9029 Private(ClassDef *cd,MemberList *ml,const QCString &title)
9030 : m_class(cd), m_memberList(ml), m_title(title)
9032 static bool init=FALSE;
9035 s_inst.addProperty("class", &Private::getClass);
9036 s_inst.addProperty("title", &Private::title);
9037 s_inst.addProperty("members", &Private::members);
9038 s_inst.addProperty("id", &Private::id);
9039 s_inst.addProperty("inheritedFrom", &Private::inheritedFrom);
9043 TemplateVariant get(const char *n) const
9045 return s_inst.get(this,n);
9049 delete m_memberList;
9051 TemplateVariant getClass() const
9055 m_classCtx.reset(ClassContext::alloc(m_class));
9057 return m_classCtx.get();
9059 TemplateVariant title() const
9063 TemplateVariant members() const
9065 if (!m_memberListCtx)
9067 m_memberListCtx.reset(MemberListContext::alloc(m_memberList));
9069 return m_memberListCtx.get();
9071 TemplateVariant id() const
9073 return substitute(MemberList::listTypeAsString(m_memberList->listType()),"-","_")+"_"+
9074 stripPath(m_class->getOutputFileBase());
9076 TemplateVariant inheritedFrom() const
9078 if (!m_inheritedFrom)
9080 m_inheritedFrom.reset(TemplateList::alloc());
9081 m_inheritedFrom->append(title());
9082 m_inheritedFrom->append(getClass());
9084 return m_inheritedFrom.get();
9089 MemberList *m_memberList;
9091 mutable SharedPtr<ClassContext> m_classCtx;
9092 mutable SharedPtr<MemberListContext> m_memberListCtx;
9093 mutable SharedPtr<TemplateList> m_inheritedFrom;
9094 static PropertyMapper<InheritedMemberInfoContext::Private> s_inst;
9098 PropertyMapper<InheritedMemberInfoContext::Private> InheritedMemberInfoContext::Private::s_inst;
9100 InheritedMemberInfoContext::InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,
9101 const QCString &title) : RefCountedContext("InheritedMemberInfoContext")
9103 p = new Private(cd,ml,title);
9106 InheritedMemberInfoContext::~InheritedMemberInfoContext()
9111 TemplateVariant InheritedMemberInfoContext::get(const char *name) const
9113 return p->get(name);
9116 //------------------------------------------------------------------------
9118 //%% list InheritedMemberList[InheritedMemberInfo] : list of inherited classes
9119 class InheritedMemberInfoListContext::Private : public GenericNodeListContext
9122 void addMemberList(ClassDef *inheritedFrom,MemberList *ml,MemberList *combinedList)
9126 MemberListIterator li(*ml);
9128 for (li.toFirst();(md=li.current());++li)
9130 if (md->isBriefSectionVisible() && !md->isReimplementedBy(inheritedFrom))
9132 combinedList->append(md);
9137 void addMemberListIncludingGrouped(ClassDef *inheritedFrom,MemberList *ml,MemberList *combinedList)
9141 addMemberList(inheritedFrom,ml,combinedList);
9142 if (ml->getMemberGroupList())
9144 MemberGroupListIterator mgli(*ml->getMemberGroupList());
9146 for (mgli.toFirst();(mg=mgli.current());++mgli)
9148 addMemberList(inheritedFrom,mg->members(),combinedList);
9153 void addMemberGroupsOfClass(ClassDef *inheritedFrom,
9154 ClassDef *cd,MemberListType lt,MemberList *combinedList)
9156 if (cd->getMemberGroupSDict())
9158 MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
9160 for (;(mg=mgli.current());++mgli)
9162 if (mg->members() && (!mg->allMembersInSameSection() || !cd->subGrouping())) // group is in its own section
9164 MemberListIterator li(*mg->members());
9166 for (li.toFirst();(md=li.current());++li)
9168 if (lt==md->getSectionList(mg->parent())->listType() &&
9169 !md->isReimplementedBy(inheritedFrom) &&
9170 md->isBriefSectionVisible())
9172 combinedList->append(md);
9179 void addInheritedMembers(ClassDef *inheritedFrom,ClassDef *cd,MemberListType lt,
9180 MemberListType lt1,int lt2,const QCString &title,bool additionalList)
9182 int count = cd->countMembersIncludingGrouped(lt1,inheritedFrom,additionalList);
9183 if (lt2!=-1) count += cd->countMembersIncludingGrouped((MemberListType)lt2,inheritedFrom,additionalList);
9186 MemberList *ml = cd->getMemberList(lt1);
9187 MemberList *ml2 = lt2!=-1 ? cd->getMemberList((MemberListType)lt2) : 0;
9188 MemberList *combinedList = new MemberList(lt);
9189 addMemberListIncludingGrouped(inheritedFrom,ml,combinedList);
9190 addMemberListIncludingGrouped(inheritedFrom,ml2,combinedList);
9191 addMemberGroupsOfClass(inheritedFrom,cd,lt,combinedList);
9192 if (lt2!=-1) addMemberGroupsOfClass(inheritedFrom,cd,(MemberListType)lt2,combinedList);
9193 append(InheritedMemberInfoContext::alloc(cd,combinedList,title));
9196 void findInheritedMembers(ClassDef *inheritedFrom,ClassDef *cd,MemberListType lt,
9197 int lt2, const QCString &title,bool additionalList,
9198 QPtrDict<void> *visitedClasses)
9200 if (cd->baseClasses())
9202 BaseClassListIterator it(*cd->baseClasses());
9204 for (it.toFirst();(ibcd=it.current());++it)
9206 ClassDef *icd=ibcd->classDef;
9207 if (icd->isLinkable())
9210 convertProtectionLevel(lt,ibcd->prot,<1,<3);
9211 if (lt2==-1 && lt3!=-1)
9215 if (visitedClasses->find(icd)==0)
9217 visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
9220 // add member info for members of cd with list type lt
9221 addInheritedMembers(inheritedFrom,icd,lt,(MemberListType)lt1,lt2,title,additionalList);
9222 // recurse down the inheritance tree
9223 findInheritedMembers(inheritedFrom,icd,(MemberListType)lt1,lt2,title,additionalList,visitedClasses);
9232 InheritedMemberInfoListContext::InheritedMemberInfoListContext() : RefCountedContext("InheritedMemberInfoListContext")
9237 void InheritedMemberInfoListContext::addMemberList(
9238 ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList)
9240 QPtrDict<void> visited(17);
9241 bool memberInSection = cd->countMembersIncludingGrouped(lt,cd,FALSE)>0;
9242 bool show = (additionalList && !memberInSection) || // inherited member to show in the additional inherited members list
9243 (!additionalList && memberInSection); // inherited member to show in a member list of the class
9244 //printf("%s:%s show=%d\n",cd->name().data(),MemberList::listTypeAsString(lt).data(),show);
9247 p->findInheritedMembers(cd,cd,lt,-1,title,additionalList,&visited);
9251 InheritedMemberInfoListContext::~InheritedMemberInfoListContext()
9257 int InheritedMemberInfoListContext::count() const
9262 TemplateVariant InheritedMemberInfoListContext::at(int index) const
9264 return p->at(index);
9267 TemplateListIntf::ConstIterator *InheritedMemberInfoListContext::createIterator() const
9269 return p->createIterator();
9272 //------------------------------------------------------------------------
9274 //%% struct Argument: parameter information
9276 class ArgumentContext::Private
9279 Private(const Argument *arg,Definition *def,const QCString &relPath) :
9280 m_argument(arg), m_def(def), m_relPath(relPath)
9282 static bool init=FALSE;
9285 s_inst.addProperty("type", &Private::type);
9286 s_inst.addProperty("name", &Private::name);
9287 s_inst.addProperty("defVal", &Private::defVal);
9288 s_inst.addProperty("docs", &Private::docs);
9289 s_inst.addProperty("attrib", &Private::attrib);
9290 s_inst.addProperty("array", &Private::array);
9291 s_inst.addProperty("namePart", &Private::namePart);
9295 TemplateVariant get(const char *n) const
9297 return s_inst.get(this,n);
9299 TemplateVariant type() const
9301 return createLinkedText(m_def,m_relPath,m_argument->type);
9303 TemplateVariant attrib() const
9305 return m_argument->attrib;
9307 TemplateVariant name() const
9309 return m_argument->name;
9311 TemplateVariant defVal() const
9313 return createLinkedText(m_def,m_relPath,m_argument->defval);
9315 TemplateVariant array() const
9317 return m_argument->array;
9319 TemplateVariant docs() const
9321 if (!m_cache.docs && m_def)
9323 if (!m_argument->docs.isEmpty())
9325 m_cache.docs.reset(new TemplateVariant(
9326 parseDoc(m_def,m_def->docFile(),m_def->docLine(),
9327 m_relPath,m_argument->docs,TRUE)));
9331 m_cache.docs.reset(new TemplateVariant(""));
9334 return *m_cache.docs;
9336 TemplateVariant namePart() const
9338 QCString result = m_argument->attrib;
9339 int l = result.length();
9340 if (l>2 && result.at(0)=='[' && result.at(l-1)==']')
9342 result = result.mid(1,l-2);
9343 if (result!=",") result+=":"; // for normal keywords add colon
9348 const Argument *m_argument;
9353 ScopedPtr<TemplateVariant> docs;
9355 mutable Cachable m_cache;
9356 static PropertyMapper<ArgumentContext::Private> s_inst;
9360 PropertyMapper<ArgumentContext::Private> ArgumentContext::Private::s_inst;
9362 ArgumentContext::ArgumentContext(const Argument *al,Definition *def,const QCString &relPath) : RefCountedContext("ArgumentContext")
9364 p = new Private(al,def,relPath);
9367 ArgumentContext::~ArgumentContext()
9372 TemplateVariant ArgumentContext::get(const char *name) const
9374 return p->get(name);
9377 //------------------------------------------------------------------------
9379 //%% list ArgumentList[Argument] : list of inherited classes
9380 class ArgumentListContext::Private : public GenericNodeListContext
9383 void addArgument(const Argument *arg,Definition *def,const QCString &relPath)
9385 append(ArgumentContext::alloc(arg,def,relPath));
9389 ArgumentListContext::ArgumentListContext() : RefCountedContext("ArgumentListContext")
9394 ArgumentListContext::ArgumentListContext(const ArgumentList *list,
9395 Definition *def,const QCString &relPath) : RefCountedContext("ArgumentListContext")
9400 ArgumentListIterator ali(*list);
9401 const Argument *arg;
9402 for (ali.toFirst();(arg=ali.current());++ali)
9404 p->addArgument(arg,def,relPath);
9409 ArgumentListContext::~ArgumentListContext()
9415 int ArgumentListContext::count() const
9420 TemplateVariant ArgumentListContext::at(int index) const
9422 return p->at(index);
9425 TemplateListIntf::ConstIterator *ArgumentListContext::createIterator() const
9427 return p->createIterator();
9430 //------------------------------------------------------------------------
9435 // - symbolGroups: SymbolGroupList
9436 // SymbolGroupList: list of SymbolGroups
9440 // - symbols: SymbolList
9441 // SymbolList: list of Symbols
9447 //------------------------------------------------------------------------
9449 //%% struct SymbolGroup: search group of similar symbols
9451 class SymbolContext::Private
9454 Private(const Definition *d,const Definition *prev,
9455 const Definition *next) : m_def(d), m_prevDef(prev), m_nextDef(next)
9457 static bool init=FALSE;
9460 s_inst.addProperty("fileName",&Private::fileName);
9461 s_inst.addProperty("anchor", &Private::anchor);
9462 s_inst.addProperty("scope", &Private::scope);
9463 s_inst.addProperty("relPath", &Private::relPath);
9467 TemplateVariant get(const char *n) const
9469 return s_inst.get(this,n);
9471 TemplateVariant fileName() const
9473 return m_def->getOutputFileBase();
9475 TemplateVariant anchor() const
9477 return m_def->anchor();
9479 TemplateVariant scope() const
9481 const Definition *scope = m_def->getOuterScope();
9482 const Definition *next = m_nextDef;
9483 const Definition *prev = m_prevDef;
9484 const Definition *nextScope = next ? next->getOuterScope() : 0;
9485 const Definition *prevScope = prev ? prev->getOuterScope() : 0;
9486 bool isMemberDef = m_def->definitionType()==Definition::TypeMember;
9487 const MemberDef *md = isMemberDef ? (const MemberDef*)m_def : 0;
9488 bool isFunctionLike = md && (md->isFunction() || md->isSlot() || md->isSignal());
9489 bool overloadedFunction = isFunctionLike &&
9490 ((prevScope!=0 && scope==prevScope) || (scope && scope==nextScope));
9492 if (md) prefix=md->localName();
9493 if (overloadedFunction) // overloaded member function
9495 prefix+=md->argsString();
9496 // show argument list to disambiguate overloaded functions
9498 else if (md && isFunctionLike) // unique member function
9500 prefix+="()"; // only to show it is a function
9504 if (m_def->definitionType()==Definition::TypeClass)
9506 name = m_def->displayName();
9509 else if (m_def->definitionType()==Definition::TypeNamespace)
9511 name = m_def->displayName();
9514 else if (scope==0 || scope==Doxygen::globalScope) // in global scope
9518 FileDef *fd = md->getBodyDef();
9519 if (fd==0) fd = md->getFileDef();
9522 if (!prefix.isEmpty()) prefix+=": ";
9523 name = prefix + convertToXML(fd->localName());
9528 else if (md && (md->getClassDef() || md->getNamespaceDef()))
9529 // member in class or namespace scope
9531 SrcLangExt lang = md->getLanguage();
9532 name = m_def->getOuterScope()->qualifiedName()
9533 + getLanguageSpecificSeparator(lang) + prefix;
9536 else if (scope) // some thing else? -> show scope
9538 name = prefix + convertToXML(scope->name());
9541 if (!found) // fallback
9543 name = prefix + "("+theTranslator->trGlobalNamespace()+")";
9547 TemplateVariant relPath() const
9549 return externalRef("../",m_def->getReference(),TRUE);
9552 const Definition *m_def;
9553 const Definition *m_prevDef;
9554 const Definition *m_nextDef;
9555 static PropertyMapper<SymbolContext::Private> s_inst;
9559 PropertyMapper<SymbolContext::Private> SymbolContext::Private::s_inst;
9561 SymbolContext::SymbolContext(const Definition *def,const Definition *prevDef,const Definition *nextDef)
9562 : RefCountedContext("SymbolContext")
9564 p = new Private(def,prevDef,nextDef);
9567 SymbolContext::~SymbolContext()
9572 TemplateVariant SymbolContext::get(const char *name) const
9574 return p->get(name);
9577 //------------------------------------------------------------------------
9579 //%% list SymbolList[Symbol] : list of search symbols with the same name
9580 class SymbolListContext::Private : public GenericNodeListContext
9583 Private(const SearchDefinitionList *sdl)
9585 QListIterator<Definition> li(*sdl);
9587 Definition *prev = 0;
9588 for (li.toFirst();(def=li.current());)
9591 const Definition *next = li.current();
9592 append(SymbolContext::alloc(def,prev,next));
9598 SymbolListContext::SymbolListContext(const SearchDefinitionList *sdl)
9599 : RefCountedContext("SymbolListContext")
9601 p = new Private(sdl);
9604 SymbolListContext::~SymbolListContext()
9610 int SymbolListContext::count() const
9615 TemplateVariant SymbolListContext::at(int index) const
9617 return p->at(index);
9620 TemplateListIntf::ConstIterator *SymbolListContext::createIterator() const
9622 return p->createIterator();
9625 //------------------------------------------------------------------------
9627 //%% struct SymbolGroup: search group of similar symbols
9629 class SymbolGroupContext::Private
9632 Private(const SearchDefinitionList *sdl) : m_sdl(sdl)
9634 static bool init=FALSE;
9637 s_inst.addProperty("id", &Private::id);
9638 s_inst.addProperty("name", &Private::name);
9639 s_inst.addProperty("symbols",&Private::symbolList);
9643 TemplateVariant get(const char *n) const
9645 return s_inst.get(this,n);
9647 TemplateVariant id() const
9651 TemplateVariant name() const
9653 return m_sdl->name();
9655 TemplateVariant symbolList() const
9657 if (!m_cache.symbolList)
9659 m_cache.symbolList.reset(SymbolListContext::alloc(m_sdl));
9661 return m_cache.symbolList.get();
9664 const SearchDefinitionList *m_sdl;
9667 SharedPtr<SymbolListContext> symbolList;
9669 mutable Cachable m_cache;
9670 static PropertyMapper<SymbolGroupContext::Private> s_inst;
9674 PropertyMapper<SymbolGroupContext::Private> SymbolGroupContext::Private::s_inst;
9676 SymbolGroupContext::SymbolGroupContext(const SearchDefinitionList *sdl)
9677 : RefCountedContext("SymbolGroupContext")
9679 p = new Private(sdl);
9682 SymbolGroupContext::~SymbolGroupContext()
9687 TemplateVariant SymbolGroupContext::get(const char *name) const
9689 return p->get(name);
9692 //------------------------------------------------------------------------
9694 //%% list SymbolGroupList[SymbolGroup] : list of search groups one per by name
9695 class SymbolGroupListContext::Private : public GenericNodeListContext
9698 Private(const SearchIndexList *sil)
9700 SDict<SearchDefinitionList>::Iterator li(*sil);
9701 SearchDefinitionList *dl;
9702 for (li.toFirst();(dl=li.current());++li)
9704 append(SymbolGroupContext::alloc(dl));
9709 SymbolGroupListContext::SymbolGroupListContext(const SearchIndexList *sil)
9710 : RefCountedContext("SymbolGroupListContext")
9712 p = new Private(sil);
9715 SymbolGroupListContext::~SymbolGroupListContext()
9721 int SymbolGroupListContext::count() const
9726 TemplateVariant SymbolGroupListContext::at(int index) const
9728 return p->at(index);
9731 TemplateListIntf::ConstIterator *SymbolGroupListContext::createIterator() const
9733 return p->createIterator();
9736 //------------------------------------------------------------------------
9738 //%% struct SymbolIndex: search index
9740 class SymbolIndexContext::Private
9743 Private(const SearchIndexList *sl,const QCString &name) : m_searchList(sl), m_name(name)
9745 static bool init=FALSE;
9748 s_inst.addProperty("name", &Private::name);
9749 s_inst.addProperty("letter", &Private::letter);
9750 s_inst.addProperty("symbolGroups",&Private::symbolGroups);
9754 TemplateVariant get(const char *n) const
9756 return s_inst.get(this,n);
9758 TemplateVariant name() const
9762 TemplateVariant letter() const
9764 return QString(QChar(m_searchList->letter())).utf8();
9766 TemplateVariant symbolGroups() const
9768 if (!m_cache.symbolGroups)
9770 m_cache.symbolGroups.reset(SymbolGroupListContext::alloc(m_searchList));
9772 return m_cache.symbolGroups.get();
9775 const SearchIndexList *m_searchList;
9779 SharedPtr<SymbolGroupListContext> symbolGroups;
9781 mutable Cachable m_cache;
9782 static PropertyMapper<SymbolIndexContext::Private> s_inst;
9786 PropertyMapper<SymbolIndexContext::Private> SymbolIndexContext::Private::s_inst;
9788 SymbolIndexContext::SymbolIndexContext(const SearchIndexList *sl,const QCString &name)
9789 : RefCountedContext("SymbolIndexContext")
9791 p = new Private(sl,name);
9794 SymbolIndexContext::~SymbolIndexContext()
9799 TemplateVariant SymbolIndexContext::get(const char *name) const
9801 return p->get(name);
9804 //------------------------------------------------------------------------
9806 //%% list SymbolIndices[SymbolIndex] : list of search indices one per by type
9807 class SymbolIndicesContext::Private : public GenericNodeListContext
9810 Private(const SearchIndexInfo *info)
9812 // use info->symbolList to populate the list
9813 SIntDict<SearchIndexList>::Iterator it(info->symbolList);
9814 const SearchIndexList *sl;
9815 for (it.toFirst();(sl=it.current());++it) // for each letter
9817 append(SymbolIndexContext::alloc(sl,info->name));
9822 SymbolIndicesContext::SymbolIndicesContext(const SearchIndexInfo *info) : RefCountedContext("SymbolIndicesContext")
9824 p = new Private(info);
9827 SymbolIndicesContext::~SymbolIndicesContext()
9833 int SymbolIndicesContext::count() const
9838 TemplateVariant SymbolIndicesContext::at(int index) const
9840 return p->at(index);
9843 TemplateListIntf::ConstIterator *SymbolIndicesContext::createIterator() const
9845 return p->createIterator();
9848 //------------------------------------------------------------------------
9850 //%% struct SearchIndex: search index
9852 class SearchIndexContext::Private
9855 Private(const SearchIndexInfo *info) : m_info(info)
9857 static bool init=FALSE;
9860 s_inst.addProperty("name", &Private::name);
9861 s_inst.addProperty("text", &Private::text);
9862 s_inst.addProperty("symbolIndices",&Private::symbolIndices);
9866 TemplateVariant get(const char *n) const
9868 return s_inst.get(this,n);
9870 TemplateVariant name() const
9872 return m_info->name;
9874 TemplateVariant text() const
9876 return m_info->text;
9878 TemplateVariant symbolIndices() const
9880 if (!m_cache.symbolIndices)
9882 m_cache.symbolIndices.reset(SymbolIndicesContext::alloc(m_info));
9884 return m_cache.symbolIndices.get();
9887 const SearchIndexInfo *m_info;
9890 SharedPtr<SymbolIndicesContext> symbolIndices;
9892 mutable Cachable m_cache;
9893 static PropertyMapper<SearchIndexContext::Private> s_inst;
9897 PropertyMapper<SearchIndexContext::Private> SearchIndexContext::Private::s_inst;
9899 SearchIndexContext::SearchIndexContext(const SearchIndexInfo *info)
9900 : RefCountedContext("SearchIndexContext")
9902 p = new Private(info);
9905 SearchIndexContext::~SearchIndexContext()
9910 TemplateVariant SearchIndexContext::get(const char *name) const
9912 return p->get(name);
9915 //------------------------------------------------------------------------
9917 //%% list SearchIndices[SearchIndex] : list of search indices one per by type
9918 class SearchIndicesContext::Private : public GenericNodeListContext
9923 const SearchIndexInfo *indices = getSearchIndices();
9924 for (int i=0;i<NUM_SEARCH_INDICES;i++)
9926 append(SearchIndexContext::alloc(&indices[i]));
9931 SearchIndicesContext::SearchIndicesContext() : RefCountedContext("SearchIndicesContext")
9936 SearchIndicesContext::~SearchIndicesContext()
9942 int SearchIndicesContext::count() const
9947 TemplateVariant SearchIndicesContext::at(int index) const
9949 return p->at(index);
9952 TemplateListIntf::ConstIterator *SearchIndicesContext::createIterator() const
9954 return p->createIterator();
9958 //------------------------------------------------------------------------
9960 class HtmlEscaper : public TemplateEscapeIntf
9963 QCString escape(const QCString &s)
9965 return convertToHtml(s,TRUE);
9967 void enableTabbing(bool) {}
9970 //------------------------------------------------------------------------
9972 class LatexSpaceless : public TemplateSpacelessIntf
9975 LatexSpaceless() { reset(); }
9977 QCString remove(const QCString &s)
9980 const char *p = s.data();
9986 case '\t': case ' ': case '\n':
9994 return result.data();
9999 //------------------------------------------------------------------------
10001 class HtmlSpaceless : public TemplateSpacelessIntf
10004 HtmlSpaceless() { reset(); }
10007 m_insideTag = FALSE;
10008 m_insideString = '\0';
10009 m_removeSpaces = TRUE;
10011 QCString remove(const QCString &s)
10014 const char *p = s.data();
10020 case '<': // start of a tag
10021 if (!m_insideString) m_insideTag=TRUE,m_removeSpaces=FALSE;
10024 case '>': // end of a tag
10025 if (!m_insideString) m_insideTag=FALSE,m_removeSpaces=TRUE;
10028 case '\\': // escaped character in a string
10030 if (m_insideString && *p) result+=*p++;
10032 case '"': case '\'':
10035 if (m_insideString==c) // end of string
10037 m_insideString='\0';
10039 else if (m_insideString=='\0') // start of string
10046 case ' ': case '\t': case '\n': // whitespace
10047 if (!m_insideTag) // outside tags strip consecutive whitespace
10049 m_removeSpaces=TRUE;
10057 //if (m_removeSpaces) result+=' ';
10059 m_removeSpaces=FALSE;
10064 //printf("HtmlSpaceless::remove({%s})={%s} m_insideTag=%d m_insideString=%c (%d) removeSpaces=%d\n",s.data(),result.data(),
10065 // m_insideTag,m_insideString,m_insideString,m_removeSpaces);
10066 return result.data();
10070 char m_insideString;
10071 bool m_removeSpaces;
10074 //------------------------------------------------------------------------
10076 class LatexEscaper : public TemplateEscapeIntf
10079 LatexEscaper() : m_tabbing(FALSE) {}
10080 QCString escape(const QCString &s)
10082 return convertToLaTeX(s,m_tabbing);
10084 void enableTabbing(bool b) { m_tabbing=b; }
10090 //------------------------------------------------------------------------
10093 int RefCountedContext::s_totalCount;
10096 void generateOutputViaTemplate()
10098 msg("Generating output via template engine...\n");
10101 TemplateContext *ctx = e.createContext();
10104 SharedPtr<DoxygenContext> doxygen (DoxygenContext::alloc());
10105 SharedPtr<ConfigContext> config (ConfigContext::alloc());
10106 SharedPtr<TranslateContext> tr (TranslateContext::alloc());
10107 SharedPtr<ClassListContext> classList (ClassListContext::alloc());
10108 SharedPtr<ClassIndexContext> classIndex (ClassIndexContext::alloc());
10109 SharedPtr<ClassTreeContext> classTree (ClassTreeContext::alloc());
10110 SharedPtr<ClassHierarchyContext> classHierarchy (ClassHierarchyContext::alloc());
10111 SharedPtr<NamespaceListContext> namespaceList (NamespaceListContext::alloc());
10112 SharedPtr<NamespaceTreeContext> namespaceTree (NamespaceTreeContext::alloc());
10113 SharedPtr<DirListContext> dirList (DirListContext::alloc());
10114 SharedPtr<FileListContext> fileList (FileListContext::alloc());
10115 SharedPtr<FileTreeContext> fileTree (FileTreeContext::alloc());
10116 SharedPtr<PageTreeContext> pageTree (PageTreeContext::alloc(Doxygen::pageSDict));
10117 SharedPtr<PageListContext> pageList (PageListContext::alloc(Doxygen::pageSDict));
10118 SharedPtr<ExampleTreeContext> exampleTree (ExampleTreeContext::alloc());
10119 SharedPtr<ExampleListContext> exampleList (ExampleListContext::alloc());
10120 SharedPtr<ModuleTreeContext> moduleTree (ModuleTreeContext::alloc());
10121 SharedPtr<ModuleListContext> moduleList (ModuleListContext::alloc());
10122 SharedPtr<GlobalsIndexContext> globalsIndex (GlobalsIndexContext::alloc());
10123 SharedPtr<ClassMembersIndexContext> classMembersIndex (ClassMembersIndexContext::alloc());
10124 SharedPtr<NamespaceMembersIndexContext> namespaceMembersIndex(NamespaceMembersIndexContext::alloc());
10125 SharedPtr<SearchIndicesContext> searchIndices (SearchIndicesContext::alloc());
10127 //%% Doxygen doxygen:
10128 ctx->set("doxygen",doxygen.get());
10129 //%% Translator tr:
10130 ctx->set("tr",tr.get());
10131 //%% Config config:
10132 ctx->set("config",config.get());
10133 //%% ClassList classList:
10134 ctx->set("classList",classList.get()); // not used for standard HTML
10135 //%% ClassTree classTree:
10136 ctx->set("classTree",classTree.get());
10137 //%% ClassIndex classIndex:
10138 ctx->set("classIndex",classIndex.get());
10139 //%% ClassHierarchy classHierarchy:
10140 ctx->set("classHierarchy",classHierarchy.get());
10141 //%% NamespaceList namespaceList:
10142 ctx->set("namespaceList",namespaceList.get());
10143 //%% NamespaceTree namespaceTree:
10144 ctx->set("namespaceTree",namespaceTree.get());
10145 //%% FileList fileList:
10146 ctx->set("fileList",fileList.get());
10147 //%% FileTree fileTree:
10148 ctx->set("fileTree",fileTree.get());
10149 //%% PageList pageList
10150 ctx->set("pageList",pageList.get());
10151 //%% PageTree pageTree
10152 ctx->set("pageTree",pageTree.get());
10153 //%% ExampleTree exampleTree
10154 ctx->set("exampleTree",exampleTree.get());
10155 //%% ExampleList exampleList
10156 ctx->set("exampleList",exampleList.get());
10157 //%% ModuleTree moduleTree
10158 ctx->set("moduleTree",moduleTree.get());
10159 //%% ModuleList moduleList
10160 ctx->set("moduleList",moduleList.get());
10161 //%% DirList dirList
10162 ctx->set("dirList",dirList.get());
10164 if (Doxygen::mainPage)
10166 SharedPtr<PageContext> mainPage(PageContext::alloc(Doxygen::mainPage,TRUE,FALSE));
10167 ctx->set("mainPage",mainPage.get());
10171 // TODO: for LaTeX output index should be main... => solve in template
10172 Doxygen::mainPage = new PageDef("[generated]",1,"index","",theTranslator->trMainPage());
10173 Doxygen::mainPage->setFileName("index");
10174 SharedPtr<PageContext> mainPage(PageContext::alloc(Doxygen::mainPage,TRUE,FALSE));
10175 ctx->set("mainPage",mainPage.get());
10177 //%% GlobalsIndex globalsIndex:
10178 ctx->set("globalsIndex",globalsIndex.get());
10179 //%% ClassMembersIndex classMembersIndex:
10180 ctx->set("classMembersIndex",classMembersIndex.get());
10181 //%% NamespaceMembersIndex namespaceMembersIndex:
10182 ctx->set("namespaceMembersIndex",namespaceMembersIndex.get());
10183 //%% SearchIndicaes searchindicaes
10184 ctx->set("searchIndices",searchIndices.get());
10186 ctx->set("space"," ");
10188 //if (Config_getBool(GENERATE_HTML))
10189 { // render HTML output
10190 e.setTemplateDir("templates/html"); // TODO: make template part user configurable
10191 Template *tpl = e.loadByName("htmllayout.tpl",1);
10194 g_globals.outputFormat = ContextOutputFormat_Html;
10195 g_globals.dynSectionId = 0;
10196 g_globals.outputDir = Config_getString(HTML_OUTPUT);
10197 QDir dir(g_globals.outputDir);
10198 createSubDirs(dir);
10199 HtmlEscaper htmlEsc;
10200 ctx->setEscapeIntf(Config_getString(HTML_FILE_EXTENSION),&htmlEsc);
10202 ctx->setSpacelessIntf(&spl);
10203 ctx->setOutputDirectory(g_globals.outputDir);
10205 tpl->render(ts,ctx);
10210 // TODO: clean index before each run...
10212 //if (Config_getBool(GENERATE_LATEX))
10214 { // render LaTeX output
10215 e.setTemplateDir("templates/latex"); // TODO: make template part user configurable
10216 Template *tpl = e.loadByName("latexlayout.tpl",1);
10219 g_globals.outputFormat = ContextOutputFormat_Latex;
10220 g_globals.dynSectionId = 0;
10221 g_globals.outputDir = Config_getString(LATEX_OUTPUT);
10222 QDir dir(g_globals.outputDir);
10223 createSubDirs(dir);
10224 LatexEscaper latexEsc;
10225 ctx->setEscapeIntf(".tex",&latexEsc);
10226 LatexSpaceless spl;
10227 ctx->setSpacelessIntf(&spl);
10228 ctx->setOutputDirectory(g_globals.outputDir);
10230 tpl->render(ts,ctx);
10235 // clear all cached data in Definition objects.
10236 QDictIterator<DefinitionIntf> di(*Doxygen::symbolMap);
10237 DefinitionIntf *intf;
10238 for (;(intf=di.current());++di)
10240 if (intf->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
10242 DefinitionListIterator dli(*(DefinitionList*)intf);
10245 for (dli.toFirst();(d=dli.current());++dli)
10250 else // single symbol
10252 Definition *d = (Definition *)intf;
10257 e.destroyContext(ctx);
10260 #if DEBUG_REF // should be 0, i.e. all objects are deleted
10261 printf("==== total ref count %d\n",RefCountedContext::s_totalCount);
10265 void generateTemplateFiles(const char *templateDir)
10267 if (!templateDir) return;
10269 if (!thisDir.exists(templateDir) && !thisDir.mkdir(templateDir))
10271 err("Failed to create output directory '%s'\n",templateDir);
10274 QCString outDir = QCString(templateDir)+"/html";
10275 if (!thisDir.exists(outDir) && !thisDir.mkdir(outDir))
10277 err("Failed to create output directory '%s'\n",templateDir);
10280 ResourceMgr::instance().writeCategory("html",outDir);