diff options
author | Dimitri van Heesch <dimitri@stack.nl> | 2011-12-26 14:28:40 (GMT) |
---|---|---|
committer | Dimitri van Heesch <dimitri@stack.nl> | 2011-12-26 14:28:40 (GMT) |
commit | 8a65c23b74c33c38b4d1234e76cec74bd08cea69 (patch) | |
tree | 7f59fc72959fc8ac950d4affd83be0c3b2b4cf2b /src | |
parent | b625258a2f46f61e85bf473dfa64b719755c3b71 (diff) | |
download | Doxygen-8a65c23b74c33c38b4d1234e76cec74bd08cea69.zip Doxygen-8a65c23b74c33c38b4d1234e76cec74bd08cea69.tar.gz Doxygen-8a65c23b74c33c38b4d1234e76cec74bd08cea69.tar.bz2 |
Release-1.7.6.1-20111226
Diffstat (limited to 'src')
49 files changed, 1283 insertions, 1006 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp index a0b1527..be7429e 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -1745,7 +1745,7 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade Doxygen::tagFile << " <class kind=\"" << compoundTypeString() << "\">" << convertToXML(name()) << "</class>" << endl; } - ol.startMemberItem(FALSE); + ol.startMemberItem(anchor(),FALSE); QCString ctype = compoundTypeString(); QCString cname; if (localNames) @@ -1792,7 +1792,7 @@ void ClassDef::writeDeclarationLink(OutputList &ol,bool &found,const char *heade // add the brief description if available if (!briefDescription().isEmpty()) { - ol.startMemberDescription(); + ol.startMemberDescription(anchor()); ol.parseDoc(briefFile(),briefLine(),this,0, briefDescription(),FALSE,FALSE,0,TRUE,FALSE); if (isLinkableInProject()) @@ -2001,7 +2001,7 @@ void ClassDef::writeMemberPages(OutputList &ol) { if (ml->listType()&MemberList::detailedLists) { - ml->writeDocumentationPage(ol,name(),this); + ml->writeDocumentationPage(ol,displayName(),this); } } @@ -3737,7 +3737,7 @@ void ClassDef::writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,c { //printf("%s: ClassDef::writeMemberDocumentation()\n",name().data()); MemberList * ml = getMemberList(lt); - if (ml) ml->writeDocumentation(ol,name(),this,title,FALSE,showInline); + if (ml) ml->writeDocumentation(ol,displayName(),this,title,FALSE,showInline); } void ClassDef::writeSimpleMemberDocumentation(OutputList &ol,MemberList::ListType lt) @@ -140,6 +140,7 @@ static int g_braceCount=0; static void saveObjCContext(); static void restoreObjCContext(); +static QCString g_forceTagReference; //------------------------------------------------------------------- @@ -780,7 +781,9 @@ static MemberDef *setCallContextForVar(const QCString &name) // in case there are multiple members we could link to, we // only link to members if defined in the same file or // defined as external. - if (!md->isStatic() || md->getBodyDef()==g_sourceFileDef) + if ((!md->isStatic() || md->getBodyDef()==g_sourceFileDef) && + (g_forceTagReference.isEmpty() || g_forceTagReference==md->getReference()) + ) { g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope())); //printf("returning member %s in source file %s\n",md->name().data(),g_sourceFileDef->name().data()); @@ -868,7 +871,7 @@ static bool getLinkInScope(const QCString &c, // scope NamespaceDef *nd; GroupDef *gd; //fprintf(stderr,"getLinkInScope: trying `%s'::`%s' varOnly=%d\n",c.data(),m.data(),varOnly); - if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) && + if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef,FALSE,g_forceTagReference) && md->isLinkable() && (!varOnly || md->isVariable())) { if (g_exampleBlock) @@ -887,7 +890,6 @@ static bool getLinkInScope(const QCString &c, // scope Definition *d = md->getOuterScope()==Doxygen::globalScope ? md->getBodyDef() : md->getOuterScope(); if (md->getGroupDef()) d = md->getGroupDef(); - //fprintf(stderr,"d=%p linkable=%d\n",d,d?d->isLinkable():0); if (d && d->isLinkable()) { g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope())); @@ -1062,9 +1064,26 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName, //fprintf(stderr,"is a global md=%p g_currentDefinition=%s linkable=%d\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>",md->isLinkable()); if (md->isLinkable()) { + QCString text; + if (!g_forceTagReference.isEmpty()) // explicit reference to symbol in tag file + { + text=g_forceTagReference; + if (text.right(4)==".tag") // strip .tag if present + { + text=text.left(text.length()-4); + } + text+=getLanguageSpecificSeparator(md->getLanguage()); + text+=clName; + md->setName(text); + md->setLocalName(text); + } + else // normal reference + { + text=clName; + } ol.linkableSymbol(g_yyLineNr,md->name(),md, g_currentMemberDef ? g_currentMemberDef : g_currentDefinition); - writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),clName,md->briefDescriptionAsTooltip()); + writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),text,md->briefDescriptionAsTooltip()); addToSearchIndex(clName); if (g_currentMemberDef) { @@ -1260,6 +1279,13 @@ static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName, static void generateFunctionLink(CodeOutputInterface &ol,char *funcName) { + //CodeClassDef *ccd=0; + ClassDef *ccd=0; + QCString locScope=g_classScope; + QCString locFunc=removeRedundantWhiteSpace(funcName); + //fprintf(stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data()); + int len=2; + int i=locFunc.findRev("::"); if (g_currentMemberDef && g_currentMemberDef->getClassDef() && funcName==g_currentMemberDef->localName() && g_currentMemberDef->getDefLine()==g_yyLineNr && @@ -1272,15 +1298,8 @@ static void generateFunctionLink(CodeOutputInterface &ol,char *funcName) // in case of overloaded methods, this will make sure that we link to // the correct method, and thereby get the correct reimplemented relations. // See also bug 549022. - return; + goto exit; } - //CodeClassDef *ccd=0; - ClassDef *ccd=0; - QCString locScope=g_classScope; - QCString locFunc=removeRedundantWhiteSpace(funcName); - //fprintf(stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data()); - int len=2; - int i=locFunc.findRev("::"); if (i==-1) i=locFunc.findRev("."),len=1; if (i==-1) i=locFunc.findRev("\\"),len=1; // for PHP if (i>0) @@ -1314,7 +1333,7 @@ static void generateFunctionLink(CodeOutputInterface &ol,char *funcName) { if (getLink(bcli.current()->classDef->name(),locFunc,ol,funcName)) { - return; + goto exit; } } } @@ -1323,6 +1342,8 @@ static void generateFunctionLink(CodeOutputInterface &ol,char *funcName) { generateClassOrGlobalLink(ol,funcName); } +exit: + g_forceTagReference.resize(0); return; } @@ -3216,6 +3237,12 @@ OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP} endFontClass(); } } +<*>"/*[tag:"[^\]\n]*"]*/"{B}* { // special pattern /*[tag:filename]*/ to force linking to a tag file + g_forceTagReference=yytext; + int s=g_forceTagReference.find(':'); + int e=g_forceTagReference.findRev(']'); + g_forceTagReference = g_forceTagReference.mid(s+1,e-s-1); + } <*>\n{B}*"/*"[!*]/[^/*] { if (Config_getBool("STRIP_CODE_COMMENTS")) { @@ -3381,6 +3408,7 @@ static void restoreObjCContext() void resetCCodeParserState() { //printf("***initParseCodeContext()\n"); + g_forceTagReference.resize(0); g_theVarContext.clear(); g_classScopeLengthStack.setAutoDelete(TRUE); g_classScopeLengthStack.clear(); diff --git a/src/definition.cpp b/src/definition.cpp index 911e156..3a61b7b 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -37,6 +37,7 @@ #include "parserintf.h" #include "marshal.h" #include "debug.h" +#include "vhdldocgen.h" #define START_MARKER 0x4445465B // DEF[ #define END_MARKER 0x4445465D // DEF] @@ -864,6 +865,14 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName) //printf("Read:\n`%s'\n\n",codeFragment.data()); MemberDef *thisMd = 0; if (definitionType()==TypeMember) thisMd = (MemberDef *)this; + + // vhdl parser can' t start at an arbitrary point in the source code + if(this->getLanguage()==SrcLangExt_VHDL) + { + if (thisMd) VhdlDocGen::writeCodeFragment(ol,actualStart,codeFragment,thisMd); + return; + } + ol.startCodeFragment(); pIntf->parseCode(ol, // codeOutIntf scopeName, // scope @@ -1112,12 +1121,12 @@ void Definition::addInnerCompound(Definition *) QCString Definition::qualifiedName() const { - static int count=0; - count++; + //static int count=0; + //count++; makeResident(); if (!m_impl->qualifiedName.isEmpty()) { - count--; + //count--; return m_impl->qualifiedName; } @@ -1126,12 +1135,12 @@ QCString Definition::qualifiedName() const { if (m_impl->localName=="<globalScope>") { - count--; + //count--; return ""; } else { - count--; + //count--; return m_impl->localName; } } @@ -1142,10 +1151,12 @@ QCString Definition::qualifiedName() const } else { - m_impl->qualifiedName = m_impl->outerScope->qualifiedName()+"::"+m_impl->localName; + m_impl->qualifiedName = m_impl->outerScope->qualifiedName()+ + getLanguageSpecificSeparator(getLanguage())+ + m_impl->localName; } //printf("end %s::qualifiedName()=%s\n",name().data(),m_impl->qualifiedName.data()); - count--; + //count--; return m_impl->qualifiedName; }; diff --git a/src/definition.h b/src/definition.h index 94d1edc..8c6bda3 100644 --- a/src/definition.h +++ b/src/definition.h @@ -116,6 +116,9 @@ class Definition : public DefinitionIntf, public LockableObj /*! Returns the name of the definition */ const QCString& name() const { return m_name; } + /*! Returns the name of the definition as it appears in the output */ + virtual QCString displayName() const = 0; + /*! Returns the local name without any scope qualifiers. */ QCString localName() const; @@ -323,9 +326,9 @@ class Definition : public DefinitionIntf, public LockableObj * the Doxygen::tagFile stream. */ void writeDocAnchorsToTagFile(); + void setLocalName(const QCString name); protected: - void setLocalName(const QCString name); virtual void flushToDisk() const; virtual void loadFromDisk() const; diff --git a/src/dirdef.cpp b/src/dirdef.cpp index 582bdb0..05ab52f 100644 --- a/src/dirdef.cpp +++ b/src/dirdef.cpp @@ -213,7 +213,7 @@ void DirDef::writeSubDirList(OutputList &ol) DirDef *dd=m_subdirs.first(); while (dd) { - ol.startMemberItem(0); + ol.startMemberItem(dd->getOutputFileBase(),0); ol.parseText(theTranslator->trDir(FALSE,TRUE)+" "); ol.insertMemberAlign(); ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),0,dd->shortName()); @@ -224,7 +224,7 @@ void DirDef::writeSubDirList(OutputList &ol) } if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { - ol.startMemberDescription(); + ol.startMemberDescription(dd->getOutputFileBase()); ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(), FALSE, // indexWords FALSE, // isExample @@ -253,7 +253,7 @@ void DirDef::writeFileList(OutputList &ol) FileDef *fd=m_fileList->first(); while (fd) { - ol.startMemberItem(0); + ol.startMemberItem(fd->getOutputFileBase(),0); ol.docify(theTranslator->trFile(FALSE,TRUE)+" "); ol.insertMemberAlign(); if (fd->isLinkable()) @@ -285,7 +285,7 @@ void DirDef::writeFileList(OutputList &ol) ol.endMemberItem(); if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { - ol.startMemberDescription(); + ol.startMemberDescription(fd->getOutputFileBase()); ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(), FALSE, // indexWords FALSE, // isExample diff --git a/src/docparser.cpp b/src/docparser.cpp index 480a77a..48810ed 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -5771,6 +5771,7 @@ int DocPara::handleHtmlEndTag(const QCString &tagName) break; case HTML_P: // ignore </p> tag + retval=TK_NEWPARA; break; case HTML_DL: retval=RetVal_EndDesc; diff --git a/src/docparser.h b/src/docparser.h index 7c0c6a9..1e1fb0e 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -1244,6 +1244,7 @@ class DocRoot : public CompAccept<DocRoot>, public DocNode void parse(); bool indent() const { return m_indent; } bool singleLine() const { return m_singleLine; } + const QList<DocNode> &children() const { return m_children; } private: bool m_indent; diff --git a/src/dot.cpp b/src/dot.cpp index 5d21b43..f3e524d 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -1517,7 +1517,7 @@ static QCString escapeTooltip(const QCString &tooltip) static void writeBoxMemberList(FTextStream &t, char prot,MemberList *ml,ClassDef *scope, - bool isStatic=FALSE) + bool isStatic=FALSE,const QDict<void> *skipNames=0) { (void)isStatic; if (ml) @@ -1527,7 +1527,8 @@ static void writeBoxMemberList(FTextStream &t, int totalCount=0; for (mlia.toFirst();(mma = mlia.current());++mlia) { - if (mma->getClassDef() == scope) + if (mma->getClassDef()==scope && + (skipNames==0 || skipNames->find(mma->name())==0)) { totalCount++; } @@ -1536,7 +1537,8 @@ static void writeBoxMemberList(FTextStream &t, int count=0; for (mlia.toFirst();(mma = mlia.current());++mlia) { - if (mma->getClassDef() == scope) + if (mma->getClassDef() == scope && + (skipNames==0 || skipNames->find(mma->name())==0)) { if (totalCount>=15 && count>=10) { @@ -1565,7 +1567,7 @@ static void writeBoxMemberList(FTextStream &t, { if (mg->members()) { - writeBoxMemberList(t,prot,mg->members(),scope); + writeBoxMemberList(t,prot,mg->members(),scope,isStatic,skipNames); } } } @@ -1588,21 +1590,34 @@ void DotNode::writeBox(FTextStream &t, if (m_classDef && umlLook && (gt==Inheritance || gt==Collaboration)) { + // add names shown as relation to a dictionary, so we don't show + // them as attributes as well + QDict<void> arrowNames(17); + QListIterator<EdgeInfo> li(*m_edgeInfo); + EdgeInfo *ei; + for (li.toFirst();(ei=li.current());++li) + { + if (!ei->m_label.isEmpty()) + { + arrowNames.insert(ei->m_label,(void*)0x8); + } + } + //printf("DotNode::writeBox for %s\n",m_classDef->name().data()); static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); t << "{" << convertLabel(m_label); t << "\\n|"; - writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubAttribs),m_classDef); - writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubStaticAttribs),m_classDef,TRUE); - writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::properties),m_classDef); - writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacAttribs),m_classDef); - writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacStaticAttribs),m_classDef,TRUE); - writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proAttribs),m_classDef); - writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proStaticAttribs),m_classDef,TRUE); + writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubAttribs),m_classDef,FALSE,&arrowNames); + writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubStaticAttribs),m_classDef,TRUE,&arrowNames); + writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::properties),m_classDef,FALSE,&arrowNames); + writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacAttribs),m_classDef,FALSE,&arrowNames); + writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacStaticAttribs),m_classDef,TRUE,&arrowNames); + writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proAttribs),m_classDef,FALSE,&arrowNames); + writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proStaticAttribs),m_classDef,TRUE,&arrowNames); if (extractPrivate) { - writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priAttribs),m_classDef); - writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priStaticAttribs),m_classDef,TRUE); + writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priAttribs),m_classDef,FALSE,&arrowNames); + writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priStaticAttribs),m_classDef,TRUE,&arrowNames); } t << "|"; writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubMethods),m_classDef); @@ -1628,7 +1643,7 @@ void DotNode::writeBox(FTextStream &t, { if (mg->members()) { - writeBoxMemberList(t,'*',mg->members(),m_classDef); + writeBoxMemberList(t,'*',mg->members(),m_classDef,FALSE,&arrowNames); } } } diff --git a/src/doxygen.cpp b/src/doxygen.cpp index b790410..d200a47 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -922,7 +922,7 @@ static Definition *buildScopeFromQualifiedName(const QCString name,int level) else if (nd==0 && cd==0) // scope is not known! { // introduce bogus namespace - //printf("++ adding dummy namespace %s to %s\n",nsName.data(),prevScope->name().data()); + printf("++ adding dummy namespace %s to %s\n",nsName.data(),prevScope->name().data()); nd=new NamespaceDef( "[generated]",1,fullScope); @@ -2226,13 +2226,14 @@ static MemberDef *addVariableToFile( Entry *root = rootNav->entry(); Debug::print(Debug::Variables,0, " global variable:\n" - " type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d mtype=%d\n", + " type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d mtype=%d lang=%d\n", root->type.data(), scope.data(), name.data(), root->args.data(), root->protection, - mtype + mtype, + root->lang ); FileDef *fd = rootNav->fileDef(); @@ -2421,18 +2422,21 @@ static MemberDef *addVariableToFile( /*! See if the return type string \a type is that of a function pointer * \returns -1 if this is not a function pointer variable or - * the index at which the brace of (...*name) was found. + * the index at which the closing brace of (...*name) was found. */ static int findFunctionPtr(const QCString &type,int lang, int *pLength=0) { if (lang == SrcLangExt_Fortran) return -1; // Fortran does not have function pointers static const QRegExp re("([^)]*[\\*\\^][^)]*)"); int i=-1,l; + int bb=type.find('<'); + int be=type.findRev('>'); if (!type.isEmpty() && // return type is non-empty (i=re.match(type,0,&l))!=-1 && // contains (...*...) type.find("operator")==-1 && // not an operator - (type.find(")(")==-1 || type.find("typedef ")!=-1) + (type.find(")(")==-1 || type.find("typedef ")!=-1) && // not a function pointer return type + !(bb<i && i<be) // bug665855: avoid treating "typedef A<void (T*)> type" as a function pointer ) { if (pLength) *pLength=l; @@ -2610,6 +2614,7 @@ static void addVariable(EntryNav *rootNav,int isFuncPtr=-1) { int i=isFuncPtr; if (i==-1) i=findFunctionPtr(root->type,root->lang); // for typedefs isFuncPtr is not yet set + Debug::print(Debug::Variables,0," functionPtr? %s\n",i!=-1?"yes":"no"); if (i!=-1) // function pointer { int ai = root->type.find('[',i); @@ -10212,7 +10217,7 @@ void parseInput() **************************************************************************/ LayoutDocManager::instance().init(); - QCString layoutFileName = Config_getString("LAYOUT_FILE"); + QCString &layoutFileName = Config_getString("LAYOUT_FILE"); bool defaultLayoutUsed = FALSE; if (layoutFileName.isEmpty()) { @@ -10406,7 +10411,10 @@ void parseInput() computeTemplateClassRelations(); flushUnresolvedRelations(); computeClassRelations(); - //VhdlDocGen::computeVhdlComponentRelations(); // @MARTIN: removed because it breaks non-vhdl code + if (Config_getBool("OPTIMIZE_OUTPUT_VHDL")) + { + VhdlDocGen::computeVhdlComponentRelations(); + } g_classEntries.clear(); msg("Add enum values to enums...\n"); @@ -10528,19 +10536,6 @@ void generateOutput() **************************************************************************/ //// dump all symbols - //SDict<DefinitionList>::Iterator sdi(Doxygen::symbolMap); - //DefinitionList *dl; - //for (sdi.toFirst();(dl=sdi.current());++sdi) - //{ - // DefinitionListIterator dli(*dl); - // Definition *d; - // printf("Symbol: "); - // for (dli.toFirst();(d=dli.current());++dli) - // { - // printf("%s ",d->qualifiedName().data()); - // } - // printf("\n"); - //} if (g_dumpSymbolMap) { dumpSymbolMap(); @@ -10555,11 +10550,12 @@ void generateOutput() g_outputList->add(new HtmlGenerator); HtmlGenerator::init(); - bool generateHtmlHelp = Config_getBool("GENERATE_HTMLHELP"); + // add HTML indexers that are enabled + bool generateHtmlHelp = Config_getBool("GENERATE_HTMLHELP"); bool generateEclipseHelp = Config_getBool("GENERATE_ECLIPSEHELP"); - bool generateQhp = Config_getBool("GENERATE_QHP"); - bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); - bool generateDocSet = Config_getBool("GENERATE_DOCSET"); + bool generateQhp = Config_getBool("GENERATE_QHP"); + bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); + bool generateDocSet = Config_getBool("GENERATE_DOCSET"); if (generateEclipseHelp) Doxygen::indexList.addIndex(new EclipseHelp); if (generateHtmlHelp) Doxygen::indexList.addIndex(new HtmlHelp); if (generateQhp) Doxygen::indexList.addIndex(new Qhp); @@ -10568,10 +10564,7 @@ void generateOutput() Doxygen::indexList.initialize(); HtmlGenerator::writeTabData(); -#if 0 - if (Config_getBool("GENERATE_INDEXLOG")) Doxygen::indexList.addIndex(new IndexLog); -#endif - //if (Config_getBool("HTML_DYNAMIC_SECTIONS")) HtmlGenerator::generateSectionImages(); + // copy static stuff copyStyleSheet(); copyLogo(); copyExtraFiles(); @@ -10672,17 +10665,6 @@ void generateOutput() } } - //statistics(); - - // count the number of documented elements in the lists we have built. - // If the result is 0 we do not generate the lists and omit the - // corresponding links in the index. - //msg("Generating index page...\n"); - //writeIndex(*g_outputList); - - //msg("Generating page index...\n"); - //writePageIndex(*g_outputList); - msg("Generating example documentation...\n"); generateExampleDocs(); @@ -10701,24 +10683,12 @@ void generateOutput() msg("Generating group documentation...\n"); generateGroupDocs(); - //msg("Generating group index...\n"); - //writeGroupIndex(*g_outputList); - msg("Generating class documentation...\n"); generateClassDocs(); - //if (Config_getBool("HAVE_DOT") && Config_getBool("GRAPHICAL_HIERARCHY")) - //{ - // msg("Generating graphical class hierarchy...\n"); - // writeGraphicalClassHierarchy(*g_outputList); - //} - msg("Generating namespace index...\n"); generateNamespaceDocs(); - //msg("Generating namespace member index...\n"); - //writeNamespaceMemberIndex(*g_outputList); - if (Config_getBool("GENERATE_LEGEND")) { msg("Generating graph info page...\n"); @@ -10731,24 +10701,6 @@ void generateOutput() generateDirDocs(*g_outputList); } - //msg("Generating file index...\n"); - //writeFileIndex(*g_outputList); - - //if (Config_getBool("SHOW_DIRECTORIES")) - //{ - // msg("Generating directory index...\n"); - // writeDirIndex(*g_outputList); - //} - - //msg("Generating example index...\n"); - //writeExampleIndex(*g_outputList); - - //msg("Generating file member index...\n"); - //writeFileMemberIndex(*g_outputList); - - - //writeDirDependencyGraph(Config_getString("HTML_OUTPUT")); - if (Doxygen::formulaList.count()>0 && Config_getBool("GENERATE_HTML") && !Config_getBool("USE_MATHJAX")) { @@ -10756,15 +10708,6 @@ void generateOutput() Doxygen::formulaList.generateBitmaps(Config_getString("HTML_OUTPUT")); } - //if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP")) - //{ - // HtmlHelp::getInstance()->finalize(); - //} - //if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_TREEVIEW")) - //{ - // FTVHelp::getInstance()->finalize(); - //} - writeIndexHierarchy(*g_outputList); msg("finalizing index lists...\n"); @@ -10897,8 +10840,6 @@ void generateOutput() * Start cleaning up * **************************************************************************/ - //Doxygen::symbolCache->printStats(); - //Doxygen::symbolStorage->printStats(); cleanUpDoxygen(); finializeDocParser(); diff --git a/src/filedef.h b/src/filedef.h index 6cecbdf..34b6424 100644 --- a/src/filedef.h +++ b/src/filedef.h @@ -80,11 +80,8 @@ class FileDef : public Definition else return Definition::name(); } - - QCString fileName() const - { - return filename; - } + QCString displayName() const { return name(); } + QCString fileName() const { return filename; } QCString getOutputFileBase() const { return convertNameToFile(diskname); } diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index 9ed02c9..7dd03c4 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -578,6 +578,26 @@ void FTVHelp::addContentsItem(bool isDir, } +static QCString node2URL(FTVNode *n) +{ + QCString url = n->file; + if (!url.isEmpty() && url.at(0)=='!') // relative URL + { + // remove leading ! + url = url.mid(1); + } + else if (!url.isEmpty() && url.at(0)=='^') // absolute URL + { + // skip, keep ^ in the output + } + else // local file (with optional anchor) + { + url+=Doxygen::htmlFileExtension; + if (!n->anchor.isEmpty()) url+="#"+n->anchor; + } + return url; +} + void FTVHelp::generateIndent(FTextStream &t, FTVNode *n,int level) { @@ -645,8 +665,7 @@ void FTVHelp::generateLink(FTextStream &t,FTVNode *n) } t << "href=\""; t << externalRef("",n->ref,TRUE); - t << n->file << Doxygen::htmlFileExtension; - if (!n->anchor.isEmpty()) t << "#" << n->anchor; + t << node2URL(n); if (m_topLevelIndex) t << "\" target=\"basefrm\">"; else @@ -672,8 +691,7 @@ void FTVHelp::generateJSLink(FTextStream &t,FTVNode *n) // TODO: use m_topLevelIndex t << "\"" << convertToJSString(n->name) << "\", \""; t << externalRef("",n->ref,TRUE); - t << n->file << Doxygen::htmlFileExtension; - if (!n->anchor.isEmpty()) t << "#" << n->anchor; + t << node2URL(n); t << "\", "; } } @@ -756,9 +774,7 @@ bool FTVHelp::generateJSTree(FTextStream &tidx,FTextStream &t, const QList<FTVNo //if (!n->file.isEmpty() && !childOfHierarchy(n->parent)) if (n->addToNavIndex) { - tidx << "," << endl << "\"" << n->file << Doxygen::htmlFileExtension; - if (!n->anchor.isEmpty()) tidx << "#" << n->anchor; - tidx << "\":["; + tidx << "," << endl << "\"" << node2URL(n) << "\":["; writePathToNode(tidx,n,n); tidx << "]"; } @@ -847,9 +863,11 @@ void FTVHelp::generateTreeViewScripts() bool first=TRUE; generateJSTree(tidx,t,m_indentNodes[0],1,first); - if (first) t << "]"; - t << endl << " ] ]" << endl; + if (first) + t << "]" << endl; + else + t << endl << " ] ]" << endl; t << "];" << endl; t << endl << navtree_script; diff --git a/src/groupdef.cpp b/src/groupdef.cpp index a12fc42..8452aa2 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -646,7 +646,7 @@ void GroupDef::writeFiles(OutputList &ol,const QCString &title) FileDef *fd=fileList->first(); while (fd) { - ol.startMemberItem(0); + ol.startMemberItem(fd->getOutputFileBase(),0); ol.docify(theTranslator->trFile(FALSE,TRUE)+" "); ol.insertMemberAlign(); ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name()); @@ -657,7 +657,7 @@ void GroupDef::writeFiles(OutputList &ol,const QCString &title) ol.endMemberItem(); if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { - ol.startMemberDescription(); + ol.startMemberDescription(fd->getOutputFileBase()); ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); } @@ -685,7 +685,7 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title) GroupDef *gd=groupList->first(); while (gd) { - ol.startMemberItem(0); + ol.startMemberItem(gd->getOutputFileBase(),0); //ol.docify(theTranslator->trGroup(FALSE,TRUE)); //ol.docify(" "); ol.insertMemberAlign(); @@ -697,7 +697,7 @@ void GroupDef::writeNestedGroups(OutputList &ol,const QCString &title) ol.endMemberItem(); if (!gd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { - ol.startMemberDescription(); + ol.startMemberDescription(gd->getOutputFileBase()); ol.parseDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE); ol.endMemberDescription(); } @@ -719,7 +719,7 @@ void GroupDef::writeDirs(OutputList &ol,const QCString &title) DirDef *dd=dirList->first(); while (dd) { - ol.startMemberItem(0); + ol.startMemberItem(dd->getOutputFileBase(),0); ol.parseText(theTranslator->trDir(FALSE,TRUE)); ol.insertMemberAlign(); ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),0,dd->shortName()); @@ -730,8 +730,8 @@ void GroupDef::writeDirs(OutputList &ol,const QCString &title) } if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { - ol.startMemberDescription(); - ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE); + ol.startMemberDescription(dd->getOutputFileBase()); + ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE,0,TRUE,FALSE); ol.endMemberDescription(); } dd=dirList->next(); @@ -776,7 +776,7 @@ void GroupDef::writePageDocumentation(OutputList &ol) ol.endSection(si->label,SectionInfo::Subsection); } ol.startTextBlock(); - ol.parseDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation()+pd->inbodyDocumentation(),TRUE,FALSE); + ol.parseDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation()+pd->inbodyDocumentation(),TRUE,FALSE,0,TRUE,FALSE); ol.endTextBlock(); } } @@ -1443,3 +1443,8 @@ void GroupDef::removeMemberFromList(MemberList::ListType lt,MemberDef *md) if (ml) ml->remove(md); } +void GroupDef::sortSubGroups() +{ + groupList->sort(); +} + diff --git a/src/groupdef.h b/src/groupdef.h index effefac..002b037 100644 --- a/src/groupdef.h +++ b/src/groupdef.h @@ -49,9 +49,10 @@ class GroupDef : public Definition DefType definitionType() const { return TypeGroup; } QCString getOutputFileBase() const; QCString anchor() const { return QCString(); } + QCString displayName() const { return hasGroupTitle() ? title : Definition::name(); } const char *groupTitle() const { return title; } void setGroupTitle( const char *newtitle ); - bool hasGroupTitle( ) { return titleSet; } + bool hasGroupTitle( ) const { return titleSet; } void addFile(const FileDef *def); bool addClass(const ClassDef *def); bool addNamespace(const NamespaceDef *def); @@ -87,7 +88,7 @@ class GroupDef : public Definition bool visited; // number of times accessed for output - KPW - friend void writeGroupTreeNode(OutputList&, GroupDef*, int, FTVHelp*); + //friend void writeGroupTreeNode(OutputList&, GroupDef*, int, FTVHelp*); // make accessible for writing tree view of group in index.cpp - KPW void setGroupScope(Definition *d) { groupScope = d; } @@ -105,7 +106,9 @@ class GroupDef : public Definition GroupList * getSubGroups() const { return groupList; } PageSDict * getPages() const { return pageDict; } DirList * getDirs() const { return dirList; } + PageSDict * getExamples() const { return exampleDict; } //MemberList* getMembers() const { return allMemberList; } + void sortSubGroups(); protected: void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const); diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index a35d92a..16c5b46 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -83,8 +83,8 @@ static bool mustBeOutsideParagraph(DocNode *n) /* \internal */ case DocNode::Kind_Internal: /* <div> */ - case DocNode::Kind_Verbatim: case DocNode::Kind_Include: + case DocNode::Kind_Verbatim: case DocNode::Kind_Image: case DocNode::Kind_SecRefList: /* <hr> */ @@ -107,8 +107,6 @@ static bool mustBeOutsideParagraph(DocNode *n) return FALSE; } - - static QString htmlAttribsToString(const HtmlAttribList &attribs) { QString result; @@ -849,16 +847,6 @@ void HtmlDocVisitor::visitPre(DocPara *p) void HtmlDocVisitor::visitPost(DocPara *p) { -// if (m_hide) return; -// if (!p->isLast() && // omit <p> for last paragraph -// !(p->parent() && // and for parameter sections -// p->parent()->kind()==DocNode::Kind_ParamSect -// ) -// ) -// { -// m_t << "<p>\n"; -// } - bool needsTag = FALSE; if (p && p->parent()) { @@ -1209,11 +1197,7 @@ void HtmlDocVisitor::visitPost(DocInternal *) void HtmlDocVisitor::visitPre(DocHRef *href) { if (m_hide) return; - QCString url = href->url(); - if (url.left(5)!="http:" && url.left(6)!="https:" && url.left(4)!="ftp:") - { - url.prepend(href->relPath()); - } + QCString url = correctURL(href->url(),href->relPath()); m_t << "<a href=\"" << convertToXML(url) << "\"" << htmlAttribsToString(href->attribs()) << ">"; } @@ -1261,11 +1245,7 @@ void HtmlDocVisitor::visitPre(DocImage *img) } else { - if (url.left(5)!="http:" && url.left(6)!="https:" && url.left(4)!="ftp:") - { - url.prepend(img->relPath()); - } - m_t << "<img src=\"" << url << "\" " + m_t << "<img src=\"" << correctURL(url,img->relPath()) << "\" " << htmlAttribsToString(img->attribs()) << "/>" << endl; } diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 24bf523..4a203b1 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -1857,7 +1857,7 @@ void HtmlGenerator::endMemberList() // 0 = single column right aligned // 1 = double column left aligned // 2 = single column left aligned -void HtmlGenerator::startMemberItem(int annoType) +void HtmlGenerator::startMemberItem(const char *anchor,int annoType) { DBG_HTML(t << "<!-- startMemberItem() -->" << endl) if (Config_getBool("HTML_ALIGN_MEMBERS")) @@ -1867,7 +1867,7 @@ void HtmlGenerator::startMemberItem(int annoType) t << "<table class=\"memberdecls\">" << endl; m_emptySection=FALSE; } - t << "<tr>"; + t << "<tr class=\"memitem:" << anchor << "\">"; switch(annoType) { case 0: t << "<td class=\"memItemLeft\" align=\"right\" valign=\"top\">"; break; @@ -1896,12 +1896,12 @@ void HtmlGenerator::startMemberTemplateParams() { } -void HtmlGenerator::endMemberTemplateParams() +void HtmlGenerator::endMemberTemplateParams(const char *anchor) { if (Config_getBool("HTML_ALIGN_MEMBERS")) { t << "</td></tr>" << endl; - t << "<tr><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">"; + t << "<tr class=\"memitem:" << anchor << "\"><td class=\"memTemplItemLeft\" align=\"right\" valign=\"top\">"; } } @@ -1916,7 +1916,7 @@ void HtmlGenerator::insertMemberAlign(bool templ) } } -void HtmlGenerator::startMemberDescription() +void HtmlGenerator::startMemberDescription(const char *anchor) { DBG_HTML(t << "<!-- startMemberDescription -->" << endl) if (Config_getBool("HTML_ALIGN_MEMBERS")) @@ -1926,7 +1926,7 @@ void HtmlGenerator::startMemberDescription() t << "<table class=\"memberdecls\">" << endl; m_emptySection=FALSE; } - t << "<tr><td class=\"mdescLeft\"> </td><td class=\"mdescRight\">"; + t << "<tr class=\"memdesc:" << anchor << "\"><td class=\"mdescLeft\"> </td><td class=\"mdescRight\">"; } else { @@ -2446,15 +2446,15 @@ static void startQuickIndexItem(FTextStream &t,const char *l, { t << " class=\"current\""; } - t << "><a "; - t << "href=\"" << relPath << l << "\">"; + t << ">"; + if (l) t << "<a href=\"" << correctURL(l,relPath) << "\">"; t << "<span>"; } -static void endQuickIndexItem(FTextStream &t) +static void endQuickIndexItem(FTextStream &t,const char *l) { t << "</span>"; - t << "</a>"; + if (l) t << "</a>"; t << "</li>\n"; } @@ -2469,6 +2469,7 @@ static bool quickLinkVisible(LayoutNavEntry::Kind kind) { case LayoutNavEntry::MainPage: return TRUE; case LayoutNavEntry::User: return TRUE; + case LayoutNavEntry::UserGroup: return TRUE; case LayoutNavEntry::Pages: return indexedPages>0; case LayoutNavEntry::Modules: return documentedGroups>0; case LayoutNavEntry::Namespaces: return documentedNamespaces>0; @@ -2505,18 +2506,10 @@ static void renderQuickLinksAsTree(FTextStream &t,const QCString &relPath,Layout { if (entry->visible() && quickLinkVisible(entry->kind())) { - QCString url = entry->baseFile(); - if (entry->kind()!=LayoutNavEntry::User) - { - url+=Doxygen::htmlFileExtension; - } - t << "<li"; - t << "><a "; - t << "href=\"" << relPath << url << "\">"; - t << "<span>"; + QCString url = entry->url(); + t << "<li><a href=\"" << relPath << url << "\"><span>"; t << fixSpaces(entry->title()); - t << "</span>"; - t << "</a>\n"; + t << "</span></a>\n"; // recursive into child list renderQuickLinksAsTree(t,relPath,entry); t << "</li>"; @@ -2531,7 +2524,6 @@ static void renderQuickLinksAsTabs(FTextStream &t,const QCString &relPath, LayoutNavEntry *hlEntry,LayoutNavEntry::Kind kind, bool highlightParent,bool highlightSearch) { - //static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); if (hlEntry->parent()) // first draw the tabs for the parent of hlEntry { renderQuickLinksAsTabs(t,relPath,hlEntry->parent(),kind,highlightParent,highlightSearch); @@ -2554,11 +2546,7 @@ static void renderQuickLinksAsTabs(FTextStream &t,const QCString &relPath, { if (entry->visible() && quickLinkVisible(entry->kind())) { - QCString url = entry->baseFile(); - if (entry->kind()!=LayoutNavEntry::User) - { - url+=Doxygen::htmlFileExtension; - } + QCString url = entry->url(); startQuickIndexItem(t,url, entry==hlEntry && (entry->children().count()>0 || @@ -2566,27 +2554,23 @@ static void renderQuickLinksAsTabs(FTextStream &t,const QCString &relPath, ), TRUE,relPath); t << fixSpaces(entry->title()); - endQuickIndexItem(t); + endQuickIndexItem(t,url); } } - if (hlEntry->parent()==LayoutDocManager::instance().rootNavEntry()) // first row + if (hlEntry->parent()==LayoutDocManager::instance().rootNavEntry()) // first row is special as it contains the search box { - //static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); static bool searchEngine = Config_getBool("SEARCHENGINE"); static bool serverBasedSearch = Config_getBool("SERVER_BASED_SEARCH"); - if (searchEngine /* && !generateTreeView */) + if (searchEngine) { + t << " <li>\n"; if (!serverBasedSearch) // pure client side search { - //t << " <li id=\"searchli\">\n"; - t << " <li>\n"; writeClientSearchBox(t,relPath); t << " </li>\n"; } - else // if (!generateTreeView) // server based search + else // server based search { - //t << " <li id=\"searchli\">\n"; - t << " <li>\n"; writeServerSearchBox(t,relPath,highlightSearch); if (!highlightSearch) { @@ -2594,13 +2578,13 @@ static void renderQuickLinksAsTabs(FTextStream &t,const QCString &relPath, } } } - if (!highlightSearch) // on the search page the page will be ended by the + if (!highlightSearch) // on the search page the index will be ended by the // page itself { endQuickIndexList(t,TRUE); } } - else // normal case + else // normal case for other rows than first one { endQuickIndexList(t,TRUE); } @@ -2609,7 +2593,9 @@ static void renderQuickLinksAsTabs(FTextStream &t,const QCString &relPath, } static void writeDefaultQuickLinks(FTextStream &t,bool compact, - HighlightedItem hli,const QCString &relPath) + HighlightedItem hli, + const char *file, + const QCString &relPath) { LayoutNavEntry *root = LayoutDocManager::instance().rootNavEntry(); LayoutNavEntry::Kind kind = (LayoutNavEntry::Kind)-1; @@ -2630,6 +2616,7 @@ static void writeDefaultQuickLinks(FTextStream &t,bool compact, case HLI_Globals: kind = LayoutNavEntry::FileGlobals; break; case HLI_Pages: kind = LayoutNavEntry::Pages; break; case HLI_Examples: kind = LayoutNavEntry::Examples; break; + case HLI_UserGroup: kind = LayoutNavEntry::UserGroup; break; case HLI_ClassVisible: kind = LayoutNavEntry::ClassList; altKind = LayoutNavEntry::Classes; highlightParent = TRUE; break; case HLI_NamespaceVisible: kind = LayoutNavEntry::NamespaceList; altKind = LayoutNavEntry::Namespaces; @@ -2643,7 +2630,7 @@ static void writeDefaultQuickLinks(FTextStream &t,bool compact, if (compact) { // find highlighted index item - LayoutNavEntry *hlEntry = root->find(kind); + LayoutNavEntry *hlEntry = root->find(kind,kind==LayoutNavEntry::UserGroup ? file : 0); if (!hlEntry && altKind!=(LayoutNavEntry::Kind)-1) { hlEntry=root->find(altKind); kind=altKind; } if (!hlEntry) // highlighted item not found in the index! -> just show the level 1 index... { @@ -2654,6 +2641,14 @@ static void writeDefaultQuickLinks(FTextStream &t,bool compact, return; // argl, empty index! } } + if (kind==LayoutNavEntry::UserGroup) + { + LayoutNavEntry *e = hlEntry->children().getFirst(); + if (e) + { + hlEntry = e; + } + } renderQuickLinksAsTabs(t,relPath,hlEntry,kind,highlightParent,hli==HLI_Search); } else @@ -2710,9 +2705,9 @@ void HtmlGenerator::endContents() t << "</div><!-- contents -->" << endl; } -void HtmlGenerator::writeQuickLinks(bool compact,HighlightedItem hli) +void HtmlGenerator::writeQuickLinks(bool compact,HighlightedItem hli,const char *file) { - writeDefaultQuickLinks(t,compact,hli,relPath); + writeDefaultQuickLinks(t,compact,hli,file,relPath); } // PHP based search script @@ -2788,7 +2783,7 @@ void HtmlGenerator::writeSearchPage() } if (!Config_getBool("DISABLE_INDEX")) { - writeDefaultQuickLinks(t,TRUE,HLI_Search,""); + writeDefaultQuickLinks(t,TRUE,HLI_Search,0,""); } else { diff --git a/src/htmlgen.h b/src/htmlgen.h index b31f6e1..b5d82da 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -120,10 +120,10 @@ class HtmlGenerator : public OutputGenerator void endInlineHeader(); void startAnonTypeScope(int) {} void endAnonTypeScope(int) {} - void startMemberItem(int); + void startMemberItem(const char *anchor,int); void endMemberItem(); void startMemberTemplateParams(); - void endMemberTemplateParams(); + void endMemberTemplateParams(const char *anchor); void startMemberGroupHeader(bool); void endMemberGroupHeader(); @@ -133,7 +133,7 @@ class HtmlGenerator : public OutputGenerator void endMemberGroup(bool); void insertMemberAlign(bool); - void startMemberDescription(); + void startMemberDescription(const char *anchor); void endMemberDescription(); void writeRuler() { t << "<hr/>"; } @@ -197,7 +197,7 @@ class HtmlGenerator : public OutputGenerator void endQuickIndices(); void writeSplitBar(const char *name); void writeLogo(); - void writeQuickLinks(bool compact,HighlightedItem hli); + void writeQuickLinks(bool compact,HighlightedItem hli,const char *file); void startContents(); void endContents(); void writeNonBreakableSpace(int); diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp index 21cdbcc..dd2311e 100644 --- a/src/htmlhelp.cpp +++ b/src/htmlhelp.cpp @@ -60,7 +60,7 @@ class IndexFieldSDict : public SDict<IndexField> class HtmlHelpIndex { public: - HtmlHelpIndex(); + HtmlHelpIndex(HtmlHelp *help); ~HtmlHelpIndex(); void addItem(const char *first,const char *second, const char *url, const char *anchor, @@ -68,10 +68,11 @@ class HtmlHelpIndex void writeFields(FTextStream &t); private: IndexFieldSDict *dict; + HtmlHelp *m_help; }; /*! Constructs a new HtmlHelp index */ -HtmlHelpIndex::HtmlHelpIndex() +HtmlHelpIndex::HtmlHelpIndex(HtmlHelp *help) : m_help(help) { dict = new IndexFieldSDict; dict->setAutoDelete(TRUE); @@ -198,7 +199,7 @@ void HtmlHelpIndex::writeFields(FTextStream &t) t << "<param name=\"Local\" value=\"" << f->url << Doxygen::htmlFileExtension; if (!f->anchor.isEmpty() && f->reversed) t << "#" << f->anchor; t << "\">"; - t << "<param name=\"Name\" value=\"" << level1 << "\">" + t << "<param name=\"Name\" value=\"" << m_help->recode(level1) << "\">" "</OBJECT>\n"; } else @@ -209,14 +210,14 @@ void HtmlHelpIndex::writeFields(FTextStream &t) t << "<param name=\"Local\" value=\"" << f->url << Doxygen::htmlFileExtension; if (!f->anchor.isEmpty() && f->reversed) t << "#" << f->anchor; t << "\">"; - t << "<param name=\"Name\" value=\"" << level1 << "\">" + t << "<param name=\"Name\" value=\"" << m_help->recode(level1) << "\">" "</OBJECT>\n"; } else { t << " <LI><OBJECT type=\"text/sitemap\">"; - t << "<param name=\"See Also\" value=\"" << level1 << "\">"; - t << "<param name=\"Name\" value=\"" << level1 << "\">" + t << "<param name=\"See Also\" value=\"" << m_help->recode(level1) << "\">"; + t << "<param name=\"Name\" value=\"" << m_help->recode(level1) << "\">" "</OBJECT>\n"; } } @@ -237,7 +238,7 @@ void HtmlHelpIndex::writeFields(FTextStream &t) t << "<param name=\"Local\" value=\"" << f->url << Doxygen::htmlFileExtension; if (!f->anchor.isEmpty()) t << "#" << f->anchor; t << "\">"; - t << "<param name=\"Name\" value=\"" << level2 << "\">" + t << "<param name=\"Name\" value=\"" << m_help->recode(level2) << "\">" "</OBJECT>\n"; } lastLevel1 = level1.copy(); @@ -258,7 +259,7 @@ HtmlHelp::HtmlHelp() : indexFileDict(1009) /* initial depth */ dc = 0; cf = kf = 0; - index = new HtmlHelpIndex; + index = new HtmlHelpIndex(this); m_fromUtf8 = (void *)(-1); } diff --git a/src/htmlhelp.h b/src/htmlhelp.h index bba4efe..8dafd15 100644 --- a/src/htmlhelp.h +++ b/src/htmlhelp.h @@ -85,6 +85,7 @@ class HtmlHelp : public IndexIntf void addStyleSheetFile(const char *) {} private: + friend class HtmlHelpIndex; void createProjectFile(); QFile *cf,*kf; diff --git a/src/index.cpp b/src/index.cpp index adb82f3..7d094d8 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -291,7 +291,7 @@ void startFile(OutputList &ol,const char *name,const char *manName, ol.startQuickIndices(); if (!disableIndex) { - ol.writeQuickLinks(TRUE,hli); + ol.writeQuickLinks(TRUE,hli,name); } if (!additionalIndices) { @@ -417,7 +417,10 @@ static bool classHasVisibleChildren(ClassDef *cd) return FALSE; } -static void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level,FTVHelp* ftv) +//---------------------------------------------------------------------------- +/*! Generates HTML Help tree of classes */ + +static void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level,FTVHelp* ftv,bool addToIndex) { if (bcl==0) return; BaseClassListIterator bcli(*bcl); @@ -440,9 +443,14 @@ static void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int if (!started) { startIndexHierarchy(ol,level); - Doxygen::indexList.incContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.incContentsDepth(); + } if (ftv) + { ftv->incContentsDepth(); + } started=TRUE; } ol.startIndexListItem(); @@ -461,18 +469,28 @@ static void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int ol.docify(" [external]"); ol.endTypewriter(); } - Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor()); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor()); + } if (ftv) + { ftv->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor()); + } } else { ol.startIndexItem(0,0); ol.parseText(cd->name()); ol.endIndexItem(0,0); - Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),0,0,0); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),0,0,0); + } if (ftv) + { ftv->addContentsItem(hasChildren,cd->displayName(),0,0,0); + } } if (hasChildren) { @@ -481,11 +499,11 @@ static void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int cd->visited=TRUE; if (cd->getLanguage()==SrcLangExt_VHDL) { - writeClassTree(ol,cd->baseClasses(),wasVisited,level+1,ftv); + writeClassTree(ol,cd->baseClasses(),wasVisited,level+1,ftv,addToIndex); } else { - writeClassTree(ol,cd->subClasses(),wasVisited,level+1,ftv); + writeClassTree(ol,cd->subClasses(),wasVisited,level+1,ftv,addToIndex); } } ol.endIndexListItem(); @@ -494,54 +512,20 @@ static void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int if (started) { endIndexHierarchy(ol,level); - Doxygen::indexList.decContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.decContentsDepth(); + } if (ftv) - ftv->decContentsDepth(); - } -} - - -//---------------------------------------------------------------------------- -/*! Generates HTML Help tree of classes */ - -static 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(),cd->anchor()); - } - if (hasChildren) - { - writeClassTree(cd->subClasses(),level+1); - } - cd->visited=TRUE; + ftv->decContentsDepth(); } } - if (started) - { - Doxygen::indexList.decContentsDepth(); - } } //---------------------------------------------------------------------------- -static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FTVHelp* ftv) +static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FTVHelp* ftv,bool addToIndex) { ClassSDict::Iterator cli(*cl); for (;cli.current(); ++cli) @@ -573,7 +557,10 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT if (!started) { startIndexHierarchy(ol,0); - Doxygen::indexList.incContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.incContentsDepth(); + } started=TRUE; } ol.startIndexListItem(); @@ -592,27 +579,37 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT ol.docify(" [external]"); ol.endTypewriter(); } - Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor(),FALSE,FALSE); + } if (ftv) + { ftv->addContentsItem(hasChildren,cd->displayName(),cd->getReference(),cd->getOutputFileBase(),cd->anchor()); + } } else { ol.startIndexItem(0,0); ol.parseText(cd->displayName()); ol.endIndexItem(0,0); - Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),0,0,0,FALSE,FALSE); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(hasChildren,cd->displayName(),0,0,0,FALSE,FALSE); + } if (ftv) + { ftv->addContentsItem(hasChildren,cd->displayName(),0,0,0); + } } if (cd->getLanguage()==SrcLangExt_VHDL && hasChildren) { - writeClassTree(ol,cd->baseClasses(),cd->visited,1,ftv); + writeClassTree(ol,cd->baseClasses(),cd->visited,1,ftv,addToIndex); cd->visited=TRUE; } else if (hasChildren) { - writeClassTree(ol,cd->subClasses(),cd->visited,1,ftv); + writeClassTree(ol,cd->subClasses(),cd->visited,1,ftv,addToIndex); cd->visited=TRUE; } ol.endIndexListItem(); @@ -621,7 +618,7 @@ static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started,FT } } -static void writeClassHierarchy(OutputList &ol, FTVHelp* ftv) +static void writeClassHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex) { initClassHierarchy(Doxygen::classSDict); initClassHierarchy(Doxygen::hiddenClasses); @@ -631,12 +628,15 @@ static void writeClassHierarchy(OutputList &ol, FTVHelp* ftv) ol.disable(OutputGenerator::Html); } bool started=FALSE; - writeClassTreeForList(ol,Doxygen::classSDict,started,ftv); - writeClassTreeForList(ol,Doxygen::hiddenClasses,started,ftv); + writeClassTreeForList(ol,Doxygen::classSDict,started,ftv,addToIndex); + writeClassTreeForList(ol,Doxygen::hiddenClasses,started,ftv,addToIndex); if (started) { endIndexHierarchy(ol,0); - Doxygen::indexList.decContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.decContentsDepth(); + } } if (ftv) ol.popGeneratorState(); @@ -682,15 +682,23 @@ static void writeHierarchicalIndex(OutputList &ol) if (hierarchyClasses==0) return; ol.pushGeneratorState(); ol.disable(OutputGenerator::Man); + LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassHierarchy); QCString title = lne ? lne->title() : theTranslator->trClassHierarchy(); + bool addToIndex = lne==0 || lne->visible(); + startFile(ol,"hierarchy",0, title, HLI_Hierarchy); startTitle(ol,0); ol.parseText(title); endTitle(ol,0,0); ol.startContents(); ol.startTextBlock(); - Doxygen::indexList.addContentsItem(TRUE,title,0,"hierarchy",0,TRUE,TRUE); + + if (addToIndex) + { + Doxygen::indexList.addContentsItem(TRUE,title,0,"hierarchy",0,TRUE,TRUE); + } + if (Config_getBool("HAVE_DOT") && Config_getBool("GRAPHICAL_HIERARCHY")) { ol.disable(OutputGenerator::Latex); @@ -713,7 +721,7 @@ static void writeHierarchicalIndex(OutputList &ol) ftv = new FTVHelp(FALSE); } - writeClassHierarchy(ol,ftv); + writeClassHierarchy(ol,ftv,addToIndex); if (ftv) { @@ -799,6 +807,8 @@ static void writeFileIndex(OutputList &ol) LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::FileList); if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Files); // fall back QCString title = lne ? lne->title() : theTranslator->trFileList(); + bool addToIndex = lne==0 || lne->visible(); + startFile(ol,"files",0,title,HLI_Files); startTitle(ol,0); //if (!Config_getString("PROJECT_NAME").isEmpty()) @@ -809,8 +819,13 @@ static void writeFileIndex(OutputList &ol) endTitle(ol,0,0); ol.startContents(); ol.startTextBlock(); - Doxygen::indexList.addContentsItem(TRUE,title,0,"files",0,TRUE,TRUE); - Doxygen::indexList.incContentsDepth(); + + if (addToIndex) + { + Doxygen::indexList.addContentsItem(TRUE,title,0,"files",0,TRUE,TRUE); + Doxygen::indexList.incContentsDepth(); + } + ol.parseText(lne ? lne->intro() : theTranslator->trFileListDescription(Config_getBool("EXTRACT_ALL"))); ol.endTextBlock(); @@ -888,14 +903,20 @@ static void writeFileIndex(OutputList &ol) if (doc) { ol.writeObjectLink(0,fd->getOutputFileBase(),0,fd->name()); - addMembersToIndex(fd,LayoutDocManager::File,fullName,QCString()); + if (addToIndex) + { + addMembersToIndex(fd,LayoutDocManager::File,fullName,QCString()); + } } else { ol.startBold(); ol.docify(fd->name()); ol.endBold(); - Doxygen::indexList.addContentsItem(FALSE,fullName,0,0,0); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(FALSE,fullName,0,0,0); + } } if (src) { @@ -943,7 +964,12 @@ static void writeFileIndex(OutputList &ol) } } ol.endIndexList(); - Doxygen::indexList.decContentsDepth(); + + if (addToIndex) + { + Doxygen::indexList.decContentsDepth(); + } + endFile(ol); ol.popGeneratorState(); } @@ -971,18 +997,18 @@ static void writeNamespaceIndex(OutputList &ol) LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::NamespaceList); if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Namespaces); // fall back QCString title = lne ? lne->title() : theTranslator->trNamespaceList(); + bool addToIndex = lne==0 || lne->visible(); startFile(ol,"namespaces",0,title,HLI_Namespaces); startTitle(ol,0); - //if (!Config_getString("PROJECT_NAME").isEmpty()) - //{ - // longTitle.prepend(Config_getString("PROJECT_NAME")+" "); - //} ol.parseText(title); endTitle(ol,0,0); ol.startContents(); ol.startTextBlock(); - Doxygen::indexList.addContentsItem(TRUE,title,0,"namespaces",0,TRUE,TRUE); - Doxygen::indexList.incContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(TRUE,title,0,"namespaces",0,TRUE,TRUE); + Doxygen::indexList.incContentsDepth(); + } ol.parseText(lne ? lne->intro() : theTranslator->trNamespaceListDescription(Config_getBool("EXTRACT_ALL"))); ol.endTextBlock(); @@ -1011,6 +1037,7 @@ static void writeNamespaceIndex(OutputList &ol) ol.writeObjectLink(0,nd->getOutputFileBase(),0,nd->displayName()); } ol.endIndexKey(); + bool hasBrief = !nd->briefDescription().isEmpty(); ol.startIndexValue(hasBrief); if (hasBrief) @@ -1029,11 +1056,26 @@ static void writeNamespaceIndex(OutputList &ol) //ol.docify(")"); } ol.endIndexValue(nd->getOutputFileBase(),hasBrief); - addMembersToIndex(nd,LayoutDocManager::Namespace,nd->displayName(),QCString()); + + if (addToIndex) + { + if (nd->getLanguage()==SrcLangExt_VHDL) + { + ClassDef* ccd=getClass(nd->displayName().data()); + if (ccd) Doxygen::indexList.addContentsItem(FALSE,ccd->displayName(),ccd->getReference(),ccd->getOutputFileBase(),0); + } + else + { + addMembersToIndex(nd,LayoutDocManager::Namespace,nd->displayName(),QCString()); + } + } } } if (!first) ol.endIndexList(); - Doxygen::indexList.decContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.decContentsDepth(); + } endFile(ol); ol.popGeneratorState(); } @@ -1064,61 +1106,15 @@ static int countAnnotatedClasses(int *cp) static void writeAnnotatedClassList(OutputList &ol) { + LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassList); + bool addToIndex = lne==0 || lne->visible(); + ol.startIndexList(); ClassSDict::Iterator cli(*Doxygen::classSDict); ClassDef *cd; -#if 0 - // clear index - int x,y; - for (y=0;y<CHL_Total;y++) - { - for (x=0;x<256;x++) - { - g_classIndexLetterUsed[y][x]=FALSE; - } - } - - // see which elements are in use for (cli.toFirst();(cd=cli.current());++cli) { - if (cd->isLinkableInProject() && 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; - - } - } - } -#endif - - for (cli.toFirst();(cd=cli.current());++cli) - { - if (cd->getLanguage()==SrcLangExt_VHDL &&(!(VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ENTITYCLASS )) continue; @@ -1157,7 +1153,10 @@ static void writeAnnotatedClassList(OutputList &ol) } ol.endIndexValue(cd->getOutputFileBase(),hasBrief); - addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(),cd->anchor()); + if (addToIndex) + { + addMembersToIndex(cd,LayoutDocManager::Class,cd->displayName(),cd->anchor()); + } } ol.popGeneratorState(); } @@ -1490,17 +1489,23 @@ static void writeAlphabeticalIndex(OutputList &ol) ol.disableAllBut(OutputGenerator::Html); LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassIndex); QCString title = lne ? lne->title() : theTranslator->trCompoundIndex(); + bool addToIndex = lne==0 || lne->visible(); + startFile(ol,"classes",0,title,HLI_Classes); startTitle(ol,0); ol.parseText(title); - Doxygen::indexList.addContentsItem(TRUE,title,0,"classes",0,TRUE,TRUE); endTitle(ol,0,0); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(TRUE,title,0,"classes",0,TRUE,TRUE); + } + ol.startContents(); writeAlphabeticalClassList(ol); - endFile(ol); // contains ol.endContents() + ol.popGeneratorState(); } @@ -1522,6 +1527,13 @@ static void writeAnnotatedIndex(OutputList &ol) LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassList); if (lne==0) lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Classes); // fall back QCString title = lne ? lne->title() : theTranslator->trCompoundList(); + bool addToIndex = lne==0 || lne->visible(); + + if (Config_getBool("OPTIMIZE_OUTPUT_VHDL")) + { + VhdlDocGen::findConstraintFile(lne); + } + startFile(ol,"annotated",0,title,HLI_Annotated); startTitle(ol,0); @@ -1530,13 +1542,22 @@ static void writeAnnotatedIndex(OutputList &ol) ol.startContents(); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(TRUE,title,0,"annotated",0,TRUE,TRUE); + Doxygen::indexList.incContentsDepth(); + } + ol.startTextBlock(); - Doxygen::indexList.addContentsItem(TRUE,title,0,"annotated",0,TRUE,TRUE); - Doxygen::indexList.incContentsDepth(); ol.parseText(lne ? lne->intro() : theTranslator->trCompoundListDescription()); ol.endTextBlock(); + writeAnnotatedClassList(ol); - Doxygen::indexList.decContentsDepth(); + + if (addToIndex) + { + Doxygen::indexList.decContentsDepth(); + } endFile(ol); // contains ol.endContents() ol.popGeneratorState(); @@ -1977,10 +1998,14 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassMembers); QCString title = lne ? lne->title() : theTranslator->trCompoundMembers(); if (hl!=CMHL_All) title+=(QCString)" - "+getCmhlInfo(hl)->title; + bool addToIndex = lne==0 || lne->visible(); - Doxygen::indexList.addContentsItem(multiPageIndex,getCmhlInfo(hl)->title,0, - getCmhlInfo(hl)->fname,0,multiPageIndex,TRUE); - if (multiPageIndex) Doxygen::indexList.incContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(multiPageIndex,getCmhlInfo(hl)->title,0, + getCmhlInfo(hl)->fname,0,multiPageIndex,TRUE); + if (multiPageIndex) Doxygen::indexList.incContentsDepth(); + } int page; bool first=TRUE; @@ -1998,7 +2023,10 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h char cs[2]; cs[0]=page; cs[1]=0; - Doxygen::indexList.addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE); + } } bool quickIndex = documentedClassMembers[hl]>maxItemsBeforeQuickIndex; @@ -2006,7 +2034,7 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h ol.startQuickIndices(); if (!disableIndex) { - ol.writeQuickLinks(TRUE,HLI_Functions); + ol.writeQuickLinks(TRUE,HLI_Functions,0); startQuickIndexList(ol); // index item for global member list @@ -2045,8 +2073,6 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h ol.writeSplitBar(fileName); } - //Doxygen::indexList.addContentsItem(FALSE,title,0,fileName,0); - ol.startContents(); if (hl==CMHL_All) @@ -2071,16 +2097,18 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h } } - if (multiPageIndex) Doxygen::indexList.decContentsDepth(); + if (multiPageIndex && addToIndex) Doxygen::indexList.decContentsDepth(); ol.popGeneratorState(); } static void writeClassMemberIndex(OutputList &ol) { - if (documentedClassMembers[CMHL_All]>0) + LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassMembers); + bool addToIndex = lne==0 || lne->visible(); + + if (documentedClassMembers[CMHL_All]>0 && addToIndex) { - LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::ClassMembers); Doxygen::indexList.addContentsItem(TRUE,lne ? lne->title() : theTranslator->trCompoundMembers(),0,"functions",0); Doxygen::indexList.incContentsDepth(); } @@ -2093,7 +2121,7 @@ static void writeClassMemberIndex(OutputList &ol) writeClassMemberIndexFiltered(ol,CMHL_Properties); writeClassMemberIndexFiltered(ol,CMHL_Events); writeClassMemberIndexFiltered(ol,CMHL_Related); - if (documentedClassMembers[CMHL_All]>0) + if (documentedClassMembers[CMHL_All]>0 && addToIndex) { Doxygen::indexList.decContentsDepth(); } @@ -2150,10 +2178,14 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl) QCString extension=Doxygen::htmlFileExtension; LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::FileGlobals); QCString title = lne ? lne->title() : theTranslator->trFileMembers(); + bool addToIndex = lne==0 || lne->visible(); - Doxygen::indexList.addContentsItem(multiPageIndex,getFmhlInfo(hl)->title,0, - getFmhlInfo(hl)->fname,0,multiPageIndex,TRUE); - if (multiPageIndex) Doxygen::indexList.incContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(multiPageIndex,getFmhlInfo(hl)->title,0, + getFmhlInfo(hl)->fname,0,multiPageIndex,TRUE); + if (multiPageIndex) Doxygen::indexList.incContentsDepth(); + } int page; bool first=TRUE; @@ -2171,7 +2203,10 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl) char cs[2]; cs[0]=page; cs[1]=0; - Doxygen::indexList.addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE); + } } bool quickIndex = documentedFileMembers[hl]>maxItemsBeforeQuickIndex; @@ -2179,7 +2214,7 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl) ol.startQuickIndices(); if (!disableIndex) { - ol.writeQuickLinks(TRUE,HLI_Globals); + ol.writeQuickLinks(TRUE,HLI_Globals,0); startQuickIndexList(ol); // index item for all file member lists @@ -2240,15 +2275,16 @@ static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl) first=FALSE; } } - if (multiPageIndex) Doxygen::indexList.decContentsDepth(); + if (multiPageIndex && addToIndex) Doxygen::indexList.decContentsDepth(); ol.popGeneratorState(); } static void writeFileMemberIndex(OutputList &ol) { - if (documentedFileMembers[FMHL_All]>0) + LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::FileGlobals); + bool addToIndex = lne==0 || lne->visible(); + if (documentedFileMembers[FMHL_All]>0 && addToIndex) { - LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::FileGlobals); Doxygen::indexList.addContentsItem(FALSE,lne ? lne->title() : theTranslator->trFileMembers(),0,"globals",0); Doxygen::indexList.incContentsDepth(); } @@ -2259,7 +2295,7 @@ static void writeFileMemberIndex(OutputList &ol) writeFileMemberIndexFiltered(ol,FMHL_Enums); writeFileMemberIndexFiltered(ol,FMHL_EnumValues); writeFileMemberIndexFiltered(ol,FMHL_Defines); - if (documentedFileMembers[FMHL_All]>0) + if (documentedFileMembers[FMHL_All]>0 && addToIndex) { Doxygen::indexList.decContentsDepth(); } @@ -2304,6 +2340,7 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); static bool disableIndex = Config_getBool("DISABLE_INDEX"); + bool multiPageIndex=FALSE; int numPages=1; if (documentedNamespaceMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX) @@ -2318,10 +2355,14 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, QCString extension=Doxygen::htmlFileExtension; LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::NamespaceMembers); QCString title = lne ? lne->title() : theTranslator->trNamespaceMembers(); + bool addToIndex = lne==0 || lne->visible(); - Doxygen::indexList.addContentsItem(multiPageIndex,getNmhlInfo(hl)->title,0, - getNmhlInfo(hl)->fname,0,multiPageIndex,TRUE); - if (multiPageIndex) Doxygen::indexList.incContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(multiPageIndex,getNmhlInfo(hl)->title,0, + getNmhlInfo(hl)->fname,0,multiPageIndex,TRUE); + if (multiPageIndex) Doxygen::indexList.incContentsDepth(); + } int page; bool first=TRUE; @@ -2339,7 +2380,10 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, char cs[2]; cs[0]=page; cs[1]=0; - Doxygen::indexList.addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(FALSE,cs,0,fileName,0,FALSE,TRUE); + } } bool quickIndex = documentedNamespaceMembers[hl]>maxItemsBeforeQuickIndex; @@ -2347,7 +2391,7 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, ol.startQuickIndices(); if (!disableIndex) { - ol.writeQuickLinks(TRUE,HLI_NamespaceMembers); + ol.writeQuickLinks(TRUE,HLI_NamespaceMembers,0); startQuickIndexList(ol); // index item for all namespace member lists @@ -2409,15 +2453,16 @@ static void writeNamespaceMemberIndexFiltered(OutputList &ol, endFile(ol); } } - if (multiPageIndex) Doxygen::indexList.decContentsDepth(); + if (multiPageIndex && addToIndex) Doxygen::indexList.decContentsDepth(); ol.popGeneratorState(); } static void writeNamespaceMemberIndex(OutputList &ol) { - if (documentedNamespaceMembers[NMHL_All]>0) + LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::NamespaceMembers); + bool addToIndex = lne==0 || lne->visible(); + if (documentedNamespaceMembers[NMHL_All]>0 && addToIndex) { - LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::NamespaceMembers); Doxygen::indexList.addContentsItem(FALSE,lne ? lne->title() : theTranslator->trNamespaceMembers(),0,"namespacemembers",0); Doxygen::indexList.incContentsDepth(); } @@ -2428,7 +2473,7 @@ static void writeNamespaceMemberIndex(OutputList &ol) writeNamespaceMemberIndexFiltered(ol,NMHL_Typedefs); writeNamespaceMemberIndexFiltered(ol,NMHL_Enums); writeNamespaceMemberIndexFiltered(ol,NMHL_EnumValues); - if (documentedNamespaceMembers[NMHL_All]>0) + if (documentedNamespaceMembers[NMHL_All]>0 && addToIndex) { Doxygen::indexList.decContentsDepth(); } @@ -2446,16 +2491,26 @@ static void writeExampleIndex(OutputList &ol) ol.disable(OutputGenerator::Man); LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Examples); QCString title = lne ? lne->title() : theTranslator->trExamples(); + bool addToIndex = lne==0 || lne->visible(); + startFile(ol,"examples",0,title,HLI_Examples); + startTitle(ol,0); ol.parseText(title); endTitle(ol,0,0); + ol.startContents(); + + if (addToIndex) + { + Doxygen::indexList.addContentsItem(TRUE,title,0,"examples",0,TRUE,TRUE); + Doxygen::indexList.incContentsDepth(); + } + ol.startTextBlock(); - Doxygen::indexList.addContentsItem(TRUE,title,0,"examples",0,TRUE,TRUE); - Doxygen::indexList.incContentsDepth(); ol.parseText(lne ? lne->intro() : theTranslator->trExamplesDescription()); ol.endTextBlock(); + ol.startItemList(); PageSDict::Iterator pdi(*Doxygen::exampleSDict); PageDef *pd=0; @@ -2466,18 +2521,28 @@ static void writeExampleIndex(OutputList &ol) if (!pd->title().isEmpty()) { ol.writeObjectLink(0,n,0,pd->title()); - Doxygen::indexList.addContentsItem(FALSE,filterTitle(pd->title()),pd->getReference(),n,0,FALSE,TRUE); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(FALSE,filterTitle(pd->title()),pd->getReference(),n,0,FALSE,TRUE); + } } else { ol.writeObjectLink(0,n,0,pd->name()); - Doxygen::indexList.addContentsItem(FALSE,pd->name(),pd->getReference(),n,0,FALSE,TRUE); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(FALSE,pd->name(),pd->getReference(),n,0,FALSE,TRUE); + } } ol.endItemListItem(); ol.writeString("\n"); } ol.endItemList(); - Doxygen::indexList.decContentsDepth(); + + if (addToIndex) + { + Doxygen::indexList.decContentsDepth(); + } endFile(ol); ol.popGeneratorState(); } @@ -2666,9 +2731,13 @@ static void countRelatedPages(int &docPages,int &indexPages) static void writeSubPages(PageDef *pd) { + LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Pages); + bool addToIndex = lne==0 || lne->visible(); //printf("Write subpages(%s #=%d)\n",pd->name().data(),pd->getSubPages() ? pd->getSubPages()->count() : 0 ); - Doxygen::indexList.incContentsDepth(); - + if (addToIndex) + { + Doxygen::indexList.incContentsDepth(); + } PageSDict *subPages = pd->getSubPages(); if (subPages) { @@ -2685,12 +2754,17 @@ static void writeSubPages(PageDef *pd) bool hasSubPages = subPage->hasSubPages(); - Doxygen::indexList.addContentsItem(hasSubPages,pageTitle,subPage->getReference(),subPage->getOutputFileBase(),0,hasSubPages,TRUE); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(hasSubPages,pageTitle,subPage->getReference(),subPage->getOutputFileBase(),0,hasSubPages,TRUE); + } writeSubPages(subPage); } } - Doxygen::indexList.decContentsDepth(); - + if (addToIndex) + { + Doxygen::indexList.decContentsDepth(); + } } static void writePageIndex(OutputList &ol) @@ -2702,16 +2776,16 @@ static void writePageIndex(OutputList &ol) QCString title = lne ? lne->title() : theTranslator->trRelatedPages(); startFile(ol,"pages",0,title,HLI_Pages); 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,title,0,"pages",0,TRUE,TRUE); - Doxygen::indexList.incContentsDepth(); + bool addToIndex = lne==0 || lne->visible(); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(TRUE,title,0,"pages",0,TRUE,TRUE); + Doxygen::indexList.incContentsDepth(); + } ol.parseText(lne ? lne->intro() : theTranslator->trRelatedPagesDescription()); ol.endTextBlock(); startIndexHierarchy(ol,0); @@ -2741,13 +2815,19 @@ static void writePageIndex(OutputList &ol) ol.endTypewriter(); } ol.writeString("\n"); - Doxygen::indexList.addContentsItem(hasSubPages,filterTitle(pageTitle),pd->getReference(),pd->getOutputFileBase(),0,hasSubPages,TRUE); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(hasSubPages,filterTitle(pageTitle),pd->getReference(),pd->getOutputFileBase(),0,hasSubPages,TRUE); + } writeSubPages(pd); ol.endIndexListItem(); } } endIndexHierarchy(ol,0); - Doxygen::indexList.decContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.decContentsDepth(); + } endFile(ol); ol.popGeneratorState(); } @@ -2852,7 +2932,7 @@ static void writeGroupIndexItem(GroupDef *gd,MemberList *ml,const QCString &titl /*! * write groups as hierarchical trees */ -void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) +static void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv, bool addToIndex) { bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); @@ -2873,8 +2953,8 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) { //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; + bool hasSubGroups = gd->getSubGroups()->count()>0; + bool hasSubPages = gd->getPages()->count()>0; int numSubItems = 0; if ( Config_getBool("TOC_EXPAND")) { @@ -2887,16 +2967,19 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) numSubItems += ml->count(); } } - numSubItems += gd->namespaceSDict->count(); - numSubItems += gd->classSDict->count(); - numSubItems += gd->fileList->count(); - numSubItems += gd->exampleDict->count(); + numSubItems += gd->getNamespaces()->count(); + numSubItems += gd->getClasses()->count(); + numSubItems += gd->getFiles()->count(); + numSubItems += gd->getExamples()->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,isDir,TRUE); - Doxygen::indexList.incContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(isDir,gd->groupTitle(),gd->getReference(),gd->getOutputFileBase(),0,isDir,TRUE); + Doxygen::indexList.incContentsDepth(); + } if (ftv) { ftv->addContentsItem(isDir,gd->groupTitle(),gd->getReference(),gd->getOutputFileBase(),0); @@ -2921,57 +3004,59 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) // write pages - PageSDict::Iterator pli(*gd->pageDict); - PageDef *pd = 0; - for (pli.toFirst();(pd=pli.current());++pli) + if (addToIndex) { - 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, - FALSE, - TRUE); // addToNavIndex + PageSDict::Iterator pli(*gd->getPages()); + 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, + FALSE, + TRUE); // addToNavIndex + } } // write subgroups if (hasSubGroups) { startIndexHierarchy(ol,level+1); - if (Config_getBool("SORT_GROUP_NAMES")) - gd->groupList->sort(); - QListIterator<GroupDef> gli(*gd->groupList); + if (Config_getBool("SORT_GROUP_NAMES")) gd->sortSubGroups(); + QListIterator<GroupDef> gli(*gd->getSubGroups()); GroupDef *subgd = 0; for (gli.toFirst();(subgd=gli.current());++gli) { - writeGroupTreeNode(ol,subgd,level+1,ftv); + writeGroupTreeNode(ol,subgd,level+1,ftv,addToIndex); } endIndexHierarchy(ol,level+1); } - if (Config_getBool("TOC_EXPAND")) + if (Config_getBool("TOC_EXPAND") && addToIndex) { - writeGroupIndexItem(gd,gd->getMemberList(MemberList::docDefineMembers), + writeGroupIndexItem(gd,gd->getMemberList(MemberList::docDefineMembers), theTranslator->trDefines()); - writeGroupIndexItem(gd,gd->getMemberList(MemberList::docTypedefMembers), + writeGroupIndexItem(gd,gd->getMemberList(MemberList::docTypedefMembers), theTranslator->trTypedefs()); - writeGroupIndexItem(gd,gd->getMemberList(MemberList::docEnumMembers), + writeGroupIndexItem(gd,gd->getMemberList(MemberList::docEnumMembers), theTranslator->trEnumerations()); - writeGroupIndexItem(gd,gd->getMemberList(MemberList::docFuncMembers), + writeGroupIndexItem(gd,gd->getMemberList(MemberList::docFuncMembers), fortranOpt ? theTranslator->trSubprograms() : vhdlOpt ? VhdlDocGen::trFunctionAndProc() : theTranslator->trFunctions() ); - writeGroupIndexItem(gd,gd->getMemberList(MemberList::docVarMembers), + writeGroupIndexItem(gd,gd->getMemberList(MemberList::docVarMembers), theTranslator->trVariables()); - writeGroupIndexItem(gd,gd->getMemberList(MemberList::docProtoMembers), + writeGroupIndexItem(gd,gd->getMemberList(MemberList::docProtoMembers), theTranslator->trFuncProtos()); // write namespaces - NamespaceSDict *namespaceSDict=gd->namespaceSDict; + NamespaceSDict *namespaceSDict=gd->getNamespaces(); if (namespaceSDict->count()>0) { Doxygen::indexList.addContentsItem(TRUE,convertToHtml(fortranOpt?theTranslator->trModules():theTranslator->trNamespaces(),TRUE),gd->getReference(), gd->getOutputFileBase(), 0); @@ -2987,13 +3072,13 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) } // write classes - if (gd->classSDict->count()>0) + if (gd->getClasses()->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); + ClassSDict::Iterator cdi(*gd->getClasses()); for (cdi.toFirst();(cd=cdi.current());++cdi) { if (cd->isLinkable()) @@ -3008,7 +3093,7 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) } // write file list - FileList *fileList=gd->fileList; + FileList *fileList=gd->getFiles(); if (fileList->count()>0) { Doxygen::indexList.addContentsItem(TRUE, @@ -3027,12 +3112,12 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) } // write examples - if (gd->exampleDict->count()>0) + if (gd->getExamples()->count()>0) { Doxygen::indexList.addContentsItem(TRUE, convertToHtml(theTranslator->trExamples(),TRUE),gd->getReference(), gd->getOutputFileBase(), 0); Doxygen::indexList.incContentsDepth(); - PageSDict::Iterator eli(*(gd->exampleDict)); + PageSDict::Iterator eli(*(gd->getExamples())); PageDef *pd=eli.toFirst(); while (pd) { @@ -3045,14 +3130,19 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd, int level, FTVHelp* ftv) } ol.endIndexListItem(); - Doxygen::indexList.decContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.decContentsDepth(); + } if (ftv) + { ftv->decContentsDepth(); + } //gd->visited=TRUE; } } -static void writeGroupHierarchy(OutputList &ol, FTVHelp* ftv) +static void writeGroupHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex) { if (ftv) { @@ -3061,12 +3151,14 @@ static void writeGroupHierarchy(OutputList &ol, FTVHelp* ftv) } 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); + writeGroupTreeNode(ol,gd,0,ftv,addToIndex); } endIndexHierarchy(ol,0); if (ftv) @@ -3076,7 +3168,7 @@ static void writeGroupHierarchy(OutputList &ol, FTVHelp* ftv) } //---------------------------------------------------------------------------- -static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv) +static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv,bool addToIndex) { if (level>20) { @@ -3093,8 +3185,11 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv 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,TRUE,TRUE); - Doxygen::indexList.incContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(isDir,dd->shortName(),dd->getReference(),dd->getOutputFileBase(),0,TRUE,TRUE); + Doxygen::indexList.incContentsDepth(); + } if (ftv) { ftv->addContentsItem(isDir,dd->shortName(),dd->getReference(),dd->getOutputFileBase(),0); @@ -3120,12 +3215,12 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv DirDef *subdd = 0; for (dli.toFirst();(subdd=dli.current());++dli) { - writeDirTreeNode(ol,subdd,level+1,ftv); + writeDirTreeNode(ol,subdd,level+1,ftv,addToIndex); } endIndexHierarchy(ol,level+1); } - if (tocExpand) + if (tocExpand && addToIndex) { // write files of this directory FileList *fileList=dd->getFiles(); @@ -3144,12 +3239,17 @@ static void writeDirTreeNode(OutputList &ol, DirDef *dd, int level, FTVHelp* ftv } ol.endIndexListItem(); - Doxygen::indexList.decContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.decContentsDepth(); + } if (ftv) + { ftv->decContentsDepth(); + } } -static void writeDirHierarchy(OutputList &ol, FTVHelp* ftv) +static void writeDirHierarchy(OutputList &ol, FTVHelp* ftv,bool addToIndex) { if (ftv) { @@ -3161,11 +3261,13 @@ static void writeDirHierarchy(OutputList &ol, FTVHelp* ftv) DirDef *dd; for (dli.toFirst();(dd=dli.current());++dli) { - if (dd->getOuterScope()==Doxygen::globalScope) writeDirTreeNode(ol,dd,0,ftv); + if (dd->getOuterScope()==Doxygen::globalScope) writeDirTreeNode(ol,dd,0,ftv,addToIndex); } endIndexHierarchy(ol,0); if (ftv) + { ol.popGeneratorState(); + } } //---------------------------------------------------------------------------- @@ -3177,19 +3279,19 @@ static void writeGroupIndex(OutputList &ol) ol.disable(OutputGenerator::Man); LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Modules); QCString title = lne ? lne->title() : theTranslator->trModules(); + bool addToIndex = lne==0 || lne->visible(); + startFile(ol,"modules",0,title,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,title,0,"modules",0,TRUE,TRUE); - Doxygen::indexList.incContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.addContentsItem(TRUE,title,0,"modules",0,TRUE,TRUE); + Doxygen::indexList.incContentsDepth(); + } ol.parseText(lne ? lne->intro() : theTranslator->trModulesDescription()); ol.endTextBlock(); @@ -3200,9 +3302,12 @@ static void writeGroupIndex(OutputList &ol) ftv = new FTVHelp(FALSE); } - writeGroupHierarchy(ol,ftv); + writeGroupHierarchy(ol,ftv,addToIndex); - Doxygen::indexList.decContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.decContentsDepth(); + } if (ftv) { QGString outStr; @@ -3227,18 +3332,20 @@ static void writeDirIndex(OutputList &ol) ol.disable(OutputGenerator::Man); LayoutNavEntry *lne = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Dirs); QCString title = lne ? lne->title() : theTranslator->trDirectories(); + bool addToIndex=lne==0 || lne->visible(); + startFile(ol,"dirs",0,title,HLI_Directories); 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,title,0,"dirs",0,TRUE,TRUE); - Doxygen::indexList.incContentsDepth(); + + if (addToIndex) + { + Doxygen::indexList.addContentsItem(TRUE,title,0,"dirs",0,TRUE,TRUE); + Doxygen::indexList.incContentsDepth(); + } ol.parseText(lne ? lne->intro() : theTranslator->trDirDescription()); ol.endTextBlock(); @@ -3249,7 +3356,7 @@ static void writeDirIndex(OutputList &ol) ftv = new FTVHelp(FALSE); } - writeDirHierarchy(ol,ftv); + writeDirHierarchy(ol,ftv,addToIndex); if (ftv) { @@ -3262,7 +3369,44 @@ static void writeDirIndex(OutputList &ol) ol.popGeneratorState(); delete ftv; } - Doxygen::indexList.decContentsDepth(); + if (addToIndex) + { + Doxygen::indexList.decContentsDepth(); + } + endFile(ol); + ol.popGeneratorState(); +} + +//---------------------------------------------------------------------------- + +static void writeUserGroupStubPage(OutputList &ol,LayoutNavEntry *lne) +{ + ol.pushGeneratorState(); + ol.disableAllBut(OutputGenerator::Html); + startFile(ol,lne->baseFile(),0,lne->title(),HLI_UserGroup); + startTitle(ol,0); + ol.parseText(lne->title()); + endTitle(ol,0,0); + QListIterator<LayoutNavEntry> li(lne->children()); + LayoutNavEntry *entry; + int count=0; + for (li.toFirst();(entry=li.current());++li) + { + if (entry->visible()) count++; + } + if (count>0) + { + ol.writeString("<ul>\n"); + for (li.toFirst();(entry=li.current());++li) + { + if (entry->visible()) + { + ol.writeString("<li><a href=\""+entry->url()+"\"><span>"+ + fixSpaces(entry->title())+"</span></a></li>\n"); + } + } + ol.writeString("</ul>\n"); + } endFile(ol); ol.popGeneratorState(); } @@ -3292,22 +3436,6 @@ static void writeIndex(OutputList &ol) projPrefix=Config_getString("PROJECT_NAME")+" "; } -#if 0 - { - QFile f(Config_getString("HTML_OUTPUT")+"/navindex.js"); - if (f.open(IO_WriteOnly)) - { - FTextStream t(&f); - t << "var NAVINDEX =" << endl; - LayoutNavEntry *layout = LayoutDocManager::instance().rootNavEntry(); - bool first=TRUE; - writeFullNavIndex(t,layout,0,first); - t << endl << "];" << endl; - t << endl << navindex_script; - } - } -#endif - //-------------------------------------------------------------------- // write HTML index //-------------------------------------------------------------------- @@ -3329,7 +3457,6 @@ static void writeIndex(OutputList &ol) } static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW"); - //QCString indexName=Config_getBool("GENERATE_TREEVIEW")?"main":"index"; QCString indexName="index"; ol.startFile(indexName,0,title); @@ -3346,7 +3473,7 @@ static void writeIndex(OutputList &ol) ol.startQuickIndices(); if (!Config_getBool("DISABLE_INDEX")) { - ol.writeQuickLinks(TRUE,HLI_Main); + ol.writeQuickLinks(TRUE,HLI_Main,0); } ol.endQuickIndices(); if (generateTreeView) @@ -3381,23 +3508,11 @@ static void writeIndex(OutputList &ol) ol.endTitleHead(0,0); ol.endHeaderSection(); } + ol.startContents(); -#if 0 - // 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(); - } -#endif if (Config_getBool("DISABLE_INDEX") && Doxygen::mainPage==0) { - ol.writeQuickLinks(FALSE,HLI_Main); + ol.writeQuickLinks(FALSE,HLI_Main,0); } if (Doxygen::mainPage) @@ -3654,6 +3769,7 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry for (i=oldSize;i<newSize;i++) indexWritten.at(i)=FALSE; } //printf("starting %s kind=%d\n",lne->title().data(),lne->kind()); + bool addToIndex=lne==0 || lne->visible(); bool needsClosing=FALSE; if (!indexWritten.at(index)) { @@ -3673,7 +3789,7 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry break; case LayoutNavEntry::Namespaces: { - if (documentedNamespaces>0) + if (documentedNamespaces>0 && addToIndex) { Doxygen::indexList.addContentsItem(TRUE,lne->title(),0,0,0); Doxygen::indexList.incContentsDepth(); @@ -3695,7 +3811,7 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry writeNamespaceMemberIndex(ol); break; case LayoutNavEntry::Classes: - if (annotatedClasses>0) + if (annotatedClasses>0 && addToIndex) { Doxygen::indexList.addContentsItem(TRUE,lne->title(),0,0,0); Doxygen::indexList.incContentsDepth(); @@ -3729,7 +3845,7 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry writeClassMemberIndex(ol); break; case LayoutNavEntry::Files: - if (documentedHtmlFiles>0) + if (documentedHtmlFiles>0 && addToIndex) { Doxygen::indexList.addContentsItem(TRUE,lne->title(),0,0,0); Doxygen::indexList.incContentsDepth(); @@ -3761,10 +3877,31 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry writeExampleIndex(ol); break; case LayoutNavEntry::User: - Doxygen::indexList.addContentsItem(TRUE,lne->title(),0,lne->baseFile(),0); + { + // prepend a ! or ^ marker to the URL to avoid tampering with it + QCString url = correctURL(lne->url(),"!"); // add ! to relative URL + if (!url.isEmpty() && url.at(0)!='!') // absolute URL + { + url.prepend("^"); // prepend ^ to absolute URL + } + bool isRef = lne->baseFile().left(4)=="@ref" || lne->baseFile().left(4)=="\\ref"; + Doxygen::indexList.addContentsItem(TRUE,lne->title(),0,url,0,FALSE,isRef); + } break; + case LayoutNavEntry::UserGroup: + if (addToIndex) + { + Doxygen::indexList.addContentsItem(TRUE,lne->title(),0,lne->baseFile(),0,TRUE,TRUE); + Doxygen::indexList.incContentsDepth(); + needsClosing=TRUE; + } + writeUserGroupStubPage(ol,lne); + break; + } + if (kind!=LayoutNavEntry::User && kind!=LayoutNavEntry::UserGroup) // User entry may appear multiple times + { + indexWritten.at(index)=TRUE; } - indexWritten.at(index)=TRUE; } writeIndexHierarchyEntries(ol,lne->children()); if (needsClosing) @@ -3774,6 +3911,7 @@ static void writeIndexHierarchyEntries(OutputList &ol,const QList<LayoutNavEntry case LayoutNavEntry::Namespaces: case LayoutNavEntry::Classes: case LayoutNavEntry::Files: + case LayoutNavEntry::UserGroup: Doxygen::indexList.decContentsDepth(); break; default: diff --git a/src/index.h b/src/index.h index 8f88484..9288f5d 100644 --- a/src/index.h +++ b/src/index.h @@ -178,6 +178,7 @@ enum HighlightedItem HLI_Pages, HLI_Examples, HLI_Search, + HLI_UserGroup, HLI_ClassVisible, HLI_NamespaceVisible, diff --git a/src/latexgen.cpp b/src/latexgen.cpp index fad1d01..66302b3 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -2024,7 +2024,7 @@ void LatexGenerator::startMemberTemplateParams() } } -void LatexGenerator::endMemberTemplateParams() +void LatexGenerator::endMemberTemplateParams(const char *) { if (templateMemberItem) { @@ -2032,7 +2032,7 @@ void LatexGenerator::endMemberTemplateParams() } } -void LatexGenerator::startMemberItem(int annoType) +void LatexGenerator::startMemberItem(const char *,int annoType) { //printf("LatexGenerator::startMemberItem(%d)\n",annType); if (!insideTabbing) @@ -2052,7 +2052,7 @@ void LatexGenerator::endMemberItem() t << endl; } -void LatexGenerator::startMemberDescription() +void LatexGenerator::startMemberDescription(const char *) { if (!insideTabbing) { @@ -2271,15 +2271,10 @@ void LatexGenerator::endParameterList() { } - -void LatexGenerator::startParameterType(bool /*first*/,const char *key) +void LatexGenerator::startParameterType(bool first,const char *key) { t << "\\item[{"; - t << key; -// if (!first) -// { -// t << "\\/ " << key << " "; -// } + if (!first && key) t << key; } void LatexGenerator::endParameterType() diff --git a/src/latexgen.h b/src/latexgen.h index 85c0b3f..91b4740 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -113,10 +113,10 @@ class LatexGenerator : public OutputGenerator void endInlineHeader(); void startAnonTypeScope(int); void endAnonTypeScope(int); - void startMemberItem(int); + void startMemberItem(const char *,int); void endMemberItem(); void startMemberTemplateParams(); - void endMemberTemplateParams(); + void endMemberTemplateParams(const char *); void startMemberGroupHeader(bool); void endMemberGroupHeader(); @@ -162,7 +162,7 @@ class LatexGenerator : public OutputGenerator void endCenter() { t << "\\end{center}" << endl; } void startSmall() { t << "\\footnotesize "; } void endSmall() { t << "\\normalsize "; } - void startMemberDescription(); + void startMemberDescription(const char *); void endMemberDescription(); void startDescList(SectionTypes) { t << "\\begin{Desc}\n\\item["; } void endDescList() { t << "\\end{Desc}" << endl; } @@ -186,7 +186,7 @@ class LatexGenerator : public OutputGenerator void endQuickIndices() {} void writeSplitBar(const char *) {} void writeLogo() {} - void writeQuickLinks(bool,HighlightedItem) {} + void writeQuickLinks(bool,HighlightedItem,const char*) {} void startContents() {} void endContents() {} void writeNonBreakableSpace(int); diff --git a/src/layout.cpp b/src/layout.cpp index 79b4533..1fa6a41 100644 --- a/src/layout.cpp +++ b/src/layout.cpp @@ -21,6 +21,7 @@ #include "language.h" #include "vhdldocgen.h" #include "util.h" +#include "doxygen.h" #include <qxml.h> #include <qfile.h> @@ -55,7 +56,8 @@ static bool elemIsVisible(const QXmlAttributes &attrib,bool defVal=TRUE) //--------------------------------------------------------------------------------- -LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind) const +LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind, + const char *file) const { LayoutNavEntry *result=0; QListIterator<LayoutNavEntry> li(m_children); @@ -64,9 +66,9 @@ LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind) const { // depth first search, needed to find the entry furthest from the // root in case an entry is in the tree twice - result = entry->find(kind); + result = entry->find(kind,file); if (result) return result; - if (entry->kind()==kind) + if (entry->kind()==kind && (file==0 || entry->baseFile()==file)) { return entry; } @@ -74,6 +76,39 @@ LayoutNavEntry *LayoutNavEntry::find(LayoutNavEntry::Kind kind) const return result; } +QCString LayoutNavEntry::url() const +{ + QCString url = baseFile().stripWhiteSpace(); + if (kind()!=LayoutNavEntry::User) + { + url+=Doxygen::htmlFileExtension; + } + else if (url.left(5)=="@ref " || url.left(5)=="\\ref ") + { + Definition *d; + QCString anchor; + bool found=FALSE; + if (resolveLink(0,url.mid(5).stripWhiteSpace(),TRUE,&d,anchor)) + { + if (d && d->isLinkable()) + { + url=d->getOutputFileBase()+Doxygen::htmlFileExtension; + if (!anchor.isEmpty()) + { + url+="#"+anchor; + } + found=TRUE; + } + } + if (!found) + { + msg("warning: explicit link request to '%s' in layout file '%s' could not be resolved\n",qPrint(url.mid(5)),qPrint(Config_getString("LAYOUT_FILE"))); + } + } + //printf("LayoutNavEntry::url()=%s\n",url.data()); + return url; +} + //--------------------------------------------------------------------------------- class LayoutParser : public QXmlDefaultHandler @@ -771,13 +806,13 @@ class LayoutParser : public QXmlDefaultHandler { m_scope="navindex/"; m_rootNav = LayoutDocManager::instance().rootNavEntry(); - m_rootNav->clear(); + if (m_rootNav) m_rootNav->clear(); } void endNavIndex() { m_scope=""; - if (!m_rootNav->find(LayoutNavEntry::MainPage)) + if (m_rootNav && !m_rootNav->find(LayoutNavEntry::MainPage)) { // no MainPage node... add one the first item of the root node... new LayoutNavEntry(m_rootNav,LayoutNavEntry::MainPage, TRUE, @@ -923,6 +958,13 @@ class LayoutParser : public QXmlDefaultHandler QCString(), "user" }, + { "usergroup", + LayoutNavEntry::UserGroup, + QCString(), + QCString(), + QCString(), + "usergroup" + }, { 0, // end of list (LayoutNavEntry::Kind)0, QCString(), @@ -952,8 +994,9 @@ class LayoutParser : public QXmlDefaultHandler } else { - err("error: the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n"); + err("error: the type '%s' is not supported for the entry tag within a navindex! Check your layout file!\n",type.data()); } + m_invalidEntry=TRUE; return; } QCString baseFile = mapping[i].baseFile; @@ -978,6 +1021,10 @@ class LayoutParser : public QXmlDefaultHandler { baseFile=url; } + else if (kind==LayoutNavEntry::UserGroup) + { + baseFile+=QCString().sprintf("%d",m_userGroupCount++); + } // create new item and make it the new root m_rootNav = new LayoutNavEntry(m_rootNav,kind,kind==LayoutNavEntry::MainPage?TRUE:isVisible,baseFile,title,intro); } @@ -985,7 +1032,8 @@ class LayoutParser : public QXmlDefaultHandler void endNavEntry() { // set the root back to the parent - m_rootNav = m_rootNav->parent(); + if (m_rootNav && !m_invalidEntry) m_rootNav = m_rootNav->parent(); + m_invalidEntry=FALSE; } void startClass(const QXmlAttributes &) @@ -1142,15 +1190,19 @@ class LayoutParser : public QXmlDefaultHandler } private: - LayoutParser() : m_sHandler(163), m_eHandler(17) { } + LayoutParser() : m_sHandler(163), m_eHandler(17), m_invalidEntry(FALSE) { } QDict<StartElementHandler> m_sHandler; QDict<EndElementHandler> m_eHandler; QString m_scope; int m_part; LayoutNavEntry *m_rootNav; + bool m_invalidEntry; + static int m_userGroupCount; }; +int LayoutParser::m_userGroupCount=0; + //--------------------------------------------------------------------------------- class LayoutErrorHandler : public QXmlErrorHandler diff --git a/src/layout.h b/src/layout.h index 867a058..0b26690 100644 --- a/src/layout.h +++ b/src/layout.h @@ -127,7 +127,8 @@ struct LayoutNavEntry FileGlobals, Dirs, Examples, - User + User, + UserGroup }; LayoutNavEntry(LayoutNavEntry *parent,Kind k,bool vs,const QCString &bf, const QCString &tl,const QCString &intro,bool prepend=FALSE) @@ -140,12 +141,13 @@ struct LayoutNavEntry QCString baseFile() const { return m_baseFile; } QCString title() const { return m_title; } QCString intro() const { return m_intro; } + QCString url() const; bool visible() { return m_visible; } void clear() { m_children.clear(); } void addChild(LayoutNavEntry *e) { m_children.append(e); } void prependChild(LayoutNavEntry *e) { m_children.prepend(e); } const QList<LayoutNavEntry> &children() const { return m_children; } - LayoutNavEntry *find(LayoutNavEntry::Kind k) const; + LayoutNavEntry *find(LayoutNavEntry::Kind k,const char *file=0) const; private: LayoutNavEntry() : m_parent(0) {} diff --git a/src/mangen.cpp b/src/mangen.cpp index 88bfba3..c44044b 100644 --- a/src/mangen.cpp +++ b/src/mangen.cpp @@ -524,7 +524,7 @@ void ManGenerator::endAnonTypeScope(int indentLevel) } -void ManGenerator::startMemberItem(int) +void ManGenerator::startMemberItem(const char *,int) { if (firstCol && !insideTabbing) t << ".in +1c\n"; t << "\n.ti -1c\n.RI \""; diff --git a/src/mangen.h b/src/mangen.h index c2c1ba2..d7c58a5 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -111,10 +111,10 @@ class ManGenerator : public OutputGenerator void endInlineHeader(); void startAnonTypeScope(int); void endAnonTypeScope(int); - void startMemberItem(int); + void startMemberItem(const char *,int); void endMemberItem(); void startMemberTemplateParams() {} - void endMemberTemplateParams() {} + void endMemberTemplateParams(const char *) {} void startMemberGroupHeader(bool); void endMemberGroupHeader(); @@ -158,7 +158,7 @@ class ManGenerator : public OutputGenerator void endCenter() {} void startSmall() {} void endSmall() {} - void startMemberDescription() { t << "\n.RI \"\\fI"; firstCol=FALSE; } + void startMemberDescription(const char *) { t << "\n.RI \"\\fI"; firstCol=FALSE; } void endMemberDescription() { t << "\\fP\""; firstCol=FALSE; } void startDescList(SectionTypes); void endDescList() {} @@ -183,7 +183,7 @@ class ManGenerator : public OutputGenerator void endQuickIndices() {} void writeSplitBar(const char *) {} void writeLogo() {} - void writeQuickLinks(bool,HighlightedItem) {} + void writeQuickLinks(bool,HighlightedItem,const char *) {} void startContents() {} void endContents() {} void writeNonBreakableSpace(int n) { int i; for (i=0;i<n;i++) t << " "; } diff --git a/src/memberdef.cpp b/src/memberdef.cpp index 355870f..70e5bb9 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -183,7 +183,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, { if (isDefine || first) { - ol.startParameterType(first,md->isObjCMethod()?"dummy":0); + ol.startParameterType(first,0); paramTypeStarted=TRUE; if (isDefine) { @@ -1306,6 +1306,7 @@ void MemberDef::writeDeclaration(OutputList &ol, } QCString cname = d->name(); + QCString cdname = d->displayName(); QCString cfname = getOutputFileBase(); //QCString osname = cname; // in case of class members that are put in a group the name of the outerscope @@ -1322,14 +1323,17 @@ void MemberDef::writeDeclaration(OutputList &ol, // start a new member declaration bool isAnonymous = annoClassDef || m_impl->annMemb || m_impl->annEnumType; ///printf("startMemberItem for %s\n",name().data()); - ol.startMemberItem( isAnonymous ? 1 : m_impl->tArgList ? 3 : 0); + ol.startMemberItem( anchor(), isAnonymous ? 1 : m_impl->tArgList ? 3 : 0); // If there is no detailed description we need to write the anchor here. bool detailsVisible = isDetailedSectionLinkable(); if (!detailsVisible && !m_impl->annMemb) { QCString doxyName=name().copy(); - if (!cname.isEmpty()) doxyName.prepend(cname+"::"); + if (!cname.isEmpty()) + { + doxyName.prepend(cdname+getLanguageSpecificSeparator(getLanguage())); + } QCString doxyArgs=argsString(); ol.startDoxyAnchor(cfname,cname,anchor(),doxyName,doxyArgs); @@ -1354,7 +1358,7 @@ void MemberDef::writeDeclaration(OutputList &ol, { if (!isAnonymous) ol.startMemberTemplateParams(); writeTemplatePrefix(ol,m_impl->tArgList); - if (!isAnonymous) ol.endMemberTemplateParams(); + if (!isAnonymous) ol.endMemberTemplateParams(anchor()); } // *** write type @@ -1378,7 +1382,7 @@ void MemberDef::writeDeclaration(OutputList &ol, ol.startAnonTypeScope(s_indentLevel++); annoClassDef->writeDeclaration(ol,m_impl->annMemb,inGroup); //printf(">>>>>>>>>>>>>> startMemberItem(2)\n"); - ol.startMemberItem(2); + ol.startMemberItem(anchor(),2); int j; for (j=0;j< s_indentLevel-1;j++) { @@ -1644,7 +1648,7 @@ void MemberDef::writeDeclaration(OutputList &ol, /* && !annMemb */ ) { - ol.startMemberDescription(); + ol.startMemberDescription(anchor()); ol.parseDoc(briefFile(),briefLine(), getOuterScope()?getOuterScope():d,this,briefDescription(), TRUE,FALSE,0,TRUE,FALSE); @@ -1791,16 +1795,18 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, KEEP_RESIDENT_DURING_CALL; SrcLangExt lang = getLanguage(); + //printf("member=%s lang=%d\n",name().data(),lang); bool optVhdl = lang==SrcLangExt_VHDL; + QCString sep = getLanguageSpecificSeparator(lang); QCString scopeName = scName; QCString memAnchor = anchor(); QCString ciname = container->name(); if (container->definitionType()==TypeGroup) { - if (getClassDef()) scopeName=getClassDef()->name(); - else if (getNamespaceDef()) scopeName=getNamespaceDef()->name(); - else if (getFileDef()) scopeName=getFileDef()->name(); + if (getClassDef()) scopeName=getClassDef()->displayName(); + else if (getNamespaceDef()) scopeName=getNamespaceDef()->displayName(); + else if (getFileDef()) scopeName=getFileDef()->displayName(); ciname = ((GroupDef *)container)->groupTitle(); } else if (container->definitionType()==TypeFile && getNamespaceDef()) @@ -1809,14 +1815,17 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, memAnchor.prepend("file_"); } - QCString cname = container->name(); - QCString cfname = getOutputFileBase(); + QCString cname = container->name(); + QCString cfname = getOutputFileBase(); QCString cfiname = container->getOutputFileBase(); // get member name QCString doxyName=name(); // prepend scope if there is any. TODO: make this optional for C only docs - if (scopeName) doxyName.prepend((QCString)scopeName+"::"); + if (!scopeName.isEmpty()) + { + doxyName.prepend(scopeName+sep); + } QCString doxyArgs=argsString(); QCString ldef = definition(); @@ -1985,7 +1994,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, } else { - linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef); + linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),substitute(ldef,"::",sep)); hasParameterList=writeDefArgumentList(ol,cd,scopeName,this); } diff --git a/src/memberdef.h b/src/memberdef.h index 548410e..5ec91b3 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -237,6 +237,8 @@ class MemberDef : public Definition ClassDef *category() const; + QCString displayName() const { return Definition::name(); } + //----------------------------------------------------------------------------------- // ---- setters ----- //----------------------------------------------------------------------------------- diff --git a/src/memberlist.cpp b/src/memberlist.cpp index b98d86f..f35f5b7 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -319,14 +319,14 @@ void MemberList::writePlainDeclarations(OutputList &ol, ol.startMemberList(); first=FALSE; } - ol.startMemberItem(0); + ol.startMemberItem(md->anchor(),0); ol.writeString("enum "); ol.insertMemberAlign(); md->writeEnumDeclaration(ol,cd,nd,fd,gd); ol.endMemberItem(); if (!md->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { - ol.startMemberDescription(); + ol.startMemberDescription(md->anchor()); ol.parseDoc( md->briefFile(),md->briefLine(), cd,md, diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index 7a51f14..18d2801 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -591,7 +591,7 @@ void NamespaceDef::writeMemberPages(OutputList &ol) { if (ml->listType()&MemberList::documentationLists) { - ml->writeDocumentationPage(ol,name(),this); + ml->writeDocumentationPage(ol,displayName(),this); } } ol.popGeneratorState(); @@ -836,7 +836,7 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca if (nd->isLinkable()) { SrcLangExt lang = nd->getLanguage(); - ol.startMemberItem(0); + ol.startMemberItem(nd->getOutputFileBase(),0); if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp) { ol.docify("package "); @@ -867,8 +867,8 @@ void NamespaceSDict::writeDeclaration(OutputList &ol,const char *title,bool loca ol.endMemberItem(); if (!nd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { - ol.startMemberDescription(); - ol.parseDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE); + ol.startMemberDescription(nd->getOutputFileBase()); + ol.parseDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE,0,TRUE); ol.endMemberDescription(); } } @@ -950,7 +950,7 @@ void NamespaceDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType l void NamespaceDef::writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title) { MemberList * ml = getMemberList(lt); - if (ml) ml->writeDocumentation(ol,name(),this,title); + if (ml) ml->writeDocumentation(ol,displayName(),this,title); } diff --git a/src/navtree.js b/src/navtree.js index f3c0380..b0c4936 100644 --- a/src/navtree.js +++ b/src/navtree.js @@ -26,80 +26,54 @@ function getScript(scriptName,func,show) function createIndent(o,domNode,node,level) { - if (node.parentNode && node.parentNode.parentNode) - { + if (node.parentNode && node.parentNode.parentNode) { createIndent(o,domNode,node.parentNode,level+1); } var imgNode = document.createElement("img"); imgNode.width = 16; imgNode.height = 22; - if (level==0 && node.childrenData) - { + if (level==0 && node.childrenData) { node.plus_img = imgNode; node.expandToggle = document.createElement("a"); node.expandToggle.href = "javascript:void(0)"; - node.expandToggle.onclick = function() - { - if (node.expanded) - { + node.expandToggle.onclick = function() { + if (node.expanded) { $(node.getChildrenUL()).slideUp("fast"); - if (node.isLast) - { + if (node.isLast) { node.plus_img.src = node.relpath+"ftv2plastnode.png"; - } - else - { + } else { node.plus_img.src = node.relpath+"ftv2pnode.png"; } node.expanded = false; - } - else - { + } else { expandNode(o, node, false, false); } } node.expandToggle.appendChild(imgNode); domNode.appendChild(node.expandToggle); - } - else - { + } else { domNode.appendChild(imgNode); } - if (level==0) - { - if (node.isLast) - { - if (node.childrenData) - { + if (level==0) { + if (node.isLast) { + if (node.childrenData) { imgNode.src = node.relpath+"ftv2plastnode.png"; - } - else - { + } else { imgNode.src = node.relpath+"ftv2lastnode.png"; domNode.appendChild(imgNode); } - } - else - { - if (node.childrenData) - { + } else { + if (node.childrenData) { imgNode.src = node.relpath+"ftv2pnode.png"; - } - else - { + } else { imgNode.src = node.relpath+"ftv2node.png"; domNode.appendChild(imgNode); } } - } - else - { - if (node.isLast) - { + } else { + if (node.isLast) { imgNode.src = node.relpath+"ftv2blank.png"; - } - else - { + } else { imgNode.src = node.relpath+"ftv2vertline.png"; } } @@ -134,37 +108,45 @@ function newNode(o, po, text, link, childrenData, lastNode) node.label = document.createTextNode(text); node.expanded = false; a.appendChild(node.label); - if (link) - { + if (link) { + var url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } a.className = stripPath(link.replace('#',':')); - if (link.indexOf('#')!=-1) - { + if (link.indexOf('#')!=-1) { var aname = '#'+link.split('#')[1]; var srcPage = stripPath($(location).attr('pathname')); var targetPage = stripPath(link.split('#')[0]); - a.href = srcPage!=targetPage ? node.relpath+link : '#'; + a.href = srcPage!=targetPage ? url : '#'; a.onclick = function(){ $('.item').removeClass('selected'); $('.item').removeAttr('id'); $(a).parent().parent().addClass('selected'); $(a).parent().parent().attr('id','selected'); - var anchor = $(aname); - $("#doc-content").animate({ - scrollTop: anchor.position().top + - $('#doc-content').scrollTop() - - $('#doc-content').offset().top - },500,function(){ + var pos, anchor = $(aname), docContent = $('#doc-content'); + if (anchor.parent().attr('class')=='memItemLeft') { + pos = anchor.parent().position().top; + } else { + pos = anchor.position().top; + } + var dist = Math.abs(Math.min( + pos-docContent.offset().top, + docContent[0].scrollHeight- + docContent.height()-docContent.scrollTop())); + docContent.animate({ + scrollTop: pos + docContent.scrollTop() - docContent.offset().top + },Math.max(50,Math.min(500,dist)),function(){ window.location.replace(aname); }); }; + } else { + a.href = url; } - else - { - a.href = node.relpath+link; - } - } - else - { + } else { if (childrenData != null) { a.className = "nolink"; @@ -174,10 +156,8 @@ function newNode(o, po, text, link, childrenData, lastNode) } node.childrenUL = null; - node.getChildrenUL = function() - { - if (!node.childrenUL) - { + node.getChildrenUL = function() { + if (!node.childrenUL) { node.childrenUL = document.createElement("ul"); node.childrenUL.className = "children_ul"; node.childrenUL.style.display = "none"; @@ -205,36 +185,24 @@ function showRoot() function expandNode(o, node, imm, showRoot) { - if (node.childrenData && !node.expanded) - { - if (typeof(node.childrenData)==='string') - { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { var varName = node.childrenData; getScript(node.relpath+varName,function(){ node.childrenData = getData(varName); expandNode(o, node, imm, showRoot); }, showRoot); - } - else - { - if (!node.childrenVisited) - { + } else { + if (!node.childrenVisited) { getNode(o, node); - } - if (imm) - { + } if (imm) { $(node.getChildrenUL()).show(); - } - else - { + } else { $(node.getChildrenUL()).slideDown("fast"); } - if (node.isLast) - { + if (node.isLast) { node.plus_img.src = node.relpath+"ftv2mlastnode.png"; - } - else - { + } else { node.plus_img.src = node.relpath+"ftv2mnode.png"; } node.expanded = true; @@ -244,72 +212,53 @@ function expandNode(o, node, imm, showRoot) function showNode(o, node, index) { - if (node.childrenData && !node.expanded) - { - if (typeof(node.childrenData)==='string') - { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { var varName = node.childrenData; getScript(node.relpath+varName,function(){ node.childrenData = getData(varName); showNode(o,node,index); },true); - } - else - { - if (!node.childrenVisited) - { + } else { + if (!node.childrenVisited) { getNode(o, node); } $(node.getChildrenUL()).show(); - if (node.isLast) - { + if (node.isLast) { node.plus_img.src = node.relpath+"ftv2mlastnode.png"; - } - else - { + } else { node.plus_img.src = node.relpath+"ftv2mnode.png"; } node.expanded = true; var n = node.children[o.breadcrumbs[index]]; - if (index+1<o.breadcrumbs.length) - { + if (index+1<o.breadcrumbs.length) { showNode(o,n,index+1); - } - else - { - if (typeof(n.childrenData)==='string') - { + } else { + if (typeof(n.childrenData)==='string') { var varName = n.childrenData; getScript(n.relpath+varName,function(){ n.childrenData = getData(varName); node.expanded=false; showNode(o,node,index); // retry with child node expanded },true); - } - else - { - if (o.toroot=="index.html" || n.childrenData) - { + } else { + if (o.toroot=="index.html" || n.childrenData) { expandNode(o, n, true, true); } var a; - if ($(location).attr('hash')) - { + if ($(location).attr('hash')) { var link=stripPath($(location).attr('pathname'))+':'+ $(location).attr('hash').substring(1); a=$('.item a[class*=\""'+link+'"\"]'); } - if (a && a.length) - { + if (a && a.length) { a.parent().parent().addClass('selected'); a.parent().parent().attr('id','selected'); var anchor = $($(location).attr('hash')); var targetDiv = anchor.next(); $(targetDiv).children('.memproto,.memdoc'). effect("highlight", {}, 1500); - } - else - { + } else { $(n.itemDiv).addClass('selected'); $(n.itemDiv).attr('id','selected'); } @@ -323,8 +272,7 @@ function getNode(o, po) { po.childrenVisited = true; var l = po.childrenData.length-1; - for (var i in po.childrenData) - { + for (var i in po.childrenData) { var nodeData = po.childrenData[i]; po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2], i==l); @@ -364,11 +312,13 @@ function initNavTree(toroot,relpath) $(window).bind('hashchange', function(){ if (window.location.hash && window.location.hash.length>1){ var anchor = $(window.location.hash); - var targetDiv = anchor.next(); - $(targetDiv).children('.memproto,.memdoc').effect("highlight",{},1500); - var docContent = $('#doc-content'); - if (docContent && anchor && anchor[0] && anchor[0].ownerDocument){ - docContent.scrollTop(anchor.position().top+docContent.scrollTop()-docContent.offset().top); + if (anchor.parent().attr('class')=='memItemLeft'){ + var rows = $('.memberdecls tr[class$=\""'+ + window.location.hash.substring(1)+'"\"]').children(); + rows.effect('highlight',{},1500); + } else { + var targetDiv = anchor.next(); + $(targetDiv).children('.memproto,.memdoc').effect("highlight",{},1500); } var a; if ($(location).attr('hash')){ @@ -385,9 +335,6 @@ function initNavTree(toroot,relpath) var targetDiv = anchor.next(); showRoot(); } - } else { - var docContent = $('#doc-content'); - if (docContent){ docContent.scrollTop(0); } } }) diff --git a/src/navtree_js.h b/src/navtree_js.h index 2ad1fc1..c231b6b 100644 --- a/src/navtree_js.h +++ b/src/navtree_js.h @@ -26,80 +26,54 @@ "\n" "function createIndent(o,domNode,node,level)\n" "{\n" -" if (node.parentNode && node.parentNode.parentNode)\n" -" {\n" +" if (node.parentNode && node.parentNode.parentNode) {\n" " createIndent(o,domNode,node.parentNode,level+1);\n" " }\n" " var imgNode = document.createElement(\"img\");\n" " imgNode.width = 16;\n" " imgNode.height = 22;\n" -" if (level==0 && node.childrenData)\n" -" {\n" +" if (level==0 && node.childrenData) {\n" " node.plus_img = imgNode;\n" " node.expandToggle = document.createElement(\"a\");\n" " node.expandToggle.href = \"javascript:void(0)\";\n" -" node.expandToggle.onclick = function() \n" -" {\n" -" if (node.expanded) \n" -" {\n" +" node.expandToggle.onclick = function() {\n" +" if (node.expanded) {\n" " $(node.getChildrenUL()).slideUp(\"fast\");\n" -" if (node.isLast)\n" -" {\n" +" if (node.isLast) {\n" " node.plus_img.src = node.relpath+\"ftv2plastnode.png\";\n" -" }\n" -" else\n" -" {\n" +" } else {\n" " node.plus_img.src = node.relpath+\"ftv2pnode.png\";\n" " }\n" " node.expanded = false;\n" -" } \n" -" else \n" -" {\n" +" } else {\n" " expandNode(o, node, false, false);\n" " }\n" " }\n" " node.expandToggle.appendChild(imgNode);\n" " domNode.appendChild(node.expandToggle);\n" -" }\n" -" else\n" -" {\n" +" } else {\n" " domNode.appendChild(imgNode);\n" " }\n" -" if (level==0)\n" -" {\n" -" if (node.isLast)\n" -" {\n" -" if (node.childrenData)\n" -" {\n" +" if (level==0) {\n" +" if (node.isLast) {\n" +" if (node.childrenData) {\n" " imgNode.src = node.relpath+\"ftv2plastnode.png\";\n" -" }\n" -" else\n" -" {\n" +" } else {\n" " imgNode.src = node.relpath+\"ftv2lastnode.png\";\n" " domNode.appendChild(imgNode);\n" " }\n" -" }\n" -" else\n" -" {\n" -" if (node.childrenData)\n" -" {\n" +" } else {\n" +" if (node.childrenData) {\n" " imgNode.src = node.relpath+\"ftv2pnode.png\";\n" -" }\n" -" else\n" -" {\n" +" } else {\n" " imgNode.src = node.relpath+\"ftv2node.png\";\n" " domNode.appendChild(imgNode);\n" " }\n" " }\n" -" }\n" -" else\n" -" {\n" -" if (node.isLast)\n" -" {\n" +" } else {\n" +" if (node.isLast) {\n" " imgNode.src = node.relpath+\"ftv2blank.png\";\n" -" }\n" -" else\n" -" {\n" +" } else {\n" " imgNode.src = node.relpath+\"ftv2vertline.png\";\n" " }\n" " }\n" @@ -134,37 +108,45 @@ " node.label = document.createTextNode(text);\n" " node.expanded = false;\n" " a.appendChild(node.label);\n" -" if (link) \n" -" {\n" +" if (link) {\n" +" var url;\n" +" if (link.substring(0,1)=='^') {\n" +" url = link.substring(1);\n" +" link = url;\n" +" } else {\n" +" url = node.relpath+link;\n" +" }\n" " a.className = stripPath(link.replace('#',':'));\n" -" if (link.indexOf('#')!=-1)\n" -" {\n" +" if (link.indexOf('#')!=-1) {\n" " var aname = '#'+link.split('#')[1];\n" " var srcPage = stripPath($(location).attr('pathname'));\n" " var targetPage = stripPath(link.split('#')[0]);\n" -" a.href = srcPage!=targetPage ? node.relpath+link : '#';\n" +" a.href = srcPage!=targetPage ? url : '#';\n" " a.onclick = function(){\n" " $('.item').removeClass('selected');\n" " $('.item').removeAttr('id');\n" " $(a).parent().parent().addClass('selected');\n" " $(a).parent().parent().attr('id','selected');\n" -" var anchor = $(aname);\n" -" $(\"#doc-content\").animate({\n" -" scrollTop: anchor.position().top +\n" -" $('#doc-content').scrollTop() -\n" -" $('#doc-content').offset().top\n" -" },500,function(){\n" +" var pos, anchor = $(aname), docContent = $('#doc-content');\n" +" if (anchor.parent().attr('class')=='memItemLeft') {\n" +" pos = anchor.parent().position().top;\n" +" } else {\n" +" pos = anchor.position().top;\n" +" }\n" +" var dist = Math.abs(Math.min(\n" +" pos-docContent.offset().top,\n" +" docContent[0].scrollHeight-\n" +" docContent.height()-docContent.scrollTop()));\n" +" docContent.animate({\n" +" scrollTop: pos + docContent.scrollTop() - docContent.offset().top\n" +" },Math.max(50,Math.min(500,dist)),function(){\n" " window.location.replace(aname);\n" " });\n" " };\n" +" } else {\n" +" a.href = url;\n" " }\n" -" else\n" -" {\n" -" a.href = node.relpath+link;\n" -" }\n" -" } \n" -" else \n" -" {\n" +" } else {\n" " if (childrenData != null) \n" " {\n" " a.className = \"nolink\";\n" @@ -174,10 +156,8 @@ " }\n" "\n" " node.childrenUL = null;\n" -" node.getChildrenUL = function() \n" -" {\n" -" if (!node.childrenUL) \n" -" {\n" +" node.getChildrenUL = function() {\n" +" if (!node.childrenUL) {\n" " node.childrenUL = document.createElement(\"ul\");\n" " node.childrenUL.className = \"children_ul\";\n" " node.childrenUL.style.display = \"none\";\n" @@ -205,36 +185,24 @@ "\n" "function expandNode(o, node, imm, showRoot)\n" "{\n" -" if (node.childrenData && !node.expanded) \n" -" {\n" -" if (typeof(node.childrenData)==='string')\n" -" {\n" +" if (node.childrenData && !node.expanded) {\n" +" if (typeof(node.childrenData)==='string') {\n" " var varName = node.childrenData;\n" " getScript(node.relpath+varName,function(){\n" " node.childrenData = getData(varName);\n" " expandNode(o, node, imm, showRoot);\n" " }, showRoot);\n" -" }\n" -" else\n" -" {\n" -" if (!node.childrenVisited) \n" -" {\n" +" } else {\n" +" if (!node.childrenVisited) {\n" " getNode(o, node);\n" -" }\n" -" if (imm)\n" -" {\n" +" } if (imm) {\n" " $(node.getChildrenUL()).show();\n" -" } \n" -" else \n" -" {\n" +" } else {\n" " $(node.getChildrenUL()).slideDown(\"fast\");\n" " }\n" -" if (node.isLast)\n" -" {\n" +" if (node.isLast) {\n" " node.plus_img.src = node.relpath+\"ftv2mlastnode.png\";\n" -" }\n" -" else\n" -" {\n" +" } else {\n" " node.plus_img.src = node.relpath+\"ftv2mnode.png\";\n" " }\n" " node.expanded = true;\n" @@ -244,72 +212,53 @@ "\n" "function showNode(o, node, index)\n" "{\n" -" if (node.childrenData && !node.expanded) \n" -" {\n" -" if (typeof(node.childrenData)==='string')\n" -" {\n" +" if (node.childrenData && !node.expanded) {\n" +" if (typeof(node.childrenData)==='string') {\n" " var varName = node.childrenData;\n" " getScript(node.relpath+varName,function(){\n" " node.childrenData = getData(varName);\n" " showNode(o,node,index);\n" " },true);\n" -" }\n" -" else\n" -" {\n" -" if (!node.childrenVisited) \n" -" {\n" +" } else {\n" +" if (!node.childrenVisited) {\n" " getNode(o, node);\n" " }\n" " $(node.getChildrenUL()).show();\n" -" if (node.isLast)\n" -" {\n" +" if (node.isLast) {\n" " node.plus_img.src = node.relpath+\"ftv2mlastnode.png\";\n" -" }\n" -" else\n" -" {\n" +" } else {\n" " node.plus_img.src = node.relpath+\"ftv2mnode.png\";\n" " }\n" " node.expanded = true;\n" " var n = node.children[o.breadcrumbs[index]];\n" -" if (index+1<o.breadcrumbs.length)\n" -" {\n" +" if (index+1<o.breadcrumbs.length) {\n" " showNode(o,n,index+1);\n" -" }\n" -" else\n" -" {\n" -" if (typeof(n.childrenData)==='string')\n" -" {\n" +" } else {\n" +" if (typeof(n.childrenData)==='string') {\n" " var varName = n.childrenData;\n" " getScript(n.relpath+varName,function(){\n" " n.childrenData = getData(varName);\n" " node.expanded=false;\n" " showNode(o,node,index); // retry with child node expanded\n" " },true);\n" -" }\n" -" else\n" -" {\n" -" if (o.toroot==\"index.html\" || n.childrenData)\n" -" {\n" +" } else {\n" +" if (o.toroot==\"index.html\" || n.childrenData) {\n" " expandNode(o, n, true, true);\n" " }\n" " var a;\n" -" if ($(location).attr('hash'))\n" -" {\n" +" if ($(location).attr('hash')) {\n" " var link=stripPath($(location).attr('pathname'))+':'+\n" " $(location).attr('hash').substring(1);\n" " a=$('.item a[class*=\\\"\"'+link+'\"\\\"]');\n" " }\n" -" if (a && a.length)\n" -" {\n" +" if (a && a.length) {\n" " a.parent().parent().addClass('selected');\n" " a.parent().parent().attr('id','selected');\n" " var anchor = $($(location).attr('hash'));\n" " var targetDiv = anchor.next();\n" " $(targetDiv).children('.memproto,.memdoc').\n" " effect(\"highlight\", {}, 1500);\n" -" }\n" -" else\n" -" {\n" +" } else {\n" " $(n.itemDiv).addClass('selected');\n" " $(n.itemDiv).attr('id','selected');\n" " }\n" @@ -323,8 +272,7 @@ "{\n" " po.childrenVisited = true;\n" " var l = po.childrenData.length-1;\n" -" for (var i in po.childrenData) \n" -" {\n" +" for (var i in po.childrenData) {\n" " var nodeData = po.childrenData[i];\n" " po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2],\n" " i==l);\n" @@ -364,11 +312,13 @@ " $(window).bind('hashchange', function(){\n" " if (window.location.hash && window.location.hash.length>1){\n" " var anchor = $(window.location.hash);\n" -" var targetDiv = anchor.next();\n" -" $(targetDiv).children('.memproto,.memdoc').effect(\"highlight\",{},1500);\n" -" var docContent = $('#doc-content');\n" -" if (docContent && anchor && anchor[0] && anchor[0].ownerDocument){\n" -" docContent.scrollTop(anchor.position().top+docContent.scrollTop()-docContent.offset().top);\n" +" if (anchor.parent().attr('class')=='memItemLeft'){\n" +" var rows = $('.memberdecls tr[class$=\\\"\"'+\n" +" window.location.hash.substring(1)+'\"\\\"]').children();\n" +" rows.effect('highlight',{},1500);\n" +" } else {\n" +" var targetDiv = anchor.next();\n" +" $(targetDiv).children('.memproto,.memdoc').effect(\"highlight\",{},1500);\n" " }\n" " var a;\n" " if ($(location).attr('hash')){\n" @@ -385,9 +335,6 @@ " var targetDiv = anchor.next();\n" " showRoot();\n" " }\n" -" } else {\n" -" var docContent = $('#doc-content');\n" -" if (docContent){ docContent.scrollTop(0); }\n" " }\n" " })\n" "\n" diff --git a/src/outputgen.h b/src/outputgen.h index 740940e..ba77605 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -340,10 +340,10 @@ class OutputGenerator : public BaseOutputDocInterface virtual void endInlineHeader() = 0; virtual void startAnonTypeScope(int) = 0; virtual void endAnonTypeScope(int) = 0; - virtual void startMemberItem(int) = 0; + virtual void startMemberItem(const char *,int) = 0; virtual void endMemberItem() = 0; virtual void startMemberTemplateParams() = 0; - virtual void endMemberTemplateParams() = 0; + virtual void endMemberTemplateParams(const char *) = 0; virtual void startMemberGroupHeader(bool) = 0; virtual void endMemberGroupHeader() = 0; virtual void startMemberGroupDocs() = 0; @@ -362,7 +362,7 @@ class OutputGenerator : public BaseOutputDocInterface virtual void writeStartAnnoItem(const char *type,const char *file, const char *path,const char *name) = 0; virtual void writeEndAnnoItem(const char *name) = 0; - virtual void startMemberDescription() = 0; + virtual void startMemberDescription(const char *anchor) = 0; virtual void endMemberDescription() = 0; virtual void startIndent() = 0; virtual void endIndent() = 0; @@ -384,7 +384,7 @@ class OutputGenerator : public BaseOutputDocInterface virtual void endQuickIndices() = 0; virtual void writeSplitBar(const char *) = 0; virtual void writeLogo() = 0; - virtual void writeQuickLinks(bool compact,HighlightedItem hli) = 0; + virtual void writeQuickLinks(bool compact,HighlightedItem hli,const char *file) = 0; virtual void startContents() = 0; virtual void endContents() = 0; virtual void startTextBlock(bool) = 0; @@ -394,7 +394,7 @@ class OutputGenerator : public BaseOutputDocInterface virtual void endMemberDocPrefixItem() = 0; virtual void startMemberDocName(bool) = 0; virtual void endMemberDocName() = 0; - virtual void startParameterType(bool,const char *) = 0; + virtual void startParameterType(bool,const char *key) = 0; virtual void endParameterType() = 0; virtual void startParameterName(bool) = 0; virtual void endParameterName(bool,bool,bool) = 0; diff --git a/src/outputlist.cpp b/src/outputlist.cpp index 57f4f67..738d540 100644 --- a/src/outputlist.cpp +++ b/src/outputlist.cpp @@ -289,16 +289,17 @@ FORALL1(SectionTypes a1,a1) FORALL1(bool a1,a1) FORALL2(bool a1,int a2,a1,a2) FORALL2(bool a1,bool a2,a1,a2) +FORALL2(const char *a1,bool a2,a1,a2) FORALL4(const char *a1,const char *a2,const char *a3,bool a4,a1,a2,a3,a4) #endif FORALL2(int a1,bool a2,a1,a2) -FORALL2(bool a1,HighlightedItem a2,a1,a2) FORALL2(bool a1,const char *a2,a1,a2) FORALL2(ParamListTypes a1,const char *a2,a1,a2) FORALL1(IndexSections a1,a1) FORALL2(const char *a1,const char *a2,a1,a2) -FORALL2(const char *a1,bool a2,a1,a2) +FORALL2(const char *a1,int a2,a1,a2) FORALL2(const char *a1,SectionInfo::SectionType a2,a1,a2) +FORALL3(bool a1,HighlightedItem a2,const char *a3,a1,a2,a3) FORALL3(bool a1,bool a2,bool a3,a1,a2,a3) FORALL3(const ClassDiagram &a1,const char *a2,const char *a3,a1,a2,a3) FORALL3(const char *a1,const char *a2,const char *a3,a1,a2,a3) diff --git a/src/outputlist.h b/src/outputlist.h index e832175..2e863e3 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -201,14 +201,14 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startAnonTypeScope,i1); } void endAnonTypeScope(int i1) { forall(&OutputGenerator::endAnonTypeScope,i1); } - void startMemberItem(int i1) - { forall(&OutputGenerator::startMemberItem,i1); } + void startMemberItem(const char *anchor,int i1) + { forall(&OutputGenerator::startMemberItem,anchor,i1); } void endMemberItem() { forall(&OutputGenerator::endMemberItem); } void startMemberTemplateParams() { forall(&OutputGenerator::startMemberTemplateParams); } - void endMemberTemplateParams() - { forall(&OutputGenerator::endMemberTemplateParams); } + void endMemberTemplateParams(const char *anchor) + { forall(&OutputGenerator::endMemberTemplateParams,anchor); } void startMemberGroupHeader(bool b) { forall(&OutputGenerator::startMemberGroupHeader,b); } void endMemberGroupHeader() @@ -295,8 +295,8 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startBold); } void endBold() { forall(&OutputGenerator::endBold); } - void startMemberDescription() - { forall(&OutputGenerator::startMemberDescription); } + void startMemberDescription(const char *anchor) + { forall(&OutputGenerator::startMemberDescription,anchor); } void endMemberDescription() { forall(&OutputGenerator::endMemberDescription); } void startSimpleSect(SectionTypes t,const char *file,const char *anchor, @@ -338,8 +338,8 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::writeSplitBar,name); } void writeLogo() { forall(&OutputGenerator::writeLogo); } - void writeQuickLinks(bool compact,HighlightedItem hli) - { forall(&OutputGenerator::writeQuickLinks,compact,hli); } + void writeQuickLinks(bool compact,HighlightedItem hli,const char *file) + { forall(&OutputGenerator::writeQuickLinks,compact,hli,file); } void startContents() { forall(&OutputGenerator::startContents); } void endContents() @@ -489,15 +489,16 @@ class OutputList : public OutputDocInterface FORALLPROTO1(bool); FORALLPROTO2(bool,int); FORALLPROTO2(bool,bool); + FORALLPROTO2(const char *,bool); FORALLPROTO4(const char *,const char *,const char *,int); #endif FORALLPROTO2(int,bool); - FORALLPROTO2(bool,HighlightedItem); FORALLPROTO2(bool,const char *); FORALLPROTO2(ParamListTypes,const char *); FORALLPROTO2(const char *,const char *); - FORALLPROTO2(const char *,bool); + FORALLPROTO2(const char *,int); FORALLPROTO2(const char *,SectionInfo::SectionType); + FORALLPROTO3(bool,HighlightedItem,const char *); FORALLPROTO3(bool,bool,bool); FORALLPROTO3(const char *,const char *,bool); FORALLPROTO3(const char *,const char *,SectionInfo::SectionType); diff --git a/src/pagedef.h b/src/pagedef.h index b0c24d4..136a997 100644 --- a/src/pagedef.h +++ b/src/pagedef.h @@ -52,6 +52,7 @@ class PageDef : public Definition bool hasParentPage() const; void setPageScope(Definition *d){ m_pageScope = d; } Definition *getPageScope() const { return m_pageScope; } + QCString displayName() const { return !m_title.isEmpty() ? m_title : Definition::name(); } private: void setNestingLevel(int l); diff --git a/src/portable.cpp b/src/portable.cpp index 6dadcd1..f2d1166 100644 --- a/src/portable.cpp +++ b/src/portable.cpp @@ -2,6 +2,7 @@ #include <ctype.h> #if defined(_WIN32) && !defined(__CYGWIN__) #undef UNICODE +#define _WIN32_DCOM #include <windows.h> #else #include <unistd.h> @@ -63,19 +63,28 @@ struct FileState QCString fileName; }; -/** @brief Singleton that manages the defines available while proprocessing files. */ +/** @brief Singleton that manages the defines available while + * proprocessing files. + */ class DefineManager { + /** Local class used to hold the defines for a single file */ class DefinesPerFile { public: + /** Creates an empty container for defines */ DefinesPerFile() : m_defines(257), m_includedFiles(17) { m_defines.setAutoDelete(TRUE); } + /** Destroys the object */ virtual ~DefinesPerFile() { } + /** Adds a define in the context of a file. Will replace + * an existing define with the same name (redefinition) + * @param def The Define object to add. + */ void addDefine(Define *def) { Define *d = m_defines.find(def->name); @@ -85,6 +94,9 @@ class DefineManager } m_defines.insert(def->name,def); } + /** Adds an include file for this file + * @param fileName The name of the include file + */ void addInclude(const char *fileName) { m_includedFiles.insert(fileName,(void*)0x8); @@ -97,26 +109,48 @@ class DefineManager public: friend class DefinesPerFile; + /** Returns a reference to the singleton */ static DefineManager &instance() { if (theInstance==0) theInstance = new DefineManager; return *theInstance; } + /** Deletes the singleton */ static void deleteInstance() { delete theInstance; theInstance = 0; } - void startContext() + /** Starts a context in which defines are collected. + * Called at the start of a new file that is preprocessed. + * @param fileName the name of the file to process. + */ + void startContext(const char *fileName) { //printf("DefineManager::startContext()\n"); m_contextDefines.clear(); + if (fileName==0) return; + DefinesPerFile *dpf = m_fileMap.find(fileName); + if (dpf==0) + { + //printf("New file!\n"); + dpf = new DefinesPerFile; + m_fileMap.insert(fileName,dpf); + } } + /** Ends the context started with startContext() freeing any + * defines collected within in this context. + */ void endContext() { //printf("DefineManager::endContext()\n"); m_contextDefines.clear(); } + /** Add an included file to the current context. + * If the file has been pre-processed already, all defines are added + * to the context. + * @param fileName The name of the include file to add to the context. + */ void addFileToContext(const char *fileName) { if (fileName==0) return; @@ -135,6 +169,11 @@ class DefineManager dpf->collectDefines(&m_contextDefines,includeStack); } } + + /** Add a define to the manager object. + * @param fileName The file in which the define was found + * @param def The Define object to add. + */ void addDefine(const char *fileName,Define *def) { if (fileName==0) return; @@ -153,6 +192,11 @@ class DefineManager } dpf->addDefine(def); } + + /** Add an include relation to the manager object. + * @param fromFileName file name in which the include was found. + * @param toFileName file name that is included. + */ void addInclude(const char *fromFileName,const char *toFileName) { //printf("DefineManager::addInclude(%s,%s)\n",fromFileName,toFileName); @@ -164,16 +208,22 @@ class DefineManager } dpf->addInclude(toFileName); } + /** Returns a Define object given its name or 0 if the Define does + * not exist. + */ Define *isDefined(const char *name) const { return m_contextDefines.find(name); } + /** Returns a reference to the defines found in the current context. */ const DefineDict &defineContext() const { return m_contextDefines; } private: static DefineManager *theInstance; + + /** Helper function to collect all define for a given file */ void collectDefinesForFile(const char *fileName,DefineDict *dict) { if (fileName==0) return; @@ -184,25 +234,41 @@ class DefineManager dpf->collectDefines(dict,includeStack); } } + + /** Helper function to return the DefinesPerFile object for a given file name. */ DefinesPerFile *find(const char *fileName) const { if (fileName==0) return 0; return m_fileMap.find(fileName); } + + /** Creates a new DefineManager object */ DefineManager() : m_fileMap(1009), m_contextDefines(1009) { m_fileMap.setAutoDelete(TRUE); } + + /** Destroys the object */ virtual ~DefineManager() { } + QDict<DefinesPerFile> m_fileMap; DefineDict m_contextDefines; }; +/** Singleton instance */ DefineManager *DefineManager::theInstance = 0; -void DefineManager::DefinesPerFile::collectDefines(DefineDict *dict,QDict<void> &includeStack) +/** Collects all defines for a file and all files that the file includes. + * This function will recursively call itself for each file. + * @param dict The dictionary to fill with the defines. A redefine will + * replace a previous definition. + * @param includeStack The stack of includes, used to stop recursion in + * case there is a cyclic include dependency. + */ +void DefineManager::DefinesPerFile::collectDefines( + DefineDict *dict,QDict<void> &includeStack) { //printf("DefinesPerFile::collectDefines #defines=%d\n",m_defines.count()); { @@ -2773,10 +2839,9 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output) g_condStack.setAutoDelete(TRUE); //g_fileDefineDict->clear(); - DefineManager::instance().startContext(); setFileName(fileName); g_inputFileDef = g_yyFileDef; - DefineManager::instance().addFileToContext(g_yyFileName); + DefineManager::instance().startContext(g_yyFileName); static bool firstTime=TRUE; if (firstTime) diff --git a/src/pycode.l b/src/pycode.l index 0116e80..1eb762d 100644 --- a/src/pycode.l +++ b/src/pycode.l @@ -296,7 +296,7 @@ static void addToSearchIndex(const char *text) } -static ClassDef *stripClassName(const char *s) +static ClassDef *stripClassName(const char *s,Definition *d=g_currentDefinition) { int pos=0; QCString type = s; @@ -309,11 +309,11 @@ static ClassDef *stripClassName(const char *s) ClassDef *cd=0; if (!g_classScope.isEmpty()) { - cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope+"::"+clName); + cd=getResolvedClass(d,g_sourceFileDef,g_classScope+"::"+clName); } if (cd==0) { - cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,clName); + cd=getResolvedClass(d,g_sourceFileDef,clName); } if (cd) { @@ -516,7 +516,7 @@ static bool getLinkInScope(const QCString &c, // scope if (md->getGroupDef()) d = md->getGroupDef(); if (d && d->isLinkable()) { - g_theCallContext.setClass(stripClassName(md->typeString())); + g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope())); //printf("g_currentDefinition=%p g_currentMemberDef=%p\n", // g_currentDefinition,g_currentMemberDef); @@ -563,18 +563,16 @@ static bool getLink(const char *className, /* For a given string in the source code, finds its class or global id and links to it. - - As of June 1, '05, this ONLY finds classes */ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName, - bool /*typeOnly*/=FALSE) + bool typeOnly=FALSE) { QCString className=clName; // Don't do anything for empty text if (className.isEmpty()) return; - //printf("generateClassOrGlobalLink(className=%s)\n",className.data()); + //fprintf(stderr,"generateClassOrGlobalLink(className=%s)\n",className.data()); ClassDef *cd=0,*lcd=0; /** Class def that we may find */ MemberDef *md=0; /** Member def that we may find */ @@ -583,15 +581,25 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName, if ((lcd=g_theVarContext.findVariable(className))==0) // not a local variable { Definition *d = g_currentDefinition; + QCString scope = substitute(className,".","::"); - cd = getResolvedClass(d,g_sourceFileDef,className,&md); + cd = getResolvedClass(d,g_sourceFileDef,substitute(className,".","::"),&md); - //printf("d=%p g_sourceFileDef=%p\n",d,g_currentDefinition); - //printf("is found as a type %s\n",cd?cd->name().data():"<null>"); + //fprintf(stderr,"d=%s g_sourceFileDef=%s\n", + // d?d->displayName().data():"<null>", + // g_currentDefinition?g_currentDefinition->displayName().data():"<null>"); + //fprintf(stderr,"is found as a type %s\n",cd?cd->name().data():"<null>"); if (cd==0 && md==0) // also see if it is variable or enum or enum value { - if (getLink(g_classScope,clName,ol,clName)) + NamespaceDef *nd = getResolvedNamespace(scope); + if (nd) + { + writeMultiLineCodeLink(ol,nd->getReference(),nd->getOutputFileBase(),nd->anchor(),clName,nd->briefDescriptionAsTooltip()); + addToSearchIndex(className); + return; + } + else if (getLink(g_classScope,clName,ol,clName)) { return; } @@ -624,50 +632,55 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName, } else // not a class, maybe a global member { - //printf("Checking if '%s' is a global function\n",clName); - - /* - This code requires a going-over in order to - make it work for Python - - //printf("class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly); - if (!isLocal && (md!=0 || (cd==0 && !typeOnly))) // not a class, see if it is a global enum/variable/typedef. + int scopeEnd = className.findRev("."); + if (scopeEnd!=-1 && !typeOnly) // name with explicit scope { - if (md==0) // not found as a typedef - { - md = setCallContextForVar(clName); - //printf("setCallContextForVar(%s) md=%p g_currentDefinition=%p\n",clName,md,g_currentDefinition); - if (md && g_currentDefinition) - { - //fprintf(stderr,"%s accessible from %s? %d md->getOuterScope=%s\n", - // md->name().data(),g_currentDefinition->name().data(), - // isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md), - // md->getOuterScope()->name().data()); - } - - if (md && g_currentDefinition && - isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md)==-1) - { - md=0; // variable not accessible - } - } - if (md) + QCString scope = substitute(className.left(scopeEnd),".","::"); + QCString locName = className.right(className.length()-scopeEnd-1); + ClassDef *mcd = getClass(scope); + //fprintf(stderr,"scope=%s locName=%s mcd=%p\n",scope.data(),locName.data(),mcd); + if (mcd) { - //printf("is a global md=%p g_currentDefinition=%s\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>"); - if (md->isLinkable()) + MemberDef *md = mcd->getMemberByName(locName); + if (md) { - writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),clName,md->briefDescriptionAsTooltip()); - addToSearchIndex(clName); - if (g_currentMemberDef) + g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope())); + writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),clName,md->briefDescriptionAsTooltip()); + addToSearchIndex(className); + Definition *d = md->getOuterScope()==Doxygen::globalScope ? + md->getBodyDef() : md->getOuterScope(); + if (md->getGroupDef()) d = md->getGroupDef(); + if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef) { addDocCrossReference(g_currentMemberDef,md); } return; } } + else // check namespace as well + { + NamespaceDef *mnd = getResolvedNamespace(scope); + if (mnd) + { + MemberDef *md=mnd->getMemberByName(locName); + if (md) + { + //printf("name=%s scope=%s\n",locName.data(),scope.data()); + g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope())); + writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),clName,md->briefDescriptionAsTooltip()); + addToSearchIndex(className); + Definition *d = md->getOuterScope()==Doxygen::globalScope ? + md->getBodyDef() : md->getOuterScope(); + if (md->getGroupDef()) d = md->getGroupDef(); + if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef) + { + addDocCrossReference(g_currentMemberDef,md); + } + return; + } + } + } } - - */ // nothing found, just write out the word codifyLines(clName); @@ -738,10 +751,11 @@ static bool findMemberLink(CodeOutputInterface &ol,Definition *sym,const char *s addDocCrossReference(g_currentMemberDef,(MemberDef*)sym); } } + //fprintf(stderr,"cd=%s thisCd=%s\n",cd?cd->name().data():"<none>",thisCd?thisCd->name().data():"<none>"); // TODO: find the nearest base class in case cd is a base class of // thisCd - if (cd==thisCd) + if (cd==thisCd || (thisCd && thisCd->isBaseClass(cd,TRUE))) { writeMultiLineCodeLink(ol,sym->getReference(), sym->getOutputFileBase(), @@ -994,7 +1008,7 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT codify(yytext); } - {IDENTIFIER} { + ({IDENTIFIER}".")*{IDENTIFIER} { // The parser // is assuming // that ALL identifiers @@ -1114,10 +1128,11 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT ({IDENTIFIER}".")*{IDENTIFIER}/"(" { generateClassOrGlobalLink(*g_code,yytext); } - {IDENTIFIER} { - codify(yytext); - //generateClassOrGlobalLink(*g_code,yytext); + ({IDENTIFIER}".")+{IDENTIFIER} { + generateClassOrGlobalLink(*g_code,yytext,TRUE); } + {IDENTIFIER} { codify(yytext); } + } @@ -1127,6 +1142,12 @@ TARGET ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUT {BB} { codify(yytext); } + "pass" { + startFontClass("keyword"); + codifyLines(yytext); + endFontClass(); + BEGIN(Body); + } {KEYWORD} { startFontClass("keyword"); codifyLines(yytext); diff --git a/src/pyscanner.l b/src/pyscanner.l index 3d6e158..1c29c57 100644 --- a/src/pyscanner.l +++ b/src/pyscanner.l @@ -103,7 +103,7 @@ static int g_atomCount; static QCString g_moduleScope; static QCString g_packageName; -static bool g_hideClassDocs; +//static bool g_hideClassDocs; static QCString g_defVal; static int g_braceCount; @@ -225,8 +225,17 @@ static QCString findPackageScope(const char *fileName) static void lineCount() { - for( const char* c = yytext ; *c ; ++c ) - yyLineNr += (*c == '\n') ; + //fprintf(stderr,"yyLineNr=%d\n",yyLineNr); + for (const char *p = yytext; *p; ++p) + { + yyLineNr += (*p == '\n') ; + } +} + +static void incLineNr() +{ + //fprintf(stderr,"yyLineNr=%d\n",yyLineNr); + yyLineNr++; } #if 0 @@ -407,6 +416,7 @@ static void searchFoundClass() current->argList->clear(); current->type += "class" ; current->fileName = yyFileName; + current->startLine = yyLineNr; current->bodyLine = yyLineNr; g_packageCommentAllowed = FALSE; } @@ -526,6 +536,7 @@ STARTDOCSYMS "##" <Search>{ ^{B}"def"{BB} { // start of a function/method definition with indent + //fprintf(stderr,"Found def at %d\n",yyLineNr); g_indent=computeIndent(yytext); searchFoundDef(); BEGIN( FunctionDec ); @@ -536,6 +547,7 @@ STARTDOCSYMS "##" } ^{B}"class"{BB} { // start of a class definition with indent + //fprintf(stderr,"Found class at %d\n",yyLineNr); g_indent=computeIndent(yytext); searchFoundClass(); BEGIN( ClassDec ) ; @@ -635,7 +647,7 @@ STARTDOCSYMS "##" BEGIN(FromModItem); } \n { - yyLineNr++; + incLineNr(); BEGIN(Search); } {B} { @@ -658,6 +670,16 @@ STARTDOCSYMS "##" initEntry(); BEGIN(Search); } + {IDENTIFIER}/{B}","{B} { + QCString item=g_packageName+"."+yytext; + current->name=removeRedundantWhiteSpace(substitute(item,".","::")); + current->fileName = yyFileName; + //printf("Adding using declaration: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data()); + current->section=Entry::USINGDECL_SEC; + current_root->addSubEntry(current); + current = new Entry ; + initEntry(); + } {IDENTIFIER} { QCString item=g_packageName+"."+yytext; current->name=removeRedundantWhiteSpace(substitute(item,".","::")); @@ -670,11 +692,13 @@ STARTDOCSYMS "##" BEGIN(Search); } \n { - yyLineNr++; + incLineNr(); BEGIN(Search); } {B} { } + "," { + } . { unput(*yytext); BEGIN(Search); @@ -693,7 +717,7 @@ STARTDOCSYMS "##" BEGIN(Search); } \n { - yyLineNr++; + incLineNr(); BEGIN(Search); } {B} { @@ -706,7 +730,7 @@ STARTDOCSYMS "##" <SearchMemVars>{ "self."{IDENTIFIER}/{B}"=" { - //printf("Found member variable %s in %s\n",&yytext[5],current_root->name.data()); + //fprintf(stderr,"Found member variable %s in %s at %d\n",&yytext[5],current_root->name.data(),yyLineNr); current->name=&yytext[5]; current->section=Entry::VARIABLE_SEC; current->fileName = yyFileName; @@ -749,9 +773,9 @@ STARTDOCSYMS "##" g_copyString=0; BEGIN( DoubleQuoteString ); } - \n { yyLineNr++; } + \n { incLineNr(); } {IDENTIFIER} // identifiers - [^'"\.#a-z_A-Z]+ // other uninteresting stuff + [^'"\.#a-z_A-Z\n]+ // other uninteresting stuff . // anything else } @@ -771,7 +795,7 @@ STARTDOCSYMS "##" } else { - yyLineNr++; + incLineNr(); current->program+=yytext; } } @@ -789,7 +813,7 @@ STARTDOCSYMS "##" } else { - yyLineNr++; + incLineNr(); current->program+=yytext; } } @@ -834,7 +858,8 @@ STARTDOCSYMS "##" "#".* { // comment half way current->program+=yytext; } - {NEWLINE} { yyLineNr++; + {NEWLINE} { + incLineNr(); current->program+=yytext; } . { // any character @@ -876,6 +901,7 @@ STARTDOCSYMS "##" {B}":" { // function without arguments g_specialBlock = TRUE; // expecting a docstring bodyEntry = current; + current->bodyLine = yyLineNr; BEGIN( FunctionBody ); } @@ -910,6 +936,7 @@ STARTDOCSYMS "##" ":"{B} { g_specialBlock = TRUE; // expecting a docstring bodyEntry = current; + current->bodyLine = yyLineNr; BEGIN( FunctionBody ); } {POUNDCOMMENT} { // a comment @@ -945,23 +972,23 @@ STARTDOCSYMS "##" } \n { g_defVal+=*yytext; - yyLineNr++; + incLineNr(); } } <ClassBody>{ \n/{IDENTIFIER}{BB} { // new def at indent 0 - yyLineNr++; + incLineNr(); endOfDef(); - g_hideClassDocs = FALSE; + //g_hideClassDocs = FALSE; //YY_CURRENT_BUFFER->yy_at_bol=TRUE; BEGIN(Search); } \n/"##"[^#] { // start of a special comment at indent 0 - yyLineNr++; + incLineNr(); endOfDef(); - g_hideClassDocs = FALSE; + //g_hideClassDocs = FALSE; //YY_CURRENT_BUFFER->yy_at_bol=TRUE; BEGIN(Search); } @@ -982,7 +1009,7 @@ STARTDOCSYMS "##" g_indent=g_curIndent; // make sure the next rule matches ^... //YY_CURRENT_BUFFER->yy_at_bol=TRUE; - g_hideClassDocs = FALSE; + //g_hideClassDocs = FALSE; BEGIN(Search); } else @@ -1007,11 +1034,11 @@ STARTDOCSYMS "##" [^ \t\n#'"]+ { // non-special stuff current->program+=yytext; g_specialBlock = FALSE; - g_hideClassDocs = FALSE; + //g_hideClassDocs = FALSE; } {NEWLINE} { current->program+=*yytext; - yyLineNr++; + incLineNr(); } {POUNDCOMMENT} { // normal comment current->program+=yytext; @@ -1021,13 +1048,15 @@ STARTDOCSYMS "##" current->program+=*yytext; } {TRIDOUBLEQUOTE} { // start of a comment block - if (!g_hideClassDocs) current->program+=yytext; + //if (!g_hideClassDocs) + current->program+=yytext; initTriDoubleQuoteBlock(); BEGIN(TripleComment); } {TRISINGLEQUOTE} { // start of a comment block - if (!g_hideClassDocs) current->program+=yytext; + //if (!g_hideClassDocs) + current->program+=yytext; initTriSingleQuoteBlock(); BEGIN(TripleComment); } @@ -1065,6 +1094,8 @@ STARTDOCSYMS "##" ":" { // begin of the class definition g_specialBlock = TRUE; // expecting a docstring + current->bodyLine = yyLineNr; + current->program.resize(0); BEGIN(ClassCaptureIndent); } @@ -1081,26 +1112,29 @@ STARTDOCSYMS "##" "\n"|({BB}"\n") { // Blankline - ignore, keep looking for indentation. lineCount(); + current->program+=yytext; } {TRIDOUBLEQUOTE} { // start of a comment block initTriDoubleQuoteBlock(); + current->program+=yytext; BEGIN(TripleComment); } {TRISINGLEQUOTE} { // start of a comment block initTriSingleQuoteBlock(); + current->program+=yytext; BEGIN(TripleComment); } ^{BB} { - current->program=yytext; - current->startLine = yyLineNr; + current->program+=yytext; + //current->startLine = yyLineNr; g_curIndent=computeIndent(yytext); bodyEntry = current; //fprintf(stderr,"setting indent %d\n",g_curIndent); //printf("current->program=[%s]\n",current->program.data()); - g_hideClassDocs = TRUE; + //g_hideClassDocs = TRUE; BEGIN(ClassBody); } @@ -1109,6 +1143,7 @@ STARTDOCSYMS "##" // Just pushback an empty class, and // resume parsing the body. newEntry(); + current->program+=yytext; // printf("Failed to find indent - skipping!"); BEGIN( Search ); @@ -1238,14 +1273,14 @@ STARTDOCSYMS "##" } \n { current->initializer+=*yytext; - yyLineNr++; + incLineNr(); } } <VariableEnd>{ \n { - yyLineNr++; + incLineNr(); newVariable(); BEGIN(Search); } @@ -1287,15 +1322,17 @@ STARTDOCSYMS "##" actualDoc.prepend("\\namespace "+g_moduleScope+"\\_linebr "); handleCommentBlock(actualDoc, FALSE); } - if ((docBlockContext==ClassBody && !g_hideClassDocs) || + if ((docBlockContext==ClassBody /*&& !g_hideClassDocs*/) || docBlockContext==FunctionBody) { current->program+=docBlock; current->program+=yytext; } - if (g_hideClassDocs) - current->startLine = yyLineNr; - g_hideClassDocs=FALSE; + //if (g_hideClassDocs) + //{ + // current->startLine = yyLineNr; + //} + //g_hideClassDocs=FALSE; BEGIN(docBlockContext); } else @@ -1324,7 +1361,7 @@ STARTDOCSYMS "##" docBlock += yytext; } \n { - yyLineNr++; + incLineNr(); docBlock += yytext; } . { @@ -1339,14 +1376,14 @@ STARTDOCSYMS "##" docBlock+='\n'; docBrief = FALSE; startCommentBlock(FALSE); - yyLineNr++; + incLineNr(); } [^#\n]+ { // any other stuff docBlock+=yytext; } \n { // new line that ends the comment handleCommentBlock(docBlock, docBrief); - yyLineNr++; + incLineNr(); BEGIN(docBlockContext); } . { // anything we missed @@ -1357,7 +1394,7 @@ STARTDOCSYMS "##" <SingleQuoteString>{ \\{B}\n { // line continuation addToString(yytext); - yyLineNr++; + incLineNr(); } \\. { // espaced char addToString(yytext); @@ -1380,7 +1417,7 @@ STARTDOCSYMS "##" <DoubleQuoteString>{ \\{B}\n { // line continuation addToString(yytext); - yyLineNr++; + incLineNr(); } \\. { // espaced char addToString(yytext); @@ -1416,7 +1453,7 @@ STARTDOCSYMS "##" *g_copyString += yytext; } \n { - yyLineNr++; + incLineNr(); *g_copyString += yytext; } . { @@ -1480,9 +1517,10 @@ static void parseCompounds(Entry *rt) BEGIN( SearchMemVars ); } yyFileName = ce->fileName; - yyLineNr = ce->startLine ; + yyLineNr = ce->bodyLine ; if (current) delete current; current = new Entry; + initEntry(); groupEnterCompound(yyFileName,yyLineNr,ce->name); @@ -1537,6 +1575,7 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt) } current = new Entry; + initEntry(); current->name = g_moduleScope; current->section = Entry::NAMESPACE_SEC; current->type = "namespace"; @@ -1553,6 +1592,7 @@ static void parseMain(const char *fileName,const char *fileBuf,Entry *rt) groupEnterFile(yyFileName,yyLineNr); current->reset(); + initEntry(); pyscanYYrestart( pyscanYYin ); BEGIN( Search ); pyscanYYlex(); diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index 578cda5..7f37f92 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -1571,7 +1571,7 @@ void RTFGenerator::endDescItem() newParagraph(); } -void RTFGenerator::startMemberDescription() +void RTFGenerator::startMemberDescription(const char *) { DBG_RTF(t << "{\\comment (startMemberDescription)}" << endl) t << "{" << endl; @@ -1837,7 +1837,7 @@ void RTFGenerator::endClassDiagram(const ClassDiagram &d, // t << text; //} -void RTFGenerator::startMemberItem(int) +void RTFGenerator::startMemberItem(const char *,int) { DBG_RTF(t <<"{\\comment startMemberItem }" << endl) t << rtf_Style_Reset << rtf_BList_DepthStyle() << endl; // set style to apropriate depth diff --git a/src/rtfgen.h b/src/rtfgen.h index 33798d5..1970f12 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -111,10 +111,10 @@ class RTFGenerator : public OutputGenerator void endInlineHeader(); void startAnonTypeScope(int) {} void endAnonTypeScope(int) {} - void startMemberItem(int); + void startMemberItem(const char *,int); void endMemberItem(); void startMemberTemplateParams() {} - void endMemberTemplateParams() {} + void endMemberTemplateParams(const char *) {} void insertMemberAlign(bool) {} void writeRuler() { rtfwriteRuler_thin(); } @@ -154,7 +154,7 @@ class RTFGenerator : public OutputGenerator void startSmall() { t << "{\\sub "; } void endSmall() { t << "}"; } - void startMemberDescription(); + void startMemberDescription(const char *); void endMemberDescription(); void startDescList(SectionTypes); void startSimpleSect(SectionTypes,const char *,const char *,const char *); @@ -178,7 +178,7 @@ class RTFGenerator : public OutputGenerator void endQuickIndices() {} void writeSplitBar(const char *) {} void writeLogo() {} - void writeQuickLinks(bool,HighlightedItem) {} + void writeQuickLinks(bool,HighlightedItem,const char *) {} void startContents() {} void endContents() {} void writeNonBreakableSpace(int); diff --git a/src/searchindex.cpp b/src/searchindex.cpp index bc560c6..ad9f8ba 100644 --- a/src/searchindex.cpp +++ b/src/searchindex.cpp @@ -374,10 +374,13 @@ static void addMemberToSearchIndex( ClassDef *cd=0; NamespaceDef *nd=0; FileDef *fd=0; + GroupDef *gd=0; if (isLinkable && - (cd=md->getClassDef()) && - cd->isLinkable() && - cd->templateMaster()==0) + ( + ((cd=md->getClassDef()) && cd->isLinkable() && cd->templateMaster()==0) || + ((gd=md->getGroupDef()) && gd->isLinkable()) + ) + ) { QCString n = md->name(); uchar charCode = (uchar)n.at(0); diff --git a/src/tclscanner.l b/src/tclscanner.l index a70f018..08b330e 100644 --- a/src/tclscanner.l +++ b/src/tclscanner.l @@ -1656,7 +1656,7 @@ D int myCmd=0; for (unsigned int i=0;i<myName.length();i++) { - char c = myName[i]; + char c = myName.at(i); if (myCmd) { if (c==' '||c=='\t'||c=='\n'||c==']') @@ -2250,7 +2250,7 @@ tcl_inf("TCL_SUBST: use '%s'\n",s); if (tcl.input_string.at(tcl.input_string.length()-1) == '\n') { - tcl.input_string[tcl.input_string.length()-1] = 0x1A; + tcl.input_string.at(tcl.input_string.length()-1) = 0x1A; } else { diff --git a/src/util.cpp b/src/util.cpp index 66f29ab..1f54503 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -3651,6 +3651,7 @@ static void findMembersWithSpecificName(MemberName *mn, bool checkStatics, FileDef *currentFile, bool checkCV, + const char *forceTagFile, QList<MemberDef> &members) { //printf(" Function with global scope name `%s' args=`%s'\n", @@ -3661,16 +3662,15 @@ static void findMembersWithSpecificName(MemberName *mn, { FileDef *fd=md->getFileDef(); GroupDef *gd=md->getGroupDef(); - //printf(" md->name()=`%s' md->args=`%s' fd=%p gd=%p current=%p\n", - // md->name().data(),args,fd,gd,currentFile); + //printf(" md->name()=`%s' md->args=`%s' fd=%p gd=%p current=%p ref=%s\n", + // md->name().data(),args,fd,gd,currentFile,md->getReference().data()); if ( ((gd && gd->isLinkable()) || (fd && fd->isLinkable()) || md->isReference()) && md->getNamespaceDef()==0 && md->isLinkable() && (!checkStatics || (!md->isStatic() && !md->isDefine()) || currentFile==0 || fd==currentFile) // statics must appear in the same file - ) + ) { - //printf(" fd=%p gd=%p args=`%s'\n",fd,gd,args); bool match=TRUE; ArgumentList *argList=0; if (args && !md->isDefine() && strcmp(args,"()")!=0) @@ -3684,7 +3684,7 @@ static void findMembersWithSpecificName(MemberName *mn, checkCV); delete argList; argList=0; } - if (match) + if (match && (forceTagFile==0 || md->getReference()==forceTagFile)) { //printf("Found match!\n"); members.append(md); @@ -3721,7 +3721,8 @@ bool getDefs(const QCString &scName,const QCString &memberName, ClassDef *&cd, FileDef *&fd, NamespaceDef *&nd, GroupDef *&gd, bool forceEmptyScope, FileDef *currentFile, - bool checkCV + bool checkCV, + const char *forceTagFile ) { fd=0, md=0, cd=0, nd=0, gd=0; @@ -4030,12 +4031,13 @@ bool getDefs(const QCString &scName,const QCString &memberName, { QList<MemberDef> members; // search for matches with strict static checking - findMembersWithSpecificName(mn,args,TRUE,currentFile,checkCV,members); + findMembersWithSpecificName(mn,args,TRUE,currentFile,checkCV,forceTagFile,members); if (members.count()==0) // nothing found { // search again without strict static checking - findMembersWithSpecificName(mn,args,FALSE,currentFile,checkCV,members); + findMembersWithSpecificName(mn,args,FALSE,currentFile,checkCV,forceTagFile,members); } + //printf("found %d members\n",members.count()); if (members.count()!=1 && args && !strcmp(args,"()")) { // no exact match found, but if args="()" an arbitrary @@ -4645,7 +4647,12 @@ FileDef *findFileDef(const FileNameDict *fnDict,const char *n,bool &ambig) if (fn->count()==1) { FileDef *fd = fn->getFirst(); - if (path.isEmpty() || fd->getPath().right(path.length())==path) +#if defined(_WIN32) || defined(__MACOSX__) // Windows or MacOSX + bool isSamePath = fd->getPath().right(path.length()).lower()==path.lower(); +#else // Unix + bool isSamePath = fd->getPath().right(path.length())==path; +#endif + if (path.isEmpty() || isSamePath) { cachedResult->fileDef = fd; g_findFileDefCache.insert(key,cachedResult); @@ -5760,7 +5767,7 @@ QCString stripTemplateSpecifiersFromScope(const QCString &fullName, if (getClass(result+fullName.mid(i,e-i))!=0) { result+=fullName.mid(i,e-i); - //printf(" 2:result+=%s cd=%s\n",fullName.mid(i,e-i-1).data(),cd->name().data()); + //printf(" 2:result+=%s\n",fullName.mid(i,e-i-1).data()); } else if (pLastScopeStripped) { @@ -6068,7 +6075,7 @@ void filterLatexString(FTextStream &t,const char *str, default: //if (!insideTabbing && forceBreaks && c!=' ' && *p!=' ') if (!insideTabbing && - ((c>='A' && c<='Z' && pc!=' ') || (c==':' && pc!=':') || (pc=='.' && isId(c))) + ((c>='A' && c<='Z' && pc!=' ' && pc!='\0') || (c==':' && pc!=':') || (pc=='.' && isId(c))) ) { t << "\\-"; @@ -7217,3 +7224,18 @@ QCString getLanguageSpecificSeparator(SrcLangExt lang) } } +/** Corrects URL \a url according to the relative path \a relPath. + * Returns the corrected URL. For absolute URLs no correction will be done. + */ +QCString correctURL(const QCString &url,const QCString &relPath) +{ + QCString result = url; + if (!relPath.isEmpty() && + url.left(5)!="http:" && url.left(6)!="https:" && + url.left(4)!="ftp:" && url.left(5)!="file:") + { + result.prepend(relPath); + } + return result; +} + @@ -137,7 +137,8 @@ bool getDefs(const QCString &scopeName, GroupDef *&gd, bool forceEmptyScope=FALSE, FileDef *currentFile=0, - bool checkCV=FALSE + bool checkCV=FALSE, + const char *forceTagFile=0 ); QCString getFileFilter(const char* name,bool isSourceCode); @@ -412,5 +413,7 @@ QCString replaceColorMarkers(const char *str); bool copyFile(const QCString &src,const QCString &dest); QCString extractBlock(const QCString text,const QCString marker); +QCString correctURL(const QCString &url,const QCString &relPath); + #endif diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index 7de52c1..06a5c8c 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -1540,7 +1540,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, // start a new member declaration bool isAnonymous = annoClassDef; // || m_impl->annMemb || m_impl->annEnumType; ///printf("startMemberItem for %s\n",name().data()); - ol.startMemberItem( isAnonymous ); //? 1 : m_impl->tArgList ? 3 : 0); + ol.startMemberItem( mdef->anchor(), isAnonymous ); //? 1 : m_impl->tArgList ? 3 : 0); // If there is no detailed description we need to write the anchor here. bool detailsVisible = mdef->isDetailedSectionLinkable(); @@ -1772,7 +1772,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, ol.endMemberItem(); if (!mdef->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC") /* && !annMemb */) { - ol.startMemberDescription(); + ol.startMemberDescription(mdef->anchor()); ol.parseDoc(mdef->briefFile(),mdef->briefLine(), mdef->getOuterScope()?mdef->getOuterScope():d, mdef,mdef->briefDescription(),TRUE,FALSE,0,TRUE,FALSE); @@ -2159,34 +2159,26 @@ void VhdlDocGen::writeCodeFragment( MemberDef *mdef,OutputList& ol) void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname) { - // Definition d=(Definition)mdef; - QCString fdd=mdef->getDefFileExtension(); - QCString scope=mdef->getScopeString(); QCString codeFragment=mdef->documentation(); - FileDef *fd=mdef->getFileDef(); int start=mdef->getStartBodyLine(); - int end=mdef->getEndBodyLine(); QStringList qsl=QStringList::split("\n",codeFragment); - - ParserInterface *pIntf = Doxygen::parserManager->getParser(fdd.data()); - pIntf->resetCodeParserState(); - - ol.startParagraph(); ol.startCodeFragment(); - pIntf->parseCode(ol, // codeOutIntf - scope, // scope - codeFragment, // input - FALSE, // isExample - 0, // exampleName - fd, // fileDef - start, // startLine - end, // endLine - TRUE, // inlineFragment - mdef, // memberDef - FALSE // show line numbers - ); + int len = qsl.count(); + QCString lineNumber; + int j; + for (j=0;j<len;j++) + { + lineNumber.sprintf("%05d",start++); + lineNumber+=" "; + ol.startBold(); + ol.docify(lineNumber.data()); + ol.endBold(); + ol.insertMemberAlign(); + QCString q=(QCString)qsl[j]; + VhdlDocGen::writeFormatString(q,ol,mdef); + ol.docify("\n"); + } ol.endCodeFragment(); - ol.endParagraph(); mdef->writeSourceDef(ol,cname); mdef->writeSourceRefs(ol,cname); @@ -2219,8 +2211,8 @@ void VhdlDocGen::parseUCF(const char* input, Entry* entity,QCString fileName,b { QCString ucFile(input); int lineNo=0; - QCString newLine="\n"; - QCString comment("##"); + QCString newLine="\n"; + QCString comment("#!"); QCString brief; while(!ucFile.isEmpty()) @@ -2230,14 +2222,16 @@ void VhdlDocGen::parseUCF(const char* input, Entry* entity,QCString fileName,b lineNo++; QCString temp=ucFile.left(i); temp=temp.stripWhiteSpace(); + bool bb=temp.stripPrefix("//"); + if (!temp.isEmpty()) { - if (temp.stripPrefix("##") || temp.stripPrefix("//") ) + if (temp.stripPrefix(comment) ) { brief+=temp; brief.append("\\n"); } - else if (!temp.stripPrefix("#")) + else if (!temp.stripPrefix("#") && !bb) { if (altera) { @@ -2372,7 +2366,7 @@ bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne) LayoutNavEntry *kk = lne->parent();// find(LayoutNavEntry::Files); // LayoutNavEntry *kks = kk->parent();// find(LayoutNavEntry::Files); QCString file; - QCString co("Constraints"); + QCString co("Constraint File"); while (fn) { FileDef *fd=fn->first(); @@ -2381,7 +2375,7 @@ bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne) file = convertNameToFile(fd->name().data(),FALSE,FALSE); LayoutNavEntry *ucf=new LayoutNavEntry(lne,LayoutNavEntry::MainPage,TRUE,file,co,""); kk->addChild(ucf); - // break; + break; } fn=Doxygen::inputNameList->next(); } @@ -2600,18 +2594,11 @@ void assignConfiguration(ConfNode* rootNode,QCString label) */ void VhdlDocGen::computeVhdlComponentRelations() { - ClassSDict::Iterator cli(*Doxygen::classSDict); - ClassDef *cl; - for ( cli.toFirst() ; (cl=cli.current()) ; ++cli) - { - // @MARTIN: THE FOLLOWING IS DONE FOR ALL LANGUAGES, WHICH IS WRONG!!! - cl->setLanguage(SrcLangExt_VHDL); - } - + QCString entity,inst,arch,vhd; QList<ConfNode> confList = getVhdlConfiguration(); - for(uint iter=0;iter<confList.count(); iter++) + for (uint iter=0;iter<confList.count(); iter++) { ConfNode* conf= (ConfNode *)confList.at(iter); assignConfiguration(conf,""); @@ -2635,11 +2622,10 @@ void VhdlDocGen::computeVhdlComponentRelations() { entity=cur->type; } - ClassDef *classEntity=Doxygen::classSDict->find(entity.data()); + ClassDef *classEntity=Doxygen::classSDict->find(entity); inst=VhdlDocGen::getIndexWord(cur->args.data(),0); - ClassDef *cd=Doxygen::classSDict->find(inst.data()); - ClassDef *ar=Doxygen::classSDict->find(cur->args.data()); - + ClassDef *cd=Doxygen::classSDict->find(inst); + ClassDef *ar=Doxygen::classSDict->find(cur->args); if (cd==0 || classEntity==0 ) continue; @@ -2728,5 +2714,27 @@ void VhdlDocGen::writeRecUnitDocu( first=FALSE; } -}// +}//# + +void VhdlDocGen::writeCodeFragment(OutputList& ol,int start, QCString & codeFragment,const MemberDef* mdef) +{ + QStringList qsl=QStringList::split("\n",codeFragment); + ol.startCodeFragment(); + int len = qsl.count(); + QCString lineNumber; + int j; + for (j=0;j<len;j++) + { + lineNumber.sprintf("%05d",start++); + lineNumber+=" "; + ol.startBold(); + ol.docify(lineNumber.data()); + ol.endBold(); + ol.insertMemberAlign(); + QCString q=(QCString)qsl[j]; + VhdlDocGen::writeFormatString(q,ol,mdef); + ol.docify("\n"); + } + ol.endCodeFragment(); +} diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h index 2be5995..02f1353 100644 --- a/src/vhdldocgen.h +++ b/src/vhdldocgen.h @@ -279,6 +279,8 @@ static bool isMisc(const MemberDef *mdef) static ClassDef* findArchitecture(QCString identifier, QCString entity_name); static void writeCodeFragment( MemberDef *mdef,OutputList& ol); + static void writeCodeFragment (OutputList& ol,int start, QCString & codeFragment,const MemberDef* mdef); + static void writeSource(MemberDef *mdef,OutputList& ol,QCString & cname); static void writeAlphbeticalClass(OutputList& ol,const ClassDef* cd,const QCString &); diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l index a2f2bd0..3212b75 100644 --- a/src/vhdlscanner.l +++ b/src/vhdlscanner.l @@ -28,7 +28,7 @@ * * This file is intended not to be used for commercial purposes * without permission of the University of Dortmund - * + * * NOTE THAT THERE IS NO WARRANTY FOR CORRECTNES, COMPLETENESS, SUPPORT * OR ANYTHING ELSE. *******************************************************/ @@ -285,6 +285,25 @@ static void lineCount() } +static void startCodeBlock(int index){ + int ll=strComment.length(); + iCodeLen=inputVhdlString.findRev(strComment.data(),num_chars)+ll; + fprintf(stderr,"\n startin code..%d %d %d\n",iCodeLen,num_chars,ll); + //assert(false); + gBlock.reset(); + int len=strComment.length(); + QCString name=strComment.right(len-index);// + name=VhdlDocGen::getIndexWord(name.data(),1); + if (!name) + gBlock.name="misc"+ VhdlDocGen::getRecordNumber(); + else + gBlock.name=name; + strComment=strComment.left(index); + gBlock.startLine=yyLineNr+1; + gBlock.bodyLine=yyLineNr+1; + VhdlDocGen::prepareComment(strComment); + gBlock.brief+=strComment; +} static void makeInlineDoc(int endCode) { int len=endCode-iCodeLen; @@ -309,7 +328,7 @@ static void makeInlineDoc(int endCode) temp->type="misc"; // global code like library ieee... current_root->addSubEntry(temp); } - + strComment.resize(0); gBlock.reset(); @@ -531,7 +550,11 @@ BR [ \t\n\r] <Comment>^{B}*"--!"[^\n]* { if (iDocLine==-1) iDocLine=yyLineNr; strComment+=vhdlScanYYtext; - + int index=strComment.find("\\code"); + if (index>0) + { + startCodeBlock(index); + } lineCount(); } @@ -541,22 +564,7 @@ BR [ \t\n\r] int index =strComment.find("\\code"); if (index>0) { - int ll=strComment.length(); - iCodeLen=inputVhdlString.findRev(strComment.data(),num_chars)+ll; - - gBlock.reset(); - int len=strComment.length(); - QCString name=strComment.right(len-index);// - name=VhdlDocGen::getIndexWord(name.data(),1); - if (!name) - gBlock.name="misc"+ VhdlDocGen::getRecordNumber(); - else - gBlock.name=name; - strComment=strComment.left(index); - gBlock.startLine=yyLineNr+1; - gBlock.bodyLine=yyLineNr+1; - VhdlDocGen::prepareComment(strComment); - gBlock.brief+=strComment; + startCodeBlock(index); } VhdlDocGen::prepareComment(strComment); @@ -575,11 +583,19 @@ BR [ \t\n\r] bool isEndCode=qcs.contains("\\endcode"); + int index = qcs.find("\\code"); if (isEndCode) { int end=inputVhdlString.find(qcs.data(),iCodeLen); makeInlineDoc(end); } + else if (index > 0 ) + { + // assert(false); + strComment=qcs; + startCodeBlock(index); + strComment.resize(0); + } //printf("--> handleCommentBlock line %d\n",yyLineNr); Entry* pTemp=getEntryAtLine(current_root,yyLineNr); |