/****************************************************************************** * * * * Copyright (C) 1997-2010 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its * documentation under the terms of the GNU General Public License is hereby * granted. No representations are made about the suitability of this software * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * */ /** @file * @brief This file contains functions for the various index pages. */ #include #include #include #include #include #include "message.h" #include "index.h" #include "doxygen.h" #include "config.h" #include "filedef.h" #include "outputlist.h" #include "util.h" #include "groupdef.h" #include "language.h" #include "htmlgen.h" #include "htmlhelp.h" #include "ftvhelp.h" #include "dot.h" #include "pagedef.h" #include "dirdef.h" #include "vhdldocgen.h" #define MAX_ITEMS_BEFORE_MULTIPAGE_INDEX 200 #define MAX_ITEMS_BEFORE_QUICK_INDEX 30 static const char search_script[]= #include "search_js.h" ; int annotatedClasses; int hierarchyClasses; int documentedFiles; int documentedGroups; int documentedNamespaces; int indexedPages; int documentedClassMembers[CMHL_Total]; int documentedFileMembers[FMHL_Total]; int documentedNamespaceMembers[NMHL_Total]; int documentedHtmlFiles; int documentedPages; int documentedDirs; int countClassHierarchy(); int countClassMembers(int filter=CMHL_All); int countFileMembers(int filter=FMHL_All); void countFiles(int &htmlFiles,int &files); int countGroups(); int countDirs(); int countNamespaces(); int countAnnotatedClasses(); int countNamespaceMembers(int filter=NMHL_All); int countIncludeFiles(); void countRelatedPages(int &docPages,int &indexPages); void countDataStructures() { annotatedClasses = countAnnotatedClasses(); // "classes" + "annotated" hierarchyClasses = countClassHierarchy(); // "hierarchy" countFiles(documentedHtmlFiles,documentedFiles); // "files" countRelatedPages(documentedPages,indexedPages); // "pages" documentedGroups = countGroups(); // "modules" documentedNamespaces = countNamespaces(); // "namespaces" documentedDirs = countDirs(); // "dirs" // "globals" // "namespacemembers" // "functions" } static void startIndexHierarchy(OutputList &ol,int level) { ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Html); if (level<6) ol.startIndexList(); ol.enableAll(); ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::RTF); ol.startItemList(); ol.popGeneratorState(); } static void endIndexHierarchy(OutputList &ol,int level) { ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Html); if (level<6) ol.endIndexList(); ol.enableAll(); ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::RTF); ol.endItemList(); ol.popGeneratorState(); } //---------------------------------------------------------------------------- class MemberIndexList : public QList { public: MemberIndexList() : QList() {} ~MemberIndexList() {} int compareItems(GCI item1, GCI item2) { MemberDef *md1=(MemberDef *)item1; MemberDef *md2=(MemberDef *)item2; return stricmp(md1->name(),md2->name()); } }; #define MEMBER_INDEX_ENTRIES 256 static MemberIndexList g_memberIndexLetterUsed[CMHL_Total][MEMBER_INDEX_ENTRIES]; static MemberIndexList g_fileIndexLetterUsed[FMHL_Total][MEMBER_INDEX_ENTRIES]; static MemberIndexList g_namespaceIndexLetterUsed[NMHL_Total][MEMBER_INDEX_ENTRIES]; static bool g_classIndexLetterUsed[CHL_Total][256]; const int maxItemsBeforeQuickIndex = MAX_ITEMS_BEFORE_QUICK_INDEX; //---------------------------------------------------------------------------- // strips w from s iff s starts with w bool stripWord(QCString &s,QCString w) { bool success=FALSE; if (s.left(w.length())==w) { success=TRUE; s=s.right(s.length()-w.length()); } return success; } //---------------------------------------------------------------------------- // some quasi intelligent brief description abbreviator :^) QCString abbreviate(const char *s,const char *name) { QCString scopelessName=name; int i=scopelessName.findRev("::"); if (i!=-1) scopelessName=scopelessName.mid(i+2); QCString result=s; result=result.stripWhiteSpace(); // strip trailing . if (!result.isEmpty() && result.at(result.length()-1)=='.') result=result.left(result.length()-1); // strip any predefined prefix QStrList &briefDescAbbrev = Config_getList("ABBREVIATE_BRIEF"); const char *p = briefDescAbbrev.first(); while (p) { QCString s = p; s.replace(QRegExp("\\$name"), scopelessName); // replace $name with entity name s += " "; stripWord(result,s); p = briefDescAbbrev.next(); } // capitalize first word if (!result.isEmpty()) { int c=result[0]; if (c>='a' && c<='z') c+='A'-'a'; result[0]=c; } return result; } //---------------------------------------------------------------------------- static void startQuickIndexList(OutputList &ol,bool letterTabs=FALSE) { bool fancyTabs = TRUE; if (fancyTabs) { if (letterTabs) { ol.writeString("
\n"); } else { ol.writeString("
\n"); } ol.writeString("
    \n"); } else { ol.writeString("
    "); } } static void endQuickIndexList(OutputList &ol) { bool fancyTabs = TRUE; if (fancyTabs) { ol.writeString("
