Commit b37fae19 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.5.7.1-20081012

parent 2b7214ab
DOXYGEN Version 1.5.7.1 DOXYGEN Version 1.5.7.1-20081012
Please read the installation section of the manual Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions. (http://www.doxygen.org/install.html) for instructions.
-------- --------
Dimitri van Heesch (04 October 2008) Dimitri van Heesch (12 October 2008)
DOXYGEN Version 1.5.7.1 DOXYGEN Version 1.5.7.1_20081012
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (04 October 2008) Dimitri van Heesch (dimitri@stack.nl) (12 October 2008)
...@@ -20,7 +20,7 @@ doxygen_version_minor=5 ...@@ -20,7 +20,7 @@ doxygen_version_minor=5
doxygen_version_revision=7.1 doxygen_version_revision=7.1
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package. #NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=NO doxygen_version_mmn=20081012
bin_dirs=`echo $PATH | sed -e "s/:/ /g"` bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
......
...@@ -195,6 +195,9 @@ followed by the descriptions of the tags grouped by category. ...@@ -195,6 +195,9 @@ followed by the descriptions of the tags grouped by category.
\refitem cfg_project_number PROJECT_NUMBER \refitem cfg_project_number PROJECT_NUMBER
\refitem cfg_qhp_namespace QHP_NAMESPACE \refitem cfg_qhp_namespace QHP_NAMESPACE
\refitem cfg_qhp_virtual_folder QHP_VIRTUAL_FOLDER \refitem cfg_qhp_virtual_folder QHP_VIRTUAL_FOLDER
\refitem cfg_qhp_custom_filter_name QHP_CUSTOM_FILTER_NAME
\refitem cfg_qhp_cust_filter_attrs QHP_CUST_FILTER_ATTRS
\refitem cfg_qhp_sect_filter_attrs QHP_SECT_FILTER_ATTRS
\refitem cfg_qhg_location QHG_LOCATION \refitem cfg_qhg_location QHG_LOCATION
\refitem cfg_qt_autobrief QT_AUTOBRIEF \refitem cfg_qt_autobrief QT_AUTOBRIEF
\refitem cfg_quiet QUIET \refitem cfg_quiet QUIET
...@@ -1384,6 +1387,25 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn" ...@@ -1384,6 +1387,25 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
generating Qt Help Project output. For more information please see generating Qt Help Project output. For more information please see
<a href="http://doc.trolltech.com/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>. <a href="http://doc.trolltech.com/qthelpproject.html#virtual-folders">Qt Help Project / Virtual Folders</a>.
\anchor cfg_qhp_custom_filter_name
<dt>\c QHP_CUSTOM_FILTER_NAME <dd>
\addindex QHP_CUSTOM_FILTER_NAME
If QHP_CUSTOM_FILTER_NAME is set, it specifies the name of a custom filter to add. For more information please see
<a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
\anchor cfg_qhp_cust_filter_attrs
<dt>\c QHP_CUST_FILTER_ATTRS <dd>
\addindex QHP_CUST_FILTER_ATTRS
The QHP_CUST_FILTER_ATTRIBUTES tag specifies the list of the attributes of the custom filter to add.
For more information please see
<a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
\anchor cfg_qhp_sect_filter_attrs
<dt>\c QHP_SECT_FILTER_ATTRS <dd>
\addindex QHP_SECT_FILTER_ATTRS
The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's filter section matches.
<a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
\anchor cfg_qhg_location \anchor cfg_qhg_location
<dt>\c QHG_LOCATION <dd> <dt>\c QHG_LOCATION <dd>
\addindex QHG_LOCATION \addindex QHG_LOCATION
......
...@@ -80,11 +80,11 @@ ...@@ -80,11 +80,11 @@
Although doxygen can now be used in any project written in a language that is Although doxygen can now be used in any project written in a language that is
supported by doxygen, initially it was specifically designed to be used for projects supported by doxygen, initially it was specifically designed to be used for projects
that make use of Troll Tech's that make use of Qt Software's
<A HREF="http://www.trolltech.com/products/qt.html">Qt toolkit</A>. I have tried to <A HREF="http://www.trolltech.com/products/qt.html">Qt toolkit</A>. I have tried to
make doxygen `Qt-compatible'. That is: Doxygen can read the documentation contained in make doxygen `Qt-compatible'. That is: Doxygen can read the documentation contained in
the Qt source code and create a class browser that looks quite similar to the the Qt source code and create a class browser that looks quite similar to the
one that is generated by Troll Tech. Doxygen understands the C++ extensions one that is generated by Qt Software. Doxygen understands the C++ extensions
used by Qt such as signals and slots and many of the markup commands used in the Qt sources. used by Qt such as signals and slots and many of the markup commands used in the Qt sources.
Doxygen can also automatically generate links to existing documentation Doxygen can also automatically generate links to existing documentation
......
...@@ -175,7 +175,7 @@ Thanks go to: ...@@ -175,7 +175,7 @@ Thanks go to:
The first version of doxygen borrowed some code of an old version of DOC++. The first version of doxygen borrowed some code of an old version of DOC++.
Although I have rewritten practically all code since then, DOC++ has still Although I have rewritten practically all code since then, DOC++ has still
given me a good start in writing doxygen. given me a good start in writing doxygen.
<li>All people at Troll Tech, for creating a beautiful GUI Toolkit <li>All people at Qt Software, for creating a beautiful GUI Toolkit
(which is very useful as a Windows/Unix platform abstraction layer :-) (which is very useful as a Windows/Unix platform abstraction layer :-)
<li>Kevin McBride for maintaining the subversion reporsitory for doxygen. <li>Kevin McBride for maintaining the subversion reporsitory for doxygen.
<li>My brother Frank <li>My brother Frank
......
...@@ -55,7 +55,7 @@ To take full advantage of doxygen's features the following additional ...@@ -55,7 +55,7 @@ To take full advantage of doxygen's features the following additional
tools should be installed. tools should be installed.
<ul> <ul>
<li>Troll Tech's GUI toolkit <li>Qt Software's GUI toolkit
<A HREF="http://www.trolltech.com/products/qt.html">Qt</A> <A HREF="http://www.trolltech.com/products/qt.html">Qt</A>
\latexonly(see {\tt http://www.trolltech.com/products/qt.html})\endlatexonly \latexonly(see {\tt http://www.trolltech.com/products/qt.html})\endlatexonly
\addindex Qt \addindex Qt
...@@ -505,7 +505,7 @@ Here is what is required: ...@@ -505,7 +505,7 @@ Here is what is required:
For doxywizard, a complete Qt library is For doxywizard, a complete Qt library is
still a requirement however. A commercial license to build still a requirement however. A commercial license to build
doxywizard with the latest Qt library was kindly donated to me doxywizard with the latest Qt library was kindly donated to me
by the nice people at <a href="http://www.trolltech.com">TrollTech</a>. by the nice people at <a href="http://www.trolltech.com">Qt Software</a>.
See doxygen download page for a link. See doxygen download page for a link.
<li>If you used WinZip to extract the tar archive it will (apparently) not <li>If you used WinZip to extract the tar archive it will (apparently) not
...@@ -589,7 +589,7 @@ You can download it from ...@@ -589,7 +589,7 @@ You can download it from
If you want to produce Qt Compressed Help files (see \ref If you want to produce Qt Compressed Help files (see \ref
cfg_qhg_location "QHG_LOCATION") in the config file, then cfg_qhg_location "QHG_LOCATION") in the config file, then
you need qhelpgenerator which is part of Qt. you need qhelpgenerator which is part of Qt.
You can download Qt from <a href="http://trolltech.com/downloads/">Trolltech Downloads</a>. You can download Qt from <a href="http://trolltech.com/downloads/">Qt Software Downloads</a>.
In order to generate PDF output or use scientific formulas you will also need to In order to generate PDF output or use scientific formulas you will also need to
install <a href="http://en.wikipedia.org/wiki/LaTeX">LaTeX</a> and install <a href="http://en.wikipedia.org/wiki/LaTeX">LaTeX</a> and
...@@ -662,7 +662,7 @@ features: ...@@ -662,7 +662,7 @@ features:
cfg_qhelgenerator_loc "QHG_LOCATION") in the config file, cfg_qhelgenerator_loc "QHG_LOCATION") in the config file,
then you need qhelpgenerator which is part of Qt. then you need qhelpgenerator which is part of Qt.
You can download Qt from You can download Qt from
<a href="http://trolltech.com/downloads/">Trolltech Downloads</a>. <a href="http://trolltech.com/downloads/">Qt Software Downloads</a>.
<li><a href="http://www.graphviz.org/"> <li><a href="http://www.graphviz.org/">
the Graph visualization toolkit version 1.8.10</a><br> the Graph visualization toolkit version 1.8.10</a><br>
......
...@@ -103,7 +103,7 @@ Here is the above example with HTML commands: ...@@ -103,7 +103,7 @@ Here is the above example with HTML commands:
<b>Using \\arg or \@li</b> <b>Using \\arg or \@li</b>
For compatibility with the Troll Tech's internal documentation tool and For compatibility with the Qt Software's internal documentation tool qdoc and
with KDoc, doxygen has two commands that can be used to create simple with KDoc, doxygen has two commands that can be used to create simple
unnested lists. unnested lists.
......
...@@ -687,7 +687,7 @@ static MemberDef *setCallContextForVar(const QCString &name) ...@@ -687,7 +687,7 @@ static MemberDef *setCallContextForVar(const QCString &name)
QCString scope = name.left(scopeEnd); QCString scope = name.left(scopeEnd);
QCString locName = name.right(name.length()-scopeEnd-2); QCString locName = name.right(name.length()-scopeEnd-2);
//printf("explicit scope: name=%s scope=%s\n",locName.data(),scope.data()); //printf("explicit scope: name=%s scope=%s\n",locName.data(),scope.data());
ClassDef *mcd = getClass(scope); // TODO: check namespace as well ClassDef *mcd = getClass(scope);
if (mcd && !locName.isEmpty()) if (mcd && !locName.isEmpty())
{ {
MemberDef *md=mcd->getMemberByName(locName); MemberDef *md=mcd->getMemberByName(locName);
...@@ -698,6 +698,20 @@ static MemberDef *setCallContextForVar(const QCString &name) ...@@ -698,6 +698,20 @@ static MemberDef *setCallContextForVar(const QCString &name)
return md; return md;
} }
} }
else // check namespace as well
{
NamespaceDef *mnd = getResolvedNamespace(scope);
if (mnd && !locName.isEmpty())
{
MemberDef *md=mnd->getMemberByName(locName);
if (md)
{
//printf("name=%s scope=%s\n",locName.data(),scope.data());
g_theCallContext.setClass(stripClassName(md->typeString()));
return md;
}
}
}
} }
MemberName *mn; MemberName *mn;
......
...@@ -151,11 +151,11 @@ static DocCmdMap docCmdMap[] = ...@@ -151,11 +151,11 @@ static DocCmdMap docCmdMap[] =
{ "example", &handleExample, FALSE }, { "example", &handleExample, FALSE },
{ "details", &handleDetails, TRUE }, { "details", &handleDetails, TRUE },
{ "name", &handleName, FALSE }, { "name", &handleName, FALSE },
{ "todo", &handleTodo, TRUE }, { "todo", &handleTodo, FALSE }, // end brief will be done differently
{ "test", &handleTest, TRUE }, { "test", &handleTest, FALSE }, // end brief will be done differently
{ "bug", &handleBug, TRUE }, { "bug", &handleBug, FALSE }, // end brief will be done differently
{ "deprecated", &handleDeprecated, TRUE }, { "deprecated", &handleDeprecated, FALSE }, // end brief will be done differently
{ "xrefitem", &handleXRefItem, TRUE }, { "xrefitem", &handleXRefItem, FALSE }, // end brief will be done differently
{ "related", &handleRelated, TRUE }, { "related", &handleRelated, TRUE },
{ "relates", &handleRelated, TRUE }, { "relates", &handleRelated, TRUE },
{ "relatedalso", &handleRelatedAlso, TRUE }, { "relatedalso", &handleRelatedAlso, TRUE },
...@@ -624,6 +624,13 @@ static inline void setOutput(OutputContext ctx) ...@@ -624,6 +624,13 @@ static inline void setOutput(OutputContext ctx)
newXRefKind==xrefKind && // of the same kind newXRefKind==xrefKind && // of the same kind
(xrefKind!=XRef_Item || (xrefKind!=XRef_Item ||
newXRefItemKey==xrefItemKey); // with the same key if \xrefitem newXRefItemKey==xrefItemKey); // with the same key if \xrefitem
//printf("%d && %d && %d && (%d || %d)\n",
// inContext==OutputXRef,
// ctx==OutputXRef,
// newXRefKind==xrefKind,
// xrefKind!=XRef_Item,
// newXRefItemKey==xrefItemKey);
//printf("refKind=%d newXRefKind=%d xrefAppendToPrev=%d xrefAppendFlag=%d\n", //printf("refKind=%d newXRefKind=%d xrefAppendToPrev=%d xrefAppendFlag=%d\n",
// xrefKind,newXRefKind,xrefAppendToPrev,xrefAppendFlag); // xrefKind,newXRefKind,xrefAppendToPrev,xrefAppendFlag);
......
...@@ -1270,19 +1270,28 @@ void Config::check() ...@@ -1270,19 +1270,28 @@ void Config::check()
// check QHP creation requirements // check QHP creation requirements
if (Config_getBool("GENERATE_QHP")) if (Config_getBool("GENERATE_QHP"))
{ {
bool quit = false;
if (!Config_getBool("GENERATE_HTML")) if (!Config_getBool("GENERATE_HTML"))
{ {
config_err("Warning: GENERATE_QHP=YES requires GENERATE_HTML=YES.\n"); config_err("Warning: GENERATE_QHP=YES requires GENERATE_HTML=YES.\n");
quit = true;
} }
if (Config_getString("QHP_NAMESPACE").isEmpty()) if (Config_getString("QHP_NAMESPACE").isEmpty())
{ {
config_err("Warning: GENERATE_QHP=YES requires QHP_NAMESPACE to be set.\n"); config_err("Warning: GENERATE_QHP=YES requires QHP_NAMESPACE to be set.\n");
quit = true;
} }
if (Config_getString("QHP_VIRTUAL_FOLDER").isEmpty()) if (Config_getString("QHP_VIRTUAL_FOLDER").isEmpty())
{ {
config_err("Warning: GENERATE_QHP=YES requires QHP_VIRTUAL_FOLDER to be set.\n"); config_err("Warning: GENERATE_QHP=YES requires QHP_VIRTUAL_FOLDER to be set.\n");
quit = true;
}
if (quit)
{
exit(1);
} }
} }
...@@ -1751,6 +1760,16 @@ void Config::create() ...@@ -1751,6 +1760,16 @@ void Config::create()
"VHDL. \n", "VHDL. \n",
FALSE FALSE
); );
cl = addList( "EXTENSION_MAPPING",
"Doxygen selects the parser to use depending on the extension of the files it parses. \n"
"With this tag you can assign which parser to use for a given extension. \n"
"Doxygen has a built-in mapping, but you can override or extend it using this tag. \n"
"The format is ext=language, where ext is a file extension, and language is one of \n"
"the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, \n"
"Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat \n"
".inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), \n"
"use: inc=Fortran f=C\n"
);
cb = addBool( cb = addBool(
"BUILTIN_STL_SUPPORT", "BUILTIN_STL_SUPPORT",
"If you use STL classes (i.e. std::string, std::vector, etc.) but do not want \n" "If you use STL classes (i.e. std::string, std::vector, etc.) but do not want \n"
...@@ -1774,15 +1793,15 @@ void Config::create() ...@@ -1774,15 +1793,15 @@ void Config::create()
"instead of private inheritance when no explicit protection keyword is present. \n", "instead of private inheritance when no explicit protection keyword is present. \n",
FALSE FALSE
); );
cb = addBool( "IDL_PROPERTY_SUPPORT", cb = addBool( "IDL_PROPERTY_SUPPORT",
"For Microsoft's IDL there are propget and propput attributes to indicate getter \n" "For Microsoft's IDL there are propget and propput attributes to indicate getter \n"
"and setter methods for a property. Setting this option to YES (the default) \n" "and setter methods for a property. Setting this option to YES (the default) \n"
"will make doxygen to replace the get and set methods by a property in the \n" "will make doxygen to replace the get and set methods by a property in the \n"
"documentation. This will only work if the methods are indeed getting or \n" "documentation. This will only work if the methods are indeed getting or \n"
"setting a simple type. If this is not the case, or you want to show the \n" "setting a simple type. If this is not the case, or you want to show the \n"
"methods anyway, you should set this option to NO. \n", "methods anyway, you should set this option to NO. \n",
TRUE TRUE
); );
cb = addBool( cb = addBool(
"DISTRIBUTE_GROUP_DOC", "DISTRIBUTE_GROUP_DOC",
"If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC \n" "If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC \n"
...@@ -2565,18 +2584,42 @@ void Config::create() ...@@ -2565,18 +2584,42 @@ void Config::create()
"QHP_NAMESPACE", "QHP_NAMESPACE",
"The QHP_NAMESPACE tag specifies the namespace to use when generating \n" "The QHP_NAMESPACE tag specifies the namespace to use when generating \n"
"Qt Help Project output. For more information please see \n" "Qt Help Project output. For more information please see \n"
"<a href=\"http://doc.trolltech.com/qthelpproject.html#namespace\">Qt Help Project / Namespace</a>. \n" "http://doc.trolltech.com/qthelpproject.html#namespace \n"
); );
cs->setDefaultValue("org.doxygen.Project");
cs->addDependency("GENERATE_QHP"); cs->addDependency("GENERATE_QHP");
cs = addString( cs = addString(
"QHP_VIRTUAL_FOLDER", "QHP_VIRTUAL_FOLDER",
"The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating \n" "The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating \n"
"Qt Help Project output. For more information please see \n" "Qt Help Project output. For more information please see \n"
"<a href=\"http://doc.trolltech.com/qthelpproject.html#virtual-folders\">Qt Help Project / Virtual Folders</a>. \n" "http://doc.trolltech.com/qthelpproject.html#virtual-folders \n"
); );
cs->setDefaultValue("doc"); cs->setDefaultValue("doc");
cs->addDependency("GENERATE_QHP"); cs->addDependency("GENERATE_QHP");
cs = addString(
"QHP_CUSTOM_FILTER_NAME",
"If QHP_CUSTOM_FILTER_NAME is set, it specifies the name of a custom filter to add. \n"
"For more information please see \n"
"http://doc.trolltech.com/qthelpproject.html#custom-filters \n"
);
cs->addDependency("GENERATE_QHP");
cs = addString(
"QHP_CUST_FILTER_ATTRS",
"The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add."
"For more information please see \n"
"<a href=\"http://doc.trolltech.com/qthelpproject.html#custom-filters\">Qt Help Project / Custom Filters</a>. \n"
);
cs->addDependency("GENERATE_QHP");
cs = addString(
"QHP_SECT_FILTER_ATTRS",
"The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's \n"
"filter section matches. \n"
"<a href=\"http://doc.trolltech.com/qthelpproject.html#filter-attributes\">Qt Help Project / Filter Attributes</a>. \n"
);
cs->addDependency("GENERATE_QHP");
cs = addString( cs = addString(
"QHG_LOCATION", "QHG_LOCATION",
"If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can \n" "If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can \n"
......
...@@ -1238,8 +1238,11 @@ QCString Definition::briefDescriptionAsTooltip() const ...@@ -1238,8 +1238,11 @@ QCString Definition::briefDescriptionAsTooltip() const
static bool reentering=FALSE; static bool reentering=FALSE;
if (!reentering) if (!reentering)
{ {
MemberDef *md = definitionType()==TypeMember ? (MemberDef*)this : 0;
const Definition *scope = definitionType()==TypeMember ? getOuterScope() : this;
reentering=TRUE; // prevent requests for tooltips while parsing a tooltip reentering=TRUE; // prevent requests for tooltips while parsing a tooltip
m_impl->brief->tooltip = parseCommentAsText( m_impl->brief->tooltip = parseCommentAsText(
scope,md,
m_impl->brief->doc, m_impl->brief->doc,
m_impl->brief->file, m_impl->brief->file,
m_impl->brief->line); m_impl->brief->line);
......
...@@ -30,10 +30,9 @@ ...@@ -30,10 +30,9 @@
#include "config.h" #include "config.h"
#include "message.h" #include "message.h"
#include "util.h" #include "util.h"
//#include "latexgen.h"
//#include "htmlgen.h"
#include "doxygen.h" #include "doxygen.h"
#include "portable.h" #include "portable.h"
#include "index.h"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
...@@ -1291,6 +1290,7 @@ void ClassDiagram::writeImage(QTextStream &t,const char *path, ...@@ -1291,6 +1290,7 @@ void ClassDiagram::writeImage(QTextStream &t,const char *path,
super->drawConnectors(t,&image,FALSE,TRUE,baseRows,superRows,cellWidth,cellHeight); super->drawConnectors(t,&image,FALSE,TRUE,baseRows,superRows,cellWidth,cellHeight);
image.save((QCString)path+"/"+fileName+".png"); image.save((QCString)path+"/"+fileName+".png");
Doxygen::indexList.addImageFile(QCString(fileName)+".png");
if (generateMap) t << "</map>" << endl; if (generateMap) t << "</map>" << endl;
} }
......
...@@ -2122,6 +2122,7 @@ DocRef::DocRef(DocNode *parent,const QString &target,const QString &context) : ...@@ -2122,6 +2122,7 @@ DocRef::DocRef(DocNode *parent,const QString &target,const QString &context) :
{ {
Definition *compound = 0; Definition *compound = 0;
QCString anchor; QCString anchor;
//printf("DocRef::DocRef(target=%s,context=%s\n",target.data(),context.data());
ASSERT(!target.isEmpty()); ASSERT(!target.isEmpty());
m_relPath = g_relPath; m_relPath = g_relPath;
SectionInfo *sec = Doxygen::sectionDict[target]; SectionInfo *sec = Doxygen::sectionDict[target];
...@@ -6086,6 +6087,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine, ...@@ -6086,6 +6087,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
{ {
g_context = ""; g_context = "";
} }
//printf("g_context=%s\n",g_context.data());
if (indexWords && md && Config_getBool("SEARCHENGINE")) if (indexWords && md && Config_getBool("SEARCHENGINE"))
{ {
...@@ -6216,7 +6218,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine, ...@@ -6216,7 +6218,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
// restore original parser state // restore original parser state
docParserPopContext(); docParserPopContext();
//printf("end validatingParseDoc(%s,%s)\n",ctx?ctx->name().data():"<none>", //printf(">>>>>> end validatingParseDoc(%s,%s)\n",ctx?ctx->name().data():"<none>",
// md?md->name().data():"<none>"); // md?md->name().data():"<none>");
return root; return root;
......
...@@ -50,6 +50,8 @@ class DocSets : public IndexIntf ...@@ -50,6 +50,8 @@ class DocSets : public IndexIntf
const char *contRef, const char *memRef, const char *contRef, const char *memRef,
const char *anchor,const MemberDef *md); const char *anchor,const MemberDef *md);
void addIndexFile(const char *name); void addIndexFile(const char *name);
void addImageFile(const char *) {}
void addStyleSheetFile(const char *) {}
private: private:
void writeToken(QTextStream &t, const Definition *d, void writeToken(QTextStream &t, const Definition *d,
......
...@@ -1123,6 +1123,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path) const ...@@ -1123,6 +1123,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path) const
checkDotResult(imgName); checkDotResult(imgName);
if (Config_getBool("DOT_CLEANUP")) thisDir.remove(dotName); if (Config_getBool("DOT_CLEANUP")) thisDir.remove(dotName);
} }
Doxygen::indexList.addImageFile(imgName);
// write image and map in a table row // write image and map in a table row
QCString mapLabel = convertNameToFile(n->m_label); QCString mapLabel = convertNameToFile(n->m_label);
out << "<tr><td><img src=\"" << imgName << "\" border=\"0\" alt=\"\" usemap=\"#" out << "<tr><td><img src=\"" << imgName << "\" border=\"0\" alt=\"\" usemap=\"#"
...@@ -1908,6 +1909,7 @@ QCString DotClassGraph::writeGraph(QTextStream &out, ...@@ -1908,6 +1909,7 @@ QCString DotClassGraph::writeGraph(QTextStream &out,
} }
if (Config_getBool("DOT_CLEANUP")) thisDir.remove(baseName+".dot"); if (Config_getBool("DOT_CLEANUP")) thisDir.remove(baseName+".dot");
} }
Doxygen::indexList.addImageFile(baseName+"."+imgExt);
if (format==BITMAP && generateImageMap) // produce HTML to include the image if (format==BITMAP && generateImageMap) // produce HTML to include the image
{ {
...@@ -2238,6 +2240,7 @@ QCString DotInclDepGraph::writeGraph(QTextStream &out, ...@@ -2238,6 +2240,7 @@ QCString DotInclDepGraph::writeGraph(QTextStream &out,
} }
} }
} }
Doxygen::indexList.addImageFile(baseName+"."+imgExt);
if (format==BITMAP && generateImageMap) if (format==BITMAP && generateImageMap)
{ {
...@@ -2531,6 +2534,7 @@ QCString DotCallGraph::writeGraph(QTextStream &out, GraphOutputFormat format, ...@@ -2531,6 +2534,7 @@ QCString DotCallGraph::writeGraph(QTextStream &out, GraphOutputFormat format,
} }
} }
} }
Doxygen::indexList.addImageFile(baseName+"."+imgExt);
if (format==BITMAP && generateImageMap) if (format==BITMAP && generateImageMap)
{ {
...@@ -2672,6 +2676,7 @@ QCString DotDirDeps::writeGraph(QTextStream &out, ...@@ -2672,6 +2676,7 @@ QCString DotDirDeps::writeGraph(QTextStream &out,
} }
} }
} }
Doxygen::indexList.addImageFile(baseName+"."+imgExt);
if (format==BITMAP && generateImageMap) if (format==BITMAP && generateImageMap)
{ {
...@@ -2784,6 +2789,7 @@ void generateGraphLegend(const char *path) ...@@ -2784,6 +2789,7 @@ void generateGraphLegend(const char *path)
return; return;
} }
checkDotResult(imgName); checkDotResult(imgName);
Doxygen::indexList.addImageFile(imgName);
QDir::setCurrent(oldDir); QDir::setCurrent(oldDir);
} }
...@@ -2836,6 +2842,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir, ...@@ -2836,6 +2842,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir,
} }
if (format==BITMAP) checkDotResult(imgName); if (format==BITMAP) checkDotResult(imgName);
Doxygen::indexList.addImageFile(imgName);
if (env==".") if (env==".")
{ {
......
...@@ -10050,6 +10050,11 @@ void generateOutput() ...@@ -10050,6 +10050,11 @@ void generateOutput()
if (usingTreeIndex()) Doxygen::indexList.addIndex(new FTVHelp); if (usingTreeIndex()) Doxygen::indexList.addIndex(new FTVHelp);
if (Config_getBool("GENERATE_DOCSET")) Doxygen::indexList.addIndex(new DocSets); if (Config_getBool("GENERATE_DOCSET")) Doxygen::indexList.addIndex(new DocSets);
Doxygen::indexList.initialize(); Doxygen::indexList.initialize();
Doxygen::indexList.addImageFile("tab_r.gif");
Doxygen::indexList.addImageFile("tab_l.gif");
Doxygen::indexList.addImageFile("tab_b.gif");
Doxygen::indexList.addStyleSheetFile("tabs.css");
Doxygen::indexList.addImageFile("doxygen.png");
if (Config_getBool("HTML_DYNAMIC_SECTIONS")) HtmlGenerator::generateSectionImages(); if (Config_getBool("HTML_DYNAMIC_SECTIONS")) HtmlGenerator::generateSectionImages();
copyStyleSheet(); copyStyleSheet();
} }
......
...@@ -322,10 +322,6 @@ hr { ...@@ -322,10 +322,6 @@ hr {
-moz-border-radius-bottomright: 8px; -moz-border-radius-bottomright: 8px;
} }
.memdoc p, .memdoc dl, .memdoc ul {
margin: 6px 0;
}
.paramkey { .paramkey {
text-align: right; text-align: right;
} }
......
...@@ -322,10 +322,6 @@ ...@@ -322,10 +322,6 @@
" -moz-border-radius-bottomright: 8px;\n" " -moz-border-radius-bottomright: 8px;\n"
"}\n" "}\n"
"\n" "\n"
".memdoc p, .memdoc dl, .memdoc ul {\n"
" margin: 6px 0;\n"
"}\n"
"\n"
".paramkey {\n" ".paramkey {\n"
" text-align: right;\n" " text-align: right;\n"
"}\n" "}\n"
......
...@@ -86,6 +86,8 @@ class FTVHelp : public IndexIntf ...@@ -86,6 +86,8 @@ class FTVHelp : public IndexIntf
const char *, const char *, const char *, const char *,
const char *, const MemberDef *) {} const char *, const MemberDef *) {}
void addIndexFile(const char *) {} void addIndexFile(const char *) {}
void addImageFile(const char *) {}
void addStyleSheetFile(const char *) {}
void generateTreeView(QString* = NULL); void generateTreeView(QString* = NULL);
private: private:
void generateTreeViewImages(); void generateTreeViewImages();
......
...@@ -547,10 +547,7 @@ void HtmlGenerator::init() ...@@ -547,10 +547,7 @@ void HtmlGenerator::init()
} }
createSubDirs(d); createSubDirs(d);
//if (Config_getBool("HTML_FANCY_TABS")) writeTabData(dname);
{
writeTabData(dname);
}
} }
void HtmlGenerator::writeStyleSheetFile(QFile &file) void HtmlGenerator::writeStyleSheetFile(QFile &file)
...@@ -778,6 +775,7 @@ void HtmlGenerator::writeStyleInfo(int part) ...@@ -778,6 +775,7 @@ void HtmlGenerator::writeStyleInfo(int part)
t << defaultStyleSheet; t << defaultStyleSheet;
endPlainFile(); endPlainFile();
Doxygen::indexList.addStyleSheetFile("doxygen.css");
} }
else // write user defined style sheet else // write user defined style sheet
{ {
...@@ -796,6 +794,7 @@ void HtmlGenerator::writeStyleInfo(int part) ...@@ -796,6 +794,7 @@ void HtmlGenerator::writeStyleInfo(int part)
t << fileStr; t << fileStr;
endPlainFile(); endPlainFile();
} }
Doxygen::indexList.addStyleSheetFile(cssfi.fileName());
} }
} }
} }
...@@ -2345,6 +2344,7 @@ void HtmlGenerator::generateSectionImages() ...@@ -2345,6 +2344,7 @@ void HtmlGenerator::generateSectionImages()
{ {
f.writeBlock((char*)open_gif,open_gif_len); f.writeBlock((char*)open_gif,open_gif_len);
} }
Doxygen::indexList.addImageFile("open.gif");
} }
{ {
QCString fileName = Config_getString("HTML_OUTPUT")+"/closed.gif"; QCString fileName = Config_getString("HTML_OUTPUT")+"/closed.gif";
...@@ -2353,6 +2353,7 @@ void HtmlGenerator::generateSectionImages() ...@@ -2353,6 +2353,7 @@ void HtmlGenerator::generateSectionImages()
{ {
f.writeBlock((char*)closed_gif,closed_gif_len); f.writeBlock((char*)closed_gif,closed_gif_len);
} }
Doxygen::indexList.addImageFile("closed.gif");
} }
} }
......
...@@ -78,6 +78,8 @@ class HtmlHelp : public IndexIntf ...@@ -78,6 +78,8 @@ class HtmlHelp : public IndexIntf
const char *contRef, const char *memRef, const char *contRef, const char *memRef,
const char *anchor,const MemberDef *md); const char *anchor,const MemberDef *md);
void addIndexFile(const char *name); void addIndexFile(const char *name);
void addImageFile(const char *) {}
void addStyleSheetFile(const char *) {}
private: private:
void createProjectFile(); void createProjectFile();
......
...@@ -39,6 +39,8 @@ class IndexIntf ...@@ -39,6 +39,8 @@ class IndexIntf
virtual void addIndexItem(const char *level1, const char *level2, const char *contRef, virtual void addIndexItem(const char *level1, const char *level2, const char *contRef,
const char *memRef, const char *anchor,const MemberDef *md) = 0; const char *memRef, const char *anchor,const MemberDef *md) = 0;
virtual void addIndexFile(const char *name) = 0; virtual void addIndexFile(const char *name) = 0;
virtual void addImageFile(const char *name) = 0;
virtual void addStyleSheetFile(const char *name) = 0;
}; };
class IndexList : public IndexIntf class IndexList : public IndexIntf
...@@ -92,6 +94,10 @@ class IndexList : public IndexIntf ...@@ -92,6 +94,10 @@ class IndexList : public IndexIntf
(&IndexIntf::addIndexItem,level1,level2,contRef,memRef,anchor,md); } (&IndexIntf::addIndexItem,level1,level2,contRef,memRef,anchor,md); }
void addIndexFile(const char *name) void addIndexFile(const char *name)
{ foreach<const char *>(&IndexIntf::addIndexFile,name); } { foreach<const char *>(&IndexIntf::addIndexFile,name); }
void addImageFile(const char *name)
{ foreach<const char *>(&IndexIntf::addImageFile,name); }
void addStyleSheetFile(const char *name)
{ foreach<const char *>(&IndexIntf::addStyleSheetFile,name); }
}; };
......
...@@ -51,6 +51,7 @@ NamespaceDef::NamespaceDef(const char *df,int dl, ...@@ -51,6 +51,7 @@ NamespaceDef::NamespaceDef(const char *df,int dl,
m_innerCompounds = new SDict<Definition>(17); m_innerCompounds = new SDict<Definition>(17);
usingDirList = 0; usingDirList = 0;
usingDeclList = 0; usingDeclList = 0;
m_allMembersDict = 0;
setReference(lref); setReference(lref);
memberGroupSDict = new MemberGroupSDict; memberGroupSDict = new MemberGroupSDict;
memberGroupSDict->setAutoDelete(TRUE); memberGroupSDict->setAutoDelete(TRUE);
...@@ -183,6 +184,12 @@ void NamespaceDef::insertMember(MemberDef *md) ...@@ -183,6 +184,12 @@ void NamespaceDef::insertMember(MemberDef *md)
m_memberLists.append(allMemberList); m_memberLists.append(allMemberList);
} }
allMemberList->append(md); allMemberList->append(md);
if (m_allMembersDict==0)
{
m_allMembersDict = new MemberSDict;
}
//printf("%s::m_allMembersDict->append(%s)\n",name().data(),md->localName().data());
m_allMembersDict->append(md->localName(),md);
//::addNamespaceMemberNameToIndex(md); //::addNamespaceMemberNameToIndex(md);
//static bool sortBriefDocs=Config_getBool("SORT_BRIEF_DOCS"); //static bool sortBriefDocs=Config_getBool("SORT_BRIEF_DOCS");
switch(md->memberType()) switch(md->memberType())
...@@ -935,3 +942,16 @@ bool NamespaceDef::isLinkable() const ...@@ -935,3 +942,16 @@ bool NamespaceDef::isLinkable() const
{ {
return isLinkableInProject() || isReference(); return isLinkableInProject() || isReference();
} }
MemberDef * NamespaceDef::getMemberByName(const QCString &n) const
{
MemberDef *md = 0;
if (m_allMembersDict && !n.isEmpty())
{
md = m_allMembersDict->find(n);
//printf("%s::m_allMembersDict->find(%s)=%p\n",name().data(),n.data(),md);
}
return md;
}
...@@ -74,6 +74,7 @@ class NamespaceDef : public Definition ...@@ -74,6 +74,7 @@ class NamespaceDef : public Definition
MemberList *getMemberList(MemberList::ListType lt) const; MemberList *getMemberList(MemberList::ListType lt) const;
const QList<MemberList> &getMemberLists() const { return m_memberLists; } const QList<MemberList> &getMemberLists() const { return m_memberLists; }
MemberDef *getMemberByName(const QCString &) const;
/*! Returns the user defined member groups */ /*! Returns the user defined member groups */
MemberGroupSDict *getMemberGroupSDict() const { return memberGroupSDict; } MemberGroupSDict *getMemberGroupSDict() const { return memberGroupSDict; }
...@@ -109,7 +110,7 @@ class NamespaceDef : public Definition ...@@ -109,7 +110,7 @@ class NamespaceDef : public Definition
SDict<Definition> *usingDeclList; SDict<Definition> *usingDeclList;
SDict<Definition> *m_innerCompounds; SDict<Definition> *m_innerCompounds;
//MemberList *allMemberList; MemberSDict *m_allMembersDict;
QList<MemberList> m_memberLists; QList<MemberList> m_memberLists;
MemberGroupSDict *memberGroupSDict; MemberGroupSDict *memberGroupSDict;
ClassSDict *classSDict; ClassSDict *classSDict;
......
...@@ -19,15 +19,16 @@ ...@@ -19,15 +19,16 @@
#include "message.h" #include "message.h"
#include "config.h" #include "config.h"
#include <qstringlist.h>
#include <string.h> #include <string.h>
static QCString makeFileName(char const * withoutExtension) static QCString makeFileName(const char * withoutExtension)
{ {
if (!withoutExtension) return QCString(); if (!withoutExtension) return QCString();
return QCString(withoutExtension)+".html"; return QCString(withoutExtension)+".html";
} }
static QCString makeRef(char const * withoutExtension, char const * anchor) static QCString makeRef(const char * withoutExtension, const char * anchor)
{ {
if (!withoutExtension) return QCString(); if (!withoutExtension) return QCString();
QCString result = makeFileName(withoutExtension); QCString result = makeFileName(withoutExtension);
...@@ -65,26 +66,57 @@ void Qhp::initialize() ...@@ -65,26 +66,57 @@ void Qhp::initialize()
*/ */
QCString nameSpace = Config_getString("QHP_NAMESPACE"); QCString nameSpace = Config_getString("QHP_NAMESPACE");
QCString virtualFolder = Config_getString("QHP_VIRTUAL_FOLDER"); QCString virtualFolder = Config_getString("QHP_VIRTUAL_FOLDER");
QCString projectTitle = getFullProjectName();
QCString filterIdent = projectTitle;
QCString filterAttribute = projectTitle;
char const * rootAttributes[] = const char * rootAttributes[] =
{ "version", "1.0", 0 }; { "version", "1.0", 0 };
char const * customFilterAttributes[] =
{ "name", filterIdent, 0 };
m_doc.open("QtHelpProject", rootAttributes); m_doc.open("QtHelpProject", rootAttributes);
m_doc.openCloseContent("namespace", nameSpace); m_doc.openCloseContent("namespace", nameSpace);
m_doc.openCloseContent("virtualFolder", virtualFolder); m_doc.openCloseContent("virtualFolder", virtualFolder);
m_doc.open("customFilter", customFilterAttributes); // Add custom filter
m_doc.openCloseContent("filterAttribute", filterAttribute); QCString filterName = Config_getString("QHP_CUSTOM_FILTER_NAME");
m_doc.close("customFilter"); if (!filterName.isEmpty())
{
const char * tagAttributes[] =
{ "name", filterName, 0 };
m_doc.open("customFilter", tagAttributes);
QStringList customFilterAttributes = QStringList::split(' ', Config_getString("QHP_CUST_FILTER_ATTRS"));
for (int i = 0; i < (int)customFilterAttributes.count(); i++)
{
m_doc.openCloseContent("filterAttribute", customFilterAttributes[i]);
}
m_doc.close("customFilter");
}
m_doc.open("filterSection"); m_doc.open("filterSection");
m_doc.openCloseContent("filterAttribute", filterAttribute);
// Add section attributes
QStringList sectionFilterAttributes = QStringList::split(' ',
Config_getString("QHP_SECT_FILTER_ATTRS"));
if (!sectionFilterAttributes.contains(QString("doxygen")))
{
sectionFilterAttributes << "doxygen";
}
for (int i = 0; i < (int)sectionFilterAttributes.count(); i++)
{
m_doc.openCloseContent("filterAttribute", sectionFilterAttributes[i]);
}
m_toc.open("toc"); m_toc.open("toc");
// Add extra root node
QCString fullProjectname = getFullProjectName();
const char * const attributes[] =
{ "title", fullProjectname,
"ref", "index.html",
NULL
};
m_toc.open("section", attributes);
m_prevSectionLevel = 1;
m_sectionLevel = 1;
m_index.open("keywords"); m_index.open("keywords");
m_files.open("files"); m_files.open("files");
} }
...@@ -93,6 +125,10 @@ void Qhp::finalize() ...@@ -93,6 +125,10 @@ void Qhp::finalize()
{ {
// Finish TOC // Finish TOC
handlePrevSection(); handlePrevSection();
for (int i = m_prevSectionLevel; i > 0; i--)
{
m_toc.close("section");
}
m_toc.close("toc"); m_toc.close("toc");
m_doc.insert(m_toc); m_doc.insert(m_toc);
...@@ -101,12 +137,6 @@ void Qhp::finalize() ...@@ -101,12 +137,6 @@ void Qhp::finalize()
m_doc.insert(m_index); m_doc.insert(m_index);
// Finish files // Finish files
addFile("doxygen.css");
addFile("doxygen.png");
addFile("tab_b.gif");
addFile("tab_l.gif");
addFile("tab_r.gif");
addFile("tabs.css");
m_files.close("files"); m_files.close("files");
m_doc.insert(m_files); m_doc.insert(m_files);
...@@ -137,9 +167,9 @@ void Qhp::decContentsDepth() ...@@ -137,9 +167,9 @@ void Qhp::decContentsDepth()
m_sectionLevel--; m_sectionLevel--;
} }
void Qhp::addContentsItem(bool /*isDir*/, char const * name, void Qhp::addContentsItem(bool /*isDir*/, const char * name,
char const * /*ref*/, char const * file, const char * /*ref*/, const char * file,
char const * /*anchor*/) const char * /*anchor*/)
{ {
// Backup difference before modification // Backup difference before modification
int diff = m_prevSectionLevel - m_sectionLevel; int diff = m_prevSectionLevel - m_sectionLevel;
...@@ -154,9 +184,9 @@ void Qhp::addContentsItem(bool /*isDir*/, char const * name, ...@@ -154,9 +184,9 @@ void Qhp::addContentsItem(bool /*isDir*/, char const * name,
} }
} }
void Qhp::addIndexItem(char const * level1, char const * level2, void Qhp::addIndexItem(const char * level1, const char * level2,
char const * contRef, char const * /*memRef*/, const char * contRef, const char * /*memRef*/,
char const * anchor, const MemberDef * /*md*/) const char * anchor, const MemberDef * /*md*/)
{ {
/* /*
<keyword name="foo" id="MyApplication::foo" ref="doc.html#foo"/> <keyword name="foo" id="MyApplication::foo" ref="doc.html#foo"/>
...@@ -165,7 +195,7 @@ void Qhp::addIndexItem(char const * level1, char const * level2, ...@@ -165,7 +195,7 @@ void Qhp::addIndexItem(char const * level1, char const * level2,
QCString id(level1); QCString id(level1);
id += "::"; id += "::";
id += level2; id += level2;
char const * attributes[] = const char * attributes[] =
{ "name", level2, { "name", level2,
"id", id, "id", id,
"ref", ref, "ref", ref,
...@@ -175,7 +205,7 @@ void Qhp::addIndexItem(char const * level1, char const * level2, ...@@ -175,7 +205,7 @@ void Qhp::addIndexItem(char const * level1, char const * level2,
} }
void void
Qhp::addIndexFile(char const * name) Qhp::addIndexFile(const char * name)
{ {
addFile(name); addFile(name);
} }
...@@ -183,7 +213,6 @@ Qhp::addIndexFile(char const * name) ...@@ -183,7 +213,6 @@ Qhp::addIndexFile(char const * name)
/*static*/ QCString /*static*/ QCString
Qhp::getQhpFileName() Qhp::getQhpFileName()
{ {
return "index.qhp"; return "index.qhp";
} }
...@@ -215,39 +244,33 @@ Qhp::handlePrevSection() ...@@ -215,39 +244,33 @@ Qhp::handlePrevSection()
return; return;
} }
// Replace "Main Page" with <project_name> in TOC // We skip "Main Page" as our extra root is pointing to that
QCString finalTitle; if (!((m_prevSectionLevel==1) && (m_prevSectionTitle=="Main Page")))
if (m_prevSectionLevel==0 && m_prevSectionTitle=="Main Page")
{ {
finalTitle = getFullProjectName(); QCString finalRef = makeFileName(m_prevSectionRef);
}
if (finalTitle.isEmpty()) const char * const attributes[] =
{ { "title", m_prevSectionTitle,
finalTitle = m_prevSectionTitle; "ref", finalRef,
} NULL
QCString finalRef = makeFileName(m_prevSectionRef); };
char const * const attributes[] = if (m_prevSectionLevel < m_sectionLevel)
{ "title", finalTitle, {
"ref", finalRef, // Section with children
NULL m_toc.open("section", attributes);
}; }
else
if (m_prevSectionLevel < m_sectionLevel) {
{ // Section without children
// Section with children m_toc.openClose("section", attributes);
m_toc.open("section", attributes); }
}
else
{
// Section without children
m_toc.openClose("section", attributes);
} }
clearPrevSection(); clearPrevSection();
} }
void Qhp::setPrevSection(char const * title, char const * ref, int level) void Qhp::setPrevSection(const char * title, const char * ref, int level)
{ {
m_prevSectionTitle = title; m_prevSectionTitle = title;
m_prevSectionRef = ref; m_prevSectionRef = ref;
...@@ -258,10 +281,20 @@ void Qhp::clearPrevSection() ...@@ -258,10 +281,20 @@ void Qhp::clearPrevSection()
{ {
m_prevSectionTitle.resize(0); m_prevSectionTitle.resize(0);
m_prevSectionRef.resize(0); m_prevSectionRef.resize(0);
m_prevSectionLevel = m_sectionLevel;
} }
void Qhp::addFile(char const * fileName) void Qhp::addFile(const char * fileName)
{ {
m_files.openCloseContent("file", fileName); m_files.openCloseContent("file", fileName);
} }
void Qhp::addImageFile(const char *fileName)
{
addFile(fileName);
}
void Qhp::addStyleSheetFile(const char *fileName)
{
addFile(fileName);
}
...@@ -31,12 +31,14 @@ class Qhp : public IndexIntf ...@@ -31,12 +31,14 @@ class Qhp : public IndexIntf
void finalize(); void finalize();
void incContentsDepth(); void incContentsDepth();
void decContentsDepth(); void decContentsDepth();
void addContentsItem(bool isDir, char const * name, char const * ref, void addContentsItem(bool isDir, const char * name, const char * ref,
char const * file, char const * anchor); const char * file, const char * anchor);
void addIndexItem(char const * level1, char const * level2, void addIndexItem(const char * level1, const char * level2,
char const * contRef, char const * memRef, const char * contRef, const char * memRef,
char const * anchor, const MemberDef * md); const char * anchor, const MemberDef * md);
void addIndexFile(char const * name); void addIndexFile(const char * name);
void addImageFile(const char * name);
void addStyleSheetFile(const char * name);
// END IndexIntf // END IndexIntf
static QCString getQhpFileName(); static QCString getQhpFileName();
...@@ -44,8 +46,8 @@ class Qhp : public IndexIntf ...@@ -44,8 +46,8 @@ class Qhp : public IndexIntf
private: private:
void handlePrevSection(); void handlePrevSection();
void clearPrevSection(); void clearPrevSection();
void setPrevSection(char const * title, char const * ref, int level); void setPrevSection(const char * title, const char * ref, int level);
void addFile(char const * fileName); void addFile(const char * fileName);
static QCString getFullProjectName(); static QCString getFullProjectName();
......
...@@ -922,10 +922,13 @@ void RTFGenerator::startIndexList() ...@@ -922,10 +922,13 @@ void RTFGenerator::startIndexList()
void RTFGenerator::endIndexList() void RTFGenerator::endIndexList()
{ {
DBG_RTF(t << "{\\comment (endIndexList)}" << endl) DBG_RTF(t << "{\\comment (endIndexList)}" << endl)
t << "\\par"; if (!m_omitParagraph)
{
t << "\\par";
m_omitParagraph = TRUE;
}
t << "}"; t << "}";
decrementIndentLevel(); decrementIndentLevel();
m_omitParagraph = TRUE;
} }
/*! start bullet list */ /*! start bullet list */
...@@ -990,6 +993,12 @@ void RTFGenerator::writeListItem() ...@@ -990,6 +993,12 @@ void RTFGenerator::writeListItem()
void RTFGenerator::startIndexItem(const char *,const char *) void RTFGenerator::startIndexItem(const char *,const char *)
{ {
DBG_RTF(t << "{\\comment (startIndexItem)}" << endl) DBG_RTF(t << "{\\comment (startIndexItem)}" << endl)
if (!m_omitParagraph)
{
t << "\\par" << endl;
m_omitParagraph = TRUE;
}
} }
void RTFGenerator::endIndexItem(const char *ref,const char *fn) void RTFGenerator::endIndexItem(const char *ref,const char *fn)
...@@ -1006,7 +1015,6 @@ void RTFGenerator::endIndexItem(const char *ref,const char *fn) ...@@ -1006,7 +1015,6 @@ void RTFGenerator::endIndexItem(const char *ref,const char *fn)
t << endl; t << endl;
} }
m_omitParagraph = TRUE; m_omitParagraph = TRUE;
newParagraph();
} }
//void RTFGenerator::writeIndexFileItem(const char *,const char *text) //void RTFGenerator::writeIndexFileItem(const char *,const char *text)
...@@ -2607,15 +2615,17 @@ void RTFGenerator::postProcess(QByteArray &a) ...@@ -2607,15 +2615,17 @@ void RTFGenerator::postProcess(QByteArray &a)
QByteArray enc(a.size()*4); // worst case QByteArray enc(a.size()*4); // worst case
int off=0; int off=0;
uint i; uint i;
bool mbFlag=FALSE;
for (i=0;i<a.size();i++) for (i=0;i<a.size();i++)
{ {
unsigned char c = (unsigned char)a.at(i); unsigned char c = (unsigned char)a.at(i);
if (c>0x80) if (c>0x80 || mbFlag)
{ {
char s[10]; char s[10];
sprintf(s,"\\'%X",c); sprintf(s,"\\'%X",c);
qstrcpy(enc.data()+off,s); qstrcpy(enc.data()+off,s);
off+=qstrlen(s); off+=qstrlen(s);
mbFlag=c>0x80;
} }
else else
{ {
......
...@@ -5383,7 +5383,7 @@ static void handleCommentBlock(const QCString &doc,bool brief) ...@@ -5383,7 +5383,7 @@ static void handleCommentBlock(const QCString &doc,bool brief)
//printf("parseCommentBlock [%s]\n",doc.data()); //printf("parseCommentBlock [%s]\n",doc.data());
while (parseCommentBlock( while (parseCommentBlock(
g_thisParser, g_thisParser,
docBlockInBody ? previous : current, docBlockInBody && previous ? previous : current,
doc, // text doc, // text
yyFileName, // file yyFileName, // file
brief ? current->briefLine : current->docLine, // line of block start brief ? current->briefLine : current->docLine, // line of block start
......
...@@ -49,6 +49,18 @@ ...@@ -49,6 +49,18 @@
#include "textdocvisitor.h" #include "textdocvisitor.h"
#include "portable.h" #include "portable.h"
#define ENABLE_TRACINGSUPPORT 0
#if defined(_OS_MAC_) && ENABLE_TRACINGSUPPORT
#define TRACINGSUPPORT
#endif
#ifdef TRACINGSUPPORT
#include <execinfo.h>
#include <unistd.h>
#endif
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// selects one of the name to sub-dir mapping algorithms that is used // selects one of the name to sub-dir mapping algorithms that is used
...@@ -6355,35 +6367,85 @@ void stringToSearchIndex(const QCString &docBaseUrl,const QCString &title, ...@@ -6355,35 +6367,85 @@ void stringToSearchIndex(const QCString &docBaseUrl,const QCString &title,
} }
} }
//--------------------------------------------------------------------------
static QDict<int> g_extLookup;
static struct Lang2ExtMap
{
const char *langName;
SrcLangExt parserId;
}
g_lang2extMap[] =
{
{ "idl", SrcLangExt_IDL },
{ "java", SrcLangExt_Java },
{ "javascript", SrcLangExt_JS },
{ "c#", SrcLangExt_CSharp },
{ "d", SrcLangExt_D },
{ "php", SrcLangExt_PHP },
{ "objective-c", SrcLangExt_ObjC },
{ "python", SrcLangExt_Python },
{ "fortran", SrcLangExt_F90 },
{ "vhdl", SrcLangExt_VHDL },
{ "c", SrcLangExt_Cpp },
{ "c++", SrcLangExt_Cpp },
{ 0, (SrcLangExt)0 }
};
bool updateLanguageMapping(const QCString &extension,const QCString &parser)
{
getLanguageFromFileName("dummy"); // force initializion of the g_extLookup map
const Lang2ExtMap *p = g_lang2extMap;
QCString langName = parser.lower();
while (p->langName)
{
if (langName==p->langName) break;
p++;
}
if (!p->langName) return FALSE;
// found the parser
SrcLangExt parserId = p->parserId;
QCString extName = extension;
if (extName.isEmpty()) return FALSE;
if (extName.at(0)!='.') extName.prepend(".");
if (g_extLookup.find(extension)!=0) // parser was already register for this ext
{
g_extLookup.remove(extension);
}
g_extLookup.insert(extension,new int(parserId));
return TRUE;
}
SrcLangExt getLanguageFromFileName(const QCString fileName) SrcLangExt getLanguageFromFileName(const QCString fileName)
{ {
int i = fileName.findRev('.'); int i = fileName.findRev('.');
static bool init=FALSE; static bool init=FALSE;
static QDict<int> extLookup; g_extLookup.setAutoDelete(TRUE);
extLookup.setAutoDelete(TRUE);
if (!init) // one time initialization if (!init) // one time initialization
{ {
extLookup.insert(".idl", new int(SrcLangExt_IDL)); g_extLookup.insert(".idl", new int(SrcLangExt_IDL));
extLookup.insert(".ddl", new int(SrcLangExt_IDL)); g_extLookup.insert(".ddl", new int(SrcLangExt_IDL));
extLookup.insert(".odl", new int(SrcLangExt_IDL)); g_extLookup.insert(".odl", new int(SrcLangExt_IDL));
extLookup.insert(".java", new int(SrcLangExt_Java)); g_extLookup.insert(".java", new int(SrcLangExt_Java));
extLookup.insert(".as", new int(SrcLangExt_JS)); g_extLookup.insert(".as", new int(SrcLangExt_JS));
extLookup.insert(".js", new int(SrcLangExt_JS)); g_extLookup.insert(".js", new int(SrcLangExt_JS));
extLookup.insert(".cs", new int(SrcLangExt_CSharp)); g_extLookup.insert(".cs", new int(SrcLangExt_CSharp));
extLookup.insert(".d", new int(SrcLangExt_D)); g_extLookup.insert(".d", new int(SrcLangExt_D));
extLookup.insert(".php", new int(SrcLangExt_PHP)); g_extLookup.insert(".php", new int(SrcLangExt_PHP));
extLookup.insert(".php4", new int(SrcLangExt_PHP)); g_extLookup.insert(".php4", new int(SrcLangExt_PHP));
extLookup.insert(".php5", new int(SrcLangExt_PHP)); g_extLookup.insert(".php5", new int(SrcLangExt_PHP));
extLookup.insert(".inc", new int(SrcLangExt_PHP)); g_extLookup.insert(".inc", new int(SrcLangExt_PHP));
extLookup.insert(".phtml", new int(SrcLangExt_PHP)); g_extLookup.insert(".phtml", new int(SrcLangExt_PHP));
extLookup.insert(".m", new int(SrcLangExt_ObjC)); g_extLookup.insert(".m", new int(SrcLangExt_ObjC));
extLookup.insert(".M", new int(SrcLangExt_ObjC)); g_extLookup.insert(".M", new int(SrcLangExt_ObjC));
extLookup.insert(".mm", new int(SrcLangExt_ObjC)); g_extLookup.insert(".mm", new int(SrcLangExt_ObjC));
extLookup.insert(".py", new int(SrcLangExt_Python)); g_extLookup.insert(".py", new int(SrcLangExt_Python));
extLookup.insert(".f", new int(SrcLangExt_F90)); g_extLookup.insert(".f", new int(SrcLangExt_F90));
extLookup.insert(".f90", new int(SrcLangExt_F90)); g_extLookup.insert(".f90", new int(SrcLangExt_F90));
extLookup.insert(".vhd", new int(SrcLangExt_VHDL)); g_extLookup.insert(".vhd", new int(SrcLangExt_VHDL));
extLookup.insert(".vhdl", new int(SrcLangExt_VHDL)); g_extLookup.insert(".vhdl", new int(SrcLangExt_VHDL));
init=TRUE; init=TRUE;
} }
if (i!=-1) // name has an extension if (i!=-1) // name has an extension
...@@ -6391,7 +6453,7 @@ SrcLangExt getLanguageFromFileName(const QCString fileName) ...@@ -6391,7 +6453,7 @@ SrcLangExt getLanguageFromFileName(const QCString fileName)
QCString extStr=fileName.right(fileName.length()-i); QCString extStr=fileName.right(fileName.length()-i);
if (!extStr.isEmpty()) // non-empty extension if (!extStr.isEmpty()) // non-empty extension
{ {
int *pVal=extLookup.find(extStr); int *pVal=g_extLookup.find(extStr);
if (pVal) // listed extension if (pVal) // listed extension
{ {
return (SrcLangExt)*pVal; // cast void* address to enum value return (SrcLangExt)*pVal; // cast void* address to enum value
...@@ -6401,6 +6463,8 @@ SrcLangExt getLanguageFromFileName(const QCString fileName) ...@@ -6401,6 +6463,8 @@ SrcLangExt getLanguageFromFileName(const QCString fileName)
return SrcLangExt_Cpp; // not listed => assume C-ish language. return SrcLangExt_Cpp; // not listed => assume C-ish language.
} }
//--------------------------------------------------------------------------
/*! Returns true iff the given name string appears to be a typedef in scope. */ /*! Returns true iff the given name string appears to be a typedef in scope. */
bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n) bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n)
{ {
...@@ -6471,12 +6535,14 @@ bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n) ...@@ -6471,12 +6535,14 @@ bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n)
return FALSE; return FALSE;
} }
QCString parseCommentAsText(const QString &doc,const QCString &fileName,int lineNr) QCString parseCommentAsText(const Definition *scope,const MemberDef *md,
const QString &doc,const QCString &fileName,int lineNr)
{ {
QString result; QString result;
if (doc.isEmpty()) return result.data(); if (doc.isEmpty()) return result.data();
QTextStream t(&result,IO_WriteOnly); QTextStream t(&result,IO_WriteOnly);
DocNode *root = validatingParseDoc(fileName,lineNr,Doxygen::globalScope,0,doc,FALSE,FALSE); DocNode *root = validatingParseDoc(fileName,lineNr,
(Definition*)scope,(MemberDef*)md,doc,FALSE,FALSE);
TextDocVisitor *visitor = new TextDocVisitor(t); TextDocVisitor *visitor = new TextDocVisitor(t);
root->accept(visitor); root->accept(visitor);
delete visitor; delete visitor;
...@@ -6689,3 +6755,30 @@ bool usingTreeIndex() ...@@ -6689,3 +6755,30 @@ bool usingTreeIndex()
return TreeView=="FRAME" || TreeView=="ALL" || TreeView=="YES"; return TreeView=="FRAME" || TreeView=="ALL" || TreeView=="YES";
} }
void stackTrace()
{
#ifdef TRACINGSUPPORT
void *backtraceFrames[128];
int frameCount = backtrace(backtraceFrames, 128);
static char cmd[40960];
char *p = cmd;
p += sprintf(p,"/usr/bin/atos -p %d ", (int)getpid());
for (int x = 0; x < frameCount; x++)
{
p += sprintf(p,"%p ", backtraceFrames[x]);
}
fprintf(stderr,"========== STACKTRACE START ==============\n");
if (FILE *fp = popen(cmd, "r"))
{
char resBuf[512];
while (size_t len = fread(resBuf, 1, sizeof(resBuf), fp))
{
fwrite(resBuf, 1, len, stderr);
}
pclose(fp);
}
fprintf(stderr,"============ STACKTRACE END ==============\n");
//fprintf(stderr,"%s\n", frameStrings[x]);
#endif
}
...@@ -328,6 +328,7 @@ void stringToSearchIndex(const QCString &docUrlBase,const QCString &title, ...@@ -328,6 +328,7 @@ void stringToSearchIndex(const QCString &docUrlBase,const QCString &title,
const QCString &str, bool priority=FALSE, const QCString &str, bool priority=FALSE,
const QCString &anchor=""); const QCString &anchor="");
bool updateLanguageMapping(const QCString &extension,const QCString &parser);
SrcLangExt getLanguageFromFileName(const QCString fileName); SrcLangExt getLanguageFromFileName(const QCString fileName);
bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n); bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n);
...@@ -337,7 +338,7 @@ ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md, ...@@ -337,7 +338,7 @@ ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md,
QCString *pResolvedType=0, QCString *pResolvedType=0,
ArgumentList *actTemplParams=0); ArgumentList *actTemplParams=0);
QCString parseCommentAsText(const QString &doc,const QCString &fileName,int lineNr); QCString parseCommentAsText(const Definition *scope,const MemberDef *member,const QString &doc,const QCString &fileName,int lineNr);
QCString transcodeCharacterStringToUTF8(const QCString &input); QCString transcodeCharacterStringToUTF8(const QCString &input);
...@@ -357,6 +358,7 @@ void writeTypeConstraints(OutputList &ol,Definition *d,ArgumentList *al); ...@@ -357,6 +358,7 @@ void writeTypeConstraints(OutputList &ol,Definition *d,ArgumentList *al);
QCString convertCharEntitiesToUTF8(const QCString &s); QCString convertCharEntitiesToUTF8(const QCString &s);
bool usingTreeIndex(); bool usingTreeIndex();
void stackTrace();
#endif #endif
...@@ -1209,7 +1209,7 @@ QCString VhdlDocGen::trTypeString(int type) ...@@ -1209,7 +1209,7 @@ QCString VhdlDocGen::trTypeString(int type)
case VhdlDocGen::SHAREDVARIABLE: return "Shared Variable"; case VhdlDocGen::SHAREDVARIABLE: return "Shared Variable";
case VhdlDocGen::GROUP: return "Group"; case VhdlDocGen::GROUP: return "Group";
case VhdlDocGen::VFILE: return "File"; case VhdlDocGen::VFILE: return "File";
case VhdlDocGen::COMPONENT_INST: return "Component Instantination"; case VhdlDocGen::COMPONENT_INST: return "Component Instantiation";
case VhdlDocGen::ALIAS: return "Alias"; case VhdlDocGen::ALIAS: return "Alias";
case VhdlDocGen::CONFIG: return "Configuration"; case VhdlDocGen::CONFIG: return "Configuration";
default: return ""; default: return "";
...@@ -1926,6 +1926,34 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, ...@@ -1926,6 +1926,34 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol,
VhdlDocGen::writeProcedureProto(ol,alp.pointer(),mdef); VhdlDocGen::writeProcedureProto(ol,alp.pointer(),mdef);
break; break;
case VhdlDocGen::USE:
kl=VhdlDocGen::getClass(mdef->name());
if (kl && ((VhdlDocGen::VhdlClasses)kl->protection()==VhdlDocGen::ENTITYCLASS)) break;
writeLink(mdef,ol);
ol.insertMemberAlign();
ol.docify(" ");
if (kl)
{
nn=kl->getOutputFileBase();
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
ol.docify(" ");
QCString name=theTranslator_vhdlType(VhdlDocGen::PACKAGE,TRUE);
ol.startBold();
ol.docify(name.data());
name.resize(0);
ol.endBold();
name+=" <"+mdef->name()+">";
ol.startEmphasis();
ol.writeObjectLink(kl->getReference(),kl->getOutputFileBase(),0,name.data());
ol.popGeneratorState();
}
break;
case VhdlDocGen::LIBRARY:
writeLink(mdef,ol);
ol.insertMemberAlign();
break;
case VhdlDocGen::GENERIC: case VhdlDocGen::GENERIC:
case VhdlDocGen::PORT: case VhdlDocGen::PORT:
writeLink(mdef,ol); writeLink(mdef,ol);
......
...@@ -809,9 +809,9 @@ ALLID [^;()\t ] ...@@ -809,9 +809,9 @@ ALLID [^;()\t ]
BEGIN(FindEntityName); BEGIN(FindEntityName);
} }
<Start>{MAPCOMPONENT}|{MAPCOMPONENT1} { // found new mapped component aaa: bbb port map <Start>{MAPCOMPONENT}|{MAPCOMPONENT1} { // found component instantiation
lineCount(); // lineCount();
QCString type; QCString type;
QCString tt(yytext); QCString tt(yytext);
QRegExp regg("[ \n\t:.()-]"); QRegExp regg("[ \n\t:.()-]");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment