summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authordimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2000-11-26 14:55:14 (GMT)
committerdimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2000-11-26 14:55:14 (GMT)
commita30c2e3c5ea41ae1947e9893c82ed8c8b6d7c5a2 (patch)
tree0bbfa006a4c63e8fe48b3d0022699cffaea24b47 /src
parent2f32e4c28047cdec982a818e8abe5632af2d9511 (diff)
downloadDoxygen-a30c2e3c5ea41ae1947e9893c82ed8c8b6d7c5a2.zip
Doxygen-a30c2e3c5ea41ae1947e9893c82ed8c8b6d7c5a2.tar.gz
Doxygen-a30c2e3c5ea41ae1947e9893c82ed8c8b6d7c5a2.tar.bz2
Release-1.2.3-20001126
Diffstat (limited to 'src')
-rw-r--r--src/classdef.cpp62
-rw-r--r--src/config.h3
-rw-r--r--src/config.l23
-rw-r--r--src/doc.l27
-rw-r--r--src/doxygen.cpp115
-rw-r--r--src/doxygen.h1
-rw-r--r--src/doxygen.pro.in5
-rw-r--r--src/doxygen.t3
-rw-r--r--src/ftvhelp.cpp446
-rw-r--r--src/ftvhelp.h47
-rw-r--r--src/groupdef.cpp100
-rw-r--r--src/groupdef.h14
-rw-r--r--src/htmlgen.cpp2
-rw-r--r--src/htmlgen.h2
-rw-r--r--src/htmlhelp.cpp32
-rw-r--r--src/htmlhelp.h33
-rw-r--r--src/index.cpp858
-rw-r--r--src/index.h1
-rw-r--r--src/latexgen.cpp53
-rw-r--r--src/page.h5
-rw-r--r--src/rtfgen.cpp71
-rw-r--r--src/scanner.l5
-rw-r--r--src/treeview.h472
-rw-r--r--src/treeview.js472
-rw-r--r--src/util.cpp50
-rw-r--r--src/util.h2
26 files changed, 2456 insertions, 448 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp
index 227f18e..239ae3f 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -617,6 +617,37 @@ ArgumentList *ClassDef::outerTemplateArguments() const
return tempArgs;
}
}
+
+
+static void writeTemplateSpec(OutputList &ol,ArgumentList *al,
+ const QCString &pageType,const QCString &name)
+{
+ if (al) // class is a template
+ {
+ ol.startSubsubsection();
+ ol.docify("template<");
+ Argument *a=al->first();
+ while (a)
+ {
+ ol.docify(a->type);
+ if (!a->name.isEmpty())
+ {
+ ol.docify(" ");
+ ol.docify(a->name);
+ }
+ if (a->defval.length()!=0)
+ {
+ ol.docify(" = ");
+ ol.docify(a->defval);
+ }
+ a=al->next();
+ if (a) ol.docify(", ");
+ }
+ ol.docify("> "+pageType.lower()+" "+name);
+ ol.endSubsubsection();
+ ol.writeString("\n");
+ }
+}
// write all documentation for this class
void ClassDef::writeDocumentation(OutputList &ol)
@@ -945,32 +976,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
ol.endGroupHeader();
ol.startTextBlock();
- ArgumentList *al=outerTempArgList;
- if (al) // class is a template
- {
- ol.startSubsubsection();
- ol.docify("template<");
- Argument *a=al->first();
- while (a)
- {
- ol.docify(a->type);
- if (!a->name.isEmpty())
- {
- ol.docify(" ");
- ol.docify(a->name);
- }
- if (a->defval.length()!=0)
- {
- ol.docify(" = ");
- ol.docify(a->defval);
- }
- a=al->next();
- if (a) ol.docify(", ");
- }
- ol.docify("> "+pageType.lower()+" "+name());
- ol.endSubsubsection();
- ol.writeString("\n");
- }
+ writeTemplateSpec(ol,outerTempArgList,pageType,name());
// repeat brief description
if (!briefDescription().isEmpty() && Config::repeatBriefFlag)
@@ -1009,6 +1015,10 @@ void ClassDef::writeDocumentation(OutputList &ol)
writeSourceDef(ol,name());
ol.endTextBlock();
}
+ else
+ {
+ writeTemplateSpec(ol,outerTempArgList,pageType,name());
+ }
typedefMembers.countDocMembers();
if (typedefMembers.totalCount()>0)
diff --git a/src/config.h b/src/config.h
index a3165d7..176c1ad 100644
--- a/src/config.h
+++ b/src/config.h
@@ -1,4 +1,4 @@
-/* This file was generated by configgen on Sat Oct 28 15:42:39 2000
+/* This file was generated by configgen on Sat Nov 25 21:38:08 2000
* from config_templ.h
*
* DO NOT EDIT!
@@ -97,6 +97,7 @@ struct Config
static bool htmlHelpFlag; // should html help files be generated?
static bool noIndexFlag; // generate condensed index flag
static int enumValuesPerLine; // number of enum values that are put on one line
+ static bool ftvHelpFlag; // should a folder tree view be generated?
static bool generateLatex; // generate Latex output
static QCString latexOutputDir; // the directory to put the Latex files
static bool compactLatexFlag; // generate compact LaTeX documentation.
diff --git a/src/config.l b/src/config.l
index d158cdb..6d4d834 100644
--- a/src/config.l
+++ b/src/config.l
@@ -1,4 +1,4 @@
-/* This file was generated by configgen on Sat Oct 28 15:42:39 2000
+/* This file was generated by configgen on Sat Nov 25 21:38:08 2000
* from config_templ.l
*
* DO NOT EDIT!
@@ -134,6 +134,7 @@ bool Config::htmlAlignMemberFlag = TRUE;
bool Config::htmlHelpFlag = FALSE;
bool Config::noIndexFlag = FALSE;
int Config::enumValuesPerLine = 4;
+bool Config::ftvHelpFlag = FALSE;
bool Config::generateLatex = TRUE;
QCString Config::latexOutputDir = "latex";
bool Config::compactLatexFlag = FALSE;
@@ -411,6 +412,7 @@ static void readIncludeFile(const char *incName)
<Start>"GENERATE_HTMLHELP"[ \t]*"=" { BEGIN(GetBool); b=&Config::htmlHelpFlag; }
<Start>"DISABLE_INDEX"[ \t]*"=" { BEGIN(GetBool); b=&Config::noIndexFlag; }
<Start>"ENUM_VALUES_PER_LINE"[ \t]*"=" { BEGIN(GetString); s=&enumValuesPerLineString; s->resize(0); }
+<Start>"GENERATE_TREEVIEW"[ \t]*"=" { BEGIN(GetBool); b=&Config::ftvHelpFlag; }
<Start>"GENERATE_LATEX"[ \t]*"=" { BEGIN(GetBool); b=&Config::generateLatex; }
<Start>"LATEX_OUTPUT"[ \t]*"=" { BEGIN(GetString); s=&Config::latexOutputDir; s->resize(0); }
<Start>"COMPACT_LATEX"[ \t]*"=" { BEGIN(GetBool); b=&Config::compactLatexFlag; }
@@ -710,6 +712,7 @@ void dumpConfig()
printf("htmlHelpFlag=`%d'\n",Config::htmlHelpFlag);
printf("noIndexFlag=`%d'\n",Config::noIndexFlag);
printf("enumValuesPerLine=`%d'\n",Config::enumValuesPerLine);
+ printf("ftvHelpFlag=`%d'\n",Config::ftvHelpFlag);
printf("# configuration options related to the LaTeX output\n");
printf("generateLatex=`%d'\n",Config::generateLatex);
printf("latexOutputDir=`%s'\n",Config::latexOutputDir.data());
@@ -878,6 +881,7 @@ void Config::init()
Config::htmlHelpFlag = FALSE;
Config::noIndexFlag = FALSE;
Config::enumValuesPerLine = 4;
+ Config::ftvHelpFlag = FALSE;
Config::generateLatex = TRUE;
Config::latexOutputDir = "latex";
Config::compactLatexFlag = FALSE;
@@ -1037,8 +1041,8 @@ void writeTemplateConfig(QFile *f,bool sl)
t << "# information to generate all constant output in the proper language. \n";
t << "# The default language is English, other supported languages are: \n";
t << "# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, \n";
- t << "# Korean, Hungarian, Spanish, Romanian, Russian, Croatian, Polish, \n";
- t << "# Portuguese and Slovene.\n";
+ t << "# Korean, Hungarian, Norwegian, Spanish, Romanian, Russian, Croatian, \n";
+ t << "# Polish, Portuguese and Slovene.\n";
t << "\n";
}
t << "OUTPUT_LANGUAGE = ";
@@ -1708,6 +1712,19 @@ void writeTemplateConfig(QFile *f,bool sl)
if (!sl)
{
t << "\n";
+ t << "# If the GENERATE_TREEVIEW tag is set to YES, a side pannel will be\n";
+ t << "# generated containing a tree-like index structure (just like the one that \n";
+ t << "# is generated for HTML Help). For this to work a browser that supports \n";
+ t << "# JavaScript and frames is required (for instance Netscape 4.0+ \n";
+ t << "# or Internet explorer 4.0+). \n";
+ t << "\n";
+ }
+ t << "GENERATE_TREEVIEW = ";
+ writeBoolValue(t,Config::ftvHelpFlag);
+ t << "\n";
+ if (!sl)
+ {
+ t << "\n";
}
t << "#---------------------------------------------------------------------------\n";
t << "# configuration options related to the LaTeX output\n";
diff --git a/src/doc.l b/src/doc.l
index 41af1ee..274844f 100644
--- a/src/doc.l
+++ b/src/doc.l
@@ -756,7 +756,7 @@ FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]+
ID [a-z_A-Z][a-z_A-Z0-9]*
SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
SCOPEMASK {ID}?(("::"|"#")?(~)?{ID})+
-URLMASK [a-z_A-Z0-9\~\:\?\@\#\.\-\+\/\=]+
+URLMASK [a-z_A-Z0-9\~\:\?\@\%\#\.\-\+\/\=]+
NONTERM [\{\}\[\]\`\~\@\|\-\+\#\$\/\\\!\%\^\&\*()a-z_A-Z<>0-9]
WORD ({NONTERM}+([^\n\t ]*{NONTERM}+)?)|("\""[^\n\"]"\"")
ATTR ({B}+[^>\n]*)?
@@ -963,10 +963,13 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
}
<DocLinkText>. { linkText += *yytext; }
<DocLinkText>"\n" { linkText += " "; }
-<DocLink,DocLinkText>{CMD}"endlink" { // <- needed for things like \endlink.
+<DocLink,DocLinkText>{CMD}"endlink" { // <- needed for things like \endlink.
//printf("GenerateLink className=`%s' linkRef=`%s' linkText=`%s'\n",
// className.data(),linkRef.data(),linkText.data());
- generateLink(*outDoc,className,linkRef,inSeeBlock,linkText.stripWhiteSpace());
+ if (!generateLink(*outDoc,className,linkRef,inSeeBlock,linkText.stripWhiteSpace()))
+ {
+ warn(yyFileName,yyLineNr,"Warning: link to unknown section %s in the documentation of this entity!",linkRef.data());
+ }
BEGIN( DocScan );
}
<DocScan>{CMD}"endlink"/[^a-z_A-Z0-9] { warn(yyFileName,yyLineNr,
@@ -2007,6 +2010,12 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
<DocScan,DocEmphasis,DocBold,DocCode>"%"[a-zA-Z_0-9\-]+ {
outDoc->docify(yytext+1);
}
+<DocEmphasis>{FILEMASK} {
+ outDoc->startEmphasis();
+ generateFileRef(*outDoc,yytext);
+ outDoc->endEmphasis();
+ BEGIN( DocScan );
+ }
<DocEmphasis>[a-z_A-Z][a-z_A-Z:0-9<>&\-=^%~!\[\]()|\*/]*"("[a-z_A-Z0-9,:\<\> \t\*\&]*")" {
outDoc->startEmphasis();
generateRef(*outDoc,className,yytext,inSeeBlock);
@@ -2019,6 +2028,12 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
outDoc->endEmphasis();
BEGIN( DocScan );
}
+<DocBold>{FILEMASK} {
+ outDoc->startBold();
+ generateFileRef(*outDoc,yytext);
+ outDoc->endBold();
+ BEGIN( DocScan );
+ }
<DocBold>[a-z_A-Z][a-z_A-Z:0-9<>&\-=^%~!\[\]()|\*/]*"("[a-z_A-Z0-9,:\<\> \t\*\&]*")" {
outDoc->startBold();
generateRef(*outDoc,className,yytext,inSeeBlock);
@@ -2031,6 +2046,12 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"")
outDoc->endBold();
BEGIN( DocScan );
}
+<DocCode>{FILEMASK} {
+ outDoc->startTypewriter();
+ generateFileRef(*outDoc,yytext);
+ outDoc->endTypewriter();
+ BEGIN( DocScan );
+ }
<DocCode>[a-z_A-Z][a-z_A-Z:0-9<>&\-=^%~!\[\]()!\*/]*"("[a-z_A-Z0-9,:\<\> \t\*\&]*")" {
outDoc->startTypewriter();
generateRef(*outDoc,className,yytext,inSeeBlock);
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 1469a90..14901c7 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -51,6 +51,7 @@
#include "language.h"
#include "debug.h"
#include "htmlhelp.h"
+#include "ftvhelp.h"
#include "defargs.h"
#include "rtfgen.h"
#include "xml.h"
@@ -193,6 +194,7 @@ int documentedGroups;
int documentedNamespaces;
int documentedNamespaceMembers;
int documentedIncludeFiles;
+int documentedPages;
QTextStream tagFile;
@@ -218,7 +220,7 @@ const char *getOverloadDocs()
static void addRelatedPage(const char *name,const QCString &ptitle,
const QCString &doc,QList<QCString> *anchors,
const char *fileName,int startLine,
- int todoId,int testId
+ int todoId,int testId,GroupDef *gd=0
)
{
PageInfo *pi=0;
@@ -251,6 +253,8 @@ static void addRelatedPage(const char *name,const QCString &ptitle,
setFileNameForSections(anchors,pageName);
pageSDict->append(baseName,pi);
+
+ if (gd) gd->addPage(pi);
if (!pi->title.isEmpty())
{
@@ -259,7 +263,14 @@ static void addRelatedPage(const char *name,const QCString &ptitle,
// a page name is a label as well!
SectionInfo *si=new SectionInfo(
pi->name,pi->title,SectionInfo::Section);
- si->fileName=pageName;
+ if (gd)
+ {
+ si->fileName=gd->getOutputFileBase();
+ }
+ else
+ {
+ si->fileName=pageName;
+ }
//printf(" SectionInfo: sec=%p sec->fileName=%s\n",si,si->fileName.data());
//printf("Adding section info %s\n",pi->name.data());
sectionDict.insert(pageName,si);
@@ -267,6 +278,20 @@ static void addRelatedPage(const char *name,const QCString &ptitle,
}
}
+static void addRelatedPage(Entry *root)
+{
+ GroupDef *gd=0;
+ QListIterator<QCString> sli(*root->groups);
+ QCString *s;
+ for (;(s=sli.current());++sli)
+ {
+ if (!s->isEmpty() && (gd=groupDict[*s])) break;
+ }
+ addRelatedPage(root->name,root->args,root->doc,root->anchors,
+ root->fileName,root->startLine,root->todoId,root->testId,gd
+ );
+}
+
//----------------------------------------------------------------------------
static void addRefItem(int todoId,int testId,const char *prefix,
@@ -1754,7 +1779,11 @@ static void buildMemberList(Entry *root)
QCString nsName,rnsName;
if (nd) nsName = nd->name().copy();
if (rnd) rnsName = rnd->name().copy();
+ QCString groupName,rgroupName;
+ if (md->getGroupDef()) groupName=md->getGroupDef()->name().copy();
+ if (root->groups && root->groups->first()) rgroupName=root->groups->first()->copy();
//printf("namespace `%s' `%s'\n",nsName.data(),rnsName.data());
+ //printf("groupNames `%s' `%s'\n",groupName.data(),rgroupName.data());
if (
matchArguments(md->argumentList(),root->argList,0,nsName)
)
@@ -1764,7 +1793,10 @@ static void buildMemberList(Entry *root)
((fd!=0 && // no external reference and
fd->absFilePath()==root->fileName // prototype in the same file
) ||
- md->getGroupDef()!=0 // member is part of a group
+ (
+ !groupName.isEmpty() || // member is or was part of a group
+ !rgroupName.isEmpty()
+ )
);
// otherwise, allow a duplicate global member with the same argument list
@@ -4565,9 +4597,7 @@ static void buildPageList(Entry *root)
{
if (!root->name.isEmpty())
{
- addRelatedPage(root->name,root->args,root->doc,root->anchors,
- root->fileName,root->startLine,root->todoId,root->testId
- );
+ addRelatedPage(root);
}
}
else if (root->section == Entry::MAINPAGEDOC_SEC)
@@ -4670,32 +4700,36 @@ static void resolveUserReferences()
static void generatePageDocs()
{
+ if (documentedPages==0) return;
PageSDictIterator pdi(*pageSDict);
PageInfo *pi=0;
for (pdi.toFirst();(pi=pdi.current());++pdi)
{
- msg("Generating docs for page %s...\n",pi->name.data());
- outputList->disable(OutputGenerator::Man);
- QCString pageName;
- if (Config::caseSensitiveNames)
- pageName=pi->name.copy();
- else
- pageName=pi->name.lower();
-
- startFile(*outputList,pageName,pi->title);
- SectionInfo *si=0;
- if (!pi->title.isEmpty() && !pi->name.isEmpty() &&
- (si=sectionDict[pi->name])!=0)
- {
- outputList->startSection(si->label,si->title,FALSE);
- outputList->docify(si->title);
- outputList->endSection(si->label,FALSE);
- }
- outputList->startTextBlock();
- parseDoc(*outputList,pi->defFileName,pi->defLine,0,0,pi->doc);
- outputList->endTextBlock();
- endFile(*outputList);
- outputList->enable(OutputGenerator::Man);
+ if (!pi->inGroup)
+ {
+ msg("Generating docs for page %s...\n",pi->name.data());
+ outputList->disable(OutputGenerator::Man);
+ QCString pageName;
+ if (Config::caseSensitiveNames)
+ pageName=pi->name.copy();
+ else
+ pageName=pi->name.lower();
+
+ startFile(*outputList,pageName,pi->title);
+ SectionInfo *si=0;
+ if (!pi->title.isEmpty() && !pi->name.isEmpty() &&
+ (si=sectionDict[pi->name])!=0)
+ {
+ outputList->startSection(si->label,si->title,FALSE);
+ outputList->docify(si->title);
+ outputList->endSection(si->label,FALSE);
+ }
+ outputList->startTextBlock();
+ parseDoc(*outputList,pi->defFileName,pi->defLine,0,0,pi->doc);
+ outputList->endTextBlock();
+ endFile(*outputList);
+ outputList->enable(OutputGenerator::Man);
+ }
}
}
@@ -4724,6 +4758,7 @@ static void buildExampleList(Entry *root)
convertFileName(pi->name)+"-example"
);
exampleSDict->inSort(root->name,pi);
+ addExampleToGroups(root,pi);
}
}
}
@@ -4774,13 +4809,17 @@ static void generateGroupDocs()
for (;(gd=gli.current());++gli)
{
//printf("group %s #members=%d\n",gd->name().data(),gd->countMembers());
- if (gd->countMembers()>0) gd->writeDocumentation(*outputList);
- else
- {
- warn(gd->getDefFileName(),gd->getDefLine(),
- "Warning: group %s does not have any (documented) members.",
- gd->name().data());
- }
+ //if (gd->countMembers()>0)
+ //{
+ // gd->writeDocumentation(*outputList);
+ //}
+ //else
+ //{
+ // warn(gd->getDefFileName(),gd->getDefLine(),
+ // "Warning: group %s does not have any (documented) members.",
+ // gd->name().data());
+ //}
+ gd->writeDocumentation(*outputList);
}
}
@@ -5709,6 +5748,7 @@ int main(int argc,char **argv)
outputList->add(new HtmlGenerator);
HtmlGenerator::init();
if (Config::htmlHelpFlag) HtmlHelp::getInstance()->initialize();
+ if (Config::ftvHelpFlag) FTVHelp::getInstance()->initialize();
copyStyleSheet();
}
if (Config::generateLatex)
@@ -6037,6 +6077,7 @@ int main(int argc,char **argv)
documentedGroups = countGroups();
documentedNamespaces = countNamespaces();
documentedNamespaceMembers = countNamespaceMembers();
+ documentedPages = countRelatedPages();
//documentedIncludeFiles = countIncludeFiles();
// compute the shortest possible names of all files
@@ -6154,6 +6195,10 @@ int main(int argc,char **argv)
{
HtmlHelp::getInstance()->finalize();
}
+ if (Config::generateHtml && Config::ftvHelpFlag)
+ {
+ FTVHelp::getInstance()->finalize();
+ }
if (Config::generateHtml) removeDoxFont(Config::htmlOutputDir);
diff --git a/src/doxygen.h b/src/doxygen.h
index efe2b83..edfe602 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -116,6 +116,7 @@ extern int documentedGroups;
extern int documentedNamespaces;
extern int documentedNamespaceMembers;
extern int documentedIncludeFiles;
+extern int documentedPages;
extern QCString spaces;
extern const char * getOverloadDocs();
diff --git a/src/doxygen.pro.in b/src/doxygen.pro.in
index 66d57a0..f963466 100644
--- a/src/doxygen.pro.in
+++ b/src/doxygen.pro.in
@@ -27,7 +27,8 @@ HEADERS = doxygen.h scanner.h doc.h classdef.h classlist.h memberdef.h \
translator_it.h formula.h debug.h membergroup.h htmlhelp.h \
translator_ru.h translator_pl.h dot.h rtfgen.h xml.h xml_dtd.h \
reflist.h page.h sortdict.h translator_hu.h translator_kr.h \
- translator_ro.h translator_si.h translator_cn.h
+ translator_ro.h translator_si.h translator_cn.h ftvhelp.h \
+ treeview.h
SOURCES = doxygen.cpp scanner.cpp doc.cpp classdef.cpp classlist.cpp \
memberdef.cpp membername.cpp index.cpp memberlist.cpp \
entry.cpp logos.cpp instdox.cpp message.cpp code.cpp \
@@ -38,7 +39,7 @@ SOURCES = doxygen.cpp scanner.cpp doc.cpp classdef.cpp classlist.cpp \
diagram.cpp gifenc.cpp image.cpp namespacedef.cpp \
version.cpp language.cpp definition.cpp formula.cpp debug.cpp \
membergroup.cpp htmlhelp.cpp dot.cpp rtfgen.cpp xml.cpp \
- reflist.cpp
+ reflist.cpp ftvhelp.cpp
unix:LIBS += -L../qtools -lqtools
win32:INCLUDEPATH += .
win32:LIBS += qtools.lib shell32.lib
diff --git a/src/doxygen.t b/src/doxygen.t
index c2d7aae..be0dcc4 100644
--- a/src/doxygen.t
+++ b/src/doxygen.t
@@ -81,3 +81,6 @@ sub GenerateDep {
xml_dtd.h: doxygen.dtd
cat doxygen.dtd | sed -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g" >xml_dtd.h
+treeview.h: treeview.js
+ cat treeview.js | sed -e "s/\\\\/\\\\\\\\/g" -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g" >treeview.h
+
diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp
new file mode 100644
index 0000000..25ca875
--- /dev/null
+++ b/src/ftvhelp.cpp
@@ -0,0 +1,446 @@
+/******************************************************************************
+ * ftvhelp.cpp,v 1.0 2000/09/06 16:09:00
+ *
+ * Kenney Wong <kwong@ea.com>
+ *
+ * Folder Tree View for offline help on browsers that do not support HTML Help.
+ * Uses the FTV structure from:
+ * http://www.geocities.com/Paris/LeftBank/2178/ftexample.html
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <qlist.h>
+#include <qdict.h>
+
+#include "ftvhelp.h"
+#include "config.h"
+#include "message.h"
+
+
+const char treeview_data[]=
+#include "treeview.h"
+;
+
+unsigned char ftv2blank_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x10, 0x00, 0x16, 0x00, 0xb3, 0x00,
+ 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x21, 0xfe, 0x1c,
+ 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
+ 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
+ 0x20, 0x32, 0x2e, 0x30, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x16, 0x00, 0x40, 0x04, 0x14, 0xf0, 0xc9, 0x49, 0xab, 0xbd, 0x38, 0xeb,
+ 0xcd, 0xbb, 0xff, 0x60, 0x28, 0x8e, 0x64, 0x69, 0x9e, 0x68, 0xaa, 0x3e,
+ 0x11, 0x00, 0x3b
+};
+unsigned int ftv2blank_gif_len = 135;
+
+unsigned char ftv2doc_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x18, 0x00, 0x16, 0x00, 0xa2, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xc0, 0xc0,
+ 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x06, 0x00, 0x2c, 0x00, 0x00,
+ 0x00, 0x00, 0x18, 0x00, 0x16, 0x00, 0x00, 0x03, 0x55, 0x68, 0xba, 0xdc,
+ 0xfe, 0x30, 0xca, 0x49, 0x6b, 0x24, 0x38, 0x67, 0x6b, 0x88, 0xf8, 0x60,
+ 0x30, 0x10, 0x96, 0x17, 0x04, 0x02, 0x2a, 0x0c, 0x02, 0x49, 0x79, 0x20,
+ 0x58, 0xcc, 0xc5, 0x9b, 0x02, 0x38, 0x00, 0x0e, 0xf5, 0x04, 0xc7, 0x1f,
+ 0x51, 0x4f, 0x62, 0xca, 0xe1, 0x3e, 0xbc, 0x17, 0x4a, 0x15, 0x4b, 0xfa,
+ 0x3e, 0x46, 0xdd, 0x6a, 0x78, 0x09, 0x02, 0x85, 0x4a, 0x41, 0x14, 0x49,
+ 0x85, 0xfc, 0x42, 0x5c, 0xdb, 0x32, 0x86, 0xf5, 0x0d, 0xce, 0xe8, 0x74,
+ 0xf7, 0x41, 0x6b, 0xbb, 0x39, 0xf0, 0xb8, 0xdc, 0x92, 0x00, 0x00, 0x3b
+};
+unsigned int ftv2doc_gif_len = 144;
+
+unsigned char ftv2folderclosed_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x18, 0x00, 0x16, 0x00, 0xa2, 0x00,
+ 0x00, 0x80, 0x00, 0x80, 0xff, 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80,
+ 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x00,
+ 0x00, 0x00, 0x18, 0x00, 0x16, 0x00, 0x00, 0x03, 0x4c, 0x58, 0xba, 0xdc,
+ 0xfe, 0x30, 0xca, 0x49, 0x2b, 0x25, 0xc4, 0x3a, 0x0c, 0x40, 0xd6, 0x05,
+ 0xd7, 0x75, 0xdf, 0x45, 0x8c, 0xa8, 0x77, 0x09, 0x69, 0x5a, 0x42, 0x27,
+ 0xdb, 0x8e, 0xef, 0xd6, 0xc9, 0xb3, 0x0a, 0x8f, 0x78, 0x8b, 0xed, 0x3c,
+ 0x1f, 0x61, 0x20, 0x39, 0x05, 0x49, 0xc3, 0x00, 0xb1, 0x88, 0x12, 0x60,
+ 0x06, 0x82, 0x80, 0xb3, 0x66, 0x23, 0x0d, 0xa4, 0xd2, 0xdf, 0x85, 0x84,
+ 0xd5, 0x5a, 0x4e, 0x43, 0x2f, 0x08, 0x43, 0x05, 0x99, 0xcf, 0xe8, 0x49,
+ 0x02, 0x00, 0x3b
+};
+unsigned int ftv2folderclosed_gif_len = 135;
+
+unsigned char ftv2folderopen_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x18, 0x00, 0x16, 0x00, 0xa2, 0x00,
+ 0x00, 0x80, 0x00, 0x80, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xc0, 0xc0,
+ 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x06, 0x00, 0x2c, 0x00, 0x00,
+ 0x00, 0x00, 0x18, 0x00, 0x16, 0x00, 0x00, 0x03, 0x5f, 0x68, 0xba, 0xdc,
+ 0xfe, 0x30, 0xca, 0x49, 0x2b, 0x24, 0xf6, 0x0e, 0x9c, 0x59, 0x01, 0xc2,
+ 0xc6, 0x10, 0x24, 0xf5, 0x09, 0x02, 0x47, 0xa2, 0x9c, 0x74, 0x86, 0x2b,
+ 0x1a, 0x10, 0x45, 0xe1, 0x82, 0x68, 0x31, 0x08, 0x01, 0x2b, 0x00, 0x36,
+ 0xc8, 0x4b, 0xa0, 0x43, 0xf1, 0x08, 0xbf, 0xe0, 0x63, 0x58, 0xec, 0xa5,
+ 0x92, 0x11, 0xe6, 0x4e, 0x86, 0x04, 0x46, 0x71, 0xc4, 0x9d, 0xb3, 0xaa,
+ 0x74, 0x7c, 0x70, 0x45, 0xd6, 0xce, 0x7a, 0x05, 0x15, 0x49, 0x53, 0xf2,
+ 0x95, 0x88, 0x36, 0x42, 0x27, 0x5f, 0x80, 0x7c, 0x2e, 0xef, 0x46, 0x6b,
+ 0xf8, 0xbc, 0xbd, 0xc3, 0xef, 0xfb, 0x1b, 0x09, 0x00, 0x3b
+};
+unsigned int ftv2folderopen_gif_len = 154;
+
+unsigned char ftv2lastnode_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x10, 0x00, 0x16, 0x00, 0xb3, 0x00,
+ 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x21, 0xfe, 0x1c,
+ 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
+ 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
+ 0x20, 0x32, 0x2e, 0x30, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x16, 0x00, 0x40, 0x04, 0x1b, 0xf0, 0xc9, 0x49, 0xab, 0xbd, 0x38, 0xeb,
+ 0xcd, 0xbb, 0xff, 0x60, 0x28, 0x72, 0xc0, 0x57, 0x7a, 0x67, 0x97, 0x92,
+ 0x4f, 0xe9, 0xb6, 0x63, 0x2c, 0xcf, 0x5e, 0x04, 0x00, 0x3b
+};
+unsigned int ftv2lastnode_gif_len = 142;
+
+unsigned char ftv2link_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x18, 0x00, 0x16, 0x00, 0xb3, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0xff, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0,
+ 0xc0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x21, 0xfe, 0x1c,
+ 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
+ 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
+ 0x20, 0x32, 0x2e, 0x30, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
+ 0x16, 0x00, 0x00, 0x04, 0x77, 0xf0, 0xc9, 0x49, 0xab, 0xbd, 0x38, 0xeb,
+ 0x7d, 0x8d, 0xff, 0x20, 0x27, 0x19, 0x93, 0x50, 0x1e, 0x24, 0x47, 0x9a,
+ 0x12, 0x7b, 0x3c, 0xa9, 0x16, 0xb3, 0x8f, 0x00, 0xdc, 0xc0, 0xb6, 0x3e,
+ 0x47, 0xe1, 0xbf, 0x82, 0x43, 0x4e, 0x26, 0xe9, 0x19, 0x0a, 0x81, 0xc2,
+ 0x4b, 0xa8, 0xab, 0x29, 0x0b, 0x04, 0xa4, 0x21, 0x38, 0xcc, 0xa4, 0x0a,
+ 0xbc, 0xc0, 0x80, 0x30, 0xe0, 0x55, 0x31, 0x2b, 0xa5, 0x21, 0xc9, 0xa5,
+ 0xca, 0x40, 0x06, 0x40, 0x80, 0xdb, 0x65, 0x5a, 0x2b, 0x80, 0xc1, 0x00,
+ 0x70, 0x30, 0xbf, 0x1f, 0x37, 0xfc, 0xed, 0xe5, 0x25, 0x02, 0xd2, 0x78,
+ 0x34, 0x76, 0x60, 0x78, 0x13, 0x43, 0x2e, 0x5f, 0x16, 0x31, 0x12, 0x74,
+ 0x07, 0x8e, 0x8e, 0x89, 0x70, 0x38, 0x93, 0x94, 0x91, 0x22, 0x97, 0x98,
+ 0x99, 0x9a, 0x0f, 0x11, 0x00, 0x3b
+};
+unsigned int ftv2link_gif_len = 234;
+
+unsigned char ftv2mlastnode_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x10, 0x00, 0x16, 0x00, 0xb3, 0x00,
+ 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x01, 0x00, 0x2c, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x16, 0x00, 0x00, 0x04, 0x2a, 0x30, 0xc8, 0x49,
+ 0xab, 0x95, 0xe0, 0xea, 0x7d, 0x33, 0xff, 0x15, 0x20, 0x8e, 0x63, 0x67,
+ 0x5a, 0x5e, 0x78, 0xaa, 0x68, 0x20, 0xbc, 0x6f, 0x90, 0xcd, 0x53, 0x4a,
+ 0xd9, 0xf5, 0x7a, 0xeb, 0x35, 0x49, 0x82, 0xc0, 0xa0, 0x70, 0x48, 0x2c,
+ 0x1a, 0x35, 0x11, 0x00, 0x3b
+};
+unsigned int ftv2mlastnode_gif_len = 125;
+
+unsigned char ftv2mnode_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x10, 0x00, 0x16, 0x00, 0xb3, 0x00,
+ 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
+ 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x16, 0x00, 0x00, 0x04, 0x2e, 0x70, 0xc9, 0x49,
+ 0xab, 0x95, 0xe0, 0xea, 0x7d, 0x33, 0xff, 0x15, 0x20, 0x8e, 0x63, 0x67,
+ 0x5a, 0x5e, 0x78, 0xaa, 0xe8, 0x22, 0xbc, 0xef, 0x92, 0xcd, 0x53, 0x4a,
+ 0xd9, 0xf5, 0x7a, 0xeb, 0x35, 0x49, 0x82, 0x40, 0x4c, 0x70, 0x28, 0x24,
+ 0x06, 0x71, 0xc6, 0x0d, 0x52, 0x12, 0x01, 0x00, 0x3b
+};
+unsigned int ftv2mnode_gif_len = 129;
+
+unsigned char ftv2node_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x10, 0x00, 0x16, 0x00, 0xb3, 0x00,
+ 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x21, 0xfe, 0x1c,
+ 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
+ 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
+ 0x20, 0x32, 0x2e, 0x30, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x16, 0x00, 0x40, 0x04, 0x20, 0xf0, 0xc9, 0x49, 0xab, 0xbd, 0x38, 0xeb,
+ 0xcd, 0xbb, 0xff, 0x60, 0x28, 0x72, 0xc0, 0x57, 0x7a, 0x67, 0x97, 0x92,
+ 0x4f, 0xe9, 0xb6, 0xd7, 0xba, 0xc9, 0x1a, 0x9d, 0xd9, 0x18, 0x1e, 0x63,
+ 0x11, 0x00, 0x3b
+};
+unsigned int ftv2node_gif_len = 147;
+
+unsigned char ftv2plastnode_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x10, 0x00, 0x16, 0x00, 0xb3, 0x00,
+ 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x01, 0x00, 0x2c, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x16, 0x00, 0x00, 0x04, 0x2f, 0x30, 0xc8, 0x49,
+ 0xab, 0x95, 0xe0, 0xea, 0x7d, 0x33, 0xff, 0x15, 0x20, 0x8e, 0x63, 0x67,
+ 0x5a, 0x5e, 0x20, 0x4c, 0x29, 0x95, 0xae, 0x98, 0x29, 0xcc, 0x73, 0x90,
+ 0xdd, 0xec, 0x04, 0xdb, 0xa7, 0x9a, 0xa3, 0x3d, 0x17, 0x89, 0x04, 0x2a,
+ 0x1a, 0x8f, 0xc8, 0xa4, 0x72, 0xa9, 0x89, 0x00, 0x00, 0x3b
+};
+unsigned int ftv2plastnode_gif_len = 130;
+
+unsigned char ftv2pnode_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x10, 0x00, 0x16, 0x00, 0xb3, 0x00,
+ 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
+ 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x00,
+ 0x00, 0x00, 0x10, 0x00, 0x16, 0x00, 0x00, 0x04, 0x32, 0x70, 0xc9, 0x49,
+ 0xab, 0x95, 0xe0, 0xea, 0x7d, 0x33, 0xff, 0x15, 0x20, 0x8e, 0x63, 0x67,
+ 0x5a, 0xde, 0x22, 0x4c, 0x29, 0x95, 0xae, 0x98, 0x29, 0xcc, 0xf3, 0x92,
+ 0xdd, 0xec, 0x04, 0xdb, 0xa7, 0x9a, 0xa3, 0x3d, 0x17, 0x89, 0x04, 0x2a,
+ 0xc6, 0x8c, 0x48, 0x5e, 0xd2, 0xd8, 0x5a, 0x72, 0x9a, 0x93, 0x08, 0x00,
+ 0x3b
+};
+unsigned int ftv2pnode_gif_len = 133;
+
+unsigned char ftv2vertline_gif[] = {
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x10, 0x00, 0x16, 0x00, 0xb3, 0x00,
+ 0x00, 0x80, 0x80, 0x80, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0xff, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x0f, 0x00, 0x21, 0xfe, 0x1c,
+ 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
+ 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
+ 0x20, 0x32, 0x2e, 0x30, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
+ 0x16, 0x00, 0x40, 0x04, 0x19, 0xf0, 0xc9, 0x49, 0xab, 0xbd, 0x38, 0xeb,
+ 0xcd, 0xbb, 0xff, 0x60, 0x28, 0x72, 0xc0, 0x57, 0x7a, 0x67, 0x97, 0x92,
+ 0x66, 0x8b, 0xba, 0x2a, 0x5c, 0x45, 0x00, 0x3b
+};
+unsigned int ftv2vertline_gif_len = 140;
+
+struct ImageInfo
+{
+ const char *name;
+ unsigned char *data;
+ unsigned int len;
+} image_info[] =
+{
+ { "ftv2blank.gif",ftv2blank_gif,ftv2blank_gif_len },
+ { "ftv2doc.gif",ftv2doc_gif,ftv2doc_gif_len },
+ { "ftv2folderclosed.gif",ftv2folderclosed_gif,ftv2folderclosed_gif_len },
+ { "ftv2folderopen.gif",ftv2folderopen_gif,ftv2folderopen_gif_len },
+ { "ftv2lastnode.gif",ftv2lastnode_gif,ftv2lastnode_gif_len },
+ { "ftv2link.gif",ftv2link_gif,ftv2link_gif_len },
+ { "ftv2mlastnode.gif",ftv2mlastnode_gif,ftv2mlastnode_gif_len },
+ { "ftv2mnode.gif",ftv2mnode_gif,ftv2mnode_gif_len },
+ { "ftv2node.gif",ftv2node_gif,ftv2node_gif_len },
+ { "ftv2plastnode.gif",ftv2plastnode_gif,ftv2plastnode_gif_len },
+ { "ftv2pnode.gif",ftv2pnode_gif,ftv2pnode_gif_len },
+ { "ftv2vertline.gif",ftv2vertline_gif,ftv2vertline_gif_len },
+ { 0,0,0 }
+};
+
+static void generateFolderTreeViewData()
+{
+ // Generate tree view script
+ QCString fileName=Config::htmlOutputDir+"/treeview.js";
+ QFile f(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ else
+ {
+ QTextStream t(&f);
+ t << treeview_data;
+ f.close();
+ }
+
+ // Generate alternative index.html as a frame
+ fileName=Config::htmlOutputDir+"/index.html";
+ f.setName(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ else
+ {
+ QTextStream t(&f);
+ t << "<html><head><title>" << Config::projectName << "</title></head>" << endl;
+ t << "<frameset cols=\"250,*\">" << endl;
+ t << " <frame src=\"tree.html\" name=\"treefrm\">" << endl;
+ t << " <frame src=\"main.html\" name=\"basefrm\">" << endl;
+ t << "</frameset>" << endl;
+ t << "</html>" << endl;
+ f.close();
+ }
+
+ // Generate tree view frame
+ fileName=Config::htmlOutputDir+"/tree.html";
+ f.setName(fileName);
+ if (!f.open(IO_WriteOnly))
+ {
+ err("Cannot open file %s for writing!\n",fileName.data());
+ return;
+ }
+ else
+ {
+ QTextStream t(&f);
+ t << "<html><head>" << endl;
+ t << "<link rel=\"stylesheet\" href=\"doxygen.css\">" << endl;
+ t << "<script src=\"treeview.js\"></script>" << endl;
+ t << "<script src=\"tree.js\"></script>" << endl;
+ t << "<script>" << endl;
+ t << "initializeDocument()" << endl;
+ t << "</script>" << endl;
+ t << "</head>" << endl;
+ t << "<body bgcolor=\"#ffffff\">" << endl;
+ t << "</body>" << endl;
+ t << "</html>" << endl;
+ f.close();
+ }
+
+ // Generate tree view images
+ ImageInfo *p = image_info;
+ while (p->name)
+ {
+ QCString fileName=Config::htmlOutputDir+"/"+p->name;
+ QFile f(fileName);
+ if (f.open(IO_WriteOnly))
+ f.writeBlock((char *)p->data,p->len);
+ else
+ {
+ fprintf(stderr,"Warning: Cannot open file %s for writing\n",fileName.data());
+ }
+ f.close();
+ p++;
+ }
+}
+
+//----------------------------------------------------------------------------
+
+FTVHelp *FTVHelp::m_theInstance = 0;
+
+/*! Construm_cts an ftv help object.
+ * The object has to be \link initialize() initialized\endlink before it can
+ * be used.
+ */
+FTVHelp::FTVHelp()
+{
+ /* initial depth */
+ m_dc = 0;
+ m_cf = 0;
+}
+
+/*! return a reference to the one and only instance of this class.
+ */
+FTVHelp *FTVHelp::getInstance()
+{
+ if (m_theInstance==0) m_theInstance = new FTVHelp;
+ return m_theInstance;
+}
+
+/*! This will create a folder tree view table of contents file (tree.js).
+ * \sa finalize()
+ */
+void FTVHelp::initialize()
+{
+ /* open the contents file */
+ QCString fName = Config::htmlOutputDir + "/tree.js";
+ m_cf = new QFile(fName);
+ if (!m_cf->open(IO_WriteOnly))
+ {
+ err("Could not open file %s for writing\n",fName.data());
+ exit(1);
+ }
+ /* Write the header of the contents file */
+ m_cts.setDevice(m_cf);
+ m_cts << "foldersTree = gFld(\"<b>";
+ if (Config::projectName.isEmpty())
+ {
+ m_cts << "Root";
+ }
+ else
+ {
+ m_cts << Config::projectName;
+ }
+ m_cts << "</b>\", \"\")\n";
+}
+
+/*! Finalizes the FTV help. This will finish and close the
+ * contents file (index.js).
+ * \sa initialize()
+ */
+void FTVHelp::finalize()
+{
+ m_cts.unsetDevice();
+ m_cf->close();
+ delete m_cf;
+ generateFolderTreeViewData();
+}
+
+/*! Increase the level of the contents hierarchy.
+ * This will start a new sublist in contents file.
+ * \sa decContentsDepth()
+ */
+int FTVHelp::incContentsDepth()
+{
+ //int i; for (i=0;i<m_dc+1;i++) m_cts << " ";
+ return ++m_dc;
+}
+
+/*! Decrease the level of the contents hierarchy.
+ * This will end the current sublist.
+ * \sa incContentsDepth()
+ */
+int FTVHelp::decContentsDepth()
+{
+ //int i; for (i=0;i<m_dc;i++) m_cts << " ";
+ return --m_dc;
+}
+
+/*! Add a list item to the contents file.
+ * \param isDir TRUE if the item is a directory, FALSE if it is a text
+ * \param name the name of the item.
+ * \param ref the URL of to the item.
+ */
+void FTVHelp::addContentsItem(bool isDir,const char *name,const char *ref,
+ const char *anchor)
+{
+ int i; for (i=0;i<m_dc;i++) m_cts << " ";
+ QCString parent;
+ if (m_dc==0) parent="foldersTree"; else parent.sprintf("aux%d",m_dc);
+ if (isDir) // directory entry
+ {
+ m_cts << "aux" << m_dc+1 << " = insFld(" << parent << ", gFld(\"" << name << "\", ";
+ if (ref) // ref optional param
+ {
+ m_cts << "\"" << ref << ".html\"))";
+ }
+ else
+ {
+ m_cts << "\"\"))";
+ }
+ }
+ else // text entry
+ {
+ m_cts << " insDoc(" << parent << ", gLnk(0, \"" << name << "\", ";
+ if (ref) // ref optional param
+ {
+ m_cts << "\"" << ref << ".html";
+ if (anchor) m_cts << "#" << anchor;
+ m_cts << "\"))";
+ }
+ else
+ {
+ m_cts << "\"\"))";
+ }
+ }
+ m_cts << "\n";
+}
+
diff --git a/src/ftvhelp.h b/src/ftvhelp.h
new file mode 100644
index 0000000..4e58ce1
--- /dev/null
+++ b/src/ftvhelp.h
@@ -0,0 +1,47 @@
+/******************************************************************************
+ * ftvhelp.h,v 1.0 2000/09/06 16:09:00
+ *
+ * Kenney Wong <kwong@ea.com>
+ *
+ * Folder Tree View for offline help on browsers that do not support HTML Help.
+ * Uses the FTV structure from:
+ * http://www.geocities.com/Paris/LeftBank/2178/ftexample.html
+ */
+
+#ifndef FTVHELP_H
+#define FTVHELP_H
+
+#include "qtbc.h"
+#include <qtextstream.h>
+
+class QFile;
+
+/*! A class that generated the FTV Help specific file.
+ * This file is used in conjunction with additional FTV web browser code
+ * that can be obtained from:
+ * http://www.geocities.com/Paris/LeftBank/2178/ftexample.html
+ */
+class FTVHelp
+{
+ public:
+ static FTVHelp *getInstance();
+ void initialize();
+ void finalize();
+ int incContentsDepth();
+ int decContentsDepth();
+ /*! return the current depth of the contents tree */
+ int contentsDepth() { return m_dc; }
+ void addContentsItem(bool isDir,
+ const char *name, const char *ref = 0,
+ const char *anchor = 0);
+
+ private:
+ FTVHelp();
+ QFile *m_cf;
+ QTextStream m_cts;
+ int m_dc;
+ static FTVHelp *m_theInstance;
+};
+
+#endif /* FTVHELP_H */
+
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 3217c13..054222a 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -30,6 +30,7 @@
#include "message.h"
#include "membergroup.h"
#include "doxygen.h"
+#include "page.h"
GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t) :
Definition(df,dl,na)
@@ -38,7 +39,8 @@ GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t) :
classList = new ClassList;
groupList = new GroupList;
namespaceList = new NamespaceList;
-
+ pageDict = new PageSDict(257);
+ exampleDict = new PageSDict(257);
allMemberList = new MemberList;
allMemberDict = new QDict<MemberDef>;
if (t)
@@ -52,6 +54,8 @@ GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t) :
memberGroupList = new MemberGroupList;
memberGroupList->setAutoDelete(TRUE);
memberGroupDict = new MemberGroupDict(1009);
+
+ visited = 0;
}
GroupDef::~GroupDef()
@@ -60,6 +64,8 @@ GroupDef::~GroupDef()
delete classList;
delete groupList;
delete namespaceList;
+ delete pageDict;
+ delete exampleDict;
delete allMemberList;
delete allMemberDict;
delete memberGroupList;
@@ -100,6 +106,17 @@ void GroupDef::addNamespace(const NamespaceDef *def)
namespaceList->append(def);
}
+void GroupDef::addPage(PageInfo *def)
+{
+ pageDict->append(def->name,def);
+ def->inGroup = this;
+}
+
+void GroupDef::addExample(const PageInfo *def)
+{
+ exampleDict->append(def->name,def);
+}
+
void GroupDef::addMemberListToGroup(MemberList *ml,
bool (MemberDef::*func)() const)
{
@@ -214,7 +231,9 @@ int GroupDef::countMembers() const
classList->count()+
namespaceList->count()+
groupList->count()+
- allMemberList->count();
+ allMemberList->count()+
+ pageDict->count()+
+ exampleDict->count();
}
/*! Compute the HTML anchor names for all members in the class */
@@ -249,6 +268,8 @@ void GroupDef::writeDocumentation(OutputList &ol)
//ol.enable(OutputGenerator::Latex);
ol.popGeneratorState();
}
+
+
ol.startMemberSections();
if (fileList->count()>0)
{
@@ -340,31 +361,59 @@ void GroupDef::writeDocumentation(OutputList &ol)
allMemberList->writeDeclarations(ol,0,0,0,this,0,0);
}
ol.endMemberSections();
- //int dl=doc.length();
- //doc=doc.stripWhiteSpace();
+
+
if (!briefDescription().isEmpty() || !documentation().isEmpty())
{
- ol.writeRuler();
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- ol.writeAnchor(0,"_details");
- ol.popGeneratorState();
- ol.startGroupHeader();
- parseText(ol,theTranslator->trDetailedDescription());
- ol.endGroupHeader();
- // repeat brief description
- if (!briefDescription().isEmpty())
+
+ if (pageDict->count()!=countMembers()) // classical layout
{
- ol+=briefOutput;
- ol.newParagraph();
+ ol.writeRuler();
+ ol.pushGeneratorState();
+ ol.disable(OutputGenerator::Latex);
+ ol.disable(OutputGenerator::RTF);
+ ol.writeAnchor(0,"_details");
+ ol.popGeneratorState();
+ ol.startGroupHeader();
+ parseText(ol,theTranslator->trDetailedDescription());
+ ol.endGroupHeader();
+
+ // repeat brief description
+ if (!briefDescription().isEmpty() && Config::repeatBriefFlag)
+ {
+ ol+=briefOutput;
+ ol.newParagraph();
+ }
}
+
// write documentation
if (!documentation().isEmpty())
{
parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
}
}
+ PageInfo *pi=0;
+ PageSDictIterator pdi(*pageDict);
+ for (pdi.toFirst();(pi=pdi.current());++pdi)
+ {
+ QCString pageName;
+ if (Config::caseSensitiveNames)
+ pageName=pi->name.copy();
+ else
+ pageName=pi->name.lower();
+
+ SectionInfo *si=0;
+ if (!pi->title.isEmpty() && !pi->name.isEmpty() &&
+ (si=sectionDict[pi->name])!=0)
+ {
+ ol.startSection(si->label,si->title,TRUE);
+ ol.docify(si->title);
+ ol.endSection(si->label,TRUE);
+ }
+ ol.startTextBlock();
+ parseDoc(ol,pi->defFileName,pi->defLine,0,0,pi->doc);
+ ol.endTextBlock();
+ }
defineMembers.countDocMembers(TRUE);
if (defineMembers.totalCount()>0 )
@@ -507,3 +556,20 @@ void addMemberToGroups(Entry *root,MemberDef *md)
}
}
+
+void addExampleToGroups(Entry *root,PageInfo *eg)
+{
+ QListIterator<QCString> sli(*root->groups);
+ QCString *s;
+ for (;(s=sli.current());++sli)
+ {
+ GroupDef *gd=0;
+ if (!s->isEmpty() && (gd=groupDict[*s]))
+ {
+ gd->addExample(eg);
+ //printf("Example %s: in group %s\n",eg->name().data(),s->data());
+ }
+ }
+}
+
+
diff --git a/src/groupdef.h b/src/groupdef.h
index 385c6e5..b8aaa40 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -24,6 +24,7 @@
#include "definition.h"
#include "memberlist.h"
#include "memberdef.h"
+#include "htmlhelp.h"
class FileList;
class ClassList;
@@ -35,6 +36,8 @@ class OutputList;
class NamespaceList;
class MemberGroupList;
class MemberGroupDict;
+class PageSDict;
+class PageInfo;
class GroupDef : public Definition
{
@@ -48,6 +51,8 @@ class GroupDef : public Definition
void addClass(const ClassDef *def);
void addNamespace(const NamespaceDef *def);
void addGroup(const GroupDef *def);
+ void addPage(PageInfo *def); // pages in this group
+ void addExample(const PageInfo *def); // examples in this group
void insertMember(MemberDef *def);
void writeDocumentation(OutputList &ol);
int countMembers() const;
@@ -64,6 +69,10 @@ class GroupDef : public Definition
void addMembersToMemberGroup();
void distributeMemberGroupDocumentation();
+ bool visited; // number of times accessed for output - KPW
+
+ friend void writeGroupTreeNode(OutputList&, GroupDef*); // make accessible for writing tree view of group in index.cpp - KPW
+
protected:
void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
@@ -74,6 +83,8 @@ class GroupDef : public Definition
ClassList *classList; // list of classes in the group
NamespaceList *namespaceList; // list of namespaces in the group
GroupList *groupList; // list of sub groups.
+ PageSDict *pageDict; // list of pages in the group
+ PageSDict *exampleDict; // list of examples in the group
MemberList *allMemberList; // list of all members in the group
QDict<MemberDef> *allMemberDict;
@@ -107,5 +118,8 @@ void addClassToGroups(Entry *root,ClassDef *cd);
void addNamespaceToGroups(Entry *root,NamespaceDef *nd);
void addGroupToGroups(Entry *root,GroupDef *subGroup);
void addMemberToGroups(Entry *root,MemberDef *md);
+void addPageToGroups(Entry *root,PageInfo *pi);
+void addExampleToGroups(Entry *root,PageInfo *eg);
#endif
+
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 1b93b5a..a962d9f 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -60,8 +60,6 @@ static const char *defaultStyleSheet =
"FONT.charliteral { color: #008080 }\n";
-HtmlHelp *HtmlGenerator::htmlHelp = 0;
-
HtmlGenerator::HtmlGenerator() : OutputGenerator()
{
if (!Config::headerFile.isEmpty()) header=fileToString(Config::headerFile);
diff --git a/src/htmlgen.h b/src/htmlgen.h
index fbe3468..0f3b588 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -22,7 +22,6 @@
#include "outputgen.h"
class QFile;
-class HtmlHelp;
class HtmlGenerator : public OutputGenerator
{
@@ -249,7 +248,6 @@ class HtmlGenerator : public OutputGenerator
HtmlGenerator &operator=(const HtmlGenerator &g);
HtmlGenerator(const HtmlGenerator &g);
- static HtmlHelp *htmlHelp;
int col;
};
diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp
index 064aec2..1802a48 100644
--- a/src/htmlhelp.cpp
+++ b/src/htmlhelp.cpp
@@ -267,7 +267,7 @@ void HtmlHelp::initialize()
cts << "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n"
"<HTML><HEAD></HEAD><BODY>\n"
"<OBJECT type=\"text/site properties\">\n"
- "<param name=\"ImageType\" value=\"Folder\">\n"
+ "<param name=\"FrameName\" value=\"right\">\n"
"</OBJECT>\n"
"<UL>\n";
@@ -284,7 +284,7 @@ void HtmlHelp::initialize()
kts << "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n"
"<HTML><HEAD></HEAD><BODY>\n"
"<OBJECT type=\"text/site properties\">\n"
- "<param name=\"ImageType\" value=\"Folder\">\n"
+ "<param name=\"FrameName\" value=\"right\">\n"
"</OBJECT>\n"
"<UL>\n";
}
@@ -297,19 +297,21 @@ void HtmlHelp::createProjectFile()
if (f.open(IO_WriteOnly))
{
QTextStream t(&f);
+ QCString indexName="index.html";
+ if (Config::ftvHelpFlag) indexName="main.html";
t << "[OPTIONS]\n"
"Compatibility=1.1\n"
"Full-text search=Yes\n"
"Contents file=index.hhc\n"
"Default Window=main\n"
- "Default topic=index.html\n"
+ "Default topic=" << indexName << "\n"
"Index file=index.hhk\n"
"Title=" << Config::projectName << endl << endl;
t << "[WINDOWS]" << endl;
t << "main=\"" << Config::projectName << "\",\"index.hhc\","
- "\"index.hhk\",\"index.html\",\"index.html\",,,,,0x23520,,"
- "0x3006,,,,,,,,0" << endl << endl;
+ "\"index.hhk\",\"" << indexName << "\",\"" <<
+ indexName << "\",,,,,0x23520,,0x3006,,,,,,,,0" << endl << endl;
t << "[FILES]" << endl;
char *s = indexFiles.first();
@@ -380,19 +382,30 @@ int HtmlHelp::decContentsDepth()
* \param name the name of the item.
* \param ref the URL of to the item.
*/
-void HtmlHelp::addContentsItem(const char *name,const char *ref,
+void HtmlHelp::addContentsItem(bool isDir,
+ const char *name,const char *ref,
const char *anchor)
{
int i; for (i=0;i<dc;i++) cts << " ";
cts << "<LI><OBJECT type=\"text/sitemap\">";
- if (ref)
+ cts << "<param name=\"Name\" value=\"" << name << "\">";
+ if (ref) // made ref optional param - KPW
{
cts << "<param name=\"Local\" value=\"" << ref << ".html";
if (anchor) cts << "#" << anchor;
cts << "\">";
}
- cts << "<param name=\"Name\" value=\"" << name << "\">"
- "</OBJECT>\n";
+ cts << "<param name=\"ImageNumber\" value=\"";
+ if (isDir) // added - KPW
+ {
+ cts << (int)BOOK_CLOSED ;
+ }
+ else
+ {
+ cts << (int)TEXT;
+ }
+ cts << "\">";
+ cts << "</OBJECT>\n";
}
/*! Add an list item to the index file.
@@ -406,3 +419,4 @@ void HtmlHelp::addIndexItem(const char *level1, const char *level2,
index->addItem(level1,level2,ref,anchor,TRUE);
index->addItem(level2,level1,ref,anchor,FALSE);
}
+
diff --git a/src/htmlhelp.h b/src/htmlhelp.h
index e6db9c3..cb899c6 100644
--- a/src/htmlhelp.h
+++ b/src/htmlhelp.h
@@ -34,6 +34,32 @@ class HtmlHelpIndex;
*/
class HtmlHelp
{
+ /*! used in imageNumber param of HTMLHelp::addContentsItem() function
+ to specify document icon in tree view.
+ Writes <param name="ImageNumber" value="xx"> in .HHC file. */
+ enum ImageNumber {
+ BOOK_CLOSED=1, BOOK_OPEN,
+ BOOK_CLOSED_NEW, BOOK_OPEN_NEW,
+ FOLDER_CLOSED, FOLDER_OPEN,
+ FOLDER_CLOSED_NEW,FOLDER_OPEN_NEW,
+ QUERY, QUERY_NEW,
+ TEXT, TEXT_NEW,
+ WEB_DOC, WEB_DOC_NEW,
+ WEB_LINK, WEB_LINK_NEW,
+ INFO, INFO_NEW,
+ LINK, LINK_NEW,
+ BOOKLET, BOOKLET_NEW,
+ EMAIL, EMAIL_NEW,
+ EMAIL2, EMAIL2_NEW,
+ IMAGE, IMAGE_NEW,
+ AUDIO, AUDIO_NEW,
+ MUSIC, MUSIC_NEW,
+ VIDEO, VIDEO_NEW,
+ INDEX, INDEX_NEW,
+ IDEA, IDEA_NEW,
+ NOTE, NOTE_NEW,
+ TOOL, TOOL_NEW
+ };
public:
static HtmlHelp *getInstance();
void initialize();
@@ -42,12 +68,16 @@ class HtmlHelp
int decContentsDepth();
/*! return the current depth of the contents tree */
int contentsDepth() { return dc; }
- void addContentsItem(const char *name, const char *ref,
+ // added imageNumber - KPW
+ void addContentsItem(bool isDir,
+ const char *name,
+ const char *ref = 0,
const char *anchor = 0);
void addIndexItem(const char *level1, const char *level2,
const char *ref, const char *anchor);
void addIndexFile(const char *name);
+
private:
void createProjectFile();
@@ -61,3 +91,4 @@ class HtmlHelp
};
#endif /* HTMLHELP_H */
+
diff --git a/src/index.cpp b/src/index.cpp
index 41f8636..9df60ad 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -33,6 +33,7 @@
#include "groupdef.h"
#include "language.h"
#include "htmlhelp.h"
+#include "ftvhelp.h"
#include "dot.h"
#include "page.h"
@@ -101,11 +102,17 @@ QCString abbreviate(const char *s,const char *name)
void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
{
HtmlHelp *htmlHelp=0;
- bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
- if (Config::generateHtml && Config::htmlHelpFlag)
+ FTVHelp *ftvHelp=0;
+ bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+ if (hasHtmlHelp)
{
htmlHelp = HtmlHelp::getInstance();
}
+ if (hasFtvHelp)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ }
BaseClassListIterator bcli(*bcl);
bool started=FALSE;
for ( ; bcli.current() ; ++bcli)
@@ -117,9 +124,11 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
{
ol.startIndexList();
if (hasHtmlHelp) htmlHelp->incContentsDepth();
+ if (hasFtvHelp) ftvHelp->incContentsDepth();
started=TRUE;
}
//printf("Passed...\n");
+ bool hasChildren = !cd->visited && !hideSuper && cd->superClasses()->count()>0;
if (cd->isLinkable())
{
ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->displayName());
@@ -131,19 +140,26 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
}
if (hasHtmlHelp)
{
- htmlHelp->addContentsItem(cd->name(),cd->getOutputFileBase());
+ htmlHelp->addContentsItem(hasChildren,cd->name(),cd->getOutputFileBase());
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp->addContentsItem(hasChildren,cd->name(),cd->getOutputFileBase());
}
}
else
{
ol.writeIndexItem(0,0,cd->name());
- //if (hasHtmlHelp) htmlHelp->addContentsItem(cd->name(),"nodoc");
if (hasHtmlHelp)
{
- htmlHelp->addContentsItem(cd->name(),0);
+ htmlHelp->addContentsItem(hasChildren,cd->name(),0);
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp->addContentsItem(hasChildren,cd->name(),0);
}
}
- if (!cd->visited && !hideSuper && cd->superClasses()->count()>0)
+ if (hasChildren)
{
//printf("Class %s at %p visited=%d\n",cd->name().data(),cd,cd->visited);
bool wasVisited=cd->visited;
@@ -156,8 +172,117 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
{
ol.endIndexList();
if (hasHtmlHelp) htmlHelp->decContentsDepth();
+ if (hasFtvHelp) ftvHelp->decContentsDepth();
+ }
+}
+
+
+#if 0
+//----------------------------------------------------------------------------
+/*! Generates HTML Help tree of classes */
+
+void writeClassTree(BaseClassList *cl)
+{
+ HtmlHelp *htmlHelp=0;
+ FTVHelp *ftvHelp=0;
+ bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag && Config::htmlHelpGroupsOnly;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag && Config::htmlHelpGroupsOnly;
+ if (hasHtmlHelp)
+ {
+ htmlHelp = HtmlHelp::getInstance();
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ }
+ BaseClassListIterator cli(*cl);
+ bool started=FALSE;
+ for ( ; cli.current() ; ++cli)
+ {
+ ClassDef *cd=cli.current()->classDef;
+ if (cd->isVisibleInHierarchy() && !cd->visited)
+ {
+ if (!started)
+ {
+ if (hasHtmlHelp) htmlHelp->incContentsDepth();
+ if (hasFtvHelp) ftvHelp->incContentsDepth();
+ started=TRUE;
+ }
+ bool hasChildren = cd->superClasses()->count()>0;
+ if (cd->isLinkable())
+ {
+ if (hasHtmlHelp)
+ {
+ htmlHelp->addContentsItem(hasChildren,cd->name(),cd->getOutputFileBase());
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp->addContentsItem(hasChildren,cd->name(),cd->getOutputFileBase());
+ }
+ }
+ if (hasChildren)
+ {
+ writeClassTree(cd->superClasses());
+ }
+ cd->visited=TRUE;
+ }
+ }
+ if (started)
+ {
+ if (hasHtmlHelp) htmlHelp->decContentsDepth();
+ if (hasFtvHelp) ftvHelp->decContentsDepth();
+ }
+}
+
+//----------------------------------------------------------------------------
+/*! Generates HTML Help tree of classes */
+
+void writeClassTree(ClassList *cl)
+{
+ HtmlHelp *htmlHelp=0;
+ FTVHelp *ftvHelp=0;
+ bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag && Config::htmlHelpGroupsOnly;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag && Config::htmlHelpGroupsOnly;
+ if (hasHtmlHelp)
+ {
+ htmlHelp = HtmlHelp::getInstance();
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ }
+ ClassListIterator cli(*cl);
+ bool started=FALSE;
+ for ( ; cli.current() ; ++cli)
+ {
+ ClassDef *cd=cli.current();
+ if (cd->isVisibleInHierarchy() && !cd->visited)
+ {
+ if (!started)
+ {
+ started=TRUE;
+ }
+ bool hasChildren = cd->superClasses()->count()>0;
+ if (cd->isLinkable())
+ {
+ if (hasHtmlHelp)
+ {
+ htmlHelp->addContentsItem(hasChildren,cd->name(),cd->getOutputFileBase());
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp->addContentsItem(hasChildren,cd->name(),cd->getOutputFileBase());
+ }
+ }
+ if (hasChildren)
+ {
+ writeClassTree(cd->superClasses());
+ }
+ cd->visited=TRUE;
+ }
}
}
+#endif
//----------------------------------------------------------------------------
@@ -166,11 +291,17 @@ void writeClassHierarchy(OutputList &ol)
initClassHierarchy(&classList);
HtmlHelp *htmlHelp=0;
- bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
- if (Config::generateHtml && Config::htmlHelpFlag)
+ FTVHelp *ftvHelp=0;
+ bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+ if (hasHtmlHelp)
{
htmlHelp = HtmlHelp::getInstance();
}
+ if (hasFtvHelp)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ }
bool started=FALSE;
ClassListIterator cli(classList);
@@ -190,8 +321,10 @@ void writeClassHierarchy(OutputList &ol)
{
ol.startIndexList();
if (hasHtmlHelp) htmlHelp->incContentsDepth();
+ if (hasFtvHelp) ftvHelp->incContentsDepth();
started=TRUE;
}
+ bool hasChildren = !cd->visited && cd->superClasses()->count()>0;
if (cd->isLinkable())
{
ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->displayName());
@@ -203,20 +336,26 @@ void writeClassHierarchy(OutputList &ol)
}
if (hasHtmlHelp)
{
- htmlHelp->addContentsItem(cd->name(),cd->getOutputFileBase());
- //cd->writeMembersToContents();
+ htmlHelp->addContentsItem(hasChildren,cd->name(),cd->getOutputFileBase());
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp->addContentsItem(hasChildren,cd->name(),cd->getOutputFileBase());
}
}
else
{
ol.writeIndexItem(0,0,cd->displayName());
- //if (hasHtmlHelp) htmlHelp->addContentsItem(cd->name(),"nodoc");
if (hasHtmlHelp)
{
- htmlHelp->addContentsItem(cd->name(),0);
+ htmlHelp->addContentsItem(hasChildren,cd->name(),0);
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp->addContentsItem(hasChildren,cd->name(),0);
}
}
- if (!cd->visited && cd->superClasses()->count()>0)
+ if (hasChildren)
{
writeClassTree(ol,cd->superClasses(),cd->visited);
cd->visited=TRUE;
@@ -228,6 +367,7 @@ void writeClassHierarchy(OutputList &ol)
{
ol.endIndexList();
if (hasHtmlHelp) htmlHelp->decContentsDepth();
+ if (hasFtvHelp) ftvHelp->decContentsDepth();
}
}
@@ -256,15 +396,23 @@ void writeHierarchicalIndex(OutputList &ol)
startFile(ol,"hierarchy","Hierarchical Index");
startTitle(ol,0);
QCString title = theTranslator->trClassHierarchy();
+ QCString htmlHelpTitle = title;
+ QCString ftvHelpTitle = title;
if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
parseText(ol,title);
endTitle(ol,0,0);
ol.startTextBlock();
HtmlHelp *htmlHelp = 0;
- if (Config::generateHtml && Config::htmlHelpFlag)
+ FTVHelp *ftvHelp = 0;
+ if (Config::generateHtml && Config::htmlHelpFlag /*&& !Config::htmlHelpGroupsOnly*/)
{
htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(title,"hierarchy");
+ htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"hierarchy");
+ }
+ if (Config::generateHtml && Config::ftvHelpFlag /*&& !Config::htmlHelpGroupsOnly*/)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ ftvHelp->addContentsItem(TRUE,ftvHelpTitle,"hierarchy");
}
if (Config::haveDotFlag && Config::gfxHierarchyFlag)
{
@@ -295,21 +443,29 @@ void writeGraphicalClassHierarchy(OutputList &ol)
startFile(ol,"inherits","Graphical Class Hierarchy");
startTitle(ol,0);
QCString title = theTranslator->trGraphicalHierarchy();
+ QCString htmlHelpTitle = title;
+ QCString ftvHelpTitle = title;
if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
parseText(ol,title);
endTitle(ol,0,0);
ol.startTextBlock();
HtmlHelp *htmlHelp = 0;
+ FTVHelp *ftvHelp = 0;
if (Config::generateHtml && Config::htmlHelpFlag)
{
htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(title,"inherits");
+ htmlHelp->addContentsItem(FALSE,htmlHelpTitle,"inherits");
+ }
+ if (Config::generateHtml && Config::ftvHelpFlag)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ ftvHelp->addContentsItem(FALSE,ftvHelpTitle,"inherits");
}
ol.startTextLink("hierarchy",0);
parseText(ol,theTranslator->trGotoTextualHierarchy());
ol.endTextLink();
ol.newParagraph();
- parseText(ol,theTranslator->trClassHierarchyDescription());
+ //parseText(ol,theTranslator->trClassHierarchyDescription());
//ol.newParagraph();
ol.endTextBlock();
DotGfxHierarchyTable g;
@@ -363,18 +519,28 @@ void writeFileIndex(OutputList &ol)
startFile(ol,"files","File Index");
startTitle(ol,0);
QCString title = theTranslator->trFileList();
+ QCString htmlHelpTitle = title;
+ QCString ftvHelpTitle = title;
if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
parseText(ol,title);
endTitle(ol,0,0);
ol.startTextBlock();
HtmlHelp *htmlHelp = 0;
- bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
+ FTVHelp *ftvHelp = 0;
+ bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
if (hasHtmlHelp)
{
htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(title,"files");
+ htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"files");
htmlHelp->incContentsDepth();
}
+ if (hasFtvHelp)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ ftvHelp->addContentsItem(TRUE,ftvHelpTitle,"files");
+ ftvHelp->incContentsDepth();
+ }
//ol.newParagraph();
parseText(ol,theTranslator->trFileListDescription(Config::extractAllFlag));
//ol.newParagraph();
@@ -468,7 +634,11 @@ void writeFileIndex(OutputList &ol)
ol.writeObjectLink(0,fd->getOutputFileBase(),0,fd->name());
if (hasHtmlHelp)
{
- htmlHelp->addContentsItem(fd->name(),fd->getOutputFileBase());
+ htmlHelp->addContentsItem(FALSE,fd->name(),fd->getOutputFileBase());
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp->addContentsItem(FALSE,fd->name(),fd->getOutputFileBase());
}
}
else
@@ -476,6 +646,14 @@ void writeFileIndex(OutputList &ol)
ol.startBold();
ol.docify(fd->name());
ol.endBold();
+ if (hasHtmlHelp)
+ {
+ htmlHelp->addContentsItem(FALSE,fd->name(),0);
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp->addContentsItem(FALSE,fd->name(),0);
+ }
}
if (src)
{
@@ -499,7 +677,6 @@ void writeFileIndex(OutputList &ol)
}
ol.popGeneratorState();
// --------------------------------------------------------
-
}
fd=fl->next();
}
@@ -510,79 +687,14 @@ void writeFileIndex(OutputList &ol)
{
htmlHelp->decContentsDepth();
}
- endFile(ol);
- //ol.enable(OutputGenerator::Man);
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------------
-#if 0
-void writeSourceIndex(OutputList &ol)
-{
- ol.disableAllBut(OutputGenerator::Html);
- startFile(ol,"sources","Source Index");
- startTitle(ol,0);
- QCString title = theTranslator->trSources();
- if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
- parseText(ol,title);
- endTitle(ol,0,0);
- ol.startTextBlock();
- HtmlHelp *htmlHelp = 0;
- bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
- if (hasHtmlHelp)
+ if (hasFtvHelp)
{
- htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(title,"sources");
- htmlHelp->incContentsDepth();
- }
- //ol.newParagraph();
- //parseText(ol,theTranslator->trFileListDescription(Config::extractAllFlag));
- //ol.newParagraph();
- ol.endTextBlock();
-
- //ol.startIndexList();
- bool started=FALSE;
- FileName *fn=inputNameList.first();
- while (fn)
- {
- FileDef *fd=fn->first();
- while (fd)
- {
- if (!fd->isReference())
- {
- if (!started)
- {
- started=TRUE;
- ol.startItemList();
- }
- ol.writeListItem();
- QCString path;
- if (Config::fullPathNameFlag)
- {
- path=stripFromPath(fd->getPath().copy());
- }
- if (!path.isEmpty()) ol.docify(path);
- ol.writeObjectLink(0,fd->sourceName(),0,fd->name());
- ol.writeString("\n");
- if (Config::generateHtml && Config::htmlHelpFlag)
- {
- HtmlHelp::getInstance()->addContentsItem(
- fd->name(),fd->sourceName());
- }
- }
- fd=fn->next();
- }
- fn=inputNameList.next();
- }
- if (started) ol.endItemList();
- if (hasHtmlHelp)
- {
- htmlHelp->decContentsDepth();
+ ftvHelp->decContentsDepth();
}
endFile(ol);
- ol.enable(OutputGenerator::Man);
+ //ol.enable(OutputGenerator::Man);
+ ol.popGeneratorState();
}
-#endif
//----------------------------------------------------------------------------
int countNamespaces()
@@ -607,18 +719,28 @@ void writeNamespaceIndex(OutputList &ol)
startFile(ol,"namespaces","Namespace Index");
startTitle(ol,0);
QCString title = theTranslator->trNamespaceList();
+ QCString htmlHelpTitle = title;
+ QCString ftvHelpTitle = title;
if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
parseText(ol,title);
endTitle(ol,0,0);
ol.startTextBlock();
HtmlHelp *htmlHelp = 0;
- bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
+ FTVHelp *ftvHelp = 0;
+ bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
if (hasHtmlHelp)
{
htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(title,"namespaces");
+ htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"namespaces");
htmlHelp->incContentsDepth();
}
+ if (hasFtvHelp)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ ftvHelp->addContentsItem(TRUE,ftvHelpTitle,"namespaces");
+ ftvHelp->incContentsDepth();
+ }
//ol.newParagraph();
parseText(ol,theTranslator->trNamespaceListDescription(Config::extractAllFlag));
//ol.newParagraph();
@@ -628,7 +750,7 @@ void writeNamespaceIndex(OutputList &ol)
NamespaceDef *nd=namespaceList.first();
while (nd)
{
- if (nd->isLinkableInProject())
+ if (nd->isLinkableInProject() && nd->countMembers()>0)
{
ol.writeStartAnnoItem("namespace",nd->getOutputFileBase(),0,nd->name());
if (!nd->briefDescription().isEmpty())
@@ -642,16 +764,14 @@ void writeNamespaceIndex(OutputList &ol)
ol+=briefOutput;
ol.docify(")");
}
- //else
- //{
- // ol.startEmphasis();
- // parseText(ol,theTranslator->trNoDescriptionAvailable());
- // ol.endEmphasis();
- //}
ol.writeEndAnnoItem(nd->getOutputFileBase());
if (hasHtmlHelp)
{
- htmlHelp->addContentsItem(nd->name(),nd->getOutputFileBase());
+ htmlHelp->addContentsItem(FALSE,nd->name(),nd->getOutputFileBase());
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp->addContentsItem(FALSE,nd->name(),nd->getOutputFileBase());
}
}
nd=namespaceList.next();
@@ -661,6 +781,10 @@ void writeNamespaceIndex(OutputList &ol)
{
htmlHelp->decContentsDepth();
}
+ if (hasFtvHelp)
+ {
+ ftvHelp->decContentsDepth();
+ }
endFile(ol);
//ol.enable(OutputGenerator::Man);
ol.popGeneratorState();
@@ -689,6 +813,8 @@ int countAnnotatedClasses()
void writeAnnotatedClassList(OutputList &ol)
{
+ bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
ol.startIndexList();
//ClassDef *cd=classList.first();
//while (cd)
@@ -718,18 +844,14 @@ void writeAnnotatedClassList(OutputList &ol)
ol+=briefOutput;
ol.docify(")");
}
- //else
- //{
- // ol.startEmphasis();
- // parseText(ol,theTranslator->trNoDescriptionAvailable());
- // ol.endEmphasis();
- //}
ol.writeEndAnnoItem(cd->getOutputFileBase());
- if (Config::generateHtml && Config::htmlHelpFlag)
+ if (hasHtmlHelp)
{
- HtmlHelp::getInstance()->addContentsItem(
- cd->name(),cd->getOutputFileBase());
- //cd->writeMembersToContents();
+ HtmlHelp::getInstance()->addContentsItem(FALSE,cd->name(),cd->getOutputFileBase());
+ }
+ if (hasFtvHelp)
+ {
+ FTVHelp::getInstance()->addContentsItem(FALSE,cd->name(),cd->getOutputFileBase());
}
}
cd=classList.next();
@@ -910,6 +1032,9 @@ void writeAlphabeticalIndex(OutputList &ol)
void writeAnnotatedIndex(OutputList &ol)
{
+ bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+
if (annotatedClasses==0) return;
//if (classList.count()==0) return;
@@ -918,25 +1043,38 @@ void writeAnnotatedIndex(OutputList &ol)
startFile(ol,"annotated","Annotated Index");
startTitle(ol,0);
QCString title = theTranslator->trCompoundList();
+ QCString htmlHelpTitle = title;
+ QCString ftvHelpTitle = title;
if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
parseText(ol,title);
endTitle(ol,0,0);
ol.startTextBlock();
HtmlHelp *htmlHelp = 0;
- if (Config::generateHtml && Config::htmlHelpFlag)
+ FTVHelp *ftvHelp = 0;
+ if (hasHtmlHelp)
{
htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(title,"annotated");
+ htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"annotated");
htmlHelp->incContentsDepth();
}
+ if (hasFtvHelp)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ ftvHelp->addContentsItem(TRUE,ftvHelpTitle,"annotated");
+ ftvHelp->incContentsDepth();
+ }
parseText(ol,theTranslator->trCompoundListDescription());
//ol.newParagraph();
ol.endTextBlock();
writeAnnotatedClassList(ol);
- if (Config::generateHtml && Config::htmlHelpFlag)
+ if (hasHtmlHelp)
{
htmlHelp->decContentsDepth();
}
+ if (hasFtvHelp)
+ {
+ ftvHelp->decContentsDepth();
+ }
endFile(ol);
//ol.enable(OutputGenerator::Man);
@@ -1371,92 +1509,6 @@ void writeNamespaceMemberIndex(OutputList &ol)
//----------------------------------------------------------------------------
-//int countIncludeFiles()
-//{
-// int count=0;
-// FileDef *fd=includeFiles.first();
-// while (fd)
-// {
-// //if (fd->isLinkableInProject())
-// //{
-// count++;
-// //}
-// fd=includeFiles.next();
-// }
-// return count;
-//}
-//
-////----------------------------------------------------------------------------
-//
-//void writeHeaderFileList(OutputList &ol)
-//{
-// bool started=FALSE;
-// FileDef *fd=includeFiles.first();
-// while (fd)
-// {
-// /*
-// if (fd->isLinkableInProject())
-// {
-// */
-// if (!started)
-// {
-// started=TRUE;
-// ol.startItemList();
-// }
-// ol.writeListItem();
-// QCString path;
-// if (Config::fullPathNameFlag)
-// {
-// path=stripFromPath(fd->getPath().copy());
-// }
-// if (!path.isEmpty()) ol.docify(path);
-// ol.writeObjectLink(0,fd->includeName(),0,fd->name());
-// ol.writeString("\n");
-// if (Config::generateHtml && Config::htmlHelpFlag)
-// {
-// HtmlHelp::getInstance()->addContentsItem(
-// fd->name(),fd->includeName());
-// }
-// /*
-// }
-// */
-// fd=includeFiles.next();
-// }
-// if (started) ol.endItemList();
-//}
-//
-////----------------------------------------------------------------------------
-//
-//void writeHeaderIndex(OutputList &ol)
-//{
-// if (documentedIncludeFiles==0) return;
-// ol.disable(OutputGenerator::Man);
-// ol.disable(OutputGenerator::Latex);
-// startFile(ol,"headers","Header File Index");
-// startTitle(ol,0);
-// QCString title = Config::projectName+" "+theTranslator->trHeaderFiles();
-// parseText(ol,title);
-// endTitle(ol,0,0);
-// HtmlHelp *htmlHelp = 0;
-// if (Config::generateHtml && Config::htmlHelpFlag)
-// {
-// htmlHelp = HtmlHelp::getInstance();
-// htmlHelp->addContentsItem(title,"headers");
-// htmlHelp->incContentsDepth();
-// }
-// parseText(ol,theTranslator->trHeaderFilesDescription());
-// writeHeaderFileList(ol);
-// if (Config::generateHtml && Config::htmlHelpFlag)
-// {
-// htmlHelp->decContentsDepth();
-// }
-// endFile(ol);
-// ol.enable(OutputGenerator::Latex);
-// ol.enable(OutputGenerator::Man);
-//}
-
-//----------------------------------------------------------------------------
-
void writeExampleIndex(OutputList &ol)
{
if (exampleSDict->count()==0) return;
@@ -1465,18 +1517,28 @@ void writeExampleIndex(OutputList &ol)
startFile(ol,"examples","Example Index");
startTitle(ol,0);
QCString title = theTranslator->trExamples();
+ QCString htmlHelpTitle = title;
+ QCString ftvHelpTitle = title;
if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
parseText(ol,title);
endTitle(ol,0,0);
ol.startTextBlock();
HtmlHelp *htmlHelp = 0;
- bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
+ FTVHelp *ftvHelp = 0;
+ bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
if (hasHtmlHelp)
{
htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(title,"examples");
+ htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"examples");
htmlHelp->incContentsDepth();
}
+ if (hasFtvHelp)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ ftvHelp->addContentsItem(TRUE,ftvHelpTitle,"examples");
+ ftvHelp->incContentsDepth();
+ }
parseText(ol,theTranslator->trExamplesDescription());
//ol.newParagraph();
ol.endTextBlock();
@@ -1490,12 +1552,14 @@ void writeExampleIndex(OutputList &ol)
if (!pi->title.isEmpty())
{
ol.writeObjectLink(0,n,0,pi->title);
- if (hasHtmlHelp) htmlHelp->addContentsItem(pi->title,n);
+ if (hasHtmlHelp) htmlHelp->addContentsItem(FALSE,pi->title,n);
+ if (hasFtvHelp) ftvHelp->addContentsItem(FALSE,pi->title,n);
}
else
{
ol.writeObjectLink(0,n,0,pi->name);
- if (hasHtmlHelp) htmlHelp->addContentsItem(pi->name,n);
+ if (hasHtmlHelp) htmlHelp->addContentsItem(FALSE,pi->name,n);
+ if (hasFtvHelp) ftvHelp->addContentsItem(FALSE,pi->name,n);
}
ol.writeString("\n");
}
@@ -1504,6 +1568,10 @@ void writeExampleIndex(OutputList &ol)
{
htmlHelp->decContentsDepth();
}
+ if (hasFtvHelp)
+ {
+ ftvHelp->decContentsDepth();
+ }
endFile(ol);
//ol.enable(OutputGenerator::Man);
ol.popGeneratorState();
@@ -1511,26 +1579,50 @@ void writeExampleIndex(OutputList &ol)
//----------------------------------------------------------------------------
+int countRelatedPages()
+{
+ int count=0;
+ PageSDictIterator pdi(*pageSDict);
+ PageInfo *pi=0;
+ for (pdi.toFirst();(pi=pdi.current());++pdi)
+ {
+ if (!pi->inGroup) count++;
+ }
+ return count;
+}
+
+//----------------------------------------------------------------------------
+
void writePageIndex(OutputList &ol)
{
- if (pageSDict->count()==0) return;
+ if (documentedPages==0) return;
ol.pushGeneratorState();
ol.disable(OutputGenerator::Man);
startFile(ol,"pages","Page Index");
startTitle(ol,0);
QCString title = theTranslator->trRelatedPages();
+ QCString htmlHelpTitle = title;
+ QCString ftvHelpTitle = title;
if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
parseText(ol,title);
endTitle(ol,0,0);
ol.startTextBlock();
HtmlHelp *htmlHelp = 0;
- bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
+ FTVHelp *ftvHelp = 0;
+ bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag /*&& !Config::htmlHelpGroupsOnly*/;
if (hasHtmlHelp)
{
htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(title,"pages");
+ htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"pages");
htmlHelp->incContentsDepth();
}
+ if (hasFtvHelp)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ ftvHelp->addContentsItem(TRUE,ftvHelpTitle,"pages");
+ ftvHelp->incContentsDepth();
+ }
parseText(ol,theTranslator->trRelatedPagesDescription());
//ol.newParagraph();
ol.endTextBlock();
@@ -1539,30 +1631,38 @@ void writePageIndex(OutputList &ol)
PageInfo *pi=0;
for (pdi.toFirst();(pi=pdi.current());++pdi)
{
- QCString pageName,pageTitle;
-
- if (Config::caseSensitiveNames)
- pageName=pi->name.copy();
- else
- pageName=pi->name.lower();
-
- if (pi->title.isEmpty())
- pageTitle=pi->name;
- else
- pageTitle=pi->title;
-
- //ol.writeListItem();
- ol.writeStartAnnoItem("pages",pageName,0,pageTitle);
- //ol.writeObjectLink(0,pageName,0,pageTitle);
- ol.writeEndAnnoItem(pageName);
- ol.writeString("\n");
- if (hasHtmlHelp) htmlHelp->addContentsItem(pageTitle,pageName);
+ if (!pi->inGroup)
+ {
+ QCString pageName,pageTitle;
+
+ if (Config::caseSensitiveNames)
+ pageName=pi->name.copy();
+ else
+ pageName=pi->name.lower();
+
+ if (pi->title.isEmpty())
+ pageTitle=pi->name;
+ else
+ pageTitle=pi->title;
+
+ //ol.writeListItem();
+ ol.writeStartAnnoItem("pages",pageName,0,pageTitle);
+ //ol.writeObjectLink(0,pageName,0,pageTitle);
+ ol.writeEndAnnoItem(pageName);
+ ol.writeString("\n");
+ if (hasHtmlHelp) htmlHelp->addContentsItem(FALSE,pageTitle,pageName);
+ if (hasFtvHelp) ftvHelp->addContentsItem(FALSE,pageTitle,pageName);
+ }
}
ol.endIndexList();
if (hasHtmlHelp)
{
htmlHelp->decContentsDepth();
}
+ if (hasFtvHelp)
+ {
+ ftvHelp->decContentsDepth();
+ }
endFile(ol);
//ol.enable(OutputGenerator::Man);
ol.popGeneratorState();
@@ -1577,22 +1677,231 @@ int countGroups()
GroupDef *gd;
for (;(gd=gli.current());++gli)
{
- if (gd->countMembers()>0) count++;
+ gd->visited=FALSE;
+ count++;
}
return count;
}
+
+//----------------------------------------------------------------------------
+
+void writeGraphInfo(OutputList &ol)
+{
+ if (!Config::haveDotFlag || !Config::generateHtml) return;
+ ol.pushGeneratorState();
+ ol.disableAllBut(OutputGenerator::Html);
+ generateGraphLegend(Config::htmlOutputDir);
+ startFile(ol,"graph_legend","Graph Legend");
+ startTitle(ol,0);
+ parseText(ol,theTranslator->trLegendTitle());
+ endTitle(ol,0,0);
+ bool oldStripCommentsState = Config::stripCommentsFlag;
+ // temporarily disable the stripping of comments for our own code example!
+ Config::stripCommentsFlag = FALSE;
+ parseDoc(ol,"graph_legend",1,0,0,theTranslator->trLegendDocs());
+ Config::stripCommentsFlag = oldStripCommentsState;
+ endFile(ol);
+ ol.popGeneratorState();
+}
+
+//----------------------------------------------------------------------------
+/*!
+ * write groups as hierarchial trees
+ * \author KPW
+ */
+
+void writeGroupTreeNode(OutputList &ol, GroupDef *gd)
+{
+ HtmlHelp *htmlHelp=0;
+ FTVHelp *ftvHelp = 0;
+ bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag;
+ if (hasHtmlHelp)
+ {
+ htmlHelp = HtmlHelp::getInstance();
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ }
+
+ GroupDef *subgd = 0;
+ GroupListIterator gli(*gd->groupList);
+ if (!gd->visited)
+ {
+ //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;
+ //printf("gd=`%s': pageDict=%d\n",gd->name().data(),gd->pageDict->count());
+ if(htmlHelp)
+ {
+ htmlHelp->addContentsItem(hasSubGroups || hasSubPages,gd->groupTitle(),gd->getOutputFileBase());
+ htmlHelp->incContentsDepth();
+ }
+ if(ftvHelp)
+ {
+ ftvHelp->addContentsItem(hasSubGroups || hasSubPages,gd->groupTitle(),gd->getOutputFileBase());
+ ftvHelp->incContentsDepth();
+ }
+
+ //ol.writeListItem();
+ //ol.startTextLink(gd->getOutputFileBase(),0);
+ //parseText(ol,gd->groupTitle());
+ //ol.endTextLink();
+
+ ol.writeIndexItem(0,gd->getOutputFileBase(),gd->groupTitle());
+
+ //ol.writeStartAnnoItem(0,gd->getOutputFileBase(),0,gd-);
+ //parseText(ol,gd->groupTitle());
+ //ol.writeEndAnnoItem(gd->getOutputFileBase());
+
+ // write pages
+ PageSDictIterator pli(*gd->pageDict);
+ PageInfo *pi = 0;
+ for (pli.toFirst();(pi=pli.current());++pli)
+ {
+ SectionInfo *si=0;
+ if (!pi->name.isEmpty()) si=sectionDict[pi->name];
+ if(htmlHelp) htmlHelp->addContentsItem(FALSE,
+ convertToHtml(pi->title),
+ gd->getOutputFileBase(),
+ si ? si->label.data() : 0
+ );
+ if(ftvHelp) ftvHelp->addContentsItem(FALSE,
+ convertToHtml(pi->title),
+ gd->getOutputFileBase(),
+ si ? si->label.data() : 0
+ );
+ }
+
+ // write subgroups
+ if (hasSubGroups)
+ {
+ ol.startIndexList();
+ for (gli.toLast();(subgd=gli.current());--gli)
+ {
+ writeGroupTreeNode(ol,subgd);
+ }
+ ol.endIndexList();
+ }
+
+#if 0
+ // write namespaces
+ NamespaceList *namespaceList=gd->namespaceList;
+ if (namespaceList->count()>0)
+ {
+ NamespaceDef *nsd=namespaceList->first();
+ while (nsd)
+ {
+ if(htmlHelp)
+ htmlHelp->addContentsItem(FALSE,convertToHtml(nsd->name()).data(),nsd->getOutputFileBase());
+ if(ftvHelp)
+ ftvHelp->addContentsItem(FALSE,convertToHtml(nsd->name()).data(),nsd->getOutputFileBase());
+ nsd=namespaceList->next();
+ }
+ }
+
+ // write classes
+ writeClassTree(gd->classList);
+
+ // write members
+ MemberList memberLists[7] = {
+ gd->defineMembers,
+ gd->typedefMembers,
+ gd->enumMembers,
+ gd->enumValMembers,
+ gd->funcMembers,
+ gd->varMembers,
+ gd->protoMembers
+ };
+ MemberList members;
+ for (int i=0;i<7;i++)
+ {
+ members=memberLists[i];
+ if (members.count()>0)
+ {
+ MemberDef *md=members.first();
+ while (md)
+ {
+ if(htmlHelp)
+ htmlHelp->addContentsItem(FALSE,md->name(),md->getGroupDef()->getOutputFileBase().data(),md->anchor());
+ if(ftvHelp)
+ ftvHelp->addContentsItem(FALSE,md->name(),md->getGroupDef()->getOutputFileBase().data(),md->anchor());
+ md=members.next();
+ }
+ }
+ }
+
+ // write file list
+ FileList *fileList=gd->fileList;
+ if (fileList->count()>0)
+ {
+ FileDef *fd=fileList->first();
+ while (fd)
+ {
+ if(htmlHelp)
+ htmlHelp->addContentsItem(FALSE,convertToHtml(fd->name()),fd->getOutputFileBase().data());
+ if(ftvHelp)
+ ftvHelp->addContentsItem(FALSE,convertToHtml(fd->name()),fd->getOutputFileBase().data());
+ fd=fileList->next();
+ }
+ }
+
+ // write examples
+ PageSDictIterator eli(*(gd->exampleDict));
+ {
+ PageInfo *pi=eli.toFirst();
+ while (pi)
+ {
+ if(htmlHelp)
+ htmlHelp->addContentsItem(FALSE,convertToHtml(pi->name),convertNameToFile(pi->name)+"-example");
+ if(ftvHelp)
+ ftvHelp->addContentsItem(FALSE,convertToHtml(pi->name),convertNameToFile(pi->name)+"-example");
+ pi=++eli;
+ }
+ }
+#endif
+
+ if(htmlHelp) htmlHelp->decContentsDepth();
+ if(ftvHelp) ftvHelp->decContentsDepth();
+ gd->visited=TRUE;
+ }
+}
+
+void writeGroupHierarchy(OutputList &ol)
+{
+ ol.startIndexList();
+ GroupListIterator gli(groupList);
+ GroupDef *gd;
+ for (;(gd=gli.current());++gli)
+ {
+ writeGroupTreeNode(ol,gd);
+ }
+ ol.endIndexList();
+}
+
//----------------------------------------------------------------------------
+#if 0
void writeGroupList(OutputList &ol)
{
+ bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag;
+ HtmlHelp *htmlHelp = 0;
+ FTVHelp *ftvHelp = 0;
+ if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance();
+ if (hasFtvHelp) ftvHelp = FTVHelp::getInstance();
ol.startDescription();
GroupListIterator gli(groupList);
GroupDef *gd;
for (;(gd=gli.current());++gli)
{
//printf("gd->name()=%s #members=%d\n",gd->name().data(),gd->countMembers());
- if (gd->countMembers()>0)
+ //if (gd->countMembers()>0)
+ //{
+ if (gd->hasDocumentation())
{
ol.startDescItem();
ol.startTextLink(gd->getOutputFileBase(),0);
@@ -1603,31 +1912,31 @@ void writeGroupList(OutputList &ol)
gd->getDefFileName(),gd->getDefLine(),
0,0,gd->briefDescription());
ol.newParagraph();
+ //}
+
+ const char *docFile = 0;
+ if (gd->hasDocumentation()) docFile = gd->getOutputFileBase();
+ if (hasHtmlHelp)
+ {
+ htmlHelp = HtmlHelp::getInstance();
+ if(!Config::htmlHelpGroupsOnly)
+ {
+ htmlHelp->addContentsItem(FALSE,gd->groupTitle(),docFile);
+ }
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ if(!Config::htmlHelpGroupsOnly)
+ {
+ ftvHelp->addContentsItem(FALSE,gd->groupTitle(),docFile);
+ }
+ }
}
}
ol.endDescription();
}
-
-//----------------------------------------------------------------------------
-
-void writeGraphInfo(OutputList &ol)
-{
- if (!Config::haveDotFlag || !Config::generateHtml) return;
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- generateGraphLegend(Config::htmlOutputDir);
- startFile(ol,"graph_legend","Graph Legend");
- startTitle(ol,0);
- parseText(ol,theTranslator->trLegendTitle());
- endTitle(ol,0,0);
- bool oldStripCommentsState = Config::stripCommentsFlag;
- // temporarily disable the stripping of comments for our own code example!
- Config::stripCommentsFlag = FALSE;
- parseDoc(ol,"graph_legend",1,0,0,theTranslator->trLegendDocs());
- Config::stripCommentsFlag = oldStripCommentsState;
- endFile(ol);
- ol.popGeneratorState();
-}
+#endif
//----------------------------------------------------------------------------
@@ -1639,24 +1948,52 @@ void writeGroupIndex(OutputList &ol)
startFile(ol,"modules","Module Index");
startTitle(ol,0);
QCString title = theTranslator->trModules();
+ QCString htmlHelpTitle = title;
+ QCString ftvHelpTitle = title;
if (!Config::projectName.isEmpty()) title.prepend(Config::projectName+" ");
parseText(ol,title);
endTitle(ol,0,0);
ol.startTextBlock();
HtmlHelp *htmlHelp = 0;
+ FTVHelp *ftvHelp = 0;
bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
+ bool hasFtvHelp = Config::generateHtml && Config::ftvHelpFlag;
if (hasHtmlHelp)
{
htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(title,"modules");
- htmlHelp->incContentsDepth();
+ //if(!Config::htmlHelpGroupsOnly)
+ //{
+ htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"modules");
+ htmlHelp->incContentsDepth();
+ //}
+ }
+ if (hasFtvHelp)
+ {
+ ftvHelp = FTVHelp::getInstance();
+ //if(!Config::htmlHelpGroupsOnly)
+ //{
+ ftvHelp->addContentsItem(TRUE,htmlHelpTitle,"modules");
+ ftvHelp->incContentsDepth();
+ //}
}
parseText(ol,theTranslator->trModulesDescription());
ol.endTextBlock();
- writeGroupList(ol);
+ writeGroupHierarchy(ol);
if (hasHtmlHelp)
{
- htmlHelp->decContentsDepth();
+ //writeGroupTree(ol); // KPW - modified to write hierarchial HMTL Help
+ //if(!Config::htmlHelpGroupsOnly)
+ //{
+ htmlHelp->decContentsDepth();
+ //}
+ }
+ if (hasFtvHelp)
+ {
+ //writeGroupTree(ol); // KPW - modified to write hierarchial FTV Help
+ //if(!Config::htmlHelpGroupsOnly)
+ //{
+ ftvHelp->decContentsDepth();
+ //}
}
endFile(ol);
ol.popGeneratorState();
@@ -1667,9 +2004,6 @@ void writeGroupIndex(OutputList &ol)
void writeIndex(OutputList &ol)
{
// save old generator state
- //bool manEnabled = ol.isEnabled(OutputGenerator::Man);
- //bool texEnabled = ol.isEnabled(OutputGenerator::Latex);
- //bool htmEnabled = ol.isEnabled(OutputGenerator::Html);
ol.pushGeneratorState();
QCString projPrefix;
@@ -1691,17 +2025,24 @@ void writeIndex(OutputList &ol)
QCString title;
if (!mainPage || mainPage->title.isEmpty())
{
- title = "Main Index";
+ title = theTranslator->trMainPage();
}
else
{
title = substitute(mainPage->title,"%","");
}
- ol.startFile("index",title,FALSE);
+ QCString indexName="index";
+ if (Config::ftvHelpFlag) indexName="main";
+ ol.startFile(indexName,title,FALSE);
+
if (Config::generateHtml && Config::htmlHelpFlag)
{
- HtmlHelp::getInstance()->addContentsItem(title,"index");
+ HtmlHelp::getInstance()->addContentsItem(FALSE,title,indexName);
+ }
+ if (Config::generateHtml && Config::ftvHelpFlag)
+ {
+ FTVHelp::getInstance()->addContentsItem(FALSE,title,indexName);
}
if (!Config::noIndexFlag) writeQuickLinks(ol,TRUE);
@@ -1801,7 +2142,7 @@ void writeIndex(OutputList &ol)
parseText(ol,projPrefix+theTranslator->trFileIndex());
ol.endIndexSection(isFileIndex);
}
- if (pageSDict->count()>0)
+ if (documentedPages>0)
{
ol.startIndexSection(isPageIndex);
parseText(ol,projPrefix+theTranslator->trPageIndex());
@@ -1875,3 +2216,4 @@ void writeIndex(OutputList &ol)
// else ol.disable(OutputGenerator::Html);
ol.popGeneratorState();
}
+
diff --git a/src/index.h b/src/index.h
index 1bcf12d..d928a5b 100644
--- a/src/index.h
+++ b/src/index.h
@@ -73,5 +73,6 @@ int countNamespaces();
int countAnnotatedClasses();
int countNamespaceMembers();
int countIncludeFiles();
+int countRelatedPages();
#endif
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 0e37603..e0e72fc 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -494,12 +494,9 @@ void LatexGenerator::startIndexSection(IndexSections is)
bool found=FALSE;
while (gd && !found)
{
- if (gd->countMembers()>0)
- {
- if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
- t << "{"; //Module Documentation}\n";
- found=TRUE;
- }
+ if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter";
+ t << "{"; //Module Documentation}\n";
+ found=TRUE;
gd=groupList.next();
}
}
@@ -619,20 +616,14 @@ void LatexGenerator::endIndexSection(IndexSections is)
bool found=FALSE;
while (gd && !found)
{
- if (gd->countMembers()>0)
- {
- t << "}\n\\input{" << gd->getOutputFileBase() << "}\n";
- found=TRUE;
- }
+ t << "}\n\\input{" << gd->getOutputFileBase() << "}\n";
+ found=TRUE;
gd=groupList.next();
}
while (gd)
{
- if (gd->countMembers()>0)
- {
- if (Config::compactLatexFlag) t << "\\input"; else t << "\\include";
- t << "{" << gd->getOutputFileBase() << "}\n";
- }
+ if (Config::compactLatexFlag) t << "\\input"; else t << "\\include";
+ t << "{" << gd->getOutputFileBase() << "}\n";
gd=groupList.next();
}
}
@@ -734,24 +725,20 @@ void LatexGenerator::endIndexSection(IndexSections is)
t << "}\n";
PageSDictIterator pdi(*pageSDict);
PageInfo *pi=pdi.toFirst();
- if (pi)
- {
- QCString pageName;
- if (Config::caseSensitiveNames)
- pageName=pi->name.copy();
- else
- pageName=pi->name.lower();
- t << "\\input{" << pageName << "}\n";
- }
- for (++pdi;(pi=pdi.current());++pdi)
+ bool first=TRUE;
+ for (pdi.toFirst();(pi=pdi.current());++pdi)
{
- if (Config::compactLatexFlag) t << "\\input" ; else t << "\\include";
- QCString pageName;
- if (Config::caseSensitiveNames)
- pageName=pi->name.copy();
- else
- pageName=pi->name.lower();
- t << "{" << pageName << "}\n";
+ if (!pi->inGroup)
+ {
+ QCString pageName;
+ if (Config::caseSensitiveNames)
+ pageName=pi->name.copy();
+ else
+ pageName=pi->name.lower();
+ if (Config::compactLatexFlag || first) t << "\\input" ; else t << "\\include";
+ t << "{" << pageName << "}\n";
+ first=FALSE;
+ }
}
}
break;
diff --git a/src/page.h b/src/page.h
index 0d37962..bb841f3 100644
--- a/src/page.h
+++ b/src/page.h
@@ -22,7 +22,7 @@ class PageInfo
public:
PageInfo(const char *f, int l,const char *n,const char *d,const char *t) :
defFileName(f), defLine(l), name(n),
- doc(d), title(t), todoId(0), testId(0) {}
+ doc(d), title(t), todoId(0), testId(0),inGroup(0) {}
// where the page definition was found
QCString defFileName;
@@ -36,6 +36,9 @@ class PageInfo
// ids
int todoId;
int testId;
+
+ // is this page part of a group
+ GroupDef *inGroup;
};
class PageSDict : public SDict<PageInfo>
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index 1cee062..22cd3e8 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -810,11 +810,8 @@ void RTFGenerator::startIndexSection(IndexSections is)
bool found=FALSE;
while (gd && !found)
{
- if (gd->countMembers()>0)
- {
- beginRTFChapter();
- found=TRUE;
- }
+ beginRTFChapter();
+ found=TRUE;
gd=groupList.next();
}
}
@@ -965,31 +962,13 @@ void RTFGenerator::endIndexSection(IndexSections is)
case isModuleDocumentation:
{
GroupDef *gd=groupList.first();
- bool found=FALSE;
t << "{\\tc \\v " << theTranslator->trModuleDocumentation() << "}"<< endl;
- while (gd && !found)
- {
- if (gd->countMembers()>0)
- {
- t << "\\par " << Rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << gd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
-
- found=TRUE;
- }
- gd=groupList.next();
- }
while (gd)
{
- if (gd->countMembers()>0)
- {
- t << "\\par " << Rtf_Style_Reset << endl;
- beginRTFSection();
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << gd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- }
+ t << "\\par " << Rtf_Style_Reset << endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << gd->getOutputFileBase();
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
gd=groupList.next();
}
}
@@ -1120,30 +1099,22 @@ void RTFGenerator::endIndexSection(IndexSections is)
t << "{\\tc \\v " << theTranslator->trPageDocumentation() << "}"<< endl;
PageSDictIterator pdi(*pageSDict);
PageInfo *pi=pdi.toFirst();
- if (pi)
+ bool first=TRUE;
+ for (pdi.toFirst();(pi=pdi.current());++pdi)
{
- QCString pageName;
- if (Config::caseSensitiveNames)
- pageName=pi->name.copy();
- else
- pageName=pi->name.lower();
- t << "\\par " << Rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << pageName;
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- }
- for (++pdi;(pi=pdi.current());++pdi)
- {
- QCString pageName;
- if (Config::caseSensitiveNames)
- pageName=pi->name.copy();
- else
- pageName=pi->name.lower();
- //t << "\\par " << Rtf_Style_Reset << endl;
- //beginRTFSection();
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << pageName;
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ if (!pi->inGroup)
+ {
+ QCString pageName;
+ if (Config::caseSensitiveNames)
+ pageName=pi->name.copy();
+ else
+ pageName=pi->name.lower();
+ if (first) t << "\\par " << Rtf_Style_Reset << endl;
+ t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
+ t << pageName;
+ t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
+ first=FALSE;
+ }
}
}
break;
diff --git a/src/scanner.l b/src/scanner.l
index 6bd6f2d..3bee67e 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -3000,6 +3000,11 @@ TITLE [tT][iI][tT][lL][eE]
}
<ExampleDoc,PageDoc,ClassDoc>"\n" { yyLineNr++ ; current->doc+=yytext; }
<ExampleDoc,PageDoc,ClassDoc>[a-z_A-Z0-9 \t]+ { current->doc += yytext; }
+<ExampleDoc,PageDoc>{CMD}"ingroup"{B}+ {
+ lastGroupContext = YY_START;
+ lineCount();
+ BEGIN( GroupName );
+ }
<ExampleDoc,PageDoc,ClassDoc>. { current->doc += yytext; }
<Doc,JavaDoc,LineDoc,ExampleDoc,PageDoc,ClassDoc>^{B}*"//"
<Doc,ExampleDoc,PageDoc,ClassDoc>"//" { current->doc += yytext; }
diff --git a/src/treeview.h b/src/treeview.h
new file mode 100644
index 0000000..e74408a
--- /dev/null
+++ b/src/treeview.h
@@ -0,0 +1,472 @@
+"//**************************************************************** \n"
+"// You are free to copy the \"Folder-Tree\" script as long as you \n"
+"// keep this copyright notice: \n"
+"// Script found in: http://www.geocities.com/Paris/LeftBank/2178/ \n"
+"// Author: Marcelino Alves Martins (martins@hks.com) December '97. \n"
+"//**************************************************************** \n"
+" \n"
+"//Log of changes: \n"
+"// 17 Feb 98 - Fix initialization flashing problem with Netscape\n"
+"// \n"
+"// 27 Jan 98 - Root folder starts open; support for USETEXTLINKS; \n"
+"// make the ftien4 a js file \n"
+"// \n"
+" \n"
+"// Definition of class Folder \n"
+"// ***************************************************************** \n"
+" \n"
+"function Folder(folderDescription, hreference) //constructor \n"
+"{ \n"
+" //constant data \n"
+" this.desc = folderDescription \n"
+" this.hreference = hreference \n"
+" this.id = -1 \n"
+" this.navObj = 0 \n"
+" this.iconImg = 0 \n"
+" this.nodeImg = 0 \n"
+" this.isLastNode = 0 \n"
+" \n"
+" //dynamic data \n"
+" this.isOpen = true \n"
+" this.iconSrc = \"ftv2folderopen.gif\" \n"
+" this.children = new Array \n"
+" this.nChildren = 0 \n"
+" \n"
+" //methods \n"
+" this.initialize = initializeFolder \n"
+" this.setState = setStateFolder \n"
+" this.addChild = addChild \n"
+" this.createIndex = createEntryIndex \n"
+" this.hide = hideFolder \n"
+" this.display = display \n"
+" this.renderOb = drawFolder \n"
+" this.totalHeight = totalHeight \n"
+" this.subEntries = folderSubEntries \n"
+" this.outputLink = outputFolderLink \n"
+"} \n"
+" \n"
+"function setStateFolder(isOpen) \n"
+"{ \n"
+" var subEntries \n"
+" var totalHeight \n"
+" var fIt = 0 \n"
+" var i=0 \n"
+" \n"
+" if (isOpen == this.isOpen) \n"
+" return \n"
+" \n"
+" if (browserVersion == 2) \n"
+" { \n"
+" totalHeight = 0 \n"
+" for (i=0; i < this.nChildren; i++) \n"
+" totalHeight = totalHeight + this.children[i].navObj.clip.height \n"
+" subEntries = this.subEntries() \n"
+" if (this.isOpen) \n"
+" totalHeight = 0 - totalHeight \n"
+" for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++) \n"
+" indexOfEntries[fIt].navObj.moveBy(0, totalHeight) \n"
+" } \n"
+" this.isOpen = isOpen \n"
+" propagateChangesInState(this) \n"
+"} \n"
+" \n"
+"function propagateChangesInState(folder) \n"
+"{ \n"
+" var i=0 \n"
+" \n"
+" if (folder.isOpen) \n"
+" { \n"
+" if (folder.nodeImg) \n"
+" if (folder.isLastNode) \n"
+" folder.nodeImg.src = \"ftv2mlastnode.gif\" \n"
+" else \n"
+" folder.nodeImg.src = \"ftv2mnode.gif\" \n"
+" folder.iconImg.src = \"ftv2folderopen.gif\" \n"
+" for (i=0; i<folder.nChildren; i++) \n"
+" folder.children[i].display() \n"
+" } \n"
+" else \n"
+" { \n"
+" if (folder.nodeImg) \n"
+" if (folder.isLastNode) \n"
+" folder.nodeImg.src = \"ftv2plastnode.gif\" \n"
+" else \n"
+" folder.nodeImg.src = \"ftv2pnode.gif\" \n"
+" folder.iconImg.src = \"ftv2folderclosed.gif\" \n"
+" for (i=0; i<folder.nChildren; i++) \n"
+" folder.children[i].hide() \n"
+" } \n"
+"} \n"
+" \n"
+"function hideFolder() \n"
+"{ \n"
+" if (browserVersion == 1) { \n"
+" if (this.navObj.style.display == \"none\") \n"
+" return \n"
+" this.navObj.style.display = \"none\" \n"
+" } else { \n"
+" if (this.navObj.visibility == \"hidden\") \n"
+" return \n"
+" this.navObj.visibility = \"hidden\" \n"
+" } \n"
+" \n"
+" this.setState(0) \n"
+"} \n"
+" \n"
+"function initializeFolder(level, lastNode, leftSide) \n"
+"{ \n"
+"var j=0 \n"
+"var i=0 \n"
+"var numberOfFolders \n"
+"var numberOfDocs \n"
+"var nc \n"
+" \n"
+" nc = this.nChildren \n"
+" \n"
+" this.createIndex() \n"
+" \n"
+" var auxEv = \"\" \n"
+" \n"
+" if (browserVersion > 0) \n"
+" auxEv = \"<a href='javascript:clickOnNode(\"+this.id+\")'>\" \n"
+" else \n"
+" auxEv = \"<a>\" \n"
+" \n"
+" if (level>0) \n"
+" if (lastNode) //the last 'brother' in the children array \n"
+" { \n"
+" this.renderOb(leftSide + auxEv + \"<img name='nodeIcon\" + this.id + \"' src='ftv2mlastnode.gif' width=16 height=22 border=0></a>\") \n"
+" leftSide = leftSide + \"<img src='ftv2blank.gif' width=16 height=22>\" \n"
+" this.isLastNode = 1 \n"
+" } \n"
+" else \n"
+" { \n"
+" this.renderOb(leftSide + auxEv + \"<img name='nodeIcon\" + this.id + \"' src='ftv2mnode.gif' width=16 height=22 border=0></a>\") \n"
+" leftSide = leftSide + \"<img src='ftv2vertline.gif' width=16 height=22>\" \n"
+" this.isLastNode = 0 \n"
+" } \n"
+" else \n"
+" this.renderOb(\"\") \n"
+" \n"
+" if (nc > 0) \n"
+" { \n"
+" level = level + 1 \n"
+" for (i=0 ; i < this.nChildren; i++) \n"
+" { \n"
+" if (i == this.nChildren-1) \n"
+" this.children[i].initialize(level, 1, leftSide) \n"
+" else \n"
+" this.children[i].initialize(level, 0, leftSide) \n"
+" } \n"
+" } \n"
+"} \n"
+" \n"
+"function drawFolder(leftSide) \n"
+"{ \n"
+" if (browserVersion == 2) { \n"
+" if (!doc.yPos) \n"
+" doc.yPos=8 \n"
+" doc.write(\"<layer id='folder\" + this.id + \"' top=\" + doc.yPos + \" visibility=hidden>\") \n"
+" } \n"
+" \n"
+" doc.write(\"\\n<table \") \n"
+" if (browserVersion == 1) \n"
+" doc.write(\" id='folder\" + this.id + \"' style='position:block;' \") \n"
+" doc.write(\" border=0 cellspacing=0 cellpadding=0>\") \n"
+" doc.write(\"\\n<tr><td>\") \n"
+" doc.write(leftSide) \n"
+" this.outputLink() \n"
+" doc.write(\"<img name='folderIcon\" + this.id + \"' \") \n"
+" doc.write(\"src='\" + this.iconSrc+\"' border=0></a>\") \n"
+" doc.write(\"</td>\\n<td valign=middle nowrap>\") \n"
+" if (USETEXTLINKS) \n"
+" { \n"
+" this.outputLink() \n"
+" doc.write(this.desc + \"</a>\") \n"
+" } \n"
+" else \n"
+" doc.write(this.desc) \n"
+" doc.write(\"</td>\") \n"
+" doc.write(\"\\n</table>\\n\") \n"
+" \n"
+" if (browserVersion == 2) { \n"
+" doc.write(\"</layer>\") \n"
+" } \n"
+" \n"
+" if (browserVersion == 1) { \n"
+" this.navObj = doc.all[\"folder\"+this.id] \n"
+" this.iconImg = doc.all[\"folderIcon\"+this.id] \n"
+" this.nodeImg = doc.all[\"nodeIcon\"+this.id] \n"
+" } else if (browserVersion == 2) { \n"
+" this.navObj = doc.layers[\"folder\"+this.id] \n"
+" this.iconImg = this.navObj.document.images[\"folderIcon\"+this.id] \n"
+" this.nodeImg = this.navObj.document.images[\"nodeIcon\"+this.id] \n"
+" doc.yPos=doc.yPos+this.navObj.clip.height \n"
+" } \n"
+"} \n"
+" \n"
+"function outputFolderLink() \n"
+"{ \n"
+" if (this.hreference) \n"
+" { \n"
+" doc.write(\"<a href='\" + this.hreference + \"' TARGET=\\\"basefrm\\\" \") \n"
+" if (browserVersion > 0) \n"
+" doc.write(\"onClick='javascript:clickOnFolder(\"+this.id+\")'\") \n"
+" doc.write(\">\") \n"
+" } \n"
+" else \n"
+" doc.write(\"<a>\") \n"
+"} \n"
+" \n"
+"function addChild(childNode) \n"
+"{ \n"
+" this.children[this.nChildren] = childNode \n"
+" this.nChildren++ \n"
+" return childNode \n"
+"} \n"
+" \n"
+"function folderSubEntries() \n"
+"{ \n"
+" var i = 0 \n"
+" var se = this.nChildren \n"
+" \n"
+" for (i=0; i < this.nChildren; i++){ \n"
+" if (this.children[i].children) //is a folder \n"
+" se = se + this.children[i].subEntries() \n"
+" } \n"
+" \n"
+" return se \n"
+"} \n"
+" \n"
+" \n"
+"// Definition of class Item (a document or link inside a Folder) \n"
+"// ************************************************************* \n"
+" \n"
+"function Item(itemDescription, itemLink) // Constructor \n"
+"{ \n"
+" // constant data \n"
+" this.desc = itemDescription \n"
+" this.link = itemLink \n"
+" this.id = -1 //initialized in initalize() \n"
+" this.navObj = 0 //initialized in render() \n"
+" this.iconImg = 0 //initialized in render() \n"
+" this.iconSrc = \"ftv2doc.gif\" \n"
+" \n"
+" // methods \n"
+" this.initialize = initializeItem \n"
+" this.createIndex = createEntryIndex \n"
+" this.hide = hideItem \n"
+" this.display = display \n"
+" this.renderOb = drawItem \n"
+" this.totalHeight = totalHeight \n"
+"} \n"
+" \n"
+"function hideItem() \n"
+"{ \n"
+" if (browserVersion == 1) { \n"
+" if (this.navObj.style.display == \"none\") \n"
+" return \n"
+" this.navObj.style.display = \"none\" \n"
+" } else { \n"
+" if (this.navObj.visibility == \"hidden\") \n"
+" return \n"
+" this.navObj.visibility = \"hidden\" \n"
+" } \n"
+"} \n"
+" \n"
+"function initializeItem(level, lastNode, leftSide) \n"
+"{ \n"
+" this.createIndex() \n"
+" \n"
+" if (level>0) \n"
+" if (lastNode) //the last 'brother' in the children array \n"
+" { \n"
+" this.renderOb(leftSide + \"<img src='ftv2lastnode.gif' width=16 height=22>\") \n"
+" leftSide = leftSide + \"<img src='ftv2blank.gif' width=16 height=22>\" \n"
+" } \n"
+" else \n"
+" { \n"
+" this.renderOb(leftSide + \"<img src='ftv2node.gif' width=16 height=22>\") \n"
+" leftSide = leftSide + \"<img src='ftv2vertline.gif' width=16 height=22>\" \n"
+" } \n"
+" else \n"
+" this.renderOb(\"\") \n"
+"} \n"
+" \n"
+"function drawItem(leftSide) \n"
+"{ \n"
+" if (browserVersion == 2) \n"
+" doc.write(\"<layer id='item\" + this.id + \"' top=\" + doc.yPos + \" visibility=hidden>\") \n"
+" \n"
+" doc.write(\"\\n<table \") \n"
+" if (browserVersion == 1) \n"
+" doc.write(\" id='item\" + this.id + \"' style='position:block;' \") \n"
+" doc.write(\" border=0 cellspacing=0 cellpadding=0>\\n\") \n"
+" doc.write(\"<tr><td>\") \n"
+" doc.write(leftSide) \n"
+" if (this.link!=\"\")\n"
+" {\n"
+" doc.write(\"<a href=\" + this.link + \">\") \n"
+" }\n"
+" doc.write(\"<img id='itemIcon\"+this.id+\"' \") \n"
+" doc.write(\"src='\"+this.iconSrc+\"' border=0>\") \n"
+" if (this.link!=\"\")\n"
+" {\n"
+" doc.write(\"</a>\")\n"
+" } \n"
+" doc.write(\"</td>\\n<td valign=middle nowrap>\") \n"
+" if (USETEXTLINKS && this.link!=\"\") \n"
+" doc.write(\"<a href=\" + this.link + \">\" + this.desc + \"</a>\") \n"
+" else \n"
+" doc.write(this.desc) \n"
+" doc.write(\"\\n</table>\\n\") \n"
+" \n"
+" if (browserVersion == 2) \n"
+" doc.write(\"</layer>\") \n"
+" \n"
+" if (browserVersion == 1) { \n"
+" this.navObj = doc.all[\"item\"+this.id] \n"
+" this.iconImg = doc.all[\"itemIcon\"+this.id] \n"
+" } else if (browserVersion == 2) { \n"
+" this.navObj = doc.layers[\"item\"+this.id] \n"
+" this.iconImg = this.navObj.document.images[\"itemIcon\"+this.id] \n"
+" doc.yPos=doc.yPos+this.navObj.clip.height \n"
+" } \n"
+"} \n"
+" \n"
+" \n"
+"// Methods common to both objects (pseudo-inheritance) \n"
+"// ******************************************************** \n"
+" \n"
+"function display() \n"
+"{ \n"
+" if (browserVersion == 1) \n"
+" this.navObj.style.display = \"block\" \n"
+" else \n"
+" this.navObj.visibility = \"show\" \n"
+"} \n"
+" \n"
+"function createEntryIndex() \n"
+"{ \n"
+" this.id = nEntries \n"
+" indexOfEntries[nEntries] = this \n"
+" nEntries++ \n"
+"} \n"
+" \n"
+"// total height of subEntries open \n"
+"function totalHeight() //used with browserVersion == 2 \n"
+"{ \n"
+" var h = this.navObj.clip.height \n"
+" var i = 0 \n"
+" \n"
+" if (this.isOpen) //is a folder and _is_ open \n"
+" for (i=0 ; i < this.nChildren; i++) \n"
+" h = h + this.children[i].totalHeight() \n"
+" \n"
+" return h \n"
+"} \n"
+" \n"
+" \n"
+"// Events \n"
+"// ********************************************************* \n"
+" \n"
+"function clickOnFolder(folderId) \n"
+"{ \n"
+" var clicked = indexOfEntries[folderId] \n"
+" \n"
+" if (!clicked.isOpen) \n"
+" clickOnNode(folderId) \n"
+" \n"
+" return \n"
+" \n"
+" if (clicked.isSelected) \n"
+" return \n"
+"} \n"
+" \n"
+"function clickOnNode(folderId) \n"
+"{ \n"
+" var clickedFolder = 0 \n"
+" var state = 0 \n"
+" \n"
+" clickedFolder = indexOfEntries[folderId] \n"
+" state = clickedFolder.isOpen \n"
+" \n"
+" clickedFolder.setState(!state) //open<->close \n"
+"} \n"
+" \n"
+"function initializeDocument() \n"
+"{ \n"
+" doc = document;\n"
+" if (doc.all) \n"
+" browserVersion = 1 //IE4 \n"
+" else \n"
+" if (doc.layers) \n"
+" browserVersion = 2 //NS4 \n"
+" else \n"
+" browserVersion = 0 //other \n"
+"\n"
+" foldersTree.initialize(0, 1, \"\") \n"
+" foldersTree.display()\n"
+" \n"
+" if (browserVersion > 0) \n"
+" { \n"
+" doc.write(\"<layer top=\"+indexOfEntries[nEntries-1].navObj.top+\">&nbsp;</layer>\") \n"
+" \n"
+" // close the whole tree \n"
+" clickOnNode(0) \n"
+" // open the root folder \n"
+" clickOnNode(0) \n"
+" } \n"
+"} \n"
+" \n"
+"// Auxiliary Functions for Folder-Treee backward compatibility \n"
+"// ********************************************************* \n"
+" \n"
+"function gFld(description, hreference) \n"
+"{ \n"
+" folder = new Folder(description, hreference) \n"
+" return folder \n"
+"} \n"
+" \n"
+"function gLnk(target, description, linkData) \n"
+"{ \n"
+" fullLink = \"\" \n"
+" \n"
+" if (linkData!=\"\")\n"
+" {\n"
+" if (target==0) \n"
+" { \n"
+" fullLink = \"'\"+linkData+\"' target=\\\"basefrm\\\"\" \n"
+" } \n"
+" else \n"
+" { \n"
+" if (target==1) \n"
+" fullLink = \"'http://\"+linkData+\"' target=_blank\" \n"
+" else \n"
+" fullLink = \"'http://\"+linkData+\"' target=\\\"basefrm\\\"\" \n"
+" }\n"
+" } \n"
+" \n"
+" linkItem = new Item(description, fullLink) \n"
+" return linkItem \n"
+"} \n"
+" \n"
+"function insFld(parentFolder, childFolder) \n"
+"{ \n"
+" return parentFolder.addChild(childFolder) \n"
+"} \n"
+" \n"
+"function insDoc(parentFolder, document) \n"
+"{ \n"
+" parentFolder.addChild(document) \n"
+"} \n"
+" \n"
+"// Global variables \n"
+"// **************** \n"
+" \n"
+"USETEXTLINKS = 1\n"
+"indexOfEntries = new Array \n"
+"nEntries = 0 \n"
+"doc = document \n"
+"browserVersion = 0 \n"
+"selectedFolder=0\n"
diff --git a/src/treeview.js b/src/treeview.js
new file mode 100644
index 0000000..8fd91b1
--- /dev/null
+++ b/src/treeview.js
@@ -0,0 +1,472 @@
+//****************************************************************
+// You are free to copy the "Folder-Tree" script as long as you
+// keep this copyright notice:
+// Script found in: http://www.geocities.com/Paris/LeftBank/2178/
+// Author: Marcelino Alves Martins (martins@hks.com) December '97.
+//****************************************************************
+
+//Log of changes:
+// 17 Feb 98 - Fix initialization flashing problem with Netscape
+//
+// 27 Jan 98 - Root folder starts open; support for USETEXTLINKS;
+// make the ftien4 a js file
+//
+
+// Definition of class Folder
+// *****************************************************************
+
+function Folder(folderDescription, hreference) //constructor
+{
+ //constant data
+ this.desc = folderDescription
+ this.hreference = hreference
+ this.id = -1
+ this.navObj = 0
+ this.iconImg = 0
+ this.nodeImg = 0
+ this.isLastNode = 0
+
+ //dynamic data
+ this.isOpen = true
+ this.iconSrc = "ftv2folderopen.gif"
+ this.children = new Array
+ this.nChildren = 0
+
+ //methods
+ this.initialize = initializeFolder
+ this.setState = setStateFolder
+ this.addChild = addChild
+ this.createIndex = createEntryIndex
+ this.hide = hideFolder
+ this.display = display
+ this.renderOb = drawFolder
+ this.totalHeight = totalHeight
+ this.subEntries = folderSubEntries
+ this.outputLink = outputFolderLink
+}
+
+function setStateFolder(isOpen)
+{
+ var subEntries
+ var totalHeight
+ var fIt = 0
+ var i=0
+
+ if (isOpen == this.isOpen)
+ return
+
+ if (browserVersion == 2)
+ {
+ totalHeight = 0
+ for (i=0; i < this.nChildren; i++)
+ totalHeight = totalHeight + this.children[i].navObj.clip.height
+ subEntries = this.subEntries()
+ if (this.isOpen)
+ totalHeight = 0 - totalHeight
+ for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++)
+ indexOfEntries[fIt].navObj.moveBy(0, totalHeight)
+ }
+ this.isOpen = isOpen
+ propagateChangesInState(this)
+}
+
+function propagateChangesInState(folder)
+{
+ var i=0
+
+ if (folder.isOpen)
+ {
+ if (folder.nodeImg)
+ if (folder.isLastNode)
+ folder.nodeImg.src = "ftv2mlastnode.gif"
+ else
+ folder.nodeImg.src = "ftv2mnode.gif"
+ folder.iconImg.src = "ftv2folderopen.gif"
+ for (i=0; i<folder.nChildren; i++)
+ folder.children[i].display()
+ }
+ else
+ {
+ if (folder.nodeImg)
+ if (folder.isLastNode)
+ folder.nodeImg.src = "ftv2plastnode.gif"
+ else
+ folder.nodeImg.src = "ftv2pnode.gif"
+ folder.iconImg.src = "ftv2folderclosed.gif"
+ for (i=0; i<folder.nChildren; i++)
+ folder.children[i].hide()
+ }
+}
+
+function hideFolder()
+{
+ if (browserVersion == 1) {
+ if (this.navObj.style.display == "none")
+ return
+ this.navObj.style.display = "none"
+ } else {
+ if (this.navObj.visibility == "hidden")
+ return
+ this.navObj.visibility = "hidden"
+ }
+
+ this.setState(0)
+}
+
+function initializeFolder(level, lastNode, leftSide)
+{
+var j=0
+var i=0
+var numberOfFolders
+var numberOfDocs
+var nc
+
+ nc = this.nChildren
+
+ this.createIndex()
+
+ var auxEv = ""
+
+ if (browserVersion > 0)
+ auxEv = "<a href='javascript:clickOnNode("+this.id+")'>"
+ else
+ auxEv = "<a>"
+
+ if (level>0)
+ if (lastNode) //the last 'brother' in the children array
+ {
+ this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='ftv2mlastnode.gif' width=16 height=22 border=0></a>")
+ leftSide = leftSide + "<img src='ftv2blank.gif' width=16 height=22>"
+ this.isLastNode = 1
+ }
+ else
+ {
+ this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='ftv2mnode.gif' width=16 height=22 border=0></a>")
+ leftSide = leftSide + "<img src='ftv2vertline.gif' width=16 height=22>"
+ this.isLastNode = 0
+ }
+ else
+ this.renderOb("")
+
+ if (nc > 0)
+ {
+ level = level + 1
+ for (i=0 ; i < this.nChildren; i++)
+ {
+ if (i == this.nChildren-1)
+ this.children[i].initialize(level, 1, leftSide)
+ else
+ this.children[i].initialize(level, 0, leftSide)
+ }
+ }
+}
+
+function drawFolder(leftSide)
+{
+ if (browserVersion == 2) {
+ if (!doc.yPos)
+ doc.yPos=8
+ doc.write("<layer id='folder" + this.id + "' top=" + doc.yPos + " visibility=hidden>")
+ }
+
+ doc.write("\n<table ")
+ if (browserVersion == 1)
+ doc.write(" id='folder" + this.id + "' style='position:block;' ")
+ doc.write(" border=0 cellspacing=0 cellpadding=0>")
+ doc.write("\n<tr><td>")
+ doc.write(leftSide)
+ this.outputLink()
+ doc.write("<img name='folderIcon" + this.id + "' ")
+ doc.write("src='" + this.iconSrc+"' border=0></a>")
+ doc.write("</td>\n<td valign=middle nowrap>")
+ if (USETEXTLINKS)
+ {
+ this.outputLink()
+ doc.write(this.desc + "</a>")
+ }
+ else
+ doc.write(this.desc)
+ doc.write("</td>")
+ doc.write("\n</table>\n")
+
+ if (browserVersion == 2) {
+ doc.write("</layer>")
+ }
+
+ if (browserVersion == 1) {
+ this.navObj = doc.all["folder"+this.id]
+ this.iconImg = doc.all["folderIcon"+this.id]
+ this.nodeImg = doc.all["nodeIcon"+this.id]
+ } else if (browserVersion == 2) {
+ this.navObj = doc.layers["folder"+this.id]
+ this.iconImg = this.navObj.document.images["folderIcon"+this.id]
+ this.nodeImg = this.navObj.document.images["nodeIcon"+this.id]
+ doc.yPos=doc.yPos+this.navObj.clip.height
+ }
+}
+
+function outputFolderLink()
+{
+ if (this.hreference)
+ {
+ doc.write("<a href='" + this.hreference + "' TARGET=\"basefrm\" ")
+ if (browserVersion > 0)
+ doc.write("onClick='javascript:clickOnFolder("+this.id+")'")
+ doc.write(">")
+ }
+ else
+ doc.write("<a>")
+}
+
+function addChild(childNode)
+{
+ this.children[this.nChildren] = childNode
+ this.nChildren++
+ return childNode
+}
+
+function folderSubEntries()
+{
+ var i = 0
+ var se = this.nChildren
+
+ for (i=0; i < this.nChildren; i++){
+ if (this.children[i].children) //is a folder
+ se = se + this.children[i].subEntries()
+ }
+
+ return se
+}
+
+
+// Definition of class Item (a document or link inside a Folder)
+// *************************************************************
+
+function Item(itemDescription, itemLink) // Constructor
+{
+ // constant data
+ this.desc = itemDescription
+ this.link = itemLink
+ this.id = -1 //initialized in initalize()
+ this.navObj = 0 //initialized in render()
+ this.iconImg = 0 //initialized in render()
+ this.iconSrc = "ftv2doc.gif"
+
+ // methods
+ this.initialize = initializeItem
+ this.createIndex = createEntryIndex
+ this.hide = hideItem
+ this.display = display
+ this.renderOb = drawItem
+ this.totalHeight = totalHeight
+}
+
+function hideItem()
+{
+ if (browserVersion == 1) {
+ if (this.navObj.style.display == "none")
+ return
+ this.navObj.style.display = "none"
+ } else {
+ if (this.navObj.visibility == "hidden")
+ return
+ this.navObj.visibility = "hidden"
+ }
+}
+
+function initializeItem(level, lastNode, leftSide)
+{
+ this.createIndex()
+
+ if (level>0)
+ if (lastNode) //the last 'brother' in the children array
+ {
+ this.renderOb(leftSide + "<img src='ftv2lastnode.gif' width=16 height=22>")
+ leftSide = leftSide + "<img src='ftv2blank.gif' width=16 height=22>"
+ }
+ else
+ {
+ this.renderOb(leftSide + "<img src='ftv2node.gif' width=16 height=22>")
+ leftSide = leftSide + "<img src='ftv2vertline.gif' width=16 height=22>"
+ }
+ else
+ this.renderOb("")
+}
+
+function drawItem(leftSide)
+{
+ if (browserVersion == 2)
+ doc.write("<layer id='item" + this.id + "' top=" + doc.yPos + " visibility=hidden>")
+
+ doc.write("\n<table ")
+ if (browserVersion == 1)
+ doc.write(" id='item" + this.id + "' style='position:block;' ")
+ doc.write(" border=0 cellspacing=0 cellpadding=0>\n")
+ doc.write("<tr><td>")
+ doc.write(leftSide)
+ if (this.link!="")
+ {
+ doc.write("<a href=" + this.link + ">")
+ }
+ doc.write("<img id='itemIcon"+this.id+"' ")
+ doc.write("src='"+this.iconSrc+"' border=0>")
+ if (this.link!="")
+ {
+ doc.write("</a>")
+ }
+ doc.write("</td>\n<td valign=middle nowrap>")
+ if (USETEXTLINKS && this.link!="")
+ doc.write("<a href=" + this.link + ">" + this.desc + "</a>")
+ else
+ doc.write(this.desc)
+ doc.write("\n</table>\n")
+
+ if (browserVersion == 2)
+ doc.write("</layer>")
+
+ if (browserVersion == 1) {
+ this.navObj = doc.all["item"+this.id]
+ this.iconImg = doc.all["itemIcon"+this.id]
+ } else if (browserVersion == 2) {
+ this.navObj = doc.layers["item"+this.id]
+ this.iconImg = this.navObj.document.images["itemIcon"+this.id]
+ doc.yPos=doc.yPos+this.navObj.clip.height
+ }
+}
+
+
+// Methods common to both objects (pseudo-inheritance)
+// ********************************************************
+
+function display()
+{
+ if (browserVersion == 1)
+ this.navObj.style.display = "block"
+ else
+ this.navObj.visibility = "show"
+}
+
+function createEntryIndex()
+{
+ this.id = nEntries
+ indexOfEntries[nEntries] = this
+ nEntries++
+}
+
+// total height of subEntries open
+function totalHeight() //used with browserVersion == 2
+{
+ var h = this.navObj.clip.height
+ var i = 0
+
+ if (this.isOpen) //is a folder and _is_ open
+ for (i=0 ; i < this.nChildren; i++)
+ h = h + this.children[i].totalHeight()
+
+ return h
+}
+
+
+// Events
+// *********************************************************
+
+function clickOnFolder(folderId)
+{
+ var clicked = indexOfEntries[folderId]
+
+ if (!clicked.isOpen)
+ clickOnNode(folderId)
+
+ return
+
+ if (clicked.isSelected)
+ return
+}
+
+function clickOnNode(folderId)
+{
+ var clickedFolder = 0
+ var state = 0
+
+ clickedFolder = indexOfEntries[folderId]
+ state = clickedFolder.isOpen
+
+ clickedFolder.setState(!state) //open<->close
+}
+
+function initializeDocument()
+{
+ doc = document;
+ if (doc.all)
+ browserVersion = 1 //IE4
+ else
+ if (doc.layers)
+ browserVersion = 2 //NS4
+ else
+ browserVersion = 0 //other
+
+ foldersTree.initialize(0, 1, "")
+ foldersTree.display()
+
+ if (browserVersion > 0)
+ {
+ doc.write("<layer top="+indexOfEntries[nEntries-1].navObj.top+">&nbsp;</layer>")
+
+ // close the whole tree
+ clickOnNode(0)
+ // open the root folder
+ clickOnNode(0)
+ }
+}
+
+// Auxiliary Functions for Folder-Treee backward compatibility
+// *********************************************************
+
+function gFld(description, hreference)
+{
+ folder = new Folder(description, hreference)
+ return folder
+}
+
+function gLnk(target, description, linkData)
+{
+ fullLink = ""
+
+ if (linkData!="")
+ {
+ if (target==0)
+ {
+ fullLink = "'"+linkData+"' target=\"basefrm\""
+ }
+ else
+ {
+ if (target==1)
+ fullLink = "'http://"+linkData+"' target=_blank"
+ else
+ fullLink = "'http://"+linkData+"' target=\"basefrm\""
+ }
+ }
+
+ linkItem = new Item(description, fullLink)
+ return linkItem
+}
+
+function insFld(parentFolder, childFolder)
+{
+ return parentFolder.addChild(childFolder)
+}
+
+function insDoc(parentFolder, document)
+{
+ parentFolder.addChild(document)
+}
+
+// Global variables
+// ****************
+
+USETEXTLINKS = 1
+indexOfEntries = new Array
+nEntries = 0
+doc = document
+browserVersion = 0
+selectedFolder=0
diff --git a/src/util.cpp b/src/util.cpp
index 72701d2..8282ccd 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -788,7 +788,14 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext)
if (compact) ol.startCenter(); else ol.startItemList();
if (!compact) ol.writeListItem();
- ol.startQuickIndexItem(extLink,"index.html");
+ if (Config::ftvHelpFlag)
+ {
+ ol.startQuickIndexItem(extLink,"main.html");
+ }
+ else
+ {
+ ol.startQuickIndexItem(extLink,"index.html");
+ }
parseText(ol,theTranslator->trMainPage());
ol.endQuickIndexItem();
@@ -869,7 +876,7 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext)
parseText(ol,theTranslator->trFileMembers());
ol.endQuickIndexItem();
}
- if (pageSDict->count()>0)
+ if (documentedPages>0)
{
if (!compact) ol.writeListItem();
ol.startQuickIndexItem(extLink,"pages.html");
@@ -2433,8 +2440,19 @@ bool generateLink(OutputList &ol,const char *clName,
}
else if ((pi=pageSDict->find(linkRef))) // link to a page
{
- ol.writeObjectLink(0,pi->name,0,lt);
- writePageRef(ol,pi->name,0);
+ GroupDef *gd = pi->inGroup;
+ if (gd)
+ {
+ SectionInfo *si=0;
+ if (!pi->name.isEmpty()) si=sectionDict[pi->name];
+ ol.writeObjectLink(0,gd->getOutputFileBase(),si ? si->label.data() : 0,lt);
+ writePageRef(ol,gd->getOutputFileBase(),si ? si->label.data() : 0);
+ }
+ else
+ {
+ ol.writeObjectLink(0,pi->name,0,lt);
+ writePageRef(ol,pi->name,0);
+ }
return TRUE;
}
else if ((pi=exampleSDict->find(linkRef))) // link to an example
@@ -2754,7 +2772,28 @@ QCString convertNameToFile(const char *name,bool allowDots)
break;
}
}
- //printf("convertNameToFile(%s)=`%s'\n",name,result.data());
+ return result;
+}
+
+/*! Converts a string to HTML-encoded string */
+QCString convertToHtml(const QCString &s)
+{
+ QCString result;
+ char c;
+ const char *p=s.data();
+ while ((c=*p++)!=0)
+ {
+ switch(c)
+ {
+ case '<': result+="&lt;"; break;
+ case '>': result+="&gt;"; break;
+ case '&': result+="&amp;"; break;
+ case '"': result+="&quot;"; break;
+ default:
+ result+=c;
+ break;
+ }
+ }
return result;
}
@@ -2837,3 +2876,4 @@ QCString stripScope(const char *name)
}
return result;
}
+
diff --git a/src/util.h b/src/util.h
index edcebe8..e0b3d69 100644
--- a/src/util.h
+++ b/src/util.h
@@ -144,6 +144,7 @@ void initClassHierarchy(ClassList *cl);
bool hasVisibleRoot(BaseClassList *bcl);
int minClassDistance(ClassDef *cd,ClassDef *bcd,int level=0);
QCString convertNameToFile(const char *name,bool allowDots=FALSE);
+QCString convertToHtml(const QCString &s);
void extractNamespaceName(const QCString &scopeName,
QCString &className,QCString &namespaceName);
QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ);
@@ -151,3 +152,4 @@ QCString stripScope(const char *name);
int iSystem(const char *command);
#endif
+