\n"); } ol.writeString("
\n"); } static void startQuickIndexItem(OutputList &ol,const char *l, bool hl,bool compact,bool &first) { bool fancyTabs = TRUE; if (!first && compact && !fancyTabs) ol.writeString(" | "); first=FALSE; if (fancyTabs) { ol.writeString(" "); if (hl && compact) { ol.writeString(""); if (fancyTabs) { ol.writeString(""); } } static void endQuickIndexItem(OutputList &ol) { bool fancyTabs=TRUE; if (fancyTabs) ol.writeString(""); ol.writeString(""); if (fancyTabs) ol.writeString("\n"); } static QCString fixSpaces(const QCString &s) { return substitute(s," "," "); } void startTitle(OutputList &ol,const char *fileName,Definition *def) { ol.startHeaderSection(); if (def) def->writeSummaryLinks(ol); ol.startTitleHead(fileName); ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); } void endTitle(OutputList &ol,const char *fileName,const char *name) { ol.popGeneratorState(); ol.endTitleHead(fileName,name); ol.endHeaderSection(); } void startFile(OutputList &ol,const char *name,const char *manName, const char *title,HighlightedItem hli,bool additionalIndices) { ol.startFile(name,manName,title); if (!Config_getBool("DISABLE_INDEX")) { ol.startQuickIndices(); ol.writeQuickLinks(TRUE,hli); if (!additionalIndices) { ol.endQuickIndices(); //ol.startContents(); } } else { if (!additionalIndices) { // ol.startContents(); } } } void endFile(OutputList &ol,bool) { ol.endContents(); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); ol.writeFooter(); // write the footer ol.popGeneratorState(); ol.endFile(); } //---------------------------------------------------------------------------- static bool classHasVisibleChildren(ClassDef *cd) { bool vhdl=Config_getBool("OPTIMIZE_OUTPUT_VHDL"); BaseClassList *bcl; if (vhdl) // reverse baseClass/subClass relation { if (cd->baseClasses()==0) return FALSE; bcl=cd->baseClasses(); } else { if (cd->subClasses()==0) return FALSE; bcl=cd->subClasses(); } BaseClassListIterator bcli(*bcl); for ( ; bcli.current() ; ++bcli) { if (bcli.current()->classDef->isVisibleInHierarchy()) { return TRUE; } } return FALSE; } void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level,FTVHelp* ftv) { static bool vhdl=Config_getBool("OPTIMIZE_OUTPUT_VHDL"); if (bcl==0) return; BaseClassListIterator bcli(*bcl); bool started=FALSE; for ( ; bcli.current() ; ++bcli) { ClassDef *cd=bcli.current()->classDef; bool b; if (vhdl) { b=hasVisibleRoot(cd->subClasses()); } else { b=hasVisibleRoot(cd->baseClasses()); } if (cd->isVisibleInHierarchy() && b) // hasVisibleRoot(cd->baseClasses())) { if (!started) { startIndexHierarchy(ol,level); Doxygen::indexList.incContentsDepth(); if (ftv) ftv->incContentsDepth(); started=TRUE; } ol.startIndexListItem(); //printf("Passed...\n"); bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd); //printf("tree4: Has children %s: %d\n",cd->name().data(),hasChildren); if (cd->isLinkable()) { //printf("Writing class %s\n",cd->displayName().data()); ol.startIndexItem(cd->getReference(),cd->getOutputFileBase()); ol.parseText(cd->displayName()); ol.endIndexItem(cd->getReference(),cd->getOutputFileBase()); if (cd->isReference()) { ol.startTypewriter(); ol.docify(" [external]"); ol.endTypewriter(); } Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),0); if (ftv) ftv->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),0); } else { ol.startIndexItem(0,0); ol.parseText(cd->name()); ol.endIndexItem(0,0); Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),0,0,0); if (ftv) ftv->addContentsItem(hasChildren,cd->displayName(),0,0,0); } if (hasChildren) { //printf("Class %s at %p visited=%d\n",cd->name().data(),cd,cd->visited); bool wasVisited=cd->visited; cd->visited=TRUE; if (vhdl) { writeClassTree(ol,cd->baseClasses(),wasVisited,level+1,ftv); } else { writeClassTree(ol,cd->subClasses(),wasVisited,level+1,ftv); } } ol.endIndexListItem(); } } if (started) { endIndexHierarchy(ol,level); Doxygen::indexList.decContentsDepth(); if (ftv) ftv->decContentsDepth(); } } //---------------------------------------------------------------------------- /*! Generates HTML Help tree of classes */ void writeClassTree(BaseClassList *cl,int level) { if (cl==0) return; BaseClassListIterator cli(*cl); bool started=FALSE; for ( ; cli.current() ; ++cli) { ClassDef *cd=cli.current()->classDef; if (cd->isVisibleInHierarchy() && hasVisibleRoot(cd->baseClasses())) //if (cd->isVisibleInHierarchy() && !cd->visited) { if (!started) { Doxygen::indexList.incContentsDepth(); started=TRUE; } bool hasChildren = !cd->visited && classHasVisibleChildren(cd); //printf("tree2: Has children %s: %d\n",cd->name().data(),hasChildren); if (cd->isLinkable()) { Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),0); } if (hasChildren) { writeClassTree(cd->subClasses(),level+1); } cd->visited=TRUE; } } if (started) { Doxygen::indexList.decContentsDepth(); } } //---------------------------------------------------------------------------- /*! Generates HTML Help tree of classes */ void writeClassTreeNode(ClassDef *cd,bool &started,int level) { //printf("writeClassTreeNode(%s) visited=%d\n",cd->name().data(),cd->visited); static bool vhdl=Config_getBool("OPTIMIZE_OUTPUT_VHDL"); if (cd->isVisibleInHierarchy() && !cd->visited) { if (!started) { started=TRUE; } bool hasChildren = classHasVisibleChildren(cd); //printf("node: Has children %s: %d\n",cd->name().data(),hasChildren); if (cd->isLinkable()) { Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),0); } if (hasChildren) { if (vhdl) { writeClassTree(cd->baseClasses(),level+1); } else { writeClassTree(cd->subClasses(),level+1); } } cd->visited=TRUE; } } void writeClassTree(ClassList *cl,int level) { if (cl==0) return; ClassListIterator cli(*cl); bool started=FALSE; for ( cli.toFirst() ; cli.current() ; ++cli) { cli.current()->visited=FALSE; } for ( cli.toFirst() ; cli.current() ; ++cli) { writeClassTreeNode(cli.current(),started,level); } } void writeClassTree(ClassSDict *d,int level) { if (d==0) return; ClassSDict::Iterator cli(*d); bool started=FALSE; for ( cli.toFirst() ; cli.current() ; ++cli) { cli.current()->visited=FALSE; } for ( cli.toFirst() ; cli.current() ; ++cli) { writeClassTreeNode(cli.current(),started,level); } } //---------------------------------------------------------------------------- static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FTVHelp* ftv) { static bool vhdl=Config_getBool("OPTIMIZE_OUTPUT_VHDL"); ClassSDict::Iterator cli(*cl); for (;cli.current(); ++cli) { ClassDef *cd=cli.current(); //printf("class %s hasVisibleRoot=%d isVisibleInHierarchy=%d\n", // cd->name().data(), // hasVisibleRoot(cd->baseClasses()), // cd->isVisibleInHierarchy() // ); bool b; if (vhdl) { if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS || (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS) { continue; } b=!hasVisibleRoot(cd->subClasses()); } else { b=!hasVisibleRoot(cd->baseClasses()); } if (b) //filter on root classes { if (cd->isVisibleInHierarchy()) // should it be visible { if (!started) { startIndexHierarchy(ol,0); Doxygen::indexList.incContentsDepth(); started=TRUE; } ol.startIndexListItem(); bool hasChildren = !cd->visited && classHasVisibleChildren(cd); //printf("list: Has children %s: %d\n",cd->name().data(),hasChildren); if (cd->isLinkable()) { //printf("Writing class %s isLinkable()=%d isLinkableInProject()=%d cd->templateMaster()=%p\n", // cd->displayName().data(),cd->isLinkable(),cd->isLinkableInProject(),cd->templateMaster()); ol.startIndexItem(cd->getReference(),cd->getOutputFileBase()); ol.parseText(cd->displayName()); ol.endIndexItem(cd->getReference(),cd->getOutputFileBase()); if (cd->isReference()) { ol.startTypewriter(); ol.docify(" [external]"); ol.endTypewriter(); } Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),0); if (ftv) ftv->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),0); } else { ol.startIndexItem(0,0); ol.parseText(cd->displayName()); ol.endIndexItem(0,0); Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),0,0,0); if (ftv) ftv->addContentsItem(hasChildren,cd->displayName(),0,0,0); } if (vhdl && hasChildren) { writeClassTree(ol,cd->baseClasses(),cd->visited,1,ftv); cd->visited=TRUE; } else if (hasChildren) { writeClassTree(ol,cd->subClasses(),cd->visited,1,ftv); cd->visited=TRUE; } ol.endIndexListItem(); } } } } void writeClassHierarchy(OutputList &ol, FTVHelp* ftv) { initClassHierarchy(Doxygen::classSDict); initClassHierarchy(Doxygen::hiddenClasses); if (ftv) { ol.pushGeneratorState(); ol.disable(OutputGenerator::Html); } bool started=FALSE; writeClassTreeForList(ol,Doxygen::classSDict,started,ftv); writeClassTreeForList(ol,Doxygen::hiddenClasses,started,ftv); if (started) { endIndexHierarchy(ol,0); Doxygen::indexList.decContentsDepth(); } if (ftv) ol.popGeneratorState(); } //---------------------------------------------------------------------------- static int countClassesInTreeList(const ClassSDict &cl) { int count=0; ClassSDict::Iterator cli(cl); for (;cli.current(); ++cli) { ClassDef *cd=cli.current(); if (!hasVisibleRoot(cd->baseClasses())) // filter on root classes { if (cd->isVisibleInHierarchy()) // should it be visible { if (cd->subClasses()) // should have sub classes { count++; } } } } return count; } int countClassHierarchy() { int count=0; initClassHierarchy(Doxygen::classSDict); initClassHierarchy(Doxygen::hiddenClasses); count+=countClassesInTreeList(*Doxygen::classSDict); count+=countClassesInTreeList(*Doxygen::hiddenClasses); return count; } //---------------------------------------------------------------------------- void writeHierarchicalIndex(OutputList &ol) { bool vhdlOpt=Config_getBool("OPTIMIZE_OUTPUT_VHDL"); if (hierarchyClasses==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); startFile(ol,"hierarchy",0, theTranslator->trHierarchicalIndex().data(), HLI_Hierarchy); startTitle(ol,0); QCString title = theTranslator->trClassHierarchy(); if (vhdlOpt) title = VhdlDocGen::trDesignUnitHierarchy(); //if (!Config_getString("PROJECT_NAME").isEmpty()) //{ // title.prepend(Config_getString("PROJECT_NAME")+" "); //} ol.parseText(title); endTitle(ol,0,0); ol.startContents(); ol.startTextBlock(); Doxygen::indexList.addContentsItem(TRUE,title,0,"hierarchy",0); if (Config_getBool("HAVE_DOT") && Config_getBool("GRAPHICAL_HIERARCHY")) { ol.disable(OutputGenerator::Latex); ol.disable(OutputGenerator::RTF); ol.startParagraph(); ol.startTextLink("inherits",0); ol.parseText(theTranslator->trGotoGraphicalHierarchy()); ol.endTextLink(); ol.endParagraph(); ol.enable(OutputGenerator::Latex); ol.enable(OutputGenerator::RTF); } ol.parseText(theTranslator->trClassHierarchyDescription()); ol.endTextBlock(); FTVHelp* ftv = 0; bool treeView=Config_getBool("USE_INLINE_TREES"); if (treeView) { ftv = new FTVHelp(FALSE); } writeClassHierarchy(ol,ftv); if (ftv) { QGString outStr; FTextStream t(&outStr); ftv->generateTreeViewInline(t); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); ol.writeString(outStr); ol.popGeneratorState(); delete ftv; } endFile(ol); ol.popGeneratorState(); } //---------------------------------------------------------------------------- void writeGraphicalClassHierarchy(OutputList &ol) { if (hierarchyClasses==0) return; ol.disableAllBut(OutputGenerator::Html); QCString title = theTranslator->trGraphicalHierarchy(); startFile(ol,"inherits",0,title.data(),HLI_Hierarchy); startTitle(ol,0); //if (!Config_getString("PROJECT_NAME").isEmpty()) //{ // title.prepend(Config_getString("PROJECT_NAME")+" "); //} ol.parseText(title); endTitle(ol,0,0); ol.startContents(); ol.startTextBlock(); Doxygen::indexList.addContentsItem(FALSE,theTranslator->trGraphicalHierarchy(),0,"inherits",0); ol.startParagraph(); ol.startTextLink("hierarchy",0); ol.parseText(theTranslator->trGotoTextualHierarchy()); ol.endTextLink(); ol.endParagraph(); //parseText(ol,theTranslator->trClassHierarchyDescription()); //ol.newParagraph(); ol.endTextBlock(); DotGfxHierarchyTable g; ol.writeGraphicalHierarchy(g); endFile(ol); ol.enableAll(); } //---------------------------------------------------------------------------- void countFiles(int &htmlFiles,int &files) { htmlFiles=0; files=0; FileNameListIterator fnli(*Doxygen::inputNameList); FileName *fn; for (;(fn=fnli.current());++fnli) { FileNameIterator fni(*fn); FileDef *fd; for (;(fd=fni.current());++fni) { bool doc = fd->isLinkableInProject(); bool src = fd->generateSourceFile(); bool nameOk = !fd->isDocumentationFile(); if (nameOk) { if (doc || src) { htmlFiles++; } if (doc) { files++; } } } } } //---------------------------------------------------------------------------- void writeFileIndex(OutputList &ol) { if (documentedHtmlFiles==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); if (documentedFiles==0) ol.disableAllBut(OutputGenerator::Html); startFile(ol,"files",0,theTranslator->trFileIndex().data(),HLI_Files); startTitle(ol,0); QCString title = theTranslator->trFileList(); //if (!Config_getString("PROJECT_NAME").isEmpty()) //{ // title.prepend(Config_getString("PROJECT_NAME")+" "); //} ol.parseText(title); endTitle(ol,0,0); ol.startContents(); ol.startTextBlock(); Doxygen::indexList.addContentsItem(TRUE,theTranslator->trFileList(),0,"files",0); Doxygen::indexList.incContentsDepth(); ol.parseText(theTranslator->trFileListDescription(Config_getBool("EXTRACT_ALL"))); ol.endTextBlock(); OutputNameDict outputNameDict(1009); OutputNameList outputNameList; outputNameList.setAutoDelete(TRUE); if (Config_getBool("FULL_PATH_NAMES")) { // re-sort input files in (dir,file) output order instead of (file,dir) input order FileName *fn=Doxygen::inputNameList->first(); while (fn) { FileDef *fd=fn->first(); while (fd) { QCString path=fd->getPath(); if (path.isEmpty()) path="[external]"; FileList *fl = outputNameDict.find(path); if (fl) { fl->inSort(fd); //printf("+ inserting %s---%s\n",fd->getPath().data(),fd->name().data()); } else { //printf("o inserting %s---%s\n",fd->getPath().data(),fd->name().data()); fl = new FileList(path); fl->inSort(fd); outputNameList.inSort(fl); outputNameDict.insert(path,fl); } fd=fn->next(); } fn=Doxygen::inputNameList->next(); } } ol.startIndexList(); FileList *fl=0; if (Config_getBool("FULL_PATH_NAMES")) { fl = outputNameList.first(); } else { fl = Doxygen::inputNameList->first(); } while (fl) { FileDef *fd=fl->first(); while (fd) { //printf("Found filedef %s\n",fd->name().data()); bool doc = fd->isLinkableInProject(); bool src = fd->generateSourceFile(); bool nameOk = !fd->isDocumentationFile(); if (nameOk && (doc || src) && !fd->isReference()) { QCString path; if (Config_getBool("FULL_PATH_NAMES")) { path=stripFromPath(fd->getPath().copy()); } QCString fullName=fd->name(); if (!path.isEmpty()) { if (path.at(path.length()-1)!='/') fullName.prepend("/"); fullName.prepend(path); } ol.startIndexKey(); ol.docify(path); if (doc) { ol.writeObjectLink(0,fd->getOutputFileBase(),0,fd->name()); Doxygen::indexList.addContentsItem(FALSE,fullName,fd->getReference(),fd->getOutputFileBase(),0); } else { ol.startBold(); ol.docify(fd->name()); ol.endBold(); Doxygen::indexList.addContentsItem(FALSE,fullName,0,0,0); } if (src) { ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); ol.docify(" "); ol.startTextLink(fd->includeName(),0); ol.docify("["); ol.parseText(theTranslator->trCode()); ol.docify("]"); ol.endTextLink(); ol.popGeneratorState(); } ol.endIndexKey(); bool hasBrief = !fd->briefDescription().isEmpty(); ol.startIndexValue(hasBrief); if (hasBrief) { //ol.docify(" ("); ol.parseDoc( fd->briefFile(),fd->briefLine(), fd,0, abbreviate(fd->briefDescription(),fd->name()), FALSE, // index words FALSE, // isExample 0, // example name TRUE, // single line TRUE // link from index ); //ol.docify(")"); } ol.endIndexValue(fd->getOutputFileBase(),hasBrief); //ol.popGeneratorState(); // -------------------------------------------------------- } fd=fl->next(); } if (Config_getBool("FULL_PATH_NAMES")) { fl=outputNameList.next(); } else { fl=Doxygen::inputNameList->next(); } } ol.endIndexList(); Doxygen::indexList.decContentsDepth(); endFile(ol); ol.popGeneratorState(); } //---------------------------------------------------------------------------- int countNamespaces() { int count=0; NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict); NamespaceDef *nd; for (;(nd=nli.current());++nli) { if (nd->isLinkableInProject()) count++; } return count; } //---------------------------------------------------------------------------- void writeNamespaceIndex(OutputList &ol) { bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); if (documentedNamespaces==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); QCString title; if (Config_getBool("OPTIMIZE_OUTPUT_JAVA")) { startFile(ol,"namespaces",0,theTranslator->trPackageList().data(),HLI_Namespaces); title = theTranslator->trPackageList(); } else if (fortranOpt) { startFile(ol,"namespaces",0,theTranslator->trModulesIndex().data(),HLI_Namespaces); title = theTranslator->trModulesList(); } else { startFile(ol,"namespaces",0,theTranslator->trNamespaceIndex().data(),HLI_Namespaces); title = theTranslator->trNamespaceList(); } startTitle(ol,0); QCString longTitle = title; //if (!Config_getString("PROJECT_NAME").isEmpty()) //{ // longTitle.prepend(Config_getString("PROJECT_NAME")+" "); //} ol.parseText(longTitle); endTitle(ol,0,0); ol.startContents(); ol.startTextBlock(); Doxygen::indexList.addContentsItem(TRUE,title,0,"namespaces",0); Doxygen::indexList.incContentsDepth(); //ol.newParagraph(); if (Config_getBool("OPTIMIZE_OUTPUT_JAVA")) { ol.parseText(theTranslator->trPackageListDescription()); } else if (fortranOpt) { ol.parseText(theTranslator->trModulesListDescription(Config_getBool("EXTRACT_ALL"))); } else { ol.parseText(theTranslator->trNamespaceListDescription(Config_getBool("EXTRACT_ALL"))); } //ol.newParagraph(); ol.endTextBlock(); bool first=TRUE; NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict); NamespaceDef *nd; for (nli.toFirst();(nd=nli.current());++nli) { if (nd->isLinkableInProject()) { if (first) { ol.startIndexList(); first=FALSE; } //ol.writeStartAnnoItem("namespace",nd->getOutputFileBase(),0,nd->name()); ol.startIndexKey(); ol.writeObjectLink(0,nd->getOutputFileBase(),0,nd->displayName()); ol.endIndexKey(); bool hasBrief = !nd->briefDescription().isEmpty(); ol.startIndexValue(hasBrief); if (hasBrief) { //ol.docify(" ("); ol.parseDoc( nd->briefFile(),nd->briefLine(), nd,0, abbreviate(nd->briefDescription(),nd->displayName()), FALSE, // index words FALSE, // isExample 0, // example name TRUE, // single line TRUE // link from index ); //ol.docify(")"); } ol.endIndexValue(nd->getOutputFileBase(),hasBrief); //ol.writeEndAnnoItem(nd->getOutputFileBase()); Doxygen::indexList.addContentsItem(FALSE,nd->displayName(),nd->getReference(),nd->getOutputFileBase(),0); } } if (!first) ol.endIndexList(); Doxygen::indexList.decContentsDepth(); endFile(ol); ol.popGeneratorState(); } //---------------------------------------------------------------------------- int countAnnotatedClasses() { int count=0; //ClassDef *cd=Doxygen::classList.first(); ClassSDict::Iterator cli(*Doxygen::classSDict); ClassDef *cd; for (;(cd=cli.current());++cli) { if (cd->isLinkableInProject() && cd->templateMaster()==0) { //printf("Annotated class %s\n",cd->name().data()); count++; } } return count; } //---------------------------------------------------------------------- void writeAnnotatedClassList(OutputList &ol) { ol.startIndexList(); ClassSDict::Iterator cli(*Doxygen::classSDict); ClassDef *cd; // clear index int x,y; for (y=0;yisLinkableInProject() && cd->templateMaster()==0) { QCString dispName = cd->displayName(); int c = dispName.at(getPrefixIndex(dispName)); g_classIndexLetterUsed[CHL_All][c]=TRUE; switch(cd->compoundType()) { case ClassDef::Class: g_classIndexLetterUsed[CHL_Classes][c]=TRUE; break; case ClassDef::Struct: g_classIndexLetterUsed[CHL_Structs][c]=TRUE; break; case ClassDef::Union: g_classIndexLetterUsed[CHL_Unions][c]=TRUE; break; case ClassDef::Interface: g_classIndexLetterUsed[CHL_Interfaces][c]=TRUE; break; case ClassDef::Protocol: g_classIndexLetterUsed[CHL_Protocols][c]=TRUE; break; case ClassDef::Category: g_classIndexLetterUsed[CHL_Categories][c]=TRUE; break; case ClassDef::Exception: g_classIndexLetterUsed[CHL_Exceptions][c]=TRUE; break; } } } for (cli.toFirst();(cd=cli.current());++cli) { if (cd->isLinkableInProject() && cd->templateMaster()==0) { QCString type=cd->compoundTypeString(); ol.startIndexKey(); static bool vhdl = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); if (vhdl) { QCString prot= VhdlDocGen::getProtectionName((VhdlDocGen::VhdlClasses)cd->protection()); ol.docify(prot.data()); ol.insertMemberAlign(); } ol.writeObjectLink(0,cd->getOutputFileBase(),0,cd->displayName()); ol.endIndexKey(); bool hasBrief = !cd->briefDescription().isEmpty(); ol.startIndexValue(hasBrief); if (hasBrief) { ol.parseDoc( cd->briefFile(),cd->briefLine(), cd,0, abbreviate(cd->briefDescription(),cd->displayName()), FALSE, // indexWords FALSE, // isExample 0, // example name TRUE, // single line TRUE // link from index ); } ol.endIndexValue(cd->getOutputFileBase(),hasBrief); //ol.writeEndAnnoItem(cd->getOutputFileBase()); Doxygen::indexList.addContentsItem(FALSE,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),0); } } ol.endIndexList(); } static QCString letterToLabel(char startLetter) { QCString s(5); if (isId(startLetter)) { s[0]=startLetter; s[1]=0; } else { const char hex[]="0123456789abcdef"; s[0]='0'; s[1]='x'; s[2]=hex[startLetter>>4]; s[3]=hex[startLetter&0xF]; s[4]=0; } return s; } //---------------------------------------------------------------------------- class PrefixIgnoreClassList : public ClassList { public: virtual int compareItems(GCI item1, GCI item2) { ClassDef *c1=(ClassDef *)item1; ClassDef *c2=(ClassDef *)item2; QCString n1 = c1->className(); n1.remove (0, getPrefixIndex(n1)); QCString n2 = c2->className(); n2.remove (0, getPrefixIndex(n2)); return stricmp (n1, n2); } }; // write an alphabetical index of all class with a header for each letter void writeAlphabeticalClassList(OutputList &ol) { //ol.startAlphabeticalIndexList(); // What starting letters are used bool indexLetterUsed[256]; memset (indexLetterUsed, 0, sizeof (indexLetterUsed)); // first count the number of headers ClassSDict::Iterator cli(*Doxygen::classSDict); ClassDef *cd; uint startLetter=0; int headerItems=0; for (;(cd=cli.current());++cli) { if (cd->isLinkableInProject() && cd->templateMaster()==0) { int index = getPrefixIndex(cd->className()); //printf("name=%s index=%d\n",cd->className().data(),index); startLetter=toupper(cd->className().at(index)); indexLetterUsed[startLetter] = true; } } QCString alphaLinks = "
"; int l; for (l = 0; l < 256; l++) { if (indexLetterUsed[l]) { if (headerItems) alphaLinks += " | "; headerItems++; alphaLinks += (QCString)"" + (char)l + ""; } } alphaLinks += "
\n"; ol.writeString(alphaLinks); ol.writeString("\n"); // the number of columns in the table const int columns = Config_getInt("COLS_IN_ALPHA_INDEX"); int i,j; int totalItems = headerItems + annotatedClasses; // number of items in the table int rows = (totalItems + columns - 1)/columns; // number of rows in the table int itemsInLastRow = (totalItems + columns -1)%columns + 1; // number of items in the last row //printf("headerItems=%d totalItems=%d columns=%d rows=%d itemsInLastRow=%d\n", // headerItems,totalItems,columns,rows,itemsInLastRow); // Keep a list of classes for each starting letter PrefixIgnoreClassList classesByLetter[256]; // fill the columns with the class list (row elements in each column, // expect for the columns with number >= itemsInLastRow, which get on // item less. //int icount=0; startLetter=0; for (cli.toFirst();(cd=cli.current());++cli) { if (cd->isLinkableInProject() && cd->templateMaster()==0) { int index = getPrefixIndex(cd->className()); startLetter=toupper(cd->className().at(index))&0xFF; // Do some sorting again, since the classes are sorted by name with // prefix, which should be ignored really. classesByLetter[startLetter].inSort (cd); } } // create one class list for each column ClassList *colList = new ClassList[columns]; // fill the columns with the class list (row elements in each column, // expect for the columns with number >= itemsInLastRow, which get on // item less. int col=0,row=0; //int icount=0; startLetter=0; for (l = 0; l < 256; l++) { if (!indexLetterUsed[l]) continue; // insert a new header using a dummy class pointer. colList[col].append((ClassDef *)8); // insert dummy for the header row++; if ( row >= rows + ((col= rows + ((col"); // the last column may contain less items then the others int colsInRow = (i"); ClassDef *cd = colIterators[j]->current(); //printf("columns [%d] cd=%p\n",j,cd); if (cd==(ClassDef *)8) // the class pointer is really a header { cd=++(*colIterators[j]); // get the next item if (cd) { //printf("head ClassDef=%p %s\n",cd,cd ? cd->name().data() : ""); int index = getPrefixIndex(cd->className()); startLetter=toupper(cd->className().at(index)); QCString s = letterToLabel(startLetter); //ol.writeIndexHeading(s); ol.writeString(""); ol.writeString("
" "" "" "" "
  "); ol.writeString(s); ol.writeString( "  
