1 /******************************************************************************
3 * Copyright (C) 1997-2014 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.
21 #include "classlist.h"
23 #include "namespacedef.h"
31 #include "vhdldocgen.h"
34 #include "docparser.h"
36 #include "htmldocvisitor.h"
40 #include "membername.h"
41 #include "parserintf.h"
43 #include "arguments.h"
46 // TODO: pass the current file to Dot*::writeGraph, so the user can put dot graphs in other
49 #define ADD_PROPERTY(name) addProperty(#name,this,&Private::name);
65 OutputFormat outputFormat;
68 /** @brief Scoped smart pointer */
69 template<class T> class ScopedPtr
73 ScopedPtr(const ScopedPtr &);
74 ScopedPtr &operator=(const ScopedPtr &);
75 void operator==(const ScopedPtr &) const;
76 void operator!=(const ScopedPtr &) const;
80 explicit ScopedPtr(T *p=0) : m_ptr(p) {}
81 ~ScopedPtr() { delete m_ptr; };
82 T &operator*() const { return *m_ptr; }
83 T *operator->() const { return m_ptr; }
84 T *get() const { return m_ptr; }
85 operator bool() const { return m_ptr!=0; }
86 void reset(T *p=0) { if (p!=m_ptr) { delete m_ptr; m_ptr = p; } }
89 /** @brief Reference counting smart pointer */
90 template<class T> class SharedPtr
94 SharedPtr(const SharedPtr &);
95 SharedPtr &operator=(const SharedPtr &p);
96 void operator==(const SharedPtr &) const;
97 void operator!=(const SharedPtr &) const;
101 explicit SharedPtr(T *p=0) : m_ptr(p) { if (m_ptr) m_ptr->addRef(); }
102 ~SharedPtr() { if (m_ptr) m_ptr->release(); };
103 T &operator*() const { return *m_ptr; }
104 T *operator->() const { return m_ptr; }
105 T *get() const { return m_ptr; }
106 operator bool() const { return m_ptr!=0; }
110 if (m_ptr) m_ptr->release();
115 /** @brief Template List iterator support */
116 class GenericConstIterator : public TemplateListIntf::ConstIterator
119 GenericConstIterator(const QList<TemplateVariant> &list)
121 virtual ~GenericConstIterator() {}
132 if (m_it.current()) ++m_it;
136 if (m_it.current()) --m_it;
138 bool current(TemplateVariant &v) const
147 v = TemplateVariant();
152 QListIterator<TemplateVariant> m_it;
155 //------------------------------------------------------------------------
157 /** @brief standard template list implementation */
158 class GenericNodeListContext : public TemplateListIntf
161 GenericNodeListContext() : m_refCount(0)
163 m_children.setAutoDelete(TRUE);
165 static GenericNodeListContext *alloc()
167 return new GenericNodeListContext;
170 // TemplateListIntf methods
173 return (int)m_children.count();
175 TemplateVariant at(int index) const
177 TemplateVariant result;
178 if (index>=0 && index<count())
180 result = *m_children.at(index);
184 TemplateListIntf::ConstIterator *createIterator() const
186 return new GenericConstIterator(m_children);
189 void append(const TemplateVariant &ctn)
191 m_children.append(new TemplateVariant(ctn));
195 return m_children.isEmpty();
203 int count = --m_refCount;
211 mutable QList<TemplateVariant> m_children;
215 //------------------------------------------------------------------------
217 /** @brief Helper class to map a property name to a handler member function */
221 struct PropertyFuncIntf
223 virtual ~PropertyFuncIntf() {}
224 virtual TemplateVariant operator()() const = 0;
227 struct PropertyFunc : public PropertyFuncIntf
229 typedef TemplateVariant (T::*Handler)() const;
230 PropertyFunc(const T *o,Handler h) : obj(o), handler(h) {}
231 TemplateVariant operator()() const
233 return (obj->*handler)();
240 PropertyMapper() { m_map.setAutoDelete(TRUE); }
242 /** Add a property to the map
243 * @param[in] name The name of the property to add.
244 * @param[in] obj The object handling access to the property.
245 * @param[in] handle The method to call when the property is accessed.
248 void addProperty(const char *name,const T* obj,
249 typename PropertyFunc<T>::Handler handle)
251 if (m_map.find(name))
253 err("Error: adding property '%s' more than once",name);
257 m_map.insert(name,new PropertyFunc<T>(obj,handle));
261 /** Gets the value of a property.
262 * @param[in] name The name of the property.
263 * @returns A variant representing the properties value or an
264 * invalid variant if it was not found.
266 TemplateVariant get(const char *name) const
268 //printf("PropertyMapper::get(%s)\n",name);
269 TemplateVariant result;
270 PropertyFuncIntf *func = m_map.find(name);
279 QDict<PropertyFuncIntf> m_map;
283 //------------------------------------------------------------------------
285 //%% struct Config : configuration options
287 class ConfigContext::Private
290 Private() { m_cachedLists.setAutoDelete(TRUE); }
291 virtual ~Private() { }
292 TemplateVariant fetchList(const QCString &name,const QStrList *list)
294 TemplateVariant *v = m_cachedLists.find(name);
297 TemplateList *tlist = TemplateList::alloc();
298 m_cachedLists.insert(name,new TemplateVariant(tlist));
299 QStrListIterator li(*list);
301 for (li.toFirst();(s=li.current());++li)
313 QDict<TemplateVariant> m_cachedLists;
317 ConfigContext::ConfigContext() : RefCountedContext("ConfigContext")
322 ConfigContext::~ConfigContext()
327 TemplateVariant ConfigContext::get(const char *name) const
329 TemplateVariant result;
332 ConfigOption *option = Config::instance()->get(name);
335 switch (option->kind())
337 case ConfigOption::O_Bool:
338 return TemplateVariant(*((ConfigBool*)option)->valueRef());
339 case ConfigOption::O_Int:
340 return TemplateVariant(*((ConfigInt*)option)->valueRef());
341 case ConfigOption::O_Enum:
342 return TemplateVariant(*((ConfigEnum*)option)->valueRef());
343 case ConfigOption::O_String:
344 return TemplateVariant(*((ConfigString*)option)->valueRef());
345 case ConfigOption::O_List:
346 return p->fetchList(name,((ConfigList*)option)->valueRef());
356 //------------------------------------------------------------------------
358 //%% struct Doxygen: global information
360 class DoxygenContext::Private : public PropertyMapper
363 TemplateVariant version() const
365 return versionString;
367 TemplateVariant date() const
369 return TemplateVariant(dateToString(TRUE));
374 addProperty("version",this,&Private::version); //makeProperty(this,&Private::version));
376 addProperty("date", this,&Private::date);
381 DoxygenContext::DoxygenContext() : RefCountedContext("DoxygenContext")
386 DoxygenContext::~DoxygenContext()
391 TemplateVariant DoxygenContext::get(const char *n) const
396 //------------------------------------------------------------------------
398 //%% struct Translator: translation methods
400 class TranslateContext::Private : public PropertyMapper
404 TemplateVariant handleGeneratedAt(const QValueList<TemplateVariant> &args) const
408 return theTranslator->trGeneratedAt(args[0].toString(),args[1].toString());
412 err("tr.generateAt should take two arguments, got %d!\n",args.count());
414 return TemplateVariant();
416 TemplateVariant handleInheritanceDiagramFor(const QValueList<TemplateVariant> &args) const
420 return theTranslator->trClassDiagram(args[0].toString());
424 err("tr.inheritanceDiagramFor should take one argument, got %d!\n",args.count());
426 return TemplateVariant();
428 TemplateVariant handleCollaborationDiagramFor(const QValueList<TemplateVariant> &args) const
432 return theTranslator->trCollaborationDiagram(args[0].toString());
436 err("tr.collaborationDiagramFor should take one argument, got %d!\n",args.count());
438 return TemplateVariant();
440 TemplateVariant handleInheritsList(const QValueList<TemplateVariant> &args) const
444 return theTranslator->trInheritsList(args[0].toInt());
448 err("tr.inheritsList should take one integer argument, got %d!\n",args.count());
450 return TemplateVariant();
452 TemplateVariant handleInheritedByList(const QValueList<TemplateVariant> &args) const
456 return theTranslator->trInheritedByList(args[0].toInt());
460 err("tr.inheritedByList should take one integer argument, got %d!\n",args.count());
462 return TemplateVariant();
464 TemplateVariant handleWriteList(const QValueList<TemplateVariant> &args) const
468 return theTranslator->trWriteList(args[0].toInt());
472 err("tr.*List should take one integer argument, got %d!\n",args.count());
474 return TemplateVariant();
476 TemplateVariant handleImplementedBy(const QValueList<TemplateVariant> &args) const
480 return theTranslator->trImplementedInList(args[0].toInt());
484 err("tr.implementedBy should take one integer argument, got %d!\n",args.count());
486 return TemplateVariant();
488 TemplateVariant handleReimplementedBy(const QValueList<TemplateVariant> &args) const
492 return theTranslator->trReimplementedInList(args[0].toInt());
496 err("tr.reimplementedBy should take one integer argument, got %d!\n",args.count());
498 return TemplateVariant();
500 TemplateVariant handleSourceRefs(const QValueList<TemplateVariant> &args) const
504 return theTranslator->trReferences()+" "+theTranslator->trWriteList(args[0].toInt())+".";
508 err("tr.sourceRefs should take one integer argument, got %d\n",args.count());
510 return TemplateVariant();
512 TemplateVariant handleSourceRefBys(const QValueList<TemplateVariant> &args) const
516 return theTranslator->trReferencedBy()+" "+theTranslator->trWriteList(args[0].toInt())+".";
520 err("tr.sourceRefBys should take one integer argument, got %d\n",args.count());
522 return TemplateVariant();
524 TemplateVariant handleIncludeDependencyGraph(const QValueList<TemplateVariant> &args) const
528 return theTranslator->trInclDepGraph(args[0].toString());
532 err("tr.includeDependencyGraph should take one string argument, got %d\n",args.count());
534 return TemplateVariant();
539 TemplateVariant generatedBy() const
541 return theTranslator->trGeneratedBy();
543 TemplateVariant generatedAt() const
545 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleGeneratedAt>(this);
547 TemplateVariant inheritanceDiagramFor() const
549 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritanceDiagramFor>(this);
551 TemplateVariant collaborationDiagramFor() const
553 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleCollaborationDiagramFor>(this);
555 TemplateVariant search() const
557 return theTranslator->trSearch();
559 TemplateVariant mainPage() const
561 return theTranslator->trMainPage();
563 TemplateVariant classes() const
565 return theTranslator->trClasses();
566 // TODO: VHDL: trVhdlType(VhdlDocGen::ENTITY,FALSE)
567 // TODO: Fortran: trDataTypes()
569 TemplateVariant classList() const
571 return theTranslator->trCompoundList();
573 TemplateVariant classListDescription() const
575 return theTranslator->trCompoundListDescription();
577 TemplateVariant classIndex() const
579 return theTranslator->trCompoundIndex();
581 TemplateVariant classHierarchy() const
583 return theTranslator->trClassHierarchy();
585 TemplateVariant classMembers() const
587 return theTranslator->trCompoundMembers();
589 TemplateVariant modules() const
591 return theTranslator->trModules();
593 TemplateVariant namespaces() const
595 if (m_javaOpt || m_vhdlOpt)
597 return theTranslator->trPackages();
599 else if (m_fortranOpt)
601 return theTranslator->trModules();
605 return theTranslator->trNamespaces();
608 TemplateVariant files() const
610 return theTranslator->trFile(TRUE,FALSE);
612 TemplateVariant pages() const
614 return theTranslator->trRelatedPages();
616 TemplateVariant examples() const
618 return theTranslator->trExamples();
620 TemplateVariant namespaceList() const
622 if (m_javaOpt || m_vhdlOpt)
624 return theTranslator->trPackages();
626 else if (m_fortranOpt)
628 return theTranslator->trModulesList();
632 return theTranslator->trNamespaceList();
635 TemplateVariant namespaceMembers() const
637 if (m_javaOpt || m_vhdlOpt)
639 return theTranslator->trPackageMembers();
641 else if (m_fortranOpt)
643 return theTranslator->trModulesMembers();
647 return theTranslator->trNamespaceMembers();
650 TemplateVariant fileList() const
652 return theTranslator->trFileList();
654 TemplateVariant fileMembers() const
656 return theTranslator->trFileMembers();
658 TemplateVariant fileMembersDescription() const
660 static bool extractAll = Config_getBool("EXTRACT_ALL");
661 return theTranslator->trFileMembersDescription(extractAll);
663 TemplateVariant namespaceMembersDescription() const
665 static bool extractAll = Config_getBool("EXTRACT_ALL");
666 return theTranslator->trNamespaceMemberDescription(extractAll);
668 TemplateVariant classMembersDescription() const
670 static bool extractAll = Config_getBool("EXTRACT_ALL");
671 static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
674 return theTranslator->trCompoundMembersDescriptionFortran(extractAll);
678 return theTranslator->trCompoundMembersDescription(extractAll);
681 TemplateVariant relatedPagesDesc() const
683 return theTranslator->trRelatedPagesDescription();
685 TemplateVariant more() const
687 return theTranslator->trMore();
689 TemplateVariant detailedDesc() const
691 return theTranslator->trDetailedDescription();
693 TemplateVariant inheritsList() const
695 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritsList>(this);
697 TemplateVariant inheritedByList() const
699 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleInheritedByList>(this);
701 TemplateVariant definedAtLineInSourceFile() const
703 return theTranslator->trDefinedAtLineInSourceFile();
705 TemplateVariant typeConstraints() const
707 return theTranslator->trTypeConstraints();
709 TemplateVariant exampleList() const
711 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleWriteList>(this);
713 TemplateVariant listOfAllMembers() const
715 return theTranslator->trListOfAllMembers();
717 TemplateVariant memberList() const
719 return theTranslator->trMemberList();
721 TemplateVariant theListOfAllMembers() const
723 return theTranslator->trThisIsTheListOfAllMembers();
725 TemplateVariant incInheritedMembers() const
727 return theTranslator->trIncludingInheritedMembers();
729 TemplateVariant defineValue() const
731 return theTranslator->trDefineValue();
733 TemplateVariant initialValue() const
735 return theTranslator->trInitialValue();
737 TemplateVariant enumerationValues() const
739 return theTranslator->trEnumerationValues();
741 TemplateVariant implements() const
743 return theTranslator->trImplementedFromList(1);
745 TemplateVariant reimplements() const
747 return theTranslator->trReimplementedFromList(1);
749 TemplateVariant implementedBy() const
751 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleImplementedBy>(this);
753 TemplateVariant reimplementedBy() const
755 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleReimplementedBy>(this);
757 TemplateVariant sourceRefs() const
759 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleSourceRefs>(this);
761 TemplateVariant sourceRefBys() const
763 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleSourceRefBys>(this);
765 TemplateVariant callGraph() const
767 return theTranslator->trCallGraph();
769 TemplateVariant callerGraph() const
771 return theTranslator->trCallerGraph();
773 TemplateVariant inheritedFrom() const
775 return theTranslator->trInheritedFrom("@0","@1");
777 TemplateVariant additionalInheritedMembers() const
779 return theTranslator->trAdditionalInheritedMembers();
781 TemplateVariant includeDependencyGraph() const
783 return TemplateVariant::Delegate::fromMethod<Private,&Private::handleIncludeDependencyGraph>(this);
785 TemplateVariant includedByDependencyGraph() const
787 return theTranslator->trInclByDepGraph();
789 TemplateVariant gotoSourceCode() const
791 return theTranslator->trGotoSourceCode();
793 TemplateVariant gotoDocumentation() const
795 return theTranslator->trGotoDocumentation();
797 TemplateVariant constantgroups() const
799 return theTranslator->trConstantGroups();
801 TemplateVariant classDocumentation() const
803 return theTranslator->trClassDocumentation();
805 TemplateVariant compoundMembers() const
807 return theTranslator->trCompoundMembers();
809 TemplateVariant detailLevel() const
811 return theTranslator->trDetailLevel();
813 TemplateVariant fileListDescription() const
815 bool extractAll = Config_getBool("EXTRACT_ALL");
816 return theTranslator->trFileListDescription(extractAll);
818 TemplateVariant modulesDescription() const
820 bool extractAll = Config_getBool("EXTRACT_ALL");
821 return theTranslator->trModulesListDescription(extractAll);
823 TemplateVariant namespaceListDescription() const
825 bool extractAll = Config_getBool("EXTRACT_ALL");
826 return theTranslator->trNamespaceListDescription(extractAll);
828 TemplateVariant directories() const
830 return theTranslator->trDirectories();
832 TemplateVariant all() const
834 return theTranslator->trAll();
836 TemplateVariant functions() const
838 static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
839 static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
840 return fortranOpt ? theTranslator->trSubprograms() :
841 vhdlOpt ? VhdlDocGen::trFunctionAndProc() :
842 theTranslator->trFunctions();
844 TemplateVariant variables() const
846 return theTranslator->trVariables();
848 TemplateVariant typedefs() const
850 return theTranslator->trTypedefs();
852 TemplateVariant enums() const
854 return theTranslator->trEnumerations();
856 TemplateVariant properties() const
858 return theTranslator->trProperties();
860 TemplateVariant events() const
862 return theTranslator->trEvents();
864 TemplateVariant related() const
866 return theTranslator->trRelatedFunctions();
868 TemplateVariant macros() const
870 return theTranslator->trDefines();
874 //%% string generatedBy
875 addProperty("generatedby", this,&Private::generatedBy);
876 //%% string generatedAt
877 addProperty("generatedAt", this,&Private::generatedAt);
879 addProperty("search", this,&Private::search);
881 addProperty("mainPage", this,&Private::mainPage);
883 addProperty("classes", this,&Private::classes);
884 //%% string classList
885 addProperty("classList", this,&Private::classList);
886 //%% string classListDescription
887 addProperty("classListDescription", this,&Private::classListDescription);
888 //%% string classIndex
889 addProperty("classIndex", this,&Private::classIndex);
890 //%% string classHierarchy
891 addProperty("classHierarchy", this,&Private::classHierarchy);
892 //%% string classMembers
893 addProperty("classMembers", this,&Private::classMembers);
894 //%% string classMembersDescription
895 addProperty("classMembersDescription",this,&Private::classMembersDescription);
897 addProperty("modules", this,&Private::modules);
898 //%% string namespaces
899 addProperty("namespaces", this,&Private::namespaces);
901 addProperty("files", this,&Private::files);
903 addProperty("pages", this,&Private::pages);
905 addProperty("examples", this,&Private::examples);
906 //%% string namespaceList
907 addProperty("namespaceList", this,&Private::namespaceList);
908 //%% string namespaceMembers
909 addProperty("namespaceMembers", this,&Private::namespaceMembers);
911 addProperty("fileList", this,&Private::fileList);
912 //%% string fileMembers
913 addProperty("fileMembers", this,&Private::fileMembers);
914 //%% string fileMembersDescription
915 addProperty("fileMembersDescription", this,&Private::fileMembersDescription);
916 //%% string relatedPagesDescripiton
917 addProperty("relatedPagesDesc", this,&Private::relatedPagesDesc);
919 addProperty("more", this,&Private::more);
920 //%% string detailedDescription
921 addProperty("detailedDesc", this,&Private::detailedDesc);
922 //%% string inheritanceDiagramFor
923 addProperty("inheritanceDiagramFor", this,&Private::inheritanceDiagramFor);
924 //%% string collaborationDiagramFor
925 addProperty("collaborationDiagramFor", this,&Private::collaborationDiagramFor);
926 //%% markerstring inheritsList
927 addProperty("inheritsList", this,&Private::inheritsList);
928 //%% markerstring inheritedByList
929 addProperty("inheritedByList", this,&Private::inheritedByList);
930 //%% markerstring definedAtLineInSourceFile
931 addProperty("definedAtLineInSourceFile", this,&Private::definedAtLineInSourceFile);
932 //%% string typeConstraints
933 addProperty("typeConstraints", this,&Private::typeConstraints);
934 //%% string exampleList
935 addProperty("exampleList", this,&Private::exampleList);
936 //%% string listOfAllMembers
937 addProperty("listOfAllMembers", this,&Private::listOfAllMembers);
938 //%% string memberList
939 addProperty("memberList", this,&Private::memberList);
940 //%% string theListOfAllMembers
941 addProperty("theListOfAllMembers",this,&Private::theListOfAllMembers);
942 //%% string incInheritedMembers
943 addProperty("incInheritedMembers",this,&Private::incInheritedMembers);
944 //%% string defineValue
945 addProperty("defineValue", this,&Private::defineValue);
946 //%% string initialValue
947 addProperty("initialValue", this,&Private::initialValue);
948 //%% markerstring implements
949 addProperty("implements", this,&Private::implements);
950 //%% markerstring reimplements
951 addProperty("reimplements", this,&Private::reimplements);
952 //%% markerstring implementedBy
953 addProperty("implementedBy", this,&Private::implementedBy);
954 //%% markerstring reimplementedBy
955 addProperty("reimplementedBy", this,&Private::reimplementedBy);
956 //%% markerstring sourceRefs
957 addProperty("sourceRefs", this,&Private::sourceRefs);
958 //%% markerstring sourceRefBys
959 addProperty("sourceRefBys", this,&Private::sourceRefBys);
960 //%% string callGraph
961 addProperty("callGraph", this,&Private::callGraph);
962 //%% string callerGraph
963 addProperty("callerGraph", this,&Private::callerGraph);
964 //%% markerstring inheritedFrom
965 addProperty("inheritedFrom", this,&Private::inheritedFrom);
966 //%% string addtionalInheritedMembers
967 addProperty("additionalInheritedMembers",this,&Private::additionalInheritedMembers);
968 //%% string includeDependencyGraph:container_name
969 addProperty("includeDependencyGraph",this,&Private::includeDependencyGraph);
970 //%% string includedByDependencyGraph
971 addProperty("includedByDependencyGraph",this,&Private::includedByDependencyGraph);
972 //%% string gotoSourceCode
973 addProperty("gotoSourceCode", this,&Private::gotoSourceCode);
974 //%% string gotoDocumentation
975 addProperty("gotoDocumentation", this,&Private::gotoDocumentation);
976 //%% string constantgroups
977 addProperty("constantgroups", this,&Private::constantgroups);
978 //%% string classDocumentation
979 addProperty("classDocumentation", this,&Private::classDocumentation);
980 //%% string compoundMembers
981 addProperty("compoundMembers", this,&Private::compoundMembers);
982 //%% string detailLevel
983 addProperty("detailLevel", this,&Private::detailLevel);
984 //%% string fileListDescription
985 addProperty("fileListDescription",this,&Private::fileListDescription);
986 //%% string namespaceListDescription
987 addProperty("namespaceListDescription",this,&Private::namespaceListDescription);
988 //%% string directories
989 addProperty("directories", this,&Private::directories);
990 //%% string moduleDescript
991 addProperty("modulesDescription", this,&Private::modulesDescription);
993 addProperty("all", this,&Private::all);
994 //%% string functions
995 addProperty("functions", this,&Private::functions);
996 //%% string variables
997 addProperty("variables", this,&Private::variables);
999 addProperty("typedefs", this,&Private::typedefs);
1001 addProperty("enums", this,&Private::enums);
1002 //%% string enumValues
1003 addProperty("enumValues", this,&Private::enumerationValues);
1004 //%% string properties
1005 addProperty("properties", this,&Private::properties);
1007 addProperty("events", this,&Private::events);
1009 addProperty("related", this,&Private::related);
1011 addProperty("macros", this,&Private::macros);
1012 //%% string namespaceMembersDescription
1013 addProperty("namespaceMembersDescription",this,&Private::namespaceMembersDescription);
1015 m_javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
1016 m_fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
1017 m_vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
1026 TranslateContext::TranslateContext() : RefCountedContext("TranslateContext")
1031 TranslateContext::~TranslateContext()
1036 TemplateVariant TranslateContext::get(const char *n) const
1041 static TemplateVariant parseDoc(Definition *def,const QCString &file,int line,
1042 const QCString &relPath,const QCString &docStr,bool isBrief)
1044 TemplateVariant result;
1045 DocRoot *root = validatingParseDoc(file,line,def,0,docStr,TRUE,FALSE,0,isBrief,FALSE);
1048 FTextStream ts(&docs);
1049 // TODO: support other generators
1050 HtmlCodeGenerator codeGen(ts,relPath);
1051 HtmlDocVisitor visitor(ts,codeGen,def);
1052 root->accept(&visitor);
1054 bool isEmpty = root->isEmpty();
1058 result = TemplateVariant(docs,TRUE);
1063 static TemplateVariant parseCode(MemberDef *md,const QCString &scopeName,const QCString &relPath,
1064 const QCString &code,int startLine=-1,int endLine=-1,bool showLineNumbers=FALSE)
1066 ParserInterface *pIntf = Doxygen::parserManager->getParser(md->getDefFileExtension());
1067 pIntf->resetCodeParserState();
1070 HtmlCodeGenerator codeGen(t,relPath);
1071 pIntf->parseCode(codeGen,scopeName,code,md->getLanguage(),FALSE,0,md->getBodyDef(),
1072 startLine,endLine,TRUE,md,showLineNumbers,md);
1073 return TemplateVariant(s.data(),TRUE);
1076 static TemplateVariant parseCode(FileDef *fd,const QCString &relPath)
1078 static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES");
1079 ParserInterface *pIntf = Doxygen::parserManager->getParser(fd->getDefFileExtension());
1080 pIntf->resetCodeParserState();
1083 HtmlCodeGenerator codeGen(t,relPath);
1084 pIntf->parseCode(codeGen,0,
1085 fileToString(fd->absFilePath(),filterSourceFiles,TRUE), // the sources
1086 fd->getLanguage(), // lang
1087 FALSE, // isExampleBlock
1092 FALSE, // inlineFragment
1094 TRUE, // showLineNumbers
1096 TRUE // collectXRefs, TODO: should become FALSE
1098 return TemplateVariant(s.data(),TRUE);
1101 //------------------------------------------------------------------------
1103 //%% struct Symbol: shared info for all symbols
1105 template<typename T>
1106 class DefinitionContext : public PropertyMapper
1109 DefinitionContext(Definition *d) : m_def(d)
1111 //%% string name: the name of the symbol
1112 addProperty("name",this,&DefinitionContext::name);
1113 //%% string bareName: the bare name of the symbol with scope info
1114 addProperty("bareName",this,&DefinitionContext::bareName);
1115 //%% string relPath: the relative path to the root of the output (CREATE_SUBDIRS)
1116 addProperty("relPath",this,&DefinitionContext::relPath);
1117 //%% string fileName: the file name of the output file associated with the symbol (without extension)
1118 addProperty("fileName",this,&DefinitionContext::fileName);
1119 //%% string anchor: anchor within the page
1120 addProperty("anchor",this,&DefinitionContext::anchor);
1121 //%% string details: the detailed documentation for this symbol
1122 addProperty("details",this,&DefinitionContext::details);
1123 //%% string brief: the brief description for this symbol
1124 addProperty("brief",this,&DefinitionContext::brief);
1125 //%% string inbodyDocs: the documentation found in the body
1126 addProperty("inbodyDocs",this,&DefinitionContext::inbodyDocs);
1127 //%% string sourceFileName: the file name of the source file (without extension)
1128 addProperty("sourceFileName",this,&DefinitionContext::sourceFileName);
1129 //%% bool isLinkable: can the symbol be linked to?
1130 addProperty("isLinkable",this,&DefinitionContext::isLinkable);
1131 //%% bool isLinkableInProject: can the symbol be linked within this project?
1132 addProperty("isLinkableInProject",this,&DefinitionContext::isLinkableInProject);
1133 //%% int dynSectionId: identifier that can be used for collapsable sections
1134 addProperty("dynSectionId",this,&DefinitionContext::dynSectionId);
1135 //%% string language: the programming language in which the symbol is written
1136 addProperty("language",this,&DefinitionContext::language);
1137 //%% string sourceDef: A link to the source definition
1138 addProperty("sourceDef",this,&DefinitionContext::sourceDef);
1139 //%% list[Definition] navigationPath: Breadcrumb navigation path to this item
1140 addProperty("navigationPath",this,&DefinitionContext::navigationPath);
1142 m_cache.sourceDef.reset(TemplateList::alloc());
1143 m_cache.lineLink.reset(TemplateStruct::alloc());
1144 m_cache.fileLink.reset(TemplateStruct::alloc());
1146 if (m_def && !m_def->getSourceFileBase().isEmpty())
1148 m_cache.lineLink->set("text",m_def->getStartBodyLine());
1149 m_cache.lineLink->set("isLinkable",TRUE);
1150 m_cache.lineLink->set("fileName",m_def->getSourceFileBase());
1151 m_cache.lineLink->set("anchor",m_def->getSourceAnchor());
1152 if (m_def->definitionType()==Definition::TypeFile)
1154 m_cache.fileLink->set("text",m_def->name());
1156 else if (m_def->getBodyDef())
1158 m_cache.fileLink->set("text",m_def->getBodyDef()->name());
1162 m_cache.fileLink->set("text",name());
1164 m_cache.fileLink->set("isLinkable",TRUE);
1165 m_cache.fileLink->set("fileName",m_def->getSourceFileBase());
1166 m_cache.fileLink->set("anchor",QCString());
1167 m_cache.sourceDef->append(m_cache.lineLink.get());
1168 m_cache.sourceDef->append(m_cache.fileLink.get());
1171 TemplateVariant fileName() const
1173 return m_def->getOutputFileBase();
1175 TemplateVariant anchor() const
1177 return m_def->anchor();
1179 TemplateVariant sourceFileName() const
1181 return m_def->getSourceFileBase();
1183 TemplateVariant isLinkable() const
1185 return m_def->isLinkable();
1187 TemplateVariant isLinkableInProject() const
1189 return m_def->isLinkableInProject();
1191 TemplateVariant name() const
1193 return m_def->displayName(TRUE);
1195 TemplateVariant bareName() const
1197 return m_def->displayName(FALSE);
1199 QCString relPathAsString() const
1201 static bool createSubdirs = Config_getBool("CREATE_SUBDIRS");
1202 return createSubdirs ? QCString("../../") : QCString("");
1204 virtual TemplateVariant relPath() const
1206 return relPathAsString();
1208 TemplateVariant details() const
1210 if (!m_cache.details)
1212 m_cache.details.reset(new TemplateVariant(parseDoc(m_def,m_def->docFile(),m_def->docLine(),
1213 relPathAsString(),m_def->documentation(),FALSE)));
1215 return *m_cache.details;
1217 TemplateVariant brief() const
1221 if (m_def->hasBriefDescription())
1223 m_cache.brief.reset(new TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(),
1224 relPathAsString(),m_def->briefDescription(),TRUE)));
1228 m_cache.brief.reset(new TemplateVariant(""));
1231 return *m_cache.brief;
1233 TemplateVariant inbodyDocs() const
1235 if (!m_cache.inbodyDocs)
1237 if (!m_def->inbodyDocumentation().isEmpty())
1239 m_cache.inbodyDocs.reset(new TemplateVariant(parseDoc(m_def,m_def->inbodyFile(),m_def->inbodyLine(),
1240 relPathAsString(),m_def->inbodyDocumentation(),FALSE)));
1244 m_cache.inbodyDocs.reset(new TemplateVariant(""));
1247 return *m_cache.inbodyDocs;
1249 TemplateVariant dynSectionId() const
1251 return g_globals.dynSectionId;
1253 TemplateVariant language() const
1255 SrcLangExt lang = m_def->getLanguage();
1256 QCString result = "unknown";
1259 case SrcLangExt_Unknown: break;
1260 case SrcLangExt_IDL: result="idl"; break;
1261 case SrcLangExt_Java: result="java"; break;
1262 case SrcLangExt_CSharp: result="csharp"; break;
1263 case SrcLangExt_D: result="d"; break;
1264 case SrcLangExt_PHP: result="php"; break;
1265 case SrcLangExt_ObjC: result="objc"; break;
1266 case SrcLangExt_Cpp: result="cpp"; break;
1267 case SrcLangExt_JS: result="js"; break;
1268 case SrcLangExt_Python: result="python"; break;
1269 case SrcLangExt_Fortran: result="fortran"; break;
1270 case SrcLangExt_VHDL: result="vhdl"; break;
1271 case SrcLangExt_XML: result="xml"; break;
1272 case SrcLangExt_Tcl: result="tcl"; break;
1273 case SrcLangExt_Markdown: result="markdown"; break;
1277 TemplateVariant sourceDef() const
1279 if (m_cache.sourceDef->count()==2)
1281 return m_cache.sourceDef.get();
1288 void fillPath(Definition *def,TemplateList *list) const
1290 Definition *outerScope = def->getOuterScope();
1291 Definition::DefType type = def->definitionType();
1292 if (outerScope && outerScope!=Doxygen::globalScope)
1294 fillPath(outerScope,list);
1296 else if (type==Definition::TypeFile && ((const FileDef*)def)->getDirDef())
1298 fillPath(((const FileDef*)def)->getDirDef(),list);
1300 list->append(NavPathElemContext::alloc(def));
1302 TemplateVariant navigationPath() const
1304 if (!m_cache.navPath)
1306 TemplateList *list = TemplateList::alloc();
1307 if (m_def->getOuterScope() && m_def->getOuterScope()!=Doxygen::globalScope)
1309 fillPath(m_def->getOuterScope(),list);
1311 else if (m_def->definitionType()==Definition::TypeFile && ((const FileDef *)m_def)->getDirDef())
1313 fillPath(((const FileDef *)m_def)->getDirDef(),list);
1315 m_cache.navPath.reset(list);
1317 return m_cache.navPath.get();
1325 ScopedPtr<TemplateVariant> details;
1326 ScopedPtr<TemplateVariant> brief;
1327 ScopedPtr<TemplateVariant> inbodyDocs;
1328 SharedPtr<TemplateList> navPath;
1329 SharedPtr<TemplateList> sourceDef;
1330 SharedPtr<TemplateStruct> fileLink;
1331 SharedPtr<TemplateStruct> lineLink;
1333 mutable Cachable m_cache;
1337 //------------------------------------------------------------------------
1339 //%% struct IncludeInfo: include file information
1341 class IncludeInfoContext::Private : public PropertyMapper
1344 Private(const IncludeInfo *info,SrcLangExt lang) :
1350 addProperty("file",this,&Private::file);
1351 addProperty("name",this,&Private::name);
1352 addProperty("isImport",this,&Private::isImport);
1353 addProperty("isLocal",this,&Private::isLocal);
1356 TemplateVariant isLocal() const
1358 bool isIDLorJava = m_lang==SrcLangExt_IDL || m_lang==SrcLangExt_Java;
1359 return m_info->local || isIDLorJava;
1361 TemplateVariant isImport() const
1363 return m_info->imported;
1365 TemplateVariant file() const
1367 if (!m_fileContext && m_info && m_info->fileDef)
1369 m_fileContext.reset(FileContext::alloc(m_info->fileDef));
1373 return m_fileContext.get();
1380 TemplateVariant name() const
1382 return m_info->includeName;
1385 const IncludeInfo *m_info;
1386 mutable SharedPtr<FileContext> m_fileContext;
1390 IncludeInfoContext::IncludeInfoContext(const IncludeInfo *info,SrcLangExt lang) : RefCountedContext("IncludeContext")
1392 p = new Private(info,lang);
1395 IncludeInfoContext::~IncludeInfoContext()
1400 TemplateVariant IncludeInfoContext::get(const char *n) const
1406 //------------------------------------------------------------------------
1408 //%% list IncludeInfoList[Class] : list of nested classes
1409 class IncludeInfoListContext::Private : public GenericNodeListContext
1412 Private(const QList<IncludeInfo> &list,SrcLangExt lang)
1414 QListIterator<IncludeInfo> li(list);
1416 for (li.toFirst();(ii=li.current());++li)
1420 append(IncludeInfoContext::alloc(ii,lang));
1426 IncludeInfoListContext::IncludeInfoListContext(const QList<IncludeInfo> &list,SrcLangExt lang) : RefCountedContext("IncludeListContext")
1428 p = new Private(list,lang);
1431 IncludeInfoListContext::~IncludeInfoListContext()
1437 int IncludeInfoListContext::count() const
1442 TemplateVariant IncludeInfoListContext::at(int index) const
1444 return p->at(index);
1447 TemplateListIntf::ConstIterator *IncludeInfoListContext::createIterator() const
1449 return p->createIterator();
1452 //------------------------------------------------------------------------
1454 //%% struct Class(Symbol): class information
1456 class ClassContext::Private : public DefinitionContext<ClassContext::Private>
1459 Private(ClassDef *cd) : DefinitionContext<ClassContext::Private>(cd),
1462 addProperty("title", this,&Private::title);
1463 addProperty("highlight", this,&Private::highlight);
1464 addProperty("subhighlight", this,&Private::subHighlight);
1465 addProperty("hasDetails", this,&Private::hasDetails);
1466 addProperty("generatedFromFiles", this,&Private::generatedFromFiles);
1467 addProperty("usedFiles", this,&Private::usedFiles);
1468 addProperty("hasInheritanceDiagram", this,&Private::hasInheritanceDiagram);
1469 addProperty("inheritanceDiagram", this,&Private::inheritanceDiagram);
1470 addProperty("hasCollaborationDiagram", this,&Private::hasCollaborationDiagram);
1471 addProperty("collaborationDiagram", this,&Private::collaborationDiagram);
1472 addProperty("includeInfo", this,&Private::includeInfo);
1473 addProperty("inherits", this,&Private::inherits);
1474 addProperty("inheritedBy", this,&Private::inheritedBy);
1475 addProperty("unoIDLServices", this,&Private::unoIDLServices);
1476 addProperty("unoIDLInterfaces", this,&Private::unoIDLInterfaces);
1477 addProperty("signals", this,&Private::signals);
1478 addProperty("publicTypes", this,&Private::publicTypes);
1479 addProperty("publicMethods", this,&Private::publicMethods);
1480 addProperty("publicStaticMethods", this,&Private::publicStaticMethods);
1481 addProperty("publicAttributes", this,&Private::publicAttributes);
1482 addProperty("publicStaticAttributes", this,&Private::publicStaticAttributes);
1483 addProperty("publicSlots", this,&Private::publicSlots);
1484 addProperty("protectedTypes", this,&Private::protectedTypes);
1485 addProperty("protectedMethods", this,&Private::protectedMethods);
1486 addProperty("protectedStaticMethods", this,&Private::protectedStaticMethods);
1487 addProperty("protectedAttributes", this,&Private::protectedAttributes);
1488 addProperty("protectedStaticAttributes", this,&Private::protectedStaticAttributes);
1489 addProperty("protectedSlots", this,&Private::protectedSlots);
1490 addProperty("privateTypes", this,&Private::privateTypes);
1491 addProperty("privateMethods", this,&Private::privateMethods);
1492 addProperty("privateStaticMethods", this,&Private::privateStaticMethods);
1493 addProperty("privateAttributes", this,&Private::privateAttributes);
1494 addProperty("privateStaticAttributes", this,&Private::privateStaticAttributes);
1495 addProperty("privateSlots", this,&Private::privateSlots);
1496 addProperty("packageTypes", this,&Private::packageTypes);
1497 addProperty("packageMethods", this,&Private::packageMethods);
1498 addProperty("packageStaticMethods", this,&Private::packageStaticMethods);
1499 addProperty("packageAttributes", this,&Private::packageAttributes);
1500 addProperty("packageStaticAttributes", this,&Private::packageStaticAttributes);
1501 addProperty("properties", this,&Private::properties);
1502 addProperty("events", this,&Private::events);
1503 addProperty("friends", this,&Private::friends);
1504 addProperty("related", this,&Private::related);
1505 addProperty("detailedTypedefs", this,&Private::detailedTypedefs);
1506 addProperty("detailedEnums", this,&Private::detailedEnums);
1507 addProperty("detailedServices", this,&Private::detailedServices);
1508 addProperty("detailedInterfaces", this,&Private::detailedInterfaces);
1509 addProperty("detailedConstructors", this,&Private::detailedConstructors);
1510 addProperty("detailedMethods", this,&Private::detailedMethods);
1511 addProperty("detailedRelated", this,&Private::detailedRelated);
1512 addProperty("detailedVariables", this,&Private::detailedVariables);
1513 addProperty("detailedProperties", this,&Private::detailedProperties);
1514 addProperty("detailedEvents", this,&Private::detailedEvents);
1515 addProperty("classes", this,&Private::classes);
1516 addProperty("compoundType", this,&Private::compoundType);
1517 addProperty("templateDecls", this,&Private::templateDecls);
1518 addProperty("typeConstraints", this,&Private::typeConstraints);
1519 addProperty("examples", this,&Private::examples);
1520 addProperty("members", this,&Private::members);
1521 addProperty("allMembersList", this,&Private::allMembersList);
1522 addProperty("allMembersFileName", this,&Private::allMembersFileName);
1523 addProperty("memberGroups", this,&Private::memberGroups);
1524 addProperty("additionalInheritedMembers",this,&Private::additionalInheritedMembers);
1526 virtual ~Private() {}
1527 TemplateVariant title() const
1529 return TemplateVariant(m_classDef->title());
1531 TemplateVariant highlight() const
1533 return TemplateVariant("classes");
1535 TemplateVariant subHighlight() const
1537 return TemplateVariant("");
1539 TemplateVariant hasDetails() const
1541 return m_classDef->hasDetailedDescription();
1543 TemplateVariant generatedFromFiles() const
1545 return m_classDef->generatedFromFiles();
1547 TemplateVariant usedFiles() const
1549 if (!m_cache.usedFiles)
1551 m_cache.usedFiles.reset(UsedFilesContext::alloc(m_classDef));
1553 return m_cache.usedFiles.get();
1555 DotClassGraph *getClassGraph() const
1557 if (!m_cache.classGraph)
1559 m_cache.classGraph.reset(new DotClassGraph(m_classDef,DotNode::Inheritance));
1561 return m_cache.classGraph.get();
1563 int numInheritanceNodes() const
1565 if (m_cache.inheritanceNodes==-1)
1567 m_cache.inheritanceNodes=m_classDef->countInheritanceNodes();
1569 return m_cache.inheritanceNodes>0;
1571 TemplateVariant hasInheritanceDiagram() const
1574 static bool haveDot = Config_getBool("HAVE_DOT");
1575 static bool classDiagrams = Config_getBool("CLASS_DIAGRAMS");
1576 static bool classGraph = Config_getBool("CLASS_GRAPH");
1577 if (haveDot && (classDiagrams || classGraph))
1579 DotClassGraph *cg = getClassGraph();
1580 result = !cg->isTrivial() && !cg->isTooBig();
1582 else if (classDiagrams)
1584 result = numInheritanceNodes()>0;
1588 TemplateVariant inheritanceDiagram() const
1591 static bool haveDot = Config_getBool("HAVE_DOT");
1592 static bool classDiagrams = Config_getBool("CLASS_DIAGRAMS");
1593 static bool classGraph = Config_getBool("CLASS_GRAPH");
1594 if (haveDot && (classDiagrams || classGraph))
1596 DotClassGraph *cg = getClassGraph();
1597 FTextStream t(&result);
1598 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
1599 g_globals.outputDir,
1600 g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension,
1601 relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
1604 else if (classDiagrams)
1606 ClassDiagram d(m_classDef);
1607 FTextStream t(&result);
1608 QCString name = convertToHtml(m_classDef->displayName());
1609 t << "<div class=\"center\">" << endl;
1611 t << relPathAsString() << m_classDef->getOutputFileBase();
1612 t << ".png\" usemap=\"#" << name << "_map\" alt=\"\"/>" << endl;
1613 t << "<map id=\"" << name << "_map\" name=\"" << name << "_map\">" << endl;
1614 d.writeImage(t,g_globals.outputDir,
1616 m_classDef->getOutputFileBase());
1619 g_globals.dynSectionId++;
1620 return TemplateVariant(result.data(),TRUE);
1622 DotClassGraph *getCollaborationGraph() const
1624 if (!m_cache.collaborationGraph)
1626 m_cache.collaborationGraph.reset(new DotClassGraph(m_classDef,DotNode::Collaboration));
1628 return m_cache.collaborationGraph.get();
1630 TemplateVariant hasCollaborationDiagram() const
1632 static bool haveDot = Config_getBool("HAVE_DOT");
1633 return haveDot && !getCollaborationGraph()->isTrivial();
1635 TemplateVariant collaborationDiagram() const
1637 static bool haveDot = Config_getBool("HAVE_DOT");
1641 DotClassGraph *cg = getCollaborationGraph();
1642 FTextStream t(&result);
1643 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
1644 g_globals.outputDir,
1645 g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension,
1646 relPathAsString(),TRUE,TRUE,g_globals.dynSectionId
1649 g_globals.dynSectionId++;
1650 return TemplateVariant(result.data(),TRUE);
1653 TemplateVariant includeInfo() const
1655 if (!m_cache.includeInfo && m_classDef->includeInfo())
1657 m_cache.includeInfo.reset(IncludeInfoContext::alloc(m_classDef->includeInfo(),m_classDef->getLanguage()));
1659 if (m_cache.includeInfo)
1661 return m_cache.includeInfo.get();
1665 return TemplateVariant(FALSE);
1668 TemplateVariant inherits() const
1670 if (!m_cache.inheritsList)
1672 m_cache.inheritsList.reset(InheritanceListContext::alloc(m_classDef->baseClasses(),TRUE));
1674 return m_cache.inheritsList.get();
1676 TemplateVariant inheritedBy() const
1678 if (!m_cache.inheritedByList)
1680 m_cache.inheritedByList.reset(InheritanceListContext::alloc(m_classDef->subClasses(),FALSE));
1682 return m_cache.inheritedByList.get();
1684 TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
1685 MemberListType type,const char *title,bool detailed=FALSE) const
1689 MemberList *ml = m_classDef->getMemberList(type);
1692 list.reset(MemberListInfoContext::alloc(m_classDef,relPathAsString(),ml,title,detailed));
1701 return TemplateVariant(FALSE);
1704 TemplateVariant unoIDLServices() const
1706 return getMemberList(m_cache.unoIDLServices,MemberListType_services,theTranslator->trServices());
1708 TemplateVariant unoIDLInterfaces() const
1710 return getMemberList(m_cache.unoIDLInterfaces,MemberListType_interfaces,theTranslator->trInterfaces());
1712 TemplateVariant signals() const
1714 return getMemberList(m_cache.signals,MemberListType_signals,theTranslator->trSignals());
1716 TemplateVariant publicTypes() const
1718 return getMemberList(m_cache.publicTypes,MemberListType_pubTypes,theTranslator->trPublicTypes());
1720 TemplateVariant publicMethods() const
1722 return getMemberList(m_cache.publicMethods,MemberListType_pubMethods,
1723 m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trInstanceMethods()
1724 : theTranslator->trPublicMembers());
1726 TemplateVariant publicStaticMethods() const
1728 return getMemberList(m_cache.publicStaticMethods,MemberListType_pubStaticMethods,
1729 m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trClassMethods()
1730 : theTranslator->trStaticPublicMembers());
1732 TemplateVariant publicAttributes() const
1734 return getMemberList(m_cache.publicAttributes,MemberListType_pubAttribs,theTranslator->trPublicAttribs());
1736 TemplateVariant publicStaticAttributes() const
1738 return getMemberList(m_cache.publicStaticAttributes,MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs());
1740 TemplateVariant publicSlots() const
1742 return getMemberList(m_cache.publicSlots,MemberListType_pubSlots,theTranslator->trPublicSlots());
1744 TemplateVariant protectedTypes() const
1746 return getMemberList(m_cache.protectedTypes,MemberListType_proTypes,theTranslator->trProtectedTypes());
1748 TemplateVariant protectedMethods() const
1750 return getMemberList(m_cache.protectedMethods,MemberListType_proMethods,theTranslator->trProtectedMembers());
1752 TemplateVariant protectedStaticMethods() const
1754 return getMemberList(m_cache.protectedStaticMethods,MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers());
1756 TemplateVariant protectedAttributes() const
1758 return getMemberList(m_cache.protectedAttributes,MemberListType_proAttribs,theTranslator->trProtectedAttribs());
1760 TemplateVariant protectedStaticAttributes() const
1762 return getMemberList(m_cache.protectedStaticAttributes,MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs());
1764 TemplateVariant protectedSlots() const
1766 return getMemberList(m_cache.protectedSlots,MemberListType_proSlots,theTranslator->trProtectedSlots());
1768 TemplateVariant privateTypes() const
1770 return getMemberList(m_cache.privateTypes,MemberListType_priTypes,theTranslator->trPrivateTypes());
1772 TemplateVariant privateSlots() const
1774 return getMemberList(m_cache.privateSlots,MemberListType_priSlots,theTranslator->trPrivateSlots());
1776 TemplateVariant privateMethods() const
1778 return getMemberList(m_cache.privateMethods,MemberListType_priMethods,theTranslator->trPrivateMembers());
1780 TemplateVariant privateStaticMethods() const
1782 return getMemberList(m_cache.privateStaticMethods,MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers());
1784 TemplateVariant privateAttributes() const
1786 return getMemberList(m_cache.privateAttributes,MemberListType_priAttribs,theTranslator->trPrivateAttribs());
1788 TemplateVariant privateStaticAttributes() const
1790 return getMemberList(m_cache.privateStaticAttributes,MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs());
1792 TemplateVariant packageTypes() const
1794 return getMemberList(m_cache.packageTypes,MemberListType_pacTypes,theTranslator->trPackageTypes());
1796 TemplateVariant packageMethods() const
1798 return getMemberList(m_cache.packageMethods,MemberListType_pacMethods,theTranslator->trPackageMembers());
1800 TemplateVariant packageStaticMethods() const
1802 return getMemberList(m_cache.packageStaticMethods,MemberListType_pacStaticMethods,theTranslator->trStaticPackageMembers());
1804 TemplateVariant packageAttributes() const
1806 return getMemberList(m_cache.packageAttributes,MemberListType_pacAttribs,theTranslator->trPackageAttribs());
1808 TemplateVariant packageStaticAttributes() const
1810 return getMemberList(m_cache.packageStaticAttributes,MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs());
1812 TemplateVariant properties() const
1814 return getMemberList(m_cache.properties,MemberListType_properties,theTranslator->trProperties());
1816 TemplateVariant events() const
1818 return getMemberList(m_cache.events,MemberListType_events,theTranslator->trEvents());
1820 TemplateVariant friends() const
1822 return getMemberList(m_cache.friends,MemberListType_friends,theTranslator->trFriends());
1824 TemplateVariant related() const
1826 return getMemberList(m_cache.related,MemberListType_related,theTranslator->trRelatedFunctions());
1828 TemplateVariant detailedTypedefs() const
1830 return getMemberList(m_cache.detailedTypedefs,MemberListType_typedefMembers,theTranslator->trMemberTypedefDocumentation(),TRUE);
1832 TemplateVariant detailedEnums() const
1834 return getMemberList(m_cache.detailedEnums,MemberListType_enumMembers,theTranslator->trMemberEnumerationDocumentation(),TRUE);
1836 TemplateVariant detailedServices() const
1838 return getMemberList(m_cache.detailedServices,MemberListType_serviceMembers,theTranslator->trServices(),TRUE);
1840 TemplateVariant detailedInterfaces() const
1842 return getMemberList(m_cache.detailedInterfaces,MemberListType_interfaceMembers,theTranslator->trInterfaces(),TRUE);
1844 TemplateVariant detailedConstructors() const
1846 return getMemberList(m_cache.detailedConstructors,MemberListType_constructors,theTranslator->trConstructorDocumentation(),TRUE);
1848 TemplateVariant detailedMethods() const
1850 return getMemberList(m_cache.detailedMethods,MemberListType_functionMembers,theTranslator->trMemberFunctionDocumentation(),TRUE);
1852 TemplateVariant detailedRelated() const
1854 return getMemberList(m_cache.detailedRelated,MemberListType_relatedMembers,theTranslator->trRelatedFunctionDocumentation(),TRUE);
1856 TemplateVariant detailedVariables() const
1858 return getMemberList(m_cache.detailedVariables,MemberListType_variableMembers,theTranslator->trMemberDataDocumentation(),TRUE);
1860 TemplateVariant detailedProperties() const
1862 return getMemberList(m_cache.detailedProperties,MemberListType_propertyMembers,theTranslator->trPropertyDocumentation(),TRUE);
1864 TemplateVariant detailedEvents() const
1866 return getMemberList(m_cache.detailedEvents,MemberListType_eventMembers,theTranslator->trEventDocumentation(),TRUE);
1868 TemplateVariant classes() const
1870 if (!m_cache.classes)
1872 TemplateList *classList = TemplateList::alloc();
1873 if (m_classDef->getClassSDict())
1875 ClassSDict::Iterator sdi(*m_classDef->getClassSDict());
1877 for (sdi.toFirst();(cd=sdi.current());++sdi)
1879 if (cd->visibleInParentsDeclList())
1881 classList->append(ClassContext::alloc(cd));
1885 m_cache.classes.reset(classList);
1887 return m_cache.classes.get();
1889 TemplateVariant compoundType() const
1891 return m_classDef->compoundTypeString();
1893 void addTemplateDecls(Definition *d,TemplateList *tl) const
1895 if (d->definitionType()==Definition::TypeClass)
1897 Definition *parent = d->getOuterScope();
1900 addTemplateDecls(parent,tl);
1902 ClassDef *cd=(ClassDef *)d;
1903 if (cd->templateArguments())
1905 ArgumentListContext *al = ArgumentListContext::alloc(cd->templateArguments(),cd,relPathAsString());
1906 // since a TemplateVariant does take ownership of the object, we add it
1907 // a separate list just to be able to delete it and avoid a memory leak
1912 void addExamples(TemplateList *list) const
1914 if (m_classDef->hasExamples())
1916 ExampleSDict::Iterator it(*m_classDef->exampleList());
1918 for (it.toFirst();(ex=it.current());++it)
1920 TemplateStruct *s = TemplateStruct::alloc();
1921 s->set("text",ex->name);
1922 s->set("isLinkable",TRUE);
1923 s->set("anchor",ex->anchor);
1924 s->set("fileName",ex->file);
1929 TemplateVariant templateDecls() const
1931 if (!m_cache.templateDecls)
1933 TemplateList *tl = TemplateList::alloc();
1934 addTemplateDecls(m_classDef,tl);
1935 m_cache.templateDecls.reset(tl);
1937 return m_cache.templateDecls.get();
1939 TemplateVariant typeConstraints() const
1941 if (!m_cache.typeConstraints && m_classDef->typeConstraints())
1943 m_cache.typeConstraints.reset(ArgumentListContext::alloc(m_classDef->typeConstraints(),m_classDef,relPathAsString()));
1947 m_cache.typeConstraints.reset(ArgumentListContext::alloc());
1949 return m_cache.typeConstraints.get();
1951 TemplateVariant examples() const
1953 if (!m_cache.examples)
1955 TemplateList *exampleList = TemplateList::alloc();
1956 addExamples(exampleList);
1957 m_cache.examples.reset(exampleList);
1959 return m_cache.examples.get();
1961 void addMembers(ClassDef *cd,MemberListType lt) const
1963 MemberList *ml = cd->getMemberList(lt);
1966 MemberListIterator li(*ml);
1967 const MemberDef *md;
1968 for (li.toFirst();(md=li.current());++li)
1970 if (md->isBriefSectionVisible())
1972 m_cache.allMembers.append(md);
1977 TemplateVariant members() const
1979 if (!m_cache.members)
1981 addMembers(m_classDef,MemberListType_pubTypes);
1982 addMembers(m_classDef,MemberListType_services);
1983 addMembers(m_classDef,MemberListType_interfaces);
1984 addMembers(m_classDef,MemberListType_pubSlots);
1985 addMembers(m_classDef,MemberListType_signals);
1986 addMembers(m_classDef,MemberListType_pubMethods);
1987 addMembers(m_classDef,MemberListType_pubStaticMethods);
1988 addMembers(m_classDef,MemberListType_pubAttribs);
1989 addMembers(m_classDef,MemberListType_pubStaticAttribs);
1990 addMembers(m_classDef,MemberListType_proTypes);
1991 addMembers(m_classDef,MemberListType_proSlots);
1992 addMembers(m_classDef,MemberListType_proMethods);
1993 addMembers(m_classDef,MemberListType_proStaticMethods);
1994 addMembers(m_classDef,MemberListType_proAttribs);
1995 addMembers(m_classDef,MemberListType_proStaticAttribs);
1996 addMembers(m_classDef,MemberListType_pacTypes);
1997 addMembers(m_classDef,MemberListType_pacMethods);
1998 addMembers(m_classDef,MemberListType_pacStaticMethods);
1999 addMembers(m_classDef,MemberListType_pacAttribs);
2000 addMembers(m_classDef,MemberListType_pacStaticAttribs);
2001 addMembers(m_classDef,MemberListType_properties);
2002 addMembers(m_classDef,MemberListType_events);
2003 addMembers(m_classDef,MemberListType_priTypes);
2004 addMembers(m_classDef,MemberListType_priSlots);
2005 addMembers(m_classDef,MemberListType_priMethods);
2006 addMembers(m_classDef,MemberListType_priStaticMethods);
2007 addMembers(m_classDef,MemberListType_priAttribs);
2008 addMembers(m_classDef,MemberListType_priStaticAttribs);
2009 addMembers(m_classDef,MemberListType_related);
2010 m_cache.members.reset(MemberListContext::alloc(&m_cache.allMembers));
2012 return m_cache.members.get();
2014 TemplateVariant allMembersList() const
2016 if (!m_cache.allMembersList)
2018 if (m_classDef->memberNameInfoSDict())
2020 AllMembersListContext *ml = AllMembersListContext::alloc(m_classDef->memberNameInfoSDict());
2021 m_cache.allMembersList.reset(ml);
2025 m_cache.allMembersList.reset(AllMembersListContext::alloc());
2028 return m_cache.allMembersList.get();
2030 TemplateVariant allMembersFileName() const
2032 return m_classDef->getMemberListFileName();
2034 TemplateVariant memberGroups() const
2036 if (!m_cache.memberGroups)
2038 if (m_classDef->getMemberGroupSDict())
2040 m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_classDef,relPathAsString(),m_classDef->getMemberGroupSDict(),m_classDef->subGrouping()));
2044 m_cache.memberGroups.reset(MemberGroupListContext::alloc());
2047 return m_cache.memberGroups.get();
2049 TemplateVariant additionalInheritedMembers() const
2051 if (!m_cache.additionalInheritedMembers)
2053 InheritedMemberInfoListContext *ctx = InheritedMemberInfoListContext::alloc();
2054 ctx->addMemberList(m_classDef,MemberListType_pubTypes,theTranslator->trPublicTypes());
2055 ctx->addMemberList(m_classDef,MemberListType_services,theTranslator->trServices());
2056 ctx->addMemberList(m_classDef,MemberListType_interfaces,theTranslator->trInterfaces());
2057 ctx->addMemberList(m_classDef,MemberListType_pubSlots,theTranslator->trPublicSlots());
2058 ctx->addMemberList(m_classDef,MemberListType_signals,theTranslator->trSignals());
2059 ctx->addMemberList(m_classDef,MemberListType_pubMethods,
2060 m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trInstanceMethods()
2061 : theTranslator->trPublicMembers());
2062 ctx->addMemberList(m_classDef,MemberListType_pubStaticMethods,
2063 m_classDef->getLanguage()==SrcLangExt_ObjC ? theTranslator->trClassMethods()
2064 : theTranslator->trStaticPublicMembers());
2065 ctx->addMemberList(m_classDef,MemberListType_pubAttribs,theTranslator->trPublicAttribs());
2066 ctx->addMemberList(m_classDef,MemberListType_pubStaticAttribs,theTranslator->trStaticPublicAttribs());
2067 ctx->addMemberList(m_classDef,MemberListType_proTypes,theTranslator->trProtectedTypes());
2068 ctx->addMemberList(m_classDef,MemberListType_proSlots,theTranslator->trProtectedSlots());
2069 ctx->addMemberList(m_classDef,MemberListType_proMethods,theTranslator->trProtectedMembers());
2070 ctx->addMemberList(m_classDef,MemberListType_proStaticMethods,theTranslator->trStaticProtectedMembers());
2071 ctx->addMemberList(m_classDef,MemberListType_proAttribs,theTranslator->trProtectedAttribs());
2072 ctx->addMemberList(m_classDef,MemberListType_proStaticAttribs,theTranslator->trStaticProtectedAttribs());
2073 ctx->addMemberList(m_classDef,MemberListType_pacTypes,theTranslator->trPackageTypes());
2074 ctx->addMemberList(m_classDef,MemberListType_pacMethods,theTranslator->trPackageMembers());
2075 ctx->addMemberList(m_classDef,MemberListType_pacStaticMethods,theTranslator->trStaticPackageMembers());
2076 ctx->addMemberList(m_classDef,MemberListType_pacAttribs,theTranslator->trPackageAttribs());
2077 ctx->addMemberList(m_classDef,MemberListType_pacStaticAttribs,theTranslator->trStaticPackageAttribs());
2078 ctx->addMemberList(m_classDef,MemberListType_properties,theTranslator->trProperties());
2079 ctx->addMemberList(m_classDef,MemberListType_events,theTranslator->trEvents());
2080 ctx->addMemberList(m_classDef,MemberListType_priTypes,theTranslator->trPrivateTypes());
2081 ctx->addMemberList(m_classDef,MemberListType_priSlots,theTranslator->trPrivateSlots());
2082 ctx->addMemberList(m_classDef,MemberListType_priMethods,theTranslator->trPrivateMembers());
2083 ctx->addMemberList(m_classDef,MemberListType_priStaticMethods,theTranslator->trStaticPrivateMembers());
2084 ctx->addMemberList(m_classDef,MemberListType_priAttribs,theTranslator->trPrivateAttribs());
2085 ctx->addMemberList(m_classDef,MemberListType_priStaticAttribs,theTranslator->trStaticPrivateAttribs());
2086 ctx->addMemberList(m_classDef,MemberListType_related,theTranslator->trRelatedFunctions());
2087 m_cache.additionalInheritedMembers.reset(ctx);
2089 return m_cache.additionalInheritedMembers.get();
2093 ClassDef *m_classDef;
2096 Cachable() : inheritanceNodes(-1) { }
2097 SharedPtr<IncludeInfoContext> includeInfo;
2098 SharedPtr<InheritanceListContext> inheritsList;
2099 SharedPtr<InheritanceListContext> inheritedByList;
2100 ScopedPtr<DotClassGraph> classGraph;
2101 ScopedPtr<DotClassGraph> collaborationGraph;
2102 SharedPtr<TemplateList> classes;
2103 SharedPtr<MemberListInfoContext> publicTypes;
2104 SharedPtr<MemberListInfoContext> publicMethods;
2105 SharedPtr<MemberListInfoContext> publicStaticMethods;
2106 SharedPtr<MemberListInfoContext> publicAttributes;
2107 SharedPtr<MemberListInfoContext> publicStaticAttributes;
2108 SharedPtr<MemberListInfoContext> publicSlots;
2109 SharedPtr<MemberListInfoContext> protectedTypes;
2110 SharedPtr<MemberListInfoContext> protectedMethods;
2111 SharedPtr<MemberListInfoContext> protectedStaticMethods;
2112 SharedPtr<MemberListInfoContext> protectedAttributes;
2113 SharedPtr<MemberListInfoContext> protectedStaticAttributes;
2114 SharedPtr<MemberListInfoContext> protectedSlots;
2115 SharedPtr<MemberListInfoContext> privateTypes;
2116 SharedPtr<MemberListInfoContext> privateMethods;
2117 SharedPtr<MemberListInfoContext> privateStaticMethods;
2118 SharedPtr<MemberListInfoContext> privateAttributes;
2119 SharedPtr<MemberListInfoContext> privateStaticAttributes;
2120 SharedPtr<MemberListInfoContext> privateSlots;
2121 SharedPtr<MemberListInfoContext> packageTypes;
2122 SharedPtr<MemberListInfoContext> packageMethods;
2123 SharedPtr<MemberListInfoContext> packageStaticMethods;
2124 SharedPtr<MemberListInfoContext> packageAttributes;
2125 SharedPtr<MemberListInfoContext> packageStaticAttributes;
2126 SharedPtr<MemberListInfoContext> unoIDLServices;
2127 SharedPtr<MemberListInfoContext> unoIDLInterfaces;
2128 SharedPtr<MemberListInfoContext> signals;
2129 SharedPtr<MemberListInfoContext> properties;
2130 SharedPtr<MemberListInfoContext> events;
2131 SharedPtr<MemberListInfoContext> friends;
2132 SharedPtr<MemberListInfoContext> related;
2133 SharedPtr<MemberListInfoContext> detailedTypedefs;
2134 SharedPtr<MemberListInfoContext> detailedEnums;
2135 SharedPtr<MemberListInfoContext> detailedServices;
2136 SharedPtr<MemberListInfoContext> detailedInterfaces;
2137 SharedPtr<MemberListInfoContext> detailedConstructors;
2138 SharedPtr<MemberListInfoContext> detailedMethods;
2139 SharedPtr<MemberListInfoContext> detailedRelated;
2140 SharedPtr<MemberListInfoContext> detailedVariables;
2141 SharedPtr<MemberListInfoContext> detailedProperties;
2142 SharedPtr<MemberListInfoContext> detailedEvents;
2143 SharedPtr<MemberGroupListContext> memberGroups;
2144 SharedPtr<AllMembersListContext> allMembersList;
2145 SharedPtr<ArgumentListContext> typeConstraints;
2146 SharedPtr<TemplateList> examples;
2147 SharedPtr<TemplateList> templateDecls;
2148 SharedPtr<InheritedMemberInfoListContext> additionalInheritedMembers;
2149 SharedPtr<MemberListContext> members;
2150 SharedPtr<UsedFilesContext> usedFiles;
2151 SharedPtr<TemplateList> exampleList;
2152 int inheritanceNodes;
2153 MemberList allMembers;
2155 mutable Cachable m_cache;
2159 ClassContext::ClassContext(ClassDef *cd) : RefCountedContext("ClassContext")
2161 //printf("ClassContext::ClassContext(%s)\n",cd?cd->name().data():"<none>");
2162 p = new Private(cd);
2165 ClassContext::~ClassContext()
2170 TemplateVariant ClassContext::get(const char *n) const
2175 //------------------------------------------------------------------------
2177 //%% struct Namespace(Symbol): namespace information
2179 class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Private>
2182 Private(NamespaceDef *nd) : DefinitionContext<NamespaceContext::Private>(nd) , m_namespaceDef(nd)
2184 addProperty("title", this,&Private::title);
2185 addProperty("highlight", this,&Private::highlight);
2186 addProperty("subhighlight", this,&Private::subHighlight);
2187 addProperty("compoundType", this,&Private::compoundType);
2188 addProperty("hasDetails", this,&Private::hasDetails);
2189 addProperty("classes", this,&Private::classes);
2190 addProperty("namespaces", this,&Private::namespaces);
2191 addProperty("constantgroups", this,&Private::constantgroups);
2192 addProperty("typedefs", this,&Private::typedefs);
2193 addProperty("enums", this,&Private::enums);
2194 addProperty("functions", this,&Private::functions);
2195 addProperty("variables", this,&Private::variables);
2196 addProperty("memberGroups", this,&Private::memberGroups);
2197 addProperty("detailedTypedefs", this,&Private::detailedTypedefs);
2198 addProperty("detailedEnums", this,&Private::detailedEnums);
2199 addProperty("detailedFunctions", this,&Private::detailedFunctions);
2200 addProperty("detailedVariables", this,&Private::detailedVariables);
2201 addProperty("inlineClasses", this,&Private::inlineClasses);
2203 virtual ~Private() {}
2204 TemplateVariant title() const
2206 return TemplateVariant(m_namespaceDef->title());
2208 TemplateVariant highlight() const
2210 return TemplateVariant("namespaces");
2212 TemplateVariant subHighlight() const
2214 return TemplateVariant("");
2216 TemplateVariant compoundType() const
2218 return m_namespaceDef->compoundTypeString();
2220 TemplateVariant hasDetails() const
2222 return m_namespaceDef->hasDetailedDescription();
2224 TemplateVariant classes() const
2226 if (!m_cache.classes)
2228 TemplateList *classList = TemplateList::alloc();
2229 if (m_namespaceDef->getClassSDict())
2231 ClassSDict::Iterator sdi(*m_namespaceDef->getClassSDict());
2233 for (sdi.toFirst();(cd=sdi.current());++sdi)
2235 if (cd->visibleInParentsDeclList())
2237 classList->append(ClassContext::alloc(cd));
2241 m_cache.classes.reset(classList);
2243 return m_cache.classes.get();
2245 TemplateVariant namespaces() const
2247 if (!m_cache.namespaces)
2249 TemplateList *namespaceList = TemplateList::alloc();
2250 if (m_namespaceDef->getNamespaceSDict())
2252 NamespaceSDict::Iterator sdi(*m_namespaceDef->getNamespaceSDict());
2254 for (sdi.toFirst();(nd=sdi.current());++sdi)
2256 if (nd->isLinkable() && !nd->isConstantGroup())
2258 namespaceList->append(NamespaceContext::alloc(nd));
2262 m_cache.namespaces.reset(namespaceList);
2264 return m_cache.namespaces.get();
2266 TemplateVariant constantgroups() const
2268 if (!m_cache.constantgroups)
2270 TemplateList *namespaceList = TemplateList::alloc();
2271 if (m_namespaceDef->getNamespaceSDict())
2273 NamespaceSDict::Iterator sdi(*m_namespaceDef->getNamespaceSDict());
2275 for (sdi.toFirst();(nd=sdi.current());++sdi)
2277 if (nd->isLinkable() && nd->isConstantGroup())
2279 namespaceList->append(NamespaceContext::alloc(nd));
2283 m_cache.constantgroups.reset(namespaceList);
2285 return m_cache.constantgroups.get();
2287 TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
2288 MemberListType type,const char *title,bool detailed=FALSE) const
2292 MemberList *ml = m_namespaceDef->getMemberList(type);
2295 list.reset(MemberListInfoContext::alloc(m_namespaceDef,relPathAsString(),ml,title,detailed));
2304 return TemplateVariant(FALSE);
2307 TemplateVariant typedefs() const
2309 return getMemberList(m_cache.typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
2311 TemplateVariant enums() const
2313 return getMemberList(m_cache.enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
2315 TemplateVariant functions() const
2317 QCString title = theTranslator->trFunctions();
2318 SrcLangExt lang = m_namespaceDef->getLanguage();
2319 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
2320 else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc();
2321 return getMemberList(m_cache.functions,MemberListType_decFuncMembers,title);
2323 TemplateVariant variables() const
2325 return getMemberList(m_cache.variables,MemberListType_decVarMembers,theTranslator->trVariables());
2327 TemplateVariant memberGroups() const
2329 if (!m_cache.memberGroups)
2331 if (m_namespaceDef->getMemberGroupSDict())
2333 m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_namespaceDef,relPathAsString(),m_namespaceDef->getMemberGroupSDict(),m_namespaceDef->subGrouping()));
2337 m_cache.memberGroups.reset(MemberGroupListContext::alloc());
2340 return m_cache.memberGroups.get();
2342 TemplateVariant detailedTypedefs() const
2344 return getMemberList(m_cache.detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
2346 TemplateVariant detailedEnums() const
2348 return getMemberList(m_cache.detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
2350 TemplateVariant detailedFunctions() const
2352 QCString title = theTranslator->trFunctionDocumentation();
2353 SrcLangExt lang = m_namespaceDef->getLanguage();
2354 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation();
2355 return getMemberList(m_cache.detailedFunctions,MemberListType_docFuncMembers,title);
2357 TemplateVariant detailedVariables() const
2359 return getMemberList(m_cache.detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
2361 TemplateVariant inlineClasses() const
2363 if (!m_cache.inlineClasses)
2365 TemplateList *classList = TemplateList::alloc();
2366 if (m_namespaceDef->getClassSDict())
2368 ClassSDict::Iterator sdi(*m_namespaceDef->getClassSDict());
2370 for (sdi.toFirst();(cd=sdi.current());++sdi)
2372 if (cd->name().find('@')==-1 &&
2373 cd->isLinkableInProject() &&
2374 cd->isEmbeddedInOuterScope() &&
2375 cd->partOfGroups()==0)
2377 classList->append(ClassContext::alloc(cd));
2381 m_cache.inlineClasses.reset(classList);
2383 return m_cache.inlineClasses.get();
2386 NamespaceDef *m_namespaceDef;
2389 SharedPtr<TemplateList> classes;
2390 SharedPtr<TemplateList> namespaces;
2391 SharedPtr<TemplateList> constantgroups;
2392 SharedPtr<MemberListInfoContext> typedefs;
2393 SharedPtr<MemberListInfoContext> enums;
2394 SharedPtr<MemberListInfoContext> functions;
2395 SharedPtr<MemberListInfoContext> variables;
2396 SharedPtr<MemberGroupListContext> memberGroups;
2397 SharedPtr<MemberListInfoContext> detailedTypedefs;
2398 SharedPtr<MemberListInfoContext> detailedEnums;
2399 SharedPtr<MemberListInfoContext> detailedFunctions;
2400 SharedPtr<MemberListInfoContext> detailedVariables;
2401 SharedPtr<TemplateList> inlineClasses;
2403 mutable Cachable m_cache;
2407 NamespaceContext::NamespaceContext(NamespaceDef *nd) : RefCountedContext("NamespaceContext")
2409 p = new Private(nd);
2412 NamespaceContext::~NamespaceContext()
2417 TemplateVariant NamespaceContext::get(const char *n) const
2422 //------------------------------------------------------------------------
2424 //%% struct File(Symbol): file information
2426 class FileContext::Private : public DefinitionContext<FileContext::Private>
2429 Private(FileDef *fd) : DefinitionContext<FileContext::Private>(fd) , m_fileDef(fd)
2432 addProperty("title", this,&Private::title);
2433 addProperty("highlight", this,&Private::highlight);
2434 addProperty("subhighlight", this,&Private::subHighlight);
2435 addProperty("versionInfo", this,&Private::versionInfo);
2436 addProperty("includeList", this,&Private::includeList);
2437 addProperty("hasIncludeGraph", this,&Private::hasIncludeGraph);
2438 addProperty("hasIncludedByGraph", this,&Private::hasIncludedByGraph);
2439 addProperty("includeGraph", this,&Private::includeGraph);
2440 addProperty("includedByGraph", this,&Private::includedByGraph);
2441 addProperty("hasDetails", this,&Private::hasDetails);
2442 addProperty("hasSourceFile", this,&Private::hasSourceFile);
2443 addProperty("sources", this,&Private::sources);
2444 addProperty("version", this,&Private::version);
2445 addProperty("classes", this,&Private::classes);
2446 addProperty("namespaces", this,&Private::namespaces);
2447 addProperty("constantgroups", this,&Private::constantgroups);
2448 addProperty("macros", this,&Private::macros);
2449 addProperty("typedefs", this,&Private::typedefs);
2450 addProperty("enums", this,&Private::enums);
2451 addProperty("functions", this,&Private::functions);
2452 addProperty("variables", this,&Private::variables);
2453 addProperty("memberGroups", this,&Private::memberGroups);
2454 addProperty("detailedMacros", this,&Private::detailedMacros);
2455 addProperty("detailedTypedefs", this,&Private::detailedTypedefs);
2456 addProperty("detailedEnums", this,&Private::detailedEnums);
2457 addProperty("detailedFunctions", this,&Private::detailedFunctions);
2458 addProperty("detailedVariables", this,&Private::detailedVariables);
2459 addProperty("inlineClasses", this,&Private::inlineClasses);
2460 addProperty("compoundType", this,&Private::compoundType);
2462 virtual ~Private() {}
2463 TemplateVariant title() const
2465 return m_fileDef->title();
2467 TemplateVariant highlight() const
2469 return TemplateVariant("files");
2471 TemplateVariant subHighlight() const
2473 return TemplateVariant("");
2475 TemplateVariant versionInfo() const
2477 return m_fileDef->getVersion();
2479 TemplateVariant includeList() const
2481 if (!m_cache.includeInfoList && m_fileDef->includeFileList())
2483 m_cache.includeInfoList.reset(IncludeInfoListContext::alloc(
2484 *m_fileDef->includeFileList(),m_fileDef->getLanguage()));
2486 if (m_cache.includeInfoList)
2488 return m_cache.includeInfoList.get();
2492 return TemplateVariant(FALSE);
2495 DotInclDepGraph *getIncludeGraph() const
2497 if (!m_cache.includeGraph)
2499 m_cache.includeGraph.reset(new DotInclDepGraph(m_fileDef,FALSE));
2501 return m_cache.includeGraph.get();
2503 TemplateVariant hasIncludeGraph() const
2505 static bool haveDot = Config_getBool("HAVE_DOT");
2506 DotInclDepGraph *incGraph = getIncludeGraph();
2507 return (haveDot && !incGraph->isTooBig() && !incGraph->isTrivial());
2509 TemplateVariant includeGraph() const
2511 static bool haveDot = Config_getBool("HAVE_DOT");
2515 DotInclDepGraph *cg = getIncludeGraph();
2516 FTextStream t(&result);
2517 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
2518 g_globals.outputDir,
2519 g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
2520 relPathAsString(),TRUE,g_globals.dynSectionId
2523 g_globals.dynSectionId++;
2524 return TemplateVariant(result.data(),TRUE);
2526 DotInclDepGraph *getIncludedByGraph() const
2528 if (!m_cache.includedByGraph)
2530 m_cache.includedByGraph.reset(new DotInclDepGraph(m_fileDef,TRUE));
2532 return m_cache.includedByGraph.get();
2534 TemplateVariant hasIncludedByGraph() const
2536 static bool haveDot = Config_getBool("HAVE_DOT");
2537 DotInclDepGraph *incGraph = getIncludedByGraph();
2538 return (haveDot && !incGraph->isTooBig() && !incGraph->isTrivial());
2540 TemplateVariant includedByGraph() const
2542 static bool haveDot = Config_getBool("HAVE_DOT");
2546 DotInclDepGraph *cg = getIncludedByGraph();
2547 FTextStream t(&result);
2548 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
2549 g_globals.outputDir,
2550 g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension,
2551 relPathAsString(),TRUE,g_globals.dynSectionId
2554 g_globals.dynSectionId++;
2555 return TemplateVariant(result.data(),TRUE);
2557 TemplateVariant hasDetails() const
2559 return m_fileDef->hasDetailedDescription();
2561 TemplateVariant hasSourceFile() const
2563 return m_fileDef->generateSourceFile();
2565 TemplateVariant sources() const
2567 if (!m_cache.sources)
2569 if (m_fileDef->generateSourceFile())
2571 m_cache.sources.reset(new TemplateVariant(parseCode(m_fileDef,relPathAsString())));
2575 m_cache.sources.reset(new TemplateVariant(""));
2578 return *m_cache.sources;
2580 TemplateVariant version() const
2582 return m_fileDef->fileVersion();
2584 TemplateVariant classes() const
2586 if (!m_cache.classes)
2588 TemplateList *classList = TemplateList::alloc();
2589 if (m_fileDef->getClassSDict())
2591 ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
2593 for (sdi.toFirst();(cd=sdi.current());++sdi)
2595 if (cd->visibleInParentsDeclList())
2597 classList->append(ClassContext::alloc(cd));
2601 m_cache.classes.reset(classList);
2603 return m_cache.classes.get();
2605 TemplateVariant namespaces() const
2607 if (!m_cache.namespaces)
2609 TemplateList *namespaceList = TemplateList::alloc();
2610 if (m_fileDef->getNamespaceSDict())
2612 NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict());
2614 for (sdi.toFirst();(nd=sdi.current());++sdi)
2616 if (nd->isLinkable() && !nd->isConstantGroup())
2618 namespaceList->append(NamespaceContext::alloc(nd));
2622 m_cache.namespaces.reset(namespaceList);
2624 return m_cache.namespaces.get();
2626 TemplateVariant constantgroups() const
2628 if (!m_cache.constantgroups)
2630 TemplateList *namespaceList = TemplateList::alloc();
2631 if (m_fileDef->getNamespaceSDict())
2633 NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict());
2635 for (sdi.toFirst();(nd=sdi.current());++sdi)
2637 if (nd->isLinkable() && nd->isConstantGroup())
2639 namespaceList->append(NamespaceContext::alloc(nd));
2643 m_cache.constantgroups.reset(namespaceList);
2645 return m_cache.constantgroups.get();
2647 TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
2648 MemberListType type,const char *title,bool detailed=FALSE) const
2652 MemberList *ml = m_fileDef->getMemberList(type);
2655 list.reset(MemberListInfoContext::alloc(m_fileDef,relPathAsString(),ml,title,detailed));
2664 return TemplateVariant(FALSE);
2667 TemplateVariant macros() const
2669 return getMemberList(m_cache.macros,MemberListType_decDefineMembers,theTranslator->trDefines());
2671 TemplateVariant typedefs() const
2673 return getMemberList(m_cache.typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
2675 TemplateVariant enums() const
2677 return getMemberList(m_cache.enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
2679 TemplateVariant functions() const
2681 QCString title = theTranslator->trFunctions();
2682 SrcLangExt lang = m_fileDef->getLanguage();
2683 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
2684 else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc();
2685 return getMemberList(m_cache.functions,MemberListType_decFuncMembers,title);
2687 TemplateVariant variables() const
2689 return getMemberList(m_cache.variables,MemberListType_decVarMembers,theTranslator->trVariables());
2691 TemplateVariant memberGroups() const
2693 if (!m_cache.memberGroups)
2695 if (m_fileDef->getMemberGroupSDict())
2697 m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_fileDef,relPathAsString(),m_fileDef->getMemberGroupSDict(),m_fileDef->subGrouping()));
2701 m_cache.memberGroups.reset(MemberGroupListContext::alloc());
2704 return m_cache.memberGroups.get();
2706 TemplateVariant detailedMacros() const
2708 return getMemberList(m_cache.detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation());
2710 TemplateVariant detailedTypedefs() const
2712 return getMemberList(m_cache.detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
2714 TemplateVariant detailedEnums() const
2716 return getMemberList(m_cache.detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
2718 TemplateVariant detailedFunctions() const
2720 QCString title = theTranslator->trFunctionDocumentation();
2721 SrcLangExt lang = m_fileDef->getLanguage();
2722 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation();
2723 return getMemberList(m_cache.detailedFunctions,MemberListType_docFuncMembers,title);
2725 TemplateVariant detailedVariables() const
2727 return getMemberList(m_cache.detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
2729 TemplateVariant inlineClasses() const
2731 if (!m_cache.inlineClasses)
2733 TemplateList *classList = TemplateList::alloc();
2734 if (m_fileDef->getClassSDict())
2736 ClassSDict::Iterator sdi(*m_fileDef->getClassSDict());
2738 for (sdi.toFirst();(cd=sdi.current());++sdi)
2740 if (cd->name().find('@')==-1 &&
2741 cd->isLinkableInProject() &&
2742 cd->isEmbeddedInOuterScope() &&
2743 cd->partOfGroups()==0)
2745 classList->append(ClassContext::alloc(cd));
2749 m_cache.inlineClasses.reset(classList);
2751 return m_cache.inlineClasses.get();
2753 TemplateVariant compoundType() const
2755 return theTranslator->trFile(FALSE,TRUE);
2762 SharedPtr<IncludeInfoListContext> includeInfoList;
2763 ScopedPtr<DotInclDepGraph> includeGraph;
2764 ScopedPtr<DotInclDepGraph> includedByGraph;
2765 ScopedPtr<TemplateVariant> sources;
2766 SharedPtr<TemplateList> classes;
2767 SharedPtr<TemplateList> namespaces;
2768 SharedPtr<TemplateList> constantgroups;
2769 SharedPtr<MemberListInfoContext> macros;
2770 SharedPtr<MemberListInfoContext> typedefs;
2771 SharedPtr<MemberListInfoContext> enums;
2772 SharedPtr<MemberListInfoContext> functions;
2773 SharedPtr<MemberListInfoContext> variables;
2774 SharedPtr<MemberGroupListContext> memberGroups;
2775 SharedPtr<MemberListInfoContext> detailedMacros;
2776 SharedPtr<MemberListInfoContext> detailedTypedefs;
2777 SharedPtr<MemberListInfoContext> detailedEnums;
2778 SharedPtr<MemberListInfoContext> detailedFunctions;
2779 SharedPtr<MemberListInfoContext> detailedVariables;
2780 SharedPtr<TemplateList> inlineClasses;
2782 mutable Cachable m_cache;
2786 FileContext::FileContext(FileDef *fd) : RefCountedContext("FileContext")
2788 p = new Private(fd);
2791 FileContext::~FileContext()
2796 TemplateVariant FileContext::get(const char *n) const
2801 //------------------------------------------------------------------------
2803 //%% struct Dir(Symbol): directory information
2805 class DirContext::Private : public DefinitionContext<DirContext::Private>
2808 Private(DirDef *dd) : DefinitionContext<DirContext::Private>(dd) , m_dirDef(dd)
2810 addProperty("title", this,&Private::title);
2811 addProperty("highlight", this,&Private::highlight);
2812 addProperty("subhighlight", this,&Private::subHighlight);
2813 addProperty("dirName", this,&Private::dirName);
2814 addProperty("dirs", this,&Private::dirs);
2815 addProperty("files", this,&Private::files);
2816 addProperty("hasDetails", this,&Private::hasDetails);
2817 addProperty("compoundType", this,&Private::compoundType);
2819 virtual ~Private() {}
2820 TemplateVariant title() const
2822 return TemplateVariant(m_dirDef->shortTitle());
2824 TemplateVariant highlight() const
2826 return TemplateVariant("files");
2828 TemplateVariant subHighlight() const
2830 return TemplateVariant("");
2832 TemplateVariant dirName() const
2834 return TemplateVariant(m_dirDef->shortName());
2836 TemplateVariant dirs() const
2840 m_cache.dirs.reset(TemplateList::alloc());
2841 const DirList &subDirs = m_dirDef->subDirs();
2842 QListIterator<DirDef> it(subDirs);
2844 for (it.toFirst();(dd=it.current());++it)
2846 DirContext *dc = new DirContext(dd);
2847 m_cache.dirs->append(dc);
2850 return m_cache.dirs.get();
2852 TemplateVariant files() const
2854 // FileList *list = m_dirDef->getFiles();
2857 m_cache.files.reset(TemplateList::alloc());
2858 FileList *files = m_dirDef->getFiles();
2861 QListIterator<FileDef> it(*files);
2863 for (it.toFirst();(fd=it.current());++it)
2865 FileContext *fc = FileContext::alloc(fd);
2866 m_cache.files->append(fc);
2870 return m_cache.files.get();
2872 TemplateVariant hasDetails() const
2874 return m_dirDef->hasDetailedDescription();
2876 TemplateVariant compoundType() const
2878 return theTranslator->trDir(FALSE,TRUE);
2880 TemplateVariant relPath() const
2890 SharedPtr<TemplateList> dirs;
2891 SharedPtr<TemplateList> files;
2893 mutable Cachable m_cache;
2897 DirContext::DirContext(DirDef *fd) : RefCountedContext("DirContext")
2899 p = new Private(fd);
2902 DirContext::~DirContext()
2907 TemplateVariant DirContext::get(const char *n) const
2912 //------------------------------------------------------------------------
2914 //%% struct Page(Symbol): page information
2916 class PageContext::Private : public DefinitionContext<PageContext::Private>
2919 Private(PageDef *pd,bool isMainPage)
2920 : DefinitionContext<PageContext::Private>(pd) , m_pageDef(pd), m_isMainPage(isMainPage)
2922 addProperty("title",this,&Private::title);
2923 addProperty("highlight",this,&Private::highlight);
2924 addProperty("subhighlight",this,&Private::subHighlight);
2926 virtual ~Private() {}
2927 TemplateVariant title() const
2931 if (mainPageHasTitle())
2933 return m_pageDef->title();
2937 return theTranslator->trMainPage();
2942 return m_pageDef->title();
2945 TemplateVariant relPath() const
2947 if (m_pageDef==Doxygen::mainPage)
2953 return DefinitionContext<PageContext::Private>::relPath();
2956 TemplateVariant highlight() const
2958 if (m_pageDef==Doxygen::mainPage)
2967 TemplateVariant subHighlight() const
2977 PageContext::PageContext(PageDef *pd,bool isMainPage) : RefCountedContext("PageContext")
2979 p = new Private(pd,isMainPage);
2982 PageContext::~PageContext()
2987 TemplateVariant PageContext::get(const char *n) const
2992 //------------------------------------------------------------------------
2994 class TextGeneratorHtml : public TextGeneratorIntf
2997 TextGeneratorHtml(FTextStream &ts,const QCString &relPath)
2998 : m_ts(ts), m_relPath(relPath) {}
2999 void writeString(const char *s,bool keepSpaces) const
3002 //printf("TextGeneratorOlImpl::writeString('%s',%d)\n",s,keepSpaces);
3011 case '<': m_ts << "<"; break;
3012 case '>': m_ts << ">"; break;
3013 case '\'': m_ts << "'"; break;
3014 case '"': m_ts << """; break;
3015 case '&': m_ts << "&"; break;
3016 case ' ': m_ts << " "; break;
3022 m_ts << convertToHtml(s);
3026 void writeBreak(int indent) const
3029 for (int i=0;i<indent;i++)
3035 void writeLink(const char *ref,const char *f,
3036 const char *anchor,const char *name
3041 m_ts << "<a class=\"elRef\" ";
3042 m_ts << externalLinkTarget() << externalRef(m_relPath,ref,FALSE);
3046 m_ts << "<a class=\"el\" ";
3049 m_ts << externalRef(m_relPath,ref,TRUE);
3050 if (f) m_ts << f << Doxygen::htmlFileExtension;
3051 if (anchor) m_ts << "#" << anchor;
3053 m_ts << convertToHtml(name);
3062 class TextGeneratorFactory
3065 static TextGeneratorFactory *instance()
3067 static TextGeneratorFactory *instance = 0;
3068 if (instance==0) instance = new TextGeneratorFactory;
3071 TextGeneratorIntf *create(FTextStream &ts,const QCString &relPath)
3073 switch (g_globals.outputFormat)
3075 case ContextGlobals::Html:
3076 return new TextGeneratorHtml(ts,relPath);
3084 TextGeneratorFactory() {}
3085 virtual ~TextGeneratorFactory() {}
3088 TemplateVariant createLinkedText(Definition *def,const QCString &relPath,const QCString &text)
3092 TextGeneratorIntf *tg = TextGeneratorFactory::instance()->create(ts,relPath);
3095 linkifyText(*tg,def->getOuterScope(),def->getBodyDef(),def,text);
3096 return TemplateVariant(s.data(),TRUE);
3104 //%% struct Member(Symbol): member information
3106 class MemberContext::Private : public DefinitionContext<MemberContext::Private>
3109 Private(MemberDef *md) : DefinitionContext<MemberContext::Private>(md) , m_memberDef(md)
3111 addProperty("isSignal", this,&Private::isSignal);
3112 addProperty("isSlot", this,&Private::isSlot);
3113 addProperty("isVariable", this,&Private::isVariable);
3114 addProperty("isEnumeration", this,&Private::isEnumeration);
3115 addProperty("isEnumValue", this,&Private::isEnumValue);
3116 addProperty("isTypedef", this,&Private::isTypedef);
3117 addProperty("isFunction", this,&Private::isFunction);
3118 addProperty("isFunctionPtr", this,&Private::isFunctionPtr);
3119 addProperty("isDefine", this,&Private::isDefine);
3120 addProperty("isFriend", this,&Private::isFriend);
3121 addProperty("isProperty", this,&Private::isProperty);
3122 addProperty("isEvent", this,&Private::isEvent);
3123 addProperty("isRelated", this,&Private::isRelated);
3124 addProperty("isForeign", this,&Private::isForeign);
3125 addProperty("isStatic", this,&Private::isStatic);
3126 addProperty("isInline", this,&Private::isInline);
3127 addProperty("isExplicit", this,&Private::isExplicit);
3128 addProperty("isMutable", this,&Private::isMutable);
3129 addProperty("isGettable", this,&Private::isGettable);
3130 addProperty("isPrivateGettable", this,&Private::isPrivateGettable);
3131 addProperty("isProtectedGettable", this,&Private::isProtectedGettable);
3132 addProperty("isSettable", this,&Private::isSettable);
3133 addProperty("isPrivateSettable", this,&Private::isPrivateSettable);
3134 addProperty("isProtectedSettable", this,&Private::isProtectedSettable);
3135 addProperty("isReadable", this,&Private::isReadable);
3136 addProperty("isWritable", this,&Private::isWritable);
3137 addProperty("isAddable", this,&Private::isAddable);
3138 addProperty("isRemovable", this,&Private::isRemovable);
3139 addProperty("isRaisable", this,&Private::isRaisable);
3140 addProperty("isFinal", this,&Private::isFinal);
3141 addProperty("isAbstract", this,&Private::isAbstract);
3142 addProperty("isOverride", this,&Private::isOverride);
3143 addProperty("isInitonly", this,&Private::isInitonly);
3144 addProperty("isOptional", this,&Private::isOptional);
3145 addProperty("isRequired", this,&Private::isRequired);
3146 addProperty("isNonAtomic", this,&Private::isNonAtomic);
3147 addProperty("isCopy", this,&Private::isCopy);
3148 addProperty("isAssign", this,&Private::isAssign);
3149 addProperty("isRetain", this,&Private::isRetain);
3150 addProperty("isWeak", this,&Private::isWeak);
3151 addProperty("isStrong", this,&Private::isStrong);
3152 addProperty("isUnretained", this,&Private::isUnretained);
3153 addProperty("isNew", this,&Private::isNew);
3154 addProperty("isSealed", this,&Private::isSealed);
3155 addProperty("isImplementation", this,&Private::isImplementation);
3156 addProperty("isExternal", this,&Private::isExternal);
3157 addProperty("isAlias", this,&Private::isAlias);
3158 addProperty("isDefault", this,&Private::isDefault);
3159 addProperty("isDelete", this,&Private::isDelete);
3160 addProperty("isNoExcept", this,&Private::isNoExcept);
3161 addProperty("isAttribute", this,&Private::isAttribute);
3162 addProperty("isUNOProperty", this,&Private::isUNOProperty);
3163 addProperty("isReadonly", this,&Private::isReadonly);
3164 addProperty("isBound", this,&Private::isBound);
3165 addProperty("isConstrained", this,&Private::isConstrained);
3166 addProperty("isTransient", this,&Private::isTransient);
3167 addProperty("isMaybeVoid", this,&Private::isMaybeVoid);
3168 addProperty("isMaybeDefault", this,&Private::isMaybeDefault);
3169 addProperty("isMaybeAmbiguous", this,&Private::isMaybeAmbiguous);
3170 addProperty("isPublished", this,&Private::isPublished);
3171 addProperty("isTemplateSpecialization",this,&Private::isTemplateSpecialization);
3172 addProperty("isObjCMethod", this,&Private::isObjCMethod);
3173 addProperty("isObjCProperty", this,&Private::isObjCProperty);
3174 addProperty("isAnonymous", this,&Private::isAnonymous);
3175 addProperty("declType", this,&Private::declType);
3176 addProperty("declArgs", this,&Private::declArgs);
3177 addProperty("anonymousType", this,&Private::anonymousType);
3178 addProperty("anonymousMember", this,&Private::anonymousMember);
3179 addProperty("hasDetails", this,&Private::hasDetails);
3180 addProperty("exception", this,&Private::exception);
3181 addProperty("bitfields", this,&Private::bitfields);
3182 addProperty("initializer", this,&Private::initializer);
3183 addProperty("initializerAsCode", this,&Private::initializerAsCode);
3184 addProperty("hasOneLineInitializer", this,&Private::hasOneLineInitializer);
3185 addProperty("hasMultiLineInitializer", this,&Private::hasMultiLineInitializer);
3186 addProperty("templateArgs", this,&Private::templateArgs);
3187 addProperty("templateAlias", this,&Private::templateAlias);
3188 addProperty("propertyAttrs", this,&Private::propertyAttrs);
3189 addProperty("eventAttrs", this,&Private::eventAttrs);
3190 addProperty("class", this,&Private::getClass);
3191 addProperty("file", this,&Private::getFile);
3192 addProperty("namespace", this,&Private::getNamespace);
3193 addProperty("definition", this,&Private::definition);
3194 addProperty("parameters", this,&Private::parameters);
3195 addProperty("hasParameterList", this,&Private::hasParameterList);
3196 addProperty("hasConstQualifier", this,&Private::hasConstQualifier);
3197 addProperty("hasVolatileQualifier",this,&Private::hasVolatileQualifier);
3198 addProperty("trailingReturnType", this,&Private::trailingReturnType);
3199 addProperty("extraTypeChars", this,&Private::extraTypeChars);
3200 addProperty("templateDecls", this,&Private::templateDecls);
3201 addProperty("labels", this,&Private::labels);
3202 addProperty("enumBaseType", this,&Private::enumBaseType);
3203 addProperty("enumValues", this,&Private::enumValues);
3204 addProperty("paramDocs", this,&Private::paramDocs);
3205 addProperty("reimplements", this,&Private::reimplements);
3206 addProperty("implements", this,&Private::implements);
3207 addProperty("reimplementedBy", this,&Private::reimplementedBy);
3208 addProperty("implementedBy", this,&Private::implementedBy);
3209 addProperty("examples", this,&Private::examples);
3210 addProperty("typeConstraints", this,&Private::typeConstraints);
3211 addProperty("functionQualifier", this,&Private::functionQualifier);
3212 addProperty("sourceRefs", this,&Private::sourceRefs);
3213 addProperty("sourceRefBys", this,&Private::sourceRefBys);
3214 addProperty("hasSources", this,&Private::hasSources);
3215 addProperty("sourceCode", this,&Private::sourceCode);
3216 addProperty("hasCallGraph", this,&Private::hasCallGraph);
3217 addProperty("callGraph", this,&Private::callGraph);
3218 addProperty("hasCallerGraph", this,&Private::hasCallerGraph);
3219 addProperty("callerGraph", this,&Private::callerGraph);
3220 addProperty("fieldType", this,&Private::fieldType);
3222 m_cache.propertyAttrs.reset(TemplateList::alloc());
3223 if (md && md->isProperty())
3225 if (md->isGettable()) m_cache.propertyAttrs->append("get");
3226 if (md->isPrivateGettable()) m_cache.propertyAttrs->append("private get");
3227 if (md->isProtectedGettable()) m_cache.propertyAttrs->append("protected get");
3228 if (md->isSettable()) m_cache.propertyAttrs->append("set");
3229 if (md->isPrivateSettable()) m_cache.propertyAttrs->append("private set");
3230 if (md->isProtectedSettable()) m_cache.propertyAttrs->append("protected set");
3232 m_cache.eventAttrs.reset(TemplateList::alloc());
3233 if (md && md->isEvent())
3235 if (md->isAddable()) m_cache.eventAttrs->append("add");
3236 if (md->isRemovable()) m_cache.eventAttrs->append("remove");
3237 if (md->isRaisable()) m_cache.eventAttrs->append("raise");
3240 virtual ~Private() {}
3241 TemplateVariant fieldType() const
3243 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->fieldType());
3245 TemplateVariant declType() const
3247 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->getDeclType());
3249 TemplateVariant declArgs() const
3251 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->argsString());
3253 TemplateVariant exception() const
3255 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->excpString());
3257 TemplateVariant bitfields() const
3259 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->bitfieldString());
3261 TemplateVariant isStatic() const
3263 return m_memberDef->isStatic();
3265 TemplateVariant isObjCMethod() const
3267 return m_memberDef->isObjCMethod();
3269 TemplateVariant isObjCProperty() const
3271 return m_memberDef->isObjCProperty();
3273 TemplateVariant isImplementation() const
3275 return m_memberDef->isImplementation();
3277 TemplateVariant isSignal() const
3279 return m_memberDef->isSignal();
3281 TemplateVariant isSlot() const
3283 return m_memberDef->isSlot();
3285 TemplateVariant isTypedef() const
3287 return m_memberDef->isTypedef();
3289 TemplateVariant isFunction() const
3291 return m_memberDef->isFunction();
3293 TemplateVariant isFunctionPtr() const
3295 return m_memberDef->isFunctionPtr();
3297 TemplateVariant isFriend() const
3299 return m_memberDef->isFriend();
3301 TemplateVariant isForeign() const
3303 return m_memberDef->isForeign();
3305 TemplateVariant isEvent() const
3307 return m_memberDef->isEvent();
3309 TemplateVariant isInline() const
3311 return m_memberDef->isInline();
3313 TemplateVariant isExplicit() const
3315 return m_memberDef->isExplicit();
3317 TemplateVariant isMutable() const
3319 return m_memberDef->isMutable();
3321 TemplateVariant isGettable() const
3323 return m_memberDef->isGettable();
3325 TemplateVariant isPrivateGettable() const
3327 return m_memberDef->isPrivateGettable();
3329 TemplateVariant isProtectedGettable() const
3331 return m_memberDef->isProtectedGettable();
3333 TemplateVariant isSettable() const
3335 return m_memberDef->isSettable();
3337 TemplateVariant isPrivateSettable() const
3339 return m_memberDef->isPrivateSettable();
3341 TemplateVariant isProtectedSettable() const
3343 return m_memberDef->isProtectedSettable();
3345 TemplateVariant isReadable() const
3347 return m_memberDef->isReadable();
3349 TemplateVariant isWritable() const
3351 return m_memberDef->isWritable();
3353 TemplateVariant isAddable() const
3355 return m_memberDef->isAddable();
3357 TemplateVariant isRemovable() const
3359 return m_memberDef->isRemovable();
3361 TemplateVariant isRaisable() const
3363 return m_memberDef->isRaisable();
3365 TemplateVariant isFinal() const
3367 return m_memberDef->isFinal();
3369 TemplateVariant isAbstract() const
3371 return m_memberDef->isAbstract();
3373 TemplateVariant isOverride() const
3375 return m_memberDef->isOverride();
3377 TemplateVariant isInitonly() const
3379 return m_memberDef->isInitonly();
3381 TemplateVariant isOptional() const
3383 return m_memberDef->isOptional();
3385 TemplateVariant isRequired() const
3387 return m_memberDef->isRequired();
3389 TemplateVariant isNonAtomic() const
3391 return m_memberDef->isNonAtomic();
3393 TemplateVariant isCopy() const
3395 return m_memberDef->isCopy();
3397 TemplateVariant isAssign() const
3399 return m_memberDef->isAssign();
3401 TemplateVariant isRetain() const
3403 return m_memberDef->isRetain();
3405 TemplateVariant isWeak() const
3407 return m_memberDef->isWeak();
3409 TemplateVariant isStrong() const
3411 return m_memberDef->isStrong();
3413 TemplateVariant isUnretained() const
3415 return m_memberDef->isUnretained();
3417 TemplateVariant isNew() const
3419 return m_memberDef->isNew();
3421 TemplateVariant isSealed() const
3423 return m_memberDef->isSealed();
3425 TemplateVariant isExternal() const
3427 return m_memberDef->isExternal();
3429 TemplateVariant isAlias() const
3431 return m_memberDef->isAlias();
3433 TemplateVariant isDefault() const
3435 return m_memberDef->isDefault();
3437 TemplateVariant isDelete() const
3439 return m_memberDef->isDelete();
3441 TemplateVariant isNoExcept() const
3443 return m_memberDef->isNoExcept();
3445 TemplateVariant isAttribute() const
3447 return m_memberDef->isAttribute();
3449 TemplateVariant isUNOProperty() const
3451 return m_memberDef->isUNOProperty();
3453 TemplateVariant isReadonly() const
3455 return m_memberDef->isReadonly();
3457 TemplateVariant isBound() const
3459 return m_memberDef->isBound();
3461 TemplateVariant isConstrained() const
3463 return m_memberDef->isConstrained();
3465 TemplateVariant isTransient() const
3467 return m_memberDef->isTransient();
3469 TemplateVariant isMaybeVoid() const
3471 return m_memberDef->isMaybeVoid();
3473 TemplateVariant isMaybeDefault() const
3475 return m_memberDef->isMaybeDefault();
3477 TemplateVariant isMaybeAmbiguous() const
3479 return m_memberDef->isMaybeAmbiguous();
3481 TemplateVariant isPublished() const
3483 return m_memberDef->isPublished();
3485 TemplateVariant isTemplateSpecialization() const
3487 return m_memberDef->isTemplateSpecialization();
3489 TemplateVariant isProperty() const
3491 return m_memberDef->isProperty();
3493 TemplateVariant isEnumValue() const
3495 return m_memberDef->isEnumValue();
3497 TemplateVariant isVariable() const
3499 return m_memberDef->isVariable();
3501 TemplateVariant isEnumeration() const
3503 return m_memberDef->isEnumerate();
3505 TemplateVariant hasDetails() const
3507 return m_memberDef->isDetailedSectionLinkable();
3509 TemplateVariant initializer() const
3511 return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->initializer());
3513 TemplateVariant initializerAsCode() const
3515 if (!m_cache.initializerParsed)
3518 if (m_memberDef->getClassDef())
3520 scopeName = m_memberDef->getClassDef()->name();
3522 else if (m_memberDef->getNamespaceDef())
3524 scopeName = m_memberDef->getNamespaceDef()->name();
3526 m_cache.initializer = parseCode(m_memberDef,scopeName,relPathAsString(),
3527 m_memberDef->initializer());
3528 m_cache.initializerParsed = TRUE;
3530 return m_cache.initializer;
3532 TemplateVariant isDefine() const
3534 return m_memberDef->isDefine();
3536 TemplateVariant isAnonymous() const
3538 QCString name = m_memberDef->name();
3539 return !name.isEmpty() && name.at(0)=='@';
3541 TemplateVariant anonymousType() const
3543 if (!m_cache.anonymousType)
3545 ClassDef *cd = m_memberDef->getClassDefOfAnonymousType();
3548 m_cache.anonymousType.reset(ClassContext::alloc(cd));
3551 if (m_cache.anonymousType)
3553 return m_cache.anonymousType.get();
3560 TemplateVariant anonymousMember() const
3562 if (!m_cache.anonymousMember)
3564 MemberDef *md = m_memberDef->fromAnonymousMember();
3567 m_cache.anonymousMember.reset(MemberContext::alloc(md));
3570 if (m_cache.anonymousMember)
3572 return m_cache.anonymousMember.get();
3579 TemplateVariant isRelated() const
3581 return m_memberDef->isRelated();
3583 TemplateVariant enumBaseType() const
3585 return m_memberDef->enumBaseType();
3587 TemplateVariant hasOneLineInitializer() const
3589 return m_memberDef->hasOneLineInitializer();
3591 TemplateVariant hasMultiLineInitializer() const
3593 return m_memberDef->hasMultiLineInitializer();
3595 TemplateVariant enumValues() const
3597 if (!m_cache.enumValues)
3599 MemberList *ml = m_memberDef->enumFieldList();
3602 m_cache.enumValues.reset(MemberListContext::alloc(ml));
3606 m_cache.enumValues.reset(MemberListContext::alloc());
3609 return m_cache.enumValues.get();
3611 TemplateVariant templateArgs() const
3613 if (!m_cache.templateArgs && m_memberDef->templateArguments())
3615 m_cache.templateArgs.reset(ArgumentListContext::alloc(m_memberDef->templateArguments(),m_memberDef,relPathAsString()));
3617 if (m_cache.templateArgs)
3619 return m_cache.templateArgs.get();
3623 return TemplateVariant(FALSE);
3626 TemplateVariant templateAlias() const
3628 if (m_memberDef->isAlias())
3630 return createLinkedText(m_memberDef,relPathAsString(),
3631 QCString(" = ")+m_memberDef->typeString());
3635 TemplateVariant propertyAttrs() const
3637 return m_cache.propertyAttrs.get();
3639 TemplateVariant eventAttrs() const
3641 return m_cache.eventAttrs.get();
3643 TemplateVariant getClass() const
3645 if (!m_cache.classDef && m_memberDef->getClassDef())
3647 m_cache.classDef.reset(ClassContext::alloc(m_memberDef->getClassDef()));
3649 if (m_cache.classDef)
3651 return m_cache.classDef.get();
3655 return TemplateVariant(FALSE);
3658 TemplateVariant getFile() const
3660 if (!m_cache.fileDef && m_memberDef->getFileDef())
3662 m_cache.fileDef.reset(FileContext::alloc(m_memberDef->getFileDef()));
3664 if (m_cache.fileDef)
3666 return m_cache.fileDef.get();
3670 return TemplateVariant(FALSE);
3673 TemplateVariant getNamespace() const
3675 if (!m_cache.namespaceDef && m_memberDef->getNamespaceDef())
3677 m_cache.namespaceDef.reset(NamespaceContext::alloc(m_memberDef->getNamespaceDef()));
3679 if (m_cache.namespaceDef)
3681 return m_cache.namespaceDef.get();
3685 return TemplateVariant(FALSE);
3688 TemplateVariant definition() const
3690 return createLinkedText(m_memberDef,relPathAsString(),
3691 m_memberDef->displayDefinition());
3693 ArgumentList *getDefArgList() const
3695 return (m_memberDef->isDocsForDefinition()) ?
3696 m_memberDef->argumentList() : m_memberDef->declArgumentList();
3698 TemplateVariant parameters() const
3700 if (!m_cache.arguments)
3702 ArgumentList *defArgList = getDefArgList();
3703 if (defArgList && !m_memberDef->isProperty())
3705 m_cache.arguments.reset(ArgumentListContext::alloc(defArgList,m_memberDef,relPathAsString()));
3709 m_cache.arguments.reset(ArgumentListContext::alloc());
3712 return m_cache.arguments.get();
3714 TemplateVariant hasParameterList() const
3716 return getDefArgList()!=0;
3718 TemplateVariant hasConstQualifier() const
3720 ArgumentList *al = getDefArgList();
3721 return al ? al->constSpecifier : FALSE;
3723 TemplateVariant hasVolatileQualifier() const
3725 ArgumentList *al = getDefArgList();
3726 return al ? al->volatileSpecifier : FALSE;
3728 TemplateVariant trailingReturnType() const
3730 ArgumentList *al = getDefArgList();
3731 if (al && !al->trailingReturnType.isEmpty())
3733 return createLinkedText(m_memberDef,relPathAsString(),
3734 al->trailingReturnType);
3741 TemplateVariant extraTypeChars() const
3743 return m_memberDef->extraTypeChars();
3745 void addTemplateDecls(TemplateList *tl) const
3747 ClassDef *cd=m_memberDef->getClassDef();
3748 if (m_memberDef->definitionTemplateParameterLists())
3750 QListIterator<ArgumentList> ali(*m_memberDef->definitionTemplateParameterLists());
3752 for (ali.toFirst();(tal=ali.current());++ali)
3756 ArgumentListContext *al = ArgumentListContext::alloc(tal,m_memberDef,relPathAsString());
3763 if (cd && !m_memberDef->isRelated() && !m_memberDef->isTemplateSpecialization())
3765 QList<ArgumentList> tempParamLists;
3766 cd->getTemplateParameterLists(tempParamLists);
3767 //printf("#tempParamLists=%d\n",tempParamLists.count());
3768 QListIterator<ArgumentList> ali(tempParamLists);
3770 for (ali.toFirst();(tal=ali.current());++ali)
3774 ArgumentListContext *al = ArgumentListContext::alloc(tal,m_memberDef,relPathAsString());
3779 if (m_memberDef->templateArguments()) // function template prefix
3781 ArgumentListContext *al = ArgumentListContext::alloc(
3782 m_memberDef->templateArguments(),m_memberDef,relPathAsString());
3787 TemplateVariant templateDecls() const
3789 if (!m_cache.templateDecls)
3791 TemplateList *tl = TemplateList::alloc();
3792 addTemplateDecls(tl);
3793 m_cache.templateDecls.reset(tl);
3795 return m_cache.templateDecls.get();
3797 TemplateVariant labels() const
3799 if (!m_cache.labels)
3802 m_memberDef->getLabels(sl,m_memberDef->getOuterScope());
3803 TemplateList *tl = TemplateList::alloc();
3806 QStrListIterator it(sl);
3807 for (;it.current();++it)
3812 m_cache.labels.reset(tl);
3814 return m_cache.labels.get();
3816 TemplateVariant paramDocs() const
3818 if (!m_cache.paramDocs)
3820 if (m_memberDef->argumentList() && m_memberDef->argumentList()->hasDocumentation())
3823 ArgumentListIterator ali(*m_memberDef->argumentList());
3825 // convert the parameter documentation into a list of @param commands
3826 for (ali.toFirst();(a=ali.current());++ali)
3828 if (a->hasDocumentation())
3830 QCString direction = extractDirection(a->docs);
3831 paramDocs+="@param"+direction+" "+a->name+" "+a->docs;
3834 m_cache.paramDocs.reset(new TemplateVariant(parseDoc(m_memberDef,
3835 m_memberDef->docFile(),m_memberDef->docLine(),
3836 relPathAsString(),paramDocs,FALSE)));
3840 m_cache.paramDocs.reset(new TemplateVariant(""));
3843 return *m_cache.paramDocs;
3845 TemplateVariant implements() const
3847 if (!m_cache.implements)
3849 MemberDef *md = m_memberDef->reimplements();
3850 m_cache.implements.reset(TemplateList::alloc());
3853 ClassDef *cd = md->getClassDef();
3854 if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
3856 MemberContext *mc = MemberContext::alloc(md);
3857 m_cache.implements->append(mc);
3861 return m_cache.implements.get();
3863 TemplateVariant reimplements() const
3865 if (!m_cache.reimplements)
3867 MemberDef *md = m_memberDef->reimplements();
3868 m_cache.reimplements.reset(TemplateList::alloc());
3871 ClassDef *cd = md->getClassDef();
3872 if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
3874 MemberContext *mc = MemberContext::alloc(md);
3875 m_cache.reimplements->append(mc);
3879 return m_cache.reimplements.get();
3881 TemplateVariant implementedBy() const
3883 if (!m_cache.implementedBy)
3885 MemberList *ml = m_memberDef->reimplementedBy();
3886 m_cache.implementedBy.reset(TemplateList::alloc());
3889 MemberListIterator mli(*ml);
3891 for (mli.toFirst();(md=mli.current());++mli)
3893 ClassDef *cd = md->getClassDef();
3894 if (cd && (md->virtualness()==Pure || cd->compoundType()==ClassDef::Interface))
3896 MemberContext *mc = new MemberContext(md);
3897 m_cache.implementedBy->append(mc);
3902 return m_cache.implementedBy.get();
3904 TemplateVariant reimplementedBy() const
3906 if (!m_cache.reimplementedBy)
3908 m_cache.reimplementedBy.reset(TemplateList::alloc());
3909 MemberList *ml = m_memberDef->reimplementedBy();
3912 MemberListIterator mli(*ml);
3914 for (mli.toFirst();(md=mli.current());++mli)
3916 ClassDef *cd = md->getClassDef();
3917 if (cd && md->virtualness()!=Pure && cd->compoundType()!=ClassDef::Interface)
3919 MemberContext *mc = new MemberContext(md);
3920 m_cache.reimplementedBy->append(mc);
3925 return m_cache.reimplementedBy.get();
3927 void addExamples(TemplateList *list) const
3929 if (m_memberDef->hasExamples())
3931 ExampleSDict::Iterator it(*m_memberDef->getExamples());
3933 for (it.toFirst();(ex=it.current());++it)
3935 TemplateStruct *s = TemplateStruct::alloc();
3936 s->set("text",ex->name);
3937 s->set("isLinkable",TRUE);
3938 s->set("anchor",ex->anchor);
3939 s->set("fileName",ex->file);
3944 TemplateVariant examples() const
3946 if (!m_cache.examples)
3948 TemplateList *exampleList = TemplateList::alloc();
3949 addExamples(exampleList);
3950 m_cache.examples.reset(exampleList);
3952 return m_cache.examples.get();
3954 TemplateVariant typeConstraints() const
3956 if (!m_cache.typeConstraints && m_memberDef->typeConstraints())
3958 m_cache.typeConstraints.reset(ArgumentListContext::alloc(m_memberDef->typeConstraints(),m_memberDef,relPathAsString()));
3962 m_cache.typeConstraints.reset(ArgumentListContext::alloc());
3964 return m_cache.typeConstraints.get();
3966 TemplateVariant functionQualifier() const
3968 if (!m_memberDef->isObjCMethod() &&
3969 (m_memberDef->isFunction() || m_memberDef->isSlot() ||
3970 m_memberDef->isPrototype() || m_memberDef->isSignal()
3981 TemplateVariant sourceRefs() const
3983 if (!m_cache.sourceRefs)
3985 m_cache.sourceRefs.reset(MemberListContext::alloc(m_memberDef->getReferencesMembers(),TRUE));
3987 return m_cache.sourceRefs.get();
3989 TemplateVariant sourceRefBys() const
3991 if (!m_cache.sourceRefBys)
3993 m_cache.sourceRefBys.reset(MemberListContext::alloc(m_memberDef->getReferencedByMembers(),TRUE));
3995 return m_cache.sourceRefBys.get();
3997 TemplateVariant hasSources() const
3999 return TemplateVariant(m_memberDef->hasSources());
4001 TemplateVariant sourceCode() const
4003 if (!m_cache.sourceCodeParsed)
4005 QCString codeFragment;
4006 FileDef *fd = m_memberDef->getBodyDef();
4007 int startLine = m_memberDef->getStartBodyLine();
4008 int endLine = m_memberDef->getEndBodyLine();
4009 if (fd && readCodeFragment(fd->absFilePath(),
4010 startLine,endLine,codeFragment)
4014 if (m_memberDef->getClassDef())
4016 scopeName = m_memberDef->getClassDef()->name();
4018 else if (m_memberDef->getNamespaceDef())
4020 scopeName = m_memberDef->getNamespaceDef()->name();
4022 m_cache.sourceCode = parseCode(m_memberDef,scopeName,relPathAsString(),codeFragment,startLine,endLine,TRUE);
4023 m_cache.sourceCodeParsed = TRUE;
4026 return m_cache.sourceCode;
4028 DotCallGraph *getCallGraph() const
4030 if (!m_cache.callGraph)
4032 m_cache.callGraph.reset(new DotCallGraph(m_memberDef,FALSE));
4034 return m_cache.callGraph.get();
4036 TemplateVariant hasCallGraph() const
4038 static bool haveDot = Config_getBool("HAVE_DOT");
4039 static bool callGraph = Config_getBool("CALL_GRAPH");
4040 if ((callGraph || m_memberDef->hasCallGraph()) && haveDot &&
4041 (m_memberDef->isFunction() || m_memberDef->isSlot() || m_memberDef->isSignal()))
4043 DotCallGraph *cg = getCallGraph();
4044 return !cg->isTooBig() && !cg->isTrivial();
4046 return TemplateVariant(FALSE);
4048 TemplateVariant callGraph() const
4050 if (hasCallGraph().toBool())
4052 DotCallGraph *cg = getCallGraph();
4054 FTextStream t(&result);
4055 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
4056 g_globals.outputDir,
4057 g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
4058 relPathAsString(),TRUE,g_globals.dynSectionId
4060 g_globals.dynSectionId++;
4061 return TemplateVariant(result.data(),TRUE);
4065 return TemplateVariant("");
4068 DotCallGraph *getCallerGraph() const
4070 if (!m_cache.callerGraph)
4072 m_cache.callerGraph.reset(new DotCallGraph(m_memberDef,TRUE));
4074 return m_cache.callerGraph.get();
4076 TemplateVariant hasCallerGraph() const
4078 static bool haveDot = Config_getBool("HAVE_DOT");
4079 static bool callerGraph = Config_getBool("CALLER_GRAPH");
4080 if ((callerGraph || m_memberDef->hasCallerGraph()) && haveDot &&
4081 (m_memberDef->isFunction() || m_memberDef->isSlot() || m_memberDef->isSignal()))
4083 DotCallGraph *cg = getCallerGraph();
4084 return !cg->isTooBig() && !cg->isTrivial();
4086 return TemplateVariant(FALSE);
4088 TemplateVariant callerGraph() const
4090 if (hasCallerGraph().toBool())
4092 DotCallGraph *cg = getCallerGraph();
4094 FTextStream t(&result);
4095 cg->writeGraph(t,GOF_BITMAP,EOF_Html,
4096 g_globals.outputDir,
4097 g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension,
4098 relPathAsString(),TRUE,g_globals.dynSectionId
4100 g_globals.dynSectionId++;
4101 return TemplateVariant(result.data(),TRUE);
4105 return TemplateVariant("");
4109 MemberDef *m_memberDef;
4112 Cachable() : initializerParsed(FALSE), sourceCodeParsed(FALSE)
4115 SharedPtr<ArgumentListContext> templateArgs;
4116 SharedPtr<ArgumentListContext> arguments;
4117 SharedPtr<MemberListContext> enumValues;
4118 SharedPtr<FileContext> fileDef;
4119 SharedPtr<NamespaceContext> namespaceDef;
4120 SharedPtr<ClassContext> classDef;
4121 SharedPtr<ClassContext> anonymousType;
4122 SharedPtr<TemplateList> templateDecls;
4123 ScopedPtr<TemplateVariant> paramDocs;
4124 SharedPtr<TemplateList> implements;
4125 SharedPtr<TemplateList> reimplements;
4126 SharedPtr<TemplateList> implementedBy;
4127 SharedPtr<MemberListContext> sourceRefs;
4128 SharedPtr<MemberListContext> sourceRefBys;
4129 ScopedPtr<DotCallGraph> callGraph;
4130 ScopedPtr<DotCallGraph> callerGraph;
4131 SharedPtr<MemberContext> anonymousMember;
4132 SharedPtr<TemplateList> reimplementedBy;
4133 SharedPtr<TemplateList> labels;
4134 TemplateVariant initializer;
4135 bool initializerParsed;
4136 TemplateVariant sourceCode;
4137 bool sourceCodeParsed;
4138 SharedPtr<TemplateList> examples;
4139 SharedPtr<TemplateList> exampleList;
4140 SharedPtr<ArgumentListContext> typeConstraints;
4141 SharedPtr<TemplateList> propertyAttrs;
4142 SharedPtr<TemplateList> eventAttrs;
4144 mutable Cachable m_cache;
4148 MemberContext::MemberContext(MemberDef *md) : RefCountedContext("MemberContext")
4150 p = new Private(md);
4153 MemberContext::~MemberContext()
4158 TemplateVariant MemberContext::get(const char *n) const
4164 //------------------------------------------------------------------------
4166 //%% struct Module(Symbol): group information
4168 class ModuleContext::Private : public DefinitionContext<ModuleContext::Private>
4171 Private(GroupDef *gd) : DefinitionContext<ModuleContext::Private>(gd) , m_groupDef(gd)
4173 addProperty("title", this,&Private::title);
4174 addProperty("highlight", this,&Private::highlight);
4175 addProperty("subhighlight", this,&Private::subHighlight);
4176 addProperty("hasGroupGraph", this,&Private::hasGroupGraph);
4177 addProperty("groupGraph", this,&Private::groupGraph);
4178 addProperty("hasDetails", this,&Private::hasDetails);
4179 addProperty("modules", this,&Private::modules);
4180 addProperty("dirs", this,&Private::dirs);
4181 addProperty("files", this,&Private::files);
4182 addProperty("namespaces", this,&Private::namespaces);
4183 addProperty("classes", this,&Private::classes);
4184 addProperty("constantgroups", this,&Private::constantgroups);
4185 addProperty("examples", this,&Private::examples);
4186 addProperty("macros", this,&Private::macros);
4187 addProperty("typedefs", this,&Private::typedefs);
4188 addProperty("enums", this,&Private::enums);
4189 addProperty("enumvalues", this,&Private::enumValues);
4190 addProperty("functions", this,&Private::functions);
4191 addProperty("variables", this,&Private::variables);
4192 addProperty("signals", this,&Private::signals);
4193 addProperty("publicSlots", this,&Private::publicSlots);
4194 addProperty("protectedSlots", this,&Private::protectedSlots);
4195 addProperty("privateSlots", this,&Private::privateSlots);
4196 addProperty("events", this,&Private::events);
4197 addProperty("properties", this,&Private::properties);
4198 addProperty("friends", this,&Private::friends);
4199 addProperty("memberGroups", this,&Private::memberGroups);
4200 addProperty("detailedMacros", this,&Private::detailedMacros);
4201 addProperty("detailedTypedefs", this,&Private::detailedTypedefs);
4202 addProperty("detailedEnums", this,&Private::detailedEnums);
4203 addProperty("detailedEnumValues", this,&Private::detailedEnumValues);
4204 addProperty("detailedFunctions", this,&Private::detailedFunctions);
4205 addProperty("detailedVariables", this,&Private::detailedVariables);
4206 addProperty("detailedSignals", this,&Private::detailedSignals);
4207 addProperty("detailedPublicSlots", this,&Private::detailedPublicSlots);
4208 addProperty("detailedProtectedSlots", this,&Private::detailedProtectedSlots);
4209 addProperty("detailedPrivateSlots", this,&Private::detailedPrivateSlots);
4210 addProperty("detailedEvents", this,&Private::detailedEvents);
4211 addProperty("detailedProperties", this,&Private::detailedProperties);
4212 addProperty("detailedFriends", this,&Private::detailedFriends);
4213 addProperty("inlineClasses", this,&Private::inlineClasses);
4214 addProperty("compoundType", this,&Private::compoundType);
4216 virtual ~Private() {}
4217 TemplateVariant title() const
4219 return TemplateVariant(m_groupDef->groupTitle());
4221 TemplateVariant highlight() const
4223 return TemplateVariant("modules");
4225 TemplateVariant subHighlight() const
4227 return TemplateVariant("");
4229 DotGroupCollaboration *getGroupGraph() const
4231 if (!m_cache.groupGraph)
4233 m_cache.groupGraph.reset(new DotGroupCollaboration(m_groupDef));
4235 return m_cache.groupGraph.get();
4237 TemplateVariant hasGroupGraph() const
4240 static bool haveDot = Config_getBool("HAVE_DOT");
4241 static bool groupGraphs = Config_getBool("GROUP_GRAPHS");
4242 if (haveDot && groupGraphs)
4244 DotGroupCollaboration *graph = getGroupGraph();
4245 result = !graph->isTrivial();
4249 TemplateVariant groupGraph() const
4252 static bool haveDot = Config_getBool("HAVE_DOT");
4253 static bool groupGraphs = Config_getBool("GROUP_GRAPHS");
4254 if (haveDot && groupGraphs)
4256 DotGroupCollaboration *graph = getGroupGraph();
4257 FTextStream t(&result);
4258 graph->writeGraph(t,GOF_BITMAP,
4260 g_globals.outputDir,
4261 g_globals.outputDir+portable_pathSeparator()+m_groupDef->getOutputFileBase()+Doxygen::htmlFileExtension,
4264 g_globals.dynSectionId);
4266 g_globals.dynSectionId++;
4267 return TemplateVariant(result.data(),TRUE);
4269 TemplateVariant hasDetails() const
4271 return m_groupDef->hasDetailedDescription();
4273 TemplateVariant modules() const
4275 if (!m_cache.modules)
4277 TemplateList *moduleList = TemplateList::alloc();
4278 if (m_groupDef->getSubGroups())
4280 GroupListIterator gli(*m_groupDef->getSubGroups());
4282 for (gli.toFirst();(gd=gli.current());++gli)
4284 if (gd->isVisible())
4286 moduleList->append(ModuleContext::alloc(gd));
4290 m_cache.modules.reset(moduleList);
4292 return m_cache.modules.get();
4294 TemplateVariant examples() const
4296 if (!m_cache.examples)
4298 TemplateList *exampleList = TemplateList::alloc();
4299 if (m_groupDef->getExamples())
4301 PageSDict::Iterator eli(*m_groupDef->getExamples());
4303 for (eli.toFirst();(ex=eli.current());++eli)
4305 exampleList->append(PageContext::alloc(ex));
4308 m_cache.examples.reset(exampleList);
4310 return m_cache.examples.get();
4312 TemplateVariant pages() const
4316 TemplateList *pageList = TemplateList::alloc();
4317 if (m_groupDef->getExamples())
4319 PageSDict::Iterator eli(*m_groupDef->getPages());
4321 for (eli.toFirst();(ex=eli.current());++eli)
4323 pageList->append(PageContext::alloc(ex));
4326 m_cache.pages.reset(pageList);
4328 return m_cache.pages.get();
4330 TemplateVariant dirs() const
4334 TemplateList *dirList = TemplateList::alloc();
4335 if (m_groupDef->getDirs())
4337 QListIterator<DirDef> it(*m_groupDef->getDirs());
4339 for (it.toFirst();(dd=it.current());++it)
4341 dirList->append(DirContext::alloc(dd));
4344 m_cache.dirs.reset(dirList);
4346 return m_cache.dirs.get();
4348 TemplateVariant files() const
4352 TemplateList *fileList = TemplateList::alloc();
4353 if (m_groupDef->getFiles())
4355 QListIterator<FileDef> it(*m_groupDef->getFiles());
4357 for (it.toFirst();(fd=it.current());++it)
4359 fileList->append(FileContext::alloc(fd));
4362 m_cache.files.reset(fileList);
4364 return m_cache.files.get();
4366 TemplateVariant classes() const
4368 if (!m_cache.classes)
4370 TemplateList *classList = TemplateList::alloc();
4371 if (m_groupDef->getClasses())
4373 ClassSDict::Iterator sdi(*m_groupDef->getClasses());
4375 for (sdi.toFirst();(cd=sdi.current());++sdi)
4377 if (cd->visibleInParentsDeclList())
4379 classList->append(ClassContext::alloc(cd));
4383 m_cache.classes.reset(classList);
4385 return m_cache.classes.get();
4387 TemplateVariant namespaces() const
4389 if (!m_cache.namespaces)
4391 TemplateList *namespaceList = TemplateList::alloc();
4392 if (m_groupDef->getNamespaces())
4394 NamespaceSDict::Iterator sdi(*m_groupDef->getNamespaces());
4396 for (sdi.toFirst();(nd=sdi.current());++sdi)
4398 if (nd->isLinkable() && !nd->isConstantGroup())
4400 namespaceList->append(NamespaceContext::alloc(nd));
4404 m_cache.namespaces.reset(namespaceList);
4406 return m_cache.namespaces.get();
4408 TemplateVariant constantgroups() const
4410 if (!m_cache.constantgroups)
4412 TemplateList *namespaceList = TemplateList::alloc();
4413 if (m_groupDef->getNamespaces())
4415 NamespaceSDict::Iterator sdi(*m_groupDef->getNamespaces());
4417 for (sdi.toFirst();(nd=sdi.current());++sdi)
4419 if (nd->isLinkable() && nd->isConstantGroup())
4421 namespaceList->append(NamespaceContext::alloc(nd));
4425 m_cache.constantgroups.reset(namespaceList);
4427 return m_cache.constantgroups.get();
4430 TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list,
4431 MemberListType type,const char *title,bool detailed=FALSE) const
4435 MemberList *ml = m_groupDef->getMemberList(type);
4438 list.reset(MemberListInfoContext::alloc(m_groupDef,relPathAsString(),ml,title,detailed));
4447 return TemplateVariant(FALSE);
4450 TemplateVariant macros() const
4452 return getMemberList(m_cache.macros,MemberListType_decDefineMembers,theTranslator->trDefines());
4454 TemplateVariant typedefs() const
4456 return getMemberList(m_cache.typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs());
4458 TemplateVariant enums() const
4460 return getMemberList(m_cache.enums,MemberListType_decEnumMembers,theTranslator->trEnumerations());
4462 TemplateVariant enumValues() const
4464 return getMemberList(m_cache.enums,MemberListType_decEnumValMembers,theTranslator->trEnumerationValues());
4466 TemplateVariant functions() const
4468 QCString title = theTranslator->trFunctions();
4469 SrcLangExt lang = m_groupDef->getLanguage();
4470 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms();
4471 else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc();
4472 return getMemberList(m_cache.functions,MemberListType_decFuncMembers,title);
4474 TemplateVariant variables() const
4476 return getMemberList(m_cache.variables,MemberListType_decVarMembers,theTranslator->trVariables());
4478 TemplateVariant signals() const
4480 return getMemberList(m_cache.signals,MemberListType_signals,theTranslator->trSignals());
4482 TemplateVariant publicSlots() const
4484 return getMemberList(m_cache.publicSlots,MemberListType_pubSlots,theTranslator->trPublicSlots());
4486 TemplateVariant protectedSlots() const
4488 return getMemberList(m_cache.protectedSlots,MemberListType_proSlots,theTranslator->trProtectedSlots());
4490 TemplateVariant privateSlots() const
4492 return getMemberList(m_cache.privateSlots,MemberListType_priSlots,theTranslator->trPrivateSlots());
4494 TemplateVariant events() const
4496 return getMemberList(m_cache.events,MemberListType_events,theTranslator->trEvents());
4498 TemplateVariant properties() const
4500 return getMemberList(m_cache.properties,MemberListType_properties,theTranslator->trProperties());
4502 TemplateVariant friends() const
4504 return getMemberList(m_cache.friends,MemberListType_friends,theTranslator->trFriends());
4506 TemplateVariant memberGroups() const
4508 if (!m_cache.memberGroups)
4510 if (m_groupDef->getMemberGroupSDict())
4512 m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_groupDef,relPathAsString(),m_groupDef->getMemberGroupSDict(),m_groupDef->subGrouping()));
4516 m_cache.memberGroups.reset(MemberGroupListContext::alloc());
4519 return m_cache.memberGroups.get();
4521 TemplateVariant detailedMacros() const
4523 return getMemberList(m_cache.detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation());
4525 TemplateVariant detailedTypedefs() const
4527 return getMemberList(m_cache.detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation());
4529 TemplateVariant detailedEnums() const
4531 return getMemberList(m_cache.detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation());
4533 TemplateVariant detailedEnumValues() const
4535 return getMemberList(m_cache.detailedEnumValues,MemberListType_docEnumValMembers,theTranslator->trEnumerationValueDocumentation());
4537 TemplateVariant detailedFunctions() const
4539 QCString title = theTranslator->trFunctionDocumentation();
4540 SrcLangExt lang = m_groupDef->getLanguage();
4541 if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation();
4542 return getMemberList(m_cache.detailedFunctions,MemberListType_docFuncMembers,title);
4544 TemplateVariant detailedVariables() const
4546 return getMemberList(m_cache.detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation());
4548 TemplateVariant detailedSignals() const
4550 return getMemberList(m_cache.detailedSignals,MemberListType_docSignalMembers,theTranslator->trSignals());
4552 TemplateVariant detailedPublicSlots() const
4554 return getMemberList(m_cache.detailedPublicSlots,MemberListType_docPubSlotMembers,theTranslator->trPublicSlots());
4556 TemplateVariant detailedProtectedSlots() const
4558 return getMemberList(m_cache.detailedProtectedSlots,MemberListType_docProSlotMembers,theTranslator->trProtectedSlots());
4560 TemplateVariant detailedPrivateSlots() const
4562 return getMemberList(m_cache.detailedPrivateSlots,MemberListType_docPriSlotMembers,theTranslator->trPrivateSlots());
4564 TemplateVariant detailedEvents() const
4566 return getMemberList(m_cache.detailedEvents,MemberListType_docEventMembers,theTranslator->trEventDocumentation(),TRUE);
4568 TemplateVariant detailedProperties() const
4570 return getMemberList(m_cache.detailedProperties,MemberListType_docPropMembers,theTranslator->trPropertyDocumentation(),TRUE);
4572 TemplateVariant detailedFriends() const
4574 return getMemberList(m_cache.detailedFriends,MemberListType_docFriendMembers,theTranslator->trFriends(),TRUE);
4576 TemplateVariant inlineClasses() const
4578 if (!m_cache.inlineClasses)
4580 TemplateList *classList = TemplateList::alloc();
4581 if (m_groupDef->getClasses())
4583 ClassSDict::Iterator sdi(*m_groupDef->getClasses());
4585 for (sdi.toFirst();(cd=sdi.current());++sdi)
4587 if (cd->name().find('@')==-1 &&
4588 cd->isLinkableInProject() &&
4589 cd->isEmbeddedInOuterScope() &&
4590 cd->partOfGroups()==0)
4592 classList->append(ClassContext::alloc(cd));
4596 m_cache.inlineClasses.reset(classList);
4598 return m_cache.inlineClasses.get();
4600 TemplateVariant compoundType() const
4602 return "module"; //theTranslator->trGroup(FALSE,TRUE);
4605 GroupDef *m_groupDef;
4608 SharedPtr<TemplateList> modules;
4609 SharedPtr<TemplateList> dirs;
4610 SharedPtr<TemplateList> files;
4611 SharedPtr<TemplateList> classes;
4612 SharedPtr<TemplateList> namespaces;
4613 SharedPtr<TemplateList> constantgroups;
4614 SharedPtr<TemplateList> examples;
4615 SharedPtr<TemplateList> pages;
4616 SharedPtr<MemberListInfoContext> macros;
4617 SharedPtr<MemberListInfoContext> typedefs;
4618 SharedPtr<MemberListInfoContext> enums;
4619 SharedPtr<MemberListInfoContext> enumValues;
4620 SharedPtr<MemberListInfoContext> functions;
4621 SharedPtr<MemberListInfoContext> variables;
4622 SharedPtr<MemberListInfoContext> signals;
4623 SharedPtr<MemberListInfoContext> publicSlots;
4624 SharedPtr<MemberListInfoContext> protectedSlots;
4625 SharedPtr<MemberListInfoContext> privateSlots;
4626 SharedPtr<MemberListInfoContext> events;
4627 SharedPtr<MemberListInfoContext> properties;
4628 SharedPtr<MemberListInfoContext> friends;
4629 SharedPtr<MemberGroupListContext> memberGroups;
4630 SharedPtr<MemberListInfoContext> detailedMacros;
4631 SharedPtr<MemberListInfoContext> detailedTypedefs;
4632 SharedPtr<MemberListInfoContext> detailedEnums;
4633 SharedPtr<MemberListInfoContext> detailedEnumValues;
4634 SharedPtr<MemberListInfoContext> detailedFunctions;
4635 SharedPtr<MemberListInfoContext> detailedVariables;
4636 SharedPtr<MemberListInfoContext> detailedSignals;
4637 SharedPtr<MemberListInfoContext> detailedPublicSlots;
4638 SharedPtr<MemberListInfoContext> detailedProtectedSlots;
4639 SharedPtr<MemberListInfoContext> detailedPrivateSlots;
4640 SharedPtr<MemberListInfoContext> detailedEvents;
4641 SharedPtr<MemberListInfoContext> detailedProperties;
4642 SharedPtr<MemberListInfoContext> detailedFriends;
4643 SharedPtr<TemplateList> inlineClasses;
4644 ScopedPtr<DotGroupCollaboration> groupGraph;
4646 mutable Cachable m_cache;
4650 ModuleContext::ModuleContext(GroupDef *gd) : RefCountedContext("ModuleContext")
4652 p = new Private(gd);
4655 ModuleContext::~ModuleContext()
4660 TemplateVariant ModuleContext::get(const char *n) const
4665 //------------------------------------------------------------------------
4667 //%% list ClassList[Class] : list of classes
4668 class ClassListContext::Private : public GenericNodeListContext
4671 void addClasses(const ClassSDict &classSDict)
4673 ClassSDict::Iterator cli(classSDict);
4675 for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
4677 if (cd->getLanguage()==SrcLangExt_VHDL &&
4678 ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
4679 (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
4680 ) // no architecture
4684 if (cd->isLinkableInProject() && cd->templateMaster()==0)
4686 append(ClassContext::alloc(cd));
4692 ClassListContext::ClassListContext() : RefCountedContext("ClassListContext")
4695 p->addClasses(*Doxygen::classSDict);
4696 p->addClasses(*Doxygen::hiddenClasses);
4699 ClassListContext::~ClassListContext()
4705 int ClassListContext::count() const
4710 TemplateVariant ClassListContext::at(int index) const
4712 return p->at(index);
4715 TemplateListIntf::ConstIterator *ClassListContext::createIterator() const
4717 return p->createIterator();
4720 //------------------------------------------------------------------------
4722 //%% list ClassIndex[Class] : list of classes
4723 class ClassIndexContext::Private : public PropertyMapper
4728 addProperty("list", this,&Private::list);
4729 addProperty("fileName", this,&Private::fileName);
4730 addProperty("relPath", this,&Private::relPath);
4731 addProperty("highlight", this,&Private::highlight);
4732 addProperty("subhighlight",this,&Private::subhighlight);
4733 addProperty("title", this,&Private::title);
4735 TemplateVariant list() const
4737 if (!m_cache.classes)
4739 TemplateList *classList = TemplateList::alloc();
4740 if (Doxygen::classSDict)
4742 ClassSDict::Iterator cli(*Doxygen::classSDict);
4744 for (cli.toFirst() ; (cd=cli.current()) ; ++cli )
4746 if (cd->getLanguage()==SrcLangExt_VHDL &&
4747 ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
4748 (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS)
4749 ) // no architecture
4753 if (cd->isLinkableInProject() && cd->templateMaster()==0)
4755 classList->append(ClassContext::alloc(cd));
4759 m_cache.classes.reset(classList);
4761 return m_cache.classes.get();
4763 TemplateVariant fileName() const
4767 TemplateVariant relPath() const
4771 TemplateVariant highlight() const
4775 TemplateVariant subhighlight() const
4777 return "classindex";
4779 TemplateVariant title() const
4781 static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
4782 static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
4785 return theTranslator->trDataTypes();
4789 return VhdlDocGen::trDesignUnits();
4793 return theTranslator->trCompoundIndex();
4799 SharedPtr<TemplateList> classes;
4801 mutable Cachable m_cache;
4804 ClassIndexContext::ClassIndexContext() : RefCountedContext("ClassIndexContext")
4807 //p->addClasses(*Doxygen::hiddenClasses);
4810 ClassIndexContext::~ClassIndexContext()
4815 // TemplateStructIntf
4816 TemplateVariant ClassIndexContext::get(const char *n) const
4821 //------------------------------------------------------------------------
4823 //%% struct ClassInheritanceNode: node in inheritance tree
4825 class ClassInheritanceNodeContext::Private : public PropertyMapper
4828 Private(ClassDef *cd) : m_classDef(cd)
4830 //%% bool is_leaf_node: true if this node does not have any children
4831 addProperty("is_leaf_node",this,&Private::isLeafNode);
4832 //%% ClassInheritance children: list of nested classes/namespaces
4833 addProperty("children",this,&Private::children);
4834 //%% Class class: class info
4835 addProperty("class",this,&Private::getClass);
4837 void addChildren(const BaseClassList *bcl,bool hideSuper)
4840 BaseClassListIterator bcli(*bcl);
4842 for (bcli.toFirst() ; (bcd=bcli.current()) ; ++bcli)
4844 ClassDef *cd=bcd->classDef;
4845 if (cd->getLanguage()==SrcLangExt_VHDL && (VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
4851 if (cd->getLanguage()==SrcLangExt_VHDL)
4853 b=hasVisibleRoot(cd->subClasses());
4857 b=hasVisibleRoot(cd->baseClasses());
4860 if (cd->isVisibleInHierarchy() && b) // hasVisibleRoot(cd->baseClasses()))
4862 bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd);
4863 ClassInheritanceNodeContext *tnc = new ClassInheritanceNodeContext(cd);
4864 m_children.append(tnc);
4867 //printf("Class %s at %p visited=%d\n",cd->name().data(),cd,cd->visited);
4868 bool wasVisited=cd->visited;
4870 if (cd->getLanguage()==SrcLangExt_VHDL)
4872 tnc->addChildren(cd->baseClasses(),wasVisited);
4876 tnc->addChildren(cd->subClasses(),wasVisited);
4882 TemplateVariant isLeafNode() const
4884 return m_children.isEmpty();
4886 TemplateVariant children() const
4888 return TemplateVariant(&m_children);
4890 TemplateVariant getClass() const
4892 if (!m_cache.classContext)
4894 m_cache.classContext.reset(ClassContext::alloc(m_classDef));
4896 return m_cache.classContext.get();
4899 ClassDef *m_classDef;
4900 GenericNodeListContext m_children;
4903 SharedPtr<ClassContext> classContext;
4905 mutable Cachable m_cache;
4909 ClassInheritanceNodeContext::ClassInheritanceNodeContext(ClassDef *cd) : RefCountedContext("ClassInheritanceNodeContext")
4911 p = new Private(cd);
4914 ClassInheritanceNodeContext::~ClassInheritanceNodeContext()
4919 TemplateVariant ClassInheritanceNodeContext::get(const char *n) const
4924 void ClassInheritanceNodeContext::addChildren(const BaseClassList *bcl,bool hideSuper)
4926 p->addChildren(bcl,hideSuper);
4929 //------------------------------------------------------------------------
4931 //%% list ClassInheritance[ClassInheritanceNode]: list of classes
4932 class ClassInheritanceContext::Private : public GenericNodeListContext
4935 void addClasses(const ClassSDict &classSDict)
4937 ClassSDict::Iterator cli(classSDict);
4939 for (cli.toFirst();(cd=cli.current());++cli)
4942 if (cd->getLanguage()==SrcLangExt_VHDL)
4944 if ((VhdlDocGen::VhdlClasses)cd->protection()!=VhdlDocGen::ENTITYCLASS)
4948 b=!hasVisibleRoot(cd->subClasses());
4952 b=!hasVisibleRoot(cd->baseClasses());
4956 if (cd->isVisibleInHierarchy()) // should it be visible
4958 // new root level class
4959 ClassInheritanceNodeContext *tnc = ClassInheritanceNodeContext::alloc(cd);
4961 bool hasChildren = !cd->visited && classHasVisibleChildren(cd);
4962 if (cd->getLanguage()==SrcLangExt_VHDL && hasChildren)
4964 tnc->addChildren(cd->baseClasses(),cd->visited);
4967 else if (hasChildren)
4969 tnc->addChildren(cd->subClasses(),cd->visited);
4978 ClassInheritanceContext::ClassInheritanceContext() : RefCountedContext("ClassInheritanceContext")
4981 initClassHierarchy(Doxygen::classSDict);
4982 initClassHierarchy(Doxygen::hiddenClasses);
4983 p->addClasses(*Doxygen::classSDict);
4984 p->addClasses(*Doxygen::hiddenClasses);
4987 ClassInheritanceContext::~ClassInheritanceContext()
4993 int ClassInheritanceContext::count() const
4995 return (int)p->count();
4998 TemplateVariant ClassInheritanceContext::at(int index) const
5000 TemplateVariant result;
5001 if (index>=0 && index<count())
5003 result = p->at(index);
5008 TemplateListIntf::ConstIterator *ClassInheritanceContext::createIterator() const
5010 return p->createIterator();
5013 //------------------------------------------------------------------------
5015 //%% struct ClassHierarchy: inheritance tree
5017 class ClassHierarchyContext::Private : public PropertyMapper
5020 TemplateVariant tree() const
5022 if (!m_cache.classTree)
5024 m_cache.classTree.reset(ClassInheritanceContext::alloc());
5026 return m_cache.classTree.get();
5028 TemplateVariant fileName() const
5032 TemplateVariant relPath() const
5036 TemplateVariant highlight() const
5040 TemplateVariant subhighlight() const
5042 return "classhierarchy";
5044 TemplateVariant title() const
5046 static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
5049 return VhdlDocGen::trDesignUnitHierarchy();
5053 return theTranslator->trClassHierarchy();
5058 //%% ClassInheritance tree
5059 addProperty("tree",this,&Private::tree);
5060 addProperty("fileName",this,&Private::fileName);
5061 addProperty("relPath",this,&Private::relPath);
5062 addProperty("highlight",this,&Private::highlight);
5063 addProperty("subhighlight",this,&Private::subhighlight);
5064 addProperty("title",this,&Private::title);
5069 SharedPtr<ClassInheritanceContext> classTree;
5071 mutable Cachable m_cache;
5075 ClassHierarchyContext::ClassHierarchyContext() : RefCountedContext("ClassHierarchyContext")
5080 ClassHierarchyContext::~ClassHierarchyContext()
5085 TemplateVariant ClassHierarchyContext::get(const char *name) const
5087 return p->get(name);
5090 //------------------------------------------------------------------------
5092 //%% struct NestingNode: node is a nesting relation tree
5094 class NestingNodeContext::Private : public PropertyMapper
5097 Private(const NestingNodeContext *parent,const NestingNodeContext *thisNode,
5098 Definition *d,int index,int level,bool addCls)
5099 : m_parent(parent), m_def(d), m_level(level), m_index(index)
5101 m_children.reset(NestingContext::alloc(thisNode,level+1));
5102 //%% bool is_leaf_node: true if this node does not have any children
5103 addProperty("is_leaf_node",this,&Private::isLeafNode);
5104 //%% Nesting children: list of nested classes/namespaces
5105 addProperty("children",this,&Private::children);
5106 //%% [optional] Class class: class info (if this node represents a class)
5107 addProperty("class",this,&Private::getClass);
5108 //%% [optional] Namespace namespace: namespace info (if this node represents a namespace)
5109 addProperty("namespace",this,&Private::getNamespace);
5110 //%% [optional] File file: file info (if this node represents a file)
5111 addProperty("file",this,&Private::getFile);
5112 //%% [optional] Dir dir: directory info (if this node represents a directory)
5113 addProperty("dir",this,&Private::getDir);
5114 //%% [optional] Page page: page info (if this node represents a page)
5115 addProperty("page",this,&Private::getPage);
5116 //%% [optional] Module module: module info (if this node represents a module)
5117 addProperty("module",this,&Private::getModule);
5119 addProperty("id",this,&Private::id);
5121 addProperty("level",this,&Private::level);
5123 addProperty("name",this,&Private::name);
5125 addProperty("brief",this,&Private::brief);
5126 //%% bool isLinkable
5127 addProperty("isLinkable",this,&Private::isLinkable);
5128 addProperty("anchor",this,&Private::anchor);
5129 addProperty("fileName",this,&Private::fileName);
5131 addNamespaces(addCls);
5137 TemplateVariant isLeafNode() const
5139 return m_children->count()==0;
5141 TemplateVariant children() const
5143 return m_children.get();
5145 TemplateVariant getClass() const
5147 if (!m_cache.classContext && m_def->definitionType()==Definition::TypeClass)
5149 m_cache.classContext.reset(ClassContext::alloc((ClassDef*)m_def));
5151 if (m_cache.classContext)
5153 return m_cache.classContext.get();
5157 return TemplateVariant(FALSE);
5160 TemplateVariant getNamespace() const
5162 if (!m_cache.namespaceContext && m_def->definitionType()==Definition::TypeNamespace)
5164 m_cache.namespaceContext.reset(NamespaceContext::alloc((NamespaceDef*)m_def));
5166 if (m_cache.namespaceContext)
5168 return m_cache.namespaceContext.get();
5172 return TemplateVariant(FALSE);
5175 TemplateVariant getDir() const
5177 if (!m_cache.dirContext && m_def->definitionType()==Definition::TypeDir)
5179 m_cache.dirContext.reset(DirContext::alloc((DirDef*)m_def));
5181 if (m_cache.dirContext)
5183 return m_cache.dirContext.get();
5187 return TemplateVariant(FALSE);
5190 TemplateVariant getFile() const
5192 if (!m_cache.fileContext && m_def->definitionType()==Definition::TypeFile)
5194 m_cache.fileContext.reset(FileContext::alloc((FileDef*)m_def));
5196 if (m_cache.fileContext)
5198 return m_cache.fileContext.get();
5202 return TemplateVariant(FALSE);
5205 TemplateVariant getPage() const
5207 if (!m_cache.pageContext && m_def->definitionType()==Definition::TypePage)
5209 m_cache.pageContext.reset(PageContext::alloc((PageDef*)m_def));
5211 if (m_cache.pageContext)
5213 return m_cache.pageContext.get();
5217 return TemplateVariant(FALSE);
5220 TemplateVariant getModule() const
5222 if (!m_cache.moduleContext && m_def->definitionType()==Definition::TypeGroup)
5224 m_cache.moduleContext.reset(ModuleContext::alloc((GroupDef*)m_def));
5226 if (m_cache.moduleContext)
5228 return m_cache.moduleContext.get();
5232 return TemplateVariant(FALSE);
5235 TemplateVariant level() const
5239 TemplateVariant id() const
5242 if (m_parent) result=m_parent->id();
5243 result+=QCString().setNum(m_index)+"_";
5246 TemplateVariant name() const
5248 return m_def->displayName(FALSE);
5250 QCString relPathAsString() const
5252 static bool createSubdirs = Config_getBool("CREATE_SUBDIRS");
5253 return createSubdirs ? QCString("../../") : QCString("");
5255 TemplateVariant brief() const
5259 if (m_def->hasBriefDescription())
5261 m_cache.brief.reset(new TemplateVariant(parseDoc(m_def,m_def->briefFile(),m_def->briefLine(),
5262 "",m_def->briefDescription(),TRUE)));
5266 m_cache.brief.reset(new TemplateVariant(""));
5269 return *m_cache.brief;
5271 TemplateVariant isLinkable() const
5273 return m_def->isLinkable();
5275 TemplateVariant anchor() const
5277 return m_def->anchor();
5279 TemplateVariant fileName() const
5281 return m_def->getOutputFileBase();
5286 ClassDef *cd = m_def->definitionType()==Definition::TypeClass ? (ClassDef*)m_def : 0;
5287 if (cd && cd->getClassSDict())
5289 m_children->addClasses(*cd->getClassSDict(),FALSE);
5292 void addNamespaces(bool addClasses)
5294 NamespaceDef *nd = m_def->definitionType()==Definition::TypeNamespace ? (NamespaceDef*)m_def : 0;
5295 if (nd && nd->getNamespaceSDict())
5297 m_children->addNamespaces(*nd->getNamespaceSDict(),FALSE,addClasses);
5299 if (addClasses && nd && nd->getClassSDict())
5301 m_children->addClasses(*nd->getClassSDict(),FALSE);
5306 DirDef *dd = m_def->definitionType()==Definition::TypeDir ? (DirDef*)m_def : 0;
5309 m_children->addDirs(dd->subDirs());
5310 if (dd && dd->getFiles())
5312 m_children->addFiles(*dd->getFiles());
5318 PageDef *pd = m_def->definitionType()==Definition::TypePage ? (PageDef*)m_def : 0;
5319 if (pd && pd->getSubPages())
5321 m_children->addPages(*pd->getSubPages(),FALSE);
5326 GroupDef *gd = m_def->definitionType()==Definition::TypeGroup ? (GroupDef*)m_def : 0;
5327 if (gd && gd->getSubGroups())
5329 m_children->addModules(*gd->getSubGroups());
5333 const NestingNodeContext *m_parent;
5335 SharedPtr<NestingContext> m_children;
5340 SharedPtr<ClassContext> classContext;
5341 SharedPtr<NamespaceContext> namespaceContext;
5342 SharedPtr<DirContext> dirContext;
5343 SharedPtr<FileContext> fileContext;
5344 SharedPtr<PageContext> pageContext;
5345 SharedPtr<ModuleContext> moduleContext;
5346 ScopedPtr<TemplateVariant> brief;
5348 mutable Cachable m_cache;
5352 NestingNodeContext::NestingNodeContext(const NestingNodeContext *parent,
5353 Definition *d,int index,int level,bool addClass) : RefCountedContext("NestingNodeContext")
5355 p = new Private(parent,this,d,index,level,addClass);
5358 NestingNodeContext::~NestingNodeContext()
5363 TemplateVariant NestingNodeContext::get(const char *n) const
5368 QCString NestingNodeContext::id() const
5370 return p->id().toString();
5373 //------------------------------------------------------------------------
5375 //%% list Nesting[NestingNode]: namespace and class nesting relations
5376 class NestingContext::Private : public GenericNodeListContext
5379 Private(const NestingNodeContext *parent,int level)
5380 : m_parent(parent), m_level(level), m_index(0) {}
5382 void addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses)
5384 NamespaceSDict::Iterator nli(nsDict);
5386 for (nli.toFirst();(nd=nli.current());++nli)
5388 if (nd->localName().find('@')==-1 &&
5389 (!rootOnly || nd->getOuterScope()==Doxygen::globalScope))
5391 bool hasChildren = namespaceHasVisibleChild(nd,addClasses);
5392 bool isLinkable = nd->isLinkableInProject();
5393 if (isLinkable || hasChildren)
5395 NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,nd,m_index,m_level,addClasses);
5402 void addClasses(const ClassSDict &clDict,bool rootOnly)
5404 ClassSDict::Iterator cli(clDict);
5406 for (;(cd=cli.current());++cli)
5408 if (cd->getLanguage()==SrcLangExt_VHDL)
5410 if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS ||
5411 (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS
5418 cd->getOuterScope()==0 ||
5419 cd->getOuterScope()==Doxygen::globalScope
5422 if (classVisibleInIndex(cd) && cd->templateMaster()==0)
5424 NestingNodeContext *nnc = NestingNodeContext::alloc(m_parent,cd,m_index,m_level,TRUE);
5431 void addDirs(const DirSDict &dirDict)
5433 SDict<DirDef>::Iterator dli(dirDict);
5435 for (dli.toFirst();(dd=dli.current());++dli)
5437 if (dd->getOuterScope()==Doxygen::globalScope)
5439 append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE));
5444 void addDirs(const DirList &dirList)
5446 QListIterator<DirDef> li(dirList);
5448 for (li.toFirst();(dd=li.current());++li)
5450 append(NestingNodeContext::alloc(m_parent,dd,m_index,m_level,FALSE));
5454 void addFiles(const FileNameList &fnList)
5456 FileNameListIterator fnli(fnList);
5458 for (fnli.toFirst();(fn=fnli.current());++fnli)
5460 FileNameIterator fni(*fn);
5462 for (;(fd=fni.current());++fni)
5464 if (fd->getDirDef()==0) // top level file
5466 append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE));
5472 void addFiles(const FileList &fList)
5474 QListIterator<FileDef> li(fList);
5476 for (li.toFirst();(fd=li.current());++li)
5478 append(NestingNodeContext::alloc(m_parent,fd,m_index,m_level,FALSE));
5482 void addPages(const PageSDict &pages,bool rootOnly)
5484 SDict<PageDef>::Iterator pli(pages);
5486 for (pli.toFirst();(pd=pli.current());++pli)
5489 pd->getOuterScope()==0 ||
5490 pd->getOuterScope()->definitionType()!=Definition::TypePage)
5492 append(NestingNodeContext::alloc(m_parent,pd,m_index,m_level,FALSE));
5497 void addModules(const GroupSDict &groups)
5499 GroupSDict::Iterator gli(groups);
5501 for (gli.toFirst();(gd=gli.current());++gli)
5503 static bool externalGroups = Config_getBool("EXTERNAL_GROUPS");
5504 if (!gd->isASubGroup() && gd->isVisible() &&
5505 (!gd->isReference() || externalGroups)
5508 append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE));
5513 void addModules(const GroupList &list)
5515 GroupListIterator gli(list);
5517 for (gli.toFirst();(gd=gli.current());++gli)
5519 if (gd->isVisible())
5521 append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE));
5527 const NestingNodeContext *m_parent;
5532 NestingContext::NestingContext(const NestingNodeContext *parent,int level) : RefCountedContext("NestingContext")
5534 p = new Private(parent,level);
5537 NestingContext::~NestingContext()
5543 int NestingContext::count() const
5548 TemplateVariant NestingContext::at(int index) const
5550 return p->at(index);
5553 TemplateListIntf::ConstIterator *NestingContext::createIterator() const
5555 return p->createIterator();
5558 void NestingContext::addClasses(const ClassSDict &clDict,bool rootOnly)
5560 p->addClasses(clDict,rootOnly);
5563 void NestingContext::addNamespaces(const NamespaceSDict &nsDict,bool rootOnly,bool addClasses)
5565 p->addNamespaces(nsDict,rootOnly,addClasses);
5568 void NestingContext::addDirs(const DirSDict &dirs)
5573 void NestingContext::addDirs(const DirList &dirs)
5578 void NestingContext::addFiles(const FileNameList &files)
5583 void NestingContext::addFiles(const FileList &files)
5588 void NestingContext::addPages(const PageSDict &pages,bool rootOnly)
5590 p->addPages(pages,rootOnly);
5593 void NestingContext::addModules(const GroupSDict &modules)
5595 p->addModules(modules);
5598 void NestingContext::addModules(const GroupList &modules)
5600 p->addModules(modules);
5603 //------------------------------------------------------------------------
5605 static int computeMaxDepth(const TemplateListIntf *list)
5610 TemplateListIntf::ConstIterator *it = list->createIterator();
5612 for (it->toFirst();it->current(v);it->toNext())
5614 const TemplateStructIntf *s = v.toStruct();
5615 TemplateVariant child = s->get("children");
5616 int d = computeMaxDepth(child.toList())+1;
5617 if (d>maxDepth) maxDepth=d;
5624 static int computeNumNodesAtLevel(const TemplateStructIntf *s,int level,int maxLevel)
5630 TemplateVariant child = s->get("children");
5633 TemplateListIntf::ConstIterator *it = child.toList()->createIterator();
5635 for (it->toFirst();it->current(v);it->toNext())
5637 num+=computeNumNodesAtLevel(v.toStruct(),level+1,maxLevel);
5645 static int computePreferredDepth(const TemplateListIntf *list,int maxDepth)
5647 int preferredNumEntries = Config_getInt("HTML_INDEX_NUM_ENTRIES");
5648 int preferredDepth=1;
5649 if (preferredNumEntries>0)
5651 int depth = maxDepth;
5652 for (int i=1;i<=depth;i++)
5655 TemplateListIntf::ConstIterator *it = list->createIterator();
5657 for (it->toFirst();it->current(v);it->toNext())
5659 num+=computeNumNodesAtLevel(v.toStruct(),0,i);
5662 if (num<=preferredNumEntries)
5672 return preferredDepth;
5676 //%% struct ClassTree: Class nesting relations
5678 class ClassTreeContext::Private : public PropertyMapper
5683 m_classTree.reset(NestingContext::alloc(0,0));
5684 if (Doxygen::namespaceSDict)
5686 m_classTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,TRUE);
5688 if (Doxygen::classSDict)
5690 m_classTree->addClasses(*Doxygen::classSDict,TRUE);
5693 addProperty("tree",this,&Private::tree);
5694 addProperty("fileName",this,&Private::fileName);
5695 addProperty("relPath",this,&Private::relPath);
5696 addProperty("highlight",this,&Private::highlight);
5697 addProperty("subhighlight",this,&Private::subhighlight);
5698 addProperty("title",this,&Private::title);
5699 addProperty("preferredDepth",this,&Private::preferredDepth);
5700 addProperty("maxDepth",this,&Private::maxDepth);
5702 TemplateVariant tree() const
5704 return m_classTree.get();
5706 TemplateVariant fileName() const
5710 TemplateVariant relPath() const
5714 TemplateVariant highlight() const
5718 TemplateVariant subhighlight() const
5722 TemplateVariant title() const
5724 static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
5725 static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
5728 return theTranslator->trCompoundListFortran();
5732 return VhdlDocGen::trDesignUnitList();
5736 return theTranslator->trClasses();
5739 TemplateVariant maxDepth() const
5741 if (!m_cache.maxDepthComputed)
5743 m_cache.maxDepth = computeMaxDepth(m_classTree.get());
5744 m_cache.maxDepthComputed=TRUE;
5746 return m_cache.maxDepth;
5748 TemplateVariant preferredDepth() const
5750 if (!m_cache.preferredDepthComputed)
5752 m_cache.preferredDepth = computePreferredDepth(m_classTree.get(),maxDepth().toInt());
5753 m_cache.preferredDepthComputed=TRUE;
5755 return m_cache.preferredDepth;
5758 SharedPtr<NestingContext> m_classTree;
5761 Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
5763 bool maxDepthComputed;
5765 bool preferredDepthComputed;
5767 mutable Cachable m_cache;
5771 ClassTreeContext::ClassTreeContext() : RefCountedContext("ClassTreeContext")
5776 ClassTreeContext::~ClassTreeContext()
5781 TemplateVariant ClassTreeContext::get(const char *name) const
5783 return p->get(name);
5786 //------------------------------------------------------------------------
5788 //%% list NamespaceList[Namespace] : list of namespaces
5789 class NamespaceListContext::Private : public GenericNodeListContext
5792 void addNamespaces(const NamespaceSDict &nsDict)
5794 NamespaceSDict::Iterator nli(nsDict);
5796 for (nli.toFirst();(nd=nli.current());++nli)
5798 if (nd->isLinkableInProject())
5800 append(NamespaceContext::alloc(nd));
5806 NamespaceListContext::NamespaceListContext() : RefCountedContext("NamespaceListContext")
5809 p->addNamespaces(*Doxygen::namespaceSDict);
5812 NamespaceListContext::~NamespaceListContext()
5818 int NamespaceListContext::count() const
5823 TemplateVariant NamespaceListContext::at(int index) const
5825 return p->at(index);
5828 TemplateListIntf::ConstIterator *NamespaceListContext::createIterator() const
5830 return p->createIterator();
5833 //------------------------------------------------------------------------
5835 //%% struct NamespaceTree: tree of nested namespace
5837 class NamespaceTreeContext::Private : public PropertyMapper
5842 m_namespaceTree.reset(NestingContext::alloc(0,0));
5843 if (Doxygen::namespaceSDict)
5845 m_namespaceTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,FALSE);
5848 addProperty("tree",this,&Private::tree);
5849 addProperty("fileName",this,&Private::fileName);
5850 addProperty("relPath",this,&Private::relPath);
5851 addProperty("highlight",this,&Private::highlight);
5852 addProperty("subhighlight",this,&Private::subhighlight);
5853 addProperty("title",this,&Private::title);
5854 addProperty("preferredDepth",this,&Private::preferredDepth);
5855 addProperty("maxDepth",this,&Private::maxDepth);
5857 TemplateVariant tree() const
5859 return m_namespaceTree.get();
5861 TemplateVariant fileName() const
5863 return "namespaces";
5865 TemplateVariant relPath() const
5869 TemplateVariant highlight() const
5871 return "namespaces";
5873 TemplateVariant subhighlight() const
5875 return "namespacelist";
5877 TemplateVariant title() const
5879 static bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
5880 static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN");
5881 static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL");
5882 if (javaOpt || vhdlOpt)
5884 return theTranslator->trPackages();
5886 else if (fortranOpt)
5888 return theTranslator->trModulesList();
5892 return theTranslator->trNamespaceList();
5895 TemplateVariant maxDepth() const
5897 if (!m_cache.maxDepthComputed)
5899 m_cache.maxDepth = computeMaxDepth(m_namespaceTree.get());
5900 m_cache.maxDepthComputed=TRUE;
5902 return m_cache.maxDepth;
5904 TemplateVariant preferredDepth() const
5906 if (!m_cache.preferredDepthComputed)
5908 m_cache.preferredDepth = computePreferredDepth(m_namespaceTree.get(),maxDepth().toInt());
5909 m_cache.preferredDepthComputed=TRUE;
5911 return m_cache.preferredDepth;
5914 SharedPtr<NestingContext> m_namespaceTree;
5917 Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
5919 bool maxDepthComputed;
5921 bool preferredDepthComputed;
5923 mutable Cachable m_cache;
5927 NamespaceTreeContext::NamespaceTreeContext() : RefCountedContext("NamespaceTreeContext")
5932 NamespaceTreeContext::~NamespaceTreeContext()
5937 TemplateVariant NamespaceTreeContext::get(const char *name) const
5939 return p->get(name);
5942 //------------------------------------------------------------------------
5944 //%% list FileList[File] : list of files
5945 class FileListContext::Private : public GenericNodeListContext
5948 void addFiles(const FileNameList &fnList)
5950 // TODO: if FULL_PATH_NAMES is enabled, the ordering should be dir+file
5951 FileNameListIterator fnli(fnList);
5953 for (fnli.toFirst();(fn=fnli.current());++fnli)
5955 FileNameIterator fni(*fn);
5957 for (fni.toFirst();(fd=fni.current());++fni)
5959 bool doc = fd->isLinkableInProject();
5960 bool src = fd->generateSourceFile();
5961 bool nameOk = !fd->isDocumentationFile();
5962 if (nameOk && (doc || src) && !fd->isReference())
5964 append(FileContext::alloc(fd));
5971 FileListContext::FileListContext() : RefCountedContext("FileListContext")
5974 if (Doxygen::inputNameList) p->addFiles(*Doxygen::inputNameList);
5977 FileListContext::~FileListContext()
5983 int FileListContext::count() const
5988 TemplateVariant FileListContext::at(int index) const
5990 return p->at(index);
5993 TemplateListIntf::ConstIterator *FileListContext::createIterator() const
5995 return p->createIterator();
5998 //------------------------------------------------------------------------
6000 //%% list DirList[Dir] : list of files
6001 class DirListContext::Private : public GenericNodeListContext
6007 DirSDict::Iterator sdi(*Doxygen::directories);
6008 for (sdi.toFirst();(dir=sdi.current());++sdi)
6010 append(DirContext::alloc(dir));
6015 DirListContext::DirListContext() : RefCountedContext("DirListContext")
6020 DirListContext::~DirListContext()
6026 int DirListContext::count() const
6031 TemplateVariant DirListContext::at(int index) const
6033 return p->at(index);
6036 TemplateListIntf::ConstIterator *DirListContext::createIterator() const
6038 return p->createIterator();
6042 //------------------------------------------------------------------------
6044 //%% list UsedFiles[File] : list of files
6045 class UsedFilesContext::Private : public GenericNodeListContext
6048 void addFile(FileDef *fd)
6050 append(FileContext::alloc(fd));
6054 UsedFilesContext::UsedFilesContext(ClassDef *cd) : RefCountedContext("UsedFilesContext")
6059 QListIterator<FileDef> li(cd->usedFiles());
6061 for (li.toFirst();(fd=li.current());++li)
6068 UsedFilesContext::~UsedFilesContext()
6074 int UsedFilesContext::count() const
6079 TemplateVariant UsedFilesContext::at(int index) const
6081 return p->at(index);
6084 TemplateListIntf::ConstIterator *UsedFilesContext::createIterator() const
6086 return p->createIterator();
6089 void UsedFilesContext::addFile(FileDef *fd)
6094 //------------------------------------------------------------------------
6096 //%% struct FileTree: tree of directories and files
6098 class FileTreeContext::Private : public PropertyMapper
6104 m_dirFileTree.reset(NestingContext::alloc(0,0));
6105 if (Doxygen::directories)
6107 m_dirFileTree->addDirs(*Doxygen::directories);
6109 if (Doxygen::inputNameList)
6111 m_dirFileTree->addFiles(*Doxygen::inputNameList);
6114 addProperty("tree",this,&Private::tree);
6115 addProperty("fileName",this,&Private::fileName);
6116 addProperty("relPath",this,&Private::relPath);
6117 addProperty("highlight",this,&Private::highlight);
6118 addProperty("subhighlight",this,&Private::subhighlight);
6119 addProperty("title",this,&Private::title);
6120 addProperty("preferredDepth",this,&Private::preferredDepth);
6121 addProperty("maxDepth",this,&Private::maxDepth);
6123 TemplateVariant tree() const
6125 return m_dirFileTree.get();
6127 TemplateVariant fileName() const
6131 TemplateVariant relPath() const
6135 TemplateVariant highlight() const
6139 TemplateVariant subhighlight() const
6143 TemplateVariant title() const
6145 return theTranslator->trFileList();
6147 TemplateVariant maxDepth() const
6149 if (!m_cache.maxDepthComputed)
6151 m_cache.maxDepth = computeMaxDepth(m_dirFileTree.get());
6152 m_cache.maxDepthComputed=TRUE;
6154 return m_cache.maxDepth;
6156 TemplateVariant preferredDepth() const
6158 if (!m_cache.preferredDepthComputed)
6160 m_cache.preferredDepth = computePreferredDepth(m_dirFileTree.get(),maxDepth().toInt());
6161 m_cache.preferredDepthComputed=TRUE;
6163 return m_cache.preferredDepth;
6166 SharedPtr<NestingContext> m_dirFileTree;
6169 Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
6171 bool maxDepthComputed;
6173 bool preferredDepthComputed;
6175 mutable Cachable m_cache;
6179 FileTreeContext::FileTreeContext() : RefCountedContext("FileTreeContext")
6184 FileTreeContext::~FileTreeContext()
6189 TemplateVariant FileTreeContext::get(const char *name) const
6191 return p->get(name);
6194 //------------------------------------------------------------------------
6196 //%% struct PageTree: tree of related pages
6198 class PageTreeContext::Private : public PropertyMapper
6203 m_pageTree.reset(NestingContext::alloc(0,0));
6205 if (Doxygen::pageSDict)
6207 m_pageTree->addPages(*Doxygen::pageSDict,TRUE);
6210 //%% PageNodeList tree:
6211 addProperty("tree",this,&Private::tree);
6212 addProperty("fileName",this,&Private::fileName);
6213 addProperty("relPath",this,&Private::relPath);
6214 addProperty("highlight",this,&Private::highlight);
6215 addProperty("subhighlight",this,&Private::subhighlight);
6216 addProperty("title",this,&Private::title);
6217 addProperty("preferredDepth",this,&Private::preferredDepth);
6218 addProperty("maxDepth",this,&Private::maxDepth);
6220 TemplateVariant tree() const
6222 return m_pageTree.get();
6224 TemplateVariant fileName() const
6228 TemplateVariant relPath() const
6232 TemplateVariant highlight() const
6236 TemplateVariant subhighlight() const
6240 TemplateVariant title() const
6242 return theTranslator->trRelatedPages();
6244 TemplateVariant maxDepth() const
6246 if (!m_cache.maxDepthComputed)
6248 m_cache.maxDepth = computeMaxDepth(m_pageTree.get());
6249 m_cache.maxDepthComputed=TRUE;
6251 return m_cache.maxDepth;
6253 TemplateVariant preferredDepth() const
6255 if (!m_cache.preferredDepthComputed)
6257 m_cache.preferredDepth = computePreferredDepth(m_pageTree.get(),maxDepth().toInt());
6258 m_cache.preferredDepthComputed=TRUE;
6260 return m_cache.preferredDepth;
6263 SharedPtr<NestingContext> m_pageTree;
6266 Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
6268 bool maxDepthComputed;
6270 bool preferredDepthComputed;
6272 mutable Cachable m_cache;
6276 PageTreeContext::PageTreeContext() : RefCountedContext("PageTreeContext")
6281 PageTreeContext::~PageTreeContext()
6286 TemplateVariant PageTreeContext::get(const char *name) const
6288 return p->get(name);
6291 //------------------------------------------------------------------------
6293 //%% list PageList[Page]: list of pages
6294 class PageListContext::Private : public GenericNodeListContext
6297 void addPages(const PageSDict &pages)
6299 PageSDict::Iterator pdi(pages);
6301 for (pdi.toFirst();(pd=pdi.current());++pdi)
6303 if (!pd->getGroupDef() && !pd->isReference())
6305 append(PageContext::alloc(pd));
6311 PageListContext::PageListContext(const PageSDict *pages) : RefCountedContext("PageListContext")
6314 if (pages) p->addPages(*pages);
6317 PageListContext::~PageListContext()
6323 int PageListContext::count() const
6328 TemplateVariant PageListContext::at(int index) const
6330 return p->at(index);
6333 TemplateListIntf::ConstIterator *PageListContext::createIterator() const
6335 return p->createIterator();
6338 //------------------------------------------------------------------------
6340 //%% list ModuleList[ModuleNode]: list of directories and/or files
6341 class ModuleListContext::Private : public GenericNodeListContext
6346 GroupSDict::Iterator gli(*Doxygen::groupSDict);
6348 for (gli.toFirst();(gd=gli.current());++gli)
6350 if (!gd->isReference())
6352 append(ModuleContext::alloc(gd));
6358 ModuleListContext::ModuleListContext() : RefCountedContext("ModuleListContext")
6364 ModuleListContext::~ModuleListContext()
6370 int ModuleListContext::count() const
6375 TemplateVariant ModuleListContext::at(int index) const
6377 return p->at(index);
6380 TemplateListIntf::ConstIterator *ModuleListContext::createIterator() const
6382 return p->createIterator();
6385 //------------------------------------------------------------------------
6387 //%% struct ModuleTree: tree of modules
6389 class ModuleTreeContext::Private : public PropertyMapper
6394 m_moduleTree.reset(NestingContext::alloc(0,0));
6396 if (Doxygen::groupSDict)
6398 m_moduleTree->addModules(*Doxygen::groupSDict);
6401 //%% ModuleList tree:
6402 addProperty("tree",this,&Private::tree);
6403 addProperty("fileName",this,&Private::fileName);
6404 addProperty("relPath",this,&Private::relPath);
6405 addProperty("highlight",this,&Private::highlight);
6406 addProperty("subhighlight",this,&Private::subhighlight);
6407 addProperty("title",this,&Private::title);
6408 addProperty("preferredDepth",this,&Private::preferredDepth);
6409 addProperty("maxDepth",this,&Private::maxDepth);
6411 TemplateVariant tree() const
6413 return m_moduleTree.get();
6415 TemplateVariant fileName() const
6419 TemplateVariant relPath() const
6423 TemplateVariant highlight() const
6427 TemplateVariant subhighlight() const
6431 TemplateVariant title() const
6433 return theTranslator->trModules();
6435 TemplateVariant maxDepth() const
6437 if (!m_cache.maxDepthComputed)
6439 m_cache.maxDepth = computeMaxDepth(m_moduleTree.get());
6440 m_cache.maxDepthComputed=TRUE;
6442 return m_cache.maxDepth;
6444 TemplateVariant preferredDepth() const
6446 if (!m_cache.preferredDepthComputed)
6448 m_cache.preferredDepth = computePreferredDepth(m_moduleTree.get(),maxDepth().toInt());
6449 m_cache.preferredDepthComputed=TRUE;
6451 return m_cache.preferredDepth;
6454 SharedPtr<NestingContext> m_moduleTree;
6457 Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {}
6459 bool maxDepthComputed;
6461 bool preferredDepthComputed;
6463 mutable Cachable m_cache;
6467 ModuleTreeContext::ModuleTreeContext() : RefCountedContext("ModuleTreeContext")
6472 ModuleTreeContext::~ModuleTreeContext()
6477 TemplateVariant ModuleTreeContext::get(const char *name) const
6479 return p->get(name);
6482 //------------------------------------------------------------------------
6484 //%% struct NavPathElem: list of examples page
6486 class NavPathElemContext::Private : public PropertyMapper
6489 Private(Definition *def) : m_def(def)
6491 addProperty("isLinkable",this,&Private::isLinkable);
6492 addProperty("fileName",this,&Private::fileName);
6493 addProperty("anchor",this,&Private::anchor);
6494 addProperty("text",this,&Private::text);
6496 TemplateVariant isLinkable() const
6498 return m_def->isLinkable();
6500 TemplateVariant anchor() const
6502 return m_def->anchor();
6504 TemplateVariant fileName() const
6506 return m_def->getOutputFileBase();
6508 TemplateVariant text() const
6510 Definition::DefType type = m_def->definitionType();
6511 QCString text = m_def->localName();
6512 if (type==Definition::TypeGroup)
6514 text = ((const GroupDef*)m_def)->groupTitle();
6516 else if (type==Definition::TypePage && !(((const PageDef*)m_def)->title().isEmpty()))
6518 text = ((const PageDef*)m_def)->title();
6520 else if (type==Definition::TypeClass)
6522 if (text.right(2)=="-p")
6524 text = text.left(text.length()-2);
6534 NavPathElemContext::NavPathElemContext(Definition *def) : RefCountedContext("NavPathElemContext")
6536 p = new Private(def);
6539 NavPathElemContext::~NavPathElemContext()
6544 TemplateVariant NavPathElemContext::get(const char *name) const
6546 return p->get(name);
6550 //------------------------------------------------------------------------
6552 //%% struct ExampleList: list of examples page
6554 class ExampleListContext::Private : public PropertyMapper
6557 TemplateVariant items() const
6559 return m_pageList.get();
6561 TemplateVariant fileName() const
6565 TemplateVariant relPath() const
6569 TemplateVariant highlight() const
6573 TemplateVariant subhighlight() const
6577 TemplateVariant title() const
6579 return theTranslator->trExamples();
6583 m_pageList.reset(PageListContext::alloc(Doxygen::exampleSDict));
6585 addProperty("items",this,&Private::items);
6586 addProperty("fileName",this,&Private::fileName);
6587 addProperty("relPath",this,&Private::relPath);
6588 addProperty("highlight",this,&Private::highlight);
6589 addProperty("subhighlight",this,&Private::subhighlight);
6590 addProperty("title",this,&Private::title);
6593 SharedPtr<PageListContext> m_pageList;
6597 ExampleListContext::ExampleListContext() : RefCountedContext("ExampleListContext")
6602 ExampleListContext::~ExampleListContext()
6607 TemplateVariant ExampleListContext::get(const char *name) const
6609 return p->get(name);
6612 //------------------------------------------------------------------------
6614 //%% struct GlobalsIndex: list of examples page
6616 class GlobalsIndexContext::Private : public PropertyMapper
6621 addProperty("all", this,&Private::all);
6622 addProperty("functions", this,&Private::functions);
6623 addProperty("variables", this,&Private::variables);
6624 addProperty("typedefs", this,&Private::typedefs);
6625 addProperty("enums", this,&Private::enums);
6626 addProperty("enumValues", this,&Private::enumValues);
6627 addProperty("macros", this,&Private::macros);
6628 addProperty("properties", this,&Private::properties);
6629 addProperty("events", this,&Private::events);
6630 addProperty("related", this,&Private::related);
6631 addProperty("fileName", this,&Private::fileName);
6632 addProperty("relPath", this,&Private::relPath);
6633 addProperty("highlight", this,&Private::highlight);
6634 addProperty("subhighlight",this,&Private::subhighlight);
6635 addProperty("title", this,&Private::title);
6637 typedef bool (MemberDef::*MemberFunc)() const;
6638 TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const
6642 TemplateList *list = TemplateList::alloc();
6644 MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
6645 for (fnli.toFirst();(mn=fnli.current());++fnli)
6648 MemberNameIterator mni(*mn);
6649 for (mni.toFirst();(md=mni.current());++mni)
6651 FileDef *fd=md->getFileDef();
6652 if (fd && fd->isLinkableInProject() &&
6653 !md->name().isEmpty() && !md->getNamespaceDef() && md->isLinkableInProject())
6655 if (filter==0 || (md->*filter)())
6657 list->append(MemberContext::alloc(md));
6662 listRef.reset(list);
6664 return listRef.get();
6666 TemplateVariant all() const
6668 return getMembersFiltered(m_cache.all,0);
6670 TemplateVariant functions() const
6672 return getMembersFiltered(m_cache.functions,&MemberDef::isFunction);
6674 TemplateVariant variables() const
6676 return getMembersFiltered(m_cache.variables,&MemberDef::isVariable);
6678 TemplateVariant typedefs() const
6680 return getMembersFiltered(m_cache.typedefs,&MemberDef::isTypedef);
6682 TemplateVariant enums() const
6684 return getMembersFiltered(m_cache.enums,&MemberDef::isEnumerate);
6686 TemplateVariant enumValues() const
6688 return getMembersFiltered(m_cache.enumValues,&MemberDef::isEnumValue);
6690 TemplateVariant macros() const
6692 return getMembersFiltered(m_cache.macros,&MemberDef::isDefine);
6694 TemplateVariant properties() const
6698 TemplateVariant events() const
6702 TemplateVariant related() const
6706 TemplateVariant fileName() const
6710 TemplateVariant relPath() const
6714 TemplateVariant highlight() const
6718 TemplateVariant subhighlight() const
6720 return "filemembers";
6722 TemplateVariant title() const
6724 return theTranslator->trFileMembers();
6730 SharedPtr<TemplateList> all;
6731 SharedPtr<TemplateList> functions;
6732 SharedPtr<TemplateList> variables;
6733 SharedPtr<TemplateList> typedefs;
6734 SharedPtr<TemplateList> enums;
6735 SharedPtr<TemplateList> enumValues;
6736 SharedPtr<TemplateList> macros;
6738 mutable Cachable m_cache;
6742 GlobalsIndexContext::GlobalsIndexContext() : RefCountedContext("GlobalsIndexContext")
6747 GlobalsIndexContext::~GlobalsIndexContext()
6752 TemplateVariant GlobalsIndexContext::get(const char *name) const
6754 return p->get(name);
6757 //------------------------------------------------------------------------
6759 //%% struct ClassMembersIndex: list of examples page
6761 class ClassMembersIndexContext::Private : public PropertyMapper
6766 addProperty("all", this,&Private::all);
6767 addProperty("functions", this,&Private::functions);
6768 addProperty("variables", this,&Private::variables);
6769 addProperty("typedefs", this,&Private::typedefs);
6770 addProperty("enums", this,&Private::enums);
6771 addProperty("enumValues", this,&Private::enumValues);
6772 addProperty("macros", this,&Private::macros);
6773 addProperty("properties", this,&Private::properties);
6774 addProperty("events", this,&Private::events);
6775 addProperty("related", this,&Private::related);
6776 addProperty("fileName", this,&Private::fileName);
6777 addProperty("relPath", this,&Private::relPath);
6778 addProperty("highlight", this,&Private::highlight);
6779 addProperty("subhighlight",this,&Private::subhighlight);
6780 addProperty("title", this,&Private::title);
6782 typedef bool (MemberDef::*MemberFunc)() const;
6783 TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const
6787 TemplateList *list = TemplateList::alloc();
6789 MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
6790 for (mnli.toFirst();(mn=mnli.current());++mnli)
6793 MemberNameIterator mni(*mn);
6794 for (mni.toFirst();(md=mni.current());++mni)
6796 ClassDef *cd = md->getClassDef();
6797 if (cd && cd->isLinkableInProject() && cd->templateMaster()==0 &&
6798 md->isLinkableInProject() && !md->name().isEmpty())
6800 if (filter==0 || (md->*filter)())
6802 list->append(MemberContext::alloc(md));
6807 listRef.reset(list);
6809 return listRef.get();
6811 TemplateVariant all() const
6813 return getMembersFiltered(m_cache.all,&MemberDef::isNotFriend);
6815 TemplateVariant functions() const
6817 return getMembersFiltered(m_cache.functions,&MemberDef::isFunctionOrSignalSlot);
6819 TemplateVariant variables() const
6821 return getMembersFiltered(m_cache.variables,&MemberDef::isVariable);
6823 TemplateVariant typedefs() const
6825 return getMembersFiltered(m_cache.typedefs,&MemberDef::isTypedef);
6827 TemplateVariant enums() const
6829 return getMembersFiltered(m_cache.enums,&MemberDef::isEnumerate);
6831 TemplateVariant enumValues() const
6833 return getMembersFiltered(m_cache.enumValues,&MemberDef::isEnumValue);
6835 TemplateVariant macros() const
6839 TemplateVariant properties() const
6841 return getMembersFiltered(m_cache.properties,&MemberDef::isProperty);
6843 TemplateVariant events() const
6845 return getMembersFiltered(m_cache.events,&MemberDef::isEvent);
6847 TemplateVariant related() const
6849 return getMembersFiltered(m_cache.related,&MemberDef::isRelated);
6851 TemplateVariant fileName() const
6855 TemplateVariant relPath() const
6859 TemplateVariant highlight() const
6863 TemplateVariant subhighlight() const
6865 return "classmembers";
6867 TemplateVariant title() const
6869 return theTranslator->trCompoundMembers();
6875 SharedPtr<TemplateList> all;
6876 SharedPtr<TemplateList> functions;
6877 SharedPtr<TemplateList> variables;
6878 SharedPtr<TemplateList> typedefs;
6879 SharedPtr<TemplateList> enums;
6880 SharedPtr<TemplateList> enumValues;
6881 SharedPtr<TemplateList> properties;
6882 SharedPtr<TemplateList> events;
6883 SharedPtr<TemplateList> related;
6885 mutable Cachable m_cache;
6889 ClassMembersIndexContext::ClassMembersIndexContext() : RefCountedContext("ClassMembersIndexContext")
6894 ClassMembersIndexContext::~ClassMembersIndexContext()
6899 TemplateVariant ClassMembersIndexContext::get(const char *name) const
6901 return p->get(name);
6904 //------------------------------------------------------------------------
6906 //%% struct NamespaceMembersIndex: list of examples page
6908 class NamespaceMembersIndexContext::Private : public PropertyMapper
6913 addProperty("all", this,&Private::all);
6914 addProperty("functions", this,&Private::functions);
6915 addProperty("variables", this,&Private::variables);
6916 addProperty("typedefs", this,&Private::typedefs);
6917 addProperty("enums", this,&Private::enums);
6918 addProperty("enumValues", this,&Private::enumValues);
6919 addProperty("macros", this,&Private::macros);
6920 addProperty("properties", this,&Private::properties);
6921 addProperty("events", this,&Private::events);
6922 addProperty("related", this,&Private::related);
6923 addProperty("fileName", this,&Private::fileName);
6924 addProperty("relPath", this,&Private::relPath);
6925 addProperty("highlight", this,&Private::highlight);
6926 addProperty("subhighlight",this,&Private::subhighlight);
6927 addProperty("title", this,&Private::title);
6929 typedef bool (MemberDef::*MemberFunc)() const;
6930 TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const
6934 TemplateList *list = TemplateList::alloc();
6936 MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
6937 for (fnli.toFirst();(mn=fnli.current());++fnli)
6940 MemberNameIterator mni(*mn);
6941 for (mni.toFirst();(md=mni.current());++mni)
6943 NamespaceDef *nd=md->getNamespaceDef();
6944 if (nd && nd->isLinkableInProject() &&
6945 !md->name().isEmpty() && md->isLinkableInProject())
6947 if (filter==0 || (md->*filter)())
6949 list->append(MemberContext::alloc(md));
6954 listRef.reset(list);
6956 return listRef.get();
6958 TemplateVariant all() const
6960 return getMembersFiltered(m_cache.all,0);
6962 TemplateVariant functions() const
6964 return getMembersFiltered(m_cache.functions,&MemberDef::isFunction);
6966 TemplateVariant variables() const
6968 return getMembersFiltered(m_cache.variables,&MemberDef::isVariable);
6970 TemplateVariant typedefs() const
6972 return getMembersFiltered(m_cache.typedefs,&MemberDef::isTypedef);
6974 TemplateVariant enums() const
6976 return getMembersFiltered(m_cache.enums,&MemberDef::isEnumerate);
6978 TemplateVariant enumValues() const
6980 return getMembersFiltered(m_cache.enumValues,&MemberDef::isEnumValue);
6982 TemplateVariant macros() const
6986 TemplateVariant properties() const
6990 TemplateVariant events() const
6994 TemplateVariant related() const
6998 TemplateVariant fileName() const
7000 return "namespacemembers";
7002 TemplateVariant relPath() const
7006 TemplateVariant highlight() const
7008 return "namespaces";
7010 TemplateVariant subhighlight() const
7012 return "namespacemembers";
7014 TemplateVariant title() const
7016 return theTranslator->trNamespaceMembers();
7022 SharedPtr<TemplateList> all;
7023 SharedPtr<TemplateList> functions;
7024 SharedPtr<TemplateList> variables;
7025 SharedPtr<TemplateList> typedefs;
7026 SharedPtr<TemplateList> enums;
7027 SharedPtr<TemplateList> enumValues;
7029 mutable Cachable m_cache;
7033 NamespaceMembersIndexContext::NamespaceMembersIndexContext() : RefCountedContext("NamespaceMembersIndexContext")
7038 NamespaceMembersIndexContext::~NamespaceMembersIndexContext()
7043 TemplateVariant NamespaceMembersIndexContext::get(const char *name) const
7045 return p->get(name);
7049 //------------------------------------------------------------------------
7051 //%% struct InheritanceNode: a class in the inheritance list
7053 class InheritanceNodeContext::Private : public PropertyMapper
7056 Private(ClassDef *cd,const QCString &name) : m_classDef(cd), m_name(name)
7058 addProperty("class",this,&Private::getClass);
7059 addProperty("name",this,&Private::name);
7061 TemplateVariant getClass() const
7063 if (!m_classContext)
7065 m_classContext.reset(ClassContext::alloc(m_classDef));
7067 return m_classContext.get();
7069 TemplateVariant name() const
7074 ClassDef *m_classDef;
7075 mutable SharedPtr<ClassContext> m_classContext;
7080 InheritanceNodeContext::InheritanceNodeContext(ClassDef *cd,const QCString &name) : RefCountedContext("InheritanceNodeContext")
7082 p = new Private(cd,name);
7085 InheritanceNodeContext::~InheritanceNodeContext()
7090 TemplateVariant InheritanceNodeContext::get(const char *name) const
7092 return p->get(name);
7095 //------------------------------------------------------------------------
7097 //%% list InheritanceList[InheritanceNode] : list of inherited classes
7098 class InheritanceListContext::Private : public GenericNodeListContext
7101 void addClass(ClassDef *cd,const QCString &name)
7103 append(InheritanceNodeContext::alloc(cd,name));
7107 InheritanceListContext::InheritanceListContext(const BaseClassList *list, bool baseClasses) : RefCountedContext("InheritanceListContext")
7112 BaseClassListIterator li(*list);
7114 for (li.toFirst();(bcd=li.current());++li)
7116 ClassDef *cd=bcd->classDef;
7120 name = insertTemplateSpecifierInScope(
7121 cd->displayName(),bcd->templSpecifiers);
7125 name = cd->displayName();
7127 //printf("InheritanceListContext: adding %s baseClass=%d\n",name.data(),baseClasses);
7128 p->addClass(cd,name);
7133 InheritanceListContext::~InheritanceListContext()
7139 int InheritanceListContext::count() const
7144 TemplateVariant InheritanceListContext::at(int index) const
7146 return p->at(index);
7149 TemplateListIntf::ConstIterator *InheritanceListContext::createIterator() const
7151 return p->createIterator();
7154 //------------------------------------------------------------------------
7156 //%% list MemberList[Member] : list of inherited classes
7157 class MemberListContext::Private : public GenericNodeListContext
7160 void addMember(MemberDef *md)
7162 append(MemberContext::alloc(md));
7166 MemberListContext::MemberListContext() : RefCountedContext("MemberListContext")
7171 MemberListContext::MemberListContext(const MemberList *list) : RefCountedContext("MemberListContext")
7176 bool details = list->listType()&MemberListType_detailedLists;
7177 MemberListIterator mli(*list);
7179 for (mli.toFirst();(md=mli.current());++mli)
7181 if ((md->isBriefSectionVisible() && !details) ||
7182 (md->isDetailedSectionLinkable() && details)
7191 MemberListContext::MemberListContext(MemberSDict *list,bool doSort) : RefCountedContext("MemberListContext")
7200 MemberSDict::Iterator it(*list);
7202 for (it.toFirst();(md=it.current());++it)
7209 MemberListContext::~MemberListContext()
7215 int MemberListContext::count() const
7220 TemplateVariant MemberListContext::at(int index) const
7222 return p->at(index);
7225 TemplateListIntf::ConstIterator *MemberListContext::createIterator() const
7227 return p->createIterator();
7230 //------------------------------------------------------------------------
7232 //%% struct MemberInfo: member information
7234 class MemberInfoContext::Private : public PropertyMapper
7237 Private(const MemberInfo *mi) : m_memberInfo(mi)
7239 //%% string protection
7240 addProperty("protection",this,&Private::protection);
7241 //%% string virtualness
7242 addProperty("virtualness",this,&Private::virtualness);
7243 //%% string ambiguityScope
7244 addProperty("ambiguityScope",this,&Private::ambiguityScope);
7246 addProperty("member",this,&Private::member);
7248 TemplateVariant protection() const
7250 switch (m_memberInfo->prot)
7252 case ::Public: return "public";
7253 case ::Protected: return "protected";
7254 case ::Private: return "private";
7255 case ::Package: return "package";
7259 TemplateVariant virtualness() const
7261 switch (m_memberInfo->virt)
7263 case ::Normal: return "normal";
7264 case ::Virtual: return "virtual";
7265 case ::Pure: return "pure";
7269 TemplateVariant ambiguityScope() const
7271 return m_memberInfo->ambiguityResolutionScope;
7273 TemplateVariant member() const
7275 if (!m_member && m_memberInfo->memberDef)
7277 m_member.reset(MemberContext::alloc(m_memberInfo->memberDef));
7281 return m_member.get();
7285 return TemplateVariant(FALSE);
7289 const MemberInfo *m_memberInfo;
7290 mutable SharedPtr<MemberContext> m_member;
7294 MemberInfoContext::MemberInfoContext(const MemberInfo *mi) : RefCountedContext("MemberInfoContext")
7296 p = new Private(mi);
7299 MemberInfoContext::~MemberInfoContext()
7304 TemplateVariant MemberInfoContext::get(const char *name) const
7306 return p->get(name);
7310 //------------------------------------------------------------------------
7312 //%% list AllMembersList[MemberList] : list of inherited classes
7313 class AllMembersListContext::Private : public GenericNodeListContext
7316 Private(const MemberNameInfoSDict *ml)
7320 static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
7321 MemberNameInfoSDict::Iterator mnii(*ml);
7322 MemberNameInfo *mni;
7323 for (mnii.toFirst();(mni=mnii.current());++mnii)
7325 MemberNameInfoIterator mnii2(*mni);
7327 for (mnii2.toFirst();(mi=mnii2.current());++mnii2)
7329 MemberDef *md=mi->memberDef;
7330 ClassDef *cd=md->getClassDef();
7331 if (cd && !md->name().isEmpty() && md->name()[0]!='@')
7333 if ((cd->isLinkable() && md->isLinkable()) ||
7334 (!cd->isArtificial() && !hideUndocMembers &&
7335 (protectionLevelVisible(md->protection()) || md->isFriend())
7339 append(MemberInfoContext::alloc(mi));
7348 AllMembersListContext::AllMembersListContext() : RefCountedContext("AllMembersListContext")
7353 AllMembersListContext::AllMembersListContext(const MemberNameInfoSDict *ml) : RefCountedContext("AllMembersListContext")
7355 p = new Private(ml);
7358 AllMembersListContext::~AllMembersListContext()
7364 int AllMembersListContext::count() const
7369 TemplateVariant AllMembersListContext::at(int index) const
7371 return p->at(index);
7374 TemplateListIntf::ConstIterator *AllMembersListContext::createIterator() const
7376 return p->createIterator();
7379 //------------------------------------------------------------------------
7381 //%% struct MemberGroupInfo: member group information
7383 class MemberGroupInfoContext::Private : public PropertyMapper
7386 Private(Definition *def,const QCString &relPath,const MemberGroup *mg) :
7391 addProperty("members", this,&Private::members);
7392 addProperty("title", this,&Private::groupTitle);
7393 addProperty("subtitle", this,&Private::groupSubtitle);
7394 addProperty("anchor", this,&Private::groupAnchor);
7395 addProperty("memberGroups", this,&Private::memberGroups);
7396 addProperty("docs", this,&Private::docs);
7397 addProperty("inherited", this,&Private::inherited);
7399 TemplateVariant members() const
7401 if (!m_cache.memberListContext)
7403 m_cache.memberListContext.reset(MemberListContext::alloc(m_memberGroup->members()));
7405 return m_cache.memberListContext.get();
7407 TemplateVariant groupTitle() const
7409 return m_memberGroup->header();
7411 TemplateVariant groupSubtitle() const
7415 TemplateVariant groupAnchor() const
7417 return m_memberGroup->anchor();
7419 TemplateVariant memberGroups() const
7421 if (!m_cache.memberGroups)
7423 m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_def,m_relPath,0));
7425 return m_cache.memberGroups.get();
7427 TemplateVariant docs() const
7431 QCString docs = m_memberGroup->documentation();
7432 if (!docs.isEmpty())
7434 m_cache.docs.reset(new TemplateVariant(
7435 parseDoc(m_def,"[@name docs]",-1, // TODO store file & line
7437 m_memberGroup->documentation()+"\n",FALSE)));
7441 m_cache.docs.reset(new TemplateVariant(""));
7444 return *m_cache.docs;
7446 TemplateVariant inherited() const
7453 const MemberGroup *m_memberGroup;
7456 SharedPtr<MemberListContext> memberListContext;
7457 SharedPtr<MemberGroupListContext> memberGroups;
7458 ScopedPtr<TemplateVariant> docs;
7460 mutable Cachable m_cache;
7464 MemberGroupInfoContext::MemberGroupInfoContext(Definition *def,
7465 const QCString &relPath,const MemberGroup *mg) : RefCountedContext("MemberGroupInfoContext")
7467 p = new Private(def,relPath,mg);
7470 MemberGroupInfoContext::~MemberGroupInfoContext()
7475 TemplateVariant MemberGroupInfoContext::get(const char *name) const
7477 return p->get(name);
7480 //------------------------------------------------------------------------
7482 //%% list MemberGroupList[MemberGroupInfo] : list of member groups
7483 class MemberGroupListContext::Private : public GenericNodeListContext
7486 void addMemberGroup(Definition *def,const QCString &relPath,const MemberGroup *mg)
7488 append(MemberGroupInfoContext::alloc(def,relPath,mg));
7492 MemberGroupListContext::MemberGroupListContext() : RefCountedContext("MemberGroupListContext")
7497 MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupList *list) : RefCountedContext("MemberGroupListContext")
7502 MemberGroupListIterator mgli(*list);
7504 for (;(mg=mgli.current());++mgli)
7506 p->addMemberGroup(def,relPath,mg);
7511 MemberGroupListContext::MemberGroupListContext(Definition *def,const QCString &relPath,const MemberGroupSDict *dict,bool subGrouping) : RefCountedContext("MemberGroupListContext")
7516 MemberGroupSDict::Iterator di(*dict);
7517 const MemberGroup *mg;
7518 for (di.toFirst();(mg=di.current());++di)
7520 if (!mg->allMembersInSameSection() || !subGrouping)
7522 p->addMemberGroup(def,relPath,mg);
7528 MemberGroupListContext::~MemberGroupListContext()
7534 int MemberGroupListContext::count() const
7539 TemplateVariant MemberGroupListContext::at(int index) const
7541 return p->at(index);
7544 TemplateListIntf::ConstIterator *MemberGroupListContext::createIterator() const
7546 return p->createIterator();
7550 //------------------------------------------------------------------------
7552 //%% struct MemberListInfo: member list information
7554 class MemberListInfoContext::Private : public PropertyMapper
7557 Private(Definition *def,const QCString &relPath,const MemberList *ml,const QCString &title,const QCString &subtitle) :
7562 m_subtitle(subtitle)
7564 addProperty("members", this,&Private::members);
7565 addProperty("title", this,&Private::title);
7566 addProperty("subtitle", this,&Private::subtitle);
7567 addProperty("anchor", this,&Private::anchor);
7568 addProperty("memberGroups", this,&Private::memberGroups);
7569 addProperty("inherited", this,&Private::inherited);
7571 TemplateVariant members() const
7573 if (!m_cache.memberListContext)
7575 m_cache.memberListContext.reset(MemberListContext::alloc(m_memberList));
7577 return m_cache.memberListContext.get();
7579 TemplateVariant title() const
7583 TemplateVariant subtitle() const
7587 TemplateVariant anchor() const
7589 return MemberList::listTypeAsString(m_memberList->listType());
7591 TemplateVariant memberGroups() const
7593 if (!m_cache.memberGroups)
7595 m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_def,m_relPath,m_memberList->getMemberGroupList()));
7597 return m_cache.memberGroups.get();
7599 TemplateVariant inherited() const
7601 if (!m_cache.inherited && (m_memberList->listType()&MemberListType_detailedLists)==0 &&
7602 m_def->definitionType()==Definition::TypeClass)
7604 InheritedMemberInfoListContext *ctx = InheritedMemberInfoListContext::alloc();
7605 ctx->addMemberList((ClassDef*)m_def,m_memberList->listType(),m_title,FALSE);
7606 m_cache.inherited.reset(ctx);
7608 if (m_cache.inherited)
7610 return m_cache.inherited.get();
7614 return TemplateVariant(FALSE);
7619 const MemberList *m_memberList;
7622 QCString m_subtitle;
7625 SharedPtr<MemberListContext> memberListContext;
7626 SharedPtr<MemberGroupListContext> memberGroups;
7627 SharedPtr<InheritedMemberInfoListContext> inherited;
7629 mutable Cachable m_cache;
7633 MemberListInfoContext::MemberListInfoContext(
7634 Definition *def,const QCString &relPath,const MemberList *ml,
7635 const QCString &title,const QCString &subtitle) : RefCountedContext("MemberListInfoContext")
7637 p = new Private(def,relPath,ml,title,subtitle);
7640 MemberListInfoContext::~MemberListInfoContext()
7645 TemplateVariant MemberListInfoContext::get(const char *name) const
7647 return p->get(name);
7650 //------------------------------------------------------------------------
7652 //%% struct InheritedMemberInfo: inherited member information
7654 class InheritedMemberInfoContext::Private : public PropertyMapper
7657 Private(ClassDef *cd,MemberList *ml,const QCString &title)
7658 : m_class(cd), m_memberList(ml), m_title(title)
7660 addProperty("class", this,&Private::getClass);
7661 addProperty("title", this,&Private::title);
7662 addProperty("members", this,&Private::members);
7663 addProperty("id", this,&Private::id);
7664 addProperty("inheritedFrom", this,&Private::inheritedFrom);
7668 delete m_memberList;
7670 TemplateVariant getClass() const
7674 m_classCtx.reset(ClassContext::alloc(m_class));
7676 return m_classCtx.get();
7678 TemplateVariant title() const
7682 TemplateVariant members() const
7684 if (!m_memberListCtx)
7686 m_memberListCtx.reset(MemberListContext::alloc(m_memberList));
7688 return m_memberListCtx.get();
7690 TemplateVariant id() const
7692 return substitute(MemberList::listTypeAsString(m_memberList->listType()),"-","_")+"_"+
7693 stripPath(m_class->getOutputFileBase());
7695 TemplateVariant inheritedFrom() const
7697 if (!m_inheritedFrom)
7699 m_inheritedFrom.reset(TemplateList::alloc());
7700 m_inheritedFrom->append(title());
7701 m_inheritedFrom->append(getClass());
7703 return m_inheritedFrom.get();
7708 MemberList *m_memberList;
7710 mutable SharedPtr<ClassContext> m_classCtx;
7711 mutable SharedPtr<MemberListContext> m_memberListCtx;
7712 mutable SharedPtr<TemplateList> m_inheritedFrom;
7716 InheritedMemberInfoContext::InheritedMemberInfoContext(ClassDef *cd,MemberList *ml,
7717 const QCString &title) : RefCountedContext("InheritedMemberInfoContext")
7719 p = new Private(cd,ml,title);
7722 InheritedMemberInfoContext::~InheritedMemberInfoContext()
7727 TemplateVariant InheritedMemberInfoContext::get(const char *name) const
7729 return p->get(name);
7732 //------------------------------------------------------------------------
7734 //%% list InheritedMemberList[InheritedMemberInfo] : list of inherited classes
7735 class InheritedMemberInfoListContext::Private : public GenericNodeListContext
7738 void addMemberList(ClassDef *inheritedFrom,MemberList *ml,MemberList *combinedList)
7742 MemberListIterator li(*ml);
7744 for (li.toFirst();(md=li.current());++li)
7746 if (md->isBriefSectionVisible() && !md->isReimplementedBy(inheritedFrom))
7748 combinedList->append(md);
7753 void addMemberListIncludingGrouped(ClassDef *inheritedFrom,MemberList *ml,MemberList *combinedList)
7757 addMemberList(inheritedFrom,ml,combinedList);
7758 if (ml->getMemberGroupList())
7760 MemberGroupListIterator mgli(*ml->getMemberGroupList());
7762 for (mgli.toFirst();(mg=mgli.current());++mgli)
7764 addMemberList(inheritedFrom,mg->members(),combinedList);
7769 void addMemberGroupsOfClass(ClassDef *inheritedFrom,
7770 ClassDef *cd,MemberListType lt,MemberList *combinedList)
7772 if (cd->getMemberGroupSDict())
7774 MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
7776 for (;(mg=mgli.current());++mgli)
7778 if (mg->members() && (!mg->allMembersInSameSection() || !cd->subGrouping())) // group is in its own section
7780 MemberListIterator li(*mg->members());
7782 for (li.toFirst();(md=li.current());++li)
7784 if (lt==md->getSectionList(mg->parent())->listType() &&
7785 !md->isReimplementedBy(inheritedFrom) &&
7786 md->isBriefSectionVisible())
7788 combinedList->append(md);
7795 void addInheritedMembers(ClassDef *inheritedFrom,ClassDef *cd,MemberListType lt,
7796 MemberListType lt1,int lt2,const QCString &title,bool additionalList)
7798 int count = cd->countMembersIncludingGrouped(lt1,inheritedFrom,additionalList);
7799 if (lt2!=-1) count += cd->countMembersIncludingGrouped((MemberListType)lt2,inheritedFrom,additionalList);
7802 MemberList *ml = cd->getMemberList(lt1);
7803 MemberList *ml2 = lt2!=-1 ? cd->getMemberList((MemberListType)lt2) : 0;
7804 MemberList *combinedList = new MemberList(lt);
7805 addMemberListIncludingGrouped(inheritedFrom,ml,combinedList);
7806 addMemberListIncludingGrouped(inheritedFrom,ml2,combinedList);
7807 addMemberGroupsOfClass(inheritedFrom,cd,lt,combinedList);
7808 if (lt2!=-1) addMemberGroupsOfClass(inheritedFrom,cd,(MemberListType)lt2,combinedList);
7809 append(InheritedMemberInfoContext::alloc(cd,combinedList,title));
7812 void findInheritedMembers(ClassDef *inheritedFrom,ClassDef *cd,MemberListType lt,
7813 int lt2, const QCString &title,bool additionalList,
7814 QPtrDict<void> *visitedClasses)
7816 if (cd->baseClasses())
7818 BaseClassListIterator it(*cd->baseClasses());
7820 for (it.toFirst();(ibcd=it.current());++it)
7822 ClassDef *icd=ibcd->classDef;
7823 if (icd->isLinkable())
7826 convertProtectionLevel(lt,ibcd->prot,<1,<3);
7827 if (lt2==-1 && lt3!=-1)
7831 if (visitedClasses->find(icd)==0)
7833 visitedClasses->insert(icd,icd); // guard for multiple virtual inheritance
7836 // add member info for members of cd with list type lt
7837 addInheritedMembers(inheritedFrom,icd,lt,(MemberListType)lt1,lt2,title,additionalList);
7838 // recurse down the inheritance tree
7839 findInheritedMembers(inheritedFrom,icd,(MemberListType)lt1,lt2,title,additionalList,visitedClasses);
7848 InheritedMemberInfoListContext::InheritedMemberInfoListContext() : RefCountedContext("InheritedMemberInfoListContext")
7853 void InheritedMemberInfoListContext::addMemberList(
7854 ClassDef *cd,MemberListType lt,const QCString &title,bool additionalList)
7856 QPtrDict<void> visited(17);
7857 bool memberInSection = cd->countMembersIncludingGrouped(lt,cd,FALSE)>0;
7858 bool show = (additionalList && !memberInSection) || // inherited member to show in the additional inherited members list
7859 (!additionalList && memberInSection); // inherited member to show in a member list of the class
7860 //printf("%s:%s show=%d\n",cd->name().data(),MemberList::listTypeAsString(lt).data(),show);
7863 p->findInheritedMembers(cd,cd,lt,-1,title,additionalList,&visited);
7867 InheritedMemberInfoListContext::~InheritedMemberInfoListContext()
7873 int InheritedMemberInfoListContext::count() const
7878 TemplateVariant InheritedMemberInfoListContext::at(int index) const
7880 return p->at(index);
7883 TemplateListIntf::ConstIterator *InheritedMemberInfoListContext::createIterator() const
7885 return p->createIterator();
7888 //------------------------------------------------------------------------
7890 //%% struct Argument: parameter information
7892 class ArgumentContext::Private : public PropertyMapper
7895 Private(const Argument *arg,Definition *def,const QCString &relPath) :
7896 m_argument(arg), m_def(def), m_relPath(relPath)
7898 addProperty("type", this,&Private::type);
7899 addProperty("name", this,&Private::name);
7900 addProperty("defVal", this,&Private::defVal);
7901 addProperty("docs", this,&Private::docs);
7902 addProperty("attrib", this,&Private::attrib);
7903 addProperty("array", this,&Private::array);
7904 addProperty("namePart", this,&Private::namePart);
7906 TemplateVariant type() const
7908 return createLinkedText(m_def,m_relPath,m_argument->type);
7910 TemplateVariant attrib() const
7912 return m_argument->attrib;
7914 TemplateVariant name() const
7916 return m_argument->name;
7918 TemplateVariant defVal() const
7920 return createLinkedText(m_def,m_relPath,m_argument->defval);
7922 TemplateVariant array() const
7924 return m_argument->array;
7926 TemplateVariant docs() const
7928 if (!m_cache.docs && m_def)
7930 if (!m_argument->docs.isEmpty())
7932 m_cache.docs.reset(new TemplateVariant(
7933 parseDoc(m_def,m_def->docFile(),m_def->docLine(),
7934 m_relPath,m_argument->docs,TRUE)));
7938 m_cache.docs.reset(new TemplateVariant(""));
7941 return *m_cache.docs;
7943 TemplateVariant namePart() const
7945 QCString result = m_argument->attrib;
7946 int l = result.length();
7947 if (l>2 && result.at(0)=='[' && result.at(l-1)==']')
7949 result = result.mid(1,l-2);
7950 if (result!=",") result+=":"; // for normal keywords add colon
7955 const Argument *m_argument;
7960 ScopedPtr<TemplateVariant> docs;
7962 mutable Cachable m_cache;
7966 ArgumentContext::ArgumentContext(const Argument *al,Definition *def,const QCString &relPath) : RefCountedContext("ArgumentContext")
7968 p = new Private(al,def,relPath);
7971 ArgumentContext::~ArgumentContext()
7976 TemplateVariant ArgumentContext::get(const char *name) const
7978 return p->get(name);
7981 //------------------------------------------------------------------------
7983 //%% list ArgumentList[Argument] : list of inherited classes
7984 class ArgumentListContext::Private : public GenericNodeListContext
7987 void addArgument(const Argument *arg,Definition *def,const QCString &relPath)
7989 append(ArgumentContext::alloc(arg,def,relPath));
7993 ArgumentListContext::ArgumentListContext() : RefCountedContext("ArgumentListContext")
7998 ArgumentListContext::ArgumentListContext(const ArgumentList *list,
7999 Definition *def,const QCString &relPath) : RefCountedContext("ArgumentListContext")
8004 ArgumentListIterator ali(*list);
8005 const Argument *arg;
8006 for (ali.toFirst();(arg=ali.current());++ali)
8008 p->addArgument(arg,def,relPath);
8013 ArgumentListContext::~ArgumentListContext()
8019 int ArgumentListContext::count() const
8024 TemplateVariant ArgumentListContext::at(int index) const
8026 return p->at(index);
8029 TemplateListIntf::ConstIterator *ArgumentListContext::createIterator() const
8031 return p->createIterator();
8034 //------------------------------------------------------------------------
8036 class HtmlEscaper : public TemplateEscapeIntf
8039 QCString escape(const QCString &s)
8041 return convertToHtml(s,TRUE);
8045 //------------------------------------------------------------------------
8047 class HtmlSpaceless : public TemplateSpacelessIntf
8050 HtmlSpaceless() { reset(); }
8053 m_insideTag = FALSE;
8054 m_insideString = '\0';
8055 m_removeSpaces = TRUE;
8057 QCString remove(const QCString &s)
8060 const char *p = s.data();
8066 case '<': // start of a tag
8067 if (!m_insideString) m_insideTag=TRUE,m_removeSpaces=FALSE;
8070 case '>': // end of a tag
8071 if (!m_insideString) m_insideTag=FALSE,m_removeSpaces=TRUE;
8074 case '\\': // escaped character in a string
8076 if (m_insideString && *p) result+=*p++;
8078 case '"': case '\'':
8081 if (m_insideString==c) // end of string
8083 m_insideString='\0';
8085 else // start of string
8092 case ' ': case '\t': case '\n': // whitespace
8093 if (!m_insideTag) // outside tags strip consecutive whitespace
8095 m_removeSpaces=TRUE;
8103 //if (m_removeSpaces) result+=' ';
8105 m_removeSpaces=FALSE;
8110 //printf("HtmlSpaceless::remove({%s})={%s} m_insideTag=%d m_insideString=%d removeSpaces=%d\n",s.data(),result.data(),
8111 // m_insideTag,m_insideString,m_removeSpaces);
8112 return result.data();
8116 char m_insideString;
8117 bool m_removeSpaces;
8120 //------------------------------------------------------------------------
8123 int RefCountedContext::s_totalCount;
8126 void generateOutputViaTemplate()
8130 TemplateContext *ctx = e.createContext();
8133 SharedPtr<DoxygenContext> doxygen (DoxygenContext::alloc());
8134 SharedPtr<ConfigContext> config (ConfigContext::alloc());
8135 SharedPtr<TranslateContext> tr (TranslateContext::alloc());
8136 SharedPtr<ClassListContext> classList (ClassListContext::alloc());
8137 SharedPtr<ClassIndexContext> classIndex (ClassIndexContext::alloc());
8138 SharedPtr<ClassTreeContext> classTree (ClassTreeContext::alloc());
8139 SharedPtr<ClassHierarchyContext> classHierarchy (ClassHierarchyContext::alloc());
8140 SharedPtr<NamespaceListContext> namespaceList (NamespaceListContext::alloc());
8141 SharedPtr<NamespaceTreeContext> namespaceTree (NamespaceTreeContext::alloc());
8142 SharedPtr<DirListContext> dirList (DirListContext::alloc());
8143 SharedPtr<FileListContext> fileList (FileListContext::alloc());
8144 SharedPtr<FileTreeContext> fileTree (FileTreeContext::alloc());
8145 SharedPtr<PageTreeContext> pageTree (PageTreeContext::alloc());
8146 SharedPtr<PageListContext> pageList (PageListContext::alloc(Doxygen::pageSDict));
8147 SharedPtr<ExampleListContext> exampleList (ExampleListContext::alloc());
8148 SharedPtr<ModuleTreeContext> moduleTree (ModuleTreeContext::alloc());
8149 SharedPtr<ModuleListContext> moduleList (ModuleListContext::alloc());
8150 SharedPtr<PageContext> mainPage (PageContext::alloc(Doxygen::mainPage,TRUE));
8151 SharedPtr<GlobalsIndexContext> globalsIndex (GlobalsIndexContext::alloc());
8152 SharedPtr<ClassMembersIndexContext> classMembersIndex (ClassMembersIndexContext::alloc());
8153 SharedPtr<NamespaceMembersIndexContext> namespaceMembersIndex(NamespaceMembersIndexContext::alloc());
8155 //%% Doxygen doxygen:
8156 ctx->set("doxygen",doxygen.get());
8158 ctx->set("tr",tr.get());
8160 ctx->set("config",config.get());
8161 //%% ClassList classList:
8162 ctx->set("classList",classList.get()); // not used for standard HTML
8163 //%% ClassTree classTree:
8164 ctx->set("classTree",classTree.get());
8165 //%% ClassIndex classIndex:
8166 ctx->set("classIndex",classIndex.get());
8167 //%% ClassHierarchy classHierarchy:
8168 ctx->set("classHierarchy",classHierarchy.get());
8169 //%% NamespaceList namespaceList:
8170 ctx->set("namespaceList",namespaceList.get());
8171 //%% NamespaceTree namespaceTree:
8172 ctx->set("namespaceTree",namespaceTree.get());
8173 //%% FileList fileList:
8174 ctx->set("fileList",fileList.get());
8175 //%% FileTree fileTree:
8176 ctx->set("fileTree",fileTree.get());
8177 //%% PageList pageList
8178 ctx->set("pageList",pageList.get());
8179 //%% PageTree pageTree
8180 ctx->set("pageTree",pageTree.get());
8181 //%% ExampleList exampleList
8182 ctx->set("exampleList",exampleList.get());
8183 //%% ModuleTree moduleTree
8184 ctx->set("moduleTree",moduleTree.get());
8185 //%% ModuleList moduleList
8186 ctx->set("moduleList",moduleList.get());
8187 //%% DirList dirList
8188 ctx->set("dirList",dirList.get());
8190 ctx->set("mainPage",mainPage.get());
8191 //%% GlobalsIndex globalsIndex:
8192 ctx->set("globalsIndex",globalsIndex.get());
8193 //%% ClassMembersIndex classMembersIndex:
8194 ctx->set("classMembersIndex",classMembersIndex.get());
8195 //%% NamespaceMembersIndex namespaceMembersIndex:
8196 ctx->set("namespaceMembersIndex",namespaceMembersIndex.get());
8198 // render HTML output
8199 Template *tpl = e.loadByName("htmllayout.tpl",1);
8202 g_globals.outputFormat = ContextGlobals::Html;
8203 g_globals.dynSectionId = 0;
8204 g_globals.outputDir = Config_getString("HTML_OUTPUT");
8205 QDir dir(g_globals.outputDir);
8207 HtmlEscaper htmlEsc;
8208 ctx->setEscapeIntf(Config_getString("HTML_FILE_EXTENSION"),&htmlEsc);
8210 ctx->setSpacelessIntf(&spl);
8211 ctx->setOutputDirectory(g_globals.outputDir);
8213 tpl->render(ts,ctx);
8217 // TODO: render other outputs
8219 e.destroyContext(ctx);
8222 #if DEBUG_REF // should be 0, i.e. all objects are deleted
8223 printf("==== total ref count %d\n",RefCountedContext::s_totalCount);