" "
\n"); } } else if (cd) // a real class, insert a link { QCString namesp,cname; //if (cd->getNamespaceDef()) namesp=cd->getNamespaceDef()->displayName(); //QCString cname=cd->className(); extractNamespaceName(cd->name(),cname,namesp); QCString nsDispName; if (Config_getBool("OPTIMIZE_OUTPUT_JAVA")) { nsDispName=substitute(namesp,"::","."); } else { nsDispName=namesp.copy(); } ol.writeObjectLink(cd->getReference(), cd->getOutputFileBase(),0,cname); if (!namesp.isEmpty()) { ol.docify(" ("); NamespaceDef *nd = getResolvedNamespace(namesp); if (nd && nd->isLinkable()) { ol.writeObjectLink(nd->getReference(), nd->getOutputFileBase(),0,nsDispName); } else { ol.docify(nsDispName); } ol.docify(")"); } ol.writeNonBreakableSpace(3); //printf("item ClassDef=%p %s\n",cd,cd ? cd->name().data() : ""); ++(*colIterators[j]); } //ol.endTableColumn(); ol.writeString(""); //if (j"); } //ol.endAlphabeticalIndexList(); ol.writeString(""); ol.writeString(alphaLinks); // release the temporary memory for (i=0;itrAlphabeticalList().data(),HLI_Classes); startTitle(ol,0); ol.parseText(/*Config_getString("PROJECT_NAME")+" "+*/ (fortranOpt ? theTranslator->trCompoundIndexFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitIndex() : theTranslator->trCompoundIndex() )); endTitle(ol,0,0); ol.startContents(); writeAlphabeticalClassList(ol); endFile(ol); ol.popGeneratorState(); } //---------------------------------------------------------------------------- void writeAnnotatedIndex(OutputList &ol) { bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); if (annotatedClasses==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); QCString title = fortranOpt ? theTranslator->trCompoundListFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitList() : theTranslator->trCompoundList() ; startFile(ol,"annotated",0,title.data(),HLI_Annotated); startTitle(ol,0); QCString longTitle = title; //if (!Config_getString("PROJECT_NAME").isEmpty()) //{ // longTitle.prepend(Config_getString("PROJECT_NAME")+" "); //} ol.parseText(longTitle); endTitle(ol,0,0); ol.startContents(); ol.startTextBlock(); Doxygen::indexList.addContentsItem(TRUE,title,0,"annotated",0); Doxygen::indexList.incContentsDepth(); QCString desc = fortranOpt ? theTranslator->trCompoundListDescriptionFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitListDescription() : theTranslator->trCompoundListDescription() ; ol.parseText(desc); ol.endTextBlock(); writeAnnotatedClassList(ol); Doxygen::indexList.decContentsDepth(); endFile(ol); ol.popGeneratorState(); } //---------------------------------------------------------------------------- static void writeClassLinkForMember(OutputList &ol,MemberDef *md,const char *separator, QCString &prevClassName) { ClassDef *cd=md->getClassDef(); if ( cd && prevClassName!=cd->displayName()) { ol.docify(separator); ol.writeObjectLink(md->getReference(),md->getOutputFileBase(),md->anchor(), cd->displayName()); ol.writeString("\n"); prevClassName = cd->displayName(); } } static void writeFileLinkForMember(OutputList &ol,MemberDef *md,const char *separator, QCString &prevFileName) { FileDef *fd=md->getFileDef(); if (fd && prevFileName!=fd->name()) { ol.docify(separator); ol.writeObjectLink(md->getReference(),md->getOutputFileBase(),md->anchor(), fd->name()); ol.writeString("\n"); prevFileName = fd->name(); } } static void writeNamespaceLinkForMember(OutputList &ol,MemberDef *md,const char *separator, QCString &prevNamespaceName) { NamespaceDef *nd=md->getNamespaceDef(); if (nd && prevNamespaceName!=nd->name()) { ol.docify(separator); ol.writeObjectLink(md->getReference(),md->getOutputFileBase(),md->anchor(), nd->name()); ol.writeString("\n"); prevNamespaceName = nd->name(); } } static void writeMemberList(OutputList &ol,bool useSections,int page, MemberIndexList memberLists[MEMBER_INDEX_ENTRIES], DefinitionIntf::DefType type) { int pi; // page==-1 => write all member indices to one page (used when total members is small) // page!=-1 => write all member for this page only (used when total member is large) int startIndex = page==-1 ? 0 : page; int endIndex = page==-1 ? MEMBER_INDEX_ENTRIES-1 : page; ASSERT((int)type<3); typedef void (*writeLinkForMember_t)(OutputList &ol,MemberDef *md,const char *separator, QCString &prevNamespaceName); // each index tab has its own write function static writeLinkForMember_t writeLinkForMemberMap[3] = { &writeClassLinkForMember, &writeFileLinkForMember, &writeNamespaceLinkForMember }; QCString prevName; QCString prevDefName; bool first=TRUE; bool firstSection=TRUE; bool firstItem=TRUE; for (pi=startIndex; pi<=endIndex; pi++) // page==-1 => pi=[0..127], page!=-1 => pi=page { MemberIndexList *ml = &memberLists[pi]; if (ml->count()==0) continue; ml->sort(); QListIterator mli(*ml); MemberDef *md; for (mli.toFirst();(md=mli.current());++mli) { const char *sep; bool isFunc=!md->isObjCMethod() && (md->isFunction() || md->isSlot() || md->isSignal()); QCString name=md->name(); int startIndex = getPrefixIndex(name); if (QCString(name.data()+startIndex)!=prevName) // new entry { if ((prevName.isEmpty() || tolower(name.at(startIndex))!=tolower(prevName.at(0))) && useSections) // new section { if (!firstItem) ol.endItemListItem(); if (!firstSection) ol.endItemList(); char cl[2]; cl[0] = tolower(name.at(startIndex)); cl[1] = 0; QCString cs = letterToLabel(cl[0]); QCString anchor=(QCString)"index_"+cs; QCString title=(QCString)"- "+cl+" -"; ol.startSection(anchor,title,SectionInfo::Subsection); ol.docify(title); ol.endSection(anchor,SectionInfo::Subsection); ol.startItemList(); firstSection=FALSE; firstItem=TRUE; } else if (!useSections && first) { ol.startItemList(); first=FALSE; } // member name if (!firstItem) ol.endItemListItem(); ol.startItemListItem(); firstItem=FALSE; ol.docify(name); if (isFunc) ol.docify("()"); ol.writeString("\n"); // link to class prevDefName=""; sep = ": "; prevName = name.data()+startIndex; } else // same entry { sep = ", "; // link to class for other members with the same name } // write the link for the specific list type writeLinkForMemberMap[(int)type](ol,md,sep,prevDefName); } } if (!firstItem) ol.endItemListItem(); ol.endItemList(); } //---------------------------------------------------------------------------- void initClassMemberIndices() { int i=0; int j=0; for (j=0;jisLinkableInProject() && (cd=md->getClassDef()) && cd->isLinkableInProject() && cd->templateMaster()==0) { QCString n = md->name(); int index = getPrefixIndex(n); uchar charCode = (uchar)n.at(index); uint letter = charCode<128 ? tolower(charCode) : charCode; if (!n.isEmpty()) { bool isFriendToHide = hideFriendCompounds && (QCString(md->typeString())=="friend class" || QCString(md->typeString())=="friend struct" || QCString(md->typeString())=="friend union"); if (!(md->isFriend() && isFriendToHide)) { g_memberIndexLetterUsed[CMHL_All][letter].append(md); documentedClassMembers[CMHL_All]++; } if (md->isFunction() || md->isSlot() || md->isSignal()) { g_memberIndexLetterUsed[CMHL_Functions][letter].append(md); documentedClassMembers[CMHL_Functions]++; } else if (md->isVariable()) { g_memberIndexLetterUsed[CMHL_Variables][letter].append(md); documentedClassMembers[CMHL_Variables]++; } else if (md->isTypedef()) { g_memberIndexLetterUsed[CMHL_Typedefs][letter].append(md); documentedClassMembers[CMHL_Typedefs]++; } else if (md->isEnumerate()) { g_memberIndexLetterUsed[CMHL_Enums][letter].append(md); documentedClassMembers[CMHL_Enums]++; } else if (md->isEnumValue()) { g_memberIndexLetterUsed[CMHL_EnumValues][letter].append(md); documentedClassMembers[CMHL_EnumValues]++; } else if (md->isProperty()) { g_memberIndexLetterUsed[CMHL_Properties][letter].append(md); documentedClassMembers[CMHL_Properties]++; } else if (md->isEvent()) { g_memberIndexLetterUsed[CMHL_Events][letter].append(md); documentedClassMembers[CMHL_Events]++; } else if (md->isRelated() || md->isForeign() || (md->isFriend() && !isFriendToHide)) { g_memberIndexLetterUsed[CMHL_Related][letter].append(md); documentedClassMembers[CMHL_Related]++; } } } } //---------------------------------------------------------------------------- void initNamespaceMemberIndices() { int i=0; int j=0; for (j=0;jgetNamespaceDef(); if (nd && nd->isLinkableInProject() && md->isLinkableInProject()) { QCString n = md->name(); int index = getPrefixIndex(n); uchar charCode = (uchar)n.at(index); uint letter = charCode<128 ? tolower(charCode) : charCode; if (!n.isEmpty()) { g_namespaceIndexLetterUsed[NMHL_All][letter].append(md); documentedNamespaceMembers[NMHL_All]++; if (md->isFunction()) { g_namespaceIndexLetterUsed[NMHL_Functions][letter].append(md); documentedNamespaceMembers[NMHL_Functions]++; } else if (md->isVariable()) { g_namespaceIndexLetterUsed[NMHL_Variables][letter].append(md); documentedNamespaceMembers[NMHL_Variables]++; } else if (md->isTypedef()) { g_namespaceIndexLetterUsed[NMHL_Typedefs][letter].append(md); documentedNamespaceMembers[NMHL_Typedefs]++; } else if (md->isEnumerate()) { g_namespaceIndexLetterUsed[NMHL_Enums][letter].append(md); documentedNamespaceMembers[NMHL_Enums]++; } else if (md->isEnumValue()) { g_namespaceIndexLetterUsed[NMHL_EnumValues][letter].append(md); documentedNamespaceMembers[NMHL_EnumValues]++; } } } } //---------------------------------------------------------------------------- void initFileMemberIndices() { int i=0; int j=0; for (j=0;jgetFileDef(); if (fd && fd->isLinkableInProject() && md->isLinkableInProject()) { QCString n = md->name(); int index = getPrefixIndex(n); uchar charCode = (uchar)n.at(index); uint letter = charCode<128 ? tolower(charCode) : charCode; if (!n.isEmpty()) { g_fileIndexLetterUsed[FMHL_All][letter].append(md); documentedFileMembers[FMHL_All]++; if (md->isFunction()) { g_fileIndexLetterUsed[FMHL_Functions][letter].append(md); documentedFileMembers[FMHL_Functions]++; } else if (md->isVariable()) { g_fileIndexLetterUsed[FMHL_Variables][letter].append(md); documentedFileMembers[FMHL_Variables]++; } else if (md->isTypedef()) { g_fileIndexLetterUsed[FMHL_Typedefs][letter].append(md); documentedFileMembers[FMHL_Typedefs]++; } else if (md->isEnumerate()) { g_fileIndexLetterUsed[FMHL_Enums][letter].append(md); documentedFileMembers[FMHL_Enums]++; } else if (md->isEnumValue()) { g_fileIndexLetterUsed[FMHL_EnumValues][letter].append(md); documentedFileMembers[FMHL_EnumValues]++; } else if (md->isDefine()) { g_fileIndexLetterUsed[FMHL_Defines][letter].append(md); documentedFileMembers[FMHL_Defines]++; } } } } //---------------------------------------------------------------------------- void writeQuickMemberIndex(OutputList &ol, MemberIndexList charUsed[MEMBER_INDEX_ENTRIES],int page, QCString fullName,bool multiPage) { bool first=TRUE; int i; startQuickIndexList(ol,TRUE); for (i=33;i<127;i++) { char is[2];is[0]=(char)i;is[1]='\0'; if (charUsed[i].count()>0) { QCString anchor; QCString extension=Doxygen::htmlFileExtension; if (!multiPage) anchor="#index_"; else if (first) anchor=fullName+extension+"#index_"; else anchor=fullName+QCString().sprintf("_0x%02x",i)+extension+"#index_"; startQuickIndexItem(ol,anchor+is,i==page,TRUE,first); ol.writeString(is); endQuickIndexItem(ol); first=FALSE; } } endQuickIndexList(ol); } //---------------------------------------------------------------------------- static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight hl) { if (documentedClassMembers[hl]==0) return; static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); bool multiPageIndex=FALSE; int numPages=1; if (documentedClassMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX) { multiPageIndex=TRUE; numPages=127; } struct CmhlInfo { CmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {} const char *fname; QCString title; } cmhlInfo[] = { CmhlInfo("functions", theTranslator->trAll()), CmhlInfo("functions_func", fortranOpt ? theTranslator->trSubprograms() : vhdlOpt ? VhdlDocGen::trFunctionAndProc() : theTranslator->trFunctions()), CmhlInfo("functions_vars",theTranslator->trVariables()), CmhlInfo("functions_type",theTranslator->trTypedefs()), CmhlInfo("functions_enum",theTranslator->trEnumerations()), CmhlInfo("functions_eval",theTranslator->trEnumerationValues()), CmhlInfo("functions_prop",theTranslator->trProperties()), CmhlInfo("functions_evnt",theTranslator->trEvents()), CmhlInfo("functions_rela",theTranslator->trRelatedFunctions()) }; ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); QCString extension=Doxygen::htmlFileExtension; QCString title = fortranOpt ? theTranslator->trCompoundMembersFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitMembers() : theTranslator->trCompoundMembers() ; if (hl!=CMHL_All) title+=(QCString)" - "+cmhlInfo[hl].title; int page; bool first=TRUE; for (page=0;page0) { QCString fileName = cmhlInfo[hl].fname; if (multiPageIndex && !first) { fileName+=QCString().sprintf("_0x%02x",page); } startFile(ol,fileName+extension,0,title,HLI_Functions,TRUE); startQuickIndexList(ol); // index item for global member list startQuickIndexItem(ol, cmhlInfo[0].fname+Doxygen::htmlFileExtension,hl==CMHL_All,TRUE,first); ol.writeString(fixSpaces(cmhlInfo[0].title)); endQuickIndexItem(ol); // index items per category member lists int i; for (i=1;i0) { startQuickIndexItem(ol,cmhlInfo[i].fname+Doxygen::htmlFileExtension,hl==i,TRUE,first); ol.writeString(fixSpaces(cmhlInfo[i].title)); //printf("multiPageIndex=%d first=%d fileName=%s file=%s title=%s\n", // multiPageIndex,first,fileName.data(),cmhlInfo[i].fname,cmhlInfo[i].title.data()); endQuickIndexItem(ol); } } endQuickIndexList(ol); // quick alphabetical index bool quickIndex = documentedClassMembers[hl]>maxItemsBeforeQuickIndex; if (quickIndex) { writeQuickMemberIndex(ol,g_memberIndexLetterUsed[hl],page, cmhlInfo[hl].fname,multiPageIndex); } ol.endQuickIndices(); ol.startContents(); if (hl==CMHL_All) { static bool extractAll = Config_getBool("EXTRACT_ALL"); ol.parseText(fortranOpt ? theTranslator->trCompoundMembersDescriptionFortran(extractAll) : theTranslator->trCompoundMembersDescription(extractAll)); } else { // hack to work around a mozilla bug, which refuses to switch to // normal lists otherwise ol.writeString(" "); } //ol.newParagraph(); // FIXME:PARA writeMemberList(ol,quickIndex, multiPageIndex?page:-1, g_memberIndexLetterUsed[hl], Definition::TypeClass); endFile(ol); first=FALSE; } } ol.popGeneratorState(); } void writeClassMemberIndex(OutputList &ol) { bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); writeClassMemberIndexFiltered(ol,CMHL_All); writeClassMemberIndexFiltered(ol,CMHL_Functions); writeClassMemberIndexFiltered(ol,CMHL_Variables); writeClassMemberIndexFiltered(ol,CMHL_Typedefs); writeClassMemberIndexFiltered(ol,CMHL_Enums); writeClassMemberIndexFiltered(ol,CMHL_EnumValues); writeClassMemberIndexFiltered(ol,CMHL_Properties); writeClassMemberIndexFiltered(ol,CMHL_Events); writeClassMemberIndexFiltered(ol,CMHL_Related); if (documentedClassMembers[CMHL_All]>0) { QCString title = fortranOpt?theTranslator->trCompoundMembersFortran():theTranslator->trCompoundMembers(); Doxygen::indexList.addContentsItem(FALSE,title,0,"functions",0); } } //---------------------------------------------------------------------------- static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl) { if (documentedFileMembers[hl]==0) return; bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); bool multiPageIndex=FALSE; int numPages=1; if (documentedFileMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX) { multiPageIndex=TRUE; numPages=127; } struct FmhlInfo { FmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {} const char *fname; QCString title; } fmhlInfo[] = { FmhlInfo("globals", theTranslator->trAll()), FmhlInfo("globals_func", fortranOpt ? theTranslator->trSubprograms() : vhdlOpt ? VhdlDocGen::trFunctionAndProc() : theTranslator->trFunctions()), FmhlInfo("globals_vars",theTranslator->trVariables()), FmhlInfo("globals_type",theTranslator->trTypedefs()), FmhlInfo("globals_enum",theTranslator->trEnumerations()), FmhlInfo("globals_eval",theTranslator->trEnumerationValues()), FmhlInfo("globals_defs",theTranslator->trDefines()) }; ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); QCString extension=Doxygen::htmlFileExtension; QCString title = fortranOpt?theTranslator->trCompoundMembersFortran():theTranslator->trCompoundMembers(); int page; bool first=TRUE; for (page=0;page0) { QCString fileName = fmhlInfo[hl].fname; if (multiPageIndex && !first) { fileName+=QCString().sprintf("_0x%02x",page); } startFile(ol,fileName+extension,0,title.data(),HLI_Globals,TRUE); startQuickIndexList(ol); // index item for all member lists startQuickIndexItem(ol, fmhlInfo[0].fname+Doxygen::htmlFileExtension,hl==FMHL_All,TRUE,first); ol.writeString(fixSpaces(fmhlInfo[0].title)); endQuickIndexItem(ol); int i; // index items for per category member lists for (i=1;i0) { startQuickIndexItem(ol, fmhlInfo[i].fname+Doxygen::htmlFileExtension,hl==i,TRUE,first); ol.writeString(fixSpaces(fmhlInfo[i].title)); endQuickIndexItem(ol); } } endQuickIndexList(ol); bool quickIndex = documentedFileMembers[hl]>maxItemsBeforeQuickIndex; if (quickIndex) { writeQuickMemberIndex(ol,g_fileIndexLetterUsed[hl],page, fmhlInfo[hl].fname,multiPageIndex); } ol.endQuickIndices(); ol.startContents(); if (hl==FMHL_All) { ol.parseText(theTranslator->trFileMembersDescription(Config_getBool("EXTRACT_ALL"))); } else { // hack to work around a mozilla bug, which refuses to switch to // normal lists otherwise ol.writeString(" "); } //ol.newParagraph(); // FIXME:PARA //writeFileMemberList(ol,quickIndex,hl,page); writeMemberList(ol,quickIndex, multiPageIndex?page:-1, g_fileIndexLetterUsed[hl], Definition::TypeFile); endFile(ol); first=FALSE; } } ol.popGeneratorState(); } void writeFileMemberIndex(OutputList &ol) { writeFileMemberIndexFiltered(ol,FMHL_All); writeFileMemberIndexFiltered(ol,FMHL_Functions); writeFileMemberIndexFiltered(ol,FMHL_Variables); writeFileMemberIndexFiltered(ol,FMHL_Typedefs); writeFileMemberIndexFiltered(ol,FMHL_Enums); writeFileMemberIndexFiltered(ol,FMHL_EnumValues); writeFileMemberIndexFiltered(ol,FMHL_Defines); if (documentedFileMembers[FMHL_All]>0) { QCString title = theTranslator->trFileMembers(); Doxygen::indexList.addContentsItem(FALSE,title,0,"globals",0); } } //---------------------------------------------------------------------------- static void writeNamespaceMemberIndexFiltered(OutputList &ol, NamespaceMemberHighlight hl) { if (documentedNamespaceMembers[hl]==0) return; bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); bool multiPageIndex=FALSE; int numPages=1; if (documentedNamespaceMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX) { multiPageIndex=TRUE; numPages=127; } struct NmhlInfo { NmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {} const char *fname; QCString title; } nmhlInfo[] = { NmhlInfo("namespacemembers", theTranslator->trAll()), NmhlInfo("namespacemembers_func", fortranOpt ? theTranslator->trSubprograms() : vhdlOpt ? VhdlDocGen::trFunctionAndProc() : theTranslator->trFunctions()), NmhlInfo("namespacemembers_vars",theTranslator->trVariables()), NmhlInfo("namespacemembers_type",theTranslator->trTypedefs()), NmhlInfo("namespacemembers_enum",theTranslator->trEnumerations()), NmhlInfo("namespacemembers_eval",theTranslator->trEnumerationValues()) }; ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); QCString extension=Doxygen::htmlFileExtension; QCString title = fortranOpt?theTranslator->trCompoundMembersFortran():theTranslator->trCompoundMembers(); int page; bool first=TRUE; for (page=0;page0) { QCString fileName = nmhlInfo[hl].fname; if (multiPageIndex && !first) { fileName+=QCString().sprintf("_0x%02x",page); } startFile(ol,fileName+extension,0,title,HLI_NamespaceMembers,TRUE); startQuickIndexList(ol); startQuickIndexItem(ol, nmhlInfo[0].fname+Doxygen::htmlFileExtension,hl==NMHL_All,TRUE,first); ol.writeString(fixSpaces(nmhlInfo[0].title)); endQuickIndexItem(ol); int i; for (i=1;i0) { startQuickIndexItem(ol, nmhlInfo[i].fname+Doxygen::htmlFileExtension,hl==i,TRUE,first); ol.writeString(fixSpaces(nmhlInfo[i].title)); endQuickIndexItem(ol); } } endQuickIndexList(ol); bool quickIndex = documentedNamespaceMembers[hl]>maxItemsBeforeQuickIndex; if (quickIndex) { writeQuickMemberIndex(ol,g_namespaceIndexLetterUsed[hl],page, nmhlInfo[hl].fname,multiPageIndex); } ol.endQuickIndices(); ol.startContents(); if (hl==NMHL_All) { ol.parseText(fortranOpt?theTranslator->trModulesMemberDescription(Config_getBool("EXTRACT_ALL")):theTranslator->trNamespaceMemberDescription(Config_getBool("EXTRACT_ALL"))); } else { // hack to work around a mozilla bug, which refuses to switch to // normal lists otherwise ol.writeString(" "); } //ol.newParagraph(); // FIXME:PARA //writeNamespaceMemberList(ol,quickIndex,hl,page); writeMemberList(ol,quickIndex, multiPageIndex?page:-1, g_namespaceIndexLetterUsed[hl], Definition::TypeNamespace); endFile(ol); } } ol.popGeneratorState(); } void writeNamespaceMemberIndex(OutputList &ol) { bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); writeNamespaceMemberIndexFiltered(ol,NMHL_All); writeNamespaceMemberIndexFiltered(ol,NMHL_Functions); writeNamespaceMemberIndexFiltered(ol,NMHL_Variables); writeNamespaceMemberIndexFiltered(ol,NMHL_Typedefs); writeNamespaceMemberIndexFiltered(ol,NMHL_Enums); writeNamespaceMemberIndexFiltered(ol,NMHL_EnumValues); if (documentedNamespaceMembers[NMHL_All]>0) { QCString title = fortranOpt?theTranslator->trModulesMembers():theTranslator->trNamespaceMembers(); Doxygen::indexList.addContentsItem(FALSE,title,0,"namespacemembers",0); } } //---------------------------------------------------------------------------- #define NUM_SEARCH_INDICES 13 #define SEARCH_INDEX_ALL 0 #define SEARCH_INDEX_CLASSES 1 #define SEARCH_INDEX_NAMESPACES 2 #define SEARCH_INDEX_FILES 3 #define SEARCH_INDEX_FUNCTIONS 4 #define SEARCH_INDEX_VARIABLES 5 #define SEARCH_INDEX_TYPEDEFS 6 #define SEARCH_INDEX_ENUMS 7 #define SEARCH_INDEX_ENUMVALUES 8 #define SEARCH_INDEX_PROPERTIES 9 #define SEARCH_INDEX_EVENTS 10 #define SEARCH_INDEX_RELATED 11 #define SEARCH_INDEX_DEFINES 12 class SearchIndexList : public SDict< QList > { public: SearchIndexList(int size=17) : SDict< QList >(size,FALSE) { setAutoDelete(TRUE); } ~SearchIndexList() {} void append(Definition *d) { QList *l = find(d->name()); if (l==0) { l=new QList; SDict< QList >::append(d->name(),l); } l->append(d); } int compareItems(GCI item1, GCI item2) { QList *md1=(QList *)item1; QList *md2=(QList *)item2; QCString n1 = md1->first()->localName(); QCString n2 = md2->first()->localName(); return stricmp(n1.data(),n2.data()); } }; static void addMemberToSearchIndex( SearchIndexList symbols[NUM_SEARCH_INDICES][MEMBER_INDEX_ENTRIES], int symbolCount[NUM_SEARCH_INDICES], MemberDef *md) { static bool hideFriendCompounds = Config_getBool("HIDE_FRIEND_COMPOUNDS"); bool isLinkable = md->isLinkable(); ClassDef *cd=0; NamespaceDef *nd=0; FileDef *fd=0; if (isLinkable && (cd=md->getClassDef()) && cd->isLinkable() && cd->templateMaster()==0) { QCString n = md->name(); uchar charCode = (uchar)n.at(0); uint letter = charCode<128 ? tolower(charCode) : charCode; if (!n.isEmpty()) { bool isFriendToHide = hideFriendCompounds && (QCString(md->typeString())=="friend class" || QCString(md->typeString())=="friend struct" || QCString(md->typeString())=="friend union"); if (!(md->isFriend() && isFriendToHide)) { symbols[SEARCH_INDEX_ALL][letter].append(md); symbolCount[SEARCH_INDEX_ALL]++; } if (md->isFunction() || md->isSlot() || md->isSignal()) { symbols[SEARCH_INDEX_FUNCTIONS][letter].append(md); symbolCount[SEARCH_INDEX_FUNCTIONS]++; } else if (md->isVariable()) { symbols[SEARCH_INDEX_VARIABLES][letter].append(md); symbolCount[SEARCH_INDEX_VARIABLES]++; } else if (md->isTypedef()) { symbols[SEARCH_INDEX_TYPEDEFS][letter].append(md); symbolCount[SEARCH_INDEX_TYPEDEFS]++; } else if (md->isEnumerate()) { symbols[SEARCH_INDEX_ENUMS][letter].append(md); symbolCount[SEARCH_INDEX_ENUMS]++; } else if (md->isEnumValue()) { symbols[SEARCH_INDEX_ENUMVALUES][letter].append(md); symbolCount[SEARCH_INDEX_ENUMVALUES]++; } else if (md->isProperty()) { symbols[SEARCH_INDEX_PROPERTIES][letter].append(md); symbolCount[SEARCH_INDEX_PROPERTIES]++; } else if (md->isEvent()) { symbols[SEARCH_INDEX_EVENTS][letter].append(md); symbolCount[SEARCH_INDEX_EVENTS]++; } else if (md->isRelated() || md->isForeign() || (md->isFriend() && !isFriendToHide)) { symbols[SEARCH_INDEX_RELATED][letter].append(md); symbolCount[SEARCH_INDEX_RELATED]++; } } } else if (isLinkable && (((nd=md->getNamespaceDef()) && nd->isLinkable()) || ((fd=md->getFileDef()) && fd->isLinkable()) ) ) { QCString n = md->name(); uchar charCode = (uchar)n.at(0); uint letter = charCode<128 ? tolower(charCode) : charCode; if (!n.isEmpty()) { symbols[SEARCH_INDEX_ALL][letter].append(md); symbolCount[SEARCH_INDEX_ALL]++; if (md->isFunction()) { symbols[SEARCH_INDEX_FUNCTIONS][letter].append(md); symbolCount[SEARCH_INDEX_FUNCTIONS]++; } else if (md->isVariable()) { symbols[SEARCH_INDEX_VARIABLES][letter].append(md); symbolCount[SEARCH_INDEX_VARIABLES]++; } else if (md->isTypedef()) { symbols[SEARCH_INDEX_TYPEDEFS][letter].append(md); symbolCount[SEARCH_INDEX_TYPEDEFS]++; } else if (md->isEnumerate()) { symbols[SEARCH_INDEX_ENUMS][letter].append(md); symbolCount[SEARCH_INDEX_ENUMS]++; } else if (md->isEnumValue()) { symbols[SEARCH_INDEX_ENUMVALUES][letter].append(md); symbolCount[SEARCH_INDEX_ENUMVALUES]++; } else if (md->isDefine()) { symbols[SEARCH_INDEX_DEFINES][letter].append(md); symbolCount[SEARCH_INDEX_DEFINES]++; } } } } static QCString searchId(const QCString &s) { int c; uint i; QCString result; for (i=0;i='0' && c<='9') || (c>='A' && c<='Z') || (c>='a' && c<='z')) { result+=(char)tolower(c); } else { char val[4]; sprintf(val,"_%02x",(uchar)c); result+=val; } } return result; } static int g_searchIndexCount[NUM_SEARCH_INDICES]; static SearchIndexList g_searchIndexSymbols[NUM_SEARCH_INDICES][MEMBER_INDEX_ENTRIES]; static const char *g_searchIndexName[NUM_SEARCH_INDICES] = { "all", "classes", "namespaces", "files", "functions", "variables", "typedefs", "enums", "enumvalues", "properties", "events", "related", "defines" }; class SearchIndexCategoryMapping { public: SearchIndexCategoryMapping() { categoryLabel[SEARCH_INDEX_ALL] = theTranslator->trAll(); categoryLabel[SEARCH_INDEX_CLASSES] = theTranslator->trClasses(); categoryLabel[SEARCH_INDEX_NAMESPACES] = theTranslator->trNamespace(TRUE,FALSE); categoryLabel[SEARCH_INDEX_FILES] = theTranslator->trFile(TRUE,FALSE); categoryLabel[SEARCH_INDEX_FUNCTIONS] = theTranslator->trFunctions(); categoryLabel[SEARCH_INDEX_VARIABLES] = theTranslator->trVariables(); categoryLabel[SEARCH_INDEX_TYPEDEFS] = theTranslator->trTypedefs(); categoryLabel[SEARCH_INDEX_ENUMS] = theTranslator->trEnumerations(); categoryLabel[SEARCH_INDEX_ENUMVALUES] = theTranslator->trEnumerationValues(); categoryLabel[SEARCH_INDEX_PROPERTIES] = theTranslator->trProperties(); categoryLabel[SEARCH_INDEX_EVENTS] = theTranslator->trEvents(); categoryLabel[SEARCH_INDEX_RELATED] = theTranslator->trFriends(); categoryLabel[SEARCH_INDEX_DEFINES] = theTranslator->trDefines(); } QString categoryLabel[NUM_SEARCH_INDICES]; }; void writeJavascriptSearchIndex() { if (!Config_getBool("GENERATE_HTML")) return; static bool treeView = Config_getBool("GENERATE_TREEVIEW"); ClassSDict::Iterator cli(*Doxygen::classSDict); ClassDef *cd; for (;(cd=cli.current());++cli) { uchar charCode = (uchar)cd->localName().at(0); uint letter = charCode<128 ? tolower(charCode) : charCode; if (cd->isLinkable() && isId(letter)) { g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(cd); g_searchIndexSymbols[SEARCH_INDEX_CLASSES][letter].append(cd); g_searchIndexCount[SEARCH_INDEX_ALL]++; g_searchIndexCount[SEARCH_INDEX_CLASSES]++; } } NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict); NamespaceDef *nd; for (;(nd=nli.current());++nli) { uchar charCode = (uchar)nd->name().at(0); uint letter = charCode<128 ? tolower(charCode) : charCode; if (nd->isLinkable() && isId(letter)) { g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(nd); g_searchIndexSymbols[SEARCH_INDEX_NAMESPACES][letter].append(nd); g_searchIndexCount[SEARCH_INDEX_ALL]++; g_searchIndexCount[SEARCH_INDEX_NAMESPACES]++; } } FileNameListIterator fnli(*Doxygen::inputNameList); FileName *fn; for (;(fn=fnli.current());++fnli) { FileNameIterator fni(*fn); FileDef *fd; for (;(fd=fni.current());++fni) { uchar charCode = (uchar)fd->name().at(0); uint letter = charCode<128 ? tolower(charCode) : charCode; if (fd->isLinkable() && isId(letter)) { g_searchIndexSymbols[SEARCH_INDEX_ALL][letter].append(fd); g_searchIndexSymbols[SEARCH_INDEX_FILES][letter].append(fd); g_searchIndexCount[SEARCH_INDEX_ALL]++; g_searchIndexCount[SEARCH_INDEX_FILES]++; } } } { MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict); MemberName *mn; // for each member name for (mnli.toFirst();(mn=mnli.current());++mnli) { MemberDef *md; MemberNameIterator mni(*mn); // for each member definition for (mni.toFirst();(md=mni.current());++mni) { addMemberToSearchIndex(g_searchIndexSymbols,g_searchIndexCount,md); } } } { MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict); MemberName *mn; // for each member name for (fnli.toFirst();(mn=fnli.current());++fnli) { MemberDef *md; MemberNameIterator mni(*mn); // for each member definition for (mni.toFirst();(md=mni.current());++mni) { addMemberToSearchIndex(g_searchIndexSymbols,g_searchIndexCount,md); } } } int i,p; for (i=0;i0) { g_searchIndexSymbols[i][p].sort(); } } } QCString searchDirName = Config_getString("HTML_OUTPUT")+"/search"; for (i=0;i0) { QCString fileName; fileName.sprintf("/%s_%02x.html",g_searchIndexName[i],p); fileName.prepend(searchDirName); QFile outFile(fileName); if (outFile.open(IO_WriteOnly)) { QTextStream t(&outFile); t.setEncoding(QTextStream::UnicodeUTF8); t << "" << endl; t << "" << endl; t << "" << endl; t << "" << endl; t << "" << endl; t << "" << endl; t << "" << endl; t << "
" << endl; t << "
" << theTranslator->trLoading() << "
" << endl; SDict >::Iterator li(g_searchIndexSymbols[i][p]); QList *dl; int itemCount=0; for (li.toFirst();(dl=li.current());++li) { Definition *d = dl->first(); QCString id = d->localName(); t << "
localName()) << "\">" << endl; t << "
\n"; if (dl->count()==1) // item with a unique name { MemberDef *md = 0; bool isMemberDef = d->definitionType()==Definition::TypeMember; if (isMemberDef) md = (MemberDef*)d; t << " getReference().isEmpty()) { QCString *dest = Doxygen::tagDestinationDict[d->getReference()]; if (dest && *dest=='.') // relative path (see bug 593679) { t << "target=\"_blank\" doxygen=\"" << d->getReference() << ":../" << *dest << "/\" href=\"../" << *dest << "/"; } else if (dest) // absolute path { t << "target=\"_blank\" doxygen=\"" << d->getReference() << ":" << *dest << "/\" href=\"" << *dest << "/"; } } else { t << "href=\"../"; } t << d->getOutputFileBase() << Doxygen::htmlFileExtension; if (isMemberDef) { t << "#" << ((MemberDef *)d)->anchor(); } t << "\" target=\""; if (treeView) t << "basefrm"; else t << "_parent"; t << "\">"; t << convertToXML(d->localName()); t << "" << endl; if (d->getOuterScope()!=Doxygen::globalScope) { t << " " << convertToXML(d->getOuterScope()->name()) << "" << endl; } else if (isMemberDef) { FileDef *fd = ((MemberDef *)d)->getBodyDef(); if (fd==0) fd = ((MemberDef *)d)->getFileDef(); if (fd) { t << " " << convertToXML(fd->localName()) << "" << endl; } } } else // multiple items with the same name { t << " localName()) << "')\">" << convertToXML(d->localName()) << "" << endl; t << "
" << endl; QListIterator di(*dl); bool overloadedFunction = FALSE; Definition *prevScope = 0; int childCount=0; for (di.toFirst();(d=di.current());) { ++di; Definition *scope = d->getOuterScope(); Definition *next = di.current(); Definition *nextScope = 0; MemberDef *md = 0; bool isMemberDef = d->definitionType()==Definition::TypeMember; if (isMemberDef) md = (MemberDef*)d; if (next) nextScope = next->getOuterScope(); t << " getReference().isEmpty()) { QCString *dest; t << "target=\"_blank\" doxygen=\"" << d->getReference() << ":../"; if ((dest=Doxygen::tagDestinationDict[d->getReference()])) t << *dest << "/"; t << "\" "; t << "href=\"../"; if ((dest=Doxygen::tagDestinationDict[d->getReference()])) t << *dest << "/"; } else { t << "href=\"../"; } t << d->getOutputFileBase() << Doxygen::htmlFileExtension; if (isMemberDef) { t << "#" << ((MemberDef *)d)->anchor(); } t << "\" target=\""; if (treeView) t << "basefrm"; else t << "_parent"; t << "\">"; bool found=FALSE; overloadedFunction = ((prevScope!=0 && scope==prevScope) || (scope && scope==nextScope) ) && md && (md->isFunction() || md->isSlot()); QCString prefix; if (md) prefix=convertToXML(md->localName()); if (overloadedFunction) // overloaded member function { prefix+=convertToXML(md->argsString()); // show argument list to disambiguate overloaded functions } else if (md) // unique member function { prefix+="()"; // only to show it is a function } if (d->definitionType()==Definition::TypeClass) { t << convertToXML(((ClassDef*)d)->displayName()); found = TRUE; } else if (d->definitionType()==Definition::TypeNamespace) { t << convertToXML(((NamespaceDef*)d)->displayName()); found = TRUE; } else if (scope==0 || scope==Doxygen::globalScope) // in global scope { if (md) { FileDef *fd = md->getBodyDef(); if (fd==0) fd = md->getFileDef(); if (fd) { if (!prefix.isEmpty()) prefix+=": "; t << prefix << convertToXML(fd->localName()); found = TRUE; } } } else if (md && (md->getClassDef() || md->getNamespaceDef())) // member in class or namespace scope { static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); t << convertToXML(d->getOuterScope()->qualifiedName()) << (optimizeOutputJava ? "." : "::"); t << prefix; found = TRUE; } else if (scope) // some thing else? -> show scope { t << prefix << convertToXML(scope->name()); found = TRUE; } if (!found) // fallback { t << prefix << "("+theTranslator->trGlobalNamespace()+")"; } t << "" << endl; prevScope = scope; childCount++; } t << "
" << endl; // SRChildren } t << "
" << endl; // SREntry t << "
" << endl; // SRResult itemCount++; } t << "
" << theTranslator->trSearching() << "
" << endl; t << "
" << theTranslator->trNoMatches() << "
" << endl; t << "" << endl; t << "
" << endl; // SRIndex t << "" << endl; t << "" << endl; } else { err("Failed to open file '%s' for writing...\n",fileName.data()); } } } } //ol.popGeneratorState(); { QFile f(searchDirName+"/search.js"); if (f.open(IO_WriteOnly)) { QTextStream t(&f); t.setEncoding(QTextStream::UnicodeUTF8); t << "// Search script generated by doxygen" << endl; t << "// Copyright (C) 2009 by Dimitri van Heesch." << endl << endl; t << "// The code in this file is loosly based on main.js, part of Natural Docs," << endl; t << "// which is Copyright (C) 2003-2008 Greg Valure" << endl; t << "// Natural Docs is licensed under the GPL." << endl << endl; t << "var indexSectionsWithContent =" << endl; t << "{" << endl; bool first=TRUE; int j=0; for (i=0;i0) { if (!first) t << "," << endl; t << " " << j << ": \""; for (p=0;p0 ? "1" : "0"); } t << "\""; first=FALSE; j++; } } if (!first) t << "\n"; t << "};" << endl << endl; t << "var indexSectionNames =" << endl; t << "{" << endl; first=TRUE; j=0; for (i=0;i0) { if (!first) t << "," << endl; t << " " << j << ": \"" << g_searchIndexName[i] << "\""; first=FALSE; j++; } } if (!first) t << "\n"; t << "};" << endl << endl; t << search_script; } } { QFile f(searchDirName+"/nomatches.html"); if (f.open(IO_WriteOnly)) { QTextStream t(&f); t.setEncoding(QTextStream::UnicodeUTF8); t << "" << endl; t << "" << endl; t << "" << endl; t << "" << endl; t << "" << endl; t << "" << endl; t << "" << endl; t << "
" << endl; t << "
" << theTranslator->trNoMatches() << "
" << endl; t << "
" << endl; t << "" << endl; t << "" << endl; } } Doxygen::indexList.addStyleSheetFile("search/search.js"); } void writeSearchCategories(FTextStream &t) { static SearchIndexCategoryMapping map; int i,j=0; for (i=0;i0) { t << "" << " " << convertToXML(map.categoryLabel[i]) << ""; j++; } } } //---------------------------------------------------------------------------- void writeExampleIndex(OutputList &ol) { if (Doxygen::exampleSDict->count()==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); QCString title = theTranslator->trExamples(); startFile(ol,"examples",0,title.data(),HLI_Examples); startTitle(ol,0); //if (!Config_getString("PROJECT_NAME").isEmpty()) //{ // title.prepend(Config_getString("PROJECT_NAME")+" "); //} ol.parseText(title); endTitle(ol,0,0); ol.startContents(); ol.startTextBlock(); Doxygen::indexList.addContentsItem(TRUE,theTranslator->trExamples(),0,"examples",0); Doxygen::indexList.incContentsDepth(); ol.parseText(theTranslator->trExamplesDescription()); //ol.newParagraph(); ol.endTextBlock(); ol.startItemList(); PageSDict::Iterator pdi(*Doxygen::exampleSDict); PageDef *pd=0; for (pdi.toFirst();(pd=pdi.current());++pdi) { ol.startItemListItem(); QCString n=pd->getOutputFileBase(); if (!pd->title().isEmpty()) { ol.writeObjectLink(0,n,0,pd->title()); Doxygen::indexList.addContentsItem(FALSE,filterTitle(pd->title()),pd->getReference(),n,0); } else { ol.writeObjectLink(0,n,0,pd->name()); Doxygen::indexList.addContentsItem(FALSE,pd->name(),pd->getReference(),n,0); } ol.endItemListItem(); ol.writeString("\n"); } ol.endItemList(); Doxygen::indexList.decContentsDepth(); endFile(ol); ol.popGeneratorState(); } //---------------------------------------------------------------------------- void countRelatedPages(int &docPages,int &indexPages) { docPages=indexPages=0; PageSDict::Iterator pdi(*Doxygen::pageSDict); PageDef *pd=0; for (pdi.toFirst();(pd=pdi.current());++pdi) { if ( pd->visibleInIndex()) { indexPages++; } if ( pd->documentedPage()) { docPages++; } } } //---------------------------------------------------------------------------- static void writeSubPages(PageDef *pd) { //printf("Write subpages(%s #=%d)\n",pd->name().data(),pd->getSubPages() ? pd->getSubPages()->count() : 0 ); Doxygen::indexList.incContentsDepth(); PageSDict *subPages = pd->getSubPages(); if (subPages) { PageSDict::Iterator pi(*subPages); PageDef *subPage; for (pi.toFirst();(subPage=pi.current());++pi) { QCString pageTitle; if (subPage->title().isEmpty()) pageTitle=subPage->name(); else pageTitle=subPage->title(); bool hasSubPages = subPage->hasSubPages(); Doxygen::indexList.addContentsItem(hasSubPages,pageTitle,subPage->getReference(),subPage->getOutputFileBase(),0); writeSubPages(subPage); } } Doxygen::indexList.decContentsDepth(); } void writePageIndex(OutputList &ol) { if (indexedPages==0) return; ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); startFile(ol,"pages",0,theTranslator->trPageIndex().data(),HLI_Pages); startTitle(ol,0); QCString title = theTranslator->trRelatedPages(); //if (!Config_getString("PROJECT_NAME").isEmpty()) //{ // title.prepend(Config_getString("PROJECT_NAME")+" "); //} ol.parseText(title); endTitle(ol,0,0); ol.startContents(); ol.startTextBlock(); //Doxygen::indexList.addContentsItem(TRUE,theTranslator->trRelatedPages(),0,"pages",0); //Doxygen::indexList.incContentsDepth(); ol.parseText(theTranslator->trRelatedPagesDescription()); ol.endTextBlock(); startIndexHierarchy(ol,0); PageSDict::Iterator pdi(*Doxygen::pageSDict); PageDef *pd=0; for (pdi.toFirst();(pd=pdi.current());++pdi) { if ( pd->visibleInIndex()) { QCString pageTitle; if (pd->title().isEmpty()) pageTitle=pd->name(); else pageTitle=pd->title(); bool hasSubPages = pd->hasSubPages(); ol.startIndexListItem(); ol.startIndexItem(pd->getReference(),pd->getOutputFileBase()); ol.parseText(pageTitle); ol.endIndexItem(pd->getReference(),pd->getOutputFileBase()); if (pd->isReference()) { ol.startTypewriter(); ol.docify(" [external]"); ol.endTypewriter(); } ol.writeString("\n"); Doxygen::indexList.addContentsItem(hasSubPages,filterTitle(pageTitle),pd->getReference(),pd->getOutputFileBase(),0); writeSubPages(pd); ol.endIndexListItem(); } } endIndexHierarchy(ol,0); //Doxygen::indexList.decContentsDepth(); endFile(ol); ol.popGeneratorState(); } //---------------------------------------------------------------------------- int countGroups() { int count=0; GroupSDict::Iterator gli(*Doxygen::groupSDict); GroupDef *gd; for (gli.toFirst();(gd=gli.current());++gli) { if (!gd->isReference()) { gd->visited=FALSE; count++; } } return count; } //---------------------------------------------------------------------------- int countDirs() { int count=0; SDict::Iterator dli(*Doxygen::directories); DirDef *dd; for (dli.toFirst();(dd=dli.current());++dli) { if (dd->isLinkableInProject()) { dd->visited=FALSE; count++; } } return count; } //---------------------------------------------------------------------------- void writeGraphInfo(OutputList &ol) { if (!Config_getBool("HAVE_DOT") || !Config_getBool("GENERATE_HTML")) return; ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); generateGraphLegend(Config_getString("HTML_OUTPUT")); startFile(ol,"graph_legend",0,theTranslator->trLegendTitle().data()); startTitle(ol,0); ol.parseText(theTranslator->trLegendTitle()); endTitle(ol,0,0); ol.startContents(); bool &stripCommentsStateRef = Config_getBool("STRIP_CODE_COMMENTS"); bool oldStripCommentsState = stripCommentsStateRef; // temporarily disable the stripping of comments for our own code example! stripCommentsStateRef = FALSE; ol.parseDoc("graph_legend",1,0,0,theTranslator->trLegendDocs(),FALSE,FALSE); stripCommentsStateRef = oldStripCommentsState; endFile(ol); ol.popGeneratorState(); } void writeGroupIndexItem(GroupDef *gd,MemberList *ml,const QCString &title) { if (ml && ml->count()>0) { bool first=TRUE; MemberDef *md=ml->first(); while (md) { if (md->isDetailedSectionVisible(TRUE,FALSE)) { if (first) { first=FALSE; Doxygen::indexList.addContentsItem(TRUE, convertToHtml(title,TRUE), gd->getReference(), gd->getOutputFileBase(), 0); Doxygen::indexList.incContentsDepth(); } Doxygen::indexList.addContentsItem(FALSE,md->name(),md->getReference(),md->getOutputFileBase(),md->anchor()); } md=ml->next(); } if (!first) { Doxygen::indexList.decContentsDepth(); } } } //---------------------------------------------------------------------------- /*! * write groups as hierarchical trees */ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) { bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); if (level>20) { warn(gd->getDefFileName(),gd->getDefLine(), "Warning: maximum nesting level exceeded for group %s: check for possible recursive group relation!\n",gd->name().data() ); return; } /* Some groups should appear twice under different parent-groups. * That is why we should not check if it was visited */ if (/*!gd->visited &&*/ (!gd->isASubGroup() || level>0) && (!gd->isReference() || Config_getBool("EXTERNAL_GROUPS")) // hide external groups by default ) { //printf("gd->name()=%s #members=%d\n",gd->name().data(),gd->countMembers()); // write group info bool hasSubGroups = gd->groupList->count()>0; bool hasSubPages = gd->pageDict->count()>0; int numSubItems = 0; if ( Config_getBool("TOC_EXPAND")) { QListIterator mli(gd->getMemberLists()); MemberList *ml; for (mli.toFirst();(ml=mli.current());++mli) { if (ml->listType()&MemberList::documentationLists) { numSubItems += ml->count(); } } numSubItems += gd->namespaceSDict->count(); numSubItems += gd->classSDict->count(); numSubItems += gd->fileList->count(); numSubItems += gd->exampleDict->count(); } bool isDir = hasSubGroups || hasSubPages || numSubItems>0; //printf("gd=`%s': pageDict=%d\n",gd->name().data(),gd->pageDict->count()); Doxygen::indexList.addContentsItem(isDir,gd->groupTitle(),gd->getReference(),gd->getOutputFileBase(),0); Doxygen::indexList.incContentsDepth(); if (ftv) { ftv->addContentsItem(isDir,gd->groupTitle(),gd->getReference(),gd->getOutputFileBase(),0); ftv->incContentsDepth(); } //ol.writeListItem(); //ol.startTextLink(gd->getOutputFileBase(),0); //parseText(ol,gd->groupTitle()); //ol.endTextLink(); ol.startIndexListItem(); ol.startIndexItem(gd->getReference(),gd->getOutputFileBase()); ol.parseText(gd->groupTitle()); ol.endIndexItem(gd->getReference(),gd->getOutputFileBase()); if (gd->isReference()) { ol.startTypewriter(); ol.docify(" [external]"); ol.endTypewriter(); } // write pages PageSDict::Iterator pli(*gd->pageDict); PageDef *pd = 0; for (pli.toFirst();(pd=pli.current());++pli) { SectionInfo *si=0; if (!pd->name().isEmpty()) si=Doxygen::sectionDict[pd->name()]; Doxygen::indexList.addContentsItem(FALSE, convertToHtml(pd->title(),TRUE), gd->getReference(), gd->getOutputFileBase(), si ? si->label.data() : 0); } // write subgroups if (hasSubGroups) { startIndexHierarchy(ol,level+1); if (Config_getBool("SORT_GROUP_NAMES")) gd->groupList->sort(); QListIterator gli(*gd->groupList); GroupDef *subgd = 0; for (gli.toFirst();(subgd=gli.current());++gli) { writeGroupTreeNode(ol,subgd,level+1,ftv); } endIndexHierarchy(ol,level+1); } if (Config_getBool("TOC_EXPAND")) { writeGroupIndexItem(gd,gd->getMemberList(MemberList::docDefineMembers), theTranslator->trDefines()); writeGroupIndexItem(gd,gd->getMemberList(MemberList::docTypedefMembers), theTranslator->trTypedefs()); writeGroupIndexItem(gd,gd->getMemberList(MemberList::docEnumMembers), theTranslator->trEnumerations()); writeGroupIndexItem(gd,gd->getMemberList(MemberList::docFuncMembers), fortranOpt ? theTranslator->trSubprograms() : vhdlOpt ? VhdlDocGen::trFunctionAndProc() : theTranslator->trFunctions() ); writeGroupIndexItem(gd,gd->getMemberList(MemberList::docVarMembers), theTranslator->trVariables()); writeGroupIndexItem(gd,gd->getMemberList(MemberList::docProtoMembers), theTranslator->trFuncProtos()); // write namespaces NamespaceSDict *namespaceSDict=gd->namespaceSDict; if (namespaceSDict->count()>0) { Doxygen::indexList.addContentsItem(TRUE,convertToHtml(fortranOpt?theTranslator->trModules():theTranslator->trNamespaces(),TRUE),gd->getReference(), gd->getOutputFileBase(), 0); Doxygen::indexList.incContentsDepth(); NamespaceSDict::Iterator ni(*namespaceSDict); NamespaceDef *nsd; for (ni.toFirst();(nsd=ni.current());++ni) { Doxygen::indexList.addContentsItem(FALSE, convertToHtml(nsd->name(),TRUE), nsd->getReference(), nsd->getOutputFileBase(), 0); } Doxygen::indexList.decContentsDepth(); } // write classes if (gd->classSDict->count()>0) { Doxygen::indexList.addContentsItem(TRUE,convertToHtml(fortranOpt?theTranslator->trDataTypes():theTranslator->trClasses(),TRUE), gd->getReference(), gd->getOutputFileBase(), 0); Doxygen::indexList.incContentsDepth(); ClassDef *cd; ClassSDict::Iterator cdi(*gd->classSDict); for (cdi.toFirst();(cd=cdi.current());++cdi) { if (cd->isLinkable()) { //printf("node: Has children %s\n",cd->name().data()); Doxygen::indexList.addContentsItem(FALSE,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),0); } } //writeClassTree(gd->classSDict,1); Doxygen::indexList.decContentsDepth(); } // write file list FileList *fileList=gd->fileList; if (fileList->count()>0) { Doxygen::indexList.addContentsItem(TRUE, theTranslator->trFile(TRUE,FALSE), gd->getReference(), gd->getOutputFileBase(), 0); Doxygen::indexList.incContentsDepth(); FileDef *fd=fileList->first(); while (fd) { Doxygen::indexList.addContentsItem(FALSE, convertToHtml(fd->name(),TRUE),fd->getReference(), fd->getOutputFileBase(), 0); fd=fileList->next(); } Doxygen::indexList.decContentsDepth(); } // write examples if (gd->exampleDict->count()>0) { Doxygen::indexList.addContentsItem(TRUE, convertToHtml(theTranslator->trExamples(),TRUE),gd->getReference(), gd->getOutputFileBase(), 0); Doxygen::indexList.incContentsDepth(); PageSDict::Iterator eli(*(gd->exampleDict)); PageDef *pd=eli.toFirst(); while (pd) { Doxygen::indexList.addContentsItem(FALSE,pd->name(),pd->getReference(),pd->getOutputFileBase(),0); pd=++eli; } Doxygen::indexList.decContentsDepth(); } } ol.endIndexListItem(); Doxygen::indexList.decContentsDepth(); if (ftv) ftv->decContentsDepth(); //gd->visited=TRUE; } } void writeGroupHierarchy(OutputList &ol, FTVHelp* ftv) { if (ftv) { ol.pushGeneratorState(); ol.disable(OutputGenerator::Html); } startIndexHierarchy(ol,0); if (Config_getBool("SORT_GROUP_NAMES")) Doxygen::groupSDict->sort(); GroupSDict::Iterator gli(*Doxygen::groupSDict); GroupDef *gd; for (gli.toFirst();(gd=gli.current());++gli) { writeGroupTreeNode(ol,gd,0,ftv); } endIndexHierarchy(ol,0); if (ftv) { ol.popGeneratorState(); } } //---------------------------------------------------------------------------- void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv) { if (level>20) { warn(dd->getDefFileName(),dd->getDefLine(), "Warning: maximum nesting level exceeded for directory %s: " "check for possible recursive directory relation!\n",dd->name().data() ); return; } static bool tocExpand = Config_getBool("TOC_EXPAND"); bool isDir = dd->subDirs().count()>0 || // there are subdirs (tocExpand && // or toc expand and dd->getFiles() && dd->getFiles()->count()>0 // there are files ); //printf("gd=`%s': pageDict=%d\n",gd->name().data(),gd->pageDict->count()); Doxygen::indexList.addContentsItem(isDir,dd->shortName(),dd->getReference(),dd->getOutputFileBase(),0); Doxygen::indexList.incContentsDepth(); if (ftv) { ftv->addContentsItem(isDir,dd->shortName(),dd->getReference(),dd->getOutputFileBase(),0); ftv->incContentsDepth(); } ol.startIndexListItem(); ol.startIndexItem(dd->getReference(),dd->getOutputFileBase()); ol.parseText(dd->shortName()); ol.endIndexItem(dd->getReference(),dd->getOutputFileBase()); if (dd->isReference()) { ol.startTypewriter(); ol.docify(" [external]"); ol.endTypewriter(); } // write sub directories if (dd->subDirs().count()>0) { startIndexHierarchy(ol,level+1); QListIterator dli(dd->subDirs()); DirDef *subdd = 0; for (dli.toFirst();(subdd=dli.current());++dli) { writeDirTreeNode(ol,subdd,level+1,ftv); } endIndexHierarchy(ol,level+1); } if (tocExpand) { // write files of this directory FileList *fileList=dd->getFiles(); if (fileList && fileList->count()>0) { FileDef *fd=fileList->first(); while (fd) { Doxygen::indexList.addContentsItem(FALSE, convertToHtml(fd->name(),TRUE),fd->getReference(), fd->getOutputFileBase(), 0); fd=fileList->next(); } } } ol.endIndexListItem(); Doxygen::indexList.decContentsDepth(); if (ftv) ftv->decContentsDepth(); } void writeDirHierarchy(OutputList &ol, FTVHelp* ftv) { if (ftv) { ol.pushGeneratorState(); ol.disable(OutputGenerator::Html); } startIndexHierarchy(ol,0); SDict::Iterator dli(*Doxygen::directories); DirDef *dd; for (dli.toFirst();(dd=dli.current());++dli) { if (dd->getOuterScope()==Doxygen::globalScope) writeDirTreeNode(ol,dd,0,ftv); } endIndexHierarchy(ol,0); if (ftv) ol.popGeneratorState(); } //---------------------------------------------------------------------------- void writeGroupIndex(OutputList &ol) { if (documentedGroups==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); startFile(ol,"modules",0,theTranslator->trModuleIndex().data(),HLI_Modules); startTitle(ol,0); QCString title = theTranslator->trModules(); //if (!Config_getString("PROJECT_NAME").isEmpty()) //{ // title.prepend(Config_getString("PROJECT_NAME")+" "); //} ol.parseText(title); endTitle(ol,0,0); ol.startContents(); ol.startTextBlock(); Doxygen::indexList.addContentsItem(TRUE,theTranslator->trModules(),0,"modules",0); Doxygen::indexList.incContentsDepth(); ol.parseText(theTranslator->trModulesDescription()); ol.endTextBlock(); FTVHelp* ftv = 0; bool treeView=Config_getBool("USE_INLINE_TREES"); if (treeView) { ftv = new FTVHelp(FALSE); } writeGroupHierarchy(ol,ftv); Doxygen::indexList.decContentsDepth(); if (ftv) { QGString outStr; FTextStream t(&outStr); ftv->generateTreeViewInline(t); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); ol.writeString(outStr); ol.popGeneratorState(); delete ftv; } endFile(ol); ol.popGeneratorState(); } //---------------------------------------------------------------------------- void writeDirIndex(OutputList &ol) { if (documentedDirs==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); startFile(ol,"dirs",0,theTranslator->trDirIndex().data(),HLI_Directories); startTitle(ol,0); QCString title = theTranslator->trDirectories(); //if (!Config_getString("PROJECT_NAME").isEmpty()) //{ // title.prepend(Config_getString("PROJECT_NAME")+" "); //} ol.parseText(title); endTitle(ol,0,0); ol.startContents(); ol.startTextBlock(); Doxygen::indexList.addContentsItem(TRUE,theTranslator->trDirIndex(),0,"dirs",0); Doxygen::indexList.incContentsDepth(); ol.parseText(theTranslator->trDirDescription()); ol.endTextBlock(); FTVHelp* ftv = 0; bool treeView=Config_getBool("USE_INLINE_TREES"); if (treeView) { ftv = new FTVHelp(FALSE); } writeDirHierarchy(ol,ftv); if (ftv) { QGString outStr; FTextStream t(&outStr); ftv->generateTreeViewInline(t); ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); ol.writeString(outStr); ol.popGeneratorState(); delete ftv; } Doxygen::indexList.decContentsDepth(); endFile(ol); ol.popGeneratorState(); } //---------------------------------------------------------------------------- static bool mainPageHasTitle() { if (Doxygen::mainPage==0) return FALSE; if (Doxygen::mainPage->title().isEmpty()) return FALSE; if (Doxygen::mainPage->title().lower()=="notitle") return FALSE; return TRUE; } //---------------------------------------------------------------------------- void writeIndex(OutputList &ol) { static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); // save old generator state ol.pushGeneratorState(); QCString projPrefix; if (!Config_getString("PROJECT_NAME").isEmpty()) { projPrefix=Config_getString("PROJECT_NAME")+" "; } //-------------------------------------------------------------------- // write HTML index //-------------------------------------------------------------------- ol.disableAllBut(OutputGenerator::Html); QCString defFileName = Doxygen::mainPage ? Doxygen::mainPage->getDefFileName().data() : "[generated]"; int defLine = Doxygen::mainPage ? Doxygen::mainPage->getDefLine() : -1; QCString title; if (!mainPageHasTitle()) { title = theTranslator->trMainPage(); } else { title = filterTitle(Doxygen::mainPage->title()); } QCString indexName=Config_getBool("GENERATE_TREEVIEW")?"main":"index"; ol.startFile(indexName,0,title); if (Doxygen::mainPage) { Doxygen::indexList.addContentsItem(Doxygen::mainPage->hasSubPages(),title,0,indexName,0); if (Doxygen::mainPage->hasSubPages()) { writeSubPages(Doxygen::mainPage); } } if (!Config_getBool("DISABLE_INDEX")) { ol.startQuickIndices(); ol.writeQuickLinks(TRUE,HLI_Main); ol.endQuickIndices(); } bool headerWritten=FALSE; if (Doxygen::mainPage && !Doxygen::mainPage->title().isEmpty()) { if (Doxygen::mainPage->title().lower()!="notitle") { ol.startHeaderSection(); ol.startTitleHead(0); ol.parseDoc(Doxygen::mainPage->docFile(),Doxygen::mainPage->docLine(), Doxygen::mainPage,0,Doxygen::mainPage->title(), TRUE,FALSE,0,TRUE,FALSE); headerWritten = TRUE; } } else { if (!Config_getString("PROJECT_NAME").isEmpty()) { ol.startHeaderSection(); ol.startTitleHead(0); ol.parseText(projPrefix+theTranslator->trDocumentation()); headerWritten = TRUE; } } if (headerWritten) { ol.endTitleHead(0,0); ol.endHeaderSection(); } ol.startContents(); // ol.newParagraph(); // FIXME:PARA if (!Config_getString("PROJECT_NUMBER").isEmpty()) { ol.startProjectNumber(); ol.parseDoc(defFileName,defLine, Doxygen::mainPage,0, Config_getString("PROJECT_NUMBER"), TRUE,FALSE,0, TRUE,FALSE); ol.endProjectNumber(); } if (Config_getBool("DISABLE_INDEX") && Doxygen::mainPage==0) { ol.writeQuickLinks(FALSE,HLI_Main); } if (Doxygen::mainPage) { Doxygen::insideMainPage=TRUE; ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0, Doxygen::mainPage->documentation(),TRUE,FALSE /*,Doxygen::mainPage->sectionDict*/); if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { Doxygen::tagFile << " " << endl << " " << convertToXML(Doxygen::mainPage->name()) << "" << endl << " " << convertToXML(Doxygen::mainPage->title()) << "" << endl << " " << convertToXML(Doxygen::mainPage->getOutputFileBase()) << "" << endl; Doxygen::mainPage->writeDocAnchorsToTagFile(); Doxygen::tagFile << " " << endl; } Doxygen::insideMainPage=FALSE; } endFile(ol); ol.disable(OutputGenerator::Html); //-------------------------------------------------------------------- // write LaTeX/RTF index //-------------------------------------------------------------------- ol.enable(OutputGenerator::Latex); ol.enable(OutputGenerator::RTF); ol.startFile("refman",0,0); ol.startIndexSection(isTitlePageStart); if (!Config_getString("LATEX_HEADER").isEmpty()) { ol.disable(OutputGenerator::Latex); } if (projPrefix.isEmpty()) { ol.parseText(theTranslator->trReferenceManual()); } else { ol.parseText(projPrefix); } if (!Config_getString("PROJECT_NUMBER").isEmpty()) { ol.startProjectNumber(); ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),FALSE,FALSE); ol.endProjectNumber(); } ol.endIndexSection(isTitlePageStart); ol.startIndexSection(isTitlePageAuthor); ol.parseText(theTranslator->trGeneratedBy()); ol.endIndexSection(isTitlePageAuthor); ol.enable(OutputGenerator::Latex); ol.lastIndexPage(); if (Doxygen::mainPage) { ol.startIndexSection(isMainPage); if (mainPageHasTitle()) { ol.parseText(Doxygen::mainPage->title()); } else { ol.parseText(/*projPrefix+*/theTranslator->trMainPage()); } ol.endIndexSection(isMainPage); } if (documentedPages>0) { //ol.parseText(projPrefix+theTranslator->trPageDocumentation()); //ol.endIndexSection(isPageDocumentation); PageSDict::Iterator pdi(*Doxygen::pageSDict); PageDef *pd=pdi.toFirst(); bool first=Doxygen::mainPage==0; for (pdi.toFirst();(pd=pdi.current());++pdi) { if (!pd->getGroupDef() && !pd->isReference() && (!pd->hasParentPage() || // not inside other page (Doxygen::mainPage==pd->getOuterScope())) // or inside main page ) { QCString title = pd->title(); if (title.isEmpty()) title=pd->name(); ol.startIndexSection(isPageDocumentation); ol.parseText(title); ol.endIndexSection(isPageDocumentation); ol.pushGeneratorState(); // write TOC title (RTF only) ol.disableAllBut(OutputGenerator::RTF); ol.startIndexSection(isPageDocumentation2); ol.parseText(title); ol.endIndexSection(isPageDocumentation2); ol.popGeneratorState(); ol.writeAnchor(0,pd->name()); ol.writePageLink(pd->getOutputFileBase(),first); first=FALSE; } } } if (!Config_getBool("LATEX_HIDE_INDICES")) { //if (indexedPages>0) //{ // ol.startIndexSection(isPageIndex); // ol.parseText(/*projPrefix+*/ theTranslator->trPageIndex()); // ol.endIndexSection(isPageIndex); //} if (documentedGroups>0) { ol.startIndexSection(isModuleIndex); ol.parseText(/*projPrefix+*/ theTranslator->trModuleIndex()); ol.endIndexSection(isModuleIndex); } if (Config_getBool("SHOW_DIRECTORIES") && documentedDirs>0) { ol.startIndexSection(isDirIndex); ol.parseText(/*projPrefix+*/ theTranslator->trDirIndex()); ol.endIndexSection(isDirIndex); } if (documentedNamespaces>0) { ol.startIndexSection(isNamespaceIndex); ol.parseText(/*projPrefix+*/(fortranOpt?theTranslator->trModulesIndex():theTranslator->trNamespaceIndex())); ol.endIndexSection(isNamespaceIndex); } if (hierarchyClasses>0) { ol.startIndexSection(isClassHierarchyIndex); ol.parseText(/*projPrefix+*/ (fortranOpt ? theTranslator->trCompoundIndexFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitIndex() : theTranslator->trCompoundIndex() )); ol.endIndexSection(isClassHierarchyIndex); } if (annotatedClasses>0) { ol.startIndexSection(isCompoundIndex); ol.parseText(/*projPrefix+*/ (fortranOpt ? theTranslator->trCompoundIndexFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitIndex() : theTranslator->trCompoundIndex() )); ol.endIndexSection(isCompoundIndex); } if (documentedFiles>0) { ol.startIndexSection(isFileIndex); ol.parseText(/*projPrefix+*/theTranslator->trFileIndex()); ol.endIndexSection(isFileIndex); } } if (documentedGroups>0) { ol.startIndexSection(isModuleDocumentation); ol.parseText(/*projPrefix+*/theTranslator->trModuleDocumentation()); ol.endIndexSection(isModuleDocumentation); } if (Config_getBool("SHOW_DIRECTORIES") && documentedDirs>0) { ol.startIndexSection(isDirDocumentation); ol.parseText(/*projPrefix+*/theTranslator->trDirDocumentation()); ol.endIndexSection(isDirDocumentation); } if (documentedNamespaces>0) { ol.startIndexSection(isNamespaceDocumentation); ol.parseText(/*projPrefix+*/(fortranOpt?theTranslator->trModuleDocumentation():theTranslator->trNamespaceDocumentation())); ol.endIndexSection(isNamespaceDocumentation); } if (annotatedClasses>0) { ol.startIndexSection(isClassDocumentation); ol.parseText(/*projPrefix+*/(fortranOpt?theTranslator->trTypeDocumentation():theTranslator->trClassDocumentation())); ol.endIndexSection(isClassDocumentation); } if (documentedFiles>0) { ol.startIndexSection(isFileDocumentation); ol.parseText(/*projPrefix+*/theTranslator->trFileDocumentation()); ol.endIndexSection(isFileDocumentation); } if (Doxygen::exampleSDict->count()>0) { ol.startIndexSection(isExampleDocumentation); ol.parseText(/*projPrefix+*/theTranslator->trExampleDocumentation()); ol.endIndexSection(isExampleDocumentation); } ol.endIndexSection(isEndIndex); endFile(ol); if (Doxygen::mainPage) { Doxygen::insideMainPage=TRUE; ol.disable(OutputGenerator::Man); startFile(ol,Doxygen::mainPage->name(),0,Doxygen::mainPage->title()); ol.startContents(); ol.startTextBlock(); ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0, Doxygen::mainPage->documentation(),FALSE,FALSE ); ol.endTextBlock(); endFile(ol); ol.enable(OutputGenerator::Man); Doxygen::insideMainPage=FALSE; } ol.popGeneratorState(); }